diff --git a/.air.toml b/.air.toml deleted file mode 100644 index a1e4dff2..00000000 --- a/.air.toml +++ /dev/null @@ -1,51 +0,0 @@ -root = "." -testdata_dir = "testdata" -tmp_dir = "tmp" - -[build] - args_bin = [] - bin = "./tmp/reaper-server" - cmd = "go build -o ./tmp/reaper-server ./cmd/reaper" - delay = 1000 - exclude_dir = ["assets", "files", "tmp", "vendor", "docs", "ui", "reaperbot"] - exclude_file = [] - exclude_regex = ["_test.go"] - exclude_unchanged = false - follow_symlink = false - full_bin = "" - include_dir = [] - include_ext = ["go", "tpl", "tmpl", "html"] - include_file = [] - kill_delay = "0s" - log = "build-errors.log" - poll = false - poll_interval = 0 - post_cmd = [] - pre_cmd = [] - rerun = false - rerun_delay = 500 - send_interrupt = false - stop_on_error = false - -[color] - app = "" - build = "yellow" - main = "magenta" - runner = "green" - watcher = "cyan" - -[log] - main_only = false - time = false - -[misc] - clean_on_exit = false - -[proxy] - app_port = 0 - enabled = false - proxy_port = 0 - -[screen] - clear_on_rebuild = false - keep_scroll = true diff --git a/.dockerignore b/.dockerignore deleted file mode 100644 index ad43b84a..00000000 --- a/.dockerignore +++ /dev/null @@ -1,8 +0,0 @@ -** - -!dist/ -!go.mod -!go.sum -!internal -!tls/ -!cmd/ diff --git a/.gitattributes b/.gitattributes deleted file mode 100644 index e4f04ead..00000000 --- a/.gitattributes +++ /dev/null @@ -1 +0,0 @@ -ui/** linguist-vendored diff --git a/.github/CODE_OF_CONDUCT.md b/.github/CODE_OF_CONDUCT.md new file mode 100644 index 00000000..3b862a35 --- /dev/null +++ b/.github/CODE_OF_CONDUCT.md @@ -0,0 +1,90 @@ + +# Contributor Covenant 3.0 Code of Conduct + +## Our Pledge + +We pledge to make our community welcoming, safe, and equitable for all. + +We are committed to fostering an environment that respects and promotes the dignity, rights, and contributions of all individuals, regardless of characteristics including race, ethnicity, caste, color, age, physical characteristics, neurodiversity, disability, sex or gender, gender identity or expression, sexual orientation, language, philosophy or religion, national or social origin, socio-economic position, level of education, or other status. The same privileges of participation are extended to everyone who participates in good faith and in accordance with this Covenant. + + +## Encouraged Behaviors + +While acknowledging differences in social norms, we all strive to meet our community's expectations for positive behavior. We also understand that our words and actions may be interpreted differently than we intend based on culture, background, or native language. + +With these considerations in mind, we agree to behave mindfully toward each other and act in ways that center our shared values, including: + +1. Respecting the **purpose of our community**, our activities, and our ways of gathering. +2. Engaging **kindly and honestly** with others. +3. Respecting **different viewpoints** and experiences. +4. **Taking responsibility** for our actions and contributions. +5. Gracefully giving and accepting **constructive feedback**. +6. Committing to **repairing harm** when it occurs. +7. Behaving in other ways that promote and sustain the **well-being of our community**. + + +## Restricted Behaviors + +We agree to restrict the following behaviors in our community. Instances, threats, and promotion of these behaviors are violations of this Code of Conduct. + +1. **Harassment.** Violating explicitly expressed boundaries or engaging in unnecessary personal attention after any clear request to stop. +2. **Character attacks.** Making insulting, demeaning, or pejorative comments directed at a community member or group of people. +3. **Stereotyping or discrimination.** Characterizing anyone’s personality or behavior on the basis of immutable identities or traits. +4. **Sexualization.** Behaving in a way that would generally be considered inappropriately intimate in the context or purpose of the community. +5. **Violating confidentiality**. Sharing or acting on someone's personal or private information without their permission. +6. **Endangerment.** Causing, encouraging, or threatening violence or other harm toward any person or group. +7. Behaving in other ways that **threaten the well-being** of our community. + +### Other Restrictions + +1. **Misleading identity.** Impersonating someone else for any reason, or pretending to be someone else to evade enforcement actions. +2. **Failing to credit sources.** Not properly crediting the sources of content you contribute. +3. **Promotional materials**. Sharing marketing or other commercial content in a way that is outside the norms of the community. +4. **Irresponsible communication.** Failing to responsibly present content which includes, links or describes any other restricted behaviors. + + +## Reporting an Issue + +Tensions can occur between community members even when they are trying their best to collaborate. Not every conflict represents a code of conduct violation, and this Code of Conduct reinforces encouraged behaviors and norms that can help avoid conflicts and minimize harm. + +When an incident does occur, it is important to report it promptly. To report a possible violation, contact . + +Community Moderators take reports of violations seriously and will make every effort to respond in a timely manner. They will investigate all reports of code of conduct violations, reviewing messages, logs, and recordings, or interviewing witnesses and other participants. Community Moderators will keep investigation and enforcement actions as transparent as possible while prioritizing safety and confidentiality. In order to honor these values, enforcement actions are carried out in private with the involved parties, but communicating to the whole community may be part of a mutually agreed upon resolution. + + +## Addressing and Repairing Harm + +If an investigation by the Community Moderators finds that this Code of Conduct has been violated, the following enforcement ladder may be used to determine how best to repair harm, based on the incident's impact on the individuals involved and the community as a whole. Depending on the severity of a violation, lower rungs on the ladder may be skipped. + +1) Warning + 1) Event: A violation involving a single incident or series of incidents. + 2) Consequence: A private, written warning from the Community Moderators. + 3) Repair: Examples of repair include a private written apology, acknowledgement of responsibility, and seeking clarification on expectations. +2) Temporarily Limited Activities + 1) Event: A repeated incidence of a violation that previously resulted in a warning, or the first incidence of a more serious violation. + 2) Consequence: A private, written warning with a time-limited cooldown period designed to underscore the seriousness of the situation and give the community members involved time to process the incident. The cooldown period may be limited to particular communication channels or interactions with particular community members. + 3) Repair: Examples of repair may include making an apology, using the cooldown period to reflect on actions and impact, and being thoughtful about re-entering community spaces after the period is over. +3) Temporary Suspension + 1) Event: A pattern of repeated violation which the Community Moderators have tried to address with warnings, or a single serious violation. + 2) Consequence: A private written warning with conditions for return from suspension. In general, temporary suspensions give the person being suspended time to reflect upon their behavior and possible corrective actions. + 3) Repair: Examples of repair include respecting the spirit of the suspension, meeting the specified conditions for return, and being thoughtful about how to reintegrate with the community when the suspension is lifted. +4) Permanent Ban + 1) Event: A pattern of repeated code of conduct violations that other steps on the ladder have failed to resolve, or a violation so serious that the Community Moderators determine there is no way to keep the community safe with this person as a member. + 2) Consequence: Access to all community spaces, tools, and communication channels is removed. In general, permanent bans should be rarely used, should have strong reasoning behind them, and should only be resorted to if working through other remedies has failed to change the behavior. + 3) Repair: There is no possible repair in cases of this severity. + +This enforcement ladder is intended as a guideline. It does not limit the ability of Community Managers to use their discretion and judgment, in keeping with the best interests of our community. + + +## Scope + +This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public or other spaces. Examples of representing our community include using an official email address, posting via an official social media account, or acting as an appointed representative at an online or offline event. + + +## Attribution + +This Code of Conduct is adapted from the Contributor Covenant, version 3.0, permanently available at [https://www.contributor-covenant.org/version/3/0/](https://www.contributor-covenant.org/version/3/0/). + +Contributor Covenant is stewarded by the Organization for Ethical Source and licensed under CC BY-SA 4.0. To view a copy of this license, visit [https://creativecommons.org/licenses/by-sa/4.0/](https://creativecommons.org/licenses/by-sa/4.0/) + +For answers to common questions about Contributor Covenant, see the FAQ at [https://www.contributor-covenant.org/faq](https://www.contributor-covenant.org/faq). Translations are provided at [https://www.contributor-covenant.org/translations](https://www.contributor-covenant.org/translations). Additional enforcement and community guideline resources can be found at [https://www.contributor-covenant.org/resources](https://www.contributor-covenant.org/resources). The enforcement ladder was inspired by the work of [Mozilla’s code of conduct team](https://github.com/mozilla/inclusion). diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md new file mode 100644 index 00000000..efd61917 --- /dev/null +++ b/.github/CONTRIBUTING.md @@ -0,0 +1,50 @@ +# Contributing to Reaper + +Thanks for your interest in contributing to reaper! Here's how to get started. + +## How to Contribute + +1. Fork the repository +2. Create a feature branch (`git checkout -b my-feature`) +3. Make your changes +4. Submit a pull request + +## Development Setup + +Prerequisites: Go and Make. + +```bash +git clone https://github.com//reaper.git +cd reaper +make test +make lint +``` + +Both must pass before submitting a PR. + +## Pull Requests + +- Keep PRs focused on a single change +- Write clear, descriptive commit messages +- Add tests for new functionality +- Ensure `make test` and `make lint` pass + +## Reporting Bugs + +Open a [GitHub Issue](https://github.com/ghostsecurity/reaper/issues) with: + +- Steps to reproduce +- Expected vs actual behavior +- Reaper version (`reaper version`) +- OS and environment details + +## Suggesting Features + +Open a [GitHub Issue](https://github.com/ghostsecurity/reaper/issues) describing: + +- The use case or problem +- Your proposed solution (if any) + +## License + +By contributing, you agree that your contributions will be licensed under the [Apache License 2.0](../LICENSE). diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml deleted file mode 100644 index a231d80b..00000000 --- a/.github/workflows/docker.yml +++ /dev/null @@ -1,46 +0,0 @@ -name: Publish Docker image -# Configures this workflow to run every time a change is pushed to the branch called `release`. -on: - push: - tags: - - 'v*' - -env: - REGISTRY: ghcr.io - IMAGE_NAME: ${{ github.repository }} - -jobs: - build-and-push-image: - runs-on: ubuntu-latest - permissions: - contents: read - packages: write - steps: - - name: Checkout repository - uses: actions/checkout@v4 - - name: Set up QEMU - uses: docker/setup-qemu-action@v3 - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - - name: Log in to the Container registry - uses: docker/login-action@v3 - with: - registry: ${{ env.REGISTRY }} - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - name: Extract metadata (tags, labels) for Docker - id: meta - uses: docker/metadata-action@v5 - with: - images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} - tags: | - type=ref,event=tag,pattern={{version}} - type=semver,pattern={{version}} - - name: Build and push Docker image - uses: docker/build-push-action@v6 - with: - context: . - platforms: linux/amd64,linux/arm64 - push: true - tags: ${{ steps.meta.outputs.tags }} - labels: ${{ steps.meta.outputs.labels }} diff --git a/.github/workflows/lint.go.yml b/.github/workflows/lint.go.yml index 41e3863a..dd0699fa 100644 --- a/.github/workflows/lint.go.yml +++ b/.github/workflows/lint.go.yml @@ -9,9 +9,12 @@ jobs: name: Lint runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - uses: actions/setup-go@v5 + - uses: actions/checkout@v6 + - uses: actions/setup-go@v6 with: go-version-file: go.mod cache: true - - run: make lint + - name: golangci-lint + uses: golangci/golangci-lint-action@v9 + with: + version: v2.6 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 71a13d12..e4482ec7 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -2,25 +2,66 @@ name: Go Release on: push: tags: - - '*' + - 'v*' permissions: contents: write + id-token: write # Required for keyless cosign signing jobs: goreleaser: name: Go Release runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v6 with: fetch-depth: 0 - name: Set up Go - uses: actions/setup-go@v5 + uses: actions/setup-go@v6 + with: + go-version-file: go.mod + cache: true - name: Run GoReleaser - uses: goreleaser/goreleaser-action@v5 + uses: goreleaser/goreleaser-action@v6 with: distribution: goreleaser version: latest args: release --clean env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Install cosign + uses: sigstore/cosign-installer@v4.0.0 + + - name: Sign release artifacts + run: | + # Sign all tar.gz files + for file in dist/*.tar.gz; do + if [ -f "$file" ]; then + echo "Signing $file" + cosign sign-blob --yes "$file" \ + --bundle "${file}.sigstore.json" + fi + done + + # Sign all zip files + for file in dist/*.zip; do + if [ -f "$file" ]; then + echo "Signing $file" + cosign sign-blob --yes "$file" \ + --bundle "${file}.sigstore.json" + fi + done + + # Sign checksums file + if [ -f "dist/checksums.txt" ]; then + echo "Signing checksums.txt" + cosign sign-blob --yes "dist/checksums.txt" \ + --bundle "dist/checksums.txt.sigstore.json" + fi + + - name: Upload signatures to release + uses: softprops/action-gh-release@v2 + with: + files: dist/*.sigstore.json + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/test.go.yml b/.github/workflows/test.go.yml index fda2d5a2..93ef3ab1 100644 --- a/.github/workflows/test.go.yml +++ b/.github/workflows/test.go.yml @@ -1,6 +1,8 @@ name: Go Test on: pull_request: +permissions: + contents: read jobs: test: name: Go @@ -10,8 +12,8 @@ jobs: os: [ ubuntu-latest, macos-latest ] steps: - - uses: actions/checkout@v4 - - uses: actions/setup-go@v5 + - uses: actions/checkout@v6 + - uses: actions/setup-go@v6 with: go-version-file: go.mod cache: true diff --git a/.github/workflows/ui.yml b/.github/workflows/ui.yml deleted file mode 100644 index 063784cc..00000000 --- a/.github/workflows/ui.yml +++ /dev/null @@ -1,48 +0,0 @@ -name: Web UI -on: - pull_request: -jobs: - test: - name: Web UI Test - runs-on: ubuntu-latest - timeout-minutes: 10 - steps: - - name: Checkout repository - uses: actions/checkout@v4 - - - uses: actions/setup-node@v4 - with: - node-version: lts/* - - - name: Echo Go Version - run: go version - - - name: Install Yarn - run: npm install -g yarn - - - name: Build UI and Start Server - env: - HOST: 0.0.0.0 - PORT: 8000 - run: | - make build-ui - make run & - - - name: Wait for server to start - run: | - while ! curl -s http://localhost:8000 > /dev/null 2>&1; do - sleep 1 - done - - - name: Setup npm - run: npm init -y - - - name: Install Playwright - run: npm install @playwright/test - - - name: Install Playwright Browsers - run: npx playwright install chromium --with-deps - - - name: Run Playwright tests - run: npx playwright test - diff --git a/.gitignore b/.gitignore index a35e1510..736fe7ae 100644 --- a/.gitignore +++ b/.gitignore @@ -19,24 +19,16 @@ !LICENSE !Makefile -!Dockerfile -!docker-compose.yml -!.dockerignore !.github/** !.air.toml +!.golangci.yml +!.goreleaser.yaml -!config.yaml !sample.env !docs/** !tests/** !cmd/reaper/dist/** -!tls/* -!ui/ -!ui/** -ui/node_modules -ui/node_modules/** -ui/dist -ui/dist/** +!scripts/** .DS_Store diff --git a/.golangci.yml b/.golangci.yml new file mode 100644 index 00000000..c4f752f8 --- /dev/null +++ b/.golangci.yml @@ -0,0 +1,32 @@ +version: "2" +run: + tests: false +linters: + default: none + enable: + - errcheck + - goconst + - gosec + - govet + - iface + - ineffassign + - staticcheck + - unused + exclusions: + generated: lax + presets: + - comments + - common-false-positives + - legacy + - std-error-handling + paths: + - third_party$ + - builtin$ + - examples$ +formatters: + exclusions: + generated: lax + paths: + - third_party$ + - builtin$ + - examples$ diff --git a/.goreleaser.yaml b/.goreleaser.yaml index a7b1751f..17247395 100644 --- a/.goreleaser.yaml +++ b/.goreleaser.yaml @@ -1,7 +1,12 @@ +version: 2 + +project_name: reaper + before: hooks: - go mod tidy - make build + builds: - main: ./cmd/reaper ldflags: @@ -14,26 +19,29 @@ builds: - arm64 archives: - - format: tar.gz - # this name template makes the OS and Arch compatible with the results of uname. + - formats: ['tar.gz'] name_template: >- {{ .ProjectName }}_ - {{- title .Os }}_ - {{- if eq .Arch "amd64" }}x86_64 - {{- else if eq .Arch "386" }}i386 - {{- else }}{{ .Arch }}{{ end }} - {{- if .Arm }}v{{ .Arm }}{{ end }} - # use zip for windows archives + {{- .Os }}_ + {{- .Arch }} format_overrides: - goos: windows - format: zip + formats: ['zip'] + checksum: name_template: 'checksums.txt' -snapshot: - name_template: "{{ incpatch .Version }}-next" + changelog: sort: asc filters: exclude: - '^docs:' - '^test:' + +release: + github: + owner: ghostsecurity + name: reaper + draft: false + prerelease: auto + name_template: "v{{.Version}}" diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index 878bf359..00000000 --- a/Dockerfile +++ /dev/null @@ -1,33 +0,0 @@ -# Build layer -FROM golang:latest AS build - -WORKDIR /app - -COPY go.mod go.sum ./ - -RUN go mod download - -COPY . . - - -ENV GOOS=linux - -RUN go build -ldflags="-s -w" -o reaper ./cmd/reaper - -# Run layer -FROM ubuntu:24.04 - -ENV DEBIAN_FRONTEND=noninteractive - -RUN apt-get update && apt-get install -y ca-certificates && update-ca-certificates - -RUN useradd -m -d /app -s /bin/bash app - -WORKDIR /app -COPY . . -COPY --from=build /app/reaper . -COPY --from=build /app/cmd/reaper/dist ./dist -RUN chown -R app /app -USER app - -CMD ["./reaper"] diff --git a/LICENSE b/LICENSE index 38b99794..fea5e3f4 100644 --- a/LICENSE +++ b/LICENSE @@ -175,7 +175,7 @@ END OF TERMS AND CONDITIONS - Copyright 2024 Ghost Security, Inc. + Copyright 2026 Ghost Security, Inc. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -187,4 +187,4 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and - limitations under the License. \ No newline at end of file + limitations under the License. diff --git a/Makefile b/Makefile index d540cc6e..c007ae5b 100644 --- a/Makefile +++ b/Makefile @@ -12,18 +12,10 @@ help: ## Show this help @cat ${MAKEFILE_LIST} | grep "[#]# " | grep -v grep | sort | column -t -s '##' | sed -e 's/^/ /' @echo "" -.PHONY: build-ui -build-ui: ## Build the UI - cd ui && yarn && yarn build - .PHONY: run run: ## Run the local server go run ./cmd/reaper -.PHONY: dev -dev: ## Run the local server with air watcher - air - .PHONY: build build: ## Build the local server go build -ldflags="-s -w" -o reaper ./cmd/reaper @@ -31,7 +23,7 @@ build: ## Build the local server .PHONY: lint lint: ## Run linters go vet ./... - which golangci-lint || go install github.com/golangci/golangci-lint/cmd/golangci-lint@v1.64.8 + which golangci-lint || go install github.com/golangci/golangci-lint/cmd/golangci-lint golangci-lint run --timeout 3m --verbose .PHONY: test diff --git a/README.md b/README.md index cf25d3b8..fbd0b1aa 100644 --- a/README.md +++ b/README.md @@ -1,55 +1,29 @@ - -

Reaper

+![Reaper Banner](https://media.ghostsecurity.ai/reaper-banner.png) -Reaper by [Ghost Security](https://ghost.security) is a modern, lightweight, and deadly effective open-source application security testing framework—engineered by humans and primed for AI. Reaper slashes through the complexities of app security testing, bringing together reconnaissance, request proxying, request tampering/replay, active testing, vulnerability validation, live collaboration, and reporting into a *killer* workflow. When paired with an AI Agent, Reaper reaps even greater rewards, transforming into a powerful engine that slays application vulnerabilities with precision and efficiency. +# Ghost Security Reaper - -
-
- Watch the demo video!
- -

-
+MITM HTTPS proxy for application security testing. Intercepts in-scope traffic, logs requests and responses to a local database, and provides a CLI for searching and inspecting captured traffic. Reaper is designed to be easy to use by humans and AI agents alike. For AI agent integration, see [Ghost Security Skills](https://github.com/ghostsecurity/skills). -> :warning: -> This project is undergoing rapid development and may change significantly in the near future. +![Demo](./docs/demo.gif) -## 💿 Getting Started +## Quick Start -Follow [the installation and getting started guide](docs/getting_started.md) for getting Reaper up and running on your machine. +Supports Linux and macOS. -## 👻 About +```bash +curl -sfL https://raw.githubusercontent.com/ghostsecurity/reaper/main/scripts/install.sh | bash +``` -Reaper was created to give appsec analysts, pentesters, and bug bounty hunters a single, razor-sharp tool that brings together every phase of application security testing into one efficient workflow. It slashes through the manual, time-intensive steps required to uncover application vulnerabilities, exorcising the lingering demons of application security. +Alternatively, download a release directly from [GitHub Releases](https://github.com/ghostsecurity/reaper/releases). -While existing tools like Burp Suite, Zap, Subfinder, and Katana tackle individual stages of the testing lifecycle well, Reaper wields a scythe where others use scissors, stitching the entire process back together with cutting-edge technology. +## Comprehensive Documentation -Built for orchestration by both humans and AI, Reaper transforms appsec testing into a streamlined, high-speed process. LLM-powered AI Agents step in as tireless team members, mowing through tedious tasks that would take hours for a human analyst in mere seconds. Picture having a teammate who never sleeps, understands the depths of application security, and works at lightning speed assisting with test parameter tuning, data analysis, findings summaries, and reporting 🤤. +Full documentation, tutorials, and video guides at [ghostsecurity.ai](https://ghostsecurity.ai). -

(back to top)

+## Contributions, Feedback, Feature Requests, and Issues -## 🎯 Project Goals +[Open an Issue](https://github.com/ghostsecurity/reaper/issues/new) per the [Contributing](.github/CONTRIBUTING.md) guidelines and [Code of Conduct](.github/CODE_OF_CONDUCT.md) -- A modern, lightweight, and extensible framework for application security testing -- Usable by humans and AI Agents alike -- A platform for running autonomous workflows -- Easy to maintain and extend -- Reduce security engineer burnout with helpful automation +## License -

(back to top)

- - -## 💜 Contributing - -First, thank you for taking the time to check out Reaper! Our primary goals are to get as many folks using it as possible and to drive a roadmap based on user feedback. If you have a great idea for an enhancement or you have encountered a bug, we'd greatly appreciate a well-formed [Issue](https://github.com/ghostsecurity/reaper/issues/new) in this repo so we can triage and prioritize accordingly. - -Reaper is distributed under the [Apache 2.0 License](LICENSE). All Reaper contributors and community members must adhere to the [Code of Conduct](CODE_OF_CONDUCT.md) - -

(back to top)

- - -## 👏 Acknowledgments - -We want to tip our hats to our friends at [ProjectDiscovery](https://github.com/projectdiscovery), who produce a suite of open source tools tailored for offensive security practitioners, security engineers, bug bounty hunters, and red teamers. ProjectDiscovery is the creator of [subfinder](https://github.com/projectdiscovery/subfinder), [katana](https://github.com/projectdiscovery/katana), [nuclei](https://github.com/projectdiscovery/nuclei), and many other great tools. - -

(back to top)

+This repository is licensed under the Apache License 2.0. See [LICENSE](LICENSE) for details. diff --git a/cmd/reaper/dist/assets/index-Ew084H5h.css b/cmd/reaper/dist/assets/index-Ew084H5h.css deleted file mode 100644 index 0665c56a..00000000 --- a/cmd/reaper/dist/assets/index-Ew084H5h.css +++ /dev/null @@ -1 +0,0 @@ -*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}*{border-color:hsl(var(--border))}body{background-color:hsl(var(--background));color:hsl(var(--foreground))}.container{width:100%;margin-right:auto;margin-left:auto}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.pointer-events-none{pointer-events:none}.pointer-events-auto{pointer-events:auto}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.inset-0{inset:0}.-top-2{top:-.5rem}.left-1\/2{left:50%}.left-2{left:.5rem}.left-4{left:1rem}.right-1{right:.25rem}.right-2{right:.5rem}.right-4{right:1rem}.top-0{top:0}.top-1{top:.25rem}.top-1\/2{top:50%}.top-2\.5{top:.625rem}.top-4{top:1rem}.z-10{z-index:10}.z-20{z-index:20}.z-50{z-index:50}.z-\[100\]{z-index:100}.m-0{margin:0}.m-2{margin:.5rem}.m-4{margin:1rem}.-mx-1{margin-left:-.25rem;margin-right:-.25rem}.mx-1{margin-left:.25rem;margin-right:.25rem}.mx-2{margin-left:.5rem;margin-right:.5rem}.mx-4{margin-left:1rem;margin-right:1rem}.mx-auto{margin-left:auto;margin-right:auto}.my-1{margin-top:.25rem;margin-bottom:.25rem}.my-3{margin-top:.75rem;margin-bottom:.75rem}.my-8{margin-top:2rem;margin-bottom:2rem}.-ml-2{margin-left:-.5rem}.mb-0{margin-bottom:0}.mb-1{margin-bottom:.25rem}.mb-8{margin-bottom:2rem}.ml-1{margin-left:.25rem}.ml-2{margin-left:.5rem}.ml-4{margin-left:1rem}.ml-8{margin-left:2rem}.ml-auto{margin-left:auto}.mr-1{margin-right:.25rem}.mr-2{margin-right:.5rem}.mr-4{margin-right:1rem}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-4{margin-top:1rem}.mt-auto{margin-top:auto}.line-clamp-1{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:1}.block{display:block}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.size-2{width:.5rem;height:.5rem}.size-4{width:1rem;height:1rem}.size-48{width:12rem;height:12rem}.size-6{width:1.5rem;height:1.5rem}.h-10{height:2.5rem}.h-16{height:4rem}.h-2{height:.5rem}.h-2\.5{height:.625rem}.h-3\.5{height:.875rem}.h-32{height:8rem}.h-36{height:9rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-7{height:1.75rem}.h-8{height:2rem}.h-9{height:2.25rem}.h-\[--radix-select-trigger-height\]{height:var(--radix-select-trigger-height)}.h-\[1px\]{height:1px}.h-full{height:100%}.h-px{height:1px}.h-screen{height:100vh}.max-h-96{max-height:24rem}.max-h-\[300px\]{max-height:300px}.max-h-screen{max-height:100vh}.min-h-0{min-height:0px}.min-h-48{min-height:12rem}.min-h-64{min-height:16rem}.min-h-\[60px\]{min-height:60px}.w-0\.5{width:.125rem}.w-10{width:2.5rem}.w-16{width:4rem}.w-2\.5{width:.625rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-32{width:8rem}.w-36{width:9rem}.w-4{width:1rem}.w-64{width:16rem}.w-7{width:1.75rem}.w-72{width:18rem}.w-8{width:2rem}.w-9{width:2.25rem}.w-\[1px\]{width:1px}.w-\[240px\]{width:240px}.w-full{width:100%}.w-max{width:-moz-max-content;width:max-content}.w-px{width:1px}.min-w-0{min-width:0px}.min-w-24{min-width:6rem}.min-w-32{min-width:8rem}.min-w-\[--radix-select-trigger-width\]{min-width:var(--radix-select-trigger-width)}.max-w-\[75\%\]{max-width:75%}.max-w-lg{max-width:32rem}.flex-1{flex:1 1 0%}.flex-none{flex:none}.flex-shrink-0,.shrink-0{flex-shrink:0}.caption-bottom{caption-side:bottom}.border-collapse{border-collapse:collapse}.-translate-x-1\/2{--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-1\/2{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-x-\[-1\]{--tw-scale-x: -1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.cursor-default{cursor:default}.cursor-pointer{cursor:pointer}.touch-none{touch-action:none}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.resize-y{resize:vertical}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.place-items-center{place-items:center}.items-start{align-items:flex-start}.items-center{align-items:center}.items-stretch{align-items:stretch}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-x-2{-moz-column-gap:.5rem;column-gap:.5rem}.gap-y-1\.5{row-gap:.375rem}.gap-y-4{row-gap:1rem}.space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(.5rem * var(--tw-space-x-reverse));margin-left:calc(.5rem * calc(1 - var(--tw-space-x-reverse)))}.space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(1rem * var(--tw-space-x-reverse));margin-left:calc(1rem * calc(1 - var(--tw-space-x-reverse)))}.space-y-0\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.125rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.125rem * var(--tw-space-y-reverse))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem * var(--tw-space-y-reverse))}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.overflow-x-hidden{overflow-x:hidden}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-nowrap{white-space:nowrap}.whitespace-pre{white-space:pre}.whitespace-pre-wrap{white-space:pre-wrap}.rounded-\[inherit\]{border-radius:inherit}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:var(--radius)}.rounded-md{border-radius:calc(var(--radius) - 2px)}.rounded-sm{border-radius:calc(var(--radius) - 4px)}.rounded-xl{border-radius:calc(var(--radius) + 4px)}.rounded-t-md{border-top-left-radius:calc(var(--radius) - 2px);border-top-right-radius:calc(var(--radius) - 2px)}.border{border-width:1px}.border-2{border-width:2px}.border-b{border-bottom-width:1px}.border-l{border-left-width:1px}.border-t{border-top-width:1px}.border-border{border-color:hsl(var(--border))}.border-destructive{border-color:hsl(var(--destructive))}.border-destructive\/50{border-color:hsl(var(--destructive) / .5)}.border-gray-500\/10{border-color:#6b72801a}.border-green-600\/20{border-color:#16a34a33}.border-input{border-color:hsl(var(--input))}.border-muted-foreground\/25{border-color:hsl(var(--muted-foreground) / .25)}.border-primary{border-color:hsl(var(--primary))}.border-red-600\/20{border-color:#dc262633}.border-transparent{border-color:transparent}.border-yellow-600\/20{border-color:#ca8a0433}.border-l-transparent{border-left-color:transparent}.border-t-transparent{border-top-color:transparent}.bg-background{background-color:hsl(var(--background))}.bg-background\/95{background-color:hsl(var(--background) / .95)}.bg-black\/80{background-color:#000c}.bg-border{background-color:hsl(var(--border))}.bg-card{background-color:hsl(var(--card))}.bg-current{background-color:currentColor}.bg-destructive{background-color:hsl(var(--destructive))}.bg-gray-50{--tw-bg-opacity: 1;background-color:rgb(249 250 251 / var(--tw-bg-opacity, 1))}.bg-green-400{--tw-bg-opacity: 1;background-color:rgb(74 222 128 / var(--tw-bg-opacity, 1))}.bg-green-400\/20{background-color:#4ade8033}.bg-green-50{--tw-bg-opacity: 1;background-color:rgb(240 253 244 / var(--tw-bg-opacity, 1))}.bg-muted{background-color:hsl(var(--muted))}.bg-muted\/50{background-color:hsl(var(--muted) / .5)}.bg-orange-500{--tw-bg-opacity: 1;background-color:rgb(249 115 22 / var(--tw-bg-opacity, 1))}.bg-popover{background-color:hsl(var(--popover))}.bg-primary{background-color:hsl(var(--primary))}.bg-primary\/20{background-color:hsl(var(--primary) / .2)}.bg-red-50{--tw-bg-opacity: 1;background-color:rgb(254 242 242 / var(--tw-bg-opacity, 1))}.bg-red-500\/20{background-color:#ef444433}.bg-secondary{background-color:hsl(var(--secondary))}.bg-secondary\/50{background-color:hsl(var(--secondary) / .5)}.bg-transparent{background-color:transparent}.bg-yellow-50{--tw-bg-opacity: 1;background-color:rgb(254 252 232 / var(--tw-bg-opacity, 1))}.bg-zinc-900{--tw-bg-opacity: 1;background-color:rgb(24 24 27 / var(--tw-bg-opacity, 1))}.fill-current{fill:currentColor}.object-cover{-o-object-fit:cover;object-fit:cover}.p-0{padding:0}.p-0\.5{padding:.125rem}.p-1{padding:.25rem}.p-10{padding:2.5rem}.p-2{padding:.5rem}.p-2\.5{padding:.625rem}.p-3{padding:.75rem}.p-3\.5{padding:.875rem}.p-4{padding:1rem}.p-6{padding:1.5rem}.p-8{padding:2rem}.p-px{padding:1px}.px-1{padding-left:.25rem;padding-right:.25rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-8{padding-left:2rem;padding-right:2rem}.py-0{padding-top:0;padding-bottom:0}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-10{padding-top:2.5rem;padding-bottom:2.5rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.pb-10{padding-bottom:2.5rem}.pl-2{padding-left:.5rem}.pl-8{padding-left:2rem}.pr-0\.5{padding-right:.125rem}.pr-1{padding-right:.25rem}.pr-2{padding-right:.5rem}.pr-6{padding-right:1.5rem}.pr-8{padding-right:2rem}.pt-0{padding-top:0}.pt-1{padding-top:.25rem}.pt-2{padding-top:.5rem}.pt-4{padding-top:1rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.text-start{text-align:start}.align-middle{vertical-align:middle}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-2xl{font-size:1.5rem;line-height:2rem}.text-2xs{font-size:.625rem}.text-5xl{font-size:3rem;line-height:1}.text-\[0\.8rem\]{font-size:.8rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.lowercase{text-transform:lowercase}.leading-none{line-height:1}.tracking-tight{letter-spacing:-.025em}.tracking-widest{letter-spacing:.1em}.text-background{color:hsl(var(--background))}.text-card-foreground{color:hsl(var(--card-foreground))}.text-current{color:currentColor}.text-destructive{color:hsl(var(--destructive))}.text-destructive-foreground{color:hsl(var(--destructive-foreground))}.text-foreground{color:hsl(var(--foreground))}.text-foreground\/50{color:hsl(var(--foreground) / .5)}.text-foreground\/80{color:hsl(var(--foreground) / .8)}.text-gray-600{--tw-text-opacity: 1;color:rgb(75 85 99 / var(--tw-text-opacity, 1))}.text-green-400{--tw-text-opacity: 1;color:rgb(74 222 128 / var(--tw-text-opacity, 1))}.text-green-700{--tw-text-opacity: 1;color:rgb(21 128 61 / var(--tw-text-opacity, 1))}.text-muted-foreground{color:hsl(var(--muted-foreground))}.text-popover-foreground{color:hsl(var(--popover-foreground))}.text-primary{color:hsl(var(--primary))}.text-primary-foreground{color:hsl(var(--primary-foreground))}.text-red-500{--tw-text-opacity: 1;color:rgb(239 68 68 / var(--tw-text-opacity, 1))}.text-red-700{--tw-text-opacity: 1;color:rgb(185 28 28 / var(--tw-text-opacity, 1))}.text-secondary{color:hsl(var(--secondary))}.text-secondary-foreground{color:hsl(var(--secondary-foreground))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.text-yellow-700{--tw-text-opacity: 1;color:rgb(161 98 7 / var(--tw-text-opacity, 1))}.text-zinc-600{--tw-text-opacity: 1;color:rgb(82 82 91 / var(--tw-text-opacity, 1))}.underline-offset-4{text-underline-offset:4px}.accent-foreground{accent-color:hsl(var(--foreground))}.opacity-0{opacity:0}.opacity-100{opacity:1}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.opacity-90{opacity:.9}.shadow{--tw-shadow: 0 1px 3px 0 rgb(0 0 0 / .1), 0 1px 2px -1px rgb(0 0 0 / .1);--tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-md{--tw-shadow: 0 4px 6px -1px rgb(0 0 0 / .1), 0 2px 4px -2px rgb(0 0 0 / .1);--tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.outline-none{outline:2px solid transparent;outline-offset:2px}.outline{outline-style:solid}.ring{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-0{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-offset-background{--tw-ring-offset-color: hsl(var(--background))}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur{--tw-backdrop-blur: blur(8px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-filter{-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-200{transition-duration:.2s}@keyframes enter{0%{opacity:var(--tw-enter-opacity, 1);transform:translate3d(var(--tw-enter-translate-x, 0),var(--tw-enter-translate-y, 0),0) scale3d(var(--tw-enter-scale, 1),var(--tw-enter-scale, 1),var(--tw-enter-scale, 1)) rotate(var(--tw-enter-rotate, 0))}}@keyframes exit{to{opacity:var(--tw-exit-opacity, 1);transform:translate3d(var(--tw-exit-translate-x, 0),var(--tw-exit-translate-y, 0),0) scale3d(var(--tw-exit-scale, 1),var(--tw-exit-scale, 1),var(--tw-exit-scale, 1)) rotate(var(--tw-exit-rotate, 0))}}.animate-in{animation-name:enter;animation-duration:.15s;--tw-enter-opacity: initial;--tw-enter-scale: initial;--tw-enter-rotate: initial;--tw-enter-translate-x: initial;--tw-enter-translate-y: initial}.fade-in-0{--tw-enter-opacity: 0}.zoom-in-95{--tw-enter-scale: .95}.duration-200{animation-duration:.2s}.running{animation-play-state:running}#report-markdown{white-space:normal}#report-markdown h1{margin-top:0;scroll-margin:5rem;font-size:2.25rem;line-height:2.5rem;font-weight:800;letter-spacing:-.025em}@media (min-width: 1024px){#report-markdown h1{font-size:1.5rem;line-height:2rem}}#report-markdown h2{margin-top:1rem;scroll-margin:5rem;border-bottom-width:1px;--tw-border-opacity: 1;border-color:rgb(0 0 0 / var(--tw-border-opacity, 1));padding-bottom:.5rem;font-size:1.25rem;line-height:1.75rem;font-weight:600;letter-spacing:-.025em;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}#report-markdown h3{margin-top:1rem;scroll-margin:5rem;font-size:1.125rem;line-height:1.75rem;font-weight:600;letter-spacing:-.025em}#report-markdown h4{margin-top:.5rem;scroll-margin:5rem;font-size:1rem;line-height:1.5rem;font-weight:600;letter-spacing:-.025em}#report-markdown ol{margin-top:0;margin-bottom:0;margin-left:1.5rem;margin-top:.5rem;list-style-type:decimal}#report-markdown ul{margin-top:0;margin-bottom:0;margin-left:1.5rem;margin-top:.5rem;list-style-type:disc}#report-markdown p{margin-top:0;margin-left:1.5rem;margin-inline-start:0px;margin-inline-end:0px;margin-bottom:0;margin-top:.5rem}#report-markdown pre{margin-top:.5rem;border-radius:.25rem;background-color:hsl(var(--muted));padding:.5rem;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:.75rem;line-height:1rem}#report-markdown code{text-wrap:wrap}#report-markdown p code,#report-markdown li code{margin-top:.5rem;text-wrap:wrap;border-radius:.25rem;background-color:hsl(var(--muted));padding:.25rem;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:.75rem;line-height:1rem;font-weight:600}.file\:border-0::file-selector-button{border-width:0px}.file\:bg-transparent::file-selector-button{background-color:transparent}.file\:text-sm::file-selector-button{font-size:.875rem;line-height:1.25rem}.file\:font-medium::file-selector-button{font-weight:500}.placeholder\:text-muted-foreground::-moz-placeholder{color:hsl(var(--muted-foreground))}.placeholder\:text-muted-foreground::placeholder{color:hsl(var(--muted-foreground))}.after\:absolute:after{content:var(--tw-content);position:absolute}.after\:inset-y-0:after{content:var(--tw-content);top:0;bottom:0}.after\:left-1\/2:after{content:var(--tw-content);left:50%}.after\:w-1:after{content:var(--tw-content);width:.25rem}.after\:-translate-x-1\/2:after{content:var(--tw-content);--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.focus-within\:relative:focus-within{position:relative}.focus-within\:z-20:focus-within{z-index:20}.hover\:bg-accent:hover{background-color:hsl(var(--accent))}.hover\:bg-accent\/50:hover{background-color:hsl(var(--accent) / .5)}.hover\:bg-destructive\/80:hover{background-color:hsl(var(--destructive) / .8)}.hover\:bg-destructive\/90:hover{background-color:hsl(var(--destructive) / .9)}.hover\:bg-muted\/50:hover{background-color:hsl(var(--muted) / .5)}.hover\:bg-primary\/80:hover{background-color:hsl(var(--primary) / .8)}.hover\:bg-primary\/90:hover{background-color:hsl(var(--primary) / .9)}.hover\:bg-secondary:hover{background-color:hsl(var(--secondary))}.hover\:bg-secondary\/80:hover{background-color:hsl(var(--secondary) / .8)}.hover\:text-accent-foreground:hover{color:hsl(var(--accent-foreground))}.hover\:text-foreground:hover{color:hsl(var(--foreground))}.hover\:text-primary:hover{color:hsl(var(--primary))}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-100:hover{opacity:1}.focus\:bg-accent:focus{background-color:hsl(var(--accent))}.focus\:text-accent-foreground:focus{color:hsl(var(--accent-foreground))}.focus\:opacity-100:focus{opacity:1}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-1:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-2:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-ring:focus{--tw-ring-color: hsl(var(--ring))}.focus\:ring-offset-2:focus{--tw-ring-offset-width: 2px}.focus-visible\:outline-none:focus-visible{outline:2px solid transparent;outline-offset:2px}.focus-visible\:ring-1:focus-visible{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus-visible\:ring-2:focus-visible{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus-visible\:ring-ring:focus-visible{--tw-ring-color: hsl(var(--ring))}.focus-visible\:ring-offset-1:focus-visible{--tw-ring-offset-width: 1px}.focus-visible\:ring-offset-2:focus-visible{--tw-ring-offset-width: 2px}.focus-visible\:ring-offset-background:focus-visible{--tw-ring-offset-color: hsl(var(--background))}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}.group:hover .group-hover\:block{display:block}.group:hover .group-hover\:text-foreground{color:hsl(var(--foreground))}.group:hover .group-hover\:text-primary\/80{color:hsl(var(--primary) / .8)}.group:hover .group-hover\:opacity-100{opacity:1}.group[data-collapsed=true] .group-\[\[data-collapsed\=true\]\]\:justify-center{justify-content:center}.group.destructive .group-\[\.destructive\]\:border-muted\/40{border-color:hsl(var(--muted) / .4)}.group[data-collapsed=true] .group-\[\[data-collapsed\=true\]\]\:px-2{padding-left:.5rem;padding-right:.5rem}.group.destructive .group-\[\.destructive\]\:text-red-300{--tw-text-opacity: 1;color:rgb(252 165 165 / var(--tw-text-opacity, 1))}.group.destructive .group-\[\.destructive\]\:hover\:border-destructive\/30:hover{border-color:hsl(var(--destructive) / .3)}.group.destructive .group-\[\.destructive\]\:hover\:bg-destructive:hover{background-color:hsl(var(--destructive))}.group.destructive .group-\[\.destructive\]\:hover\:text-destructive-foreground:hover{color:hsl(var(--destructive-foreground))}.group.destructive .group-\[\.destructive\]\:hover\:text-red-50:hover{--tw-text-opacity: 1;color:rgb(254 242 242 / var(--tw-text-opacity, 1))}.group.destructive .group-\[\.destructive\]\:focus\:ring-destructive:focus{--tw-ring-color: hsl(var(--destructive))}.group.destructive .group-\[\.destructive\]\:focus\:ring-red-400:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(248 113 113 / var(--tw-ring-opacity, 1))}.group.destructive .group-\[\.destructive\]\:focus\:ring-offset-red-600:focus{--tw-ring-offset-color: #dc2626}.peer:disabled~.peer-disabled\:cursor-not-allowed{cursor:not-allowed}.peer:disabled~.peer-disabled\:opacity-70{opacity:.7}.data-\[disabled\]\:pointer-events-none[data-disabled]{pointer-events:none}.data-\[side\=bottom\]\:translate-y-1[data-side=bottom]{--tw-translate-y: .25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[side\=left\]\:-translate-x-1[data-side=left]{--tw-translate-x: -.25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[side\=right\]\:translate-x-1[data-side=right]{--tw-translate-x: .25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[side\=top\]\:-translate-y-1[data-side=top]{--tw-translate-y: -.25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[state\=checked\]\:translate-x-4[data-state=checked]{--tw-translate-x: 1rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[state\=unchecked\]\:translate-x-0[data-state=unchecked],.data-\[swipe\=cancel\]\:translate-x-0[data-swipe=cancel]{--tw-translate-x: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[swipe\=end\]\:translate-x-\[var\(--radix-toast-swipe-end-x\)\][data-swipe=end]{--tw-translate-x: var(--radix-toast-swipe-end-x);transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[swipe\=move\]\:translate-x-\[var\(--radix-toast-swipe-move-x\)\][data-swipe=move]{--tw-translate-x: var(--radix-toast-swipe-move-x);transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[panel-group-direction\=vertical\]\:flex-col[data-panel-group-direction=vertical]{flex-direction:column}.data-\[highlighted\]\:bg-accent[data-highlighted]{background-color:hsl(var(--accent))}.data-\[selected\]\:bg-primary[data-selected]{background-color:hsl(var(--primary))}.data-\[state\=active\]\:bg-background[data-state=active]{background-color:hsl(var(--background))}.data-\[state\=checked\]\:bg-primary[data-state=checked]{background-color:hsl(var(--primary))}.data-\[state\=open\]\:bg-accent[data-state=open]{background-color:hsl(var(--accent))}.data-\[state\=selected\]\:bg-muted[data-state=selected]{background-color:hsl(var(--muted))}.data-\[state\=unchecked\]\:bg-input[data-state=unchecked]{background-color:hsl(var(--input))}.data-\[collapsed\=true\]\:py-2[data-collapsed=true]{padding-top:.5rem;padding-bottom:.5rem}.data-\[disabled\]\:text-muted-foreground[data-disabled]{color:hsl(var(--muted-foreground))}.data-\[highlighted\]\:text-accent-foreground[data-highlighted]{color:hsl(var(--accent-foreground))}.data-\[outside-view\]\:text-muted-foreground[data-outside-view]{color:hsl(var(--muted-foreground))}.data-\[selected\]\:text-primary-foreground[data-selected]{color:hsl(var(--primary-foreground))}.data-\[state\=active\]\:text-foreground[data-state=active]{color:hsl(var(--foreground))}.data-\[state\=checked\]\:text-primary-foreground[data-state=checked]{color:hsl(var(--primary-foreground))}.data-\[state\=open\]\:text-muted-foreground[data-state=open]{color:hsl(var(--muted-foreground))}.data-\[unavailable\]\:text-destructive-foreground[data-unavailable]{color:hsl(var(--destructive-foreground))}.data-\[unavailable\]\:line-through[data-unavailable]{text-decoration-line:line-through}.data-\[disabled\]\:opacity-50[data-disabled],.data-\[outside-view\]\:opacity-50[data-outside-view]{opacity:.5}.data-\[selected\]\:opacity-100[data-selected]{opacity:1}.data-\[state\=active\]\:shadow[data-state=active]{--tw-shadow: 0 1px 3px 0 rgb(0 0 0 / .1), 0 1px 2px -1px rgb(0 0 0 / .1);--tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.data-\[swipe\=move\]\:transition-none[data-swipe=move]{transition-property:none}.data-\[state\=open\]\:animate-in[data-state=open]{animation-name:enter;animation-duration:.15s;--tw-enter-opacity: initial;--tw-enter-scale: initial;--tw-enter-rotate: initial;--tw-enter-translate-x: initial;--tw-enter-translate-y: initial}.data-\[state\=closed\]\:animate-out[data-state=closed],.data-\[swipe\=end\]\:animate-out[data-swipe=end]{animation-name:exit;animation-duration:.15s;--tw-exit-opacity: initial;--tw-exit-scale: initial;--tw-exit-rotate: initial;--tw-exit-translate-x: initial;--tw-exit-translate-y: initial}.data-\[state\=closed\]\:fade-out-0[data-state=closed]{--tw-exit-opacity: 0}.data-\[state\=closed\]\:fade-out-80[data-state=closed]{--tw-exit-opacity: .8}.data-\[state\=open\]\:fade-in-0[data-state=open]{--tw-enter-opacity: 0}.data-\[state\=closed\]\:zoom-out-95[data-state=closed]{--tw-exit-scale: .95}.data-\[state\=open\]\:zoom-in-95[data-state=open]{--tw-enter-scale: .95}.data-\[side\=bottom\]\:slide-in-from-top-2[data-side=bottom]{--tw-enter-translate-y: -.5rem}.data-\[side\=left\]\:slide-in-from-right-2[data-side=left]{--tw-enter-translate-x: .5rem}.data-\[side\=right\]\:slide-in-from-left-2[data-side=right]{--tw-enter-translate-x: -.5rem}.data-\[side\=top\]\:slide-in-from-bottom-2[data-side=top]{--tw-enter-translate-y: .5rem}.data-\[state\=closed\]\:slide-out-to-left-1\/2[data-state=closed]{--tw-exit-translate-x: -50%}.data-\[state\=closed\]\:slide-out-to-right-full[data-state=closed]{--tw-exit-translate-x: 100%}.data-\[state\=closed\]\:slide-out-to-top-\[48\%\][data-state=closed]{--tw-exit-translate-y: -48%}.data-\[state\=open\]\:slide-in-from-left-1\/2[data-state=open]{--tw-enter-translate-x: -50%}.data-\[state\=open\]\:slide-in-from-top-\[48\%\][data-state=open]{--tw-enter-translate-y: -48%}.data-\[state\=open\]\:slide-in-from-top-full[data-state=open]{--tw-enter-translate-y: -100%}.data-\[selected\]\:hover\:bg-primary:hover[data-selected]{background-color:hsl(var(--primary))}.data-\[selected\]\:hover\:text-primary-foreground:hover[data-selected]{color:hsl(var(--primary-foreground))}.data-\[selected\]\:focus\:bg-primary:focus[data-selected]{background-color:hsl(var(--primary))}.data-\[selected\]\:focus\:text-primary-foreground:focus[data-selected]{color:hsl(var(--primary-foreground))}@supports ((-webkit-backdrop-filter: var(--tw)) or (backdrop-filter: var(--tw))){.supports-\[backdrop-filter\]\:bg-background\/60{background-color:hsl(var(--background) / .6)}}.dark\:border-r:is(.dark *){border-right-width:1px}.dark\:border-destructive:is(.dark *){border-color:hsl(var(--destructive))}.dark\:border-gray-400\/20:is(.dark *){border-color:#9ca3af33}.dark\:border-green-500\/20:is(.dark *){border-color:#22c55e33}.dark\:border-red-400\/20:is(.dark *){border-color:#f8717133}.dark\:border-yellow-400\/20:is(.dark *){border-color:#facc1533}.dark\:bg-gray-400\/10:is(.dark *){background-color:#9ca3af1a}.dark\:bg-green-500\/10:is(.dark *){background-color:#22c55e1a}.dark\:bg-muted:is(.dark *){background-color:hsl(var(--muted))}.dark\:bg-red-400\/10:is(.dark *){background-color:#f871711a}.dark\:bg-yellow-400\/10:is(.dark *){background-color:#facc151a}.dark\:text-gray-400:is(.dark *){--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity, 1))}.dark\:text-green-400:is(.dark *){--tw-text-opacity: 1;color:rgb(74 222 128 / var(--tw-text-opacity, 1))}.dark\:text-muted-foreground:is(.dark *){color:hsl(var(--muted-foreground))}.dark\:text-red-400:is(.dark *){--tw-text-opacity: 1;color:rgb(248 113 113 / var(--tw-text-opacity, 1))}.dark\:text-white:is(.dark *){--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.dark\:text-yellow-500:is(.dark *){--tw-text-opacity: 1;color:rgb(234 179 8 / var(--tw-text-opacity, 1))}.dark\:text-zinc-200:is(.dark *){--tw-text-opacity: 1;color:rgb(228 228 231 / var(--tw-text-opacity, 1))}.dark\:hover\:bg-muted:hover:is(.dark *){background-color:hsl(var(--muted))}.dark\:hover\:text-white:hover:is(.dark *){--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}@media (min-width: 640px){.sm\:bottom-0{bottom:0}.sm\:right-0{right:0}.sm\:top-auto{top:auto}.sm\:w-\[300px\]{width:300px}.sm\:max-w-\[425px\]{max-width:425px}.sm\:flex-row{flex-direction:row}.sm\:flex-col{flex-direction:column}.sm\:justify-end{justify-content:flex-end}.sm\:gap-x-2{-moz-column-gap:.5rem;column-gap:.5rem}.sm\:gap-x-4{-moz-column-gap:1rem;column-gap:1rem}.sm\:gap-y-0{row-gap:0px}.sm\:rounded-lg{border-radius:var(--radius)}.sm\:text-left{text-align:left}.data-\[state\=open\]\:sm\:slide-in-from-bottom-full[data-state=open]{--tw-enter-translate-y: 100%}}@media (min-width: 768px){.md\:flex{display:flex}.md\:grid{display:grid}.md\:w-full{width:100%}.md\:max-w-\[420px\]{max-width:420px}}@media (min-width: 1024px){.lg\:flex{display:flex}.lg\:max-w-none{max-width:none}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:p-8{padding:2rem}.lg\:px-0{padding-left:0;padding-right:0}}.\[\&\+div\]\:text-xs+div{font-size:.75rem;line-height:1rem}.\[\&\:has\(\[data-selected\]\)\]\:rounded-md:has([data-selected]){border-radius:calc(var(--radius) - 2px)}.\[\&\:has\(\[data-selected\]\)\]\:bg-accent:has([data-selected]){background-color:hsl(var(--accent))}.\[\&\:has\(\[data-selected\]\[data-outside-view\]\)\]\:bg-accent\/50:has([data-selected][data-outside-view]){background-color:hsl(var(--accent) / .5)}.\[\&\:has\(\[role\=checkbox\]\)\]\:pr-0:has([role=checkbox]){padding-right:0}.\[\&\>\[role\=checkbox\]\]\:translate-y-0\.5>[role=checkbox]{--tw-translate-y: .125rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.\[\&\>span\]\:line-clamp-1>span{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:1}.\[\&\>span\]\:flex>span{display:flex}.\[\&\>span\]\:w-auto>span{width:auto}.\[\&\>span\]\:w-full>span{width:100%}.\[\&\>span\]\:items-center>span{align-items:center}.\[\&\>span\]\:gap-1>span{gap:.25rem}.\[\&\>span\]\:truncate>span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.\[\&\>svg\+div\]\:translate-y-\[-3px\]>svg+div{--tw-translate-y: -3px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.\[\&\>svg\]\:absolute>svg{position:absolute}.\[\&\>svg\]\:left-4>svg{left:1rem}.\[\&\>svg\]\:top-4>svg{top:1rem}.\[\&\>svg\]\:hidden>svg{display:none}.\[\&\>svg\]\:text-destructive>svg{color:hsl(var(--destructive))}.\[\&\>svg\]\:text-foreground>svg{color:hsl(var(--foreground))}.\[\&\>svg\~\*\]\:pl-7>svg~*{padding-left:1.75rem}.\[\&\>tr\]\:last\:border-b-0:last-child>tr{border-bottom-width:0px}.\[\&\[data-orientation\=vertical\]\>div\]\:rotate-90[data-orientation=vertical]>div{--tw-rotate: 90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.\[\&\[data-orientation\=vertical\]\]\:h-px[data-orientation=vertical]{height:1px}.\[\&\[data-orientation\=vertical\]\]\:w-full[data-orientation=vertical]{width:100%}.\[\&\[data-orientation\=vertical\]\]\:after\:left-0[data-orientation=vertical]:after{content:var(--tw-content);left:0}.\[\&\[data-orientation\=vertical\]\]\:after\:h-1[data-orientation=vertical]:after{content:var(--tw-content);height:.25rem}.\[\&\[data-orientation\=vertical\]\]\:after\:w-full[data-orientation=vertical]:after{content:var(--tw-content);width:100%}.\[\&\[data-orientation\=vertical\]\]\:after\:-translate-y-1\/2[data-orientation=vertical]:after{content:var(--tw-content);--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.\[\&\[data-orientation\=vertical\]\]\:after\:translate-x-0[data-orientation=vertical]:after{content:var(--tw-content);--tw-translate-x: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.\[\&\[data-outside-view\]\[data-selected\]\]\:bg-accent\/50[data-outside-view][data-selected]{background-color:hsl(var(--accent) / .5)}.\[\&\[data-outside-view\]\[data-selected\]\]\:text-muted-foreground[data-outside-view][data-selected]{color:hsl(var(--muted-foreground))}.\[\&\[data-outside-view\]\[data-selected\]\]\:opacity-30[data-outside-view][data-selected]{opacity:.3}.\[\&\[data-today\]\:not\(\[data-selected\]\)\]\:bg-accent[data-today]:not([data-selected]){background-color:hsl(var(--accent))}.\[\&\[data-today\]\:not\(\[data-selected\]\)\]\:text-accent-foreground[data-today]:not([data-selected]){color:hsl(var(--accent-foreground))}.\[\&_\[cmdk-group-heading\]\]\:px-2 [cmdk-group-heading]{padding-left:.5rem;padding-right:.5rem}.\[\&_\[cmdk-group-heading\]\]\:py-1\.5 [cmdk-group-heading]{padding-top:.375rem;padding-bottom:.375rem}.\[\&_\[cmdk-group-heading\]\]\:text-xs [cmdk-group-heading]{font-size:.75rem;line-height:1rem}.\[\&_\[cmdk-group-heading\]\]\:font-medium [cmdk-group-heading]{font-weight:500}.\[\&_\[cmdk-group-heading\]\]\:text-muted-foreground [cmdk-group-heading]{color:hsl(var(--muted-foreground))}.\[\&_\[cmdk-group\]\:not\(\[hidden\]\)_\~\[cmdk-group\]\]\:pt-0 [cmdk-group]:not([hidden])~[cmdk-group]{padding-top:0}.\[\&_\[cmdk-group\]\]\:px-2 [cmdk-group]{padding-left:.5rem;padding-right:.5rem}.\[\&_\[cmdk-input-wrapper\]_svg\]\:h-5 [cmdk-input-wrapper] svg{height:1.25rem}.\[\&_\[cmdk-input-wrapper\]_svg\]\:w-5 [cmdk-input-wrapper] svg{width:1.25rem}.\[\&_\[cmdk-input\]\]\:h-12 [cmdk-input]{height:3rem}.\[\&_\[cmdk-item\]\]\:px-2 [cmdk-item]{padding-left:.5rem;padding-right:.5rem}.\[\&_\[cmdk-item\]\]\:py-3 [cmdk-item]{padding-top:.75rem;padding-bottom:.75rem}.\[\&_\[cmdk-item\]_svg\]\:h-5 [cmdk-item] svg{height:1.25rem}.\[\&_\[cmdk-item\]_svg\]\:w-5 [cmdk-item] svg{width:1.25rem}.\[\&_p\]\:leading-relaxed p{line-height:1.625}.\[\&_svg\]\:size-4 svg{width:1rem;height:1rem}.\[\&_svg\]\:h-4 svg{height:1rem}.\[\&_svg\]\:w-4 svg{width:1rem}.\[\&_svg\]\:shrink-0 svg{flex-shrink:0}.\[\&_svg\]\:text-foreground svg{color:hsl(var(--foreground))}.\[\&_tr\:last-child\]\:border-0 tr:last-child{border-width:0px}.\[\&_tr\]\:border-b tr{border-bottom-width:1px}html{color-scheme:light}html.dark{color-scheme:dark}.theme-zinc{--background: 0 0% 100%;--foreground: 240 10% 3.9%;--muted: 240 4.8% 95.9%;--muted-foreground: 240 3.8% 46.1%;--popover: 0 0% 100%;--popover-foreground: 240 10% 3.9%;--card: 0 0% 100%;--card-foreground: 240 10% 3.9%;--border: 240 5.9% 90%;--input: 240 5.9% 90%;--primary: 240 5.9% 10%;--primary-foreground: 0 0% 98%;--secondary: 240 4.8% 95.9%;--secondary-foreground: 240 5.9% 10%;--accent: 240 4.8% 95.9%;--accent-foreground: 240 5.9% 10%;--destructive: 0 84.2% 60.2%;--destructive-foreground: 0 0% 98%;--ring: 240 5.9% 10%;--radius: .5rem}.theme-zinc.dark{--background: 240 10% 3.9%;--foreground: 0 0% 98%;--muted: 240 3.7% 15.9%;--muted-foreground: 240 5% 64.9%;--popover: 240 10% 3.9%;--popover-foreground: 0 0% 98%;--card: 240 10% 3.9%;--card-foreground: 0 0% 98%;--border: 240 3.7% 15.9%;--input: 240 3.7% 15.9%;--primary: 0 0% 98%;--primary-foreground: 240 5.9% 10%;--secondary: 240 3.7% 15.9%;--secondary-foreground: 0 0% 98%;--accent: 240 3.7% 15.9%;--accent-foreground: 0 0% 98%;--destructive: 0 62.8% 30.6%;--destructive-foreground: 0 0% 98%;--ring: 240 4.9% 83.9%}.theme-slate{--background: 0 0% 100%;--foreground: 222.2 84% 4.9%;--muted: 210 40% 96.1%;--muted-foreground: 215.4 16.3% 46.9%;--popover: 0 0% 100%;--popover-foreground: 222.2 84% 4.9%;--card: 0 0% 100%;--card-foreground: 222.2 84% 4.9%;--border: 214.3 31.8% 91.4%;--input: 214.3 31.8% 91.4%;--primary: 222.2 47.4% 11.2%;--primary-foreground: 210 40% 98%;--secondary: 210 40% 96.1%;--secondary-foreground: 222.2 47.4% 11.2%;--accent: 210 40% 96.1%;--accent-foreground: 222.2 47.4% 11.2%;--destructive: 0 84.2% 60.2%;--destructive-foreground: 210 40% 98%;--ring: 222.2 84% 4.9%;--radius: .5rem}.theme-slate.dark{--background: 222.2 84% 4.9%;--foreground: 210 40% 98%;--muted: 217.2 32.6% 17.5%;--muted-foreground: 215 20.2% 65.1%;--popover: 222.2 84% 4.9%;--popover-foreground: 210 40% 98%;--card: 222.2 84% 4.9%;--card-foreground: 210 40% 98%;--border: 217.2 32.6% 17.5%;--input: 217.2 32.6% 17.5%;--primary: 210 40% 98%;--primary-foreground: 222.2 47.4% 11.2%;--secondary: 217.2 32.6% 17.5%;--secondary-foreground: 210 40% 98%;--accent: 217.2 32.6% 17.5%;--accent-foreground: 210 40% 98%;--destructive: 0 62.8% 30.6%;--destructive-foreground: 210 40% 98%;--ring: 212.7 26.8% 83.9}.theme-stone{--background: 0 0% 100%;--foreground: 20 14.3% 4.1%;--muted: 60 4.8% 95.9%;--muted-foreground: 25 5.3% 44.7%;--popover: 0 0% 100%;--popover-foreground: 20 14.3% 4.1%;--card: 0 0% 100%;--card-foreground: 20 14.3% 4.1%;--border: 20 5.9% 90%;--input: 20 5.9% 90%;--primary: 24 9.8% 10%;--primary-foreground: 60 9.1% 97.8%;--secondary: 60 4.8% 95.9%;--secondary-foreground: 24 9.8% 10%;--accent: 60 4.8% 95.9%;--accent-foreground: 24 9.8% 10%;--destructive: 0 84.2% 60.2%;--destructive-foreground: 60 9.1% 97.8%;--ring: 20 14.3% 4.1%;--radius: .5rem}.theme-stone.dark{--background: 20 14.3% 4.1%;--foreground: 60 9.1% 97.8%;--muted: 12 6.5% 15.1%;--muted-foreground: 24 5.4% 63.9%;--popover: 20 14.3% 4.1%;--popover-foreground: 60 9.1% 97.8%;--card: 20 14.3% 4.1%;--card-foreground: 60 9.1% 97.8%;--border: 12 6.5% 15.1%;--input: 12 6.5% 15.1%;--primary: 60 9.1% 97.8%;--primary-foreground: 24 9.8% 10%;--secondary: 12 6.5% 15.1%;--secondary-foreground: 60 9.1% 97.8%;--accent: 12 6.5% 15.1%;--accent-foreground: 60 9.1% 97.8%;--destructive: 0 62.8% 30.6%;--destructive-foreground: 60 9.1% 97.8%;--ring: 24 5.7% 82.9%}.theme-gray{--background: 0 0% 100%;--foreground: 224 71.4% 4.1%;--muted: 220 14.3% 95.9%;--muted-foreground: 220 8.9% 46.1%;--popover: 0 0% 100%;--popover-foreground: 224 71.4% 4.1%;--card: 0 0% 100%;--card-foreground: 224 71.4% 4.1%;--border: 220 13% 91%;--input: 220 13% 91%;--primary: 220.9 39.3% 11%;--primary-foreground: 210 20% 98%;--secondary: 220 14.3% 95.9%;--secondary-foreground: 220.9 39.3% 11%;--accent: 220 14.3% 95.9%;--accent-foreground: 220.9 39.3% 11%;--destructive: 0 84.2% 60.2%;--destructive-foreground: 210 20% 98%;--ring: 224 71.4% 4.1%;--radius: .5rem}.theme-gray.dark{--background: 224 71.4% 4.1%;--foreground: 210 20% 98%;--muted: 215 27.9% 16.9%;--muted-foreground: 217.9 10.6% 64.9%;--popover: 224 71.4% 4.1%;--popover-foreground: 210 20% 98%;--card: 224 71.4% 4.1%;--card-foreground: 210 20% 98%;--border: 215 27.9% 16.9%;--input: 215 27.9% 16.9%;--primary: 210 20% 98%;--primary-foreground: 220.9 39.3% 11%;--secondary: 215 27.9% 16.9%;--secondary-foreground: 210 20% 98%;--accent: 215 27.9% 16.9%;--accent-foreground: 210 20% 98%;--destructive: 0 62.8% 30.6%;--destructive-foreground: 210 20% 98%;--ring: 216 12.2% 83.9%}.theme-neutral{--background: 0 0% 100%;--foreground: 0 0% 3.9%;--muted: 0 0% 96.1%;--muted-foreground: 0 0% 45.1%;--popover: 0 0% 100%;--popover-foreground: 0 0% 3.9%;--card: 0 0% 100%;--card-foreground: 0 0% 3.9%;--border: 0 0% 89.8%;--input: 0 0% 89.8%;--primary: 0 0% 9%;--primary-foreground: 0 0% 98%;--secondary: 0 0% 96.1%;--secondary-foreground: 0 0% 9%;--accent: 0 0% 96.1%;--accent-foreground: 0 0% 9%;--destructive: 0 84.2% 60.2%;--destructive-foreground: 0 0% 98%;--ring: 0 0% 3.9%;--radius: .5rem}.theme-neutral.dark{--background: 0 0% 3.9%;--foreground: 0 0% 98%;--muted: 0 0% 14.9%;--muted-foreground: 0 0% 63.9%;--popover: 0 0% 3.9%;--popover-foreground: 0 0% 98%;--card: 0 0% 3.9%;--card-foreground: 0 0% 98%;--border: 0 0% 14.9%;--input: 0 0% 14.9%;--primary: 0 0% 98%;--primary-foreground: 0 0% 9%;--secondary: 0 0% 14.9%;--secondary-foreground: 0 0% 98%;--accent: 0 0% 14.9%;--accent-foreground: 0 0% 98%;--destructive: 0 62.8% 30.6%;--destructive-foreground: 0 0% 98%;--ring: 0 0% 83.1%}.theme-red{--background: 0 0% 100%;--foreground: 0 0% 3.9%;--muted: 0 0% 96.1%;--muted-foreground: 0 0% 45.1%;--popover: 0 0% 100%;--popover-foreground: 0 0% 3.9%;--card: 0 0% 100%;--card-foreground: 0 0% 3.9%;--border: 0 0% 89.8%;--input: 0 0% 89.8%;--primary: 0 72.2% 50.6%;--primary-foreground: 0 85.7% 97.3%;--secondary: 0 0% 96.1%;--secondary-foreground: 0 0% 9%;--accent: 0 0% 96.1%;--accent-foreground: 0 0% 9%;--destructive: 0 84.2% 60.2%;--destructive-foreground: 0 0% 98%;--ring: 0 72.2% 50.6%;--radius: .5rem}.theme-red.dark{--background: 0 0% 3.9%;--foreground: 0 0% 98%;--muted: 0 0% 14.9%;--muted-foreground: 0 0% 63.9%;--popover: 0 0% 3.9%;--popover-foreground: 0 0% 98%;--card: 0 0% 3.9%;--card-foreground: 0 0% 98%;--border: 0 0% 14.9%;--input: 0 0% 14.9%;--primary: 0 72.2% 50.6%;--primary-foreground: 0 85.7% 97.3%;--secondary: 0 0% 14.9%;--secondary-foreground: 0 0% 98%;--accent: 0 0% 14.9%;--accent-foreground: 0 0% 98%;--destructive: 0 62.8% 30.6%;--destructive-foreground: 0 0% 98%;--ring: 0 72.2% 50.6%}.theme-rose{--background: 0 0% 100%;--foreground: 240 10% 3.9%;--muted: 240 4.8% 95.9%;--muted-foreground: 240 3.8% 46.1%;--popover: 0 0% 100%;--popover-foreground: 240 10% 3.9%;--card: 0 0% 100%;--card-foreground: 240 10% 3.9%;--border: 240 5.9% 90%;--input: 240 5.9% 90%;--primary: 346.8 77.2% 49.8%;--primary-foreground: 355.7 100% 97.3%;--secondary: 240 4.8% 95.9%;--secondary-foreground: 240 5.9% 10%;--accent: 240 4.8% 95.9%;--accent-foreground: 240 5.9% 10%;--destructive: 0 84.2% 60.2%;--destructive-foreground: 0 0% 98%;--ring: 346.8 77.2% 49.8%;--radius: .5rem}.theme-rose.dark{--background: 20 14.3% 4.1%;--foreground: 0 0% 95%;--muted: 0 0% 15%;--muted-foreground: 240 5% 64.9%;--popover: 0 0% 9%;--popover-foreground: 0 0% 95%;--card: 24 9.8% 10%;--card-foreground: 0 0% 95%;--border: 240 3.7% 15.9%;--input: 240 3.7% 15.9%;--primary: 346.8 77.2% 49.8%;--primary-foreground: 355.7 100% 97.3%;--secondary: 240 3.7% 15.9%;--secondary-foreground: 0 0% 98%;--accent: 12 6.5% 15.1%;--accent-foreground: 0 0% 98%;--destructive: 0 62.8% 30.6%;--destructive-foreground: 0 85.7% 97.3%;--ring: 346.8 77.2% 49.8%}.theme-orange{--background: 0 0% 100%;--foreground: 20 14.3% 4.1%;--muted: 60 4.8% 95.9%;--muted-foreground: 25 5.3% 44.7%;--popover: 0 0% 100%;--popover-foreground: 20 14.3% 4.1%;--card: 0 0% 100%;--card-foreground: 20 14.3% 4.1%;--border: 20 5.9% 90%;--input: 20 5.9% 90%;--primary: 24.6 95% 53.1%;--primary-foreground: 60 9.1% 97.8%;--secondary: 60 4.8% 95.9%;--secondary-foreground: 24 9.8% 10%;--accent: 60 4.8% 95.9%;--accent-foreground: 24 9.8% 10%;--destructive: 0 84.2% 60.2%;--destructive-foreground: 60 9.1% 97.8%;--ring: 24.6 95% 53.1%;--radius: .5rem}.theme-orange.dark{--background: 20 14.3% 4.1%;--foreground: 60 9.1% 97.8%;--muted: 12 6.5% 15.1%;--muted-foreground: 24 5.4% 63.9%;--popover: 20 14.3% 4.1%;--popover-foreground: 60 9.1% 97.8%;--card: 20 14.3% 4.1%;--card-foreground: 60 9.1% 97.8%;--border: 12 6.5% 15.1%;--input: 12 6.5% 15.1%;--primary: 20.5 90.2% 48.2%;--primary-foreground: 60 9.1% 97.8%;--secondary: 12 6.5% 15.1%;--secondary-foreground: 60 9.1% 97.8%;--accent: 12 6.5% 15.1%;--accent-foreground: 60 9.1% 97.8%;--destructive: 0 72.2% 50.6%;--destructive-foreground: 60 9.1% 97.8%;--ring: 20.5 90.2% 48.2%}.theme-green{--background: 0 0% 100%;--foreground: 240 10% 3.9%;--muted: 240 4.8% 95.9%;--muted-foreground: 240 3.8% 46.1%;--popover: 0 0% 100%;--popover-foreground: 240 10% 3.9%;--card: 0 0% 100%;--card-foreground: 240 10% 3.9%;--border: 240 5.9% 90%;--input: 240 5.9% 90%;--primary: 142.1 76.2% 36.3%;--primary-foreground: 355.7 100% 97.3%;--secondary: 240 4.8% 95.9%;--secondary-foreground: 240 5.9% 10%;--accent: 240 4.8% 95.9%;--accent-foreground: 240 5.9% 10%;--destructive: 0 84.2% 60.2%;--destructive-foreground: 0 0% 98%;--ring: 142.1 76.2% 36.3%;--radius: .5rem}.theme-green.dark{--background: 20 14.3% 4.1%;--foreground: 0 0% 95%;--muted: 0 0% 15%;--muted-foreground: 240 5% 64.9%;--popover: 0 0% 9%;--popover-foreground: 0 0% 95%;--card: 24 9.8% 10%;--card-foreground: 0 0% 95%;--border: 240 3.7% 15.9%;--input: 240 3.7% 15.9%;--primary: 142.1 70.6% 45.3%;--primary-foreground: 144.9 80.4% 10%;--secondary: 240 3.7% 15.9%;--secondary-foreground: 0 0% 98%;--accent: 12 6.5% 15.1%;--accent-foreground: 0 0% 98%;--destructive: 0 62.8% 30.6%;--destructive-foreground: 0 85.7% 97.3%;--ring: 142.4 71.8% 29.2%}.theme-blue{--background: 0 0% 100%;--foreground: 222.2 84% 4.9%;--muted: 210 40% 96.1%;--muted-foreground: 215.4 16.3% 46.9%;--popover: 0 0% 100%;--popover-foreground: 222.2 84% 4.9%;--card: 0 0% 100%;--card-foreground: 222.2 84% 4.9%;--border: 214.3 31.8% 91.4%;--input: 214.3 31.8% 91.4%;--primary: 221.2 83.2% 53.3%;--primary-foreground: 210 40% 98%;--secondary: 210 40% 96.1%;--secondary-foreground: 222.2 47.4% 11.2%;--accent: 210 40% 96.1%;--accent-foreground: 222.2 47.4% 11.2%;--destructive: 0 84.2% 60.2%;--destructive-foreground: 210 40% 98%;--ring: 221.2 83.2% 53.3%;--radius: .5rem}.theme-blue.dark{--background: 222.2 84% 4.9%;--foreground: 210 40% 98%;--muted: 217.2 32.6% 17.5%;--muted-foreground: 215 20.2% 65.1%;--popover: 222.2 84% 4.9%;--popover-foreground: 210 40% 98%;--card: 222.2 84% 4.9%;--card-foreground: 210 40% 98%;--border: 217.2 32.6% 17.5%;--input: 217.2 32.6% 17.5%;--primary: 217.2 91.2% 59.8%;--primary-foreground: 222.2 47.4% 11.2%;--secondary: 217.2 32.6% 17.5%;--secondary-foreground: 210 40% 98%;--accent: 217.2 32.6% 17.5%;--accent-foreground: 210 40% 98%;--destructive: 0 62.8% 30.6%;--destructive-foreground: 210 40% 98%;--ring: 224.3 76.3% 48%}.theme-yellow{--background: 0 0% 100%;--foreground: 20 14.3% 4.1%;--muted: 60 4.8% 95.9%;--muted-foreground: 25 5.3% 44.7%;--popover: 0 0% 100%;--popover-foreground: 20 14.3% 4.1%;--card: 0 0% 100%;--card-foreground: 20 14.3% 4.1%;--border: 20 5.9% 90%;--input: 20 5.9% 90%;--primary: 47.9 95.8% 53.1%;--primary-foreground: 26 83.3% 14.1%;--secondary: 60 4.8% 95.9%;--secondary-foreground: 24 9.8% 10%;--accent: 60 4.8% 95.9%;--accent-foreground: 24 9.8% 10%;--destructive: 0 84.2% 60.2%;--destructive-foreground: 60 9.1% 97.8%;--ring: 20 14.3% 4.1%;--radius: .5rem}.theme-yellow.dark{--background: 20 14.3% 4.1%;--foreground: 60 9.1% 97.8%;--muted: 12 6.5% 15.1%;--muted-foreground: 24 5.4% 63.9%;--popover: 20 14.3% 4.1%;--popover-foreground: 60 9.1% 97.8%;--card: 20 14.3% 4.1%;--card-foreground: 60 9.1% 97.8%;--border: 12 6.5% 15.1%;--input: 12 6.5% 15.1%;--primary: 47.9 95.8% 53.1%;--primary-foreground: 26 83.3% 14.1%;--secondary: 12 6.5% 15.1%;--secondary-foreground: 60 9.1% 97.8%;--accent: 12 6.5% 15.1%;--accent-foreground: 60 9.1% 97.8%;--destructive: 0 62.8% 30.6%;--destructive-foreground: 60 9.1% 97.8%;--ring: 35.5 91.7% 32.9%}.theme-violet{--background: 0 0% 100%;--foreground: 224 71.4% 4.1%;--muted: 220 14.3% 95.9%;--muted-foreground: 220 8.9% 46.1%;--popover: 0 0% 100%;--popover-foreground: 224 71.4% 4.1%;--card: 0 0% 100%;--card-foreground: 224 71.4% 4.1%;--border: 220 13% 91%;--input: 220 13% 91%;--primary: 262.1 83.3% 57.8%;--primary-foreground: 210 20% 98%;--secondary: 220 14.3% 95.9%;--secondary-foreground: 220.9 39.3% 11%;--accent: 220 14.3% 95.9%;--accent-foreground: 220.9 39.3% 11%;--destructive: 0 84.2% 60.2%;--destructive-foreground: 210 20% 98%;--ring: 262.1 83.3% 57.8%;--radius: .5rem}.theme-violet.dark{--background: 224 71.4% 4.1%;--foreground: 210 20% 98%;--muted: 215 27.9% 16.9%;--muted-foreground: 217.9 10.6% 64.9%;--popover: 224 71.4% 4.1%;--popover-foreground: 210 20% 98%;--card: 224 71.4% 4.1%;--card-foreground: 210 20% 98%;--border: 215 27.9% 16.9%;--input: 215 27.9% 16.9%;--primary: 263.4 70% 50.4%;--primary-foreground: 210 20% 98%;--secondary: 215 27.9% 16.9%;--secondary-foreground: 210 20% 98%;--accent: 215 27.9% 16.9%;--accent-foreground: 210 20% 98%;--destructive: 0 62.8% 30.6%;--destructive-foreground: 210 20% 98%;--ring: 263.4 70% 50.4%} diff --git a/cmd/reaper/dist/assets/index-R6REwTGa.js b/cmd/reaper/dist/assets/index-R6REwTGa.js deleted file mode 100644 index fdacdfa9..00000000 --- a/cmd/reaper/dist/assets/index-R6REwTGa.js +++ /dev/null @@ -1,172 +0,0 @@ -var K_=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var c_e=K_((R_e,Pi)=>{(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const o of document.querySelectorAll('link[rel="modulepreload"]'))r(o);new MutationObserver(o=>{for(const s of o)if(s.type==="childList")for(const a of s.addedNodes)a.tagName==="LINK"&&a.rel==="modulepreload"&&r(a)}).observe(document,{childList:!0,subtree:!0});function n(o){const s={};return o.integrity&&(s.integrity=o.integrity),o.referrerPolicy&&(s.referrerPolicy=o.referrerPolicy),o.crossOrigin==="use-credentials"?s.credentials="include":o.crossOrigin==="anonymous"?s.credentials="omit":s.credentials="same-origin",s}function r(o){if(o.ep)return;o.ep=!0;const s=n(o);fetch(o.href,s)}})();/** -* @vue/shared v3.5.13 -* (c) 2018-present Yuxi (Evan) You and Vue contributors -* @license MIT -**//*! #__NO_SIDE_EFFECTS__ */function lf(e){const t=Object.create(null);for(const n of e.split(","))t[n]=1;return n=>n in t}const He={},qo=[],Vn=()=>{},Z_=()=>!1,ll=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),cf=e=>e.startsWith("onUpdate:"),gt=Object.assign,uf=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},X_=Object.prototype.hasOwnProperty,Ye=(e,t)=>X_.call(e,t),ke=Array.isArray,Vo=e=>cl(e)==="[object Map]",Uv=e=>cl(e)==="[object Set]",De=e=>typeof e=="function",ct=e=>typeof e=="string",vr=e=>typeof e=="symbol",nt=e=>e!==null&&typeof e=="object",Wv=e=>(nt(e)||De(e))&&De(e.then)&&De(e.catch),Yv=Object.prototype.toString,cl=e=>Yv.call(e),J_=e=>cl(e).slice(8,-1),Gv=e=>cl(e)==="[object Object]",df=e=>ct(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,qs=lf(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),ul=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},Q_=/-(\w)/g,Lt=ul(e=>e.replace(Q_,(t,n)=>n?n.toUpperCase():"")),ex=/\B([A-Z])/g,yr=ul(e=>e.replace(ex,"-$1").toLowerCase()),dl=ul(e=>e.charAt(0).toUpperCase()+e.slice(1)),Vs=ul(e=>e?`on${dl(e)}`:""),Bt=(e,t)=>!Object.is(e,t),gi=(e,...t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:r,value:n})},ud=e=>{const t=parseFloat(e);return isNaN(t)?e:t},tx=e=>{const t=ct(e)?Number(e):NaN;return isNaN(t)?e:t};let Zp;const fl=()=>Zp||(Zp=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function Wt(e){if(ke(e)){const t={};for(let n=0;n{if(n){const r=n.split(rx);r.length>1&&(t[r[0].trim()]=r[1].trim())}}),t}function Ee(e){let t="";if(ct(e))t=e;else if(ke(e))for(let n=0;n!!(e&&e.__v_isRef===!0),ne=e=>ct(e)?e:e==null?"":ke(e)||nt(e)&&(e.toString===Yv||!De(e.toString))?Xv(e)?ne(e.value):JSON.stringify(e,Jv,2):String(e),Jv=(e,t)=>Xv(t)?Jv(e,t.value):Vo(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[r,o],s)=>(n[pc(r,s)+" =>"]=o,n),{})}:Uv(t)?{[`Set(${t.size})`]:[...t.values()].map(n=>pc(n))}:vr(t)?pc(t):nt(t)&&!ke(t)&&!Gv(t)?String(t):t,pc=(e,t="")=>{var n;return vr(e)?`Symbol(${(n=e.description)!=null?n:t})`:e};/** -* @vue/reactivity v3.5.13 -* (c) 2018-present Yuxi (Evan) You and Vue contributors -* @license MIT -**/let $t;class Qv{constructor(t=!1){this.detached=t,this._active=!0,this.effects=[],this.cleanups=[],this._isPaused=!1,this.parent=$t,!t&&$t&&(this.index=($t.scopes||($t.scopes=[])).push(this)-1)}get active(){return this._active}pause(){if(this._active){this._isPaused=!0;let t,n;if(this.scopes)for(t=0,n=this.scopes.length;t0)return;if(Hs){let t=Hs;for(Hs=void 0;t;){const n=t.next;t.next=void 0,t.flags&=-9,t=n}}let e;for(;js;){let t=js;for(js=void 0;t;){const n=t.next;if(t.next=void 0,t.flags&=-9,t.flags&1)try{t.trigger()}catch(r){e||(e=r)}t=n}}if(e)throw e}function r0(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function o0(e){let t,n=e.depsTail,r=n;for(;r;){const o=r.prevDep;r.version===-1?(r===n&&(n=o),mf(r),lx(r)):t=r,r.dep.activeLink=r.prevActiveLink,r.prevActiveLink=void 0,r=o}e.deps=t,e.depsTail=n}function dd(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&(s0(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function s0(e){if(e.flags&4&&!(e.flags&16)||(e.flags&=-17,e.globalVersion===ta))return;e.globalVersion=ta;const t=e.dep;if(e.flags|=2,t.version>0&&!e.isSSR&&e.deps&&!dd(e)){e.flags&=-3;return}const n=tt,r=yn;tt=e,yn=!0;try{r0(e);const o=e.fn(e._value);(t.version===0||Bt(o,e._value))&&(e._value=o,t.version++)}catch(o){throw t.version++,o}finally{tt=n,yn=r,o0(e),e.flags&=-3}}function mf(e,t=!1){const{dep:n,prevSub:r,nextSub:o}=e;if(r&&(r.nextSub=o,e.prevSub=void 0),o&&(o.prevSub=r,e.nextSub=void 0),n.subs===e&&(n.subs=r,!r&&n.computed)){n.computed.flags&=-5;for(let s=n.computed.deps;s;s=s.nextDep)mf(s,!0)}!t&&!--n.sc&&n.map&&n.map.delete(n.key)}function lx(e){const{prevDep:t,nextDep:n}=e;t&&(t.nextDep=n,e.prevDep=void 0),n&&(n.prevDep=t,e.nextDep=void 0)}let yn=!0;const a0=[];function Gr(){a0.push(yn),yn=!1}function Kr(){const e=a0.pop();yn=e===void 0?!0:e}function Xp(e){const{cleanup:t}=e;if(e.cleanup=void 0,t){const n=tt;tt=void 0;try{t()}finally{tt=n}}}let ta=0;class cx{constructor(t,n){this.sub=t,this.dep=n,this.version=n.version,this.nextDep=this.prevDep=this.nextSub=this.prevSub=this.prevActiveLink=void 0}}class ml{constructor(t){this.computed=t,this.version=0,this.activeLink=void 0,this.subs=void 0,this.map=void 0,this.key=void 0,this.sc=0}track(t){if(!tt||!yn||tt===this.computed)return;let n=this.activeLink;if(n===void 0||n.sub!==tt)n=this.activeLink=new cx(tt,this),tt.deps?(n.prevDep=tt.depsTail,tt.depsTail.nextDep=n,tt.depsTail=n):tt.deps=tt.depsTail=n,i0(n);else if(n.version===-1&&(n.version=this.version,n.nextDep)){const r=n.nextDep;r.prevDep=n.prevDep,n.prevDep&&(n.prevDep.nextDep=r),n.prevDep=tt.depsTail,n.nextDep=void 0,tt.depsTail.nextDep=n,tt.depsTail=n,tt.deps===n&&(tt.deps=r)}return n}trigger(t){this.version++,ta++,this.notify(t)}notify(t){pf();try{for(let n=this.subs;n;n=n.prevSub)n.sub.notify()&&n.sub.dep.notify()}finally{hf()}}}function i0(e){if(e.dep.sc++,e.sub.flags&4){const t=e.dep.computed;if(t&&!e.dep.subs){t.flags|=20;for(let r=t.deps;r;r=r.nextDep)i0(r)}const n=e.dep.subs;n!==e&&(e.prevSub=n,n&&(n.nextSub=e)),e.dep.subs=e}}const $i=new WeakMap,fo=Symbol(""),fd=Symbol(""),na=Symbol("");function At(e,t,n){if(yn&&tt){let r=$i.get(e);r||$i.set(e,r=new Map);let o=r.get(n);o||(r.set(n,o=new ml),o.map=r,o.key=n),o.track()}}function sr(e,t,n,r,o,s){const a=$i.get(e);if(!a){ta++;return}const i=l=>{l&&l.trigger()};if(pf(),t==="clear")a.forEach(i);else{const l=ke(e),u=l&&df(n);if(l&&n==="length"){const c=Number(r);a.forEach((d,p)=>{(p==="length"||p===na||!vr(p)&&p>=c)&&i(d)})}else switch((n!==void 0||a.has(void 0))&&i(a.get(n)),u&&i(a.get(na)),t){case"add":l?u&&i(a.get("length")):(i(a.get(fo)),Vo(e)&&i(a.get(fd)));break;case"delete":l||(i(a.get(fo)),Vo(e)&&i(a.get(fd)));break;case"set":Vo(e)&&i(a.get(fo));break}}hf()}function ux(e,t){const n=$i.get(e);return n&&n.get(t)}function So(e){const t=ze(e);return t===e?t:(At(t,"iterate",na),un(e)?t:t.map(Dt))}function gl(e){return At(e=ze(e),"iterate",na),e}const dx={__proto__:null,[Symbol.iterator](){return mc(this,Symbol.iterator,Dt)},concat(...e){return So(this).concat(...e.map(t=>ke(t)?So(t):t))},entries(){return mc(this,"entries",e=>(e[1]=Dt(e[1]),e))},every(e,t){return Qn(this,"every",e,t,void 0,arguments)},filter(e,t){return Qn(this,"filter",e,t,n=>n.map(Dt),arguments)},find(e,t){return Qn(this,"find",e,t,Dt,arguments)},findIndex(e,t){return Qn(this,"findIndex",e,t,void 0,arguments)},findLast(e,t){return Qn(this,"findLast",e,t,Dt,arguments)},findLastIndex(e,t){return Qn(this,"findLastIndex",e,t,void 0,arguments)},forEach(e,t){return Qn(this,"forEach",e,t,void 0,arguments)},includes(...e){return gc(this,"includes",e)},indexOf(...e){return gc(this,"indexOf",e)},join(e){return So(this).join(e)},lastIndexOf(...e){return gc(this,"lastIndexOf",e)},map(e,t){return Qn(this,"map",e,t,void 0,arguments)},pop(){return ks(this,"pop")},push(...e){return ks(this,"push",e)},reduce(e,...t){return Jp(this,"reduce",e,t)},reduceRight(e,...t){return Jp(this,"reduceRight",e,t)},shift(){return ks(this,"shift")},some(e,t){return Qn(this,"some",e,t,void 0,arguments)},splice(...e){return ks(this,"splice",e)},toReversed(){return So(this).toReversed()},toSorted(e){return So(this).toSorted(e)},toSpliced(...e){return So(this).toSpliced(...e)},unshift(...e){return ks(this,"unshift",e)},values(){return mc(this,"values",Dt)}};function mc(e,t,n){const r=gl(e),o=r[t]();return r!==e&&!un(e)&&(o._next=o.next,o.next=()=>{const s=o._next();return s.value&&(s.value=n(s.value)),s}),o}const fx=Array.prototype;function Qn(e,t,n,r,o,s){const a=gl(e),i=a!==e&&!un(e),l=a[t];if(l!==fx[t]){const d=l.apply(e,s);return i?Dt(d):d}let u=n;a!==e&&(i?u=function(d,p){return n.call(this,Dt(d),p,e)}:n.length>2&&(u=function(d,p){return n.call(this,d,p,e)}));const c=l.call(a,u,r);return i&&o?o(c):c}function Jp(e,t,n,r){const o=gl(e);let s=n;return o!==e&&(un(e)?n.length>3&&(s=function(a,i,l){return n.call(this,a,i,l,e)}):s=function(a,i,l){return n.call(this,a,Dt(i),l,e)}),o[t](s,...r)}function gc(e,t,n){const r=ze(e);At(r,"iterate",na);const o=r[t](...n);return(o===-1||o===!1)&&gf(n[0])?(n[0]=ze(n[0]),r[t](...n)):o}function ks(e,t,n=[]){Gr(),pf();const r=ze(e)[t].apply(e,n);return hf(),Kr(),r}const px=lf("__proto__,__v_isRef,__isVue"),l0=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(vr));function hx(e){vr(e)||(e=String(e));const t=ze(this);return At(t,"has",e),t.hasOwnProperty(e)}class c0{constructor(t=!1,n=!1){this._isReadonly=t,this._isShallow=n}get(t,n,r){if(n==="__v_skip")return t.__v_skip;const o=this._isReadonly,s=this._isShallow;if(n==="__v_isReactive")return!o;if(n==="__v_isReadonly")return o;if(n==="__v_isShallow")return s;if(n==="__v_raw")return r===(o?s?m0:h0:s?p0:f0).get(t)||Object.getPrototypeOf(t)===Object.getPrototypeOf(r)?t:void 0;const a=ke(t);if(!o){let l;if(a&&(l=dx[n]))return l;if(n==="hasOwnProperty")return hx}const i=Reflect.get(t,n,lt(t)?t:r);return(vr(n)?l0.has(n):px(n))||(o||At(t,"get",n),s)?i:lt(i)?a&&df(n)?i:i.value:nt(i)?o?ka(i):xo(i):i}}class u0 extends c0{constructor(t=!1){super(!1,t)}set(t,n,r,o){let s=t[n];if(!this._isShallow){const l=go(s);if(!un(r)&&!go(r)&&(s=ze(s),r=ze(r)),!ke(t)&<(s)&&!lt(r))return l?!1:(s.value=r,!0)}const a=ke(t)&&df(n)?Number(n)e,Wa=e=>Reflect.getPrototypeOf(e);function bx(e,t,n){return function(...r){const o=this.__v_raw,s=ze(o),a=Vo(s),i=e==="entries"||e===Symbol.iterator&&a,l=e==="keys"&&a,u=o[e](...r),c=n?pd:t?hd:Dt;return!t&&At(s,"iterate",l?fd:fo),{next(){const{value:d,done:p}=u.next();return p?{value:d,done:p}:{value:i?[c(d[0]),c(d[1])]:c(d),done:p}},[Symbol.iterator](){return this}}}}function Ya(e){return function(...t){return e==="delete"?!1:e==="clear"?void 0:this}}function _x(e,t){const n={get(o){const s=this.__v_raw,a=ze(s),i=ze(o);e||(Bt(o,i)&&At(a,"get",o),At(a,"get",i));const{has:l}=Wa(a),u=t?pd:e?hd:Dt;if(l.call(a,o))return u(s.get(o));if(l.call(a,i))return u(s.get(i));s!==a&&s.get(o)},get size(){const o=this.__v_raw;return!e&&At(ze(o),"iterate",fo),Reflect.get(o,"size",o)},has(o){const s=this.__v_raw,a=ze(s),i=ze(o);return e||(Bt(o,i)&&At(a,"has",o),At(a,"has",i)),o===i?s.has(o):s.has(o)||s.has(i)},forEach(o,s){const a=this,i=a.__v_raw,l=ze(i),u=t?pd:e?hd:Dt;return!e&&At(l,"iterate",fo),i.forEach((c,d)=>o.call(s,u(c),u(d),a))}};return gt(n,e?{add:Ya("add"),set:Ya("set"),delete:Ya("delete"),clear:Ya("clear")}:{add(o){!t&&!un(o)&&!go(o)&&(o=ze(o));const s=ze(this);return Wa(s).has.call(s,o)||(s.add(o),sr(s,"add",o,o)),this},set(o,s){!t&&!un(s)&&!go(s)&&(s=ze(s));const a=ze(this),{has:i,get:l}=Wa(a);let u=i.call(a,o);u||(o=ze(o),u=i.call(a,o));const c=l.call(a,o);return a.set(o,s),u?Bt(s,c)&&sr(a,"set",o,s):sr(a,"add",o,s),this},delete(o){const s=ze(this),{has:a,get:i}=Wa(s);let l=a.call(s,o);l||(o=ze(o),l=a.call(s,o)),i&&i.call(s,o);const u=s.delete(o);return l&&sr(s,"delete",o,void 0),u},clear(){const o=ze(this),s=o.size!==0,a=o.clear();return s&&sr(o,"clear",void 0,void 0),a}}),["keys","values","entries",Symbol.iterator].forEach(o=>{n[o]=bx(o,e,t)}),n}function vl(e,t){const n=_x(e,t);return(r,o,s)=>o==="__v_isReactive"?!e:o==="__v_isReadonly"?e:o==="__v_raw"?r:Reflect.get(Ye(n,o)&&o in r?n:r,o,s)}const xx={get:vl(!1,!1)},wx={get:vl(!1,!0)},kx={get:vl(!0,!1)},Cx={get:vl(!0,!0)},f0=new WeakMap,p0=new WeakMap,h0=new WeakMap,m0=new WeakMap;function Sx(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function Ex(e){return e.__v_skip||!Object.isExtensible(e)?0:Sx(J_(e))}function xo(e){return go(e)?e:yl(e,!1,mx,xx,f0)}function g0(e){return yl(e,!1,vx,wx,p0)}function ka(e){return yl(e,!0,gx,kx,h0)}function Eo(e){return yl(e,!0,yx,Cx,m0)}function yl(e,t,n,r,o){if(!nt(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const s=o.get(e);if(s)return s;const a=Ex(e);if(a===0)return e;const i=new Proxy(e,a===2?r:n);return o.set(e,i),i}function ur(e){return go(e)?ur(e.__v_raw):!!(e&&e.__v_isReactive)}function go(e){return!!(e&&e.__v_isReadonly)}function un(e){return!!(e&&e.__v_isShallow)}function gf(e){return e?!!e.__v_raw:!1}function ze(e){const t=e&&e.__v_raw;return t?ze(t):e}function bl(e){return!Ye(e,"__v_skip")&&Object.isExtensible(e)&&Kv(e,"__v_skip",!0),e}const Dt=e=>nt(e)?xo(e):e,hd=e=>nt(e)?ka(e):e;function lt(e){return e?e.__v_isRef===!0:!1}function F(e){return v0(e,!1)}function vf(e){return v0(e,!0)}function v0(e,t){return lt(e)?e:new Ax(e,t)}class Ax{constructor(t,n){this.dep=new ml,this.__v_isRef=!0,this.__v_isShallow=!1,this._rawValue=n?t:ze(t),this._value=n?t:Dt(t),this.__v_isShallow=n}get value(){return this.dep.track(),this._value}set value(t){const n=this._rawValue,r=this.__v_isShallow||un(t)||go(t);t=r?t:ze(t),Bt(t,n)&&(this._rawValue=t,this._value=r?t:Dt(t),this.dep.trigger())}}function f(e){return lt(e)?e.value:e}const Dx={get:(e,t,n)=>t==="__v_raw"?e:f(Reflect.get(e,t,n)),set:(e,t,n,r)=>{const o=e[t];return lt(o)&&!lt(n)?(o.value=n,!0):Reflect.set(e,t,n,r)}};function y0(e){return ur(e)?e:new Proxy(e,Dx)}class Tx{constructor(t){this.__v_isRef=!0,this._value=void 0;const n=this.dep=new ml,{get:r,set:o}=t(n.track.bind(n),n.trigger.bind(n));this._get=r,this._set=o}get value(){return this._value=this._get()}set value(t){this._set(t)}}function b0(e){return new Tx(e)}function vt(e){const t=ke(e)?new Array(e.length):{};for(const n in e)t[n]=x0(e,n);return t}class Ox{constructor(t,n,r){this._object=t,this._key=n,this._defaultValue=r,this.__v_isRef=!0,this._value=void 0}get value(){const t=this._object[this._key];return this._value=t===void 0?this._defaultValue:t}set value(t){this._object[this._key]=t}get dep(){return ux(ze(this._object),this._key)}}class Mx{constructor(t){this._getter=t,this.__v_isRef=!0,this.__v_isReadonly=!0,this._value=void 0}get value(){return this._value=this._getter()}}function _0(e,t,n){return lt(e)?e:De(e)?new Mx(e):nt(e)&&arguments.length>1?x0(e,t,n):F(e)}function x0(e,t,n){const r=e[t];return lt(r)?r:new Ox(e,t,n)}class Rx{constructor(t,n,r){this.fn=t,this.setter=n,this._value=void 0,this.dep=new ml(this),this.__v_isRef=!0,this.deps=void 0,this.depsTail=void 0,this.flags=16,this.globalVersion=ta-1,this.next=void 0,this.effect=this,this.__v_isReadonly=!n,this.isSSR=r}notify(){if(this.flags|=16,!(this.flags&8)&&tt!==this)return n0(this,!0),!0}get value(){const t=this.dep.track();return s0(this),t&&(t.version=this.dep.version),this._value}set value(t){this.setter&&this.setter(t)}}function Px(e,t,n=!1){let r,o;return De(e)?r=e:(r=e.get,o=e.set),new Rx(r,o,n)}const Ga={},Fi=new WeakMap;let so;function $x(e,t=!1,n=so){if(n){let r=Fi.get(n);r||Fi.set(n,r=[]),r.push(e)}}function Fx(e,t,n=He){const{immediate:r,deep:o,once:s,scheduler:a,augmentJob:i,call:l}=n,u=w=>o?w:un(w)||o===!1||o===0?ar(w,1):ar(w);let c,d,p,h,m=!1,g=!1;if(lt(e)?(d=()=>e.value,m=un(e)):ur(e)?(d=()=>u(e),m=!0):ke(e)?(g=!0,m=e.some(w=>ur(w)||un(w)),d=()=>e.map(w=>{if(lt(w))return w.value;if(ur(w))return u(w);if(De(w))return l?l(w,2):w()})):De(e)?t?d=l?()=>l(e,2):e:d=()=>{if(p){Gr();try{p()}finally{Kr()}}const w=so;so=c;try{return l?l(e,3,[h]):e(h)}finally{so=w}}:d=Vn,t&&o){const w=d,C=o===!0?1/0:o;d=()=>ar(w(),C)}const v=hl(),y=()=>{c.stop(),v&&v.active&&uf(v.effects,c)};if(s&&t){const w=t;t=(...C)=>{w(...C),y()}}let k=g?new Array(e.length).fill(Ga):Ga;const b=w=>{if(!(!(c.flags&1)||!c.dirty&&!w))if(t){const C=c.run();if(o||m||(g?C.some((A,R)=>Bt(A,k[R])):Bt(C,k))){p&&p();const A=so;so=c;try{const R=[C,k===Ga?void 0:g&&k[0]===Ga?[]:k,h];l?l(t,3,R):t(...R),k=C}finally{so=A}}}else c.run()};return i&&i(b),c=new e0(d),c.scheduler=a?()=>a(b,!1):b,h=w=>$x(w,!1,c),p=c.onStop=()=>{const w=Fi.get(c);if(w){if(l)l(w,4);else for(const C of w)C();Fi.delete(c)}},t?r?b(!0):k=c.run():a?a(b.bind(null,!0),!0):c.run(),y.pause=c.pause.bind(c),y.resume=c.resume.bind(c),y.stop=y,y}function ar(e,t=1/0,n){if(t<=0||!nt(e)||e.__v_skip||(n=n||new Set,n.has(e)))return e;if(n.add(e),t--,lt(e))ar(e.value,t,n);else if(ke(e))for(let r=0;r{ar(r,t,n)});else if(Gv(e)){for(const r in e)ar(e[r],t,n);for(const r of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,r)&&ar(e[r],t,n)}return e}/** -* @vue/runtime-core v3.5.13 -* (c) 2018-present Yuxi (Evan) You and Vue contributors -* @license MIT -**/function Ca(e,t,n,r){try{return r?e(...r):e()}catch(o){_l(o,t,n)}}function _n(e,t,n,r){if(De(e)){const o=Ca(e,t,n,r);return o&&Wv(o)&&o.catch(s=>{_l(s,t,n)}),o}if(ke(e)){const o=[];for(let s=0;s>>1,o=Ft[r],s=ra(o);s=ra(n)?Ft.push(e):Ft.splice(Lx(t),0,e),e.flags|=1,k0()}}function k0(){Ii||(Ii=w0.then(S0))}function Nx(e){ke(e)?jo.push(...e):Rr&&e.id===-1?Rr.splice(Po+1,0,e):e.flags&1||(jo.push(e),e.flags|=1),k0()}function Qp(e,t,n=Ln+1){for(;nra(n)-ra(r));if(jo.length=0,Rr){Rr.push(...t);return}for(Rr=t,Po=0;Poe.id==null?e.flags&2?-1:1/0:e.id;function S0(e){try{for(Ln=0;Ln{r._d&&fh(-1);const s=Li(t);let a;try{a=e(...o)}finally{Li(s),r._d&&fh(1)}return a};return r._n=!0,r._c=!0,r._d=!0,r}function Ho(e,t){if(bt===null)return e;const n=Cl(bt),r=e.dirs||(e.dirs=[]);for(let o=0;oe.__isTeleport,Us=e=>e&&(e.disabled||e.disabled===""),eh=e=>e&&(e.defer||e.defer===""),th=e=>typeof SVGElement<"u"&&e instanceof SVGElement,nh=e=>typeof MathMLElement=="function"&&e instanceof MathMLElement,md=(e,t)=>{const n=e&&e.to;return ct(n)?t?t(n):null:n},D0={name:"Teleport",__isTeleport:!0,process(e,t,n,r,o,s,a,i,l,u){const{mc:c,pc:d,pbc:p,o:{insert:h,querySelector:m,createText:g,createComment:v}}=u,y=Us(t.props);let{shapeFlag:k,children:b,dynamicChildren:w}=t;if(e==null){const C=t.el=g(""),A=t.anchor=g("");h(C,n,r),h(A,n,r);const R=(O,P)=>{k&16&&(o&&o.isCE&&(o.ce._teleportTarget=O),c(b,O,P,o,s,a,i,l))},M=()=>{const O=t.target=md(t.props,m),P=O0(O,t,g,h);O&&(a!=="svg"&&th(O)?a="svg":a!=="mathml"&&nh(O)&&(a="mathml"),y||(R(O,P),vi(t,!1)))};y&&(R(n,A),vi(t,!0)),eh(t.props)?Pt(()=>{M(),t.el.__isMounted=!0},s):M()}else{if(eh(t.props)&&!e.el.__isMounted){Pt(()=>{D0.process(e,t,n,r,o,s,a,i,l,u),delete e.el.__isMounted},s);return}t.el=e.el,t.targetStart=e.targetStart;const C=t.anchor=e.anchor,A=t.target=e.target,R=t.targetAnchor=e.targetAnchor,M=Us(e.props),O=M?n:A,P=M?C:R;if(a==="svg"||th(A)?a="svg":(a==="mathml"||nh(A))&&(a="mathml"),w?(p(e.dynamicChildren,w,O,o,s,a,i),wf(e,t,!0)):l||d(e,t,O,P,o,s,a,i,!1),y)M?t.props&&e.props&&t.props.to!==e.props.to&&(t.props.to=e.props.to):Ka(t,n,C,u,1);else if((t.props&&t.props.to)!==(e.props&&e.props.to)){const W=t.target=md(t.props,m);W&&Ka(t,W,null,u,0)}else M&&Ka(t,A,R,u,1);vi(t,y)}},remove(e,t,n,{um:r,o:{remove:o}},s){const{shapeFlag:a,children:i,anchor:l,targetStart:u,targetAnchor:c,target:d,props:p}=e;if(d&&(o(u),o(c)),s&&o(l),a&16){const h=s||!Us(p);for(let m=0;m{e.isMounted=!0}),_f(()=>{e.isUnmounting=!0}),e}const sn=[Function,Array],Vx={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:sn,onEnter:sn,onAfterEnter:sn,onEnterCancelled:sn,onBeforeLeave:sn,onLeave:sn,onAfterLeave:sn,onLeaveCancelled:sn,onBeforeAppear:sn,onAppear:sn,onAfterAppear:sn,onAppearCancelled:sn};function jx(e,t){const{leavingVNodes:n}=e;let r=n.get(t.type);return r||(r=Object.create(null),n.set(t.type,r)),r}function gd(e,t,n,r,o){const{appear:s,mode:a,persisted:i=!1,onBeforeEnter:l,onEnter:u,onAfterEnter:c,onEnterCancelled:d,onBeforeLeave:p,onLeave:h,onAfterLeave:m,onLeaveCancelled:g,onBeforeAppear:v,onAppear:y,onAfterAppear:k,onAppearCancelled:b}=t,w=String(e.key),C=jx(n,e),A=(O,P)=>{O&&_n(O,r,9,P)},R=(O,P)=>{const W=P[1];A(O,P),ke(O)?O.every(z=>z.length<=1)&&W():O.length<=1&&W()},M={mode:a,persisted:i,beforeEnter(O){let P=l;if(!n.isMounted)if(s)P=v||l;else return;O[Ao]&&O[Ao](!0);const W=C[w];W&&$o(e,W)&&W.el[Ao]&&W.el[Ao](),A(P,[O])},enter(O){let P=u,W=c,z=d;if(!n.isMounted)if(s)P=y||u,W=k||c,z=b||d;else return;let re=!1;const B=O[Za]=ue=>{re||(re=!0,ue?A(z,[O]):A(W,[O]),M.delayedLeave&&M.delayedLeave(),O[Za]=void 0)};P?R(P,[O,B]):B()},leave(O,P){const W=String(e.key);if(O[Za]&&O[Za](!0),n.isUnmounting)return P();A(p,[O]);let z=!1;const re=O[Ao]=B=>{z||(z=!0,P(),B?A(g,[O]):A(m,[O]),O[Ao]=void 0,C[W]===e&&delete C[W])};C[W]=e,h?R(h,[O,re]):re()},clone(O){return gd(O,t,n,r)}};return M}function oa(e,t){e.shapeFlag&6&&e.component?(e.transition=t,oa(e.component.subTree,t)):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function M0(e,t=!1,n){let r=[],o=0;for(let s=0;s1)for(let s=0;sNi(m,t&&(ke(t)?t[g]:t),n,r,o));return}if(Uo(r)&&!o){r.shapeFlag&512&&r.type.__asyncResolved&&r.component.subTree.component&&Ni(e,t,n,r.component.subTree);return}const s=r.shapeFlag&4?Cl(r.component):r.el,a=o?null:s,{i,r:l}=e,u=t&&t.r,c=i.refs===He?i.refs={}:i.refs,d=i.setupState,p=ze(d),h=d===He?()=>!1:m=>Ye(p,m);if(u!=null&&u!==l&&(ct(u)?(c[u]=null,h(u)&&(d[u]=null)):lt(u)&&(u.value=null)),De(l))Ca(l,i,12,[a,c]);else{const m=ct(l),g=lt(l);if(m||g){const v=()=>{if(e.f){const y=m?h(l)?d[l]:c[l]:l.value;o?ke(y)&&uf(y,s):ke(y)?y.includes(s)||y.push(s):m?(c[l]=[s],h(l)&&(d[l]=c[l])):(l.value=[s],e.k&&(c[e.k]=l.value))}else m?(c[l]=a,h(l)&&(d[l]=a)):g&&(l.value=a,e.k&&(c[e.k]=a))};a?(v.id=-1,Pt(v,n)):v()}}}fl().requestIdleCallback;fl().cancelIdleCallback;const Uo=e=>!!e.type.__asyncLoader,P0=e=>e.type.__isKeepAlive;function Hx(e,t){$0(e,"a",t)}function Ux(e,t){$0(e,"da",t)}function $0(e,t,n=wt){const r=e.__wdc||(e.__wdc=()=>{let o=n;for(;o;){if(o.isDeactivated)return;o=o.parent}return e()});if(xl(t,r,n),n){let o=n.parent;for(;o&&o.parent;)P0(o.parent.vnode)&&Wx(r,t,n,o),o=o.parent}}function Wx(e,t,n,r){const o=xl(t,e,r,!0);Yt(()=>{uf(r[t],o)},n)}function xl(e,t,n=wt,r=!1){if(n){const o=n[e]||(n[e]=[]),s=t.__weh||(t.__weh=(...a)=>{Gr();const i=Aa(n),l=_n(t,n,e,a);return i(),Kr(),l});return r?o.unshift(s):o.push(s),s}}const br=e=>(t,n=wt)=>{(!ia||e==="sp")&&xl(e,(...r)=>t(...r),n)},Yx=br("bm"),$e=br("m"),F0=br("bu"),bf=br("u"),_f=br("bum"),Yt=br("um"),Gx=br("sp"),Kx=br("rtg"),Zx=br("rtc");function Xx(e,t=wt){xl("ec",e,t)}const I0="components";function L0(e,t){return z0(I0,e,!0,t)||e}const N0=Symbol.for("v-ndc");function Qo(e){return ct(e)?z0(I0,e,!1)||e:e||N0}function z0(e,t,n=!0,r=!1){const o=bt||wt;if(o){const s=o.type;{const i=Bw(s,!1);if(i&&(i===t||i===Lt(t)||i===dl(Lt(t))))return s}const a=oh(o[e]||s[e],t)||oh(o.appContext[e],t);return!a&&r?s:a}}function oh(e,t){return e&&(e[t]||e[Lt(t)]||e[dl(Lt(t))])}function It(e,t,n,r){let o;const s=n,a=ke(e);if(a||ct(e)){const i=a&&ur(e);let l=!1;i&&(l=!un(e),e=gl(e)),o=new Array(e.length);for(let u=0,c=e.length;ut(i,l,void 0,s));else{const i=Object.keys(e);o=new Array(i.length);for(let l=0,u=i.length;lts(t)?!(t.type===xn||t.type===Fe&&!B0(t.children)):!0)?e:null}function Jx(e,t){const n={};for(const r in e)n[Vs(r)]=e[r];return n}const vd=e=>e?iy(e)?Cl(e):vd(e.parent):null,Ws=gt(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>vd(e.parent),$root:e=>vd(e.root),$host:e=>e.ce,$emit:e=>e.emit,$options:e=>V0(e),$forceUpdate:e=>e.f||(e.f=()=>{yf(e.update)}),$nextTick:e=>e.n||(e.n=it.bind(e.proxy)),$watch:e=>Cw.bind(e)}),vc=(e,t)=>e!==He&&!e.__isScriptSetup&&Ye(e,t),Qx={get({_:e},t){if(t==="__v_skip")return!0;const{ctx:n,setupState:r,data:o,props:s,accessCache:a,type:i,appContext:l}=e;let u;if(t[0]!=="$"){const h=a[t];if(h!==void 0)switch(h){case 1:return r[t];case 2:return o[t];case 4:return n[t];case 3:return s[t]}else{if(vc(r,t))return a[t]=1,r[t];if(o!==He&&Ye(o,t))return a[t]=2,o[t];if((u=e.propsOptions[0])&&Ye(u,t))return a[t]=3,s[t];if(n!==He&&Ye(n,t))return a[t]=4,n[t];yd&&(a[t]=0)}}const c=Ws[t];let d,p;if(c)return t==="$attrs"&&At(e.attrs,"get",""),c(e);if((d=i.__cssModules)&&(d=d[t]))return d;if(n!==He&&Ye(n,t))return a[t]=4,n[t];if(p=l.config.globalProperties,Ye(p,t))return p[t]},set({_:e},t,n){const{data:r,setupState:o,ctx:s}=e;return vc(o,t)?(o[t]=n,!0):r!==He&&Ye(r,t)?(r[t]=n,!0):Ye(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(s[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:r,appContext:o,propsOptions:s}},a){let i;return!!n[a]||e!==He&&Ye(e,a)||vc(t,a)||(i=s[0])&&Ye(i,a)||Ye(r,a)||Ye(Ws,a)||Ye(o.config.globalProperties,a)},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:Ye(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};function ew(){return tw().slots}function tw(){const e=dn();return e.setupContext||(e.setupContext=cy(e))}function sa(e){return ke(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}function nw(e,t){const n=sa(e);for(const r in t){if(r.startsWith("__skip"))continue;let o=n[r];o?ke(o)||De(o)?o=n[r]={type:o,default:t[r]}:o.default=t[r]:o===null&&(o=n[r]={default:t[r]}),o&&t[`__skip_${r}`]&&(o.skipFactory=!0)}return n}function Sa(e,t){return!e||!t?e||t:ke(e)&&ke(t)?e.concat(t):gt({},sa(e),sa(t))}let yd=!0;function rw(e){const t=V0(e),n=e.proxy,r=e.ctx;yd=!1,t.beforeCreate&&sh(t.beforeCreate,e,"bc");const{data:o,computed:s,methods:a,watch:i,provide:l,inject:u,created:c,beforeMount:d,mounted:p,beforeUpdate:h,updated:m,activated:g,deactivated:v,beforeDestroy:y,beforeUnmount:k,destroyed:b,unmounted:w,render:C,renderTracked:A,renderTriggered:R,errorCaptured:M,serverPrefetch:O,expose:P,inheritAttrs:W,components:z,directives:re,filters:B}=t;if(u&&ow(u,r,null),a)for(const j in a){const Z=a[j];De(Z)&&(r[j]=Z.bind(n))}if(o){const j=o.call(n,n);nt(j)&&(e.data=xo(j))}if(yd=!0,s)for(const j in s){const Z=s[j],H=De(Z)?Z.bind(n,n):De(Z.get)?Z.get.bind(n,n):Vn,U=!De(Z)&&De(Z.set)?Z.set.bind(n):Vn,ae=$({get:H,set:U});Object.defineProperty(r,j,{enumerable:!0,configurable:!0,get:()=>ae.value,set:pe=>ae.value=pe})}if(i)for(const j in i)q0(i[j],r,n,j);if(l){const j=De(l)?l.call(n):l;Reflect.ownKeys(j).forEach(Z=>{Wo(Z,j[Z])})}c&&sh(c,e,"c");function Q(j,Z){ke(Z)?Z.forEach(H=>j(H.bind(n))):Z&&j(Z.bind(n))}if(Q(Yx,d),Q($e,p),Q(F0,h),Q(bf,m),Q(Hx,g),Q(Ux,v),Q(Xx,M),Q(Zx,A),Q(Kx,R),Q(_f,k),Q(Yt,w),Q(Gx,O),ke(P))if(P.length){const j=e.exposed||(e.exposed={});P.forEach(Z=>{Object.defineProperty(j,Z,{get:()=>n[Z],set:H=>n[Z]=H})})}else e.exposed||(e.exposed={});C&&e.render===Vn&&(e.render=C),W!=null&&(e.inheritAttrs=W),z&&(e.components=z),re&&(e.directives=re),O&&R0(e)}function ow(e,t,n=Vn){ke(e)&&(e=bd(e));for(const r in e){const o=e[r];let s;nt(o)?"default"in o?s=qt(o.from||r,o.default,!0):s=qt(o.from||r):s=qt(o),lt(s)?Object.defineProperty(t,r,{enumerable:!0,configurable:!0,get:()=>s.value,set:a=>s.value=a}):t[r]=s}}function sh(e,t,n){_n(ke(e)?e.map(r=>r.bind(t.proxy)):e.bind(t.proxy),t,n)}function q0(e,t,n,r){let o=r.includes(".")?ty(n,r):()=>n[r];if(ct(e)){const s=t[e];De(s)&&Oe(o,s)}else if(De(e))Oe(o,e.bind(n));else if(nt(e))if(ke(e))e.forEach(s=>q0(s,t,n,r));else{const s=De(e.handler)?e.handler.bind(n):t[e.handler];De(s)&&Oe(o,s,e)}}function V0(e){const t=e.type,{mixins:n,extends:r}=t,{mixins:o,optionsCache:s,config:{optionMergeStrategies:a}}=e.appContext,i=s.get(t);let l;return i?l=i:!o.length&&!n&&!r?l=t:(l={},o.length&&o.forEach(u=>zi(l,u,a,!0)),zi(l,t,a)),nt(t)&&s.set(t,l),l}function zi(e,t,n,r=!1){const{mixins:o,extends:s}=t;s&&zi(e,s,n,!0),o&&o.forEach(a=>zi(e,a,n,!0));for(const a in t)if(!(r&&a==="expose")){const i=sw[a]||n&&n[a];e[a]=i?i(e[a],t[a]):t[a]}return e}const sw={data:ah,props:ih,emits:ih,methods:Ns,computed:Ns,beforeCreate:Rt,created:Rt,beforeMount:Rt,mounted:Rt,beforeUpdate:Rt,updated:Rt,beforeDestroy:Rt,beforeUnmount:Rt,destroyed:Rt,unmounted:Rt,activated:Rt,deactivated:Rt,errorCaptured:Rt,serverPrefetch:Rt,components:Ns,directives:Ns,watch:iw,provide:ah,inject:aw};function ah(e,t){return t?e?function(){return gt(De(e)?e.call(this,this):e,De(t)?t.call(this,this):t)}:t:e}function aw(e,t){return Ns(bd(e),bd(t))}function bd(e){if(ke(e)){const t={};for(let n=0;n1)return n&&De(t)?t.call(r&&r.proxy):t}}function uw(){return!!(wt||bt||po)}const H0={},U0=()=>Object.create(H0),W0=e=>Object.getPrototypeOf(e)===H0;function dw(e,t,n,r=!1){const o={},s=U0();e.propsDefaults=Object.create(null),Y0(e,t,o,s);for(const a in e.propsOptions[0])a in o||(o[a]=void 0);n?e.props=r?o:g0(o):e.type.props?e.props=o:e.props=s,e.attrs=s}function fw(e,t,n,r){const{props:o,attrs:s,vnode:{patchFlag:a}}=e,i=ze(o),[l]=e.propsOptions;let u=!1;if((r||a>0)&&!(a&16)){if(a&8){const c=e.vnode.dynamicProps;for(let d=0;d{l=!0;const[p,h]=G0(d,t,!0);gt(a,p),h&&i.push(...h)};!n&&t.mixins.length&&t.mixins.forEach(c),e.extends&&c(e.extends),e.mixins&&e.mixins.forEach(c)}if(!s&&!l)return nt(e)&&r.set(e,qo),qo;if(ke(s))for(let c=0;ce[0]==="_"||e==="$stable",xf=e=>ke(e)?e.map(Nn):[Nn(e)],hw=(e,t,n)=>{if(t._n)return t;const r=_((...o)=>xf(t(...o)),n);return r._c=!1,r},Z0=(e,t,n)=>{const r=e._ctx;for(const o in e){if(K0(o))continue;const s=e[o];if(De(s))t[o]=hw(o,s,r);else if(s!=null){const a=xf(s);t[o]=()=>a}}},X0=(e,t)=>{const n=xf(t);e.slots.default=()=>n},J0=(e,t,n)=>{for(const r in t)(n||r!=="_")&&(e[r]=t[r])},mw=(e,t,n)=>{const r=e.slots=U0();if(e.vnode.shapeFlag&32){const o=t._;o?(J0(r,t,n),n&&Kv(r,"_",o,!0)):Z0(t,r)}else t&&X0(e,t)},gw=(e,t,n)=>{const{vnode:r,slots:o}=e;let s=!0,a=He;if(r.shapeFlag&32){const i=t._;i?n&&i===1?s=!1:J0(o,t,n):(s=!t.$stable,Z0(t,o)),a=t}else t&&(X0(e,t),a={default:1});if(s)for(const i in o)!K0(i)&&a[i]==null&&delete o[i]},Pt=Ow;function vw(e){return yw(e)}function yw(e,t){const n=fl();n.__VUE__=!0;const{insert:r,remove:o,patchProp:s,createElement:a,createText:i,createComment:l,setText:u,setElementText:c,parentNode:d,nextSibling:p,setScopeId:h=Vn,insertStaticContent:m}=e,g=(D,T,N,G=null,J=null,X=null,fe=void 0,ce=null,ie=!!T.dynamicChildren)=>{if(D===T)return;D&&!$o(D,T)&&(G=Y(D),pe(D,J,X,!0),D=null),T.patchFlag===-2&&(ie=!1,T.dynamicChildren=null);const{type:ee,ref:Se,shapeFlag:me}=T;switch(ee){case kl:v(D,T,N,G);break;case xn:y(D,T,N,G);break;case yi:D==null&&k(T,N,G,fe);break;case Fe:z(D,T,N,G,J,X,fe,ce,ie);break;default:me&1?C(D,T,N,G,J,X,fe,ce,ie):me&6?re(D,T,N,G,J,X,fe,ce,ie):(me&64||me&128)&&ee.process(D,T,N,G,J,X,fe,ce,ie,ye)}Se!=null&&J&&Ni(Se,D&&D.ref,X,T||D,!T)},v=(D,T,N,G)=>{if(D==null)r(T.el=i(T.children),N,G);else{const J=T.el=D.el;T.children!==D.children&&u(J,T.children)}},y=(D,T,N,G)=>{D==null?r(T.el=l(T.children||""),N,G):T.el=D.el},k=(D,T,N,G)=>{[D.el,D.anchor]=m(D.children,T,N,G,D.el,D.anchor)},b=({el:D,anchor:T},N,G)=>{let J;for(;D&&D!==T;)J=p(D),r(D,N,G),D=J;r(T,N,G)},w=({el:D,anchor:T})=>{let N;for(;D&&D!==T;)N=p(D),o(D),D=N;o(T)},C=(D,T,N,G,J,X,fe,ce,ie)=>{T.type==="svg"?fe="svg":T.type==="math"&&(fe="mathml"),D==null?A(T,N,G,J,X,fe,ce,ie):O(D,T,J,X,fe,ce,ie)},A=(D,T,N,G,J,X,fe,ce)=>{let ie,ee;const{props:Se,shapeFlag:me,transition:we,dirs:Ae}=D;if(ie=D.el=a(D.type,X,Se&&Se.is,Se),me&8?c(ie,D.children):me&16&&M(D.children,ie,null,G,J,yc(D,X),fe,ce),Ae&&eo(D,null,G,"created"),R(ie,D,D.scopeId,fe,G),Se){for(const et in Se)et!=="value"&&!qs(et)&&s(ie,et,null,Se[et],X,G);"value"in Se&&s(ie,"value",null,Se.value,X),(ee=Se.onVnodeBeforeMount)&&$n(ee,G,D)}Ae&&eo(D,null,G,"beforeMount");const Ne=bw(J,we);Ne&&we.beforeEnter(ie),r(ie,T,N),((ee=Se&&Se.onVnodeMounted)||Ne||Ae)&&Pt(()=>{ee&&$n(ee,G,D),Ne&&we.enter(ie),Ae&&eo(D,null,G,"mounted")},J)},R=(D,T,N,G,J)=>{if(N&&h(D,N),G)for(let X=0;X{for(let ee=ie;ee{const ce=T.el=D.el;let{patchFlag:ie,dynamicChildren:ee,dirs:Se}=T;ie|=D.patchFlag&16;const me=D.props||He,we=T.props||He;let Ae;if(N&&to(N,!1),(Ae=we.onVnodeBeforeUpdate)&&$n(Ae,N,T,D),Se&&eo(T,D,N,"beforeUpdate"),N&&to(N,!0),(me.innerHTML&&we.innerHTML==null||me.textContent&&we.textContent==null)&&c(ce,""),ee?P(D.dynamicChildren,ee,ce,N,G,yc(T,J),X):fe||Z(D,T,ce,null,N,G,yc(T,J),X,!1),ie>0){if(ie&16)W(ce,me,we,N,J);else if(ie&2&&me.class!==we.class&&s(ce,"class",null,we.class,J),ie&4&&s(ce,"style",me.style,we.style,J),ie&8){const Ne=T.dynamicProps;for(let et=0;et{Ae&&$n(Ae,N,T,D),Se&&eo(T,D,N,"updated")},G)},P=(D,T,N,G,J,X,fe)=>{for(let ce=0;ce{if(T!==N){if(T!==He)for(const X in T)!qs(X)&&!(X in N)&&s(D,X,T[X],null,J,G);for(const X in N){if(qs(X))continue;const fe=N[X],ce=T[X];fe!==ce&&X!=="value"&&s(D,X,ce,fe,J,G)}"value"in N&&s(D,"value",T.value,N.value,J)}},z=(D,T,N,G,J,X,fe,ce,ie)=>{const ee=T.el=D?D.el:i(""),Se=T.anchor=D?D.anchor:i("");let{patchFlag:me,dynamicChildren:we,slotScopeIds:Ae}=T;Ae&&(ce=ce?ce.concat(Ae):Ae),D==null?(r(ee,N,G),r(Se,N,G),M(T.children||[],N,Se,J,X,fe,ce,ie)):me>0&&me&64&&we&&D.dynamicChildren?(P(D.dynamicChildren,we,N,J,X,fe,ce),(T.key!=null||J&&T===J.subTree)&&wf(D,T,!0)):Z(D,T,N,Se,J,X,fe,ce,ie)},re=(D,T,N,G,J,X,fe,ce,ie)=>{T.slotScopeIds=ce,D==null?T.shapeFlag&512?J.ctx.activate(T,N,G,fe,ie):B(T,N,G,J,X,fe,ie):ue(D,T,ie)},B=(D,T,N,G,J,X,fe)=>{const ce=D.component=Iw(D,G,J);if(P0(D)&&(ce.ctx.renderer=ye),Lw(ce,!1,fe),ce.asyncDep){if(J&&J.registerDep(ce,Q,fe),!D.el){const ie=ce.subTree=x(xn);y(null,ie,T,N)}}else Q(ce,D,T,N,J,X,fe)},ue=(D,T,N)=>{const G=T.component=D.component;if(Dw(D,T,N))if(G.asyncDep&&!G.asyncResolved){j(G,T,N);return}else G.next=T,G.update();else T.el=D.el,G.vnode=T},Q=(D,T,N,G,J,X,fe)=>{const ce=()=>{if(D.isMounted){let{next:me,bu:we,u:Ae,parent:Ne,vnode:et}=D;{const Rn=Q0(D);if(Rn){me&&(me.el=et.el,j(D,me,fe)),Rn.asyncDep.then(()=>{D.isUnmounted||ce()});return}}let Ze=me,Gt;to(D,!1),me?(me.el=et.el,j(D,me,fe)):me=et,we&&gi(we),(Gt=me.props&&me.props.onVnodeBeforeUpdate)&&$n(Gt,Ne,me,et),to(D,!0);const Nt=uh(D),Mn=D.subTree;D.subTree=Nt,g(Mn,Nt,d(Mn.el),Y(Mn),D,J,X),me.el=Nt.el,Ze===null&&Tw(D,Nt.el),Ae&&Pt(Ae,J),(Gt=me.props&&me.props.onVnodeUpdated)&&Pt(()=>$n(Gt,Ne,me,et),J)}else{let me;const{el:we,props:Ae}=T,{bm:Ne,m:et,parent:Ze,root:Gt,type:Nt}=D,Mn=Uo(T);to(D,!1),Ne&&gi(Ne),!Mn&&(me=Ae&&Ae.onVnodeBeforeMount)&&$n(me,Ze,T),to(D,!0);{Gt.ce&&Gt.ce._injectChildStyle(Nt);const Rn=D.subTree=uh(D);g(null,Rn,N,G,D,J,X),T.el=Rn.el}if(et&&Pt(et,J),!Mn&&(me=Ae&&Ae.onVnodeMounted)){const Rn=T;Pt(()=>$n(me,Ze,Rn),J)}(T.shapeFlag&256||Ze&&Uo(Ze.vnode)&&Ze.vnode.shapeFlag&256)&&D.a&&Pt(D.a,J),D.isMounted=!0,T=N=G=null}};D.scope.on();const ie=D.effect=new e0(ce);D.scope.off();const ee=D.update=ie.run.bind(ie),Se=D.job=ie.runIfDirty.bind(ie);Se.i=D,Se.id=D.uid,ie.scheduler=()=>yf(Se),to(D,!0),ee()},j=(D,T,N)=>{T.component=D;const G=D.vnode.props;D.vnode=T,D.next=null,fw(D,T.props,G,N),gw(D,T.children,N),Gr(),Qp(D),Kr()},Z=(D,T,N,G,J,X,fe,ce,ie=!1)=>{const ee=D&&D.children,Se=D?D.shapeFlag:0,me=T.children,{patchFlag:we,shapeFlag:Ae}=T;if(we>0){if(we&128){U(ee,me,N,G,J,X,fe,ce,ie);return}else if(we&256){H(ee,me,N,G,J,X,fe,ce,ie);return}}Ae&8?(Se&16&&ft(ee,J,X),me!==ee&&c(N,me)):Se&16?Ae&16?U(ee,me,N,G,J,X,fe,ce,ie):ft(ee,J,X,!0):(Se&8&&c(N,""),Ae&16&&M(me,N,G,J,X,fe,ce,ie))},H=(D,T,N,G,J,X,fe,ce,ie)=>{D=D||qo,T=T||qo;const ee=D.length,Se=T.length,me=Math.min(ee,Se);let we;for(we=0;weSe?ft(D,J,X,!0,!1,me):M(T,N,G,J,X,fe,ce,ie,me)},U=(D,T,N,G,J,X,fe,ce,ie)=>{let ee=0;const Se=T.length;let me=D.length-1,we=Se-1;for(;ee<=me&&ee<=we;){const Ae=D[ee],Ne=T[ee]=ie?Pr(T[ee]):Nn(T[ee]);if($o(Ae,Ne))g(Ae,Ne,N,null,J,X,fe,ce,ie);else break;ee++}for(;ee<=me&&ee<=we;){const Ae=D[me],Ne=T[we]=ie?Pr(T[we]):Nn(T[we]);if($o(Ae,Ne))g(Ae,Ne,N,null,J,X,fe,ce,ie);else break;me--,we--}if(ee>me){if(ee<=we){const Ae=we+1,Ne=Aewe)for(;ee<=me;)pe(D[ee],J,X,!0),ee++;else{const Ae=ee,Ne=ee,et=new Map;for(ee=Ne;ee<=we;ee++){const Kt=T[ee]=ie?Pr(T[ee]):Nn(T[ee]);Kt.key!=null&&et.set(Kt.key,ee)}let Ze,Gt=0;const Nt=we-Ne+1;let Mn=!1,Rn=0;const ws=new Array(Nt);for(ee=0;ee=Nt){pe(Kt,J,X,!0);continue}let Pn;if(Kt.key!=null)Pn=et.get(Kt.key);else for(Ze=Ne;Ze<=we;Ze++)if(ws[Ze-Ne]===0&&$o(Kt,T[Ze])){Pn=Ze;break}Pn===void 0?pe(Kt,J,X,!0):(ws[Pn-Ne]=ee+1,Pn>=Rn?Rn=Pn:Mn=!0,g(Kt,T[Pn],N,null,J,X,fe,ce,ie),Gt++)}const Gp=Mn?_w(ws):qo;for(Ze=Gp.length-1,ee=Nt-1;ee>=0;ee--){const Kt=Ne+ee,Pn=T[Kt],Kp=Kt+1{const{el:X,type:fe,transition:ce,children:ie,shapeFlag:ee}=D;if(ee&6){ae(D.component.subTree,T,N,G);return}if(ee&128){D.suspense.move(T,N,G);return}if(ee&64){fe.move(D,T,N,ye);return}if(fe===Fe){r(X,T,N);for(let me=0;mece.enter(X),J);else{const{leave:me,delayLeave:we,afterLeave:Ae}=ce,Ne=()=>r(X,T,N),et=()=>{me(X,()=>{Ne(),Ae&&Ae()})};we?we(X,Ne,et):et()}else r(X,T,N)},pe=(D,T,N,G=!1,J=!1)=>{const{type:X,props:fe,ref:ce,children:ie,dynamicChildren:ee,shapeFlag:Se,patchFlag:me,dirs:we,cacheIndex:Ae}=D;if(me===-2&&(J=!1),ce!=null&&Ni(ce,null,N,D,!0),Ae!=null&&(T.renderCache[Ae]=void 0),Se&256){T.ctx.deactivate(D);return}const Ne=Se&1&&we,et=!Uo(D);let Ze;if(et&&(Ze=fe&&fe.onVnodeBeforeUnmount)&&$n(Ze,T,D),Se&6)Ue(D.component,N,G);else{if(Se&128){D.suspense.unmount(N,G);return}Ne&&eo(D,null,T,"beforeUnmount"),Se&64?D.type.remove(D,T,N,ye,G):ee&&!ee.hasOnce&&(X!==Fe||me>0&&me&64)?ft(ee,T,N,!1,!0):(X===Fe&&me&384||!J&&Se&16)&&ft(ie,T,N),G&&Le(D)}(et&&(Ze=fe&&fe.onVnodeUnmounted)||Ne)&&Pt(()=>{Ze&&$n(Ze,T,D),Ne&&eo(D,null,T,"unmounted")},N)},Le=D=>{const{type:T,el:N,anchor:G,transition:J}=D;if(T===Fe){Je(N,G);return}if(T===yi){w(D);return}const X=()=>{o(N),J&&!J.persisted&&J.afterLeave&&J.afterLeave()};if(D.shapeFlag&1&&J&&!J.persisted){const{leave:fe,delayLeave:ce}=J,ie=()=>fe(N,X);ce?ce(D.el,X,ie):ie()}else X()},Je=(D,T)=>{let N;for(;D!==T;)N=p(D),o(D),D=N;o(T)},Ue=(D,T,N)=>{const{bum:G,scope:J,job:X,subTree:fe,um:ce,m:ie,a:ee}=D;ch(ie),ch(ee),G&&gi(G),J.stop(),X&&(X.flags|=8,pe(fe,D,T,N)),ce&&Pt(ce,T),Pt(()=>{D.isUnmounted=!0},T),T&&T.pendingBranch&&!T.isUnmounted&&D.asyncDep&&!D.asyncResolved&&D.suspenseId===T.pendingId&&(T.deps--,T.deps===0&&T.resolve())},ft=(D,T,N,G=!1,J=!1,X=0)=>{for(let fe=X;fe{if(D.shapeFlag&6)return Y(D.component.subTree);if(D.shapeFlag&128)return D.suspense.next();const T=p(D.anchor||D.el),N=T&&T[A0];return N?p(N):T};let se=!1;const de=(D,T,N)=>{D==null?T._vnode&&pe(T._vnode,null,null,!0):g(T._vnode||null,D,T,null,null,null,N),T._vnode=D,se||(se=!0,Qp(),C0(),se=!1)},ye={p:g,um:pe,m:ae,r:Le,mt:B,mc:M,pc:Z,pbc:P,n:Y,o:e};return{render:de,hydrate:void 0,createApp:cw(de)}}function yc({type:e,props:t},n){return n==="svg"&&e==="foreignObject"||n==="mathml"&&e==="annotation-xml"&&t&&t.encoding&&t.encoding.includes("html")?void 0:n}function to({effect:e,job:t},n){n?(e.flags|=32,t.flags|=4):(e.flags&=-33,t.flags&=-5)}function bw(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function wf(e,t,n=!1){const r=e.children,o=t.children;if(ke(r)&&ke(o))for(let s=0;s>1,e[n[i]]0&&(t[r]=n[s-1]),n[s]=r)}}for(s=n.length,a=n[s-1];s-- >0;)n[s]=a,a=t[a];return n}function Q0(e){const t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:Q0(t)}function ch(e){if(e)for(let t=0;tqt(xw);function pt(e,t){return Ea(e,null,t)}function kw(e,t){return Ea(e,null,{flush:"post"})}function ey(e,t){return Ea(e,null,{flush:"sync"})}function Oe(e,t,n){return Ea(e,t,n)}function Ea(e,t,n=He){const{immediate:r,deep:o,flush:s,once:a}=n,i=gt({},n),l=t&&r||!t&&s!=="post";let u;if(ia){if(s==="sync"){const h=ww();u=h.__watcherHandles||(h.__watcherHandles=[])}else if(!l){const h=()=>{};return h.stop=Vn,h.resume=Vn,h.pause=Vn,h}}const c=wt;i.call=(h,m,g)=>_n(h,c,m,g);let d=!1;s==="post"?i.scheduler=h=>{Pt(h,c&&c.suspense)}:s!=="sync"&&(d=!0,i.scheduler=(h,m)=>{m?h():yf(h)}),i.augmentJob=h=>{t&&(h.flags|=4),d&&(h.flags|=2,c&&(h.id=c.uid,h.i=c))};const p=Fx(e,t,i);return ia&&(u?u.push(p):l&&p()),p}function Cw(e,t,n){const r=this.proxy,o=ct(e)?e.includes(".")?ty(r,e):()=>r[e]:e.bind(r,r);let s;De(t)?s=t:(s=t.handler,n=t);const a=Aa(this),i=Ea(o,s.bind(r),n);return a(),i}function ty(e,t){const n=t.split(".");return()=>{let r=e;for(let o=0;o{let c,d=He,p;return ey(()=>{const h=e[o];Bt(c,h)&&(c=h,u())}),{get(){return l(),n.get?n.get(c):c},set(h){const m=n.set?n.set(h):h;if(!Bt(m,c)&&!(d!==He&&Bt(h,d)))return;const g=r.vnode.props;g&&(t in g||o in g||s in g)&&(`onUpdate:${t}`in g||`onUpdate:${o}`in g||`onUpdate:${s}`in g)||(c=h,u()),r.emit(`update:${t}`,m),Bt(h,m)&&Bt(h,d)&&!Bt(m,p)&&u(),d=h,p=m}}});return i[Symbol.iterator]=()=>{let l=0;return{next(){return l<2?{value:l++?a||He:i,done:!1}:{done:!0}}}},i}const ny=(e,t)=>t==="modelValue"||t==="model-value"?e.modelModifiers:e[`${t}Modifiers`]||e[`${Lt(t)}Modifiers`]||e[`${yr(t)}Modifiers`];function Sw(e,t,...n){if(e.isUnmounted)return;const r=e.vnode.props||He;let o=n;const s=t.startsWith("update:"),a=s&&ny(r,t.slice(7));a&&(a.trim&&(o=n.map(c=>ct(c)?c.trim():c)),a.number&&(o=n.map(ud)));let i,l=r[i=Vs(t)]||r[i=Vs(Lt(t))];!l&&s&&(l=r[i=Vs(yr(t))]),l&&_n(l,e,6,o);const u=r[i+"Once"];if(u){if(!e.emitted)e.emitted={};else if(e.emitted[i])return;e.emitted[i]=!0,_n(u,e,6,o)}}function ry(e,t,n=!1){const r=t.emitsCache,o=r.get(e);if(o!==void 0)return o;const s=e.emits;let a={},i=!1;if(!De(e)){const l=u=>{const c=ry(u,t,!0);c&&(i=!0,gt(a,c))};!n&&t.mixins.length&&t.mixins.forEach(l),e.extends&&l(e.extends),e.mixins&&e.mixins.forEach(l)}return!s&&!i?(nt(e)&&r.set(e,null),null):(ke(s)?s.forEach(l=>a[l]=null):gt(a,s),nt(e)&&r.set(e,a),a)}function wl(e,t){return!e||!ll(t)?!1:(t=t.slice(2).replace(/Once$/,""),Ye(e,t[0].toLowerCase()+t.slice(1))||Ye(e,yr(t))||Ye(e,t))}function uh(e){const{type:t,vnode:n,proxy:r,withProxy:o,propsOptions:[s],slots:a,attrs:i,emit:l,render:u,renderCache:c,props:d,data:p,setupState:h,ctx:m,inheritAttrs:g}=e,v=Li(e);let y,k;try{if(n.shapeFlag&4){const w=o||r,C=w;y=Nn(u.call(C,w,c,d,h,p,m)),k=i}else{const w=t;y=Nn(w.length>1?w(d,{attrs:i,slots:a,emit:l}):w(d,null)),k=t.props?i:Ew(i)}}catch(w){Ys.length=0,_l(w,e,1),y=x(xn)}let b=y;if(k&&g!==!1){const w=Object.keys(k),{shapeFlag:C}=b;w.length&&C&7&&(s&&w.some(cf)&&(k=Aw(k,s)),b=qr(b,k,!1,!0))}return n.dirs&&(b=qr(b,null,!1,!0),b.dirs=b.dirs?b.dirs.concat(n.dirs):n.dirs),n.transition&&oa(b,n.transition),y=b,Li(v),y}const Ew=e=>{let t;for(const n in e)(n==="class"||n==="style"||ll(n))&&((t||(t={}))[n]=e[n]);return t},Aw=(e,t)=>{const n={};for(const r in e)(!cf(r)||!(r.slice(9)in t))&&(n[r]=e[r]);return n};function Dw(e,t,n){const{props:r,children:o,component:s}=e,{props:a,children:i,patchFlag:l}=t,u=s.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&l>=0){if(l&1024)return!0;if(l&16)return r?dh(r,a,u):!!a;if(l&8){const c=t.dynamicProps;for(let d=0;de.__isSuspense;function Ow(e,t){t&&t.pendingBranch?ke(e)?t.effects.push(...e):t.effects.push(e):Nx(e)}const Fe=Symbol.for("v-fgt"),kl=Symbol.for("v-txt"),xn=Symbol.for("v-cmt"),yi=Symbol.for("v-stc"),Ys=[];let Jt=null;function S(e=!1){Ys.push(Jt=e?null:[])}function Mw(){Ys.pop(),Jt=Ys[Ys.length-1]||null}let aa=1;function fh(e,t=!1){aa+=e,e<0&&Jt&&t&&(Jt.hasOnce=!0)}function sy(e){return e.dynamicChildren=aa>0?Jt||qo:null,Mw(),aa>0&&Jt&&Jt.push(e),e}function K(e,t,n,r,o,s){return sy(E(e,t,n,r,o,s,!0))}function L(e,t,n,r,o){return sy(x(e,t,n,r,o,!0))}function ts(e){return e?e.__v_isVNode===!0:!1}function $o(e,t){return e.type===t.type&&e.key===t.key}const ay=({key:e})=>e??null,bi=({ref:e,ref_key:t,ref_for:n})=>(typeof e=="number"&&(e=""+e),e!=null?ct(e)||lt(e)||De(e)?{i:bt,r:e,k:t,f:!!n}:e:null);function E(e,t=null,n=null,r=0,o=null,s=e===Fe?0:1,a=!1,i=!1){const l={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&ay(t),ref:t&&bi(t),scopeId:E0,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetStart:null,targetAnchor:null,staticCount:0,shapeFlag:s,patchFlag:r,dynamicProps:o,dynamicChildren:null,appContext:null,ctx:bt};return i?(kf(l,n),s&128&&e.normalize(l)):n&&(l.shapeFlag|=ct(n)?8:16),aa>0&&!a&&Jt&&(l.patchFlag>0||s&6)&&l.patchFlag!==32&&Jt.push(l),l}const x=Rw;function Rw(e,t=null,n=null,r=0,o=null,s=!1){if((!e||e===N0)&&(e=xn),ts(e)){const i=qr(e,t,!0);return n&&kf(i,n),aa>0&&!s&&Jt&&(i.shapeFlag&6?Jt[Jt.indexOf(e)]=i:Jt.push(i)),i.patchFlag=-2,i}if(qw(e)&&(e=e.__vccOpts),t){t=Et(t);let{class:i,style:l}=t;i&&!ct(i)&&(t.class=Ee(i)),nt(l)&&(gf(l)&&!ke(l)&&(l=gt({},l)),t.style=Wt(l))}const a=ct(e)?1:oy(e)?128:zx(e)?64:nt(e)?4:De(e)?2:0;return E(e,t,n,r,o,a,s,!0)}function Et(e){return e?gf(e)||W0(e)?gt({},e):e:null}function qr(e,t,n=!1,r=!1){const{props:o,ref:s,patchFlag:a,children:i,transition:l}=e,u=t?le(o||{},t):o,c={__v_isVNode:!0,__v_skip:!0,type:e.type,props:u,key:u&&ay(u),ref:t&&t.ref?n&&s?ke(s)?s.concat(bi(t)):[s,bi(t)]:bi(t):s,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:i,target:e.target,targetStart:e.targetStart,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==Fe?a===-1?16:a|16:a,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:l,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&qr(e.ssContent),ssFallback:e.ssFallback&&qr(e.ssFallback),el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce};return l&&r&&oa(c,l.clone(c)),c}function oe(e=" ",t=0){return x(kl,null,e,t)}function Pw(e,t){const n=x(yi,null,e);return n.staticCount=t,n}function _e(e="",t=!1){return t?(S(),L(xn,null,e)):x(xn,null,e)}function Nn(e){return e==null||typeof e=="boolean"?x(xn):ke(e)?x(Fe,null,e.slice()):ts(e)?Pr(e):x(kl,null,String(e))}function Pr(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:qr(e)}function kf(e,t){let n=0;const{shapeFlag:r}=e;if(t==null)t=null;else if(ke(t))n=16;else if(typeof t=="object")if(r&65){const o=t.default;o&&(o._c&&(o._d=!1),kf(e,o()),o._c&&(o._d=!0));return}else{n=32;const o=t._;!o&&!W0(t)?t._ctx=bt:o===3&&bt&&(bt.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else De(t)?(t={default:t,_ctx:bt},n=32):(t=String(t),r&64?(n=16,t=[oe(t)]):n=8);e.children=t,e.shapeFlag|=n}function le(...e){const t={};for(let n=0;nwt||bt;let Bi,xd;{const e=fl(),t=(n,r)=>{let o;return(o=e[n])||(o=e[n]=[]),o.push(r),s=>{o.length>1?o.forEach(a=>a(s)):o[0](s)}};Bi=t("__VUE_INSTANCE_SETTERS__",n=>wt=n),xd=t("__VUE_SSR_SETTERS__",n=>ia=n)}const Aa=e=>{const t=wt;return Bi(e),e.scope.on(),()=>{e.scope.off(),Bi(t)}},ph=()=>{wt&&wt.scope.off(),Bi(null)};function iy(e){return e.vnode.shapeFlag&4}let ia=!1;function Lw(e,t=!1,n=!1){t&&xd(t);const{props:r,children:o}=e.vnode,s=iy(e);dw(e,r,s,t),mw(e,o,n);const a=s?Nw(e,t):void 0;return t&&xd(!1),a}function Nw(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,Qx);const{setup:r}=n;if(r){Gr();const o=e.setupContext=r.length>1?cy(e):null,s=Aa(e),a=Ca(r,e,0,[e.props,o]),i=Wv(a);if(Kr(),s(),(i||e.sp)&&!Uo(e)&&R0(e),i){if(a.then(ph,ph),t)return a.then(l=>{hh(e,l)}).catch(l=>{_l(l,e,0)});e.asyncDep=a}else hh(e,a)}else ly(e)}function hh(e,t,n){De(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:nt(t)&&(e.setupState=y0(t)),ly(e)}function ly(e,t,n){const r=e.type;e.render||(e.render=r.render||Vn);{const o=Aa(e);Gr();try{rw(e)}finally{Kr(),o()}}}const zw={get(e,t){return At(e,"get",""),e[t]}};function cy(e){const t=n=>{e.exposed=n||{}};return{attrs:new Proxy(e.attrs,zw),slots:e.slots,emit:e.emit,expose:t}}function Cl(e){return e.exposed?e.exposeProxy||(e.exposeProxy=new Proxy(y0(bl(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in Ws)return Ws[n](e)},has(t,n){return n in t||n in Ws}})):e.proxy}function Bw(e,t=!0){return De(e)?e.displayName||e.name:e.name||t&&e.__name}function qw(e){return De(e)&&"__vccOpts"in e}const $=(e,t)=>Px(e,t,ia);function Vt(e,t,n){const r=arguments.length;return r===2?nt(t)&&!ke(t)?ts(t)?x(e,null,[t]):x(e,t):x(e,null,t):(r>3?n=Array.prototype.slice.call(arguments,2):r===3&&ts(n)&&(n=[n]),x(e,t,n))}const Vw="3.5.13";/** -* @vue/runtime-dom v3.5.13 -* (c) 2018-present Yuxi (Evan) You and Vue contributors -* @license MIT -**/let wd;const mh=typeof window<"u"&&window.trustedTypes;if(mh)try{wd=mh.createPolicy("vue",{createHTML:e=>e})}catch{}const uy=wd?e=>wd.createHTML(e):e=>e,jw="http://www.w3.org/2000/svg",Hw="http://www.w3.org/1998/Math/MathML",rr=typeof document<"u"?document:null,gh=rr&&rr.createElement("template"),Uw={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,r)=>{const o=t==="svg"?rr.createElementNS(jw,e):t==="mathml"?rr.createElementNS(Hw,e):n?rr.createElement(e,{is:n}):rr.createElement(e);return e==="select"&&r&&r.multiple!=null&&o.setAttribute("multiple",r.multiple),o},createText:e=>rr.createTextNode(e),createComment:e=>rr.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>rr.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,r,o,s){const a=n?n.previousSibling:t.lastChild;if(o&&(o===s||o.nextSibling))for(;t.insertBefore(o.cloneNode(!0),n),!(o===s||!(o=o.nextSibling)););else{gh.innerHTML=uy(r==="svg"?`${e}`:r==="mathml"?`${e}`:e);const i=gh.content;if(r==="svg"||r==="mathml"){const l=i.firstChild;for(;l.firstChild;)i.appendChild(l.firstChild);i.removeChild(l)}t.insertBefore(i,n)}return[a?a.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},wr="transition",Cs="animation",ns=Symbol("_vtc"),dy={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},Ww=gt({},Vx,dy),no=(e,t=[])=>{ke(e)?e.forEach(n=>n(...t)):e&&e(...t)},vh=e=>e?ke(e)?e.some(t=>t.length>1):e.length>1:!1;function Yw(e){const t={};for(const z in e)z in dy||(t[z]=e[z]);if(e.css===!1)return t;const{name:n="v",type:r,duration:o,enterFromClass:s=`${n}-enter-from`,enterActiveClass:a=`${n}-enter-active`,enterToClass:i=`${n}-enter-to`,appearFromClass:l=s,appearActiveClass:u=a,appearToClass:c=i,leaveFromClass:d=`${n}-leave-from`,leaveActiveClass:p=`${n}-leave-active`,leaveToClass:h=`${n}-leave-to`}=e,m=Gw(o),g=m&&m[0],v=m&&m[1],{onBeforeEnter:y,onEnter:k,onEnterCancelled:b,onLeave:w,onLeaveCancelled:C,onBeforeAppear:A=y,onAppear:R=k,onAppearCancelled:M=b}=t,O=(z,re,B,ue)=>{z._enterCancelled=ue,Tr(z,re?c:i),Tr(z,re?u:a),B&&B()},P=(z,re)=>{z._isLeaving=!1,Tr(z,d),Tr(z,h),Tr(z,p),re&&re()},W=z=>(re,B)=>{const ue=z?R:k,Q=()=>O(re,z,B);no(ue,[re,Q]),yh(()=>{Tr(re,z?l:s),In(re,z?c:i),vh(ue)||bh(re,r,g,Q)})};return gt(t,{onBeforeEnter(z){no(y,[z]),In(z,s),In(z,a)},onBeforeAppear(z){no(A,[z]),In(z,l),In(z,u)},onEnter:W(!1),onAppear:W(!0),onLeave(z,re){z._isLeaving=!0;const B=()=>P(z,re);In(z,d),z._enterCancelled?(In(z,p),kd()):(kd(),In(z,p)),yh(()=>{z._isLeaving&&(Tr(z,d),In(z,h),vh(w)||bh(z,r,v,B))}),no(w,[z,B])},onEnterCancelled(z){O(z,!1,void 0,!0),no(b,[z])},onAppearCancelled(z){O(z,!0,void 0,!0),no(M,[z])},onLeaveCancelled(z){P(z),no(C,[z])}})}function Gw(e){if(e==null)return null;if(nt(e))return[bc(e.enter),bc(e.leave)];{const t=bc(e);return[t,t]}}function bc(e){return tx(e)}function In(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e[ns]||(e[ns]=new Set)).add(t)}function Tr(e,t){t.split(/\s+/).forEach(r=>r&&e.classList.remove(r));const n=e[ns];n&&(n.delete(t),n.size||(e[ns]=void 0))}function yh(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let Kw=0;function bh(e,t,n,r){const o=e._endId=++Kw,s=()=>{o===e._endId&&r()};if(n!=null)return setTimeout(s,n);const{type:a,timeout:i,propCount:l}=fy(e,t);if(!a)return r();const u=a+"end";let c=0;const d=()=>{e.removeEventListener(u,p),s()},p=h=>{h.target===e&&++c>=l&&d()};setTimeout(()=>{c(n[m]||"").split(", "),o=r(`${wr}Delay`),s=r(`${wr}Duration`),a=_h(o,s),i=r(`${Cs}Delay`),l=r(`${Cs}Duration`),u=_h(i,l);let c=null,d=0,p=0;t===wr?a>0&&(c=wr,d=a,p=s.length):t===Cs?u>0&&(c=Cs,d=u,p=l.length):(d=Math.max(a,u),c=d>0?a>u?wr:Cs:null,p=c?c===wr?s.length:l.length:0);const h=c===wr&&/\b(transform|all)(,|$)/.test(r(`${wr}Property`).toString());return{type:c,timeout:d,propCount:p,hasTransform:h}}function _h(e,t){for(;e.lengthxh(n)+xh(e[r])))}function xh(e){return e==="auto"?0:Number(e.slice(0,-1).replace(",","."))*1e3}function kd(){return document.body.offsetHeight}function Zw(e,t,n){const r=e[ns];r&&(t=(t?[t,...r]:[...r]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const qi=Symbol("_vod"),py=Symbol("_vsh"),hy={beforeMount(e,{value:t},{transition:n}){e[qi]=e.style.display==="none"?"":e.style.display,n&&t?n.beforeEnter(e):Ss(e,t)},mounted(e,{value:t},{transition:n}){n&&t&&n.enter(e)},updated(e,{value:t,oldValue:n},{transition:r}){!t!=!n&&(r?t?(r.beforeEnter(e),Ss(e,!0),r.enter(e)):r.leave(e,()=>{Ss(e,!1)}):Ss(e,t))},beforeUnmount(e,{value:t}){Ss(e,t)}};function Ss(e,t){e.style.display=t?e[qi]:"none",e[py]=!t}const Xw=Symbol(""),Jw=/(^|;)\s*display\s*:/;function Qw(e,t,n){const r=e.style,o=ct(n);let s=!1;if(n&&!o){if(t)if(ct(t))for(const a of t.split(";")){const i=a.slice(0,a.indexOf(":")).trim();n[i]==null&&_i(r,i,"")}else for(const a in t)n[a]==null&&_i(r,a,"");for(const a in n)a==="display"&&(s=!0),_i(r,a,n[a])}else if(o){if(t!==n){const a=r[Xw];a&&(n+=";"+a),r.cssText=n,s=Jw.test(n)}}else t&&e.removeAttribute("style");qi in e&&(e[qi]=s?r.display:"",e[py]&&(r.display="none"))}const wh=/\s*!important$/;function _i(e,t,n){if(ke(n))n.forEach(r=>_i(e,t,r));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const r=ek(e,t);wh.test(n)?e.setProperty(yr(r),n.replace(wh,""),"important"):e[r]=n}}const kh=["Webkit","Moz","ms"],_c={};function ek(e,t){const n=_c[t];if(n)return n;let r=Lt(t);if(r!=="filter"&&r in e)return _c[t]=r;r=dl(r);for(let o=0;oxc||(ok.then(()=>xc=0),xc=Date.now());function ak(e,t){const n=r=>{if(!r._vts)r._vts=Date.now();else if(r._vts<=n.attached)return;_n(ik(r,n.value),t,5,[r])};return n.value=e,n.attached=sk(),n}function ik(e,t){if(ke(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(r=>o=>!o._stopped&&r&&r(o))}else return t}const Th=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,lk=(e,t,n,r,o,s)=>{const a=o==="svg";t==="class"?Zw(e,r,a):t==="style"?Qw(e,n,r):ll(t)?cf(t)||nk(e,t,n,r,s):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):ck(e,t,r,a))?(Eh(e,t,r),!e.tagName.includes("-")&&(t==="value"||t==="checked"||t==="selected")&&Sh(e,t,r,a,s,t!=="value")):e._isVueCE&&(/[A-Z]/.test(t)||!ct(r))?Eh(e,Lt(t),r,s,t):(t==="true-value"?e._trueValue=r:t==="false-value"&&(e._falseValue=r),Sh(e,t,r,a))};function ck(e,t,n,r){if(r)return!!(t==="innerHTML"||t==="textContent"||t in e&&Th(t)&&De(n));if(t==="spellcheck"||t==="draggable"||t==="translate"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA")return!1;if(t==="width"||t==="height"){const o=e.tagName;if(o==="IMG"||o==="VIDEO"||o==="CANVAS"||o==="SOURCE")return!1}return Th(t)&&ct(n)?!1:t in e}const my=new WeakMap,gy=new WeakMap,Vi=Symbol("_moveCb"),Oh=Symbol("_enterCb"),uk=e=>(delete e.props.mode,e),dk=uk({name:"TransitionGroup",props:gt({},Ww,{tag:String,moveClass:String}),setup(e,{slots:t}){const n=dn(),r=qx();let o,s;return bf(()=>{if(!o.length)return;const a=e.moveClass||`${e.name||"v"}-move`;if(!mk(o[0].el,n.vnode.el,a))return;o.forEach(fk),o.forEach(pk);const i=o.filter(hk);kd(),i.forEach(l=>{const u=l.el,c=u.style;In(u,a),c.transform=c.webkitTransform=c.transitionDuration="";const d=u[Vi]=p=>{p&&p.target!==u||(!p||/transform$/.test(p.propertyName))&&(u.removeEventListener("transitionend",d),u[Vi]=null,Tr(u,a))};u.addEventListener("transitionend",d)})}),()=>{const a=ze(e),i=Yw(a);let l=a.tag||Fe;if(o=[],s)for(let u=0;u{i.split(/\s+/).forEach(l=>l&&r.classList.remove(l))}),n.split(/\s+/).forEach(i=>i&&r.classList.add(i)),r.style.display="none";const s=t.nodeType===1?t:t.parentNode;s.appendChild(r);const{hasTransform:a}=fy(r);return s.removeChild(r),a}const Mh=e=>{const t=e.props["onUpdate:modelValue"]||!1;return ke(t)?n=>gi(t,n):t};function gk(e){e.target.composing=!0}function Rh(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const wc=Symbol("_assign"),xi={created(e,{modifiers:{lazy:t,trim:n,number:r}},o){e[wc]=Mh(o);const s=r||o.props&&o.props.type==="number";Fo(e,t?"change":"input",a=>{if(a.target.composing)return;let i=e.value;n&&(i=i.trim()),s&&(i=ud(i)),e[wc](i)}),n&&Fo(e,"change",()=>{e.value=e.value.trim()}),t||(Fo(e,"compositionstart",gk),Fo(e,"compositionend",Rh),Fo(e,"change",Rh))},mounted(e,{value:t}){e.value=t??""},beforeUpdate(e,{value:t,oldValue:n,modifiers:{lazy:r,trim:o,number:s}},a){if(e[wc]=Mh(a),e.composing)return;const i=(s||e.type==="number")&&!/^0\d/.test(e.value)?ud(e.value):e.value,l=t??"";i!==l&&(document.activeElement===e&&e.type!=="range"&&(r&&t===n||o&&e.value.trim()===l)||(e.value=l))}},vk=["ctrl","shift","alt","meta"],yk={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&e.button!==0,middle:e=>"button"in e&&e.button!==1,right:e=>"button"in e&&e.button!==2,exact:(e,t)=>vk.some(n=>e[`${n}Key`]&&!t.includes(n))},Ct=(e,t)=>{const n=e._withMods||(e._withMods={}),r=t.join(".");return n[r]||(n[r]=(o,...s)=>{for(let a=0;a{const n=e._withKeys||(e._withKeys={}),r=t.join(".");return n[r]||(n[r]=o=>{if(!("key"in o))return;const s=yr(o.key);if(t.some(a=>a===s||bk[a]===s))return e(o)})},_k=gt({patchProp:lk},Uw);let Ph;function xk(){return Ph||(Ph=vw(_k))}const wk=(...e)=>{const t=xk().createApp(...e),{mount:n}=t;return t.mount=r=>{const o=Ck(r);if(!o)return;const s=t._component;!De(s)&&!s.render&&!s.template&&(s.template=o.innerHTML),o.nodeType===1&&(o.textContent="");const a=n(o,!1,kk(o));return o instanceof Element&&(o.removeAttribute("v-cloak"),o.setAttribute("data-v-app","")),a},t};function kk(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function Ck(e){return ct(e)?document.querySelector(e):e}/*! - * vue-router v4.5.0 - * (c) 2024 Eduardo San Martin Morote - * @license MIT - */const Io=typeof document<"u";function vy(e){return typeof e=="object"||"displayName"in e||"props"in e||"__vccOpts"in e}function Sk(e){return e.__esModule||e[Symbol.toStringTag]==="Module"||e.default&&vy(e.default)}const We=Object.assign;function kc(e,t){const n={};for(const r in t){const o=t[r];n[r]=wn(o)?o.map(e):e(o)}return n}const Gs=()=>{},wn=Array.isArray,yy=/#/g,Ek=/&/g,Ak=/\//g,Dk=/=/g,Tk=/\?/g,by=/\+/g,Ok=/%5B/g,Mk=/%5D/g,_y=/%5E/g,Rk=/%60/g,xy=/%7B/g,Pk=/%7C/g,wy=/%7D/g,$k=/%20/g;function Cf(e){return encodeURI(""+e).replace(Pk,"|").replace(Ok,"[").replace(Mk,"]")}function Fk(e){return Cf(e).replace(xy,"{").replace(wy,"}").replace(_y,"^")}function Cd(e){return Cf(e).replace(by,"%2B").replace($k,"+").replace(yy,"%23").replace(Ek,"%26").replace(Rk,"`").replace(xy,"{").replace(wy,"}").replace(_y,"^")}function Ik(e){return Cd(e).replace(Dk,"%3D")}function Lk(e){return Cf(e).replace(yy,"%23").replace(Tk,"%3F")}function Nk(e){return e==null?"":Lk(e).replace(Ak,"%2F")}function la(e){try{return decodeURIComponent(""+e)}catch{}return""+e}const zk=/\/$/,Bk=e=>e.replace(zk,"");function Cc(e,t,n="/"){let r,o={},s="",a="";const i=t.indexOf("#");let l=t.indexOf("?");return i=0&&(l=-1),l>-1&&(r=t.slice(0,l),s=t.slice(l+1,i>-1?i:t.length),o=e(s)),i>-1&&(r=r||t.slice(0,i),a=t.slice(i,t.length)),r=Hk(r??t,n),{fullPath:r+(s&&"?")+s+a,path:r,query:o,hash:la(a)}}function qk(e,t){const n=t.query?e(t.query):"";return t.path+(n&&"?")+n+(t.hash||"")}function $h(e,t){return!t||!e.toLowerCase().startsWith(t.toLowerCase())?e:e.slice(t.length)||"/"}function Vk(e,t,n){const r=t.matched.length-1,o=n.matched.length-1;return r>-1&&r===o&&rs(t.matched[r],n.matched[o])&&ky(t.params,n.params)&&e(t.query)===e(n.query)&&t.hash===n.hash}function rs(e,t){return(e.aliasOf||e)===(t.aliasOf||t)}function ky(e,t){if(Object.keys(e).length!==Object.keys(t).length)return!1;for(const n in e)if(!jk(e[n],t[n]))return!1;return!0}function jk(e,t){return wn(e)?Fh(e,t):wn(t)?Fh(t,e):e===t}function Fh(e,t){return wn(t)?e.length===t.length&&e.every((n,r)=>n===t[r]):e.length===1&&e[0]===t}function Hk(e,t){if(e.startsWith("/"))return e;if(!e)return t;const n=t.split("/"),r=e.split("/"),o=r[r.length-1];(o===".."||o===".")&&r.push("");let s=n.length-1,a,i;for(a=0;a1&&s--;else break;return n.slice(0,s).join("/")+"/"+r.slice(a).join("/")}const kr={path:"/",name:void 0,params:{},query:{},hash:"",fullPath:"/",matched:[],meta:{},redirectedFrom:void 0};var ca;(function(e){e.pop="pop",e.push="push"})(ca||(ca={}));var Ks;(function(e){e.back="back",e.forward="forward",e.unknown=""})(Ks||(Ks={}));function Uk(e){if(!e)if(Io){const t=document.querySelector("base");e=t&&t.getAttribute("href")||"/",e=e.replace(/^\w+:\/\/[^\/]+/,"")}else e="/";return e[0]!=="/"&&e[0]!=="#"&&(e="/"+e),Bk(e)}const Wk=/^[^#]+#/;function Yk(e,t){return e.replace(Wk,"#")+t}function Gk(e,t){const n=document.documentElement.getBoundingClientRect(),r=e.getBoundingClientRect();return{behavior:t.behavior,left:r.left-n.left-(t.left||0),top:r.top-n.top-(t.top||0)}}const El=()=>({left:window.scrollX,top:window.scrollY});function Kk(e){let t;if("el"in e){const n=e.el,r=typeof n=="string"&&n.startsWith("#"),o=typeof n=="string"?r?document.getElementById(n.slice(1)):document.querySelector(n):n;if(!o)return;t=Gk(o,e)}else t=e;"scrollBehavior"in document.documentElement.style?window.scrollTo(t):window.scrollTo(t.left!=null?t.left:window.scrollX,t.top!=null?t.top:window.scrollY)}function Ih(e,t){return(history.state?history.state.position-t:-1)+e}const Sd=new Map;function Zk(e,t){Sd.set(e,t)}function Xk(e){const t=Sd.get(e);return Sd.delete(e),t}let Jk=()=>location.protocol+"//"+location.host;function Cy(e,t){const{pathname:n,search:r,hash:o}=t,s=e.indexOf("#");if(s>-1){let i=o.includes(e.slice(s))?e.slice(s).length:1,l=o.slice(i);return l[0]!=="/"&&(l="/"+l),$h(l,"")}return $h(n,e)+r+o}function Qk(e,t,n,r){let o=[],s=[],a=null;const i=({state:p})=>{const h=Cy(e,location),m=n.value,g=t.value;let v=0;if(p){if(n.value=h,t.value=p,a&&a===m){a=null;return}v=g?p.position-g.position:0}else r(h);o.forEach(y=>{y(n.value,m,{delta:v,type:ca.pop,direction:v?v>0?Ks.forward:Ks.back:Ks.unknown})})};function l(){a=n.value}function u(p){o.push(p);const h=()=>{const m=o.indexOf(p);m>-1&&o.splice(m,1)};return s.push(h),h}function c(){const{history:p}=window;p.state&&p.replaceState(We({},p.state,{scroll:El()}),"")}function d(){for(const p of s)p();s=[],window.removeEventListener("popstate",i),window.removeEventListener("beforeunload",c)}return window.addEventListener("popstate",i),window.addEventListener("beforeunload",c,{passive:!0}),{pauseListeners:l,listen:u,destroy:d}}function Lh(e,t,n,r=!1,o=!1){return{back:e,current:t,forward:n,replaced:r,position:window.history.length,scroll:o?El():null}}function e2(e){const{history:t,location:n}=window,r={value:Cy(e,n)},o={value:t.state};o.value||s(r.value,{back:null,current:r.value,forward:null,position:t.length-1,replaced:!0,scroll:null},!0);function s(l,u,c){const d=e.indexOf("#"),p=d>-1?(n.host&&document.querySelector("base")?e:e.slice(d))+l:Jk()+e+l;try{t[c?"replaceState":"pushState"](u,"",p),o.value=u}catch(h){console.error(h),n[c?"replace":"assign"](p)}}function a(l,u){const c=We({},t.state,Lh(o.value.back,l,o.value.forward,!0),u,{position:o.value.position});s(l,c,!0),r.value=l}function i(l,u){const c=We({},o.value,t.state,{forward:l,scroll:El()});s(c.current,c,!0);const d=We({},Lh(r.value,l,null),{position:c.position+1},u);s(l,d,!1),r.value=l}return{location:r,state:o,push:i,replace:a}}function t2(e){e=Uk(e);const t=e2(e),n=Qk(e,t.state,t.location,t.replace);function r(s,a=!0){a||n.pauseListeners(),history.go(s)}const o=We({location:"",base:e,go:r,createHref:Yk.bind(null,e)},t,n);return Object.defineProperty(o,"location",{enumerable:!0,get:()=>t.location.value}),Object.defineProperty(o,"state",{enumerable:!0,get:()=>t.state.value}),o}function n2(e){return typeof e=="string"||e&&typeof e=="object"}function Sy(e){return typeof e=="string"||typeof e=="symbol"}const Ey=Symbol("");var Nh;(function(e){e[e.aborted=4]="aborted",e[e.cancelled=8]="cancelled",e[e.duplicated=16]="duplicated"})(Nh||(Nh={}));function os(e,t){return We(new Error,{type:e,[Ey]:!0},t)}function er(e,t){return e instanceof Error&&Ey in e&&(t==null||!!(e.type&t))}const zh="[^/]+?",r2={sensitive:!1,strict:!1,start:!0,end:!0},o2=/[.+*?^${}()[\]/\\]/g;function s2(e,t){const n=We({},r2,t),r=[];let o=n.start?"^":"";const s=[];for(const u of e){const c=u.length?[]:[90];n.strict&&!u.length&&(o+="/");for(let d=0;dt.length?t.length===1&&t[0]===80?1:-1:0}function Ay(e,t){let n=0;const r=e.score,o=t.score;for(;n0&&t[t.length-1]<0}const i2={type:0,value:""},l2=/[a-zA-Z0-9_]/;function c2(e){if(!e)return[[]];if(e==="/")return[[i2]];if(!e.startsWith("/"))throw new Error(`Invalid path "${e}"`);function t(h){throw new Error(`ERR (${n})/"${u}": ${h}`)}let n=0,r=n;const o=[];let s;function a(){s&&o.push(s),s=[]}let i=0,l,u="",c="";function d(){u&&(n===0?s.push({type:0,value:u}):n===1||n===2||n===3?(s.length>1&&(l==="*"||l==="+")&&t(`A repeatable param (${u}) must be alone in its segment. eg: '/:ids+.`),s.push({type:1,value:u,regexp:c,repeatable:l==="*"||l==="+",optional:l==="*"||l==="?"})):t("Invalid state to consume buffer"),u="")}function p(){u+=l}for(;i{a(b)}:Gs}function a(d){if(Sy(d)){const p=r.get(d);p&&(r.delete(d),n.splice(n.indexOf(p),1),p.children.forEach(a),p.alias.forEach(a))}else{const p=n.indexOf(d);p>-1&&(n.splice(p,1),d.record.name&&r.delete(d.record.name),d.children.forEach(a),d.alias.forEach(a))}}function i(){return n}function l(d){const p=h2(d,n);n.splice(p,0,d),d.record.name&&!jh(d)&&r.set(d.record.name,d)}function u(d,p){let h,m={},g,v;if("name"in d&&d.name){if(h=r.get(d.name),!h)throw os(1,{location:d});v=h.record.name,m=We(qh(p.params,h.keys.filter(b=>!b.optional).concat(h.parent?h.parent.keys.filter(b=>b.optional):[]).map(b=>b.name)),d.params&&qh(d.params,h.keys.map(b=>b.name))),g=h.stringify(m)}else if(d.path!=null)g=d.path,h=n.find(b=>b.re.test(g)),h&&(m=h.parse(g),v=h.record.name);else{if(h=p.name?r.get(p.name):n.find(b=>b.re.test(p.path)),!h)throw os(1,{location:d,currentLocation:p});v=h.record.name,m=We({},p.params,d.params),g=h.stringify(m)}const y=[];let k=h;for(;k;)y.unshift(k.record),k=k.parent;return{name:v,path:g,params:m,matched:y,meta:p2(y)}}e.forEach(d=>s(d));function c(){n.length=0,r.clear()}return{addRoute:s,resolve:u,removeRoute:a,clearRoutes:c,getRoutes:i,getRecordMatcher:o}}function qh(e,t){const n={};for(const r of t)r in e&&(n[r]=e[r]);return n}function Vh(e){const t={path:e.path,redirect:e.redirect,name:e.name,meta:e.meta||{},aliasOf:e.aliasOf,beforeEnter:e.beforeEnter,props:f2(e),children:e.children||[],instances:{},leaveGuards:new Set,updateGuards:new Set,enterCallbacks:{},components:"components"in e?e.components||null:e.component&&{default:e.component}};return Object.defineProperty(t,"mods",{value:{}}),t}function f2(e){const t={},n=e.props||!1;if("component"in e)t.default=n;else for(const r in e.components)t[r]=typeof n=="object"?n[r]:n;return t}function jh(e){for(;e;){if(e.record.aliasOf)return!0;e=e.parent}return!1}function p2(e){return e.reduce((t,n)=>We(t,n.meta),{})}function Hh(e,t){const n={};for(const r in e)n[r]=r in t?t[r]:e[r];return n}function h2(e,t){let n=0,r=t.length;for(;n!==r;){const s=n+r>>1;Ay(e,t[s])<0?r=s:n=s+1}const o=m2(e);return o&&(r=t.lastIndexOf(o,r-1)),r}function m2(e){let t=e;for(;t=t.parent;)if(Dy(t)&&Ay(e,t)===0)return t}function Dy({record:e}){return!!(e.name||e.components&&Object.keys(e.components).length||e.redirect)}function g2(e){const t={};if(e===""||e==="?")return t;const r=(e[0]==="?"?e.slice(1):e).split("&");for(let o=0;os&&Cd(s)):[r&&Cd(r)]).forEach(s=>{s!==void 0&&(t+=(t.length?"&":"")+n,s!=null&&(t+="="+s))})}return t}function v2(e){const t={};for(const n in e){const r=e[n];r!==void 0&&(t[n]=wn(r)?r.map(o=>o==null?null:""+o):r==null?r:""+r)}return t}const y2=Symbol(""),Wh=Symbol(""),Al=Symbol(""),Sf=Symbol(""),Ed=Symbol("");function Es(){let e=[];function t(r){return e.push(r),()=>{const o=e.indexOf(r);o>-1&&e.splice(o,1)}}function n(){e=[]}return{add:t,list:()=>e.slice(),reset:n}}function $r(e,t,n,r,o,s=a=>a()){const a=r&&(r.enterCallbacks[o]=r.enterCallbacks[o]||[]);return()=>new Promise((i,l)=>{const u=p=>{p===!1?l(os(4,{from:n,to:t})):p instanceof Error?l(p):n2(p)?l(os(2,{from:t,to:p})):(a&&r.enterCallbacks[o]===a&&typeof p=="function"&&a.push(p),i())},c=s(()=>e.call(r&&r.instances[o],t,n,u));let d=Promise.resolve(c);e.length<3&&(d=d.then(u)),d.catch(p=>l(p))})}function Sc(e,t,n,r,o=s=>s()){const s=[];for(const a of e)for(const i in a.components){let l=a.components[i];if(!(t!=="beforeRouteEnter"&&!a.instances[i]))if(vy(l)){const c=(l.__vccOpts||l)[t];c&&s.push($r(c,n,r,a,i,o))}else{let u=l();s.push(()=>u.then(c=>{if(!c)throw new Error(`Couldn't resolve component "${i}" at "${a.path}"`);const d=Sk(c)?c.default:c;a.mods[i]=c,a.components[i]=d;const h=(d.__vccOpts||d)[t];return h&&$r(h,n,r,a,i,o)()}))}}return s}function Yh(e){const t=qt(Al),n=qt(Sf),r=$(()=>{const l=f(e.to);return t.resolve(l)}),o=$(()=>{const{matched:l}=r.value,{length:u}=l,c=l[u-1],d=n.matched;if(!c||!d.length)return-1;const p=d.findIndex(rs.bind(null,c));if(p>-1)return p;const h=Gh(l[u-2]);return u>1&&Gh(c)===h&&d[d.length-1].path!==h?d.findIndex(rs.bind(null,l[u-2])):p}),s=$(()=>o.value>-1&&k2(n.params,r.value.params)),a=$(()=>o.value>-1&&o.value===n.matched.length-1&&ky(n.params,r.value.params));function i(l={}){if(w2(l)){const u=t[f(e.replace)?"replace":"push"](f(e.to)).catch(Gs);return e.viewTransition&&typeof document<"u"&&"startViewTransition"in document&&document.startViewTransition(()=>u),u}return Promise.resolve()}return{route:r,href:$(()=>r.value.href),isActive:s,isExactActive:a,navigate:i}}function b2(e){return e.length===1?e[0]:e}const _2=I({name:"RouterLink",compatConfig:{MODE:3},props:{to:{type:[String,Object],required:!0},replace:Boolean,activeClass:String,exactActiveClass:String,custom:Boolean,ariaCurrentValue:{type:String,default:"page"}},useLink:Yh,setup(e,{slots:t}){const n=xo(Yh(e)),{options:r}=qt(Al),o=$(()=>({[Kh(e.activeClass,r.linkActiveClass,"router-link-active")]:n.isActive,[Kh(e.exactActiveClass,r.linkExactActiveClass,"router-link-exact-active")]:n.isExactActive}));return()=>{const s=t.default&&b2(t.default(n));return e.custom?s:Vt("a",{"aria-current":n.isExactActive?e.ariaCurrentValue:null,href:n.href,onClick:n.navigate,class:o.value},s)}}}),x2=_2;function w2(e){if(!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)&&!e.defaultPrevented&&!(e.button!==void 0&&e.button!==0)){if(e.currentTarget&&e.currentTarget.getAttribute){const t=e.currentTarget.getAttribute("target");if(/\b_blank\b/i.test(t))return}return e.preventDefault&&e.preventDefault(),!0}}function k2(e,t){for(const n in t){const r=t[n],o=e[n];if(typeof r=="string"){if(r!==o)return!1}else if(!wn(o)||o.length!==r.length||r.some((s,a)=>s!==o[a]))return!1}return!0}function Gh(e){return e?e.aliasOf?e.aliasOf.path:e.path:""}const Kh=(e,t,n)=>e??t??n,C2=I({name:"RouterView",inheritAttrs:!1,props:{name:{type:String,default:"default"},route:Object},compatConfig:{MODE:3},setup(e,{attrs:t,slots:n}){const r=qt(Ed),o=$(()=>e.route||r.value),s=qt(Wh,0),a=$(()=>{let u=f(s);const{matched:c}=o.value;let d;for(;(d=c[u])&&!d.components;)u++;return u}),i=$(()=>o.value.matched[a.value]);Wo(Wh,$(()=>a.value+1)),Wo(y2,i),Wo(Ed,o);const l=F();return Oe(()=>[l.value,i.value,e.name],([u,c,d],[p,h,m])=>{c&&(c.instances[d]=u,h&&h!==c&&u&&u===p&&(c.leaveGuards.size||(c.leaveGuards=h.leaveGuards),c.updateGuards.size||(c.updateGuards=h.updateGuards))),u&&c&&(!h||!rs(c,h)||!p)&&(c.enterCallbacks[d]||[]).forEach(g=>g(u))},{flush:"post"}),()=>{const u=o.value,c=e.name,d=i.value,p=d&&d.components[c];if(!p)return Zh(n.default,{Component:p,route:u});const h=d.props[c],m=h?h===!0?u.params:typeof h=="function"?h(u):h:null,v=Vt(p,We({},m,t,{onVnodeUnmounted:y=>{y.component.isUnmounted&&(d.instances[c]=null)},ref:l}));return Zh(n.default,{Component:v,route:u})||v}}});function Zh(e,t){if(!e)return null;const n=e(t);return n.length===1?n[0]:n}const S2=C2;function E2(e){const t=d2(e.routes,e),n=e.parseQuery||g2,r=e.stringifyQuery||Uh,o=e.history,s=Es(),a=Es(),i=Es(),l=vf(kr);let u=kr;Io&&e.scrollBehavior&&"scrollRestoration"in history&&(history.scrollRestoration="manual");const c=kc.bind(null,Y=>""+Y),d=kc.bind(null,Nk),p=kc.bind(null,la);function h(Y,se){let de,ye;return Sy(Y)?(de=t.getRecordMatcher(Y),ye=se):ye=Y,t.addRoute(ye,de)}function m(Y){const se=t.getRecordMatcher(Y);se&&t.removeRoute(se)}function g(){return t.getRoutes().map(Y=>Y.record)}function v(Y){return!!t.getRecordMatcher(Y)}function y(Y,se){if(se=We({},se||l.value),typeof Y=="string"){const N=Cc(n,Y,se.path),G=t.resolve({path:N.path},se),J=o.createHref(N.fullPath);return We(N,G,{params:p(G.params),hash:la(N.hash),redirectedFrom:void 0,href:J})}let de;if(Y.path!=null)de=We({},Y,{path:Cc(n,Y.path,se.path).path});else{const N=We({},Y.params);for(const G in N)N[G]==null&&delete N[G];de=We({},Y,{params:d(N)}),se.params=d(se.params)}const ye=t.resolve(de,se),qe=Y.hash||"";ye.params=c(p(ye.params));const D=qk(r,We({},Y,{hash:Fk(qe),path:ye.path})),T=o.createHref(D);return We({fullPath:D,hash:qe,query:r===Uh?v2(Y.query):Y.query||{}},ye,{redirectedFrom:void 0,href:T})}function k(Y){return typeof Y=="string"?Cc(n,Y,l.value.path):We({},Y)}function b(Y,se){if(u!==Y)return os(8,{from:se,to:Y})}function w(Y){return R(Y)}function C(Y){return w(We(k(Y),{replace:!0}))}function A(Y){const se=Y.matched[Y.matched.length-1];if(se&&se.redirect){const{redirect:de}=se;let ye=typeof de=="function"?de(Y):de;return typeof ye=="string"&&(ye=ye.includes("?")||ye.includes("#")?ye=k(ye):{path:ye},ye.params={}),We({query:Y.query,hash:Y.hash,params:ye.path!=null?{}:Y.params},ye)}}function R(Y,se){const de=u=y(Y),ye=l.value,qe=Y.state,D=Y.force,T=Y.replace===!0,N=A(de);if(N)return R(We(k(N),{state:typeof N=="object"?We({},qe,N.state):qe,force:D,replace:T}),se||de);const G=de;G.redirectedFrom=se;let J;return!D&&Vk(r,ye,de)&&(J=os(16,{to:G,from:ye}),ae(ye,ye,!0,!1)),(J?Promise.resolve(J):P(G,ye)).catch(X=>er(X)?er(X,2)?X:U(X):Z(X,G,ye)).then(X=>{if(X){if(er(X,2))return R(We({replace:T},k(X.to),{state:typeof X.to=="object"?We({},qe,X.to.state):qe,force:D}),se||G)}else X=z(G,ye,!0,T,qe);return W(G,ye,X),X})}function M(Y,se){const de=b(Y,se);return de?Promise.reject(de):Promise.resolve()}function O(Y){const se=Je.values().next().value;return se&&typeof se.runWithContext=="function"?se.runWithContext(Y):Y()}function P(Y,se){let de;const[ye,qe,D]=A2(Y,se);de=Sc(ye.reverse(),"beforeRouteLeave",Y,se);for(const N of ye)N.leaveGuards.forEach(G=>{de.push($r(G,Y,se))});const T=M.bind(null,Y,se);return de.push(T),ft(de).then(()=>{de=[];for(const N of s.list())de.push($r(N,Y,se));return de.push(T),ft(de)}).then(()=>{de=Sc(qe,"beforeRouteUpdate",Y,se);for(const N of qe)N.updateGuards.forEach(G=>{de.push($r(G,Y,se))});return de.push(T),ft(de)}).then(()=>{de=[];for(const N of D)if(N.beforeEnter)if(wn(N.beforeEnter))for(const G of N.beforeEnter)de.push($r(G,Y,se));else de.push($r(N.beforeEnter,Y,se));return de.push(T),ft(de)}).then(()=>(Y.matched.forEach(N=>N.enterCallbacks={}),de=Sc(D,"beforeRouteEnter",Y,se,O),de.push(T),ft(de))).then(()=>{de=[];for(const N of a.list())de.push($r(N,Y,se));return de.push(T),ft(de)}).catch(N=>er(N,8)?N:Promise.reject(N))}function W(Y,se,de){i.list().forEach(ye=>O(()=>ye(Y,se,de)))}function z(Y,se,de,ye,qe){const D=b(Y,se);if(D)return D;const T=se===kr,N=Io?history.state:{};de&&(ye||T?o.replace(Y.fullPath,We({scroll:T&&N&&N.scroll},qe)):o.push(Y.fullPath,qe)),l.value=Y,ae(Y,se,de,T),U()}let re;function B(){re||(re=o.listen((Y,se,de)=>{if(!Ue.listening)return;const ye=y(Y),qe=A(ye);if(qe){R(We(qe,{replace:!0,force:!0}),ye).catch(Gs);return}u=ye;const D=l.value;Io&&Zk(Ih(D.fullPath,de.delta),El()),P(ye,D).catch(T=>er(T,12)?T:er(T,2)?(R(We(k(T.to),{force:!0}),ye).then(N=>{er(N,20)&&!de.delta&&de.type===ca.pop&&o.go(-1,!1)}).catch(Gs),Promise.reject()):(de.delta&&o.go(-de.delta,!1),Z(T,ye,D))).then(T=>{T=T||z(ye,D,!1),T&&(de.delta&&!er(T,8)?o.go(-de.delta,!1):de.type===ca.pop&&er(T,20)&&o.go(-1,!1)),W(ye,D,T)}).catch(Gs)}))}let ue=Es(),Q=Es(),j;function Z(Y,se,de){U(Y);const ye=Q.list();return ye.length?ye.forEach(qe=>qe(Y,se,de)):console.error(Y),Promise.reject(Y)}function H(){return j&&l.value!==kr?Promise.resolve():new Promise((Y,se)=>{ue.add([Y,se])})}function U(Y){return j||(j=!Y,B(),ue.list().forEach(([se,de])=>Y?de(Y):se()),ue.reset()),Y}function ae(Y,se,de,ye){const{scrollBehavior:qe}=e;if(!Io||!qe)return Promise.resolve();const D=!de&&Xk(Ih(Y.fullPath,0))||(ye||!de)&&history.state&&history.state.scroll||null;return it().then(()=>qe(Y,se,D)).then(T=>T&&Kk(T)).catch(T=>Z(T,Y,se))}const pe=Y=>o.go(Y);let Le;const Je=new Set,Ue={currentRoute:l,listening:!0,addRoute:h,removeRoute:m,clearRoutes:t.clearRoutes,hasRoute:v,getRoutes:g,resolve:y,options:e,push:w,replace:C,go:pe,back:()=>pe(-1),forward:()=>pe(1),beforeEach:s.add,beforeResolve:a.add,afterEach:i.add,onError:Q.add,isReady:H,install(Y){const se=this;Y.component("RouterLink",x2),Y.component("RouterView",S2),Y.config.globalProperties.$router=se,Object.defineProperty(Y.config.globalProperties,"$route",{enumerable:!0,get:()=>f(l)}),Io&&!Le&&l.value===kr&&(Le=!0,w(o.location).catch(qe=>{}));const de={};for(const qe in kr)Object.defineProperty(de,qe,{get:()=>l.value[qe],enumerable:!0});Y.provide(Al,se),Y.provide(Sf,g0(de)),Y.provide(Ed,l);const ye=Y.unmount;Je.add(Y),Y.unmount=function(){Je.delete(Y),Je.size<1&&(u=kr,re&&re(),re=null,l.value=kr,Le=!1,j=!1),ye()}}};function ft(Y){return Y.reduce((se,de)=>se.then(()=>O(de)),Promise.resolve())}return Ue}function A2(e,t){const n=[],r=[],o=[],s=Math.max(t.matched.length,e.matched.length);for(let a=0;ars(u,i))?r.push(i):n.push(i));const l=e.matched[a];l&&(t.matched.find(u=>rs(u,l))||o.push(l))}return[n,r,o]}function D2(){return qt(Al)}function Ty(e){return qt(Sf)}function Oy(e){var t,n,r="";if(typeof e=="string"||typeof e=="number")r+=e;else if(typeof e=="object")if(Array.isArray(e)){var o=e.length;for(t=0;t{const t=M2(e),{conflictingClassGroups:n,conflictingClassGroupModifiers:r}=e;return{getClassGroupId:a=>{const i=a.split(Ef);return i[0]===""&&i.length!==1&&i.shift(),Ry(i,t)||O2(a)},getConflictingClassGroupIds:(a,i)=>{const l=n[a]||[];return i&&r[a]?[...l,...r[a]]:l}}},Ry=(e,t)=>{if(e.length===0)return t.classGroupId;const n=e[0],r=t.nextPart.get(n),o=r?Ry(e.slice(1),r):void 0;if(o)return o;if(t.validators.length===0)return;const s=e.join(Ef);return t.validators.find(({validator:a})=>a(s))?.classGroupId},Xh=/^\[(.+)\]$/,O2=e=>{if(Xh.test(e)){const t=Xh.exec(e)[1],n=t?.substring(0,t.indexOf(":"));if(n)return"arbitrary.."+n}},M2=e=>{const{theme:t,prefix:n}=e,r={nextPart:new Map,validators:[]};return P2(Object.entries(e.classGroups),n).forEach(([s,a])=>{Ad(a,r,s,t)}),r},Ad=(e,t,n,r)=>{e.forEach(o=>{if(typeof o=="string"){const s=o===""?t:Jh(t,o);s.classGroupId=n;return}if(typeof o=="function"){if(R2(o)){Ad(o(r),t,n,r);return}t.validators.push({validator:o,classGroupId:n});return}Object.entries(o).forEach(([s,a])=>{Ad(a,Jh(t,s),n,r)})})},Jh=(e,t)=>{let n=e;return t.split(Ef).forEach(r=>{n.nextPart.has(r)||n.nextPart.set(r,{nextPart:new Map,validators:[]}),n=n.nextPart.get(r)}),n},R2=e=>e.isThemeGetter,P2=(e,t)=>t?e.map(([n,r])=>{const o=r.map(s=>typeof s=="string"?t+s:typeof s=="object"?Object.fromEntries(Object.entries(s).map(([a,i])=>[t+a,i])):s);return[n,o]}):e,$2=e=>{if(e<1)return{get:()=>{},set:()=>{}};let t=0,n=new Map,r=new Map;const o=(s,a)=>{n.set(s,a),t++,t>e&&(t=0,r=n,n=new Map)};return{get(s){let a=n.get(s);if(a!==void 0)return a;if((a=r.get(s))!==void 0)return o(s,a),a},set(s,a){n.has(s)?n.set(s,a):o(s,a)}}},Py="!",F2=e=>{const{separator:t,experimentalParseClassName:n}=e,r=t.length===1,o=t[0],s=t.length,a=i=>{const l=[];let u=0,c=0,d;for(let v=0;vc?d-c:void 0;return{modifiers:l,hasImportantModifier:h,baseClassName:m,maybePostfixModifierPosition:g}};return n?i=>n({className:i,parseClassName:a}):a},I2=e=>{if(e.length<=1)return e;const t=[];let n=[];return e.forEach(r=>{r[0]==="["?(t.push(...n.sort(),r),n=[]):n.push(r)}),t.push(...n.sort()),t},L2=e=>({cache:$2(e.cacheSize),parseClassName:F2(e),...T2(e)}),N2=/\s+/,z2=(e,t)=>{const{parseClassName:n,getClassGroupId:r,getConflictingClassGroupIds:o}=t,s=[],a=e.trim().split(N2);let i="";for(let l=a.length-1;l>=0;l-=1){const u=a[l],{modifiers:c,hasImportantModifier:d,baseClassName:p,maybePostfixModifierPosition:h}=n(u);let m=!!h,g=r(m?p.substring(0,h):p);if(!g){if(!m){i=u+(i.length>0?" "+i:i);continue}if(g=r(p),!g){i=u+(i.length>0?" "+i:i);continue}m=!1}const v=I2(c).join(":"),y=d?v+Py:v,k=y+g;if(s.includes(k))continue;s.push(k);const b=o(g,m);for(let w=0;w0?" "+i:i)}return i};function B2(){let e=0,t,n,r="";for(;e{if(typeof e=="string")return e;let t,n="";for(let r=0;rd(c),e());return n=L2(u),r=n.cache.get,o=n.cache.set,s=i,i(l)}function i(l){const u=r(l);if(u)return u;const c=z2(l,n);return o(l,c),c}return function(){return s(B2.apply(null,arguments))}}const rt=e=>{const t=n=>n[e]||[];return t.isThemeGetter=!0,t},Fy=/^\[(?:([a-z-]+):)?(.+)\]$/i,V2=/^\d+\/\d+$/,j2=new Set(["px","full","screen"]),H2=/^(\d+(\.\d+)?)?(xs|sm|md|lg|xl)$/,U2=/\d+(%|px|r?em|[sdl]?v([hwib]|min|max)|pt|pc|in|cm|mm|cap|ch|ex|r?lh|cq(w|h|i|b|min|max))|\b(calc|min|max|clamp)\(.+\)|^0$/,W2=/^(rgba?|hsla?|hwb|(ok)?(lab|lch))\(.+\)$/,Y2=/^(inset_)?-?((\d+)?\.?(\d+)[a-z]+|0)_-?((\d+)?\.?(\d+)[a-z]+|0)/,G2=/^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\(.+\)$/,tr=e=>Yo(e)||j2.has(e)||V2.test(e),Cr=e=>cs(e,"length",nC),Yo=e=>!!e&&!Number.isNaN(Number(e)),Ec=e=>cs(e,"number",Yo),As=e=>!!e&&Number.isInteger(Number(e)),K2=e=>e.endsWith("%")&&Yo(e.slice(0,-1)),Me=e=>Fy.test(e),Sr=e=>H2.test(e),Z2=new Set(["length","size","percentage"]),X2=e=>cs(e,Z2,Iy),J2=e=>cs(e,"position",Iy),Q2=new Set(["image","url"]),eC=e=>cs(e,Q2,oC),tC=e=>cs(e,"",rC),Ds=()=>!0,cs=(e,t,n)=>{const r=Fy.exec(e);return r?r[1]?typeof t=="string"?r[1]===t:t.has(r[1]):n(r[2]):!1},nC=e=>U2.test(e)&&!W2.test(e),Iy=()=>!1,rC=e=>Y2.test(e),oC=e=>G2.test(e),sC=()=>{const e=rt("colors"),t=rt("spacing"),n=rt("blur"),r=rt("brightness"),o=rt("borderColor"),s=rt("borderRadius"),a=rt("borderSpacing"),i=rt("borderWidth"),l=rt("contrast"),u=rt("grayscale"),c=rt("hueRotate"),d=rt("invert"),p=rt("gap"),h=rt("gradientColorStops"),m=rt("gradientColorStopPositions"),g=rt("inset"),v=rt("margin"),y=rt("opacity"),k=rt("padding"),b=rt("saturate"),w=rt("scale"),C=rt("sepia"),A=rt("skew"),R=rt("space"),M=rt("translate"),O=()=>["auto","contain","none"],P=()=>["auto","hidden","clip","visible","scroll"],W=()=>["auto",Me,t],z=()=>[Me,t],re=()=>["",tr,Cr],B=()=>["auto",Yo,Me],ue=()=>["bottom","center","left","left-bottom","left-top","right","right-bottom","right-top","top"],Q=()=>["solid","dashed","dotted","double","none"],j=()=>["normal","multiply","screen","overlay","darken","lighten","color-dodge","color-burn","hard-light","soft-light","difference","exclusion","hue","saturation","color","luminosity"],Z=()=>["start","end","center","between","around","evenly","stretch"],H=()=>["","0",Me],U=()=>["auto","avoid","all","avoid-page","page","left","right","column"],ae=()=>[Yo,Me];return{cacheSize:500,separator:":",theme:{colors:[Ds],spacing:[tr,Cr],blur:["none","",Sr,Me],brightness:ae(),borderColor:[e],borderRadius:["none","","full",Sr,Me],borderSpacing:z(),borderWidth:re(),contrast:ae(),grayscale:H(),hueRotate:ae(),invert:H(),gap:z(),gradientColorStops:[e],gradientColorStopPositions:[K2,Cr],inset:W(),margin:W(),opacity:ae(),padding:z(),saturate:ae(),scale:ae(),sepia:H(),skew:ae(),space:z(),translate:z()},classGroups:{aspect:[{aspect:["auto","square","video",Me]}],container:["container"],columns:[{columns:[Sr]}],"break-after":[{"break-after":U()}],"break-before":[{"break-before":U()}],"break-inside":[{"break-inside":["auto","avoid","avoid-page","avoid-column"]}],"box-decoration":[{"box-decoration":["slice","clone"]}],box:[{box:["border","content"]}],display:["block","inline-block","inline","flex","inline-flex","table","inline-table","table-caption","table-cell","table-column","table-column-group","table-footer-group","table-header-group","table-row-group","table-row","flow-root","grid","inline-grid","contents","list-item","hidden"],float:[{float:["right","left","none","start","end"]}],clear:[{clear:["left","right","both","none","start","end"]}],isolation:["isolate","isolation-auto"],"object-fit":[{object:["contain","cover","fill","none","scale-down"]}],"object-position":[{object:[...ue(),Me]}],overflow:[{overflow:P()}],"overflow-x":[{"overflow-x":P()}],"overflow-y":[{"overflow-y":P()}],overscroll:[{overscroll:O()}],"overscroll-x":[{"overscroll-x":O()}],"overscroll-y":[{"overscroll-y":O()}],position:["static","fixed","absolute","relative","sticky"],inset:[{inset:[g]}],"inset-x":[{"inset-x":[g]}],"inset-y":[{"inset-y":[g]}],start:[{start:[g]}],end:[{end:[g]}],top:[{top:[g]}],right:[{right:[g]}],bottom:[{bottom:[g]}],left:[{left:[g]}],visibility:["visible","invisible","collapse"],z:[{z:["auto",As,Me]}],basis:[{basis:W()}],"flex-direction":[{flex:["row","row-reverse","col","col-reverse"]}],"flex-wrap":[{flex:["wrap","wrap-reverse","nowrap"]}],flex:[{flex:["1","auto","initial","none",Me]}],grow:[{grow:H()}],shrink:[{shrink:H()}],order:[{order:["first","last","none",As,Me]}],"grid-cols":[{"grid-cols":[Ds]}],"col-start-end":[{col:["auto",{span:["full",As,Me]},Me]}],"col-start":[{"col-start":B()}],"col-end":[{"col-end":B()}],"grid-rows":[{"grid-rows":[Ds]}],"row-start-end":[{row:["auto",{span:[As,Me]},Me]}],"row-start":[{"row-start":B()}],"row-end":[{"row-end":B()}],"grid-flow":[{"grid-flow":["row","col","dense","row-dense","col-dense"]}],"auto-cols":[{"auto-cols":["auto","min","max","fr",Me]}],"auto-rows":[{"auto-rows":["auto","min","max","fr",Me]}],gap:[{gap:[p]}],"gap-x":[{"gap-x":[p]}],"gap-y":[{"gap-y":[p]}],"justify-content":[{justify:["normal",...Z()]}],"justify-items":[{"justify-items":["start","end","center","stretch"]}],"justify-self":[{"justify-self":["auto","start","end","center","stretch"]}],"align-content":[{content:["normal",...Z(),"baseline"]}],"align-items":[{items:["start","end","center","baseline","stretch"]}],"align-self":[{self:["auto","start","end","center","stretch","baseline"]}],"place-content":[{"place-content":[...Z(),"baseline"]}],"place-items":[{"place-items":["start","end","center","baseline","stretch"]}],"place-self":[{"place-self":["auto","start","end","center","stretch"]}],p:[{p:[k]}],px:[{px:[k]}],py:[{py:[k]}],ps:[{ps:[k]}],pe:[{pe:[k]}],pt:[{pt:[k]}],pr:[{pr:[k]}],pb:[{pb:[k]}],pl:[{pl:[k]}],m:[{m:[v]}],mx:[{mx:[v]}],my:[{my:[v]}],ms:[{ms:[v]}],me:[{me:[v]}],mt:[{mt:[v]}],mr:[{mr:[v]}],mb:[{mb:[v]}],ml:[{ml:[v]}],"space-x":[{"space-x":[R]}],"space-x-reverse":["space-x-reverse"],"space-y":[{"space-y":[R]}],"space-y-reverse":["space-y-reverse"],w:[{w:["auto","min","max","fit","svw","lvw","dvw",Me,t]}],"min-w":[{"min-w":[Me,t,"min","max","fit"]}],"max-w":[{"max-w":[Me,t,"none","full","min","max","fit","prose",{screen:[Sr]},Sr]}],h:[{h:[Me,t,"auto","min","max","fit","svh","lvh","dvh"]}],"min-h":[{"min-h":[Me,t,"min","max","fit","svh","lvh","dvh"]}],"max-h":[{"max-h":[Me,t,"min","max","fit","svh","lvh","dvh"]}],size:[{size:[Me,t,"auto","min","max","fit"]}],"font-size":[{text:["base",Sr,Cr]}],"font-smoothing":["antialiased","subpixel-antialiased"],"font-style":["italic","not-italic"],"font-weight":[{font:["thin","extralight","light","normal","medium","semibold","bold","extrabold","black",Ec]}],"font-family":[{font:[Ds]}],"fvn-normal":["normal-nums"],"fvn-ordinal":["ordinal"],"fvn-slashed-zero":["slashed-zero"],"fvn-figure":["lining-nums","oldstyle-nums"],"fvn-spacing":["proportional-nums","tabular-nums"],"fvn-fraction":["diagonal-fractions","stacked-fractions"],tracking:[{tracking:["tighter","tight","normal","wide","wider","widest",Me]}],"line-clamp":[{"line-clamp":["none",Yo,Ec]}],leading:[{leading:["none","tight","snug","normal","relaxed","loose",tr,Me]}],"list-image":[{"list-image":["none",Me]}],"list-style-type":[{list:["none","disc","decimal",Me]}],"list-style-position":[{list:["inside","outside"]}],"placeholder-color":[{placeholder:[e]}],"placeholder-opacity":[{"placeholder-opacity":[y]}],"text-alignment":[{text:["left","center","right","justify","start","end"]}],"text-color":[{text:[e]}],"text-opacity":[{"text-opacity":[y]}],"text-decoration":["underline","overline","line-through","no-underline"],"text-decoration-style":[{decoration:[...Q(),"wavy"]}],"text-decoration-thickness":[{decoration:["auto","from-font",tr,Cr]}],"underline-offset":[{"underline-offset":["auto",tr,Me]}],"text-decoration-color":[{decoration:[e]}],"text-transform":["uppercase","lowercase","capitalize","normal-case"],"text-overflow":["truncate","text-ellipsis","text-clip"],"text-wrap":[{text:["wrap","nowrap","balance","pretty"]}],indent:[{indent:z()}],"vertical-align":[{align:["baseline","top","middle","bottom","text-top","text-bottom","sub","super",Me]}],whitespace:[{whitespace:["normal","nowrap","pre","pre-line","pre-wrap","break-spaces"]}],break:[{break:["normal","words","all","keep"]}],hyphens:[{hyphens:["none","manual","auto"]}],content:[{content:["none",Me]}],"bg-attachment":[{bg:["fixed","local","scroll"]}],"bg-clip":[{"bg-clip":["border","padding","content","text"]}],"bg-opacity":[{"bg-opacity":[y]}],"bg-origin":[{"bg-origin":["border","padding","content"]}],"bg-position":[{bg:[...ue(),J2]}],"bg-repeat":[{bg:["no-repeat",{repeat:["","x","y","round","space"]}]}],"bg-size":[{bg:["auto","cover","contain",X2]}],"bg-image":[{bg:["none",{"gradient-to":["t","tr","r","br","b","bl","l","tl"]},eC]}],"bg-color":[{bg:[e]}],"gradient-from-pos":[{from:[m]}],"gradient-via-pos":[{via:[m]}],"gradient-to-pos":[{to:[m]}],"gradient-from":[{from:[h]}],"gradient-via":[{via:[h]}],"gradient-to":[{to:[h]}],rounded:[{rounded:[s]}],"rounded-s":[{"rounded-s":[s]}],"rounded-e":[{"rounded-e":[s]}],"rounded-t":[{"rounded-t":[s]}],"rounded-r":[{"rounded-r":[s]}],"rounded-b":[{"rounded-b":[s]}],"rounded-l":[{"rounded-l":[s]}],"rounded-ss":[{"rounded-ss":[s]}],"rounded-se":[{"rounded-se":[s]}],"rounded-ee":[{"rounded-ee":[s]}],"rounded-es":[{"rounded-es":[s]}],"rounded-tl":[{"rounded-tl":[s]}],"rounded-tr":[{"rounded-tr":[s]}],"rounded-br":[{"rounded-br":[s]}],"rounded-bl":[{"rounded-bl":[s]}],"border-w":[{border:[i]}],"border-w-x":[{"border-x":[i]}],"border-w-y":[{"border-y":[i]}],"border-w-s":[{"border-s":[i]}],"border-w-e":[{"border-e":[i]}],"border-w-t":[{"border-t":[i]}],"border-w-r":[{"border-r":[i]}],"border-w-b":[{"border-b":[i]}],"border-w-l":[{"border-l":[i]}],"border-opacity":[{"border-opacity":[y]}],"border-style":[{border:[...Q(),"hidden"]}],"divide-x":[{"divide-x":[i]}],"divide-x-reverse":["divide-x-reverse"],"divide-y":[{"divide-y":[i]}],"divide-y-reverse":["divide-y-reverse"],"divide-opacity":[{"divide-opacity":[y]}],"divide-style":[{divide:Q()}],"border-color":[{border:[o]}],"border-color-x":[{"border-x":[o]}],"border-color-y":[{"border-y":[o]}],"border-color-s":[{"border-s":[o]}],"border-color-e":[{"border-e":[o]}],"border-color-t":[{"border-t":[o]}],"border-color-r":[{"border-r":[o]}],"border-color-b":[{"border-b":[o]}],"border-color-l":[{"border-l":[o]}],"divide-color":[{divide:[o]}],"outline-style":[{outline:["",...Q()]}],"outline-offset":[{"outline-offset":[tr,Me]}],"outline-w":[{outline:[tr,Cr]}],"outline-color":[{outline:[e]}],"ring-w":[{ring:re()}],"ring-w-inset":["ring-inset"],"ring-color":[{ring:[e]}],"ring-opacity":[{"ring-opacity":[y]}],"ring-offset-w":[{"ring-offset":[tr,Cr]}],"ring-offset-color":[{"ring-offset":[e]}],shadow:[{shadow:["","inner","none",Sr,tC]}],"shadow-color":[{shadow:[Ds]}],opacity:[{opacity:[y]}],"mix-blend":[{"mix-blend":[...j(),"plus-lighter","plus-darker"]}],"bg-blend":[{"bg-blend":j()}],filter:[{filter:["","none"]}],blur:[{blur:[n]}],brightness:[{brightness:[r]}],contrast:[{contrast:[l]}],"drop-shadow":[{"drop-shadow":["","none",Sr,Me]}],grayscale:[{grayscale:[u]}],"hue-rotate":[{"hue-rotate":[c]}],invert:[{invert:[d]}],saturate:[{saturate:[b]}],sepia:[{sepia:[C]}],"backdrop-filter":[{"backdrop-filter":["","none"]}],"backdrop-blur":[{"backdrop-blur":[n]}],"backdrop-brightness":[{"backdrop-brightness":[r]}],"backdrop-contrast":[{"backdrop-contrast":[l]}],"backdrop-grayscale":[{"backdrop-grayscale":[u]}],"backdrop-hue-rotate":[{"backdrop-hue-rotate":[c]}],"backdrop-invert":[{"backdrop-invert":[d]}],"backdrop-opacity":[{"backdrop-opacity":[y]}],"backdrop-saturate":[{"backdrop-saturate":[b]}],"backdrop-sepia":[{"backdrop-sepia":[C]}],"border-collapse":[{border:["collapse","separate"]}],"border-spacing":[{"border-spacing":[a]}],"border-spacing-x":[{"border-spacing-x":[a]}],"border-spacing-y":[{"border-spacing-y":[a]}],"table-layout":[{table:["auto","fixed"]}],caption:[{caption:["top","bottom"]}],transition:[{transition:["none","all","","colors","opacity","shadow","transform",Me]}],duration:[{duration:ae()}],ease:[{ease:["linear","in","out","in-out",Me]}],delay:[{delay:ae()}],animate:[{animate:["none","spin","ping","pulse","bounce",Me]}],transform:[{transform:["","gpu","none"]}],scale:[{scale:[w]}],"scale-x":[{"scale-x":[w]}],"scale-y":[{"scale-y":[w]}],rotate:[{rotate:[As,Me]}],"translate-x":[{"translate-x":[M]}],"translate-y":[{"translate-y":[M]}],"skew-x":[{"skew-x":[A]}],"skew-y":[{"skew-y":[A]}],"transform-origin":[{origin:["center","top","top-right","right","bottom-right","bottom","bottom-left","left","top-left",Me]}],accent:[{accent:["auto",e]}],appearance:[{appearance:["none","auto"]}],cursor:[{cursor:["auto","default","pointer","wait","text","move","help","not-allowed","none","context-menu","progress","cell","crosshair","vertical-text","alias","copy","no-drop","grab","grabbing","all-scroll","col-resize","row-resize","n-resize","e-resize","s-resize","w-resize","ne-resize","nw-resize","se-resize","sw-resize","ew-resize","ns-resize","nesw-resize","nwse-resize","zoom-in","zoom-out",Me]}],"caret-color":[{caret:[e]}],"pointer-events":[{"pointer-events":["none","auto"]}],resize:[{resize:["none","y","x",""]}],"scroll-behavior":[{scroll:["auto","smooth"]}],"scroll-m":[{"scroll-m":z()}],"scroll-mx":[{"scroll-mx":z()}],"scroll-my":[{"scroll-my":z()}],"scroll-ms":[{"scroll-ms":z()}],"scroll-me":[{"scroll-me":z()}],"scroll-mt":[{"scroll-mt":z()}],"scroll-mr":[{"scroll-mr":z()}],"scroll-mb":[{"scroll-mb":z()}],"scroll-ml":[{"scroll-ml":z()}],"scroll-p":[{"scroll-p":z()}],"scroll-px":[{"scroll-px":z()}],"scroll-py":[{"scroll-py":z()}],"scroll-ps":[{"scroll-ps":z()}],"scroll-pe":[{"scroll-pe":z()}],"scroll-pt":[{"scroll-pt":z()}],"scroll-pr":[{"scroll-pr":z()}],"scroll-pb":[{"scroll-pb":z()}],"scroll-pl":[{"scroll-pl":z()}],"snap-align":[{snap:["start","end","center","align-none"]}],"snap-stop":[{snap:["normal","always"]}],"snap-type":[{snap:["none","x","y","both"]}],"snap-strictness":[{snap:["mandatory","proximity"]}],touch:[{touch:["auto","none","manipulation"]}],"touch-x":[{"touch-pan":["x","left","right"]}],"touch-y":[{"touch-pan":["y","up","down"]}],"touch-pz":["touch-pinch-zoom"],select:[{select:["none","text","all","auto"]}],"will-change":[{"will-change":["auto","scroll","contents","transform",Me]}],fill:[{fill:[e,"none"]}],"stroke-w":[{stroke:[tr,Cr,Ec]}],stroke:[{stroke:[e,"none"]}],sr:["sr-only","not-sr-only"],"forced-color-adjust":[{"forced-color-adjust":["auto","none"]}]},conflictingClassGroups:{overflow:["overflow-x","overflow-y"],overscroll:["overscroll-x","overscroll-y"],inset:["inset-x","inset-y","start","end","top","right","bottom","left"],"inset-x":["right","left"],"inset-y":["top","bottom"],flex:["basis","grow","shrink"],gap:["gap-x","gap-y"],p:["px","py","ps","pe","pt","pr","pb","pl"],px:["pr","pl"],py:["pt","pb"],m:["mx","my","ms","me","mt","mr","mb","ml"],mx:["mr","ml"],my:["mt","mb"],size:["w","h"],"font-size":["leading"],"fvn-normal":["fvn-ordinal","fvn-slashed-zero","fvn-figure","fvn-spacing","fvn-fraction"],"fvn-ordinal":["fvn-normal"],"fvn-slashed-zero":["fvn-normal"],"fvn-figure":["fvn-normal"],"fvn-spacing":["fvn-normal"],"fvn-fraction":["fvn-normal"],"line-clamp":["display","overflow"],rounded:["rounded-s","rounded-e","rounded-t","rounded-r","rounded-b","rounded-l","rounded-ss","rounded-se","rounded-ee","rounded-es","rounded-tl","rounded-tr","rounded-br","rounded-bl"],"rounded-s":["rounded-ss","rounded-es"],"rounded-e":["rounded-se","rounded-ee"],"rounded-t":["rounded-tl","rounded-tr"],"rounded-r":["rounded-tr","rounded-br"],"rounded-b":["rounded-br","rounded-bl"],"rounded-l":["rounded-tl","rounded-bl"],"border-spacing":["border-spacing-x","border-spacing-y"],"border-w":["border-w-s","border-w-e","border-w-t","border-w-r","border-w-b","border-w-l"],"border-w-x":["border-w-r","border-w-l"],"border-w-y":["border-w-t","border-w-b"],"border-color":["border-color-s","border-color-e","border-color-t","border-color-r","border-color-b","border-color-l"],"border-color-x":["border-color-r","border-color-l"],"border-color-y":["border-color-t","border-color-b"],"scroll-m":["scroll-mx","scroll-my","scroll-ms","scroll-me","scroll-mt","scroll-mr","scroll-mb","scroll-ml"],"scroll-mx":["scroll-mr","scroll-ml"],"scroll-my":["scroll-mt","scroll-mb"],"scroll-p":["scroll-px","scroll-py","scroll-ps","scroll-pe","scroll-pt","scroll-pr","scroll-pb","scroll-pl"],"scroll-px":["scroll-pr","scroll-pl"],"scroll-py":["scroll-pt","scroll-pb"],touch:["touch-x","touch-y","touch-pz"],"touch-x":["touch"],"touch-y":["touch"],"touch-pz":["touch"]},conflictingClassGroupModifiers:{"font-size":["leading"]}}},aC=q2(sC);function xe(...e){return aC(My(e))}const iC={class:"relative w-full overflow-auto"},lC=I({__name:"Table",props:{class:{}},setup(e){const t=e;return(n,r)=>(S(),K("div",iC,[E("table",{class:Ee(f(xe)("w-full caption-bottom text-sm",t.class))},[V(n.$slots,"default")],2)]))}}),cC=I({__name:"TableBody",props:{class:{}},setup(e){const t=e;return(n,r)=>(S(),K("tbody",{class:Ee(f(xe)("[&_tr:last-child]:border-0",t.class))},[V(n.$slots,"default")],2))}}),Ac=I({__name:"TableCell",props:{class:{}},setup(e){const t=e;return(n,r)=>(S(),K("td",{class:Ee(f(xe)("p-2 align-middle [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-0.5",t.class))},[V(n.$slots,"default")],2))}}),Dc=I({__name:"TableHead",props:{class:{}},setup(e){const t=e;return(n,r)=>(S(),K("th",{class:Ee(f(xe)("h-10 px-2 text-left align-middle font-medium text-muted-foreground [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-0.5",t.class))},[V(n.$slots,"default")],2))}}),uC=I({__name:"TableHeader",props:{class:{}},setup(e){const t=e;return(n,r)=>(S(),K("thead",{class:Ee(f(xe)("[&_tr]:border-b",t.class))},[V(n.$slots,"default")],2))}}),Qh=I({__name:"TableRow",props:{class:{}},setup(e){const t=e;return(n,r)=>(S(),K("tr",{class:Ee(f(xe)("border-b transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted",t.class))},[V(n.$slots,"default")],2))}}),dC=I({__name:"TableCaption",props:{class:{}},setup(e){const t=e;return(n,r)=>(S(),K("caption",{class:Ee(f(xe)("mt-4 text-sm text-muted-foreground",t.class))},[V(n.$slots,"default")],2))}});/*! - * pinia v3.0.1 - * (c) 2025 Eduardo San Martin Morote - * @license MIT - */let Ly;const Dl=e=>Ly=e,Ny=Symbol();function Dd(e){return e&&typeof e=="object"&&Object.prototype.toString.call(e)==="[object Object]"&&typeof e.toJSON!="function"}var Zs;(function(e){e.direct="direct",e.patchObject="patch object",e.patchFunction="patch function"})(Zs||(Zs={}));function fC(){const e=pl(!0),t=e.run(()=>F({}));let n=[],r=[];const o=bl({install(s){Dl(o),o._a=s,s.provide(Ny,o),s.config.globalProperties.$pinia=o,r.forEach(a=>n.push(a)),r=[]},use(s){return this._a?n.push(s):r.push(s),this},_p:n,_a:null,_e:e,_s:new Map,state:t});return o}const zy=()=>{};function em(e,t,n,r=zy){e.push(t);const o=()=>{const s=e.indexOf(t);s>-1&&(e.splice(s,1),r())};return!n&&hl()&&ff(o),o}function Do(e,...t){e.slice().forEach(n=>{n(...t)})}const pC=e=>e(),tm=Symbol(),Tc=Symbol();function Td(e,t){e instanceof Map&&t instanceof Map?t.forEach((n,r)=>e.set(r,n)):e instanceof Set&&t instanceof Set&&t.forEach(e.add,e);for(const n in t){if(!t.hasOwnProperty(n))continue;const r=t[n],o=e[n];Dd(o)&&Dd(r)&&e.hasOwnProperty(n)&&!lt(r)&&!ur(r)?e[n]=Td(o,r):e[n]=r}return e}const hC=Symbol();function mC(e){return!Dd(e)||!e.hasOwnProperty(hC)}const{assign:Or}=Object;function gC(e){return!!(lt(e)&&e.effect)}function vC(e,t,n,r){const{state:o,actions:s,getters:a}=t,i=n.state.value[e];let l;function u(){i||(n.state.value[e]=o?o():{});const c=vt(n.state.value[e]);return Or(c,s,Object.keys(a||{}).reduce((d,p)=>(d[p]=bl($(()=>{Dl(n);const h=n._s.get(e);return a[p].call(h,h)})),d),{}))}return l=By(e,u,t,n,r,!0),l}function By(e,t,n={},r,o,s){let a;const i=Or({actions:{}},n),l={deep:!0};let u,c,d=[],p=[],h;const m=r.state.value[e];!s&&!m&&(r.state.value[e]={}),F({});let g;function v(M){let O;u=c=!1,typeof M=="function"?(M(r.state.value[e]),O={type:Zs.patchFunction,storeId:e,events:h}):(Td(r.state.value[e],M),O={type:Zs.patchObject,payload:M,storeId:e,events:h});const P=g=Symbol();it().then(()=>{g===P&&(u=!0)}),c=!0,Do(d,O,r.state.value[e])}const y=s?function(){const{state:O}=n,P=O?O():{};this.$patch(W=>{Or(W,P)})}:zy;function k(){a.stop(),d=[],p=[],r._s.delete(e)}const b=(M,O="")=>{if(tm in M)return M[Tc]=O,M;const P=function(){Dl(r);const W=Array.from(arguments),z=[],re=[];function B(j){z.push(j)}function ue(j){re.push(j)}Do(p,{args:W,name:P[Tc],store:C,after:B,onError:ue});let Q;try{Q=M.apply(this&&this.$id===e?this:C,W)}catch(j){throw Do(re,j),j}return Q instanceof Promise?Q.then(j=>(Do(z,j),j)).catch(j=>(Do(re,j),Promise.reject(j))):(Do(z,Q),Q)};return P[tm]=!0,P[Tc]=O,P},w={_p:r,$id:e,$onAction:em.bind(null,p),$patch:v,$reset:y,$subscribe(M,O={}){const P=em(d,M,O.detached,()=>W()),W=a.run(()=>Oe(()=>r.state.value[e],z=>{(O.flush==="sync"?c:u)&&M({storeId:e,type:Zs.direct,events:h},z)},Or({},l,O)));return P},$dispose:k},C=xo(w);r._s.set(e,C);const R=(r._a&&r._a.runWithContext||pC)(()=>r._e.run(()=>(a=pl()).run(()=>t({action:b}))));for(const M in R){const O=R[M];if(lt(O)&&!gC(O)||ur(O))s||(m&&mC(O)&&(lt(O)?O.value=m[M]:Td(O,m[M])),r.state.value[e][M]=O);else if(typeof O=="function"){const P=b(O,M);R[M]=P,i.actions[M]=O}}return Or(C,R),Or(ze(C),R),Object.defineProperty(C,"$state",{get:()=>r.state.value[e],set:M=>{v(O=>{Or(O,M)})}}),r._p.forEach(M=>{Or(C,a.run(()=>M({store:C,app:r._a,pinia:r,options:i})))}),m&&s&&n.hydrate&&n.hydrate(C.$state,m),u=!0,c=!0,C}/*! #__NO_SIDE_EFFECTS__ */function Wn(e,t,n){let r;const o=typeof t=="function";r=o?n:t;function s(a,i){const l=uw();return a=a||(l?qt(Ny,null):null),a&&Dl(a),a=Ly,a._s.has(e)||(o?By(e,t,r,a):vC(e,r,a)),a._s.get(e)}return s.$id=e,s}function yC(e){const t=ze(e),n={};for(const r in t){const o=t[r];o.effect?n[r]=$({get:()=>e[r],set(s){e[r]=s}}):(lt(o)||ur(o))&&(n[r]=_0(e,r))}return n}function qy(e,t){return function(){return e.apply(t,arguments)}}const{toString:bC}=Object.prototype,{getPrototypeOf:Af}=Object,{iterator:Tl,toStringTag:Vy}=Symbol,Ol=(e=>t=>{const n=bC.call(t);return e[n]||(e[n]=n.slice(8,-1).toLowerCase())})(Object.create(null)),Dn=e=>(e=e.toLowerCase(),t=>Ol(t)===e),Ml=e=>t=>typeof t===e,{isArray:us}=Array,ss=Ml("undefined");function Da(e){return e!==null&&!ss(e)&&e.constructor!==null&&!ss(e.constructor)&&jt(e.constructor.isBuffer)&&e.constructor.isBuffer(e)}const jy=Dn("ArrayBuffer");function _C(e){let t;return typeof ArrayBuffer<"u"&&ArrayBuffer.isView?t=ArrayBuffer.isView(e):t=e&&e.buffer&&jy(e.buffer),t}const xC=Ml("string"),jt=Ml("function"),Hy=Ml("number"),Ta=e=>e!==null&&typeof e=="object",wC=e=>e===!0||e===!1,wi=e=>{if(Ol(e)!=="object")return!1;const t=Af(e);return(t===null||t===Object.prototype||Object.getPrototypeOf(t)===null)&&!(Vy in e)&&!(Tl in e)},kC=e=>{if(!Ta(e)||Da(e))return!1;try{return Object.keys(e).length===0&&Object.getPrototypeOf(e)===Object.prototype}catch{return!1}},CC=Dn("Date"),SC=Dn("File"),EC=Dn("Blob"),AC=Dn("FileList"),DC=e=>Ta(e)&&jt(e.pipe),TC=e=>{let t;return e&&(typeof FormData=="function"&&e instanceof FormData||jt(e.append)&&((t=Ol(e))==="formdata"||t==="object"&&jt(e.toString)&&e.toString()==="[object FormData]"))},OC=Dn("URLSearchParams"),[MC,RC,PC,$C]=["ReadableStream","Request","Response","Headers"].map(Dn),FC=e=>e.trim?e.trim():e.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"");function Oa(e,t,{allOwnKeys:n=!1}={}){if(e===null||typeof e>"u")return;let r,o;if(typeof e!="object"&&(e=[e]),us(e))for(r=0,o=e.length;r0;)if(o=n[r],t===o.toLowerCase())return o;return null}const io=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:global,Wy=e=>!ss(e)&&e!==io;function Od(){const{caseless:e,skipUndefined:t}=Wy(this)&&this||{},n={},r=(o,s)=>{const a=e&&Uy(n,s)||s;wi(n[a])&&wi(o)?n[a]=Od(n[a],o):wi(o)?n[a]=Od({},o):us(o)?n[a]=o.slice():(!t||!ss(o))&&(n[a]=o)};for(let o=0,s=arguments.length;o(Oa(t,(o,s)=>{n&&jt(o)?e[s]=qy(o,n):e[s]=o},{allOwnKeys:r}),e),LC=e=>(e.charCodeAt(0)===65279&&(e=e.slice(1)),e),NC=(e,t,n,r)=>{e.prototype=Object.create(t.prototype,r),e.prototype.constructor=e,Object.defineProperty(e,"super",{value:t.prototype}),n&&Object.assign(e.prototype,n)},zC=(e,t,n,r)=>{let o,s,a;const i={};if(t=t||{},e==null)return t;do{for(o=Object.getOwnPropertyNames(e),s=o.length;s-- >0;)a=o[s],(!r||r(a,e,t))&&!i[a]&&(t[a]=e[a],i[a]=!0);e=n!==!1&&Af(e)}while(e&&(!n||n(e,t))&&e!==Object.prototype);return t},BC=(e,t,n)=>{e=String(e),(n===void 0||n>e.length)&&(n=e.length),n-=t.length;const r=e.indexOf(t,n);return r!==-1&&r===n},qC=e=>{if(!e)return null;if(us(e))return e;let t=e.length;if(!Hy(t))return null;const n=new Array(t);for(;t-- >0;)n[t]=e[t];return n},VC=(e=>t=>e&&t instanceof e)(typeof Uint8Array<"u"&&Af(Uint8Array)),jC=(e,t)=>{const r=(e&&e[Tl]).call(e);let o;for(;(o=r.next())&&!o.done;){const s=o.value;t.call(e,s[0],s[1])}},HC=(e,t)=>{let n;const r=[];for(;(n=e.exec(t))!==null;)r.push(n);return r},UC=Dn("HTMLFormElement"),WC=e=>e.toLowerCase().replace(/[-_\s]([a-z\d])(\w*)/g,function(n,r,o){return r.toUpperCase()+o}),nm=(({hasOwnProperty:e})=>(t,n)=>e.call(t,n))(Object.prototype),YC=Dn("RegExp"),Yy=(e,t)=>{const n=Object.getOwnPropertyDescriptors(e),r={};Oa(n,(o,s)=>{let a;(a=t(o,s,e))!==!1&&(r[s]=a||o)}),Object.defineProperties(e,r)},GC=e=>{Yy(e,(t,n)=>{if(jt(e)&&["arguments","caller","callee"].indexOf(n)!==-1)return!1;const r=e[n];if(jt(r)){if(t.enumerable=!1,"writable"in t){t.writable=!1;return}t.set||(t.set=()=>{throw Error("Can not rewrite read-only method '"+n+"'")})}})},KC=(e,t)=>{const n={},r=o=>{o.forEach(s=>{n[s]=!0})};return us(e)?r(e):r(String(e).split(t)),n},ZC=()=>{},XC=(e,t)=>e!=null&&Number.isFinite(e=+e)?e:t;function JC(e){return!!(e&&jt(e.append)&&e[Vy]==="FormData"&&e[Tl])}const QC=e=>{const t=new Array(10),n=(r,o)=>{if(Ta(r)){if(t.indexOf(r)>=0)return;if(Da(r))return r;if(!("toJSON"in r)){t[o]=r;const s=us(r)?[]:{};return Oa(r,(a,i)=>{const l=n(a,o+1);!ss(l)&&(s[i]=l)}),t[o]=void 0,s}}return r};return n(e,0)},eS=Dn("AsyncFunction"),tS=e=>e&&(Ta(e)||jt(e))&&jt(e.then)&&jt(e.catch),Gy=((e,t)=>e?setImmediate:t?((n,r)=>(io.addEventListener("message",({source:o,data:s})=>{o===io&&s===n&&r.length&&r.shift()()},!1),o=>{r.push(o),io.postMessage(n,"*")}))(`axios@${Math.random()}`,[]):n=>setTimeout(n))(typeof setImmediate=="function",jt(io.postMessage)),nS=typeof queueMicrotask<"u"?queueMicrotask.bind(io):typeof process<"u"&&process.nextTick||Gy,rS=e=>e!=null&&jt(e[Tl]),q={isArray:us,isArrayBuffer:jy,isBuffer:Da,isFormData:TC,isArrayBufferView:_C,isString:xC,isNumber:Hy,isBoolean:wC,isObject:Ta,isPlainObject:wi,isEmptyObject:kC,isReadableStream:MC,isRequest:RC,isResponse:PC,isHeaders:$C,isUndefined:ss,isDate:CC,isFile:SC,isBlob:EC,isRegExp:YC,isFunction:jt,isStream:DC,isURLSearchParams:OC,isTypedArray:VC,isFileList:AC,forEach:Oa,merge:Od,extend:IC,trim:FC,stripBOM:LC,inherits:NC,toFlatObject:zC,kindOf:Ol,kindOfTest:Dn,endsWith:BC,toArray:qC,forEachEntry:jC,matchAll:HC,isHTMLForm:UC,hasOwnProperty:nm,hasOwnProp:nm,reduceDescriptors:Yy,freezeMethods:GC,toObjectSet:KC,toCamelCase:WC,noop:ZC,toFiniteNumber:XC,findKey:Uy,global:io,isContextDefined:Wy,isSpecCompliantForm:JC,toJSONObject:QC,isAsyncFn:eS,isThenable:tS,setImmediate:Gy,asap:nS,isIterable:rS};function Te(e,t,n,r,o){Error.call(this),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=new Error().stack,this.message=e,this.name="AxiosError",t&&(this.code=t),n&&(this.config=n),r&&(this.request=r),o&&(this.response=o,this.status=o.status?o.status:null)}q.inherits(Te,Error,{toJSON:function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:q.toJSONObject(this.config),code:this.code,status:this.status}}});const Ky=Te.prototype,Zy={};["ERR_BAD_OPTION_VALUE","ERR_BAD_OPTION","ECONNABORTED","ETIMEDOUT","ERR_NETWORK","ERR_FR_TOO_MANY_REDIRECTS","ERR_DEPRECATED","ERR_BAD_RESPONSE","ERR_BAD_REQUEST","ERR_CANCELED","ERR_NOT_SUPPORT","ERR_INVALID_URL"].forEach(e=>{Zy[e]={value:e}});Object.defineProperties(Te,Zy);Object.defineProperty(Ky,"isAxiosError",{value:!0});Te.from=(e,t,n,r,o,s)=>{const a=Object.create(Ky);q.toFlatObject(e,a,function(c){return c!==Error.prototype},u=>u!=="isAxiosError");const i=e&&e.message?e.message:"Error",l=t==null&&e?e.code:t;return Te.call(a,i,l,n,r,o),e&&a.cause==null&&Object.defineProperty(a,"cause",{value:e,configurable:!0}),a.name=e&&e.name||"Error",s&&Object.assign(a,s),a};const oS=null;function Md(e){return q.isPlainObject(e)||q.isArray(e)}function Xy(e){return q.endsWith(e,"[]")?e.slice(0,-2):e}function rm(e,t,n){return e?e.concat(t).map(function(o,s){return o=Xy(o),!n&&s?"["+o+"]":o}).join(n?".":""):t}function sS(e){return q.isArray(e)&&!e.some(Md)}const aS=q.toFlatObject(q,{},null,function(t){return/^is[A-Z]/.test(t)});function Rl(e,t,n){if(!q.isObject(e))throw new TypeError("target must be an object");t=t||new FormData,n=q.toFlatObject(n,{metaTokens:!0,dots:!1,indexes:!1},!1,function(g,v){return!q.isUndefined(v[g])});const r=n.metaTokens,o=n.visitor||c,s=n.dots,a=n.indexes,l=(n.Blob||typeof Blob<"u"&&Blob)&&q.isSpecCompliantForm(t);if(!q.isFunction(o))throw new TypeError("visitor must be a function");function u(m){if(m===null)return"";if(q.isDate(m))return m.toISOString();if(q.isBoolean(m))return m.toString();if(!l&&q.isBlob(m))throw new Te("Blob is not supported. Use a Buffer instead.");return q.isArrayBuffer(m)||q.isTypedArray(m)?l&&typeof Blob=="function"?new Blob([m]):Buffer.from(m):m}function c(m,g,v){let y=m;if(m&&!v&&typeof m=="object"){if(q.endsWith(g,"{}"))g=r?g:g.slice(0,-2),m=JSON.stringify(m);else if(q.isArray(m)&&sS(m)||(q.isFileList(m)||q.endsWith(g,"[]"))&&(y=q.toArray(m)))return g=Xy(g),y.forEach(function(b,w){!(q.isUndefined(b)||b===null)&&t.append(a===!0?rm([g],w,s):a===null?g:g+"[]",u(b))}),!1}return Md(m)?!0:(t.append(rm(v,g,s),u(m)),!1)}const d=[],p=Object.assign(aS,{defaultVisitor:c,convertValue:u,isVisitable:Md});function h(m,g){if(!q.isUndefined(m)){if(d.indexOf(m)!==-1)throw Error("Circular reference detected in "+g.join("."));d.push(m),q.forEach(m,function(y,k){(!(q.isUndefined(y)||y===null)&&o.call(t,y,q.isString(k)?k.trim():k,g,p))===!0&&h(y,g?g.concat(k):[k])}),d.pop()}}if(!q.isObject(e))throw new TypeError("data must be an object");return h(e),t}function om(e){const t={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+","%00":"\0"};return encodeURIComponent(e).replace(/[!'()~]|%20|%00/g,function(r){return t[r]})}function Df(e,t){this._pairs=[],e&&Rl(e,this,t)}const Jy=Df.prototype;Jy.append=function(t,n){this._pairs.push([t,n])};Jy.toString=function(t){const n=t?function(r){return t.call(this,r,om)}:om;return this._pairs.map(function(o){return n(o[0])+"="+n(o[1])},"").join("&")};function iS(e){return encodeURIComponent(e).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+")}function Qy(e,t,n){if(!t)return e;const r=n&&n.encode||iS;q.isFunction(n)&&(n={serialize:n});const o=n&&n.serialize;let s;if(o?s=o(t,n):s=q.isURLSearchParams(t)?t.toString():new Df(t,n).toString(r),s){const a=e.indexOf("#");a!==-1&&(e=e.slice(0,a)),e+=(e.indexOf("?")===-1?"?":"&")+s}return e}class sm{constructor(){this.handlers=[]}use(t,n,r){return this.handlers.push({fulfilled:t,rejected:n,synchronous:r?r.synchronous:!1,runWhen:r?r.runWhen:null}),this.handlers.length-1}eject(t){this.handlers[t]&&(this.handlers[t]=null)}clear(){this.handlers&&(this.handlers=[])}forEach(t){q.forEach(this.handlers,function(r){r!==null&&t(r)})}}const e1={silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1},lS=typeof URLSearchParams<"u"?URLSearchParams:Df,cS=typeof FormData<"u"?FormData:null,uS=typeof Blob<"u"?Blob:null,dS={isBrowser:!0,classes:{URLSearchParams:lS,FormData:cS,Blob:uS},protocols:["http","https","file","blob","url","data"]},Tf=typeof window<"u"&&typeof document<"u",Rd=typeof navigator=="object"&&navigator||void 0,fS=Tf&&(!Rd||["ReactNative","NativeScript","NS"].indexOf(Rd.product)<0),pS=typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope&&typeof self.importScripts=="function",hS=Tf&&window.location.href||"http://localhost",mS=Object.freeze(Object.defineProperty({__proto__:null,hasBrowserEnv:Tf,hasStandardBrowserEnv:fS,hasStandardBrowserWebWorkerEnv:pS,navigator:Rd,origin:hS},Symbol.toStringTag,{value:"Module"})),Tt={...mS,...dS};function gS(e,t){return Rl(e,new Tt.classes.URLSearchParams,{visitor:function(n,r,o,s){return Tt.isNode&&q.isBuffer(n)?(this.append(r,n.toString("base64")),!1):s.defaultVisitor.apply(this,arguments)},...t})}function vS(e){return q.matchAll(/\w+|\[(\w*)]/g,e).map(t=>t[0]==="[]"?"":t[1]||t[0])}function yS(e){const t={},n=Object.keys(e);let r;const o=n.length;let s;for(r=0;r=n.length;return a=!a&&q.isArray(o)?o.length:a,l?(q.hasOwnProp(o,a)?o[a]=[o[a],r]:o[a]=r,!i):((!o[a]||!q.isObject(o[a]))&&(o[a]=[]),t(n,r,o[a],s)&&q.isArray(o[a])&&(o[a]=yS(o[a])),!i)}if(q.isFormData(e)&&q.isFunction(e.entries)){const n={};return q.forEachEntry(e,(r,o)=>{t(vS(r),o,n,0)}),n}return null}function bS(e,t,n){if(q.isString(e))try{return(t||JSON.parse)(e),q.trim(e)}catch(r){if(r.name!=="SyntaxError")throw r}return(n||JSON.stringify)(e)}const Ma={transitional:e1,adapter:["xhr","http","fetch"],transformRequest:[function(t,n){const r=n.getContentType()||"",o=r.indexOf("application/json")>-1,s=q.isObject(t);if(s&&q.isHTMLForm(t)&&(t=new FormData(t)),q.isFormData(t))return o?JSON.stringify(t1(t)):t;if(q.isArrayBuffer(t)||q.isBuffer(t)||q.isStream(t)||q.isFile(t)||q.isBlob(t)||q.isReadableStream(t))return t;if(q.isArrayBufferView(t))return t.buffer;if(q.isURLSearchParams(t))return n.setContentType("application/x-www-form-urlencoded;charset=utf-8",!1),t.toString();let i;if(s){if(r.indexOf("application/x-www-form-urlencoded")>-1)return gS(t,this.formSerializer).toString();if((i=q.isFileList(t))||r.indexOf("multipart/form-data")>-1){const l=this.env&&this.env.FormData;return Rl(i?{"files[]":t}:t,l&&new l,this.formSerializer)}}return s||o?(n.setContentType("application/json",!1),bS(t)):t}],transformResponse:[function(t){const n=this.transitional||Ma.transitional,r=n&&n.forcedJSONParsing,o=this.responseType==="json";if(q.isResponse(t)||q.isReadableStream(t))return t;if(t&&q.isString(t)&&(r&&!this.responseType||o)){const a=!(n&&n.silentJSONParsing)&&o;try{return JSON.parse(t,this.parseReviver)}catch(i){if(a)throw i.name==="SyntaxError"?Te.from(i,Te.ERR_BAD_RESPONSE,this,null,this.response):i}}return t}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,env:{FormData:Tt.classes.FormData,Blob:Tt.classes.Blob},validateStatus:function(t){return t>=200&&t<300},headers:{common:{Accept:"application/json, text/plain, */*","Content-Type":void 0}}};q.forEach(["delete","get","head","post","put","patch"],e=>{Ma.headers[e]={}});const _S=q.toObjectSet(["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"]),xS=e=>{const t={};let n,r,o;return e&&e.split(` -`).forEach(function(a){o=a.indexOf(":"),n=a.substring(0,o).trim().toLowerCase(),r=a.substring(o+1).trim(),!(!n||t[n]&&_S[n])&&(n==="set-cookie"?t[n]?t[n].push(r):t[n]=[r]:t[n]=t[n]?t[n]+", "+r:r)}),t},am=Symbol("internals");function Ts(e){return e&&String(e).trim().toLowerCase()}function ki(e){return e===!1||e==null?e:q.isArray(e)?e.map(ki):String(e)}function wS(e){const t=Object.create(null),n=/([^\s,;=]+)\s*(?:=\s*([^,;]+))?/g;let r;for(;r=n.exec(e);)t[r[1]]=r[2];return t}const kS=e=>/^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(e.trim());function Oc(e,t,n,r,o){if(q.isFunction(r))return r.call(this,t,n);if(o&&(t=n),!!q.isString(t)){if(q.isString(r))return t.indexOf(r)!==-1;if(q.isRegExp(r))return r.test(t)}}function CS(e){return e.trim().toLowerCase().replace(/([a-z\d])(\w*)/g,(t,n,r)=>n.toUpperCase()+r)}function SS(e,t){const n=q.toCamelCase(" "+t);["get","set","has"].forEach(r=>{Object.defineProperty(e,r+n,{value:function(o,s,a){return this[r].call(this,t,o,s,a)},configurable:!0})})}let Ht=class{constructor(t){t&&this.set(t)}set(t,n,r){const o=this;function s(i,l,u){const c=Ts(l);if(!c)throw new Error("header name must be a non-empty string");const d=q.findKey(o,c);(!d||o[d]===void 0||u===!0||u===void 0&&o[d]!==!1)&&(o[d||l]=ki(i))}const a=(i,l)=>q.forEach(i,(u,c)=>s(u,c,l));if(q.isPlainObject(t)||t instanceof this.constructor)a(t,n);else if(q.isString(t)&&(t=t.trim())&&!kS(t))a(xS(t),n);else if(q.isObject(t)&&q.isIterable(t)){let i={},l,u;for(const c of t){if(!q.isArray(c))throw TypeError("Object iterator must return a key-value pair");i[u=c[0]]=(l=i[u])?q.isArray(l)?[...l,c[1]]:[l,c[1]]:c[1]}a(i,n)}else t!=null&&s(n,t,r);return this}get(t,n){if(t=Ts(t),t){const r=q.findKey(this,t);if(r){const o=this[r];if(!n)return o;if(n===!0)return wS(o);if(q.isFunction(n))return n.call(this,o,r);if(q.isRegExp(n))return n.exec(o);throw new TypeError("parser must be boolean|regexp|function")}}}has(t,n){if(t=Ts(t),t){const r=q.findKey(this,t);return!!(r&&this[r]!==void 0&&(!n||Oc(this,this[r],r,n)))}return!1}delete(t,n){const r=this;let o=!1;function s(a){if(a=Ts(a),a){const i=q.findKey(r,a);i&&(!n||Oc(r,r[i],i,n))&&(delete r[i],o=!0)}}return q.isArray(t)?t.forEach(s):s(t),o}clear(t){const n=Object.keys(this);let r=n.length,o=!1;for(;r--;){const s=n[r];(!t||Oc(this,this[s],s,t,!0))&&(delete this[s],o=!0)}return o}normalize(t){const n=this,r={};return q.forEach(this,(o,s)=>{const a=q.findKey(r,s);if(a){n[a]=ki(o),delete n[s];return}const i=t?CS(s):String(s).trim();i!==s&&delete n[s],n[i]=ki(o),r[i]=!0}),this}concat(...t){return this.constructor.concat(this,...t)}toJSON(t){const n=Object.create(null);return q.forEach(this,(r,o)=>{r!=null&&r!==!1&&(n[o]=t&&q.isArray(r)?r.join(", "):r)}),n}[Symbol.iterator](){return Object.entries(this.toJSON())[Symbol.iterator]()}toString(){return Object.entries(this.toJSON()).map(([t,n])=>t+": "+n).join(` -`)}getSetCookie(){return this.get("set-cookie")||[]}get[Symbol.toStringTag](){return"AxiosHeaders"}static from(t){return t instanceof this?t:new this(t)}static concat(t,...n){const r=new this(t);return n.forEach(o=>r.set(o)),r}static accessor(t){const r=(this[am]=this[am]={accessors:{}}).accessors,o=this.prototype;function s(a){const i=Ts(a);r[i]||(SS(o,a),r[i]=!0)}return q.isArray(t)?t.forEach(s):s(t),this}};Ht.accessor(["Content-Type","Content-Length","Accept","Accept-Encoding","User-Agent","Authorization"]);q.reduceDescriptors(Ht.prototype,({value:e},t)=>{let n=t[0].toUpperCase()+t.slice(1);return{get:()=>e,set(r){this[n]=r}}});q.freezeMethods(Ht);function Mc(e,t){const n=this||Ma,r=t||n,o=Ht.from(r.headers);let s=r.data;return q.forEach(e,function(i){s=i.call(n,s,o.normalize(),t?t.status:void 0)}),o.normalize(),s}function n1(e){return!!(e&&e.__CANCEL__)}function ds(e,t,n){Te.call(this,e??"canceled",Te.ERR_CANCELED,t,n),this.name="CanceledError"}q.inherits(ds,Te,{__CANCEL__:!0});function r1(e,t,n){const r=n.config.validateStatus;!n.status||!r||r(n.status)?e(n):t(new Te("Request failed with status code "+n.status,[Te.ERR_BAD_REQUEST,Te.ERR_BAD_RESPONSE][Math.floor(n.status/100)-4],n.config,n.request,n))}function ES(e){const t=/^([-+\w]{1,25})(:?\/\/|:)/.exec(e);return t&&t[1]||""}function AS(e,t){e=e||10;const n=new Array(e),r=new Array(e);let o=0,s=0,a;return t=t!==void 0?t:1e3,function(l){const u=Date.now(),c=r[s];a||(a=u),n[o]=l,r[o]=u;let d=s,p=0;for(;d!==o;)p+=n[d++],d=d%e;if(o=(o+1)%e,o===s&&(s=(s+1)%e),u-a{n=c,o=null,s&&(clearTimeout(s),s=null),e(...u)};return[(...u)=>{const c=Date.now(),d=c-n;d>=r?a(u,c):(o=u,s||(s=setTimeout(()=>{s=null,a(o)},r-d)))},()=>o&&a(o)]}const ji=(e,t,n=3)=>{let r=0;const o=AS(50,250);return DS(s=>{const a=s.loaded,i=s.lengthComputable?s.total:void 0,l=a-r,u=o(l),c=a<=i;r=a;const d={loaded:a,total:i,progress:i?a/i:void 0,bytes:l,rate:u||void 0,estimated:u&&i&&c?(i-a)/u:void 0,event:s,lengthComputable:i!=null,[t?"download":"upload"]:!0};e(d)},n)},im=(e,t)=>{const n=e!=null;return[r=>t[0]({lengthComputable:n,total:e,loaded:r}),t[1]]},lm=e=>(...t)=>q.asap(()=>e(...t)),TS=Tt.hasStandardBrowserEnv?((e,t)=>n=>(n=new URL(n,Tt.origin),e.protocol===n.protocol&&e.host===n.host&&(t||e.port===n.port)))(new URL(Tt.origin),Tt.navigator&&/(msie|trident)/i.test(Tt.navigator.userAgent)):()=>!0,OS=Tt.hasStandardBrowserEnv?{write(e,t,n,r,o,s){const a=[e+"="+encodeURIComponent(t)];q.isNumber(n)&&a.push("expires="+new Date(n).toGMTString()),q.isString(r)&&a.push("path="+r),q.isString(o)&&a.push("domain="+o),s===!0&&a.push("secure"),document.cookie=a.join("; ")},read(e){const t=document.cookie.match(new RegExp("(^|;\\s*)("+e+")=([^;]*)"));return t?decodeURIComponent(t[3]):null},remove(e){this.write(e,"",Date.now()-864e5)}}:{write(){},read(){return null},remove(){}};function MS(e){return/^([a-z][a-z\d+\-.]*:)?\/\//i.test(e)}function RS(e,t){return t?e.replace(/\/?\/$/,"")+"/"+t.replace(/^\/+/,""):e}function o1(e,t,n){let r=!MS(t);return e&&(r||n==!1)?RS(e,t):t}const cm=e=>e instanceof Ht?{...e}:e;function vo(e,t){t=t||{};const n={};function r(u,c,d,p){return q.isPlainObject(u)&&q.isPlainObject(c)?q.merge.call({caseless:p},u,c):q.isPlainObject(c)?q.merge({},c):q.isArray(c)?c.slice():c}function o(u,c,d,p){if(q.isUndefined(c)){if(!q.isUndefined(u))return r(void 0,u,d,p)}else return r(u,c,d,p)}function s(u,c){if(!q.isUndefined(c))return r(void 0,c)}function a(u,c){if(q.isUndefined(c)){if(!q.isUndefined(u))return r(void 0,u)}else return r(void 0,c)}function i(u,c,d){if(d in t)return r(u,c);if(d in e)return r(void 0,u)}const l={url:s,method:s,data:s,baseURL:a,transformRequest:a,transformResponse:a,paramsSerializer:a,timeout:a,timeoutMessage:a,withCredentials:a,withXSRFToken:a,adapter:a,responseType:a,xsrfCookieName:a,xsrfHeaderName:a,onUploadProgress:a,onDownloadProgress:a,decompress:a,maxContentLength:a,maxBodyLength:a,beforeRedirect:a,transport:a,httpAgent:a,httpsAgent:a,cancelToken:a,socketPath:a,responseEncoding:a,validateStatus:i,headers:(u,c,d)=>o(cm(u),cm(c),d,!0)};return q.forEach(Object.keys({...e,...t}),function(c){const d=l[c]||o,p=d(e[c],t[c],c);q.isUndefined(p)&&d!==i||(n[c]=p)}),n}const s1=e=>{const t=vo({},e);let{data:n,withXSRFToken:r,xsrfHeaderName:o,xsrfCookieName:s,headers:a,auth:i}=t;if(t.headers=a=Ht.from(a),t.url=Qy(o1(t.baseURL,t.url,t.allowAbsoluteUrls),e.params,e.paramsSerializer),i&&a.set("Authorization","Basic "+btoa((i.username||"")+":"+(i.password?unescape(encodeURIComponent(i.password)):""))),q.isFormData(n)){if(Tt.hasStandardBrowserEnv||Tt.hasStandardBrowserWebWorkerEnv)a.setContentType(void 0);else if(q.isFunction(n.getHeaders)){const l=n.getHeaders(),u=["content-type","content-length"];Object.entries(l).forEach(([c,d])=>{u.includes(c.toLowerCase())&&a.set(c,d)})}}if(Tt.hasStandardBrowserEnv&&(r&&q.isFunction(r)&&(r=r(t)),r||r!==!1&&TS(t.url))){const l=o&&s&&OS.read(s);l&&a.set(o,l)}return t},PS=typeof XMLHttpRequest<"u",$S=PS&&function(e){return new Promise(function(n,r){const o=s1(e);let s=o.data;const a=Ht.from(o.headers).normalize();let{responseType:i,onUploadProgress:l,onDownloadProgress:u}=o,c,d,p,h,m;function g(){h&&h(),m&&m(),o.cancelToken&&o.cancelToken.unsubscribe(c),o.signal&&o.signal.removeEventListener("abort",c)}let v=new XMLHttpRequest;v.open(o.method.toUpperCase(),o.url,!0),v.timeout=o.timeout;function y(){if(!v)return;const b=Ht.from("getAllResponseHeaders"in v&&v.getAllResponseHeaders()),C={data:!i||i==="text"||i==="json"?v.responseText:v.response,status:v.status,statusText:v.statusText,headers:b,config:e,request:v};r1(function(R){n(R),g()},function(R){r(R),g()},C),v=null}"onloadend"in v?v.onloadend=y:v.onreadystatechange=function(){!v||v.readyState!==4||v.status===0&&!(v.responseURL&&v.responseURL.indexOf("file:")===0)||setTimeout(y)},v.onabort=function(){v&&(r(new Te("Request aborted",Te.ECONNABORTED,e,v)),v=null)},v.onerror=function(w){const C=w&&w.message?w.message:"Network Error",A=new Te(C,Te.ERR_NETWORK,e,v);A.event=w||null,r(A),v=null},v.ontimeout=function(){let w=o.timeout?"timeout of "+o.timeout+"ms exceeded":"timeout exceeded";const C=o.transitional||e1;o.timeoutErrorMessage&&(w=o.timeoutErrorMessage),r(new Te(w,C.clarifyTimeoutError?Te.ETIMEDOUT:Te.ECONNABORTED,e,v)),v=null},s===void 0&&a.setContentType(null),"setRequestHeader"in v&&q.forEach(a.toJSON(),function(w,C){v.setRequestHeader(C,w)}),q.isUndefined(o.withCredentials)||(v.withCredentials=!!o.withCredentials),i&&i!=="json"&&(v.responseType=o.responseType),u&&([p,m]=ji(u,!0),v.addEventListener("progress",p)),l&&v.upload&&([d,h]=ji(l),v.upload.addEventListener("progress",d),v.upload.addEventListener("loadend",h)),(o.cancelToken||o.signal)&&(c=b=>{v&&(r(!b||b.type?new ds(null,e,v):b),v.abort(),v=null)},o.cancelToken&&o.cancelToken.subscribe(c),o.signal&&(o.signal.aborted?c():o.signal.addEventListener("abort",c)));const k=ES(o.url);if(k&&Tt.protocols.indexOf(k)===-1){r(new Te("Unsupported protocol "+k+":",Te.ERR_BAD_REQUEST,e));return}v.send(s||null)})},FS=(e,t)=>{const{length:n}=e=e?e.filter(Boolean):[];if(t||n){let r=new AbortController,o;const s=function(u){if(!o){o=!0,i();const c=u instanceof Error?u:this.reason;r.abort(c instanceof Te?c:new ds(c instanceof Error?c.message:c))}};let a=t&&setTimeout(()=>{a=null,s(new Te(`timeout ${t} of ms exceeded`,Te.ETIMEDOUT))},t);const i=()=>{e&&(a&&clearTimeout(a),a=null,e.forEach(u=>{u.unsubscribe?u.unsubscribe(s):u.removeEventListener("abort",s)}),e=null)};e.forEach(u=>u.addEventListener("abort",s));const{signal:l}=r;return l.unsubscribe=()=>q.asap(i),l}},IS=function*(e,t){let n=e.byteLength;if(n{const o=LS(e,t);let s=0,a,i=l=>{a||(a=!0,r&&r(l))};return new ReadableStream({async pull(l){try{const{done:u,value:c}=await o.next();if(u){i(),l.close();return}let d=c.byteLength;if(n){let p=s+=d;n(p)}l.enqueue(new Uint8Array(c))}catch(u){throw i(u),u}},cancel(l){return i(l),o.return()}},{highWaterMark:2})},dm=64*1024,{isFunction:Xa}=q,zS=(({Request:e,Response:t})=>({Request:e,Response:t}))(q.global),{ReadableStream:fm,TextEncoder:pm}=q.global,hm=(e,...t)=>{try{return!!e(...t)}catch{return!1}},BS=e=>{e=q.merge.call({skipUndefined:!0},zS,e);const{fetch:t,Request:n,Response:r}=e,o=t?Xa(t):typeof fetch=="function",s=Xa(n),a=Xa(r);if(!o)return!1;const i=o&&Xa(fm),l=o&&(typeof pm=="function"?(m=>g=>m.encode(g))(new pm):async m=>new Uint8Array(await new n(m).arrayBuffer())),u=s&&i&&hm(()=>{let m=!1;const g=new n(Tt.origin,{body:new fm,method:"POST",get duplex(){return m=!0,"half"}}).headers.has("Content-Type");return m&&!g}),c=a&&i&&hm(()=>q.isReadableStream(new r("").body)),d={stream:c&&(m=>m.body)};o&&["text","arrayBuffer","blob","formData","stream"].forEach(m=>{!d[m]&&(d[m]=(g,v)=>{let y=g&&g[m];if(y)return y.call(g);throw new Te(`Response type '${m}' is not supported`,Te.ERR_NOT_SUPPORT,v)})});const p=async m=>{if(m==null)return 0;if(q.isBlob(m))return m.size;if(q.isSpecCompliantForm(m))return(await new n(Tt.origin,{method:"POST",body:m}).arrayBuffer()).byteLength;if(q.isArrayBufferView(m)||q.isArrayBuffer(m))return m.byteLength;if(q.isURLSearchParams(m)&&(m=m+""),q.isString(m))return(await l(m)).byteLength},h=async(m,g)=>{const v=q.toFiniteNumber(m.getContentLength());return v??p(g)};return async m=>{let{url:g,method:v,data:y,signal:k,cancelToken:b,timeout:w,onDownloadProgress:C,onUploadProgress:A,responseType:R,headers:M,withCredentials:O="same-origin",fetchOptions:P}=s1(m),W=t||fetch;R=R?(R+"").toLowerCase():"text";let z=FS([k,b&&b.toAbortSignal()],w),re=null;const B=z&&z.unsubscribe&&(()=>{z.unsubscribe()});let ue;try{if(A&&u&&v!=="get"&&v!=="head"&&(ue=await h(M,y))!==0){let ae=new n(g,{method:"POST",body:y,duplex:"half"}),pe;if(q.isFormData(y)&&(pe=ae.headers.get("content-type"))&&M.setContentType(pe),ae.body){const[Le,Je]=im(ue,ji(lm(A)));y=um(ae.body,dm,Le,Je)}}q.isString(O)||(O=O?"include":"omit");const Q=s&&"credentials"in n.prototype,j={...P,signal:z,method:v.toUpperCase(),headers:M.normalize().toJSON(),body:y,duplex:"half",credentials:Q?O:void 0};re=s&&new n(g,j);let Z=await(s?W(re,P):W(g,j));const H=c&&(R==="stream"||R==="response");if(c&&(C||H&&B)){const ae={};["status","statusText","headers"].forEach(Ue=>{ae[Ue]=Z[Ue]});const pe=q.toFiniteNumber(Z.headers.get("content-length")),[Le,Je]=C&&im(pe,ji(lm(C),!0))||[];Z=new r(um(Z.body,dm,Le,()=>{Je&&Je(),B&&B()}),ae)}R=R||"text";let U=await d[q.findKey(d,R)||"text"](Z,m);return!H&&B&&B(),await new Promise((ae,pe)=>{r1(ae,pe,{data:U,headers:Ht.from(Z.headers),status:Z.status,statusText:Z.statusText,config:m,request:re})})}catch(Q){throw B&&B(),Q&&Q.name==="TypeError"&&/Load failed|fetch/i.test(Q.message)?Object.assign(new Te("Network Error",Te.ERR_NETWORK,m,re),{cause:Q.cause||Q}):Te.from(Q,Q&&Q.code,m,re)}}},qS=new Map,a1=e=>{let t=e?e.env:{};const{fetch:n,Request:r,Response:o}=t,s=[r,o,n];let a=s.length,i=a,l,u,c=qS;for(;i--;)l=s[i],u=c.get(l),u===void 0&&c.set(l,u=i?new Map:BS(t)),c=u;return u};a1();const Pd={http:oS,xhr:$S,fetch:{get:a1}};q.forEach(Pd,(e,t)=>{if(e){try{Object.defineProperty(e,"name",{value:t})}catch{}Object.defineProperty(e,"adapterName",{value:t})}});const mm=e=>`- ${e}`,VS=e=>q.isFunction(e)||e===null||e===!1,i1={getAdapter:(e,t)=>{e=q.isArray(e)?e:[e];const{length:n}=e;let r,o;const s={};for(let a=0;a`adapter ${l} `+(u===!1?"is not supported by the environment":"is not available in the build"));let i=n?a.length>1?`since : -`+a.map(mm).join(` -`):" "+mm(a[0]):"as no adapter specified";throw new Te("There is no suitable adapter to dispatch the request "+i,"ERR_NOT_SUPPORT")}return o},adapters:Pd};function Rc(e){if(e.cancelToken&&e.cancelToken.throwIfRequested(),e.signal&&e.signal.aborted)throw new ds(null,e)}function gm(e){return Rc(e),e.headers=Ht.from(e.headers),e.data=Mc.call(e,e.transformRequest),["post","put","patch"].indexOf(e.method)!==-1&&e.headers.setContentType("application/x-www-form-urlencoded",!1),i1.getAdapter(e.adapter||Ma.adapter,e)(e).then(function(r){return Rc(e),r.data=Mc.call(e,e.transformResponse,r),r.headers=Ht.from(r.headers),r},function(r){return n1(r)||(Rc(e),r&&r.response&&(r.response.data=Mc.call(e,e.transformResponse,r.response),r.response.headers=Ht.from(r.response.headers))),Promise.reject(r)})}const l1="1.12.2",Pl={};["object","boolean","number","function","string","symbol"].forEach((e,t)=>{Pl[e]=function(r){return typeof r===e||"a"+(t<1?"n ":" ")+e}});const vm={};Pl.transitional=function(t,n,r){function o(s,a){return"[Axios v"+l1+"] Transitional option '"+s+"'"+a+(r?". "+r:"")}return(s,a,i)=>{if(t===!1)throw new Te(o(a," has been removed"+(n?" in "+n:"")),Te.ERR_DEPRECATED);return n&&!vm[a]&&(vm[a]=!0,console.warn(o(a," has been deprecated since v"+n+" and will be removed in the near future"))),t?t(s,a,i):!0}};Pl.spelling=function(t){return(n,r)=>(console.warn(`${r} is likely a misspelling of ${t}`),!0)};function jS(e,t,n){if(typeof e!="object")throw new Te("options must be an object",Te.ERR_BAD_OPTION_VALUE);const r=Object.keys(e);let o=r.length;for(;o-- >0;){const s=r[o],a=t[s];if(a){const i=e[s],l=i===void 0||a(i,s,e);if(l!==!0)throw new Te("option "+s+" must be "+l,Te.ERR_BAD_OPTION_VALUE);continue}if(n!==!0)throw new Te("Unknown option "+s,Te.ERR_BAD_OPTION)}}const Ci={assertOptions:jS,validators:Pl},Fn=Ci.validators;let ho=class{constructor(t){this.defaults=t||{},this.interceptors={request:new sm,response:new sm}}async request(t,n){try{return await this._request(t,n)}catch(r){if(r instanceof Error){let o={};Error.captureStackTrace?Error.captureStackTrace(o):o=new Error;const s=o.stack?o.stack.replace(/^.+\n/,""):"";try{r.stack?s&&!String(r.stack).endsWith(s.replace(/^.+\n.+\n/,""))&&(r.stack+=` -`+s):r.stack=s}catch{}}throw r}}_request(t,n){typeof t=="string"?(n=n||{},n.url=t):n=t||{},n=vo(this.defaults,n);const{transitional:r,paramsSerializer:o,headers:s}=n;r!==void 0&&Ci.assertOptions(r,{silentJSONParsing:Fn.transitional(Fn.boolean),forcedJSONParsing:Fn.transitional(Fn.boolean),clarifyTimeoutError:Fn.transitional(Fn.boolean)},!1),o!=null&&(q.isFunction(o)?n.paramsSerializer={serialize:o}:Ci.assertOptions(o,{encode:Fn.function,serialize:Fn.function},!0)),n.allowAbsoluteUrls!==void 0||(this.defaults.allowAbsoluteUrls!==void 0?n.allowAbsoluteUrls=this.defaults.allowAbsoluteUrls:n.allowAbsoluteUrls=!0),Ci.assertOptions(n,{baseUrl:Fn.spelling("baseURL"),withXsrfToken:Fn.spelling("withXSRFToken")},!0),n.method=(n.method||this.defaults.method||"get").toLowerCase();let a=s&&q.merge(s.common,s[n.method]);s&&q.forEach(["delete","get","head","post","put","patch","common"],m=>{delete s[m]}),n.headers=Ht.concat(a,s);const i=[];let l=!0;this.interceptors.request.forEach(function(g){typeof g.runWhen=="function"&&g.runWhen(n)===!1||(l=l&&g.synchronous,i.unshift(g.fulfilled,g.rejected))});const u=[];this.interceptors.response.forEach(function(g){u.push(g.fulfilled,g.rejected)});let c,d=0,p;if(!l){const m=[gm.bind(this),void 0];for(m.unshift(...i),m.push(...u),p=m.length,c=Promise.resolve(n);d{if(!r._listeners)return;let s=r._listeners.length;for(;s-- >0;)r._listeners[s](o);r._listeners=null}),this.promise.then=o=>{let s;const a=new Promise(i=>{r.subscribe(i),s=i}).then(o);return a.cancel=function(){r.unsubscribe(s)},a},t(function(s,a,i){r.reason||(r.reason=new ds(s,a,i),n(r.reason))})}throwIfRequested(){if(this.reason)throw this.reason}subscribe(t){if(this.reason){t(this.reason);return}this._listeners?this._listeners.push(t):this._listeners=[t]}unsubscribe(t){if(!this._listeners)return;const n=this._listeners.indexOf(t);n!==-1&&this._listeners.splice(n,1)}toAbortSignal(){const t=new AbortController,n=r=>{t.abort(r)};return this.subscribe(n),t.signal.unsubscribe=()=>this.unsubscribe(n),t.signal}static source(){let t;return{token:new c1(function(o){t=o}),cancel:t}}};function US(e){return function(n){return e.apply(null,n)}}function WS(e){return q.isObject(e)&&e.isAxiosError===!0}const $d={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511};Object.entries($d).forEach(([e,t])=>{$d[t]=e});function u1(e){const t=new ho(e),n=qy(ho.prototype.request,t);return q.extend(n,ho.prototype,t,{allOwnKeys:!0}),q.extend(n,t,null,{allOwnKeys:!0}),n.create=function(o){return u1(vo(e,o))},n}const mt=u1(Ma);mt.Axios=ho;mt.CanceledError=ds;mt.CancelToken=HS;mt.isCancel=n1;mt.VERSION=l1;mt.toFormData=Rl;mt.AxiosError=Te;mt.Cancel=mt.CanceledError;mt.all=function(t){return Promise.all(t)};mt.spread=US;mt.isAxiosError=WS;mt.mergeConfig=vo;mt.AxiosHeaders=Ht;mt.formToJSON=e=>t1(q.isHTMLForm(e)?new FormData(e):e);mt.getAdapter=i1.getAdapter;mt.HttpStatusCode=$d;mt.default=mt;const{Axios:p_e,AxiosError:h_e,CanceledError:m_e,isCancel:g_e,CancelToken:v_e,VERSION:y_e,all:b_e,Cancel:__e,isAxiosError:x_e,spread:w_e,toFormData:k_e,AxiosHeaders:C_e,HttpStatusCode:S_e,formToJSON:E_e,getAdapter:A_e,mergeConfig:D_e}=mt,YS="/",GS=localStorage.getItem("reaper.token"),KS=mt.create({baseURL:YS,headers:{accept:"application/json","x-reaper-token":GS}});function Yn(){return KS}const Ja=Yn(),Ra=Wn("scan",()=>{const e=F([]),t=F([]),n=F(""),r=F(null),o=d=>{e.value.push(d)},s=d=>new Promise((p,h)=>{Ja.post("/api/scan/domains",d).then(m=>{o(m.data),n.value="",p(m.data)}).catch(m=>{n.value=m?.response?.data?.error??m.message,h(m)})}),a=()=>{Ja.get("/api/scan/domains").then(d=>{e.value=d.data}).catch(d=>{console.error(d),n.value=d.message})},i=d=>{Ja.delete(`/api/scan/domains/${d.id}`).then(()=>{e.value=e.value.filter(p=>p.id!==d.id)}).catch(p=>{console.error("[scan.ts]",p),n.value=p.message}).finally(()=>{if(e.value.length>0){const p=e.value[e.value.length-1];u(p)}})},l=d=>{Ja.get(`/api/scan/domains/${d.id}/hosts`).then(p=>{t.value=p.data}).catch(p=>{console.error("[scan.ts]",p),n.value=p.message})},u=d=>{r.value=d};return{addDomain:o,getDomains:a,getHosts:l,createDomain:s,deleteDomain:i,selectDomain:u,syncDomain:d=>{const p=e.value.findIndex(h=>h.id===d.id);p!==-1&&(e.value[p]={...e.value[p],...d})},domains:e,hosts:t,selectedDomain:r,errors:n}});//! moment.js -//! version : 2.30.1 -//! authors : Tim Wood, Iskren Chernev, Moment.js contributors -//! license : MIT -//! momentjs.com -var d1;function he(){return d1.apply(null,arguments)}function ZS(e){d1=e}function kn(e){return e instanceof Array||Object.prototype.toString.call(e)==="[object Array]"}function mo(e){return e!=null&&Object.prototype.toString.call(e)==="[object Object]"}function Ve(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function Of(e){if(Object.getOwnPropertyNames)return Object.getOwnPropertyNames(e).length===0;var t;for(t in e)if(Ve(e,t))return!1;return!0}function zt(e){return e===void 0}function pr(e){return typeof e=="number"||Object.prototype.toString.call(e)==="[object Number]"}function Pa(e){return e instanceof Date||Object.prototype.toString.call(e)==="[object Date]"}function f1(e,t){var n=[],r,o=e.length;for(r=0;r>>0,r;for(r=0;r0)for(n=0;n=0;return(s?n?"+":"":"-")+Math.pow(10,Math.max(0,o)).toString().substr(1)+r}var $f=/(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|N{1,5}|YYYYYY|YYYYY|YYYY|YY|y{2,4}|yo?|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,Qa=/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,$c={},Go={};function be(e,t,n,r){var o=r;typeof r=="string"&&(o=function(){return this[r]()}),e&&(Go[e]=o),t&&(Go[t[0]]=function(){return jn(o.apply(this,arguments),t[1],t[2])}),n&&(Go[n]=function(){return this.localeData().ordinal(o.apply(this,arguments),e)})}function tE(e){return e.match(/\[[\s\S]/)?e.replace(/^\[|\]$/g,""):e.replace(/\\/g,"")}function nE(e){var t=e.match($f),n,r;for(n=0,r=t.length;n=0&&Qa.test(e);)e=e.replace(Qa,r),Qa.lastIndex=0,n-=1;return e}var rE={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"};function oE(e){var t=this._longDateFormat[e],n=this._longDateFormat[e.toUpperCase()];return t||!n?t:(this._longDateFormat[e]=n.match($f).map(function(r){return r==="MMMM"||r==="MM"||r==="DD"||r==="dddd"?r.slice(1):r}).join(""),this._longDateFormat[e])}var sE="Invalid date";function aE(){return this._invalidDate}var iE="%d",lE=/\d{1,2}/;function cE(e){return this._ordinal.replace("%d",e)}var uE={future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",w:"a week",ww:"%d weeks",M:"a month",MM:"%d months",y:"a year",yy:"%d years"};function dE(e,t,n,r){var o=this._relativeTime[n];return Kn(o)?o(e,t,n,r):o.replace(/%d/i,e)}function fE(e,t){var n=this._relativeTime[e>0?"future":"past"];return Kn(n)?n(t):n.replace(/%s/i,t)}var _m={D:"date",dates:"date",date:"date",d:"day",days:"day",day:"day",e:"weekday",weekdays:"weekday",weekday:"weekday",E:"isoWeekday",isoweekdays:"isoWeekday",isoweekday:"isoWeekday",DDD:"dayOfYear",dayofyears:"dayOfYear",dayofyear:"dayOfYear",h:"hour",hours:"hour",hour:"hour",ms:"millisecond",milliseconds:"millisecond",millisecond:"millisecond",m:"minute",minutes:"minute",minute:"minute",M:"month",months:"month",month:"month",Q:"quarter",quarters:"quarter",quarter:"quarter",s:"second",seconds:"second",second:"second",gg:"weekYear",weekyears:"weekYear",weekyear:"weekYear",GG:"isoWeekYear",isoweekyears:"isoWeekYear",isoweekyear:"isoWeekYear",w:"week",weeks:"week",week:"week",W:"isoWeek",isoweeks:"isoWeek",isoweek:"isoWeek",y:"year",years:"year",year:"year"};function pn(e){return typeof e=="string"?_m[e]||_m[e.toLowerCase()]:void 0}function Ff(e){var t={},n,r;for(r in e)Ve(e,r)&&(n=pn(r),n&&(t[n]=e[r]));return t}var pE={date:9,day:11,weekday:11,isoWeekday:11,dayOfYear:4,hour:13,millisecond:16,minute:14,month:8,quarter:7,second:15,weekYear:1,isoWeekYear:1,week:5,isoWeek:5,year:1};function hE(e){var t=[],n;for(n in e)Ve(e,n)&&t.push({unit:n,priority:pE[n]});return t.sort(function(r,o){return r.priority-o.priority}),t}var g1=/\d/,on=/\d\d/,v1=/\d{3}/,If=/\d{4}/,Fl=/[+-]?\d{6}/,st=/\d\d?/,y1=/\d\d\d\d?/,b1=/\d\d\d\d\d\d?/,Il=/\d{1,3}/,Lf=/\d{1,4}/,Ll=/[+-]?\d{1,6}/,fs=/\d+/,Nl=/[+-]?\d+/,mE=/Z|[+-]\d\d:?\d\d/gi,zl=/Z|[+-]\d\d(?::?\d\d)?/gi,gE=/[+-]?\d+(\.\d{1,3})?/,Fa=/[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFF07\uFF10-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i,ps=/^[1-9]\d?/,Nf=/^([1-9]\d|\d)/,Hi;Hi={};function ge(e,t,n){Hi[e]=Kn(t)?t:function(r,o){return r&&n?n:t}}function vE(e,t){return Ve(Hi,e)?Hi[e](t._strict,t._locale):new RegExp(yE(e))}function yE(e){return dr(e.replace("\\","").replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(t,n,r,o,s){return n||r||o||s}))}function dr(e){return e.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}function an(e){return e<0?Math.ceil(e)||0:Math.floor(e)}function Ie(e){var t=+e,n=0;return t!==0&&isFinite(t)&&(n=an(t)),n}var Nd={};function Qe(e,t){var n,r=t,o;for(typeof e=="string"&&(e=[e]),pr(t)&&(r=function(s,a){a[t]=Ie(s)}),o=e.length,n=0;n68?1900:2e3)};var _1=hs("FullYear",!0);function wE(){return Bl(this.year())}function hs(e,t){return function(n){return n!=null?(x1(this,e,n),he.updateOffset(this,t),this):ua(this,e)}}function ua(e,t){if(!e.isValid())return NaN;var n=e._d,r=e._isUTC;switch(t){case"Milliseconds":return r?n.getUTCMilliseconds():n.getMilliseconds();case"Seconds":return r?n.getUTCSeconds():n.getSeconds();case"Minutes":return r?n.getUTCMinutes():n.getMinutes();case"Hours":return r?n.getUTCHours():n.getHours();case"Date":return r?n.getUTCDate():n.getDate();case"Day":return r?n.getUTCDay():n.getDay();case"Month":return r?n.getUTCMonth():n.getMonth();case"FullYear":return r?n.getUTCFullYear():n.getFullYear();default:return NaN}}function x1(e,t,n){var r,o,s,a,i;if(!(!e.isValid()||isNaN(n))){switch(r=e._d,o=e._isUTC,t){case"Milliseconds":return void(o?r.setUTCMilliseconds(n):r.setMilliseconds(n));case"Seconds":return void(o?r.setUTCSeconds(n):r.setSeconds(n));case"Minutes":return void(o?r.setUTCMinutes(n):r.setMinutes(n));case"Hours":return void(o?r.setUTCHours(n):r.setHours(n));case"Date":return void(o?r.setUTCDate(n):r.setDate(n));case"FullYear":break;default:return}s=n,a=e.month(),i=e.date(),i=i===29&&a===1&&!Bl(s)?28:i,o?r.setUTCFullYear(s,a,i):r.setFullYear(s,a,i)}}function kE(e){return e=pn(e),Kn(this[e])?this[e]():this}function CE(e,t){if(typeof e=="object"){e=Ff(e);var n=hE(e),r,o=n.length;for(r=0;r=0?(i=new Date(e+400,t,n,r,o,s,a),isFinite(i.getFullYear())&&i.setFullYear(e)):i=new Date(e,t,n,r,o,s,a),i}function da(e){var t,n;return e<100&&e>=0?(n=Array.prototype.slice.call(arguments),n[0]=e+400,t=new Date(Date.UTC.apply(null,n)),isFinite(t.getUTCFullYear())&&t.setUTCFullYear(e)):t=new Date(Date.UTC.apply(null,arguments)),t}function Ui(e,t,n){var r=7+t-n,o=(7+da(e,0,r).getUTCDay()-t)%7;return-o+r-1}function A1(e,t,n,r,o){var s=(7+n-r)%7,a=Ui(e,r,o),i=1+7*(t-1)+s+a,l,u;return i<=0?(l=e-1,u=Xs(l)+i):i>Xs(e)?(l=e+1,u=i-Xs(e)):(l=e,u=i),{year:l,dayOfYear:u}}function fa(e,t,n){var r=Ui(e.year(),t,n),o=Math.floor((e.dayOfYear()-r-1)/7)+1,s,a;return o<1?(a=e.year()-1,s=o+fr(a,t,n)):o>fr(e.year(),t,n)?(s=o-fr(e.year(),t,n),a=e.year()+1):(a=e.year(),s=o),{week:s,year:a}}function fr(e,t,n){var r=Ui(e,t,n),o=Ui(e+1,t,n);return(Xs(e)-r+o)/7}be("w",["ww",2],"wo","week");be("W",["WW",2],"Wo","isoWeek");ge("w",st,ps);ge("ww",st,on);ge("W",st,ps);ge("WW",st,on);Ia(["w","ww","W","WW"],function(e,t,n,r){t[r.substr(0,1)]=Ie(e)});function LE(e){return fa(e,this._week.dow,this._week.doy).week}var NE={dow:0,doy:6};function zE(){return this._week.dow}function BE(){return this._week.doy}function qE(e){var t=this.localeData().week(this);return e==null?t:this.add((e-t)*7,"d")}function VE(e){var t=fa(this,1,4).week;return e==null?t:this.add((e-t)*7,"d")}be("d",0,"do","day");be("dd",0,0,function(e){return this.localeData().weekdaysMin(this,e)});be("ddd",0,0,function(e){return this.localeData().weekdaysShort(this,e)});be("dddd",0,0,function(e){return this.localeData().weekdays(this,e)});be("e",0,0,"weekday");be("E",0,0,"isoWeekday");ge("d",st);ge("e",st);ge("E",st);ge("dd",function(e,t){return t.weekdaysMinRegex(e)});ge("ddd",function(e,t){return t.weekdaysShortRegex(e)});ge("dddd",function(e,t){return t.weekdaysRegex(e)});Ia(["dd","ddd","dddd"],function(e,t,n,r){var o=n._locale.weekdaysParse(e,r,n._strict);o!=null?t.d=o:Re(n).invalidWeekday=e});Ia(["d","e","E"],function(e,t,n,r){t[r]=Ie(e)});function jE(e,t){return typeof e!="string"?e:isNaN(e)?(e=t.weekdaysParse(e),typeof e=="number"?e:null):parseInt(e,10)}function HE(e,t){return typeof e=="string"?t.weekdaysParse(e)%7||7:isNaN(e)?null:e}function Bf(e,t){return e.slice(t,7).concat(e.slice(0,t))}var UE="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),D1="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),WE="Su_Mo_Tu_We_Th_Fr_Sa".split("_"),YE=Fa,GE=Fa,KE=Fa;function ZE(e,t){var n=kn(this._weekdays)?this._weekdays:this._weekdays[e&&e!==!0&&this._weekdays.isFormat.test(t)?"format":"standalone"];return e===!0?Bf(n,this._week.dow):e?n[e.day()]:n}function XE(e){return e===!0?Bf(this._weekdaysShort,this._week.dow):e?this._weekdaysShort[e.day()]:this._weekdaysShort}function JE(e){return e===!0?Bf(this._weekdaysMin,this._week.dow):e?this._weekdaysMin[e.day()]:this._weekdaysMin}function QE(e,t,n){var r,o,s,a=e.toLocaleLowerCase();if(!this._weekdaysParse)for(this._weekdaysParse=[],this._shortWeekdaysParse=[],this._minWeekdaysParse=[],r=0;r<7;++r)s=Gn([2e3,1]).day(r),this._minWeekdaysParse[r]=this.weekdaysMin(s,"").toLocaleLowerCase(),this._shortWeekdaysParse[r]=this.weekdaysShort(s,"").toLocaleLowerCase(),this._weekdaysParse[r]=this.weekdays(s,"").toLocaleLowerCase();return n?t==="dddd"?(o=ht.call(this._weekdaysParse,a),o!==-1?o:null):t==="ddd"?(o=ht.call(this._shortWeekdaysParse,a),o!==-1?o:null):(o=ht.call(this._minWeekdaysParse,a),o!==-1?o:null):t==="dddd"?(o=ht.call(this._weekdaysParse,a),o!==-1||(o=ht.call(this._shortWeekdaysParse,a),o!==-1)?o:(o=ht.call(this._minWeekdaysParse,a),o!==-1?o:null)):t==="ddd"?(o=ht.call(this._shortWeekdaysParse,a),o!==-1||(o=ht.call(this._weekdaysParse,a),o!==-1)?o:(o=ht.call(this._minWeekdaysParse,a),o!==-1?o:null)):(o=ht.call(this._minWeekdaysParse,a),o!==-1||(o=ht.call(this._weekdaysParse,a),o!==-1)?o:(o=ht.call(this._shortWeekdaysParse,a),o!==-1?o:null))}function eA(e,t,n){var r,o,s;if(this._weekdaysParseExact)return QE.call(this,e,t,n);for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),r=0;r<7;r++){if(o=Gn([2e3,1]).day(r),n&&!this._fullWeekdaysParse[r]&&(this._fullWeekdaysParse[r]=new RegExp("^"+this.weekdays(o,"").replace(".","\\.?")+"$","i"),this._shortWeekdaysParse[r]=new RegExp("^"+this.weekdaysShort(o,"").replace(".","\\.?")+"$","i"),this._minWeekdaysParse[r]=new RegExp("^"+this.weekdaysMin(o,"").replace(".","\\.?")+"$","i")),this._weekdaysParse[r]||(s="^"+this.weekdays(o,"")+"|^"+this.weekdaysShort(o,"")+"|^"+this.weekdaysMin(o,""),this._weekdaysParse[r]=new RegExp(s.replace(".",""),"i")),n&&t==="dddd"&&this._fullWeekdaysParse[r].test(e))return r;if(n&&t==="ddd"&&this._shortWeekdaysParse[r].test(e))return r;if(n&&t==="dd"&&this._minWeekdaysParse[r].test(e))return r;if(!n&&this._weekdaysParse[r].test(e))return r}}function tA(e){if(!this.isValid())return e!=null?this:NaN;var t=ua(this,"Day");return e!=null?(e=jE(e,this.localeData()),this.add(e-t,"d")):t}function nA(e){if(!this.isValid())return e!=null?this:NaN;var t=(this.day()+7-this.localeData()._week.dow)%7;return e==null?t:this.add(e-t,"d")}function rA(e){if(!this.isValid())return e!=null?this:NaN;if(e!=null){var t=HE(e,this.localeData());return this.day(this.day()%7?t:t-7)}else return this.day()||7}function oA(e){return this._weekdaysParseExact?(Ve(this,"_weekdaysRegex")||qf.call(this),e?this._weekdaysStrictRegex:this._weekdaysRegex):(Ve(this,"_weekdaysRegex")||(this._weekdaysRegex=YE),this._weekdaysStrictRegex&&e?this._weekdaysStrictRegex:this._weekdaysRegex)}function sA(e){return this._weekdaysParseExact?(Ve(this,"_weekdaysRegex")||qf.call(this),e?this._weekdaysShortStrictRegex:this._weekdaysShortRegex):(Ve(this,"_weekdaysShortRegex")||(this._weekdaysShortRegex=GE),this._weekdaysShortStrictRegex&&e?this._weekdaysShortStrictRegex:this._weekdaysShortRegex)}function aA(e){return this._weekdaysParseExact?(Ve(this,"_weekdaysRegex")||qf.call(this),e?this._weekdaysMinStrictRegex:this._weekdaysMinRegex):(Ve(this,"_weekdaysMinRegex")||(this._weekdaysMinRegex=KE),this._weekdaysMinStrictRegex&&e?this._weekdaysMinStrictRegex:this._weekdaysMinRegex)}function qf(){function e(c,d){return d.length-c.length}var t=[],n=[],r=[],o=[],s,a,i,l,u;for(s=0;s<7;s++)a=Gn([2e3,1]).day(s),i=dr(this.weekdaysMin(a,"")),l=dr(this.weekdaysShort(a,"")),u=dr(this.weekdays(a,"")),t.push(i),n.push(l),r.push(u),o.push(i),o.push(l),o.push(u);t.sort(e),n.sort(e),r.sort(e),o.sort(e),this._weekdaysRegex=new RegExp("^("+o.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+r.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+n.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+t.join("|")+")","i")}function Vf(){return this.hours()%12||12}function iA(){return this.hours()||24}be("H",["HH",2],0,"hour");be("h",["hh",2],0,Vf);be("k",["kk",2],0,iA);be("hmm",0,0,function(){return""+Vf.apply(this)+jn(this.minutes(),2)});be("hmmss",0,0,function(){return""+Vf.apply(this)+jn(this.minutes(),2)+jn(this.seconds(),2)});be("Hmm",0,0,function(){return""+this.hours()+jn(this.minutes(),2)});be("Hmmss",0,0,function(){return""+this.hours()+jn(this.minutes(),2)+jn(this.seconds(),2)});function T1(e,t){be(e,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),t)})}T1("a",!0);T1("A",!1);function O1(e,t){return t._meridiemParse}ge("a",O1);ge("A",O1);ge("H",st,Nf);ge("h",st,ps);ge("k",st,ps);ge("HH",st,on);ge("hh",st,on);ge("kk",st,on);ge("hmm",y1);ge("hmmss",b1);ge("Hmm",y1);ge("Hmmss",b1);Qe(["H","HH"],_t);Qe(["k","kk"],function(e,t,n){var r=Ie(e);t[_t]=r===24?0:r});Qe(["a","A"],function(e,t,n){n._isPm=n._locale.isPM(e),n._meridiem=e});Qe(["h","hh"],function(e,t,n){t[_t]=Ie(e),Re(n).bigHour=!0});Qe("hmm",function(e,t,n){var r=e.length-2;t[_t]=Ie(e.substr(0,r)),t[vn]=Ie(e.substr(r)),Re(n).bigHour=!0});Qe("hmmss",function(e,t,n){var r=e.length-4,o=e.length-2;t[_t]=Ie(e.substr(0,r)),t[vn]=Ie(e.substr(r,2)),t[lr]=Ie(e.substr(o)),Re(n).bigHour=!0});Qe("Hmm",function(e,t,n){var r=e.length-2;t[_t]=Ie(e.substr(0,r)),t[vn]=Ie(e.substr(r))});Qe("Hmmss",function(e,t,n){var r=e.length-4,o=e.length-2;t[_t]=Ie(e.substr(0,r)),t[vn]=Ie(e.substr(r,2)),t[lr]=Ie(e.substr(o))});function lA(e){return(e+"").toLowerCase().charAt(0)==="p"}var cA=/[ap]\.?m?\.?/i,uA=hs("Hours",!0);function dA(e,t,n){return e>11?n?"pm":"PM":n?"am":"AM"}var M1={calendar:QS,longDateFormat:rE,invalidDate:sE,ordinal:iE,dayOfMonthOrdinalParse:lE,relativeTime:uE,months:EE,monthsShort:w1,week:NE,weekdays:UE,weekdaysMin:WE,weekdaysShort:D1,meridiemParse:cA},at={},Os={},pa;function fA(e,t){var n,r=Math.min(e.length,t.length);for(n=0;n0;){if(o=ql(s.slice(0,n).join("-")),o)return o;if(r&&r.length>=n&&fA(s,r)>=n-1)break;n--}t++}return pa}function hA(e){return!!(e&&e.match("^[^/\\\\]*$"))}function ql(e){var t=null,n;if(at[e]===void 0&&typeof Pi<"u"&&Pi&&Pi.exports&&hA(e))try{t=pa._abbr,n=require,n("./locale/"+e),Br(t)}catch{at[e]=null}return at[e]}function Br(e,t){var n;return e&&(zt(t)?n=_r(e):n=jf(e,t),n?pa=n:typeof console<"u"&&console.warn&&console.warn("Locale "+e+" not found. Did you forget to load it?")),pa._abbr}function jf(e,t){if(t!==null){var n,r=M1;if(t.abbr=e,at[e]!=null)h1("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."),r=at[e]._config;else if(t.parentLocale!=null)if(at[t.parentLocale]!=null)r=at[t.parentLocale]._config;else if(n=ql(t.parentLocale),n!=null)r=n._config;else return Os[t.parentLocale]||(Os[t.parentLocale]=[]),Os[t.parentLocale].push({name:e,config:t}),null;return at[e]=new Pf(Id(r,t)),Os[e]&&Os[e].forEach(function(o){jf(o.name,o.config)}),Br(e),at[e]}else return delete at[e],null}function mA(e,t){if(t!=null){var n,r,o=M1;at[e]!=null&&at[e].parentLocale!=null?at[e].set(Id(at[e]._config,t)):(r=ql(e),r!=null&&(o=r._config),t=Id(o,t),r==null&&(t.abbr=e),n=new Pf(t),n.parentLocale=at[e],at[e]=n),Br(e)}else at[e]!=null&&(at[e].parentLocale!=null?(at[e]=at[e].parentLocale,e===Br()&&Br(e)):at[e]!=null&&delete at[e]);return at[e]}function _r(e){var t;if(e&&e._locale&&e._locale._abbr&&(e=e._locale._abbr),!e)return pa;if(!kn(e)){if(t=ql(e),t)return t;e=[e]}return pA(e)}function gA(){return Ld(at)}function Hf(e){var t,n=e._a;return n&&Re(e).overflow===-2&&(t=n[ir]<0||n[ir]>11?ir:n[zn]<1||n[zn]>zf(n[Ot],n[ir])?zn:n[_t]<0||n[_t]>24||n[_t]===24&&(n[vn]!==0||n[lr]!==0||n[lo]!==0)?_t:n[vn]<0||n[vn]>59?vn:n[lr]<0||n[lr]>59?lr:n[lo]<0||n[lo]>999?lo:-1,Re(e)._overflowDayOfYear&&(tzn)&&(t=zn),Re(e)._overflowWeeks&&t===-1&&(t=_E),Re(e)._overflowWeekday&&t===-1&&(t=xE),Re(e).overflow=t),e}var vA=/^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/,yA=/^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d|))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/,bA=/Z|[+-]\d\d(?::?\d\d)?/,ei=[["YYYYYY-MM-DD",/[+-]\d{6}-\d\d-\d\d/],["YYYY-MM-DD",/\d{4}-\d\d-\d\d/],["GGGG-[W]WW-E",/\d{4}-W\d\d-\d/],["GGGG-[W]WW",/\d{4}-W\d\d/,!1],["YYYY-DDD",/\d{4}-\d{3}/],["YYYY-MM",/\d{4}-\d\d/,!1],["YYYYYYMMDD",/[+-]\d{10}/],["YYYYMMDD",/\d{8}/],["GGGG[W]WWE",/\d{4}W\d{3}/],["GGGG[W]WW",/\d{4}W\d{2}/,!1],["YYYYDDD",/\d{7}/],["YYYYMM",/\d{6}/,!1],["YYYY",/\d{4}/,!1]],Fc=[["HH:mm:ss.SSSS",/\d\d:\d\d:\d\d\.\d+/],["HH:mm:ss,SSSS",/\d\d:\d\d:\d\d,\d+/],["HH:mm:ss",/\d\d:\d\d:\d\d/],["HH:mm",/\d\d:\d\d/],["HHmmss.SSSS",/\d\d\d\d\d\d\.\d+/],["HHmmss,SSSS",/\d\d\d\d\d\d,\d+/],["HHmmss",/\d\d\d\d\d\d/],["HHmm",/\d\d\d\d/],["HH",/\d\d/]],_A=/^\/?Date\((-?\d+)/i,xA=/^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\d{4}))$/,wA={UT:0,GMT:0,EDT:-4*60,EST:-5*60,CDT:-5*60,CST:-6*60,MDT:-6*60,MST:-7*60,PDT:-7*60,PST:-8*60};function R1(e){var t,n,r=e._i,o=vA.exec(r)||yA.exec(r),s,a,i,l,u=ei.length,c=Fc.length;if(o){for(Re(e).iso=!0,t=0,n=u;tXs(a)||e._dayOfYear===0)&&(Re(e)._overflowDayOfYear=!0),n=da(a,0,e._dayOfYear),e._a[ir]=n.getUTCMonth(),e._a[zn]=n.getUTCDate()),t=0;t<3&&e._a[t]==null;++t)e._a[t]=r[t]=o[t];for(;t<7;t++)e._a[t]=r[t]=e._a[t]==null?t===2?1:0:e._a[t];e._a[_t]===24&&e._a[vn]===0&&e._a[lr]===0&&e._a[lo]===0&&(e._nextDay=!0,e._a[_t]=0),e._d=(e._useUTC?da:IE).apply(null,r),s=e._useUTC?e._d.getUTCDay():e._d.getDay(),e._tzm!=null&&e._d.setUTCMinutes(e._d.getUTCMinutes()-e._tzm),e._nextDay&&(e._a[_t]=24),e._w&&typeof e._w.d<"u"&&e._w.d!==s&&(Re(e).weekdayMismatch=!0)}}function OA(e){var t,n,r,o,s,a,i,l,u;t=e._w,t.GG!=null||t.W!=null||t.E!=null?(s=1,a=4,n=Lo(t.GG,e._a[Ot],fa(ot(),1,4).year),r=Lo(t.W,1),o=Lo(t.E,1),(o<1||o>7)&&(l=!0)):(s=e._locale._week.dow,a=e._locale._week.doy,u=fa(ot(),s,a),n=Lo(t.gg,e._a[Ot],u.year),r=Lo(t.w,u.week),t.d!=null?(o=t.d,(o<0||o>6)&&(l=!0)):t.e!=null?(o=t.e+s,(t.e<0||t.e>6)&&(l=!0)):o=s),r<1||r>fr(n,s,a)?Re(e)._overflowWeeks=!0:l!=null?Re(e)._overflowWeekday=!0:(i=A1(n,r,o,s,a),e._a[Ot]=i.year,e._dayOfYear=i.dayOfYear)}he.ISO_8601=function(){};he.RFC_2822=function(){};function Wf(e){if(e._f===he.ISO_8601){R1(e);return}if(e._f===he.RFC_2822){P1(e);return}e._a=[],Re(e).empty=!0;var t=""+e._i,n,r,o,s,a,i=t.length,l=0,u,c;for(o=m1(e._f,e._locale).match($f)||[],c=o.length,n=0;n0&&Re(e).unusedInput.push(a),t=t.slice(t.indexOf(r)+r.length),l+=r.length),Go[s]?(r?Re(e).empty=!1:Re(e).unusedTokens.push(s),bE(s,r,e)):e._strict&&!r&&Re(e).unusedTokens.push(s);Re(e).charsLeftOver=i-l,t.length>0&&Re(e).unusedInput.push(t),e._a[_t]<=12&&Re(e).bigHour===!0&&e._a[_t]>0&&(Re(e).bigHour=void 0),Re(e).parsedDateParts=e._a.slice(0),Re(e).meridiem=e._meridiem,e._a[_t]=MA(e._locale,e._a[_t],e._meridiem),u=Re(e).era,u!==null&&(e._a[Ot]=e._locale.erasConvertYear(u,e._a[Ot])),Uf(e),Hf(e)}function MA(e,t,n){var r;return n==null?t:e.meridiemHour!=null?e.meridiemHour(t,n):(e.isPM!=null&&(r=e.isPM(n),r&&t<12&&(t+=12),!r&&t===12&&(t=0)),t)}function RA(e){var t,n,r,o,s,a,i=!1,l=e._f.length;if(l===0){Re(e).invalidFormat=!0,e._d=new Date(NaN);return}for(o=0;othis?this:e:$l()});function I1(e,t){var n,r;if(t.length===1&&kn(t[0])&&(t=t[0]),!t.length)return ot();for(n=t[0],r=1;rthis.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()}function QA(){if(!zt(this._isDSTShifted))return this._isDSTShifted;var e={},t;return Rf(e,this),e=$1(e),e._a?(t=e._isUTC?Gn(e._a):ot(e._a),this._isDSTShifted=this.isValid()&&HA(e._a,t.toArray())>0):this._isDSTShifted=!1,this._isDSTShifted}function eD(){return this.isValid()?!this._isUTC:!1}function tD(){return this.isValid()?this._isUTC:!1}function N1(){return this.isValid()?this._isUTC&&this._offset===0:!1}var nD=/^(-|\+)?(?:(\d*)[. ])?(\d+):(\d+)(?::(\d+)(\.\d*)?)?$/,rD=/^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;function Tn(e,t){var n=e,r=null,o,s,a;return Ei(e)?n={ms:e._milliseconds,d:e._days,M:e._months}:pr(e)||!isNaN(+e)?(n={},t?n[t]=+e:n.milliseconds=+e):(r=nD.exec(e))?(o=r[1]==="-"?-1:1,n={y:0,d:Ie(r[zn])*o,h:Ie(r[_t])*o,m:Ie(r[vn])*o,s:Ie(r[lr])*o,ms:Ie(zd(r[lo]*1e3))*o}):(r=rD.exec(e))?(o=r[1]==="-"?-1:1,n={y:ro(r[2],o),M:ro(r[3],o),w:ro(r[4],o),d:ro(r[5],o),h:ro(r[6],o),m:ro(r[7],o),s:ro(r[8],o)}):n==null?n={}:typeof n=="object"&&("from"in n||"to"in n)&&(a=oD(ot(n.from),ot(n.to)),n={},n.ms=a.milliseconds,n.M=a.months),s=new Vl(n),Ei(e)&&Ve(e,"_locale")&&(s._locale=e._locale),Ei(e)&&Ve(e,"_isValid")&&(s._isValid=e._isValid),s}Tn.fn=Vl.prototype;Tn.invalid=jA;function ro(e,t){var n=e&&parseFloat(e.replace(",","."));return(isNaN(n)?0:n)*t}function wm(e,t){var n={};return n.months=t.month()-e.month()+(t.year()-e.year())*12,e.clone().add(n.months,"M").isAfter(t)&&--n.months,n.milliseconds=+t-+e.clone().add(n.months,"M"),n}function oD(e,t){var n;return e.isValid()&&t.isValid()?(t=Gf(t,e),e.isBefore(t)?n=wm(e,t):(n=wm(t,e),n.milliseconds=-n.milliseconds,n.months=-n.months),n):{milliseconds:0,months:0}}function z1(e,t){return function(n,r){var o,s;return r!==null&&!isNaN(+r)&&(h1(t,"moment()."+t+"(period, number) is deprecated. Please use moment()."+t+"(number, period). See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info."),s=n,n=r,r=s),o=Tn(n,r),B1(this,o,e),this}}function B1(e,t,n,r){var o=t._milliseconds,s=zd(t._days),a=zd(t._months);e.isValid()&&(r=r??!0,a&&C1(e,ua(e,"Month")+a*n),s&&x1(e,"Date",ua(e,"Date")+s*n),o&&e._d.setTime(e._d.valueOf()+o*n),r&&he.updateOffset(e,s||a))}var sD=z1(1,"add"),aD=z1(-1,"subtract");function q1(e){return typeof e=="string"||e instanceof String}function iD(e){return Cn(e)||Pa(e)||q1(e)||pr(e)||cD(e)||lD(e)||e===null||e===void 0}function lD(e){var t=mo(e)&&!Of(e),n=!1,r=["years","year","y","months","month","M","days","day","d","dates","date","D","hours","hour","h","minutes","minute","m","seconds","second","s","milliseconds","millisecond","ms"],o,s,a=r.length;for(o=0;on.valueOf():n.valueOf()9999?Si(n,t?"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYYYY-MM-DD[T]HH:mm:ss.SSSZ"):Kn(Date.prototype.toISOString)?t?this.toDate().toISOString():new Date(this.valueOf()+this.utcOffset()*60*1e3).toISOString().replace("Z",Si(n,"Z")):Si(n,t?"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYY-MM-DD[T]HH:mm:ss.SSSZ")}function kD(){if(!this.isValid())return"moment.invalid(/* "+this._i+" */)";var e="moment",t="",n,r,o,s;return this.isLocal()||(e=this.utcOffset()===0?"moment.utc":"moment.parseZone",t="Z"),n="["+e+'("]',r=0<=this.year()&&this.year()<=9999?"YYYY":"YYYYYY",o="-MM-DD[T]HH:mm:ss.SSS",s=t+'[")]',this.format(n+r+o+s)}function CD(e){e||(e=this.isUtc()?he.defaultFormatUtc:he.defaultFormat);var t=Si(this,e);return this.localeData().postformat(t)}function SD(e,t){return this.isValid()&&(Cn(e)&&e.isValid()||ot(e).isValid())?Tn({to:this,from:e}).locale(this.locale()).humanize(!t):this.localeData().invalidDate()}function ED(e){return this.from(ot(),e)}function AD(e,t){return this.isValid()&&(Cn(e)&&e.isValid()||ot(e).isValid())?Tn({from:this,to:e}).locale(this.locale()).humanize(!t):this.localeData().invalidDate()}function DD(e){return this.to(ot(),e)}function V1(e){var t;return e===void 0?this._locale._abbr:(t=_r(e),t!=null&&(this._locale=t),this)}var j1=fn("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.",function(e){return e===void 0?this.localeData():this.locale(e)});function H1(){return this._locale}var Wi=1e3,Ko=60*Wi,Yi=60*Ko,U1=(365*400+97)*24*Yi;function Zo(e,t){return(e%t+t)%t}function W1(e,t,n){return e<100&&e>=0?new Date(e+400,t,n)-U1:new Date(e,t,n).valueOf()}function Y1(e,t,n){return e<100&&e>=0?Date.UTC(e+400,t,n)-U1:Date.UTC(e,t,n)}function TD(e){var t,n;if(e=pn(e),e===void 0||e==="millisecond"||!this.isValid())return this;switch(n=this._isUTC?Y1:W1,e){case"year":t=n(this.year(),0,1);break;case"quarter":t=n(this.year(),this.month()-this.month()%3,1);break;case"month":t=n(this.year(),this.month(),1);break;case"week":t=n(this.year(),this.month(),this.date()-this.weekday());break;case"isoWeek":t=n(this.year(),this.month(),this.date()-(this.isoWeekday()-1));break;case"day":case"date":t=n(this.year(),this.month(),this.date());break;case"hour":t=this._d.valueOf(),t-=Zo(t+(this._isUTC?0:this.utcOffset()*Ko),Yi);break;case"minute":t=this._d.valueOf(),t-=Zo(t,Ko);break;case"second":t=this._d.valueOf(),t-=Zo(t,Wi);break}return this._d.setTime(t),he.updateOffset(this,!0),this}function OD(e){var t,n;if(e=pn(e),e===void 0||e==="millisecond"||!this.isValid())return this;switch(n=this._isUTC?Y1:W1,e){case"year":t=n(this.year()+1,0,1)-1;break;case"quarter":t=n(this.year(),this.month()-this.month()%3+3,1)-1;break;case"month":t=n(this.year(),this.month()+1,1)-1;break;case"week":t=n(this.year(),this.month(),this.date()-this.weekday()+7)-1;break;case"isoWeek":t=n(this.year(),this.month(),this.date()-(this.isoWeekday()-1)+7)-1;break;case"day":case"date":t=n(this.year(),this.month(),this.date()+1)-1;break;case"hour":t=this._d.valueOf(),t+=Yi-Zo(t+(this._isUTC?0:this.utcOffset()*Ko),Yi)-1;break;case"minute":t=this._d.valueOf(),t+=Ko-Zo(t,Ko)-1;break;case"second":t=this._d.valueOf(),t+=Wi-Zo(t,Wi)-1;break}return this._d.setTime(t),he.updateOffset(this,!0),this}function MD(){return this._d.valueOf()-(this._offset||0)*6e4}function RD(){return Math.floor(this.valueOf()/1e3)}function PD(){return new Date(this.valueOf())}function $D(){var e=this;return[e.year(),e.month(),e.date(),e.hour(),e.minute(),e.second(),e.millisecond()]}function FD(){var e=this;return{years:e.year(),months:e.month(),date:e.date(),hours:e.hours(),minutes:e.minutes(),seconds:e.seconds(),milliseconds:e.milliseconds()}}function ID(){return this.isValid()?this.toISOString():null}function LD(){return Mf(this)}function ND(){return Lr({},Re(this))}function zD(){return Re(this).overflow}function BD(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}}be("N",0,0,"eraAbbr");be("NN",0,0,"eraAbbr");be("NNN",0,0,"eraAbbr");be("NNNN",0,0,"eraName");be("NNNNN",0,0,"eraNarrow");be("y",["y",1],"yo","eraYear");be("y",["yy",2],0,"eraYear");be("y",["yyy",3],0,"eraYear");be("y",["yyyy",4],0,"eraYear");ge("N",Kf);ge("NN",Kf);ge("NNN",Kf);ge("NNNN",XD);ge("NNNNN",JD);Qe(["N","NN","NNN","NNNN","NNNNN"],function(e,t,n,r){var o=n._locale.erasParse(e,r,n._strict);o?Re(n).era=o:Re(n).invalidEra=e});ge("y",fs);ge("yy",fs);ge("yyy",fs);ge("yyyy",fs);ge("yo",QD);Qe(["y","yy","yyy","yyyy"],Ot);Qe(["yo"],function(e,t,n,r){var o;n._locale._eraYearOrdinalRegex&&(o=e.match(n._locale._eraYearOrdinalRegex)),n._locale.eraYearOrdinalParse?t[Ot]=n._locale.eraYearOrdinalParse(e,o):t[Ot]=parseInt(e,10)});function qD(e,t){var n,r,o,s=this._eras||_r("en")._eras;for(n=0,r=s.length;n=0)return s[r]}function jD(e,t){var n=e.since<=e.until?1:-1;return t===void 0?he(e.since).year():he(e.since).year()+(t-e.offset)*n}function HD(){var e,t,n,r=this.localeData().eras();for(e=0,t=r.length;es&&(t=s),a4.call(this,e,t,n,r,o))}function a4(e,t,n,r,o){var s=A1(e,t,n,r,o),a=da(s.year,0,s.dayOfYear);return this.year(a.getUTCFullYear()),this.month(a.getUTCMonth()),this.date(a.getUTCDate()),this}be("Q",0,"Qo","quarter");ge("Q",g1);Qe("Q",function(e,t){t[ir]=(Ie(e)-1)*3});function i4(e){return e==null?Math.ceil((this.month()+1)/3):this.month((e-1)*3+this.month()%3)}be("D",["DD",2],"Do","date");ge("D",st,ps);ge("DD",st,on);ge("Do",function(e,t){return e?t._dayOfMonthOrdinalParse||t._ordinalParse:t._dayOfMonthOrdinalParseLenient});Qe(["D","DD"],zn);Qe("Do",function(e,t){t[zn]=Ie(e.match(st)[0])});var K1=hs("Date",!0);be("DDD",["DDDD",3],"DDDo","dayOfYear");ge("DDD",Il);ge("DDDD",v1);Qe(["DDD","DDDD"],function(e,t,n){n._dayOfYear=Ie(e)});function l4(e){var t=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return e==null?t:this.add(e-t,"d")}be("m",["mm",2],0,"minute");ge("m",st,Nf);ge("mm",st,on);Qe(["m","mm"],vn);var c4=hs("Minutes",!1);be("s",["ss",2],0,"second");ge("s",st,Nf);ge("ss",st,on);Qe(["s","ss"],lr);var u4=hs("Seconds",!1);be("S",0,0,function(){return~~(this.millisecond()/100)});be(0,["SS",2],0,function(){return~~(this.millisecond()/10)});be(0,["SSS",3],0,"millisecond");be(0,["SSSS",4],0,function(){return this.millisecond()*10});be(0,["SSSSS",5],0,function(){return this.millisecond()*100});be(0,["SSSSSS",6],0,function(){return this.millisecond()*1e3});be(0,["SSSSSSS",7],0,function(){return this.millisecond()*1e4});be(0,["SSSSSSSS",8],0,function(){return this.millisecond()*1e5});be(0,["SSSSSSSSS",9],0,function(){return this.millisecond()*1e6});ge("S",Il,g1);ge("SS",Il,on);ge("SSS",Il,v1);var Nr,Z1;for(Nr="SSSS";Nr.length<=9;Nr+="S")ge(Nr,fs);function d4(e,t){t[lo]=Ie(("0."+e)*1e3)}for(Nr="S";Nr.length<=9;Nr+="S")Qe(Nr,d4);Z1=hs("Milliseconds",!1);be("z",0,0,"zoneAbbr");be("zz",0,0,"zoneName");function f4(){return this._isUTC?"UTC":""}function p4(){return this._isUTC?"Coordinated Universal Time":""}var te=$a.prototype;te.add=sD;te.calendar=fD;te.clone=pD;te.diff=_D;te.endOf=OD;te.format=CD;te.from=SD;te.fromNow=ED;te.to=AD;te.toNow=DD;te.get=kE;te.invalidAt=zD;te.isAfter=hD;te.isBefore=mD;te.isBetween=gD;te.isSame=vD;te.isSameOrAfter=yD;te.isSameOrBefore=bD;te.isValid=LD;te.lang=j1;te.locale=V1;te.localeData=H1;te.max=LA;te.min=IA;te.parsingFlags=ND;te.set=CE;te.startOf=TD;te.subtract=aD;te.toArray=$D;te.toObject=FD;te.toDate=PD;te.toISOString=wD;te.inspect=kD;typeof Symbol<"u"&&Symbol.for!=null&&(te[Symbol.for("nodejs.util.inspect.custom")]=function(){return"Moment<"+this.format()+">"});te.toJSON=ID;te.toString=xD;te.unix=RD;te.valueOf=MD;te.creationData=BD;te.eraName=HD;te.eraNarrow=UD;te.eraAbbr=WD;te.eraYear=YD;te.year=_1;te.isLeapYear=wE;te.weekYear=e4;te.isoWeekYear=t4;te.quarter=te.quarters=i4;te.month=S1;te.daysInMonth=PE;te.week=te.weeks=qE;te.isoWeek=te.isoWeeks=VE;te.weeksInYear=o4;te.weeksInWeekYear=s4;te.isoWeeksInYear=n4;te.isoWeeksInISOWeekYear=r4;te.date=K1;te.day=te.days=tA;te.weekday=nA;te.isoWeekday=rA;te.dayOfYear=l4;te.hour=te.hours=uA;te.minute=te.minutes=c4;te.second=te.seconds=u4;te.millisecond=te.milliseconds=Z1;te.utcOffset=WA;te.utc=GA;te.local=KA;te.parseZone=ZA;te.hasAlignedHourOffset=XA;te.isDST=JA;te.isLocal=eD;te.isUtcOffset=tD;te.isUtc=N1;te.isUTC=N1;te.zoneAbbr=f4;te.zoneName=p4;te.dates=fn("dates accessor is deprecated. Use date instead.",K1);te.months=fn("months accessor is deprecated. Use month instead",S1);te.years=fn("years accessor is deprecated. Use year instead",_1);te.zone=fn("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",YA);te.isDSTShifted=fn("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",QA);function h4(e){return ot(e*1e3)}function m4(){return ot.apply(null,arguments).parseZone()}function X1(e){return e}var je=Pf.prototype;je.calendar=eE;je.longDateFormat=oE;je.invalidDate=aE;je.ordinal=cE;je.preparse=X1;je.postformat=X1;je.relativeTime=dE;je.pastFuture=fE;je.set=JS;je.eras=qD;je.erasParse=VD;je.erasConvertYear=jD;je.erasAbbrRegex=KD;je.erasNameRegex=GD;je.erasNarrowRegex=ZD;je.months=TE;je.monthsShort=OE;je.monthsParse=RE;je.monthsRegex=FE;je.monthsShortRegex=$E;je.week=LE;je.firstDayOfYear=BE;je.firstDayOfWeek=zE;je.weekdays=ZE;je.weekdaysMin=JE;je.weekdaysShort=XE;je.weekdaysParse=eA;je.weekdaysRegex=oA;je.weekdaysShortRegex=sA;je.weekdaysMinRegex=aA;je.isPM=lA;je.meridiem=dA;function Gi(e,t,n,r){var o=_r(),s=Gn().set(r,t);return o[n](s,e)}function J1(e,t,n){if(pr(e)&&(t=e,e=void 0),e=e||"",t!=null)return Gi(e,t,n,"month");var r,o=[];for(r=0;r<12;r++)o[r]=Gi(e,r,n,"month");return o}function Xf(e,t,n,r){typeof e=="boolean"?(pr(t)&&(n=t,t=void 0),t=t||""):(t=e,n=t,e=!1,pr(t)&&(n=t,t=void 0),t=t||"");var o=_r(),s=e?o._week.dow:0,a,i=[];if(n!=null)return Gi(t,(n+s)%7,r,"day");for(a=0;a<7;a++)i[a]=Gi(t,(a+s)%7,r,"day");return i}function g4(e,t){return J1(e,t,"months")}function v4(e,t){return J1(e,t,"monthsShort")}function y4(e,t,n){return Xf(e,t,n,"weekdays")}function b4(e,t,n){return Xf(e,t,n,"weekdaysShort")}function _4(e,t,n){return Xf(e,t,n,"weekdaysMin")}Br("en",{eras:[{since:"0001-01-01",until:1/0,offset:1,name:"Anno Domini",narrow:"AD",abbr:"AD"},{since:"0000-12-31",until:-1/0,offset:1,name:"Before Christ",narrow:"BC",abbr:"BC"}],dayOfMonthOrdinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(e){var t=e%10,n=Ie(e%100/10)===1?"th":t===1?"st":t===2?"nd":t===3?"rd":"th";return e+n}});he.lang=fn("moment.lang is deprecated. Use moment.locale instead.",Br);he.langData=fn("moment.langData is deprecated. Use moment.localeData instead.",_r);var nr=Math.abs;function x4(){var e=this._data;return this._milliseconds=nr(this._milliseconds),this._days=nr(this._days),this._months=nr(this._months),e.milliseconds=nr(e.milliseconds),e.seconds=nr(e.seconds),e.minutes=nr(e.minutes),e.hours=nr(e.hours),e.months=nr(e.months),e.years=nr(e.years),this}function Q1(e,t,n,r){var o=Tn(t,n);return e._milliseconds+=r*o._milliseconds,e._days+=r*o._days,e._months+=r*o._months,e._bubble()}function w4(e,t){return Q1(this,e,t,1)}function k4(e,t){return Q1(this,e,t,-1)}function km(e){return e<0?Math.floor(e):Math.ceil(e)}function C4(){var e=this._milliseconds,t=this._days,n=this._months,r=this._data,o,s,a,i,l;return e>=0&&t>=0&&n>=0||e<=0&&t<=0&&n<=0||(e+=km(qd(n)+t)*864e5,t=0,n=0),r.milliseconds=e%1e3,o=an(e/1e3),r.seconds=o%60,s=an(o/60),r.minutes=s%60,a=an(s/60),r.hours=a%24,t+=an(a/24),l=an(eb(t)),n+=l,t-=km(qd(l)),i=an(n/12),n%=12,r.days=t,r.months=n,r.years=i,this}function eb(e){return e*4800/146097}function qd(e){return e*146097/4800}function S4(e){if(!this.isValid())return NaN;var t,n,r=this._milliseconds;if(e=pn(e),e==="month"||e==="quarter"||e==="year")switch(t=this._days+r/864e5,n=this._months+eb(t),e){case"month":return n;case"quarter":return n/3;case"year":return n/12}else switch(t=this._days+Math.round(qd(this._months)),e){case"week":return t/7+r/6048e5;case"day":return t+r/864e5;case"hour":return t*24+r/36e5;case"minute":return t*1440+r/6e4;case"second":return t*86400+r/1e3;case"millisecond":return Math.floor(t*864e5)+r;default:throw new Error("Unknown unit "+e)}}function xr(e){return function(){return this.as(e)}}var tb=xr("ms"),E4=xr("s"),A4=xr("m"),D4=xr("h"),T4=xr("d"),O4=xr("w"),M4=xr("M"),R4=xr("Q"),P4=xr("y"),$4=tb;function F4(){return Tn(this)}function I4(e){return e=pn(e),this.isValid()?this[e+"s"]():NaN}function wo(e){return function(){return this.isValid()?this._data[e]:NaN}}var L4=wo("milliseconds"),N4=wo("seconds"),z4=wo("minutes"),B4=wo("hours"),q4=wo("days"),V4=wo("months"),j4=wo("years");function H4(){return an(this.days()/7)}var or=Math.round,zo={ss:44,s:45,m:45,h:22,d:26,w:null,M:11};function U4(e,t,n,r,o){return o.relativeTime(t||1,!!n,e,r)}function W4(e,t,n,r){var o=Tn(e).abs(),s=or(o.as("s")),a=or(o.as("m")),i=or(o.as("h")),l=or(o.as("d")),u=or(o.as("M")),c=or(o.as("w")),d=or(o.as("y")),p=s<=n.ss&&["s",s]||s0,p[4]=r,U4.apply(null,p)}function Y4(e){return e===void 0?or:typeof e=="function"?(or=e,!0):!1}function G4(e,t){return zo[e]===void 0?!1:t===void 0?zo[e]:(zo[e]=t,e==="s"&&(zo.ss=t-1),!0)}function K4(e,t){if(!this.isValid())return this.localeData().invalidDate();var n=!1,r=zo,o,s;return typeof e=="object"&&(t=e,e=!1),typeof e=="boolean"&&(n=e),typeof t=="object"&&(r=Object.assign({},zo,t),t.s!=null&&t.ss==null&&(r.ss=t.s-1)),o=this.localeData(),s=W4(this,!n,r,o),n&&(s=o.pastFuture(+this,s)),o.postformat(s)}var Ic=Math.abs;function To(e){return(e>0)-(e<0)||+e}function Hl(){if(!this.isValid())return this.localeData().invalidDate();var e=Ic(this._milliseconds)/1e3,t=Ic(this._days),n=Ic(this._months),r,o,s,a,i=this.asSeconds(),l,u,c,d;return i?(r=an(e/60),o=an(r/60),e%=60,r%=60,s=an(n/12),n%=12,a=e?e.toFixed(3).replace(/\.?0+$/,""):"",l=i<0?"-":"",u=To(this._months)!==To(i)?"-":"",c=To(this._days)!==To(i)?"-":"",d=To(this._milliseconds)!==To(i)?"-":"",l+"P"+(s?u+s+"Y":"")+(n?u+n+"M":"")+(t?c+t+"D":"")+(o||r||e?"T":"")+(o?d+o+"H":"")+(r?d+r+"M":"")+(e?d+a+"S":"")):"P0D"}var Be=Vl.prototype;Be.isValid=VA;Be.abs=x4;Be.add=w4;Be.subtract=k4;Be.as=S4;Be.asMilliseconds=tb;Be.asSeconds=E4;Be.asMinutes=A4;Be.asHours=D4;Be.asDays=T4;Be.asWeeks=O4;Be.asMonths=M4;Be.asQuarters=R4;Be.asYears=P4;Be.valueOf=$4;Be._bubble=C4;Be.clone=F4;Be.get=I4;Be.milliseconds=L4;Be.seconds=N4;Be.minutes=z4;Be.hours=B4;Be.days=q4;Be.weeks=H4;Be.months=V4;Be.years=j4;Be.humanize=K4;Be.toISOString=Hl;Be.toString=Hl;Be.toJSON=Hl;Be.locale=V1;Be.localeData=H1;Be.toIsoString=fn("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",Hl);Be.lang=j1;be("X",0,0,"unix");be("x",0,0,"valueOf");ge("x",Nl);ge("X",gE);Qe("X",function(e,t,n){n._d=new Date(parseFloat(e)*1e3)});Qe("x",function(e,t,n){n._d=new Date(Ie(e))});//! moment.js -he.version="2.30.1";ZS(ot);he.fn=te;he.min=NA;he.max=zA;he.now=BA;he.utc=Gn;he.unix=h4;he.months=g4;he.isDate=Pa;he.locale=Br;he.invalid=$l;he.duration=Tn;he.isMoment=Cn;he.weekdays=y4;he.parseZone=m4;he.localeData=_r;he.isDuration=Ei;he.monthsShort=v4;he.weekdaysMin=_4;he.defineLocale=jf;he.updateLocale=mA;he.locales=gA;he.weekdaysShort=b4;he.normalizeUnits=pn;he.relativeTimeRounding=Y4;he.relativeTimeThreshold=G4;he.calendarFormat=dD;he.prototype=te;he.HTML5_FMT={DATETIME_LOCAL:"YYYY-MM-DDTHH:mm",DATETIME_LOCAL_SECONDS:"YYYY-MM-DDTHH:mm:ss",DATETIME_LOCAL_MS:"YYYY-MM-DDTHH:mm:ss.SSS",DATE:"YYYY-MM-DD",TIME:"HH:mm",TIME_SECONDS:"HH:mm:ss",TIME_MS:"HH:mm:ss.SSS",WEEK:"GGGG-[W]WW",MONTH:"YYYY-MM"};const Rs=navigator.language||"en-US";function Jf(){return{customNumberFormat:a=>new Intl.NumberFormat(Rs,{minimumFractionDigits:0,maximumFractionDigits:0}).format(a),customNumberFormatK:a=>{const i=new Intl.NumberFormat(Rs,{minimumFractionDigits:0,maximumFractionDigits:1});return a>=1e3?i.format(a/1e3)+"K":i.format(a)},localeTimestamp:a=>new Date(a*1e3).toLocaleTimeString(Rs,{hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1}),localeTimestampShort:a=>new Date(a*1e3).toLocaleTimeString(Rs,{hour:"2-digit",minute:"2-digit",hour12:!1}),localeDate:a=>new Date(a*1e3).toLocaleDateString(Rs,{month:"short",day:"numeric"}),timeAgoInWords:a=>he(a).fromNow()}}const Z4={class:"ml-2 size-4"},X4={key:0,class:"rounded-sm bg-secondary px-1.5 py-0.5 text-muted-foreground"},J4=I({__name:"ScanList",props:{filter:{}},setup(e){const t=Ra(),n=$(()=>t.domains),r=F(null),o=Jf(),s=e,a=$(()=>s.filter===""?n.value:n.value.filter(c=>c.name.includes(s.filter))),i=c=>{c.key==="ArrowUp"?(c.preventDefault(),l(-1)):c.key==="ArrowDown"&&(c.preventDefault(),l(1))},l=c=>{const d=r.value?a.value.indexOf(r.value)+c:0;d>=0&&d{r.value=c,t.selectDomain(c)};return $e(()=>{t.getDomains(),window.addEventListener("keydown",i)}),Yt(()=>{window.removeEventListener("keydown",i)}),(c,d)=>(S(),L(f(lC),null,{default:_(()=>[x(f(dC),{class:"text-xs"},{default:_(()=>d[0]||(d[0]=[oe("Recently scanned domains.")])),_:1}),x(f(uC),{class:"text-xs"},{default:_(()=>[x(f(Qh),null,{default:_(()=>[x(f(Dc),{class:"w-[240px]"},{default:_(()=>d[1]||(d[1]=[oe(" Domain ")])),_:1}),x(f(Dc),{class:"text-center"},{default:_(()=>d[2]||(d[2]=[oe(" Hosts ")])),_:1}),x(f(Dc),{class:"text-center"},{default:_(()=>d[3]||(d[3]=[oe(" Last Scan ")])),_:1})]),_:1})]),_:1}),x(f(cC),{class:"text-xs"},{default:_(()=>[(S(!0),K(Fe,null,It(a.value,p=>(S(),L(f(Qh),{key:p.name,class:Ee(["cursor-pointer",r.value?.id===p.id?"bg-muted/50":""]),onClick:h=>u(p)},{default:_(()=>[x(f(Ac),{class:"flex items-center font-normal"},{default:_(()=>[E("span",{class:Ee(["mr-1 w-0.5 pr-0.5",r.value?.id===p.id?"bg-primary":"bg-transparent"])}," ",2),oe(" "+ne(p.name)+" ",1),E("span",Z4,[p.status!=="completed"?(S(),K("span",X4,ne(p.status),1)):_e("",!0)])]),_:2},1024),x(f(Ac),{class:"text-center font-medium"},{default:_(()=>[oe(ne(p.host_count&&p.host_count>0&&f(o).customNumberFormat(p.host_count)),1)]),_:2},1024),x(f(Ac),{class:"text-center text-muted-foreground"},{default:_(()=>[oe(ne(p.last_scanned_at&&f(o).timeAgoInWords(p.last_scanned_at)),1)]),_:2},1024)]),_:2},1032,["onClick","class"]))),128))]),_:1})]),_:1}))}}),nb=6048e5,Q4=864e5,ti=43200,Cm=1440,Sm=Symbol.for("constructDateFrom");function hr(e,t){return typeof e=="function"?e(t):e&&typeof e=="object"&&Sm in e?e[Sm](t):e instanceof Date?new e.constructor(t):new Date(t)}function kt(e,t){return hr(t||e,e)}let eT={};function La(){return eT}function ha(e,t){const n=La(),r=t?.weekStartsOn??t?.locale?.options?.weekStartsOn??n.weekStartsOn??n.locale?.options?.weekStartsOn??0,o=kt(e,t?.in),s=o.getDay(),a=(s=s.getTime()?r+1:n.getTime()>=i.getTime()?r:r-1}function Zi(e){const t=kt(e),n=new Date(Date.UTC(t.getFullYear(),t.getMonth(),t.getDate(),t.getHours(),t.getMinutes(),t.getSeconds(),t.getMilliseconds()));return n.setUTCFullYear(t.getFullYear()),+e-+n}function Ul(e,...t){const n=hr.bind(null,e||t.find(r=>typeof r=="object"));return t.map(n)}function Em(e,t){const n=kt(e,t?.in);return n.setHours(0,0,0,0),n}function tT(e,t,n){const[r,o]=Ul(n?.in,e,t),s=Em(r),a=Em(o),i=+s-Zi(s),l=+a-Zi(a);return Math.round((i-l)/Q4)}function nT(e,t){const n=rb(e,t),r=hr(e,0);return r.setFullYear(n,0,4),r.setHours(0,0,0,0),Ki(r)}function Di(e,t){const n=+kt(e)-+kt(t);return n<0?-1:n>0?1:n}function rT(e){return hr(e,Date.now())}function oT(e){return e instanceof Date||typeof e=="object"&&Object.prototype.toString.call(e)==="[object Date]"}function sT(e){return!(!oT(e)&&typeof e!="number"||isNaN(+kt(e)))}function aT(e,t,n){const[r,o]=Ul(n?.in,e,t),s=r.getFullYear()-o.getFullYear(),a=r.getMonth()-o.getMonth();return s*12+a}function iT(e){return t=>{const r=(e?Math[e]:Math.trunc)(t);return r===0?0:r}}function lT(e,t){return+kt(e)-+kt(t)}function cT(e,t){const n=kt(e,t?.in);return n.setHours(23,59,59,999),n}function uT(e,t){const n=kt(e,t?.in),r=n.getMonth();return n.setFullYear(n.getFullYear(),r+1,0),n.setHours(23,59,59,999),n}function dT(e,t){const n=kt(e,t?.in);return+cT(n,t)==+uT(n,t)}function fT(e,t,n){const[r,o,s]=Ul(n?.in,e,e,t),a=Di(o,s),i=Math.abs(aT(o,s));if(i<1)return 0;o.getMonth()===1&&o.getDate()>27&&o.setDate(30),o.setMonth(o.getMonth()-a*i);let l=Di(o,s)===-a;dT(r)&&i===1&&Di(r,s)===1&&(l=!1);const u=a*(i-+l);return u===0?0:u}function pT(e,t,n){const r=lT(e,t)/1e3;return iT(n?.roundingMethod)(r)}function hT(e,t){const n=kt(e,t?.in);return n.setFullYear(n.getFullYear(),0,1),n.setHours(0,0,0,0),n}const mT={lessThanXSeconds:{one:"less than a second",other:"less than {{count}} seconds"},xSeconds:{one:"1 second",other:"{{count}} seconds"},halfAMinute:"half a minute",lessThanXMinutes:{one:"less than a minute",other:"less than {{count}} minutes"},xMinutes:{one:"1 minute",other:"{{count}} minutes"},aboutXHours:{one:"about 1 hour",other:"about {{count}} hours"},xHours:{one:"1 hour",other:"{{count}} hours"},xDays:{one:"1 day",other:"{{count}} days"},aboutXWeeks:{one:"about 1 week",other:"about {{count}} weeks"},xWeeks:{one:"1 week",other:"{{count}} weeks"},aboutXMonths:{one:"about 1 month",other:"about {{count}} months"},xMonths:{one:"1 month",other:"{{count}} months"},aboutXYears:{one:"about 1 year",other:"about {{count}} years"},xYears:{one:"1 year",other:"{{count}} years"},overXYears:{one:"over 1 year",other:"over {{count}} years"},almostXYears:{one:"almost 1 year",other:"almost {{count}} years"}},gT=(e,t,n)=>{let r;const o=mT[e];return typeof o=="string"?r=o:t===1?r=o.one:r=o.other.replace("{{count}}",t.toString()),n?.addSuffix?n.comparison&&n.comparison>0?"in "+r:r+" ago":r};function Lc(e){return(t={})=>{const n=t.width?String(t.width):e.defaultWidth;return e.formats[n]||e.formats[e.defaultWidth]}}const vT={full:"EEEE, MMMM do, y",long:"MMMM do, y",medium:"MMM d, y",short:"MM/dd/yyyy"},yT={full:"h:mm:ss a zzzz",long:"h:mm:ss a z",medium:"h:mm:ss a",short:"h:mm a"},bT={full:"{{date}} 'at' {{time}}",long:"{{date}} 'at' {{time}}",medium:"{{date}}, {{time}}",short:"{{date}}, {{time}}"},_T={date:Lc({formats:vT,defaultWidth:"full"}),time:Lc({formats:yT,defaultWidth:"full"}),dateTime:Lc({formats:bT,defaultWidth:"full"})},xT={lastWeek:"'last' eeee 'at' p",yesterday:"'yesterday at' p",today:"'today at' p",tomorrow:"'tomorrow at' p",nextWeek:"eeee 'at' p",other:"P"},wT=(e,t,n,r)=>xT[e];function Ps(e){return(t,n)=>{const r=n?.context?String(n.context):"standalone";let o;if(r==="formatting"&&e.formattingValues){const a=e.defaultFormattingWidth||e.defaultWidth,i=n?.width?String(n.width):a;o=e.formattingValues[i]||e.formattingValues[a]}else{const a=e.defaultWidth,i=n?.width?String(n.width):e.defaultWidth;o=e.values[i]||e.values[a]}const s=e.argumentCallback?e.argumentCallback(t):t;return o[s]}}const kT={narrow:["B","A"],abbreviated:["BC","AD"],wide:["Before Christ","Anno Domini"]},CT={narrow:["1","2","3","4"],abbreviated:["Q1","Q2","Q3","Q4"],wide:["1st quarter","2nd quarter","3rd quarter","4th quarter"]},ST={narrow:["J","F","M","A","M","J","J","A","S","O","N","D"],abbreviated:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],wide:["January","February","March","April","May","June","July","August","September","October","November","December"]},ET={narrow:["S","M","T","W","T","F","S"],short:["Su","Mo","Tu","We","Th","Fr","Sa"],abbreviated:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],wide:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"]},AT={narrow:{am:"a",pm:"p",midnight:"mi",noon:"n",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"},abbreviated:{am:"AM",pm:"PM",midnight:"midnight",noon:"noon",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"},wide:{am:"a.m.",pm:"p.m.",midnight:"midnight",noon:"noon",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"}},DT={narrow:{am:"a",pm:"p",midnight:"mi",noon:"n",morning:"in the morning",afternoon:"in the afternoon",evening:"in the evening",night:"at night"},abbreviated:{am:"AM",pm:"PM",midnight:"midnight",noon:"noon",morning:"in the morning",afternoon:"in the afternoon",evening:"in the evening",night:"at night"},wide:{am:"a.m.",pm:"p.m.",midnight:"midnight",noon:"noon",morning:"in the morning",afternoon:"in the afternoon",evening:"in the evening",night:"at night"}},TT=(e,t)=>{const n=Number(e),r=n%100;if(r>20||r<10)switch(r%10){case 1:return n+"st";case 2:return n+"nd";case 3:return n+"rd"}return n+"th"},OT={ordinalNumber:TT,era:Ps({values:kT,defaultWidth:"wide"}),quarter:Ps({values:CT,defaultWidth:"wide",argumentCallback:e=>e-1}),month:Ps({values:ST,defaultWidth:"wide"}),day:Ps({values:ET,defaultWidth:"wide"}),dayPeriod:Ps({values:AT,defaultWidth:"wide",formattingValues:DT,defaultFormattingWidth:"wide"})};function $s(e){return(t,n={})=>{const r=n.width,o=r&&e.matchPatterns[r]||e.matchPatterns[e.defaultMatchWidth],s=t.match(o);if(!s)return null;const a=s[0],i=r&&e.parsePatterns[r]||e.parsePatterns[e.defaultParseWidth],l=Array.isArray(i)?RT(i,d=>d.test(a)):MT(i,d=>d.test(a));let u;u=e.valueCallback?e.valueCallback(l):l,u=n.valueCallback?n.valueCallback(u):u;const c=t.slice(a.length);return{value:u,rest:c}}}function MT(e,t){for(const n in e)if(Object.prototype.hasOwnProperty.call(e,n)&&t(e[n]))return n}function RT(e,t){for(let n=0;n{const r=t.match(e.matchPattern);if(!r)return null;const o=r[0],s=t.match(e.parsePattern);if(!s)return null;let a=e.valueCallback?e.valueCallback(s[0]):s[0];a=n.valueCallback?n.valueCallback(a):a;const i=t.slice(o.length);return{value:a,rest:i}}}const $T=/^(\d+)(th|st|nd|rd)?/i,FT=/\d+/i,IT={narrow:/^(b|a)/i,abbreviated:/^(b\.?\s?c\.?|b\.?\s?c\.?\s?e\.?|a\.?\s?d\.?|c\.?\s?e\.?)/i,wide:/^(before christ|before common era|anno domini|common era)/i},LT={any:[/^b/i,/^(a|c)/i]},NT={narrow:/^[1234]/i,abbreviated:/^q[1234]/i,wide:/^[1234](th|st|nd|rd)? quarter/i},zT={any:[/1/i,/2/i,/3/i,/4/i]},BT={narrow:/^[jfmasond]/i,abbreviated:/^(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)/i,wide:/^(january|february|march|april|may|june|july|august|september|october|november|december)/i},qT={narrow:[/^j/i,/^f/i,/^m/i,/^a/i,/^m/i,/^j/i,/^j/i,/^a/i,/^s/i,/^o/i,/^n/i,/^d/i],any:[/^ja/i,/^f/i,/^mar/i,/^ap/i,/^may/i,/^jun/i,/^jul/i,/^au/i,/^s/i,/^o/i,/^n/i,/^d/i]},VT={narrow:/^[smtwf]/i,short:/^(su|mo|tu|we|th|fr|sa)/i,abbreviated:/^(sun|mon|tue|wed|thu|fri|sat)/i,wide:/^(sunday|monday|tuesday|wednesday|thursday|friday|saturday)/i},jT={narrow:[/^s/i,/^m/i,/^t/i,/^w/i,/^t/i,/^f/i,/^s/i],any:[/^su/i,/^m/i,/^tu/i,/^w/i,/^th/i,/^f/i,/^sa/i]},HT={narrow:/^(a|p|mi|n|(in the|at) (morning|afternoon|evening|night))/i,any:/^([ap]\.?\s?m\.?|midnight|noon|(in the|at) (morning|afternoon|evening|night))/i},UT={any:{am:/^a/i,pm:/^p/i,midnight:/^mi/i,noon:/^no/i,morning:/morning/i,afternoon:/afternoon/i,evening:/evening/i,night:/night/i}},WT={ordinalNumber:PT({matchPattern:$T,parsePattern:FT,valueCallback:e=>parseInt(e,10)}),era:$s({matchPatterns:IT,defaultMatchWidth:"wide",parsePatterns:LT,defaultParseWidth:"any"}),quarter:$s({matchPatterns:NT,defaultMatchWidth:"wide",parsePatterns:zT,defaultParseWidth:"any",valueCallback:e=>e+1}),month:$s({matchPatterns:BT,defaultMatchWidth:"wide",parsePatterns:qT,defaultParseWidth:"any"}),day:$s({matchPatterns:VT,defaultMatchWidth:"wide",parsePatterns:jT,defaultParseWidth:"any"}),dayPeriod:$s({matchPatterns:HT,defaultMatchWidth:"any",parsePatterns:UT,defaultParseWidth:"any"})},ob={code:"en-US",formatDistance:gT,formatLong:_T,formatRelative:wT,localize:OT,match:WT,options:{weekStartsOn:0,firstWeekContainsDate:1}};function YT(e,t){const n=kt(e,t?.in);return tT(n,hT(n))+1}function GT(e,t){const n=kt(e,t?.in),r=+Ki(n)-+nT(n);return Math.round(r/nb)+1}function sb(e,t){const n=kt(e,t?.in),r=n.getFullYear(),o=La(),s=t?.firstWeekContainsDate??t?.locale?.options?.firstWeekContainsDate??o.firstWeekContainsDate??o.locale?.options?.firstWeekContainsDate??1,a=hr(t?.in||e,0);a.setFullYear(r+1,0,s),a.setHours(0,0,0,0);const i=ha(a,t),l=hr(t?.in||e,0);l.setFullYear(r,0,s),l.setHours(0,0,0,0);const u=ha(l,t);return+n>=+i?r+1:+n>=+u?r:r-1}function KT(e,t){const n=La(),r=t?.firstWeekContainsDate??t?.locale?.options?.firstWeekContainsDate??n.firstWeekContainsDate??n.locale?.options?.firstWeekContainsDate??1,o=sb(e,t),s=hr(t?.in||e,0);return s.setFullYear(o,0,r),s.setHours(0,0,0,0),ha(s,t)}function ZT(e,t){const n=kt(e,t?.in),r=+ha(n,t)-+KT(n,t);return Math.round(r/nb)+1}function Xe(e,t){const n=e<0?"-":"",r=Math.abs(e).toString().padStart(t,"0");return n+r}const Er={y(e,t){const n=e.getFullYear(),r=n>0?n:1-n;return Xe(t==="yy"?r%100:r,t.length)},M(e,t){const n=e.getMonth();return t==="M"?String(n+1):Xe(n+1,2)},d(e,t){return Xe(e.getDate(),t.length)},a(e,t){const n=e.getHours()/12>=1?"pm":"am";switch(t){case"a":case"aa":return n.toUpperCase();case"aaa":return n;case"aaaaa":return n[0];case"aaaa":default:return n==="am"?"a.m.":"p.m."}},h(e,t){return Xe(e.getHours()%12||12,t.length)},H(e,t){return Xe(e.getHours(),t.length)},m(e,t){return Xe(e.getMinutes(),t.length)},s(e,t){return Xe(e.getSeconds(),t.length)},S(e,t){const n=t.length,r=e.getMilliseconds(),o=Math.trunc(r*Math.pow(10,n-3));return Xe(o,t.length)}},Oo={midnight:"midnight",noon:"noon",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"},Am={G:function(e,t,n){const r=e.getFullYear()>0?1:0;switch(t){case"G":case"GG":case"GGG":return n.era(r,{width:"abbreviated"});case"GGGGG":return n.era(r,{width:"narrow"});case"GGGG":default:return n.era(r,{width:"wide"})}},y:function(e,t,n){if(t==="yo"){const r=e.getFullYear(),o=r>0?r:1-r;return n.ordinalNumber(o,{unit:"year"})}return Er.y(e,t)},Y:function(e,t,n,r){const o=sb(e,r),s=o>0?o:1-o;if(t==="YY"){const a=s%100;return Xe(a,2)}return t==="Yo"?n.ordinalNumber(s,{unit:"year"}):Xe(s,t.length)},R:function(e,t){const n=rb(e);return Xe(n,t.length)},u:function(e,t){const n=e.getFullYear();return Xe(n,t.length)},Q:function(e,t,n){const r=Math.ceil((e.getMonth()+1)/3);switch(t){case"Q":return String(r);case"QQ":return Xe(r,2);case"Qo":return n.ordinalNumber(r,{unit:"quarter"});case"QQQ":return n.quarter(r,{width:"abbreviated",context:"formatting"});case"QQQQQ":return n.quarter(r,{width:"narrow",context:"formatting"});case"QQQQ":default:return n.quarter(r,{width:"wide",context:"formatting"})}},q:function(e,t,n){const r=Math.ceil((e.getMonth()+1)/3);switch(t){case"q":return String(r);case"qq":return Xe(r,2);case"qo":return n.ordinalNumber(r,{unit:"quarter"});case"qqq":return n.quarter(r,{width:"abbreviated",context:"standalone"});case"qqqqq":return n.quarter(r,{width:"narrow",context:"standalone"});case"qqqq":default:return n.quarter(r,{width:"wide",context:"standalone"})}},M:function(e,t,n){const r=e.getMonth();switch(t){case"M":case"MM":return Er.M(e,t);case"Mo":return n.ordinalNumber(r+1,{unit:"month"});case"MMM":return n.month(r,{width:"abbreviated",context:"formatting"});case"MMMMM":return n.month(r,{width:"narrow",context:"formatting"});case"MMMM":default:return n.month(r,{width:"wide",context:"formatting"})}},L:function(e,t,n){const r=e.getMonth();switch(t){case"L":return String(r+1);case"LL":return Xe(r+1,2);case"Lo":return n.ordinalNumber(r+1,{unit:"month"});case"LLL":return n.month(r,{width:"abbreviated",context:"standalone"});case"LLLLL":return n.month(r,{width:"narrow",context:"standalone"});case"LLLL":default:return n.month(r,{width:"wide",context:"standalone"})}},w:function(e,t,n,r){const o=ZT(e,r);return t==="wo"?n.ordinalNumber(o,{unit:"week"}):Xe(o,t.length)},I:function(e,t,n){const r=GT(e);return t==="Io"?n.ordinalNumber(r,{unit:"week"}):Xe(r,t.length)},d:function(e,t,n){return t==="do"?n.ordinalNumber(e.getDate(),{unit:"date"}):Er.d(e,t)},D:function(e,t,n){const r=YT(e);return t==="Do"?n.ordinalNumber(r,{unit:"dayOfYear"}):Xe(r,t.length)},E:function(e,t,n){const r=e.getDay();switch(t){case"E":case"EE":case"EEE":return n.day(r,{width:"abbreviated",context:"formatting"});case"EEEEE":return n.day(r,{width:"narrow",context:"formatting"});case"EEEEEE":return n.day(r,{width:"short",context:"formatting"});case"EEEE":default:return n.day(r,{width:"wide",context:"formatting"})}},e:function(e,t,n,r){const o=e.getDay(),s=(o-r.weekStartsOn+8)%7||7;switch(t){case"e":return String(s);case"ee":return Xe(s,2);case"eo":return n.ordinalNumber(s,{unit:"day"});case"eee":return n.day(o,{width:"abbreviated",context:"formatting"});case"eeeee":return n.day(o,{width:"narrow",context:"formatting"});case"eeeeee":return n.day(o,{width:"short",context:"formatting"});case"eeee":default:return n.day(o,{width:"wide",context:"formatting"})}},c:function(e,t,n,r){const o=e.getDay(),s=(o-r.weekStartsOn+8)%7||7;switch(t){case"c":return String(s);case"cc":return Xe(s,t.length);case"co":return n.ordinalNumber(s,{unit:"day"});case"ccc":return n.day(o,{width:"abbreviated",context:"standalone"});case"ccccc":return n.day(o,{width:"narrow",context:"standalone"});case"cccccc":return n.day(o,{width:"short",context:"standalone"});case"cccc":default:return n.day(o,{width:"wide",context:"standalone"})}},i:function(e,t,n){const r=e.getDay(),o=r===0?7:r;switch(t){case"i":return String(o);case"ii":return Xe(o,t.length);case"io":return n.ordinalNumber(o,{unit:"day"});case"iii":return n.day(r,{width:"abbreviated",context:"formatting"});case"iiiii":return n.day(r,{width:"narrow",context:"formatting"});case"iiiiii":return n.day(r,{width:"short",context:"formatting"});case"iiii":default:return n.day(r,{width:"wide",context:"formatting"})}},a:function(e,t,n){const o=e.getHours()/12>=1?"pm":"am";switch(t){case"a":case"aa":return n.dayPeriod(o,{width:"abbreviated",context:"formatting"});case"aaa":return n.dayPeriod(o,{width:"abbreviated",context:"formatting"}).toLowerCase();case"aaaaa":return n.dayPeriod(o,{width:"narrow",context:"formatting"});case"aaaa":default:return n.dayPeriod(o,{width:"wide",context:"formatting"})}},b:function(e,t,n){const r=e.getHours();let o;switch(r===12?o=Oo.noon:r===0?o=Oo.midnight:o=r/12>=1?"pm":"am",t){case"b":case"bb":return n.dayPeriod(o,{width:"abbreviated",context:"formatting"});case"bbb":return n.dayPeriod(o,{width:"abbreviated",context:"formatting"}).toLowerCase();case"bbbbb":return n.dayPeriod(o,{width:"narrow",context:"formatting"});case"bbbb":default:return n.dayPeriod(o,{width:"wide",context:"formatting"})}},B:function(e,t,n){const r=e.getHours();let o;switch(r>=17?o=Oo.evening:r>=12?o=Oo.afternoon:r>=4?o=Oo.morning:o=Oo.night,t){case"B":case"BB":case"BBB":return n.dayPeriod(o,{width:"abbreviated",context:"formatting"});case"BBBBB":return n.dayPeriod(o,{width:"narrow",context:"formatting"});case"BBBB":default:return n.dayPeriod(o,{width:"wide",context:"formatting"})}},h:function(e,t,n){if(t==="ho"){let r=e.getHours()%12;return r===0&&(r=12),n.ordinalNumber(r,{unit:"hour"})}return Er.h(e,t)},H:function(e,t,n){return t==="Ho"?n.ordinalNumber(e.getHours(),{unit:"hour"}):Er.H(e,t)},K:function(e,t,n){const r=e.getHours()%12;return t==="Ko"?n.ordinalNumber(r,{unit:"hour"}):Xe(r,t.length)},k:function(e,t,n){let r=e.getHours();return r===0&&(r=24),t==="ko"?n.ordinalNumber(r,{unit:"hour"}):Xe(r,t.length)},m:function(e,t,n){return t==="mo"?n.ordinalNumber(e.getMinutes(),{unit:"minute"}):Er.m(e,t)},s:function(e,t,n){return t==="so"?n.ordinalNumber(e.getSeconds(),{unit:"second"}):Er.s(e,t)},S:function(e,t){return Er.S(e,t)},X:function(e,t,n){const r=e.getTimezoneOffset();if(r===0)return"Z";switch(t){case"X":return Tm(r);case"XXXX":case"XX":return ao(r);case"XXXXX":case"XXX":default:return ao(r,":")}},x:function(e,t,n){const r=e.getTimezoneOffset();switch(t){case"x":return Tm(r);case"xxxx":case"xx":return ao(r);case"xxxxx":case"xxx":default:return ao(r,":")}},O:function(e,t,n){const r=e.getTimezoneOffset();switch(t){case"O":case"OO":case"OOO":return"GMT"+Dm(r,":");case"OOOO":default:return"GMT"+ao(r,":")}},z:function(e,t,n){const r=e.getTimezoneOffset();switch(t){case"z":case"zz":case"zzz":return"GMT"+Dm(r,":");case"zzzz":default:return"GMT"+ao(r,":")}},t:function(e,t,n){const r=Math.trunc(+e/1e3);return Xe(r,t.length)},T:function(e,t,n){return Xe(+e,t.length)}};function Dm(e,t=""){const n=e>0?"-":"+",r=Math.abs(e),o=Math.trunc(r/60),s=r%60;return s===0?n+String(o):n+String(o)+t+Xe(s,2)}function Tm(e,t){return e%60===0?(e>0?"-":"+")+Xe(Math.abs(e)/60,2):ao(e,t)}function ao(e,t=""){const n=e>0?"-":"+",r=Math.abs(e),o=Xe(Math.trunc(r/60),2),s=Xe(r%60,2);return n+o+t+s}const Om=(e,t)=>{switch(e){case"P":return t.date({width:"short"});case"PP":return t.date({width:"medium"});case"PPP":return t.date({width:"long"});case"PPPP":default:return t.date({width:"full"})}},ab=(e,t)=>{switch(e){case"p":return t.time({width:"short"});case"pp":return t.time({width:"medium"});case"ppp":return t.time({width:"long"});case"pppp":default:return t.time({width:"full"})}},XT=(e,t)=>{const n=e.match(/(P+)(p+)?/)||[],r=n[1],o=n[2];if(!o)return Om(e,t);let s;switch(r){case"P":s=t.dateTime({width:"short"});break;case"PP":s=t.dateTime({width:"medium"});break;case"PPP":s=t.dateTime({width:"long"});break;case"PPPP":default:s=t.dateTime({width:"full"});break}return s.replace("{{date}}",Om(r,t)).replace("{{time}}",ab(o,t))},JT={p:ab,P:XT},QT=/^D+$/,e3=/^Y+$/,t3=["D","DD","YY","YYYY"];function n3(e){return QT.test(e)}function r3(e){return e3.test(e)}function o3(e,t,n){const r=s3(e,t,n);if(console.warn(r),t3.includes(e))throw new RangeError(r)}function s3(e,t,n){const r=e[0]==="Y"?"years":"days of the month";return`Use \`${e.toLowerCase()}\` instead of \`${e}\` (in \`${t}\`) for formatting ${r} to the input \`${n}\`; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md`}const a3=/[yYQqMLwIdDecihHKkms]o|(\w)\1*|''|'(''|[^'])+('|$)|./g,i3=/P+p+|P+|p+|''|'(''|[^'])+('|$)|./g,l3=/^'([^]*?)'?$/,c3=/''/g,u3=/[a-zA-Z]/;function Qf(e,t,n){const r=La(),o=n?.locale??r.locale??ob,s=n?.firstWeekContainsDate??n?.locale?.options?.firstWeekContainsDate??r.firstWeekContainsDate??r.locale?.options?.firstWeekContainsDate??1,a=n?.weekStartsOn??n?.locale?.options?.weekStartsOn??r.weekStartsOn??r.locale?.options?.weekStartsOn??0,i=kt(e,n?.in);if(!sT(i))throw new RangeError("Invalid time value");let l=t.match(i3).map(c=>{const d=c[0];if(d==="p"||d==="P"){const p=JT[d];return p(c,o.formatLong)}return c}).join("").match(a3).map(c=>{if(c==="''")return{isToken:!1,value:"'"};const d=c[0];if(d==="'")return{isToken:!1,value:d3(c)};if(Am[d])return{isToken:!0,value:c};if(d.match(u3))throw new RangeError("Format string contains an unescaped latin alphabet character `"+d+"`");return{isToken:!1,value:c}});o.localize.preprocessor&&(l=o.localize.preprocessor(i,l));const u={firstWeekContainsDate:s,weekStartsOn:a,locale:o};return l.map(c=>{if(!c.isToken)return c.value;const d=c.value;(!n?.useAdditionalWeekYearTokens&&r3(d)||!n?.useAdditionalDayOfYearTokens&&n3(d))&&o3(d,t,String(e));const p=Am[d[0]];return p(i,d,o.localize,u)}).join("")}function d3(e){const t=e.match(l3);return t?t[1].replace(c3,"'"):e}function f3(e,t,n){const r=La(),o=n?.locale??r.locale??ob,s=2520,a=Di(e,t);if(isNaN(a))throw new RangeError("Invalid time value");const i=Object.assign({},n,{addSuffix:n?.addSuffix,comparison:a}),[l,u]=Ul(n?.in,...a>0?[t,e]:[e,t]),c=pT(u,l),d=(Zi(u)-Zi(l))/1e3,p=Math.round((c-d)/60);let h;if(p<2)return n?.includeSeconds?c<5?o.formatDistance("lessThanXSeconds",5,i):c<10?o.formatDistance("lessThanXSeconds",10,i):c<20?o.formatDistance("lessThanXSeconds",20,i):c<40?o.formatDistance("halfAMinute",0,i):c<60?o.formatDistance("lessThanXMinutes",1,i):o.formatDistance("xMinutes",1,i):p===0?o.formatDistance("lessThanXMinutes",1,i):o.formatDistance("xMinutes",p,i);if(p<45)return o.formatDistance("xMinutes",p,i);if(p<90)return o.formatDistance("aboutXHours",1,i);if(pe.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase();/** - * @license lucide-vue-next v0.447.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */var ni={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":2,"stroke-linecap":"round","stroke-linejoin":"round"};/** - * @license lucide-vue-next v0.447.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const h3=({size:e,strokeWidth:t=2,absoluteStrokeWidth:n,color:r,iconNode:o,name:s,class:a,...i},{slots:l})=>Vt("svg",{...ni,width:e||ni.width,height:e||ni.height,stroke:r||ni.stroke,"stroke-width":n?Number(t)*24/Number(e):t,class:["lucide",`lucide-${p3(s??"icon")}`],...i},[...o.map(u=>Vt(...u)),...l.default?[l.default()]:[]]);/** - * @license lucide-vue-next v0.447.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const xt=(e,t)=>(n,{slots:r})=>Vt(h3,{...n,iconNode:t,name:e},r);/** - * @license lucide-vue-next v0.447.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Mm=xt("AsteriskIcon",[["path",{d:"M12 6v12",key:"1vza4d"}],["path",{d:"M17.196 9 6.804 15",key:"1ah31z"}],["path",{d:"m6.804 9 10.392 6",key:"1b6pxd"}]]);/** - * @license lucide-vue-next v0.447.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const m3=xt("BadgeInfoIcon",[["path",{d:"M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z",key:"3c2336"}],["line",{x1:"12",x2:"12",y1:"16",y2:"12",key:"1y1yb1"}],["line",{x1:"12",x2:"12.01",y1:"8",y2:"8",key:"110wyk"}]]);/** - * @license lucide-vue-next v0.447.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const g3=xt("BinocularsIcon",[["path",{d:"M10 10h4",key:"tcdvrf"}],["path",{d:"M19 7V4a1 1 0 0 0-1-1h-2a1 1 0 0 0-1 1v3",key:"3apit1"}],["path",{d:"M20 21a2 2 0 0 0 2-2v-3.851c0-1.39-2-2.962-2-4.829V8a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v11a2 2 0 0 0 2 2z",key:"rhpgnw"}],["path",{d:"M 22 16 L 2 16",key:"14lkq7"}],["path",{d:"M4 21a2 2 0 0 1-2-2v-3.851c0-1.39 2-2.962 2-4.829V8a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1v11a2 2 0 0 1-2 2z",key:"104b3k"}],["path",{d:"M9 7V4a1 1 0 0 0-1-1H6a1 1 0 0 0-1 1v3",key:"14fczp"}]]);/** - * @license lucide-vue-next v0.447.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const v3=xt("BrainCircuitIcon",[["path",{d:"M12 5a3 3 0 1 0-5.997.125 4 4 0 0 0-2.526 5.77 4 4 0 0 0 .556 6.588A4 4 0 1 0 12 18Z",key:"l5xja"}],["path",{d:"M9 13a4.5 4.5 0 0 0 3-4",key:"10igwf"}],["path",{d:"M6.003 5.125A3 3 0 0 0 6.401 6.5",key:"105sqy"}],["path",{d:"M3.477 10.896a4 4 0 0 1 .585-.396",key:"ql3yin"}],["path",{d:"M6 18a4 4 0 0 1-1.967-.516",key:"2e4loj"}],["path",{d:"M12 13h4",key:"1ku699"}],["path",{d:"M12 18h6a2 2 0 0 1 2 2v1",key:"105ag5"}],["path",{d:"M12 8h8",key:"1lhi5i"}],["path",{d:"M16 8V5a2 2 0 0 1 2-2",key:"u6izg6"}],["circle",{cx:"16",cy:"13",r:".5",key:"ry7gng"}],["circle",{cx:"18",cy:"3",r:".5",key:"1aiba7"}],["circle",{cx:"20",cy:"21",r:".5",key:"yhc1fs"}],["circle",{cx:"20",cy:"8",r:".5",key:"1e43v0"}]]);/** - * @license lucide-vue-next v0.447.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const ib=xt("CircleFadingPlusIcon",[["path",{d:"M12 2a10 10 0 0 1 7.38 16.75",key:"175t95"}],["path",{d:"M12 8v8",key:"napkw2"}],["path",{d:"M16 12H8",key:"1fr5h0"}],["path",{d:"M2.5 8.875a10 10 0 0 0-.5 3",key:"1vce0s"}],["path",{d:"M2.83 16a10 10 0 0 0 2.43 3.4",key:"o3fkw4"}],["path",{d:"M4.636 5.235a10 10 0 0 1 .891-.857",key:"1szpfk"}],["path",{d:"M8.644 21.42a10 10 0 0 0 7.631-.38",key:"9yhvd4"}]]);/** - * @license lucide-vue-next v0.447.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const y3=xt("CopyIcon",[["rect",{width:"14",height:"14",x:"8",y:"8",rx:"2",ry:"2",key:"17jyea"}],["path",{d:"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2",key:"zix9uf"}]]);/** - * @license lucide-vue-next v0.447.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const b3=xt("FilesIcon",[["path",{d:"M20 7h-3a2 2 0 0 1-2-2V2",key:"x099mo"}],["path",{d:"M9 18a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h7l4 4v10a2 2 0 0 1-2 2Z",key:"18t6ie"}],["path",{d:"M3 7.6v12.8A1.6 1.6 0 0 0 4.6 22h9.8",key:"1nja0z"}]]);/** - * @license lucide-vue-next v0.447.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const _3=xt("GithubIcon",[["path",{d:"M15 22v-4a4.8 4.8 0 0 0-1-3.5c3 0 6-2 6-5.5.08-1.25-.27-2.48-1-3.5.28-1.15.28-2.35 0-3.5 0 0-1 0-3 1.5-2.64-.5-5.36-.5-8 0C6 2 5 2 5 2c-.3 1.15-.3 2.35 0 3.5A5.403 5.403 0 0 0 4 9c0 3.5 3 5.5 6 5.5-.39.49-.68 1.05-.85 1.65-.17.6-.22 1.23-.15 1.85v4",key:"tonef"}],["path",{d:"M9 18c-4.51 2-5-2-7-2",key:"9comsn"}]]);/** - * @license lucide-vue-next v0.447.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const x3=xt("HexagonIcon",[["path",{d:"M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z",key:"yt0hxn"}]]);/** - * @license lucide-vue-next v0.447.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const w3=xt("LinkedinIcon",[["path",{d:"M16 8a6 6 0 0 1 6 6v7h-4v-7a2 2 0 0 0-2-2 2 2 0 0 0-2 2v7h-4v-7a6 6 0 0 1 6-6z",key:"c2jq9f"}],["rect",{width:"4",height:"12",x:"2",y:"9",key:"mk3on5"}],["circle",{cx:"4",cy:"4",r:"2",key:"bt5ra8"}]]);/** - * @license lucide-vue-next v0.447.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Nc=xt("LoaderCircleIcon",[["path",{d:"M21 12a9 9 0 1 1-6.219-8.56",key:"13zald"}]]);/** - * @license lucide-vue-next v0.447.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Rm=xt("PocketKnifeIcon",[["path",{d:"M3 2v1c0 1 2 1 2 2S3 6 3 7s2 1 2 2-2 1-2 2 2 1 2 2",key:"19w3oe"}],["path",{d:"M18 6h.01",key:"1v4wsw"}],["path",{d:"M6 18h.01",key:"uhywen"}],["path",{d:"M20.83 8.83a4 4 0 0 0-5.66-5.66l-12 12a4 4 0 1 0 5.66 5.66Z",key:"6fykxj"}],["path",{d:"M18 11.66V22a4 4 0 0 0 4-4V6",key:"1utzek"}]]);/** - * @license lucide-vue-next v0.447.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const k3=xt("RefreshCwIcon",[["path",{d:"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8",key:"v9h5vc"}],["path",{d:"M21 3v5h-5",key:"1q7to0"}],["path",{d:"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16",key:"3uifl3"}],["path",{d:"M8 16H3v5",key:"1cv678"}]]);/** - * @license lucide-vue-next v0.447.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const C3=xt("ReplaceIcon",[["path",{d:"M14 4a2 2 0 0 1 2-2",key:"1w2hp7"}],["path",{d:"M16 10a2 2 0 0 1-2-2",key:"shjach"}],["path",{d:"M20 2a2 2 0 0 1 2 2",key:"188mtx"}],["path",{d:"M22 8a2 2 0 0 1-2 2",key:"ddf4tu"}],["path",{d:"m3 7 3 3 3-3",key:"x25e72"}],["path",{d:"M6 10V5a3 3 0 0 1 3-3h1",key:"3y3t5z"}],["rect",{x:"2",y:"14",width:"8",height:"8",rx:"2",key:"4rksxw"}]]);/** - * @license lucide-vue-next v0.447.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const S3=xt("ScanEyeIcon",[["path",{d:"M3 7V5a2 2 0 0 1 2-2h2",key:"aa7l1z"}],["path",{d:"M17 3h2a2 2 0 0 1 2 2v2",key:"4qcy5o"}],["path",{d:"M21 17v2a2 2 0 0 1-2 2h-2",key:"6vwrx8"}],["path",{d:"M7 21H5a2 2 0 0 1-2-2v-2",key:"ioqczr"}],["circle",{cx:"12",cy:"12",r:"1",key:"41hilf"}],["path",{d:"M18.944 12.33a1 1 0 0 0 0-.66 7.5 7.5 0 0 0-13.888 0 1 1 0 0 0 0 .66 7.5 7.5 0 0 0 13.888 0",key:"11ak4c"}]]);/** - * @license lucide-vue-next v0.447.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const E3=xt("ScrollTextIcon",[["path",{d:"M15 12h-5",key:"r7krc0"}],["path",{d:"M15 8h-5",key:"1khuty"}],["path",{d:"M19 17V5a2 2 0 0 0-2-2H4",key:"zz82l3"}],["path",{d:"M8 21h12a2 2 0 0 0 2-2v-1a1 1 0 0 0-1-1H11a1 1 0 0 0-1 1v1a2 2 0 1 1-4 0V5a2 2 0 1 0-4 0v2a1 1 0 0 0 1 1h3",key:"1ph1d7"}]]);/** - * @license lucide-vue-next v0.447.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const ko=xt("SearchIcon",[["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}],["path",{d:"m21 21-4.3-4.3",key:"1qie3q"}]]);/** - * @license lucide-vue-next v0.447.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const ms=xt("Trash2Icon",[["path",{d:"M3 6h18",key:"d0wm0j"}],["path",{d:"M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6",key:"4alrt4"}],["path",{d:"M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2",key:"v07s0e"}],["line",{x1:"10",x2:"10",y1:"11",y2:"17",key:"1uufr5"}],["line",{x1:"14",x2:"14",y1:"11",y2:"17",key:"xtxkd"}]]);/** - * @license lucide-vue-next v0.447.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const A3=xt("TwitterIcon",[["path",{d:"M22 4s-.7 2.1-2 3.4c1.6 10-9.4 17.3-18 11.6 2.2.1 4.4-.6 6-2C3 15.5.5 9.6 3 5c2.2 2.6 5.6 4.1 9 4-.9-4.2 4-6.6 7-3.8 1.1 0 3-1.2 3-1.2z",key:"pff0z6"}]]),Pm=e=>typeof e=="boolean"?`${e}`:e===0?"0":e,$m=My,Na=(e,t)=>n=>{var r;if(t?.variants==null)return $m(e,n?.class,n?.className);const{variants:o,defaultVariants:s}=t,a=Object.keys(o).map(u=>{const c=n?.[u],d=s?.[u];if(c===null)return null;const p=Pm(c)||Pm(d);return o[u][p]}),i=n&&Object.entries(n).reduce((u,c)=>{let[d,p]=c;return p===void 0||(u[d]=p),u},{}),l=t==null||(r=t.compoundVariants)===null||r===void 0?void 0:r.reduce((u,c)=>{let{class:d,className:p,...h}=c;return Object.entries(h).every(m=>{let[g,v]=m;return Array.isArray(v)?v.includes({...s,...i}[g]):{...s,...i}[g]===v})?[...u,d,p]:u},[]);return $m(e,a,l,n?.class,n?.className)},D3=["top","right","bottom","left"],Vr=Math.min,Xt=Math.max,Xi=Math.round,ri=Math.floor,jr=e=>({x:e,y:e}),T3={left:"right",right:"left",bottom:"top",top:"bottom"},O3={start:"end",end:"start"};function Vd(e,t,n){return Xt(e,Vr(t,n))}function mr(e,t){return typeof e=="function"?e(t):e}function gr(e){return e.split("-")[0]}function gs(e){return e.split("-")[1]}function ep(e){return e==="x"?"y":"x"}function tp(e){return e==="y"?"height":"width"}function Hr(e){return["top","bottom"].includes(gr(e))?"y":"x"}function np(e){return ep(Hr(e))}function M3(e,t,n){n===void 0&&(n=!1);const r=gs(e),o=np(e),s=tp(o);let a=o==="x"?r===(n?"end":"start")?"right":"left":r==="start"?"bottom":"top";return t.reference[s]>t.floating[s]&&(a=Ji(a)),[a,Ji(a)]}function R3(e){const t=Ji(e);return[jd(e),t,jd(t)]}function jd(e){return e.replace(/start|end/g,t=>O3[t])}function P3(e,t,n){const r=["left","right"],o=["right","left"],s=["top","bottom"],a=["bottom","top"];switch(e){case"top":case"bottom":return n?t?o:r:t?r:o;case"left":case"right":return t?s:a;default:return[]}}function $3(e,t,n,r){const o=gs(e);let s=P3(gr(e),n==="start",r);return o&&(s=s.map(a=>a+"-"+o),t&&(s=s.concat(s.map(jd)))),s}function Ji(e){return e.replace(/left|right|bottom|top/g,t=>T3[t])}function F3(e){return{top:0,right:0,bottom:0,left:0,...e}}function lb(e){return typeof e!="number"?F3(e):{top:e,right:e,bottom:e,left:e}}function Qi(e){const{x:t,y:n,width:r,height:o}=e;return{width:r,height:o,top:n,left:t,right:t+r,bottom:n+o,x:t,y:n}}function Fm(e,t,n){let{reference:r,floating:o}=e;const s=Hr(t),a=np(t),i=tp(a),l=gr(t),u=s==="y",c=r.x+r.width/2-o.width/2,d=r.y+r.height/2-o.height/2,p=r[i]/2-o[i]/2;let h;switch(l){case"top":h={x:c,y:r.y-o.height};break;case"bottom":h={x:c,y:r.y+r.height};break;case"right":h={x:r.x+r.width,y:d};break;case"left":h={x:r.x-o.width,y:d};break;default:h={x:r.x,y:r.y}}switch(gs(t)){case"start":h[a]-=p*(n&&u?-1:1);break;case"end":h[a]+=p*(n&&u?-1:1);break}return h}const I3=async(e,t,n)=>{const{placement:r="bottom",strategy:o="absolute",middleware:s=[],platform:a}=n,i=s.filter(Boolean),l=await(a.isRTL==null?void 0:a.isRTL(t));let u=await a.getElementRects({reference:e,floating:t,strategy:o}),{x:c,y:d}=Fm(u,r,l),p=r,h={},m=0;for(let g=0;g({name:"arrow",options:e,async fn(t){const{x:n,y:r,placement:o,rects:s,platform:a,elements:i,middlewareData:l}=t,{element:u,padding:c=0}=mr(e,t)||{};if(u==null)return{};const d=lb(c),p={x:n,y:r},h=np(o),m=tp(h),g=await a.getDimensions(u),v=h==="y",y=v?"top":"left",k=v?"bottom":"right",b=v?"clientHeight":"clientWidth",w=s.reference[m]+s.reference[h]-p[h]-s.floating[m],C=p[h]-s.reference[h],A=await(a.getOffsetParent==null?void 0:a.getOffsetParent(u));let R=A?A[b]:0;(!R||!await(a.isElement==null?void 0:a.isElement(A)))&&(R=i.floating[b]||s.floating[m]);const M=w/2-C/2,O=R/2-g[m]/2-1,P=Vr(d[y],O),W=Vr(d[k],O),z=P,re=R-g[m]-W,B=R/2-g[m]/2+M,ue=Vd(z,B,re),Q=!l.arrow&&gs(o)!=null&&B!==ue&&s.reference[m]/2-(BB<=0)){var W,z;const B=(((W=s.flip)==null?void 0:W.index)||0)+1,ue=R[B];if(ue)return{data:{index:B,overflows:P},reset:{placement:ue}};let Q=(z=P.filter(j=>j.overflows[0]<=0).sort((j,Z)=>j.overflows[1]-Z.overflows[1])[0])==null?void 0:z.placement;if(!Q)switch(h){case"bestFit":{var re;const j=(re=P.filter(Z=>{if(A){const H=Hr(Z.placement);return H===k||H==="y"}return!0}).map(Z=>[Z.placement,Z.overflows.filter(H=>H>0).reduce((H,U)=>H+U,0)]).sort((Z,H)=>Z[1]-H[1])[0])==null?void 0:re[0];j&&(Q=j);break}case"initialPlacement":Q=i;break}if(o!==Q)return{reset:{placement:Q}}}return{}}}};function Im(e,t){return{top:e.top-t.height,right:e.right-t.width,bottom:e.bottom-t.height,left:e.left-t.width}}function Lm(e){return D3.some(t=>e[t]>=0)}const z3=function(e){return e===void 0&&(e={}),{name:"hide",options:e,async fn(t){const{rects:n}=t,{strategy:r="referenceHidden",...o}=mr(e,t);switch(r){case"referenceHidden":{const s=await ma(t,{...o,elementContext:"reference"}),a=Im(s,n.reference);return{data:{referenceHiddenOffsets:a,referenceHidden:Lm(a)}}}case"escaped":{const s=await ma(t,{...o,altBoundary:!0}),a=Im(s,n.floating);return{data:{escapedOffsets:a,escaped:Lm(a)}}}default:return{}}}}};async function B3(e,t){const{placement:n,platform:r,elements:o}=e,s=await(r.isRTL==null?void 0:r.isRTL(o.floating)),a=gr(n),i=gs(n),l=Hr(n)==="y",u=["left","top"].includes(a)?-1:1,c=s&&l?-1:1,d=mr(t,e);let{mainAxis:p,crossAxis:h,alignmentAxis:m}=typeof d=="number"?{mainAxis:d,crossAxis:0,alignmentAxis:null}:{mainAxis:d.mainAxis||0,crossAxis:d.crossAxis||0,alignmentAxis:d.alignmentAxis};return i&&typeof m=="number"&&(h=i==="end"?m*-1:m),l?{x:h*c,y:p*u}:{x:p*u,y:h*c}}const q3=function(e){return e===void 0&&(e=0),{name:"offset",options:e,async fn(t){var n,r;const{x:o,y:s,placement:a,middlewareData:i}=t,l=await B3(t,e);return a===((n=i.offset)==null?void 0:n.placement)&&(r=i.arrow)!=null&&r.alignmentOffset?{}:{x:o+l.x,y:s+l.y,data:{...l,placement:a}}}}},V3=function(e){return e===void 0&&(e={}),{name:"shift",options:e,async fn(t){const{x:n,y:r,placement:o}=t,{mainAxis:s=!0,crossAxis:a=!1,limiter:i={fn:v=>{let{x:y,y:k}=v;return{x:y,y:k}}},...l}=mr(e,t),u={x:n,y:r},c=await ma(t,l),d=Hr(gr(o)),p=ep(d);let h=u[p],m=u[d];if(s){const v=p==="y"?"top":"left",y=p==="y"?"bottom":"right",k=h+c[v],b=h-c[y];h=Vd(k,h,b)}if(a){const v=d==="y"?"top":"left",y=d==="y"?"bottom":"right",k=m+c[v],b=m-c[y];m=Vd(k,m,b)}const g=i.fn({...t,[p]:h,[d]:m});return{...g,data:{x:g.x-n,y:g.y-r,enabled:{[p]:s,[d]:a}}}}}},j3=function(e){return e===void 0&&(e={}),{options:e,fn(t){const{x:n,y:r,placement:o,rects:s,middlewareData:a}=t,{offset:i=0,mainAxis:l=!0,crossAxis:u=!0}=mr(e,t),c={x:n,y:r},d=Hr(o),p=ep(d);let h=c[p],m=c[d];const g=mr(i,t),v=typeof g=="number"?{mainAxis:g,crossAxis:0}:{mainAxis:0,crossAxis:0,...g};if(l){const b=p==="y"?"height":"width",w=s.reference[p]-s.floating[b]+v.mainAxis,C=s.reference[p]+s.reference[b]-v.mainAxis;hC&&(h=C)}if(u){var y,k;const b=p==="y"?"width":"height",w=["top","left"].includes(gr(o)),C=s.reference[d]-s.floating[b]+(w&&((y=a.offset)==null?void 0:y[d])||0)+(w?0:v.crossAxis),A=s.reference[d]+s.reference[b]+(w?0:((k=a.offset)==null?void 0:k[d])||0)-(w?v.crossAxis:0);mA&&(m=A)}return{[p]:h,[d]:m}}}},H3=function(e){return e===void 0&&(e={}),{name:"size",options:e,async fn(t){var n,r;const{placement:o,rects:s,platform:a,elements:i}=t,{apply:l=()=>{},...u}=mr(e,t),c=await ma(t,u),d=gr(o),p=gs(o),h=Hr(o)==="y",{width:m,height:g}=s.floating;let v,y;d==="top"||d==="bottom"?(v=d,y=p===(await(a.isRTL==null?void 0:a.isRTL(i.floating))?"start":"end")?"left":"right"):(y=d,v=p==="end"?"top":"bottom");const k=g-c.top-c.bottom,b=m-c.left-c.right,w=Vr(g-c[v],k),C=Vr(m-c[y],b),A=!t.middlewareData.shift;let R=w,M=C;if((n=t.middlewareData.shift)!=null&&n.enabled.x&&(M=b),(r=t.middlewareData.shift)!=null&&r.enabled.y&&(R=k),A&&!p){const P=Xt(c.left,0),W=Xt(c.right,0),z=Xt(c.top,0),re=Xt(c.bottom,0);h?M=m-2*(P!==0||W!==0?P+W:Xt(c.left,c.right)):R=g-2*(z!==0||re!==0?z+re:Xt(c.top,c.bottom))}await l({...t,availableWidth:M,availableHeight:R});const O=await a.getDimensions(i.floating);return m!==O.width||g!==O.height?{reset:{rects:!0}}:{}}}};function Wl(){return typeof window<"u"}function Co(e){return rp(e)?(e.nodeName||"").toLowerCase():"#document"}function nn(e){var t;return(e==null||(t=e.ownerDocument)==null?void 0:t.defaultView)||window}function Zn(e){var t;return(t=(rp(e)?e.ownerDocument:e.document)||window.document)==null?void 0:t.documentElement}function rp(e){return Wl()?e instanceof Node||e instanceof nn(e).Node:!1}function Sn(e){return Wl()?e instanceof Element||e instanceof nn(e).Element:!1}function Hn(e){return Wl()?e instanceof HTMLElement||e instanceof nn(e).HTMLElement:!1}function Nm(e){return!Wl()||typeof ShadowRoot>"u"?!1:e instanceof ShadowRoot||e instanceof nn(e).ShadowRoot}function za(e){const{overflow:t,overflowX:n,overflowY:r,display:o}=En(e);return/auto|scroll|overlay|hidden|clip/.test(t+r+n)&&!["inline","contents"].includes(o)}function U3(e){return["table","td","th"].includes(Co(e))}function Yl(e){return[":popover-open",":modal"].some(t=>{try{return e.matches(t)}catch{return!1}})}function op(e){const t=sp(),n=Sn(e)?En(e):e;return n.transform!=="none"||n.perspective!=="none"||(n.containerType?n.containerType!=="normal":!1)||!t&&(n.backdropFilter?n.backdropFilter!=="none":!1)||!t&&(n.filter?n.filter!=="none":!1)||["transform","perspective","filter"].some(r=>(n.willChange||"").includes(r))||["paint","layout","strict","content"].some(r=>(n.contain||"").includes(r))}function W3(e){let t=Ur(e);for(;Hn(t)&&!as(t);){if(op(t))return t;if(Yl(t))return null;t=Ur(t)}return null}function sp(){return typeof CSS>"u"||!CSS.supports?!1:CSS.supports("-webkit-backdrop-filter","none")}function as(e){return["html","body","#document"].includes(Co(e))}function En(e){return nn(e).getComputedStyle(e)}function Gl(e){return Sn(e)?{scrollLeft:e.scrollLeft,scrollTop:e.scrollTop}:{scrollLeft:e.scrollX,scrollTop:e.scrollY}}function Ur(e){if(Co(e)==="html")return e;const t=e.assignedSlot||e.parentNode||Nm(e)&&e.host||Zn(e);return Nm(t)?t.host:t}function cb(e){const t=Ur(e);return as(t)?e.ownerDocument?e.ownerDocument.body:e.body:Hn(t)&&za(t)?t:cb(t)}function ga(e,t,n){var r;t===void 0&&(t=[]),n===void 0&&(n=!0);const o=cb(e),s=o===((r=e.ownerDocument)==null?void 0:r.body),a=nn(o);if(s){const i=Hd(a);return t.concat(a,a.visualViewport||[],za(o)?o:[],i&&n?ga(i):[])}return t.concat(o,ga(o,[],n))}function Hd(e){return e.parent&&Object.getPrototypeOf(e.parent)?e.frameElement:null}function ub(e){const t=En(e);let n=parseFloat(t.width)||0,r=parseFloat(t.height)||0;const o=Hn(e),s=o?e.offsetWidth:n,a=o?e.offsetHeight:r,i=Xi(n)!==s||Xi(r)!==a;return i&&(n=s,r=a),{width:n,height:r,$:i}}function ap(e){return Sn(e)?e:e.contextElement}function Xo(e){const t=ap(e);if(!Hn(t))return jr(1);const n=t.getBoundingClientRect(),{width:r,height:o,$:s}=ub(t);let a=(s?Xi(n.width):n.width)/r,i=(s?Xi(n.height):n.height)/o;return(!a||!Number.isFinite(a))&&(a=1),(!i||!Number.isFinite(i))&&(i=1),{x:a,y:i}}const Y3=jr(0);function db(e){const t=nn(e);return!sp()||!t.visualViewport?Y3:{x:t.visualViewport.offsetLeft,y:t.visualViewport.offsetTop}}function G3(e,t,n){return t===void 0&&(t=!1),!n||t&&n!==nn(e)?!1:t}function bo(e,t,n,r){t===void 0&&(t=!1),n===void 0&&(n=!1);const o=e.getBoundingClientRect(),s=ap(e);let a=jr(1);t&&(r?Sn(r)&&(a=Xo(r)):a=Xo(e));const i=G3(s,n,r)?db(s):jr(0);let l=(o.left+i.x)/a.x,u=(o.top+i.y)/a.y,c=o.width/a.x,d=o.height/a.y;if(s){const p=nn(s),h=r&&Sn(r)?nn(r):r;let m=p,g=Hd(m);for(;g&&r&&h!==m;){const v=Xo(g),y=g.getBoundingClientRect(),k=En(g),b=y.left+(g.clientLeft+parseFloat(k.paddingLeft))*v.x,w=y.top+(g.clientTop+parseFloat(k.paddingTop))*v.y;l*=v.x,u*=v.y,c*=v.x,d*=v.y,l+=b,u+=w,m=nn(g),g=Hd(m)}}return Qi({width:c,height:d,x:l,y:u})}function K3(e){let{elements:t,rect:n,offsetParent:r,strategy:o}=e;const s=o==="fixed",a=Zn(r),i=t?Yl(t.floating):!1;if(r===a||i&&s)return n;let l={scrollLeft:0,scrollTop:0},u=jr(1);const c=jr(0),d=Hn(r);if((d||!d&&!s)&&((Co(r)!=="body"||za(a))&&(l=Gl(r)),Hn(r))){const p=bo(r);u=Xo(r),c.x=p.x+r.clientLeft,c.y=p.y+r.clientTop}return{width:n.width*u.x,height:n.height*u.y,x:n.x*u.x-l.scrollLeft*u.x+c.x,y:n.y*u.y-l.scrollTop*u.y+c.y}}function Z3(e){return Array.from(e.getClientRects())}function Ud(e,t){const n=Gl(e).scrollLeft;return t?t.left+n:bo(Zn(e)).left+n}function X3(e){const t=Zn(e),n=Gl(e),r=e.ownerDocument.body,o=Xt(t.scrollWidth,t.clientWidth,r.scrollWidth,r.clientWidth),s=Xt(t.scrollHeight,t.clientHeight,r.scrollHeight,r.clientHeight);let a=-n.scrollLeft+Ud(e);const i=-n.scrollTop;return En(r).direction==="rtl"&&(a+=Xt(t.clientWidth,r.clientWidth)-o),{width:o,height:s,x:a,y:i}}function J3(e,t){const n=nn(e),r=Zn(e),o=n.visualViewport;let s=r.clientWidth,a=r.clientHeight,i=0,l=0;if(o){s=o.width,a=o.height;const u=sp();(!u||u&&t==="fixed")&&(i=o.offsetLeft,l=o.offsetTop)}return{width:s,height:a,x:i,y:l}}function Q3(e,t){const n=bo(e,!0,t==="fixed"),r=n.top+e.clientTop,o=n.left+e.clientLeft,s=Hn(e)?Xo(e):jr(1),a=e.clientWidth*s.x,i=e.clientHeight*s.y,l=o*s.x,u=r*s.y;return{width:a,height:i,x:l,y:u}}function zm(e,t,n){let r;if(t==="viewport")r=J3(e,n);else if(t==="document")r=X3(Zn(e));else if(Sn(t))r=Q3(t,n);else{const o=db(e);r={...t,x:t.x-o.x,y:t.y-o.y}}return Qi(r)}function fb(e,t){const n=Ur(e);return n===t||!Sn(n)||as(n)?!1:En(n).position==="fixed"||fb(n,t)}function eO(e,t){const n=t.get(e);if(n)return n;let r=ga(e,[],!1).filter(i=>Sn(i)&&Co(i)!=="body"),o=null;const s=En(e).position==="fixed";let a=s?Ur(e):e;for(;Sn(a)&&!as(a);){const i=En(a),l=op(a);!l&&i.position==="fixed"&&(o=null),(s?!l&&!o:!l&&i.position==="static"&&!!o&&["absolute","fixed"].includes(o.position)||za(a)&&!l&&fb(e,a))?r=r.filter(c=>c!==a):o=i,a=Ur(a)}return t.set(e,r),r}function tO(e){let{element:t,boundary:n,rootBoundary:r,strategy:o}=e;const a=[...n==="clippingAncestors"?Yl(t)?[]:eO(t,this._c):[].concat(n),r],i=a[0],l=a.reduce((u,c)=>{const d=zm(t,c,o);return u.top=Xt(d.top,u.top),u.right=Vr(d.right,u.right),u.bottom=Vr(d.bottom,u.bottom),u.left=Xt(d.left,u.left),u},zm(t,i,o));return{width:l.right-l.left,height:l.bottom-l.top,x:l.left,y:l.top}}function nO(e){const{width:t,height:n}=ub(e);return{width:t,height:n}}function rO(e,t,n){const r=Hn(t),o=Zn(t),s=n==="fixed",a=bo(e,!0,s,t);let i={scrollLeft:0,scrollTop:0};const l=jr(0);if(r||!r&&!s)if((Co(t)!=="body"||za(o))&&(i=Gl(t)),r){const h=bo(t,!0,s,t);l.x=h.x+t.clientLeft,l.y=h.y+t.clientTop}else o&&(l.x=Ud(o));let u=0,c=0;if(o&&!r&&!s){const h=o.getBoundingClientRect();c=h.top+i.scrollTop,u=h.left+i.scrollLeft-Ud(o,h)}const d=a.left+i.scrollLeft-l.x-u,p=a.top+i.scrollTop-l.y-c;return{x:d,y:p,width:a.width,height:a.height}}function zc(e){return En(e).position==="static"}function Bm(e,t){if(!Hn(e)||En(e).position==="fixed")return null;if(t)return t(e);let n=e.offsetParent;return Zn(e)===n&&(n=n.ownerDocument.body),n}function pb(e,t){const n=nn(e);if(Yl(e))return n;if(!Hn(e)){let o=Ur(e);for(;o&&!as(o);){if(Sn(o)&&!zc(o))return o;o=Ur(o)}return n}let r=Bm(e,t);for(;r&&U3(r)&&zc(r);)r=Bm(r,t);return r&&as(r)&&zc(r)&&!op(r)?n:r||W3(e)||n}const oO=async function(e){const t=this.getOffsetParent||pb,n=this.getDimensions,r=await n(e.floating);return{reference:rO(e.reference,await t(e.floating),e.strategy),floating:{x:0,y:0,width:r.width,height:r.height}}};function sO(e){return En(e).direction==="rtl"}const aO={convertOffsetParentRelativeRectToViewportRelativeRect:K3,getDocumentElement:Zn,getClippingRect:tO,getOffsetParent:pb,getElementRects:oO,getClientRects:Z3,getDimensions:nO,getScale:Xo,isElement:Sn,isRTL:sO};function iO(e,t){let n=null,r;const o=Zn(e);function s(){var i;clearTimeout(r),(i=n)==null||i.disconnect(),n=null}function a(i,l){i===void 0&&(i=!1),l===void 0&&(l=1),s();const{left:u,top:c,width:d,height:p}=e.getBoundingClientRect();if(i||t(),!d||!p)return;const h=ri(c),m=ri(o.clientWidth-(u+d)),g=ri(o.clientHeight-(c+p)),v=ri(u),k={rootMargin:-h+"px "+-m+"px "+-g+"px "+-v+"px",threshold:Xt(0,Vr(1,l))||1};let b=!0;function w(C){const A=C[0].intersectionRatio;if(A!==l){if(!b)return a();A?a(!1,A):r=setTimeout(()=>{a(!1,1e-7)},1e3)}b=!1}try{n=new IntersectionObserver(w,{...k,root:o.ownerDocument})}catch{n=new IntersectionObserver(w,k)}n.observe(e)}return a(!0),s}function lO(e,t,n,r){r===void 0&&(r={});const{ancestorScroll:o=!0,ancestorResize:s=!0,elementResize:a=typeof ResizeObserver=="function",layoutShift:i=typeof IntersectionObserver=="function",animationFrame:l=!1}=r,u=ap(e),c=o||s?[...u?ga(u):[],...ga(t)]:[];c.forEach(y=>{o&&y.addEventListener("scroll",n,{passive:!0}),s&&y.addEventListener("resize",n)});const d=u&&i?iO(u,n):null;let p=-1,h=null;a&&(h=new ResizeObserver(y=>{let[k]=y;k&&k.target===u&&h&&(h.unobserve(t),cancelAnimationFrame(p),p=requestAnimationFrame(()=>{var b;(b=h)==null||b.observe(t)})),n()}),u&&!l&&h.observe(u),h.observe(t));let m,g=l?bo(e):null;l&&v();function v(){const y=bo(e);g&&(y.x!==g.x||y.y!==g.y||y.width!==g.width||y.height!==g.height)&&n(),g=y,m=requestAnimationFrame(v)}return n(),()=>{var y;c.forEach(k=>{o&&k.removeEventListener("scroll",n),s&&k.removeEventListener("resize",n)}),d?.(),(y=h)==null||y.disconnect(),h=null,l&&cancelAnimationFrame(m)}}const cO=q3,uO=V3,qm=N3,dO=H3,fO=z3,pO=L3,hO=j3,mO=(e,t,n)=>{const r=new Map,o={platform:aO,...n},s={...o.platform,_c:r};return I3(e,t,{...o,platform:s})};function gO(e){return e!=null&&typeof e=="object"&&"$el"in e}function Wd(e){if(gO(e)){const t=e.$el;return rp(t)&&Co(t)==="#comment"?null:t}return e}function No(e){return typeof e=="function"?e():f(e)}function vO(e){return{name:"arrow",options:e,fn(t){const n=Wd(No(e.element));return n==null?{}:pO({element:n,padding:e.padding}).fn(t)}}}function hb(e){return typeof window>"u"?1:(e.ownerDocument.defaultView||window).devicePixelRatio||1}function Vm(e,t){const n=hb(e);return Math.round(t*n)/n}function yO(e,t,n){n===void 0&&(n={});const r=n.whileElementsMounted,o=$(()=>{var R;return(R=No(n.open))!=null?R:!0}),s=$(()=>No(n.middleware)),a=$(()=>{var R;return(R=No(n.placement))!=null?R:"bottom"}),i=$(()=>{var R;return(R=No(n.strategy))!=null?R:"absolute"}),l=$(()=>{var R;return(R=No(n.transform))!=null?R:!0}),u=$(()=>Wd(e.value)),c=$(()=>Wd(t.value)),d=F(0),p=F(0),h=F(i.value),m=F(a.value),g=vf({}),v=F(!1),y=$(()=>{const R={position:h.value,left:"0",top:"0"};if(!c.value)return R;const M=Vm(c.value,d.value),O=Vm(c.value,p.value);return l.value?{...R,transform:"translate("+M+"px, "+O+"px)",...hb(c.value)>=1.5&&{willChange:"transform"}}:{position:h.value,left:M+"px",top:O+"px"}});let k;function b(){if(u.value==null||c.value==null)return;const R=o.value;mO(u.value,c.value,{middleware:s.value,placement:a.value,strategy:i.value}).then(M=>{d.value=M.x,p.value=M.y,h.value=M.strategy,m.value=M.placement,g.value=M.middlewareData,v.value=R!==!1})}function w(){typeof k=="function"&&(k(),k=void 0)}function C(){if(w(),r===void 0){b();return}if(u.value!=null&&c.value!=null){k=r(u.value,c.value,b);return}}function A(){o.value||(v.value=!1)}return Oe([s,a,i,o],b,{flush:"sync"}),Oe([u,c],C,{flush:"sync"}),Oe(o,A,{flush:"sync"}),hl()&&ff(w),{x:Eo(d),y:Eo(p),strategy:Eo(h),placement:Eo(m),middlewareData:Eo(g),isPositioned:Eo(v),floatingStyles:y,update:b}}function dt(e,t){const n=typeof e=="string"&&!t?`${e}Context`:t,r=Symbol(n);return[o=>{const s=qt(r,o);if(s||s===null)return s;throw new Error(`Injection \`${r.toString()}\` not found. Component must be used within ${Array.isArray(e)?`one of the following components: ${e.join(", ")}`:`\`${e}\``}`)},o=>(Wo(r,o),o)]}function ip(e,t,n){const r=n.originalEvent.target,o=new CustomEvent(e,{bubbles:!1,cancelable:!0,detail:n});t&&r.addEventListener(e,t,{once:!0}),r.dispatchEvent(o)}function bO(e,t=Number.NEGATIVE_INFINITY,n=Number.POSITIVE_INFINITY){return Math.min(n,Math.max(t,e))}function _O(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var xO=function e(t,n){if(t===n)return!0;if(t&&n&&typeof t=="object"&&typeof n=="object"){if(t.constructor!==n.constructor)return!1;var r,o,s;if(Array.isArray(t)){if(r=t.length,r!=n.length)return!1;for(o=r;o--!==0;)if(!e(t[o],n[o]))return!1;return!0}if(t.constructor===RegExp)return t.source===n.source&&t.flags===n.flags;if(t.valueOf!==Object.prototype.valueOf)return t.valueOf()===n.valueOf();if(t.toString!==Object.prototype.toString)return t.toString()===n.toString();if(s=Object.keys(t),r=s.length,r!==Object.keys(n).length)return!1;for(o=r;o--!==0;)if(!Object.prototype.hasOwnProperty.call(n,s[o]))return!1;for(o=r;o--!==0;){var a=s[o];if(!e(t[a],n[a]))return!1}return!0}return t!==t&&n!==n};const co=_O(xO);function wO(e,t){if(e.length!==t.length)return!1;for(let n=0;n{r.value=e()},{...t,flush:(n=void 0)!=null?n:"sync"}),ka(r)}function Zr(e){return hl()?(ff(e),!0):!1}function CO(){const e=new Set,t=n=>{e.delete(n)};return{on:n=>{e.add(n);const r=()=>t(n);return Zr(r),{off:r}},off:t,trigger:(...n)=>Promise.all(Array.from(e).map(r=>r(...n)))}}function SO(e){let t=!1,n;const r=pl(!0);return(...o)=>(t||(n=r.run(()=>e(...o)),t=!0),n)}function EO(e){let t=0,n,r;const o=()=>{t-=1,r&&t<=0&&(r.stop(),n=void 0,r=void 0)};return(...s)=>(t+=1,n||(r=pl(!0),n=r.run(()=>e(...s))),Zr(o),n)}function bn(e){return typeof e=="function"?e():f(e)}const Xn=typeof window<"u"&&typeof document<"u";typeof WorkerGlobalScope<"u"&&globalThis instanceof WorkerGlobalScope;const AO=e=>typeof e<"u",DO=e=>e!=null,TO=Object.prototype.toString,OO=e=>TO.call(e)==="[object Object]",el=()=>{},jm=MO();function MO(){var e,t;return Xn&&((e=window?.navigator)==null?void 0:e.userAgent)&&(/iP(?:ad|hone|od)/.test(window.navigator.userAgent)||((t=window?.navigator)==null?void 0:t.maxTouchPoints)>2&&/iPad|Macintosh/.test(window?.navigator.userAgent))}function RO(e,t){function n(...r){return new Promise((o,s)=>{Promise.resolve(e(()=>t.apply(this,r),{fn:t,thisArg:this,args:r})).then(o).catch(s)})}return n}function PO(e,t={}){let n,r,o=el;const s=a=>{clearTimeout(a),o(),o=el};return a=>{const i=bn(e),l=bn(t.maxWait);return n&&s(n),i<=0||l!==void 0&&l<=0?(r&&(s(r),r=null),Promise.resolve(a())):new Promise((u,c)=>{o=t.rejectOnCancel?c:u,l&&!r&&(r=setTimeout(()=>{n&&s(n),r=null,u(a())},l)),n=setTimeout(()=>{r&&s(r),r=null,u(a())},i)})}}function $O(e){return dn()}function FO(e,t=1e4){return b0((n,r)=>{let o=bn(e),s;const a=()=>setTimeout(()=>{o=bn(e),r()},bn(t));return Zr(()=>{clearTimeout(s)}),{get(){return n(),o},set(i){o=i,r(),clearTimeout(s),s=a()}}})}function mb(e,t=200,n={}){return RO(PO(t,n),e)}function IO(e,t){$O()&&_f(e,t)}function lp(e,t,n={}){const{immediate:r=!0}=n,o=F(!1);let s=null;function a(){s&&(clearTimeout(s),s=null)}function i(){o.value=!1,a()}function l(...u){a(),o.value=!0,s=setTimeout(()=>{o.value=!1,s=null,e(...u)},bn(t))}return r&&(o.value=!0,Xn&&l()),Zr(i),{isPending:ka(o),start:l,stop:i}}function LO(e=1e3,t={}){const{controls:n=!1,callback:r}=t,o=lp(r??el,e,t),s=$(()=>!o.isPending.value);return n?{ready:s,...o}:s}function NO(e,t,n){const r=Oe(e,(...o)=>(it(()=>r()),t(...o)),n);return r}function rn(e){var t;const n=bn(e);return(t=n?.$el)!=null?t:n}const vs=Xn?window:void 0;function tl(...e){let t,n,r,o;if(typeof e[0]=="string"||Array.isArray(e[0])?([n,r,o]=e,t=vs):[t,n,r,o]=e,!t)return el;Array.isArray(n)||(n=[n]),Array.isArray(r)||(r=[r]);const s=[],a=()=>{s.forEach(c=>c()),s.length=0},i=(c,d,p,h)=>(c.addEventListener(d,p,h),()=>c.removeEventListener(d,p,h)),l=Oe(()=>[rn(t),bn(o)],([c,d])=>{if(a(),!c)return;const p=OO(d)?{...d}:d;s.push(...n.flatMap(h=>r.map(m=>i(c,h,m,p))))},{immediate:!0,flush:"post"}),u=()=>{l(),a()};return Zr(u),u}function zO(e){return typeof e=="function"?e:typeof e=="string"?t=>t.key===e:Array.isArray(e)?t=>e.includes(t.key):()=>!0}function cp(...e){let t,n,r={};e.length===3?(t=e[0],n=e[1],r=e[2]):e.length===2?typeof e[1]=="object"?(t=!0,n=e[0],r=e[1]):(t=e[0],n=e[1]):(t=!0,n=e[0]);const{target:o=vs,eventName:s="keydown",passive:a=!1,dedupe:i=!1}=r,l=zO(t);return tl(o,s,u=>{u.repeat&&bn(i)||l(u)&&n(u)},a)}function gb(){const e=F(!1),t=dn();return t&&$e(()=>{e.value=!0},t),e}function vb(e){const t=gb();return $(()=>(t.value,!!e()))}function BO(e,t,n={}){const{window:r=vs,...o}=n;let s;const a=vb(()=>r&&"MutationObserver"in r),i=()=>{s&&(s.disconnect(),s=void 0)},l=$(()=>{const p=bn(e),h=(Array.isArray(p)?p:[p]).map(rn).filter(DO);return new Set(h)}),u=Oe(()=>l.value,p=>{i(),a.value&&p.size&&(s=new MutationObserver(t),p.forEach(h=>s.observe(h,o)))},{immediate:!0,flush:"post"}),c=()=>s?.takeRecords(),d=()=>{i(),u()};return Zr(d),{isSupported:a,stop:d,takeRecords:c}}function yb(e,t={}){const{immediate:n=!0,fpsLimit:r=void 0,window:o=vs}=t,s=F(!1),a=r?1e3/r:null;let i=0,l=null;function u(p){if(!s.value||!o)return;i||(i=p);const h=p-i;if(a&&hr&&"ResizeObserver"in r),i=()=>{s&&(s.disconnect(),s=void 0)},l=$(()=>Array.isArray(e)?e.map(d=>rn(d)):[rn(e)]),u=Oe(l,d=>{if(i(),a.value&&r){s=new ResizeObserver(t);for(const p of d)p&&s.observe(p,o)}},{immediate:!0,flush:"post"}),c=()=>{i(),u()};return Zr(c),{isSupported:a,stop:c}}function ln(e,t,n,r={}){var o,s,a;const{clone:i=!1,passive:l=!1,eventName:u,deep:c=!1,defaultValue:d,shouldEmit:p}=r,h=dn(),m=n||h?.emit||((o=h?.$emit)==null?void 0:o.bind(h))||((a=(s=h?.proxy)==null?void 0:s.$emit)==null?void 0:a.bind(h?.proxy));let g=u;t||(t="modelValue"),g=g||`update:${t.toString()}`;const v=b=>i?typeof i=="function"?i(b):qO(b):b,y=()=>AO(e[t])?v(e[t]):d,k=b=>{p?p(b)&&m(g,b):m(g,b)};if(l){const b=y(),w=F(b);let C=!1;return Oe(()=>e[t],A=>{C||(C=!0,w.value=v(A),it(()=>C=!1))}),Oe(w,A=>{!C&&(A!==e[t]||c)&&k(A)},{deep:c}),w}else return $({get(){return y()},set(b){k(b)}})}function up(e){return e?e.flatMap(t=>t.type===Fe?up(t.children):[t]):[]}function Bc(e){if(e===null||typeof e!="object")return!1;const t=Object.getPrototypeOf(e);return t!==null&&t!==Object.prototype&&Object.getPrototypeOf(t)!==null||Symbol.iterator in e?!1:Symbol.toStringTag in e?Object.prototype.toString.call(e)==="[object Module]":!0}function Yd(e,t,n=".",r){if(!Bc(t))return Yd(e,{},n);const o=Object.assign({},t);for(const s in e){if(s==="__proto__"||s==="constructor")continue;const a=e[s];a!=null&&(Array.isArray(a)&&Array.isArray(o[s])?o[s]=[...a,...o[s]]:Bc(a)&&Bc(o[s])?o[s]=Yd(a,o[s],(n?`${n}.`:"")+s.toString()):o[s]=a)}return o}function VO(e){return(...t)=>t.reduce((n,r)=>Yd(n,r,""),{})}const jO=VO(),[Kl]=dt("ConfigProvider");let HO="useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict",UO=(e=21)=>{let t="",n=e;for(;n--;)t+=HO[Math.random()*64|0];return t};const WO=EO(()=>{const e=F(new Map),t=F(),n=$(()=>{for(const a of e.value.values())if(a)return!0;return!1}),r=Kl({scrollBody:F(!0)});let o=null;const s=()=>{document.body.style.paddingRight="",document.body.style.marginRight="",document.body.style.pointerEvents="",document.body.style.removeProperty("--scrollbar-width"),document.body.style.overflow=t.value??"",jm&&o?.(),t.value=void 0};return Oe(n,(a,i)=>{var l;if(!Xn)return;if(!a){i&&s();return}t.value===void 0&&(t.value=document.body.style.overflow);const u=window.innerWidth-document.documentElement.clientWidth,c={padding:u,margin:0},d=(l=r.scrollBody)!=null&&l.value?typeof r.scrollBody.value=="object"?jO({padding:r.scrollBody.value.padding===!0?u:r.scrollBody.value.padding,margin:r.scrollBody.value.margin===!0?u:r.scrollBody.value.margin},c):c:{padding:0,margin:0};u>0&&(document.body.style.paddingRight=typeof d.padding=="number"?`${d.padding}px`:String(d.padding),document.body.style.marginRight=typeof d.margin=="number"?`${d.margin}px`:String(d.margin),document.body.style.setProperty("--scrollbar-width",`${u}px`),document.body.style.overflow="hidden"),jm&&(o=tl(document,"touchmove",p=>YO(p),{passive:!1})),it(()=>{document.body.style.pointerEvents="none",document.body.style.overflow="hidden"})},{immediate:!0,flush:"sync"}),e});function dp(e){const t=UO(6),n=WO();n.value.set(t,e??!1);const r=$({get:()=>n.value.get(t)??!1,set:o=>n.value.set(t,o)});return IO(()=>{n.value.delete(t)}),r}function bb(e){const t=window.getComputedStyle(e);if(t.overflowX==="scroll"||t.overflowY==="scroll"||t.overflowX==="auto"&&e.clientWidth1?!0:(t.preventDefault&&t.cancelable&&t.preventDefault(),!1)}const GO="data-radix-vue-collection-item";function KO(e,t=GO){const n=Symbol();return{createCollection:r=>{const o=F([]);function s(){const a=rn(r);return a?o.value=Array.from(a.querySelectorAll(`[${t}]:not([data-disabled])`)):o.value=[]}return F0(()=>{o.value=[]}),$e(s),bf(s),Oe(()=>r?.value,s,{immediate:!0}),Wo(n,o),o},injectCollection:()=>qt(n,F([]))}}function qa(e){const t=Kl({dir:F("ltr")});return $(()=>{var n;return e?.value||((n=t.dir)==null?void 0:n.value)||"ltr"})}function Zl(e){const t=dn(),n=t?.type.emits,r={};return n!=null&&n.length||console.warn(`No emitted event found. Please check component: ${t?.type.__name}`),n?.forEach(o=>{r[Vs(Lt(o))]=(...s)=>e(o,...s)}),r}let qc=0;function ZO(){pt(e=>{if(!Xn)return;const t=document.querySelectorAll("[data-radix-focus-guard]");document.body.insertAdjacentElement("afterbegin",t[0]??Hm()),document.body.insertAdjacentElement("beforeend",t[1]??Hm()),qc++,e(()=>{qc===1&&document.querySelectorAll("[data-radix-focus-guard]").forEach(n=>n.remove()),qc--})})}function Hm(){const e=document.createElement("span");return e.setAttribute("data-radix-focus-guard",""),e.tabIndex=0,e.style.outline="none",e.style.opacity="0",e.style.position="fixed",e.style.pointerEvents="none",e}function fp(e){return $(()=>{var t;return bn(e)?!!((t=rn(e))!=null&&t.closest("form")):!0})}function Xr(e){const t=dn(),n=Object.keys(t?.type.props??{}).reduce((o,s)=>{const a=(t?.type.props[s]).default;return a!==void 0&&(o[s]=a),o},{}),r=_0(e);return $(()=>{const o={},s=t?.vnode.props??{};return Object.keys(s).forEach(a=>{o[Lt(a)]=s[a]}),Object.keys({...n,...o}).reduce((a,i)=>(r.value[i]!==void 0&&(a[i]=r.value[i]),a),{})})}function yt(e,t){const n=Xr(e),r=t?Zl(t):{};return $(()=>({...n.value,...r}))}function ve(){const e=dn(),t=F(),n=$(()=>{var a,i;return["#text","#comment"].includes((a=t.value)==null?void 0:a.$el.nodeName)?(i=t.value)==null?void 0:i.$el.nextElementSibling:rn(t)}),r=Object.assign({},e.exposed),o={};for(const a in e.props)Object.defineProperty(o,a,{enumerable:!0,configurable:!0,get:()=>e.props[a]});if(Object.keys(r).length>0)for(const a in r)Object.defineProperty(o,a,{enumerable:!0,configurable:!0,get:()=>r[a]});Object.defineProperty(o,"$el",{enumerable:!0,configurable:!0,get:()=>e.vnode.el}),e.exposed=o;function s(a){t.value=a,!(a instanceof Element||!a)&&(Object.defineProperty(o,"$el",{enumerable:!0,configurable:!0,get:()=>a.$el}),e.exposed=o)}return{forwardRef:s,currentRef:t,currentElement:n}}function XO(e,t){const n=FO(!1,300),r=F(null),o=CO();function s(){r.value=null,n.value=!1}function a(i,l){const u=i.currentTarget,c={x:i.clientX,y:i.clientY},d=JO(c,u.getBoundingClientRect()),p=QO(c,d),h=eM(l.getBoundingClientRect()),m=nM([...p,...h]);r.value=m,n.value=!0}return pt(i=>{if(e.value&&t.value){const l=c=>a(c,t.value),u=c=>a(c,e.value);e.value.addEventListener("pointerleave",l),t.value.addEventListener("pointerleave",u),i(()=>{var c,d;(c=e.value)==null||c.removeEventListener("pointerleave",l),(d=t.value)==null||d.removeEventListener("pointerleave",u)})}}),pt(i=>{var l;if(r.value){const u=c=>{var d,p;if(!r.value)return;const h=c.target,m={x:c.clientX,y:c.clientY},g=((d=e.value)==null?void 0:d.contains(h))||((p=t.value)==null?void 0:p.contains(h)),v=!tM(m,r.value),y=h.hasAttribute("data-grace-area-trigger");g?s():(v||y)&&(s(),o.trigger())};(l=e.value)==null||l.ownerDocument.addEventListener("pointermove",u),i(()=>{var c;return(c=e.value)==null?void 0:c.ownerDocument.removeEventListener("pointermove",u)})}}),{isPointerInTransit:n,onPointerExit:o.on}}function JO(e,t){const n=Math.abs(t.top-e.y),r=Math.abs(t.bottom-e.y),o=Math.abs(t.right-e.x),s=Math.abs(t.left-e.x);switch(Math.min(n,r,o,s)){case s:return"left";case o:return"right";case n:return"top";case r:return"bottom";default:throw new Error("unreachable")}}function QO(e,t,n=5){const r=[];switch(t){case"top":r.push({x:e.x-n,y:e.y+n},{x:e.x+n,y:e.y+n});break;case"bottom":r.push({x:e.x-n,y:e.y-n},{x:e.x+n,y:e.y-n});break;case"left":r.push({x:e.x+n,y:e.y-n},{x:e.x+n,y:e.y+n});break;case"right":r.push({x:e.x-n,y:e.y-n},{x:e.x-n,y:e.y+n});break}return r}function eM(e){const{top:t,right:n,bottom:r,left:o}=e;return[{x:o,y:t},{x:n,y:t},{x:n,y:r},{x:o,y:r}]}function tM(e,t){const{x:n,y:r}=e;let o=!1;for(let s=0,a=t.length-1;sr!=c>r&&n<(u-i)*(r-l)/(c-l)+i&&(o=!o)}return o}function nM(e){const t=e.slice();return t.sort((n,r)=>n.xr.x?1:n.yr.y?1:0),rM(t)}function rM(e){if(e.length<=1)return e.slice();const t=[];for(let r=0;r=2;){const s=t[t.length-1],a=t[t.length-2];if((s.x-a.x)*(o.y-a.y)>=(s.y-a.y)*(o.x-a.x))t.pop();else break}t.push(o)}t.pop();const n=[];for(let r=e.length-1;r>=0;r--){const o=e[r];for(;n.length>=2;){const s=n[n.length-1],a=n[n.length-2];if((s.x-a.x)*(o.y-a.y)>=(s.y-a.y)*(o.x-a.x))n.pop();else break}n.push(o)}return n.pop(),t.length===1&&n.length===1&&t[0].x===n[0].x&&t[0].y===n[0].y?t:t.concat(n)}var oM=function(e){if(typeof document>"u")return null;var t=Array.isArray(e)?e[0]:e;return t.ownerDocument.body},Mo=new WeakMap,oi=new WeakMap,si={},Vc=0,_b=function(e){return e&&(e.host||_b(e.parentNode))},sM=function(e,t){return t.map(function(n){if(e.contains(n))return n;var r=_b(n);return r&&e.contains(r)?r:(console.error("aria-hidden",n,"in not contained inside",e,". Doing nothing"),null)}).filter(function(n){return!!n})},aM=function(e,t,n,r){var o=sM(t,Array.isArray(e)?e:[e]);si[n]||(si[n]=new WeakMap);var s=si[n],a=[],i=new Set,l=new Set(o),u=function(d){!d||i.has(d)||(i.add(d),u(d.parentNode))};o.forEach(u);var c=function(d){!d||l.has(d)||Array.prototype.forEach.call(d.children,function(p){if(i.has(p))c(p);else try{var h=p.getAttribute(r),m=h!==null&&h!=="false",g=(Mo.get(p)||0)+1,v=(s.get(p)||0)+1;Mo.set(p,g),s.set(p,v),a.push(p),g===1&&m&&oi.set(p,!0),v===1&&p.setAttribute(n,"true"),m||p.setAttribute(r,"true")}catch(y){console.error("aria-hidden: cannot operate on ",p,y)}})};return c(t),i.clear(),Vc++,function(){a.forEach(function(d){var p=Mo.get(d)-1,h=s.get(d)-1;Mo.set(d,p),s.set(d,h),p||(oi.has(d)||d.removeAttribute(r),oi.delete(d)),h||d.removeAttribute(n)}),Vc--,Vc||(Mo=new WeakMap,Mo=new WeakMap,oi=new WeakMap,si={})}},iM=function(e,t,n){n===void 0&&(n="data-aria-hidden");var r=Array.from(Array.isArray(e)?e:[e]),o=oM(e);return o?(r.push.apply(r,Array.from(o.querySelectorAll("[aria-live]"))),aM(r,o,n,"aria-hidden")):function(){return null}};function pp(e){let t;Oe(()=>rn(e),n=>{n?t=iM(n):t&&t()}),Yt(()=>{t&&t()})}let lM=0;function Ut(e,t="radix"){if(e)return e;const n=Kl({useId:void 0});return rh?`${t}-${rh()}`:n.useId?`${t}-${n.useId()}`:`${t}-${++lM}`}function cM(e){const t=F(),n=$(()=>{var o;return((o=t.value)==null?void 0:o.width)??0}),r=$(()=>{var o;return((o=t.value)==null?void 0:o.height)??0});return $e(()=>{const o=rn(e);if(o){t.value={width:o.offsetWidth,height:o.offsetHeight};const s=new ResizeObserver(a=>{if(!Array.isArray(a)||!a.length)return;const i=a[0];let l,u;if("borderBoxSize"in i){const c=i.borderBoxSize,d=Array.isArray(c)?c[0]:c;l=d.inlineSize,u=d.blockSize}else l=o.offsetWidth,u=o.offsetHeight;t.value={width:l,height:u}});return s.observe(o,{box:"border-box"}),()=>s.unobserve(o)}else t.value=void 0}),{width:n,height:r}}function xb(e,t){const n=F(e);function r(o){return t[n.value][o]??n.value}return{state:n,dispatch:o=>{n.value=r(o)}}}const hp=I({name:"PrimitiveSlot",inheritAttrs:!1,setup(e,{attrs:t,slots:n}){return()=>{var r,o;if(!n.default)return null;const s=up(n.default()),a=s.findIndex(c=>c.type!==xn);if(a===-1)return s;const i=s[a];(r=i.props)==null||delete r.ref;const l=i.props?le(t,i.props):t;t.class&&(o=i.props)!=null&&o.class&&delete i.props.class;const u=qr(i,l);for(const c in l)c.startsWith("on")&&(u.props||(u.props={}),u.props[c]=l[c]);return s.length===1?u:(s[a]=u,s)}}}),Ce=I({name:"Primitive",inheritAttrs:!1,props:{asChild:{type:Boolean,default:!1},as:{type:[String,Object],default:"div"}},setup(e,{attrs:t,slots:n}){const r=e.asChild?"template":e.as;return typeof r=="string"&&["area","img","input"].includes(r)?()=>Vt(r,t):r!=="template"?()=>Vt(e.as,t,{default:n.default}):()=>Vt(hp,t,{default:n.default})}});function mp(){const e=F(),t=$(()=>{var n,r;return["#text","#comment"].includes((n=e.value)==null?void 0:n.$el.nodeName)?(r=e.value)==null?void 0:r.$el.nextElementSibling:rn(e)});return{primitiveElement:e,currentElement:t}}function uM(e,t){var n;const r=F({}),o=F("none"),s=F(e),a=e.value?"mounted":"unmounted";let i;const l=((n=t.value)==null?void 0:n.ownerDocument.defaultView)??vs,{state:u,dispatch:c}=xb(a,{mounted:{UNMOUNT:"unmounted",ANIMATION_OUT:"unmountSuspended"},unmountSuspended:{MOUNT:"mounted",ANIMATION_END:"unmounted"},unmounted:{MOUNT:"mounted"}}),d=v=>{var y;if(Xn){const k=new CustomEvent(v,{bubbles:!1,cancelable:!1});(y=t.value)==null||y.dispatchEvent(k)}};Oe(e,async(v,y)=>{var k;const b=y!==v;if(await it(),b){const w=o.value,C=ai(t.value);v?(c("MOUNT"),d("enter"),C==="none"&&d("after-enter")):C==="none"||((k=r.value)==null?void 0:k.display)==="none"?(c("UNMOUNT"),d("leave"),d("after-leave")):y&&w!==C?(c("ANIMATION_OUT"),d("leave")):(c("UNMOUNT"),d("after-leave"))}},{immediate:!0});const p=v=>{const y=ai(t.value),k=y.includes(v.animationName),b=u.value==="mounted"?"enter":"leave";if(v.target===t.value&&k&&(d(`after-${b}`),c("ANIMATION_END"),!s.value)){const w=t.value.style.animationFillMode;t.value.style.animationFillMode="forwards",i=l?.setTimeout(()=>{var C;((C=t.value)==null?void 0:C.style.animationFillMode)==="forwards"&&(t.value.style.animationFillMode=w)})}v.target===t.value&&y==="none"&&c("ANIMATION_END")},h=v=>{v.target===t.value&&(o.value=ai(t.value))},m=Oe(t,(v,y)=>{v?(r.value=getComputedStyle(v),v.addEventListener("animationstart",h),v.addEventListener("animationcancel",p),v.addEventListener("animationend",p)):(c("ANIMATION_END"),l?.clearTimeout(i),y?.removeEventListener("animationstart",h),y?.removeEventListener("animationcancel",p),y?.removeEventListener("animationend",p))},{immediate:!0}),g=Oe(u,()=>{const v=ai(t.value);o.value=u.value==="mounted"?v:"none"});return Yt(()=>{m(),g()}),{isPresent:$(()=>["mounted","unmountSuspended"].includes(u.value))}}function ai(e){return e&&getComputedStyle(e).animationName||"none"}const On=I({name:"Presence",props:{present:{type:Boolean,required:!0},forceMount:{type:Boolean}},slots:{},setup(e,{slots:t,expose:n}){var r;const{present:o,forceMount:s}=vt(e),a=F(),{isPresent:i}=uM(o,a);n({present:i});let l=t.default({present:i});l=up(l||[]);const u=dn();if(l&&l?.length>1){const c=(r=u?.parent)!=null&&r.type.name?`<${u.parent.type.name} />`:"component";throw new Error([`Detected an invalid children for \`${c}\` for \`Presence\` component.`,"","Note: Presence works similarly to `v-if` directly, but it waits for animation/transition to finished before unmounting. So it expect only one direct child of valid VNode type.","You can apply a few solutions:",["Provide a single child element so that `presence` directive attach correctly.","Ensure the first child is an actual element instead of a raw text node or comment node."].map(d=>` - ${d}`).join(` -`)].join(` -`))}return()=>s.value||o.value||i.value?Vt(t.default({present:i})[0],{ref:c=>{const d=rn(c);return typeof d?.hasAttribute>"u"||(d!=null&&d.hasAttribute("data-radix-popper-content-wrapper")?a.value=d.firstElementChild:a.value=d),d}}):null}}),[Jn,dM]=dt("DialogRoot"),fM=I({inheritAttrs:!1,__name:"DialogRoot",props:{open:{type:Boolean,default:void 0},defaultOpen:{type:Boolean,default:!1},modal:{type:Boolean,default:!0}},emits:["update:open"],setup(e,{emit:t}){const n=e,r=ln(n,"open",t,{defaultValue:n.defaultOpen,passive:n.open===void 0}),o=F(),s=F(),{modal:a}=vt(n);return dM({open:r,modal:a,openModal:()=>{r.value=!0},onOpenChange:i=>{r.value=i},onOpenToggle:()=>{r.value=!r.value},contentId:"",titleId:"",descriptionId:"",triggerElement:o,contentElement:s}),(i,l)=>V(i.$slots,"default",{open:f(r)})}}),pM=I({__name:"DialogTrigger",props:{asChild:{type:Boolean},as:{default:"button"}},setup(e){const t=e,n=Jn(),{forwardRef:r,currentElement:o}=ve();return n.contentId||(n.contentId=Ut(void 0,"radix-vue-dialog-content")),$e(()=>{n.triggerElement.value=o.value}),(s,a)=>(S(),L(f(Ce),le(t,{ref:f(r),type:s.as==="button"?"button":void 0,"aria-haspopup":"dialog","aria-expanded":f(n).open.value||!1,"aria-controls":f(n).open.value?f(n).contentId:void 0,"data-state":f(n).open.value?"open":"closed",onClick:f(n).onOpenToggle}),{default:_(()=>[V(s.$slots,"default")]),_:3},16,["type","aria-expanded","aria-controls","data-state","onClick"]))}}),gp=I({__name:"Teleport",props:{to:{default:"body"},disabled:{type:Boolean},forceMount:{type:Boolean}},setup(e){const t=gb();return(n,r)=>f(t)||n.forceMount?(S(),L(T0,{key:0,to:n.to,disabled:n.disabled},[V(n.$slots,"default")],8,["to","disabled"])):_e("",!0)}}),hM=I({__name:"DialogPortal",props:{to:{},disabled:{type:Boolean},forceMount:{type:Boolean}},setup(e){const t=e;return(n,r)=>(S(),L(f(gp),St(Et(t)),{default:_(()=>[V(n.$slots,"default")]),_:3},16))}}),mM="dismissableLayer.pointerDownOutside",gM="dismissableLayer.focusOutside";function wb(e,t){const n=t.closest("[data-dismissable-layer]"),r=e.dataset.dismissableLayer===""?e:e.querySelector("[data-dismissable-layer]"),o=Array.from(e.ownerDocument.querySelectorAll("[data-dismissable-layer]"));return!!(n&&r===n||o.indexOf(r){});return pt(a=>{if(!Xn)return;const i=async u=>{const c=u.target;if(t!=null&&t.value){if(wb(t.value,c)){o.value=!1;return}if(u.target&&!o.value){let d=function(){ip(mM,e,p)};const p={originalEvent:u};u.pointerType==="touch"?(r.removeEventListener("click",s.value),s.value=d,r.addEventListener("click",s.value,{once:!0})):d()}else r.removeEventListener("click",s.value);o.value=!1}},l=window.setTimeout(()=>{r.addEventListener("pointerdown",i)},0);a(()=>{window.clearTimeout(l),r.removeEventListener("pointerdown",i),r.removeEventListener("click",s.value)})}),{onPointerDownCapture:()=>o.value=!0}}function yM(e,t){var n;const r=((n=t?.value)==null?void 0:n.ownerDocument)??globalThis?.document,o=F(!1);return pt(s=>{if(!Xn)return;const a=async i=>{t!=null&&t.value&&(await it(),!(!t.value||wb(t.value,i.target))&&i.target&&!o.value&&ip(gM,e,{originalEvent:i}))};r.addEventListener("focusin",a),s(()=>r.removeEventListener("focusin",a))}),{onFocusCapture:()=>o.value=!0,onBlurCapture:()=>o.value=!1}}const gn=xo({layersRoot:new Set,layersWithOutsidePointerEventsDisabled:new Set,branches:new Set}),Xl=I({__name:"DismissableLayer",props:{disableOutsidePointerEvents:{type:Boolean,default:!1},asChild:{type:Boolean},as:{}},emits:["escapeKeyDown","pointerDownOutside","focusOutside","interactOutside","dismiss"],setup(e,{emit:t}){const n=e,r=t,{forwardRef:o,currentElement:s}=ve(),a=$(()=>{var m;return((m=s.value)==null?void 0:m.ownerDocument)??globalThis.document}),i=$(()=>gn.layersRoot),l=$(()=>s.value?Array.from(i.value).indexOf(s.value):-1),u=$(()=>gn.layersWithOutsidePointerEventsDisabled.size>0),c=$(()=>{const m=Array.from(i.value),[g]=[...gn.layersWithOutsidePointerEventsDisabled].slice(-1),v=m.indexOf(g);return l.value>=v}),d=vM(async m=>{const g=[...gn.branches].some(v=>v?.contains(m.target));!c.value||g||(r("pointerDownOutside",m),r("interactOutside",m),await it(),m.defaultPrevented||r("dismiss"))},s),p=yM(m=>{[...gn.branches].some(g=>g?.contains(m.target))||(r("focusOutside",m),r("interactOutside",m),m.defaultPrevented||r("dismiss"))},s);cp("Escape",m=>{l.value===i.value.size-1&&(r("escapeKeyDown",m),m.defaultPrevented||r("dismiss"))});let h;return pt(m=>{s.value&&(n.disableOutsidePointerEvents&&(gn.layersWithOutsidePointerEventsDisabled.size===0&&(h=a.value.body.style.pointerEvents,a.value.body.style.pointerEvents="none"),gn.layersWithOutsidePointerEventsDisabled.add(s.value)),i.value.add(s.value),m(()=>{n.disableOutsidePointerEvents&&gn.layersWithOutsidePointerEventsDisabled.size===1&&(a.value.body.style.pointerEvents=h)}))}),pt(m=>{m(()=>{s.value&&(i.value.delete(s.value),gn.layersWithOutsidePointerEventsDisabled.delete(s.value))})}),(m,g)=>(S(),L(f(Ce),{ref:f(o),"as-child":m.asChild,as:m.as,"data-dismissable-layer":"",style:Wt({pointerEvents:u.value?c.value?"auto":"none":void 0}),onFocusCapture:f(p).onFocusCapture,onBlurCapture:f(p).onBlurCapture,onPointerdownCapture:f(d).onPointerDownCapture},{default:_(()=>[V(m.$slots,"default")]),_:3},8,["as-child","as","style","onFocusCapture","onBlurCapture","onPointerdownCapture"]))}}),bM=I({__name:"DismissableLayerBranch",props:{asChild:{type:Boolean},as:{}},setup(e){const t=e,{forwardRef:n,currentElement:r}=ve();return $e(()=>{gn.branches.add(r.value)}),Yt(()=>{gn.branches.delete(r.value)}),(o,s)=>(S(),L(f(Ce),le({ref:f(n)},t),{default:_(()=>[V(o.$slots,"default")]),_:3},16))}}),jc="focusScope.autoFocusOnMount",Hc="focusScope.autoFocusOnUnmount",Um={bubbles:!1,cancelable:!0};function Ti(e,{select:t=!1}={}){const n=document.activeElement;for(const r of e)if(Mr(r,{select:t}),document.activeElement!==n)return!0}function _M(e){const t=vp(e),n=Wm(t,e),r=Wm(t.reverse(),e);return[n,r]}function vp(e){const t=[],n=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT,{acceptNode:r=>{const o=r.tagName==="INPUT"&&r.type==="hidden";return r.disabled||r.hidden||o?NodeFilter.FILTER_SKIP:r.tabIndex>=0?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP}});for(;n.nextNode();)t.push(n.currentNode);return t}function Wm(e,t){for(const n of e)if(!xM(n,{upTo:t}))return n}function xM(e,{upTo:t}){if(getComputedStyle(e).visibility==="hidden")return!0;for(;e;){if(t!==void 0&&e===t)return!1;if(getComputedStyle(e).display==="none")return!0;e=e.parentElement}return!1}function wM(e){return e instanceof HTMLInputElement&&"select"in e}function Mr(e,{select:t=!1}={}){if(e&&e.focus){const n=document.activeElement;e.focus({preventScroll:!0}),e!==n&&wM(e)&&t&&e.select()}}const kM=SO(()=>F([]));function CM(){const e=kM();return{add(t){const n=e.value[0];t!==n&&n?.pause(),e.value=Ym(e.value,t),e.value.unshift(t)},remove(t){var n;e.value=Ym(e.value,t),(n=e.value[0])==null||n.resume()}}}function Ym(e,t){const n=[...e],r=n.indexOf(t);return r!==-1&&n.splice(r,1),n}function SM(e){return e.filter(t=>t.tagName!=="A")}const kb=I({__name:"FocusScope",props:{loop:{type:Boolean,default:!1},trapped:{type:Boolean,default:!1},asChild:{type:Boolean},as:{}},emits:["mountAutoFocus","unmountAutoFocus"],setup(e,{emit:t}){const n=e,r=t,{currentRef:o,currentElement:s}=ve(),a=F(null),i=CM(),l=xo({paused:!1,pause(){this.paused=!0},resume(){this.paused=!1}});pt(c=>{if(!Xn)return;const d=s.value;if(!n.trapped)return;function p(v){if(l.paused||!d)return;const y=v.target;d.contains(y)?a.value=y:Mr(a.value,{select:!0})}function h(v){if(l.paused||!d)return;const y=v.relatedTarget;y!==null&&(d.contains(y)||Mr(a.value,{select:!0}))}function m(v){d.contains(a.value)||Mr(d)}document.addEventListener("focusin",p),document.addEventListener("focusout",h);const g=new MutationObserver(m);d&&g.observe(d,{childList:!0,subtree:!0}),c(()=>{document.removeEventListener("focusin",p),document.removeEventListener("focusout",h),g.disconnect()})}),pt(async c=>{const d=s.value;if(await it(),!d)return;i.add(l);const p=document.activeElement;if(!d.contains(p)){const h=new CustomEvent(jc,Um);d.addEventListener(jc,m=>r("mountAutoFocus",m)),d.dispatchEvent(h),h.defaultPrevented||(Ti(SM(vp(d)),{select:!0}),document.activeElement===p&&Mr(d))}c(()=>{d.removeEventListener(jc,g=>r("mountAutoFocus",g));const h=new CustomEvent(Hc,Um),m=g=>{r("unmountAutoFocus",g)};d.addEventListener(Hc,m),d.dispatchEvent(h),setTimeout(()=>{h.defaultPrevented||Mr(p??document.body,{select:!0}),d.removeEventListener(Hc,m),i.remove(l)},0)})});function u(c){if(!n.loop&&!n.trapped||l.paused)return;const d=c.key==="Tab"&&!c.altKey&&!c.ctrlKey&&!c.metaKey,p=document.activeElement;if(d&&p){const h=c.currentTarget,[m,g]=_M(h);m&&g?!c.shiftKey&&p===g?(c.preventDefault(),n.loop&&Mr(m,{select:!0})):c.shiftKey&&p===m&&(c.preventDefault(),n.loop&&Mr(g,{select:!0})):p===h&&c.preventDefault()}}return(c,d)=>(S(),L(f(Ce),{ref_key:"currentRef",ref:o,tabindex:"-1","as-child":c.asChild,as:c.as,onKeydown:u},{default:_(()=>[V(c.$slots,"default")]),_:3},8,["as-child","as"]))}});function EM(e){return e?"open":"closed"}const Cb=I({__name:"DialogContentImpl",props:{forceMount:{type:Boolean},trapFocus:{type:Boolean},disableOutsidePointerEvents:{type:Boolean},asChild:{type:Boolean},as:{}},emits:["escapeKeyDown","pointerDownOutside","focusOutside","interactOutside","openAutoFocus","closeAutoFocus"],setup(e,{emit:t}){const n=e,r=t,o=Jn(),{forwardRef:s,currentElement:a}=ve();return o.titleId||(o.titleId=Ut(void 0,"radix-vue-dialog-title")),o.descriptionId||(o.descriptionId=Ut(void 0,"radix-vue-dialog-description")),$e(()=>{o.contentElement=a,document.activeElement!==document.body&&(o.triggerElement.value=document.activeElement)}),(i,l)=>(S(),L(f(kb),{"as-child":"",loop:"",trapped:n.trapFocus,onMountAutoFocus:l[5]||(l[5]=u=>r("openAutoFocus",u)),onUnmountAutoFocus:l[6]||(l[6]=u=>r("closeAutoFocus",u))},{default:_(()=>[x(f(Xl),le({id:f(o).contentId,ref:f(s),as:i.as,"as-child":i.asChild,"disable-outside-pointer-events":i.disableOutsidePointerEvents,role:"dialog","aria-describedby":f(o).descriptionId,"aria-labelledby":f(o).titleId,"data-state":f(EM)(f(o).open.value)},i.$attrs,{onDismiss:l[0]||(l[0]=u=>f(o).onOpenChange(!1)),onEscapeKeyDown:l[1]||(l[1]=u=>r("escapeKeyDown",u)),onFocusOutside:l[2]||(l[2]=u=>r("focusOutside",u)),onInteractOutside:l[3]||(l[3]=u=>r("interactOutside",u)),onPointerDownOutside:l[4]||(l[4]=u=>r("pointerDownOutside",u))}),{default:_(()=>[V(i.$slots,"default")]),_:3},16,["id","as","as-child","disable-outside-pointer-events","aria-describedby","aria-labelledby","data-state"])]),_:3},8,["trapped"]))}}),AM=I({__name:"DialogContentModal",props:{forceMount:{type:Boolean},trapFocus:{type:Boolean},disableOutsidePointerEvents:{type:Boolean},asChild:{type:Boolean},as:{}},emits:["escapeKeyDown","pointerDownOutside","focusOutside","interactOutside","openAutoFocus","closeAutoFocus"],setup(e,{emit:t}){const n=e,r=t,o=Jn(),s=Zl(r),{forwardRef:a,currentElement:i}=ve();return pp(i),(l,u)=>(S(),L(Cb,le({...n,...f(s)},{ref:f(a),"trap-focus":f(o).open.value,"disable-outside-pointer-events":!0,onCloseAutoFocus:u[0]||(u[0]=c=>{var d;c.defaultPrevented||(c.preventDefault(),(d=f(o).triggerElement.value)==null||d.focus())}),onPointerDownOutside:u[1]||(u[1]=c=>{const d=c.detail.originalEvent,p=d.button===0&&d.ctrlKey===!0;(d.button===2||p)&&c.preventDefault()}),onFocusOutside:u[2]||(u[2]=c=>{c.preventDefault()})}),{default:_(()=>[V(l.$slots,"default")]),_:3},16,["trap-focus"]))}}),DM=I({__name:"DialogContentNonModal",props:{forceMount:{type:Boolean},trapFocus:{type:Boolean},disableOutsidePointerEvents:{type:Boolean},asChild:{type:Boolean},as:{}},emits:["escapeKeyDown","pointerDownOutside","focusOutside","interactOutside","openAutoFocus","closeAutoFocus"],setup(e,{emit:t}){const n=e,r=Zl(t);ve();const o=Jn(),s=F(!1),a=F(!1);return(i,l)=>(S(),L(Cb,le({...n,...f(r)},{"trap-focus":!1,"disable-outside-pointer-events":!1,onCloseAutoFocus:l[0]||(l[0]=u=>{var c;u.defaultPrevented||(s.value||(c=f(o).triggerElement.value)==null||c.focus(),u.preventDefault()),s.value=!1,a.value=!1}),onInteractOutside:l[1]||(l[1]=u=>{var c;u.defaultPrevented||(s.value=!0,u.detail.originalEvent.type==="pointerdown"&&(a.value=!0));const d=u.target;(c=f(o).triggerElement.value)!=null&&c.contains(d)&&u.preventDefault(),u.detail.originalEvent.type==="focusin"&&a.value&&u.preventDefault()})}),{default:_(()=>[V(i.$slots,"default")]),_:3},16))}}),TM=I({__name:"DialogContent",props:{forceMount:{type:Boolean},trapFocus:{type:Boolean},disableOutsidePointerEvents:{type:Boolean},asChild:{type:Boolean},as:{}},emits:["escapeKeyDown","pointerDownOutside","focusOutside","interactOutside","openAutoFocus","closeAutoFocus"],setup(e,{emit:t}){const n=e,r=t,o=Jn(),s=Zl(r),{forwardRef:a}=ve();return(i,l)=>(S(),L(f(On),{present:i.forceMount||f(o).open.value},{default:_(()=>[f(o).modal.value?(S(),L(AM,le({key:0,ref:f(a)},{...n,...f(s),...i.$attrs}),{default:_(()=>[V(i.$slots,"default")]),_:3},16)):(S(),L(DM,le({key:1,ref:f(a)},{...n,...f(s),...i.$attrs}),{default:_(()=>[V(i.$slots,"default")]),_:3},16))]),_:3},8,["present"]))}}),OM=I({__name:"DialogOverlayImpl",props:{asChild:{type:Boolean},as:{}},setup(e){const t=Jn();return dp(!0),ve(),(n,r)=>(S(),L(f(Ce),{as:n.as,"as-child":n.asChild,"data-state":f(t).open.value?"open":"closed",style:{"pointer-events":"auto"}},{default:_(()=>[V(n.$slots,"default")]),_:3},8,["as","as-child","data-state"]))}}),MM=I({__name:"DialogOverlay",props:{forceMount:{type:Boolean},asChild:{type:Boolean},as:{}},setup(e){const t=Jn(),{forwardRef:n}=ve();return(r,o)=>{var s;return(s=f(t))!=null&&s.modal.value?(S(),L(f(On),{key:0,present:r.forceMount||f(t).open.value},{default:_(()=>[x(OM,le(r.$attrs,{ref:f(n),as:r.as,"as-child":r.asChild}),{default:_(()=>[V(r.$slots,"default")]),_:3},16,["as","as-child"])]),_:3},8,["present"])):_e("",!0)}}}),RM=I({__name:"DialogClose",props:{asChild:{type:Boolean},as:{default:"button"}},setup(e){const t=e;ve();const n=Jn();return(r,o)=>(S(),L(f(Ce),le(t,{type:r.as==="button"?"button":void 0,onClick:o[0]||(o[0]=s=>f(n).onOpenChange(!1))}),{default:_(()=>[V(r.$slots,"default")]),_:3},16,["type"]))}}),PM=I({__name:"DialogTitle",props:{asChild:{type:Boolean},as:{default:"h2"}},setup(e){const t=e,n=Jn();return ve(),(r,o)=>(S(),L(f(Ce),le(t,{id:f(n).titleId}),{default:_(()=>[V(r.$slots,"default")]),_:3},16,["id"]))}}),$M=I({__name:"DialogDescription",props:{asChild:{type:Boolean},as:{default:"p"}},setup(e){const t=e;ve();const n=Jn();return(r,o)=>(S(),L(f(Ce),le(t,{id:f(n).descriptionId}),{default:_(()=>[V(r.$slots,"default")]),_:3},16,["id"]))}}),[FM,IM]=dt("AvatarRoot"),LM=I({__name:"AvatarRoot",props:{asChild:{type:Boolean},as:{default:"span"}},setup(e){return ve(),IM({imageLoadingStatus:F("loading")}),(t,n)=>(S(),L(f(Ce),{"as-child":t.asChild,as:t.as},{default:_(()=>[V(t.$slots,"default")]),_:3},8,["as-child","as"]))}}),NM=I({__name:"AvatarFallback",props:{delayMs:{default:0},asChild:{type:Boolean},as:{default:"span"}},setup(e){const t=e,n=FM();ve();const r=F(!1);let o;return Oe(n.imageLoadingStatus,s=>{s==="loading"&&(r.value=!1,t.delayMs?o=setTimeout(()=>{r.value=!0,clearTimeout(o)},t.delayMs):r.value=!0)},{immediate:!0}),(s,a)=>r.value&&f(n).imageLoadingStatus.value!=="loaded"?(S(),L(f(Ce),{key:0,"as-child":s.asChild,as:s.as},{default:_(()=>[V(s.$slots,"default")]),_:3},8,["as-child","as"])):_e("",!0)}});function nl(e){return e==="indeterminate"}function Sb(e){return nl(e)?"indeterminate":e?"checked":"unchecked"}const zM=["value","checked","name","disabled","required"],[BM,qM]=dt("CheckboxRoot"),VM=I({inheritAttrs:!1,__name:"CheckboxRoot",props:{defaultChecked:{type:Boolean},checked:{type:[Boolean,String],default:void 0},disabled:{type:Boolean},required:{type:Boolean},name:{},value:{default:"on"},id:{},asChild:{type:Boolean},as:{default:"button"}},emits:["update:checked"],setup(e,{emit:t}){const n=e,r=t,{disabled:o}=vt(n),s=ln(n,"checked",r,{defaultValue:n.defaultChecked,passive:n.checked===void 0}),{forwardRef:a,currentElement:i}=ve(),l=fp(i),u=$(()=>{var c;return n.id&&i.value?(c=document.querySelector(`[for="${n.id}"]`))==null?void 0:c.innerText:void 0});return qM({disabled:o,state:s}),(c,d)=>(S(),K(Fe,null,[x(f(Ce),le(c.$attrs,{id:c.id,ref:f(a),role:"checkbox","as-child":n.asChild,as:c.as,type:c.as==="button"?"button":void 0,"aria-checked":f(nl)(f(s))?"mixed":f(s),"aria-required":!1,"aria-label":c.$attrs["aria-label"]||u.value,"data-state":f(Sb)(f(s)),"data-disabled":f(o)?"":void 0,disabled:f(o),onKeydown:zr(Ct(()=>{},["prevent"]),["enter"]),onClick:d[0]||(d[0]=p=>s.value=f(nl)(f(s))?!0:!f(s))}),{default:_(()=>[V(c.$slots,"default",{checked:f(s)})]),_:3},16,["id","as-child","as","type","aria-checked","aria-label","data-state","data-disabled","disabled","onKeydown"]),f(l)?(S(),K("input",{key:0,type:"checkbox",tabindex:"-1","aria-hidden":"true",value:c.value,checked:!!f(s),name:n.name,disabled:n.disabled,required:n.required,style:{transform:"translateX(-100%)",position:"absolute",pointerEvents:"none",opacity:0,margin:0}},null,8,zM)):_e("",!0)],64))}}),jM=I({__name:"CheckboxIndicator",props:{forceMount:{type:Boolean},asChild:{type:Boolean},as:{default:"span"}},setup(e){const{forwardRef:t}=ve(),n=BM();return(r,o)=>(S(),L(f(On),{present:r.forceMount||f(nl)(f(n).state.value)||f(n).state.value===!0},{default:_(()=>[x(f(Ce),le({ref:f(t),"data-state":f(Sb)(f(n).state.value),"data-disabled":f(n).disabled.value?"":void 0,style:{pointerEvents:"none"},"as-child":r.asChild,as:r.as},r.$attrs),{default:_(()=>[V(r.$slots,"default")]),_:3},16,["data-state","data-disabled","as-child","as"])]),_:3},8,["present"]))}}),[Eb,HM]=dt("PopperRoot"),yp=I({inheritAttrs:!1,__name:"PopperRoot",setup(e){const t=F();return HM({anchor:t,onAnchorChange:n=>t.value=n}),(n,r)=>V(n.$slots,"default")}}),Ab=I({__name:"PopperAnchor",props:{element:{},asChild:{type:Boolean},as:{}},setup(e){const t=e,{forwardRef:n,currentElement:r}=ve(),o=Eb();return pt(()=>{o.onAnchorChange(t.element??r.value)}),(s,a)=>(S(),L(f(Ce),{ref:f(n),as:s.as,"as-child":s.asChild},{default:_(()=>[V(s.$slots,"default")]),_:3},8,["as","as-child"]))}});function UM(e){return e!==null}function WM(e){return{name:"transformOrigin",options:e,fn(t){var n,r,o;const{placement:s,rects:a,middlewareData:i}=t,l=((n=i.arrow)==null?void 0:n.centerOffset)!==0,u=l?0:e.arrowWidth,c=l?0:e.arrowHeight,[d,p]=Gd(s),h={start:"0%",center:"50%",end:"100%"}[p],m=(((r=i.arrow)==null?void 0:r.x)??0)+u/2,g=(((o=i.arrow)==null?void 0:o.y)??0)+c/2;let v="",y="";return d==="bottom"?(v=l?h:`${m}px`,y=`${-c}px`):d==="top"?(v=l?h:`${m}px`,y=`${a.floating.height+c}px`):d==="right"?(v=`${-c}px`,y=l?h:`${g}px`):d==="left"&&(v=`${a.floating.width+c}px`,y=l?h:`${g}px`),{data:{x:v,y}}}}}function Gd(e){const[t,n="center"]=e.split("-");return[t,n]}const YM={side:"bottom",sideOffset:0,align:"center",alignOffset:0,arrowPadding:0,avoidCollisions:!0,collisionBoundary:()=>[],collisionPadding:0,sticky:"partial",hideWhenDetached:!1,updatePositionStrategy:"optimized",prioritizePosition:!1},[T_e,GM]=dt("PopperContent"),rl=I({inheritAttrs:!1,__name:"PopperContent",props:nw({side:{},sideOffset:{},align:{},alignOffset:{},avoidCollisions:{type:Boolean},collisionBoundary:{},collisionPadding:{},arrowPadding:{},sticky:{},hideWhenDetached:{type:Boolean},updatePositionStrategy:{},prioritizePosition:{type:Boolean},asChild:{type:Boolean},as:{}},{...YM}),emits:["placed"],setup(e,{emit:t}){const n=e,r=t,o=Eb(),{forwardRef:s,currentElement:a}=ve(),i=F(),l=F(),{width:u,height:c}=cM(l),d=$(()=>n.side+(n.align!=="center"?`-${n.align}`:"")),p=$(()=>typeof n.collisionPadding=="number"?n.collisionPadding:{top:0,right:0,bottom:0,left:0,...n.collisionPadding}),h=$(()=>Array.isArray(n.collisionBoundary)?n.collisionBoundary:[n.collisionBoundary]),m=$(()=>({padding:p.value,boundary:h.value.filter(UM),altBoundary:h.value.length>0})),g=kO(()=>[cO({mainAxis:n.sideOffset+c.value,alignmentAxis:n.alignOffset}),n.prioritizePosition&&n.avoidCollisions&&qm({...m.value}),n.avoidCollisions&&uO({mainAxis:!0,crossAxis:!!n.prioritizePosition,limiter:n.sticky==="partial"?hO():void 0,...m.value}),!n.prioritizePosition&&n.avoidCollisions&&qm({...m.value}),dO({...m.value,apply:({elements:P,rects:W,availableWidth:z,availableHeight:re})=>{const{width:B,height:ue}=W.reference,Q=P.floating.style;Q.setProperty("--radix-popper-available-width",`${z}px`),Q.setProperty("--radix-popper-available-height",`${re}px`),Q.setProperty("--radix-popper-anchor-width",`${B}px`),Q.setProperty("--radix-popper-anchor-height",`${ue}px`)}}),l.value&&vO({element:l.value,padding:n.arrowPadding}),WM({arrowWidth:u.value,arrowHeight:c.value}),n.hideWhenDetached&&fO({strategy:"referenceHidden",...m.value})]),{floatingStyles:v,placement:y,isPositioned:k,middlewareData:b}=yO(o.anchor,i,{strategy:"fixed",placement:d,whileElementsMounted:(...P)=>lO(...P,{animationFrame:n.updatePositionStrategy==="always"}),middleware:g}),w=$(()=>Gd(y.value)[0]),C=$(()=>Gd(y.value)[1]);kw(()=>{k.value&&r("placed")});const A=$(()=>{var P;return((P=b.value.arrow)==null?void 0:P.centerOffset)!==0}),R=F("");pt(()=>{a.value&&(R.value=window.getComputedStyle(a.value).zIndex)});const M=$(()=>{var P;return((P=b.value.arrow)==null?void 0:P.x)??0}),O=$(()=>{var P;return((P=b.value.arrow)==null?void 0:P.y)??0});return GM({placedSide:w,onArrowChange:P=>l.value=P,arrowX:M,arrowY:O,shouldHideArrow:A}),(P,W)=>{var z,re,B;return S(),K("div",{ref_key:"floatingRef",ref:i,"data-radix-popper-content-wrapper":"",style:Wt({...f(v),transform:f(k)?f(v).transform:"translate(0, -200%)",minWidth:"max-content",zIndex:R.value,"--radix-popper-transform-origin":[(z=f(b).transformOrigin)==null?void 0:z.x,(re=f(b).transformOrigin)==null?void 0:re.y].join(" "),...((B=f(b).hide)==null?void 0:B.referenceHidden)&&{visibility:"hidden",pointerEvents:"none"}})},[x(f(Ce),le({ref:f(s)},P.$attrs,{"as-child":n.asChild,as:P.as,"data-side":w.value,"data-align":C.value,style:{animation:f(k)?void 0:"none"}}),{default:_(()=>[V(P.$slots,"default")]),_:3},16,["as-child","as","data-side","data-align","style"])],4)}}}),Jl=I({__name:"VisuallyHidden",props:{asChild:{type:Boolean},as:{default:"span"}},setup(e){return ve(),(t,n)=>(S(),L(f(Ce),{as:t.as,"as-child":t.asChild,style:{position:"absolute",border:0,width:"1px",display:"inline-block",height:"1px",padding:0,margin:"-1px",overflow:"hidden",clip:"rect(0, 0, 0, 0)",whiteSpace:"nowrap",wordWrap:"normal"}},{default:_(()=>[V(t.$slots,"default")]),_:3},8,["as","as-child"]))}}),KM=I({__name:"VisuallyHiddenInput",props:{name:{},value:{},required:{type:Boolean},disabled:{type:Boolean}},setup(e){const t=e,n=$(()=>typeof t.value=="string"||typeof t.value=="number"||typeof t.value=="boolean"?[{name:t.name,value:t.value}]:typeof t.value=="object"&&Array.isArray(t.value)?t.value.flatMap((r,o)=>typeof r=="object"?Object.entries(r).map(([s,a])=>({name:`[${o}][${t.name}][${s}]`,value:a})):{name:`[${t.name}][${o}]`,value:r}):t.value!==null&&typeof t.value=="object"&&!Array.isArray(t.value)?Object.entries(t.value).map(([r,o])=>({name:`[${t.name}][${r}]`,value:o})):[]);return(r,o)=>(S(!0),K(Fe,null,It(n.value,s=>(S(),L(Jl,{key:s.name,as:"input",type:"hidden",hidden:"",readonly:"",name:s.name,value:s.value,required:r.required,disabled:r.disabled},null,8,["name","value","required","disabled"]))),128))}}),ZM="data-radix-vue-collection-item",[bp,XM]=dt("CollectionProvider");function Db(e=ZM){const t=F(new Map),n=F(),r=XM({collectionRef:n,itemMap:t,attrName:e}),{getItems:o}=Mb(r),s=$(()=>Array.from(r.itemMap.value.values())),a=$(()=>r.itemMap.value.size);return{getItems:o,reactiveItems:s,itemMapSize:a}}const Tb=I({name:"CollectionSlot",setup(e,{slots:t}){const n=bp(),{primitiveElement:r,currentElement:o}=mp();return Oe(o,()=>{n.collectionRef.value=o.value}),()=>Vt(hp,{ref:r},t)}}),Ob=I({name:"CollectionItem",inheritAttrs:!1,props:{value:{validator:()=>!0}},setup(e,{slots:t,attrs:n}){const r=bp(),{primitiveElement:o,currentElement:s}=mp();return pt(a=>{if(s.value){const i=bl(s.value);r.itemMap.value.set(i,{ref:s.value,value:e.value}),a(()=>r.itemMap.value.delete(i))}}),()=>Vt(hp,{...n,[r.attrName]:"",ref:o},t)}});function Mb(e){const t=e??bp();return{getItems:()=>{const n=t.collectionRef.value;if(!n)return[];const r=Array.from(n.querySelectorAll(`[${t.attrName}]`));return Array.from(t.itemMap.value.values()).sort((o,s)=>r.indexOf(o.ref)-r.indexOf(s.ref))}}}const[ys,JM]=dt("ComboboxRoot"),QM=I({__name:"ComboboxRoot",props:{modelValue:{},defaultValue:{},open:{type:Boolean,default:void 0},defaultOpen:{type:Boolean},searchTerm:{},selectedValue:{},multiple:{type:Boolean},disabled:{type:Boolean},name:{},dir:{},filterFunction:{},displayValue:{},resetSearchTermOnBlur:{type:Boolean,default:!0},asChild:{type:Boolean},as:{}},emits:["update:modelValue","update:open","update:searchTerm","update:selectedValue"],setup(e,{emit:t}){const n=e,r=t,{multiple:o,disabled:s,dir:a}=vt(n),i=qa(a),l=ln(n,"searchTerm",r,{defaultValue:"",passive:n.searchTerm===void 0}),u=ln(n,"modelValue",r,{defaultValue:n.defaultValue??o.value?[]:void 0,passive:n.modelValue===void 0,deep:!0}),c=ln(n,"open",r,{defaultValue:n.defaultOpen,passive:n.open===void 0}),d=ln(n,"selectedValue",r,{defaultValue:void 0,passive:n.selectedValue===void 0});async function p(H){var U,ae;c.value=H,await it(),H?(u.value&&(Array.isArray(u.value)&&o.value?d.value=(U=b().find(pe=>{var Le,Je;return((Je=(Le=pe.ref)==null?void 0:Le.dataset)==null?void 0:Je.state)==="checked"}))==null?void 0:U.value:d.value=u.value),await it(),(ae=g.value)==null||ae.focus(),re()):(m.value=!1,n.resetSearchTermOnBlur&&M())}function h(H){if(Array.isArray(u.value)&&o.value){const U=u.value.findIndex(pe=>co(pe,H)),ae=[...u.value];U===-1?ae.push(H):ae.splice(U,1),u.value=ae}else u.value=H,p(!1)}const m=F(!1),g=F(),v=F(),{forwardRef:y,currentElement:k}=ve(),{getItems:b,reactiveItems:w,itemMapSize:C}=Db("data-radix-vue-combobox-item"),A=F([]);Oe(()=>C.value,()=>{A.value=b().map(H=>H.value)},{immediate:!0,flush:"post"});const R=$(()=>{if(m.value){if(n.filterFunction)return n.filterFunction(A.value,l.value);const H=A.value.filter(U=>typeof U=="string");if(H.length)return H.filter(U=>{var ae;return U.toLowerCase().includes((ae=l.value)==null?void 0:ae.toLowerCase())})}return A.value});function M(){!o.value&&u.value&&!Array.isArray(u.value)?n.displayValue?l.value=n.displayValue(u.value):typeof u.value!="object"?l.value=u.value.toString():l.value="":l.value=""}const O=$(()=>R.value.findIndex(H=>co(H,d.value))),P=$(()=>{var H;return(H=w.value.find(U=>co(U.value,d.value)))==null?void 0:H.ref}),W=$(()=>JSON.stringify(u.value));Oe(W,async()=>{await it(),await it(),M()},{immediate:!n.searchTerm}),Oe(()=>[R.value.length,l.value.length],async([H,U],[ae,pe])=>{await it(),await it(),H&&(pe>U||O.value===-1)&&(d.value=R.value[0])});const z=fp(k);function re(){var H;P.value instanceof Element&&((H=P.value)==null||H.scrollIntoView({block:"nearest"}))}function B(){P.value instanceof Element&&P.value.focus&&P.value.focus()}const ue=F(!1);function Q(){ue.value=!0}function j(){requestAnimationFrame(()=>{ue.value=!1})}async function Z(H){var U;R.value.length&&d.value&&P.value instanceof Element&&(H.preventDefault(),H.stopPropagation(),ue.value||(U=P.value)==null||U.click())}return JM({searchTerm:l,modelValue:u,onValueChange:h,isUserInputted:m,multiple:o,disabled:s,open:c,onOpenChange:p,filteredOptions:R,contentId:"",inputElement:g,selectedElement:P,onInputElementChange:H=>g.value=H,onInputNavigation:async H=>{const U=O.value;U===0&&H==="up"||U===R.value.length-1&&H==="down"||(U===-1&&R.value.length||H==="home"?d.value=R.value[0]:H==="end"?d.value=R.value[R.value.length-1]:d.value=R.value[H==="up"?U-1:U+1],await it(),re(),B(),it(()=>{var ae;return(ae=g.value)==null?void 0:ae.focus({preventScroll:!0})}))},onInputEnter:Z,onCompositionEnd:j,onCompositionStart:Q,selectedValue:d,onSelectedValueChange:H=>d.value=H,parentElement:k,contentElement:v,onContentElementChange:H=>v.value=H}),(H,U)=>(S(),L(f(yp),null,{default:_(()=>[x(f(Ce),le({ref:f(y),style:{pointerEvents:f(c)?"auto":void 0},as:H.as,"as-child":H.asChild,dir:f(i)},H.$attrs),{default:_(()=>[V(H.$slots,"default",{open:f(c),modelValue:f(u)}),f(z)&&n.name?(S(),L(f(KM),{key:0,name:n.name,value:f(u)},null,8,["name","value"])):_e("",!0)]),_:3},16,["style","as","as-child","dir"])]),_:3}))}}),eR=I({__name:"ComboboxInput",props:{type:{default:"text"},disabled:{type:Boolean},autoFocus:{type:Boolean},asChild:{type:Boolean},as:{default:"input"}},setup(e){const t=e,n=ys(),{forwardRef:r,currentElement:o}=ve();$e(()=>{const c=o.value.nodeName==="INPUT"?o.value:o.value.querySelector("input");c&&(n.onInputElementChange(c),setTimeout(()=>{t.autoFocus&&c?.focus()},1))});const s=$(()=>t.disabled||n.disabled.value||!1),a=F();ey(()=>{var c;return a.value=(c=n.selectedElement.value)==null?void 0:c.id});function i(c){n.open.value?n.onInputNavigation(c.key==="ArrowUp"?"up":"down"):n.onOpenChange(!0)}function l(c){n.open.value&&n.onInputNavigation(c.key==="Home"?"home":"end")}function u(c){var d;n.searchTerm.value=(d=c.target)==null?void 0:d.value,n.open.value||n.onOpenChange(!0),n.isUserInputted.value=!0}return(c,d)=>(S(),L(f(Ce),{ref:f(r),as:c.as,"as-child":c.asChild,type:c.type,disabled:s.value,value:f(n).searchTerm.value,"aria-expanded":f(n).open.value,"aria-controls":f(n).contentId,"aria-disabled":s.value??void 0,"aria-activedescendant":a.value,"aria-autocomplete":"list",role:"combobox",autocomplete:"false",onInput:u,onKeydown:[zr(Ct(i,["prevent"]),["down","up"]),zr(f(n).onInputEnter,["enter"]),zr(Ct(l,["prevent"]),["home","end"])],onCompositionstart:f(n).onCompositionStart,onCompositionend:f(n).onCompositionEnd},{default:_(()=>[V(c.$slots,"default")]),_:3},8,["as","as-child","type","disabled","value","aria-expanded","aria-controls","aria-disabled","aria-activedescendant","onKeydown","onCompositionstart","onCompositionend"]))}}),[Rb,tR]=dt("ComboboxGroup"),nR=I({__name:"ComboboxGroup",props:{asChild:{type:Boolean},as:{}},setup(e){const t=e,{currentRef:n,currentElement:r}=ve(),o=Ut(void 0,"radix-vue-combobox-group"),s=ys(),a=F(!1);function i(){if(!r.value)return;const l=r.value.querySelectorAll("[data-radix-vue-combobox-item]:not([data-hidden])");a.value=!!l.length}return BO(r,()=>{it(()=>{i()})},{childList:!0}),Oe(()=>s.searchTerm.value,()=>{it(()=>{i()})},{immediate:!0}),tR({id:o}),(l,u)=>Ho((S(),L(f(Ce),le(t,{ref_key:"currentRef",ref:n,role:"group","aria-labelledby":f(o)}),{default:_(()=>[V(l.$slots,"default")]),_:3},16,["aria-labelledby"])),[[hy,a.value]])}}),rR=I({__name:"ComboboxLabel",props:{for:{},asChild:{type:Boolean},as:{default:"div"}},setup(e){const t=e;ve();const n=Rb({id:""});return(r,o)=>(S(),L(f(Ce),le(t,{id:f(n).id}),{default:_(()=>[V(r.$slots,"default")]),_:3},16,["id"]))}}),[O_e,oR]=dt("ComboboxContent"),sR=I({__name:"ComboboxContentImpl",props:{position:{default:"inline"},bodyLock:{type:Boolean},dismissable:{type:Boolean,default:!0},side:{},sideOffset:{},align:{},alignOffset:{},avoidCollisions:{type:Boolean},collisionBoundary:{},collisionPadding:{},arrowPadding:{},sticky:{},hideWhenDetached:{type:Boolean},updatePositionStrategy:{},prioritizePosition:{type:Boolean},asChild:{type:Boolean},as:{},disableOutsidePointerEvents:{type:Boolean}},emits:["escapeKeyDown","pointerDownOutside","focusOutside","interactOutside"],setup(e,{emit:t}){const n=e,r=t,{position:o}=vt(n),s=ys();dp(n.bodyLock);const{forwardRef:a,currentElement:i}=ve();pp(s.parentElement);const l=$(()=>n.position==="popper"?n:{}),u=Xr(l.value);function c(p){s.onSelectedValueChange("")}$e(()=>{s.onContentElementChange(i.value)});const d={boxSizing:"border-box","--radix-combobox-content-transform-origin":"var(--radix-popper-transform-origin)","--radix-combobox-content-available-width":"var(--radix-popper-available-width)","--radix-combobox-content-available-height":"var(--radix-popper-available-height)","--radix-combobox-trigger-width":"var(--radix-popper-anchor-width)","--radix-combobox-trigger-height":"var(--radix-popper-anchor-height)"};return oR({position:o}),(p,h)=>(S(),L(f(Tb),null,{default:_(()=>[p.dismissable?(S(),L(f(Xl),{key:0,"as-child":"","disable-outside-pointer-events":p.disableOutsidePointerEvents,onDismiss:h[0]||(h[0]=m=>f(s).onOpenChange(!1)),onFocusOutside:h[1]||(h[1]=m=>{var g;(g=f(s).parentElement.value)!=null&&g.contains(m.target)&&m.preventDefault(),r("focusOutside",m)}),onInteractOutside:h[2]||(h[2]=m=>r("interactOutside",m)),onEscapeKeyDown:h[3]||(h[3]=m=>r("escapeKeyDown",m)),onPointerDownOutside:h[4]||(h[4]=m=>{var g;(g=f(s).parentElement.value)!=null&&g.contains(m.target)&&m.preventDefault(),r("pointerDownOutside",m)})},{default:_(()=>[(S(),L(Qo(f(o)==="popper"?f(rl):f(Ce)),le({...p.$attrs,...f(u)},{id:f(s).contentId,ref:f(a),role:"listbox","data-state":f(s).open.value?"open":"closed",style:{display:"flex",flexDirection:"column",outline:"none",...f(o)==="popper"?d:{}},onPointerleave:c}),{default:_(()=>[V(p.$slots,"default")]),_:3},16,["id","data-state","style"]))]),_:3},8,["disable-outside-pointer-events"])):(S(),L(Qo(f(o)==="popper"?f(rl):f(Ce)),le({key:1},{...p.$attrs,...l.value},{id:f(s).contentId,ref:f(a),role:"listbox","data-state":f(s).open.value?"open":"closed",style:{display:"flex",flexDirection:"column",outline:"none",...f(o)==="popper"?d:{}},onPointerleave:c}),{default:_(()=>[V(p.$slots,"default")]),_:3},16,["id","data-state","style"]))]),_:3}))}}),aR=I({__name:"ComboboxContent",props:{forceMount:{type:Boolean},position:{},bodyLock:{type:Boolean},dismissable:{type:Boolean},side:{},sideOffset:{},align:{},alignOffset:{},avoidCollisions:{type:Boolean},collisionBoundary:{},collisionPadding:{},arrowPadding:{},sticky:{},hideWhenDetached:{type:Boolean},updatePositionStrategy:{},prioritizePosition:{type:Boolean},asChild:{type:Boolean},as:{},disableOutsidePointerEvents:{type:Boolean}},emits:["escapeKeyDown","pointerDownOutside","focusOutside","interactOutside"],setup(e,{emit:t}){const n=yt(e,t),{forwardRef:r}=ve(),o=ys();return o.contentId||(o.contentId=Ut(void 0,"radix-vue-combobox-content")),(s,a)=>(S(),L(f(On),{present:s.forceMount||f(o).open.value},{default:_(()=>[x(sR,le({...f(n),...s.$attrs},{ref:f(r)}),{default:_(()=>[V(s.$slots,"default")]),_:3},16)]),_:3},8,["present"]))}}),iR=I({__name:"ComboboxEmpty",props:{asChild:{type:Boolean},as:{}},setup(e){const t=e;ve();const n=ys(),r=$(()=>n.filteredOptions.value.length===0);return(o,s)=>r.value?(S(),L(f(Ce),St(le({key:0},t)),{default:_(()=>[V(o.$slots,"default",{},()=>[oe("No options")])]),_:3},16)):_e("",!0)}});function lR(e){const t=Kl({nonce:F()});return $(()=>{var n;return e?.value||((n=t.nonce)==null?void 0:n.value)})}const[M_e,cR]=dt("ComboboxItem"),uR="combobox.select",dR=I({__name:"ComboboxItem",props:{value:{},disabled:{type:Boolean},asChild:{type:Boolean},as:{}},emits:["select"],setup(e,{emit:t}){const n=e,r=t,{disabled:o}=vt(n),s=ys();Rb({id:"",options:F([])});const{forwardRef:a}=ve(),i=$(()=>{var g,v;return s.multiple.value&&Array.isArray(s.modelValue.value)?(g=s.modelValue.value)==null?void 0:g.some(y=>co(y,n.value)):co((v=s.modelValue)==null?void 0:v.value,n.value)}),l=$(()=>co(s.selectedValue.value,n.value)),u=Ut(void 0,"radix-vue-combobox-item"),c=Ut(void 0,"radix-vue-combobox-option"),d=$(()=>s.isUserInputted.value?s.searchTerm.value===""||!!s.filteredOptions.value.find(g=>co(g,n.value)):!0);async function p(g){r("select",g),!(g!=null&&g.defaultPrevented)&&!o.value&&g&&s.onValueChange(n.value)}function h(g){if(!g)return;const v={originalEvent:g,value:n.value};ip(uR,p,v)}async function m(g){await it(),!g.defaultPrevented&&s.onSelectedValueChange(n.value)}if(n.value==="")throw new Error("A must have a value prop that is not an empty string. This is because the Combobox value can be set to an empty string to clear the selection and show the placeholder.");return cR({isSelected:i}),(g,v)=>(S(),L(f(Ob),{value:g.value},{default:_(()=>[Ho(x(f(Ce),{id:f(c),ref:f(a),role:"option",tabindex:"-1","aria-labelledby":f(u),"data-highlighted":l.value?"":void 0,"aria-selected":i.value,"data-state":i.value?"checked":"unchecked","aria-disabled":f(o)||void 0,"data-disabled":f(o)?"":void 0,as:g.as,"as-child":g.asChild,"data-hidden":d.value?void 0:!0,onClick:h,onPointermove:m},{default:_(()=>[V(g.$slots,"default",{},()=>[oe(ne(g.value),1)])]),_:3},8,["id","aria-labelledby","data-highlighted","aria-selected","data-state","aria-disabled","data-disabled","as","as-child","data-hidden"]),[[hy,d.value]])]),_:3},8,["value"]))}}),fR="rovingFocusGroup.onEntryFocus",pR={bubbles:!1,cancelable:!0},hR={ArrowLeft:"prev",ArrowUp:"prev",ArrowRight:"next",ArrowDown:"next",PageUp:"first",Home:"first",PageDown:"last",End:"last"};function mR(e,t){return t!=="rtl"?e:e==="ArrowLeft"?"ArrowRight":e==="ArrowRight"?"ArrowLeft":e}function gR(e,t,n){const r=mR(e.key,n);if(!(t==="vertical"&&["ArrowLeft","ArrowRight"].includes(r))&&!(t==="horizontal"&&["ArrowUp","ArrowDown"].includes(r)))return hR[r]}function Pb(e,t=!1,n){const r=n?.activeElement??document.activeElement;for(const o of e)if(o===r||(o.focus({preventScroll:t}),document.activeElement!==r))return}function vR(e,t){return e.map((n,r)=>e[(t+r)%e.length])}const[yR,bR]=dt("RovingFocusGroup"),_R=I({__name:"RovingFocusGroup",props:{orientation:{default:void 0},dir:{},loop:{type:Boolean,default:!1},currentTabStopId:{},defaultCurrentTabStopId:{},preventScrollOnEntryFocus:{type:Boolean,default:!1},asChild:{type:Boolean},as:{}},emits:["entryFocus","update:currentTabStopId"],setup(e,{expose:t,emit:n}){const r=e,o=n,{loop:s,orientation:a,dir:i}=vt(r),l=qa(i),u=ln(r,"currentTabStopId",o,{defaultValue:r.defaultCurrentTabStopId,passive:r.currentTabStopId===void 0}),c=F(!1),d=F(!1),p=F(0),{getItems:h}=Db();function m(v){const y=!d.value;if(v.currentTarget&&v.target===v.currentTarget&&y&&!c.value){const k=new CustomEvent(fR,pR);if(v.currentTarget.dispatchEvent(k),o("entryFocus",k),!k.defaultPrevented){const b=h().map(R=>R.ref).filter(R=>R.dataset.disabled!==""),w=b.find(R=>R.getAttribute("data-active")==="true"),C=b.find(R=>R.id===u.value),A=[w,C,...b].filter(Boolean);Pb(A,r.preventScrollOnEntryFocus)}}d.value=!1}function g(){setTimeout(()=>{d.value=!1},1)}return t({getItems:h}),bR({loop:s,dir:l,orientation:a,currentTabStopId:u,onItemFocus:v=>{u.value=v},onItemShiftTab:()=>{c.value=!0},onFocusableItemAdd:()=>{p.value++},onFocusableItemRemove:()=>{p.value--}}),(v,y)=>(S(),L(f(Tb),null,{default:_(()=>[x(f(Ce),{tabindex:c.value||p.value===0?-1:0,"data-orientation":f(a),as:v.as,"as-child":v.asChild,dir:f(l),style:{outline:"none"},onMousedown:y[0]||(y[0]=k=>d.value=!0),onMouseup:g,onFocus:m,onBlur:y[1]||(y[1]=k=>c.value=!1)},{default:_(()=>[V(v.$slots,"default")]),_:3},8,["tabindex","data-orientation","as","as-child","dir"])]),_:3}))}}),xR=I({__name:"RovingFocusItem",props:{tabStopId:{},focusable:{type:Boolean,default:!0},active:{type:Boolean,default:!0},allowShiftKey:{type:Boolean},asChild:{type:Boolean},as:{default:"span"}},setup(e){const t=e,n=yR(),r=$(()=>t.tabStopId||Ut()),o=$(()=>n.currentTabStopId.value===r.value),{getItems:s}=Mb(),{primitiveElement:a,currentElement:i}=mp(),l=$(()=>{var c;return(c=i.value)==null?void 0:c.getRootNode()});$e(()=>{t.focusable&&n.onFocusableItemAdd()}),Yt(()=>{t.focusable&&n.onFocusableItemRemove()});function u(c){if(c.key==="Tab"&&c.shiftKey){n.onItemShiftTab();return}if(c.target!==c.currentTarget)return;const d=gR(c,n.orientation.value,n.dir.value);if(d!==void 0){if(c.metaKey||c.ctrlKey||c.altKey||!t.allowShiftKey&&c.shiftKey)return;c.preventDefault();let p=[...s().map(h=>h.ref).filter(h=>h.dataset.disabled!=="")];if(d==="last")p.reverse();else if(d==="prev"||d==="next"){d==="prev"&&p.reverse();const h=p.indexOf(c.currentTarget);p=n.loop.value?vR(p,h+1):p.slice(h+1)}it(()=>Pb(p,!1,l.value))}}return(c,d)=>(S(),L(f(Ob),null,{default:_(()=>[x(f(Ce),{ref_key:"primitiveElement",ref:a,tabindex:o.value?0:-1,"data-orientation":f(n).orientation.value,"data-active":c.active,"data-disabled":c.focusable?void 0:"",as:c.as,"as-child":c.asChild,onMousedown:d[0]||(d[0]=p=>{c.focusable?f(n).onItemFocus(r.value):p.preventDefault()}),onFocus:d[1]||(d[1]=p=>f(n).onItemFocus(r.value)),onKeydown:u},{default:_(()=>[V(c.$slots,"default")]),_:3},8,["tabindex","data-orientation","data-active","data-disabled","as","as-child"])]),_:3}))}}),wR=I({__name:"Label",props:{for:{},asChild:{type:Boolean},as:{default:"label"}},setup(e){const t=e;return ve(),(n,r)=>(S(),L(f(Ce),le(t,{onMousedown:r[0]||(r[0]=o=>{!o.defaultPrevented&&o.detail>1&&o.preventDefault()})}),{default:_(()=>[V(n.$slots,"default")]),_:3},16))}}),[Va,kR]=dt("PopoverRoot"),CR=I({__name:"PopoverRoot",props:{defaultOpen:{type:Boolean,default:!1},open:{type:Boolean,default:void 0},modal:{type:Boolean,default:!1}},emits:["update:open"],setup(e,{emit:t}){const n=e,r=t,{modal:o}=vt(n),s=ln(n,"open",r,{defaultValue:n.defaultOpen,passive:n.open===void 0}),a=F(),i=F(!1);return kR({contentId:"",modal:o,open:s,onOpenChange:l=>{s.value=l},onOpenToggle:()=>{s.value=!s.value},triggerElement:a,hasCustomAnchor:i}),(l,u)=>(S(),L(f(yp),null,{default:_(()=>[V(l.$slots,"default",{open:f(s)})]),_:3}))}}),SR=I({__name:"PopoverTrigger",props:{asChild:{type:Boolean},as:{default:"button"}},setup(e){const t=e,n=Va(),{forwardRef:r,currentElement:o}=ve();return $e(()=>{n.triggerElement.value=o.value}),(s,a)=>(S(),L(Qo(f(n).hasCustomAnchor.value?f(Ce):f(Ab)),{"as-child":""},{default:_(()=>[x(f(Ce),{ref:f(r),type:s.as==="button"?"button":void 0,"aria-haspopup":"dialog","aria-expanded":f(n).open.value,"aria-controls":f(n).contentId,"data-state":f(n).open.value?"open":"closed",as:s.as,"as-child":t.asChild,onClick:f(n).onOpenToggle},{default:_(()=>[V(s.$slots,"default")]),_:3},8,["type","aria-expanded","aria-controls","data-state","as","as-child","onClick"])]),_:3}))}}),ER=I({__name:"PopoverPortal",props:{to:{},disabled:{type:Boolean},forceMount:{type:Boolean}},setup(e){const t=e;return(n,r)=>(S(),L(f(gp),St(Et(t)),{default:_(()=>[V(n.$slots,"default")]),_:3},16))}}),$b=I({__name:"PopoverContentImpl",props:{trapFocus:{type:Boolean},side:{},sideOffset:{},align:{},alignOffset:{},avoidCollisions:{type:Boolean},collisionBoundary:{},collisionPadding:{},arrowPadding:{},sticky:{},hideWhenDetached:{type:Boolean},updatePositionStrategy:{},prioritizePosition:{type:Boolean},asChild:{type:Boolean},as:{},disableOutsidePointerEvents:{type:Boolean}},emits:["escapeKeyDown","pointerDownOutside","focusOutside","interactOutside","openAutoFocus","closeAutoFocus"],setup(e,{emit:t}){const n=e,r=t,o=Xr(n),{forwardRef:s}=ve(),a=Va();return ZO(),(i,l)=>(S(),L(f(kb),{"as-child":"",loop:"",trapped:i.trapFocus,onMountAutoFocus:l[5]||(l[5]=u=>r("openAutoFocus",u)),onUnmountAutoFocus:l[6]||(l[6]=u=>r("closeAutoFocus",u))},{default:_(()=>[x(f(Xl),{"as-child":"","disable-outside-pointer-events":i.disableOutsidePointerEvents,onPointerDownOutside:l[0]||(l[0]=u=>r("pointerDownOutside",u)),onInteractOutside:l[1]||(l[1]=u=>r("interactOutside",u)),onEscapeKeyDown:l[2]||(l[2]=u=>r("escapeKeyDown",u)),onFocusOutside:l[3]||(l[3]=u=>r("focusOutside",u)),onDismiss:l[4]||(l[4]=u=>f(a).onOpenChange(!1))},{default:_(()=>[x(f(rl),le(f(o),{id:f(a).contentId,ref:f(s),"data-state":f(a).open.value?"open":"closed",role:"dialog",style:{"--radix-popover-content-transform-origin":"var(--radix-popper-transform-origin)","--radix-popover-content-available-width":"var(--radix-popper-available-width)","--radix-popover-content-available-height":"var(--radix-popper-available-height)","--radix-popover-trigger-width":"var(--radix-popper-anchor-width)","--radix-popover-trigger-height":"var(--radix-popper-anchor-height)"}}),{default:_(()=>[V(i.$slots,"default")]),_:3},16,["id","data-state"])]),_:3},8,["disable-outside-pointer-events"])]),_:3},8,["trapped"]))}}),AR=I({__name:"PopoverContentModal",props:{trapFocus:{type:Boolean},side:{},sideOffset:{},align:{},alignOffset:{},avoidCollisions:{type:Boolean},collisionBoundary:{},collisionPadding:{},arrowPadding:{},sticky:{},hideWhenDetached:{type:Boolean},updatePositionStrategy:{},prioritizePosition:{type:Boolean},asChild:{type:Boolean},as:{},disableOutsidePointerEvents:{type:Boolean}},emits:["escapeKeyDown","pointerDownOutside","focusOutside","interactOutside","openAutoFocus","closeAutoFocus"],setup(e,{emit:t}){const n=e,r=t,o=Va(),s=F(!1);dp(!0);const a=yt(n,r),{forwardRef:i,currentElement:l}=ve();return pp(l),(u,c)=>(S(),L($b,le(f(a),{ref:f(i),"trap-focus":f(o).open.value,"disable-outside-pointer-events":"",onCloseAutoFocus:c[0]||(c[0]=Ct(d=>{var p;r("closeAutoFocus",d),s.value||(p=f(o).triggerElement.value)==null||p.focus()},["prevent"])),onPointerDownOutside:c[1]||(c[1]=d=>{r("pointerDownOutside",d);const p=d.detail.originalEvent,h=p.button===0&&p.ctrlKey===!0,m=p.button===2||h;s.value=m}),onFocusOutside:c[2]||(c[2]=Ct(()=>{},["prevent"]))}),{default:_(()=>[V(u.$slots,"default")]),_:3},16,["trap-focus"]))}}),DR=I({__name:"PopoverContentNonModal",props:{trapFocus:{type:Boolean},side:{},sideOffset:{},align:{},alignOffset:{},avoidCollisions:{type:Boolean},collisionBoundary:{},collisionPadding:{},arrowPadding:{},sticky:{},hideWhenDetached:{type:Boolean},updatePositionStrategy:{},prioritizePosition:{type:Boolean},asChild:{type:Boolean},as:{},disableOutsidePointerEvents:{type:Boolean}},emits:["escapeKeyDown","pointerDownOutside","focusOutside","interactOutside","openAutoFocus","closeAutoFocus"],setup(e,{emit:t}){const n=e,r=t,o=Va(),s=F(!1),a=F(!1),i=yt(n,r);return(l,u)=>(S(),L($b,le(f(i),{"trap-focus":!1,"disable-outside-pointer-events":!1,onCloseAutoFocus:u[0]||(u[0]=c=>{var d;r("closeAutoFocus",c),c.defaultPrevented||(s.value||(d=f(o).triggerElement.value)==null||d.focus(),c.preventDefault()),s.value=!1,a.value=!1}),onInteractOutside:u[1]||(u[1]=async c=>{var d;r("interactOutside",c),c.defaultPrevented||(s.value=!0,c.detail.originalEvent.type==="pointerdown"&&(a.value=!0));const p=c.target;(d=f(o).triggerElement.value)!=null&&d.contains(p)&&c.preventDefault(),c.detail.originalEvent.type==="focusin"&&a.value&&c.preventDefault()})}),{default:_(()=>[V(l.$slots,"default")]),_:3},16))}}),TR=I({__name:"PopoverContent",props:{forceMount:{type:Boolean},trapFocus:{type:Boolean},side:{},sideOffset:{},align:{},alignOffset:{},avoidCollisions:{type:Boolean},collisionBoundary:{},collisionPadding:{},arrowPadding:{},sticky:{},hideWhenDetached:{type:Boolean},updatePositionStrategy:{},prioritizePosition:{type:Boolean},asChild:{type:Boolean},as:{},disableOutsidePointerEvents:{type:Boolean}},emits:["escapeKeyDown","pointerDownOutside","focusOutside","interactOutside","openAutoFocus","closeAutoFocus"],setup(e,{emit:t}){const n=e,r=t,o=Va(),s=yt(n,r),{forwardRef:a}=ve();return o.contentId||(o.contentId=Ut(void 0,"radix-vue-popover-content")),(i,l)=>(S(),L(f(On),{present:i.forceMount||f(o).open.value},{default:_(()=>[f(o).modal.value?(S(),L(AR,le({key:0},f(s),{ref:f(a)}),{default:_(()=>[V(i.$slots,"default")]),_:3},16)):(S(),L(DR,le({key:1},f(s),{ref:f(a)}),{default:_(()=>[V(i.$slots,"default")]),_:3},16))]),_:3},8,["present"]))}}),[hn,OR]=dt("ScrollAreaRoot"),MR=I({__name:"ScrollAreaRoot",props:{type:{default:"hover"},dir:{},scrollHideDelay:{default:600},asChild:{type:Boolean},as:{}},setup(e,{expose:t}){const n=e,r=F(0),o=F(0),s=F(),a=F(),i=F(),l=F(),u=F(!1),c=F(!1),{type:d,dir:p,scrollHideDelay:h}=vt(n),m=qa(p);function g(){var b;(b=s.value)==null||b.scrollTo({top:0})}function v(){var b;(b=s.value)==null||b.scrollTo({top:0,left:0})}t({viewport:s,scrollTop:g,scrollTopLeft:v});const{forwardRef:y,currentElement:k}=ve();return OR({type:d,dir:m,scrollHideDelay:h,scrollArea:k,viewport:s,onViewportChange:b=>{s.value=b||void 0},content:a,onContentChange:b=>{a.value=b},scrollbarX:i,scrollbarXEnabled:u,scrollbarY:l,scrollbarYEnabled:c,onScrollbarXChange:b=>{i.value=b||void 0},onScrollbarYChange:b=>{l.value=b||void 0},onScrollbarXEnabledChange:b=>{u.value=b},onScrollbarYEnabledChange:b=>{c.value=b},onCornerWidthChange:b=>{r.value=b},onCornerHeightChange:b=>{o.value=b}}),(b,w)=>(S(),L(f(Ce),{ref:f(y),"as-child":n.asChild,as:b.as,dir:f(m),style:Wt({position:"relative","--radix-scroll-area-corner-width":`${r.value}px`,"--radix-scroll-area-corner-height":`${o.value}px`})},{default:_(()=>[V(b.$slots,"default")]),_:3},8,["as-child","as","dir","style"]))}}),RR=I({inheritAttrs:!1,__name:"ScrollAreaViewport",props:{nonce:{},asChild:{type:Boolean},as:{}},setup(e,{expose:t}){const n=e,{nonce:r}=vt(n),o=lR(r),s=hn(),a=F();$e(()=>{s.onViewportChange(a.value),s.onContentChange(l.value)}),t({viewportElement:a});const{forwardRef:i,currentElement:l}=ve();return(u,c)=>(S(),K(Fe,null,[E("div",le({ref_key:"viewportElement",ref:a,"data-radix-scroll-area-viewport":"",style:{overflowX:f(s).scrollbarXEnabled.value?"scroll":"hidden",overflowY:f(s).scrollbarYEnabled.value?"scroll":"hidden"}},u.$attrs,{tabindex:0}),[x(f(Ce),{ref:f(i),style:Wt({minWidth:f(s).scrollbarXEnabled.value?"fit-content":void 0}),"as-child":n.asChild,as:u.as},{default:_(()=>[V(u.$slots,"default")]),_:3},8,["style","as-child","as"])],16),x(f(Ce),{as:"style",nonce:f(o)},{default:_(()=>[oe(" /* Hide scrollbars cross-browser and enable momentum scroll for touch devices */ [data-radix-scroll-area-viewport] { scrollbar-width:none; -ms-overflow-style:none; -webkit-overflow-scrolling:touch; } [data-radix-scroll-area-viewport]::-webkit-scrollbar { display:none; } ")]),_:1},8,["nonce"])],64))}});function Fb(e,t){return n=>{if(e[0]===e[1]||t[0]===t[1])return t[0];const r=(t[1]-t[0])/(e[1]-e[0]);return t[0]+r*(n-e[0])}}function Ql(e){const t=Ib(e.viewport,e.content),n=e.scrollbar.paddingStart+e.scrollbar.paddingEnd,r=(e.scrollbar.size-n)*t;return Math.max(r,18)}function Ib(e,t){const n=e/t;return Number.isNaN(n)?0:n}function PR(e,t=()=>{}){let n={left:e.scrollLeft,top:e.scrollTop},r=0;return function o(){const s={left:e.scrollLeft,top:e.scrollTop},a=n.left!==s.left,i=n.top!==s.top;(a||i)&&t(),n=s,r=window.requestAnimationFrame(o)}(),()=>window.cancelAnimationFrame(r)}function Gm(e,t,n="ltr"){const r=Ql(t),o=t.scrollbar.paddingStart+t.scrollbar.paddingEnd,s=t.scrollbar.size-o,a=t.content-t.viewport,i=s-r,l=n==="ltr"?[0,a]:[a*-1,0],u=bO(e,l[0],l[1]);return Fb([0,a],[0,i])(u)}function ii(e){return e?Number.parseInt(e,10):0}function $R(e,t,n,r="ltr"){const o=Ql(n),s=o/2,a=t||s,i=o-a,l=n.scrollbar.paddingStart+a,u=n.scrollbar.size-n.scrollbar.paddingEnd-i,c=n.content-n.viewport,d=r==="ltr"?[0,c]:[c*-1,0];return Fb([l,u],d)(e)}function Km(e,t){return e>0&&e{document.addEventListener("wheel",g,{passive:!1})}),Yt(()=>{document.removeEventListener("wheel",g)});function v(){var y,k,b,w,C;l.value&&(n.isHorizontal?s.handleSizeChange({content:((y=o.viewport.value)==null?void 0:y.scrollWidth)??0,viewport:((k=o.viewport.value)==null?void 0:k.offsetWidth)??0,scrollbar:{size:l.value.clientWidth??0,paddingStart:ii(getComputedStyle(l.value).paddingLeft),paddingEnd:ii(getComputedStyle(l.value).paddingRight)}}):s.handleSizeChange({content:((b=o.viewport.value)==null?void 0:b.scrollHeight)??0,viewport:((w=o.viewport.value)==null?void 0:w.offsetHeight)??0,scrollbar:{size:((C=l.value)==null?void 0:C.clientHeight)??0,paddingStart:ii(getComputedStyle(l.value).paddingLeft),paddingEnd:ii(getComputedStyle(l.value).paddingRight)}}))}return is(l,v),is(o.content,v),(y,k)=>(S(),L(f(Ce),{ref:f(i),style:{position:"absolute"},"data-scrollbarimpl":"",as:f(a).as.value,"as-child":f(a).asChild.value,onPointerdown:p,onPointermove:h,onPointerup:m},{default:_(()=>[V(y.$slots,"default")]),_:3},8,["as","as-child"]))}}),FR=I({__name:"ScrollAreaScrollbarX",setup(e){const t=hn(),n=ec(),{forwardRef:r,currentElement:o}=ve();$e(()=>{o.value&&t.onScrollbarXChange(o.value)});const s=$(()=>n.sizes.value);return(a,i)=>(S(),L(Lb,{ref:f(r),"is-horizontal":!0,"data-orientation":"horizontal",style:Wt({bottom:0,left:f(t).dir.value==="rtl"?"var(--radix-scroll-area-corner-width)":0,right:f(t).dir.value==="ltr"?"var(--radix-scroll-area-corner-width)":0,"--radix-scroll-area-thumb-width":s.value?`${f(Ql)(s.value)}px`:void 0}),onOnDragScroll:i[0]||(i[0]=l=>f(n).onDragScroll(l.x))},{default:_(()=>[V(a.$slots,"default")]),_:3},8,["style"]))}}),IR=I({__name:"ScrollAreaScrollbarY",setup(e){const t=hn(),n=ec(),{forwardRef:r,currentElement:o}=ve();$e(()=>{o.value&&t.onScrollbarYChange(o.value)});const s=$(()=>n.sizes.value);return(a,i)=>(S(),L(Lb,{ref:f(r),"is-horizontal":!1,"data-orientation":"vertical",style:Wt({top:0,right:f(t).dir.value==="ltr"?0:void 0,left:f(t).dir.value==="rtl"?0:void 0,bottom:"var(--radix-scroll-area-corner-height)","--radix-scroll-area-thumb-height":s.value?`${f(Ql)(s.value)}px`:void 0}),onOnDragScroll:i[0]||(i[0]=l=>f(n).onDragScroll(l.y))},{default:_(()=>[V(a.$slots,"default")]),_:3},8,["style"]))}}),[ec,LR]=dt("ScrollAreaScrollbarVisible"),_p=I({__name:"ScrollAreaScrollbarVisible",setup(e){const t=hn(),n=tc(),{forwardRef:r}=ve(),o=F({content:0,viewport:0,scrollbar:{size:0,paddingStart:0,paddingEnd:0}}),s=$(()=>{const y=Ib(o.value.viewport,o.value.content);return y>0&&y<1}),a=F(),i=F(0);function l(y,k){if(h.value){const b=t.viewport.value.scrollLeft+y.deltaY;t.viewport.value.scrollLeft=b,Km(b,k)&&y.preventDefault()}else{const b=t.viewport.value.scrollTop+y.deltaY;t.viewport.value.scrollTop=b,Km(b,k)&&y.preventDefault()}}function u(y,k){h.value?i.value=k.x:i.value=k.y}function c(y){i.value=0}function d(y){o.value=y}function p(y,k){return $R(y,i.value,o.value,k)}const h=$(()=>n.isHorizontal.value);function m(y){h.value?t.viewport.value.scrollLeft=p(y,t.dir.value):t.viewport.value.scrollTop=p(y)}function g(){if(h.value){if(t.viewport.value&&a.value){const y=t.viewport.value.scrollLeft,k=Gm(y,o.value,t.dir.value);a.value.style.transform=`translate3d(${k}px, 0, 0)`}}else if(t.viewport.value&&a.value){const y=t.viewport.value.scrollTop,k=Gm(y,o.value);a.value.style.transform=`translate3d(0, ${k}px, 0)`}}function v(y){a.value=y}return LR({sizes:o,hasThumb:s,handleWheelScroll:l,handleThumbDown:u,handleThumbUp:c,handleSizeChange:d,onThumbPositionChange:g,onThumbChange:v,onDragScroll:m}),(y,k)=>h.value?(S(),L(FR,le({key:0},y.$attrs,{ref:f(r)}),{default:_(()=>[V(y.$slots,"default")]),_:3},16)):(S(),L(IR,le({key:1},y.$attrs,{ref:f(r)}),{default:_(()=>[V(y.$slots,"default")]),_:3},16))}}),Nb=I({__name:"ScrollAreaScrollbarAuto",props:{forceMount:{type:Boolean}},setup(e){const t=hn(),n=tc(),{forwardRef:r}=ve(),o=F(!1),s=mb(()=>{if(t.viewport.value){const a=t.viewport.value.offsetWidths()),is(t.viewport,s),is(t.content,s),(a,i)=>(S(),L(f(On),{present:a.forceMount||o.value},{default:_(()=>[x(_p,le(a.$attrs,{ref:f(r),"data-state":o.value?"visible":"hidden"}),{default:_(()=>[V(a.$slots,"default")]),_:3},16,["data-state"])]),_:3},8,["present"]))}}),NR=I({inheritAttrs:!1,__name:"ScrollAreaScrollbarHover",props:{forceMount:{type:Boolean}},setup(e){const t=hn(),{forwardRef:n}=ve();let r;const o=F(!1);function s(){window.clearTimeout(r),o.value=!0}function a(){r=window.setTimeout(()=>{o.value=!1},t.scrollHideDelay.value)}return $e(()=>{const i=t.scrollArea.value;i&&(i.addEventListener("pointerenter",s),i.addEventListener("pointerleave",a))}),Yt(()=>{const i=t.scrollArea.value;i&&(window.clearTimeout(r),i.removeEventListener("pointerenter",s),i.removeEventListener("pointerleave",a))}),(i,l)=>(S(),L(f(On),{present:i.forceMount||o.value},{default:_(()=>[x(Nb,le(i.$attrs,{ref:f(n),"data-state":o.value?"visible":"hidden"}),{default:_(()=>[V(i.$slots,"default")]),_:3},16,["data-state"])]),_:3},8,["present"]))}}),zR=I({__name:"ScrollAreaScrollbarScroll",props:{forceMount:{type:Boolean}},setup(e){const t=hn(),n=tc(),{forwardRef:r}=ve(),{state:o,dispatch:s}=xb("hidden",{hidden:{SCROLL:"scrolling"},scrolling:{SCROLL_END:"idle",POINTER_ENTER:"interacting"},interacting:{SCROLL:"interacting",POINTER_LEAVE:"idle"},idle:{HIDE:"hidden",SCROLL:"scrolling",POINTER_ENTER:"interacting"}});pt(i=>{if(o.value==="idle"){const l=window.setTimeout(()=>s("HIDE"),t.scrollHideDelay.value);i(()=>{window.clearTimeout(l)})}});const a=mb(()=>s("SCROLL_END"),100);return pt(i=>{const l=t.viewport.value,u=n.isHorizontal.value?"scrollLeft":"scrollTop";if(l){let c=l[u];const d=()=>{const p=l[u];c!==p&&(s("SCROLL"),a()),c=p};l.addEventListener("scroll",d),i(()=>{l.removeEventListener("scroll",d)})}}),(i,l)=>(S(),L(f(On),{present:i.forceMount||f(o)!=="hidden"},{default:_(()=>[x(_p,le(i.$attrs,{ref:f(r)}),{default:_(()=>[V(i.$slots,"default")]),_:3},16)]),_:3},8,["present"]))}}),[tc,BR]=dt("ScrollAreaScrollbar"),qR=I({inheritAttrs:!1,__name:"ScrollAreaScrollbar",props:{orientation:{default:"vertical"},forceMount:{type:Boolean},asChild:{type:Boolean},as:{default:"div"}},setup(e){const t=e,{forwardRef:n}=ve(),r=hn(),o=$(()=>t.orientation==="horizontal");Oe(o,()=>{o.value?r.onScrollbarXEnabledChange(!0):r.onScrollbarYEnabledChange(!0)},{immediate:!0}),Yt(()=>{r.onScrollbarXEnabledChange(!1),r.onScrollbarYEnabledChange(!1)});const{orientation:s,forceMount:a,asChild:i,as:l}=vt(t);return BR({orientation:s,forceMount:a,isHorizontal:o,as:l,asChild:i}),(u,c)=>f(r).type.value==="hover"?(S(),L(NR,le({key:0},u.$attrs,{ref:f(n),"force-mount":f(a)}),{default:_(()=>[V(u.$slots,"default")]),_:3},16,["force-mount"])):f(r).type.value==="scroll"?(S(),L(zR,le({key:1},u.$attrs,{ref:f(n),"force-mount":f(a)}),{default:_(()=>[V(u.$slots,"default")]),_:3},16,["force-mount"])):f(r).type.value==="auto"?(S(),L(Nb,le({key:2},u.$attrs,{ref:f(n),"force-mount":f(a)}),{default:_(()=>[V(u.$slots,"default")]),_:3},16,["force-mount"])):f(r).type.value==="always"?(S(),L(_p,le({key:3},u.$attrs,{ref:f(n),"data-state":"visible"}),{default:_(()=>[V(u.$slots,"default")]),_:3},16)):_e("",!0)}}),VR=I({__name:"ScrollAreaThumb",props:{asChild:{type:Boolean},as:{}},setup(e){const t=e,n=hn(),r=ec();function o(p){const h=p.target.getBoundingClientRect(),m=p.clientX-h.left,g=p.clientY-h.top;r.handleThumbDown(p,{x:m,y:g})}function s(p){r.handleThumbUp(p)}const{forwardRef:a,currentElement:i}=ve(),l=F(),u=$(()=>n.viewport.value);function c(){if(!l.value){const p=PR(u.value,r.onThumbPositionChange);l.value=p,r.onThumbPositionChange()}}const d=$(()=>r.sizes.value);return NO(d,()=>{r.onThumbChange(i.value),u.value&&(r.onThumbPositionChange(),u.value.addEventListener("scroll",c))}),Yt(()=>{var p;u.value.removeEventListener("scroll",c),(p=n.viewport.value)==null||p.removeEventListener("scroll",c)}),(p,h)=>(S(),L(f(Ce),{ref:f(a),"data-state":f(r).hasThumb?"visible":"hidden",style:{width:"var(--radix-scroll-area-thumb-width)",height:"var(--radix-scroll-area-thumb-height)"},"as-child":t.asChild,as:p.as,onPointerdown:o,onPointerup:s},{default:_(()=>[V(p.$slots,"default")]),_:3},8,["data-state","as-child","as"]))}}),jR=I({__name:"ScrollAreaCornerImpl",setup(e){const t=hn(),n=F(0),r=F(0),o=$(()=>!!n.value&&!!r.value);function s(){var i;const l=((i=t.scrollbarX.value)==null?void 0:i.offsetHeight)||0;t.onCornerHeightChange(l),r.value=l}function a(){var i;const l=((i=t.scrollbarY.value)==null?void 0:i.offsetWidth)||0;t.onCornerWidthChange(l),n.value=l}return is(t.scrollbarX.value,s),is(t.scrollbarY.value,a),Oe(()=>t.scrollbarX.value,s),Oe(()=>t.scrollbarY.value,a),(i,l)=>{var u;return o.value?(S(),L(f(Ce),le({key:0,style:{width:`${n.value}px`,height:`${r.value}px`,position:"absolute",right:f(t).dir.value==="ltr"?0:void 0,left:f(t).dir.value==="rtl"?0:void 0,bottom:0}},(u=i.$parent)==null?void 0:u.$props),{default:_(()=>[V(i.$slots,"default")]),_:3},16,["style"])):_e("",!0)}}}),HR=I({__name:"ScrollAreaCorner",props:{asChild:{type:Boolean},as:{}},setup(e){const t=e,{forwardRef:n}=ve(),r=hn(),o=$(()=>!!r.scrollbarX.value&&!!r.scrollbarY.value),s=$(()=>r.type.value!=="scroll"&&o.value);return(a,i)=>s.value?(S(),L(jR,le({key:0},t,{ref:f(n)}),{default:_(()=>[V(a.$slots,"default")]),_:3},16)):_e("",!0)}}),UR=I({__name:"BaseSeparator",props:{orientation:{default:"horizontal"},decorative:{type:Boolean},asChild:{type:Boolean},as:{}},setup(e){const t=e,n=["horizontal","vertical"];function r(i){return n.includes(i)}const o=$(()=>r(t.orientation)?t.orientation:"horizontal"),s=$(()=>o.value==="vertical"?t.orientation:void 0),a=$(()=>t.decorative?{role:"none"}:{"aria-orientation":s.value,role:"separator"});return(i,l)=>(S(),L(f(Ce),le({as:i.as,"as-child":i.asChild,"data-orientation":o.value},a.value),{default:_(()=>[V(i.$slots,"default")]),_:3},16,["as","as-child","data-orientation"]))}}),WR=I({__name:"Separator",props:{orientation:{default:"horizontal"},decorative:{type:Boolean},asChild:{type:Boolean},as:{}},setup(e){const t=e;return(n,r)=>(S(),L(UR,St(Et(t)),{default:_(()=>[V(n.$slots,"default")]),_:3},16))}});let Kd=null,uo=null;function YR(e,t){if(t){const n=(t&Ub)!==0,r=(t&Wb)!==0,o=(t&Yb)!==0,s=(t&Gb)!==0;if(n)return o?"se-resize":s?"ne-resize":"e-resize";if(r)return o?"sw-resize":s?"nw-resize":"w-resize";if(o)return"s-resize";if(s)return"n-resize"}switch(e){case"horizontal":return"ew-resize";case"intersection":return"move";case"vertical":return"ns-resize"}}function zb(){uo!==null&&(document.head.removeChild(uo),Kd=null,uo=null)}function Uc(e,t){const n=YR(e,t);Kd!==n&&(Kd=n,uo===null&&(uo=document.createElement("style"),document.head.appendChild(uo)),uo.innerHTML=`*{cursor: ${n}!important;}`)}function GR({defaultSize:e,dragState:t,layout:n,panelData:r,panelIndex:o,precision:s=3}){const a=n[o];let i;return a==null?i=e!==void 0?e.toPrecision(s):"1":r.length===1?i="1":i=a.toPrecision(s),{flexBasis:0,flexGrow:i,flexShrink:1,overflow:"hidden",pointerEvents:t!==null?"none":void 0}}function Bb(e){return e.type==="keydown"}function qb(e){return e.type.startsWith("mouse")}function Vb(e){return e.type.startsWith("touch")}function nc(e){if(qb(e))return{x:e.clientX,y:e.clientY};if(Vb(e)){const t=e.touches[0];if(t&&t.clientX&&t.clientY)return{x:t.clientX,y:t.clientY}}return{x:Number.POSITIVE_INFINITY,y:Number.POSITIVE_INFINITY}}function jb(e,t){const n=e==="horizontal",{x:r,y:o}=nc(t);return n?r:o}function KR(e,t,n){return e.xt.x&&e.yt.y}function Pe(e,t="Assertion failed!"){if(!e)throw console.error(t),new Error(t)}function ZR(e,t){if(e===t)throw new Error("Cannot compare node with itself");const n={a:Jm(e),b:Jm(t)};let r;for(;n.a.at(-1)===n.b.at(-1);)e=n.a.pop(),t=n.b.pop(),r=e;Pe(r);const o={a:Xm(Zm(n.a)),b:Xm(Zm(n.b))};if(o.a===o.b){const s=r.childNodes,a={a:n.a.at(-1),b:n.b.at(-1)};let i=s.length;for(;i--;){const l=s[i];if(l===a.a)return 1;if(l===a.b)return-1}}return Math.sign(o.a-o.b)}const XR=/\b(?:position|zIndex|opacity|transform|webkitTransform|mixBlendMode|filter|webkitFilter|isolation)\b/;function JR(e){const t=getComputedStyle(Hb(e)).display;return t==="flex"||t==="inline-flex"}function QR(e){const t=getComputedStyle(e);return!!(t.position==="fixed"||t.zIndex!=="auto"&&(t.position!=="static"||JR(e))||+t.opacity<1||"transform"in t&&t.transform!=="none"||"webkitTransform"in t&&t.webkitTransform!=="none"||"mixBlendMode"in t&&t.mixBlendMode!=="normal"||"filter"in t&&t.filter!=="none"||"webkitFilter"in t&&t.webkitFilter!=="none"||"isolation"in t&&t.isolation==="isolate"||XR.test(t.willChange)||t.webkitOverflowScrolling==="touch")}function Zm(e){let t=e.length;for(;t--;){const n=e[t];if(Pe(n),QR(n))return n}return null}function Xm(e){return e&&Number(getComputedStyle(e).zIndex)||0}function Jm(e){const t=[];for(;e;)t.push(e),e=Hb(e);return t}function Hb(e){var t;return e.parentNode instanceof DocumentFragment&&((t=e.parentNode)==null?void 0:t.host)||e.parentNode}const Ub=1,Wb=2,Yb=4,Gb=8;function eP(){if(typeof matchMedia=="function")return matchMedia("(pointer:coarse)").matches?"coarse":"fine"}const tP=eP()==="coarse",Wr=[];let rc=!1;const Ir=new Map,oc=new Map,va=new Set;function nP(e,t,n,r,o){const{ownerDocument:s}=t,a={direction:n,element:t,hitAreaMargins:r,setResizeHandlerState:o},i=Ir.get(s)??0;return Ir.set(s,i+1),va.add(a),ol(),function(){oc.delete(e),va.delete(a);const l=Ir.get(s)??1;Ir.set(s,l-1),ol(),zb(),l===1&&Ir.delete(s)}}function li(e){const{target:t}=e,{x:n,y:r}=nc(e);rc=!0,xp({target:t,x:n,y:r}),ol(),Wr.length>0&&(wp("down",e),e.preventDefault())}function Ar(e){const{x:t,y:n}=nc(e);if(!rc){const{target:r}=e;xp({target:r,x:t,y:n})}wp("move",e),Kb(),Wr.length>0&&e.preventDefault()}function Dr(e){const{target:t}=e,{x:n,y:r}=nc(e);oc.clear(),rc=!1,Wr.length>0&&e.preventDefault(),wp("up",e),xp({target:t,x:n,y:r}),Kb(),ol()}function xp({target:e,x:t,y:n}){Wr.splice(0);let r=null;e instanceof HTMLElement&&(r=e),va.forEach(o=>{const{element:s,hitAreaMargins:a}=o,i=s.getBoundingClientRect(),{bottom:l,left:u,right:c,top:d}=i,p=tP?a.coarse:a.fine;if(t>=u-p&&t<=c+p&&n>=d-p&&n<=l+p){if(r!==null&&s!==r&&!s.contains(r)&&!r.contains(s)&&ZR(r,s)>0){let h=r,m=!1;for(;h&&!h.contains(s);){if(KR(h.getBoundingClientRect(),i)){m=!0;break}h=h.parentElement}if(m)return}Wr.push(o)}})}function Wc(e,t){oc.set(e,t)}function Kb(){let e=!1,t=!1;Wr.forEach(r=>{const{direction:o}=r;o.value==="horizontal"?e=!0:t=!0});let n=0;oc.forEach(r=>{n|=r}),e&&t?Uc("intersection",n):e?Uc("horizontal",n):t?Uc("vertical",n):zb()}function ol(){Ir.forEach((e,t)=>{const{body:n}=t;n.removeEventListener("contextmenu",Dr),n.removeEventListener("mousedown",li),n.removeEventListener("mouseleave",Ar),n.removeEventListener("mousemove",Ar),n.removeEventListener("touchmove",Ar),n.removeEventListener("touchstart",li)}),window.removeEventListener("mouseup",Dr),window.removeEventListener("touchcancel",Dr),window.removeEventListener("touchend",Dr),va.size>0&&(rc?(Wr.length>0&&Ir.forEach((e,t)=>{const{body:n}=t;e>0&&(n.addEventListener("contextmenu",Dr),n.addEventListener("mouseleave",Ar),n.addEventListener("mousemove",Ar),n.addEventListener("touchmove",Ar,{passive:!1}))}),window.addEventListener("mouseup",Dr),window.addEventListener("touchcancel",Dr),window.addEventListener("touchend",Dr)):Ir.forEach((e,t)=>{const{body:n}=t;e>0&&(n.addEventListener("mousedown",li),n.addEventListener("mousemove",Ar),n.addEventListener("touchmove",Ar,{passive:!1}),n.addEventListener("touchstart",li))}))}function wp(e,t){va.forEach(n=>{const{setResizeHandlerState:r}=n,o=Wr.includes(n);r(e,o,t)})}const kp=10;function ya(e,t,n=kp){e=Number.parseFloat(e.toFixed(n)),t=Number.parseFloat(t.toFixed(n));const r=e-t;return r===0?0:r>0?1:-1}function Zt(e,t,n){return ya(e,t,n)===0}function Bo({panelConstraints:e,panelIndex:t,size:n}){const r=e[t];Pe(r!=null);const{collapsedSize:o=0,collapsible:s,maxSize:a=100,minSize:i=0}=r;if(ya(n,i)<0)if(s){const l=(o+i)/2;ya(n,l)<0?n=o:n=i}else n=i;return n=Math.min(a,n),n=Number.parseFloat(n.toFixed(kp)),n}function ci(e,t){if(e.length!==t.length)return!1;for(let n=0;n0&&(e=e<0?0-v:v)}}}{const c=e<0?a:i,d=n[c];Pe(d);const{collapsible:p}=d;if(p){const h=t[c];Pe(h!=null);const m=n[c];Pe(m);const{collapsedSize:g=0,minSize:v=0}=m;if(Zt(h,v)){const y=h-g;ya(y,Math.abs(e))>0&&(e=e<0?0-y:y)}}}}{const c=e<0?1:-1;let d=e<0?i:a,p=0;for(;;){const m=t[d];Pe(m!=null);const g=Bo({panelConstraints:n,panelIndex:d,size:100})-m;if(p+=g,d+=c,d<0||d>=n.length)break}const h=Math.min(Math.abs(e),Math.abs(p));e=e<0?0-h:h}{let c=e<0?a:i;for(;c>=0&&c=0))break;e<0?c--:c++}}if(Zt(l,0))return t;{const c=e<0?i:a,d=t[c];Pe(d!=null);const p=d+l,h=Bo({panelConstraints:n,panelIndex:c,size:p});if(s[c]=h,!Zt(h,p)){let m=p-h,g=e<0?i:a;for(;g>=0&&g0?g--:g++}}}const u=s.reduce((c,d)=>d+c,0);return Zt(u,100)?s:t}function Zb(e,t=document){var n;return Ba?t instanceof HTMLElement&&((n=t?.dataset)==null?void 0:n.panelGroupId)===e?t:t.querySelector(`[data-panel-group][data-panel-group-id="${e}"]`)||null:null}function sc(e,t=document){return Ba&&t.querySelector(`[data-panel-resize-handle-id="${e}"]`)||null}function Xb(e,t,n=document){return Ba?ba(e,n).findIndex(r=>r.getAttribute("data-panel-resize-handle-id")===t)??null:null}function ba(e,t=document){return Ba?Array.from(t.querySelectorAll(`[data-panel-resize-handle-id][data-panel-group-id="${e}"]`)):[]}function rP(e,t,n,r=document){var o,s;const a=sc(t,r),i=ba(e,r),l=a?i.indexOf(a):-1,u=((o=n[l])==null?void 0:o.id)??null,c=((s=n[l+1])==null?void 0:s.id)??null;return[u,c]}function oP(e,t,n,r,o){const s=n==="horizontal",a=sc(t,o);Pe(a);const i=a.getAttribute("data-panel-group-id");Pe(i);const{initialCursorPosition:l}=r,u=jb(n,e),c=Zb(i,o);Pe(c);const d=c.getBoundingClientRect(),p=s?d.width:d.height;return(u-l)/p*100}function sP(e,t,n,r,o,s){if(Bb(e)){const a=n==="horizontal";let i=0;e.shiftKey?i=100:i=o??10;let l=0;switch(e.key){case"ArrowDown":l=a?0:i;break;case"ArrowLeft":l=a?-i:0;break;case"ArrowRight":l=a?i:0;break;case"ArrowUp":l=a?0:-i;break;case"End":l=100;break;case"Home":l=-100;break}return l}else return r==null?0:oP(e,t,n,r,s)}function aP({layout:e,panelsArray:t,pivotIndices:n}){let r=0,o=100,s=0,a=0;const i=n[0];Pe(i!=null),t.forEach((d,p)=>{const{constraints:h}=d,{maxSize:m=100,minSize:g=0}=h;p===i?(r=g,o=m):(s+=g,a+=m)});const l=Math.min(o,100-s),u=Math.max(r,100-a),c=e[i];return{valueMax:l,valueMin:u,valueNow:c}}function iP({panelDataArray:e}){const t=Array(e.length),n=e.map(s=>s.constraints);let r=0,o=100;for(let s=0;s{const s=e[o];Pe(s);const{callbacks:a,constraints:i,id:l}=s,{collapsedSize:u=0,collapsible:c}=i,d=n[l];if(d==null||r!==d){n[l]=r;const{onCollapse:p,onExpand:h,onResize:m}=a;m&&m(r,d),c&&(p||h)&&(h&&(d==null||d===u)&&r!==u&&h(),p&&(d==null||d!==u)&&r===u&&p())}})}function lP(e,t=10){let n=null;return(...r)=>{n!==null&&clearTimeout(n),n=setTimeout(()=>{e(...r)},t)}}function Jb(e,t,n){const r=Xb(e,t,n);return r!=null?[r,r+1]:[-1,-1]}function cP({layout:e,panelConstraints:t}){const n=[...e],r=n.reduce((s,a)=>s+a,0);if(n.length!==t.length)throw new Error(`Invalid ${t.length} panel layout: ${n.map(s=>`${s}%`).join(", ")}`);if(!Zt(r,100)){console.warn(`WARNING: Invalid layout total size: ${n.map(s=>`${s}%`).join(", ")}. Layout normalization will be applied.`);for(let s=0;slocalStorage.getItem(t),e.setItem=(t,n)=>{localStorage.setItem(t,n)};else throw new TypeError("localStorage not supported in this environment")}catch(t){console.error(t),e.getItem=()=>null,e.setItem=()=>{}}}function Qb(e){return`radix-vue:${e}`}function e_(e){return e.map(t=>{const{constraints:n,id:r,idIsFromProps:o,order:s}=t;return o?r:s?`${s}:${JSON.stringify(n)}`:JSON.stringify(n)}).sort((t,n)=>t.localeCompare(n)).join(",")}function t_(e,t){try{const n=Qb(e),r=t.getItem(n);if(r){const o=JSON.parse(r);if(typeof o=="object"&&o!=null)return o}}catch{}return null}function uP(e,t,n){const r=t_(e,n)??{},o=e_(t);return r[o]??null}function dP(e,t,n,r,o){const s=Qb(e),a=e_(t),i=t_(e,o)??{};i[a]={expandToSizes:Object.fromEntries(n.entries()),layout:r};try{o.setItem(s,JSON.stringify(i))}catch(l){console.error(l)}}function fP({eagerValuesRef:e,groupId:t,layout:n,panelDataArray:r,panelGroupElement:o,setLayout:s}){pt(a=>{const i=o.value;if(!i)return;const l=ba(t,i);for(let u=0;u{l.forEach(u=>{u.removeAttribute("aria-controls"),u.removeAttribute("aria-valuemax"),u.removeAttribute("aria-valuemin"),u.removeAttribute("aria-valuenow")})})}),pt(a=>{const i=o.value;if(!i)return;const l=e.value;Pe(l);const{panelDataArray:u}=l,c=Zb(t,i);Pe(c!=null,`No group found for id "${t}"`);const d=ba(t,i);Pe(d);const p=d.map(h=>{const m=h.getAttribute("data-panel-resize-handle-id");Pe(m);const[g,v]=rP(t,m,u,i);if(g==null||v==null)return()=>{};const y=k=>{if(!k.defaultPrevented)switch(k.key){case"Enter":{k.preventDefault();const b=u.findIndex(w=>w.id===g);if(b>=0){const w=u[b];Pe(w);const C=n.value[b],{collapsedSize:A=0,collapsible:R,minSize:M=0}=w.constraints;if(C!=null&&R){const O=zs({delta:Zt(C,A)?M-A:A-C,layout:n.value,panelConstraints:u.map(P=>P.constraints),pivotIndices:Jb(t,m,i),trigger:"keyboard"});n.value!==O&&s(O)}}break}}};return h.addEventListener("keydown",y),()=>{h.removeEventListener("keydown",y)}});a(()=>{p.forEach(h=>h())})})}const pP=100,Bs={getItem:e=>(Qm(Bs),Bs.getItem(e)),setItem:(e,t)=>{Qm(Bs),Bs.setItem(e,t)}},[n_,hP]=dt("PanelGroup"),mP=I({__name:"SplitterGroup",props:{id:{},autoSaveId:{default:null},direction:{},keyboardResizeBy:{default:10},storage:{default:()=>Bs},asChild:{type:Boolean},as:{}},emits:["layout"],setup(e,{emit:t}){const n=e,r=t,o={},{direction:s}=vt(n),a=Ut(n.id,"radix-vue-splitter-group"),i=qa(),{forwardRef:l,currentElement:u}=ve(),c=F(null),d=F([]),p=F({}),h=F(new Map),m=F(0),g=$(()=>({autoSaveId:n.autoSaveId,direction:n.direction,dragState:c.value,id:a,keyboardResizeBy:n.keyboardResizeBy,storage:n.storage})),v=F({layout:d.value,panelDataArray:[],panelDataArrayChanged:!1}),y=j=>d.value=j;fP({eagerValuesRef:v,groupId:a,layout:d,panelDataArray:v.value.panelDataArray,setLayout:y,panelGroupElement:u}),pt(()=>{const{panelDataArray:j}=v.value,{autoSaveId:Z}=n;if(Z){if(d.value.length===0||d.value.length!==j.length)return;let H=o[Z];H||(H=lP(dP,pP),o[Z]=H);const U=[...j],ae=new Map(h.value);H(Z,U,ae,d.value,n.storage)}});function k(j,Z){const{panelDataArray:H}=v.value,U=ue(H,j);return GR({defaultSize:Z,dragState:c.value,layout:d.value,panelData:H,panelIndex:U})}function b(j){const{panelDataArray:Z}=v.value;Z.push(j),Z.sort((H,U)=>{const ae=H.order,pe=U.order;return ae==null&&pe==null?0:ae==null?-1:pe==null?1:ae-pe}),v.value.panelDataArrayChanged=!0}Oe(()=>v.value.panelDataArrayChanged,()=>{if(v.value.panelDataArrayChanged){v.value.panelDataArrayChanged=!1;const{autoSaveId:j,storage:Z}=g.value,{layout:H,panelDataArray:U}=v.value;let ae=null;if(j){const Le=uP(j,U,Z);Le&&(h.value=new Map(Object.entries(Le.expandToSizes)),ae=Le.layout)}ae===null&&(ae=iP({panelDataArray:U}));const pe=cP({layout:ae,panelConstraints:U.map(Le=>Le.constraints)});wO(H,pe)||(y(pe),v.value.layout=pe,r("layout",pe),Fs(U,pe,p.value))}});function w(j){return function(Z){Z.preventDefault();const H=u.value;if(!H)return()=>null;const{direction:U,dragState:ae,id:pe,keyboardResizeBy:Le}=g.value,{layout:Je,panelDataArray:Ue}=v.value,{initialLayout:ft}=ae??{},Y=Jb(pe,j,H);let se=sP(Z,j,U,ae,Le,H);if(se===0)return;const de=U==="horizontal";i.value==="rtl"&&de&&(se=-se);const ye=Ue.map(T=>T.constraints),qe=zs({delta:se,layout:ft??Je,panelConstraints:ye,pivotIndices:Y,trigger:Bb(Z)?"keyboard":"mouse-or-touch"}),D=!ci(Je,qe);(qb(Z)||Vb(Z))&&m.value!==se&&(m.value=se,D?Wc(j,0):de?Wc(j,se<0?Ub:Wb):Wc(j,se<0?Yb:Gb)),D&&(y(qe),v.value.layout=qe,r("layout",qe),Fs(Ue,qe,p.value))}}function C(j,Z){const{layout:H,panelDataArray:U}=v.value,ae=U.map(ft=>ft.constraints),{panelSize:pe,pivotIndices:Le}=Q(U,j,H);Pe(pe!=null);const Je=ue(U,j)===U.length-1?pe-Z:Z-pe,Ue=zs({delta:Je,layout:H,panelConstraints:ae,pivotIndices:Le,trigger:"imperative-api"});ci(H,Ue)||(y(Ue),v.value.layout=Ue,r("layout",Ue),Fs(U,Ue,p.value))}function A(j,Z){const{layout:H,panelDataArray:U}=v.value,ae=ue(U,j);U[ae]=j,v.value.panelDataArrayChanged=!0;const{collapsedSize:pe=0,collapsible:Le}=Z,{collapsedSize:Je=0,collapsible:Ue,maxSize:ft=100,minSize:Y=0}=j.constraints,{panelSize:se}=Q(U,j,H);se!==null&&(Le&&Ue&&se===pe?pe!==Je&&C(j,Je):seft&&C(j,ft))}function R(j,Z){const{direction:H}=g.value,{layout:U}=v.value;if(!u.value)return;const ae=sc(j,u.value);Pe(ae);const pe=jb(H,Z);c.value={dragHandleId:j,dragHandleRect:ae.getBoundingClientRect(),initialCursorPosition:pe,initialLayout:U}}function M(){c.value=null}function O(j){const{panelDataArray:Z}=v.value,H=ue(Z,j);H>=0&&(Z.splice(H,1),delete p.value[j.id],v.value.panelDataArrayChanged=!0)}function P(j){const{layout:Z,panelDataArray:H}=v.value;if(j.constraints.collapsible){const U=H.map(Je=>Je.constraints),{collapsedSize:ae=0,panelSize:pe,pivotIndices:Le}=Q(H,j,Z);if(Pe(pe!=null,`Panel size not found for panel "${j.id}"`),pe!==ae){h.value.set(j.id,pe);const Je=ue(H,j)===H.length-1?pe-ae:ae-pe,Ue=zs({delta:Je,layout:Z,panelConstraints:U,pivotIndices:Le,trigger:"imperative-api"});ci(Z,Ue)||(y(Ue),v.value.layout=Ue,r("layout",Ue),Fs(H,Ue,p.value))}}}function W(j){const{layout:Z,panelDataArray:H}=v.value;if(j.constraints.collapsible){const U=H.map(Ue=>Ue.constraints),{collapsedSize:ae=0,panelSize:pe,minSize:Le=0,pivotIndices:Je}=Q(H,j,Z);if(pe===ae){const Ue=h.value.get(j.id),ft=Ue!=null&&Ue>=Le?Ue:Le,Y=ue(H,j)===H.length-1?pe-ft:ft-pe,se=zs({delta:Y,layout:Z,panelConstraints:U,pivotIndices:Je,trigger:"imperative-api"});ci(Z,se)||(y(se),v.value.layout=se,r("layout",se),Fs(H,se,p.value))}}}function z(j){const{layout:Z,panelDataArray:H}=v.value,{panelSize:U}=Q(H,j,Z);return Pe(U!=null,`Panel size not found for panel "${j.id}"`),U}function re(j){const{layout:Z,panelDataArray:H}=v.value,{collapsedSize:U=0,collapsible:ae,panelSize:pe}=Q(H,j,Z);return ae===!0&&pe===U}function B(j){const{layout:Z,panelDataArray:H}=v.value,{collapsedSize:U=0,collapsible:ae,panelSize:pe}=Q(H,j,Z);return Pe(pe!=null,`Panel size not found for panel "${j.id}"`),!ae||pe>U}hP({direction:s,dragState:c.value,groupId:a,reevaluatePanelConstraints:A,registerPanel:b,registerResizeHandle:w,resizePanel:C,startDragging:R,stopDragging:M,unregisterPanel:O,panelGroupElement:u,collapsePanel:P,expandPanel:W,isPanelCollapsed:re,isPanelExpanded:B,getPanelSize:z,getPanelStyle:k});function ue(j,Z){return j.findIndex(H=>H===Z||H.id===Z.id)}function Q(j,Z,H){const U=ue(j,Z),ae=U===j.length-1?[U-1,U]:[U,U+1],pe=H[U];return{...Z.constraints,panelSize:pe,pivotIndices:ae}}return(j,Z)=>(S(),L(f(Ce),{ref:f(l),as:j.as,"as-child":j.asChild,style:Wt({display:"flex",flexDirection:f(s)==="horizontal"?"row":"column",height:"100%",overflow:"hidden",width:"100%"}),"data-panel-group":"","data-orientation":f(s),"data-panel-group-id":f(a)},{default:_(()=>[V(j.$slots,"default",{layout:d.value})]),_:3},8,["as","as-child","style","data-orientation","data-panel-group-id"]))}}),Mt=I({__name:"SplitterPanel",props:{collapsedSize:{},collapsible:{type:Boolean},defaultSize:{},id:{},maxSize:{},minSize:{},order:{},asChild:{type:Boolean},as:{}},emits:["collapse","expand","resize"],setup(e,{expose:t,emit:n}){const r=e,o=n,s=n_();if(s===null)throw new Error("SplitterPanel components must be rendered within a SplitterGroup container");const{collapsePanel:a,expandPanel:i,getPanelSize:l,getPanelStyle:u,isPanelCollapsed:c,resizePanel:d,groupId:p,reevaluatePanelConstraints:h,registerPanel:m,unregisterPanel:g}=s,v=Ut(r.id,"radix-vue-splitter-panel"),y=$(()=>({callbacks:{onCollapse:()=>o("collapse"),onExpand:()=>o("expand"),onResize:(...C)=>o("resize",...C)},constraints:{collapsedSize:r.collapsedSize&&Number.parseFloat(r.collapsedSize.toFixed(kp)),collapsible:r.collapsible,defaultSize:r.defaultSize,maxSize:r.maxSize,minSize:r.minSize},id:v,idIsFromProps:r.id!==void 0,order:r.order}));Oe(()=>y.value.constraints,(C,A)=>{(A.collapsedSize!==C.collapsedSize||A.collapsible!==C.collapsible||A.maxSize!==C.maxSize||A.minSize!==C.minSize)&&h(y.value,A)},{deep:!0}),$e(()=>{const C=y.value;m(C),Yt(()=>{g(C)})});const k=$(()=>u(y.value,r.defaultSize)),b=$(()=>c(y.value)),w=$(()=>!b.value);return t({collapse:()=>{a(y.value)},expand:()=>{i(y.value)},getSize(){return l(y.value)},resize:C=>{d(y.value,C)},isCollapsed:b,isExpanded:w}),(C,A)=>(S(),L(f(Ce),{id:f(v),style:Wt(k.value),as:C.as,"as-child":C.asChild,"data-panel":"","data-panel-collapsible":C.collapsible||void 0,"data-panel-group-id":f(p),"data-panel-id":f(v),"data-panel-size":Number.parseFloat(`${k.value.flexGrow}`).toFixed(1),"data-state":C.collapsible?b.value?"collapsed":"expanded":void 0},{default:_(()=>[V(C.$slots,"default",{isCollapsed:b.value,isExpanded:w.value})]),_:3},8,["id","style","as","as-child","data-panel-collapsible","data-panel-group-id","data-panel-id","data-panel-size","data-state"]))}});function gP({disabled:e,handleId:t,resizeHandler:n,panelGroupElement:r}){pt(o=>{const s=r.value;if(e.value||n.value===null||s===null)return;const a=sc(t,s);if(a==null)return;const i=l=>{var u;if(!l.defaultPrevented)switch(l.key){case"ArrowDown":case"ArrowLeft":case"ArrowRight":case"ArrowUp":case"End":case"Home":{l.preventDefault(),(u=n.value)==null||u.call(n,l);break}case"F6":{l.preventDefault();const c=a.getAttribute("data-panel-group-id");Pe(c);const d=ba(c,s),p=Xb(c,t,s);Pe(p!==null);const h=l.shiftKey?p>0?p-1:d.length-1:p+1{a.removeEventListener("keydown",i)})})}const vP=I({__name:"SplitterResizeHandle",props:{id:{},hitAreaMargins:{},tabindex:{default:0},disabled:{type:Boolean},asChild:{type:Boolean},as:{}},emits:["dragging"],setup(e,{emit:t}){const n=e,r=t,{forwardRef:o,currentElement:s}=ve(),{disabled:a}=vt(n),i=n_();if(i===null)throw new Error("PanelResizeHandle components must be rendered within a PanelGroup container");const{direction:l,groupId:u,registerResizeHandle:c,startDragging:d,stopDragging:p,panelGroupElement:h}=i,m=Ut(n.id,"radix-vue-splitter-resize-handle"),g=F("inactive"),v=F(!1),y=F(null);return Oe(a,()=>{Ba&&(a.value?y.value=null:y.value=c(m))},{immediate:!0}),pt(k=>{var b,w;if(a.value||y.value===null)return;const C=s.value;if(!C)return;Pe(C);const A=(R,M,O)=>{var P;if(M)switch(R){case"down":{g.value="drag",d(m,O),r("dragging",!0);break}case"move":{g.value!=="drag"&&(g.value="hover"),(P=y.value)==null||P.call(y,O);break}case"up":{g.value="hover",p(),r("dragging",!1);break}}else g.value="inactive"};k(nP(m,C,l,{coarse:((b=n.hitAreaMargins)==null?void 0:b.coarse)??15,fine:((w=n.hitAreaMargins)==null?void 0:w.fine)??5},A))}),gP({disabled:a,resizeHandler:y,handleId:m,panelGroupElement:h}),(k,b)=>(S(),L(f(Ce),{id:f(m),ref:f(o),style:{touchAction:"none",userSelect:"none"},as:k.as,"as-child":k.asChild,role:"separator","data-resize-handle":"",tabindex:k.tabindex,"data-state":g.value,"data-disabled":f(a)?"":void 0,"data-orientation":f(l),"data-panel-group-id":f(u),"data-resize-handle-active":g.value==="drag"?"pointer":v.value?"keyboard":void 0,"data-resize-handle-state":g.value,"data-panel-resize-handle-enabled":!f(a),"data-panel-resize-handle-id":f(m),onBlur:b[0]||(b[0]=w=>v.value=!1),onFocus:b[1]||(b[1]=w=>v.value=!1)},{default:_(()=>[V(k.$slots,"default")]),_:3},8,["id","as","as-child","tabindex","data-state","data-disabled","data-orientation","data-panel-group-id","data-resize-handle-active","data-resize-handle-state","data-panel-resize-handle-enabled","data-panel-resize-handle-id"]))}}),yP=["name","disabled","required","value","checked","data-state","data-disabled"],[bP,_P]=dt("SwitchRoot"),xP=I({__name:"SwitchRoot",props:{defaultChecked:{type:Boolean},checked:{type:Boolean,default:void 0},disabled:{type:Boolean},required:{type:Boolean},name:{},id:{},value:{default:"on"},asChild:{type:Boolean},as:{default:"button"}},emits:["update:checked"],setup(e,{emit:t}){const n=e,r=t,{disabled:o}=vt(n),s=ln(n,"checked",r,{defaultValue:n.defaultChecked,passive:n.checked===void 0});function a(){o.value||(s.value=!s.value)}const{forwardRef:i,currentElement:l}=ve(),u=fp(l),c=$(()=>{var d;return n.id&&l.value?(d=document.querySelector(`[for="${n.id}"]`))==null?void 0:d.innerText:void 0});return _P({checked:s,toggleCheck:a,disabled:o}),(d,p)=>(S(),K(Fe,null,[x(f(Ce),le(d.$attrs,{id:d.id,ref:f(i),role:"switch",type:d.as==="button"?"button":void 0,value:d.value,"aria-label":d.$attrs["aria-label"]||c.value,"aria-checked":f(s),"aria-required":d.required,"data-state":f(s)?"checked":"unchecked","data-disabled":f(o)?"":void 0,"as-child":d.asChild,as:d.as,disabled:f(o),onClick:a,onKeydown:zr(Ct(a,["prevent"]),["enter"])}),{default:_(()=>[V(d.$slots,"default",{checked:f(s)})]),_:3},16,["id","type","value","aria-label","aria-checked","aria-required","data-state","data-disabled","as-child","as","disabled","onKeydown"]),f(u)?(S(),K("input",{key:0,type:"checkbox",name:d.name,tabindex:"-1","aria-hidden":"true",disabled:f(o),required:d.required,value:d.value,checked:!!f(s),"data-state":f(s)?"checked":"unchecked","data-disabled":f(o)?"":void 0,style:{transform:"translateX(-100%)",position:"absolute",pointerEvents:"none",opacity:0,margin:0}},null,8,yP)):_e("",!0)],64))}}),wP=I({__name:"SwitchThumb",props:{asChild:{type:Boolean},as:{default:"span"}},setup(e){const t=bP();return ve(),(n,r)=>{var o;return S(),L(f(Ce),{"data-state":(o=f(t).checked)!=null&&o.value?"checked":"unchecked","data-disabled":f(t).disabled.value?"":void 0,"as-child":n.asChild,as:n.as},{default:_(()=>[V(n.$slots,"default")]),_:3},8,["data-state","data-disabled","as-child","as"])}}}),[Cp,kP]=dt("TabsRoot"),CP=I({__name:"TabsRoot",props:{defaultValue:{},orientation:{default:"horizontal"},dir:{},activationMode:{default:"automatic"},modelValue:{},asChild:{type:Boolean},as:{}},emits:["update:modelValue"],setup(e,{emit:t}){const n=e,r=t,{orientation:o,dir:s}=vt(n),a=qa(s);ve();const i=ln(n,"modelValue",r,{defaultValue:n.defaultValue,passive:n.modelValue===void 0}),l=F();return kP({modelValue:i,changeModelValue:u=>{i.value=u},orientation:o,dir:a,activationMode:n.activationMode,baseId:Ut(void 0,"radix-vue-tabs"),tabsList:l}),(u,c)=>(S(),L(f(Ce),{dir:f(a),"data-orientation":f(o),"as-child":u.asChild,as:u.as},{default:_(()=>[V(u.$slots,"default",{modelValue:f(i)})]),_:3},8,["dir","data-orientation","as-child","as"]))}}),SP=I({__name:"TabsList",props:{loop:{type:Boolean,default:!0},asChild:{type:Boolean},as:{}},setup(e){const t=e,{loop:n}=vt(t),{forwardRef:r,currentElement:o}=ve(),s=Cp();return s.tabsList=o,(a,i)=>(S(),L(f(_R),{"as-child":"",orientation:f(s).orientation.value,dir:f(s).dir.value,loop:f(n)},{default:_(()=>[x(f(Ce),{ref:f(r),role:"tablist","as-child":a.asChild,as:a.as,"aria-orientation":f(s).orientation.value},{default:_(()=>[V(a.$slots,"default")]),_:3},8,["as-child","as","aria-orientation"])]),_:3},8,["orientation","dir","loop"]))}});function r_(e,t){return`${e}-trigger-${t}`}function o_(e,t){return`${e}-content-${t}`}const EP=I({__name:"TabsContent",props:{value:{},forceMount:{type:Boolean},asChild:{type:Boolean},as:{}},setup(e){const t=e,{forwardRef:n}=ve(),r=Cp(),o=$(()=>r_(r.baseId,t.value)),s=$(()=>o_(r.baseId,t.value)),a=$(()=>t.value===r.modelValue.value),i=F(a.value);return $e(()=>{requestAnimationFrame(()=>{i.value=!1})}),(l,u)=>(S(),L(f(On),{present:a.value,"force-mount":""},{default:_(({present:c})=>[x(f(Ce),{id:s.value,ref:f(n),"as-child":l.asChild,as:l.as,role:"tabpanel","data-state":a.value?"active":"inactive","data-orientation":f(r).orientation.value,"aria-labelledby":o.value,hidden:!c.value,tabindex:"0",style:Wt({animationDuration:i.value?"0s":void 0})},{default:_(()=>[l.forceMount||a.value?V(l.$slots,"default",{key:0}):_e("",!0)]),_:2},1032,["id","as-child","as","data-state","data-orientation","aria-labelledby","hidden","style"])]),_:3},8,["present"]))}}),AP=I({__name:"TabsTrigger",props:{value:{},disabled:{type:Boolean,default:!1},asChild:{type:Boolean},as:{default:"button"}},setup(e){const t=e,{forwardRef:n}=ve(),r=Cp(),o=$(()=>r_(r.baseId,t.value)),s=$(()=>o_(r.baseId,t.value)),a=$(()=>t.value===r.modelValue.value);return(i,l)=>(S(),L(f(xR),{"as-child":"",focusable:!i.disabled,active:a.value},{default:_(()=>[x(f(Ce),{id:o.value,ref:f(n),role:"tab",type:i.as==="button"?"button":void 0,as:i.as,"as-child":i.asChild,"aria-selected":a.value?"true":"false","aria-controls":s.value,"data-state":a.value?"active":"inactive",disabled:i.disabled,"data-disabled":i.disabled?"":void 0,"data-orientation":f(r).orientation.value,onMousedown:l[0]||(l[0]=Ct(u=>{!i.disabled&&u.ctrlKey===!1?f(r).changeModelValue(i.value):u.preventDefault()},["left"])),onKeydown:l[1]||(l[1]=zr(u=>f(r).changeModelValue(i.value),["enter","space"])),onFocus:l[2]||(l[2]=()=>{const u=f(r).activationMode!=="manual";!a.value&&!i.disabled&&u&&f(r).changeModelValue(i.value)})},{default:_(()=>[V(i.$slots,"default")]),_:3},8,["id","type","as","as-child","aria-selected","aria-controls","data-state","disabled","data-disabled","data-orientation"])]),_:3},8,["focusable","active"]))}}),[ac,DP]=dt("ToastProvider"),TP=I({inheritAttrs:!1,__name:"ToastProvider",props:{label:{default:"Notification"},duration:{default:5e3},swipeDirection:{default:"right"},swipeThreshold:{default:50}},setup(e){const t=e,{label:n,duration:r,swipeDirection:o,swipeThreshold:s}=vt(t),a=F(),i=F(0),l=F(!1),u=F(!1);if(t.label&&typeof t.label=="string"&&!t.label.trim()){const c="Invalid prop `label` supplied to `ToastProvider`. Expected non-empty `string`.";throw new Error(c)}return DP({label:n,duration:r,swipeDirection:o,swipeThreshold:s,toastCount:i,viewport:a,onViewportChange(c){a.value=c},onToastAdd(){i.value++},onToastRemove(){i.value--},isFocusedToastEscapeKeyDownRef:l,isClosePausedRef:u}),(c,d)=>V(c.$slots,"default")}}),OP="toast.swipeStart",MP="toast.swipeMove",RP="toast.swipeCancel",PP="toast.swipeEnd",Zd="toast.viewportPause",Xd="toast.viewportResume";function ui(e,t,n){const r=n.originalEvent.currentTarget,o=new CustomEvent(e,{bubbles:!1,cancelable:!0,detail:n});t&&r.addEventListener(e,t,{once:!0}),r.dispatchEvent(o)}function eg(e,t,n=0){const r=Math.abs(e.x),o=Math.abs(e.y),s=r>o;return t==="left"||t==="right"?s&&r>n:!s&&o>n}function $P(e){return e.nodeType===e.ELEMENT_NODE}function s_(e){const t=[];return Array.from(e.childNodes).forEach(n=>{if(n.nodeType===n.TEXT_NODE&&n.textContent&&t.push(n.textContent),$P(n)){const r=n.ariaHidden||n.hidden||n.style.display==="none",o=n.dataset.radixToastAnnounceExclude==="";if(!r)if(o){const s=n.dataset.radixToastAnnounceAlt;s&&t.push(s)}else t.push(...s_(n))}}),t}const FP=I({__name:"ToastAnnounce",setup(e){const t=ac(),n=LO(1e3),r=F(!1);return yb(()=>{r.value=!0}),(o,s)=>f(n)||r.value?(S(),L(f(Jl),{key:0},{default:_(()=>[oe(ne(f(t).label.value)+" ",1),V(o.$slots,"default")]),_:3})):_e("",!0)}}),[IP,LP]=dt("ToastRoot"),NP=I({inheritAttrs:!1,__name:"ToastRootImpl",props:{type:{},open:{type:Boolean,default:!1},duration:{},asChild:{type:Boolean},as:{default:"li"}},emits:["close","escapeKeyDown","pause","resume","swipeStart","swipeMove","swipeCancel","swipeEnd"],setup(e,{emit:t}){const n=e,r=t,{forwardRef:o,currentElement:s}=ve(),a=ac(),i=F(null),l=F(null),u=$(()=>typeof n.duration=="number"?n.duration:a.duration.value),c=F(0),d=F(u.value),p=F(0),h=F(u.value),m=yb(()=>{const k=new Date().getTime()-c.value;h.value=Math.max(d.value-k,0)},{fpsLimit:60});function g(k){k<=0||k===Number.POSITIVE_INFINITY||Xn&&(window.clearTimeout(p.value),c.value=new Date().getTime(),p.value=window.setTimeout(v,k))}function v(){var k,b;(k=s.value)!=null&&k.contains(document.activeElement)&&((b=a.viewport.value)==null||b.focus()),a.isClosePausedRef.value=!1,r("close")}const y=$(()=>s.value?s_(s.value):null);if(n.type&&!["foreground","background"].includes(n.type)){const k="Invalid prop `type` supplied to `Toast`. Expected `foreground | background`.";throw new Error(k)}return pt(k=>{const b=a.viewport.value;if(b){const w=()=>{g(d.value),m.resume(),r("resume")},C=()=>{const A=new Date().getTime()-c.value;d.value=d.value-A,window.clearTimeout(p.value),m.pause(),r("pause")};return b.addEventListener(Zd,C),b.addEventListener(Xd,w),()=>{b.removeEventListener(Zd,C),b.removeEventListener(Xd,w)}}}),Oe(()=>[n.open,u.value],()=>{d.value=u.value,n.open&&!a.isClosePausedRef.value&&g(u.value)},{immediate:!0}),cp("Escape",k=>{r("escapeKeyDown",k),k.defaultPrevented||(a.isFocusedToastEscapeKeyDownRef.value=!0,v())}),$e(()=>{a.onToastAdd()}),Yt(()=>{a.onToastRemove()}),LP({onClose:v}),(k,b)=>(S(),K(Fe,null,[y.value?(S(),L(FP,{key:0,role:"status","aria-live":k.type==="foreground"?"assertive":"polite","aria-atomic":""},{default:_(()=>[oe(ne(y.value),1)]),_:1},8,["aria-live"])):_e("",!0),f(a).viewport.value?(S(),L(T0,{key:1,to:f(a).viewport.value},[x(f(Ce),le({ref:f(o),role:"status","aria-live":"off","aria-atomic":"",tabindex:"0","data-radix-vue-collection-item":""},k.$attrs,{as:k.as,"as-child":k.asChild,"data-state":k.open?"open":"closed","data-swipe-direction":f(a).swipeDirection.value,style:{userSelect:"none",touchAction:"none"},onPointerdown:b[0]||(b[0]=Ct(w=>{i.value={x:w.clientX,y:w.clientY}},["left"])),onPointermove:b[1]||(b[1]=w=>{if(!i.value)return;const C=w.clientX-i.value.x,A=w.clientY-i.value.y,R=!!l.value,M=["left","right"].includes(f(a).swipeDirection.value),O=["left","up"].includes(f(a).swipeDirection.value)?Math.min:Math.max,P=M?O(0,C):0,W=M?0:O(0,A),z=w.pointerType==="touch"?10:2,re={x:P,y:W},B={originalEvent:w,delta:re};R?(l.value=re,f(ui)(f(MP),ue=>r("swipeMove",ue),B)):f(eg)(re,f(a).swipeDirection.value,z)?(l.value=re,f(ui)(f(OP),ue=>r("swipeStart",ue),B),w.target.setPointerCapture(w.pointerId)):(Math.abs(C)>z||Math.abs(A)>z)&&(i.value=null)}),onPointerup:b[2]||(b[2]=w=>{const C=l.value,A=w.target;if(A.hasPointerCapture(w.pointerId)&&A.releasePointerCapture(w.pointerId),l.value=null,i.value=null,C){const R=w.currentTarget,M={originalEvent:w,delta:C};f(eg)(C,f(a).swipeDirection.value,f(a).swipeThreshold.value)?f(ui)(f(PP),O=>r("swipeEnd",O),M):f(ui)(f(RP),O=>r("swipeCancel",O),M),R?.addEventListener("click",O=>O.preventDefault(),{once:!0})}})}),{default:_(()=>[V(k.$slots,"default",{remaining:h.value,duration:u.value})]),_:3},16,["as","as-child","data-state","data-swipe-direction"])],8,["to"])):_e("",!0)],64))}}),zP=I({__name:"ToastRoot",props:{defaultOpen:{type:Boolean,default:!0},forceMount:{type:Boolean},type:{default:"foreground"},open:{type:Boolean,default:void 0},duration:{},asChild:{type:Boolean},as:{default:"li"}},emits:["escapeKeyDown","pause","resume","swipeStart","swipeMove","swipeCancel","swipeEnd","update:open"],setup(e,{emit:t}){const n=e,r=t,{forwardRef:o}=ve(),s=ln(n,"open",r,{defaultValue:n.defaultOpen,passive:n.open===void 0});return(a,i)=>(S(),L(f(On),{present:a.forceMount||f(s)},{default:_(()=>[x(NP,le({ref:f(o),open:f(s),type:a.type,as:a.as,"as-child":a.asChild,duration:a.duration},a.$attrs,{onClose:i[0]||(i[0]=l=>s.value=!1),onPause:i[1]||(i[1]=l=>r("pause")),onResume:i[2]||(i[2]=l=>r("resume")),onEscapeKeyDown:i[3]||(i[3]=l=>r("escapeKeyDown",l)),onSwipeStart:i[4]||(i[4]=l=>{r("swipeStart",l),l.currentTarget.setAttribute("data-swipe","start")}),onSwipeMove:i[5]||(i[5]=l=>{const{x:u,y:c}=l.detail.delta,d=l.currentTarget;d.setAttribute("data-swipe","move"),d.style.setProperty("--radix-toast-swipe-move-x",`${u}px`),d.style.setProperty("--radix-toast-swipe-move-y",`${c}px`)}),onSwipeCancel:i[6]||(i[6]=l=>{const u=l.currentTarget;u.setAttribute("data-swipe","cancel"),u.style.removeProperty("--radix-toast-swipe-move-x"),u.style.removeProperty("--radix-toast-swipe-move-y"),u.style.removeProperty("--radix-toast-swipe-end-x"),u.style.removeProperty("--radix-toast-swipe-end-y")}),onSwipeEnd:i[7]||(i[7]=l=>{const{x:u,y:c}=l.detail.delta,d=l.currentTarget;d.setAttribute("data-swipe","end"),d.style.removeProperty("--radix-toast-swipe-move-x"),d.style.removeProperty("--radix-toast-swipe-move-y"),d.style.setProperty("--radix-toast-swipe-end-x",`${u}px`),d.style.setProperty("--radix-toast-swipe-end-y",`${c}px`),s.value=!1})}),{default:_(({remaining:l,duration:u})=>[V(a.$slots,"default",{remaining:l,duration:u,open:f(s)})]),_:3},16,["open","type","as","as-child","duration"])]),_:3},8,["present"]))}}),BP=I({__name:"ToastAnnounceExclude",props:{altText:{},asChild:{type:Boolean},as:{}},setup(e){return(t,n)=>(S(),L(f(Ce),{as:t.as,"as-child":t.asChild,"data-radix-toast-announce-exclude":"","data-radix-toast-announce-alt":t.altText||void 0},{default:_(()=>[V(t.$slots,"default")]),_:3},8,["as","as-child","data-radix-toast-announce-alt"]))}}),qP=I({__name:"ToastClose",props:{asChild:{type:Boolean},as:{default:"button"}},setup(e){const t=e,n=IP(),{forwardRef:r}=ve();return(o,s)=>(S(),L(BP,{"as-child":""},{default:_(()=>[x(f(Ce),le(t,{ref:f(r),type:o.as==="button"?"button":void 0,onClick:s[0]||(s[0]=a=>f(n).onClose())}),{default:_(()=>[V(o.$slots,"default")]),_:3},16,["type"])]),_:3}))}}),tg=I({__name:"FocusProxy",emits:["focusFromOutsideViewport"],setup(e,{emit:t}){const n=t,r=ac();return(o,s)=>(S(),L(f(Jl),{"aria-hidden":"true",tabindex:"0",style:{position:"fixed"},onFocus:s[0]||(s[0]=a=>{var i;const l=a.relatedTarget;!((i=f(r).viewport.value)!=null&&i.contains(l))&&n("focusFromOutsideViewport")})},{default:_(()=>[V(o.$slots,"default")]),_:3}))}}),VP=I({inheritAttrs:!1,__name:"ToastViewport",props:{hotkey:{default:()=>["F8"]},label:{type:[String,Function],default:"Notifications ({hotkey})"},asChild:{type:Boolean},as:{default:"ol"}},setup(e){const t=e,{hotkey:n,label:r}=vt(t),{forwardRef:o,currentElement:s}=ve(),{createCollection:a}=KO(),i=a(s),l=ac(),u=$(()=>l.toastCount.value>0),c=F(),d=F(),p=$(()=>n.value.join("+").replace(/Key/g,"").replace(/Digit/g,""));cp(n.value,()=>{s.value.focus()}),$e(()=>{l.onViewportChange(s.value)}),pt(m=>{const g=s.value;if(u.value&&g){const v=()=>{if(!l.isClosePausedRef.value){const C=new CustomEvent(Zd);g.dispatchEvent(C),l.isClosePausedRef.value=!0}},y=()=>{if(l.isClosePausedRef.value){const C=new CustomEvent(Xd);g.dispatchEvent(C),l.isClosePausedRef.value=!1}},k=C=>{!g.contains(C.relatedTarget)&&y()},b=()=>{g.contains(document.activeElement)||y()},w=C=>{var A,R,M;const O=C.altKey||C.ctrlKey||C.metaKey;if(C.key==="Tab"&&!O){const P=document.activeElement,W=C.shiftKey;if(C.target===g&&W){(A=c.value)==null||A.focus();return}const z=h({tabbingDirection:W?"backwards":"forwards"}),re=z.findIndex(B=>B===P);Ti(z.slice(re+1))?C.preventDefault():W?(R=c.value)==null||R.focus():(M=d.value)==null||M.focus()}};g.addEventListener("focusin",v),g.addEventListener("focusout",k),g.addEventListener("pointermove",v),g.addEventListener("pointerleave",b),g.addEventListener("keydown",w),window.addEventListener("blur",v),window.addEventListener("focus",y),m(()=>{g.removeEventListener("focusin",v),g.removeEventListener("focusout",k),g.removeEventListener("pointermove",v),g.removeEventListener("pointerleave",b),g.removeEventListener("keydown",w),window.removeEventListener("blur",v),window.removeEventListener("focus",y)})}});function h({tabbingDirection:m}){const g=i.value.map(v=>{const y=[v,...vp(v)];return m==="forwards"?y:y.reverse()});return(m==="forwards"?g.reverse():g).flat()}return(m,g)=>(S(),L(f(bM),{role:"region","aria-label":typeof f(r)=="string"?f(r).replace("{hotkey}",p.value):f(r)(p.value),tabindex:"-1",style:Wt({pointerEvents:u.value?void 0:"none"})},{default:_(()=>[u.value?(S(),L(tg,{key:0,ref:v=>{c.value=f(rn)(v)},onFocusFromOutsideViewport:g[0]||(g[0]=()=>{const v=h({tabbingDirection:"forwards"});f(Ti)(v)})},null,512)):_e("",!0),x(f(Ce),le({ref:f(o),tabindex:"-1",as:m.as,"as-child":m.asChild},m.$attrs),{default:_(()=>[V(m.$slots,"default")]),_:3},16,["as","as-child"]),u.value?(S(),L(tg,{key:1,ref:v=>{d.value=f(rn)(v)},onFocusFromOutsideViewport:g[1]||(g[1]=()=>{const v=h({tabbingDirection:"backwards"});f(Ti)(v)})},null,512)):_e("",!0)]),_:3},8,["aria-label","style"]))}}),jP=I({__name:"ToastTitle",props:{asChild:{type:Boolean},as:{}},setup(e){const t=e;return ve(),(n,r)=>(S(),L(f(Ce),St(Et(t)),{default:_(()=>[V(n.$slots,"default")]),_:3},16))}}),HP=I({__name:"ToastDescription",props:{asChild:{type:Boolean},as:{}},setup(e){const t=e;return ve(),(n,r)=>(S(),L(f(Ce),St(Et(t)),{default:_(()=>[V(n.$slots,"default")]),_:3},16))}}),a_="tooltip.open",[Sp,UP]=dt("TooltipProvider"),WP=I({inheritAttrs:!1,__name:"TooltipProvider",props:{delayDuration:{default:700},skipDelayDuration:{default:300},disableHoverableContent:{type:Boolean,default:!1},disableClosingTrigger:{type:Boolean},disabled:{type:Boolean},ignoreNonKeyboardFocus:{type:Boolean,default:!1}},setup(e){const t=e,{delayDuration:n,skipDelayDuration:r,disableHoverableContent:o,disableClosingTrigger:s,ignoreNonKeyboardFocus:a,disabled:i}=vt(t);ve();const l=F(!0),u=F(!1),{start:c,stop:d}=lp(()=>{l.value=!0},r,{immediate:!1});return UP({isOpenDelayed:l,delayDuration:n,onOpen(){d(),l.value=!1},onClose(){c()},isPointerInTransitRef:u,disableHoverableContent:o,disableClosingTrigger:s,disabled:i,ignoreNonKeyboardFocus:a}),(p,h)=>V(p.$slots,"default")}}),[ic,YP]=dt("TooltipRoot"),GP=I({__name:"TooltipRoot",props:{defaultOpen:{type:Boolean,default:!1},open:{type:Boolean,default:void 0},delayDuration:{default:void 0},disableHoverableContent:{type:Boolean,default:void 0},disableClosingTrigger:{type:Boolean,default:void 0},disabled:{type:Boolean,default:void 0},ignoreNonKeyboardFocus:{type:Boolean,default:void 0}},emits:["update:open"],setup(e,{emit:t}){const n=e,r=t;ve();const o=Sp(),s=$(()=>n.disableHoverableContent??o.disableHoverableContent.value),a=$(()=>n.disableClosingTrigger??o.disableClosingTrigger.value),i=$(()=>n.disabled??o.disabled.value),l=$(()=>n.delayDuration??o.delayDuration.value),u=$(()=>n.ignoreNonKeyboardFocus??o.ignoreNonKeyboardFocus.value),c=ln(n,"open",r,{defaultValue:n.defaultOpen,passive:n.open===void 0});Oe(c,b=>{o.onClose&&(b?(o.onOpen(),document.dispatchEvent(new CustomEvent(a_))):o.onClose())});const d=F(!1),p=F(),h=$(()=>c.value?d.value?"delayed-open":"instant-open":"closed"),{start:m,stop:g}=lp(()=>{d.value=!0,c.value=!0},l,{immediate:!1});function v(){g(),d.value=!1,c.value=!0}function y(){g(),c.value=!1}function k(){m()}return YP({contentId:"",open:c,stateAttribute:h,trigger:p,onTriggerChange(b){p.value=b},onTriggerEnter(){o.isOpenDelayed.value?k():v()},onTriggerLeave(){s.value?y():g()},onOpen:v,onClose:y,disableHoverableContent:s,disableClosingTrigger:a,disabled:i,ignoreNonKeyboardFocus:u}),(b,w)=>(S(),L(f(yp),null,{default:_(()=>[V(b.$slots,"default",{open:f(c)})]),_:3}))}}),KP=I({__name:"TooltipTrigger",props:{asChild:{type:Boolean},as:{default:"button"}},setup(e){const t=e,n=ic(),r=Sp();n.contentId||(n.contentId=Ut(void 0,"radix-vue-tooltip-content"));const{forwardRef:o,currentElement:s}=ve(),a=F(!1),i=F(!1),l=$(()=>n.disabled.value?{}:{click:g,focus:h,pointermove:d,pointerleave:p,pointerdown:c,blur:m});$e(()=>{n.onTriggerChange(s.value)});function u(){setTimeout(()=>{a.value=!1},1)}function c(){a.value=!0,document.addEventListener("pointerup",u,{once:!0})}function d(v){v.pointerType!=="touch"&&!i.value&&!r.isPointerInTransitRef.value&&(n.onTriggerEnter(),i.value=!0)}function p(){n.onTriggerLeave(),i.value=!1}function h(v){var y,k;a.value||n.ignoreNonKeyboardFocus.value&&!((k=(y=v.target).matches)!=null&&k.call(y,":focus-visible"))||n.onOpen()}function m(){n.onClose()}function g(){n.disableClosingTrigger.value||n.onClose()}return(v,y)=>(S(),L(f(Ab),{"as-child":""},{default:_(()=>[x(f(Ce),le({ref:f(o),"aria-describedby":f(n).open.value?f(n).contentId:void 0,"data-state":f(n).stateAttribute.value,as:v.as,"as-child":t.asChild,"data-grace-area-trigger":""},Jx(l.value)),{default:_(()=>[V(v.$slots,"default")]),_:3},16,["aria-describedby","data-state","as","as-child"])]),_:3}))}}),i_=I({__name:"TooltipContentImpl",props:{ariaLabel:{},asChild:{type:Boolean},as:{},side:{default:"top"},sideOffset:{default:0},align:{default:"center"},alignOffset:{},avoidCollisions:{type:Boolean,default:!0},collisionBoundary:{default:()=>[]},collisionPadding:{default:0},arrowPadding:{default:0},sticky:{default:"partial"},hideWhenDetached:{type:Boolean,default:!1}},emits:["escapeKeyDown","pointerDownOutside"],setup(e,{emit:t}){const n=e,r=t,o=ic(),{forwardRef:s}=ve(),a=ew(),i=$(()=>{var c;return(c=a.default)==null?void 0:c.call(a)}),l=$(()=>{var c;if(n.ariaLabel)return n.ariaLabel;let d="";function p(h){typeof h.children=="string"&&h.type!==xn?d+=h.children:Array.isArray(h.children)&&h.children.forEach(m=>p(m))}return(c=i.value)==null||c.forEach(h=>p(h)),d}),u=$(()=>{const{ariaLabel:c,...d}=n;return d});return $e(()=>{tl(window,"scroll",c=>{const d=c.target;d!=null&&d.contains(o.trigger.value)&&o.onClose()}),tl(window,a_,o.onClose)}),(c,d)=>(S(),L(f(Xl),{"as-child":"","disable-outside-pointer-events":!1,onEscapeKeyDown:d[0]||(d[0]=p=>r("escapeKeyDown",p)),onPointerDownOutside:d[1]||(d[1]=p=>{var h;f(o).disableClosingTrigger.value&&(h=f(o).trigger.value)!=null&&h.contains(p.target)&&p.preventDefault(),r("pointerDownOutside",p)}),onFocusOutside:d[2]||(d[2]=Ct(()=>{},["prevent"])),onDismiss:d[3]||(d[3]=p=>f(o).onClose())},{default:_(()=>[x(f(rl),le({ref:f(s),"data-state":f(o).stateAttribute.value},{...c.$attrs,...u.value},{style:{"--radix-tooltip-content-transform-origin":"var(--radix-popper-transform-origin)","--radix-tooltip-content-available-width":"var(--radix-popper-available-width)","--radix-tooltip-content-available-height":"var(--radix-popper-available-height)","--radix-tooltip-trigger-width":"var(--radix-popper-anchor-width)","--radix-tooltip-trigger-height":"var(--radix-popper-anchor-height)"}}),{default:_(()=>[V(c.$slots,"default"),x(f(Jl),{id:f(o).contentId,role:"tooltip"},{default:_(()=>[oe(ne(l.value),1)]),_:1},8,["id"])]),_:3},16,["data-state"])]),_:3}))}}),ZP=I({__name:"TooltipContentHoverable",props:{ariaLabel:{},asChild:{type:Boolean},as:{},side:{},sideOffset:{},align:{},alignOffset:{},avoidCollisions:{type:Boolean},collisionBoundary:{},collisionPadding:{},arrowPadding:{},sticky:{},hideWhenDetached:{type:Boolean}},setup(e){const t=Xr(e),{forwardRef:n,currentElement:r}=ve(),{trigger:o,onClose:s}=ic(),a=Sp(),{isPointerInTransit:i,onPointerExit:l}=XO(o,r);return a.isPointerInTransitRef=i,l(()=>{s()}),(u,c)=>(S(),L(i_,le({ref:f(n)},f(t)),{default:_(()=>[V(u.$slots,"default")]),_:3},16))}}),XP=I({__name:"TooltipContent",props:{forceMount:{type:Boolean},ariaLabel:{},asChild:{type:Boolean},as:{},side:{default:"top"},sideOffset:{},align:{},alignOffset:{},avoidCollisions:{type:Boolean},collisionBoundary:{},collisionPadding:{},arrowPadding:{},sticky:{},hideWhenDetached:{type:Boolean}},emits:["escapeKeyDown","pointerDownOutside"],setup(e,{emit:t}){const n=e,r=t,o=ic(),s=yt(n,r),{forwardRef:a}=ve();return(i,l)=>(S(),L(f(On),{present:i.forceMount||f(o).open.value},{default:_(()=>[(S(),L(Qo(f(o).disableHoverableContent.value?i_:ZP),le({ref:f(a)},f(s)),{default:_(()=>[V(i.$slots,"default")]),_:3},16))]),_:3},8,["present"]))}}),JP=I({__name:"TooltipPortal",props:{to:{},disabled:{type:Boolean},forceMount:{type:Boolean}},setup(e){const t=e;return(n,r)=>(S(),L(f(gp),St(Et(t)),{default:_(()=>[V(n.$slots,"default")]),_:3},16))}}),QP=I({__name:"Avatar",props:{class:{},size:{default:"sm"},shape:{default:"circle"}},setup(e){const t=e;return(n,r)=>(S(),L(f(LM),{class:Ee(f(xe)(f(t8)({size:n.size,shape:n.shape}),t.class))},{default:_(()=>[V(n.$slots,"default")]),_:3},8,["class"]))}}),e8=I({__name:"AvatarFallback",props:{delayMs:{},asChild:{type:Boolean},as:{}},setup(e){const t=e;return(n,r)=>(S(),L(f(NM),St(Et(t)),{default:_(()=>[V(n.$slots,"default")]),_:3},16))}}),t8=Na("inline-flex items-center justify-center font-normal text-foreground select-none shrink-0 bg-secondary overflow-hidden",{variants:{size:{sm:"h-10 w-10 text-xs",base:"h-16 w-16 text-2xl",lg:"h-32 w-32 text-5xl"},shape:{circle:"rounded-full",square:"rounded-md"}}}),ut=I({__name:"Button",props:{variant:{},size:{},class:{},asChild:{type:Boolean},as:{default:"button"}},setup(e){const t=e;return(n,r)=>(S(),L(f(Ce),{as:n.as,"as-child":n.asChild,class:Ee(f(xe)(f(Jd)({variant:n.variant,size:n.size}),t.class))},{default:_(()=>[V(n.$slots,"default")]),_:3},8,["as","as-child","class"]))}}),Jd=Na("inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50",{variants:{variant:{default:"bg-primary text-primary-foreground shadow hover:bg-primary/90",destructive:"bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90",outline:"border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground",secondary:"bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80",ghost:"hover:bg-accent hover:text-accent-foreground",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-9 px-4 py-2",sm:"h-8 rounded-md px-3 text-xs",lg:"h-10 rounded-md px-8",icon:"h-9 w-9"}},defaultVariants:{variant:"default",size:"default"}}),Ge=I({__name:"Separator",props:{orientation:{},decorative:{type:Boolean},asChild:{type:Boolean},as:{},class:{},label:{}},setup(e){const t=e,n=$(()=>{const{class:r,...o}=t;return o});return(r,o)=>(S(),L(f(WR),le(n.value,{class:f(xe)("shrink-0 bg-border relative",t.orientation==="vertical"?"w-px h-full":"h-px w-full",t.class)}),{default:_(()=>[t.label?(S(),K("span",{key:0,class:Ee(f(xe)("text-xs text-muted-foreground bg-background absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 flex justify-center items-center",t.orientation==="vertical"?"w-[1px] px-1 py-2":"h-[1px] py-1 px-2"))},ne(t.label),3)):_e("",!0)]),_:1},16,["class"]))}}),Qt=I({__name:"Tooltip",props:{defaultOpen:{type:Boolean},open:{type:Boolean},delayDuration:{},disableHoverableContent:{type:Boolean},disableClosingTrigger:{type:Boolean},disabled:{type:Boolean},ignoreNonKeyboardFocus:{type:Boolean}},emits:["update:open"],setup(e,{emit:t}){const o=yt(e,t);return(s,a)=>(S(),L(f(GP),St(Et(f(o))),{default:_(()=>[V(s.$slots,"default")]),_:3},16))}}),en=I({inheritAttrs:!1,__name:"TooltipContent",props:{forceMount:{type:Boolean},ariaLabel:{},asChild:{type:Boolean},as:{},side:{},sideOffset:{default:4},align:{},alignOffset:{},avoidCollisions:{type:Boolean},collisionBoundary:{},collisionPadding:{},arrowPadding:{},sticky:{},hideWhenDetached:{type:Boolean},class:{}},emits:["escapeKeyDown","pointerDownOutside"],setup(e,{emit:t}){const n=e,r=t,o=$(()=>{const{class:a,...i}=n;return i}),s=yt(o,r);return(a,i)=>(S(),L(f(JP),null,{default:_(()=>[x(f(XP),le({...f(s),...a.$attrs},{class:f(xe)("z-50 overflow-hidden rounded-md bg-primary px-3 py-1.5 text-xs text-primary-foreground animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",n.class)}),{default:_(()=>[V(a.$slots,"default")]),_:3},16,["class"])]),_:3}))}}),tn=I({__name:"TooltipTrigger",props:{asChild:{type:Boolean},as:{}},setup(e){const t=e;return(n,r)=>(S(),L(f(KP),St(Et(t)),{default:_(()=>[V(n.$slots,"default")]),_:3},16))}}),cn=I({__name:"TooltipProvider",props:{delayDuration:{},skipDelayDuration:{},disableHoverableContent:{type:Boolean},disableClosingTrigger:{type:Boolean},disabled:{type:Boolean},ignoreNonKeyboardFocus:{type:Boolean}},setup(e){const t=e;return(n,r)=>(S(),L(f(WP),St(Et(t)),{default:_(()=>[V(n.$slots,"default")]),_:3},16))}}),ja=I({__name:"Tabs",props:{defaultValue:{},orientation:{},dir:{},activationMode:{},modelValue:{},asChild:{type:Boolean},as:{}},emits:["update:modelValue"],setup(e,{emit:t}){const o=yt(e,t);return(s,a)=>(S(),L(f(CP),St(Et(f(o))),{default:_(()=>[V(s.$slots,"default")]),_:3},16))}}),n8={class:"truncate"},Un=I({__name:"TabsTrigger",props:{value:{},disabled:{type:Boolean},asChild:{type:Boolean},as:{},class:{}},setup(e){const t=e,n=$(()=>{const{class:o,...s}=t;return s}),r=Xr(n);return(o,s)=>(S(),L(f(AP),le(f(r),{class:f(xe)("inline-flex items-center justify-center whitespace-nowrap rounded-md px-3 py-1 text-sm font-medium ring-offset-background transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:shadow",t.class)}),{default:_(()=>[E("span",n8,[V(o.$slots,"default")])]),_:3},16,["class"]))}}),Ha=I({__name:"TabsList",props:{loop:{type:Boolean},asChild:{type:Boolean},as:{},class:{}},setup(e){const t=e,n=$(()=>{const{class:r,...o}=t;return o});return(r,o)=>(S(),L(f(SP),le(n.value,{class:f(xe)("inline-flex items-center justify-center rounded-lg bg-muted p-1 text-muted-foreground",t.class)}),{default:_(()=>[V(r.$slots,"default")]),_:3},16,["class"]))}}),Yr=I({__name:"TabsContent",props:{value:{},forceMount:{type:Boolean},asChild:{type:Boolean},as:{},class:{}},setup(e){const t=e,n=$(()=>{const{class:r,...o}=t;return o});return(r,o)=>(S(),L(f(EP),le({class:f(xe)("mt-2 ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",t.class)},n.value),{default:_(()=>[V(r.$slots,"default")]),_:3},16,["class"]))}}),r8={class:"flex h-full flex-col"},o8={class:"flex items-center p-2"},s8={class:"flex items-center gap-2"},a8={key:0,class:"flex flex-1 flex-col"},i8={class:"flex items-start p-4"},l8={class:"flex items-start gap-4 text-sm"},c8={class:"grid gap-1"},u8={class:"font-semibold"},d8={class:"line-clamp-1 text-xs"},f8={key:0},p8={class:"flex items-center pt-2"},h8={key:0,class:"ml-auto text-xs text-muted-foreground"},m8={class:"h-screen space-y-2 overflow-y-auto bg-muted/50 p-2 pb-10 text-xs"},g8={class:"flex items-center gap-2"},v8={class:"h-4 py-1 text-2xs font-semibold text-muted-foreground group-hover:text-primary/80"},y8={class:"flex space-x-4"},b8={class:"w-64"},_8={class:"truncate font-medium"},x8={class:"lowercase text-muted-foreground"},w8={class:"ml-8 min-w-24"},k8={class:"lowercase text-muted-foreground"},C8={class:"ml-8 min-w-24"},S8={class:"lowercase text-muted-foreground"},E8={class:"ml-8 min-w-24"},A8={class:"font-medium"},D8={class:"lowercase text-muted-foreground"},T8={class:"ml-8 min-w-24"},O8={class:"lowercase text-muted-foreground"},M8={class:"flex items-center gap-2"},R8={class:"text-xs text-muted-foreground group-hover:text-foreground"},P8={key:1,class:"p-8 text-center text-sm font-medium text-muted-foreground"},$8=I({__name:"ScanDisplay",setup(e){const t=Jf(),n=Ra(),r=$(()=>n.selectedDomain),o=$(()=>n.hosts),s=$(()=>r.value?.name.substring(0,2).toUpperCase()),a=F("live"),i=c=>{a.value=c},l=()=>{r.value&&n.deleteDomain(r.value)},u=$(()=>a.value==="live"?o.value.filter(c=>c.status==="live"):o.value);return Oe(r,()=>{r.value&&n.getHosts(r.value)}),(c,d)=>(S(),K("div",r8,[E("div",o8,[E("div",s8,[x(f(Qt),null,{default:_(()=>[x(f(tn),{"as-child":""},{default:_(()=>[x(f(ut),{variant:"ghost",size:"icon",disabled:!r.value},{default:_(()=>[x(f(g3),{class:"size-4"}),d[1]||(d[1]=E("span",{class:"sr-only"},"Re-scan domain",-1))]),_:1},8,["disabled"])]),_:1}),x(f(en),null,{default:_(()=>d[2]||(d[2]=[oe("Re-scan domain")])),_:1})]),_:1}),x(f(Ge),{orientation:"vertical",class:"mx-2 h-6"}),x(f(Qt),null,{default:_(()=>[x(f(tn),{"as-child":""},{default:_(()=>[x(f(ut),{variant:"ghost",size:"icon",disabled:!r.value,onClick:l},{default:_(()=>[x(f(ms),{class:"size-4"}),d[3]||(d[3]=E("span",{class:"sr-only"},"Delete domain",-1))]),_:1},8,["disabled"])]),_:1}),x(f(en),null,{default:_(()=>d[4]||(d[4]=[oe("Delete domain")])),_:1})]),_:1})])]),x(f(Ge)),r.value?(S(),K("div",a8,[E("div",i8,[E("div",l8,[x(f(QP),null,{default:_(()=>[x(f(e8),null,{default:_(()=>[oe(ne(s.value),1)]),_:1})]),_:1}),E("div",c8,[E("div",u8,ne(r.value.name),1),E("div",d8,[a.value==="live"?(S(),K("span",f8,ne(f(t).customNumberFormat(u.value.length||0))+" of ",1)):_e("",!0),E("span",null,ne(f(t).customNumberFormat(r.value.host_count||0))+" hosts ",1)]),x(f(ja),{"default-value":"live",modelValue:a.value,"onUpdate:modelValue":[d[0]||(d[0]=p=>a.value=p),i]},{default:_(()=>[E("div",p8,[x(f(Ha),{class:""},{default:_(()=>[x(f(Un),{value:"live",class:"text-xs text-zinc-600 dark:text-zinc-200"},{default:_(()=>d[5]||(d[5]=[oe(" Live ")])),_:1}),x(f(Un),{value:"all",class:"text-xs text-zinc-600 dark:text-zinc-200"},{default:_(()=>d[6]||(d[6]=[oe(" All ")])),_:1})]),_:1})])]),_:1},8,["modelValue"])])]),r.value.last_scanned_at?(S(),K("div",h8," last scanned "+ne(f(yo)(new Date(r.value.last_scanned_at),{addSuffix:!0})),1)):_e("",!0)]),x(f(Ge)),E("div",m8,[(S(!0),K(Fe,null,It(u.value,p=>(S(),K("div",{key:p.id,class:"group flex justify-between rounded-md bg-background p-1 shadow-sm"},[E("div",g8,[E("div",{class:Ee(["m-2 flex flex-col items-center rounded-sm p-1",p.status==="live"?" text-primary":"text-secondary"])},[x(f(x3),{class:"size-4"}),E("span",v8,ne(p.status_code&&p.status_code>0?p.status_code:"-"),1)],2),E("div",y8,[E("div",b8,[E("div",_8,ne(p.name),1),E("div",x8,ne(p.content_type),1)]),E("div",w8,[d[7]||(d[7]=E("div",{class:"font-medium"},"server",-1)),E("div",k8,ne(p.webserver&&p.webserver.length>0?p.webserver:"-"),1)]),E("div",C8,[d[8]||(d[8]=E("div",{class:"font-medium"},"source",-1)),E("div",S8,ne(p.source),1)]),E("div",E8,[E("div",A8,ne(p.cdn_type||"cloud"),1),E("div",D8,ne(p.cdn_name||"-"),1)]),E("div",T8,[d[9]||(d[9]=E("div",{class:"font-medium"},"tech",-1)),E("div",O8,ne(p.tech&&p.tech.length>0?p.tech:"-"),1)])])]),E("div",M8,[E("div",R8,ne(f(yo)(new Date(p.updated_at),{addSuffix:!0})),1)])]))),128))])])):(S(),K("div",P8," No domain selected. "))]))}}),Ep=I({__name:"Dialog",props:{open:{type:Boolean},defaultOpen:{type:Boolean},modal:{type:Boolean}},emits:["update:open"],setup(e,{emit:t}){const o=yt(e,t);return(s,a)=>(S(),L(f(fM),St(Et(f(o))),{default:_(()=>[V(s.$slots,"default")]),_:3},16))}}),Ap=I({__name:"DialogTrigger",props:{asChild:{type:Boolean},as:{}},setup(e){const t=e;return(n,r)=>(S(),L(f(pM),St(Et(t)),{default:_(()=>[V(n.$slots,"default")]),_:3},16))}}),Dp=I({__name:"DialogHeader",props:{class:{}},setup(e){const t=e;return(n,r)=>(S(),K("div",{class:Ee(f(xe)("flex flex-col gap-y-1.5 text-center sm:text-left",t.class))},[V(n.$slots,"default")],2))}}),Tp=I({__name:"DialogTitle",props:{asChild:{type:Boolean},as:{},class:{}},setup(e){const t=e,n=$(()=>{const{class:o,...s}=t;return s}),r=Xr(n);return(o,s)=>(S(),L(f(PM),le(f(r),{class:f(xe)("text-lg font-semibold leading-none tracking-tight",t.class)}),{default:_(()=>[V(o.$slots,"default")]),_:3},16,["class"]))}}),sl=I({__name:"DialogDescription",props:{asChild:{type:Boolean},as:{},class:{}},setup(e){const t=e,n=$(()=>{const{class:o,...s}=t;return s}),r=Xr(n);return(o,s)=>(S(),L(f($M),le(f(r),{class:f(xe)("text-sm text-muted-foreground",t.class)}),{default:_(()=>[V(o.$slots,"default")]),_:3},16,["class"]))}});function F8(e,t){return S(),K("svg",{width:"15",height:"15",viewBox:"0 0 15 15",fill:"none",xmlns:"http://www.w3.org/2000/svg"},[E("path",{"fill-rule":"evenodd","clip-rule":"evenodd",d:"M4.93179 5.43179C4.75605 5.60753 4.75605 5.89245 4.93179 6.06819C5.10753 6.24392 5.39245 6.24392 5.56819 6.06819L7.49999 4.13638L9.43179 6.06819C9.60753 6.24392 9.89245 6.24392 10.0682 6.06819C10.2439 5.89245 10.2439 5.60753 10.0682 5.43179L7.81819 3.18179C7.73379 3.0974 7.61933 3.04999 7.49999 3.04999C7.38064 3.04999 7.26618 3.0974 7.18179 3.18179L4.93179 5.43179ZM10.0682 9.56819C10.2439 9.39245 10.2439 9.10753 10.0682 8.93179C9.89245 8.75606 9.60753 8.75606 9.43179 8.93179L7.49999 10.8636L5.56819 8.93179C5.39245 8.75606 5.10753 8.75606 4.93179 8.93179C4.75605 9.10753 4.75605 9.39245 4.93179 9.56819L7.18179 11.8182C7.35753 11.9939 7.64245 11.9939 7.81819 11.8182L10.0682 9.56819Z",fill:"currentColor"})])}function l_(e,t){return S(),K("svg",{width:"15",height:"15",viewBox:"0 0 15 15",fill:"none",xmlns:"http://www.w3.org/2000/svg"},[E("path",{"fill-rule":"evenodd","clip-rule":"evenodd",d:"M11.4669 3.72684C11.7558 3.91574 11.8369 4.30308 11.648 4.59198L7.39799 11.092C7.29783 11.2452 7.13556 11.3467 6.95402 11.3699C6.77247 11.3931 6.58989 11.3355 6.45446 11.2124L3.70446 8.71241C3.44905 8.48022 3.43023 8.08494 3.66242 7.82953C3.89461 7.57412 4.28989 7.55529 4.5453 7.78749L6.75292 9.79441L10.6018 3.90792C10.7907 3.61902 11.178 3.53795 11.4669 3.72684Z",fill:"currentColor"})])}function c_(e,t){return S(),K("svg",{width:"15",height:"15",viewBox:"0 0 15 15",fill:"none",xmlns:"http://www.w3.org/2000/svg"},[E("path",{"fill-rule":"evenodd","clip-rule":"evenodd",d:"M11.7816 4.03157C12.0062 3.80702 12.0062 3.44295 11.7816 3.2184C11.5571 2.99385 11.193 2.99385 10.9685 3.2184L7.50005 6.68682L4.03164 3.2184C3.80708 2.99385 3.44301 2.99385 3.21846 3.2184C2.99391 3.44295 2.99391 3.80702 3.21846 4.03157L6.68688 7.49999L3.21846 10.9684C2.99391 11.193 2.99391 11.557 3.21846 11.7816C3.44301 12.0061 3.80708 12.0061 4.03164 11.7816L7.50005 8.31316L10.9685 11.7816C11.193 12.0061 11.5571 12.0061 11.7816 11.7816C12.0062 11.557 12.0062 11.193 11.7816 10.9684L8.31322 7.49999L11.7816 4.03157Z",fill:"currentColor"})])}function I8(e,t){return S(),K("svg",{width:"15",height:"15",viewBox:"0 0 15 15",fill:"none",xmlns:"http://www.w3.org/2000/svg"},[E("path",{"fill-rule":"evenodd","clip-rule":"evenodd",d:"M5.5 4.625C6.12132 4.625 6.625 4.12132 6.625 3.5C6.625 2.87868 6.12132 2.375 5.5 2.375C4.87868 2.375 4.375 2.87868 4.375 3.5C4.375 4.12132 4.87868 4.625 5.5 4.625ZM9.5 4.625C10.1213 4.625 10.625 4.12132 10.625 3.5C10.625 2.87868 10.1213 2.375 9.5 2.375C8.87868 2.375 8.375 2.87868 8.375 3.5C8.375 4.12132 8.87868 4.625 9.5 4.625ZM10.625 7.5C10.625 8.12132 10.1213 8.625 9.5 8.625C8.87868 8.625 8.375 8.12132 8.375 7.5C8.375 6.87868 8.87868 6.375 9.5 6.375C10.1213 6.375 10.625 6.87868 10.625 7.5ZM5.5 8.625C6.12132 8.625 6.625 8.12132 6.625 7.5C6.625 6.87868 6.12132 6.375 5.5 6.375C4.87868 6.375 4.375 6.87868 4.375 7.5C4.375 8.12132 4.87868 8.625 5.5 8.625ZM10.625 11.5C10.625 12.1213 10.1213 12.625 9.5 12.625C8.87868 12.625 8.375 12.1213 8.375 11.5C8.375 10.8787 8.87868 10.375 9.5 10.375C10.1213 10.375 10.625 10.8787 10.625 11.5ZM5.5 12.625C6.12132 12.625 6.625 12.1213 6.625 11.5C6.625 10.8787 6.12132 10.375 5.5 10.375C4.87868 10.375 4.375 10.8787 4.375 11.5C4.375 12.1213 4.87868 12.625 5.5 12.625Z",fill:"currentColor"})])}function L8(e,t){return S(),K("svg",{width:"15",height:"15",viewBox:"0 0 15 15",fill:"none",xmlns:"http://www.w3.org/2000/svg"},[E("path",{"fill-rule":"evenodd","clip-rule":"evenodd",d:"M10 6.5C10 8.433 8.433 10 6.5 10C4.567 10 3 8.433 3 6.5C3 4.567 4.567 3 6.5 3C8.433 3 10 4.567 10 6.5ZM9.30884 10.0159C8.53901 10.6318 7.56251 11 6.5 11C4.01472 11 2 8.98528 2 6.5C2 4.01472 4.01472 2 6.5 2C8.98528 2 11 4.01472 11 6.5C11 7.56251 10.6318 8.53901 10.0159 9.30884L12.8536 12.1464C13.0488 12.3417 13.0488 12.6583 12.8536 12.8536C12.6583 13.0488 12.3417 13.0488 12.1464 12.8536L9.30884 10.0159Z",fill:"currentColor"})])}function N8(e,t){return S(),K("svg",{width:"15",height:"15",viewBox:"0 0 15 15",fill:"none",xmlns:"http://www.w3.org/2000/svg"},[E("path",{"fill-rule":"evenodd","clip-rule":"evenodd",d:"M1.20308 1.04312C1.00481 0.954998 0.772341 1.0048 0.627577 1.16641C0.482813 1.32802 0.458794 1.56455 0.568117 1.75196L3.92115 7.50002L0.568117 13.2481C0.458794 13.4355 0.482813 13.672 0.627577 13.8336C0.772341 13.9952 1.00481 14.045 1.20308 13.9569L14.7031 7.95693C14.8836 7.87668 15 7.69762 15 7.50002C15 7.30243 14.8836 7.12337 14.7031 7.04312L1.20308 1.04312ZM4.84553 7.10002L2.21234 2.586L13.2689 7.50002L2.21234 12.414L4.84552 7.90002H9C9.22092 7.90002 9.4 7.72094 9.4 7.50002C9.4 7.27911 9.22092 7.10002 9 7.10002H4.84553Z",fill:"currentColor"})])}const Op=I({__name:"DialogContent",props:{forceMount:{type:Boolean},trapFocus:{type:Boolean},disableOutsidePointerEvents:{type:Boolean},asChild:{type:Boolean},as:{},class:{}},emits:["escapeKeyDown","pointerDownOutside","focusOutside","interactOutside","openAutoFocus","closeAutoFocus"],setup(e,{emit:t}){const n=e,r=t,o=$(()=>{const{class:a,...i}=n;return i}),s=yt(o,r);return(a,i)=>(S(),L(f(hM),null,{default:_(()=>[x(f(MM),{class:"fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0"}),x(f(TM),le(f(s),{class:f(xe)("fixed left-1/2 top-1/2 z-50 grid w-full max-w-lg -translate-x-1/2 -translate-y-1/2 gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg",n.class)}),{default:_(()=>[V(a.$slots,"default"),x(f(RM),{class:"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground"},{default:_(()=>[x(f(c_),{class:"w-4 h-4"}),i[0]||(i[0]=E("span",{class:"sr-only"},"Close",-1))]),_:1})]),_:3},16,["class"])]),_:3}))}}),Mp=I({__name:"DialogFooter",props:{class:{}},setup(e){const t=e;return(n,r)=>(S(),K("div",{class:Ee(f(xe)("flex flex-col-reverse sm:flex-row sm:justify-end sm:gap-x-2",t.class))},[V(n.$slots,"default")],2))}}),u_=I({__name:"Checkbox",props:{defaultChecked:{type:Boolean},checked:{type:[Boolean,String]},disabled:{type:Boolean},required:{type:Boolean},name:{},value:{},id:{},asChild:{type:Boolean},as:{},class:{}},emits:["update:checked"],setup(e,{emit:t}){const n=e,r=t,o=$(()=>{const{class:a,...i}=n;return i}),s=yt(o,r);return(a,i)=>(S(),L(f(VM),le(f(s),{class:f(xe)("peer h-4 w-4 shrink-0 rounded-sm border border-primary shadow focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground",n.class)}),{default:_(()=>[x(f(jM),{class:"flex h-full w-full items-center justify-center text-current"},{default:_(()=>[V(a.$slots,"default",{},()=>[x(f(l_),{class:"h-4 w-4"})])]),_:3})]),_:3},16,["class"]))}});function ng(e){return typeof e=="function"?e():f(e)}typeof WorkerGlobalScope<"u"&&globalThis instanceof WorkerGlobalScope;const z8=e=>typeof e<"u",rg=()=>{};function B8(e,t){function n(...r){return new Promise((o,s)=>{Promise.resolve(e(()=>t.apply(this,r),{fn:t,thisArg:this,args:r})).then(o).catch(s)})}return n}function q8(e,t={}){let n,r,o=rg;const s=i=>{clearTimeout(i),o(),o=rg};return i=>{const l=ng(e),u=ng(t.maxWait);return n&&s(n),l<=0||u!==void 0&&u<=0?(r&&(s(r),r=null),Promise.resolve(i())):new Promise((c,d)=>{o=t.rejectOnCancel?d:c,u&&!r&&(r=setTimeout(()=>{n&&s(n),r=null,c(i())},u)),n=setTimeout(()=>{r&&s(r),r=null,c(i())},l)})}}function V8(e,t=200,n={}){return B8(q8(t,n),e)}function bs(e,t=200,n={}){const r=F(e.value),o=V8(()=>{r.value=e.value},t,n);return Oe(e,()=>o()),r}function j8(e){return JSON.parse(JSON.stringify(e))}function H8(e,t,n,r={}){var o,s,a;const{clone:i=!1,passive:l=!1,eventName:u,deep:c=!1,defaultValue:d,shouldEmit:p}=r,h=dn(),m=n||h?.emit||((o=h?.$emit)==null?void 0:o.bind(h))||((a=(s=h?.proxy)==null?void 0:s.$emit)==null?void 0:a.bind(h?.proxy));let g=u;g=g||`update:${t.toString()}`;const v=b=>i?typeof i=="function"?i(b):j8(b):b,y=()=>z8(e[t])?v(e[t]):d,k=b=>{p?p(b)&&m(g,b):m(g,b)};if(l){const b=y(),w=F(b);let C=!1;return Oe(()=>e[t],A=>{C||(C=!0,w.value=v(A),it(()=>C=!1))}),Oe(w,A=>{!C&&(A!==e[t]||c)&&k(A)},{deep:c}),w}else return $({get(){return y()},set(b){k(b)}})}const An=I({__name:"Input",props:{defaultValue:{},modelValue:{},class:{}},emits:["update:modelValue"],setup(e,{emit:t}){const n=e,o=H8(n,"modelValue",t,{passive:!0,defaultValue:n.defaultValue});return(s,a)=>Ho((S(),K("input",{"onUpdate:modelValue":a[0]||(a[0]=i=>lt(o)?o.value=i:null),class:Ee(f(xe)("flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-sm transition-colors file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50",n.class))},null,2)),[[xi,f(o)]])}}),Jr=I({__name:"ResizablePanelGroup",props:{id:{},autoSaveId:{},direction:{},keyboardResizeBy:{},storage:{},asChild:{type:Boolean},as:{},class:{}},emits:["layout"],setup(e,{emit:t}){const n=e,r=t,o=$(()=>{const{class:a,...i}=n;return i}),s=yt(o,r);return(a,i)=>(S(),L(f(mP),le(f(s),{class:f(xe)("flex h-full w-full data-[panel-group-direction=vertical]:flex-col",n.class)}),{default:_(()=>[V(a.$slots,"default")]),_:3},16,["class"]))}}),U8={key:0,class:"z-10 flex h-4 w-3 items-center justify-center rounded-sm border bg-border"},Qr=I({__name:"ResizableHandle",props:{id:{},hitAreaMargins:{},tabindex:{},disabled:{type:Boolean},asChild:{type:Boolean},as:{},class:{},withHandle:{type:Boolean}},emits:["dragging"],setup(e,{emit:t}){const n=e,r=t,o=$(()=>{const{class:a,...i}=n;return i}),s=yt(o,r);return(a,i)=>(S(),L(f(vP),le(f(s),{class:f(xe)("relative flex w-px items-center justify-center bg-border after:absolute after:inset-y-0 after:left-1/2 after:w-1 after:-translate-x-1/2 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-1 [&[data-orientation=vertical]]:h-px [&[data-orientation=vertical]]:w-full [&[data-orientation=vertical]]:after:left-0 [&[data-orientation=vertical]]:after:h-1 [&[data-orientation=vertical]]:after:w-full [&[data-orientation=vertical]]:after:-translate-y-1/2 [&[data-orientation=vertical]]:after:translate-x-0 [&[data-orientation=vertical]>div]:rotate-90",n.class)}),{default:_(()=>[n.withHandle?(S(),K("div",U8,[x(f(I8),{class:"h-2.5 w-2.5"})])):_e("",!0)]),_:1},16,["class"]))}}),W8=I({__name:"Alert",props:{class:{},variant:{}},setup(e){const t=e;return(n,r)=>(S(),K("div",{class:Ee(f(xe)(f(K8)({variant:n.variant}),t.class)),role:"alert"},[V(n.$slots,"default")],2))}}),Y8=I({__name:"AlertDescription",props:{class:{}},setup(e){const t=e;return(n,r)=>(S(),K("div",{class:Ee(f(xe)("text-sm [&_p]:leading-relaxed",t.class))},[V(n.$slots,"default")],2))}}),G8=I({__name:"AlertTitle",props:{class:{}},setup(e){const t=e;return(n,r)=>(S(),K("h5",{class:Ee(f(xe)("mb-1 font-medium leading-none tracking-tight",t.class))},[V(n.$slots,"default")],2))}}),K8=Na("relative w-full rounded-lg border px-4 py-3 text-sm [&>svg+div]:translate-y-[-3px] [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4 [&>svg]:text-foreground [&>svg~*]:pl-7",{variants:{variant:{default:"bg-background text-foreground",destructive:"border-destructive/50 text-destructive dark:border-destructive [&>svg]:text-destructive"}},defaultVariants:{variant:"default"}}),Z8={key:0,class:"px-4 pt-4"},X8={class:"flex items-center gap-2"},_s=I({__name:"HelperHint",props:{hintKey:{}},setup(e){const t=F(!0),r=`reaper.hint.${e.hintKey}`,o=()=>{t.value=!1,localStorage.setItem(r,"false")};return $e(()=>{localStorage.getItem(r)&&(t.value=!1)}),(s,a)=>t.value?(S(),K("div",Z8,[x(f(W8),null,{default:_(()=>[E("div",X8,[x(f(m3),{class:"size-4 text-primary"}),x(f(G8),{class:"mb-0"},{default:_(()=>a[0]||(a[0]=[oe("Heads up!")])),_:1}),E("span",{class:"ml-auto cursor-pointer",onClick:o}," × ")]),x(f(Y8),{class:"mt-1 text-xs font-medium text-foreground/80"},{default:_(()=>[V(s.$slots,"default")]),_:3})]),_:3})])):_e("",!0)}}),J8={class:"flex items-center justify-between px-4 py-2.5"},Q8={class:"py-0"},e6={class:"h-4 text-xs font-medium text-destructive"},t6={class:"items-top flex gap-x-2"},n6={class:"bg-background/95 p-4 backdrop-blur supports-[backdrop-filter]:bg-background/60"},r6={class:"relative flex items-center gap-2"},o6={clas:"px-4"},og=I({__name:"ScanMain",setup(e){const t=F([20,30,70]),n=Ra(),r=$(()=>n.errors),o=F(""),s=F(""),a=F(!0),i=F(!1),l=F(!1),u=()=>{a.value=!a.value},c=()=>{s.value&&(l.value=!0,n.createDomain({name:s.value,auto_scan:a.value}).then(()=>{i.value=!1,s.value="",a.value=!1}).finally(()=>{l.value=!1}))},d={name:"example.com",status:"pending",auto_scan:!0,host_count:34,last_scanned_at:new Date};return $e(()=>{n.errors=""}),(p,h)=>(S(),L(f(cn),{"delay-duration":0},{default:_(()=>[x(f(Jr),{id:"resize-panel-group-1",direction:"horizontal",class:"h-full items-stretch"},{default:_(()=>[x(f(Ge),{orientation:"vertical"}),x(f(Mt),{id:"resize-panel-2","default-size":t.value[1],"min-size":20},{default:_(()=>[E("div",J8,[h[7]||(h[7]=E("h1",{class:"text-xl font-bold"}," Scan ",-1)),x(f(Ep),{open:i.value,"onUpdate:open":h[1]||(h[1]=m=>i.value=m)},{default:_(()=>[x(f(Ap),{"as-child":""},{default:_(()=>[x(f(ut),{variant:"outline",size:"sm"},{default:_(()=>[x(f(ib),{class:"mr-2 w-4"}),h[3]||(h[3]=oe("Add Domain "))]),_:1})]),_:1}),x(f(Op),{class:"sm:max-w-[425px]"},{default:_(()=>[x(f(Dp),null,{default:_(()=>[x(f(Tp),null,{default:_(()=>h[4]||(h[4]=[oe("New domain")])),_:1}),x(f(sl),null,{default:_(()=>h[5]||(h[5]=[oe(" Add a new domain. ")])),_:1})]),_:1}),E("div",Q8,[x(f(An),{id:"name",modelValue:s.value,"onUpdate:modelValue":h[0]||(h[0]=m=>s.value=m),placeholder:"example.com",onKeyup:zr(Ct(c,["prevent"]),["enter"]),class:"w-full"},null,8,["modelValue","onKeyup"]),E("div",e6,ne(r.value),1)]),E("div",t6,[x(f(u_),{id:"auto-scan",name:"auto_scan",checked:a.value,"onUpdate:checked":u},null,8,["checked"]),h[6]||(h[6]=E("div",{class:"grid gap-1.5 leading-none"},[E("label",{for:"auto-scan",class:"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70"}," Auto-scan "),E("p",{class:"text-sm text-muted-foreground"}," Immediately scan this domain for hosts and subdomains. ")],-1))]),x(f(Mp),null,{default:_(()=>[x(f(ut),{type:"submit",onClick:Ct(c,["prevent"]),disabled:l.value||!s.value},{default:_(()=>[oe(ne(l.value?"Adding...":`Add ${a.value?"and scan":""}`),1)]),_:1},8,["disabled"])]),_:1})]),_:1})]),_:1},8,["open"])]),x(f(Ge)),x(_s,{"hint-key":"scan.main"},{default:_(()=>h[8]||(h[8]=[oe(" Add a domain to scan for live hosts and subdomains. ")])),_:1}),E("div",n6,[E("div",r6,[x(f(ko),{class:"absolute left-2 top-2.5 size-4 text-muted-foreground"}),x(f(An),{modelValue:o.value,"onUpdate:modelValue":h[2]||(h[2]=m=>o.value=m),placeholder:"filter...",class:"pl-8"},null,8,["modelValue"])])]),E("div",o6,[x(J4,{filter:o.value},null,8,["filter"])])]),_:1},8,["default-size"]),x(f(Qr),{id:"resize-handle-2","with-handle":""}),x(f(Mt),{id:"resize-panel-3","default-size":t.value[2]},{default:_(()=>[x($8,{domain:d})]),_:1},8,["default-size"])]),_:1})]),_:1}))}}),s6=I({__name:"ScrollBar",props:{orientation:{default:"vertical"},forceMount:{type:Boolean},asChild:{type:Boolean},as:{},class:{}},setup(e){const t=e,n=$(()=>{const{class:r,...o}=t;return o});return(r,o)=>(S(),L(f(qR),le(n.value,{class:f(xe)("flex touch-none select-none transition-colors",r.orientation==="vertical"&&"h-full w-2.5 border-l border-l-transparent p-px",r.orientation==="horizontal"&&"h-2.5 flex-col border-t border-t-transparent p-px",t.class)}),{default:_(()=>[x(f(VR),{class:"relative flex-1 rounded-full bg-border"})]),_:1},16,["class"]))}}),Ua=I({__name:"ScrollArea",props:{type:{},dir:{},scrollHideDelay:{},asChild:{type:Boolean},as:{},class:{}},setup(e){const t=e,n=$(()=>{const{class:r,...o}=t;return o});return(r,o)=>(S(),L(f(MR),le(n.value,{class:f(xe)("relative overflow-hidden",t.class)}),{default:_(()=>[x(f(RR),{class:"h-full w-full rounded-[inherit]"},{default:_(()=>[V(r.$slots,"default")]),_:3}),x(s6),x(f(HR))]),_:3},16,["class"]))}}),xs=I({__name:"Badge",props:{variant:{},class:{}},setup(e){const t=e;return(n,r)=>(S(),K("div",{class:Ee(f(xe)(f(a6)({variant:n.variant}),t.class))},[V(n.$slots,"default")],2))}}),a6=Na("inline-flex items-center rounded-md border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2",{variants:{variant:{default:"border-transparent bg-primary text-primary-foreground shadow hover:bg-primary/80",secondary:"border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80",destructive:"border-transparent bg-destructive text-destructive-foreground shadow hover:bg-destructive/80",outline:"text-foreground"}},defaultVariants:{variant:"default"}}),i6={class:"text-2xs font-semibold"},ls=I({__name:"RequestMethod",props:{code:{}},setup(e){function t(n){return n<0?"bg-gray-50 border-gray-500/10 text-gray-600 dark:bg-gray-400/10 dark:border-gray-400/20 dark:text-gray-400":n>=0&&n<300?"bg-green-50 border-green-600/20 text-green-700 dark:bg-green-500/10 dark:border-green-500/20 dark:text-green-400":n>=300&&n<400?"bg-yellow-50 border-yellow-600/20 text-yellow-700 dark:bg-yellow-400/10 dark:border-yellow-400/20 dark:text-yellow-500":"bg-red-50 border-red-600/20 text-red-700 dark:bg-red-400/10 dark:border-red-400/20 dark:text-red-400"}return(n,r)=>(S(),L(f(xs),{variant:"outline",class:Ee(["rounded-sm px-1 py-0",t(n.code)])},{default:_(()=>[E("div",i6,[V(n.$slots,"default")])]),_:3},8,["class"]))}}),l6={class:"flex flex-1 flex-col gap-2 p-4 pt-0"},c6={class:"space-y-0.5 text-sm"},u6={class:"group flex items-center justify-between rounded-md bg-secondary px-2 py-1"},d6=["onClick"],f6={key:0,class:"text-xs font-semibold text-muted-foreground"},p6={key:0,class:"pl-2 pt-1 text-xs"},h6=["onClick"],m6={class:"flex items-center"},g6={width:"18",height:"26",viewBox:"0 0 18 44",fill:"none",stroke:"currentColor",xmlns:"http://www.w3.org/2000/svg",class:"-top-2 left-4 flex-shrink-0 text-foreground"},v6={key:0,d:"M1 -4 V48","stroke-width":"2"},y6={class:"my-1 flex w-full min-w-0 cursor-pointer rounded-sm pr-1 hover:bg-secondary"},b6={class:"w-10 flex-shrink-0"},_6={class:"flex w-full min-w-0 justify-between"},x6={class:"ml-1 truncate text-foreground/80"},w6=I({__name:"ExploreList",props:Sa({hosts:{}},{searchValue:{},searchValueModifiers:{},selectedEndpoint:{required:!1},selectedEndpointModifiers:{}}),emits:["update:searchValue","update:selectedEndpoint"],setup(e){const t=es(e,"searchValue"),n=es(e,"selectedEndpoint");return(r,o)=>(S(),L(f(Ua),{class:"flex h-screen"},{default:_(()=>[E("div",l6,[E("div",null,[E("ul",c6,[(S(!0),K(Fe,null,It(r.hosts,(s,a)=>(S(),K("li",{key:s.name+a},[E("div",u6,[E("span",{class:"flex cursor-pointer items-center gap-2 text-xs font-semibold",onClick:i=>t.value=s.name},[oe(ne(s.name)+" ",1),x(f(S3),{class:"hidden size-4 group-hover:block"})],8,d6),s.endpoints?.length>0?(S(),K("span",f6,ne(s.endpoints.length),1)):_e("",!0)]),s.endpoints?(S(),K("ul",p6,[(S(!0),K(Fe,null,It(s.endpoints,(i,l)=>(S(),K("li",{onClick:u=>n.value=i.id,key:i.path+l},[E("div",m6,[(S(),K("svg",g6,[o[0]||(o[0]=E("path",{d:"M1 -4 V18","stroke-width":"2"},null,-1)),l!=s.endpoints.length-1?(S(),K("path",v6)):_e("",!0),o[1]||(o[1]=E("path",{d:"M1 14V17.5C1 20.2614 3.23858 22.5 6 22.5H15","stroke-width":"2"},null,-1))])),E("div",y6,[E("div",b6,[x(ls,{code:i.status},{default:_(()=>[oe(ne(i.method),1)]),_:2},1032,["code"])]),E("div",_6,[E("div",x6,ne(i.path),1),x(ls,{code:i.status},{default:_(()=>[oe(ne(i.status),1)]),_:2},1032,["code"])])])])],8,h6))),128))])):_e("",!0)]))),128))])])])]),_:1}))}}),k6={class:"flex h-full flex-col"},C6={class:"flex items-center p-2"},S6={class:"flex items-center gap-2"},E6={class:"p-4 text-center text-xs"},d_=I({__name:"ExploreDisplay",props:{endpoint:{}},setup(e){return(t,n)=>(S(),K("div",k6,[E("div",C6,[E("div",S6,[x(f(Qt),null,{default:_(()=>[x(f(tn),{"as-child":""},{default:_(()=>[x(f(ut),{variant:"ghost",size:"icon"},{default:_(()=>[x(f(ms),{class:"size-4"}),n[0]||(n[0]=E("span",{class:"sr-only"},"Delete endpoint",-1))]),_:1})]),_:1}),x(f(en),null,{default:_(()=>n[1]||(n[1]=[oe("Delete endpoint")])),_:1})]),_:1})])]),x(f(Ge)),n[4]||(n[4]=E("div",{class:"p-8 text-center text-sm font-medium text-muted-foreground"}," To explore hosts and endpoints, start browsing using the Reaper proxy. ",-1)),E("div",E6,[n[3]||(n[3]=oe(" The default proxy URL is ")),x(f(xs),{as:"child",variant:"outline",class:"text-muted-foreground"},{default:_(()=>n[2]||(n[2]=[E("a",{href:"http://localhost:8080"},"http://localhost:8080",-1)])),_:1})]),E("div",null,ne(t.endpoint),1)]))}}),f_=I({__name:"Switch",props:{defaultChecked:{type:Boolean},checked:{type:Boolean},disabled:{type:Boolean},required:{type:Boolean},name:{},id:{},value:{},asChild:{type:Boolean},as:{},class:{}},emits:["update:checked"],setup(e,{emit:t}){const n=e,r=t,o=$(()=>{const{class:a,...i}=n;return i}),s=yt(o,r);return(a,i)=>(S(),L(f(xP),le(f(s),{class:f(xe)("peer inline-flex h-5 w-9 shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent shadow-sm transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=unchecked]:bg-input",n.class)}),{default:_(()=>[x(f(wP),{class:Ee(f(xe)("pointer-events-none block h-4 w-4 rounded-full bg-background shadow-lg ring-0 transition-transform data-[state=checked]:translate-x-4 data-[state=unchecked]:translate-x-0"))},null,8,["class"])]),_:1},16,["class"]))}}),p_=I({__name:"Label",props:{for:{},asChild:{type:Boolean},as:{},class:{}},setup(e){const t=e,n=$(()=>{const{class:r,...o}=t;return o});return(r,o)=>(S(),L(f(wR),le(n.value,{class:f(xe)("text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70",t.class)}),{default:_(()=>[V(r.$slots,"default")]),_:3},16,["class"]))}}),Yc=Yn(),Rp=Wn("explore",()=>{const e=F([]),t=F({enabled:!1}),n=l=>{console.info("adding host",l.name),e.value.push(l)},r=(l,u)=>{const c=e.value.find(d=>d.name===l);c?c.endpoints?(console.info("adding endpoint to host",c.name,u.path),c.endpoints.find(d=>d.path===u.path&&d.method===u.method)||c.endpoints.push(u)):(console.info("adding first endpoint to host",c.name,u.path),c.endpoints=[u]):(console.warn(`Host ${l} not found. Creating new host.`),n({name:l,endpoints:[u]}))},o=$(()=>e.value.reduce((l,u)=>l+u.endpoints.length,0));return{hosts:e,addHost:n,addEndpoint:r,numEndpoints:o,proxy:t,proxyStart:()=>{Yc.post("/api/proxy/start").then(()=>{t.value.enabled=!0}).catch(()=>{t.value.enabled=!1})},proxyStop:()=>{Yc.post("/api/proxy/stop").then(()=>{t.value.enabled=!1}).catch(()=>{t.value.enabled=!1})},proxyStatus:()=>{Yc.get("/api/proxy/status").then(()=>{t.value.enabled=!0}).catch(()=>{t.value.enabled=!1})}}}),A6={class:"flex items-center justify-between px-4 py-3"},D6={class:"flex items-center space-x-2"},T6={class:"bg-background/95 p-4 backdrop-blur supports-[backdrop-filter]:bg-background/60"},O6={class:"relative"},M6=I({__name:"ExploreMain",setup(e){const t=F(""),n=bs(t,250),r=F([20,30,70]),o=Rp(),s=$(()=>o.hosts),a=$(()=>o.proxy.enabled),i=()=>{o.proxy.enabled?o.proxyStop():o.proxyStart()},l=$(()=>{let u=[];return n.value?.trim()?u=s.value.filter(d=>d.name.includes(n.value)||d.endpoints.some(p=>p.path.includes(n.value))):u=s.value,u});return $e(()=>{o.proxyStatus()}),(u,c)=>(S(),L(f(cn),{"delay-duration":0},{default:_(()=>[x(f(Jr),{id:"resize-panel-group-1",direction:"horizontal",class:"h-full items-stretch"},{default:_(()=>[x(f(Ge),{orientation:"vertical"}),x(f(Mt),{id:"resize-panel-2","default-size":r.value[1],"min-size":20},{default:_(()=>[E("div",A6,[c[2]||(c[2]=E("h1",{class:"text-xl font-bold"}," Explore ",-1)),E("div",D6,[x(f(p_),{for:"proxy-status",class:"text-xs text-muted-foreground"},{default:_(()=>[oe("Proxy "+ne(a.value?"on":"off"),1)]),_:1}),x(f(f_),{id:"proxy-status",checked:a.value,onClick:Ct(i,["prevent"])},null,8,["checked"])])]),x(f(Ge)),x(_s,{"hint-key":"explore.main"},{default:_(()=>c[3]||(c[3]=[oe(" Enable the proxy to explore targets. ")])),_:1}),E("div",T6,[E("form",null,[E("div",O6,[x(f(ko),{class:"absolute left-2 top-2.5 size-4 text-muted-foreground"}),x(f(An),{modelValue:t.value,"onUpdate:modelValue":c[0]||(c[0]=d=>t.value=d),placeholder:"filter...",class:"pl-8"},null,8,["modelValue"])])])]),x(w6,{hosts:l.value,searchValue:t.value,"onUpdate:searchValue":c[1]||(c[1]=d=>t.value=d)},null,8,["hosts","searchValue"])]),_:1},8,["default-size"]),x(f(Qr),{id:"resize-handle-2","with-handle":""}),x(f(Mt),{id:"resize-panel-3","default-size":r.value[2]},{default:_(()=>[x(d_,{endpoint:void 0})]),_:1},8,["default-size"])]),_:1})]),_:1}))}}),R6={class:"flex flex-1 flex-col gap-2 p-4 pt-0"},P6=["onClick"],$6={class:"flex w-full flex-col gap-1"},F6={class:"flex items-center"},I6={class:"flex min-w-0 flex-1 items-center gap-2"},L6={class:"truncate text-xs font-semibold"},N6={class:"flex items-center justify-between gap-2"},z6={class:"text-xs font-medium text-muted-foreground"},sg=I({__name:"ReplayList",props:Sa({items:{}},{selectedRequest:{required:!1},selectedRequestModifiers:{}}),emits:["update:selectedRequest"],setup(e){const t=es(e,"selectedRequest"),n=o=>new URL(o).pathname,r=o=>new URL(o).host;return(o,s)=>(S(),L(f(Ua),{class:"flex h-screen"},{default:_(()=>[E("div",R6,[x(Sl,{name:"list",appear:""},{default:_(()=>[(S(!0),K(Fe,null,It(o.items,a=>(S(),K("button",{class:Ee(["flex flex-col items-start gap-2 rounded-md border bg-background/95 p-3 text-left text-sm transition-all hover:bg-accent/50",t.value===a.id&&"bg-muted"]),key:a.id,onClick:i=>t.value=a.id},[E("div",$6,[E("div",F6,[E("div",I6,[x(ls,{code:a.response.status_code},{default:_(()=>[oe(ne(a.method),1)]),_:2},1032,["code"]),E("div",L6,ne(n(a.url)),1)])]),E("div",N6,[E("div",z6,ne(r(a.url)),1),E("div",{class:Ee(["ml-auto text-xs",t.value===a.id?"text-foreground":"text-muted-foreground"])},ne(f(yo)(new Date(a.created_at),{addSuffix:!0})),3)])])],10,P6))),128))]),_:1})])]),_:1}))}}),B6=Yn(),q6=Wn("replay",()=>{const e=F(void 0);return{replay:e,replayRequest:r=>{const o={request:r.request,method:r.method,url:r.request.url,headers:r.headers,body:r.body};return new Promise((s,a)=>{B6.post("/api/replay",o).then(i=>{e.value=i.data,s({headers:i.data.headers,body:i.data.body})}).catch(i=>{a(i)})})},decodePayload:r=>{try{return atob(r)}catch(o){return console.error("[replay.ts] decodePayload",o),r}}}}),V6={class:"flex h-full flex-col"},j6={class:"flex items-center p-2"},H6={class:"flex items-center gap-2"},U6={class:"ml-auto flex items-center gap-2"},W6={class:"sr-only"},Y6={key:0,class:"flex flex-1 flex-col"},G6={class:"flex items-start p-4"},K6={class:"mr-4 flex items-start gap-4 text-sm"},Z6={class:"flex flex-col gap-2"},X6={class:"text-center text-xs font-medium"},J6={class:"grid gap-1"},Q6={class:"mr-4 truncate font-semibold text-foreground/80"},e9={class:"space-y-1 text-xs"},t9={class:"font-medium text-muted-foreground"},n9={key:0,class:"ml-auto w-36 text-xs text-muted-foreground"},r9={class:"h-screen space-y-2 overflow-y-auto whitespace-pre-wrap bg-muted/50 p-2 text-sm text-foreground/80"},o9={class:"rounded-md bg-background shadow-sm"},s9={class:"flex gap-2 rounded-t-md bg-muted p-2 text-xs font-semibold"},a9={class:"rounded-md bg-background shadow-sm"},i9={class:"flex gap-2 rounded-t-md bg-muted p-2 text-xs font-semibold"},l9={class:"rounded-md bg-muted shadow-sm"},c9={class:"flex items-center justify-between rounded-t-md p-2 text-xs font-semibold"},u9={class:"flex items-center"},d9={key:1,class:"p-8 text-center text-sm text-muted-foreground"},f9=I({__name:"ReplayDisplay",props:{request:{}},setup(e){const t=e,n=q6(),r=F(!1),o=F(""),s=F(""),a=F(""),i=F(""),l=F(""),u=$(()=>a.value!==o.value),c=$(()=>i.value!==s.value),d=$(()=>r.value?"Replaying...":u.value||c.value?"Replay modified":"Replay original"),p=()=>{const g={request:t.request,method:t.request?.method||"GET",url:t.request?.url||"",headers:a.value,body:i.value};r.value=!0,n.replayRequest(g).then(v=>{l.value=n.decodePayload(v.body),r.value=!1}).catch(v=>{console.error("[ReplayDisplay.vue] handleReplay",v),r.value=!1})},h=()=>{navigator.clipboard.writeText(m.value)},m=$(()=>{try{return JSON.stringify(JSON.parse(l.value),null,2)}catch{return l.value}});return Oe(()=>t.request,g=>{g&&(o.value=g.headers||"",s.value=g.body||"",a.value=o.value,i.value=s.value,g.response.body&&(l.value=g.response.body))},{immediate:!0}),(g,v)=>(S(),K("div",V6,[E("div",j6,[E("div",H6,[x(f(Qt),null,{default:_(()=>[x(f(tn),{"as-child":""},{default:_(()=>[x(f(ut),{variant:"ghost",size:"icon",disabled:!g.request},{default:_(()=>[x(f(ms),{class:"size-4"}),v[3]||(v[3]=E("span",{class:"sr-only"},"Move to trash",-1))]),_:1},8,["disabled"])]),_:1}),x(f(en),null,{default:_(()=>v[4]||(v[4]=[oe("Move to trash")])),_:1})]),_:1})]),E("div",U6,[x(f(Qt),null,{default:_(()=>[x(f(tn),{"as-child":""},{default:_(()=>[x(f(ut),{variant:"outline",onClick:p,disabled:!g.request},{default:_(()=>[oe(ne(d.value)+" ",1),x(f(C3),{class:"ml-2 size-4 scale-x-[-1] transform"}),E("span",W6,ne(d.value),1)]),_:1},8,["disabled"])]),_:1}),x(f(en),null,{default:_(()=>[oe(ne(d.value),1)]),_:1})]),_:1})])]),x(f(Ge)),g.request?(S(),K("div",Y6,[E("div",G6,[E("div",K6,[E("div",Z6,[x(ls,{code:g.request.response.status_code},{default:_(()=>[oe(ne(g.request.method),1)]),_:1},8,["code"]),E("div",X6,ne(g.request.response.status_code),1)]),E("div",J6,[E("div",Q6,ne(g.request.url),1),E("div",e9,[E("div",t9,ne(g.request.host),1),E("div",null,ne(g.request.response.content_type),1)])])]),g.request.created_at?(S(),K("div",n9,ne(f(yo)(new Date(g.request.created_at),{addSuffix:!0})),1)):_e("",!0)]),x(f(Ge)),E("div",r9,[E("div",o9,[E("div",s9,[v[5]||(v[5]=oe(" Request Headers ")),r.value?(S(),L(f(Nc),{key:0,class:"size-4 animate-spin"})):_e("",!0),u.value?(S(),L(f(Mm),{key:1,class:"size-4 text-primary"})):_e("",!0)]),Ho(E("textarea",{class:"min-h-48 w-full resize-y whitespace-pre rounded-sm bg-background p-2 font-mono text-xs focus:outline-none",name:"",spellcheck:"false","onUpdate:modelValue":v[0]||(v[0]=y=>a.value=y)},null,512),[[xi,a.value]])]),E("div",a9,[E("div",i9,[v[6]||(v[6]=oe(" Request Body ")),r.value?(S(),L(f(Nc),{key:0,class:"size-4 animate-spin"})):_e("",!0),c.value?(S(),L(f(Mm),{key:1,class:"size-4 text-primary"})):_e("",!0)]),Ho(E("textarea",{class:"min-h-64 w-full resize-y whitespace-pre rounded-sm bg-background p-2 font-mono text-xs focus:outline-none",name:"",spellcheck:"false","onUpdate:modelValue":v[1]||(v[1]=y=>i.value=y)},null,512),[[xi,i.value]])]),E("div",l9,[E("div",c9,[E("div",u9,[v[7]||(v[7]=oe(" Response ")),r.value?(S(),L(f(Nc),{key:0,class:"size-4 animate-spin"})):_e("",!0)]),E("div",{class:"ml-4 flex cursor-pointer items-center text-xs",onClick:h},[x(f(y3),{class:"size-4"}),v[8]||(v[8]=E("span",{class:"ml-1"}," Copy ",-1))])]),Ho(E("textarea",{class:"min-h-64 w-full resize-y whitespace-pre rounded-sm bg-muted p-2 font-mono text-xs focus:outline-none",name:"",disabled:"",spellcheck:"false","onUpdate:modelValue":v[2]||(v[2]=y=>m.value=y)},null,512),[[xi,m.value]])])])])):(S(),K("div",d9," No requests selected "))]))}}),p9=Yn(),h9=Wn("request",()=>{const e=F([]);return{requests:e,getRequests:()=>{p9.get("/api/requests").then(n=>{e.value=n.data}).catch(n=>{console.error("[request.ts]",n)})}}}),m9={class:"flex items-center px-4 py-2"},g9={class:"bg-background/95 p-4 backdrop-blur supports-[backdrop-filter]:bg-background/60"},v9={class:"relative"},y9=I({__name:"ReplayMain",setup(e){const t=h9(),n=$(()=>t.requests),r=F(n.value.length>0?n.value[0].id:void 0),o=F(""),s=bs(o,250),a=F([20,30,70]),i=$(()=>{let c=[];return s.value?.trim()?c=n.value.filter(p=>p.url.includes(s.value)||p.method.includes(s.value)||p.response.status.toString().includes(s.value)||p.body.includes(s.value)):c=n.value,c}),l=$(()=>n.value.filter(c=>c.response.content_type==="application/json")),u=$(()=>n.value.find(c=>c.id===r.value));return $e(()=>{t.getRequests()}),(c,d)=>(S(),L(f(cn),{"delay-duration":0},{default:_(()=>[x(f(Jr),{id:"resize-panel-group-1",direction:"horizontal",class:"h-full items-stretch"},{default:_(()=>[x(f(Ge),{orientation:"vertical"}),x(f(Mt),{id:"resize-panel-2","default-size":a.value[1],"min-size":20},{default:_(()=>[x(f(ja),{"default-value":"all"},{default:_(()=>[E("div",m9,[d[5]||(d[5]=E("h1",{class:"text-xl font-bold"}," Replay ",-1)),x(f(Ha),{class:"ml-auto"},{default:_(()=>[x(f(Un),{value:"all",class:"text-zinc-600 dark:text-zinc-200"},{default:_(()=>d[3]||(d[3]=[oe(" All ")])),_:1}),x(f(Un),{value:"unread",class:"text-zinc-600 dark:text-zinc-200"},{default:_(()=>d[4]||(d[4]=[oe(" APIs ")])),_:1})]),_:1})]),x(f(Ge)),x(_s,{"hint-key":"replay.main"},{default:_(()=>d[6]||(d[6]=[oe(" Select a request to manipulate and replay. ")])),_:1}),E("div",g9,[E("div",v9,[x(f(ko),{class:"absolute left-2 top-2.5 size-4 text-muted-foreground"}),x(f(An),{modelValue:o.value,"onUpdate:modelValue":d[0]||(d[0]=p=>o.value=p),placeholder:"filter...",class:"pl-8"},null,8,["modelValue"])])]),x(f(Yr),{value:"all",class:"m-0"},{default:_(()=>[x(sg,{"selected-request":r.value,"onUpdate:selectedRequest":d[1]||(d[1]=p=>r.value=p),items:i.value},null,8,["selected-request","items"])]),_:1}),x(f(Yr),{value:"unread",class:"m-0"},{default:_(()=>[x(sg,{"selected-request":r.value,"onUpdate:selectedRequest":d[2]||(d[2]=p=>r.value=p),items:l.value},null,8,["selected-request","items"])]),_:1})]),_:1})]),_:1},8,["default-size"]),x(f(Qr),{id:"resiz-handle-2","with-handle":""}),x(f(Mt),{id:"resize-panel-3","default-size":a.value[2]},{default:_(()=>[x(f9,{request:u.value},null,8,["request"])]),_:1},8,["default-size"])]),_:1})]),_:1}))}}),b9={class:"flex flex-1 flex-col gap-2 p-4 pt-0"},_9=["onClick"],x9={class:"flex w-full flex-col gap-1"},w9={class:"flex items-center"},k9={class:"flex items-center gap-2"},C9={class:"text-2xs font-semibold"},S9={class:"text-xs font-semibold"},E9={class:"flex items-center justify-between gap-2"},A9={class:"text-xs font-medium text-muted-foreground"},al=I({__name:"AttackList",props:Sa({items:{}},{selectedEndpoint:{required:!1},selectedEndpointModifiers:{}}),emits:["update:selectedEndpoint"],setup(e){const t=es(e,"selectedEndpoint");function n(r){return r==="GET"?"bg-green-50 border-green-600/20 text-green-700":r==="POST"?"bg-yellow-50 border-yellow-600/20 text-yellow-700":"bg-red-50 border-red-600/20 text-red-700"}return(r,o)=>(S(),L(f(Ua),{class:"flex h-screen"},{default:_(()=>[E("div",b9,[x(Sl,{name:"list",appear:""},{default:_(()=>[(S(!0),K(Fe,null,It(r.items,s=>(S(),K("button",{class:Ee(["flex flex-col items-start gap-2 rounded-md border bg-background/95 p-3 text-left text-sm transition-all hover:bg-accent/50",t.value===s.id&&"bg-muted"]),key:s.id,onClick:a=>t.value=s.id},[E("div",x9,[E("div",w9,[E("div",k9,[x(f(xs),{variant:"outline",class:Ee(n(s.method))},{default:_(()=>[E("div",C9,ne(s.method),1)]),_:2},1032,["class"]),E("span",S9,ne(s.path),1)])]),E("div",E9,[E("div",A9,ne(s.hostname),1),E("div",{class:Ee(["ml-auto text-xs",t.value===s.id?"text-foreground":"text-muted-foreground"])},ne(f(yo)(new Date(s.created_at),{addSuffix:!0})),3)])])],10,_9))),128))]),_:1})])]),_:1}))}}),D9=I({__name:"Popover",props:{defaultOpen:{type:Boolean},open:{type:Boolean},modal:{type:Boolean}},emits:["update:open"],setup(e,{emit:t}){const o=yt(e,t);return(s,a)=>(S(),L(f(CR),St(Et(f(o))),{default:_(()=>[V(s.$slots,"default")]),_:3},16))}}),T9=I({__name:"PopoverTrigger",props:{asChild:{type:Boolean},as:{}},setup(e){const t=e;return(n,r)=>(S(),L(f(SR),St(Et(t)),{default:_(()=>[V(n.$slots,"default")]),_:3},16))}}),O9=I({inheritAttrs:!1,__name:"PopoverContent",props:{forceMount:{type:Boolean},trapFocus:{type:Boolean},side:{},sideOffset:{default:4},align:{default:"center"},alignOffset:{},avoidCollisions:{type:Boolean},collisionBoundary:{},collisionPadding:{},arrowPadding:{},sticky:{},hideWhenDetached:{type:Boolean},updatePositionStrategy:{},prioritizePosition:{type:Boolean},asChild:{type:Boolean},as:{},disableOutsidePointerEvents:{type:Boolean},class:{}},emits:["escapeKeyDown","pointerDownOutside","focusOutside","interactOutside","openAutoFocus","closeAutoFocus"],setup(e,{emit:t}){const n=e,r=t,o=$(()=>{const{class:a,...i}=n;return i}),s=yt(o,r);return(a,i)=>(S(),L(f(ER),null,{default:_(()=>[x(f(TR),le({...f(s),...a.$attrs},{class:f(xe)("z-50 w-72 rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",n.class)}),{default:_(()=>[V(a.$slots,"default")]),_:3},16,["class"])]),_:3}))}}),M9=I({__name:"Command",props:{modelValue:{default:""},defaultValue:{},open:{type:Boolean,default:!0},defaultOpen:{type:Boolean},searchTerm:{},selectedValue:{},multiple:{type:Boolean},disabled:{type:Boolean},name:{},dir:{},filterFunction:{},displayValue:{},resetSearchTermOnBlur:{type:Boolean},asChild:{type:Boolean},as:{},class:{}},emits:["update:modelValue","update:open","update:searchTerm","update:selectedValue"],setup(e,{emit:t}){const n=e,r=t,o=$(()=>{const{class:a,...i}=n;return i}),s=yt(o,r);return(a,i)=>(S(),L(f(QM),le(f(s),{class:f(xe)("flex h-full w-full flex-col overflow-hidden rounded-md bg-popover text-popover-foreground",n.class)}),{default:_(()=>[V(a.$slots,"default")]),_:3},16,["class"]))}}),R9=I({__name:"CommandEmpty",props:{asChild:{type:Boolean},as:{},class:{}},setup(e){const t=e,n=$(()=>{const{class:r,...o}=t;return o});return(r,o)=>(S(),L(f(iR),le(n.value,{class:f(xe)("py-6 text-center text-sm",t.class)}),{default:_(()=>[V(r.$slots,"default")]),_:3},16,["class"]))}}),P9=I({__name:"CommandGroup",props:{asChild:{type:Boolean},as:{},class:{},heading:{}},setup(e){const t=e,n=$(()=>{const{class:r,...o}=t;return o});return(r,o)=>(S(),L(f(nR),le(n.value,{class:f(xe)("overflow-hidden p-1 text-foreground [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:py-1.5 [&_[cmdk-group-heading]]:text-xs [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:text-muted-foreground",t.class)}),{default:_(()=>[r.heading?(S(),L(f(rR),{key:0,class:"px-2 py-1.5 text-xs font-medium text-muted-foreground"},{default:_(()=>[oe(ne(r.heading),1)]),_:1})):_e("",!0),V(r.$slots,"default")]),_:3},16,["class"]))}}),$9={class:"flex items-center border-b px-3","cmdk-input-wrapper":""},F9=I({inheritAttrs:!1,__name:"CommandInput",props:{type:{},disabled:{type:Boolean},autoFocus:{type:Boolean},asChild:{type:Boolean},as:{},class:{}},setup(e){const t=e,n=$(()=>{const{class:o,...s}=t;return s}),r=Xr(n);return(o,s)=>(S(),K("div",$9,[x(f(L8),{class:"mr-2 h-4 w-4 shrink-0 opacity-50"}),x(f(eR),le({...f(r),...o.$attrs},{"auto-focus":"",class:f(xe)("flex h-10 w-full rounded-md bg-transparent py-3 text-sm outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50",t.class)}),null,16,["class"])]))}}),I9=I({__name:"CommandItem",props:{value:{},disabled:{type:Boolean},asChild:{type:Boolean},as:{},class:{}},emits:["select"],setup(e,{emit:t}){const n=e,r=t,o=$(()=>{const{class:a,...i}=n;return i}),s=yt(o,r);return(a,i)=>(S(),L(f(dR),le(f(s),{class:f(xe)("relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none data-[highlighted]:bg-accent data-[highlighted]:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",n.class)}),{default:_(()=>[V(a.$slots,"default")]),_:3},16,["class"]))}}),L9={role:"presentation"},N9=I({__name:"CommandList",props:{forceMount:{type:Boolean},position:{},bodyLock:{type:Boolean},dismissable:{type:Boolean,default:!1},side:{},sideOffset:{},align:{},alignOffset:{},avoidCollisions:{type:Boolean},collisionBoundary:{},collisionPadding:{},arrowPadding:{},sticky:{},hideWhenDetached:{type:Boolean},updatePositionStrategy:{},prioritizePosition:{type:Boolean},asChild:{type:Boolean},as:{},disableOutsidePointerEvents:{type:Boolean},class:{}},emits:["escapeKeyDown","pointerDownOutside","focusOutside","interactOutside"],setup(e,{emit:t}){const n=e,r=t,o=$(()=>{const{class:a,...i}=n;return i}),s=yt(o,r);return(a,i)=>(S(),L(f(aR),le(f(s),{class:f(xe)("max-h-[300px] overflow-y-auto overflow-x-hidden",n.class)}),{default:_(()=>[E("div",L9,[V(a.$slots,"default")])]),_:3},16,["class"]))}}),Gc=Yn(),lc=Wn("endpoint",()=>{const e=F([]),t=F([]),n=F([]),r=F(!1),o=F(!1),s=F(new Set);return{addResult:m=>{t.value.push(m)},attackComplete:o,attackCompleted:()=>{o.value=!0,r.value=!1},attackRunning:r,clearResults:m=>{Gc.delete(`/api/attack/${m.id}/results`).then(()=>{t.value=[],o.value=!1,r.value=!1})},emptyResults:()=>{t.value=[]},endpoints:e,errors:n,results:t,getEndpoints:()=>{Gc.get("/api/endpoints").then(m=>{e.value=m.data}).catch(m=>{console.error("[request.ts]",m)})},startAttack:m=>{r.value=!0,o.value=!1;const g={endpoint_id:m.id,params:Array.from(s.value)};Gc.post("/api/attack",g).then(v=>{console.log("attack started",v)}).catch(v=>{console.error("[request.ts]",v)})},isParamSelected:m=>s.value.has(m),toggleParam:(m,g)=>{g?s.value.add(m):s.value.delete(m)}}}),z9={class:"flex h-full flex-col"},B9={class:"flex items-center p-2"},q9={class:"flex items-center gap-2"},V9={class:"ml-auto flex items-center gap-2"},j9={class:"ml-2 text-xs"},H9={key:0,class:"flex flex-col gap-4"},U9={key:0,class:"mx-1 space-y-2 text-muted-foreground"},W9={class:"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70"},Y9={key:1},G9={key:0,class:"flex flex-1 flex-col"},K9={class:"flex items-start p-4"},Z9={class:"mr-4 flex items-start gap-4 text-sm"},X9={class:"flex flex-col gap-2"},J9={class:"grid gap-1"},Q9={class:"mr-4 truncate font-semibold text-foreground/80"},e5={class:"space-y-1 text-xs"},t5={class:"font-medium text-muted-foreground"},n5={key:0,class:"ml-auto space-y-4 text-xs text-muted-foreground"},r5={class:"h-screen justify-center space-y-2 overflow-y-auto bg-muted/50 p-1 text-sm"},o5={class:"text-xs text-muted-foreground"},s5={key:0,class:"p-8 text-center font-medium text-muted-foreground"},a5={key:1,class:"p-8 text-center text-muted-foreground"},h_=I({__name:"AttackDisplay",props:{endpoint:{}},setup(e){const t=lc(),n=F(!1),r=F(""),o=$(()=>t.attackRunning),s=$(()=>t.attackComplete),a=e,i=F(!1),l=()=>{a.endpoint&&t.startAttack(a.endpoint)},u=()=>{a.endpoint&&t.clearResults(a.endpoint)},c=[{value:"idor",label:"Insecure Direct Object Reference (IDOR/BOLA)"},{value:"bf",label:"Brute Force"},{value:"sqli",label:"SQL Injection (SQLi)"},{value:"header",label:"HTTP Header Injection"},{value:"xml",label:"XML Injection (XXE)"},{value:"xss",label:"Cross Site Scripting (XSS)"},{value:"ssrf",label:"Server Side Request Forgery (SSRF)"},{value:"lfi",label:"Local File Inclusion (LFI)"},{value:"patht",label:"Path Traversal"},{value:"ssti",label:"Server Side Template Injection (SSTI)"},{value:"cmdi",label:"Command Injection (cmd/shell)"}],d=$(()=>r.value!=="idor"&&r.value.length>0);return(p,h)=>(S(),K("div",z9,[E("div",B9,[E("div",q9,[x(f(Qt),null,{default:_(()=>[x(f(tn),{"as-child":""},{default:_(()=>[x(f(ut),{variant:"ghost",size:"icon",disabled:!p.endpoint,onClick:u},{default:_(()=>[x(f(ms),{class:"size-4"}),h[4]||(h[4]=E("span",{class:"sr-only"},"Move to trash",-1))]),_:1},8,["disabled"])]),_:1}),x(f(en),null,{default:_(()=>h[5]||(h[5]=[oe("Clear all results")])),_:1})]),_:1})]),E("div",V9,[x(f(Ep),{open:i.value,"onUpdate:open":h[3]||(h[3]=m=>i.value=m)},{default:_(()=>[x(f(Ap),{"as-child":""},{default:_(()=>[x(f(ut),{variant:"outline",disabled:!p.endpoint||o.value},{default:_(()=>[x(f(Rm),{class:"mr-2 size-4"}),h[6]||(h[6]=oe("Create a test "))]),_:1},8,["disabled"])]),_:1}),x(f(Op),{class:"sm:max-w-[425px]"},{default:_(()=>[x(f(Dp),null,{default:_(()=>[x(f(Tp),null,{default:_(()=>h[7]||(h[7]=[oe("New dynamic test")])),_:1}),x(f(sl),null,{default:_(()=>h[8]||(h[8]=[oe(" Create and run a new dynamic test on this endpoint. ")])),_:1}),x(f(sl),{class:"rounded-md bg-muted p-2 text-xs font-medium"},{default:_(()=>[x(ls,{code:-1},{default:_(()=>[oe(ne(p.endpoint?.method),1)]),_:1}),E("span",j9,ne(p.endpoint?.path),1)]),_:1})]),_:1}),h[15]||(h[15]=E("span",{class:"text-xs font-medium"}," Test type ",-1)),x(f(D9),{open:n.value,"onUpdate:open":h[1]||(h[1]=m=>n.value=m)},{default:_(()=>[x(f(T9),{"as-child":""},{default:_(()=>[x(f(ut),{variant:"outline",role:"combobox","aria-expanded":n.value,class:"w-full justify-between"},{default:_(()=>[oe(ne(r.value?c.find(m=>m.value===r.value)?.label:"Select test type...")+" ",1),x(f(F8),{class:"ml-2 size-4 shrink-0 opacity-50"})]),_:1},8,["aria-expanded"])]),_:1}),x(f(O9),{class:"w-full p-0"},{default:_(()=>[x(f(M9),null,{default:_(()=>[x(f(F9),{class:"h-9",placeholder:"Search test type..."}),x(f(R9),null,{default:_(()=>h[9]||(h[9]=[oe("No test type found.")])),_:1}),x(f(N9),null,{default:_(()=>[x(f(P9),null,{default:_(()=>[(S(),K(Fe,null,It(c,m=>x(f(I9),{key:m.value,value:m.value,onSelect:h[0]||(h[0]=g=>{typeof g.detail.value=="string"&&(r.value=g.detail.value),n.value=!1})},{default:_(()=>[oe(ne(m.label)+" ",1),x(f(l_),{class:Ee(["ml-auto size-4",r.value===m.value?"opacity-100":"opacity-0"])},null,8,["class"])]),_:2},1032,["value"])),64))]),_:1})]),_:1})]),_:1})]),_:1})]),_:1},8,["open"]),r.value==="idor"?(S(),K("div",H9,[h[10]||(h[10]=E("span",{class:"text-xs font-medium"}," Included parameters ",-1)),p.endpoint?(S(),K("div",U9,[(S(!0),K(Fe,null,It(p.endpoint.params.split(","),m=>(S(),K("div",{key:m,class:"flex items-center gap-2"},[x(f(u_),{checked:f(t).isParamSelected(m),"onUpdate:checked":g=>f(t).toggleParam(m,g)},null,8,["checked","onUpdate:checked"]),E("label",W9,ne(m),1)]))),128))])):_e("",!0),h[11]||(h[11]=E("span",{class:"text-xs text-muted-foreground"},"These parameters were dynamically determined from previous requests to this endpoint. Included parameters will be used as test inputs, while the rest of parameters will be left intact from the original request.",-1))])):_e("",!0),d.value?(S(),K("div",Y9,h[12]||(h[12]=[E("span",{class:"text-xs font-medium"}," Unsupported test type ",-1),E("div",{class:"mt-1 space-y-2 text-xs text-muted-foreground"},[oe(" We'll be adding more test types soon. In the meantime, please submit an issue on "),E("a",{href:"https://github.com/ghostsecurity/reaper/issues",target:"_blank",class:"text-foreground"},"GitHub"),oe(". ")],-1)]))):_e("",!0),x(f(Mp),null,{default:_(()=>[E("div",null,[!o.value&&!s.value&&!d.value?(S(),L(f(ut),{key:0,type:"submit",onClick:Ct(l,["prevent"]),disabled:o.value},{default:_(()=>[x(f(Rm),{class:"mr-2 size-4"}),oe(" "+ne(o.value?"Starting...":"Start test"),1)]),_:1},8,["disabled"])):_e("",!0),o.value?(S(),L(f(ut),{key:1,class:"w-full",disabled:o.value},{default:_(()=>[x(f(k3),{class:"mr-2 size-4 animate-spin"}),h[13]||(h[13]=oe(" Test running... "))]),_:1},8,["disabled"])):_e("",!0),s.value&&!o.value?(S(),L(f(ut),{key:2,class:"w-full",onClick:h[2]||(h[2]=m=>i.value=!1)},{default:_(()=>[x(f(E3),{class:"mr-2 size-4"}),h[14]||(h[14]=oe(" View results "))]),_:1})):_e("",!0)])]),_:1})]),_:1})]),_:1},8,["open"])])]),x(f(Ge)),p.endpoint?(S(),K("div",G9,[E("div",K9,[E("div",Z9,[E("div",X9,[x(ls,{code:-1},{default:_(()=>[oe(ne(p.endpoint.method),1)]),_:1})]),E("div",J9,[E("div",Q9,ne(p.endpoint.path),1),E("div",e5,[E("div",t5,ne(p.endpoint.hostname),1)])])]),p.endpoint.created_at?(S(),K("div",n5,[E("div",null,ne(f(Qf)(new Date(p.endpoint.created_at),"PPpp")),1)])):_e("",!0)]),x(f(Ge)),E("div",r5,[(S(!0),K(Fe,null,It(f(t).results,m=>(S(),K("div",{key:m.id,class:"flex flex-col items-start gap-2 rounded-md bg-background/95 p-3 text-left text-sm shadow-sm transition-all hover:bg-accent/50"},[x(f(xs),{variant:"outline",class:"border-green-600/20 bg-green-50 px-1 text-green-700"},{default:_(()=>h[16]||(h[16]=[E("div",{class:"text-2xs font-semibold uppercase"}," Success ",-1)])),_:1}),E("span",o5,ne(m.request),1)]))),128)),f(t).results.length<1?(S(),K("div",s5," No results yet. Start a dynamic test. ")):_e("",!0)])])):(S(),K("div",a5," No endpoint selected. "))]))}}),i5={class:"flex items-center px-4 py-2"},l5={class:"bg-background/95 p-4 backdrop-blur supports-[backdrop-filter]:bg-background/60"},c5={class:"relative"},u5=I({__name:"AttackMain",setup(e){const t=lc(),n=$(()=>t.endpoints),r=F(n.value.length>0?n.value[0].id:void 0),o=F(""),s=bs(o,250),a=F([20,30,70]),i=$(()=>{let u=[];return s.value?.trim()?u=n.value.filter(d=>d.hostname.includes(s.value)||d.path.includes(s.value)):u=n.value,u}),l=$(()=>n.value.find(u=>u.id===r.value));return $e(()=>{t.getEndpoints(),n.value.length>0&&(r.value=n.value[0].id)}),(u,c)=>(S(),L(f(cn),{"delay-duration":0},{default:_(()=>[x(f(Jr),{id:"resize-panel-group-1",direction:"horizontal",class:"h-full items-stretch"},{default:_(()=>[x(f(Ge),{orientation:"vertical"}),x(f(Mt),{id:"resize-panel-2","default-size":a.value[1],"min-size":20},{default:_(()=>[x(f(ja),{"default-value":"all"},{default:_(()=>[E("div",i5,[c[5]||(c[5]=E("h1",{class:"text-xl font-bold"}," Dynamic Testing ",-1)),x(f(Ha),{class:"ml-auto"},{default:_(()=>[x(f(Un),{value:"all",class:"text-zinc-600 dark:text-zinc-200"},{default:_(()=>c[3]||(c[3]=[oe(" All ")])),_:1}),x(f(Un),{value:"unread",class:"text-zinc-600 dark:text-zinc-200"},{default:_(()=>c[4]||(c[4]=[oe(" APIs ")])),_:1})]),_:1})]),x(f(Ge)),x(_s,{"hint-key":"test.main"},{default:_(()=>c[6]||(c[6]=[oe(" Select an endpoint to launch a dynamic test against it. ")])),_:1}),E("div",l5,[E("div",c5,[x(f(ko),{class:"absolute left-2 top-2.5 size-4 text-muted-foreground"}),x(f(An),{modelValue:o.value,"onUpdate:modelValue":c[0]||(c[0]=d=>o.value=d),spellcheck:"false",placeholder:"filter...",class:"pl-8"},null,8,["modelValue"])])]),x(f(Yr),{value:"all",class:"m-0"},{default:_(()=>[x(al,{"selected-endpoint":r.value,"onUpdate:selectedEndpoint":c[1]||(c[1]=d=>r.value=d),items:i.value},null,8,["selected-endpoint","items"])]),_:1}),x(f(Yr),{value:"unread",class:"m-0"},{default:_(()=>[x(al,{"selected-endpoint":r.value,"onUpdate:selectedEndpoint":c[2]||(c[2]=d=>r.value=d),items:i.value},null,8,["selected-endpoint","items"])]),_:1})]),_:1})]),_:1},8,["default-size"]),x(f(Qr),{id:"resiz-handle-2","with-handle":""}),x(f(Mt),{id:"resize-panel-3","default-size":a.value[2]},{default:_(()=>[x(h_,{endpoint:l.value},null,8,["endpoint"])]),_:1},8,["default-size"])]),_:1})]),_:1}))}}),d5={class:"flex flex-1 flex-col gap-2 py-4 pt-0"},f5=["onClick"],p5={class:"flex w-full flex-col gap-1"},h5={class:"flex w-full items-center"},m5={class:"flex w-full items-center gap-2"},g5={class:"flex w-full justify-between"},v5={class:"text-xs font-semibold"},y5={key:0,class:"text-right text-xs font-semibold"},b5={class:"flex items-center justify-between gap-2"},_5={class:"text-xs font-medium text-muted-foreground"},x5=I({__name:"AgentSessionsList",props:Sa({items:{}},{selectedSession:{required:!1},selectedSessionModifiers:{}}),emits:["update:selectedSession"],setup(e){const t=es(e,"selectedSession");return(n,r)=>(S(),L(f(Ua),{class:"flex h-screen"},{default:_(()=>[E("div",d5,[x(Sl,{name:"list",appear:""},{default:_(()=>[(S(!0),K(Fe,null,It(n.items,o=>(S(),K("button",{class:Ee(["flex flex-col items-start gap-2 rounded-md border bg-background/95 p-3 text-left text-sm transition-all hover:bg-accent/50",t.value===o.id&&"bg-muted"]),key:o.id,onClick:s=>t.value=o.id},[E("div",p5,[E("div",h5,[E("div",m5,[x(f(v3),{class:"size-4"}),E("div",g5,[E("div",v5,ne(o.description),1),o.messages&&o.messages.length>0?(S(),K("div",y5,ne(o.messages.length)+" message"+ne(o.messages.length===1?"":"s"),1)):_e("",!0)])])]),E("div",b5,[E("div",_5," reaper agent session "+ne(o.id),1),E("div",{class:Ee(["ml-auto text-xs",t.value===o.id?"text-foreground":"text-muted-foreground"])},ne(f(yo)(new Date(o.created_at??""),{addSuffix:!0})),3)])])],10,f5))),128))]),_:1})])]),_:1}))}}),di=Yn(),cc=Wn("agent",()=>{const e=F([]),t=F(null),n=F("");return{createSession:u=>new Promise((c,d)=>{di.post("/api/agent/sessions",u).then(p=>{e.value.unshift(p.data),n.value="",c(p.data)}).catch(p=>{n.value=p?.response?.data?.error??p.message,d(p)})}),getSessions:()=>{di.get("/api/agent/sessions").then(u=>{console.log("[agent.ts]",u.data),e.value=u.data}).catch(u=>{console.error("[agent.ts]",u)})},deleteSession:u=>{di.delete(`/api/agent/sessions/${u.id}`).then(()=>{e.value=e.value.filter(c=>c.id!==u.id)}).catch(c=>{console.error("[agent.ts]",c)})},selectSession:u=>{t.value=u},errors:n,sessions:e,selectedSession:t,appendMessageToSession:(u,c)=>{const d=e.value.find(p=>p.id===u);d?(d.messages||(d.messages=[]),d.messages.push(c)):console.error("[agent.ts] appendMessageToSession: session not found, id: ",u)},sendUserMessage:(u,c)=>{di.post(`/api/agent/sessions/${u}/messages`,{content:c}).then(d=>{console.info("[agent.ts] sendUserMessage",d.data)}).catch(d=>{console.error("[agent.ts] sendUserMessage",d)})}}}),w5={id:"wrapper",class:"flex h-screen flex-col"},k5={class:"flex flex-col justify-end"},C5={class:"space-y-4 p-4"},S5={id:"input",class:"mb-8 h-36 flex-none border-t bg-background p-4"},E5=I({__name:"AgentSessionMessages",props:{messages:{},selectedSessionId:{}},setup(e){const t=e,n=cc(),r=F(""),o=$(()=>r.value.trim().length),s=$(()=>t.messages),a=F(null),i=()=>{console.log("tyring to scroool"),it(()=>{a.value&&(a.value.scrollTop=a.value.scrollHeight)})},l=()=>{n.sendUserMessage(t.selectedSessionId,r.value),r.value=""};return Oe(s,()=>{r.value=""}),Oe(s,i,{deep:!0}),$e(()=>{i()}),(u,c)=>(S(),K("div",w5,[E("div",{id:"messages",ref_key:"messagesContainer",ref:a,class:"flex-1 overflow-y-auto"},[E("div",k5,[E("div",C5,[(S(!0),K(Fe,null,It(s.value,(d,p)=>(S(),K("div",{key:p,class:Ee(["flex w-max max-w-[75%] flex-col gap-2 rounded-lg px-3 py-2 text-sm",d.author_role!=="agent"?"ml-auto bg-primary text-primary-foreground":"bg-muted"])},ne(d.content),3))),128))])])],512),E("div",S5,[E("form",{class:"flex w-full items-center space-x-2",onSubmit:Ct(l,["prevent"])},[x(f(An),{modelValue:r.value,"onUpdate:modelValue":c[0]||(c[0]=d=>r.value=d),placeholder:"Type a message...",class:"flex-1"},null,8,["modelValue"]),x(f(ut),{class:"flex items-center justify-center p-2.5",type:"submit",disabled:o.value===0},{default:_(()=>[x(f(N8),{class:"size-4"}),c[1]||(c[1]=E("span",{class:"sr-only"},"Send",-1))]),_:1},8,["disabled"])],32)])]))}}),A5={class:"flex h-full flex-col"},D5={class:"flex items-center p-2"},T5={class:"flex items-center gap-2"},O5={key:0,class:"flex flex-1 flex-col"},M5={class:"flex items-start p-4"},R5={class:"flex items-start gap-4 text-sm"},P5={class:"grid gap-1"},$5={class:"font-semibold"},F5={key:0,class:"ml-auto text-xs text-muted-foreground"},I5={class:"min-h-0 flex-1"},L5={key:1,class:"p-8 text-center text-muted-foreground"},N5=I({__name:"AgentSessionDisplay",props:{session:{}},setup(e){const t=cc(),n=e,r=()=>{n.session&&t.deleteSession(n.session)};return(o,s)=>(S(),K("div",A5,[E("div",D5,[E("div",T5,[x(f(Qt),null,{default:_(()=>[x(f(tn),{"as-child":""},{default:_(()=>[x(f(ut),{variant:"ghost",size:"icon",disabled:!o.session,onClick:r},{default:_(()=>[x(f(ms),{class:"size-4"}),s[0]||(s[0]=E("span",{class:"sr-only"},"Delete session",-1))]),_:1},8,["disabled"])]),_:1}),x(f(en),null,{default:_(()=>s[1]||(s[1]=[oe("Delete session")])),_:1})]),_:1})])]),x(f(Ge)),o.session?(S(),K("div",O5,[E("div",M5,[E("div",R5,[E("div",P5,[E("div",$5,[oe(ne(o.session.description)+" ",1),o.session.messages&&o.session.messages.length>0?(S(),L(f(xs),{key:0,variant:"outline",class:"text-muted-foreground"},{default:_(()=>[oe(ne(o.session.messages.length),1)]),_:1})):_e("",!0)])])]),o.session.created_at?(S(),K("div",F5,ne(f(Qf)(new Date(o.session.created_at),"PPpp")),1)):_e("",!0)]),x(f(Ge)),E("div",I5,[x(E5,{id:"session-messages",messages:o.session.messages??[],"selected-session-id":o.session.id??0},null,8,["messages","selected-session-id"])])])):(S(),K("div",L5," No session selected "))]))}}),z5={class:"flex items-center justify-between px-4 py-2.5"},B5={class:"py-0"},q5={class:"h-4 text-xs font-medium text-destructive"},V5={class:"bg-background/95 p-4 backdrop-blur supports-[backdrop-filter]:bg-background/60"},j5={class:"relative"},H5={class:"px-4"},U5=I({__name:"AgentMain",setup(e){const t=cc(),n=$(()=>t.sessions),r=$(()=>t.errors),o=F(n.value.length>0?n.value[0].id:void 0),s=F(""),a=bs(s,250),i=F(!1),l=F(!1),u=F(""),c=F([20,30,70]),d=()=>{u.value&&(l.value=!0,t.createSession({description:u.value}).then(()=>{i.value=!1,u.value=""}).finally(()=>{l.value=!1}))},p=$(()=>{let m=[];return a.value?.trim()?m=n.value.filter(v=>v.description.includes(a.value)):m=n.value,m}),h=$(()=>n.value.find(m=>m.id===o.value));return $e(()=>{t.getSessions(),n.value.length>0&&(o.value=n.value[0].id)}),(m,g)=>(S(),L(f(cn),{"delay-duration":0},{default:_(()=>[x(f(Jr),{id:"resize-panel-group-1",direction:"horizontal",class:"h-full items-stretch"},{default:_(()=>[x(f(Ge),{orientation:"vertical"}),x(f(Mt),{id:"resize-panel-2","default-size":c.value[1],"min-size":20},{default:_(()=>[E("div",z5,[g[8]||(g[8]=E("h1",{class:"text-xl font-bold"}," Sessions ",-1)),x(f(Ep),{open:i.value,"onUpdate:open":g[1]||(g[1]=v=>i.value=v)},{default:_(()=>[x(f(Ap),{"as-child":""},{default:_(()=>[x(f(ut),{variant:"outline",size:"sm"},{default:_(()=>[x(f(ib),{class:"mr-2 w-4"}),g[4]||(g[4]=oe("New Session "))]),_:1})]),_:1}),x(f(Op),{class:"sm:max-w-[425px]"},{default:_(()=>[x(f(Dp),null,{default:_(()=>[x(f(Tp),null,{default:_(()=>g[5]||(g[5]=[oe("New session")])),_:1}),x(f(sl),null,{default:_(()=>g[6]||(g[6]=[oe(" Start with a descriptive name of your AI driven workflow. ")])),_:1})]),_:1}),E("div",B5,[x(f(An),{id:"name",modelValue:u.value,"onUpdate:modelValue":g[0]||(g[0]=v=>u.value=v),placeholder:"example.com dynamic security test",onKeyup:zr(Ct(d,["prevent"]),["enter"]),class:"w-full"},null,8,["modelValue","onKeyup"]),E("div",q5,ne(r.value),1)]),x(f(Mp),null,{default:_(()=>[x(f(ut),{type:"submit",onClick:Ct(d,["prevent"]),disabled:!u.value},{default:_(()=>g[7]||(g[7]=[oe(" Create session ")])),_:1},8,["disabled"])]),_:1})]),_:1})]),_:1},8,["open"])]),x(f(Ge)),x(_s,{"hint-key":"agent.session.list"},{default:_(()=>g[9]||(g[9]=[oe(" Start an AI session to experiance how context-aware AI can help you drive intelligent and efficient workflows. ")])),_:1}),E("div",V5,[E("div",j5,[x(f(ko),{class:"absolute left-2 top-2.5 size-4 text-muted-foreground"}),x(f(An),{modelValue:s.value,"onUpdate:modelValue":g[2]||(g[2]=v=>s.value=v),placeholder:"filter...",class:"pl-8"},null,8,["modelValue"])])]),E("div",H5,[x(x5,{"selected-session":o.value,"onUpdate:selectedSession":g[3]||(g[3]=v=>o.value=v),items:p.value},null,8,["selected-session","items"])])]),_:1},8,["default-size"]),x(f(Qr),{id:"resiz-handle-2","with-handle":""}),x(f(Mt),{id:"resize-panel-3","default-size":c.value[2]},{default:_(()=>[x(N5,{session:h.value},null,8,["session"])]),_:1},8,["default-size"])]),_:1})]),_:1}))}}),W5={class:"flex flex-1 flex-col gap-2 p-4 pt-0"},Y5=["onClick"],G5={class:"flex w-full flex-col gap-1"},K5={class:"flex items-center"},Z5={class:"flex items-center gap-2"},X5={class:"text-2xs font-semibold"},J5={class:"text-xs font-semibold"},Q5={class:"flex items-center justify-between gap-2"},e$={class:"text-xs font-medium text-muted-foreground"},ag=I({__name:"ReportsList",props:Sa({items:{}},{selectedReport:{required:!1},selectedReportModifiers:{}}),emits:["update:selectedReport"],setup(e){const t=es(e,"selectedReport");return(n,r)=>(S(),L(f(Ua),{class:"flex h-screen"},{default:_(()=>[E("div",W5,[x(Sl,{name:"list",appear:""},{default:_(()=>[(S(!0),K(Fe,null,It(n.items,o=>(S(),K("button",{class:Ee(["flex flex-col items-start gap-2 rounded-md border bg-background/95 p-3 text-left text-sm transition-all hover:bg-accent/50",t.value===o.id&&"bg-muted"]),key:o.id,onClick:s=>t.value=o.id},[E("div",G5,[E("div",K5,[E("div",Z5,[x(f(xs),{variant:"outline"},{default:_(()=>[E("div",X5,ne(o.id),1)]),_:2},1024),E("span",J5,ne(o.domain),1)])]),E("div",Q5,[E("div",e$,ne(o.domain),1),E("div",{class:Ee(["ml-auto text-xs",t.value===o.id?"text-foreground":"text-muted-foreground"])},ne(f(yo)(new Date(o.created_at),{addSuffix:!0})),3)])])],10,Y5))),128))]),_:1})])]),_:1}))}});function t$(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}function n$(e){if(Object.prototype.hasOwnProperty.call(e,"__esModule"))return e;var t=e.default;if(typeof t=="function"){var n=function r(){var o=!1;try{o=this instanceof r}catch{}return o?Reflect.construct(t,arguments,this.constructor):t.apply(this,arguments)};n.prototype=t.prototype}else n={};return Object.defineProperty(n,"__esModule",{value:!0}),Object.keys(e).forEach(function(r){var o=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(n,r,o.get?o:{enumerable:!0,get:function(){return e[r]}})}),n}var Kc={};const r$="Á",o$="á",s$="Ă",a$="ă",i$="∾",l$="∿",c$="∾̳",u$="Â",d$="â",f$="´",p$="А",h$="а",m$="Æ",g$="æ",v$="⁡",y$="𝔄",b$="𝔞",_$="À",x$="à",w$="ℵ",k$="ℵ",C$="Α",S$="α",E$="Ā",A$="ā",D$="⨿",T$="&",O$="&",M$="⩕",R$="⩓",P$="∧",$$="⩜",F$="⩘",I$="⩚",L$="∠",N$="⦤",z$="∠",B$="⦨",q$="⦩",V$="⦪",j$="⦫",H$="⦬",U$="⦭",W$="⦮",Y$="⦯",G$="∡",K$="∟",Z$="⊾",X$="⦝",J$="∢",Q$="Å",eF="⍼",tF="Ą",nF="ą",rF="𝔸",oF="𝕒",sF="⩯",aF="≈",iF="⩰",lF="≊",cF="≋",uF="'",dF="⁡",fF="≈",pF="≊",hF="Å",mF="å",gF="𝒜",vF="𝒶",yF="≔",bF="*",_F="≈",xF="≍",wF="Ã",kF="ã",CF="Ä",SF="ä",EF="∳",AF="⨑",DF="≌",TF="϶",OF="‵",MF="∽",RF="⋍",PF="∖",$F="⫧",FF="⊽",IF="⌅",LF="⌆",NF="⌅",zF="⎵",BF="⎶",qF="≌",VF="Б",jF="б",HF="„",UF="∵",WF="∵",YF="∵",GF="⦰",KF="϶",ZF="ℬ",XF="ℬ",JF="Β",QF="β",eI="ℶ",tI="≬",nI="𝔅",rI="𝔟",oI="⋂",sI="◯",aI="⋃",iI="⨀",lI="⨁",cI="⨂",uI="⨆",dI="★",fI="▽",pI="△",hI="⨄",mI="⋁",gI="⋀",vI="⤍",yI="⧫",bI="▪",_I="▴",xI="▾",wI="◂",kI="▸",CI="␣",SI="▒",EI="░",AI="▓",DI="█",TI="=⃥",OI="≡⃥",MI="⫭",RI="⌐",PI="𝔹",$I="𝕓",FI="⊥",II="⊥",LI="⋈",NI="⧉",zI="┐",BI="╕",qI="╖",VI="╗",jI="┌",HI="╒",UI="╓",WI="╔",YI="─",GI="═",KI="┬",ZI="╤",XI="╥",JI="╦",QI="┴",eL="╧",tL="╨",nL="╩",rL="⊟",oL="⊞",sL="⊠",aL="┘",iL="╛",lL="╜",cL="╝",uL="└",dL="╘",fL="╙",pL="╚",hL="│",mL="║",gL="┼",vL="╪",yL="╫",bL="╬",_L="┤",xL="╡",wL="╢",kL="╣",CL="├",SL="╞",EL="╟",AL="╠",DL="‵",TL="˘",OL="˘",ML="¦",RL="𝒷",PL="ℬ",$L="⁏",FL="∽",IL="⋍",LL="⧅",NL="\\",zL="⟈",BL="•",qL="•",VL="≎",jL="⪮",HL="≏",UL="≎",WL="≏",YL="Ć",GL="ć",KL="⩄",ZL="⩉",XL="⩋",JL="∩",QL="⋒",e7="⩇",t7="⩀",n7="ⅅ",r7="∩︀",o7="⁁",s7="ˇ",a7="ℭ",i7="⩍",l7="Č",c7="č",u7="Ç",d7="ç",f7="Ĉ",p7="ĉ",h7="∰",m7="⩌",g7="⩐",v7="Ċ",y7="ċ",b7="¸",_7="¸",x7="⦲",w7="¢",k7="·",C7="·",S7="𝔠",E7="ℭ",A7="Ч",D7="ч",T7="✓",O7="✓",M7="Χ",R7="χ",P7="ˆ",$7="≗",F7="↺",I7="↻",L7="⊛",N7="⊚",z7="⊝",B7="⊙",q7="®",V7="Ⓢ",j7="⊖",H7="⊕",U7="⊗",W7="○",Y7="⧃",G7="≗",K7="⨐",Z7="⫯",X7="⧂",J7="∲",Q7="”",eN="’",tN="♣",nN="♣",rN=":",oN="∷",sN="⩴",aN="≔",iN="≔",lN=",",cN="@",uN="∁",dN="∘",fN="∁",pN="ℂ",hN="≅",mN="⩭",gN="≡",vN="∮",yN="∯",bN="∮",_N="𝕔",xN="ℂ",wN="∐",kN="∐",CN="©",SN="©",EN="℗",AN="∳",DN="↵",TN="✗",ON="⨯",MN="𝒞",RN="𝒸",PN="⫏",$N="⫑",FN="⫐",IN="⫒",LN="⋯",NN="⤸",zN="⤵",BN="⋞",qN="⋟",VN="↶",jN="⤽",HN="⩈",UN="⩆",WN="≍",YN="∪",GN="⋓",KN="⩊",ZN="⊍",XN="⩅",JN="∪︀",QN="↷",ez="⤼",tz="⋞",nz="⋟",rz="⋎",oz="⋏",sz="¤",az="↶",iz="↷",lz="⋎",cz="⋏",uz="∲",dz="∱",fz="⌭",pz="†",hz="‡",mz="ℸ",gz="↓",vz="↡",yz="⇓",bz="‐",_z="⫤",xz="⊣",wz="⤏",kz="˝",Cz="Ď",Sz="ď",Ez="Д",Az="д",Dz="‡",Tz="⇊",Oz="ⅅ",Mz="ⅆ",Rz="⤑",Pz="⩷",$z="°",Fz="∇",Iz="Δ",Lz="δ",Nz="⦱",zz="⥿",Bz="𝔇",qz="𝔡",Vz="⥥",jz="⇃",Hz="⇂",Uz="´",Wz="˙",Yz="˝",Gz="`",Kz="˜",Zz="⋄",Xz="⋄",Jz="⋄",Qz="♦",eB="♦",tB="¨",nB="ⅆ",rB="ϝ",oB="⋲",sB="÷",aB="÷",iB="⋇",lB="⋇",cB="Ђ",uB="ђ",dB="⌞",fB="⌍",pB="$",hB="𝔻",mB="𝕕",gB="¨",vB="˙",yB="⃜",bB="≐",_B="≑",xB="≐",wB="∸",kB="∔",CB="⊡",SB="⌆",EB="∯",AB="¨",DB="⇓",TB="⇐",OB="⇔",MB="⫤",RB="⟸",PB="⟺",$B="⟹",FB="⇒",IB="⊨",LB="⇑",NB="⇕",zB="∥",BB="⤓",qB="↓",VB="↓",jB="⇓",HB="⇵",UB="̑",WB="⇊",YB="⇃",GB="⇂",KB="⥐",ZB="⥞",XB="⥖",JB="↽",QB="⥟",eq="⥗",tq="⇁",nq="↧",rq="⊤",oq="⤐",sq="⌟",aq="⌌",iq="𝒟",lq="𝒹",cq="Ѕ",uq="ѕ",dq="⧶",fq="Đ",pq="đ",hq="⋱",mq="▿",gq="▾",vq="⇵",yq="⥯",bq="⦦",_q="Џ",xq="џ",wq="⟿",kq="É",Cq="é",Sq="⩮",Eq="Ě",Aq="ě",Dq="Ê",Tq="ê",Oq="≖",Mq="≕",Rq="Э",Pq="э",$q="⩷",Fq="Ė",Iq="ė",Lq="≑",Nq="ⅇ",zq="≒",Bq="𝔈",qq="𝔢",Vq="⪚",jq="È",Hq="è",Uq="⪖",Wq="⪘",Yq="⪙",Gq="∈",Kq="⏧",Zq="ℓ",Xq="⪕",Jq="⪗",Qq="Ē",eV="ē",tV="∅",nV="∅",rV="◻",oV="∅",sV="▫",aV=" ",iV=" ",lV=" ",cV="Ŋ",uV="ŋ",dV=" ",fV="Ę",pV="ę",hV="𝔼",mV="𝕖",gV="⋕",vV="⧣",yV="⩱",bV="ε",_V="Ε",xV="ε",wV="ϵ",kV="≖",CV="≕",SV="≂",EV="⪖",AV="⪕",DV="⩵",TV="=",OV="≂",MV="≟",RV="⇌",PV="≡",$V="⩸",FV="⧥",IV="⥱",LV="≓",NV="ℯ",zV="ℰ",BV="≐",qV="⩳",VV="≂",jV="Η",HV="η",UV="Ð",WV="ð",YV="Ë",GV="ë",KV="€",ZV="!",XV="∃",JV="∃",QV="ℰ",ej="ⅇ",tj="ⅇ",nj="≒",rj="Ф",oj="ф",sj="♀",aj="ffi",ij="ff",lj="ffl",cj="𝔉",uj="𝔣",dj="fi",fj="◼",pj="▪",hj="fj",mj="♭",gj="fl",vj="▱",yj="ƒ",bj="𝔽",_j="𝕗",xj="∀",wj="∀",kj="⋔",Cj="⫙",Sj="ℱ",Ej="⨍",Aj="½",Dj="⅓",Tj="¼",Oj="⅕",Mj="⅙",Rj="⅛",Pj="⅔",$j="⅖",Fj="¾",Ij="⅗",Lj="⅜",Nj="⅘",zj="⅚",Bj="⅝",qj="⅞",Vj="⁄",jj="⌢",Hj="𝒻",Uj="ℱ",Wj="ǵ",Yj="Γ",Gj="γ",Kj="Ϝ",Zj="ϝ",Xj="⪆",Jj="Ğ",Qj="ğ",eH="Ģ",tH="Ĝ",nH="ĝ",rH="Г",oH="г",sH="Ġ",aH="ġ",iH="≥",lH="≧",cH="⪌",uH="⋛",dH="≥",fH="≧",pH="⩾",hH="⪩",mH="⩾",gH="⪀",vH="⪂",yH="⪄",bH="⋛︀",_H="⪔",xH="𝔊",wH="𝔤",kH="≫",CH="⋙",SH="⋙",EH="ℷ",AH="Ѓ",DH="ѓ",TH="⪥",OH="≷",MH="⪒",RH="⪤",PH="⪊",$H="⪊",FH="⪈",IH="≩",LH="⪈",NH="≩",zH="⋧",BH="𝔾",qH="𝕘",VH="`",jH="≥",HH="⋛",UH="≧",WH="⪢",YH="≷",GH="⩾",KH="≳",ZH="𝒢",XH="ℊ",JH="≳",QH="⪎",eU="⪐",tU="⪧",nU="⩺",rU=">",oU=">",sU="≫",aU="⋗",iU="⦕",lU="⩼",cU="⪆",uU="⥸",dU="⋗",fU="⋛",pU="⪌",hU="≷",mU="≳",gU="≩︀",vU="≩︀",yU="ˇ",bU=" ",_U="½",xU="ℋ",wU="Ъ",kU="ъ",CU="⥈",SU="↔",EU="⇔",AU="↭",DU="^",TU="ℏ",OU="Ĥ",MU="ĥ",RU="♥",PU="♥",$U="…",FU="⊹",IU="𝔥",LU="ℌ",NU="ℋ",zU="⤥",BU="⤦",qU="⇿",VU="∻",jU="↩",HU="↪",UU="𝕙",WU="ℍ",YU="―",GU="─",KU="𝒽",ZU="ℋ",XU="ℏ",JU="Ħ",QU="ħ",eW="≎",tW="≏",nW="⁃",rW="‐",oW="Í",sW="í",aW="⁣",iW="Î",lW="î",cW="И",uW="и",dW="İ",fW="Е",pW="е",hW="¡",mW="⇔",gW="𝔦",vW="ℑ",yW="Ì",bW="ì",_W="ⅈ",xW="⨌",wW="∭",kW="⧜",CW="℩",SW="IJ",EW="ij",AW="Ī",DW="ī",TW="ℑ",OW="ⅈ",MW="ℐ",RW="ℑ",PW="ı",$W="ℑ",FW="⊷",IW="Ƶ",LW="⇒",NW="℅",zW="∞",BW="⧝",qW="ı",VW="⊺",jW="∫",HW="∬",UW="ℤ",WW="∫",YW="⊺",GW="⋂",KW="⨗",ZW="⨼",XW="⁣",JW="⁢",QW="Ё",eY="ё",tY="Į",nY="į",rY="𝕀",oY="𝕚",sY="Ι",aY="ι",iY="⨼",lY="¿",cY="𝒾",uY="ℐ",dY="∈",fY="⋵",pY="⋹",hY="⋴",mY="⋳",gY="∈",vY="⁢",yY="Ĩ",bY="ĩ",_Y="І",xY="і",wY="Ï",kY="ï",CY="Ĵ",SY="ĵ",EY="Й",AY="й",DY="𝔍",TY="𝔧",OY="ȷ",MY="𝕁",RY="𝕛",PY="𝒥",$Y="𝒿",FY="Ј",IY="ј",LY="Є",NY="є",zY="Κ",BY="κ",qY="ϰ",VY="Ķ",jY="ķ",HY="К",UY="к",WY="𝔎",YY="𝔨",GY="ĸ",KY="Х",ZY="х",XY="Ќ",JY="ќ",QY="𝕂",eG="𝕜",tG="𝒦",nG="𝓀",rG="⇚",oG="Ĺ",sG="ĺ",aG="⦴",iG="ℒ",lG="Λ",cG="λ",uG="⟨",dG="⟪",fG="⦑",pG="⟨",hG="⪅",mG="ℒ",gG="«",vG="⇤",yG="⤟",bG="←",_G="↞",xG="⇐",wG="⤝",kG="↩",CG="↫",SG="⤹",EG="⥳",AG="↢",DG="⤙",TG="⤛",OG="⪫",MG="⪭",RG="⪭︀",PG="⤌",$G="⤎",FG="❲",IG="{",LG="[",NG="⦋",zG="⦏",BG="⦍",qG="Ľ",VG="ľ",jG="Ļ",HG="ļ",UG="⌈",WG="{",YG="Л",GG="л",KG="⤶",ZG="“",XG="„",JG="⥧",QG="⥋",eK="↲",tK="≤",nK="≦",rK="⟨",oK="⇤",sK="←",aK="←",iK="⇐",lK="⇆",cK="↢",uK="⌈",dK="⟦",fK="⥡",pK="⥙",hK="⇃",mK="⌊",gK="↽",vK="↼",yK="⇇",bK="↔",_K="↔",xK="⇔",wK="⇆",kK="⇋",CK="↭",SK="⥎",EK="↤",AK="⊣",DK="⥚",TK="⋋",OK="⧏",MK="⊲",RK="⊴",PK="⥑",$K="⥠",FK="⥘",IK="↿",LK="⥒",NK="↼",zK="⪋",BK="⋚",qK="≤",VK="≦",jK="⩽",HK="⪨",UK="⩽",WK="⩿",YK="⪁",GK="⪃",KK="⋚︀",ZK="⪓",XK="⪅",JK="⋖",QK="⋚",eZ="⪋",tZ="⋚",nZ="≦",rZ="≶",oZ="≶",sZ="⪡",aZ="≲",iZ="⩽",lZ="≲",cZ="⥼",uZ="⌊",dZ="𝔏",fZ="𝔩",pZ="≶",hZ="⪑",mZ="⥢",gZ="↽",vZ="↼",yZ="⥪",bZ="▄",_Z="Љ",xZ="љ",wZ="⇇",kZ="≪",CZ="⋘",SZ="⌞",EZ="⇚",AZ="⥫",DZ="◺",TZ="Ŀ",OZ="ŀ",MZ="⎰",RZ="⎰",PZ="⪉",$Z="⪉",FZ="⪇",IZ="≨",LZ="⪇",NZ="≨",zZ="⋦",BZ="⟬",qZ="⇽",VZ="⟦",jZ="⟵",HZ="⟵",UZ="⟸",WZ="⟷",YZ="⟷",GZ="⟺",KZ="⟼",ZZ="⟶",XZ="⟶",JZ="⟹",QZ="↫",eX="↬",tX="⦅",nX="𝕃",rX="𝕝",oX="⨭",sX="⨴",aX="∗",iX="_",lX="↙",cX="↘",uX="◊",dX="◊",fX="⧫",pX="(",hX="⦓",mX="⇆",gX="⌟",vX="⇋",yX="⥭",bX="‎",_X="⊿",xX="‹",wX="𝓁",kX="ℒ",CX="↰",SX="↰",EX="≲",AX="⪍",DX="⪏",TX="[",OX="‘",MX="‚",RX="Ł",PX="ł",$X="⪦",FX="⩹",IX="<",LX="<",NX="≪",zX="⋖",BX="⋋",qX="⋉",VX="⥶",jX="⩻",HX="◃",UX="⊴",WX="◂",YX="⦖",GX="⥊",KX="⥦",ZX="≨︀",XX="≨︀",JX="¯",QX="♂",eJ="✠",tJ="✠",nJ="↦",rJ="↦",oJ="↧",sJ="↤",aJ="↥",iJ="▮",lJ="⨩",cJ="М",uJ="м",dJ="—",fJ="∺",pJ="∡",hJ=" ",mJ="ℳ",gJ="𝔐",vJ="𝔪",yJ="℧",bJ="µ",_J="*",xJ="⫰",wJ="∣",kJ="·",CJ="⊟",SJ="−",EJ="∸",AJ="⨪",DJ="∓",TJ="⫛",OJ="…",MJ="∓",RJ="⊧",PJ="𝕄",$J="𝕞",FJ="∓",IJ="𝓂",LJ="ℳ",NJ="∾",zJ="Μ",BJ="μ",qJ="⊸",VJ="⊸",jJ="∇",HJ="Ń",UJ="ń",WJ="∠⃒",YJ="≉",GJ="⩰̸",KJ="≋̸",ZJ="ʼn",XJ="≉",JJ="♮",QJ="ℕ",eQ="♮",tQ=" ",nQ="≎̸",rQ="≏̸",oQ="⩃",sQ="Ň",aQ="ň",iQ="Ņ",lQ="ņ",cQ="≇",uQ="⩭̸",dQ="⩂",fQ="Н",pQ="н",hQ="–",mQ="⤤",gQ="↗",vQ="⇗",yQ="↗",bQ="≠",_Q="≐̸",xQ="​",wQ="​",kQ="​",CQ="​",SQ="≢",EQ="⤨",AQ="≂̸",DQ="≫",TQ="≪",OQ=` -`,MQ="∄",RQ="∄",PQ="𝔑",$Q="𝔫",FQ="≧̸",IQ="≱",LQ="≱",NQ="≧̸",zQ="⩾̸",BQ="⩾̸",qQ="⋙̸",VQ="≵",jQ="≫⃒",HQ="≯",UQ="≯",WQ="≫̸",YQ="↮",GQ="⇎",KQ="⫲",ZQ="∋",XQ="⋼",JQ="⋺",QQ="∋",eee="Њ",tee="њ",nee="↚",ree="⇍",oee="‥",see="≦̸",aee="≰",iee="↚",lee="⇍",cee="↮",uee="⇎",dee="≰",fee="≦̸",pee="⩽̸",hee="⩽̸",mee="≮",gee="⋘̸",vee="≴",yee="≪⃒",bee="≮",_ee="⋪",xee="⋬",wee="≪̸",kee="∤",Cee="⁠",See=" ",Eee="𝕟",Aee="ℕ",Dee="⫬",Tee="¬",Oee="≢",Mee="≭",Ree="∦",Pee="∉",$ee="≠",Fee="≂̸",Iee="∄",Lee="≯",Nee="≱",zee="≧̸",Bee="≫̸",qee="≹",Vee="⩾̸",jee="≵",Hee="≎̸",Uee="≏̸",Wee="∉",Yee="⋵̸",Gee="⋹̸",Kee="∉",Zee="⋷",Xee="⋶",Jee="⧏̸",Qee="⋪",ete="⋬",tte="≮",nte="≰",rte="≸",ote="≪̸",ste="⩽̸",ate="≴",ite="⪢̸",lte="⪡̸",cte="∌",ute="∌",dte="⋾",fte="⋽",pte="⊀",hte="⪯̸",mte="⋠",gte="∌",vte="⧐̸",yte="⋫",bte="⋭",_te="⊏̸",xte="⋢",wte="⊐̸",kte="⋣",Cte="⊂⃒",Ste="⊈",Ete="⊁",Ate="⪰̸",Dte="⋡",Tte="≿̸",Ote="⊃⃒",Mte="⊉",Rte="≁",Pte="≄",$te="≇",Fte="≉",Ite="∤",Lte="∦",Nte="∦",zte="⫽⃥",Bte="∂̸",qte="⨔",Vte="⊀",jte="⋠",Hte="⊀",Ute="⪯̸",Wte="⪯̸",Yte="⤳̸",Gte="↛",Kte="⇏",Zte="↝̸",Xte="↛",Jte="⇏",Qte="⋫",ene="⋭",tne="⊁",nne="⋡",rne="⪰̸",one="𝒩",sne="𝓃",ane="∤",ine="∦",lne="≁",cne="≄",une="≄",dne="∤",fne="∦",pne="⋢",hne="⋣",mne="⊄",gne="⫅̸",vne="⊈",yne="⊂⃒",bne="⊈",_ne="⫅̸",xne="⊁",wne="⪰̸",kne="⊅",Cne="⫆̸",Sne="⊉",Ene="⊃⃒",Ane="⊉",Dne="⫆̸",Tne="≹",One="Ñ",Mne="ñ",Rne="≸",Pne="⋪",$ne="⋬",Fne="⋫",Ine="⋭",Lne="Ν",Nne="ν",zne="#",Bne="№",qne=" ",Vne="≍⃒",jne="⊬",Hne="⊭",Une="⊮",Wne="⊯",Yne="≥⃒",Gne=">⃒",Kne="⤄",Zne="⧞",Xne="⤂",Jne="≤⃒",Qne="<⃒",ere="⊴⃒",tre="⤃",nre="⊵⃒",rre="∼⃒",ore="⤣",sre="↖",are="⇖",ire="↖",lre="⤧",cre="Ó",ure="ó",dre="⊛",fre="Ô",pre="ô",hre="⊚",mre="О",gre="о",vre="⊝",yre="Ő",bre="ő",_re="⨸",xre="⊙",wre="⦼",kre="Œ",Cre="œ",Sre="⦿",Ere="𝔒",Are="𝔬",Dre="˛",Tre="Ò",Ore="ò",Mre="⧁",Rre="⦵",Pre="Ω",$re="∮",Fre="↺",Ire="⦾",Lre="⦻",Nre="‾",zre="⧀",Bre="Ō",qre="ō",Vre="Ω",jre="ω",Hre="Ο",Ure="ο",Wre="⦶",Yre="⊖",Gre="𝕆",Kre="𝕠",Zre="⦷",Xre="“",Jre="‘",Qre="⦹",eoe="⊕",toe="↻",noe="⩔",roe="∨",ooe="⩝",soe="ℴ",aoe="ℴ",ioe="ª",loe="º",coe="⊶",uoe="⩖",doe="⩗",foe="⩛",poe="Ⓢ",hoe="𝒪",moe="ℴ",goe="Ø",voe="ø",yoe="⊘",boe="Õ",_oe="õ",xoe="⨶",woe="⨷",koe="⊗",Coe="Ö",Soe="ö",Eoe="⌽",Aoe="‾",Doe="⏞",Toe="⎴",Ooe="⏜",Moe="¶",Roe="∥",Poe="∥",$oe="⫳",Foe="⫽",Ioe="∂",Loe="∂",Noe="П",zoe="п",Boe="%",qoe=".",Voe="‰",joe="⊥",Hoe="‱",Uoe="𝔓",Woe="𝔭",Yoe="Φ",Goe="φ",Koe="ϕ",Zoe="ℳ",Xoe="☎",Joe="Π",Qoe="π",ese="⋔",tse="ϖ",nse="ℏ",rse="ℎ",ose="ℏ",sse="⨣",ase="⊞",ise="⨢",lse="+",cse="∔",use="⨥",dse="⩲",fse="±",pse="±",hse="⨦",mse="⨧",gse="±",vse="ℌ",yse="⨕",bse="𝕡",_se="ℙ",xse="£",wse="⪷",kse="⪻",Cse="≺",Sse="≼",Ese="⪷",Ase="≺",Dse="≼",Tse="≺",Ose="⪯",Mse="≼",Rse="≾",Pse="⪯",$se="⪹",Fse="⪵",Ise="⋨",Lse="⪯",Nse="⪳",zse="≾",Bse="′",qse="″",Vse="ℙ",jse="⪹",Hse="⪵",Use="⋨",Wse="∏",Yse="∏",Gse="⌮",Kse="⌒",Zse="⌓",Xse="∝",Jse="∝",Qse="∷",eae="∝",tae="≾",nae="⊰",rae="𝒫",oae="𝓅",sae="Ψ",aae="ψ",iae=" ",lae="𝔔",cae="𝔮",uae="⨌",dae="𝕢",fae="ℚ",pae="⁗",hae="𝒬",mae="𝓆",gae="ℍ",vae="⨖",yae="?",bae="≟",_ae='"',xae='"',wae="⇛",kae="∽̱",Cae="Ŕ",Sae="ŕ",Eae="√",Aae="⦳",Dae="⟩",Tae="⟫",Oae="⦒",Mae="⦥",Rae="⟩",Pae="»",$ae="⥵",Fae="⇥",Iae="⤠",Lae="⤳",Nae="→",zae="↠",Bae="⇒",qae="⤞",Vae="↪",jae="↬",Hae="⥅",Uae="⥴",Wae="⤖",Yae="↣",Gae="↝",Kae="⤚",Zae="⤜",Xae="∶",Jae="ℚ",Qae="⤍",eie="⤏",tie="⤐",nie="❳",rie="}",oie="]",sie="⦌",aie="⦎",iie="⦐",lie="Ř",cie="ř",uie="Ŗ",die="ŗ",fie="⌉",pie="}",hie="Р",mie="р",gie="⤷",vie="⥩",yie="”",bie="”",_ie="↳",xie="ℜ",wie="ℛ",kie="ℜ",Cie="ℝ",Sie="ℜ",Eie="▭",Aie="®",Die="®",Tie="∋",Oie="⇋",Mie="⥯",Rie="⥽",Pie="⌋",$ie="𝔯",Fie="ℜ",Iie="⥤",Lie="⇁",Nie="⇀",zie="⥬",Bie="Ρ",qie="ρ",Vie="ϱ",jie="⟩",Hie="⇥",Uie="→",Wie="→",Yie="⇒",Gie="⇄",Kie="↣",Zie="⌉",Xie="⟧",Jie="⥝",Qie="⥕",ele="⇂",tle="⌋",nle="⇁",rle="⇀",ole="⇄",sle="⇌",ale="⇉",ile="↝",lle="↦",cle="⊢",ule="⥛",dle="⋌",fle="⧐",ple="⊳",hle="⊵",mle="⥏",gle="⥜",vle="⥔",yle="↾",ble="⥓",_le="⇀",xle="˚",wle="≓",kle="⇄",Cle="⇌",Sle="‏",Ele="⎱",Ale="⎱",Dle="⫮",Tle="⟭",Ole="⇾",Mle="⟧",Rle="⦆",Ple="𝕣",$le="ℝ",Fle="⨮",Ile="⨵",Lle="⥰",Nle=")",zle="⦔",Ble="⨒",qle="⇉",Vle="⇛",jle="›",Hle="𝓇",Ule="ℛ",Wle="↱",Yle="↱",Gle="]",Kle="’",Zle="’",Xle="⋌",Jle="⋊",Qle="▹",ece="⊵",tce="▸",nce="⧎",rce="⧴",oce="⥨",sce="℞",ace="Ś",ice="ś",lce="‚",cce="⪸",uce="Š",dce="š",fce="⪼",pce="≻",hce="≽",mce="⪰",gce="⪴",vce="Ş",yce="ş",bce="Ŝ",_ce="ŝ",xce="⪺",wce="⪶",kce="⋩",Cce="⨓",Sce="≿",Ece="С",Ace="с",Dce="⊡",Tce="⋅",Oce="⩦",Mce="⤥",Rce="↘",Pce="⇘",$ce="↘",Fce="§",Ice=";",Lce="⤩",Nce="∖",zce="∖",Bce="✶",qce="𝔖",Vce="𝔰",jce="⌢",Hce="♯",Uce="Щ",Wce="щ",Yce="Ш",Gce="ш",Kce="↓",Zce="←",Xce="∣",Jce="∥",Qce="→",eue="↑",tue="­",nue="Σ",rue="σ",oue="ς",sue="ς",aue="∼",iue="⩪",lue="≃",cue="≃",uue="⪞",due="⪠",fue="⪝",pue="⪟",hue="≆",mue="⨤",gue="⥲",vue="←",yue="∘",bue="∖",_ue="⨳",xue="⧤",wue="∣",kue="⌣",Cue="⪪",Sue="⪬",Eue="⪬︀",Aue="Ь",Due="ь",Tue="⌿",Oue="⧄",Mue="/",Rue="𝕊",Pue="𝕤",$ue="♠",Fue="♠",Iue="∥",Lue="⊓",Nue="⊓︀",zue="⊔",Bue="⊔︀",que="√",Vue="⊏",jue="⊑",Hue="⊏",Uue="⊑",Wue="⊐",Yue="⊒",Gue="⊐",Kue="⊒",Zue="□",Xue="□",Jue="⊓",Que="⊏",ede="⊑",tde="⊐",nde="⊒",rde="⊔",ode="▪",sde="□",ade="▪",ide="→",lde="𝒮",cde="𝓈",ude="∖",dde="⌣",fde="⋆",pde="⋆",hde="☆",mde="★",gde="ϵ",vde="ϕ",yde="¯",bde="⊂",_de="⋐",xde="⪽",wde="⫅",kde="⊆",Cde="⫃",Sde="⫁",Ede="⫋",Ade="⊊",Dde="⪿",Tde="⥹",Ode="⊂",Mde="⋐",Rde="⊆",Pde="⫅",$de="⊆",Fde="⊊",Ide="⫋",Lde="⫇",Nde="⫕",zde="⫓",Bde="⪸",qde="≻",Vde="≽",jde="≻",Hde="⪰",Ude="≽",Wde="≿",Yde="⪰",Gde="⪺",Kde="⪶",Zde="⋩",Xde="≿",Jde="∋",Qde="∑",efe="∑",tfe="♪",nfe="¹",rfe="²",ofe="³",sfe="⊃",afe="⋑",ife="⪾",lfe="⫘",cfe="⫆",ufe="⊇",dfe="⫄",ffe="⊃",pfe="⊇",hfe="⟉",mfe="⫗",gfe="⥻",vfe="⫂",yfe="⫌",bfe="⊋",_fe="⫀",xfe="⊃",wfe="⋑",kfe="⊇",Cfe="⫆",Sfe="⊋",Efe="⫌",Afe="⫈",Dfe="⫔",Tfe="⫖",Ofe="⤦",Mfe="↙",Rfe="⇙",Pfe="↙",$fe="⤪",Ffe="ß",Ife=" ",Lfe="⌖",Nfe="Τ",zfe="τ",Bfe="⎴",qfe="Ť",Vfe="ť",jfe="Ţ",Hfe="ţ",Ufe="Т",Wfe="т",Yfe="⃛",Gfe="⌕",Kfe="𝔗",Zfe="𝔱",Xfe="∴",Jfe="∴",Qfe="∴",epe="Θ",tpe="θ",npe="ϑ",rpe="ϑ",ope="≈",spe="∼",ape="  ",ipe=" ",lpe=" ",cpe="≈",upe="∼",dpe="Þ",fpe="þ",ppe="˜",hpe="∼",mpe="≃",gpe="≅",vpe="≈",ype="⨱",bpe="⊠",_pe="×",xpe="⨰",wpe="∭",kpe="⤨",Cpe="⌶",Spe="⫱",Epe="⊤",Ape="𝕋",Dpe="𝕥",Tpe="⫚",Ope="⤩",Mpe="‴",Rpe="™",Ppe="™",$pe="▵",Fpe="▿",Ipe="◃",Lpe="⊴",Npe="≜",zpe="▹",Bpe="⊵",qpe="◬",Vpe="≜",jpe="⨺",Hpe="⃛",Upe="⨹",Wpe="⧍",Ype="⨻",Gpe="⏢",Kpe="𝒯",Zpe="𝓉",Xpe="Ц",Jpe="ц",Qpe="Ћ",ehe="ћ",the="Ŧ",nhe="ŧ",rhe="≬",ohe="↞",she="↠",ahe="Ú",ihe="ú",lhe="↑",che="↟",uhe="⇑",dhe="⥉",fhe="Ў",phe="ў",hhe="Ŭ",mhe="ŭ",ghe="Û",vhe="û",yhe="У",bhe="у",_he="⇅",xhe="Ű",whe="ű",khe="⥮",Che="⥾",She="𝔘",Ehe="𝔲",Ahe="Ù",Dhe="ù",The="⥣",Ohe="↿",Mhe="↾",Rhe="▀",Phe="⌜",$he="⌜",Fhe="⌏",Ihe="◸",Lhe="Ū",Nhe="ū",zhe="¨",Bhe="_",qhe="⏟",Vhe="⎵",jhe="⏝",Hhe="⋃",Uhe="⊎",Whe="Ų",Yhe="ų",Ghe="𝕌",Khe="𝕦",Zhe="⤒",Xhe="↑",Jhe="↑",Qhe="⇑",eme="⇅",tme="↕",nme="↕",rme="⇕",ome="⥮",sme="↿",ame="↾",ime="⊎",lme="↖",cme="↗",ume="υ",dme="ϒ",fme="ϒ",pme="Υ",hme="υ",mme="↥",gme="⊥",vme="⇈",yme="⌝",bme="⌝",_me="⌎",xme="Ů",wme="ů",kme="◹",Cme="𝒰",Sme="𝓊",Eme="⋰",Ame="Ũ",Dme="ũ",Tme="▵",Ome="▴",Mme="⇈",Rme="Ü",Pme="ü",$me="⦧",Fme="⦜",Ime="ϵ",Lme="ϰ",Nme="∅",zme="ϕ",Bme="ϖ",qme="∝",Vme="↕",jme="⇕",Hme="ϱ",Ume="ς",Wme="⊊︀",Yme="⫋︀",Gme="⊋︀",Kme="⫌︀",Zme="ϑ",Xme="⊲",Jme="⊳",Qme="⫨",ege="⫫",tge="⫩",nge="В",rge="в",oge="⊢",sge="⊨",age="⊩",ige="⊫",lge="⫦",cge="⊻",uge="∨",dge="⋁",fge="≚",pge="⋮",hge="|",mge="‖",gge="|",vge="‖",yge="∣",bge="|",_ge="❘",xge="≀",wge=" ",kge="𝔙",Cge="𝔳",Sge="⊲",Ege="⊂⃒",Age="⊃⃒",Dge="𝕍",Tge="𝕧",Oge="∝",Mge="⊳",Rge="𝒱",Pge="𝓋",$ge="⫋︀",Fge="⊊︀",Ige="⫌︀",Lge="⊋︀",Nge="⊪",zge="⦚",Bge="Ŵ",qge="ŵ",Vge="⩟",jge="∧",Hge="⋀",Uge="≙",Wge="℘",Yge="𝔚",Gge="𝔴",Kge="𝕎",Zge="𝕨",Xge="℘",Jge="≀",Qge="≀",eve="𝒲",tve="𝓌",nve="⋂",rve="◯",ove="⋃",sve="▽",ave="𝔛",ive="𝔵",lve="⟷",cve="⟺",uve="Ξ",dve="ξ",fve="⟵",pve="⟸",hve="⟼",mve="⋻",gve="⨀",vve="𝕏",yve="𝕩",bve="⨁",_ve="⨂",xve="⟶",wve="⟹",kve="𝒳",Cve="𝓍",Sve="⨆",Eve="⨄",Ave="△",Dve="⋁",Tve="⋀",Ove="Ý",Mve="ý",Rve="Я",Pve="я",$ve="Ŷ",Fve="ŷ",Ive="Ы",Lve="ы",Nve="¥",zve="𝔜",Bve="𝔶",qve="Ї",Vve="ї",jve="𝕐",Hve="𝕪",Uve="𝒴",Wve="𝓎",Yve="Ю",Gve="ю",Kve="ÿ",Zve="Ÿ",Xve="Ź",Jve="ź",Qve="Ž",e0e="ž",t0e="З",n0e="з",r0e="Ż",o0e="ż",s0e="ℨ",a0e="​",i0e="Ζ",l0e="ζ",c0e="𝔷",u0e="ℨ",d0e="Ж",f0e="ж",p0e="⇝",h0e="𝕫",m0e="ℤ",g0e="𝒵",v0e="𝓏",y0e="‍",b0e="‌",_0e={Aacute:r$,aacute:o$,Abreve:s$,abreve:a$,ac:i$,acd:l$,acE:c$,Acirc:u$,acirc:d$,acute:f$,Acy:p$,acy:h$,AElig:m$,aelig:g$,af:v$,Afr:y$,afr:b$,Agrave:_$,agrave:x$,alefsym:w$,aleph:k$,Alpha:C$,alpha:S$,Amacr:E$,amacr:A$,amalg:D$,amp:T$,AMP:O$,andand:M$,And:R$,and:P$,andd:$$,andslope:F$,andv:I$,ang:L$,ange:N$,angle:z$,angmsdaa:B$,angmsdab:q$,angmsdac:V$,angmsdad:j$,angmsdae:H$,angmsdaf:U$,angmsdag:W$,angmsdah:Y$,angmsd:G$,angrt:K$,angrtvb:Z$,angrtvbd:X$,angsph:J$,angst:Q$,angzarr:eF,Aogon:tF,aogon:nF,Aopf:rF,aopf:oF,apacir:sF,ap:aF,apE:iF,ape:lF,apid:cF,apos:uF,ApplyFunction:dF,approx:fF,approxeq:pF,Aring:hF,aring:mF,Ascr:gF,ascr:vF,Assign:yF,ast:bF,asymp:_F,asympeq:xF,Atilde:wF,atilde:kF,Auml:CF,auml:SF,awconint:EF,awint:AF,backcong:DF,backepsilon:TF,backprime:OF,backsim:MF,backsimeq:RF,Backslash:PF,Barv:$F,barvee:FF,barwed:IF,Barwed:LF,barwedge:NF,bbrk:zF,bbrktbrk:BF,bcong:qF,Bcy:VF,bcy:jF,bdquo:HF,becaus:UF,because:WF,Because:YF,bemptyv:GF,bepsi:KF,bernou:ZF,Bernoullis:XF,Beta:JF,beta:QF,beth:eI,between:tI,Bfr:nI,bfr:rI,bigcap:oI,bigcirc:sI,bigcup:aI,bigodot:iI,bigoplus:lI,bigotimes:cI,bigsqcup:uI,bigstar:dI,bigtriangledown:fI,bigtriangleup:pI,biguplus:hI,bigvee:mI,bigwedge:gI,bkarow:vI,blacklozenge:yI,blacksquare:bI,blacktriangle:_I,blacktriangledown:xI,blacktriangleleft:wI,blacktriangleright:kI,blank:CI,blk12:SI,blk14:EI,blk34:AI,block:DI,bne:TI,bnequiv:OI,bNot:MI,bnot:RI,Bopf:PI,bopf:$I,bot:FI,bottom:II,bowtie:LI,boxbox:NI,boxdl:zI,boxdL:BI,boxDl:qI,boxDL:VI,boxdr:jI,boxdR:HI,boxDr:UI,boxDR:WI,boxh:YI,boxH:GI,boxhd:KI,boxHd:ZI,boxhD:XI,boxHD:JI,boxhu:QI,boxHu:eL,boxhU:tL,boxHU:nL,boxminus:rL,boxplus:oL,boxtimes:sL,boxul:aL,boxuL:iL,boxUl:lL,boxUL:cL,boxur:uL,boxuR:dL,boxUr:fL,boxUR:pL,boxv:hL,boxV:mL,boxvh:gL,boxvH:vL,boxVh:yL,boxVH:bL,boxvl:_L,boxvL:xL,boxVl:wL,boxVL:kL,boxvr:CL,boxvR:SL,boxVr:EL,boxVR:AL,bprime:DL,breve:TL,Breve:OL,brvbar:ML,bscr:RL,Bscr:PL,bsemi:$L,bsim:FL,bsime:IL,bsolb:LL,bsol:NL,bsolhsub:zL,bull:BL,bullet:qL,bump:VL,bumpE:jL,bumpe:HL,Bumpeq:UL,bumpeq:WL,Cacute:YL,cacute:GL,capand:KL,capbrcup:ZL,capcap:XL,cap:JL,Cap:QL,capcup:e7,capdot:t7,CapitalDifferentialD:n7,caps:r7,caret:o7,caron:s7,Cayleys:a7,ccaps:i7,Ccaron:l7,ccaron:c7,Ccedil:u7,ccedil:d7,Ccirc:f7,ccirc:p7,Cconint:h7,ccups:m7,ccupssm:g7,Cdot:v7,cdot:y7,cedil:b7,Cedilla:_7,cemptyv:x7,cent:w7,centerdot:k7,CenterDot:C7,cfr:S7,Cfr:E7,CHcy:A7,chcy:D7,check:T7,checkmark:O7,Chi:M7,chi:R7,circ:P7,circeq:$7,circlearrowleft:F7,circlearrowright:I7,circledast:L7,circledcirc:N7,circleddash:z7,CircleDot:B7,circledR:q7,circledS:V7,CircleMinus:j7,CirclePlus:H7,CircleTimes:U7,cir:W7,cirE:Y7,cire:G7,cirfnint:K7,cirmid:Z7,cirscir:X7,ClockwiseContourIntegral:J7,CloseCurlyDoubleQuote:Q7,CloseCurlyQuote:eN,clubs:tN,clubsuit:nN,colon:rN,Colon:oN,Colone:sN,colone:aN,coloneq:iN,comma:lN,commat:cN,comp:uN,compfn:dN,complement:fN,complexes:pN,cong:hN,congdot:mN,Congruent:gN,conint:vN,Conint:yN,ContourIntegral:bN,copf:_N,Copf:xN,coprod:wN,Coproduct:kN,copy:CN,COPY:SN,copysr:EN,CounterClockwiseContourIntegral:AN,crarr:DN,cross:TN,Cross:ON,Cscr:MN,cscr:RN,csub:PN,csube:$N,csup:FN,csupe:IN,ctdot:LN,cudarrl:NN,cudarrr:zN,cuepr:BN,cuesc:qN,cularr:VN,cularrp:jN,cupbrcap:HN,cupcap:UN,CupCap:WN,cup:YN,Cup:GN,cupcup:KN,cupdot:ZN,cupor:XN,cups:JN,curarr:QN,curarrm:ez,curlyeqprec:tz,curlyeqsucc:nz,curlyvee:rz,curlywedge:oz,curren:sz,curvearrowleft:az,curvearrowright:iz,cuvee:lz,cuwed:cz,cwconint:uz,cwint:dz,cylcty:fz,dagger:pz,Dagger:hz,daleth:mz,darr:gz,Darr:vz,dArr:yz,dash:bz,Dashv:_z,dashv:xz,dbkarow:wz,dblac:kz,Dcaron:Cz,dcaron:Sz,Dcy:Ez,dcy:Az,ddagger:Dz,ddarr:Tz,DD:Oz,dd:Mz,DDotrahd:Rz,ddotseq:Pz,deg:$z,Del:Fz,Delta:Iz,delta:Lz,demptyv:Nz,dfisht:zz,Dfr:Bz,dfr:qz,dHar:Vz,dharl:jz,dharr:Hz,DiacriticalAcute:Uz,DiacriticalDot:Wz,DiacriticalDoubleAcute:Yz,DiacriticalGrave:Gz,DiacriticalTilde:Kz,diam:Zz,diamond:Xz,Diamond:Jz,diamondsuit:Qz,diams:eB,die:tB,DifferentialD:nB,digamma:rB,disin:oB,div:sB,divide:aB,divideontimes:iB,divonx:lB,DJcy:cB,djcy:uB,dlcorn:dB,dlcrop:fB,dollar:pB,Dopf:hB,dopf:mB,Dot:gB,dot:vB,DotDot:yB,doteq:bB,doteqdot:_B,DotEqual:xB,dotminus:wB,dotplus:kB,dotsquare:CB,doublebarwedge:SB,DoubleContourIntegral:EB,DoubleDot:AB,DoubleDownArrow:DB,DoubleLeftArrow:TB,DoubleLeftRightArrow:OB,DoubleLeftTee:MB,DoubleLongLeftArrow:RB,DoubleLongLeftRightArrow:PB,DoubleLongRightArrow:$B,DoubleRightArrow:FB,DoubleRightTee:IB,DoubleUpArrow:LB,DoubleUpDownArrow:NB,DoubleVerticalBar:zB,DownArrowBar:BB,downarrow:qB,DownArrow:VB,Downarrow:jB,DownArrowUpArrow:HB,DownBreve:UB,downdownarrows:WB,downharpoonleft:YB,downharpoonright:GB,DownLeftRightVector:KB,DownLeftTeeVector:ZB,DownLeftVectorBar:XB,DownLeftVector:JB,DownRightTeeVector:QB,DownRightVectorBar:eq,DownRightVector:tq,DownTeeArrow:nq,DownTee:rq,drbkarow:oq,drcorn:sq,drcrop:aq,Dscr:iq,dscr:lq,DScy:cq,dscy:uq,dsol:dq,Dstrok:fq,dstrok:pq,dtdot:hq,dtri:mq,dtrif:gq,duarr:vq,duhar:yq,dwangle:bq,DZcy:_q,dzcy:xq,dzigrarr:wq,Eacute:kq,eacute:Cq,easter:Sq,Ecaron:Eq,ecaron:Aq,Ecirc:Dq,ecirc:Tq,ecir:Oq,ecolon:Mq,Ecy:Rq,ecy:Pq,eDDot:$q,Edot:Fq,edot:Iq,eDot:Lq,ee:Nq,efDot:zq,Efr:Bq,efr:qq,eg:Vq,Egrave:jq,egrave:Hq,egs:Uq,egsdot:Wq,el:Yq,Element:Gq,elinters:Kq,ell:Zq,els:Xq,elsdot:Jq,Emacr:Qq,emacr:eV,empty:tV,emptyset:nV,EmptySmallSquare:rV,emptyv:oV,EmptyVerySmallSquare:sV,emsp13:aV,emsp14:iV,emsp:lV,ENG:cV,eng:uV,ensp:dV,Eogon:fV,eogon:pV,Eopf:hV,eopf:mV,epar:gV,eparsl:vV,eplus:yV,epsi:bV,Epsilon:_V,epsilon:xV,epsiv:wV,eqcirc:kV,eqcolon:CV,eqsim:SV,eqslantgtr:EV,eqslantless:AV,Equal:DV,equals:TV,EqualTilde:OV,equest:MV,Equilibrium:RV,equiv:PV,equivDD:$V,eqvparsl:FV,erarr:IV,erDot:LV,escr:NV,Escr:zV,esdot:BV,Esim:qV,esim:VV,Eta:jV,eta:HV,ETH:UV,eth:WV,Euml:YV,euml:GV,euro:KV,excl:ZV,exist:XV,Exists:JV,expectation:QV,exponentiale:ej,ExponentialE:tj,fallingdotseq:nj,Fcy:rj,fcy:oj,female:sj,ffilig:aj,fflig:ij,ffllig:lj,Ffr:cj,ffr:uj,filig:dj,FilledSmallSquare:fj,FilledVerySmallSquare:pj,fjlig:hj,flat:mj,fllig:gj,fltns:vj,fnof:yj,Fopf:bj,fopf:_j,forall:xj,ForAll:wj,fork:kj,forkv:Cj,Fouriertrf:Sj,fpartint:Ej,frac12:Aj,frac13:Dj,frac14:Tj,frac15:Oj,frac16:Mj,frac18:Rj,frac23:Pj,frac25:$j,frac34:Fj,frac35:Ij,frac38:Lj,frac45:Nj,frac56:zj,frac58:Bj,frac78:qj,frasl:Vj,frown:jj,fscr:Hj,Fscr:Uj,gacute:Wj,Gamma:Yj,gamma:Gj,Gammad:Kj,gammad:Zj,gap:Xj,Gbreve:Jj,gbreve:Qj,Gcedil:eH,Gcirc:tH,gcirc:nH,Gcy:rH,gcy:oH,Gdot:sH,gdot:aH,ge:iH,gE:lH,gEl:cH,gel:uH,geq:dH,geqq:fH,geqslant:pH,gescc:hH,ges:mH,gesdot:gH,gesdoto:vH,gesdotol:yH,gesl:bH,gesles:_H,Gfr:xH,gfr:wH,gg:kH,Gg:CH,ggg:SH,gimel:EH,GJcy:AH,gjcy:DH,gla:TH,gl:OH,glE:MH,glj:RH,gnap:PH,gnapprox:$H,gne:FH,gnE:IH,gneq:LH,gneqq:NH,gnsim:zH,Gopf:BH,gopf:qH,grave:VH,GreaterEqual:jH,GreaterEqualLess:HH,GreaterFullEqual:UH,GreaterGreater:WH,GreaterLess:YH,GreaterSlantEqual:GH,GreaterTilde:KH,Gscr:ZH,gscr:XH,gsim:JH,gsime:QH,gsiml:eU,gtcc:tU,gtcir:nU,gt:rU,GT:oU,Gt:sU,gtdot:aU,gtlPar:iU,gtquest:lU,gtrapprox:cU,gtrarr:uU,gtrdot:dU,gtreqless:fU,gtreqqless:pU,gtrless:hU,gtrsim:mU,gvertneqq:gU,gvnE:vU,Hacek:yU,hairsp:bU,half:_U,hamilt:xU,HARDcy:wU,hardcy:kU,harrcir:CU,harr:SU,hArr:EU,harrw:AU,Hat:DU,hbar:TU,Hcirc:OU,hcirc:MU,hearts:RU,heartsuit:PU,hellip:$U,hercon:FU,hfr:IU,Hfr:LU,HilbertSpace:NU,hksearow:zU,hkswarow:BU,hoarr:qU,homtht:VU,hookleftarrow:jU,hookrightarrow:HU,hopf:UU,Hopf:WU,horbar:YU,HorizontalLine:GU,hscr:KU,Hscr:ZU,hslash:XU,Hstrok:JU,hstrok:QU,HumpDownHump:eW,HumpEqual:tW,hybull:nW,hyphen:rW,Iacute:oW,iacute:sW,ic:aW,Icirc:iW,icirc:lW,Icy:cW,icy:uW,Idot:dW,IEcy:fW,iecy:pW,iexcl:hW,iff:mW,ifr:gW,Ifr:vW,Igrave:yW,igrave:bW,ii:_W,iiiint:xW,iiint:wW,iinfin:kW,iiota:CW,IJlig:SW,ijlig:EW,Imacr:AW,imacr:DW,image:TW,ImaginaryI:OW,imagline:MW,imagpart:RW,imath:PW,Im:$W,imof:FW,imped:IW,Implies:LW,incare:NW,in:"∈",infin:zW,infintie:BW,inodot:qW,intcal:VW,int:jW,Int:HW,integers:UW,Integral:WW,intercal:YW,Intersection:GW,intlarhk:KW,intprod:ZW,InvisibleComma:XW,InvisibleTimes:JW,IOcy:QW,iocy:eY,Iogon:tY,iogon:nY,Iopf:rY,iopf:oY,Iota:sY,iota:aY,iprod:iY,iquest:lY,iscr:cY,Iscr:uY,isin:dY,isindot:fY,isinE:pY,isins:hY,isinsv:mY,isinv:gY,it:vY,Itilde:yY,itilde:bY,Iukcy:_Y,iukcy:xY,Iuml:wY,iuml:kY,Jcirc:CY,jcirc:SY,Jcy:EY,jcy:AY,Jfr:DY,jfr:TY,jmath:OY,Jopf:MY,jopf:RY,Jscr:PY,jscr:$Y,Jsercy:FY,jsercy:IY,Jukcy:LY,jukcy:NY,Kappa:zY,kappa:BY,kappav:qY,Kcedil:VY,kcedil:jY,Kcy:HY,kcy:UY,Kfr:WY,kfr:YY,kgreen:GY,KHcy:KY,khcy:ZY,KJcy:XY,kjcy:JY,Kopf:QY,kopf:eG,Kscr:tG,kscr:nG,lAarr:rG,Lacute:oG,lacute:sG,laemptyv:aG,lagran:iG,Lambda:lG,lambda:cG,lang:uG,Lang:dG,langd:fG,langle:pG,lap:hG,Laplacetrf:mG,laquo:gG,larrb:vG,larrbfs:yG,larr:bG,Larr:_G,lArr:xG,larrfs:wG,larrhk:kG,larrlp:CG,larrpl:SG,larrsim:EG,larrtl:AG,latail:DG,lAtail:TG,lat:OG,late:MG,lates:RG,lbarr:PG,lBarr:$G,lbbrk:FG,lbrace:IG,lbrack:LG,lbrke:NG,lbrksld:zG,lbrkslu:BG,Lcaron:qG,lcaron:VG,Lcedil:jG,lcedil:HG,lceil:UG,lcub:WG,Lcy:YG,lcy:GG,ldca:KG,ldquo:ZG,ldquor:XG,ldrdhar:JG,ldrushar:QG,ldsh:eK,le:tK,lE:nK,LeftAngleBracket:rK,LeftArrowBar:oK,leftarrow:sK,LeftArrow:aK,Leftarrow:iK,LeftArrowRightArrow:lK,leftarrowtail:cK,LeftCeiling:uK,LeftDoubleBracket:dK,LeftDownTeeVector:fK,LeftDownVectorBar:pK,LeftDownVector:hK,LeftFloor:mK,leftharpoondown:gK,leftharpoonup:vK,leftleftarrows:yK,leftrightarrow:bK,LeftRightArrow:_K,Leftrightarrow:xK,leftrightarrows:wK,leftrightharpoons:kK,leftrightsquigarrow:CK,LeftRightVector:SK,LeftTeeArrow:EK,LeftTee:AK,LeftTeeVector:DK,leftthreetimes:TK,LeftTriangleBar:OK,LeftTriangle:MK,LeftTriangleEqual:RK,LeftUpDownVector:PK,LeftUpTeeVector:$K,LeftUpVectorBar:FK,LeftUpVector:IK,LeftVectorBar:LK,LeftVector:NK,lEg:zK,leg:BK,leq:qK,leqq:VK,leqslant:jK,lescc:HK,les:UK,lesdot:WK,lesdoto:YK,lesdotor:GK,lesg:KK,lesges:ZK,lessapprox:XK,lessdot:JK,lesseqgtr:QK,lesseqqgtr:eZ,LessEqualGreater:tZ,LessFullEqual:nZ,LessGreater:rZ,lessgtr:oZ,LessLess:sZ,lesssim:aZ,LessSlantEqual:iZ,LessTilde:lZ,lfisht:cZ,lfloor:uZ,Lfr:dZ,lfr:fZ,lg:pZ,lgE:hZ,lHar:mZ,lhard:gZ,lharu:vZ,lharul:yZ,lhblk:bZ,LJcy:_Z,ljcy:xZ,llarr:wZ,ll:kZ,Ll:CZ,llcorner:SZ,Lleftarrow:EZ,llhard:AZ,lltri:DZ,Lmidot:TZ,lmidot:OZ,lmoustache:MZ,lmoust:RZ,lnap:PZ,lnapprox:$Z,lne:FZ,lnE:IZ,lneq:LZ,lneqq:NZ,lnsim:zZ,loang:BZ,loarr:qZ,lobrk:VZ,longleftarrow:jZ,LongLeftArrow:HZ,Longleftarrow:UZ,longleftrightarrow:WZ,LongLeftRightArrow:YZ,Longleftrightarrow:GZ,longmapsto:KZ,longrightarrow:ZZ,LongRightArrow:XZ,Longrightarrow:JZ,looparrowleft:QZ,looparrowright:eX,lopar:tX,Lopf:nX,lopf:rX,loplus:oX,lotimes:sX,lowast:aX,lowbar:iX,LowerLeftArrow:lX,LowerRightArrow:cX,loz:uX,lozenge:dX,lozf:fX,lpar:pX,lparlt:hX,lrarr:mX,lrcorner:gX,lrhar:vX,lrhard:yX,lrm:bX,lrtri:_X,lsaquo:xX,lscr:wX,Lscr:kX,lsh:CX,Lsh:SX,lsim:EX,lsime:AX,lsimg:DX,lsqb:TX,lsquo:OX,lsquor:MX,Lstrok:RX,lstrok:PX,ltcc:$X,ltcir:FX,lt:IX,LT:LX,Lt:NX,ltdot:zX,lthree:BX,ltimes:qX,ltlarr:VX,ltquest:jX,ltri:HX,ltrie:UX,ltrif:WX,ltrPar:YX,lurdshar:GX,luruhar:KX,lvertneqq:ZX,lvnE:XX,macr:JX,male:QX,malt:eJ,maltese:tJ,Map:"⤅",map:nJ,mapsto:rJ,mapstodown:oJ,mapstoleft:sJ,mapstoup:aJ,marker:iJ,mcomma:lJ,Mcy:cJ,mcy:uJ,mdash:dJ,mDDot:fJ,measuredangle:pJ,MediumSpace:hJ,Mellintrf:mJ,Mfr:gJ,mfr:vJ,mho:yJ,micro:bJ,midast:_J,midcir:xJ,mid:wJ,middot:kJ,minusb:CJ,minus:SJ,minusd:EJ,minusdu:AJ,MinusPlus:DJ,mlcp:TJ,mldr:OJ,mnplus:MJ,models:RJ,Mopf:PJ,mopf:$J,mp:FJ,mscr:IJ,Mscr:LJ,mstpos:NJ,Mu:zJ,mu:BJ,multimap:qJ,mumap:VJ,nabla:jJ,Nacute:HJ,nacute:UJ,nang:WJ,nap:YJ,napE:GJ,napid:KJ,napos:ZJ,napprox:XJ,natural:JJ,naturals:QJ,natur:eQ,nbsp:tQ,nbump:nQ,nbumpe:rQ,ncap:oQ,Ncaron:sQ,ncaron:aQ,Ncedil:iQ,ncedil:lQ,ncong:cQ,ncongdot:uQ,ncup:dQ,Ncy:fQ,ncy:pQ,ndash:hQ,nearhk:mQ,nearr:gQ,neArr:vQ,nearrow:yQ,ne:bQ,nedot:_Q,NegativeMediumSpace:xQ,NegativeThickSpace:wQ,NegativeThinSpace:kQ,NegativeVeryThinSpace:CQ,nequiv:SQ,nesear:EQ,nesim:AQ,NestedGreaterGreater:DQ,NestedLessLess:TQ,NewLine:OQ,nexist:MQ,nexists:RQ,Nfr:PQ,nfr:$Q,ngE:FQ,nge:IQ,ngeq:LQ,ngeqq:NQ,ngeqslant:zQ,nges:BQ,nGg:qQ,ngsim:VQ,nGt:jQ,ngt:HQ,ngtr:UQ,nGtv:WQ,nharr:YQ,nhArr:GQ,nhpar:KQ,ni:ZQ,nis:XQ,nisd:JQ,niv:QQ,NJcy:eee,njcy:tee,nlarr:nee,nlArr:ree,nldr:oee,nlE:see,nle:aee,nleftarrow:iee,nLeftarrow:lee,nleftrightarrow:cee,nLeftrightarrow:uee,nleq:dee,nleqq:fee,nleqslant:pee,nles:hee,nless:mee,nLl:gee,nlsim:vee,nLt:yee,nlt:bee,nltri:_ee,nltrie:xee,nLtv:wee,nmid:kee,NoBreak:Cee,NonBreakingSpace:See,nopf:Eee,Nopf:Aee,Not:Dee,not:Tee,NotCongruent:Oee,NotCupCap:Mee,NotDoubleVerticalBar:Ree,NotElement:Pee,NotEqual:$ee,NotEqualTilde:Fee,NotExists:Iee,NotGreater:Lee,NotGreaterEqual:Nee,NotGreaterFullEqual:zee,NotGreaterGreater:Bee,NotGreaterLess:qee,NotGreaterSlantEqual:Vee,NotGreaterTilde:jee,NotHumpDownHump:Hee,NotHumpEqual:Uee,notin:Wee,notindot:Yee,notinE:Gee,notinva:Kee,notinvb:Zee,notinvc:Xee,NotLeftTriangleBar:Jee,NotLeftTriangle:Qee,NotLeftTriangleEqual:ete,NotLess:tte,NotLessEqual:nte,NotLessGreater:rte,NotLessLess:ote,NotLessSlantEqual:ste,NotLessTilde:ate,NotNestedGreaterGreater:ite,NotNestedLessLess:lte,notni:cte,notniva:ute,notnivb:dte,notnivc:fte,NotPrecedes:pte,NotPrecedesEqual:hte,NotPrecedesSlantEqual:mte,NotReverseElement:gte,NotRightTriangleBar:vte,NotRightTriangle:yte,NotRightTriangleEqual:bte,NotSquareSubset:_te,NotSquareSubsetEqual:xte,NotSquareSuperset:wte,NotSquareSupersetEqual:kte,NotSubset:Cte,NotSubsetEqual:Ste,NotSucceeds:Ete,NotSucceedsEqual:Ate,NotSucceedsSlantEqual:Dte,NotSucceedsTilde:Tte,NotSuperset:Ote,NotSupersetEqual:Mte,NotTilde:Rte,NotTildeEqual:Pte,NotTildeFullEqual:$te,NotTildeTilde:Fte,NotVerticalBar:Ite,nparallel:Lte,npar:Nte,nparsl:zte,npart:Bte,npolint:qte,npr:Vte,nprcue:jte,nprec:Hte,npreceq:Ute,npre:Wte,nrarrc:Yte,nrarr:Gte,nrArr:Kte,nrarrw:Zte,nrightarrow:Xte,nRightarrow:Jte,nrtri:Qte,nrtrie:ene,nsc:tne,nsccue:nne,nsce:rne,Nscr:one,nscr:sne,nshortmid:ane,nshortparallel:ine,nsim:lne,nsime:cne,nsimeq:une,nsmid:dne,nspar:fne,nsqsube:pne,nsqsupe:hne,nsub:mne,nsubE:gne,nsube:vne,nsubset:yne,nsubseteq:bne,nsubseteqq:_ne,nsucc:xne,nsucceq:wne,nsup:kne,nsupE:Cne,nsupe:Sne,nsupset:Ene,nsupseteq:Ane,nsupseteqq:Dne,ntgl:Tne,Ntilde:One,ntilde:Mne,ntlg:Rne,ntriangleleft:Pne,ntrianglelefteq:$ne,ntriangleright:Fne,ntrianglerighteq:Ine,Nu:Lne,nu:Nne,num:zne,numero:Bne,numsp:qne,nvap:Vne,nvdash:jne,nvDash:Hne,nVdash:Une,nVDash:Wne,nvge:Yne,nvgt:Gne,nvHarr:Kne,nvinfin:Zne,nvlArr:Xne,nvle:Jne,nvlt:Qne,nvltrie:ere,nvrArr:tre,nvrtrie:nre,nvsim:rre,nwarhk:ore,nwarr:sre,nwArr:are,nwarrow:ire,nwnear:lre,Oacute:cre,oacute:ure,oast:dre,Ocirc:fre,ocirc:pre,ocir:hre,Ocy:mre,ocy:gre,odash:vre,Odblac:yre,odblac:bre,odiv:_re,odot:xre,odsold:wre,OElig:kre,oelig:Cre,ofcir:Sre,Ofr:Ere,ofr:Are,ogon:Dre,Ograve:Tre,ograve:Ore,ogt:Mre,ohbar:Rre,ohm:Pre,oint:$re,olarr:Fre,olcir:Ire,olcross:Lre,oline:Nre,olt:zre,Omacr:Bre,omacr:qre,Omega:Vre,omega:jre,Omicron:Hre,omicron:Ure,omid:Wre,ominus:Yre,Oopf:Gre,oopf:Kre,opar:Zre,OpenCurlyDoubleQuote:Xre,OpenCurlyQuote:Jre,operp:Qre,oplus:eoe,orarr:toe,Or:noe,or:roe,ord:ooe,order:soe,orderof:aoe,ordf:ioe,ordm:loe,origof:coe,oror:uoe,orslope:doe,orv:foe,oS:poe,Oscr:hoe,oscr:moe,Oslash:goe,oslash:voe,osol:yoe,Otilde:boe,otilde:_oe,otimesas:xoe,Otimes:woe,otimes:koe,Ouml:Coe,ouml:Soe,ovbar:Eoe,OverBar:Aoe,OverBrace:Doe,OverBracket:Toe,OverParenthesis:Ooe,para:Moe,parallel:Roe,par:Poe,parsim:$oe,parsl:Foe,part:Ioe,PartialD:Loe,Pcy:Noe,pcy:zoe,percnt:Boe,period:qoe,permil:Voe,perp:joe,pertenk:Hoe,Pfr:Uoe,pfr:Woe,Phi:Yoe,phi:Goe,phiv:Koe,phmmat:Zoe,phone:Xoe,Pi:Joe,pi:Qoe,pitchfork:ese,piv:tse,planck:nse,planckh:rse,plankv:ose,plusacir:sse,plusb:ase,pluscir:ise,plus:lse,plusdo:cse,plusdu:use,pluse:dse,PlusMinus:fse,plusmn:pse,plussim:hse,plustwo:mse,pm:gse,Poincareplane:vse,pointint:yse,popf:bse,Popf:_se,pound:xse,prap:wse,Pr:kse,pr:Cse,prcue:Sse,precapprox:Ese,prec:Ase,preccurlyeq:Dse,Precedes:Tse,PrecedesEqual:Ose,PrecedesSlantEqual:Mse,PrecedesTilde:Rse,preceq:Pse,precnapprox:$se,precneqq:Fse,precnsim:Ise,pre:Lse,prE:Nse,precsim:zse,prime:Bse,Prime:qse,primes:Vse,prnap:jse,prnE:Hse,prnsim:Use,prod:Wse,Product:Yse,profalar:Gse,profline:Kse,profsurf:Zse,prop:Xse,Proportional:Jse,Proportion:Qse,propto:eae,prsim:tae,prurel:nae,Pscr:rae,pscr:oae,Psi:sae,psi:aae,puncsp:iae,Qfr:lae,qfr:cae,qint:uae,qopf:dae,Qopf:fae,qprime:pae,Qscr:hae,qscr:mae,quaternions:gae,quatint:vae,quest:yae,questeq:bae,quot:_ae,QUOT:xae,rAarr:wae,race:kae,Racute:Cae,racute:Sae,radic:Eae,raemptyv:Aae,rang:Dae,Rang:Tae,rangd:Oae,range:Mae,rangle:Rae,raquo:Pae,rarrap:$ae,rarrb:Fae,rarrbfs:Iae,rarrc:Lae,rarr:Nae,Rarr:zae,rArr:Bae,rarrfs:qae,rarrhk:Vae,rarrlp:jae,rarrpl:Hae,rarrsim:Uae,Rarrtl:Wae,rarrtl:Yae,rarrw:Gae,ratail:Kae,rAtail:Zae,ratio:Xae,rationals:Jae,rbarr:Qae,rBarr:eie,RBarr:tie,rbbrk:nie,rbrace:rie,rbrack:oie,rbrke:sie,rbrksld:aie,rbrkslu:iie,Rcaron:lie,rcaron:cie,Rcedil:uie,rcedil:die,rceil:fie,rcub:pie,Rcy:hie,rcy:mie,rdca:gie,rdldhar:vie,rdquo:yie,rdquor:bie,rdsh:_ie,real:xie,realine:wie,realpart:kie,reals:Cie,Re:Sie,rect:Eie,reg:Aie,REG:Die,ReverseElement:Tie,ReverseEquilibrium:Oie,ReverseUpEquilibrium:Mie,rfisht:Rie,rfloor:Pie,rfr:$ie,Rfr:Fie,rHar:Iie,rhard:Lie,rharu:Nie,rharul:zie,Rho:Bie,rho:qie,rhov:Vie,RightAngleBracket:jie,RightArrowBar:Hie,rightarrow:Uie,RightArrow:Wie,Rightarrow:Yie,RightArrowLeftArrow:Gie,rightarrowtail:Kie,RightCeiling:Zie,RightDoubleBracket:Xie,RightDownTeeVector:Jie,RightDownVectorBar:Qie,RightDownVector:ele,RightFloor:tle,rightharpoondown:nle,rightharpoonup:rle,rightleftarrows:ole,rightleftharpoons:sle,rightrightarrows:ale,rightsquigarrow:ile,RightTeeArrow:lle,RightTee:cle,RightTeeVector:ule,rightthreetimes:dle,RightTriangleBar:fle,RightTriangle:ple,RightTriangleEqual:hle,RightUpDownVector:mle,RightUpTeeVector:gle,RightUpVectorBar:vle,RightUpVector:yle,RightVectorBar:ble,RightVector:_le,ring:xle,risingdotseq:wle,rlarr:kle,rlhar:Cle,rlm:Sle,rmoustache:Ele,rmoust:Ale,rnmid:Dle,roang:Tle,roarr:Ole,robrk:Mle,ropar:Rle,ropf:Ple,Ropf:$le,roplus:Fle,rotimes:Ile,RoundImplies:Lle,rpar:Nle,rpargt:zle,rppolint:Ble,rrarr:qle,Rrightarrow:Vle,rsaquo:jle,rscr:Hle,Rscr:Ule,rsh:Wle,Rsh:Yle,rsqb:Gle,rsquo:Kle,rsquor:Zle,rthree:Xle,rtimes:Jle,rtri:Qle,rtrie:ece,rtrif:tce,rtriltri:nce,RuleDelayed:rce,ruluhar:oce,rx:sce,Sacute:ace,sacute:ice,sbquo:lce,scap:cce,Scaron:uce,scaron:dce,Sc:fce,sc:pce,sccue:hce,sce:mce,scE:gce,Scedil:vce,scedil:yce,Scirc:bce,scirc:_ce,scnap:xce,scnE:wce,scnsim:kce,scpolint:Cce,scsim:Sce,Scy:Ece,scy:Ace,sdotb:Dce,sdot:Tce,sdote:Oce,searhk:Mce,searr:Rce,seArr:Pce,searrow:$ce,sect:Fce,semi:Ice,seswar:Lce,setminus:Nce,setmn:zce,sext:Bce,Sfr:qce,sfr:Vce,sfrown:jce,sharp:Hce,SHCHcy:Uce,shchcy:Wce,SHcy:Yce,shcy:Gce,ShortDownArrow:Kce,ShortLeftArrow:Zce,shortmid:Xce,shortparallel:Jce,ShortRightArrow:Qce,ShortUpArrow:eue,shy:tue,Sigma:nue,sigma:rue,sigmaf:oue,sigmav:sue,sim:aue,simdot:iue,sime:lue,simeq:cue,simg:uue,simgE:due,siml:fue,simlE:pue,simne:hue,simplus:mue,simrarr:gue,slarr:vue,SmallCircle:yue,smallsetminus:bue,smashp:_ue,smeparsl:xue,smid:wue,smile:kue,smt:Cue,smte:Sue,smtes:Eue,SOFTcy:Aue,softcy:Due,solbar:Tue,solb:Oue,sol:Mue,Sopf:Rue,sopf:Pue,spades:$ue,spadesuit:Fue,spar:Iue,sqcap:Lue,sqcaps:Nue,sqcup:zue,sqcups:Bue,Sqrt:que,sqsub:Vue,sqsube:jue,sqsubset:Hue,sqsubseteq:Uue,sqsup:Wue,sqsupe:Yue,sqsupset:Gue,sqsupseteq:Kue,square:Zue,Square:Xue,SquareIntersection:Jue,SquareSubset:Que,SquareSubsetEqual:ede,SquareSuperset:tde,SquareSupersetEqual:nde,SquareUnion:rde,squarf:ode,squ:sde,squf:ade,srarr:ide,Sscr:lde,sscr:cde,ssetmn:ude,ssmile:dde,sstarf:fde,Star:pde,star:hde,starf:mde,straightepsilon:gde,straightphi:vde,strns:yde,sub:bde,Sub:_de,subdot:xde,subE:wde,sube:kde,subedot:Cde,submult:Sde,subnE:Ede,subne:Ade,subplus:Dde,subrarr:Tde,subset:Ode,Subset:Mde,subseteq:Rde,subseteqq:Pde,SubsetEqual:$de,subsetneq:Fde,subsetneqq:Ide,subsim:Lde,subsub:Nde,subsup:zde,succapprox:Bde,succ:qde,succcurlyeq:Vde,Succeeds:jde,SucceedsEqual:Hde,SucceedsSlantEqual:Ude,SucceedsTilde:Wde,succeq:Yde,succnapprox:Gde,succneqq:Kde,succnsim:Zde,succsim:Xde,SuchThat:Jde,sum:Qde,Sum:efe,sung:tfe,sup1:nfe,sup2:rfe,sup3:ofe,sup:sfe,Sup:afe,supdot:ife,supdsub:lfe,supE:cfe,supe:ufe,supedot:dfe,Superset:ffe,SupersetEqual:pfe,suphsol:hfe,suphsub:mfe,suplarr:gfe,supmult:vfe,supnE:yfe,supne:bfe,supplus:_fe,supset:xfe,Supset:wfe,supseteq:kfe,supseteqq:Cfe,supsetneq:Sfe,supsetneqq:Efe,supsim:Afe,supsub:Dfe,supsup:Tfe,swarhk:Ofe,swarr:Mfe,swArr:Rfe,swarrow:Pfe,swnwar:$fe,szlig:Ffe,Tab:Ife,target:Lfe,Tau:Nfe,tau:zfe,tbrk:Bfe,Tcaron:qfe,tcaron:Vfe,Tcedil:jfe,tcedil:Hfe,Tcy:Ufe,tcy:Wfe,tdot:Yfe,telrec:Gfe,Tfr:Kfe,tfr:Zfe,there4:Xfe,therefore:Jfe,Therefore:Qfe,Theta:epe,theta:tpe,thetasym:npe,thetav:rpe,thickapprox:ope,thicksim:spe,ThickSpace:ape,ThinSpace:ipe,thinsp:lpe,thkap:cpe,thksim:upe,THORN:dpe,thorn:fpe,tilde:ppe,Tilde:hpe,TildeEqual:mpe,TildeFullEqual:gpe,TildeTilde:vpe,timesbar:ype,timesb:bpe,times:_pe,timesd:xpe,tint:wpe,toea:kpe,topbot:Cpe,topcir:Spe,top:Epe,Topf:Ape,topf:Dpe,topfork:Tpe,tosa:Ope,tprime:Mpe,trade:Rpe,TRADE:Ppe,triangle:$pe,triangledown:Fpe,triangleleft:Ipe,trianglelefteq:Lpe,triangleq:Npe,triangleright:zpe,trianglerighteq:Bpe,tridot:qpe,trie:Vpe,triminus:jpe,TripleDot:Hpe,triplus:Upe,trisb:Wpe,tritime:Ype,trpezium:Gpe,Tscr:Kpe,tscr:Zpe,TScy:Xpe,tscy:Jpe,TSHcy:Qpe,tshcy:ehe,Tstrok:the,tstrok:nhe,twixt:rhe,twoheadleftarrow:ohe,twoheadrightarrow:she,Uacute:ahe,uacute:ihe,uarr:lhe,Uarr:che,uArr:uhe,Uarrocir:dhe,Ubrcy:fhe,ubrcy:phe,Ubreve:hhe,ubreve:mhe,Ucirc:ghe,ucirc:vhe,Ucy:yhe,ucy:bhe,udarr:_he,Udblac:xhe,udblac:whe,udhar:khe,ufisht:Che,Ufr:She,ufr:Ehe,Ugrave:Ahe,ugrave:Dhe,uHar:The,uharl:Ohe,uharr:Mhe,uhblk:Rhe,ulcorn:Phe,ulcorner:$he,ulcrop:Fhe,ultri:Ihe,Umacr:Lhe,umacr:Nhe,uml:zhe,UnderBar:Bhe,UnderBrace:qhe,UnderBracket:Vhe,UnderParenthesis:jhe,Union:Hhe,UnionPlus:Uhe,Uogon:Whe,uogon:Yhe,Uopf:Ghe,uopf:Khe,UpArrowBar:Zhe,uparrow:Xhe,UpArrow:Jhe,Uparrow:Qhe,UpArrowDownArrow:eme,updownarrow:tme,UpDownArrow:nme,Updownarrow:rme,UpEquilibrium:ome,upharpoonleft:sme,upharpoonright:ame,uplus:ime,UpperLeftArrow:lme,UpperRightArrow:cme,upsi:ume,Upsi:dme,upsih:fme,Upsilon:pme,upsilon:hme,UpTeeArrow:mme,UpTee:gme,upuparrows:vme,urcorn:yme,urcorner:bme,urcrop:_me,Uring:xme,uring:wme,urtri:kme,Uscr:Cme,uscr:Sme,utdot:Eme,Utilde:Ame,utilde:Dme,utri:Tme,utrif:Ome,uuarr:Mme,Uuml:Rme,uuml:Pme,uwangle:$me,vangrt:Fme,varepsilon:Ime,varkappa:Lme,varnothing:Nme,varphi:zme,varpi:Bme,varpropto:qme,varr:Vme,vArr:jme,varrho:Hme,varsigma:Ume,varsubsetneq:Wme,varsubsetneqq:Yme,varsupsetneq:Gme,varsupsetneqq:Kme,vartheta:Zme,vartriangleleft:Xme,vartriangleright:Jme,vBar:Qme,Vbar:ege,vBarv:tge,Vcy:nge,vcy:rge,vdash:oge,vDash:sge,Vdash:age,VDash:ige,Vdashl:lge,veebar:cge,vee:uge,Vee:dge,veeeq:fge,vellip:pge,verbar:hge,Verbar:mge,vert:gge,Vert:vge,VerticalBar:yge,VerticalLine:bge,VerticalSeparator:_ge,VerticalTilde:xge,VeryThinSpace:wge,Vfr:kge,vfr:Cge,vltri:Sge,vnsub:Ege,vnsup:Age,Vopf:Dge,vopf:Tge,vprop:Oge,vrtri:Mge,Vscr:Rge,vscr:Pge,vsubnE:$ge,vsubne:Fge,vsupnE:Ige,vsupne:Lge,Vvdash:Nge,vzigzag:zge,Wcirc:Bge,wcirc:qge,wedbar:Vge,wedge:jge,Wedge:Hge,wedgeq:Uge,weierp:Wge,Wfr:Yge,wfr:Gge,Wopf:Kge,wopf:Zge,wp:Xge,wr:Jge,wreath:Qge,Wscr:eve,wscr:tve,xcap:nve,xcirc:rve,xcup:ove,xdtri:sve,Xfr:ave,xfr:ive,xharr:lve,xhArr:cve,Xi:uve,xi:dve,xlarr:fve,xlArr:pve,xmap:hve,xnis:mve,xodot:gve,Xopf:vve,xopf:yve,xoplus:bve,xotime:_ve,xrarr:xve,xrArr:wve,Xscr:kve,xscr:Cve,xsqcup:Sve,xuplus:Eve,xutri:Ave,xvee:Dve,xwedge:Tve,Yacute:Ove,yacute:Mve,YAcy:Rve,yacy:Pve,Ycirc:$ve,ycirc:Fve,Ycy:Ive,ycy:Lve,yen:Nve,Yfr:zve,yfr:Bve,YIcy:qve,yicy:Vve,Yopf:jve,yopf:Hve,Yscr:Uve,yscr:Wve,YUcy:Yve,yucy:Gve,yuml:Kve,Yuml:Zve,Zacute:Xve,zacute:Jve,Zcaron:Qve,zcaron:e0e,Zcy:t0e,zcy:n0e,Zdot:r0e,zdot:o0e,zeetrf:s0e,ZeroWidthSpace:a0e,Zeta:i0e,zeta:l0e,zfr:c0e,Zfr:u0e,ZHcy:d0e,zhcy:f0e,zigrarr:p0e,zopf:h0e,Zopf:m0e,Zscr:g0e,zscr:v0e,zwj:y0e,zwnj:b0e};var Zc,ig;function m_(){return ig||(ig=1,Zc=_0e),Zc}var Xc,lg;function Pp(){return lg||(lg=1,Xc=/[!-#%-\*,-\/:;\?@\[-\]_\{\}\xA1\xA7\xAB\xB6\xB7\xBB\xBF\u037E\u0387\u055A-\u055F\u0589\u058A\u05BE\u05C0\u05C3\u05C6\u05F3\u05F4\u0609\u060A\u060C\u060D\u061B\u061E\u061F\u066A-\u066D\u06D4\u0700-\u070D\u07F7-\u07F9\u0830-\u083E\u085E\u0964\u0965\u0970\u09FD\u0A76\u0AF0\u0C84\u0DF4\u0E4F\u0E5A\u0E5B\u0F04-\u0F12\u0F14\u0F3A-\u0F3D\u0F85\u0FD0-\u0FD4\u0FD9\u0FDA\u104A-\u104F\u10FB\u1360-\u1368\u1400\u166D\u166E\u169B\u169C\u16EB-\u16ED\u1735\u1736\u17D4-\u17D6\u17D8-\u17DA\u1800-\u180A\u1944\u1945\u1A1E\u1A1F\u1AA0-\u1AA6\u1AA8-\u1AAD\u1B5A-\u1B60\u1BFC-\u1BFF\u1C3B-\u1C3F\u1C7E\u1C7F\u1CC0-\u1CC7\u1CD3\u2010-\u2027\u2030-\u2043\u2045-\u2051\u2053-\u205E\u207D\u207E\u208D\u208E\u2308-\u230B\u2329\u232A\u2768-\u2775\u27C5\u27C6\u27E6-\u27EF\u2983-\u2998\u29D8-\u29DB\u29FC\u29FD\u2CF9-\u2CFC\u2CFE\u2CFF\u2D70\u2E00-\u2E2E\u2E30-\u2E4E\u3001-\u3003\u3008-\u3011\u3014-\u301F\u3030\u303D\u30A0\u30FB\uA4FE\uA4FF\uA60D-\uA60F\uA673\uA67E\uA6F2-\uA6F7\uA874-\uA877\uA8CE\uA8CF\uA8F8-\uA8FA\uA8FC\uA92E\uA92F\uA95F\uA9C1-\uA9CD\uA9DE\uA9DF\uAA5C-\uAA5F\uAADE\uAADF\uAAF0\uAAF1\uABEB\uFD3E\uFD3F\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE61\uFE63\uFE68\uFE6A\uFE6B\uFF01-\uFF03\uFF05-\uFF0A\uFF0C-\uFF0F\uFF1A\uFF1B\uFF1F\uFF20\uFF3B-\uFF3D\uFF3F\uFF5B\uFF5D\uFF5F-\uFF65]|\uD800[\uDD00-\uDD02\uDF9F\uDFD0]|\uD801\uDD6F|\uD802[\uDC57\uDD1F\uDD3F\uDE50-\uDE58\uDE7F\uDEF0-\uDEF6\uDF39-\uDF3F\uDF99-\uDF9C]|\uD803[\uDF55-\uDF59]|\uD804[\uDC47-\uDC4D\uDCBB\uDCBC\uDCBE-\uDCC1\uDD40-\uDD43\uDD74\uDD75\uDDC5-\uDDC8\uDDCD\uDDDB\uDDDD-\uDDDF\uDE38-\uDE3D\uDEA9]|\uD805[\uDC4B-\uDC4F\uDC5B\uDC5D\uDCC6\uDDC1-\uDDD7\uDE41-\uDE43\uDE60-\uDE6C\uDF3C-\uDF3E]|\uD806[\uDC3B\uDE3F-\uDE46\uDE9A-\uDE9C\uDE9E-\uDEA2]|\uD807[\uDC41-\uDC45\uDC70\uDC71\uDEF7\uDEF8]|\uD809[\uDC70-\uDC74]|\uD81A[\uDE6E\uDE6F\uDEF5\uDF37-\uDF3B\uDF44]|\uD81B[\uDE97-\uDE9A]|\uD82F\uDC9F|\uD836[\uDE87-\uDE8B]|\uD83A[\uDD5E\uDD5F]/),Xc}var Ro={},Jc,cg;function x0e(){if(cg)return Jc;cg=1;var e={};function t(r){var o,s,a=e[r];if(a)return a;for(a=e[r]=[],o=0;o<128;o++)s=String.fromCharCode(o),/^[0-9a-z]$/i.test(s)?a.push(s):a.push("%"+("0"+o.toString(16).toUpperCase()).slice(-2));for(o=0;o"u"&&(s=!0),c=t(o),a=0,i=r.length;a=55296&&l<=57343){if(l>=55296&&l<=56319&&a+1=56320&&u<=57343)){d+=encodeURIComponent(r[a]+r[a+1]),a++;continue}d+="%EF%BF%BD";continue}d+=encodeURIComponent(r[a])}return d}return n.defaultChars=";/?:@&=+$,-_.!~*'()#",n.componentChars="-_.!~*'()",Jc=n,Jc}var Qc,ug;function w0e(){if(ug)return Qc;ug=1;var e={};function t(r){var o,s,a=e[r];if(a)return a;for(a=e[r]=[],o=0;o<128;o++)s=String.fromCharCode(o),a.push(s);for(o=0;o=55296&&h<=57343?m+="���":m+=String.fromCharCode(h),i+=6;continue}if((u&248)===240&&i+91114111?m+="����":(h-=65536,m+=String.fromCharCode(55296+(h>>10),56320+(h&1023))),i+=9;continue}m+="�"}return m})}return n.defaultChars=";/?:@&=+$,#",n.componentChars="",Qc=n,Qc}var eu,dg;function k0e(){return dg||(dg=1,eu=function(t){var n="";return n+=t.protocol||"",n+=t.slashes?"//":"",n+=t.auth?t.auth+"@":"",t.hostname&&t.hostname.indexOf(":")!==-1?n+="["+t.hostname+"]":n+=t.hostname||"",n+=t.port?":"+t.port:"",n+=t.pathname||"",n+=t.search||"",n+=t.hash||"",n}),eu}var tu,fg;function C0e(){if(fg)return tu;fg=1;function e(){this.protocol=null,this.slashes=null,this.auth=null,this.port=null,this.hostname=null,this.hash=null,this.search=null,this.pathname=null}var t=/^([a-z0-9.+-]+:)/i,n=/:[0-9]*$/,r=/^(\/\/?(?!\/)[^\?\s]*)(\?[^\s]*)?$/,o=["<",">",'"',"`"," ","\r",` -`," "],s=["{","}","|","\\","^","`"].concat(o),a=["'"].concat(s),i=["%","/","?",";","#"].concat(a),l=["/","?","#"],u=255,c=/^[+a-z0-9A-Z_-]{0,63}$/,d=/^([+a-z0-9A-Z_-]{0,63})(.*)$/,p={javascript:!0,"javascript:":!0},h={http:!0,https:!0,ftp:!0,gopher:!0,file:!0,"http:":!0,"https:":!0,"ftp:":!0,"gopher:":!0,"file:":!0};function m(g,v){if(g&&g instanceof e)return g;var y=new e;return y.parse(g,v),y}return e.prototype.parse=function(g,v){var y,k,b,w,C,A=g;if(A=A.trim(),!v&&g.split("#").length===1){var R=r.exec(A);if(R)return this.pathname=R[1],R[2]&&(this.search=R[2]),this}var M=t.exec(A);if(M&&(M=M[0],b=M.toLowerCase(),this.protocol=M,A=A.substr(M.length)),(v||M||A.match(/^\/\/[^@\/]+@[^@\/]+/))&&(C=A.substr(0,2)==="//",C&&!(M&&p[M])&&(A=A.substr(2),this.slashes=!0)),!p[M]&&(C||M&&!h[M])){var O=-1;for(y=0;y127?Q+="x":Q+=ue[j];if(!Q.match(c)){var H=B.slice(0,y),U=B.slice(y+1),ae=ue.match(d);ae&&(H.push(ae[1]),U.unshift(ae[2])),U.length&&(A=U.join(".")+A),this.hostname=H.join(".");break}}}}this.hostname.length>u&&(this.hostname=""),re&&(this.hostname=this.hostname.substr(1,this.hostname.length-2))}var pe=A.indexOf("#");pe!==-1&&(this.hash=A.substr(pe),A=A.slice(0,pe));var Le=A.indexOf("?");return Le!==-1&&(this.search=A.substr(Le),A=A.slice(0,Le)),A&&(this.pathname=A),h[b]&&this.hostname&&!this.pathname&&(this.pathname=""),this},e.prototype.parseHost=function(g){var v=n.exec(g);v&&(v=v[0],v!==":"&&(this.port=v.substr(1)),g=g.substr(0,g.length-v.length)),g&&(this.hostname=g)},tu=m,tu}var pg;function g_(){return pg||(pg=1,Ro.encode=x0e(),Ro.decode=w0e(),Ro.format=k0e(),Ro.parse=C0e()),Ro}var oo={},nu,hg;function v_(){return hg||(hg=1,nu=/[\0-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/),nu}var ru,mg;function y_(){return mg||(mg=1,ru=/[\0-\x1F\x7F-\x9F]/),ru}var ou,gg;function S0e(){return gg||(gg=1,ou=/[\xAD\u0600-\u0605\u061C\u06DD\u070F\u08E2\u180E\u200B-\u200F\u202A-\u202E\u2060-\u2064\u2066-\u206F\uFEFF\uFFF9-\uFFFB]|\uD804[\uDCBD\uDCCD]|\uD82F[\uDCA0-\uDCA3]|\uD834[\uDD73-\uDD7A]|\uDB40[\uDC01\uDC20-\uDC7F]/),ou}var su,vg;function b_(){return vg||(vg=1,su=/[ \xA0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000]/),su}var yg;function E0e(){return yg||(yg=1,oo.Any=v_(),oo.Cc=y_(),oo.Cf=S0e(),oo.P=Pp(),oo.Z=b_()),oo}var bg;function Ke(){return bg||(bg=1,function(e){function t(B){return Object.prototype.toString.call(B)}function n(B){return t(B)==="[object String]"}var r=Object.prototype.hasOwnProperty;function o(B,ue){return r.call(B,ue)}function s(B){var ue=Array.prototype.slice.call(arguments,1);return ue.forEach(function(Q){if(Q){if(typeof Q!="object")throw new TypeError(Q+"must be object");Object.keys(Q).forEach(function(j){B[j]=Q[j]})}}),B}function a(B,ue,Q){return[].concat(B.slice(0,ue),Q,B.slice(ue+1))}function i(B){return!(B>=55296&&B<=57343||B>=64976&&B<=65007||(B&65535)===65535||(B&65535)===65534||B>=0&&B<=8||B===11||B>=14&&B<=31||B>=127&&B<=159||B>1114111)}function l(B){if(B>65535){B-=65536;var ue=55296+(B>>10),Q=56320+(B&1023);return String.fromCharCode(ue,Q)}return String.fromCharCode(B)}var u=/\\([!"#$%&'()*+,\-.\/:;<=>?@[\\\]^_`{|}~])/g,c=/&([a-z#][a-z0-9]{1,31});/gi,d=new RegExp(u.source+"|"+c.source,"gi"),p=/^#((?:x[a-f0-9]{1,8}|[0-9]{1,8}))$/i,h=m_();function m(B,ue){var Q;return o(h,ue)?h[ue]:ue.charCodeAt(0)===35&&p.test(ue)&&(Q=ue[1].toLowerCase()==="x"?parseInt(ue.slice(2),16):parseInt(ue.slice(1),10),i(Q))?l(Q):B}function g(B){return B.indexOf("\\")<0?B:B.replace(u,"$1")}function v(B){return B.indexOf("\\")<0&&B.indexOf("&")<0?B:B.replace(d,function(ue,Q,j){return Q||m(ue,j)})}var y=/[&<>"]/,k=/[&<>"]/g,b={"&":"&","<":"<",">":">",'"':"""};function w(B){return b[B]}function C(B){return y.test(B)?B.replace(k,w):B}var A=/[.?*+^$[\]\\(){}|-]/g;function R(B){return B.replace(A,"\\$&")}function M(B){switch(B){case 9:case 32:return!0}return!1}function O(B){if(B>=8192&&B<=8202)return!0;switch(B){case 9:case 10:case 11:case 12:case 13:case 32:case 160:case 5760:case 8239:case 8287:case 12288:return!0}return!1}var P=Pp();function W(B){return P.test(B)}function z(B){switch(B){case 33:case 34:case 35:case 36:case 37:case 38:case 39:case 40:case 41:case 42:case 43:case 44:case 45:case 46:case 47:case 58:case 59:case 60:case 61:case 62:case 63:case 64:case 91:case 92:case 93:case 94:case 95:case 96:case 123:case 124:case 125:case 126:return!0;default:return!1}}function re(B){return B=B.trim().replace(/\s+/g," "),"ẞ".toLowerCase()==="Ṿ"&&(B=B.replace(/ẞ/g,"ß")),B.toLowerCase().toUpperCase()}e.lib={},e.lib.mdurl=g_(),e.lib.ucmicro=E0e(),e.assign=s,e.isString=n,e.has=o,e.unescapeMd=g,e.unescapeAll=v,e.isValidEntityCode=i,e.fromCodePoint=l,e.escapeHtml=C,e.arrayReplaceAt=a,e.isSpace=M,e.isWhiteSpace=O,e.isMdAsciiPunct=z,e.isPunctChar=W,e.escapeRE=R,e.normalizeReference=re}(Kc)),Kc}var Is={},au,_g;function A0e(){return _g||(_g=1,au=function(t,n,r){var o,s,a,i,l=-1,u=t.posMax,c=t.pos;for(t.pos=n+1,o=1;t.pos32))return l;if(s===41){if(a===0)break;a--}i++}return r===i||a!==0||(l.str=e(n.slice(r,i)),l.pos=i,l.ok=!0),l},iu}var lu,wg;function T0e(){if(wg)return lu;wg=1;var e=Ke().unescapeAll;return lu=function(n,r,o){var s,a,i=0,l=r,u={ok:!1,pos:0,lines:0,str:""};if(l>=o||(a=n.charCodeAt(l),a!==34&&a!==39&&a!==40))return u;for(l++,a===40&&(a=41);l"+n(c.content)+""},r.code_block=function(s,a,i,l,u){var c=s[a];return""+n(s[a].content)+` -`},r.fence=function(s,a,i,l,u){var c=s[a],d=c.info?t(c.info).trim():"",p="",h="",m,g,v,y,k;return d&&(v=d.split(/(\s+)/g),p=v[0],h=v.slice(2).join("")),i.highlight?m=i.highlight(c.content,p,h)||n(c.content):m=n(c.content),m.indexOf(""+m+` -`):"
"+m+`
-`},r.image=function(s,a,i,l,u){var c=s[a];return c.attrs[c.attrIndex("alt")][1]=u.renderInlineAsText(c.children,i,l),u.renderToken(s,a,i)},r.hardbreak=function(s,a,i){return i.xhtmlOut?`
-`:`
-`},r.softbreak=function(s,a,i){return i.breaks?i.xhtmlOut?`
-`:`
-`:` -`},r.text=function(s,a){return n(s[a].content)},r.html_block=function(s,a){return s[a].content},r.html_inline=function(s,a){return s[a].content};function o(){this.rules=e({},r)}return o.prototype.renderAttrs=function(a){var i,l,u;if(!a.attrs)return"";for(u="",i=0,l=a.attrs.length;i -`:">",c)},o.prototype.renderInline=function(s,a,i){for(var l,u="",c=this.rules,d=0,p=s.length;d\s]/i.test(r)}function n(r){return/^<\/a\s*>/i.test(r)}return hu=function(o){var s,a,i,l,u,c,d,p,h,m,g,v,y,k,b,w,C=o.tokens,A;if(o.md.options.linkify){for(a=0,i=C.length;a=0;s--){if(c=l[s],c.type==="link_close"){for(s--;l[s].level!==c.level&&l[s].type!=="link_open";)s--;continue}if(c.type==="html_inline"&&(t(c.content)&&y>0&&y--,n(c.content)&&y++),!(y>0)&&c.type==="text"&&o.md.linkify.test(c.content)){for(h=c.content,A=o.md.linkify.match(h),d=[],v=c.level,g=0,A.length>0&&A[0].index===0&&s>0&&l[s-1].type==="text_special"&&(A=A.slice(1)),p=0;pg&&(u=new o.Token("text","",0),u.content=h.slice(g,m),u.level=v,d.push(u)),u=new o.Token("link_open","a",1),u.attrs=[["href",b]],u.level=v++,u.markup="linkify",u.info="auto",d.push(u),u=new o.Token("text","",0),u.content=w,u.level=v,d.push(u),u=new o.Token("link_close","a",-1),u.level=--v,u.markup="linkify",u.info="auto",d.push(u),g=A[p].lastIndex);g=0;l--)u=i[l],u.type==="text"&&!c&&(u.content=u.content.replace(n,o)),u.type==="link_open"&&u.info==="auto"&&c--,u.type==="link_close"&&u.info==="auto"&&c++}function a(i){var l,u,c=0;for(l=i.length-1;l>=0;l--)u=i[l],u.type==="text"&&!c&&e.test(u.content)&&(u.content=u.content.replace(/\+-/g,"±").replace(/\.{2,}/g,"…").replace(/([?!])…/g,"$1..").replace(/([?!]){4,}/g,"$1$1$1").replace(/,{2,}/g,",").replace(/(^|[^-])---(?=[^-]|$)/mg,"$1—").replace(/(^|\s)--(?=\s|$)/mg,"$1–").replace(/(^|[^-\s])--(?=[^-\s]|$)/mg,"$1–")),u.type==="link_open"&&u.info==="auto"&&c--,u.type==="link_close"&&u.info==="auto"&&c++}return mu=function(l){var u;if(l.md.options.typographer)for(u=l.tokens.length-1;u>=0;u--)l.tokens[u].type==="inline"&&(t.test(l.tokens[u].content)&&s(l.tokens[u].children),e.test(l.tokens[u].content)&&a(l.tokens[u].children))},mu}var gu,Mg;function L0e(){if(Mg)return gu;Mg=1;var e=Ke().isWhiteSpace,t=Ke().isPunctChar,n=Ke().isMdAsciiPunct,r=/['"]/,o=/['"]/g,s="’";function a(l,u,c){return l.slice(0,u)+c+l.slice(u+1)}function i(l,u){var c,d,p,h,m,g,v,y,k,b,w,C,A,R,M,O,P,W,z,re,B;for(z=[],c=0;c=0&&!(z[P].level<=v);P--);if(z.length=P+1,d.type==="text"){p=d.content,m=0,g=p.length;e:for(;m=0)k=p.charCodeAt(h.index-1);else for(P=c-1;P>=0&&!(l[P].type==="softbreak"||l[P].type==="hardbreak");P--)if(l[P].content){k=l[P].content.charCodeAt(l[P].content.length-1);break}if(b=32,m=48&&k<=57&&(O=M=!1),M&&O&&(M=w,O=C),!M&&!O){W&&(d.content=a(d.content,h.index,s));continue}if(O){for(P=z.length-1;P>=0&&(y=z[P],!(z[P].level=0;c--)u.tokens[c].type!=="inline"||!r.test(u.tokens[c].content)||i(u.tokens[c].children,u)},gu}var vu,Rg;function N0e(){return Rg||(Rg=1,vu=function(t){var n,r,o,s,a,i,l=t.tokens;for(n=0,r=l.length;n=0&&(o=this.attrs[r][1]),o},e.prototype.attrJoin=function(n,r){var o=this.attrIndex(n);o<0?this.attrPush([n,r]):this.attrs[o][1]=this.attrs[o][1]+" "+r},yu=e,yu}var bu,$g;function z0e(){if($g)return bu;$g=1;var e=Fp();function t(n,r,o){this.src=n,this.env=o,this.tokens=[],this.inlineMode=!1,this.md=r}return t.prototype.Token=e,bu=t,bu}var _u,Fg;function B0e(){if(Fg)return _u;Fg=1;var e=$p(),t=[["normalize",R0e()],["block",P0e()],["inline",$0e()],["linkify",F0e()],["replacements",I0e()],["smartquotes",L0e()],["text_join",N0e()]];function n(){this.ruler=new e;for(var r=0;ra||(h=s+1,o.sCount[h]=4||(c=o.bMarks[h]+o.tShift[h],c>=o.eMarks[h])||(M=o.src.charCodeAt(c++),M!==124&&M!==45&&M!==58)||c>=o.eMarks[h]||(O=o.src.charCodeAt(c++),O!==124&&O!==45&&O!==58&&!e(O))||M===45&&e(O))return!1;for(;c=4||(m=n(u),m.length&&m[0]===""&&m.shift(),m.length&&m[m.length-1]===""&&m.pop(),g=m.length,g===0||g!==y.length))return!1;if(i)return!0;for(C=o.parentType,o.parentType="table",R=o.md.block.ruler.getRules("blockquote"),v=o.push("table_open","table",1),v.map=b=[s,0],v=o.push("thead_open","thead",1),v.map=[s,s+1],v=o.push("tr_open","tr",1),v.map=[s,s+1],d=0;d=4)break;for(m=n(u),m.length&&m[0]===""&&m.shift(),m.length&&m[m.length-1]===""&&m.pop(),h===s+2&&(v=o.push("tbody_open","tbody",1),v.map=w=[s+2,0]),v=o.push("tr_open","tr",1),v.map=[h,h+1],d=0;d=4){o++,s=o;continue}break}return t.line=s,a=t.push("code_block","code",0),a.content=t.getLines(n,s,4+t.blkIndent,!1)+` -`,a.map=[n,t.line],!0}),wu}var ku,Ng;function j0e(){return Ng||(Ng=1,ku=function(t,n,r,o){var s,a,i,l,u,c,d,p=!1,h=t.bMarks[n]+t.tShift[n],m=t.eMarks[n];if(t.sCount[n]-t.blkIndent>=4||h+3>m||(s=t.src.charCodeAt(h),s!==126&&s!==96)||(u=h,h=t.skipChars(h,s),a=h-u,a<3)||(d=t.src.slice(u,h),i=t.src.slice(h,m),s===96&&i.indexOf(String.fromCharCode(s))>=0))return!1;if(o)return!0;for(l=n;l++,!(l>=r||(h=u=t.bMarks[l]+t.tShift[l],m=t.eMarks[l],h=4)&&(h=t.skipChars(h,s),!(h-u=4||n.src.charCodeAt(W)!==62)return!1;if(s)return!0;for(g=[],v=[],b=[],w=[],R=n.md.block.ruler.getRules("blockquote"),k=n.parentType,n.parentType="blockquote",h=r;h=z));h++){if(n.src.charCodeAt(W++)===62&&!O){for(u=n.sCount[h]+1,n.src.charCodeAt(W)===32?(W++,u++,a=!1,C=!0):n.src.charCodeAt(W)===9?(C=!0,(n.bsCount[h]+u)%4===3?(W++,u++,a=!1):a=!0):C=!1,m=u,g.push(n.bMarks[h]),n.bMarks[h]=W;W=z,v.push(n.bsCount[h]),n.bsCount[h]=n.sCount[h]+1+(C?1:0),b.push(n.sCount[h]),n.sCount[h]=m-u,w.push(n.tShift[h]),n.tShift[h]=W-n.bMarks[h];continue}if(d)break;for(A=!1,l=0,c=R.length;l",M.map=p=[r,0],n.md.block.tokenize(n,r,h),M=n.push("blockquote_close","blockquote",-1),M.markup=">",n.lineMax=P,n.parentType=k,p[1]=n.line,l=0;l=4||(a=n.src.charCodeAt(c++),a!==42&&a!==45&&a!==95))return!1;for(i=1;c=u||(a=o.src.charCodeAt(l++),a<48||a>57))return-1;for(;;){if(l>=u)return-1;if(a=o.src.charCodeAt(l++),a>=48&&a<=57){if(l-i>=10)return-1;continue}if(a===41||a===46)break;return-1}return l=4||s.listIndent>=0&&s.sCount[U]-s.listIndent>=4&&s.sCount[U]=s.blkIndent&&(ae=!0),(B=n(s,U))>=0){if(g=!0,Q=s.bMarks[U]+s.tShift[U],C=Number(s.src.slice(Q,B-1)),ae&&C!==1)return!1}else if((B=t(s,U))>=0)g=!1;else return!1;if(ae&&s.skipSpaces(B)>=s.eMarks[U])return!1;if(l)return!0;for(w=s.src.charCodeAt(B-1),b=s.tokens.length,g?(H=s.push("ordered_list_open","ol",1),C!==1&&(H.attrs=[["start",C]])):H=s.push("bullet_list_open","ul",1),H.map=k=[U,0],H.markup=String.fromCharCode(w),ue=!1,Z=s.md.block.ruler.getRules("list"),O=s.parentType,s.parentType="list";U=A?h=1:h=R-m,h>4&&(h=1),p=m+h,H=s.push("list_item_open","li",1),H.markup=String.fromCharCode(w),H.map=v=[U,0],g&&(H.info=s.src.slice(Q,B-1)),z=s.tight,W=s.tShift[U],P=s.sCount[U],M=s.listIndent,s.listIndent=s.blkIndent,s.blkIndent=p,s.tight=!0,s.tShift[U]=c-s.bMarks[U],s.sCount[U]=R,c>=A&&s.isEmpty(U+1)?s.line=Math.min(s.line+2,i):s.md.block.tokenize(s,U,i,!0),(!s.tight||ue)&&(pe=!1),ue=s.line-U>1&&s.isEmpty(s.line-1),s.blkIndent=s.listIndent,s.listIndent=M,s.tShift[U]=W,s.sCount[U]=P,s.tight=z,H=s.push("list_item_close","li",-1),H.markup=String.fromCharCode(w),U=s.line,v[1]=U,U>=i||s.sCount[U]=4)break;for(j=!1,d=0,y=Z.length;d=4||r.src.charCodeAt(M)!==91)return!1;for(;++M3)&&!(r.sCount[P]<0)){for(w=!1,p=0,h=C.length;p"u"&&(r.env.references={}),typeof r.env.references[m]>"u"&&(r.env.references[m]={title:A,href:d}),r.parentType=v,r.line=o+R+1),!0)},Au}var Du,jg;function G0e(){return jg||(jg=1,Du=["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","h1","h2","h3","h4","h5","h6","head","header","hr","html","iframe","legend","li","link","main","menu","menuitem","nav","noframes","ol","optgroup","option","p","param","section","source","summary","table","tbody","td","tfoot","th","thead","title","tr","track","ul"]),Du}var fi={},Hg;function __(){if(Hg)return fi;Hg=1;var e="[a-zA-Z_:][a-zA-Z0-9:._-]*",t="[^\"'=<>`\\x00-\\x20]+",n="'[^']*'",r='"[^"]*"',o="(?:"+t+"|"+n+"|"+r+")",s="(?:\\s+"+e+"(?:\\s*=\\s*"+o+")?)",a="<[A-Za-z][A-Za-z0-9\\-]*"+s+"*\\s*\\/?>",i="<\\/[A-Za-z][A-Za-z0-9\\-]*\\s*>",l="|",u="<[?][\\s\\S]*?[?]>",c="]*>",d="",p=new RegExp("^(?:"+a+"|"+i+"|"+l+"|"+u+"|"+c+"|"+d+")"),h=new RegExp("^(?:"+a+"|"+i+")");return fi.HTML_TAG_RE=p,fi.HTML_OPEN_CLOSE_TAG_RE=h,fi}var Tu,Ug;function K0e(){if(Ug)return Tu;Ug=1;var e=G0e(),t=__().HTML_OPEN_CLOSE_TAG_RE,n=[[/^<(script|pre|style|textarea)(?=(\s|>|$))/i,/<\/(script|pre|style|textarea)>/i,!0],[/^/,!0],[/^<\?/,/\?>/,!0],[/^/,!0],[/^/,!0],[new RegExp("^|$))","i"),/^$/,!0],[new RegExp(t.source+"\\s*$"),/^$/,!1]];return Tu=function(o,s,a,i){var l,u,c,d,p=o.bMarks[s]+o.tShift[s],h=o.eMarks[s];if(o.sCount[s]-o.blkIndent>=4||!o.md.options.html||o.src.charCodeAt(p)!==60)return!1;for(d=o.src.slice(p,h),l=0;l=4||(a=n.src.charCodeAt(c),a!==35||c>=d))return!1;for(i=1,a=n.src.charCodeAt(++c);a===35&&c6||cc&&e(n.src.charCodeAt(l-1))&&(d=l),n.line=r+1,u=n.push("heading_open","h"+String(i),1),u.markup="########".slice(0,i),u.map=[r,n.line],u=n.push("inline","",0),u.content=n.src.slice(c,d).trim(),u.map=[r,n.line],u.children=[],u=n.push("heading_close","h"+String(i),-1),u.markup="########".slice(0,i)),!0)},Ou}var Mu,Yg;function X0e(){return Yg||(Yg=1,Mu=function(t,n,r){var o,s,a,i,l,u,c,d,p,h=n+1,m,g=t.md.block.ruler.getRules("paragraph");if(t.sCount[n]-t.blkIndent>=4)return!1;for(m=t.parentType,t.parentType="paragraph";h3)){if(t.sCount[h]>=t.blkIndent&&(u=t.bMarks[h]+t.tShift[h],c=t.eMarks[h],u=c)))){d=p===61?1:2;break}if(!(t.sCount[h]<0)){for(s=!1,a=0,i=g.length;a3)&&!(t.sCount[c]<0)){for(s=!1,a=0,i=d.length;a0&&this.level++,this.tokens.push(a),a},n.prototype.isEmpty=function(o){return this.bMarks[o]+this.tShift[o]>=this.eMarks[o]},n.prototype.skipEmptyLines=function(o){for(var s=this.lineMax;os;)if(!t(this.src.charCodeAt(--o)))return o+1;return o},n.prototype.skipChars=function(o,s){for(var a=this.src.length;oa;)if(s!==this.src.charCodeAt(--o))return o+1;return o},n.prototype.getLines=function(o,s,a,i){var l,u,c,d,p,h,m,g=o;if(o>=s)return"";for(h=new Array(s-o),l=0;ga?h[l]=new Array(u-a+1).join(" ")+this.src.slice(d,p):h[l]=this.src.slice(d,p)}return h.join("")},n.prototype.Token=e,Pu=n,Pu}var $u,Zg;function eye(){if(Zg)return $u;Zg=1;var e=$p(),t=[["table",q0e(),["paragraph","reference"]],["code",V0e()],["fence",j0e(),["paragraph","reference","blockquote","list"]],["blockquote",H0e(),["paragraph","reference","blockquote","list"]],["hr",U0e(),["paragraph","reference","blockquote","list"]],["list",W0e(),["paragraph","reference","blockquote"]],["reference",Y0e()],["html_block",K0e(),["paragraph","reference","blockquote"]],["heading",Z0e(),["paragraph","reference","blockquote"]],["lheading",X0e()],["paragraph",J0e()]];function n(){this.ruler=new e;for(var r=0;r=s||r.sCount[d]=h){r.line=s;break}for(l=r.line,i=0;i=r.line)throw new Error("block rule didn't increment state.line");break}if(!a)throw new Error("none of the block rules matched");r.tight=!p,r.isEmpty(r.line-1)&&(p=!0),d=r.line,d0||(o=n.pos,s=n.posMax,o+3>s)||n.src.charCodeAt(o)!==58||n.src.charCodeAt(o+1)!==47||n.src.charCodeAt(o+2)!==47||(a=n.pending.match(e),!a)||(i=a[1],l=n.md.linkify.matchAtStart(n.src.slice(o-i.length)),!l)||(u=l.url,u.length<=i.length)||(u=u.replace(/\*+$/,""),c=n.md.normalizeLink(u),!n.md.validateLink(c))?!1:(r||(n.pending=n.pending.slice(0,-i.length),d=n.push("link_open","a",1),d.attrs=[["href",c]],d.markup="linkify",d.info="auto",d=n.push("text","",0),d.content=n.md.normalizeLinkText(u),d=n.push("link_close","a",-1),d.markup="linkify",d.info="auto"),n.pos+=u.length-i.length,!0)},Iu}var Lu,Qg;function rye(){if(Qg)return Lu;Qg=1;var e=Ke().isSpace;return Lu=function(n,r){var o,s,a,i=n.pos;if(n.src.charCodeAt(i)!==10)return!1;if(o=n.pending.length-1,s=n.posMax,!r)if(o>=0&&n.pending.charCodeAt(o)===32)if(o>=1&&n.pending.charCodeAt(o-1)===32){for(a=o-1;a>=1&&n.pending.charCodeAt(a-1)===32;)a--;n.pending=n.pending.slice(0,a),n.push("hardbreak","br",0)}else n.pending=n.pending.slice(0,-1),n.push("softbreak","br",0);else n.push("softbreak","br",0);for(i++;i?@[]^_`{|}~-".split("").forEach(function(r){t[r.charCodeAt(0)]=1}),Nu=function(o,s){var a,i,l,u,c,d=o.pos,p=o.posMax;if(o.src.charCodeAt(d)!==92||(d++,d>=p))return!1;if(a=o.src.charCodeAt(d),a===10){for(s||o.push("hardbreak","br",0),d++;d=55296&&a<=56319&&d+1=56320&&i<=57343&&(u+=o.src[d+1],d++)),l="\\"+u,s||(c=o.push("text_special","",0),a<256&&t[a]!==0?c.content=u:c.content=l,c.markup=l,c.info="escape"),o.pos=d+1,!0},Nu}var zu,tv;function sye(){return tv||(tv=1,zu=function(t,n){var r,o,s,a,i,l,u,c,d=t.pos,p=t.src.charCodeAt(d);if(p!==96)return!1;for(r=d,d++,o=t.posMax;d=0;r--)o=n[r],!(o.marker!==95&&o.marker!==42)&&o.end!==-1&&(s=n[o.end],l=r>0&&n[r-1].end===o.end+1&&n[r-1].marker===o.marker&&n[r-1].token===o.token-1&&n[o.end+1].token===s.token+1,i=String.fromCharCode(o.marker),a=t.tokens[o.token],a.type=l?"strong_open":"em_open",a.tag=l?"strong":"em",a.nesting=1,a.markup=l?i+i:i,a.content="",a=t.tokens[s.token],a.type=l?"strong_close":"em_close",a.tag=l?"strong":"em",a.nesting=-1,a.markup=l?i+i:i,a.content="",l&&(t.tokens[n[r-1].token].content="",t.tokens[n[o.end+1].token].content="",r--))}return hi.postProcess=function(n){var r,o=n.tokens_meta,s=n.tokens_meta.length;for(e(n,n.delimiters),r=0;r=y)return!1;if(k=c,d=r.md.helpers.parseLinkDestination(r.src,c,r.posMax),d.ok){for(m=r.md.normalizeLink(d.str),r.md.validateLink(m)?c=d.pos:m="",k=c;c=y||r.src.charCodeAt(c)!==41)&&(b=!0),c++}if(b){if(typeof r.env.references>"u")return!1;if(c=0?i=r.src.slice(k,c++):c=l+1):c=l+1,i||(i=r.src.slice(u,l)),p=r.env.references[e(i)],!p)return r.pos=v,!1;m=p.href,g=p.title}return o||(r.pos=u,r.posMax=l,h=r.push("link_open","a",1),h.attrs=s=[["href",m]],g&&s.push(["title",g]),r.linkLevel++,r.md.inline.tokenize(r),r.linkLevel--,h=r.push("link_close","a",-1)),r.pos=c,r.posMax=y,!0},Bu}var qu,iv;function iye(){if(iv)return qu;iv=1;var e=Ke().normalizeReference,t=Ke().isSpace;return qu=function(r,o){var s,a,i,l,u,c,d,p,h,m,g,v,y,k="",b=r.pos,w=r.posMax;if(r.src.charCodeAt(r.pos)!==33||r.src.charCodeAt(r.pos+1)!==91||(c=r.pos+2,u=r.md.helpers.parseLinkLabel(r,r.pos+1,!1),u<0))return!1;if(d=u+1,d=w)return!1;for(y=d,h=r.md.helpers.parseLinkDestination(r.src,d,r.posMax),h.ok&&(k=r.md.normalizeLink(h.str),r.md.validateLink(k)?d=h.pos:k=""),y=d;d=w||r.src.charCodeAt(d)!==41)return r.pos=b,!1;d++}else{if(typeof r.env.references>"u")return!1;if(d=0?l=r.src.slice(y,d++):d=u+1):d=u+1,l||(l=r.src.slice(c,u)),p=r.env.references[e(l)],!p)return r.pos=b,!1;k=p.href,m=p.title}return o||(i=r.src.slice(c,u),r.md.inline.parse(i,r.md,r.env,v=[]),g=r.push("image","img",0),g.attrs=s=[["src",k],["alt",""]],g.children=v,g.content=i,m&&s.push(["title",m])),r.pos=d,r.posMax=w,!0},qu}var Vu,lv;function lye(){if(lv)return Vu;lv=1;var e=/^([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])?)*)$/,t=/^([a-zA-Z][a-zA-Z0-9+.\-]{1,31}):([^<>\x00-\x20]*)$/;return Vu=function(r,o){var s,a,i,l,u,c,d=r.pos;if(r.src.charCodeAt(d)!==60)return!1;for(u=r.pos,c=r.posMax;;){if(++d>=c||(l=r.src.charCodeAt(d),l===60))return!1;if(l===62)break}return s=r.src.slice(u+1,d),t.test(s)?(a=r.md.normalizeLink(s),r.md.validateLink(a)?(o||(i=r.push("link_open","a",1),i.attrs=[["href",a]],i.markup="autolink",i.info="auto",i=r.push("text","",0),i.content=r.md.normalizeLinkText(s),i=r.push("link_close","a",-1),i.markup="autolink",i.info="auto"),r.pos+=s.length+2,!0):!1):e.test(s)?(a=r.md.normalizeLink("mailto:"+s),r.md.validateLink(a)?(o||(i=r.push("link_open","a",1),i.attrs=[["href",a]],i.markup="autolink",i.info="auto",i=r.push("text","",0),i.content=r.md.normalizeLinkText(s),i=r.push("link_close","a",-1),i.markup="autolink",i.info="auto"),r.pos+=s.length+2,!0):!1):!1},Vu}var ju,cv;function cye(){if(cv)return ju;cv=1;var e=__().HTML_TAG_RE;function t(o){return/^\s]/i.test(o)}function n(o){return/^<\/a\s*>/i.test(o)}function r(o){var s=o|32;return s>=97&&s<=122}return ju=function(s,a){var i,l,u,c,d=s.pos;return!s.md.options.html||(u=s.posMax,s.src.charCodeAt(d)!==60||d+2>=u)||(i=s.src.charCodeAt(d+1),i!==33&&i!==63&&i!==47&&!r(i))||(l=s.src.slice(d).match(e),!l)?!1:(a||(c=s.push("html_inline","",0),c.content=l[0],t(c.content)&&s.linkLevel++,n(c.content)&&s.linkLevel--),s.pos+=l[0].length,!0)},ju}var Hu,uv;function uye(){if(uv)return Hu;uv=1;var e=m_(),t=Ke().has,n=Ke().isValidEntityCode,r=Ke().fromCodePoint,o=/^&#((?:x[a-f0-9]{1,6}|[0-9]{1,7}));/i,s=/^&([a-z][a-z0-9]{1,31});/i;return Hu=function(i,l){var u,c,d,p,h=i.pos,m=i.posMax;if(i.src.charCodeAt(h)!==38||h+1>=m)return!1;if(u=i.src.charCodeAt(h+1),u===35){if(d=i.src.slice(h).match(o),d)return l||(c=d[1][0].toLowerCase()==="x"?parseInt(d[1].slice(1),16):parseInt(d[1],10),p=i.push("text_special","",0),p.content=n(c)?r(c):r(65533),p.markup=d[0],p.info="entity"),i.pos+=d[0].length,!0}else if(d=i.src.slice(h).match(s),d&&t(e,d[1]))return l||(p=i.push("text_special","",0),p.content=e[d[1]],p.markup=d[0],p.info="entity"),i.pos+=d[0].length,!0;return!1},Hu}var Uu,dv;function dye(){if(dv)return Uu;dv=1;function e(t){var n,r,o,s,a,i,l,u,c={},d=t.length;if(d){var p=0,h=-2,m=[];for(n=0;na;r-=m[r]+1)if(s=t[r],s.marker===o.marker&&s.open&&s.end<0&&(l=!1,(s.close||o.open)&&(s.length+o.length)%3===0&&(s.length%3!==0||o.length%3!==0)&&(l=!0),!l)){u=r>0&&!t[r-1].open?m[r-1]+1:0,m[n]=n-r+u,m[r]=u,o.open=!1,s.end=n,s.close=!1,i=-1,h=-2;break}i!==-1&&(c[o.marker][(o.open?3:0)+(o.length||0)%3]=i)}}}return Uu=function(n){var r,o=n.tokens_meta,s=n.tokens_meta.length;for(e(n.delimiters),r=0;r0&&o++,s[n].type==="text"&&n+10&&(this.level++,this._prev_delimiters.push(this.delimiters),this.delimiters=[],u={delimiters:this.delimiters}),this.pendingLevel=this.level,this.tokens.push(l),this.tokens_meta.push(u),l},o.prototype.scanDelims=function(s,a){var i=s,l,u,c,d,p,h,m,g,v,y=!0,k=!0,b=this.posMax,w=this.src.charCodeAt(s);for(l=s>0?this.src.charCodeAt(s-1):32;i=o.pos)throw new Error("inline rule didn't increment state.pos");break}}else o.pos=o.posMax;s||o.pos++,d[i]=o.pos},r.prototype.tokenize=function(o){for(var s,a,i,l=this.ruler.getRules(""),u=l.length,c=o.posMax,d=o.md.options.maxNesting;o.pos=o.pos)throw new Error("inline rule didn't increment state.pos");break}}if(s){if(o.pos>=c)break;continue}o.pending+=o.src[o.pos++]}o.pending&&o.pushPending()},r.prototype.parse=function(o,s,a,i){var l,u,c,d=new this.State(o,s,a,i);for(this.tokenize(d),u=this.ruler2.getRules(""),c=u.length,l=0;l|$))",t.tpl_email_fuzzy="(^|"+n+'|"|\\(|'+t.src_ZCc+")("+t.src_email_name+"@"+t.tpl_host_fuzzy_strict+")",t.tpl_link_fuzzy="(^|(?![.:/\\-_@])(?:[$+<=>^`||]|"+t.src_ZPCc+"))((?![$+<=>^`||])"+t.tpl_host_port_fuzzy_strict+t.src_path+")",t.tpl_link_no_ip_fuzzy="(^|(?![.:/\\-_@])(?:[$+<=>^`||]|"+t.src_ZPCc+"))((?![$+<=>^`||])"+t.tpl_host_port_no_ip_fuzzy_strict+t.src_path+")",t}),Ku}var Zu,gv;function gye(){if(gv)return Zu;gv=1;function e(b){var w=Array.prototype.slice.call(arguments,1);return w.forEach(function(C){C&&Object.keys(C).forEach(function(A){b[A]=C[A]})}),b}function t(b){return Object.prototype.toString.call(b)}function n(b){return t(b)==="[object String]"}function r(b){return t(b)==="[object Object]"}function o(b){return t(b)==="[object RegExp]"}function s(b){return t(b)==="[object Function]"}function a(b){return b.replace(/[.?*+^$[\]\\(){}|-]/g,"\\$&")}var i={fuzzyLink:!0,fuzzyEmail:!0,fuzzyIP:!1};function l(b){return Object.keys(b||{}).reduce(function(w,C){return w||i.hasOwnProperty(C)},!1)}var u={"http:":{validate:function(b,w,C){var A=b.slice(w);return C.re.http||(C.re.http=new RegExp("^\\/\\/"+C.re.src_auth+C.re.src_host_port_strict+C.re.src_path,"i")),C.re.http.test(A)?A.match(C.re.http)[0].length:0}},"https:":"http:","ftp:":"http:","//":{validate:function(b,w,C){var A=b.slice(w);return C.re.no_http||(C.re.no_http=new RegExp("^"+C.re.src_auth+"(?:localhost|(?:(?:"+C.re.src_domain+")\\.)+"+C.re.src_domain_root+")"+C.re.src_port+C.re.src_host_terminator+C.re.src_path,"i")),C.re.no_http.test(A)?w>=3&&b[w-3]===":"||w>=3&&b[w-3]==="/"?0:A.match(C.re.no_http)[0].length:0}},"mailto:":{validate:function(b,w,C){var A=b.slice(w);return C.re.mailto||(C.re.mailto=new RegExp("^"+C.re.src_email_name+"@"+C.re.src_host_strict,"i")),C.re.mailto.test(A)?A.match(C.re.mailto)[0].length:0}}},c="a[cdefgilmnoqrstuwxz]|b[abdefghijmnorstvwyz]|c[acdfghiklmnoruvwxyz]|d[ejkmoz]|e[cegrstu]|f[ijkmor]|g[abdefghilmnpqrstuwy]|h[kmnrtu]|i[delmnoqrst]|j[emop]|k[eghimnprwyz]|l[abcikrstuvy]|m[acdeghklmnopqrstuvwxyz]|n[acefgilopruz]|om|p[aefghklmnrstwy]|qa|r[eosuw]|s[abcdeghijklmnortuvxyz]|t[cdfghjklmnortvwz]|u[agksyz]|v[aceginu]|w[fs]|y[et]|z[amw]",d="biz|com|edu|gov|net|org|pro|web|xxx|aero|asia|coop|info|museum|name|shop|рф".split("|");function p(b){b.__index__=-1,b.__text_cache__=""}function h(b){return function(w,C){var A=w.slice(C);return b.test(A)?A.match(b)[0].length:0}}function m(){return function(b,w){w.normalize(b)}}function g(b){var w=b.re=mye()(b.__opts__),C=b.__tlds__.slice();b.onCompile(),b.__tlds_replaced__||C.push(c),C.push(w.src_xn),w.src_tlds=C.join("|");function A(P){return P.replace("%TLDS%",w.src_tlds)}w.email_fuzzy=RegExp(A(w.tpl_email_fuzzy),"i"),w.link_fuzzy=RegExp(A(w.tpl_link_fuzzy),"i"),w.link_no_ip_fuzzy=RegExp(A(w.tpl_link_no_ip_fuzzy),"i"),w.host_fuzzy_test=RegExp(A(w.tpl_host_fuzzy_test),"i");var R=[];b.__compiled__={};function M(P,W){throw new Error('(LinkifyIt) Invalid schema "'+P+'": '+W)}Object.keys(b.__schemas__).forEach(function(P){var W=b.__schemas__[P];if(W!==null){var z={validate:null,link:null};if(b.__compiled__[P]=z,r(W)){o(W.validate)?z.validate=h(W.validate):s(W.validate)?z.validate=W.validate:M(P,W),s(W.normalize)?z.normalize=W.normalize:W.normalize?M(P,W):z.normalize=m();return}if(n(W)){R.push(P);return}M(P,W)}}),R.forEach(function(P){b.__compiled__[b.__schemas__[P]]&&(b.__compiled__[P].validate=b.__compiled__[b.__schemas__[P]].validate,b.__compiled__[P].normalize=b.__compiled__[b.__schemas__[P]].normalize)}),b.__compiled__[""]={validate:null,normalize:m()};var O=Object.keys(b.__compiled__).filter(function(P){return P.length>0&&b.__compiled__[P]}).map(a).join("|");b.re.schema_test=RegExp("(^|(?!_)(?:[><|]|"+w.src_ZPCc+"))("+O+")","i"),b.re.schema_search=RegExp("(^|(?!_)(?:[><|]|"+w.src_ZPCc+"))("+O+")","ig"),b.re.schema_at_start=RegExp("^"+b.re.schema_search.source,"i"),b.re.pretest=RegExp("("+b.re.schema_test.source+")|("+b.re.host_fuzzy_test.source+")|@","i"),p(b)}function v(b,w){var C=b.__index__,A=b.__last_index__,R=b.__text_cache__.slice(C,A);this.schema=b.__schema__.toLowerCase(),this.index=C+w,this.lastIndex=A+w,this.raw=R,this.text=R,this.url=R}function y(b,w){var C=new v(b,w);return b.__compiled__[C.schema].normalize(C,b),C}function k(b,w){if(!(this instanceof k))return new k(b,w);w||l(b)&&(w=b,b={}),this.__opts__=e({},i,w),this.__index__=-1,this.__last_index__=-1,this.__schema__="",this.__text_cache__="",this.__schemas__=e({},u,b),this.__compiled__={},this.__tlds__=d,this.__tlds_replaced__=!1,this.re={},g(this)}return k.prototype.add=function(w,C){return this.__schemas__[w]=C,g(this),this},k.prototype.set=function(w){return this.__opts__=e(this.__opts__,w),this},k.prototype.test=function(w){if(this.__text_cache__=w,this.__index__=-1,!w.length)return!1;var C,A,R,M,O,P,W,z,re;if(this.re.schema_test.test(w)){for(W=this.re.schema_search,W.lastIndex=0;(C=W.exec(w))!==null;)if(M=this.testSchemaAt(w,C[2],W.lastIndex),M){this.__schema__=C[2],this.__index__=C.index+C[1].length,this.__last_index__=C.index+C[0].length+M;break}}return this.__opts__.fuzzyLink&&this.__compiled__["http:"]&&(z=w.search(this.re.host_fuzzy_test),z>=0&&(this.__index__<0||z=0&&(R=w.match(this.re.email_fuzzy))!==null&&(O=R.index+R[1].length,P=R.index+R[0].length,(this.__index__<0||Othis.__last_index__)&&(this.__schema__="mailto:",this.__index__=O,this.__last_index__=P))),this.__index__>=0},k.prototype.pretest=function(w){return this.re.pretest.test(w)},k.prototype.testSchemaAt=function(w,C,A){return this.__compiled__[C.toLowerCase()]?this.__compiled__[C.toLowerCase()].validate(w,A,this):0},k.prototype.match=function(w){var C=0,A=[];this.__index__>=0&&this.__text_cache__===w&&(A.push(y(this,C)),C=this.__last_index__);for(var R=C?w.slice(C):w;this.test(R);)A.push(y(this,C)),R=R.slice(this.__last_index__),C+=this.__last_index__;return A.length?A:null},k.prototype.matchAtStart=function(w){if(this.__text_cache__=w,this.__index__=-1,!w.length)return null;var C=this.re.schema_at_start.exec(w);if(!C)return null;var A=this.testSchemaAt(w,C[2],C[0].length);return A?(this.__schema__=C[2],this.__index__=C.index+C[1].length,this.__last_index__=C.index+C[0].length+A,y(this,0)):null},k.prototype.tlds=function(w,C){return w=Array.isArray(w)?w:[w],C?(this.__tlds__=this.__tlds__.concat(w).sort().filter(function(A,R,M){return A!==M[R-1]}).reverse(),g(this),this):(this.__tlds__=w.slice(),this.__tlds_replaced__=!0,g(this),this)},k.prototype.normalize=function(w){w.schema||(w.url="http://"+w.url),w.schema==="mailto:"&&!/^mailto:/i.test(w.url)&&(w.url="mailto:"+w.url)},k.prototype.onCompile=function(){},Zu=k,Zu}const Jo=2147483647,Bn=36,Ip=1,_a=26,vye=38,yye=700,x_=72,w_=128,k_="-",bye=/^xn--/,_ye=/[^\0-\x7F]/,xye=/[\x2E\u3002\uFF0E\uFF61]/g,wye={overflow:"Overflow: input needs wider integers to process","not-basic":"Illegal input >= 0x80 (not a basic code point)","invalid-input":"Invalid input"},Xu=Bn-Ip,qn=Math.floor,Ju=String.fromCharCode;function Fr(e){throw new RangeError(wye[e])}function kye(e,t){const n=[];let r=e.length;for(;r--;)n[r]=t(e[r]);return n}function C_(e,t){const n=e.split("@");let r="";n.length>1&&(r=n[0]+"@",e=n[1]),e=e.replace(xye,".");const o=e.split("."),s=kye(o,t).join(".");return r+s}function Lp(e){const t=[];let n=0;const r=e.length;for(;n=55296&&o<=56319&&nString.fromCodePoint(...e),Cye=function(e){return e>=48&&e<58?26+(e-48):e>=65&&e<91?e-65:e>=97&&e<123?e-97:Bn},vv=function(e,t){return e+22+75*(e<26)-((t!=0)<<5)},E_=function(e,t,n){let r=0;for(e=n?qn(e/yye):e>>1,e+=qn(e/t);e>Xu*_a>>1;r+=Bn)e=qn(e/Xu);return qn(r+(Xu+1)*e/(e+vye))},Np=function(e){const t=[],n=e.length;let r=0,o=w_,s=x_,a=e.lastIndexOf(k_);a<0&&(a=0);for(let i=0;i=128&&Fr("not-basic"),t.push(e.charCodeAt(i));for(let i=a>0?a+1:0;i=n&&Fr("invalid-input");const p=Cye(e.charCodeAt(i++));p>=Bn&&Fr("invalid-input"),p>qn((Jo-r)/c)&&Fr("overflow"),r+=p*c;const h=d<=s?Ip:d>=s+_a?_a:d-s;if(pqn(Jo/m)&&Fr("overflow"),c*=m}const u=t.length+1;s=E_(r-l,u,l==0),qn(r/u)>Jo-o&&Fr("overflow"),o+=qn(r/u),r%=u,t.splice(r++,0,o)}return String.fromCodePoint(...t)},zp=function(e){const t=[];e=Lp(e);const n=e.length;let r=w_,o=0,s=x_;for(const l of e)l<128&&t.push(Ju(l));const a=t.length;let i=a;for(a&&t.push(k_);i=r&&cqn((Jo-o)/u)&&Fr("overflow"),o+=(l-r)*u,r=l;for(const c of e)if(cJo&&Fr("overflow"),c===r){let d=o;for(let p=Bn;;p+=Bn){const h=p<=s?Ip:p>=s+_a?_a:p-s;if(d=0))try{k.hostname=l.toASCII(k.hostname)}catch{}return i.encode(i.format(k))}function g(y){var k=i.parse(y,!0);if(k.hostname&&(!k.protocol||h.indexOf(k.protocol)>=0))try{k.hostname=l.toUnicode(k.hostname)}catch{}return i.decode(i.format(k),i.decode.defaultChars+"%")}function v(y,k){if(!(this instanceof v))return new v(y,k);k||e.isString(y)||(k=y||{},y="default"),this.inline=new s,this.block=new o,this.core=new r,this.renderer=new n,this.linkify=new a,this.validateLink=p,this.normalizeLink=m,this.normalizeLinkText=g,this.utils=e,this.helpers=e.assign({},t),this.options={},this.configure(y),k&&this.set(k)}return v.prototype.set=function(y){return e.assign(this.options,y),this},v.prototype.configure=function(y){var k=this,b;if(e.isString(y)&&(b=y,y=u[b],!y))throw new Error('Wrong `markdown-it` preset "'+b+'", check name');if(!y)throw new Error("Wrong `markdown-it` preset, can't be empty");return y.options&&k.set(y.options),y.components&&Object.keys(y.components).forEach(function(w){y.components[w].rules&&k[w].ruler.enableOnly(y.components[w].rules),y.components[w].rules2&&k[w].ruler2.enableOnly(y.components[w].rules2)}),this},v.prototype.enable=function(y,k){var b=[];Array.isArray(y)||(y=[y]),["core","block","inline"].forEach(function(C){b=b.concat(this[C].ruler.enable(y,!0))},this),b=b.concat(this.inline.ruler2.enable(y,!0));var w=y.filter(function(C){return b.indexOf(C)<0});if(w.length&&!k)throw new Error("MarkdownIt. Failed to enable unknown rule(s): "+w);return this},v.prototype.disable=function(y,k){var b=[];Array.isArray(y)||(y=[y]),["core","block","inline"].forEach(function(C){b=b.concat(this[C].ruler.disable(y,!0))},this),b=b.concat(this.inline.ruler2.disable(y,!0));var w=y.filter(function(C){return b.indexOf(C)<0});if(w.length&&!k)throw new Error("MarkdownIt. Failed to disable unknown rule(s): "+w);return this},v.prototype.use=function(y){var k=[this].concat(Array.prototype.slice.call(arguments,1));return y.apply(y,k),this},v.prototype.parse=function(y,k){if(typeof y!="string")throw new Error("Input data should be a String");var b=new this.core.State(y,this,k);return this.core.process(b),b.tokens},v.prototype.render=function(y,k){return k=k||{},this.renderer.render(this.parse(y,k),this.options,k)},v.prototype.parseInline=function(y,k){var b=new this.core.State(y,this,k);return b.inlineMode=!0,this.core.process(b),b.tokens},v.prototype.renderInline=function(y,k){return k=k||{},this.renderer.render(this.parseInline(y,k),this.options,k)},nd=v,nd}var rd,wv;function Rye(){return wv||(wv=1,rd=Mye()),rd}var Pye=Rye();const $ye=t$(Pye),Fye=I({name:"VueMarkdown",props:{source:{type:String,required:!0},options:{type:Object,required:!1},plugins:{type:Array,required:!1}},setup(e){const t=F(new $ye(e.options??{}));for(const r of e.plugins??[])t.value.use(r);const n=$(()=>t.value.render(e.source));return()=>Vt("div",{innerHTML:n.value})}}),kv=Yn(),T_=Wn("report",()=>{const e=F([]),t=F(null);return{getReports:()=>{kv.get("/api/reports").then(s=>{e.value=s.data}).catch(s=>{console.error("[report.ts]",s)})},deleteReport:s=>{kv.delete(`/api/reports/${s.id}`).then(()=>{e.value=e.value.filter(a=>a.id!==s.id)}).catch(a=>{console.error("[report.ts]",a)})},selectReport:s=>{t.value=s},reports:e,selectedReport:t}}),Iye={class:"flex h-full flex-col"},Lye={class:"flex items-center p-2"},Nye={class:"flex items-center gap-2"},zye={key:0,class:"flex flex-1 flex-col"},Bye={class:"flex items-center p-4"},qye={class:"flex items-start gap-4 text-sm"},Vye={class:"grid gap-1"},jye={class:"text-lg font-semibold"},Hye={key:0,class:"ml-auto text-xs font-semibold text-muted-foreground"},Uye={class:"h-screen space-y-2 overflow-y-auto whitespace-pre-wrap bg-muted/50 p-1 text-sm text-foreground/80"},Wye={class:"rounded-md bg-background p-10"},Yye={key:1,class:"p-8 text-center text-sm font-medium text-muted-foreground"},Gye=I({__name:"ReportsDisplay",props:{report:{}},setup(e){const t=T_(),n=e,r=()=>{n.report&&t.deleteReport(n.report)};return(o,s)=>(S(),K("div",Iye,[E("div",Lye,[E("div",Nye,[x(f(Qt),null,{default:_(()=>[x(f(tn),{"as-child":""},{default:_(()=>[x(f(ut),{variant:"ghost",size:"icon",disabled:!o.report,onClick:r},{default:_(()=>[x(f(ms),{class:"size-4"}),s[0]||(s[0]=E("span",{class:"sr-only"},"Delete report",-1))]),_:1},8,["disabled"])]),_:1}),x(f(en),null,{default:_(()=>s[1]||(s[1]=[oe("Delete report")])),_:1})]),_:1})])]),x(f(Ge)),o.report?(S(),K("div",zye,[E("div",Bye,[E("div",qye,[E("div",Vye,[E("div",jye,ne(o.report.domain),1)])]),o.report.created_at?(S(),K("div",Hye,ne(f(Qf)(new Date(o.report.created_at),"PPpp")),1)):_e("",!0)]),x(f(Ge)),E("div",Uye,[E("div",Wye,[x(f(Fye),{id:"report-markdown",source:o.report.markdown},null,8,["source"])])])])):(S(),K("div",Yye," No report selected. "))]))}}),Kye={class:"flex items-center px-4 py-2"},Zye={class:"bg-background/95 p-4 backdrop-blur supports-[backdrop-filter]:bg-background/60"},Xye={class:"relative"},Jye=I({__name:"ReportsMain",setup(e){const t=T_(),n=$(()=>t.reports),r=F(n.value.length>0?n.value[0].id:void 0),o=F(""),s=bs(o,250),a=F([20,30,70]),i=$(()=>{let u=[];return s.value?.trim()?u=n.value.filter(d=>d.domain.includes(s.value)):u=n.value,u}),l=$(()=>n.value.find(u=>u.id===r.value));return $e(()=>{t.getReports(),n.value.length>0&&(r.value=n.value[0].id)}),(u,c)=>(S(),L(f(cn),{"delay-duration":0},{default:_(()=>[x(f(Jr),{id:"resize-panel-group-1",direction:"horizontal",class:"h-full items-stretch"},{default:_(()=>[x(f(Ge),{orientation:"vertical"}),x(f(Mt),{id:"resize-panel-2","default-size":a.value[1],"min-size":20},{default:_(()=>[x(f(ja),{"default-value":"all"},{default:_(()=>[E("div",Kye,[c[5]||(c[5]=E("h1",{class:"text-xl font-bold"}," Reports ",-1)),x(f(Ha),{class:"ml-auto"},{default:_(()=>[x(f(Un),{value:"all",class:"text-zinc-600 dark:text-zinc-200"},{default:_(()=>c[3]||(c[3]=[oe(" All ")])),_:1}),x(f(Un),{value:"unread",class:"text-zinc-600 dark:text-zinc-200"},{default:_(()=>c[4]||(c[4]=[oe(" Archived ")])),_:1})]),_:1})]),x(f(Ge)),x(_s,{"hint-key":"reports.main"},{default:_(()=>c[6]||(c[6]=[oe(" View and filter available reports. ")])),_:1}),E("div",Zye,[E("div",Xye,[x(f(ko),{class:"absolute left-2 top-2.5 size-4 text-muted-foreground"}),x(f(An),{modelValue:o.value,"onUpdate:modelValue":c[0]||(c[0]=d=>o.value=d),placeholder:"filter...",class:"pl-8"},null,8,["modelValue"])])]),x(f(Yr),{value:"all",class:"m-0"},{default:_(()=>[x(ag,{"selected-report":r.value,"onUpdate:selectedReport":c[1]||(c[1]=d=>r.value=d),items:i.value},null,8,["selected-report","items"])]),_:1}),x(f(Yr),{value:"unread",class:"m-0"},{default:_(()=>[x(ag,{"selected-report":r.value,"onUpdate:selectedReport":c[2]||(c[2]=d=>r.value=d),items:i.value},null,8,["selected-report","items"])]),_:1})]),_:1})]),_:1},8,["default-size"]),x(f(Qr),{id:"resiz-handle-2","with-handle":""}),x(f(Mt),{id:"resize-panel-3","default-size":a.value[2]},{default:_(()=>[x(Gye,{report:l.value},null,8,["report"])]),_:1},8,["default-size"])]),_:1})]),_:1}))}}),Qye={class:"flex items-center px-4 py-2"},e1e={class:"bg-background/95 p-4 backdrop-blur supports-[backdrop-filter]:bg-background/60"},t1e={class:"relative"},n1e=I({__name:"SettingsMain",setup(e){const t=lc(),n=$(()=>t.endpoints),r=F(n.value.length>0?n.value[0].id:void 0),o=F(""),s=bs(o,250),a=F([20,30,70]),i=$(()=>{let u=[];return s.value?.trim()?u=n.value.filter(d=>d.hostname.includes(s.value)||d.path.includes(s.value)):u=n.value,u}),l=$(()=>n.value.find(u=>u.id===r.value));return $e(()=>{t.getEndpoints(),n.value.length>0&&(r.value=n.value[0].id)}),(u,c)=>(S(),L(f(cn),{"delay-duration":0},{default:_(()=>[x(f(Jr),{id:"resize-panel-group-1",direction:"horizontal",class:"h-full items-stretch"},{default:_(()=>[x(f(Ge),{orientation:"vertical"}),x(f(Mt),{id:"resize-panel-2","default-size":a.value[1],"min-size":20},{default:_(()=>[x(f(ja),{"default-value":"all"},{default:_(()=>[E("div",Qye,[c[5]||(c[5]=E("h1",{class:"text-xl font-bold"}," Settings ",-1)),x(f(Ha),{class:"ml-auto"},{default:_(()=>[x(f(Un),{value:"all",class:"text-zinc-600 dark:text-zinc-200"},{default:_(()=>c[3]||(c[3]=[oe(" All ")])),_:1}),x(f(Un),{value:"unread",class:"text-zinc-600 dark:text-zinc-200"},{default:_(()=>c[4]||(c[4]=[oe(" APIs ")])),_:1})]),_:1})]),x(f(Ge)),E("div",e1e,[E("div",t1e,[x(f(ko),{class:"absolute left-2 top-2.5 size-4 text-muted-foreground"}),x(f(An),{modelValue:o.value,"onUpdate:modelValue":c[0]||(c[0]=d=>o.value=d),placeholder:"filter...",class:"pl-8"},null,8,["modelValue"])])]),x(f(Yr),{value:"all",class:"m-0 bg-secondary/50"},{default:_(()=>[x(al,{"selected-endpoint":r.value,"onUpdate:selectedEndpoint":c[1]||(c[1]=d=>r.value=d),items:i.value},null,8,["selected-endpoint","items"])]),_:1}),x(f(Yr),{value:"unread",class:"m-0"},{default:_(()=>[x(al,{"selected-endpoint":r.value,"onUpdate:selectedEndpoint":c[2]||(c[2]=d=>r.value=d),items:i.value},null,8,["selected-endpoint","items"])]),_:1})]),_:1})]),_:1},8,["default-size"]),x(f(Qr),{id:"resiz-handle-2","with-handle":""}),x(f(Mt),{id:"resize-panel-3","default-size":a.value[2]},{default:_(()=>[x(h_,{endpoint:l.value},null,8,["endpoint"])]),_:1},8,["default-size"])]),_:1})]),_:1}))}}),Cv=I({__name:"Card",props:{class:{}},setup(e){const t=e;return(n,r)=>(S(),K("div",{class:Ee(f(xe)("rounded-xl border bg-card text-card-foreground shadow",t.class))},[V(n.$slots,"default")],2))}}),r1e=I({__name:"CardContent",props:{class:{}},setup(e){const t=e;return(n,r)=>(S(),K("div",{class:Ee(f(xe)("p-6 pt-0",t.class))},[V(n.$slots,"default")],2))}}),Sv=I({__name:"CardDescription",props:{class:{}},setup(e){const t=e;return(n,r)=>(S(),K("p",{class:Ee(f(xe)("text-sm text-muted-foreground",t.class))},[V(n.$slots,"default")],2))}}),Ev=I({__name:"CardHeader",props:{class:{}},setup(e){const t=e;return(n,r)=>(S(),K("div",{class:Ee(f(xe)("flex flex-col gap-y-1.5 p-6",t.class))},[V(n.$slots,"default")],2))}}),Av=I({__name:"CardTitle",props:{class:{}},setup(e){const t=e;return(n,r)=>(S(),K("h3",{class:Ee(f(xe)("font-semibold leading-none tracking-tight",t.class))},[V(n.$slots,"default")],2))}}),o1e=1,s1e=1e6,cr={ADD_TOAST:"ADD_TOAST",UPDATE_TOAST:"UPDATE_TOAST",DISMISS_TOAST:"DISMISS_TOAST",REMOVE_TOAST:"REMOVE_TOAST"};let od=0;function a1e(){return od=(od+1)%Number.MAX_VALUE,od.toString()}const sd=new Map;function Dv(e){if(sd.has(e))return;const t=setTimeout(()=>{sd.delete(e),Js({type:cr.REMOVE_TOAST,toastId:e})},s1e);sd.set(e,t)}const mn=F({toasts:[]});function Js(e){switch(e.type){case cr.ADD_TOAST:mn.value.toasts=[e.toast,...mn.value.toasts].slice(0,o1e);break;case cr.UPDATE_TOAST:mn.value.toasts=mn.value.toasts.map(t=>t.id===e.toast.id?{...t,...e.toast}:t);break;case cr.DISMISS_TOAST:{const{toastId:t}=e;t?Dv(t):mn.value.toasts.forEach(n=>{Dv(n.id)}),mn.value.toasts=mn.value.toasts.map(n=>n.id===t||t===void 0?{...n,open:!1}:n);break}case cr.REMOVE_TOAST:e.toastId===void 0?mn.value.toasts=[]:mn.value.toasts=mn.value.toasts.filter(t=>t.id!==e.toastId);break}}function O_(){return{toasts:$(()=>mn.value.toasts),toast:i1e,dismiss:e=>Js({type:cr.DISMISS_TOAST,toastId:e})}}function i1e(e){const t=a1e(),n=o=>Js({type:cr.UPDATE_TOAST,toast:{...o,id:t}}),r=()=>Js({type:cr.DISMISS_TOAST,toastId:t});return Js({type:cr.ADD_TOAST,toast:{...e,id:t,open:!0,onOpenChange:o=>{o||r()}}}),{id:t,dismiss:r,update:n}}const ad=Yn(),M_=Wn("collab",()=>{const e=F({enabled:!1});return{tunnel:e,tunnelStart:()=>{ad.post("/api/tunnel/start").then(()=>{e.value.enabled=!0}).catch(()=>{e.value.enabled=!1})},tunnelStop:()=>{ad.post("/api/tunnel/stop").then(()=>{e.value.enabled=!1}).catch(()=>{e.value.enabled=!1}).finally(()=>{e.value.url=""})},tunnelStatus:()=>{ad.get("/api/tunnel/status").then(o=>{e.value.enabled=!0,e.value.url=o.data.url}).catch(()=>{e.value.enabled=!1})}}}),l1e={class:"flex items-center justify-between px-4 py-3"},c1e={class:"flex items-center space-x-2"},u1e={class:"h-screen bg-muted/50 pt-4"},d1e={key:0,class:"flex items-center space-x-2 text-xs text-foreground"},f1e=I({__name:"CollaborateMain",setup(e){const t=F([20,30,70]),n=M_(),{toast:r}=O_(),o=$(()=>n.tunnel),s=()=>{o.value.url&&(navigator.clipboard.writeText(o.value.url),r({title:"URL copied to clipboard",description:"You can now share this URL with your team to collaborate."}))},a=()=>{n.tunnel.enabled?n.tunnelStop():(n.tunnelStart(),i())},i=()=>{n.tunnelStatus(),console.log("pinging tunnel status",o.value.url),(o.value.url===""||o.value.url===void 0)&&setTimeout(i,1e3)};return $e(()=>{n.tunnelStatus()}),(l,u)=>(S(),L(f(cn),{"delay-duration":0},{default:_(()=>[x(f(Jr),{id:"resize-panel-group-1",direction:"horizontal",class:"h-full items-stretch"},{default:_(()=>[x(f(Ge),{orientation:"vertical"}),x(f(Mt),{id:"resize-panel-2","default-size":t.value[1],"min-size":20},{default:_(()=>[E("div",l1e,[u[0]||(u[0]=E("h1",{class:"text-xl font-bold"}," Collaborate ",-1)),E("div",c1e,[x(f(p_),{for:"proxy-status",class:"text-xs text-muted-foreground"},{default:_(()=>[oe("Tunnel "+ne(o.value.enabled?"on":"off"),1)]),_:1}),x(f(f_),{id:"proxy-status",checked:o.value.enabled,onClick:Ct(a,["prevent"])},null,8,["checked"])])]),x(f(Ge)),E("div",u1e,[o.value.enabled?(S(),L(f(Cv),{key:0,class:"mx-4"},{default:_(()=>[x(f(Ev),null,{default:_(()=>[x(f(Av),null,{default:_(()=>u[1]||(u[1]=[oe("Tunnel URL")])),_:1}),x(f(Sv),{class:"text-xs"},{default:_(()=>u[2]||(u[2]=[oe("Share this URL with your team to collaborate.")])),_:1})]),_:1}),x(f(r1e),null,{default:_(()=>[o.value.url?(S(),K("div",d1e,[E("div",{class:"cursor-pointer text-muted-foreground hover:text-primary",onClick:s},[x(f(b3),{class:"size-4"})]),E("div",null,ne(o.value.url),1)])):_e("",!0)]),_:1})]),_:1})):(S(),L(f(Cv),{key:1,class:"mx-4"},{default:_(()=>[x(f(Ev),null,{default:_(()=>[x(f(Av),null,{default:_(()=>u[3]||(u[3]=[oe("Create a Tunnel")])),_:1}),x(f(Sv),{class:"text-xs"},{default:_(()=>u[4]||(u[4]=[oe("Create a secure tunnel to collaborate with your team.")])),_:1})]),_:1})]),_:1}))])]),_:1},8,["default-size"]),x(f(Qr),{id:"resiz-handle-2","with-handle":""}),x(f(Mt),{id:"resize-panel-3","default-size":t.value[2]},{default:_(()=>[x(d_,{endpoint:void 0})]),_:1},8,["default-size"])]),_:1})]),_:1}))}}),p1e=[{path:"/",name:"root",component:og},{path:"/scan",name:"scan",component:og},{path:"/explore",name:"explore",component:M6},{path:"/replay",name:"replay",component:y9},{path:"/test",name:"test",component:u5},{path:"/agent",name:"agent",component:U5},{path:"/collaborate",name:"collaborate",component:f1e},{path:"/settings",name:"settings",component:n1e},{path:"/reports",name:"reports",component:Jye}],R_=E2({history:t2(),routes:p1e}),h1e=I({__name:"Toast",props:{class:{},variant:{},onOpenChange:{type:Function},defaultOpen:{type:Boolean},forceMount:{type:Boolean},type:{},open:{type:Boolean},duration:{},asChild:{type:Boolean},as:{}},emits:["escapeKeyDown","pause","resume","swipeStart","swipeMove","swipeCancel","swipeEnd","update:open"],setup(e,{emit:t}){const n=e,r=t,o=$(()=>{const{class:a,...i}=n;return i}),s=yt(o,r);return(a,i)=>(S(),L(f(zP),le(f(s),{class:f(xe)(f(x1e)({variant:a.variant}),n.class),"onUpdate:open":a.onOpenChange}),{default:_(()=>[V(a.$slots,"default")]),_:3},16,["class","onUpdate:open"]))}}),m1e=I({__name:"ToastClose",props:{asChild:{type:Boolean},as:{},class:{}},setup(e){const t=e,n=$(()=>{const{class:r,...o}=t;return o});return(r,o)=>(S(),L(f(qP),le(n.value,{class:f(xe)("absolute right-1 top-1 rounded-md p-1 text-foreground/50 opacity-0 transition-opacity hover:text-foreground focus:opacity-100 focus:outline-none focus:ring-1 group-hover:opacity-100 group-[.destructive]:text-red-300 group-[.destructive]:hover:text-red-50 group-[.destructive]:focus:ring-red-400 group-[.destructive]:focus:ring-offset-red-600",t.class)}),{default:_(()=>[x(f(c_),{class:"h-4 w-4"})]),_:1},16,["class"]))}}),Tv=I({__name:"ToastDescription",props:{asChild:{type:Boolean},as:{},class:{}},setup(e){const t=e,n=$(()=>{const{class:r,...o}=t;return o});return(r,o)=>(S(),L(f(HP),le({class:f(xe)("text-sm opacity-90",t.class)},n.value),{default:_(()=>[V(r.$slots,"default")]),_:3},16,["class"]))}}),g1e={class:"grid gap-1"},v1e=I({__name:"Toaster",setup(e){const{toasts:t}=O_();return(n,r)=>(S(),L(f(y1e),null,{default:_(()=>[(S(!0),K(Fe,null,It(f(t),o=>(S(),L(f(h1e),le({key:o.id,ref_for:!0},o),{default:_(()=>[E("div",g1e,[o.title?(S(),L(f(b1e),{key:0},{default:_(()=>[oe(ne(o.title),1)]),_:2},1024)):_e("",!0),o.description?(S(),K(Fe,{key:1},[ts(o.description)?(S(),L(f(Tv),{key:0},{default:_(()=>[(S(),L(Qo(o.description)))]),_:2},1024)):(S(),L(f(Tv),{key:1},{default:_(()=>[oe(ne(o.description),1)]),_:2},1024))],64)):_e("",!0),x(f(m1e))]),(S(),L(Qo(o.action)))]),_:2},1040))),128)),x(f(_1e))]),_:1}))}}),y1e=I({__name:"ToastProvider",props:{label:{},duration:{},swipeDirection:{},swipeThreshold:{}},setup(e){const t=e;return(n,r)=>(S(),L(f(TP),St(Et(t)),{default:_(()=>[V(n.$slots,"default")]),_:3},16))}}),b1e=I({__name:"ToastTitle",props:{asChild:{type:Boolean},as:{},class:{}},setup(e){const t=e,n=$(()=>{const{class:r,...o}=t;return o});return(r,o)=>(S(),L(f(jP),le(n.value,{class:f(xe)("text-sm font-semibold [&+div]:text-xs",t.class)}),{default:_(()=>[V(r.$slots,"default")]),_:3},16,["class"]))}}),_1e=I({__name:"ToastViewport",props:{hotkey:{},label:{type:[String,Function]},asChild:{type:Boolean},as:{},class:{}},setup(e){const t=e,n=$(()=>{const{class:r,...o}=t;return o});return(r,o)=>(S(),L(f(VP),le(n.value,{class:f(xe)("fixed top-0 z-[100] flex max-h-screen w-full flex-col-reverse p-4 sm:bottom-0 sm:right-0 sm:top-auto sm:flex-col md:max-w-[420px]",t.class)}),null,16,["class"]))}}),x1e=Na("group pointer-events-auto relative flex w-full items-center justify-between space-x-2 overflow-hidden rounded-md border p-4 pr-6 shadow-lg transition-all data-[swipe=cancel]:translate-x-0 data-[swipe=end]:translate-x-[var(--radix-toast-swipe-end-x)] data-[swipe=move]:translate-x-[var(--radix-toast-swipe-move-x)] data-[swipe=move]:transition-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[swipe=end]:animate-out data-[state=closed]:fade-out-80 data-[state=closed]:slide-out-to-right-full data-[state=open]:slide-in-from-top-full data-[state=open]:sm:slide-in-from-bottom-full",{variants:{variant:{default:"border bg-background text-foreground",destructive:"destructive group border-destructive bg-destructive text-destructive-foreground"}},defaultVariants:{variant:"default"}}),w1e="/assets/reaper-BbBV-fSi.svg",Ov=Yn(),Bp=Wn("session",()=>{const e=D2(),t=F(null),n=F(!1),r=F(!0),o=F("");return{currentUser:t,errors:o,loading:r,loggedIn:n,navigationFollow:u=>{t.value?.role==="viewer"&&e.push(u)},signOut:()=>{localStorage.removeItem("reaper.token"),n.value=!1,window.location.href="/"},status:()=>{Ov.get("/status").then(u=>{n.value=!0,t.value=u.data.user}).catch(()=>{}).finally(()=>{r.value=!1})},register:u=>{Ov.post("/register",{username:u.username,invite_code:u.invite_code}).then(c=>{o.value="",t.value=c.data,console.log("[session]",t.value),localStorage.setItem("reaper.token",c.data.user.token),window.location.href="/"}).catch(c=>{o.value=c?.response?.data?.error??c.message,console.error(c)})}}}),k1e=(e,t)=>{const n=e.__vccOpts||e;for(const[r,o]of t)n[r]=o;return n},C1e={},S1e={width:"100%",height:"100%",viewBox:"0 0 395 409",version:"1.1",xmlns:"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","xml:space":"preserve","xmlns:serif":"http://www.serif.com/",style:{"fill-rule":"evenodd","clip-rule":"evenodd","stroke-linejoin":"round","stroke-miterlimit":"2"}};function E1e(e,t){return S(),K("svg",S1e,t[0]||(t[0]=[E("g",{transform:"matrix(1,0,0,1,-799.865,-643.04)"},[E("g",null,[E("path",{d:"M1017.85,1048.43C995.541,1042.68 983.209,1029.76 972.408,1018.44C967.254,1013.03 962.583,1008.14 958.562,1006.37C953.643,1004.22 944.293,1004.74 934.549,1005.28C915.975,1006.32 896.375,1007.41 880.562,994.124C862.251,978.748 857.875,959.36 853.383,939.456C848.48,917.735 843.388,895.176 810.211,884.263C802.348,881.707 798.046,873.26 800.603,865.397C802.289,860.21 806.539,856.573 811.493,855.432C862.421,841.107 893.533,821.942 914.944,799.812C936.39,777.646 948.876,751.444 961.867,724.107C979.243,687.53 1004.16,663.905 1031.29,652.073C1051.59,643.218 1073.02,640.987 1093.47,644.882C1113.87,648.767 1133.22,658.712 1149.41,674.218C1172.3,696.136 1188.85,729.225 1192.79,771.92C1196.27,809.693 1192.19,852.337 1181.85,892.511C1171.65,932.093 1155.31,969.527 1134.02,997.902C1111.49,1027.94 1083.28,1048.16 1050.5,1051.19C1039.97,1052.16 1029.07,1051.32 1017.85,1048.43ZM994.087,997.814C1002.15,1006.26 1011.35,1015.91 1025.23,1019.49C1033.05,1021.5 1040.59,1022.09 1047.81,1021.42C1071.3,1019.26 1092.47,1003.5 1110.12,979.973C1129.01,954.785 1143.65,921.07 1152.9,885.128C1162.43,848.141 1166.2,809.055 1163.02,774.615C1159.8,739.694 1146.71,713.053 1128.67,695.78C1116.77,684.382 1102.69,677.1 1087.96,674.295C1073.28,671.499 1057.87,673.113 1043.24,679.493C1022.4,688.583 1002.96,707.358 988.936,736.88C974.861,766.5 961.326,794.895 936.388,820.67C916.853,840.862 890.792,858.793 852.809,873.308C872.865,889.962 877.781,911.716 882.561,932.894C885.919,947.772 889.19,962.264 899.779,971.157C906.578,976.868 920.097,976.115 932.908,975.401C946.266,974.657 959.083,973.942 970.514,978.954C980.11,983.164 986.755,990.129 994.087,997.814Z",stroke:"currentColor",fill:"currentColor",style:{"fill-rule":"nonzero"}}),E("path",{d:"M1064.1,749.426C1074.94,749.426 1083.73,758.217 1083.73,769.059C1083.73,779.902 1074.94,788.693 1064.1,788.693C1053.25,788.693 1044.46,779.902 1044.46,769.059C1044.46,758.217 1053.25,749.426 1064.1,749.426Z",fill:"currentColor",stroke:"currentColor"}),E("path",{d:"M1120.96,749.426C1131.8,749.426 1140.59,758.217 1140.59,769.059C1140.59,779.902 1131.8,788.693 1120.96,788.693C1110.12,788.693 1101.32,779.902 1101.32,769.059C1101.32,758.217 1110.12,749.426 1120.96,749.426Z",fill:"currentColor",stroke:"currentColor"})])],-1)]))}const Qd=k1e(C1e,[["render",E1e]]),A1e={class:"container relative hidden h-full flex-col items-center justify-center md:grid lg:max-w-none lg:grid-cols-2 lg:px-0"},D1e={class:"relative hidden h-full flex-col bg-muted p-10 text-white dark:border-r lg:flex"},T1e={class:"relative z-20 flex items-center text-lg font-bold tracking-tight"},O1e={class:"lg:p-8"},M1e={class:"mx-auto flex w-full flex-col justify-center space-y-6 sm:w-[300px]"},R1e={class:"h-4 text-xs font-medium text-destructive"},P1e={class:"flex justify-between text-sm text-muted-foreground"},$1e={href:"https://ghostsecurity.com",target:"_blank"},F1e={href:"https://github.com/ghostsecurity/reaper",target:"_blank"},I1e={href:"https://x.com/ghostsecurityhq",target:"_blank"},L1e={href:"https://www.linkedin.com/company/ghostsecurity",target:"_blank"},N1e=I({__name:"SessionMain",setup(e){const t=Bp(),n=F("Reaper Admin"),r=Ty(),o=$(()=>t.errors),s=()=>{t.register({username:n.value,invite_code:r.query.code})};return(a,i)=>(S(),K("div",A1e,[E("div",D1e,[i[2]||(i[2]=E("div",{class:"absolute inset-0 bg-zinc-900"},null,-1)),E("div",T1e,[x(Qd,{class:"mr-4 size-6"}),i[1]||(i[1]=oe(" A Ghost Labs Project "))]),i[3]||(i[3]=E("div",{class:"relative z-20 mt-auto"},[E("blockquote",{class:"space-y-2"},[E("p",{class:"text-lg"}," “In the midst of chaos, there is opportunity.” "),E("footer",{class:"text-sm"}," Sun Tzu ")])],-1))]),E("div",O1e,[E("div",M1e,[i[5]||(i[5]=Pw('
Reaper Logo

Welcome to Reaper

Enter a name to continue.

',1)),x(f(An),{modelValue:n.value,"onUpdate:modelValue":i[0]||(i[0]=l=>n.value=l),placeholder:"Enter your username"},null,8,["modelValue"]),E("div",R1e,ne(o.value),1),x(f(ut),{onClick:s},{default:_(()=>i[4]||(i[4]=[oe("Sign in")])),_:1}),E("div",P1e,[x(f(ut),{"as-child":""},{default:_(()=>[E("a",$1e,[x(Qd,{class:"size-4"})])]),_:1}),x(f(ut),{"as-child":""},{default:_(()=>[E("a",F1e,[x(f(_3),{class:"size-4"})])]),_:1}),x(f(ut),{"as-child":""},{default:_(()=>[E("a",I1e,[x(f(A3),{class:"size-4"})])]),_:1}),x(f(ut),{"as-child":""},{default:_(()=>[E("a",L1e,[x(f(w3),{class:"size-4"})])]),_:1})])])])]))}}),Qs=/^[a-z0-9]+(-[a-z0-9]+)*$/,uc=(e,t,n,r="")=>{const o=e.split(":");if(e.slice(0,1)==="@"){if(o.length<2||o.length>3)return null;r=o.shift().slice(1)}if(o.length>3||!o.length)return null;if(o.length>1){const i=o.pop(),l=o.pop(),u={provider:o.length>0?o[0]:r,prefix:l,name:i};return t&&!Oi(u)?null:u}const s=o[0],a=s.split("-");if(a.length>1){const i={provider:r,prefix:a.shift(),name:a.join("-")};return t&&!Oi(i)?null:i}if(n&&r===""){const i={provider:r,prefix:"",name:s};return t&&!Oi(i,n)?null:i}return null},Oi=(e,t)=>e?!!((e.provider===""||e.provider.match(Qs))&&(t&&e.prefix===""||e.prefix.match(Qs))&&e.name.match(Qs)):!1,P_=Object.freeze({left:0,top:0,width:16,height:16}),il=Object.freeze({rotate:0,vFlip:!1,hFlip:!1}),dc=Object.freeze({...P_,...il}),ef=Object.freeze({...dc,body:"",hidden:!1});function z1e(e,t){const n={};!e.hFlip!=!t.hFlip&&(n.hFlip=!0),!e.vFlip!=!t.vFlip&&(n.vFlip=!0);const r=((e.rotate||0)+(t.rotate||0))%4;return r&&(n.rotate=r),n}function Mv(e,t){const n=z1e(e,t);for(const r in ef)r in il?r in e&&!(r in n)&&(n[r]=il[r]):r in t?n[r]=t[r]:r in e&&(n[r]=e[r]);return n}function B1e(e,t){const n=e.icons,r=e.aliases||Object.create(null),o=Object.create(null);function s(a){if(n[a])return o[a]=[];if(!(a in o)){o[a]=null;const i=r[a]&&r[a].parent,l=i&&s(i);l&&(o[a]=[i].concat(l))}return o[a]}return Object.keys(n).concat(Object.keys(r)).forEach(s),o}function q1e(e,t,n){const r=e.icons,o=e.aliases||Object.create(null);let s={};function a(i){s=Mv(r[i]||o[i],s)}return a(t),n.forEach(a),Mv(e,s)}function $_(e,t){const n=[];if(typeof e!="object"||typeof e.icons!="object")return n;e.not_found instanceof Array&&e.not_found.forEach(o=>{t(o,null),n.push(o)});const r=B1e(e);for(const o in r){const s=r[o];s&&(t(o,q1e(e,o,s)),n.push(o))}return n}const V1e={provider:"",aliases:{},not_found:{},...P_};function id(e,t){for(const n in t)if(n in e&&typeof e[n]!=typeof t[n])return!1;return!0}function F_(e){if(typeof e!="object"||e===null)return null;const t=e;if(typeof t.prefix!="string"||!e.icons||typeof e.icons!="object"||!id(e,V1e))return null;const n=t.icons;for(const o in n){const s=n[o];if(!o.match(Qs)||typeof s.body!="string"||!id(s,ef))return null}const r=t.aliases||Object.create(null);for(const o in r){const s=r[o],a=s.parent;if(!o.match(Qs)||typeof a!="string"||!n[a]&&!r[a]||!id(s,ef))return null}return t}const Rv=Object.create(null);function j1e(e,t){return{provider:e,prefix:t,icons:Object.create(null),missing:new Set}}function _o(e,t){const n=Rv[e]||(Rv[e]=Object.create(null));return n[t]||(n[t]=j1e(e,t))}function qp(e,t){return F_(t)?$_(t,(n,r)=>{r?e.icons[n]=r:e.missing.add(n)}):[]}function H1e(e,t,n){try{if(typeof n.body=="string")return e.icons[t]={...n},!0}catch{}return!1}let xa=!1;function I_(e){return typeof e=="boolean"&&(xa=e),xa}function U1e(e){const t=typeof e=="string"?uc(e,!0,xa):e;if(t){const n=_o(t.provider,t.prefix),r=t.name;return n.icons[r]||(n.missing.has(r)?null:void 0)}}function W1e(e,t){const n=uc(e,!0,xa);if(!n)return!1;const r=_o(n.provider,n.prefix);return H1e(r,n.name,t)}function Y1e(e,t){if(typeof e!="object")return!1;if(typeof t!="string"&&(t=e.provider||""),xa&&!t&&!e.prefix){let o=!1;return F_(e)&&(e.prefix="",$_(e,(s,a)=>{a&&W1e(s,a)&&(o=!0)})),o}const n=e.prefix;if(!Oi({provider:t,prefix:n,name:"a"}))return!1;const r=_o(t,n);return!!qp(r,e)}const L_=Object.freeze({width:null,height:null}),N_=Object.freeze({...L_,...il}),G1e=/(-?[0-9.]*[0-9]+[0-9.]*)/g,K1e=/^-?[0-9.]*[0-9]+[0-9.]*$/g;function Pv(e,t,n){if(t===1)return e;if(n=n||100,typeof e=="number")return Math.ceil(e*t*n)/n;if(typeof e!="string")return e;const r=e.split(G1e);if(r===null||!r.length)return e;const o=[];let s=r.shift(),a=K1e.test(s);for(;;){if(a){const i=parseFloat(s);isNaN(i)?o.push(s):o.push(Math.ceil(i*t*n)/n)}else o.push(s);if(s=r.shift(),s===void 0)return o.join("");a=!a}}function Z1e(e,t="defs"){let n="";const r=e.indexOf("<"+t);for(;r>=0;){const o=e.indexOf(">",r),s=e.indexOf("",s);if(a===-1)break;n+=e.slice(o+1,s).trim(),e=e.slice(0,r).trim()+e.slice(a+1)}return{defs:n,content:e}}function X1e(e,t){return e?""+e+""+t:t}function J1e(e,t,n){const r=Z1e(e);return X1e(r.defs,t+r.content+n)}const Q1e=e=>e==="unset"||e==="undefined"||e==="none";function ebe(e,t){const n={...dc,...e},r={...N_,...t},o={left:n.left,top:n.top,width:n.width,height:n.height};let s=n.body;[n,r].forEach(g=>{const v=[],y=g.hFlip,k=g.vFlip;let b=g.rotate;y?k?b+=2:(v.push("translate("+(o.width+o.left).toString()+" "+(0-o.top).toString()+")"),v.push("scale(-1 1)"),o.top=o.left=0):k&&(v.push("translate("+(0-o.left).toString()+" "+(o.height+o.top).toString()+")"),v.push("scale(1 -1)"),o.top=o.left=0);let w;switch(b<0&&(b-=Math.floor(b/4)*4),b=b%4,b){case 1:w=o.height/2+o.top,v.unshift("rotate(90 "+w.toString()+" "+w.toString()+")");break;case 2:v.unshift("rotate(180 "+(o.width/2+o.left).toString()+" "+(o.height/2+o.top).toString()+")");break;case 3:w=o.width/2+o.left,v.unshift("rotate(-90 "+w.toString()+" "+w.toString()+")");break}b%2===1&&(o.left!==o.top&&(w=o.left,o.left=o.top,o.top=w),o.width!==o.height&&(w=o.width,o.width=o.height,o.height=w)),v.length&&(s=J1e(s,'',""))});const a=r.width,i=r.height,l=o.width,u=o.height;let c,d;a===null?(d=i===null?"1em":i==="auto"?u:i,c=Pv(d,l/u)):(c=a==="auto"?l:a,d=i===null?Pv(c,u/l):i==="auto"?u:i);const p={},h=(g,v)=>{Q1e(v)||(p[g]=v.toString())};h("width",c),h("height",d);const m=[o.left,o.top,l,u];return p.viewBox=m.join(" "),{attributes:p,viewBox:m,body:s}}const tbe=/\sid="(\S+)"/g,nbe="IconifyId"+Date.now().toString(16)+(Math.random()*16777216|0).toString(16);let rbe=0;function obe(e,t=nbe){const n=[];let r;for(;r=tbe.exec(e);)n.push(r[1]);if(!n.length)return e;const o="suffix"+(Math.random()*16777216|Date.now()).toString(16);return n.forEach(s=>{const a=typeof t=="function"?t(s):t+(rbe++).toString(),i=s.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");e=e.replace(new RegExp('([#;"])('+i+')([")]|\\.[a-z])',"g"),"$1"+a+o+"$3")}),e=e.replace(new RegExp(o,"g"),""),e}const tf=Object.create(null);function sbe(e,t){tf[e]=t}function nf(e){return tf[e]||tf[""]}function Vp(e){let t;if(typeof e.resources=="string")t=[e.resources];else if(t=e.resources,!(t instanceof Array)||!t.length)return null;return{resources:t,path:e.path||"/",maxURL:e.maxURL||500,rotate:e.rotate||750,timeout:e.timeout||5e3,random:e.random===!0,index:e.index||0,dataAfterTimeout:e.dataAfterTimeout!==!1}}const jp=Object.create(null),Ls=["https://api.simplesvg.com","https://api.unisvg.com"],Mi=[];for(;Ls.length>0;)Ls.length===1||Math.random()>.5?Mi.push(Ls.shift()):Mi.push(Ls.pop());jp[""]=Vp({resources:["https://api.iconify.design"].concat(Mi)});function abe(e,t){const n=Vp(t);return n===null?!1:(jp[e]=n,!0)}function Hp(e){return jp[e]}const ibe=()=>{let e;try{if(e=fetch,typeof e=="function")return e}catch{}};let $v=ibe();function lbe(e,t){const n=Hp(e);if(!n)return 0;let r;if(!n.maxURL)r=0;else{let o=0;n.resources.forEach(a=>{o=Math.max(o,a.length)});const s=t+".json?icons=";r=n.maxURL-o-n.path.length-s.length}return r}function cbe(e){return e===404}const ube=(e,t,n)=>{const r=[],o=lbe(e,t),s="icons";let a={type:s,provider:e,prefix:t,icons:[]},i=0;return n.forEach((l,u)=>{i+=l.length+1,i>=o&&u>0&&(r.push(a),a={type:s,provider:e,prefix:t,icons:[]},i=l.length),a.icons.push(l)}),r.push(a),r};function dbe(e){if(typeof e=="string"){const t=Hp(e);if(t)return t.path}return"/"}const fbe=(e,t,n)=>{if(!$v){n("abort",424);return}let r=dbe(t.provider);switch(t.type){case"icons":{const s=t.prefix,i=t.icons.join(","),l=new URLSearchParams({icons:i});r+=s+".json?"+l.toString();break}case"custom":{const s=t.uri;r+=s.slice(0,1)==="/"?s.slice(1):s;break}default:n("abort",400);return}let o=503;$v(e+r).then(s=>{const a=s.status;if(a!==200){setTimeout(()=>{n(cbe(a)?"abort":"next",a)});return}return o=501,s.json()}).then(s=>{if(typeof s!="object"||s===null){setTimeout(()=>{s===404?n("abort",s):n("next",o)});return}setTimeout(()=>{n("success",s)})}).catch(()=>{n("next",o)})},pbe={prepare:ube,send:fbe};function hbe(e){const t={loaded:[],missing:[],pending:[]},n=Object.create(null);e.sort((o,s)=>o.provider!==s.provider?o.provider.localeCompare(s.provider):o.prefix!==s.prefix?o.prefix.localeCompare(s.prefix):o.name.localeCompare(s.name));let r={provider:"",prefix:"",name:""};return e.forEach(o=>{if(r.name===o.name&&r.prefix===o.prefix&&r.provider===o.provider)return;r=o;const s=o.provider,a=o.prefix,i=o.name,l=n[s]||(n[s]=Object.create(null)),u=l[a]||(l[a]=_o(s,a));let c;i in u.icons?c=t.loaded:a===""||u.missing.has(i)?c=t.missing:c=t.pending;const d={provider:s,prefix:a,name:i};c.push(d)}),t}function z_(e,t){e.forEach(n=>{const r=n.loaderCallbacks;r&&(n.loaderCallbacks=r.filter(o=>o.id!==t))})}function mbe(e){e.pendingCallbacksFlag||(e.pendingCallbacksFlag=!0,setTimeout(()=>{e.pendingCallbacksFlag=!1;const t=e.loaderCallbacks?e.loaderCallbacks.slice(0):[];if(!t.length)return;let n=!1;const r=e.provider,o=e.prefix;t.forEach(s=>{const a=s.icons,i=a.pending.length;a.pending=a.pending.filter(l=>{if(l.prefix!==o)return!0;const u=l.name;if(e.icons[u])a.loaded.push({provider:r,prefix:o,name:u});else if(e.missing.has(u))a.missing.push({provider:r,prefix:o,name:u});else return n=!0,!0;return!1}),a.pending.length!==i&&(n||z_([e],s.id),s.callback(a.loaded.slice(0),a.missing.slice(0),a.pending.slice(0),s.abort))})}))}let gbe=0;function vbe(e,t,n){const r=gbe++,o=z_.bind(null,n,r);if(!t.pending.length)return o;const s={id:r,icons:t,callback:e,abort:o};return n.forEach(a=>{(a.loaderCallbacks||(a.loaderCallbacks=[])).push(s)}),o}function ybe(e,t=!0,n=!1){const r=[];return e.forEach(o=>{const s=typeof o=="string"?uc(o,t,n):o;s&&r.push(s)}),r}var bbe={resources:[],index:0,timeout:2e3,rotate:750,random:!1,dataAfterTimeout:!1};function _be(e,t,n,r){const o=e.resources.length,s=e.random?Math.floor(Math.random()*o):e.index;let a;if(e.random){let A=e.resources.slice(0);for(a=[];A.length>1;){const R=Math.floor(Math.random()*A.length);a.push(A[R]),A=A.slice(0,R).concat(A.slice(R+1))}a=a.concat(A)}else a=e.resources.slice(s).concat(e.resources.slice(0,s));const i=Date.now();let l="pending",u=0,c,d=null,p=[],h=[];typeof r=="function"&&h.push(r);function m(){d&&(clearTimeout(d),d=null)}function g(){l==="pending"&&(l="aborted"),m(),p.forEach(A=>{A.status==="pending"&&(A.status="aborted")}),p=[]}function v(A,R){R&&(h=[]),typeof A=="function"&&h.push(A)}function y(){return{startTime:i,payload:t,status:l,queriesSent:u,queriesPending:p.length,subscribe:v,abort:g}}function k(){l="failed",h.forEach(A=>{A(void 0,c)})}function b(){p.forEach(A=>{A.status==="pending"&&(A.status="aborted")}),p=[]}function w(A,R,M){const O=R!=="success";switch(p=p.filter(P=>P!==A),l){case"pending":break;case"failed":if(O||!e.dataAfterTimeout)return;break;default:return}if(R==="abort"){c=M,k();return}if(O){c=M,p.length||(a.length?C():k());return}if(m(),b(),!e.random){const P=e.resources.indexOf(A.resource);P!==-1&&P!==e.index&&(e.index=P)}l="completed",h.forEach(P=>{P(M)})}function C(){if(l!=="pending")return;m();const A=a.shift();if(A===void 0){if(p.length){d=setTimeout(()=>{m(),l==="pending"&&(b(),k())},e.timeout);return}k();return}const R={status:"pending",resource:A,callback:(M,O)=>{w(R,M,O)}};p.push(R),u++,d=setTimeout(C,e.rotate),n(A,t,R.callback)}return setTimeout(C),y}function B_(e){const t={...bbe,...e};let n=[];function r(){n=n.filter(i=>i().status==="pending")}function o(i,l,u){const c=_be(t,i,l,(d,p)=>{r(),u&&u(d,p)});return n.push(c),c}function s(i){return n.find(l=>i(l))||null}return{query:o,find:s,setIndex:i=>{t.index=i},getIndex:()=>t.index,cleanup:r}}function Fv(){}const ld=Object.create(null);function xbe(e){if(!ld[e]){const t=Hp(e);if(!t)return;const n=B_(t),r={config:t,redundancy:n};ld[e]=r}return ld[e]}function wbe(e,t,n){let r,o;if(typeof e=="string"){const s=nf(e);if(!s)return n(void 0,424),Fv;o=s.send;const a=xbe(e);a&&(r=a.redundancy)}else{const s=Vp(e);if(s){r=B_(s);const a=e.resources?e.resources[0]:"",i=nf(a);i&&(o=i.send)}}return!r||!o?(n(void 0,424),Fv):r.query(t,o,n)().abort}const Iv="iconify2",wa="iconify",q_=wa+"-count",Lv=wa+"-version",V_=36e5,kbe=168,Cbe=50;function rf(e,t){try{return e.getItem(t)}catch{}}function Up(e,t,n){try{return e.setItem(t,n),!0}catch{}}function Nv(e,t){try{e.removeItem(t)}catch{}}function of(e,t){return Up(e,q_,t.toString())}function sf(e){return parseInt(rf(e,q_))||0}const fc={local:!0,session:!0},j_={local:new Set,session:new Set};let Wp=!1;function Sbe(e){Wp=e}let mi=typeof window>"u"?{}:window;function H_(e){const t=e+"Storage";try{if(mi&&mi[t]&&typeof mi[t].length=="number")return mi[t]}catch{}fc[e]=!1}function U_(e,t){const n=H_(e);if(!n)return;const r=rf(n,Lv);if(r!==Iv){if(r){const i=sf(n);for(let l=0;l{const l=wa+i.toString(),u=rf(n,l);if(typeof u=="string"){try{const c=JSON.parse(u);if(typeof c=="object"&&typeof c.cached=="number"&&c.cached>o&&typeof c.provider=="string"&&typeof c.data=="object"&&typeof c.data.prefix=="string"&&t(c,i))return!0}catch{}Nv(n,l)}};let a=sf(n);for(let i=a-1;i>=0;i--)s(i)||(i===a-1?(a--,of(n,a)):j_[e].add(i))}function W_(){if(!Wp){Sbe(!0);for(const e in fc)U_(e,t=>{const n=t.data,r=t.provider,o=n.prefix,s=_o(r,o);if(!qp(s,n).length)return!1;const a=n.lastModified||-1;return s.lastModifiedCached=s.lastModifiedCached?Math.min(s.lastModifiedCached,a):a,!0})}}function Ebe(e,t){const n=e.lastModifiedCached;if(n&&n>=t)return n===t;if(e.lastModifiedCached=t,n)for(const r in fc)U_(r,o=>{const s=o.data;return o.provider!==e.provider||s.prefix!==e.prefix||s.lastModified===t});return!0}function Abe(e,t){Wp||W_();function n(r){let o;if(!fc[r]||!(o=H_(r)))return;const s=j_[r];let a;if(s.size)s.delete(a=Array.from(s).shift());else if(a=sf(o),a>=Cbe||!of(o,a+1))return;const i={cached:Math.floor(Date.now()/V_),provider:e.provider,data:t};return Up(o,wa+a.toString(),JSON.stringify(i))}t.lastModified&&!Ebe(e,t.lastModified)||Object.keys(t.icons).length&&(t.not_found&&(t=Object.assign({},t),delete t.not_found),n("local")||n("session"))}function zv(){}function Dbe(e){e.iconsLoaderFlag||(e.iconsLoaderFlag=!0,setTimeout(()=>{e.iconsLoaderFlag=!1,mbe(e)}))}function Tbe(e,t){e.iconsToLoad?e.iconsToLoad=e.iconsToLoad.concat(t).sort():e.iconsToLoad=t,e.iconsQueueFlag||(e.iconsQueueFlag=!0,setTimeout(()=>{e.iconsQueueFlag=!1;const{provider:n,prefix:r}=e,o=e.iconsToLoad;delete e.iconsToLoad;let s;if(!o||!(s=nf(n)))return;s.prepare(n,r,o).forEach(i=>{wbe(n,i,l=>{if(typeof l!="object")i.icons.forEach(u=>{e.missing.add(u)});else try{const u=qp(e,l);if(!u.length)return;const c=e.pendingIcons;c&&u.forEach(d=>{c.delete(d)}),Abe(e,l)}catch(u){console.error(u)}Dbe(e)})})}))}const Obe=(e,t)=>{const n=ybe(e,!0,I_()),r=hbe(n);if(!r.pending.length){let l=!0;return t&&setTimeout(()=>{l&&t(r.loaded,r.missing,r.pending,zv)}),()=>{l=!1}}const o=Object.create(null),s=[];let a,i;return r.pending.forEach(l=>{const{provider:u,prefix:c}=l;if(c===i&&u===a)return;a=u,i=c,s.push(_o(u,c));const d=o[u]||(o[u]=Object.create(null));d[c]||(d[c]=[])}),r.pending.forEach(l=>{const{provider:u,prefix:c,name:d}=l,p=_o(u,c),h=p.pendingIcons||(p.pendingIcons=new Set);h.has(d)||(h.add(d),o[u][c].push(d))}),s.forEach(l=>{const{provider:u,prefix:c}=l;o[u][c].length&&Tbe(l,o[u][c])}),t?vbe(t,r,s):zv};function Mbe(e,t){const n={...e};for(const r in t){const o=t[r],s=typeof o;r in L_?(o===null||o&&(s==="string"||s==="number"))&&(n[r]=o):s===typeof n[r]&&(n[r]=r==="rotate"?o%4:o)}return n}const Rbe=/[\s,]+/;function Pbe(e,t){t.split(Rbe).forEach(n=>{switch(n.trim()){case"horizontal":e.hFlip=!0;break;case"vertical":e.vFlip=!0;break}})}function $be(e,t=0){const n=e.replace(/^-?[0-9.]*/,"");function r(o){for(;o<0;)o+=4;return o%4}if(n===""){const o=parseInt(e);return isNaN(o)?0:r(o)}else if(n!==e){let o=0;switch(n){case"%":o=25;break;case"deg":o=90}if(o){let s=parseFloat(e.slice(0,e.length-n.length));return isNaN(s)?0:(s=s/o,s%1===0?r(s):0)}}return t}function Fbe(e,t){let n=e.indexOf("xlink:")===-1?"":' xmlns:xlink="http://www.w3.org/1999/xlink"';for(const r in t)n+=" "+r+'="'+t[r]+'"';return'"+e+""}function Ibe(e){return e.replace(/"/g,"'").replace(/%/g,"%25").replace(/#/g,"%23").replace(//g,"%3E").replace(/\s+/g," ")}function Lbe(e){return"data:image/svg+xml,"+Ibe(e)}function Nbe(e){return'url("'+Lbe(e)+'")'}const Bv={...N_,inline:!1},zbe={xmlns:"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","aria-hidden":!0,role:"img"},Bbe={display:"inline-block"},af={backgroundColor:"currentColor"},Y_={backgroundColor:"transparent"},qv={Image:"var(--svg)",Repeat:"no-repeat",Size:"100% 100%"},Vv={webkitMask:af,mask:af,background:Y_};for(const e in Vv){const t=Vv[e];for(const n in qv)t[e+n]=qv[n]}const Ri={};["horizontal","vertical"].forEach(e=>{const t=e.slice(0,1)+"Flip";Ri[e+"-flip"]=t,Ri[e.slice(0,1)+"-flip"]=t,Ri[e+"Flip"]=t});function jv(e){return e+(e.match(/^[-0-9.]+$/)?"px":"")}const Hv=(e,t)=>{const n=Mbe(Bv,t),r={...zbe},o=t.mode||"svg",s={},a=t.style,i=typeof a=="object"&&!(a instanceof Array)?a:{};for(let g in t){const v=t[g];if(v!==void 0)switch(g){case"icon":case"style":case"onLoad":case"mode":break;case"inline":case"hFlip":case"vFlip":n[g]=v===!0||v==="true"||v===1;break;case"flip":typeof v=="string"&&Pbe(n,v);break;case"color":s.color=v;break;case"rotate":typeof v=="string"?n[g]=$be(v):typeof v=="number"&&(n[g]=v);break;case"ariaHidden":case"aria-hidden":v!==!0&&v!=="true"&&delete r["aria-hidden"];break;default:{const y=Ri[g];y?(v===!0||v==="true"||v===1)&&(n[y]=!0):Bv[g]===void 0&&(r[g]=v)}}}const l=ebe(e,n),u=l.attributes;if(n.inline&&(s.verticalAlign="-0.125em"),o==="svg"){r.style={...s,...i},Object.assign(r,u);let g=0,v=t.id;return typeof v=="string"&&(v=v.replace(/-/g,"_")),r.innerHTML=obe(l.body,v?()=>v+"ID"+g++:"iconifyVue"),Vt("svg",r)}const{body:c,width:d,height:p}=e,h=o==="mask"||(o==="bg"?!1:c.indexOf("currentColor")!==-1),m=Fbe(c,{...u,width:d+"",height:p+""});return r.style={...s,"--svg":Nbe(m),width:jv(u.width),height:jv(u.height),...Bbe,...h?af:Y_,...i},Vt("span",r)};I_(!0);sbe("",pbe);if(typeof document<"u"&&typeof window<"u"){W_();const e=window;if(e.IconifyPreload!==void 0){const t=e.IconifyPreload,n="Invalid IconifyPreload syntax.";typeof t=="object"&&t!==null&&(t instanceof Array?t:[t]).forEach(r=>{try{(typeof r!="object"||r===null||r instanceof Array||typeof r.icons!="object"||typeof r.prefix!="string"||!Y1e(r))&&console.error(n)}catch{console.error(n)}})}if(e.IconifyProviders!==void 0){const t=e.IconifyProviders;if(typeof t=="object"&&t!==null)for(let n in t){const r="IconifyProviders["+n+"] is invalid.";try{const o=t[n];if(typeof o!="object"||!o||o.resources===void 0)continue;abe(n,o)||console.error(r)}catch{console.error(r)}}}}const qbe={...dc,body:""},ea=I({inheritAttrs:!1,data(){return{_name:"",_loadingIcon:null,iconMounted:!1,counter:0}},mounted(){this.iconMounted=!0},unmounted(){this.abortLoading()},methods:{abortLoading(){this._loadingIcon&&(this._loadingIcon.abort(),this._loadingIcon=null)},getIcon(e,t){if(typeof e=="object"&&e!==null&&typeof e.body=="string")return this._name="",this.abortLoading(),{data:e};let n;if(typeof e!="string"||(n=uc(e,!1,!0))===null)return this.abortLoading(),null;const r=U1e(n);if(!r)return(!this._loadingIcon||this._loadingIcon.name!==e)&&(this.abortLoading(),this._name="",r!==null&&(this._loadingIcon={name:e,abort:Obe([n],()=>{this.counter++})})),null;this.abortLoading(),this._name!==e&&(this._name=e,t&&t(e));const o=["iconify"];return n.prefix!==""&&o.push("iconify--"+n.prefix),n.provider!==""&&o.push("iconify--"+n.provider),{data:r,classes:o}}},render(){this.counter;const e=this.$attrs,t=this.iconMounted||e.ssr?this.getIcon(e.icon,e.onLoad):null;if(!t)return Hv(qbe,e);let n=e;return t.classes&&(n={...e,class:(typeof e.class=="string"?e.class+" ":"")+t.classes.join(" ")}),Hv({...dc,...t.data},n)}}),Vbe=["data-collapsed"],jbe={class:"grid gap-1 px-2 group-[[data-collapsed=true]]:justify-center group-[[data-collapsed=true]]:px-2"},Hbe={class:"sr-only"},Ube={key:0,class:"ml-auto text-muted-foreground"},Wbe={key:2,class:"-ml-2 mr-1 rounded-full p-1"},Ybe={key:4,class:"-ml-2 mr-1 rounded-full p-1"},Gbe=I({__name:"SideNav",setup(e){const t=Jf(),n=Rp(),r=$(()=>n.proxy),o=M_(),s=$(()=>o.tunnel),a=Ra(),i=Ty(),l=F(!1),u=$(()=>a.domains.some(p=>p.status==="pending"||p.status==="scanning"||p.status==="probing")),c=p=>p?i.path===p:!1,d=[{title:"Scan",icon:"lucide:binoculars",href:"/scan"},{title:"Explore",icon:"lucide:earth",href:"/explore"},{title:"Replay",icon:"lucide:replace-all",href:"/replay"},{title:"Tests",icon:"lucide:pocket-knife",href:"/test"},{title:"AI Agent",icon:"lucide:brain-circuit",href:"/agent"},{title:"Reports",icon:"lucide:scroll-text",href:"/reports"}];return $e(()=>{n.proxyStatus(),o.tunnelStatus()}),(p,h)=>{const m=L0("router-link");return S(),K("div",{"data-collapsed":l.value,class:"group flex flex-col gap-4 py-2 data-[collapsed=true]:py-2"},[E("nav",jbe,[(S(),K(Fe,null,It(d,(g,v)=>(S(),K(Fe,null,[l.value?(S(),L(f(Qt),{key:`1-${v}`,"delay-duration":0},{default:_(()=>[x(f(tn),{"as-child":""},{default:_(()=>[x(m,{to:g.href??"#",class:Ee(f(xe)(f(Jd)({variant:c(g.href)?"default":"ghost",size:"icon"}),"h-9 w-9",c(g.href)&&"dark:bg-muted dark:text-muted-foreground dark:hover:bg-muted dark:hover:text-white"))},{default:_(()=>[x(f(ea),{icon:g.icon,class:"size-4"},null,8,["icon"]),E("span",Hbe,ne(g.title),1)]),_:2},1032,["to","class"])]),_:2},1024),x(f(en),{side:"right",class:"flex items-center gap-4"},{default:_(()=>[oe(ne(g.title)+" ",1),g.title=="Explore"?(S(),K("span",Ube,ne(f(n).numEndpoints>0?f(n).numEndpoints:""),1)):_e("",!0)]),_:2},1024)]),_:2},1024)):(S(),L(m,{key:`2-${v}`,to:g.href??"#",class:Ee(f(xe)(f(Jd)({variant:c(g.href)?"default":"ghost",size:"sm"}),c(g.href)&&"dark:bg-muted dark:text-white dark:hover:bg-muted dark:hover:text-white","justify-start"))},{default:_(()=>[g.title=="Scan"?(S(),K("div",{key:0,class:Ee(["-ml-2 rounded-full p-1",u.value?"bg-orange-500":""])},null,2)):_e("",!0),g.title=="Explore"?(S(),K("div",{key:1,class:Ee(["-ml-2 mr-1 rounded-full p-1",r.value.enabled?"bg-green-400":""])},null,2)):g.title=="Crawl"?(S(),K("div",Wbe)):g.title=="Collaborate"?(S(),K("div",{key:3,class:Ee(["-ml-2 mr-1 rounded-full p-1",s.value.enabled?"bg-green-400":""])},null,2)):(S(),K("div",Ybe)),x(f(ea),{icon:g.icon,class:"mr-2 size-4"},null,8,["icon"]),oe(" "+ne(g.title)+" ",1),g.title=="Explore"?(S(),K("span",{key:5,class:Ee(f(xe)("ml-auto",c(g.href)&&"text-background dark:text-white"))},ne(f(n).numEndpoints>0?f(t).customNumberFormat(f(n).numEndpoints):""),3)):_e("",!0)]),_:2},1032,["to","class"]))],64))),64))])],8,Vbe)}}}),cd=[{name:"zinc",label:"Zinc",activeColor:{light:"240 5.9% 10%",dark:"240 5.2% 33.9%"},cssVars:{light:{background:"0 0% 100%",foreground:"240 10% 3.9%",card:"0 0% 100%","card-foreground":"240 10% 3.9%",popover:"0 0% 100%","popover-foreground":"240 10% 3.9%",primary:"240 5.9% 10%","primary-foreground":"0 0% 98%",secondary:"240 4.8% 95.9%","secondary-foreground":"240 5.9% 10%",muted:"240 4.8% 95.9%","muted-foreground":"240 3.8% 46.1%",accent:"240 4.8% 95.9%","accent-foreground":"240 5.9% 10%",destructive:"0 84.2% 60.2%","destructive-foreground":"0 0% 98%",border:"240 5.9% 90%",input:"240 5.9% 90%",ring:"240 5.9% 10%",radius:"0.5rem"},dark:{background:"240 10% 3.9%",foreground:"0 0% 98%",card:"240 10% 3.9%","card-foreground":"0 0% 98%",popover:"240 10% 3.9%","popover-foreground":"0 0% 98%",primary:"0 0% 98%","primary-foreground":"240 5.9% 10%",secondary:"240 3.7% 15.9%","secondary-foreground":"0 0% 98%",muted:"240 3.7% 15.9%","muted-foreground":"240 5% 64.9%",accent:"240 3.7% 15.9%","accent-foreground":"0 0% 98%",destructive:"0 62.8% 30.6%","destructive-foreground":"0 0% 98%",border:"240 3.7% 15.9%",input:"240 3.7% 15.9%",ring:"240 4.9% 83.9%"}}},{name:"slate",label:"Slate",activeColor:{light:"215.4 16.3% 46.9%",dark:"215.3 19.3% 34.5%"},cssVars:{light:{background:"0 0% 100%",foreground:"222.2 84% 4.9%",card:"0 0% 100%","card-foreground":"222.2 84% 4.9%",popover:"0 0% 100%","popover-foreground":"222.2 84% 4.9%",primary:"222.2 47.4% 11.2%","primary-foreground":"210 40% 98%",secondary:"210 40% 96.1%","secondary-foreground":"222.2 47.4% 11.2%",muted:"210 40% 96.1%","muted-foreground":"215.4 16.3% 46.9%",accent:"210 40% 96.1%","accent-foreground":"222.2 47.4% 11.2%",destructive:"0 84.2% 60.2%","destructive-foreground":"210 40% 98%",border:"214.3 31.8% 91.4%",input:"214.3 31.8% 91.4%",ring:"222.2 84% 4.9%",radius:"0.5rem"},dark:{background:"222.2 84% 4.9%",foreground:"210 40% 98%",card:"222.2 84% 4.9%","card-foreground":"210 40% 98%",popover:"222.2 84% 4.9%","popover-foreground":"210 40% 98%",primary:"210 40% 98%","primary-foreground":"222.2 47.4% 11.2%",secondary:"217.2 32.6% 17.5%","secondary-foreground":"210 40% 98%",muted:"217.2 32.6% 17.5%","muted-foreground":"215 20.2% 65.1%",accent:"217.2 32.6% 17.5%","accent-foreground":"210 40% 98%",destructive:"0 62.8% 30.6%","destructive-foreground":"210 40% 98%",border:"217.2 32.6% 17.5%",input:"217.2 32.6% 17.5%",ring:"212.7 26.8% 83.9"}}},{name:"stone",label:"Stone",activeColor:{light:"25 5.3% 44.7%",dark:"33.3 5.5% 32.4%"},cssVars:{light:{background:"0 0% 100%",foreground:"20 14.3% 4.1%",card:"0 0% 100%","card-foreground":"20 14.3% 4.1%",popover:"0 0% 100%","popover-foreground":"20 14.3% 4.1%",primary:"24 9.8% 10%","primary-foreground":"60 9.1% 97.8%",secondary:"60 4.8% 95.9%","secondary-foreground":"24 9.8% 10%",muted:"60 4.8% 95.9%","muted-foreground":"25 5.3% 44.7%",accent:"60 4.8% 95.9%","accent-foreground":"24 9.8% 10%",destructive:"0 84.2% 60.2%","destructive-foreground":"60 9.1% 97.8%",border:"20 5.9% 90%",input:"20 5.9% 90%",ring:"20 14.3% 4.1%",radius:"0.95rem"},dark:{background:"20 14.3% 4.1%",foreground:"60 9.1% 97.8%",card:"20 14.3% 4.1%","card-foreground":"60 9.1% 97.8%",popover:"20 14.3% 4.1%","popover-foreground":"60 9.1% 97.8%",primary:"60 9.1% 97.8%","primary-foreground":"24 9.8% 10%",secondary:"12 6.5% 15.1%","secondary-foreground":"60 9.1% 97.8%",muted:"12 6.5% 15.1%","muted-foreground":"24 5.4% 63.9%",accent:"12 6.5% 15.1%","accent-foreground":"60 9.1% 97.8%",destructive:"0 62.8% 30.6%","destructive-foreground":"60 9.1% 97.8%",border:"12 6.5% 15.1%",input:"12 6.5% 15.1%",ring:"24 5.7% 82.9%"}}},{name:"gray",label:"Gray",activeColor:{light:"220 8.9% 46.1%",dark:"215 13.8% 34.1%"},cssVars:{light:{background:"0 0% 100%",foreground:"224 71.4% 4.1%",card:"0 0% 100%","card-foreground":"224 71.4% 4.1%",popover:"0 0% 100%","popover-foreground":"224 71.4% 4.1%",primary:"220.9 39.3% 11%","primary-foreground":"210 20% 98%",secondary:"220 14.3% 95.9%","secondary-foreground":"220.9 39.3% 11%",muted:"220 14.3% 95.9%","muted-foreground":"220 8.9% 46.1%",accent:"220 14.3% 95.9%","accent-foreground":"220.9 39.3% 11%",destructive:"0 84.2% 60.2%","destructive-foreground":"210 20% 98%",border:"220 13% 91%",input:"220 13% 91%",ring:"224 71.4% 4.1%",radius:"0.35rem"},dark:{background:"224 71.4% 4.1%",foreground:"210 20% 98%",card:"224 71.4% 4.1%","card-foreground":"210 20% 98%",popover:"224 71.4% 4.1%","popover-foreground":"210 20% 98%",primary:"210 20% 98%","primary-foreground":"220.9 39.3% 11%",secondary:"215 27.9% 16.9%","secondary-foreground":"210 20% 98%",muted:"215 27.9% 16.9%","muted-foreground":"217.9 10.6% 64.9%",accent:"215 27.9% 16.9%","accent-foreground":"210 20% 98%",destructive:"0 62.8% 30.6%","destructive-foreground":"210 20% 98%",border:"215 27.9% 16.9%",input:"215 27.9% 16.9%",ring:"216 12.2% 83.9%"}}},{name:"neutral",label:"Neutral",activeColor:{light:"0 0% 45.1%",dark:"0 0% 32.2%"},cssVars:{light:{background:"0 0% 100%",foreground:"0 0% 3.9%",card:"0 0% 100%","card-foreground":"0 0% 3.9%",popover:"0 0% 100%","popover-foreground":"0 0% 3.9%",primary:"0 0% 9%","primary-foreground":"0 0% 98%",secondary:"0 0% 96.1%","secondary-foreground":"0 0% 9%",muted:"0 0% 96.1%","muted-foreground":"0 0% 45.1%",accent:"0 0% 96.1%","accent-foreground":"0 0% 9%",destructive:"0 84.2% 60.2%","destructive-foreground":"0 0% 98%",border:"0 0% 89.8%",input:"0 0% 89.8%",ring:"0 0% 3.9%"},dark:{background:"0 0% 3.9%",foreground:"0 0% 98%",card:"0 0% 3.9%","card-foreground":"0 0% 98%",popover:"0 0% 3.9%","popover-foreground":"0 0% 98%",primary:"0 0% 98%","primary-foreground":"0 0% 9%",secondary:"0 0% 14.9%","secondary-foreground":"0 0% 98%",muted:"0 0% 14.9%","muted-foreground":"0 0% 63.9%",accent:"0 0% 14.9%","accent-foreground":"0 0% 98%",destructive:"0 62.8% 30.6%","destructive-foreground":"0 0% 98%",border:"0 0% 14.9%",input:"0 0% 14.9%",ring:"0 0% 83.1%"}}},{name:"red",label:"Red",activeColor:{light:"0 72.2% 50.6%",dark:"0 72.2% 50.6%"},cssVars:{light:{background:"0 0% 100%",foreground:"0 0% 3.9%",card:"0 0% 100%","card-foreground":"0 0% 3.9%",popover:"0 0% 100%","popover-foreground":"0 0% 3.9%",primary:"0 72.2% 50.6%","primary-foreground":"0 85.7% 97.3%",secondary:"0 0% 96.1%","secondary-foreground":"0 0% 9%",muted:"0 0% 96.1%","muted-foreground":"0 0% 45.1%",accent:"0 0% 96.1%","accent-foreground":"0 0% 9%",destructive:"0 84.2% 60.2%","destructive-foreground":"0 0% 98%",border:"0 0% 89.8%",input:"0 0% 89.8%",ring:"0 72.2% 50.6%",radius:"0.4rem"},dark:{background:"0 0% 3.9%",foreground:"0 0% 98%",card:"0 0% 3.9%","card-foreground":"0 0% 98%",popover:"0 0% 3.9%","popover-foreground":"0 0% 98%",primary:"0 72.2% 50.6%","primary-foreground":"0 85.7% 97.3%",secondary:"0 0% 14.9%","secondary-foreground":"0 0% 98%",muted:"0 0% 14.9%","muted-foreground":"0 0% 63.9%",accent:"0 0% 14.9%","accent-foreground":"0 0% 98%",destructive:"0 62.8% 30.6%","destructive-foreground":"0 0% 98%",border:"0 0% 14.9%",input:"0 0% 14.9%",ring:"0 72.2% 50.6%"}}},{name:"rose",label:"Rose",activeColor:{light:"346.8 77.2% 49.8%",dark:"346.8 77.2% 49.8%"},cssVars:{light:{background:"0 0% 100%",foreground:"240 10% 3.9%",card:"0 0% 100%","card-foreground":"240 10% 3.9%",popover:"0 0% 100%","popover-foreground":"240 10% 3.9%",primary:"346.8 77.2% 49.8%","primary-foreground":"355.7 100% 97.3%",secondary:"240 4.8% 95.9%","secondary-foreground":"240 5.9% 10%",muted:"240 4.8% 95.9%","muted-foreground":"240 3.8% 46.1%",accent:"240 4.8% 95.9%","accent-foreground":"240 5.9% 10%",destructive:"0 84.2% 60.2%","destructive-foreground":"0 0% 98%",border:"240 5.9% 90%",input:"240 5.9% 90%",ring:"346.8 77.2% 49.8%",radius:"0.5rem"},dark:{background:"20 14.3% 4.1%",foreground:"0 0% 95%",popover:"0 0% 9%","popover-foreground":"0 0% 95%",card:"24 9.8% 10%","card-foreground":"0 0% 95%",primary:"346.8 77.2% 49.8%","primary-foreground":"355.7 100% 97.3%",secondary:"240 3.7% 15.9%","secondary-foreground":"0 0% 98%",muted:"0 0% 15%","muted-foreground":"240 5% 64.9%",accent:"12 6.5% 15.1%","accent-foreground":"0 0% 98%",destructive:"0 62.8% 30.6%","destructive-foreground":"0 85.7% 97.3%",border:"240 3.7% 15.9%",input:"240 3.7% 15.9%",ring:"346.8 77.2% 49.8%"}}},{name:"orange",label:"Orange",activeColor:{light:"24.6 95% 53.1%",dark:"20.5 90.2% 48.2%"},cssVars:{light:{background:"0 0% 100%",foreground:"20 14.3% 4.1%",card:"0 0% 100%","card-foreground":"20 14.3% 4.1%",popover:"0 0% 100%","popover-foreground":"20 14.3% 4.1%",primary:"24.6 95% 53.1%","primary-foreground":"60 9.1% 97.8%",secondary:"60 4.8% 95.9%","secondary-foreground":"24 9.8% 10%",muted:"60 4.8% 95.9%","muted-foreground":"25 5.3% 44.7%",accent:"60 4.8% 95.9%","accent-foreground":"24 9.8% 10%",destructive:"0 84.2% 60.2%","destructive-foreground":"60 9.1% 97.8%",border:"20 5.9% 90%",input:"20 5.9% 90%",ring:"24.6 95% 53.1%",radius:"0.95rem"},dark:{background:"20 14.3% 4.1%",foreground:"60 9.1% 97.8%",card:"20 14.3% 4.1%","card-foreground":"60 9.1% 97.8%",popover:"20 14.3% 4.1%","popover-foreground":"60 9.1% 97.8%",primary:"20.5 90.2% 48.2%","primary-foreground":"60 9.1% 97.8%",secondary:"12 6.5% 15.1%","secondary-foreground":"60 9.1% 97.8%",muted:"12 6.5% 15.1%","muted-foreground":"24 5.4% 63.9%",accent:"12 6.5% 15.1%","accent-foreground":"60 9.1% 97.8%",destructive:"0 72.2% 50.6%","destructive-foreground":"60 9.1% 97.8%",border:"12 6.5% 15.1%",input:"12 6.5% 15.1%",ring:"20.5 90.2% 48.2%"}}},{name:"green",label:"Green",activeColor:{light:"142.1 76.2% 36.3%",dark:"142.1 70.6% 45.3%"},cssVars:{light:{background:"0 0% 100%",foreground:"240 10% 3.9%",card:"0 0% 100%","card-foreground":"240 10% 3.9%",popover:"0 0% 100%","popover-foreground":"240 10% 3.9%",primary:"142.1 76.2% 36.3%","primary-foreground":"355.7 100% 97.3%",secondary:"240 4.8% 95.9%","secondary-foreground":"240 5.9% 10%",muted:"240 4.8% 95.9%","muted-foreground":"240 3.8% 46.1%",accent:"240 4.8% 95.9%","accent-foreground":"240 5.9% 10%",destructive:"0 84.2% 60.2%","destructive-foreground":"0 0% 98%",border:"240 5.9% 90%",input:"240 5.9% 90%",ring:"142.1 76.2% 36.3%"},dark:{background:"20 14.3% 4.1%",foreground:"0 0% 95%",popover:"0 0% 9%","popover-foreground":"0 0% 95%",card:"24 9.8% 10%","card-foreground":"0 0% 95%",primary:"142.1 70.6% 45.3%","primary-foreground":"144.9 80.4% 10%",secondary:"240 3.7% 15.9%","secondary-foreground":"0 0% 98%",muted:"0 0% 15%","muted-foreground":"240 5% 64.9%",accent:"12 6.5% 15.1%","accent-foreground":"0 0% 98%",destructive:"0 62.8% 30.6%","destructive-foreground":"0 85.7% 97.3%",border:"240 3.7% 15.9%",input:"240 3.7% 15.9%",ring:"142.4 71.8% 29.2%"}}},{name:"blue",label:"Blue",activeColor:{light:"221.2 83.2% 53.3%",dark:"217.2 91.2% 59.8%"},cssVars:{light:{background:"0 0% 100%",foreground:"222.2 84% 4.9%",card:"0 0% 100%","card-foreground":"222.2 84% 4.9%",popover:"0 0% 100%","popover-foreground":"222.2 84% 4.9%",primary:"221.2 83.2% 53.3%","primary-foreground":"210 40% 98%",secondary:"210 40% 96.1%","secondary-foreground":"222.2 47.4% 11.2%",muted:"210 40% 96.1%","muted-foreground":"215.4 16.3% 46.9%",accent:"210 40% 96.1%","accent-foreground":"222.2 47.4% 11.2%",destructive:"0 84.2% 60.2%","destructive-foreground":"210 40% 98%",border:"214.3 31.8% 91.4%",input:"214.3 31.8% 91.4%",ring:"221.2 83.2% 53.3%"},dark:{background:"222.2 84% 4.9%",foreground:"210 40% 98%",card:"222.2 84% 4.9%","card-foreground":"210 40% 98%",popover:"222.2 84% 4.9%","popover-foreground":"210 40% 98%",primary:"217.2 91.2% 59.8%","primary-foreground":"222.2 47.4% 11.2%",secondary:"217.2 32.6% 17.5%","secondary-foreground":"210 40% 98%",muted:"217.2 32.6% 17.5%","muted-foreground":"215 20.2% 65.1%",accent:"217.2 32.6% 17.5%","accent-foreground":"210 40% 98%",destructive:"0 62.8% 30.6%","destructive-foreground":"210 40% 98%",border:"217.2 32.6% 17.5%",input:"217.2 32.6% 17.5%",ring:"224.3 76.3% 48%"}}},{name:"yellow",label:"Yellow",activeColor:{light:"47.9 95.8% 53.1%",dark:"47.9 95.8% 53.1%"},cssVars:{light:{background:"0 0% 100%",foreground:"20 14.3% 4.1%",card:"0 0% 100%","card-foreground":"20 14.3% 4.1%",popover:"0 0% 100%","popover-foreground":"20 14.3% 4.1%",primary:"47.9 95.8% 53.1%","primary-foreground":"26 83.3% 14.1%",secondary:"60 4.8% 95.9%","secondary-foreground":"24 9.8% 10%",muted:"60 4.8% 95.9%","muted-foreground":"25 5.3% 44.7%",accent:"60 4.8% 95.9%","accent-foreground":"24 9.8% 10%",destructive:"0 84.2% 60.2%","destructive-foreground":"60 9.1% 97.8%",border:"20 5.9% 90%",input:"20 5.9% 90%",ring:"20 14.3% 4.1%",radius:"0.95rem"},dark:{background:"20 14.3% 4.1%",foreground:"60 9.1% 97.8%",card:"20 14.3% 4.1%","card-foreground":"60 9.1% 97.8%",popover:"20 14.3% 4.1%","popover-foreground":"60 9.1% 97.8%",primary:"47.9 95.8% 53.1%","primary-foreground":"26 83.3% 14.1%",secondary:"12 6.5% 15.1%","secondary-foreground":"60 9.1% 97.8%",muted:"12 6.5% 15.1%","muted-foreground":"24 5.4% 63.9%",accent:"12 6.5% 15.1%","accent-foreground":"60 9.1% 97.8%",destructive:"0 62.8% 30.6%","destructive-foreground":"60 9.1% 97.8%",border:"12 6.5% 15.1%",input:"12 6.5% 15.1%",ring:"35.5 91.7% 32.9%"}}},{name:"violet",label:"Violet",activeColor:{light:"262.1 83.3% 57.8%",dark:"263.4 70% 50.4%"},cssVars:{light:{background:"0 0% 100%",foreground:"224 71.4% 4.1%",card:"0 0% 100%","card-foreground":"224 71.4% 4.1%",popover:"0 0% 100%","popover-foreground":"224 71.4% 4.1%",primary:"262.1 83.3% 57.8%","primary-foreground":"210 20% 98%",secondary:"220 14.3% 95.9%","secondary-foreground":"220.9 39.3% 11%",muted:"220 14.3% 95.9%","muted-foreground":"220 8.9% 46.1%",accent:"220 14.3% 95.9%","accent-foreground":"220.9 39.3% 11%",destructive:"0 84.2% 60.2%","destructive-foreground":"210 20% 98%",border:"220 13% 91%",input:"220 13% 91%",ring:"262.1 83.3% 57.8%"},dark:{background:"224 71.4% 4.1%",foreground:"210 20% 98%",card:"224 71.4% 4.1%","card-foreground":"210 20% 98%",popover:"224 71.4% 4.1%","popover-foreground":"210 20% 98%",primary:"263.4 70% 50.4%","primary-foreground":"210 20% 98%",secondary:"215 27.9% 16.9%","secondary-foreground":"210 20% 98%",muted:"215 27.9% 16.9%","muted-foreground":"217.9 10.6% 64.9%",accent:"215 27.9% 16.9%","accent-foreground":"210 20% 98%",destructive:"0 62.8% 30.6%","destructive-foreground":"210 20% 98%",border:"215 27.9% 16.9%",input:"215 27.9% 16.9%",ring:"263.4 70% 50.4%"}}}];function G_(){const e=F(!0),t=F(""),n=["zinc","rose","blue","green","orange","red","violet","slate","stone","gray","neutral","yellow"],r=()=>{console.log("config store toggle dark"),e.value=!e.value,document.documentElement.classList.toggle("dark"),localStorage.setItem("ghost.reaper.dark",e.value.toString())},o=()=>{e.value=!0,document.documentElement.classList.add("dark"),localStorage.setItem("ghost.reaper.dark",e.value.toString())},s=()=>{e.value=!1,document.documentElement.classList.remove("dark"),localStorage.setItem("ghost.reaper.dark",e.value.toString())},a=d=>{n.includes(d)&&(document.documentElement.classList.remove(...n.map(p=>`theme-${p}`)),document.documentElement.classList.add(`theme-${d}`),t.value=d,localStorage.setItem("ghost.reaper.theme",d))},i=()=>{localStorage.getItem("ghost.reaper.dark")=="true"?o():s();const p=localStorage.getItem("ghost.reaper.theme");p&&a(p)},l=$(()=>`hsl(${cd.find(p=>p.name===t.value)?.cssVars[e.value?"dark":"light"].primary})`),u=$(()=>`hsl(${cd.find(p=>p.name===t.value)?.cssVars[e.value?"dark":"light"].secondary})`),c=$(()=>`hsl(${cd.find(p=>p.name===t.value)?.cssVars[e.value?"dark":"light"].background})`);return $e(()=>{localStorage.getItem("ghost.reaper.dark")===null&&s(),localStorage.getItem("ghost.reaper.theme")===null&&a("stone"),i()}),{themeColors:n,themePrimary:l,themeSecondary:u,themeBackground:c,isDark:e,theme:t,toggleThemeDark:r,setThemeColor:a,setThemeData:i}}const Kbe={class:"hidden h-full md:flex"},Zbe={class:"flex w-64 flex-col"},Xbe={class:"flex items-center gap-2 p-3.5 font-bold"},Jbe={class:"mt-auto"},Qbe={class:"mx-4 flex items-center justify-between gap-4"},e_e=I({__name:"DashboardMain",props:{wsConnected:{type:Boolean}},setup(e){const t=G_(),n=Bp(),{loggedIn:r}=yC(n),o=()=>{const s=localStorage.getItem("reaper.token");s&&navigator.clipboard.writeText(s).then(()=>{}).catch(a=>{console.error("Failed to copy token: ",a)})};return(s,a)=>{const i=L0("router-view");return S(),K("div",Kbe,[E("div",Zbe,[_e("",!0),E("div",Xbe,[x(Qd,{class:"size-6 text-primary"}),a[1]||(a[1]=oe(" Reaper "))]),x(Ge),x(Gbe,{"is-collapsed":!1}),E("div",Jbe,[x(Ge),E("div",Qbe,[x(f(cn),null,{default:_(()=>[x(f(Qt),null,{default:_(()=>[x(f(tn),null,{default:_(()=>[E("div",{class:"my-3 cursor-pointer text-xs font-medium",onClick:a[0]||(a[0]=l=>f(t).toggleThemeDark())},[x(f(ea),{icon:"lucide:moon",class:"size-4"})])]),_:1}),x(f(en),null,{default:_(()=>a[2]||(a[2]=[E("p",null,"Toggle Dark Mode",-1)])),_:1})]),_:1})]),_:1}),x(f(cn),null,{default:_(()=>[x(f(Qt),null,{default:_(()=>[x(f(tn),null,{default:_(()=>[E("div",{class:"my-3 cursor-pointer text-xs font-medium",onClick:o},[x(f(ea),{icon:"lucide:key-round",class:"size-4"})])]),_:1}),x(f(en),null,{default:_(()=>a[3]||(a[3]=[E("p",null,"Copy Reaper API Token",-1)])),_:1})]),_:1})]),_:1}),x(f(cn),null,{default:_(()=>[x(f(Qt),null,{default:_(()=>[x(f(tn),null,{default:_(()=>[E("div",{class:Ee(["flex-none rounded-full",s.wsConnected?"bg-green-400/20 p-1 text-green-400":"bg-red-500/20 p-1 text-red-500"])},a[4]||(a[4]=[E("div",{class:"size-2 rounded-full bg-current"},null,-1)]),2)]),_:1}),x(f(en),null,{default:_(()=>a[5]||(a[5]=[E("p",null,"Live Stream Connected",-1)])),_:1})]),_:1})]),_:1}),E("div",null,[x(f(cn),null,{default:_(()=>[x(f(Qt),null,{default:_(()=>[x(f(tn),{onClick:f(n).signOut},{default:_(()=>[x(f(ea),{icon:"lucide:door-open",class:"size-4"})]),_:1},8,["onClick"]),x(f(en),null,{default:_(()=>[E("p",null,ne(f(r)?"Log out":"Log in"),1)]),_:1})]),_:1})]),_:1})])])])]),x(i)])}}}),t_e={class:"flex h-screen flex-col bg-background"},n_e={key:0,class:"container flex-1 overflow-auto"},r_e=50,o_e=2e3,s_e=5e3,a_e=I({__name:"App",setup(e){G_();const t=Bp(),n=Rp(),r=Ra(),o=lc(),s=cc(),a=$(()=>t.loggedIn),i=$(()=>t.loading),l=F(!1),u=h();let c=null,d=null,p=0;function h(){const{protocol:b,hostname:w,port:C}=window.location;return`${b.replace("http","ws")}//${w}${C?`:${C}`:""}/ws`}function m(){c=new WebSocket(u),c.onopen=()=>{l.value=!0,p=0,y()},c.onclose=b=>{l.value=!1,!b.wasClean&&p{console.error("[ws] WebSocket error:",b),c?.close()},c.onmessage=b=>{const w=b.data;if(w==="pong")return;let C;try{C=JSON.parse(w)}catch(A){console.error("[ws] Error parsing message:",A);return}switch(C.type){case"debug":console.log("log:",C);break;case"explore_host":console.info("explore_host:",C),n.addHost(C);break;case"explore.response":console.info("explore.response:",C),n.addEndpoint(C.host,C);break;case"scan.domain":console.info("scan.domain:",C);break;case"scan.domain.sync":console.info("scan.domain.sync:",C),r.syncDomain(C);break;case"scan_host":console.info("scan_host:",C);break;case"attack.result":console.info("attack.result:",C),o.addResult(C);break;case"attack.result.clear":console.info("attack.result.clear:",C),o.emptyResults();break;case"attack.complete":console.info("attack.complete:",C),o.attackCompleted();break;case"navigation.follow":console.info("navigation.follow:",C),t.navigationFollow(C.to);break;case"agent.session.message":console.info("agent.session.message:",C),s.appendMessageToSession(C.session_id,C);break;default:console.log("unknown message type:",C);break}}}function g(){setTimeout(()=>{console.info("[ws] Attempting to reconnect..."),p++,m()},v(p))}function v(b){return o_e+b*100}function y(){d=setInterval(()=>{c?.readyState===WebSocket.OPEN&&c.send("ping")},s_e)}function k(){d&&(clearInterval(d),d=null)}return Oe(a,b=>{b&&m()}),$e(()=>{t.status(),t.loggedIn&&m()}),Yt(()=>{c?.close()}),(b,w)=>(S(),K("div",t_e,[i.value?_e("",!0):(S(),K("main",n_e,[a.value?(S(),L(e_e,{key:0,wsConnected:l.value},null,8,["wsConnected"])):_e("",!0),a.value?_e("",!0):(S(),L(N1e,{key:1})),x(f(v1e))]))]))}}),i_e=Yn(),l_e=Wn("nav",()=>({recordNavigation:(t,n)=>{const r={to:t,from:n};i_e.post("/api/navigation",r).catch(()=>{})}})),Yp=wk(a_e);R_.afterEach((e,t)=>{l_e().recordNavigation(e.path,t.path)});Yp.use(R_);Yp.use(fC());Yp.mount("#app")});export default c_e(); diff --git a/cmd/reaper/dist/assets/reaper-BbBV-fSi.svg b/cmd/reaper/dist/assets/reaper-BbBV-fSi.svg deleted file mode 100644 index 5dbfe0f2..00000000 --- a/cmd/reaper/dist/assets/reaper-BbBV-fSi.svg +++ /dev/null @@ -1,147 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cmd/reaper/dist/index.html b/cmd/reaper/dist/index.html deleted file mode 100644 index 91f268dd..00000000 --- a/cmd/reaper/dist/index.html +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - Reaper - A Ghost Labs Project - - - - -
- - diff --git a/cmd/reaper/main.go b/cmd/reaper/main.go index aa74cf03..0cf5e4b3 100644 --- a/cmd/reaper/main.go +++ b/cmd/reaper/main.go @@ -1,144 +1,7 @@ package main -import ( - "embed" - "fmt" - "log" - "log/slog" - "net/http" - "os" - "strings" - "time" - - "github.com/gofiber/contrib/websocket" - "github.com/gofiber/fiber/v2" - "github.com/gofiber/fiber/v2/middleware/cors" - "github.com/gofiber/fiber/v2/middleware/filesystem" - "github.com/gofiber/fiber/v2/middleware/recover" - - "github.com/ghostsecurity/reaper/internal/database" - "github.com/ghostsecurity/reaper/internal/handlers" - ws "github.com/ghostsecurity/reaper/internal/handlers/websocket" - "github.com/ghostsecurity/reaper/internal/middleware" -) - -//go:embed dist/* -var static embed.FS +import "github.com/ghostsecurity/reaper/internal/cli" func main() { - // We don't need the time field in the local logs - opts := slog.HandlerOptions{ - ReplaceAttr: func(groups []string, a slog.Attr) slog.Attr { - if a.Key == slog.TimeKey { - return slog.Attr{} - } - return a - }, - } - logger := slog.New(slog.NewTextHandler(os.Stdout, &opts)) - slog.SetDefault(logger) - - app := fiber.New() - app.Use(recover.New()) - app.Use(cors.New(cors.Config{ - // TODO: dynamically set this based on the ngrok URL - AllowOriginsFunc: func(origin string) bool { - return origin == "http://localhost:5173" || strings.HasSuffix(origin, ".ngrok.app") - }, - AllowMethods: "GET,DELETE,POST,OPTIONS", - AllowHeaders: fmt.Sprintf("%s, %s", fiber.HeaderContentType, middleware.AuthTokenHeader), - AllowCredentials: true, - })) - - // Websocket client pool - pool := ws.NewPool() - go pool.Start() - - // Websocket handler - wsh := handlers.NewWsHandler(pool) - app.Use("/ws", wsh.WebSocketUpgrade) - app.Get("/ws", websocket.New(wsh.WebSocket, websocket.Config{ - HandshakeTimeout: 10 * time.Second, - })) - - // database - database.Migrate() - db := database.Connect() - - // handler - h := handlers.NewHandler(pool, db) - - // status - app.Get("/status", h.Status) - app.Post("/register", h.Register) - api := app.Group("/api", middleware.TokenAuth(db)) - - api.Post("/navigation", h.Navigation) - - // scan - api.Post("/scan/domains", h.CreateDomain) - api.Get("/scan/domains", h.GetDomains) - api.Get("/scan/domains/:id", h.GetDomain) - api.Delete("/scan/domains/:id", h.DeleteDomain) - api.Get("/scan/domains/:id/hosts", h.GetDomainHosts) - // explore - api.Get("/proxy/status", h.ProxyStatus) - api.Post("/proxy/start", h.ProxyStart) - api.Post("/proxy/stop", h.ProxyStop) - api.Get("/explore/host", h.ExploreHostExample) - api.Get("/explore/endpoint", h.ExploreEndpointExample) - // crawl - // replay - api.Get("/requests", h.GetRequests) - api.Get("/requests/:id", h.GetRequest) - api.Post("/replay", h.Replay) - // attack - api.Get("/endpoints", h.GetEndpoints) - api.Get("/endpoints/:id", h.GetEndpoint) - api.Post("/attack", h.CreateAttack) - api.Get("/attacks", h.GetAttacks) - api.Get("/attacks/:id", h.GetAttack) - api.Get("/attacks/:id/results", h.GetAttackResults) - api.Delete("/attack/:id/results", h.DeleteAttackResults) - // fuzz - // automate - // collaborate - api.Get("/tunnel/status", h.TunnelStatus) - api.Post("/tunnel/start", h.TunnelStart) - api.Post("/tunnel/stop", h.TunnelStop) - // ai assist - api.Get("/agent/sessions", h.GetSessions) - api.Get("/agent/sessions/:id", h.GetSession) - api.Post("/agent/sessions", h.CreateSession) - api.Delete("/agent/sessions/:id", h.DeleteSession) - api.Get("/agent/sessions/:id/messages", h.GetSessionMessages) - api.Post("/agent/sessions/:id/messages", h.CreateSessionMessage) - // reports - api.Get("/reports", h.GetReports) - api.Get("/reports/:id", h.GetReport) - api.Post("/reports", h.CreateReport) - api.Delete("/reports/:id", h.DeleteReport) - // settings - - // serve static frontend files - app.Use("/", filesystem.New(filesystem.Config{ - Root: http.FS(static), - PathPrefix: "dist", - Browse: true, - NotFoundFile: "dist/index.html", - })) - app.Use("/assets", filesystem.New(filesystem.Config{ - Root: http.FS(static), - PathPrefix: "dist/assets", - Browse: true, - })) - - // Start server - host := os.Getenv("HOST") - port := os.Getenv("PORT") - listener := fmt.Sprintf("%s:%s", host, port) - err := app.Listen(listener) - if err != nil { - log.Fatalf("error: %v", err) - } + cli.Execute() } diff --git a/docker-compose.yml b/docker-compose.yml deleted file mode 100644 index 24bd8a53..00000000 --- a/docker-compose.yml +++ /dev/null @@ -1,17 +0,0 @@ -services: - reaper: - build: - context: . - dockerfile: Dockerfile - env_file: .env - environment: - - ENV=docker - - HOST=0.0.0.0 - - PORT=8000 - - PROXY_PORT=8080 - - OPENAI_API_KEY=your_openai_key - volumes: - - ./files:/app/files - ports: - - 8000:8000 - - 8080:8080 diff --git a/docs/CLA.md b/docs/CLA.md deleted file mode 100644 index f358058a..00000000 --- a/docs/CLA.md +++ /dev/null @@ -1,28 +0,0 @@ -Contributor License Agreement (CLA) - -Thank you for your interest in contributing to Ghost Security’s open source projects! This Contributor License Agreement (“Agreement”) clarifies the terms under which you, the contributor (“You” or “Contributor”), agree to license certain intellectual property rights to Ghost Security (“Company”) and its affiliates. - -1. Definitions - * “Contribution”: Any original work of authorship, including software code, documentation, or other material, that is intentionally submitted by You to the Company for inclusion in any of the Company’s open-source projects. - * “Project”: Any of the open-source software projects maintained by the Company to which a Contribution is submitted. - -2. Grant of Rights - * Copyright License: You hereby grant to the Company and its affiliates a perpetual, worldwide, non-exclusive, royalty-free, transferable, irrevocable license to reproduce, prepare derivative works of, publicly display, publicly perform, sublicense, and distribute Your Contributions and any such derivative works. - * Patent License: You grant the Company a perpetual, worldwide, non-exclusive, royalty-free, transferable, irrevocable license under Your patent claims that read on Your Contribution to make, use, sell, offer to sell, import, and otherwise distribute the Contribution, in whole or in part, alone or in combination. - -3. Representations and Warranties - * You represent and warrant that: - 1. Ownership and Authorization: You are the original author of the Contribution or have obtained all necessary permissions to submit the Contribution and to grant the licenses in this Agreement. - 2. Third-Party Rights: Your Contribution does not violate any other party’s rights, including patent, copyright, or trade secrets. - 3. Compliance with Law: Your Contribution complies with all applicable laws. - -4. Intellectual Property - * Retention of Ownership: You retain all right, title, and interest in and to Your Contribution. This Agreement does not transfer ownership of Your Contribution but only grants licenses as set forth herein. - * Attribution: The Company may include attribution to You as the author of the Contribution if it is included in the Project. - -5. Miscellaneous - * Entire Agreement: This Agreement represents the entire agreement between You and the Company concerning the subject matter herein. - * Governing Law: This Agreement will be governed by and construed in accordance with the laws of [Specify Jurisdiction], without regard to its conflict of laws principles. - * Amendments: This Agreement may only be modified by a written agreement signed by both You and the Company. - -By submitting a Contribution, You agree to the terms of this Contributor License Agreement. diff --git a/docs/CODE_OF_CONDUCT.md b/docs/conduct.md similarity index 100% rename from docs/CODE_OF_CONDUCT.md rename to docs/conduct.md diff --git a/docs/demo.gif b/docs/demo.gif new file mode 100644 index 00000000..9f18620f Binary files /dev/null and b/docs/demo.gif differ diff --git a/docs/how-to-hack-ghostbank.md b/docs/how-to-hack-ghostbank.md deleted file mode 100644 index f371fdfe..00000000 --- a/docs/how-to-hack-ghostbank.md +++ /dev/null @@ -1,180 +0,0 @@ -# How to Hack ghostBank with Reaper - -Welcome to your journey into application security with Ghost Security's Reaper! This guide will take you step-by-step through the process of testing security vulnerabilities in ghostBank, our fictional banking app. - -In this exercise, your goal is to successfully hack ghostBank, a fictional banking application. You'll achieve this by transferring funds from all other customer accounts into your own, using the powerful tools provided by Ghost Security's Reaper. This exercise is designed to help you understand key application security concepts and practice your skills in a controlled environment. - -To create a Ghostbank account, register [here](https://ghostbank.net?code=ezx-723). - - -## Steps -0. [Prerequisites](#0-prerequisites) -1. [Start Reaper](#1-start-reaper) -2. [Add a Domain](#2-add-a-domain) -3. [Capture Traffic](#3-capture-traffic) -4. [Fuzz Manually](#4-fuzz-manually) -5. [Automated Test](#5-automated-test) -6. [AI-Assisted Test](#6-ai-assisted-test) - -## 0. Prerequisites - -Before you dive in, ensure you have everything set up for a smooth operation. Here’s what you need: - -1. [Clone the Reaper repository](https://docs.github.com/en/desktop/adding-and-cloning-repositories/cloning-a-repository-from-github-to-github-desktop). -2. [Install Docker](https://docs.docker.com/engine/install/). -3. Have two web browsers ready. We recommend [Chrome](https://www.google.com/chrome/dr/download/) for using Reaper and [Firefox](https://www.mozilla.org/en-US/firefox/new/) for using ghostBank. In this guide we'll use Firefox, but you could also use Chrome for both Reaper and your second browser (though you will need separate browser profiles.). See the [browser setup instructions](proxy_certs.md) for more details. - -## 1. Start Reaper -First things first, let's get Reaper up and running. - -1. From a command line, navigate to the Reaper directory and run `docker compose up`. -2. In a web browser (we recommend Chrome), navigate to [127.0.0.1:8000](http://127.0.0.1:8000) to reach the Reaper UI. -3. Enter a username (or use the default Reaper Admin) and click *Sign in*. - -![login](img/reaper_login.png) - -You will land on the Scan page, where we will get started by adding a domain! - -## 2. Add a Domain -Let's add a Domain and discover the available hosts. - -1. On the *Scan* tab, click *Add Domain*. -2. Enter `ghostbank.net`. -3. Leave the *Auto-scan* option enabled and click *Add and scan*. - -![add domain](img/reaper_add_domain.png) - -You will see *ghostbank.net* in the Domain list. When the scan completes, you can click on *ghostbank.net* to view the discovered hosts. By default, Reaper will only show live hosts. - -![hosts](img/discovered_hosts.png) - -## 3. Capture Traffic -Now, let's get to the good stuff. We are going to set up a proxy in Firefox, then log in to ghostBank and initiate a fund transfer. Reaper's proxy will capture the traffic, allowing us to inspect, replay, and modify the requests. - -**Add Reaper's Certificate to Firefox's Trusted Authority Store** - -1. Open Firefox. -2. In the URL bar, enter `about:preferences` (or open the app menu and click *Settings*). -3. Search for `cert` in the *Find in Settings* input. -4. Click *View Certificates...* -5. Under the *Authorities* tab, click *Import...* -6. Navigate to the `/reaper/tls` directory and select the `ca.pem` file. -7. In the dialog that pops up, check *Trust this CA to identify websites* and click Ok. -8. You should see the *Ghost Security, Inc > reaper.ghostsecurity.com* entry. -9. Click Ok. - -![firefox cert](img/import_reaper_cert_firefox.png) - -**Firefox Proxy Configuration** -1. Open Firefox. -2. In the URL bar, enter `about:preferences` (or open the app menu and click *Settings*). -3. Search for `proxy` on the Settings page. *Network Settings* should show up. -4. Click *Settings*. -5. Select *Manual proxy configuration*. -6. Enter `localhost` in the HTTP Proxy field and `8080` in the Port field. -7. Select *Also use this proxy for HTTPS*. -8. Click *OK*. - -![firefox proxy](img/firefox_proxy_settings.png) - -**Capturing Traffic in Reaper** -1. Return to Reaper in Chrome and switch to the *Explore* tab. -2. Make sure the proxy is on (you'll see *Proxy on*). -3. Switch back to Firefox and browse to `https://ghostbank.net`. -4. Log in to ghostBank. -5. Initiate a funds transfer by entering $10 and clicking *Transfer*. You may need to switch the From and To accounts. -6. Switch back to Chrome. You should see a list of captured requests! - -![requests](img/captured_requests.png) - -You now have valid requests that we can replay and modify -- good work! - -## 4. Fuzz Manually -*[Fuzzing](https://owasp.org/www-community/Fuzzing)* is a software testing method wherein a human or program provides invalid, unexpected, or random data as inputs to a computer program. We are going to fuzz the Transfer API in ghostBank to see if we can transfer funds from a different customer's account into our own account. But first, let's simply replay and modify our original transfer request. - -**Replay Original and Modified Requests** -1. Go to the *Replay* tab in Reaper. You should see a variety of requests captured from our previous interaction with ghostBank. -2. Search for `transfer` and click on the `/api/v3/transfer` endpoint. -3. You should see the *Request Headers* and *Request Body*. Notice there are three inputs in the *Request Body*: `account_to`, `account_from`, and `amount`. -4. Click the *Replay original* button. -5. In Firefox, disable the proxy (Settings > Network Settings > Settings > No Proxy > OK). -6. Refresh the ghostBank page. You should see a new transfer from replaying the request in Reaper. -7. Return to Reaper and change the `amount` to `20` in the Request Body. -8. Click *Replay modified*. -9. Switch back to Firefox and refresh ghostBank. You should see another transfer, this time for $20! - -![replay](img/replay_modified.png) - -Now that we know we can replay and modify requests, let's see if we can loot some cash from someone else's account by fuzzing the `account_from` field. - -**Fuzz the Account From Input** -1. In Reaper, try changing the `account_from` field to another three digit integer. -2. Click *Replay modified*. -3. Refresh the page in ghostBank and check for a new transfer. If there is no new transfer, then the `account_from` ID provided in the request was not valid. -4. Repeat steps 1-3, changing the `account_from` value, until you find a valid account ID and loot some funds! - -![fuzz](img/fuzz_manually.png) - -Congratulations! You've learned how to capture traffic, modify requests, and find a vulnerability in ghostBank! This is an *[Insecure Direct Object Reference (IDOR)](https://cheatsheetseries.owasp.org/cheatsheets/Insecure_Direct_Object_Reference_Prevention_Cheat_Sheet.html)* vulnerability, sometimes known as *[Broken Object Level Authorization (BOLA)](https://owasp.org/API-Security/editions/2023/en/0xa1-broken-object-level-authorization/)*, meaning a user may modify or access objects that they do not have permission to access. These vulnerabilities occur due to missing access control checks. In our example, ghostBank "customers" are able to access funds in another customer's account. - -Now that we've done this the hard way and understand the concept, let's unleash Reaper to test for an IDOR/BOLA vulnerability automatically! - -## 5. Automated Test - -Since manually changing inputs is time-consuming and error prone, we've built an automated fuzzing capability into Reaper. Let's give it a spin. - -1. Switch to the *Tests* tab in Reaper. -2. Search for `transfer` and select the `/api/v3/transfer` endpoint. -3. Click the *Create a test* button. -4. Choose *Insecure Direct Object Reference (IDOR/BOLA)* from the *Test type* menu. -5. Check the `account_from` in the *Included parameters* list. -6. Click *Start test*! - -Reaper will automatically start modifying the transfer request, changing the `account_from` input with each attempt. Sit back and let Reaper do the work! - -![bola test](img/create_bola_test.png) - -When the test completes, you will see several successful requests listed in Reaper. Go back to Firefox and refresh ghostBank. You should see *a lot* of transfers. - -![test results](img/automated_test_results.png) - -## 6. AI-Assisted Test - -Now that you've got the hang of using Reaper, let's try setting up and using Reaper's Agentic AI capabilities to automate testing and report generation! We'll set up Reaper's OpenAI integration, capture traffic, and prompt the AI Agent to test ghostBank for BOLA vulnerabilities and generate a report. - -*Note: The AI Agent capability is the basis for a natural language interaction with one or more Agents via a chat-like interface. The current implementation is experimental and is catered toward the ghostBank use-case.* - -1. Obtain an [OpenAI API Key](https://platform.openai.com/api-keys). -2. If Reaper is running, shut down the container. -3. Launch Reaper using the below command. Paste your OpenAI API key in the `OPENAI_API_KEY` variable: - -```sh - docker run -t --rm \ - -e HOST=0.0.0.0 \ - -e PORT=8000 \ - -e PROXY_PORT=8080 \ - -e OPENAI_API_KEY=sk-your-key-here \ - -p 8000:8000 \ - -p 8080:8080 \ - ghcr.io/ghostsecurity/reaper:latest -``` -4. Repeat the *Capturing Traffic in Reaper* steps above (see: [Capture Traffic](#3-capture-traffic)). -5. In Reaper, go to the *AI Agent* tab. -6. Click on *New Session*. -7. Enter a session name and click *Create session*. -8. Click on the newly created session. -9. In the *Type a message field*, enter: - ``` - Find all endpoints in the ghostbank.net domain that are susceptible to BOLA and generate a report. - ``` -10. The AI Agent will show its progress in the chat, ending with *Report saved successfully* and *Done* messages. - -![agent test](img/ai-agent-test.png) - -11. Go to the *Reports* tab and click on the report to see your results! - -![report](img/ai-generated-report.png) - -# 👻 💵 Congratulations, you're flush with Ghostbucks! - -We'd love to hear about your experience and results! Join our community on GitHub and connect with us on social media ([LinkedIn](https://www.linkedin.com/company/ghostsecurity/) | [Twitter/X](https://x.com/ghostsecurityhq) | [YouTube](https://www.youtube.com/@ghostsecurity-yt)). [Create an Issue on GitHub](https://github.com/ghostsecurity/reaper/issues/new/choose) to ask us questions or give your feedback about Reaper ❤️. \ No newline at end of file diff --git a/docs/img/ai-agent-test.png b/docs/img/ai-agent-test.png deleted file mode 100644 index c770bad3..00000000 Binary files a/docs/img/ai-agent-test.png and /dev/null differ diff --git a/docs/img/ai-generated-report.png b/docs/img/ai-generated-report.png deleted file mode 100644 index 4929b798..00000000 Binary files a/docs/img/ai-generated-report.png and /dev/null differ diff --git a/docs/img/automated_test_results.png b/docs/img/automated_test_results.png deleted file mode 100644 index aba3faec..00000000 Binary files a/docs/img/automated_test_results.png and /dev/null differ diff --git a/docs/img/captured_requests.png b/docs/img/captured_requests.png deleted file mode 100644 index 1b8069ca..00000000 Binary files a/docs/img/captured_requests.png and /dev/null differ diff --git a/docs/img/create_bola_test.png b/docs/img/create_bola_test.png deleted file mode 100644 index 9e3389bb..00000000 Binary files a/docs/img/create_bola_test.png and /dev/null differ diff --git a/docs/img/discovered_hosts.png b/docs/img/discovered_hosts.png deleted file mode 100644 index 45e35cc1..00000000 Binary files a/docs/img/discovered_hosts.png and /dev/null differ diff --git a/docs/img/firefox_proxy_settings.png b/docs/img/firefox_proxy_settings.png deleted file mode 100644 index 6189ef09..00000000 Binary files a/docs/img/firefox_proxy_settings.png and /dev/null differ diff --git a/docs/img/fuzz_manually.png b/docs/img/fuzz_manually.png deleted file mode 100644 index e81ba70f..00000000 Binary files a/docs/img/fuzz_manually.png and /dev/null differ diff --git a/docs/img/import_reaper_cert_firefox.png b/docs/img/import_reaper_cert_firefox.png deleted file mode 100644 index 57e95465..00000000 Binary files a/docs/img/import_reaper_cert_firefox.png and /dev/null differ diff --git a/docs/img/logo-reaper-only.png b/docs/img/logo-reaper-only.png deleted file mode 100644 index 16562ba3..00000000 Binary files a/docs/img/logo-reaper-only.png and /dev/null differ diff --git a/docs/img/reaper_add_domain.png b/docs/img/reaper_add_domain.png deleted file mode 100644 index ee89d9e5..00000000 Binary files a/docs/img/reaper_add_domain.png and /dev/null differ diff --git a/docs/img/reaper_login.png b/docs/img/reaper_login.png deleted file mode 100644 index 00949d2e..00000000 Binary files a/docs/img/reaper_login.png and /dev/null differ diff --git a/docs/img/replay_modified.png b/docs/img/replay_modified.png deleted file mode 100644 index c3593de7..00000000 Binary files a/docs/img/replay_modified.png and /dev/null differ diff --git a/docs/img/video-thumbnail.png b/docs/img/video-thumbnail.png deleted file mode 100644 index 3926cd2e..00000000 Binary files a/docs/img/video-thumbnail.png and /dev/null differ diff --git a/docs/proxy_certs.md b/docs/proxy_certs.md deleted file mode 100644 index 2912c528..00000000 --- a/docs/proxy_certs.md +++ /dev/null @@ -1,99 +0,0 @@ -# Certificate Installation and Proxy Configuration - -In order to browse websites protected by TLS/SSL through the Reaper proxy, you must download and install the certificate authority to your browser or operating system's trust store. - -## Operating System - -First, either clone this repo or download the contents of the `tls` directory. - -### OSX Keychain - -To install in OSX's keychain so that all applications can trust the proxy CA: - -1. Open `Utilities` > `Keychain Access`. -2. Under the `Default Keychain` > `login`, select the `Certificates` tab -3. Drag the `tls/ca.pem` file into the listing. It should appear as `reaper.ghostsecurity.com` with a red `x` icon. -4. Double click on the certificate to bring up the info dialog. -5. Under `Trust`, choose `Always Trust` for the `Secure Sockets Layer (SSL)` option. -6. Click the window's `x`. This should ask for your password to save changes. Do so and click `Update Settings`. -7. The certificate should now show with a blue icon. -8. If your browser is configured to trust CA certs from the operating system (the default), you are all set. - -### Linux and Windows - -Instructions coming soon. PRs are welcomed. - -## Tools - -Some tools allow specifying the CA pem file on demand. First, either clone this repo or download the contents of the `tls` directory. - -### curl - -Use `-x` and `-k` to proxy a request through Reaper without TLS warnings, respectively: - -```sh -curl -x localhost:8080 -k https://ipinfo.io - -{ - "ip": "98.76.54.32", - "hostname": "ip98-76-54-32.isp.net", - "city": "San Diego", - "region": "California", - "country": "US", - "loc": "38.8462,-77.3064", - "org": "AS1337 Ghost Communications Inc.", - "postal": "90001", - "timezone": "America/San_Diego" -} -``` - -## Browsers - -First, either clone this repo or download the contents of the `tls` directory. - -### Firefox - -To install the certificate in Firefox's Trusted Authority store: - -1. Navigate to [about:preferences](about:preferences) -2. Search for "cert" in the `Find in Settings` input. -3. Click `View Certificates...`. -4. Under the `Authorities` tab, click `Import...`. -5. Navigate to the `tls` directory and select `ca.pem`. -6. In the dialog that pops up, check `Trust this CA to identify websites` and click `Ok`. -7. You should see the `reaper.ghostsecurity.com` entry. Click `Ok`. - -To configure Firefox to proxy through Reaper: - -1. Navigate to [about:preferences](about:preferences) -2. Search for "proxy" in the `Find in Settings` input. -3. Click `Settings...`. -4. Check `Manual proxy configuration`, enter `localhost` and port `8080` for the `HTTP Proxy` fields. -5. Check `Also use this proxy for HTTPS`. -6. Click `Ok`. -7. Now navigate to the target and observe requests being proxied in Reaper. - -Disable proxying by switching the proxy settings dialog back to `No proxy`. Remove the certificate from the Certificate Manager by selecting the `reaper.ghostsecurity.com` CA in the `Authorities` list and clicking on `Delete or Distrust...`. - -### Chrome - -Launch a new Chrome instance using the local Reaper proxy (without altering your system settings). - -#### macOS - -```sh -/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome \ - --proxy-server="127.0.0.1:8080" \ - --ignore-certificate-errors \ - --user-data-dir="$HOME/.chrome-reaper" -``` - - -#### Linux - -```sh -google-chrome \ - --proxy-server="127.0.0.1:8080" \ - --ignore-certificate-errors \ - --user-data-dir="$HOME/.chrome-reaper" -``` \ No newline at end of file diff --git a/docs/screens/index.md b/docs/screens/index.md deleted file mode 100644 index 1a0d0de4..00000000 --- a/docs/screens/index.md +++ /dev/null @@ -1,4 +0,0 @@ -![reaper-01.png](reaper-01.png) -![reaper-02.png](reaper-02.png) -![reaper-03.png](reaper-03.png) -![reaper-04.png](reaper-04.png) diff --git a/docs/screens/reaper-01.png b/docs/screens/reaper-01.png deleted file mode 100644 index 05e4180f..00000000 Binary files a/docs/screens/reaper-01.png and /dev/null differ diff --git a/docs/screens/reaper-02.png b/docs/screens/reaper-02.png deleted file mode 100644 index be437c86..00000000 Binary files a/docs/screens/reaper-02.png and /dev/null differ diff --git a/docs/screens/reaper-03.png b/docs/screens/reaper-03.png deleted file mode 100644 index 59c78ec1..00000000 Binary files a/docs/screens/reaper-03.png and /dev/null differ diff --git a/docs/screens/reaper-04.png b/docs/screens/reaper-04.png deleted file mode 100644 index c3c8d119..00000000 Binary files a/docs/screens/reaper-04.png and /dev/null differ diff --git a/go.mod b/go.mod index c111e43f..6ca27a2a 100644 --- a/go.mod +++ b/go.mod @@ -1,196 +1,23 @@ module github.com/ghostsecurity/reaper -go 1.24.0 +go 1.25.7 require ( - github.com/elazarl/goproxy v0.0.0-20240909085733-6741dbfc16a1 - github.com/gofiber/contrib/websocket v1.3.2 - github.com/gofiber/fiber/v2 v2.52.5 - github.com/google/uuid v1.6.0 - github.com/instructor-ai/instructor-go v0.0.0-20240827181533-b63ca60f159b - github.com/projectdiscovery/goflags v0.1.64 - github.com/projectdiscovery/httpx v1.6.8 - github.com/projectdiscovery/subfinder/v2 v2.6.6 - github.com/sashabaranov/go-openai v1.29.0 - golang.ngrok.com/ngrok v1.11.0 - golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 - gorm.io/driver/sqlite v1.5.6 - gorm.io/gorm v1.25.12 + github.com/spf13/cobra v1.10.2 + modernc.org/sqlite v1.45.0 ) require ( - aead.dev/minisign v0.2.0 // indirect - github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible // indirect - github.com/Masterminds/semver/v3 v3.2.1 // indirect - github.com/Mzack9999/gcache v0.0.0-20230410081825-519e28eab057 // indirect - github.com/Mzack9999/go-http-digest-auth-client v0.6.1-0.20220414142836-eb8883508809 // indirect - github.com/PuerkitoBio/goquery v1.8.1 // indirect - github.com/VividCortex/ewma v1.2.0 // indirect - github.com/akrylysov/pogreb v0.10.2 // indirect - github.com/alecthomas/chroma/v2 v2.14.0 // indirect - github.com/andybalholm/brotli v1.1.0 // indirect - github.com/andybalholm/cascadia v1.3.2 // indirect - github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect - github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect - github.com/aymerick/douceur v0.2.0 // indirect - github.com/bahlo/generic-list-go v0.2.0 // indirect - github.com/bits-and-blooms/bitset v1.13.0 // indirect - github.com/buger/jsonparser v1.1.1 // indirect - github.com/charmbracelet/glamour v0.8.0 // indirect - github.com/charmbracelet/lipgloss v0.13.0 // indirect - github.com/charmbracelet/x/ansi v0.3.2 // indirect - github.com/cheggaaa/pb/v3 v3.1.4 // indirect - github.com/cloudflare/cfssl v1.6.4 // indirect - github.com/cloudflare/circl v1.6.1 // indirect - github.com/cnf/structhash v0.0.0-20201127153200-e1b16c1ebc08 // indirect - github.com/cohere-ai/cohere-go/v2 v2.8.1 // indirect - github.com/corona10/goimagehash v1.1.0 // indirect - github.com/corpix/uarand v0.2.0 // indirect - github.com/dimchansky/utfbom v1.1.1 // indirect - github.com/dlclark/regexp2 v1.11.4 // indirect - github.com/docker/go-units v0.5.0 // indirect - github.com/dsnet/compress v0.0.2-0.20210315054119-f66993602bf5 // indirect - github.com/fasthttp/websocket v1.5.8 // indirect - github.com/fatih/color v1.16.0 // indirect - github.com/gabriel-vasile/mimetype v1.4.3 // indirect - github.com/gaissmai/bart v0.9.5 // indirect - github.com/go-faker/faker/v4 v4.1.1 // indirect - github.com/go-ole/go-ole v1.2.6 // indirect - github.com/go-playground/locales v0.14.1 // indirect - github.com/go-playground/universal-translator v0.18.1 // indirect - github.com/go-playground/validator/v10 v10.21.0 // indirect - github.com/go-rod/rod v0.114.0 // indirect - github.com/go-stack/stack v1.8.1 // indirect - github.com/golang/snappy v0.0.4 // indirect - github.com/google/certificate-transparency-go v1.1.4 // indirect - github.com/google/go-github/v30 v30.1.0 // indirect - github.com/google/go-querystring v1.1.0 // indirect - github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect - github.com/gorilla/css v1.0.1 // indirect - github.com/hako/durafmt v0.0.0-20210316092057-3a2c319c1acd // indirect - github.com/hashicorp/go-version v1.6.0 // indirect - github.com/hbakhtiyor/strsim v0.0.0-20190107154042-4d2bbb273edf // indirect - github.com/hdm/jarm-go v0.0.7 // indirect - github.com/inconshreveable/log15 v3.0.0-testing.5+incompatible // indirect - github.com/inconshreveable/log15/v3 v3.0.0-testing.5 // indirect - github.com/invopop/jsonschema v0.12.0 // indirect - github.com/jaytaylor/html2text v0.0.0-20230321000545-74c2419ad056 // indirect - github.com/jinzhu/inflection v1.0.0 // indirect - github.com/jinzhu/now v1.1.5 // indirect - github.com/jpillora/backoff v1.0.0 // indirect - github.com/json-iterator/go v1.1.12 // indirect - github.com/kataras/jwt v0.1.10 // indirect - github.com/klauspost/compress v1.17.8 // indirect - github.com/klauspost/pgzip v1.2.6 // indirect - github.com/kljensen/snowball v0.8.0 // indirect - github.com/leodido/go-urn v1.4.0 // indirect - github.com/lib/pq v1.10.9 // indirect - github.com/liushuangls/go-anthropic/v2 v2.1.0 // indirect - github.com/logrusorgru/aurora v2.0.3+incompatible // indirect - github.com/lucasb-eyer/go-colorful v1.2.0 // indirect - github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect - github.com/mailru/easyjson v0.7.7 // indirect - github.com/mattn/go-colorable v0.1.13 // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/mattn/go-isatty v0.0.20 // indirect - github.com/mattn/go-runewidth v0.0.16 // indirect - github.com/mattn/go-sqlite3 v1.14.22 // indirect - github.com/mfonda/simhash v0.0.0-20151007195837-79f94a1100d6 // indirect - github.com/mholt/archiver/v3 v3.5.1 // indirect - github.com/microcosm-cc/bluemonday v1.0.27 // indirect - github.com/miekg/dns v1.1.59 // indirect - github.com/minio/selfupdate v0.6.1-0.20230907112617-f11e74f84ca7 // indirect - github.com/mitchellh/mapstructure v1.5.0 // indirect - github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect - github.com/modern-go/reflect2 v1.0.2 // indirect - github.com/muesli/reflow v0.3.0 // indirect - github.com/muesli/termenv v0.15.3-0.20240618155329-98d742f6907a // indirect - github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 // indirect - github.com/nwaples/rardecode v1.1.3 // indirect - github.com/olekukonko/tablewriter v0.0.5 // indirect - github.com/onsi/gomega v1.27.10 // indirect - github.com/pierrec/lz4/v4 v4.1.21 // indirect - github.com/pkg/errors v0.9.1 // indirect - github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect - github.com/projectdiscovery/asnmap v1.1.1 // indirect - github.com/projectdiscovery/blackrock v0.0.1 // indirect - github.com/projectdiscovery/cdncheck v1.1.0 // indirect - github.com/projectdiscovery/chaos-client v0.5.1 // indirect - github.com/projectdiscovery/clistats v0.1.1 // indirect - github.com/projectdiscovery/dnsx v1.2.1 // indirect - github.com/projectdiscovery/dsl v0.2.1 // indirect - github.com/projectdiscovery/fastdialer v0.2.9 // indirect - github.com/projectdiscovery/fdmax v0.0.4 // indirect - github.com/projectdiscovery/freeport v0.0.6 // indirect - github.com/projectdiscovery/goconfig v0.0.1 // indirect - github.com/projectdiscovery/gologger v1.1.24 // indirect - github.com/projectdiscovery/gostruct v0.0.2 // indirect - github.com/projectdiscovery/hmap v0.0.59 // indirect - github.com/projectdiscovery/machineid v0.0.0-20240226150047-2e2c51e35983 // indirect - github.com/projectdiscovery/mapcidr v1.1.34 // indirect - github.com/projectdiscovery/networkpolicy v0.0.9 // indirect - github.com/projectdiscovery/ratelimit v0.0.56 // indirect - github.com/projectdiscovery/rawhttp v0.1.67 // indirect - github.com/projectdiscovery/retryabledns v1.0.77 // indirect - github.com/projectdiscovery/retryablehttp-go v1.0.78 // indirect - github.com/projectdiscovery/tlsx v1.1.7 // indirect - github.com/projectdiscovery/useragent v0.0.71 // indirect - github.com/projectdiscovery/utils v0.2.11 // indirect - github.com/projectdiscovery/wappalyzergo v0.1.18 // indirect - github.com/refraction-networking/utls v1.6.7 // indirect - github.com/rivo/uniseg v0.4.7 // indirect - github.com/rs/xid v1.5.0 // indirect - github.com/saintfish/chardet v0.0.0-20230101081208-5e3ef4b5456d // indirect - github.com/savsgio/gotils v0.0.0-20240303185622-093b76447511 // indirect - github.com/shirou/gopsutil/v3 v3.24.2 // indirect - github.com/shoenig/go-m1cpu v0.1.6 // indirect - github.com/spaolacci/murmur3 v1.1.0 // indirect - github.com/ssor/bom v0.0.0-20170718123548-6386211fdfcf // indirect - github.com/syndtr/goleveldb v1.0.0 // indirect - github.com/tidwall/btree v1.7.0 // indirect - github.com/tidwall/buntdb v1.3.1 // indirect - github.com/tidwall/gjson v1.17.1 // indirect - github.com/tidwall/grect v0.1.4 // indirect - github.com/tidwall/match v1.1.1 // indirect - github.com/tidwall/pretty v1.2.1 // indirect - github.com/tidwall/rtred v0.1.2 // indirect - github.com/tidwall/tinyqueue v0.1.1 // indirect - github.com/tklauser/go-sysconf v0.3.12 // indirect - github.com/tklauser/numcpus v0.6.1 // indirect - github.com/tomnomnom/linkheader v0.0.0-20180905144013-02ca5825eb80 // indirect - github.com/ulikunitz/xz v0.5.15 // indirect - github.com/valyala/bytebufferpool v1.0.0 // indirect - github.com/valyala/fasthttp v1.52.0 // indirect - github.com/valyala/tcplisten v1.0.0 // indirect - github.com/weppos/publicsuffix-go v0.30.2 // indirect - github.com/wk8/go-ordered-map/v2 v2.1.8 // indirect - github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8 // indirect - github.com/ysmood/fetchup v0.2.3 // indirect - github.com/ysmood/goob v0.4.0 // indirect - github.com/ysmood/got v0.34.1 // indirect - github.com/ysmood/gson v0.7.3 // indirect - github.com/ysmood/leakless v0.8.0 // indirect - github.com/yuin/goldmark v1.7.4 // indirect - github.com/yuin/goldmark-emoji v1.0.3 // indirect - github.com/yusufpapurcu/wmi v1.2.4 // indirect - github.com/zcalusic/sysinfo v1.0.2 // indirect - github.com/zmap/rc2 v0.0.0-20190804163417-abaa70531248 // indirect - github.com/zmap/zcrypto v0.0.0-20240512203510-0fef58d9a9db // indirect - go.etcd.io/bbolt v1.3.10 // indirect - go.uber.org/multierr v1.11.0 // indirect - golang.ngrok.com/muxado/v2 v2.0.0 // indirect - golang.org/x/crypto v0.46.0 // indirect - golang.org/x/mod v0.30.0 // indirect - golang.org/x/net v0.47.0 // indirect - golang.org/x/oauth2 v0.34.0 // indirect - golang.org/x/sync v0.19.0 // indirect - golang.org/x/sys v0.39.0 // indirect - golang.org/x/term v0.38.0 // indirect - golang.org/x/text v0.32.0 // indirect - golang.org/x/time v0.6.0 // indirect - golang.org/x/tools v0.39.0 // indirect - google.golang.org/protobuf v1.34.2 // indirect - gopkg.in/djherbis/times.v1 v1.3.0 // indirect - gopkg.in/ini.v1 v1.67.0 // indirect - gopkg.in/yaml.v2 v2.4.0 // indirect - gopkg.in/yaml.v3 v3.0.1 // indirect + github.com/ncruces/go-strftime v1.0.0 // indirect + github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect + github.com/spf13/pflag v1.0.9 // indirect + golang.org/x/exp v0.0.0-20251023183803-a4bb9ffd2546 // indirect + golang.org/x/sys v0.37.0 // indirect + modernc.org/libc v1.67.6 // indirect + modernc.org/mathutil v1.7.1 // indirect + modernc.org/memory v1.11.0 // indirect ) diff --git a/go.sum b/go.sum index 68691938..303f3d71 100644 --- a/go.sum +++ b/go.sum @@ -1,630 +1,63 @@ -aead.dev/minisign v0.2.0 h1:kAWrq/hBRu4AARY6AlciO83xhNnW9UaC8YipS2uhLPk= -aead.dev/minisign v0.2.0/go.mod h1:zdq6LdSd9TbuSxchxwhpA9zEb9YXcVGoE8JakuiGaIQ= -cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= -github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible h1:1G1pk05UrOh0NlF1oeaaix1x8XzrfjIDK47TY0Zehcw= -github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= -github.com/Masterminds/semver/v3 v3.2.1 h1:RN9w6+7QoMeJVGyfmbcgs28Br8cvmnucEXnY0rYXWg0= -github.com/Masterminds/semver/v3 v3.2.1/go.mod h1:qvl/7zhW3nngYb5+80sSMF+FG2BjYrf8m9wsX0PNOMQ= -github.com/Mzack9999/gcache v0.0.0-20230410081825-519e28eab057 h1:KFac3SiGbId8ub47e7kd2PLZeACxc1LkiiNoDOFRClE= -github.com/Mzack9999/gcache v0.0.0-20230410081825-519e28eab057/go.mod h1:iLB2pivrPICvLOuROKmlqURtFIEsoJZaMidQfCG1+D4= -github.com/Mzack9999/go-http-digest-auth-client v0.6.1-0.20220414142836-eb8883508809 h1:ZbFL+BDfBqegi+/Ssh7im5+aQfBRx6it+kHnC7jaDU8= -github.com/Mzack9999/go-http-digest-auth-client v0.6.1-0.20220414142836-eb8883508809/go.mod h1:upgc3Zs45jBDnBT4tVRgRcgm26ABpaP7MoTSdgysca4= -github.com/ProtonMail/go-crypto v0.0.0-20230217124315-7d5c6f04bbb8/go.mod h1:I0gYDMZ6Z5GRU7l58bNFSkPTFN6Yl12dsUlAZ8xy98g= -github.com/PuerkitoBio/goquery v1.8.1 h1:uQxhNlArOIdbrH1tr0UXwdVFgDcZDrZVdcpygAcwmWM= -github.com/PuerkitoBio/goquery v1.8.1/go.mod h1:Q8ICL1kNUJ2sXGoAhPGUdYDJvgQgHzJsnnd3H7Ho5jQ= -github.com/RumbleDiscovery/rumble-tools v0.0.0-20201105153123-f2adbb3244d2/go.mod h1:jD2+mU+E2SZUuAOHZvZj4xP4frlOo+N/YrXDvASFhkE= -github.com/VividCortex/ewma v1.2.0 h1:f58SaIzcDXrSy3kWaHNvuJgJ3Nmz59Zji6XoJR/q1ow= -github.com/VividCortex/ewma v1.2.0/go.mod h1:nz4BbCtbLyFDeC9SUHbtcT5644juEuWfUAUnGx7j5l4= -github.com/akrylysov/pogreb v0.10.2 h1:e6PxmeyEhWyi2AKOBIJzAEi4HkiC+lKyCocRGlnDi78= -github.com/akrylysov/pogreb v0.10.2/go.mod h1:pNs6QmpQ1UlTJKDezuRWmaqkgUE2TuU0YTWyqJZ7+lI= -github.com/alecthomas/assert/v2 v2.7.0 h1:QtqSACNS3tF7oasA8CU6A6sXZSBDqnm7RfpLl9bZqbE= -github.com/alecthomas/assert/v2 v2.7.0/go.mod h1:Bze95FyfUr7x34QZrjL+XP+0qgp/zg8yS+TtBj1WA3k= -github.com/alecthomas/chroma/v2 v2.14.0 h1:R3+wzpnUArGcQz7fCETQBzO5n9IMNi13iIs46aU4V9E= -github.com/alecthomas/chroma/v2 v2.14.0/go.mod h1:QolEbTfmUHIMVpBqxeDnNBj2uoeI4EbYP4i6n68SG4I= -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/andybalholm/brotli v1.0.1/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y= -github.com/andybalholm/brotli v1.1.0 h1:eLKJA0d02Lf0mVpIDgYnqXcUn0GqVmEFny3VuID1U3M= -github.com/andybalholm/brotli v1.1.0/go.mod h1:sms7XGricyQI9K10gOSf56VKKWS4oLer58Q+mhRPtnY= -github.com/andybalholm/cascadia v1.3.1/go.mod h1:R4bJ1UQfqADjvDa4P6HZHLh/3OxWWEqc0Sk8XGwHqvA= -github.com/andybalholm/cascadia v1.3.2 h1:3Xi6Dw5lHF15JtdcmAHD3i1+T8plmv7BQ/nsViSLyss= -github.com/andybalholm/cascadia v1.3.2/go.mod h1:7gtRlve5FxPPgIgX36uWBX58OdBsSS6lUvCFb+h7KvU= -github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 h1:DklsrG3dyBCFEj5IhUbnKptjxatkF07cF2ak3yi77so= -github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= -github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k= -github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8= -github.com/aymanbagabas/go-udiff v0.2.0 h1:TK0fH4MteXUDspT88n8CKzvK0X9O2xu9yQjWpi6yML8= -github.com/aymanbagabas/go-udiff v0.2.0/go.mod h1:RE4Ex0qsGkTAJoQdQQCA0uG+nAzJO/pI/QwceO5fgrA= -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/bahlo/generic-list-go v0.2.0 h1:5sz/EEAK+ls5wF+NeqDpk5+iNdMDXrh3z3nPnH1Wvgk= -github.com/bahlo/generic-list-go v0.2.0/go.mod h1:2KvAjgMlE5NNynlg/5iLrrCCZ2+5xWbdbCW3pNTGyYg= -github.com/bits-and-blooms/bitset v1.13.0 h1:bAQ9OPNFYbGHV6Nez0tmNI0RiEu7/hxlYJRUA0wFAVE= -github.com/bits-and-blooms/bitset v1.13.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= -github.com/bits-and-blooms/bloom/v3 v3.5.0 h1:AKDvi1V3xJCmSR6QhcBfHbCN4Vf8FfxeWkMNQfmAGhY= -github.com/bits-and-blooms/bloom/v3 v3.5.0/go.mod h1:Y8vrn7nk1tPIlmLtW2ZPV+W7StdVMor6bC1xgpjMZFs= -github.com/buger/jsonparser v1.1.1 h1:2PnMjfWD7wBILjqQbt530v576A/cAbQvEW9gGIpYMUs= -github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= -github.com/bwesterb/go-ristretto v1.2.0/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= -github.com/charmbracelet/glamour v0.8.0 h1:tPrjL3aRcQbn++7t18wOpgLyl8wrOHUEDS7IZ68QtZs= -github.com/charmbracelet/glamour v0.8.0/go.mod h1:ViRgmKkf3u5S7uakt2czJ272WSg2ZenlYEZXT2x7Bjw= -github.com/charmbracelet/lipgloss v0.13.0 h1:4X3PPeoWEDCMvzDvGmTajSyYPcZM4+y8sCA/SsA3cjw= -github.com/charmbracelet/lipgloss v0.13.0/go.mod h1:nw4zy0SBX/F/eAO1cWdcvy6qnkDUxr8Lw7dvFrAIbbY= -github.com/charmbracelet/x/ansi v0.3.2 h1:wsEwgAN+C9U06l9dCVMX0/L3x7ptvY1qmjMwyfE6USY= -github.com/charmbracelet/x/ansi v0.3.2/go.mod h1:dk73KoMTT5AX5BsX0KrqhsTqAnhZZoCBjs7dGWp4Ktw= -github.com/charmbracelet/x/exp/golden v0.0.0-20240806155701-69247e0abc2a h1:G99klV19u0QnhiizODirwVksQB91TJKV/UaTnACcG30= -github.com/charmbracelet/x/exp/golden v0.0.0-20240806155701-69247e0abc2a/go.mod h1:wDlXFlCrmJ8J+swcL/MnGUuYnqgQdW9rhSD61oNMb6U= -github.com/cheggaaa/pb/v3 v3.1.4 h1:DN8j4TVVdKu3WxVwcRKu0sG00IIU6FewoABZzXbRQeo= -github.com/cheggaaa/pb/v3 v3.1.4/go.mod h1:6wVjILNBaXMs8c21qRiaUM8BR82erfgau1DQ4iUXmSA= -github.com/cloudflare/cfssl v1.6.4 h1:NMOvfrEjFfC63K3SGXgAnFdsgkmiq4kATme5BfcqrO8= -github.com/cloudflare/cfssl v1.6.4/go.mod h1:8b3CQMxfWPAeom3zBnGJ6sd+G1NkL5TXqmDXacb+1J0= -github.com/cloudflare/circl v1.1.0/go.mod h1:prBCrKB9DV4poKZY1l9zBXg2QJY7mvgRvtMxxK7fi4I= -github.com/cloudflare/circl v1.6.1 h1:zqIqSPIndyBh1bjLVVDHMPpVKqp8Su/V+6MeDzzQBQ0= -github.com/cloudflare/circl v1.6.1/go.mod h1:uddAzsPgqdMAYatqJ0lsjX1oECcQLIlRpzZh3pJrofs= -github.com/cnf/structhash v0.0.0-20201127153200-e1b16c1ebc08 h1:ox2F0PSMlrAAiAdknSRMDrAr8mfxPCfSZolH+/qQnyQ= -github.com/cnf/structhash v0.0.0-20201127153200-e1b16c1ebc08/go.mod h1:pCxVEbcm3AMg7ejXyorUXi6HQCzOIBf7zEDVPtw0/U4= -github.com/cohere-ai/cohere-go/v2 v2.8.1 h1:7+MCdXtz8onJLRmJik/cD5XGfgDNLhte4aW4dH6brJk= -github.com/cohere-ai/cohere-go/v2 v2.8.1/go.mod h1:dlDCT66i8BqZDuuskFvYzsrc+O0M4l5J9Ibckoflvt4= -github.com/corona10/goimagehash v1.1.0 h1:teNMX/1e+Wn/AYSbLHX8mj+mF9r60R1kBeqE9MkoYwI= -github.com/corona10/goimagehash v1.1.0/go.mod h1:VkvE0mLn84L4aF8vCb6mafVajEb6QYMHl2ZJLn0mOGI= -github.com/corpix/uarand v0.2.0 h1:U98xXwud/AVuCpkpgfPF7J5TQgr7R5tqT8VZP5KWbzE= -github.com/corpix/uarand v0.2.0/go.mod h1:/3Z1QIqWkDIhf6XWn/08/uMHoQ8JUoTIKc2iPchBOmM= -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/dimchansky/utfbom v1.1.1 h1:vV6w1AhK4VMnhBno/TPVCoK9U/LP0PkLCS9tbxHdi/U= -github.com/dimchansky/utfbom v1.1.1/go.mod h1:SxdoEBH5qIqFocHMyGOXVAybYJdr71b1Q/j0mACtrfE= -github.com/dlclark/regexp2 v1.11.4 h1:rPYF9/LECdNymJufQKmri9gV604RvvABwgOA8un7yAo= -github.com/dlclark/regexp2 v1.11.4/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= -github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= -github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/dsnet/compress v0.0.2-0.20210315054119-f66993602bf5 h1:iFaUwBSo5Svw6L7HYpRu/0lE3e0BaElwnNO1qkNQxBY= -github.com/dsnet/compress v0.0.2-0.20210315054119-f66993602bf5/go.mod h1:qssHWj60/X5sZFNxpG4HBPDHVqxNm4DfnCKgrbZOT+s= -github.com/dsnet/golib v0.0.0-20171103203638-1ea166775780/go.mod h1:Lj+Z9rebOhdfkVLjJ8T6VcRQv3SXugXy999NBtR9aFY= -github.com/elazarl/goproxy v0.0.0-20240909085733-6741dbfc16a1 h1:g7YUigN4dW2+zpdusdTTghZ+5Py3BaUMAStvL8Nk+FY= -github.com/elazarl/goproxy v0.0.0-20240909085733-6741dbfc16a1/go.mod h1:thX175TtLTzLj3p7N/Q9IiKZ7NF+p72cvL91emV0hzo= -github.com/elazarl/goproxy/ext v0.0.0-20190711103511-473e67f1d7d2 h1:dWB6v3RcOy03t/bUadywsbyrQwCqZeNIEX6M1OtSZOM= -github.com/elazarl/goproxy/ext v0.0.0-20190711103511-473e67f1d7d2/go.mod h1:gNh8nYJoAm43RfaxurUnxr+N1PwuFV3ZMl/efxlIlY8= -github.com/fasthttp/websocket v1.5.8 h1:k5DpirKkftIF/w1R8ZzjSgARJrs54Je9YJK37DL/Ah8= -github.com/fasthttp/websocket v1.5.8/go.mod h1:d08g8WaT6nnyvg9uMm8K9zMYyDjfKyj3170AtPRuVU0= -github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM= -github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE= -github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= -github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= -github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= -github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0= -github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk= -github.com/gaissmai/bart v0.9.5 h1:vy+r4Px6bjZ+v2QYXAsg63vpz9IfzdW146A8Cn4GPIo= -github.com/gaissmai/bart v0.9.5/go.mod h1:KHeYECXQiBjTzQz/om2tqn3sZF1J7hw9m6z41ftj3fg= -github.com/go-faker/faker/v4 v4.1.1 h1:zkxj/JH/aezB4R6cTEMKU7qcVScGhlB3qRtF3D7K+rI= -github.com/go-faker/faker/v4 v4.1.1/go.mod h1:uuNc0PSRxF8nMgjGrrrU4Nw5cF30Jc6Kd0/FUTTYbhg= -github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= -github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= -github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= -github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= -github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= -github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= -github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= -github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= -github.com/go-playground/validator/v10 v10.21.0 h1:4fZA11ovvtkdgaeev9RGWPgc1uj3H8W+rNYyH/ySBb0= -github.com/go-playground/validator/v10 v10.21.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM= -github.com/go-rod/rod v0.114.0 h1:P+zLOqsj+vKf4C86SfjP6ymyPl9VXoYKm+ceCeQms6Y= -github.com/go-rod/rod v0.114.0/go.mod h1:aiedSEFg5DwG/fnNbUOTPMTTWX3MRj6vIs/a684Mthw= -github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw= -github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4= -github.com/gofiber/contrib/websocket v1.3.2 h1:AUq5PYeKwK50s0nQrnluuINYeep1c4nRCJ0NWsV3cvg= -github.com/gofiber/contrib/websocket v1.3.2/go.mod h1:07u6QGMsvX+sx7iGNCl5xhzuUVArWwLQ3tBIH24i+S8= -github.com/gofiber/fiber/v2 v2.52.5 h1:tWoP1MJQjGEe4GB5TUGOi7P2E0ZMMRx5ZTG4rT+yGMo= -github.com/gofiber/fiber/v2 v2.52.5/go.mod h1:KEOE+cXMhXG0zHc9d8+E38hoX+ZN7bhOtgeF2oT6jrQ= -github.com/gofrs/uuid v3.3.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= -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.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.2/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= -github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/google/certificate-transparency-go v1.1.4 h1:hCyXHDbtqlr/lMXU0D4WgbalXL0Zk4dSWWMbPV8VrqY= -github.com/google/certificate-transparency-go v1.1.4/go.mod h1:D6lvbfwckhNrbM9WVl1EVeMOyzC19mpIjMOI4nxBHtQ= -github.com/google/go-cmp v0.5.2/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.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= -github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-github/v30 v30.1.0 h1:VLDx+UolQICEOKu2m4uAoMti1SxuEBAl7RSEG16L+Oo= -github.com/google/go-github/v30 v30.1.0/go.mod h1:n8jBpHl45a/rlBUtRJMOG4GhNADUQFEufcolZ95JfU8= -github.com/google/go-github/v50 v50.2.0/go.mod h1:VBY8FB6yPIjrtKhozXv4FQupxKLS6H4m6xFZlT43q8Q= -github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= -github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= -github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= -github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= +github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= +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/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/gorilla/css v1.0.1 h1:ntNaBIghp6JmvWnxbZKANoLyuXTPZ4cAMlo6RyhlbO8= -github.com/gorilla/css v1.0.1/go.mod h1:BvnYkspnSzMmwRK+b8/xgNPLiIuNZr6vbZBTPQ2A3b0= -github.com/hako/durafmt v0.0.0-20210316092057-3a2c319c1acd h1:FsX+T6wA8spPe4c1K9vi7T0LvNCO1TTqiL8u7Wok2hw= -github.com/hako/durafmt v0.0.0-20210316092057-3a2c319c1acd/go.mod h1:VzxiSdG6j1pi7rwGm/xYI5RbtpBgM8sARDXlvEvxlu0= -github.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek= -github.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/golang-lru/v2 v2.0.6 h1:3xi/Cafd1NaoEnS/yDssIiuVeDVywU0QdFGl3aQaQHM= -github.com/hashicorp/golang-lru/v2 v2.0.6/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= -github.com/hashicorp/yamux v0.1.1 h1:yrQxtgseBDrq9Y652vSRDvsKCJKOUD+GzTS4Y0Y8pvE= -github.com/hashicorp/yamux v0.1.1/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ= -github.com/hbakhtiyor/strsim v0.0.0-20190107154042-4d2bbb273edf h1:umfGUaWdFP2s6457fz1+xXYIWDxdGc7HdkLS9aJ1skk= -github.com/hbakhtiyor/strsim v0.0.0-20190107154042-4d2bbb273edf/go.mod h1:V99KdStnMHZsvVOwIvhfcUzYgYkRZeQWUtumtL+SKxA= -github.com/hdm/jarm-go v0.0.7 h1:Eq0geenHrBSYuKrdVhrBdMMzOmA+CAMLzN2WrF3eL6A= -github.com/hdm/jarm-go v0.0.7/go.mod h1:kinGoS0+Sdn1Rr54OtanET5E5n7AlD6T6CrJAKDjJSQ= -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/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/inconshreveable/log15 v3.0.0-testing.5+incompatible h1:VryeOTiaZfAzwx8xBcID1KlJCeoWSIpsNbSk+/D2LNk= -github.com/inconshreveable/log15 v3.0.0-testing.5+incompatible/go.mod h1:cOaXtrgN4ScfRrD9Bre7U1thNq5RtJ8ZoP4iXVGRj6o= -github.com/inconshreveable/log15/v3 v3.0.0-testing.5 h1:h4e0f3kjgg+RJBlKOabrohjHe47D3bbAB9BgMrc3DYA= -github.com/inconshreveable/log15/v3 v3.0.0-testing.5/go.mod h1:3GQg1SVrLoWGfRv/kAZMsdyU5cp8eFc1P3cw+Wwku94= -github.com/instructor-ai/instructor-go v0.0.0-20240827181533-b63ca60f159b h1:ED3SzAo/usNdj6n+n9gOOuhWt0fGkmt3M9QZgrVpse8= -github.com/instructor-ai/instructor-go v0.0.0-20240827181533-b63ca60f159b/go.mod h1:SajKTEBufxg5FLgL3Lt9jGHWENALd8jqsTd7CaYXzxc= -github.com/invopop/jsonschema v0.12.0 h1:6ovsNSuvn9wEQVOyc72aycBMVQFKz7cPdMJn10CvzRI= -github.com/invopop/jsonschema v0.12.0/go.mod h1:ffZ5Km5SWWRAIN6wbDXItl95euhFz2uON45H2qjYt+0= -github.com/jaytaylor/html2text v0.0.0-20230321000545-74c2419ad056 h1:iCHtR9CQyktQ5+f3dMVZfwD2KWJUgm7M0gdL9NGr8KA= -github.com/jaytaylor/html2text v0.0.0-20230321000545-74c2419ad056/go.mod h1:CVKlgaMiht+LXvHG173ujK6JUhZXKb2u/BQtjPDIvyk= -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/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= -github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA= -github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= -github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= -github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= -github.com/julienschmidt/httprouter v1.3.0 h1:U0609e9tgbseu3rBINet9P48AI/D3oJs4dN7jwJOQ1U= -github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/kataras/jwt v0.1.10 h1:GBXOF9RVInDPhCFBiDumRG9Tt27l7ugLeLo8HL5SeKQ= -github.com/kataras/jwt v0.1.10/go.mod h1:xkimAtDhU/aGlQqjwvgtg+VyuPwMiyZHaY8LJRh0mYo= -github.com/klauspost/compress v1.4.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.11.4/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.17.8 h1:YcnTYrq7MikUT7k0Yb5eceMmALQPYBW/Xltxn0NAMnU= -github.com/klauspost/compress v1.17.8/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= -github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= -github.com/klauspost/pgzip v1.2.5/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= -github.com/klauspost/pgzip v1.2.6 h1:8RXeL5crjEUFnR2/Sn6GJNWtSQ3Dk8pq4CL3jvdDyjU= -github.com/klauspost/pgzip v1.2.6/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= -github.com/kljensen/snowball v0.8.0 h1:WU4cExxK6sNW33AiGdbn4e8RvloHrhkAssu2mVJ11kg= -github.com/kljensen/snowball v0.8.0/go.mod h1:OGo5gFWjaeXqCu4iIrMl5OYip9XUJHGOU5eSkPjVg2A= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -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/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= -github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= -github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= -github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/liushuangls/go-anthropic/v2 v2.1.0 h1:5ntOeehozlMin0+hgnhxbTru+tmBH84ADaSPelG5fPg= -github.com/liushuangls/go-anthropic/v2 v2.1.0/go.mod h1:8BKv/fkeTaL5R9R9bGkaknYBueyw2WxY20o7bImbOek= -github.com/logrusorgru/aurora v2.0.3+incompatible h1:tOpm7WcpBTn4fjmVfgpQq0EfczGlG91VSDkswnjF5A8= -github.com/logrusorgru/aurora v2.0.3+incompatible/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= -github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= -github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= -github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4= -github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= -github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= -github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= -github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= +github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= +github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= +github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= 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.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.12/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= -github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= -github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU= -github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= -github.com/mfonda/simhash v0.0.0-20151007195837-79f94a1100d6 h1:bjfMeqxWEJ6IRUvGkiTkSwx0a6UdQJsbirRSoXogteY= -github.com/mfonda/simhash v0.0.0-20151007195837-79f94a1100d6/go.mod h1:WVJJvUw/pIOcwu2O8ZzHEhmigq2jzwRNfJVRMJB7bR8= -github.com/mholt/archiver/v3 v3.5.1 h1:rDjOBX9JSF5BvoJGvjqK479aL70qh9DIpZCl+k7Clwo= -github.com/mholt/archiver/v3 v3.5.1/go.mod h1:e3dqJ7H78uzsRSEACH1joayhuSyhnonssnDhppzS1L4= -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/miekg/dns v1.1.35/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= -github.com/miekg/dns v1.1.59 h1:C9EXc/UToRwKLhK5wKU/I4QVsBUc8kE6MkHBkeypWZs= -github.com/miekg/dns v1.1.59/go.mod h1:nZpewl5p6IvctfgrckopVx2OlSEHPRO/U4SYkRklrEk= -github.com/minio/selfupdate v0.6.1-0.20230907112617-f11e74f84ca7 h1:yRZGarbxsRytL6EGgbqK2mCY+Lk5MWKQYKJT2gEglhc= -github.com/minio/selfupdate v0.6.1-0.20230907112617-f11e74f84ca7/go.mod h1:bO02GTIPCMQFTEvE5h4DjYB58bCoZ35XLeBf0buTDdM= -github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= -github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= -github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/mreiferson/go-httpclient v0.0.0-20160630210159-31f0106b4474/go.mod h1:OQA4XLvDbMgS8P0CevmM4m9Q3Jq4phKUzcocxuGJ5m8= -github.com/mreiferson/go-httpclient v0.0.0-20201222173833-5e475fde3a4d/go.mod h1:OQA4XLvDbMgS8P0CevmM4m9Q3Jq4phKUzcocxuGJ5m8= -github.com/muesli/reflow v0.3.0 h1:IFsN6K9NfGtjeggFP+68I4chLZV2yIKsXJFNZ+eWh6s= -github.com/muesli/reflow v0.3.0/go.mod h1:pbwTDkVPibjO2kyvBQRBxTWEEGDGq0FlB1BIKtnHY/8= -github.com/muesli/termenv v0.15.3-0.20240618155329-98d742f6907a h1:2MaM6YC3mGu54x+RKAA6JiFFHlHDY1UbkxqppT7wYOg= -github.com/muesli/termenv v0.15.3-0.20240618155329-98d742f6907a/go.mod h1:hxSnBBYLK21Vtq/PHd0S2FYCxBXzBua8ov5s1RobyRQ= -github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 h1:zYyBkD/k9seD2A7fsi6Oo2LfFZAehjjQMERAvZLEDnQ= -github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8= -github.com/nwaples/rardecode v1.1.0/go.mod h1:5DzqNKiOdpKKBH87u8VlvAnPZMXcGRhxWkRpHbbfGS0= -github.com/nwaples/rardecode v1.1.3 h1:cWCaZwfM5H7nAD6PyEdcVnczzV8i/JtotnyW/dD9lEc= -github.com/nwaples/rardecode v1.1.3/go.mod h1:5DzqNKiOdpKKBH87u8VlvAnPZMXcGRhxWkRpHbbfGS0= -github.com/nxadm/tail v1.4.11 h1:8feyoE3OzPrcshW5/MJ4sGESc5cqmGkGCWlco4l0bqY= -github.com/nxadm/tail v1.4.11/go.mod h1:OTaG3NK980DZzxbRq6lEuzgU+mug70nY11sMd4JXXHc= -github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= -github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= -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.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc= -github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= -github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI= -github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M= -github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= -github.com/pierrec/lz4/v4 v4.1.2/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= -github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ= -github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= -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/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= -github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= -github.com/projectdiscovery/asnmap v1.1.1 h1:ImJiKIaACOT7HPx4Pabb5dksolzaFYsD1kID2iwsDqI= -github.com/projectdiscovery/asnmap v1.1.1/go.mod h1:QT7jt9nQanj+Ucjr9BqGr1Q2veCCKSAVyUzLXfEcQ60= -github.com/projectdiscovery/blackrock v0.0.1 h1:lHQqhaaEFjgf5WkuItbpeCZv2DUIE45k0VbGJyft6LQ= -github.com/projectdiscovery/blackrock v0.0.1/go.mod h1:ANUtjDfaVrqB453bzToU+YB4cUbvBRpLvEwoWIwlTss= -github.com/projectdiscovery/cdncheck v1.1.0 h1:qDITidmJsejzpk3rMkauCh6sjI2GH9hW/snk0cQ3kXE= -github.com/projectdiscovery/cdncheck v1.1.0/go.mod h1:sZ8U4MjHSsyaTVjBbYWHT1cwUVvUYwDX1W+WvWRicIc= -github.com/projectdiscovery/chaos-client v0.5.1 h1:NFxU7cxBY7AL1OKxQQRLRvJrkXlV+SP8zv7VEkVVJ7U= -github.com/projectdiscovery/chaos-client v0.5.1/go.mod h1:uU7X/hVEKpOP8OZ8meDAAetMZ4Up0lz9oCcPGe86Yx4= -github.com/projectdiscovery/clistats v0.1.1 h1:8mwbdbwTU4aT88TJvwIzTpiNeow3XnAB72JIg66c8wE= -github.com/projectdiscovery/clistats v0.1.1/go.mod h1:4LtTC9Oy//RiuT1+76MfTg8Hqs7FQp1JIGBM3nHK6a0= -github.com/projectdiscovery/dnsx v1.2.1 h1:TxslYvp1Z/YZ4CP/J0gx5RYpvXREnVmyoacmTcGu5yg= -github.com/projectdiscovery/dnsx v1.2.1/go.mod h1:6dAsMCEDu7FArZy2qjyTeUQrqpZ4ITLU11fcmUvFqt0= -github.com/projectdiscovery/dsl v0.2.1 h1:TK3KD4jsg4YbvY7WJqnz1QyH4AOvAwezeBFOX97Evgk= -github.com/projectdiscovery/dsl v0.2.1/go.mod h1:IRQXsmi5/g1dDZ79//A9t2vrRtxm4frRSd5t8CZVSbI= -github.com/projectdiscovery/fastdialer v0.2.9 h1:vDCqxVMCyUu3oVEizEK1K8K+CCcLkVDW3X2HfiWaVFA= -github.com/projectdiscovery/fastdialer v0.2.9/go.mod h1:mYv5QaNBDDSHlZO9DI0niRMw+G5hUzwIhs8QixSElUI= -github.com/projectdiscovery/fdmax v0.0.4 h1:K9tIl5MUZrEMzjvwn/G4drsHms2aufTn1xUdeVcmhmc= -github.com/projectdiscovery/fdmax v0.0.4/go.mod h1:oZLqbhMuJ5FmcoaalOm31B1P4Vka/CqP50nWjgtSz+I= -github.com/projectdiscovery/freeport v0.0.6 h1:ROqzuXN8JPqkGdBueb3ah691nS2g2p7r3/3x2E33GbI= -github.com/projectdiscovery/freeport v0.0.6/go.mod h1:T2kIy+WrbyxBIhI8V3Y9aeNGnuhnM8tEUSK/cm9GjAg= -github.com/projectdiscovery/goconfig v0.0.1 h1:36m3QjohZvemqh9bkJAakaHsm9iEZ2AcQSS18+0QX/s= -github.com/projectdiscovery/goconfig v0.0.1/go.mod h1:CPO25zR+mzTtyBrsygqsHse0sp/4vB/PjaHi9upXlDw= -github.com/projectdiscovery/goflags v0.1.64 h1:FDfwdt9N97Hi8OuhbkDlKtVttpc/CRMIWQVa08VsHsI= -github.com/projectdiscovery/goflags v0.1.64/go.mod h1:3FyHIVQtnycNOc1LE3O1jj/XR5XuMdF9QfHd0ujhnX4= -github.com/projectdiscovery/gologger v1.1.24 h1:TmA4k9sA6ZvfyRnprZKQ0Uq34g//u5R9yTDPL9IzTOQ= -github.com/projectdiscovery/gologger v1.1.24/go.mod h1:JA0JMJ+ply+J2wD062TN4h85thm6/28jAlrntwccKVU= -github.com/projectdiscovery/gostruct v0.0.2 h1:s8gP8ApugGM4go1pA+sVlPDXaWqNP5BBDDSv7VEdG1M= -github.com/projectdiscovery/gostruct v0.0.2/go.mod h1:H86peL4HKwMXcQQtEa6lmC8FuD9XFt6gkNR0B/Mu5PE= -github.com/projectdiscovery/hmap v0.0.59 h1:xWCr/GY2QJanFzwKydh/EkGdOKM4iAcN9hQvvCMgO6A= -github.com/projectdiscovery/hmap v0.0.59/go.mod h1:uHhhnPmvq9qXvCjBSQXCBAlmA1r8JGufP775IkBSbgs= -github.com/projectdiscovery/httpx v1.6.8 h1:k0Y5g3ue/7QbDP0+LykIxp/VhPDLfau3UEUyuxtP7qE= -github.com/projectdiscovery/httpx v1.6.8/go.mod h1:7BIsDxyRwkBjthqFmEajXrA5f3yb4tlVfLmpNdf0ZXA= -github.com/projectdiscovery/machineid v0.0.0-20240226150047-2e2c51e35983 h1:ZScLodGSezQVwsQDtBSMFp72WDq0nNN+KE/5DHKY5QE= -github.com/projectdiscovery/machineid v0.0.0-20240226150047-2e2c51e35983/go.mod h1:3G3BRKui7nMuDFAZKR/M2hiOLtaOmyukT20g88qRQjI= -github.com/projectdiscovery/mapcidr v1.1.34 h1:udr83vQ7oz3kEOwlsU6NC6o08leJzSDQtls1wmXN/kM= -github.com/projectdiscovery/mapcidr v1.1.34/go.mod h1:1+1R6OkKSAKtWDXE9RvxXtXPoajXTYX0eiEdkqlhQqQ= -github.com/projectdiscovery/networkpolicy v0.0.9 h1:IrlDoYZagNNO8y+7iZeHT8k5izE+nek7TdtvEBwCxqk= -github.com/projectdiscovery/networkpolicy v0.0.9/go.mod h1:XFJ2Lnv8BE/ziQCFjBHMsH1w6VmkPiQtk+NlBpdMU7M= -github.com/projectdiscovery/ratelimit v0.0.56 h1:WliU7NvfMb5hK/IJjOFlWIXU1G7+QRylMhSybaSCTI8= -github.com/projectdiscovery/ratelimit v0.0.56/go.mod h1:GbnAo+MbB4R/4jiOI1mH4KAJfovmrPnq4NElcI99fvs= -github.com/projectdiscovery/rawhttp v0.1.67 h1:HYzathMk3c8Y83hYjHM4GCBFbz/G+vABe0Lz6ajaowY= -github.com/projectdiscovery/rawhttp v0.1.67/go.mod h1:5viJ6odzc9ZuEFppj/E7HdX+u99FoYlvXnhHyTNc7N0= -github.com/projectdiscovery/retryabledns v1.0.77 h1:rCFSiTPNI7h9PP1uUvrmcq/6XVZVdxpha2H1ioArKpk= -github.com/projectdiscovery/retryabledns v1.0.77/go.mod h1:ce1JTjAOxLujqITtA5VLlbhLRVubx+GETYasivapai4= -github.com/projectdiscovery/retryablehttp-go v1.0.78 h1:If7/XjCWk893YrnTMaW69TNMsfE1Er3i1SWOkWbEk4E= -github.com/projectdiscovery/retryablehttp-go v1.0.78/go.mod h1:NqzTdnGihSRkF9c/aXo+3qTJXEeNwnOuza6GrlPo9qw= -github.com/projectdiscovery/stringsutil v0.0.2 h1:uzmw3IVLJSMW1kEg8eCStG/cGbYYZAja8BH3LqqJXMA= -github.com/projectdiscovery/stringsutil v0.0.2/go.mod h1:EJ3w6bC5fBYjVou6ryzodQq37D5c6qbAYQpGmAy+DC0= -github.com/projectdiscovery/subfinder/v2 v2.6.6 h1:Lby3sTvDZfgZ+boMDlrMusKgKbosIXg9iPLQqlZytzY= -github.com/projectdiscovery/subfinder/v2 v2.6.6/go.mod h1:NX2fBFBUXU4BGteXrwDIfShaoivsP5e9qC4ZyZtszcE= -github.com/projectdiscovery/tlsx v1.1.7 h1:eSsl/SmTDL/z2CMeSrbssk4f/9oOotMP1SgXl3yynSM= -github.com/projectdiscovery/tlsx v1.1.7/go.mod h1:g66QQ4/y4tLVjoGbzWIv+Q6xwFzxfJbEDx86Y1dYHDM= -github.com/projectdiscovery/useragent v0.0.71 h1:Q02L3LV15ztOQ6FfmVSqVmOd5QhvzI+yAgYOc/32Nvg= -github.com/projectdiscovery/useragent v0.0.71/go.mod h1:DHPruFLCvCvkd2qqPwwQZrP9sziv0lxQJ0R1rE1fa8E= -github.com/projectdiscovery/utils v0.2.11 h1:TO7fBG5QI256sn1YuTD87yn4+4OjGJ2wT1772uEnp4Q= -github.com/projectdiscovery/utils v0.2.11/go.mod h1:W0E74DWkKxlcyKS5XwcAwiob7+smoszPPi1NgX3vZyk= -github.com/projectdiscovery/wappalyzergo v0.1.18 h1:fFgETis0HcsNE7wREaUPYP45JqIyHgGorJaVp1RH7g4= -github.com/projectdiscovery/wappalyzergo v0.1.18/go.mod h1:/hzgxkBFTMe2wDbA93nFfoMjULw7/vIZ9QPSAnCgUa8= -github.com/refraction-networking/utls v1.6.7 h1:zVJ7sP1dJx/WtVuITug3qYUq034cDq9B2MR1K67ULZM= -github.com/refraction-networking/utls v1.6.7/go.mod h1:BC3O4vQzye5hqpmDTWUqi4P5DDhzJfkV1tdqtawQIH0= -github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -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.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= -github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= -github.com/rs/xid v1.5.0 h1:mKX4bl4iPYJtEIxp6CYiUuLQ/8DYMoz0PUdtGgMFRVc= -github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= -github.com/saintfish/chardet v0.0.0-20230101081208-5e3ef4b5456d h1:hrujxIzL1woJ7AwssoOcM/tq5JjjG2yYOc8odClEiXA= -github.com/saintfish/chardet v0.0.0-20230101081208-5e3ef4b5456d/go.mod h1:uugorj2VCxiV1x+LzaIdVa9b4S4qGAcH6cbhh4qVxOU= -github.com/sashabaranov/go-openai v1.29.0 h1:eBH6LSjtX4md5ImDCX8hNhHQvaRf22zujiERoQpsvLo= -github.com/sashabaranov/go-openai v1.29.0/go.mod h1:lj5b/K+zjTSFxVLijLSTDZuP7adOgerWeFyZLUhAKRg= -github.com/savsgio/gotils v0.0.0-20240303185622-093b76447511 h1:KanIMPX0QdEdB4R3CiimCAbxFrhB3j7h0/OvpYGVQa8= -github.com/savsgio/gotils v0.0.0-20240303185622-093b76447511/go.mod h1:sM7Mt7uEoCeFSCBM+qBrqvEo+/9vdmj19wzp3yzUhmg= -github.com/shirou/gopsutil/v3 v3.24.2 h1:kcR0erMbLg5/3LcInpw0X/rrPSqq4CDPyI6A6ZRC18Y= -github.com/shirou/gopsutil/v3 v3.24.2/go.mod h1:tSg/594BcA+8UdQU2XcW803GWYgdtauFFPgJCJKZlVk= -github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM= -github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= -github.com/shoenig/test v0.6.4 h1:kVTaSd7WLz5WZ2IaoM0RSzRsUD+m8wRR+5qvntpn4LU= -github.com/shoenig/test v0.6.4/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k= -github.com/sirupsen/logrus v1.3.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= -github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -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/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.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.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/syndtr/goleveldb v1.0.0 h1:fBdIW9lB4Iz0n9khmH8w27SJ3QEJ7+IgjPEwGSZiFdE= -github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ= -github.com/tidwall/assert v0.1.0 h1:aWcKyRBUAdLoVebxo95N7+YZVTFF/ASTr7BN4sLP6XI= -github.com/tidwall/assert v0.1.0/go.mod h1:QLYtGyeqse53vuELQheYl9dngGCJQ+mTtlxcktb+Kj8= -github.com/tidwall/btree v1.7.0 h1:L1fkJH/AuEh5zBnnBbmTwQ5Lt+bRJ5A8EWecslvo9iI= -github.com/tidwall/btree v1.7.0/go.mod h1:twD9XRA5jj9VUQGELzDO4HPQTNJsoWWfYEL+EUQ2cKY= -github.com/tidwall/buntdb v1.3.1 h1:HKoDF01/aBhl9RjYtbaLnvX9/OuenwvQiC3OP1CcL4o= -github.com/tidwall/buntdb v1.3.1/go.mod h1:lZZrZUWzlyDJKlLQ6DKAy53LnG7m5kHyrEHvvcDmBpU= -github.com/tidwall/gjson v1.12.1/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= -github.com/tidwall/gjson v1.17.1 h1:wlYEnwqAHgzmhNUFfw7Xalt2JzQvsMx2Se4PcoFCT/U= -github.com/tidwall/gjson v1.17.1/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= -github.com/tidwall/grect v0.1.4 h1:dA3oIgNgWdSspFzn1kS4S/RDpZFLrIxAZOdJKjYapOg= -github.com/tidwall/grect v0.1.4/go.mod h1:9FBsaYRaR0Tcy4UwefBX/UDcDcDy9V5jUcxHzv2jd5Q= -github.com/tidwall/lotsa v1.0.2 h1:dNVBH5MErdaQ/xd9s769R31/n2dXavsQ0Yf4TMEHHw8= -github.com/tidwall/lotsa v1.0.2/go.mod h1:X6NiU+4yHA3fE3Puvpnn1XMDrFZrE9JO2/w+UMuqgR8= -github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= -github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= -github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= -github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4= -github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= -github.com/tidwall/rtred v0.1.2 h1:exmoQtOLvDoO8ud++6LwVsAMTu0KPzLTUrMln8u1yu8= -github.com/tidwall/rtred v0.1.2/go.mod h1:hd69WNXQ5RP9vHd7dqekAz+RIdtfBogmglkZSRxCHFQ= -github.com/tidwall/tinyqueue v0.1.1 h1:SpNEvEggbpyN5DIReaJ2/1ndroY8iyEGxPYxoSaymYE= -github.com/tidwall/tinyqueue v0.1.1/go.mod h1:O/QNHwrnjqr6IHItYrzoHAKYhBkLI67Q096fQP5zMYw= -github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= -github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= -github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= -github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= -github.com/tomnomnom/linkheader v0.0.0-20180905144013-02ca5825eb80 h1:nrZ3ySNYwJbSpD6ce9duiP+QkD3JuLCcWkdaehUS/3Y= -github.com/tomnomnom/linkheader v0.0.0-20180905144013-02ca5825eb80/go.mod h1:iFyPdL66DjUD96XmzVL3ZntbzcflLnznH0fr99w5VqE= -github.com/ulikunitz/xz v0.5.8/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= -github.com/ulikunitz/xz v0.5.9/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= -github.com/ulikunitz/xz v0.5.15 h1:9DNdB5s+SgV3bQ2ApL10xRc35ck0DuIX/isZvIk+ubY= -github.com/ulikunitz/xz v0.5.15/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= -github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= -github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasthttp v1.52.0 h1:wqBQpxH71XW0e2g+Og4dzQM8pk34aFYlA1Ga8db7gU0= -github.com/valyala/fasthttp v1.52.0/go.mod h1:hf5C4QnVMkNXMspnsUlfM3WitlgYflyhHYoKol/szxQ= -github.com/valyala/tcplisten v1.0.0 h1:rBHj/Xf+E1tRGZyWIWwJDiRY0zc1Js+CV5DqwacVSA8= -github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= -github.com/weppos/publicsuffix-go v0.13.0/go.mod h1:z3LCPQ38eedDQSwmsSRW4Y7t2L8Ln16JPQ02lHAdn5k= -github.com/weppos/publicsuffix-go v0.30.2 h1:Np18yzfMR90jNampWFs7iSh2sw/qCZkhL41/ffyihCU= -github.com/weppos/publicsuffix-go v0.30.2/go.mod h1:/hGscit36Yt+wammfBBwdMdxBT8btsTt6KvwO9OvMyM= -github.com/wk8/go-ordered-map/v2 v2.1.8 h1:5h/BUHu93oj4gIdvHHHGsScSTMijfx5PeYkE/fJgbpc= -github.com/wk8/go-ordered-map/v2 v2.1.8/go.mod h1:5nJHM5DyteebpVlHnWMV0rPz6Zp7+xBAnxjb1X5vnTw= -github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8 h1:nIPpBwaJSVYIxUFsDv3M8ofmx9yWTog9BfvIu0q41lo= -github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8/go.mod h1:HUYIGzjTL3rfEspMxjDjgmT5uz5wzYJKVo23qUhYTos= -github.com/yl2chen/cidranger v1.0.2 h1:lbOWZVCG1tCRX4u24kuM1Tb4nHqWkDxwLdoS+SevawU= -github.com/yl2chen/cidranger v1.0.2/go.mod h1:9U1yz7WPYDwf0vpNWFaeRh0bjwz5RVgRy/9UEQfHl0g= -github.com/ysmood/fetchup v0.2.3 h1:ulX+SonA0Vma5zUFXtv52Kzip/xe7aj4vqT5AJwQ+ZQ= -github.com/ysmood/fetchup v0.2.3/go.mod h1:xhibcRKziSvol0H1/pj33dnKrYyI2ebIvz5cOOkYGns= -github.com/ysmood/goob v0.4.0 h1:HsxXhyLBeGzWXnqVKtmT9qM7EuVs/XOgkX7T6r1o1AQ= -github.com/ysmood/goob v0.4.0/go.mod h1:u6yx7ZhS4Exf2MwciFr6nIM8knHQIE22lFpWHnfql18= -github.com/ysmood/gop v0.0.2 h1:VuWweTmXK+zedLqYufJdh3PlxDNBOfFHjIZlPT2T5nw= -github.com/ysmood/gop v0.0.2/go.mod h1:rr5z2z27oGEbyB787hpEcx4ab8cCiPnKxn0SUHt6xzk= -github.com/ysmood/got v0.34.1 h1:IrV2uWLs45VXNvZqhJ6g2nIhY+pgIG1CUoOcqfXFl1s= -github.com/ysmood/got v0.34.1/go.mod h1:yddyjq/PmAf08RMLSwDjPyCvHvYed+WjHnQxpH851LM= -github.com/ysmood/gotrace v0.6.0 h1:SyI1d4jclswLhg7SWTL6os3L1WOKeNn/ZtzVQF8QmdY= -github.com/ysmood/gotrace v0.6.0/go.mod h1:TzhIG7nHDry5//eYZDYcTzuJLYQIkykJzCRIo4/dzQM= -github.com/ysmood/gson v0.7.3 h1:QFkWbTH8MxyUTKPkVWAENJhxqdBa4lYTQWqZCiLG6kE= -github.com/ysmood/gson v0.7.3/go.mod h1:3Kzs5zDl21g5F/BlLTNcuAGAYLKt2lV5G8D1zF3RNmg= -github.com/ysmood/leakless v0.8.0 h1:BzLrVoiwxikpgEQR0Lk8NyBN5Cit2b1z+u0mgL4ZJak= -github.com/ysmood/leakless v0.8.0/go.mod h1:R8iAXPRaG97QJwqxs74RdwzcRHT1SWCGTNqY8q0JvMQ= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -github.com/yuin/goldmark v1.7.1/go.mod h1:uzxRWxtg69N339t3louHJ7+O03ezfj6PlliRlaOzY1E= -github.com/yuin/goldmark v1.7.4 h1:BDXOHExt+A7gwPCJgPIIq7ENvceR7we7rOS9TNoLZeg= -github.com/yuin/goldmark v1.7.4/go.mod h1:uzxRWxtg69N339t3louHJ7+O03ezfj6PlliRlaOzY1E= -github.com/yuin/goldmark-emoji v1.0.3 h1:aLRkLHOuBR2czCY4R8olwMjID+tENfhyFDMCRhbIQY4= -github.com/yuin/goldmark-emoji v1.0.3/go.mod h1:tTkZEbwu5wkPmgTcitqddVxY9osFZiavD+r4AzQrh1U= -github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= -github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= -github.com/zcalusic/sysinfo v1.0.2 h1:nwTTo2a+WQ0NXwo0BGRojOJvJ/5XKvQih+2RrtWqfxc= -github.com/zcalusic/sysinfo v1.0.2/go.mod h1:kluzTYflRWo6/tXVMJPdEjShsbPpsFRyy+p1mBQPC30= -github.com/zmap/rc2 v0.0.0-20131011165748-24b9757f5521/go.mod h1:3YZ9o3WnatTIZhuOtot4IcUfzoKVjUHqu6WALIyI0nE= -github.com/zmap/rc2 v0.0.0-20190804163417-abaa70531248 h1:Nzukz5fNOBIHOsnP+6I79kPx3QhLv8nBy2mfFhBRq30= -github.com/zmap/rc2 v0.0.0-20190804163417-abaa70531248/go.mod h1:3YZ9o3WnatTIZhuOtot4IcUfzoKVjUHqu6WALIyI0nE= -github.com/zmap/zcertificate v0.0.0-20180516150559-0e3d58b1bac4/go.mod h1:5iU54tB79AMBcySS0R2XIyZBAVmeHranShAFELYx7is= -github.com/zmap/zcertificate v0.0.1/go.mod h1:q0dlN54Jm4NVSSuzisusQY0hqDWvu92C+TWveAxiVWk= -github.com/zmap/zcrypto v0.0.0-20201128221613-3719af1573cf/go.mod h1:aPM7r+JOkfL+9qSB4KbYjtoEzJqUK50EXkkJabeNJDQ= -github.com/zmap/zcrypto v0.0.0-20201211161100-e54a5822fb7e/go.mod h1:aPM7r+JOkfL+9qSB4KbYjtoEzJqUK50EXkkJabeNJDQ= -github.com/zmap/zcrypto v0.0.0-20240512203510-0fef58d9a9db h1:IfONOhyZlf4qPt3ENPU+27mBbPjzTQ+swKpj7MJva9I= -github.com/zmap/zcrypto v0.0.0-20240512203510-0fef58d9a9db/go.mod h1:mo/07mo6reDaiz6BzveCuYBWb1d+aX8Pf8Nh+Q57y2g= -github.com/zmap/zlint/v3 v3.0.0/go.mod h1:paGwFySdHIBEMJ61YjoqT4h7Ge+fdYG4sUQhnTb1lJ8= -go.etcd.io/bbolt v1.3.10 h1:+BqfJTcCzTItrop8mq/lbzL8wSGtj94UO/3U31shqG0= -go.etcd.io/bbolt v1.3.10/go.mod h1:bK3UQLPJZly7IlNmV7uVHJDxfe5aK9Ll93e/74Y9oEQ= -go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= -go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= -golang.ngrok.com/muxado/v2 v2.0.0 h1:bu9eIDhRdYNtIXNnqat/HyMeHYOAbUH55ebD7gTvW6c= -golang.ngrok.com/muxado/v2 v2.0.0/go.mod h1:wzxJYX4xiAtmwumzL+QsukVwFRXmPNv86vB8RPpOxyM= -golang.ngrok.com/ngrok v1.11.0 h1:lvbBcoOvH+Ek15wgrjvxpCB+PBM7vinU6jQPsrCdOLw= -golang.ngrok.com/ngrok v1.11.0/go.mod h1:1/gLOyOJm7ygHJlcEbtldFLQwQnQ42z+rucpLE2YsvA= -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-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/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-20201208171446-5f87f3452ae9/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= -golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20211209193657-4570a0811e8b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= -golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= -golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= -golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= -golang.org/x/crypto v0.46.0 h1:cKRW/pmt1pKAfetfu+RCEvjvZkA9RimPbh7bhFjGVBU= -golang.org/x/crypto v0.46.0/go.mod h1:Evb/oLKmMraqjZ2iQTwDwvCtJkczlDuTmdJXoZVzqU0= -golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 h1:vr/HnozRka3pE4EsMEg1lgkXJkTFJCVUX+S/ZT6wYzM= -golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842/go.mod h1:XtvwrStGgqGPLc4cjQfWqZHG1YFdYs6swckp8vpsjnc= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.30.0 h1:fDEXFVZ/fmCKProc/yAXXUijritrDzahmwwefnjoPFk= -golang.org/x/mod v0.30.0/go.mod h1:lAsf5O2EvJeSFMiBxXDki7sCgAxEUcZHXoXMKT4GJKc= -golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/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-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200528225125-3c3fba18258b/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210916014120-12bc252f5db8/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= -golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= -golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= -golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY= -golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.6.0/go.mod h1:ycmewcwgD4Rpr3eZJLSB4Kyyljb3qDh40vJ8STE5HKw= -golang.org/x/oauth2 v0.34.0 h1:hqK/t4AKgbqWkdkcAeI8XLmbK+4m4G5YeQRrmiotGlw= -golang.org/x/oauth2 v0.34.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/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-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.19.0 h1:vV+1eWNmZ5geRlYjzm2adRgW2/mcpevXNg50YZtPCE4= -golang.org/x/sync v0.19.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= -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-20190215142949-d0b11bdaac8a/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-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121/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-20201126233918-771906719818/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210228012217-479acdf4ea46/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-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +github.com/ncruces/go-strftime v1.0.0 h1:HMFp8mLCTPp341M/ZnA4qaf7ZlsbTc+miZjCLOFAw7w= +github.com/ncruces/go-strftime v1.0.0/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls= +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/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/spf13/cobra v1.10.2 h1:DMTTonx5m65Ic0GOoRY2c16WCbHxOOw6xxezuLaBpcU= +github.com/spf13/cobra v1.10.2/go.mod h1:7C1pvHqHw5A4vrJfjNwvOdzYu0Gml16OCs2GRiTUUS4= +github.com/spf13/pflag v1.0.9 h1:9exaQaMOCwffKiiiYk6/BndUBv+iRViNW+4lEMi0PvY= +github.com/spf13/pflag v1.0.9/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= +golang.org/x/exp v0.0.0-20251023183803-a4bb9ffd2546 h1:mgKeJMpvi0yx/sU5GsxQ7p6s2wtOnGAHZWCHUM4KGzY= +golang.org/x/exp v0.0.0-20251023183803-a4bb9ffd2546/go.mod h1:j/pmGrbnkbPtQfxEe5D0VQhZC6qKbfKifgD0oM7sR70= +golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= +golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= +golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug= +golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.39.0 h1:CvCKL8MeisomCi6qNZ+wbb0DN9E5AATixKsvNtMoMFk= -golang.org/x/sys v0.39.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= -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.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= -golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= -golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= -golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= -golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= -golang.org/x/term v0.38.0 h1:PQ5pkm/rLO6HnxFR7N2lJHOZX6Kez5Y1gDSJla6jo7Q= -golang.org/x/term v0.38.0/go.mod h1:bSEAKrOT1W+VSu9TSCMtoGEOUcKxOKgl3LE5QEF/xVg= -golang.org/x/text v0.3.0/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.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.32.0 h1:ZD01bjUt1FQ9WJ0ClOL5vxgxOI/sVCNgX1YtKwcY0mU= -golang.org/x/text v0.32.0/go.mod h1:o/rUWzghvpD5TXrTIBuJU77MTaN0ljMWE47kxGJQ7jY= -golang.org/x/time v0.6.0 h1:eTDhh4ZXt5Qf0augr54TN6suAUudPcawVZeIAPU7D4U= -golang.org/x/time v0.6.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216052735-49a3e744a425/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.39.0 h1:ik4ho21kwuQln40uelmciQPp9SipgNDdrafrYA4TmQQ= -golang.org/x/tools v0.39.0/go.mod h1:JnefbkDPyD8UU2kI5fuf8ZX4/yUeh9W877ZeBONxUqQ= -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= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -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.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= -google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= -google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= +golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= +golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/tools v0.38.0 h1:Hx2Xv8hISq8Lm16jvBZ2VQf+RLmbd7wVUsALibYI/IQ= +golang.org/x/tools v0.38.0/go.mod h1:yEsQ/d/YK8cjh0L6rZlY8tgtlKiBNTL14pGDJPJpYQs= 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-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/djherbis/times.v1 v1.3.0 h1:uxMS4iMtH6Pwsxog094W0FYldiNnfY/xba00vq6C2+o= -gopkg.in/djherbis/times.v1 v1.3.0/go.mod h1:AQlg6unIsrsCEdQYhTzERy542dz6SFdQFZFv6mUY0P8= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= -gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -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.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.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= -gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gorm.io/driver/sqlite v1.5.6 h1:fO/X46qn5NUEEOZtnjJRWRzZMe8nqJiQ9E+0hi+hKQE= -gorm.io/driver/sqlite v1.5.6/go.mod h1:U+J8craQU6Fzkcvu8oLeAQmi50TkwPEhHDEjQZXDah4= -gorm.io/gorm v1.25.12 h1:I0u8i2hWQItBq1WfE0o2+WuL9+8L21K9e2HHSTE/0f8= -gorm.io/gorm v1.25.12/go.mod h1:xh7N7RHfYlNc5EmcI/El95gXusucDrQnHXe0+CgWcLQ= +modernc.org/cc/v4 v4.27.1 h1:9W30zRlYrefrDV2JE2O8VDtJ1yPGownxciz5rrbQZis= +modernc.org/cc/v4 v4.27.1/go.mod h1:uVtb5OGqUKpoLWhqwNQo/8LwvoiEBLvZXIQ/SmO6mL0= +modernc.org/ccgo/v4 v4.30.1 h1:4r4U1J6Fhj98NKfSjnPUN7Ze2c6MnAdL0hWw6+LrJpc= +modernc.org/ccgo/v4 v4.30.1/go.mod h1:bIOeI1JL54Utlxn+LwrFyjCx2n2RDiYEaJVSrgdrRfM= +modernc.org/fileutil v1.3.40 h1:ZGMswMNc9JOCrcrakF1HrvmergNLAmxOPjizirpfqBA= +modernc.org/fileutil v1.3.40/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/gc/v3 v3.1.1 h1:k8T3gkXWY9sEiytKhcgyiZ2L0DTyCQ/nvX+LoCljoRE= +modernc.org/gc/v3 v3.1.1/go.mod h1:HFK/6AGESC7Ex+EZJhJ2Gni6cTaYpSMmU/cT9RmlfYY= +modernc.org/goabi0 v0.2.0 h1:HvEowk7LxcPd0eq6mVOAEMai46V+i7Jrj13t4AzuNks= +modernc.org/goabi0 v0.2.0/go.mod h1:CEFRnnJhKvWT1c1JTI3Avm+tgOWbkOu5oPA8eH8LnMI= +modernc.org/libc v1.67.6 h1:eVOQvpModVLKOdT+LvBPjdQqfrZq+pC39BygcT+E7OI= +modernc.org/libc v1.67.6/go.mod h1:JAhxUVlolfYDErnwiqaLvUqc8nfb2r6S6slAgZOnaiE= +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.45.0 h1:r51cSGzKpbptxnby+EIIz5fop4VuE4qFoVEjNvWoObs= +modernc.org/sqlite v1.45.0/go.mod h1:CzbrU2lSB1DKUusvwGz7rqEKIq+NUd8GWuBBZDs9/nA= +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= diff --git a/internal/cli/clear.go b/internal/cli/clear.go new file mode 100644 index 00000000..6ff27ffa --- /dev/null +++ b/internal/cli/clear.go @@ -0,0 +1,38 @@ +package cli + +import ( + "fmt" + + "github.com/spf13/cobra" + + "github.com/ghostsecurity/reaper/internal/daemon" +) + +var clearCmd = &cobra.Command{ + Use: "clear", + Short: "Clear all proxy log entries", + RunE: runClear, +} + +func init() { + rootCmd.AddCommand(clearCmd) +} + +func runClear(cmd *cobra.Command, args []string) error { + dataDir, err := daemon.DataDir() + if err != nil { + return err + } + + client := daemon.NewClient(dataDir) + resp, err := client.Send(daemon.Request{Command: "clear"}) + if err != nil { + return fmt.Errorf("no running daemon found: %w", err) + } + if !resp.OK { + return fmt.Errorf("clear failed: %s", resp.Error) + } + + fmt.Println("all entries cleared") + return nil +} diff --git a/internal/cli/format.go b/internal/cli/format.go new file mode 100644 index 00000000..51f52716 --- /dev/null +++ b/internal/cli/format.go @@ -0,0 +1,122 @@ +package cli + +import ( + "fmt" + "net/http" + "os" + "sort" + "text/tabwriter" + "time" +) + +// entryRow is a subset of storage.Entry used for table display (deserialized from JSON). +type entryRow struct { + ID int64 `json:"ID"` + Method string `json:"Method"` + Scheme string `json:"Scheme"` + Host string `json:"Host"` + Path string `json:"Path"` + Query string `json:"Query"` + StatusCode int `json:"StatusCode"` + DurationMs int64 `json:"DurationMs"` + Timestamp time.Time `json:"Timestamp"` + // These fields are present but not used for table display + RequestHeaders http.Header `json:"RequestHeaders"` + RequestBody []byte `json:"RequestBody"` + ResponseHeaders http.Header `json:"ResponseHeaders"` + ResponseBody []byte `json:"ResponseBody"` +} + +// entryFull has all fields for raw display. +type entryFull = entryRow + +func printTable(entries []entryRow) { + if len(entries) == 0 { + fmt.Println("no entries found") + return + } + + w := tabwriter.NewWriter(os.Stdout, 0, 0, 2, ' ', 0) + + fmt.Fprintf(w, "%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t\n", + "ID", "METHOD", "HOST", "PATH", "STATUS", + pad("MS", 6), pad("REQ", 7), pad("RES", 7)) + + for _, e := range entries { + path := e.Path + if e.Query != "" { + path += "?" + e.Query + } + if len(path) > 60 { + path = path[:57] + "..." + } + + fmt.Fprintf(w, "%d\t%s\t%s\t%s\t%d\t%6d\t%7s\t%7s\t\n", + e.ID, e.Method, e.Host, path, e.StatusCode, e.DurationMs, + formatSize(len(e.RequestBody)), formatSize(len(e.ResponseBody))) + } + + w.Flush() + fmt.Printf("\n%d entries\n", len(entries)) +} + +func printRawRequest(e entryFull) { + path := e.Path + if e.Query != "" { + path += "?" + e.Query + } + if path == "" { + path = "/" + } + + fmt.Printf("%s %s HTTP/1.1\r\n", e.Method, path) + fmt.Printf("Host: %s\r\n", e.Host) + printHeaders(e.RequestHeaders) + fmt.Print("\r\n") + if len(e.RequestBody) > 0 { + fmt.Printf("%s", e.RequestBody) + } +} + +func printRawResponse(e entryFull) { + statusText := http.StatusText(e.StatusCode) + if statusText == "" { + statusText = "Unknown" + } + fmt.Printf("HTTP/1.1 %d %s\r\n", e.StatusCode, statusText) + printHeaders(e.ResponseHeaders) + fmt.Print("\r\n") + if len(e.ResponseBody) > 0 { + fmt.Printf("%s", e.ResponseBody) + } +} + +func pad(s string, width int) string { + return fmt.Sprintf("%*s", width, s) +} + +func formatSize(n int) string { + switch { + case n == 0: + return "-" + case n < 1024: + return fmt.Sprintf("%dB", n) + case n < 1024*1024: + return fmt.Sprintf("%.1fKB", float64(n)/1024) + default: + return fmt.Sprintf("%.1fMB", float64(n)/(1024*1024)) + } +} + +func printHeaders(h http.Header) { + keys := make([]string, 0, len(h)) + for k := range h { + keys = append(keys, k) + } + sort.Strings(keys) + for _, k := range keys { + for _, v := range h[k] { + fmt.Printf("%s: %s\r\n", k, v) + } + } +} diff --git a/internal/cli/get.go b/internal/cli/get.go new file mode 100644 index 00000000..72a12c3b --- /dev/null +++ b/internal/cli/get.go @@ -0,0 +1,70 @@ +package cli + +import ( + "encoding/json" + "fmt" + "strconv" + + "github.com/spf13/cobra" + + "github.com/ghostsecurity/reaper/internal/daemon" +) + +var getCmd = &cobra.Command{ + Use: "get ", + Short: "Show full request and response for an entry", + Args: cobra.ExactArgs(1), + RunE: runGet, +} + +func init() { + rootCmd.AddCommand(getCmd) +} + +func runGet(cmd *cobra.Command, args []string) error { + return fetchAndPrint(args[0], "get") +} + +func fetchAndPrint(idStr, command string) error { + id, err := strconv.ParseInt(idStr, 10, 64) + if err != nil { + return fmt.Errorf("invalid entry ID: %s", idStr) + } + + dataDir, err := daemon.DataDir() + if err != nil { + return err + } + + params, _ := json.Marshal(daemon.GetParams{ID: id}) + client := daemon.NewClient(dataDir) + resp, err := client.Send(daemon.Request{Command: command, Params: params}) + if err != nil { + return fmt.Errorf("no running daemon found: %w", err) + } + if !resp.OK { + return fmt.Errorf("%s", resp.Error) + } + + var result struct { + Command string `json:"command"` + Entry entryFull `json:"entry"` + } + if err := json.Unmarshal(resp.Data, &result); err != nil { + return fmt.Errorf("decoding response: %w", err) + } + + e := result.Entry + switch command { + case "get": + printRawRequest(e) + fmt.Println() + printRawResponse(e) + case "req": + printRawRequest(e) + case "res": + printRawResponse(e) + } + + return nil +} diff --git a/internal/cli/logs.go b/internal/cli/logs.go new file mode 100644 index 00000000..fc04aea5 --- /dev/null +++ b/internal/cli/logs.go @@ -0,0 +1,48 @@ +package cli + +import ( + "encoding/json" + "fmt" + + "github.com/spf13/cobra" + + "github.com/ghostsecurity/reaper/internal/daemon" +) + +var logsCmd = &cobra.Command{ + Use: "logs", + Short: "Show recent proxy log entries", + RunE: runLogs, +} + +var logsN int + +func init() { + logsCmd.Flags().IntVarP(&logsN, "number", "n", 50, "Number of entries to show") + rootCmd.AddCommand(logsCmd) +} + +func runLogs(cmd *cobra.Command, args []string) error { + dataDir, err := daemon.DataDir() + if err != nil { + return err + } + + params, _ := json.Marshal(daemon.LogsParams{Limit: logsN}) + client := daemon.NewClient(dataDir) + resp, err := client.Send(daemon.Request{Command: "logs", Params: params}) + if err != nil { + return fmt.Errorf("no running daemon found: %w", err) + } + if !resp.OK { + return fmt.Errorf("%s", resp.Error) + } + + var entries []entryRow + if err := json.Unmarshal(resp.Data, &entries); err != nil { + return fmt.Errorf("decoding response: %w", err) + } + + printTable(entries) + return nil +} diff --git a/internal/cli/req.go b/internal/cli/req.go new file mode 100644 index 00000000..f786790d --- /dev/null +++ b/internal/cli/req.go @@ -0,0 +1,20 @@ +package cli + +import ( + "github.com/spf13/cobra" +) + +var reqCmd = &cobra.Command{ + Use: "req ", + Short: "Show raw HTTP request for an entry", + Args: cobra.ExactArgs(1), + RunE: runReq, +} + +func init() { + rootCmd.AddCommand(reqCmd) +} + +func runReq(cmd *cobra.Command, args []string) error { + return fetchAndPrint(args[0], "req") +} diff --git a/internal/cli/res.go b/internal/cli/res.go new file mode 100644 index 00000000..932115d6 --- /dev/null +++ b/internal/cli/res.go @@ -0,0 +1,20 @@ +package cli + +import ( + "github.com/spf13/cobra" +) + +var resCmd = &cobra.Command{ + Use: "res ", + Short: "Show raw HTTP response for an entry", + Args: cobra.ExactArgs(1), + RunE: runRes, +} + +func init() { + rootCmd.AddCommand(resCmd) +} + +func runRes(cmd *cobra.Command, args []string) error { + return fetchAndPrint(args[0], "res") +} diff --git a/internal/cli/root.go b/internal/cli/root.go new file mode 100644 index 00000000..462cbc0d --- /dev/null +++ b/internal/cli/root.go @@ -0,0 +1,33 @@ +package cli + +import ( + "fmt" + "os" + + "github.com/spf13/cobra" + + "github.com/ghostsecurity/reaper/version" +) + +var rootCmd = &cobra.Command{ + Use: "reaper", + Short: "Ghost Security MITM HTTPS proxy tool for application security testing", +} + +func init() { + rootCmd.AddCommand(versionCmd) +} + +var versionCmd = &cobra.Command{ + Use: "version", + Short: "Print the version", + Run: func(cmd *cobra.Command, args []string) { + fmt.Printf("reaper %s\n", version.Version) + }, +} + +func Execute() { + if err := rootCmd.Execute(); err != nil { + os.Exit(1) + } +} diff --git a/internal/cli/search.go b/internal/cli/search.go new file mode 100644 index 00000000..ab9bf3da --- /dev/null +++ b/internal/cli/search.go @@ -0,0 +1,69 @@ +package cli + +import ( + "encoding/json" + "fmt" + + "github.com/spf13/cobra" + + "github.com/ghostsecurity/reaper/internal/daemon" +) + +var searchCmd = &cobra.Command{ + Use: "search", + Short: "Search proxy log entries", + RunE: runSearch, +} + +var ( + searchMethod string + searchHost string + searchDomains []string + searchPath string + searchStatus int + searchLimit int +) + +func init() { + searchCmd.Flags().StringVar(&searchMethod, "method", "", "Filter by HTTP method") + searchCmd.Flags().StringVar(&searchHost, "host", "", "Filter by host (supports * wildcard)") + searchCmd.Flags().StringSliceVar(&searchDomains, "domains", nil, "Filter by domain suffix") + searchCmd.Flags().StringVar(&searchPath, "path", "", "Filter by path prefix or glob") + searchCmd.Flags().IntVar(&searchStatus, "status", 0, "Filter by status code") + searchCmd.Flags().IntVarP(&searchLimit, "limit", "n", 100, "Max results") + + rootCmd.AddCommand(searchCmd) +} + +func runSearch(cmd *cobra.Command, args []string) error { + dataDir, err := daemon.DataDir() + if err != nil { + return err + } + + params, _ := json.Marshal(daemon.SearchRequestParams{ + Method: searchMethod, + Host: searchHost, + Domains: searchDomains, + Path: searchPath, + Status: searchStatus, + Limit: searchLimit, + }) + + client := daemon.NewClient(dataDir) + resp, err := client.Send(daemon.Request{Command: "search", Params: params}) + if err != nil { + return fmt.Errorf("no running daemon found: %w", err) + } + if !resp.OK { + return fmt.Errorf("%s", resp.Error) + } + + var entries []entryRow + if err := json.Unmarshal(resp.Data, &entries); err != nil { + return fmt.Errorf("decoding response: %w", err) + } + + printTable(entries) + return nil +} diff --git a/internal/cli/shutdown.go b/internal/cli/shutdown.go new file mode 100644 index 00000000..e5284d8c --- /dev/null +++ b/internal/cli/shutdown.go @@ -0,0 +1,47 @@ +package cli + +import ( + "fmt" + + "github.com/spf13/cobra" + + "github.com/ghostsecurity/reaper/internal/daemon" +) + +var stopCmd = &cobra.Command{ + Use: "stop", + Short: "Stop the running daemon", + RunE: runShutdown, +} + +var shutdownCmd = &cobra.Command{ + Use: "shutdown", + Short: "Stop the running daemon", + Hidden: true, + RunE: runShutdown, +} + +func init() { + rootCmd.AddCommand(stopCmd) + rootCmd.AddCommand(shutdownCmd) +} + +func runShutdown(cmd *cobra.Command, args []string) error { + dataDir, err := daemon.DataDir() + if err != nil { + return err + } + + client := daemon.NewClient(dataDir) + resp, err := client.Send(daemon.Request{Command: "shutdown"}) + if err != nil { + return fmt.Errorf("no running daemon found: %w", err) + } + + if !resp.OK { + return fmt.Errorf("shutdown failed: %s", resp.Error) + } + + fmt.Println("reaper daemon stopped") + return nil +} diff --git a/internal/cli/start.go b/internal/cli/start.go new file mode 100644 index 00000000..fc38de9d --- /dev/null +++ b/internal/cli/start.go @@ -0,0 +1,97 @@ +package cli + +import ( + "fmt" + "os" + "strings" + + "github.com/spf13/cobra" + + "github.com/ghostsecurity/reaper/internal/daemon" +) + +var startCmd = &cobra.Command{ + Use: "start", + Short: "Start the proxy", + RunE: runStart, +} + +var ( + startDomains []string + startHosts []string + startPort int + startDaemon bool + startInternal bool +) + +func init() { + startCmd.Flags().StringSliceVar(&startDomains, "domains", nil, "Domain suffixes to intercept (e.g. example.com)") + startCmd.Flags().StringSliceVar(&startHosts, "hosts", nil, "Exact hostnames to intercept (e.g. api.example.com)") + startCmd.Flags().IntVar(&startPort, "port", 8443, "Proxy listen port") + startCmd.Flags().BoolVarP(&startDaemon, "daemon", "d", false, "Run as background daemon") + startCmd.Flags().BoolVar(&startInternal, "internal", false, "Internal flag for daemon child process") + _ = startCmd.Flags().MarkHidden("internal") + + rootCmd.AddCommand(startCmd) +} + +func runStart(cmd *cobra.Command, args []string) error { + if len(startDomains) == 0 && len(startHosts) == 0 { + return fmt.Errorf("at least one --domains or --hosts flag is required") + } + + cfg := daemon.Config{ + Domains: startDomains, + Hosts: startHosts, + Port: startPort, + Daemon: startInternal, + } + + if startDaemon && !startInternal { + return daemonize(cfg) + } + + return daemon.Run(cfg) +} + +func daemonize(cfg daemon.Config) error { + exe, err := os.Executable() + if err != nil { + return fmt.Errorf("resolving executable: %w", err) + } + + daemonArgs := []string{"start", "--internal", "--port", fmt.Sprintf("%d", cfg.Port)} + if len(cfg.Domains) > 0 { + daemonArgs = append(daemonArgs, "--domains", strings.Join(cfg.Domains, ",")) + } + if len(cfg.Hosts) > 0 { + daemonArgs = append(daemonArgs, "--hosts", strings.Join(cfg.Hosts, ",")) + } + + proc, err := os.StartProcess(exe, append([]string{exe}, daemonArgs...), &os.ProcAttr{ + Dir: "/", + Files: []*os.File{os.Stdin, os.Stdout, os.Stderr}, + Sys: daemonSysProcAttr(), + }) + if err != nil { + return fmt.Errorf("starting daemon: %w", err) + } + + // Detach from child — let it run independently + if err := proc.Release(); err != nil { + return fmt.Errorf("releasing daemon process: %w", err) + } + + // Verify daemon started by checking socket + dataDir, err := daemon.DataDir() + if err != nil { + return err + } + + if err := daemon.WaitForSocket(dataDir); err != nil { + return fmt.Errorf("daemon failed to start: %w", err) + } + + fmt.Println("reaper daemon started") + return nil +} diff --git a/internal/cli/start_unix.go b/internal/cli/start_unix.go new file mode 100644 index 00000000..0dd249db --- /dev/null +++ b/internal/cli/start_unix.go @@ -0,0 +1,9 @@ +//go:build !windows + +package cli + +import "syscall" + +func daemonSysProcAttr() *syscall.SysProcAttr { + return &syscall.SysProcAttr{Setsid: true} +} diff --git a/internal/cli/start_windows.go b/internal/cli/start_windows.go new file mode 100644 index 00000000..01df33ec --- /dev/null +++ b/internal/cli/start_windows.go @@ -0,0 +1,9 @@ +//go:build windows + +package cli + +import "syscall" + +func daemonSysProcAttr() *syscall.SysProcAttr { + return &syscall.SysProcAttr{} +} diff --git a/internal/cli/tail.go b/internal/cli/tail.go new file mode 100644 index 00000000..5603d140 --- /dev/null +++ b/internal/cli/tail.go @@ -0,0 +1,87 @@ +package cli + +import ( + "encoding/json" + "fmt" + "os/signal" + "syscall" + "time" + + "github.com/spf13/cobra" + + "github.com/ghostsecurity/reaper/internal/daemon" +) + +var tailCmd = &cobra.Command{ + Use: "tail", + Short: "Stream new proxy log entries in real-time", + SilenceUsage: true, + RunE: runTail, +} + +func init() { + rootCmd.AddCommand(tailCmd) +} + +func runTail(cmd *cobra.Command, args []string) error { + dataDir, err := daemon.DataDir() + if err != nil { + return err + } + + client := daemon.NewClient(dataDir) + + // Establish high-water mark from existing entries + params, _ := json.Marshal(daemon.LogsParams{Limit: 1}) + resp, err := client.Send(daemon.Request{Command: "logs", Params: params}) + if err != nil { + return fmt.Errorf("no running daemon found: %w", err) + } + if !resp.OK { + return fmt.Errorf("%s", resp.Error) + } + + var lastID int64 + var existing []entryRow + if err := json.Unmarshal(resp.Data, &existing); err == nil && len(existing) > 0 { + lastID = existing[0].ID // logs returns DESC order, so first is highest + } + + ctx, stop := signal.NotifyContext(cmd.Context(), syscall.SIGINT, syscall.SIGTERM) + defer stop() + + fmt.Println("tailing proxy logs... (ctrl+c to stop)") + + ticker := time.NewTicker(500 * time.Millisecond) + defer ticker.Stop() + + for { + select { + case <-ctx.Done(): + return nil + case <-ticker.C: + tailParams, _ := json.Marshal(daemon.TailParams{AfterID: lastID}) + resp, err := client.Send(daemon.Request{Command: "tail", Params: tailParams}) + if err != nil { + return fmt.Errorf("daemon connection lost") + } + if !resp.OK { + return fmt.Errorf("%s", resp.Error) + } + + var entries []entryRow + if err := json.Unmarshal(resp.Data, &entries); err != nil { + continue + } + + for _, e := range entries { + ts := e.Timestamp.Local().Format("15:04:05") + url := fmt.Sprintf("%s://%s%s", e.Scheme, e.Host, e.Path) + fmt.Printf("%s %s %s %d %dms\n", ts, e.Method, url, e.StatusCode, e.DurationMs) + if e.ID > lastID { + lastID = e.ID + } + } + } + } +} diff --git a/internal/daemon/client.go b/internal/daemon/client.go new file mode 100644 index 00000000..1a59c583 --- /dev/null +++ b/internal/daemon/client.go @@ -0,0 +1,73 @@ +package daemon + +import ( + "bufio" + "encoding/json" + "fmt" + "net" + "path/filepath" + "time" +) + +type Client struct { + sockPath string +} + +func NewClient(dataDir string) *Client { + return &Client{ + sockPath: filepath.Join(dataDir, "reaper.sock"), + } +} + +func (c *Client) Send(req Request) (*Response, error) { + conn, err := net.DialTimeout("unix", c.sockPath, 5*time.Second) + if err != nil { + return nil, fmt.Errorf("connecting to daemon: %w", err) + } + defer conn.Close() + + _ = conn.SetDeadline(time.Now().Add(30 * time.Second)) + + data, err := json.Marshal(req) + if err != nil { + return nil, fmt.Errorf("marshaling request: %w", err) + } + data = append(data, '\n') + + if _, err := conn.Write(data); err != nil { + return nil, fmt.Errorf("writing request: %w", err) + } + + scanner := bufio.NewScanner(conn) + scanner.Buffer(make([]byte, 0, 10*1024*1024), 10*1024*1024) + if !scanner.Scan() { + if err := scanner.Err(); err != nil { + return nil, fmt.Errorf("reading response: %w", err) + } + return nil, fmt.Errorf("no response from daemon") + } + + var resp Response + if err := json.Unmarshal(scanner.Bytes(), &resp); err != nil { + return nil, fmt.Errorf("decoding response: %w", err) + } + + return &resp, nil +} + +func WaitForSocket(dataDir string) error { + sockPath := filepath.Join(dataDir, "reaper.sock") + for i := 0; i < 30; i++ { + conn, err := net.DialTimeout("unix", sockPath, time.Second) + if err == nil { + // Send ping + data, _ := json.Marshal(Request{Command: "ping"}) + data = append(data, '\n') + _, _ = conn.Write(data) + conn.Close() + return nil + } + time.Sleep(100 * time.Millisecond) + } + return fmt.Errorf("timeout waiting for daemon socket") +} diff --git a/internal/daemon/daemon.go b/internal/daemon/daemon.go new file mode 100644 index 00000000..7ab60fd5 --- /dev/null +++ b/internal/daemon/daemon.go @@ -0,0 +1,143 @@ +package daemon + +import ( + "fmt" + "net/http" + "os" + "os/signal" + "path/filepath" + "strconv" + "syscall" + "time" + + "github.com/ghostsecurity/reaper/internal/proxy" + "github.com/ghostsecurity/reaper/internal/storage" + "github.com/ghostsecurity/reaper/version" +) + +type Config struct { + Domains []string + Hosts []string + Port int + Daemon bool +} + +func DataDir() (string, error) { + home, err := os.UserHomeDir() + if err != nil { + return "", fmt.Errorf("getting home directory: %w", err) + } + + dir := filepath.Join(home, ".ghost", "reaper") + if err := os.MkdirAll(dir, 0700); err != nil { + return "", fmt.Errorf("creating data directory: %w", err) + } + + return dir, nil +} + +func Run(cfg Config) error { + dataDir, err := DataDir() + if err != nil { + return err + } + + // Check for existing daemon + sockPath := filepath.Join(dataDir, "reaper.sock") + if _, err := os.Stat(sockPath); err == nil { + return fmt.Errorf("daemon already running (socket exists at %s). Use 'reaper shutdown' first", sockPath) + } + + // Generate in-memory CA + ca, err := proxy.GenerateCA() + if err != nil { + return fmt.Errorf("generating CA: %w", err) + } + + // Init storage + dbPath := filepath.Join(dataDir, "reaper.db") + store, err := storage.NewSQLiteStore(dbPath) + if err != nil { + return fmt.Errorf("opening storage: %w", err) + } + defer store.Close() + + // Create proxy + scope := proxy.NewScope(cfg.Domains, cfg.Hosts) + p := &proxy.Proxy{ + Scope: scope, + Store: store, + CA: ca, + } + if !cfg.Daemon { + p.OnEvent = printEvent + } + + // Start IPC server + shutdown := make(chan struct{}) + ipcServer, err := NewIPCServer(dataDir, store, shutdown) + if err != nil { + return fmt.Errorf("starting IPC server: %w", err) + } + defer ipcServer.Close() + go ipcServer.Serve() + + // Write PID file + pidPath := filepath.Join(dataDir, "reaper.pid") + _ = os.WriteFile(pidPath, []byte(strconv.Itoa(os.Getpid())), 0600) + defer os.Remove(pidPath) + defer os.Remove(sockPath) + + // Start HTTP proxy server + addr := fmt.Sprintf(":%d", cfg.Port) + server := &http.Server{ //nolint:gosec + Addr: addr, + Handler: p, + } + + // Print banner + printBanner(cfg, dataDir) + + // Signal handling + sigCh := make(chan os.Signal, 1) + signal.Notify(sigCh, syscall.SIGINT, syscall.SIGTERM) + + go func() { + select { + case <-sigCh: + case <-shutdown: + } + fmt.Println("\nshutting down...") + server.Close() + }() + + if err := server.ListenAndServe(); err != http.ErrServerClosed { + return fmt.Errorf("proxy server: %w", err) + } + + return nil +} + +func printEvent(e proxy.Event) { + ts := time.Now().Format("15:04:05") + tag := "=" + if e.Intercepted { + tag = "⇄" + } + + url := fmt.Sprintf("%s://%s%s", e.Scheme, e.Host, e.Path) + fmt.Printf("%s %s %s %s %d %dms\n", ts, tag, e.Method, url, e.StatusCode, e.DurationMs) +} + +func printBanner(cfg Config, dataDir string) { + fmt.Printf("reaper %s\n", version.Version) + fmt.Printf("proxy listening on :%d\n", cfg.Port) + fmt.Printf("data directory: %s\n", dataDir) + if len(cfg.Domains) > 0 { + fmt.Printf("domains: %v\n", cfg.Domains) + } + if len(cfg.Hosts) > 0 { + fmt.Printf("hosts: %v\n", cfg.Hosts) + } + fmt.Printf("started at %s\n\n", time.Now().Format(time.DateTime)) +} diff --git a/internal/daemon/protocol.go b/internal/daemon/protocol.go new file mode 100644 index 00000000..ea14750c --- /dev/null +++ b/internal/daemon/protocol.go @@ -0,0 +1,38 @@ +package daemon + +import "encoding/json" + +type Request struct { + Command string `json:"command"` // "logs", "search", "get", "req", "res", "tail", "clear", "shutdown" + Params json.RawMessage `json:"params"` +} + +type Response struct { + OK bool `json:"ok"` + Data json.RawMessage `json:"data,omitempty"` + Error string `json:"error,omitempty"` +} + +type LogsParams struct { + Limit int `json:"limit"` + Offset int `json:"offset"` +} + +type SearchRequestParams struct { + Method string `json:"method,omitempty"` + Host string `json:"host,omitempty"` + Domains []string `json:"domains,omitempty"` + Path string `json:"path,omitempty"` + Status int `json:"status,omitempty"` + Limit int `json:"limit,omitempty"` + Offset int `json:"offset,omitempty"` +} + +type TailParams struct { + AfterID int64 `json:"after_id"` + Limit int `json:"limit"` +} + +type GetParams struct { + ID int64 `json:"id"` +} diff --git a/internal/daemon/server.go b/internal/daemon/server.go new file mode 100644 index 00000000..7b0e160f --- /dev/null +++ b/internal/daemon/server.go @@ -0,0 +1,197 @@ +package daemon + +import ( + "bufio" + "encoding/json" + "fmt" + "net" + "os" + "path/filepath" + + "github.com/ghostsecurity/reaper/internal/storage" +) + +type IPCServer struct { + listener net.Listener + store storage.Store + shutdown chan struct{} +} + +func NewIPCServer(dataDir string, store storage.Store, shutdown chan struct{}) (*IPCServer, error) { + sockPath := filepath.Join(dataDir, "reaper.sock") + + // Remove stale socket + os.Remove(sockPath) + + listener, err := net.Listen("unix", sockPath) + if err != nil { + return nil, fmt.Errorf("listening on socket: %w", err) + } + + return &IPCServer{ + listener: listener, + store: store, + shutdown: shutdown, + }, nil +} + +func (s *IPCServer) Serve() { + for { + conn, err := s.listener.Accept() + if err != nil { + select { + case <-s.shutdown: + return + default: + continue + } + } + go s.handleConn(conn) + } +} + +func (s *IPCServer) Close() error { + return s.listener.Close() +} + +func (s *IPCServer) handleConn(conn net.Conn) { + defer conn.Close() + + scanner := bufio.NewScanner(conn) + scanner.Buffer(make([]byte, 0, 10*1024*1024), 10*1024*1024) + if !scanner.Scan() { + return + } + + var req Request + if err := json.Unmarshal(scanner.Bytes(), &req); err != nil { + writeResponse(conn, Response{Error: "invalid request"}) + return + } + + resp := s.route(req) + writeResponse(conn, resp) +} + +func (s *IPCServer) route(req Request) Response { + switch req.Command { + case "logs": + return s.handleLogs(req.Params) + case "search": + return s.handleSearch(req.Params) + case "get", "req", "res": + return s.handleGet(req.Command, req.Params) + case "tail": + return s.handleTail(req.Params) + case "clear": + return s.handleClear() + case "shutdown": + return s.handleShutdown() + case "ping": + return Response{OK: true} + default: + return Response{Error: fmt.Sprintf("unknown command: %s", req.Command)} + } +} + +func (s *IPCServer) handleLogs(params json.RawMessage) Response { + var p LogsParams + if len(params) > 0 { + if err := json.Unmarshal(params, &p); err != nil { + return Response{Error: "invalid params"} + } + } + if p.Limit <= 0 { + p.Limit = 50 + } + + entries, err := s.store.List(p.Limit, p.Offset) + if err != nil { + return Response{Error: err.Error()} + } + + data, _ := json.Marshal(entries) + return Response{OK: true, Data: data} +} + +func (s *IPCServer) handleSearch(params json.RawMessage) Response { + var p SearchRequestParams + if len(params) > 0 { + if err := json.Unmarshal(params, &p); err != nil { + return Response{Error: "invalid params"} + } + } + + entries, err := s.store.Search(storage.SearchParams{ + Method: p.Method, + Host: p.Host, + Domains: p.Domains, + Path: p.Path, + Status: p.Status, + Limit: p.Limit, + Offset: p.Offset, + }) + if err != nil { + return Response{Error: err.Error()} + } + + data, _ := json.Marshal(entries) + return Response{OK: true, Data: data} +} + +func (s *IPCServer) handleGet(command string, params json.RawMessage) Response { + var p GetParams + if err := json.Unmarshal(params, &p); err != nil { + return Response{Error: "invalid params"} + } + + entry, err := s.store.Get(p.ID) + if err != nil { + return Response{Error: err.Error()} + } + + type getResponse struct { + Command string `json:"command"` + Entry *storage.Entry `json:"entry"` + } + + data, _ := json.Marshal(getResponse{Command: command, Entry: entry}) + return Response{OK: true, Data: data} +} + +func (s *IPCServer) handleTail(params json.RawMessage) Response { + var p TailParams + if len(params) > 0 { + if err := json.Unmarshal(params, &p); err != nil { + return Response{Error: "invalid params"} + } + } + + entries, err := s.store.ListAfter(p.AfterID, p.Limit) + if err != nil { + return Response{Error: err.Error()} + } + + data, _ := json.Marshal(entries) + return Response{OK: true, Data: data} +} + +func (s *IPCServer) handleClear() Response { + if err := s.store.Clear(); err != nil { + return Response{Error: err.Error()} + } + return Response{OK: true} +} + +func (s *IPCServer) handleShutdown() Response { + go func() { + close(s.shutdown) + }() + return Response{OK: true} +} + +func writeResponse(conn net.Conn, resp Response) { + data, _ := json.Marshal(resp) + data = append(data, '\n') + _, _ = conn.Write(data) +} diff --git a/internal/database/config.go b/internal/database/config.go deleted file mode 100644 index f6681251..00000000 --- a/internal/database/config.go +++ /dev/null @@ -1,88 +0,0 @@ -package database - -import ( - "os" - "strings" - - "gorm.io/driver/sqlite" - "gorm.io/gorm" - - "github.com/google/uuid" - - "github.com/ghostsecurity/reaper/internal/database/models" - "github.com/ghostsecurity/reaper/internal/service" - "github.com/ghostsecurity/reaper/internal/types" -) - -const ( - file = "reaper.db" - // file - url = file - // in memory - // url = "file::memory:?cache=shared" -) - -func Connect() *gorm.DB { - // clean up file if we're using in-memory db - if strings.Contains(url, "memory") { - _ = os.Remove(file) - } - db, err := gorm.Open(sqlite.Open(url), &gorm.Config{ - // DEBUG - // Logger: logger.Default.LogMode(logger.Info), // log all queries to console - }) - if err != nil { - panic("failed to connect database") - } - - return db -} - -func Migrate() { - db := Connect() - - _ = db.AutoMigrate( - &models.User{}, - &models.Setting{}, - &models.Project{}, - &models.Domain{}, - &models.Host{}, - &models.Endpoint{}, - &models.Request{}, - &models.Response{}, - &models.FuzzAttack{}, - &models.FuzzResult{}, - &models.Report{}, - &models.AgentSession{}, - &models.AgentSessionMessage{}, - ) - - project := models.Project{ - Name: "Default", - } - db.Create(&project) - - // create an agent user if one doesn't exist - res := db.Model(&models.User{}). - Where(&models.User{Role: types.UserRoleAgent}). - First(&models.User{}) - if res.RowsAffected == 0 { - _, _ = service.CreateAgentUser(db) - } - - adminToken, _ := service.GetSettingByKey("admin_token", db) - guestToken, _ := service.GetSettingByKey("guest_token", db) - - if adminToken == nil { - db.Create(&models.Setting{ - Key: "admin_token", - Value: uuid.New().String(), - }) - } - if guestToken == nil { - db.Create(&models.Setting{ - Key: "guest_token", - Value: uuid.New().String(), - }) - } -} diff --git a/internal/database/error.go b/internal/database/error.go deleted file mode 100644 index 53c9414c..00000000 --- a/internal/database/error.go +++ /dev/null @@ -1,5 +0,0 @@ -package database - -type DatabaseError string - -const ErrUniqueConstraintFailed = "UNIQUE constraint failed" diff --git a/internal/database/models/model.go b/internal/database/models/model.go deleted file mode 100644 index c5a2b852..00000000 --- a/internal/database/models/model.go +++ /dev/null @@ -1,163 +0,0 @@ -package models - -import ( - "time" - - "github.com/ghostsecurity/reaper/internal/types" -) - -type User struct { - ID uint `json:"id" gorm:"primaryKey"` - Name string `json:"name"` - Role types.UserRole `json:"role" gorm:"default:viewer"` - Enabled bool `json:"enabled" gorm:"default:true"` - Token string `json:"token"` - CreatedAt time.Time `json:"created_at"` - UpdatedAt time.Time `json:"updated_at"` -} - -type Setting struct { - ID uint `json:"id" gorm:"primaryKey"` - Key string `json:"key"` - Value string `json:"value"` - CreatedAt time.Time `json:"created_at"` - UpdatedAt time.Time `json:"updated_at"` -} - -type Project struct { - ID uint `json:"id" gorm:"primaryKey"` - Name string `json:"name"` - CreatedAt time.Time `json:"created_at"` - UpdatedAt time.Time `json:"updated_at"` -} - -type Domain struct { - ID uint `json:"id" gorm:"primaryKey"` - ProjectID uint `json:"project_id"` - Project Project `json:"project"` - Name string `json:"name" gorm:"uniqueIndex:idx_project_domain"` - Status types.DomainStatus `json:"status"` - HostCount int `json:"host_count"` - LastScannedAt *time.Time `json:"last_scanned_at"` - CreatedAt time.Time `json:"created_at"` - UpdatedAt time.Time `json:"updated_at"` -} - -type Host struct { - ID uint `json:"id" gorm:"primaryKey"` - DomainID uint `json:"domain_id"` - ProjectID uint `json:"project_id"` - Name string `json:"name"` - Status string `json:"status"` - StatusCode int `json:"status_code"` // httpx - Source string `json:"source"` // subfinder - Scheme string `json:"scheme"` // httpx - ContentType string `json:"content_type"` // httpx - CDNName string `json:"cdn_name"` // httpx - CDNType string `json:"cdn_type"` // httpx - Webserver string `json:"webserver"` // httpx - Tech string `json:"tech"` // httpx - CreatedAt time.Time `json:"created_at"` - UpdatedAt time.Time `json:"updated_at"` -} - -type Endpoint struct { - ID uint `json:"id" gorm:"primaryKey"` - // TOOD: use HostID and reference Host table - // HostID uint `json:"host_id"` - Hostname string `json:"hostname"` - Method string `json:"method"` - Path string `json:"path"` - Params string `json:"params"` - CreatedAt time.Time `json:"created_at"` - UpdatedAt time.Time `json:"updated_at"` -} - -type Request struct { - ID uint `json:"id" gorm:"primaryKey"` - Source types.RequestSource `json:"source"` - Method string `json:"method"` // http.Request.Method - Host string `json:"host"` // http.Request.Host - URL string `json:"url"` // http.Request.URL - Headers string `json:"headers"` // http.Request.Header - Proto string `json:"proto"` // http.Request.Proto - ProtoMajor int `json:"proto_major"` // http.Request.ProtoMajor - ProtoMinor int `json:"proto_minor"` // http.Request.ProtoMinor - ContentType string `json:"content_type"` // http.Request.Header.Get("Content-Type") - ContentLength int64 `json:"content_length"` // http.Request.ContentLength - HeaderKeys string `json:"header_keys"` - ParamKeys string `json:"param_keys"` - BodyKeys string `json:"body_keys"` - Body string `json:"body"` // http.Request.Body - Response Response `json:"response"` - CreatedAt time.Time `json:"created_at"` -} - -type Response struct { - ID uint `json:"id" gorm:"primaryKey"` - RequestID uint `json:"request_id" gorm:"foreignKey:ID"` - Status string `json:"status"` // http.Response.Status - StatusCode int `json:"status_code"` // http.Response.StatusCode - ContentType string `json:"content_type"` // http.Response.Header.Get("Content-Type") - ContentLength int64 `json:"content_length"` // http.Response.ContentLength - Headers string `json:"headers"` // http.Response.Header - Body string `json:"body"` // http.Response.Body - CreatedAt time.Time `json:"created_at"` - UpdatedAt time.Time `json:"updated_at"` -} - -// TODO: clean up this mess -type FuzzAttack struct { - ID uint `json:"id" gorm:"primaryKey"` - Type string `json:"type"` // header, body, param - Headers string `json:"headers"` - Keys string `json:"keys"` - Params string `json:"params"` - Status string `json:"status"` - CreatedAt time.Time `json:"created_at"` - UpdatedAt time.Time `json:"updated_at"` -} - -type FuzzResult struct { - ID uint `json:"id" gorm:"primaryKey"` - FuzzAttackID uint `json:"fuzz_attack_id" gorm:"foreignKey:ID"` - Hostname string `json:"hostname"` - IpAddress string `json:"ip_address"` - Port string `json:"port"` - Scheme string `json:"scheme"` - URL string `json:"url"` - Endpoint string `json:"endpoint"` - Request string `json:"request"` - Response string `json:"response"` - StatusCode int `json:"status_code"` - CreatedAt time.Time `json:"created_at"` - UpdatedAt time.Time `json:"updated_at"` -} - -type Report struct { - ID uint `json:"id" gorm:"primaryKey"` - Domain string `json:"domain"` - Title string `json:"title"` - Markdown string `json:"markdown"` - Status types.ReportStatus `json:"status"` - CreatedAt time.Time `json:"created_at"` - UpdatedAt time.Time `json:"updated_at"` -} - -type AgentSession struct { - ID uint `json:"id" gorm:"primaryKey"` - Description string `json:"description"` - Messages []AgentSessionMessage `json:"messages"` - CreatedAt time.Time `json:"created_at"` - UpdatedAt time.Time `json:"updated_at"` -} - -type AgentSessionMessage struct { - ID uint `json:"id" gorm:"primaryKey"` - AuthorID uint `json:"author_id" gorm:"foreignKey:ID,tablename:users"` - AuthorRole types.UserRole `json:"author_role"` - AgentSessionID uint `json:"agent_session_id" gorm:"foreignKey:ID"` - Content string `json:"content"` - CreatedAt time.Time `json:"created_at"` - UpdatedAt time.Time `json:"updated_at"` -} diff --git a/internal/database/models/sync.go b/internal/database/models/sync.go deleted file mode 100644 index 8393ad81..00000000 --- a/internal/database/models/sync.go +++ /dev/null @@ -1,19 +0,0 @@ -package models - -import ( - "github.com/ghostsecurity/reaper/internal/handlers/websocket" - "github.com/ghostsecurity/reaper/internal/types" -) - -// Sync methods are used to sync data between the database and websocket clients - -func (d *Domain) BroadcastSync(ws *websocket.Pool) { - msg := &types.DomainSyncMessage{ - Type: types.MessageTypeScanSyncDomain, - ID: d.ID, - Status: d.Status, - HostCount: d.HostCount, - LastScannedAt: d.LastScannedAt, - } - ws.Broadcast <- msg -} diff --git a/internal/handlers/agent.go b/internal/handlers/agent.go deleted file mode 100644 index 127a3545..00000000 --- a/internal/handlers/agent.go +++ /dev/null @@ -1,164 +0,0 @@ -package handlers - -import ( - "fmt" - "strconv" - - "github.com/gofiber/fiber/v2" - - "github.com/ghostsecurity/reaper/internal/database/models" - "github.com/ghostsecurity/reaper/internal/service" - "github.com/ghostsecurity/reaper/internal/tools/agent" - "github.com/ghostsecurity/reaper/internal/types" -) - -func (h *Handler) GetSessions(c *fiber.Ctx) error { - sessions := []models.AgentSession{} - h.db.Preload("Messages").Order("created_at desc").Find(&sessions) - - return c.JSON(sessions) -} - -func (h *Handler) GetSession(c *fiber.Ctx) error { - session := models.AgentSession{} - id := c.Params("id") - if id == "" { - return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "session id is required"}) - } - - if _, err := strconv.Atoi(id); err != nil { - return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "invalid session id"}) - } - res := h.db.First(&session, id) - if res.Error != nil { - return c.Status(fiber.StatusNotFound).JSON(fiber.Map{"error": res.Error.Error()}) - } - - return c.JSON(session) -} - -func (h *Handler) CreateSession(c *fiber.Ctx) error { - sessionInput := struct { - Description string `json:"description"` - }{} - - if err := c.BodyParser(&sessionInput); err != nil { - return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": err.Error()}) - } - - session := models.AgentSession{ - Description: sessionInput.Description, - } - resp := h.db.Create(&session) - if resp.Error != nil { - return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": resp.Error.Error()}) - } - - return c.JSON(session) -} - -func (h *Handler) DeleteSession(c *fiber.Ctx) error { - session := models.AgentSession{} - id := c.Params("id") - if id == "" { - return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "session id is required"}) - } - - if _, err := strconv.Atoi(id); err != nil { - return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "invalid session id"}) - } - res := h.db.Delete(&session, id) - if res.RowsAffected == 0 { - return c.Status(fiber.StatusNotFound).JSON(fiber.Map{"error": "session not found"}) - } - - return c.SendStatus(fiber.StatusNoContent) -} - -func (h *Handler) GetSessionMessages(c *fiber.Ctx) error { - session := models.AgentSession{} - - s := c.Params("id") - if s == "" { - return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "session id is required"}) - } - - // TODO: preload author - res := h.db.Preload("Messages").First(&session, s) - if res.Error != nil { - return c.Status(fiber.StatusNotFound).JSON(fiber.Map{"error": res.Error.Error()}) - } - - return c.JSON(session.Messages) -} - -func (h *Handler) CreateSessionMessage(c *fiber.Ctx) error { - author := c.Locals("user").(*models.User) - - messageInput := struct { - Message string `json:"content"` - }{} - - s, err := strconv.Atoi(c.Params("id")) - if err != nil { - return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "invalid session id"}) - } - if s == 0 { - return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "session id is required"}) - } - - if err := c.BodyParser(&messageInput); err != nil { - return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": err.Error()}) - } - - if messageInput.Message == "" { - return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "message is required"}) - } - - message := models.AgentSessionMessage{ - AuthorID: author.ID, - AuthorRole: author.Role, - AgentSessionID: uint(s), - Content: messageInput.Message, - } - - resp := h.db.Create(&message) - if resp.Error != nil { - return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": resp.Error.Error()}) - } - - msg := &types.AgentSessionMessage{ - Type: types.MessageTypeAgentSessionMessage, - AuthorID: message.AuthorID, - AuthorRole: author.Role, - SessionID: uint(s), - Content: message.Content, - } - - h.pool.Broadcast <- msg - - // don't start a workflow if the message is from the agent - if author.Role == types.UserRoleAgent { - return c.JSON(message) - } - - // start the agent workflow - agentToken, _ := service.GetAgentToken(h.db) - prompt := message.Content - - fmt.Printf("[***] running agent session %d, agent token: %s with prompt %s\n", s, agentToken, prompt) - - agentMgr := &agent.AgentManager{ - Ctx: c, - Pool: h.pool, - DB: h.db, - SessionID: uint(s), - Author: author.ID, - AuthorRole: types.UserRoleAgent, - Prompt: prompt, - } - - agentMgr.StartAgent() - - return c.JSON(message) -} diff --git a/internal/handlers/domain.go b/internal/handlers/domain.go deleted file mode 100644 index 1040c0ff..00000000 --- a/internal/handlers/domain.go +++ /dev/null @@ -1,153 +0,0 @@ -package handlers - -import ( - "context" - "fmt" - "log/slog" - "net" - "strconv" - "strings" - "time" - - "github.com/gofiber/fiber/v2" - - "github.com/ghostsecurity/reaper/internal/database" - "github.com/ghostsecurity/reaper/internal/database/models" - "github.com/ghostsecurity/reaper/internal/tools/scan" - "github.com/ghostsecurity/reaper/internal/types" -) - -func (h *Handler) GetDomains(c *fiber.Ctx) error { - domains := []models.Domain{} - h.db.Order("created_at desc").Find(&domains) - - return c.JSON(domains) -} - -func (h *Handler) GetDomain(c *fiber.Ctx) error { - domain := models.Domain{} - id := c.Params("id") - if id == "" { - return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "domain id is required"}) - } - - if _, err := strconv.Atoi(id); err != nil { - return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "invalid domain id"}) - } - - res := h.db.First(&domain, id) - if res.Error != nil { - return c.Status(fiber.StatusNotFound).JSON(fiber.Map{"error": res.Error.Error()}) - } - - return c.JSON(domain) -} - -func (h *Handler) CreateDomain(c *fiber.Ctx) error { - domainInput := struct { - Name string `json:"name"` - AutoScan bool `json:"auto_scan"` - }{} - - if err := c.BodyParser(&domainInput); err != nil { - return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": err.Error()}) - } - - err := validDomain(domainInput.Name) - if err != nil { - return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": err.Error()}) - } - - domain := models.Domain{ - Name: domainInput.Name, - Status: types.DomainStatusPending, - } - resp := h.db.Create(&domain) - if resp.Error != nil { - if strings.HasPrefix(resp.Error.Error(), database.ErrUniqueConstraintFailed) { - return c.Status(fiber.StatusConflict).JSON(fiber.Map{"error": "domain already exists in this project"}) - } - return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": resp.Error.Error()}) - } - - if domainInput.AutoScan { - go scan.FindSubdomains(domain, h.db, h.pool) - } - - msg := &types.DomainMessage{ - Type: types.MessageTypeScanDomain, - Domain: domain.Name, - Timestamp: domain.CreatedAt, - } - h.pool.Broadcast <- msg - - return c.JSON(domain) -} - -func (h *Handler) UpdateDomain(c *fiber.Ctx) error { - domain := models.Domain{} - if err := c.BodyParser(&domain); err != nil { - return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": err.Error()}) - } - h.db.Model(&domain).Updates(domain) - - return c.JSON(domain) -} - -func (h *Handler) DeleteDomain(c *fiber.Ctx) error { - domain := models.Domain{} - id := c.Params("id") - if id == "" { - return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "domain id is required"}) - } - - if _, err := strconv.Atoi(id); err != nil { - return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "invalid domain id"}) - } - - res := h.db.Delete(&domain, id) - if res.RowsAffected == 0 { - return c.Status(fiber.StatusNotFound).JSON(fiber.Map{"error": "domain not found"}) - } - - return c.SendStatus(fiber.StatusNoContent) -} - -func (h *Handler) GetDomainHosts(c *fiber.Ctx) error { - id, err := strconv.Atoi(c.Params("id")) - if err != nil { - return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": err.Error()}) - } - - domain := models.Host{ - DomainID: uint(id), - } - hosts := []models.Host{} - // TODO: pagination - h.db.Where(domain).Limit(500).Find(&hosts) - - return c.JSON(hosts) -} - -func validDomain(domain string) error { - ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) - defer cancel() - - var r net.Resolver - ns, err := r.LookupNS(ctx, domain) - if err != nil { - if err == context.DeadlineExceeded { - return fmt.Errorf("domain lookup timeout") - } - return fmt.Errorf("invalid domain, no nameserver found") - } - - servers := make([]string, len(ns)) - for i, server := range ns { - servers[i] = server.Host - } - - slog.Info("scan.create", "domain", domain, "nameservers", strings.Join(servers, ",")) - - return nil -} diff --git a/internal/handlers/endpoint.go b/internal/handlers/endpoint.go deleted file mode 100644 index 929b9b21..00000000 --- a/internal/handlers/endpoint.go +++ /dev/null @@ -1,146 +0,0 @@ -package handlers - -import ( - "log/slog" - "strconv" - "strings" - - "github.com/gofiber/fiber/v2" - - "github.com/ghostsecurity/reaper/internal/database/models" - "github.com/ghostsecurity/reaper/internal/service" - "github.com/ghostsecurity/reaper/internal/tools/fuzz" - "github.com/ghostsecurity/reaper/internal/types" -) - -func (h *Handler) GetEndpoints(c *fiber.Ctx) error { - endpoints := []models.Endpoint{} - h.db.Find(&endpoints) - - return c.JSON(endpoints) -} - -func (h *Handler) GetEndpoint(c *fiber.Ctx) error { - id, err := strconv.Atoi(c.Params("id")) - if err != nil { - return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": err.Error()}) - } - - endpoint := models.Endpoint{} - h.db.First(&endpoint, id) - - return c.JSON(endpoint) -} - -func (h *Handler) CreateEndpoint(c *fiber.Ctx) error { - var endpointInput service.EndpointInput - - if err := c.BodyParser(&endpointInput); err != nil { - return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": err.Error()}) - } - - if endpointInput.Hostname == "" || endpointInput.Path == "" || endpointInput.Method == "" { - return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "hostname, path, and method are required"}) - } - - endpoint, err := service.CreateOrUpdateEndpoint(h.db, endpointInput) - if err != nil { - return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": err.Error()}) - } - - return c.JSON(endpoint) -} - -func (h *Handler) CreateAttack(c *fiber.Ctx) error { - var atk struct { - EndpointID uint `json:"endpoint_id"` - Params []string `json:"params"` - } - - if err := c.BodyParser(&atk); err != nil { - return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": err.Error()}) - } - - if atk.EndpointID < 1 || len(atk.Params) == 0 { - return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "endpoint_id and params are required"}) - } - - // get hostname from endpoint - endpoint := models.Endpoint{} - err := h.db.First(&endpoint, atk.EndpointID).Error - if err != nil { - return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "endpoint not found"}) - } - - attack := &models.FuzzAttack{ - Type: "param", - Params: strings.Join(atk.Params, ","), - } - h.db.Create(attack) - - go func() { - err := fuzz.CreateAttack(attack.ID, endpoint.Hostname, atk.Params, h.pool, h.db, 100, 1000, 5) - if err != nil { - slog.Error("[create attack]", "msg", "error creating attack", "error", err) - } - }() - - return c.JSON(attack) -} - -func (h *Handler) GetAttacks(c *fiber.Ctx) error { - attacks := []models.FuzzAttack{} - h.db.Find(&attacks) - - return c.JSON(attacks) -} - -func (h *Handler) GetAttack(c *fiber.Ctx) error { - id, err := strconv.Atoi(c.Params("id")) - if err != nil { - return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": err.Error()}) - } - - attack := models.FuzzAttack{} - h.db.First(&attack, id) - - return c.JSON(attack) -} - -func (h *Handler) GetAttackResults(c *fiber.Ctx) error { - id, err := strconv.Atoi(c.Params("id")) - if err != nil { - return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": err.Error()}) - } - - limit, err := strconv.Atoi(c.Query("limit", "50")) - if err != nil { - limit = 50 - } - - results := []models.FuzzResult{} - h.db.Where("fuzz_attack_id = ?", id).Limit(limit).Find(&results) - - return c.JSON(results) -} - -func (h *Handler) DeleteAttackResults(c *fiber.Ctx) error { - // TODO: delete by endpoint id - // id, err := strconv.Atoi(c.Params("id")) - // if err != nil { - // return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": err.Error()}) - // } - - res := h.db.Delete(&models.FuzzResult{}) - if res.Error != nil { - return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": res.Error.Error()}) - } - - m := &types.AttackResultMessage{ - Type: types.MessageTypeAttackResultClear, - } - - h.pool.Broadcast <- m - - return c.JSON(fiber.Map{"status": "ok", "deleted": res.RowsAffected}) -} diff --git a/internal/handlers/explore.go b/internal/handlers/explore.go deleted file mode 100644 index 7f505889..00000000 --- a/internal/handlers/explore.go +++ /dev/null @@ -1,34 +0,0 @@ -package handlers - -import ( - "time" - - "github.com/gofiber/fiber/v2" - - "github.com/ghostsecurity/reaper/internal/types" -) - -// unused -func (h *Handler) ExploreHostExample(c *fiber.Ctx) error { - msg := types.ExploreHostMessage{ - Type: "explore_host", - Name: "example.com", - Timestamp: time.Now(), - } - h.pool.Broadcast <- &msg - - return c.JSON(fiber.Map{"explore host": "ok"}) -} - -// unused -func (h *Handler) ExploreEndpointExample(c *fiber.Ctx) error { - msg := types.ExploreEndpointMessage{ - Type: "explore_endpoint", - Path: "/api/v2/users", - Host: "example.com", - Timestamp: time.Now(), - } - h.pool.Broadcast <- &msg - - return c.JSON(fiber.Map{"explore endpoint": "ok"}) -} diff --git a/internal/handlers/fuzz.go b/internal/handlers/fuzz.go deleted file mode 100644 index 2b32e5f2..00000000 --- a/internal/handlers/fuzz.go +++ /dev/null @@ -1,11 +0,0 @@ -package handlers - -import "github.com/gofiber/fiber/v2" - -type FuzzAttack struct { - Target string `json:"target"` -} - -func (h *Handler) CreateFuzzAttack(c *fiber.Ctx) error { - return nil -} diff --git a/internal/handlers/handler.go b/internal/handlers/handler.go deleted file mode 100644 index 83f067af..00000000 --- a/internal/handlers/handler.go +++ /dev/null @@ -1,38 +0,0 @@ -package handlers - -import ( - "log" - - "gorm.io/gorm" - - ws "github.com/ghostsecurity/reaper/internal/handlers/websocket" - "github.com/ghostsecurity/reaper/internal/tools/proxy" - "github.com/ghostsecurity/reaper/internal/tools/tunnel" -) - -type Handler struct { - proxy *proxy.Proxy - tunnel *tunnel.Tunnel - pool *ws.Pool - db *gorm.DB -} - -func NewHandler(pool *ws.Pool, db *gorm.DB) *Handler { - proxy := proxy.NewProxy(pool, db) - // start proxy by default - err := proxy.Start() - if err != nil { - log.Fatalf("error starting proxy: %v", err) - } - return &Handler{ - proxy: proxy, - pool: pool, - db: db, - } -} - -func NewWsHandler(pool *ws.Pool) *Handler { - return &Handler{ - pool: pool, - } -} diff --git a/internal/handlers/proxy.go b/internal/handlers/proxy.go deleted file mode 100644 index 1a47da71..00000000 --- a/internal/handlers/proxy.go +++ /dev/null @@ -1,38 +0,0 @@ -package handlers - -import ( - "log/slog" - - "github.com/gofiber/fiber/v2" - - "github.com/ghostsecurity/reaper/internal/tools/proxy" -) - -func (h *Handler) ProxyStart(c *fiber.Ctx) error { - if h.proxy != nil { - return c.JSON(fiber.Map{"status": "ok", "message": "proxy already running"}) - } - h.proxy = proxy.NewProxy(h.pool, h.db) - err := h.proxy.Start() - if err != nil { - slog.Error("[proxy start]", "msg", "error starting proxy", "error", err) - return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"status": "error", "message": "error starting proxy"}) - } - - return c.JSON(fiber.Map{"status": "ok"}) -} - -func (h *Handler) ProxyStop(c *fiber.Ctx) error { - if h.proxy != nil { - h.proxy.Stop() - h.proxy = nil - } - return c.JSON(fiber.Map{"status": "ok"}) -} - -func (h *Handler) ProxyStatus(c *fiber.Ctx) error { - if h.proxy == nil { - return c.Status(fiber.StatusGone).JSON(fiber.Map{"status": "error", "message": "proxy not running"}) - } - return c.JSON(fiber.Map{"status": "ok", "message": "proxy running"}) -} diff --git a/internal/handlers/replay.go b/internal/handlers/replay.go deleted file mode 100644 index 713cabba..00000000 --- a/internal/handlers/replay.go +++ /dev/null @@ -1,25 +0,0 @@ -package handlers - -import ( - "context" - - "github.com/gofiber/fiber/v2" - - "github.com/ghostsecurity/reaper/internal/tools/replay" - "github.com/ghostsecurity/reaper/internal/types" -) - -func (h *Handler) Replay(c *fiber.Ctx) error { - replayInput := types.ReplayInput{} - - if err := c.BodyParser(&replayInput); err != nil { - return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": err.Error()}) - } - - resp, err := replay.Do(context.TODO(), &replayInput) - if err != nil { - return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": err.Error()}) - } - - return c.JSON(resp) -} diff --git a/internal/handlers/report.go b/internal/handlers/report.go deleted file mode 100644 index 86ab520b..00000000 --- a/internal/handlers/report.go +++ /dev/null @@ -1,85 +0,0 @@ -package handlers - -import ( - "strconv" - - "github.com/gofiber/fiber/v2" - - "github.com/ghostsecurity/reaper/internal/database/models" - "github.com/ghostsecurity/reaper/internal/types" -) - -func (h *Handler) GetReports(c *fiber.Ctx) error { - reports := []models.Report{} - h.db.Order("created_at DESC").Find(&reports) - - return c.JSON(reports) -} - -func (h *Handler) GetReport(c *fiber.Ctx) error { - report := models.Report{} - id := c.Params("id") - if id == "" { - return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "report id is required"}) - } - - if _, err := strconv.Atoi(id); err != nil { - return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "invalid report id"}) - } - - err := h.db.First(&report, id).Error - if err != nil { - return c.Status(fiber.StatusNotFound).JSON(fiber.Map{"error": err.Error()}) - } - - return c.JSON(report) -} - -func (h *Handler) CreateReport(c *fiber.Ctx) error { - reportInput := struct { - Domain string `json:"domain"` - Markdown string `json:"markdown"` - }{} - - if err := c.BodyParser(&reportInput); err != nil { - return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": err.Error()}) - } - - report := models.Report{ - Domain: reportInput.Domain, - Markdown: reportInput.Markdown, - } - resp := h.db.Create(&report) - if resp.Error != nil { - return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": resp.Error.Error()}) - } - - msg := &types.ReportMessage{ - Type: types.MessageTypeReportStatus, - Domain: report.Domain, - Markdown: report.Markdown, - Timestamp: report.CreatedAt, - } - h.pool.Broadcast <- msg - - return c.JSON(report) -} - -func (h *Handler) DeleteReport(c *fiber.Ctx) error { - report := models.Report{} - id := c.Params("id") - if id == "" { - return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "report id is required"}) - } - - if _, err := strconv.Atoi(id); err != nil { - return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "invalid report id"}) - } - - res := h.db.Delete(&report, id) - if res.RowsAffected == 0 { - return c.Status(fiber.StatusNotFound).JSON(fiber.Map{"error": "report not found"}) - } - - return c.SendStatus(fiber.StatusNoContent) -} diff --git a/internal/handlers/request.go b/internal/handlers/request.go deleted file mode 100644 index 234d2d7e..00000000 --- a/internal/handlers/request.go +++ /dev/null @@ -1,21 +0,0 @@ -package handlers - -import ( - "github.com/gofiber/fiber/v2" - - "github.com/ghostsecurity/reaper/internal/database/models" -) - -func (h *Handler) GetRequests(c *fiber.Ctx) error { - requests := []models.Request{} - h.db.Preload("Response").Limit(250).Order("requests.created_at desc").Find(&requests) - - return c.JSON(requests) -} - -func (h *Handler) GetRequest(c *fiber.Ctx) error { - request := models.Request{} - h.db.Preload("Response").First(&request, c.Params("id")) - - return c.JSON(request) -} diff --git a/internal/handlers/server.go b/internal/handlers/server.go deleted file mode 100644 index f13732eb..00000000 --- a/internal/handlers/server.go +++ /dev/null @@ -1,116 +0,0 @@ -package handlers - -import ( - "log/slog" - - "github.com/gofiber/fiber/v2" - - "github.com/ghostsecurity/reaper/internal/database/models" - "github.com/ghostsecurity/reaper/internal/middleware" - "github.com/ghostsecurity/reaper/internal/service" - "github.com/ghostsecurity/reaper/internal/types" -) - -type NavigationRecord struct { - To string `json:"to"` - From string `json:"from"` -} - -func (h *Handler) Status(c *fiber.Ctx) error { - ip := c.IP() - token := c.Get(middleware.AuthTokenHeader) - - if token == "" { - return c.Status(fiber.StatusUnauthorized). - JSON(fiber.Map{"status": "unauthorized", "ip": ip}) - } - - user, _ := service.GetUserByToken(token, h.db) - if user == nil { - return c.Status(fiber.StatusUnauthorized). - JSON(fiber.Map{"status": "no user", "ip": ip}) - } - - return c.JSON(fiber.Map{"status": "ok", "ip": ip, "user": user}) -} - -// Navigation handles navigation follow commands from the frontend. -func (h *Handler) Navigation(c *fiber.Ctx) error { - // ignore navigation commands from non-leader - user := c.Locals("user").(*models.User) - - if user.Role != types.UserRoleAdmin { - return c.SendStatus(fiber.StatusNoContent) - } - - var r NavigationRecord - if err := c.BodyParser(&r); err != nil { - return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": err.Error()}) - } - - h.pool.Broadcast <- &types.NavigationFollowMessage{ - Type: types.MessageTypeNavigationFollow, - From: r.From, - To: r.To, - } - - slog.Info("navigation", "message", "leader navigation", "to", r.To, "from", r.From) - return c.JSON(fiber.Map{"navigation": "ok"}) -} - -func (h *Handler) Register(c *fiber.Ctx) error { - input := struct { - Username string `json:"username"` - RegistrationCode string `json:"invite_code"` - }{} - - if err := c.BodyParser(&input); err != nil { - return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": err.Error()}) - } - - admin, _ := service.FirstAdmin(h.db) - if admin == nil { - // register an admin user - u, err := service.CreateAdminUser(input.Username, h.db) - if err != nil { - return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "error creating admin user"}) - } - - return c.JSON(fiber.Map{"user": u}) - } - - // ***************************** // - // TODO: remove after testing !! // - // ***************************** // - // - // always login as admin - user, _ := service.GetUserByToken(admin.Token, h.db) - if user == nil { - return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "admin user not found"}) - } - return c.JSON(fiber.Map{"user": user}) - - // get the guest token system setting - // TODO: remove after testing - // guestToken, _ := service.GetSettingByKey("guest_token", h.db) - // if guestToken == nil { - // return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "guest token is not set"}) - // } - - // slog.Info("register", "guest_token", *guestToken) - - // // guest users need an invite code - // if input.RegistrationCode != *guestToken { - // return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "invalid registration code"}) - // } - - // // register a guest user - // u, err := service.CreateGuestUser(input.Username, h.db) - // if err != nil { - // return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "error creating guest user"}) - // } - - // slog.Info("register", "username", input.Username, "code", input.RegistrationCode, "token", u.Token) - - // return c.JSON(fiber.Map{"user": u}) -} diff --git a/internal/handlers/tunnel.go b/internal/handlers/tunnel.go deleted file mode 100644 index 3650c8cb..00000000 --- a/internal/handlers/tunnel.go +++ /dev/null @@ -1,58 +0,0 @@ -package handlers - -import ( - "fmt" - "log/slog" - - "github.com/gofiber/fiber/v2" - - "github.com/ghostsecurity/reaper/internal/service" - "github.com/ghostsecurity/reaper/internal/tools/tunnel" -) - -const tunnelURLKey = "tunnel_url" - -func (h *Handler) TunnelStart(c *fiber.Ctx) error { - if h.tunnel != nil { - return c.JSON(fiber.Map{"status": "ok", "message": "tunnel already running", "url": h.tunnel.URL}) - } - h.tunnel = tunnel.NewTunnel() - err := h.tunnel.Start() - if err != nil { - slog.Error("[tunnel start]", "msg", "error starting tunnel", "error", err) - return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"status": "error", "message": "error starting tunnel"}) - } - - return c.JSON(fiber.Map{"status": "ok", "url": h.tunnel.URL}) -} - -func (h *Handler) TunnelStop(c *fiber.Ctx) error { - if h.tunnel != nil { - h.tunnel.Stop() - h.tunnel = nil - } - - _ = service.DeleteSettingByKey(tunnelURLKey, h.db) - - return c.JSON(fiber.Map{"status": "ok"}) -} - -func (h *Handler) TunnelStatus(c *fiber.Ctx) error { - if h.tunnel == nil { - return c.Status(fiber.StatusGone).JSON(fiber.Map{"status": "error", "message": "tunnel not running"}) - } - - // tunnel.URL is nil if the tunnel had a problem starting - if h.tunnel.URL == nil { - if h.tunnel.Failed { - h.tunnel = nil - return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"status": "error", "message": "tunnel had a problem"}) - } - } - - guestToken, _ := service.GetSettingByKey("guest_token", h.db) - - url := fmt.Sprintf("%s/?code=%s", *h.tunnel.URL, *guestToken) - - return c.JSON(fiber.Map{"status": "ok", "url": url}) -} diff --git a/internal/handlers/websocket.go b/internal/handlers/websocket.go deleted file mode 100644 index 6ea61f26..00000000 --- a/internal/handlers/websocket.go +++ /dev/null @@ -1,29 +0,0 @@ -package handlers - -import ( - "log/slog" - - "github.com/gofiber/contrib/websocket" - "github.com/gofiber/fiber/v2" - - ws "github.com/ghostsecurity/reaper/internal/handlers/websocket" -) - -func (h *Handler) WebSocketUpgrade(c *fiber.Ctx) error { - if websocket.IsWebSocketUpgrade(c) { - return c.Next() - } - return fiber.ErrUpgradeRequired -} - -func (h *Handler) WebSocket(c *websocket.Conn) { - slog.Info("websocket client connected") - - client := &ws.Client{ - Conn: c, - Pool: h.pool, - } - - h.pool.Register <- client - client.Read() -} diff --git a/internal/handlers/websocket/client.go b/internal/handlers/websocket/client.go deleted file mode 100644 index 6e402c34..00000000 --- a/internal/handlers/websocket/client.go +++ /dev/null @@ -1,53 +0,0 @@ -package websocket - -import ( - "log" - "log/slog" - "sync" - - "github.com/gofiber/contrib/websocket" -) - -type Client struct { - ID string - Conn *websocket.Conn - Pool *Pool - Mutex sync.Mutex -} - -type Message struct { - Type int `json:"type"` - Body interface{} `json:"body"` -} - -// Read listens for new messages being sent to the websocket connection -func (c *Client) Read() { - defer func() { - c.Pool.Unregister <- c - c.Conn.Close() - }() - - for { - messageType, p, err := c.Conn.ReadMessage() - if err != nil { - log.Println(err) - return - } - - msg := Message{ - Type: messageType, - Body: string(p), - } - - // if message body is "ping" then respond with "pong" - // this manual heartbeat sent from the browser helps keep - // the connection alive because browsers don't have a - // native WebSocket ping - if msg.Body == "ping" { - _ = c.Conn.WriteMessage(websocket.TextMessage, []byte("pong")) - } else { - // we don't need to log pings, but we do want to log everything else - slog.Info("[ws]", "body", msg.Body) - } - } -} diff --git a/internal/handlers/websocket/pool.go b/internal/handlers/websocket/pool.go deleted file mode 100644 index bd1bf92f..00000000 --- a/internal/handlers/websocket/pool.go +++ /dev/null @@ -1,51 +0,0 @@ -package websocket - -import ( - "log/slog" - - "github.com/ghostsecurity/reaper/internal/types" -) - -// BroadcastMessage is a message that can be broadcast to websocket clients -type BroadcastMessage interface { - GetType() types.MessageType -} - -type Pool struct { - Register chan *Client - Unregister chan *Client - Clients map[*Client]bool - Broadcast chan BroadcastMessage -} - -func NewPool() *Pool { - return &Pool{ - Register: make(chan *Client), - Unregister: make(chan *Client), - Clients: make(map[*Client]bool), - Broadcast: make(chan BroadcastMessage), - } -} - -func (pool *Pool) Start() { - for { - select { - case client := <-pool.Register: - pool.Clients[client] = true - slog.Info("websocket client added to pool", "size", len(pool.Clients)) - case client := <-pool.Unregister: - delete(pool.Clients, client) - slog.Info("websocket client disconnected from pool", "size", len(pool.Clients)) - case message := <-pool.Broadcast: - for client := range pool.Clients { - client.Mutex.Lock() - - if err := client.Conn.WriteJSON(message); err != nil { - slog.Error("websocket error sending message to client", "error", err) - } - - client.Mutex.Unlock() - } - } - } -} diff --git a/internal/middleware/auth.go b/internal/middleware/auth.go deleted file mode 100644 index 94e67d4a..00000000 --- a/internal/middleware/auth.go +++ /dev/null @@ -1,29 +0,0 @@ -package middleware - -import ( - "github.com/gofiber/fiber/v2" - "gorm.io/gorm" - - "github.com/ghostsecurity/reaper/internal/service" -) - -const ( - AuthTokenHeader = "X-Reaper-Token" -) - -func TokenAuth(db *gorm.DB) fiber.Handler { - return func(c *fiber.Ctx) error { - token := c.Get(AuthTokenHeader) - if token == "" { - return c.Status(fiber.StatusUnauthorized).JSON(fiber.Map{"error": "Unauthorized"}) - } - - user, err := service.GetUserByToken(token, db) - if err != nil { - return c.Status(fiber.StatusUnauthorized).JSON(fiber.Map{"error": "Unauthorized"}) - } - - c.Locals("user", user) - return c.Next() - } -} diff --git a/internal/proxy/cert.go b/internal/proxy/cert.go new file mode 100644 index 00000000..9e4078b6 --- /dev/null +++ b/internal/proxy/cert.go @@ -0,0 +1,53 @@ +package proxy + +import ( + "crypto/rand" + "crypto/rsa" + "crypto/x509" + "crypto/x509/pkix" + "fmt" + "math/big" + "time" +) + +type CA struct { + Cert *x509.Certificate + Key *rsa.PrivateKey +} + +func GenerateCA() (*CA, error) { + key, err := rsa.GenerateKey(rand.Reader, 2048) + if err != nil { + return nil, fmt.Errorf("generating key: %w", err) + } + + serial, err := rand.Int(rand.Reader, new(big.Int).Lsh(big.NewInt(1), 128)) + if err != nil { + return nil, fmt.Errorf("generating serial: %w", err) + } + + tmpl := &x509.Certificate{ + SerialNumber: serial, + Subject: pkix.Name{ + Organization: []string{"Ghost Security Reaper MITM Proxy"}, + CommonName: "Ghost Security Reaper CA - https://ghostsecurity.ai", + }, + NotBefore: time.Now().Add(-time.Hour), + NotAfter: time.Now().Add(30 * 24 * time.Hour), + KeyUsage: x509.KeyUsageCertSign | x509.KeyUsageCRLSign | x509.KeyUsageDigitalSignature, + BasicConstraintsValid: true, + IsCA: true, + } + + certDER, err := x509.CreateCertificate(rand.Reader, tmpl, tmpl, &key.PublicKey, key) + if err != nil { + return nil, fmt.Errorf("creating certificate: %w", err) + } + + cert, err := x509.ParseCertificate(certDER) + if err != nil { + return nil, fmt.Errorf("parsing certificate: %w", err) + } + + return &CA{Cert: cert, Key: key}, nil +} diff --git a/internal/proxy/cert_test.go b/internal/proxy/cert_test.go new file mode 100644 index 00000000..a28b28cd --- /dev/null +++ b/internal/proxy/cert_test.go @@ -0,0 +1,23 @@ +package proxy + +import "testing" + +func TestGenerateCA(t *testing.T) { + ca, err := GenerateCA() + if err != nil { + t.Fatalf("generating CA: %v", err) + } + + if ca.Cert == nil { + t.Fatal("expected non-nil cert") + } + if ca.Key == nil { + t.Fatal("expected non-nil key") + } + if !ca.Cert.IsCA { + t.Error("cert should be a CA") + } + if ca.Cert.Subject.CommonName != "Ghost Security Reaper CA - https://ghostsecurity.ai" { + t.Errorf("CN = %q, want Ghost Security Reaper CA - https://ghostsecurity.ai", ca.Cert.Subject.CommonName) + } +} diff --git a/internal/proxy/proxy.go b/internal/proxy/proxy.go new file mode 100644 index 00000000..26afa6f6 --- /dev/null +++ b/internal/proxy/proxy.go @@ -0,0 +1,357 @@ +package proxy + +import ( + "bufio" + "crypto/rand" + "crypto/rsa" + "crypto/tls" + "crypto/x509" + "crypto/x509/pkix" + "fmt" + "io" + "math/big" + "net" + "net/http" + "net/http/httputil" + "strconv" + "strings" + "sync" + "time" + + "github.com/ghostsecurity/reaper/internal/storage" +) + +// Event describes a proxied request for display logging. +type Event struct { + ID int64 + Method string + Scheme string + Host string + Path string + StatusCode int + DurationMs int64 + Intercepted bool +} + +// Proxy is an HTTP/HTTPS MITM proxy. +type Proxy struct { + Scope *Scope + Store storage.Store + CA *CA + Transport http.RoundTripper // optional; defaults to http.DefaultTransport + OnEvent func(Event) // optional callback for live activity display + + certCache sync.Map // host → *tls.Certificate +} + +func (p *Proxy) transport() http.RoundTripper { + if p.Transport != nil { + return p.Transport + } + return http.DefaultTransport +} + +func (p *Proxy) emit(e Event) { + if p.OnEvent != nil { + p.OnEvent(e) + } +} + +func (p *Proxy) ServeHTTP(w http.ResponseWriter, r *http.Request) { + if r.Method == http.MethodConnect { + p.handleConnect(w, r) + return + } + p.handleHTTP(w, r) +} + +func (p *Proxy) handleConnect(w http.ResponseWriter, r *http.Request) { + hij, ok := w.(http.Hijacker) + if !ok { + http.Error(w, "hijacking not supported", http.StatusInternalServerError) + return + } + + host := r.Host + if !strings.Contains(host, ":") { + host += ":443" + } + + clientConn, buf, err := hij.Hijack() + if err != nil { + return + } + + // Send 200 after hijacking so we control the flush + _, _ = buf.WriteString("HTTP/1.1 200 Connection Established\r\n\r\n") + _ = buf.Flush() + + hostname := r.Host + if idx := strings.Index(hostname, ":"); idx != -1 { + hostname = hostname[:idx] + } + + if !p.Scope.InScope(hostname) { + p.blindRelay(clientConn, host) + return + } + + p.mitmConnect(clientConn, hostname, host) +} + +func (p *Proxy) blindRelay(clientConn net.Conn, targetAddr string) { + defer clientConn.Close() + + upstream, err := net.DialTimeout("tcp", targetAddr, 10*time.Second) + if err != nil { + return + } + defer upstream.Close() + + done := make(chan struct{}) + go func() { + _, _ = io.Copy(upstream, clientConn) + close(done) + }() + _, _ = io.Copy(clientConn, upstream) + <-done +} + +func (p *Proxy) mitmConnect(clientConn net.Conn, hostname, targetAddr string) { + defer clientConn.Close() + + tlsCert, err := p.getCertForHost(hostname) + if err != nil { + return + } + + tlsConfig := &tls.Config{ //nolint:gosec + Certificates: []tls.Certificate{*tlsCert}, + } + + tlsConn := tls.Server(clientConn, tlsConfig) + if err := tlsConn.Handshake(); err != nil { + return + } + defer tlsConn.Close() + + reader := bufio.NewReader(tlsConn) + + for { + req, err := http.ReadRequest(reader) + if err != nil { + return + } + + req.URL.Scheme = "https" + req.URL.Host = targetAddr + req.RequestURI = "" + + p.proxyAndLog(tlsConn, req, "https", hostname) + } +} + +func (p *Proxy) handleHTTP(w http.ResponseWriter, r *http.Request) { + if !r.URL.IsAbs() { + http.Error(w, "non-proxy request", http.StatusBadRequest) + return + } + + hostname := r.URL.Hostname() + inScope := p.Scope.InScope(hostname) + + // Forward the request + start := time.Now() + r.RequestURI = "" + r.Header.Del("Accept-Encoding") + + resp, err := p.transport().RoundTrip(r) + if err != nil { + http.Error(w, err.Error(), http.StatusBadGateway) + return + } + defer resp.Body.Close() + + body, err := io.ReadAll(resp.Body) + if err != nil { + http.Error(w, err.Error(), http.StatusBadGateway) + return + } + + duration := time.Since(start).Milliseconds() + + if inScope { + reqDump, _ := httputil.DumpRequest(r, true) + entry := &storage.Entry{ + Method: r.Method, + Scheme: "http", + Host: hostname, + Path: r.URL.Path, + Query: r.URL.RawQuery, + RequestHeaders: r.Header.Clone(), + RequestBody: extractBody(reqDump), + StatusCode: resp.StatusCode, + ResponseHeaders: resp.Header.Clone(), + ResponseBody: body, + Timestamp: time.Now(), + DurationMs: duration, + } + _ = p.Store.Save(entry) + p.emit(Event{ + ID: entry.ID, + Method: r.Method, + Scheme: "http", + Host: hostname, + Path: r.URL.Path, + StatusCode: resp.StatusCode, + DurationMs: duration, + Intercepted: true, + }) + } else { + p.emit(Event{ + Method: r.Method, + Scheme: "http", + Host: hostname, + Path: r.URL.Path, + StatusCode: resp.StatusCode, + DurationMs: duration, + Intercepted: false, + }) + } + + // Copy response headers + for k, vv := range resp.Header { + for _, v := range vv { + w.Header().Add(k, v) + } + } + w.WriteHeader(resp.StatusCode) + _, _ = w.Write(body) +} + +func (p *Proxy) proxyAndLog(clientConn net.Conn, req *http.Request, scheme, hostname string) { + start := time.Now() + + reqBody, _ := io.ReadAll(req.Body) + req.Body.Close() + + // Forward to upstream + upstreamReq, err := http.NewRequest(req.Method, req.URL.String(), strings.NewReader(string(reqBody))) + if err != nil { + return + } + upstreamReq.Header = req.Header.Clone() + upstreamReq.Header.Del("Accept-Encoding") + + resp, err := p.transport().RoundTrip(upstreamReq) + if err != nil { + // Write error response to client + fmt.Fprintf(clientConn, "HTTP/1.1 502 Bad Gateway\r\nContent-Length: 0\r\n\r\n") + return + } + defer resp.Body.Close() + + respBody, err := io.ReadAll(resp.Body) + if err != nil { + return + } + + duration := time.Since(start).Milliseconds() + + entry := &storage.Entry{ + Method: req.Method, + Scheme: scheme, + Host: hostname, + Path: req.URL.Path, + Query: req.URL.RawQuery, + RequestHeaders: req.Header.Clone(), + RequestBody: reqBody, + StatusCode: resp.StatusCode, + ResponseHeaders: resp.Header.Clone(), + ResponseBody: respBody, + Timestamp: time.Now(), + DurationMs: duration, + } + _ = p.Store.Save(entry) + p.emit(Event{ + ID: entry.ID, + Method: entry.Method, + Scheme: scheme, + Host: hostname, + Path: req.URL.Path, + StatusCode: resp.StatusCode, + DurationMs: duration, + Intercepted: true, + }) + + // Write response back to client manually + resp.Header.Del("Transfer-Encoding") + resp.Header.Del("Content-Encoding") + resp.Header.Set("Content-Length", strconv.Itoa(len(respBody))) + + var sb strings.Builder + fmt.Fprintf(&sb, "HTTP/%d.%d %s\r\n", resp.ProtoMajor, resp.ProtoMinor, resp.Status) + _ = resp.Header.Write(&sb) + sb.WriteString("\r\n") + + _, _ = clientConn.Write([]byte(sb.String())) + _, _ = clientConn.Write(respBody) +} + +func (p *Proxy) getCertForHost(host string) (*tls.Certificate, error) { + if cached, ok := p.certCache.Load(host); ok { + return cached.(*tls.Certificate), nil + } + + serial, err := rand.Int(rand.Reader, new(big.Int).Lsh(big.NewInt(1), 128)) + if err != nil { + return nil, err + } + + tmpl := &x509.Certificate{ + SerialNumber: serial, + Subject: pkix.Name{ + CommonName: host, + }, + DNSNames: []string{host}, + NotBefore: time.Now().Add(-time.Hour), + NotAfter: time.Now().Add(24 * time.Hour), + KeyUsage: x509.KeyUsageDigitalSignature, + ExtKeyUsage: []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth}, + } + + certKey, err := rsa.GenerateKey(rand.Reader, 2048) + if err != nil { + return nil, err + } + + certDER, err := x509.CreateCertificate(rand.Reader, tmpl, p.CA.Cert, &certKey.PublicKey, p.CA.Key) + if err != nil { + return nil, err + } + + tlsCert := &tls.Certificate{ + Certificate: [][]byte{certDER}, + PrivateKey: certKey, + } + + p.certCache.Store(host, tlsCert) + return tlsCert, nil +} + +func extractBody(dump []byte) []byte { + idx := strings.Index(string(dump), "\r\n\r\n") + if idx == -1 { + return nil + } + body := dump[idx+4:] + if len(body) == 0 { + return nil + } + return body +} + +// StatusText returns standard status text — used by response formatting. +func StatusText(code int) string { + return http.StatusText(code) +} diff --git a/internal/proxy/proxy_test.go b/internal/proxy/proxy_test.go new file mode 100644 index 00000000..06081c80 --- /dev/null +++ b/internal/proxy/proxy_test.go @@ -0,0 +1,153 @@ +package proxy + +import ( + "compress/gzip" + "crypto/tls" + "fmt" + "io" + "net" + "net/http" + "net/http/httptest" + "net/url" + "testing" + "time" + + "github.com/ghostsecurity/reaper/internal/storage" +) + +type nullStore struct{} + +func (s *nullStore) Save(e *storage.Entry) error { return nil } +func (s *nullStore) Get(id int64) (*storage.Entry, error) { return nil, fmt.Errorf("not found") } +func (s *nullStore) List(l, o int) ([]*storage.Entry, error) { return nil, nil } +func (s *nullStore) Search(p storage.SearchParams) ([]*storage.Entry, error) { return nil, nil } +func (s *nullStore) ListAfter(afterID int64, limit int) ([]*storage.Entry, error) { return nil, nil } +func (s *nullStore) Clear() error { return nil } +func (s *nullStore) Close() error { return nil } + +func startTestProxy(t *testing.T, domains []string, transport http.RoundTripper) (*Proxy, net.Listener) { + t.Helper() + + ca, err := GenerateCA() + if err != nil { + t.Fatal(err) + } + + p := &Proxy{ + Scope: NewScope(domains, nil), + Store: &nullStore{}, + CA: ca, + Transport: transport, + } + + ln, err := net.Listen("tcp", "127.0.0.1:0") + if err != nil { + t.Fatal(err) + } + + srv := &http.Server{Handler: p} + go srv.Serve(ln) + t.Cleanup(func() { srv.Close(); ln.Close() }) + + return p, ln +} + +func TestProxyMITMGzip(t *testing.T) { + // Upstream server that always responds with gzip + upstream := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Encoding", "gzip") + w.Header().Set("Content-Type", "application/json") + gz := gzip.NewWriter(w) + gz.Write([]byte(`{"status":"ok"}`)) + gz.Close() + })) + defer upstream.Close() + + upstreamURL, _ := url.Parse(upstream.URL) + host, _, _ := net.SplitHostPort(upstreamURL.Host) + + // Proxy transport that trusts the test server + proxyTransport := &http.Transport{ + TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, + } + + _, proxyLn := startTestProxy(t, []string{host}, proxyTransport) + proxyAddr := proxyLn.Addr().String() + + // Client that uses the proxy and trusts the MITM cert + proxyURL, _ := url.Parse("http://" + proxyAddr) + client := &http.Client{ + Transport: &http.Transport{ + Proxy: http.ProxyURL(proxyURL), + TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, + }, + Timeout: 5 * time.Second, + } + + start := time.Now() + resp, err := client.Get(upstream.URL + "/test") + elapsed := time.Since(start) + + if err != nil { + t.Fatalf("request failed (took %v): %v", elapsed, err) + } + defer resp.Body.Close() + + body, err := io.ReadAll(resp.Body) + if err != nil { + t.Fatalf("reading body: %v", err) + } + + if string(body) != `{"status":"ok"}` { + t.Errorf("body = %q, want %q", body, `{"status":"ok"}`) + } + + if elapsed > 3*time.Second { + t.Errorf("request took %v, expected < 3s", elapsed) + } + + t.Logf("completed in %v", elapsed) +} + +func TestProxyHTTP(t *testing.T) { + upstream := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "application/json") + w.Write([]byte(`{"hello":"world"}`)) + })) + defer upstream.Close() + + _, proxyLn := startTestProxy(t, []string{"127.0.0.1"}, nil) + proxyAddr := proxyLn.Addr().String() + + proxyURL, _ := url.Parse("http://" + proxyAddr) + client := &http.Client{ + Transport: &http.Transport{ + Proxy: http.ProxyURL(proxyURL), + }, + Timeout: 5 * time.Second, + } + + start := time.Now() + resp, err := client.Get(upstream.URL + "/test") + elapsed := time.Since(start) + + if err != nil { + t.Fatalf("request failed: %v", err) + } + defer resp.Body.Close() + + body, err := io.ReadAll(resp.Body) + if err != nil { + t.Fatalf("reading body: %v", err) + } + + if string(body) != `{"hello":"world"}` { + t.Errorf("body = %q, want %q", body, `{"hello":"world"}`) + } + + if elapsed > 3*time.Second { + t.Errorf("request took %v, expected < 3s", elapsed) + } + + t.Logf("completed in %v", elapsed) +} diff --git a/internal/proxy/scope.go b/internal/proxy/scope.go new file mode 100644 index 00000000..d5a9894d --- /dev/null +++ b/internal/proxy/scope.go @@ -0,0 +1,39 @@ +package proxy + +import "strings" + +// Scope determines whether a host is in scope for MITM interception. +type Scope struct { + domains []string // suffix match (e.g. "acme.com" matches "api.acme.com" and "acme.com") + hosts []string // exact match +} + +func NewScope(domains, hosts []string) *Scope { + return &Scope{ + domains: domains, + hosts: hosts, + } +} + +func (s *Scope) InScope(host string) bool { + // Strip port if present + if idx := strings.LastIndex(host, ":"); idx != -1 { + host = host[:idx] + } + host = strings.ToLower(host) + + for _, h := range s.hosts { + if strings.ToLower(h) == host { + return true + } + } + + for _, d := range s.domains { + d = strings.ToLower(d) + if host == d || strings.HasSuffix(host, "."+d) { + return true + } + } + + return false +} diff --git a/internal/proxy/scope_test.go b/internal/proxy/scope_test.go new file mode 100644 index 00000000..358f8c8b --- /dev/null +++ b/internal/proxy/scope_test.go @@ -0,0 +1,42 @@ +package proxy + +import "testing" + +func TestScope(t *testing.T) { + scope := NewScope( + []string{"acme.com", "example.org"}, + []string{"special.host.com"}, + ) + + tests := []struct { + host string + inScope bool + }{ + {"acme.com", true}, + {"api.acme.com", true}, + {"deep.api.acme.com", true}, + {"notacme.com", false}, + {"example.org", true}, + {"sub.example.org", true}, + {"example.com", false}, + {"special.host.com", true}, + {"special.host.com:443", true}, + {"other.host.com", false}, + {"", false}, + } + + for _, tt := range tests { + t.Run(tt.host, func(t *testing.T) { + if got := scope.InScope(tt.host); got != tt.inScope { + t.Errorf("InScope(%q) = %v, want %v", tt.host, got, tt.inScope) + } + }) + } +} + +func TestScopeEmpty(t *testing.T) { + scope := NewScope(nil, nil) + if scope.InScope("anything.com") { + t.Error("empty scope should match nothing") + } +} diff --git a/internal/service/endpoint.go b/internal/service/endpoint.go deleted file mode 100644 index 78274bc3..00000000 --- a/internal/service/endpoint.go +++ /dev/null @@ -1,38 +0,0 @@ -package service - -import ( - "github.com/ghostsecurity/reaper/internal/database/models" - "gorm.io/gorm" -) - -type EndpointInput struct { - Method string `json:"method"` - Hostname string `json:"hostname"` - Path string `json:"path"` - Params string `json:"params"` -} - -// CreateOrUpdateEndpoint creates a new endpoint or updates an existing one with params -func CreateOrUpdateEndpoint(db *gorm.DB, ep EndpointInput) (models.Endpoint, error) { - endpoint := models.Endpoint{ - Hostname: ep.Hostname, - Method: ep.Method, - Path: ep.Path, - Params: ep.Params, - } - - resp := db.Where(models.Endpoint{ - Hostname: ep.Hostname, - Path: ep.Path, - Method: ep.Method, - }).First(&endpoint) - if resp.RowsAffected == 0 { - db.Create(&endpoint) - } - if resp.RowsAffected == 1 { - endpoint.Params = ep.Params - db.Save(&endpoint) - } - - return endpoint, nil -} diff --git a/internal/service/setting.go b/internal/service/setting.go deleted file mode 100644 index 6c71303c..00000000 --- a/internal/service/setting.go +++ /dev/null @@ -1,37 +0,0 @@ -package service - -import ( - "github.com/ghostsecurity/reaper/internal/database/models" - "gorm.io/gorm" -) - -func GetSettingByKey(key string, db *gorm.DB) (*string, error) { - setting := models.Setting{} - res := db.Where(models.Setting{ - Key: key, - }).First(&setting) - - if res.Error != nil { - return nil, res.Error - } - - return &setting.Value, nil -} - -func SetSettingByKey(key string, value string, db *gorm.DB) error { - setting := models.Setting{ - Key: key, - Value: value, - } - res := db.Create(&setting) - - return res.Error -} - -func DeleteSettingByKey(key string, db *gorm.DB) error { - res := db.Where(models.Setting{ - Key: key, - }).Delete(&models.Setting{}) - - return res.Error -} diff --git a/internal/service/user.go b/internal/service/user.go deleted file mode 100644 index ed6f05fd..00000000 --- a/internal/service/user.go +++ /dev/null @@ -1,114 +0,0 @@ -package service - -import ( - "crypto/rand" - "encoding/hex" - "regexp" - - "github.com/ghostsecurity/reaper/internal/database/models" - "github.com/ghostsecurity/reaper/internal/types" - "gorm.io/gorm" -) - -func GetUserByToken(token string, db *gorm.DB) (*models.User, error) { - user := models.User{} - res := db.Where(models.User{ - Token: token, - }).First(&user) - - if res.Error != nil { - return nil, res.Error - } - - return &user, nil -} - -func FirstAdmin(db *gorm.DB) (*models.User, error) { - user := models.User{} - - res := db.Where(models.User{ - Role: types.UserRoleAdmin, - }).First(&user) - if res.Error != nil { - return nil, res.Error - } - - return &user, nil -} - -func CreateAgentUser(db *gorm.DB) (*models.User, error) { - user := models.User{ - Name: "Reaper AI Agent", - Role: types.UserRoleAgent, - Token: generateUserAuthToken(), - } - - res := db.Create(&user) - if res.Error != nil { - return nil, res.Error - } - - return &user, nil -} - -func GetAgentToken(db *gorm.DB) (string, error) { - user := models.User{} - res := db.Where(models.User{ - Role: types.UserRoleAgent, - }).First(&user) - if res.Error != nil { - return "", res.Error - } - return user.Token, nil -} - -func CreateAdminUser(username string, db *gorm.DB) (*models.User, error) { - user := models.User{ - Name: sanitizeUsername(username), - Role: types.UserRoleAdmin, - Token: generateUserAuthToken(), - } - - res := db.Create(&user) - if res.Error != nil { - return nil, res.Error - } - - return &user, nil -} - -func CreateGuestUser(username string, db *gorm.DB) (*models.User, error) { - user := models.User{ - Name: sanitizeUsername(username), - Role: types.UserRoleViewer, - Token: generateUserAuthToken(), - } - - res := db.Create(&user) - if res.Error != nil { - return nil, res.Error - } - - return &user, nil -} - -func sanitizeUsername(username string) string { - // regex to strip all non-alphanumeric characters, plus hyphens, underscores, and dots - username = regexp.MustCompile(`[^a-zA-Z0-9-_.]+`).ReplaceAllString(username, "") - - if len(username) > 20 { - return username[:20] - } - - return username -} - -func generateUserAuthToken() string { - token := make([]byte, 20) - _, err := rand.Read(token) - if err != nil { - panic(err) - } - - return hex.EncodeToString(token) -} diff --git a/internal/storage/models.go b/internal/storage/models.go new file mode 100644 index 00000000..abeab490 --- /dev/null +++ b/internal/storage/models.go @@ -0,0 +1,32 @@ +package storage + +import ( + "net/http" + "time" +) + +type Entry struct { + ID int64 + Method string + Scheme string // "http" or "https" + Host string + Path string + Query string + RequestHeaders http.Header + RequestBody []byte + StatusCode int + ResponseHeaders http.Header + ResponseBody []byte + Timestamp time.Time + DurationMs int64 +} + +type SearchParams struct { + Method string // exact match + Host string // supports glob wildcard (*.domain.com) + Domains []string // suffix match + Path string // prefix or glob + Status int // exact match + Limit int + Offset int +} diff --git a/internal/storage/sqlite.go b/internal/storage/sqlite.go new file mode 100644 index 00000000..27324666 --- /dev/null +++ b/internal/storage/sqlite.go @@ -0,0 +1,258 @@ +package storage + +import ( + "database/sql" + "encoding/json" + "fmt" + "net/http" + "strings" + "time" + + _ "modernc.org/sqlite" +) + +type SQLiteStore struct { + db *sql.DB +} + +func NewSQLiteStore(dbPath string) (*SQLiteStore, error) { + db, err := sql.Open("sqlite", dbPath+"?_journal_mode=WAL&_busy_timeout=5000") + if err != nil { + return nil, fmt.Errorf("opening database: %w", err) + } + db.SetMaxOpenConns(1) + + if err := createSchema(db); err != nil { + db.Close() + return nil, fmt.Errorf("creating schema: %w", err) + } + + return &SQLiteStore{db: db}, nil +} + +func createSchema(db *sql.DB) error { + schema := ` + CREATE TABLE IF NOT EXISTS entries ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + method TEXT NOT NULL, + scheme TEXT NOT NULL, + host TEXT NOT NULL, + path TEXT NOT NULL, + query TEXT DEFAULT '', + request_headers TEXT NOT NULL, + request_body BLOB, + status_code INTEGER DEFAULT 0, + response_headers TEXT DEFAULT '{}', + response_body BLOB, + created_at DATETIME DEFAULT CURRENT_TIMESTAMP, + duration_ms INTEGER DEFAULT 0 + ); + CREATE INDEX IF NOT EXISTS idx_entries_method ON entries(method); + CREATE INDEX IF NOT EXISTS idx_entries_host ON entries(host); + CREATE INDEX IF NOT EXISTS idx_entries_status ON entries(status_code); + CREATE INDEX IF NOT EXISTS idx_entries_created ON entries(created_at); + ` + _, err := db.Exec(schema) + return err +} + +func (s *SQLiteStore) Save(entry *Entry) error { + reqHeaders, err := json.Marshal(entry.RequestHeaders) + if err != nil { + return fmt.Errorf("marshaling request headers: %w", err) + } + + respHeaders, err := json.Marshal(entry.ResponseHeaders) + if err != nil { + return fmt.Errorf("marshaling response headers: %w", err) + } + + ts := entry.Timestamp + if ts.IsZero() { + ts = time.Now() + } + + result, err := s.db.Exec( + `INSERT INTO entries (method, scheme, host, path, query, request_headers, request_body, status_code, response_headers, response_body, created_at, duration_ms) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, + entry.Method, + entry.Scheme, + entry.Host, + entry.Path, + entry.Query, + string(reqHeaders), + entry.RequestBody, + entry.StatusCode, + string(respHeaders), + entry.ResponseBody, + ts.UTC().Format(time.DateTime), + entry.DurationMs, + ) + if err != nil { + return fmt.Errorf("inserting entry: %w", err) + } + + entry.ID, _ = result.LastInsertId() + return nil +} + +func (s *SQLiteStore) Get(id int64) (*Entry, error) { + row := s.db.QueryRow( + `SELECT id, method, scheme, host, path, query, request_headers, request_body, status_code, response_headers, response_body, created_at, duration_ms + FROM entries WHERE id = ?`, id, + ) + return scanEntry(row) +} + +func (s *SQLiteStore) List(limit, offset int) ([]*Entry, error) { + if limit <= 0 { + limit = 50 + } + rows, err := s.db.Query( + `SELECT id, method, scheme, host, path, query, request_headers, request_body, status_code, response_headers, response_body, created_at, duration_ms + FROM entries ORDER BY id DESC LIMIT ? OFFSET ?`, limit, offset, + ) + if err != nil { + return nil, fmt.Errorf("querying entries: %w", err) + } + defer rows.Close() + return scanEntries(rows) +} + +func (s *SQLiteStore) ListAfter(afterID int64, limit int) ([]*Entry, error) { + if limit <= 0 { + limit = 100 + } + rows, err := s.db.Query( + `SELECT id, method, scheme, host, path, query, request_headers, request_body, status_code, response_headers, response_body, created_at, duration_ms + FROM entries WHERE id > ? ORDER BY id ASC LIMIT ?`, afterID, limit, + ) + if err != nil { + return nil, fmt.Errorf("querying entries: %w", err) + } + defer rows.Close() + return scanEntries(rows) +} + +func (s *SQLiteStore) Clear() error { + _, err := s.db.Exec("DELETE FROM entries") + if err != nil { + return fmt.Errorf("clearing entries: %w", err) + } + return nil +} + +func (s *SQLiteStore) Search(params SearchParams) ([]*Entry, error) { + var conditions []string + var args []any + + if params.Method != "" { + conditions = append(conditions, "method = ?") + args = append(args, strings.ToUpper(params.Method)) + } + + if params.Host != "" { + if strings.Contains(params.Host, "*") { + pattern := strings.ReplaceAll(params.Host, "*", "%") + conditions = append(conditions, "host LIKE ?") + args = append(args, pattern) + } else { + conditions = append(conditions, "host = ?") + args = append(args, params.Host) + } + } + + for _, domain := range params.Domains { + domain = strings.TrimPrefix(domain, ".") + conditions = append(conditions, "(host LIKE ? OR host = ?)") + args = append(args, "%."+domain, domain) + } + + if params.Path != "" { + if strings.Contains(params.Path, "*") { + pattern := strings.ReplaceAll(params.Path, "*", "%") + conditions = append(conditions, "path LIKE ?") + args = append(args, pattern) + } else { + conditions = append(conditions, "path LIKE ?") + args = append(args, params.Path+"%") + } + } + + if params.Status > 0 { + conditions = append(conditions, "status_code = ?") + args = append(args, params.Status) + } + + query := `SELECT id, method, scheme, host, path, query, request_headers, request_body, status_code, response_headers, response_body, created_at, duration_ms FROM entries` + if len(conditions) > 0 { + query += " WHERE " + strings.Join(conditions, " AND ") + } + query += " ORDER BY id DESC" + + limit := params.Limit + if limit <= 0 { + limit = 100 + } + query += fmt.Sprintf(" LIMIT %d OFFSET %d", limit, params.Offset) + + rows, err := s.db.Query(query, args...) + if err != nil { + return nil, fmt.Errorf("searching entries: %w", err) + } + defer rows.Close() + return scanEntries(rows) +} + +func (s *SQLiteStore) Close() error { + return s.db.Close() +} + +type scanner interface { + Scan(dest ...any) error +} + +func scanEntry(row scanner) (*Entry, error) { + var e Entry + var reqHeaders, respHeaders string + var createdAt string + var reqBody, respBody []byte + + err := row.Scan( + &e.ID, &e.Method, &e.Scheme, &e.Host, &e.Path, &e.Query, + &reqHeaders, &reqBody, &e.StatusCode, &respHeaders, &respBody, + &createdAt, &e.DurationMs, + ) + if err != nil { + if err == sql.ErrNoRows { + return nil, fmt.Errorf("entry not found") + } + return nil, fmt.Errorf("scanning entry: %w", err) + } + + e.RequestBody = reqBody + e.ResponseBody = respBody + + if err := json.Unmarshal([]byte(reqHeaders), &e.RequestHeaders); err != nil { + e.RequestHeaders = http.Header{} + } + if err := json.Unmarshal([]byte(respHeaders), &e.ResponseHeaders); err != nil { + e.ResponseHeaders = http.Header{} + } + + e.Timestamp, _ = time.Parse(time.DateTime, createdAt) + + return &e, nil +} + +func scanEntries(rows *sql.Rows) ([]*Entry, error) { + var entries []*Entry + for rows.Next() { + e, err := scanEntry(rows) + if err != nil { + return nil, err + } + entries = append(entries, e) + } + return entries, rows.Err() +} diff --git a/internal/storage/sqlite_test.go b/internal/storage/sqlite_test.go new file mode 100644 index 00000000..09b84cfc --- /dev/null +++ b/internal/storage/sqlite_test.go @@ -0,0 +1,198 @@ +package storage + +import ( + "net/http" + "os" + "path/filepath" + "testing" + "time" +) + +func testStore(t *testing.T) *SQLiteStore { + t.Helper() + dir := t.TempDir() + store, err := NewSQLiteStore(filepath.Join(dir, "test.db")) + if err != nil { + t.Fatalf("creating store: %v", err) + } + t.Cleanup(func() { store.Close() }) + return store +} + +func TestSaveAndGet(t *testing.T) { + store := testStore(t) + + entry := &Entry{ + Method: "GET", + Scheme: "https", + Host: "api.acme.com", + Path: "/users", + Query: "page=1", + RequestHeaders: http.Header{ + "Accept": []string{"application/json"}, + }, + StatusCode: 200, + ResponseHeaders: http.Header{ + "Content-Type": []string{"application/json"}, + }, + ResponseBody: []byte(`{"users":[]}`), + Timestamp: time.Now(), + DurationMs: 42, + } + + if err := store.Save(entry); err != nil { + t.Fatalf("saving entry: %v", err) + } + + if entry.ID == 0 { + t.Fatal("expected non-zero ID after save") + } + + got, err := store.Get(entry.ID) + if err != nil { + t.Fatalf("getting entry: %v", err) + } + + if got.Method != "GET" { + t.Errorf("method = %q, want GET", got.Method) + } + if got.Host != "api.acme.com" { + t.Errorf("host = %q, want api.acme.com", got.Host) + } + if got.Path != "/users" { + t.Errorf("path = %q, want /users", got.Path) + } + if got.StatusCode != 200 { + t.Errorf("status = %d, want 200", got.StatusCode) + } + if got.DurationMs != 42 { + t.Errorf("duration = %d, want 42", got.DurationMs) + } + if string(got.ResponseBody) != `{"users":[]}` { + t.Errorf("response body = %q, want {\"users\":[]}", got.ResponseBody) + } +} + +func TestGetNotFound(t *testing.T) { + store := testStore(t) + + _, err := store.Get(999) + if err == nil { + t.Fatal("expected error for missing entry") + } +} + +func TestList(t *testing.T) { + store := testStore(t) + + for i := 0; i < 5; i++ { + store.Save(&Entry{ + Method: "GET", + Scheme: "https", + Host: "example.com", + Path: "/", + RequestHeaders: http.Header{}, + ResponseHeaders: http.Header{}, + Timestamp: time.Now(), + }) + } + + entries, err := store.List(3, 0) + if err != nil { + t.Fatalf("listing: %v", err) + } + if len(entries) != 3 { + t.Errorf("got %d entries, want 3", len(entries)) + } + + // Verify ordering is DESC by ID + if entries[0].ID < entries[1].ID { + t.Error("expected DESC ordering") + } +} + +func TestSearchByMethod(t *testing.T) { + store := testStore(t) + + store.Save(&Entry{Method: "GET", Scheme: "https", Host: "a.com", Path: "/", RequestHeaders: http.Header{}, ResponseHeaders: http.Header{}, Timestamp: time.Now()}) + store.Save(&Entry{Method: "POST", Scheme: "https", Host: "a.com", Path: "/", RequestHeaders: http.Header{}, ResponseHeaders: http.Header{}, Timestamp: time.Now()}) + + entries, err := store.Search(SearchParams{Method: "POST"}) + if err != nil { + t.Fatalf("searching: %v", err) + } + if len(entries) != 1 { + t.Fatalf("got %d entries, want 1", len(entries)) + } + if entries[0].Method != "POST" { + t.Errorf("method = %q, want POST", entries[0].Method) + } +} + +func TestSearchByDomain(t *testing.T) { + store := testStore(t) + + store.Save(&Entry{Method: "GET", Scheme: "https", Host: "api.acme.com", Path: "/", RequestHeaders: http.Header{}, ResponseHeaders: http.Header{}, Timestamp: time.Now()}) + store.Save(&Entry{Method: "GET", Scheme: "https", Host: "acme.com", Path: "/", RequestHeaders: http.Header{}, ResponseHeaders: http.Header{}, Timestamp: time.Now()}) + store.Save(&Entry{Method: "GET", Scheme: "https", Host: "other.com", Path: "/", RequestHeaders: http.Header{}, ResponseHeaders: http.Header{}, Timestamp: time.Now()}) + + entries, err := store.Search(SearchParams{Domains: []string{"acme.com"}}) + if err != nil { + t.Fatalf("searching: %v", err) + } + if len(entries) != 2 { + t.Errorf("got %d entries, want 2", len(entries)) + } +} + +func TestSearchByWildcardHost(t *testing.T) { + store := testStore(t) + + store.Save(&Entry{Method: "GET", Scheme: "https", Host: "api.acme.com", Path: "/", RequestHeaders: http.Header{}, ResponseHeaders: http.Header{}, Timestamp: time.Now()}) + store.Save(&Entry{Method: "GET", Scheme: "https", Host: "web.acme.com", Path: "/", RequestHeaders: http.Header{}, ResponseHeaders: http.Header{}, Timestamp: time.Now()}) + store.Save(&Entry{Method: "GET", Scheme: "https", Host: "other.com", Path: "/", RequestHeaders: http.Header{}, ResponseHeaders: http.Header{}, Timestamp: time.Now()}) + + entries, err := store.Search(SearchParams{Host: "*.acme.com"}) + if err != nil { + t.Fatalf("searching: %v", err) + } + if len(entries) != 2 { + t.Errorf("got %d entries, want 2", len(entries)) + } +} + +func TestSearchByStatus(t *testing.T) { + store := testStore(t) + + store.Save(&Entry{Method: "GET", Scheme: "https", Host: "a.com", Path: "/", StatusCode: 200, RequestHeaders: http.Header{}, ResponseHeaders: http.Header{}, Timestamp: time.Now()}) + store.Save(&Entry{Method: "GET", Scheme: "https", Host: "a.com", Path: "/err", StatusCode: 500, RequestHeaders: http.Header{}, ResponseHeaders: http.Header{}, Timestamp: time.Now()}) + + entries, err := store.Search(SearchParams{Status: 500}) + if err != nil { + t.Fatalf("searching: %v", err) + } + if len(entries) != 1 { + t.Fatalf("got %d entries, want 1", len(entries)) + } + if entries[0].StatusCode != 500 { + t.Errorf("status = %d, want 500", entries[0].StatusCode) + } +} + +func TestCertGeneration(t *testing.T) { + dir := t.TempDir() + + // Test by directly importing proxy package cert generation + // This just tests that the store works with the temp directory + dbPath := filepath.Join(dir, "test.db") + store, err := NewSQLiteStore(dbPath) + if err != nil { + t.Fatalf("creating store: %v", err) + } + store.Close() + + // Verify file was created + if _, err := os.Stat(dbPath); os.IsNotExist(err) { + t.Error("database file was not created") + } +} diff --git a/internal/storage/store.go b/internal/storage/store.go new file mode 100644 index 00000000..1d40d753 --- /dev/null +++ b/internal/storage/store.go @@ -0,0 +1,11 @@ +package storage + +type Store interface { + Save(entry *Entry) error + Get(id int64) (*Entry, error) + List(limit, offset int) ([]*Entry, error) + ListAfter(afterID int64, limit int) ([]*Entry, error) + Search(params SearchParams) ([]*Entry, error) + Clear() error + Close() error +} diff --git a/internal/tools/agent/agent.go b/internal/tools/agent/agent.go deleted file mode 100644 index 7bfb56c0..00000000 --- a/internal/tools/agent/agent.go +++ /dev/null @@ -1,368 +0,0 @@ -package agent - -import ( - "context" - "encoding/json" - "fmt" - "log/slog" - "os" - "sync" - "time" - - "github.com/ghostsecurity/reaper/internal/database/models" - "github.com/ghostsecurity/reaper/internal/handlers/websocket" - "github.com/ghostsecurity/reaper/internal/tools/fuzz" - "github.com/ghostsecurity/reaper/internal/types" - "github.com/gofiber/fiber/v2" - "github.com/instructor-ai/instructor-go/pkg/instructor" - "github.com/sashabaranov/go-openai" - "gorm.io/gorm" -) - -var ( - activeSessions = make(map[uint]*types.AgentSession) - mutex = &sync.Mutex{} -) - -// AgentManager allows agents to send messages to the chat -type AgentManager struct { - Ctx *fiber.Ctx - Pool *websocket.Pool - DB *gorm.DB - SessionID uint - Author uint - AuthorRole types.UserRole - Prompt string -} - -type Attack struct { - AttackName string `json:"attack_name" jsonschema:"title=the attack name,default=BOLA,description=The name of the attack,enum=BOLA,example=BOLA"` - Domain string `json:"domain" jsonschema:"title=the domain,default=ghostbank.net,description=The domain of the attack,example=ghostbank.net"` - Report bool `json:"report" jsonschema:"title=the report,default=true,description=Should a report be generated?,example=true,example=false"` -} - -type WorstKey struct { - Name string `json:"name" jsonschema:"title=key name,description=The key to focus on in the fuzz attack"` -} - -type Report struct { - Content string `json:"content" jsonschema:"title=the content,description=The content of the report in markdown as a string"` -} - -// NOTE: This is an experimental AI Agent -// This agent is attempting to demonstrate tool usage by GPT4x models -// and report writing. This is not a production-ready agent and should -// not be considered secure or reliable for any purpose. -func (manager *AgentManager) StartAgent() { - // Ensure only one agent is running at a time for a session - mutex.Lock() - defer mutex.Unlock() - - if _, exists := activeSessions[manager.SessionID]; !exists { - activeSessions[manager.SessionID] = &types.AgentSession{ - ID: manager.SessionID, - CreatedAt: time.Now(), - UpdatedAt: time.Now(), - Status: "active", - } - go manager.runAgent() - } else { - fmt.Printf("[***] agent session %d already running\n", manager.SessionID) - manager.sendAgentMessage("Agent session already running. Please wait until it completes.") - } -} - -func (manager *AgentManager) sendAgentMessage(content string) { - message := models.AgentSessionMessage{ - AuthorID: manager.Author, - AuthorRole: manager.AuthorRole, - AgentSessionID: uint(manager.SessionID), - Content: content, - } - - resp := manager.DB.Create(&message) - if resp.Error != nil { - fmt.Printf("Error saving agent message: %v\n", resp.Error) - } - - msg := &types.AgentSessionMessage{ - Type: types.MessageTypeAgentSessionMessage, - AuthorID: manager.Author, - AuthorRole: manager.AuthorRole, - SessionID: uint(manager.SessionID), - Content: content, - } - - manager.Pool.Broadcast <- msg -} - -func process_prompt(prompt string) Attack { - ctx := context.Background() - - client := instructor.FromOpenAI( - openai.NewClient(os.Getenv("OPENAI_API_KEY")), - instructor.WithMode(instructor.ModeJSONSchema), - instructor.WithMaxRetries(3), - ) - - var attack Attack - resp, err := client.CreateChatCompletion( - ctx, - openai.ChatCompletionRequest{ - Model: openai.GPT4oMini, - Messages: []openai.ChatCompletionMessage{ - { - Role: openai.ChatMessageRoleUser, - Content: prompt, - }, - }, - }, - &attack, - ) - _ = resp - if err != nil { - panic(err) - } - - fmt.Printf("Model returned Attack Name: %s, Domain: %s, Report: %t\n", attack.AttackName, attack.Domain, attack.Report) - - return attack -} - -func generate_report_content(function_model Attack, findings []models.FuzzResult) string { - ctx := context.Background() - - client := instructor.FromOpenAI( - openai.NewClient(os.Getenv("OPENAI_API_KEY")), - instructor.WithMode(instructor.ModeJSONSchema), - instructor.WithMaxRetries(3), - ) - system_prompt := "You are an expert web application security analyst/engineer who has just run a sophisticated attack against an application to validate that a broken object level access (BOLA) flaw exists in a web app. Your job is to strike a balance between ease of understanding and technical accuracy when writing up this report. Do NOT hallicinate or make up anything that you can't derive from the results presented in this prompt. You want to impress the reader with prose that is concise and clear." - - user_prompt := "I have provided you with a JSON array of approx 20 results from a successful broken object level access (BOLA) attack. The results are in this code block:\n\n" - jsonData, err := json.MarshalIndent(findings, "", " ") - if err != nil { - fmt.Printf("Error marshaling JSON: %v", err) - return "" - } - jsonStr := string(jsonData) - user_prompt += fmt.Sprintf("The domain scanned was: %s\n", function_model.Domain) - user_prompt += "```\n" - user_prompt += jsonStr - user_prompt += "```\n\n" - - user_prompt += "I want you to write a 2-3 page technical write-up formatted in markdown with sections like summary, date/time, an explanation of what a BOLA attack is, an detailed explanation of what happened with these 20 requests, and what should be done to fix/remediate the vulnerability (including what types of things to fix in code and what might be done with a web application firewall).\n\n" - user_prompt += "The following sections and descriptions are desired.\n\n" - user_prompt += "- **Title** - A short but useful title of the report\n" - user_prompt += "- **Executive Summary** - Short description of the attack, what the attack is, and its characteristics that summarizes the risk and impact and what the successful attack was able to do.\n" - user_prompt += "- **Detailed Explanation** - In this section, provides a technical Requests/Response Analysis\n" - user_prompt += "- **Remediation Guidance** - What to fix in code/logic, web application firewalls/waf, or other mitigations.\n\n" - - user_prompt += "Your response will be in markdown format only with no extra explanation or messages to me. Only the report content should be returned. Be sure to have two newlines before code blocks and lists.\n\n" - user_prompt += "Ensure that code block start and end markers are on their own lines.\n\n" - user_prompt += "Do not include a full listing of the requests/responses in the output. I will add them myself.\n" - - fmt.Printf("System Prompt: %s\n", system_prompt) - fmt.Printf("User Prompt: %s\n", user_prompt) - - var report Report - resp, err := client.CreateChatCompletion( - ctx, - openai.ChatCompletionRequest{ - Model: openai.GPT4Turbo, - Messages: []openai.ChatCompletionMessage{ - { - Role: openai.ChatMessageRoleSystem, - Content: system_prompt, - }, - { - Role: openai.ChatMessageRoleUser, - Content: user_prompt, - }, - }, - }, - &report, - ) - _ = resp - // fmt.Printf("Model returned resp: %v\n", resp) - if err != nil { - panic(err) - } - // fmt.Printf("Model returned Report: %s\n", report.Content) - content := report.Content - - content += "\n\n# Appendix\n\n" - content += "The Request/Response Listing:\n\n" - for _, finding := range findings { - content += "```\n" - content += "# Request\n" - content += fmt.Sprintf("%s\n\n", finding.Request) - content += "# Response\n" - content += fmt.Sprintf("%s\n\n", finding.Response) - content += "```\n\n" - } - - return content -} - -func excludedFuzzKeys(request models.Request) []string { - // Extract the keys from the body - ctx := context.Background() - - client := instructor.FromOpenAI( - openai.NewClient(os.Getenv("OPENAI_API_KEY")), - instructor.WithMode(instructor.ModeJSONSchema), - instructor.WithMaxRetries(3), - ) - - prompt := fmt.Sprintf("The post body from a valid %s API request to host: %s with content-type %s is %v\n\nThe headers are %v\n\n Return the body key name that would be most dangerous/impactful in terms of a succesful BOLA/IDOR fuzzing attack that would likely cause the most impact.", request.Method, request.Host, request.ContentType, request.Body, request.Headers) - var dangerousKey WorstKey - resp, err := client.CreateChatCompletion( - ctx, - openai.ChatCompletionRequest{ - Model: openai.GPT4oMini, - Messages: []openai.ChatCompletionMessage{ - { - Role: openai.ChatMessageRoleUser, - Content: prompt, - }, - }, - }, - &dangerousKey, - ) - _ = resp - if err != nil { - panic(err) - } - fmt.Printf("Model returned key to fuzz: %v\n", dangerousKey.Name) - - // Get the keys from the body - var postbody map[string]interface{} - fmt.Printf("body: %v\n", request.Body) - if err := json.Unmarshal([]byte(request.Body), &postbody); err != nil { - fmt.Printf("failed to parse body keys: %v", err) - return []string{} - } - fmt.Printf("Post body: %v\n", postbody) - - // Remove the most dangerous key from the list - var keys []string - for key := range postbody { - if key != dangerousKey.Name { - keys = append(keys, key) - } - } - - return keys -} - -// runAgent performs the agent's tasks -func (manager *AgentManager) runAgent() { - defer stopAgent(manager.SessionID) - - // Agent logic goes here - if os.Getenv("OPENAI_API_KEY") == "" { - fmt.Println("[***] OPENAI_API_KEY not set") - manager.sendAgentMessage("OPENAI_API_KEY not set as an environment variable") - return - } - - // process the chat message prompt from the user into a structured model so we can determine the attack type, - // the domain to run the attack on, and whether to generate a report - manager.sendAgentMessage("Processing prompt...") - function_model := process_prompt(manager.Prompt) - manager.sendAgentMessage("Determining attack to run...") - - if function_model.AttackName == "BOLA" { - content := fmt.Sprintf("Running %s attack on %s and generating a report: %t", function_model.AttackName, function_model.Domain, function_model.Report) - manager.sendAgentMessage(content) - - manager.sendAgentMessage("Fetching potential endpoints...") - // Fetch the requests in the domain with the POST method and application/json content type - var requests []models.Request - var target_request models.Request - - result := manager.DB.Where("host LIKE ? AND method = ? AND content_type = ?", "%"+function_model.Domain, "POST", "application/json").Order("created_at DESC").Find(&requests) - if result.Error != nil { - manager.sendAgentMessage("Sorry, no potential endpoints found.") - return - } - if len(requests) > 0 { - target_request = requests[0] - manager.sendAgentMessage("Susceptible endpoint found!") - } else { - manager.sendAgentMessage("Sorry, no potential endpoints found.") - return - } - fmt.Printf("[***] Targeting endpoint %d\n", target_request.ID) - - // Ask the model for the attack parameters for the request - excludedKeys := excludedFuzzKeys(target_request) - fmt.Printf("[***] Excluded keys: %v\n", excludedKeys) - time.Sleep(8 * time.Second) - - // Run the BOLA attack - manager.sendAgentMessage("Running the attack...") - // TODO: get the attack id - err := fuzz.CreateAttack(0, function_model.Domain, excludedKeys, manager.Pool, manager.DB, 0, 0, 0) - if err != nil { - slog.Error("Failed to create fuzz attack", "error", err) - } - manager.sendAgentMessage("Attack completed successfully") - - // Fetch the findings - manager.sendAgentMessage("Fetching attack findings...") - var findings []models.FuzzResult - findingsResults := manager.DB.Where("hostname = ?", target_request.Host).Order("created_at DESC").Limit(5).Find(&findings) - if findingsResults.Error != nil { - fmt.Printf("[***] Error fetching attack findings: %v\n", findingsResults.Error) - manager.sendAgentMessage("Error fetching findings.") - return - } - if len(findings) == 0 { - fmt.Printf("[***] No findings found.\n") - manager.sendAgentMessage("Sorry, no findings found.") - return - } - fmt.Printf("Findings result %v\n", findingsResults) - - // Generate a report - if function_model.Report { - manager.sendAgentMessage("Generating attack analysis report. This may take some time to process..") - report_content := generate_report_content(function_model, findings) - - manager.sendAgentMessage("Saving the report...") - report := models.Report{ - Domain: function_model.Domain, - Markdown: report_content, - } - resp := manager.DB.Create(&report) - if resp.Error != nil { - fmt.Printf("Error saving report: %v\n", resp.Error) - manager.sendAgentMessage("Error saving report") - return - } - manager.sendAgentMessage("Report saved successfully") - } else { - // No report requested - manager.sendAgentMessage("No findings or report generation was not requested") - } - manager.sendAgentMessage("Done.") - } else { - // Attack not supported - msg := fmt.Sprintf("Attack not supported: %s", function_model.AttackName) - manager.sendAgentMessage(msg) - } -} - -// stopAgent cleans up the session -func stopAgent(sessionID uint) { - mutex.Lock() - defer mutex.Unlock() - - if session, exists := activeSessions[sessionID]; exists { - session.UpdatedAt = time.Now() - session.Status = "stopped" - delete(activeSessions, sessionID) - } -} diff --git a/internal/tools/fuzz/simple_fuzzer_example.go b/internal/tools/fuzz/simple_fuzzer_example.go deleted file mode 100644 index 58cb59b1..00000000 --- a/internal/tools/fuzz/simple_fuzzer_example.go +++ /dev/null @@ -1,248 +0,0 @@ -package fuzz - -import ( - "encoding/json" - "fmt" - "io" - "log/slog" - "net/http" - "slices" - "strings" - "sync" - "sync/atomic" - "time" - - "gorm.io/gorm" - - "github.com/ghostsecurity/reaper/internal/database/models" - "github.com/ghostsecurity/reaper/internal/handlers/websocket" - "github.com/ghostsecurity/reaper/internal/types" -) - -const ( - // maxWorkers = 50 - maxWorkers = 2 - defaultMin = 100 - defaultMax = 1000 - defaultMaxSuccess = 5 - defaultPauseMs = 10 - minSuccessCount = 3 - // TODO: input params - // - fuzz type (header, body, param) - // - fuzz value type (int, string, uuid) - // - fuzz value range (int) (min, max) - // - fuzz value format (json, urlencoded, form/string) - // - fuzz success response codes - // TODO: add rate limit -) - -func CreateAttack(attackID uint, hostname string, params []string, ws *websocket.Pool, db *gorm.DB, min, max, maxSuccess int) error { - slog.Info("Creating fuzz attack") - - // Defaults - if min <= 0 { - min = defaultMin - } - if max <= 0 { - max = defaultMax - } - if maxSuccess == 0 { - maxSuccess = defaultMaxSuccess - } - - // Min must be less than or equal to max - if min > max { - min, max = max, min - } - - req := models.Request{ - Method: http.MethodPost, - } - - // Get most recent POST request for the endpoint - res := db.Where(&req). - Where("host LIKE ?", "%"+hostname+"%"). - Where("method = ?", req.Method). - Order("created_at DESC"). - First(&req) - - if res.Error != nil { - return fmt.Errorf("failed to find POST request for hostname %s: %w", hostname, res.Error) - } - - slog.Info("Found request for fuzzing", "id", req.ID, "url", req.URL) - - // Parse body keys from the original request, so we can fuzz the ones requested by the user - var bodyKeys map[string]interface{} - if err := json.Unmarshal([]byte(req.Body), &bodyKeys); err != nil { - return fmt.Errorf("failed to parse body keys: %w", err) - } - - // limit concurrent workers - var wg sync.WaitGroup - semaphore := make(chan struct{}, maxWorkers) - - var totalCount, successCount int32 - var activeWorkers int32 - - done := make(chan struct{}) - var once sync.Once - - // worker - runWorker := func(key string, value int) { - defer wg.Done() - defer atomic.AddInt32(&activeWorkers, -1) - defer func() { <-semaphore }() - - fuzzedReq := createFuzzedRequest(&req, key, value) - status, err := sendRequest(fuzzedReq, ws, db, attackID) - if err != nil { - slog.Error("Failed to send fuzzed request", "error", err) - } else { - atomic.AddInt32(&totalCount, 1) - if status >= http.StatusOK && status < http.StatusMultipleChoices { - slog.Info("Successful result", "key", key, "value", value) - newCount := atomic.AddInt32(&successCount, 1) - if int(newCount) >= maxSuccess { - slog.Info("Max success count reached", "count", maxSuccess, "requests", totalCount) - once.Do(func() { - close(done) - }) - } - } - } - time.Sleep(defaultPauseMs * time.Millisecond) - } - - // Launch workers -workerLoop: - for key := range bodyKeys { - if !slices.Contains(params, key) { - continue - } - for i := min; i <= max; i++ { - select { - case <-done: - break workerLoop - default: - wg.Add(1) - semaphore <- struct{}{} - atomic.AddInt32(&activeWorkers, 1) - go runWorker(key, i) - } - } - } - - // Wait for active workers to complete - wg.Wait() - - attack := models.FuzzAttack{} - db.First(&attack, attackID) - if successCount > minSuccessCount { - attack.Status = "success" - } else { - attack.Status = "completed" - } - db.Save(&attack) - - msg := &types.AttackCompleteMessage{ - Type: types.MessageTypeAttackComplete, - } - ws.Broadcast <- msg - - slog.Info("Fuzz attack completed", "status", attack.Status, "successCount", successCount, "totalCount", totalCount) - return nil -} - -func createFuzzedRequest(originalReq *models.Request, key string, value int) *http.Request { - // Parse the original body - var body map[string]interface{} - err := json.Unmarshal([]byte(originalReq.Body), &body) - if err != nil { - slog.Error("Failed to parse body", "error", err) - } - - // Update the specified key with the fuzzed value - body[key] = value - - // Convert the updated body back to JSON - fuzzedBody, _ := json.Marshal(body) - - // Create a new http.Request - req, _ := http.NewRequest(originalReq.Method, originalReq.URL, strings.NewReader(string(fuzzedBody))) - - // Re-set headers from original request - headerLines := strings.Split(originalReq.Headers, "\n") - for _, line := range headerLines { - if line = strings.TrimSpace(line); line != "" { - parts := strings.SplitN(line, ":", 2) - if len(parts) == 2 { - headerKey := strings.TrimSpace(parts[0]) - headerValue := strings.TrimSpace(parts[1]) - req.Header.Add(headerKey, headerValue) - } - } - } - - // Update Content-Length header - req.Header.Set("Content-Length", fmt.Sprintf("%d", len(fuzzedBody))) - - return req -} - -func sendRequest(req *http.Request, ws *websocket.Pool, db *gorm.DB, attackID uint) (status int, err error) { - client := &http.Client{} - resp, err := client.Do(req) - if err != nil { - return 0, fmt.Errorf("failed to send request: %w", err) - } - defer resp.Body.Close() - - // early return if not successful - if resp.StatusCode < http.StatusOK || resp.StatusCode >= http.StatusMultipleChoices { - return resp.StatusCode, nil - } - - requestHeaders := "" - for key, value := range req.Header { - requestHeaders += fmt.Sprintf("%s: %s\n", key, strings.Join(value, ",")) - } - - r, _ := req.GetBody() - requestBody, _ := io.ReadAll(r) - responseBody, _ := io.ReadAll(resp.Body) - - m := &types.AttackResultMessage{ - Type: types.MessageTypeAttackResult, - Hostname: req.Host, - Port: req.URL.Port(), - Scheme: req.URL.Scheme, - URL: req.URL.String(), - Endpoint: req.URL.Path, - Request: "saved in db", - Response: "saved in db", - IpAddress: req.RemoteAddr, - Timestamp: time.Now(), - } - ws.Broadcast <- m - - // Create a FuzzResult and save it to the database - fuzzResult := &models.FuzzResult{ - FuzzAttackID: attackID, - Hostname: req.URL.Hostname(), - IpAddress: req.RemoteAddr, - Port: req.URL.Port(), - Scheme: req.URL.Scheme, - URL: req.URL.String(), - Endpoint: req.URL.Path, - Request: string(requestHeaders) + "\n" + string(requestBody), - Response: string(responseBody), - StatusCode: resp.StatusCode, - } - res := db.Create(fuzzResult) - if res.Error != nil { - slog.Error("Failed to save fuzz result", "error", res.Error) - } - - return resp.StatusCode, nil -} diff --git a/internal/tools/proxy/cert.go b/internal/tools/proxy/cert.go deleted file mode 100644 index 008f9b21..00000000 --- a/internal/tools/proxy/cert.go +++ /dev/null @@ -1,82 +0,0 @@ -package proxy - -import ( - "crypto/tls" - "crypto/x509" - - "github.com/elazarl/goproxy" -) - -// Ghost Labs Reaper CA certificate (exp. 2030-Oct-20) -var caCert = []byte(`-----BEGIN CERTIFICATE----- -MIIENTCCAx2gAwIBAgIUDwdggwuOcbMyK6ftH/tM8Y3gsQgwDQYJKoZIhvcNAQEL -BQAwgakxCzAJBgNVBAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEPMA0GA1UEBwwGQXVz -dGluMR0wGwYDVQQKDBRHaG9zdCBTZWN1cml0eSwgSW5jLjETMBEGA1UECwwKR2hv -c3QgTGFiczEhMB8GA1UEAwwYcmVhcGVyLmdob3N0c2VjdXJpdHkuY29tMSIwIAYJ -KoZIhvcNAQkBFhNsYWJzQGdob3N0LnNlY3VyaXR5MB4XDTI1MTAyMTExMzYwMVoX -DTMwMTAyMDExMzYwMVowgakxCzAJBgNVBAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEP -MA0GA1UEBwwGQXVzdGluMR0wGwYDVQQKDBRHaG9zdCBTZWN1cml0eSwgSW5jLjET -MBEGA1UECwwKR2hvc3QgTGFiczEhMB8GA1UEAwwYcmVhcGVyLmdob3N0c2VjdXJp -dHkuY29tMSIwIAYJKoZIhvcNAQkBFhNsYWJzQGdob3N0LnNlY3VyaXR5MIIBIjAN -BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvXgOUfacFCgqBfEqyaBef75t5wQf -9Czur5z82iTIlbxw8+YgspyQE9+9v/NCnJ36lYirzT31OJ5fFbllSM9f3SfOYuZN -D4uBUfG9YHt7xU6KIyu2ClxvFJGQZtU+1BA4AmF/cNurj41SBQrDIjxb5gQVq9ZF -PgbviKXureVn8dpGzsICnqQPj1rng1p0FfibjzexLB0ye6UJLSnk3JGjXPgYQUgN -9lgaZ+fASdX3d/veWlh/mcufrKX+WN/X7rcCQlkSVhlO5GP0a2uIC4Rj//j1jUgT -k/mQbvFgN6/ixCV9LhCrtpmjLQZPOaZwc4aJjus6b/GUfrQgeDJjSIWb0wIDAQAB -o1MwUTAdBgNVHQ4EFgQUL48lnRsl0Zfeg+fwHd8cg6RXPoIwHwYDVR0jBBgwFoAU -L48lnRsl0Zfeg+fwHd8cg6RXPoIwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0B -AQsFAAOCAQEAn5zAPqldj148HoqYLwDDLDpkyt2I0473boLSj41iuc6nIokuzrQI -GIyq/lS3isvV7xisMMwLb+ON3/iqGhH7/QVJ69nM5NSvrtLLfy+tqsQjPRx/Gzo4 -91WlqwBd90Cj7SoYgGFdr9Tmx/YKGr+EgQfILYwepARRWqbSo50pYJ4Z039v8TDK -EiUQT9pu5aFmQXW8cCizMd4/HH8S/XSuSMabzdoYf5AkOg4tWzUf+MWZtb/FpW4h -8HYkgMSyYIW3/aT8Pv9Tlj5hsDbS753Y818tLH6VqsMni+YiHyS5ZqXnvT+wRGy6 -NEMKaF7lmehYmo7bRNOFNtFD3qj5ecN/8g== ------END CERTIFICATE-----`) - -// Ghost Labs Reaper CA key -var caKey = []byte(`-----BEGIN PRIVATE KEY----- -MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC9eA5R9pwUKCoF -8SrJoF5/vm3nBB/0LO6vnPzaJMiVvHDz5iCynJAT372/80KcnfqViKvNPfU4nl8V -uWVIz1/dJ85i5k0Pi4FR8b1ge3vFToojK7YKXG8UkZBm1T7UEDgCYX9w26uPjVIF -CsMiPFvmBBWr1kU+Bu+Ipe6t5Wfx2kbOwgKepA+PWueDWnQV+JuPN7EsHTJ7pQkt -KeTckaNc+BhBSA32WBpn58BJ1fd3+95aWH+Zy5+spf5Y39futwJCWRJWGU7kY/Rr -a4gLhGP/+PWNSBOT+ZBu8WA3r+LEJX0uEKu2maMtBk85pnBzhomO6zpv8ZR+tCB4 -MmNIhZvTAgMBAAECggEAClDOiso1U5L06Bo/fPclHf8QEcYI4qz4Q98gFH/F3K0u -rdYnjUH2muERfjFwPNcMbSF3T8yMnOFhMO1v+nJb+E5cr3LK2vVP/FZVPBBiZpWG -R4WaOt8vJxIJKCglFxEDqPww9EPph9PRwDeGn0cProAmGT3TIEjquBMSDIK90Y47 -qvlO2Vn7VrFTYOqU+eM9VrLOd8Wy2FPUUfO10GVRvN0ZErkndVjevenqyWdmH3qM -DaPk+wIqGqcsk/1aP/ty0FM0/u9ctIJ4GSkyEhn/i6ZPpGcKQ+edcSgKa1OotLMr -Q7KoPgvG51Wpcbr6VWaobe8fSYegQtorY6hl9kB8iQKBgQDcrCf5zuKM9fQvTPSO -GqCGDDyrkUdHP+CC2wr/3Ipb3k/WySb6H9UUysO1uJ+xaRVQA8HzqaieUO3nEJMk -M5tmoJo2ioTagYXMyq+7DkfUmVyzka4RHqOqDiI2kMMoO5XuUwMz+Y57Xz6VxVwP -uJ429jnqxNLVCqaL2yDLUPaLawKBgQDbzRUvtcjBOHYUeMoWNX2E2mp9lOSI20T2 -Zynyu1WgtYrbR9QCf9TjnzjSNkXvqVUmQgZXZ0KBZrlalHZkmHDFxk9zXAOK4zth -X6nJtyXwFErs2ndL8RG9noL5uTz2MzFMhkdoEkafyku6aBlxXB7NNwTzW16FTh3Z -dC1Tnl7zOQKBgQCPS6el2wdYW7qWIJXJ1VaZ1UZsbqlnhf5HWu/4mACsiV807WhH -EfavSr/tuBbTAJbbX6VJkckyDQF/g07ZOj3WVcHuWuLMdUEqbA/TGwHf9zqwTJBJ -A6lpm0XyQuzHqnHA0d0JmitAx+d/ICqY9tyeeiO/5NG3j/P4a3IPNOL0QwKBgQCB -e2PCslTsNmWhE7MAuEwUClL3XdHvKTSL7yQQAPmlbay6Fqs3ObTgzng7pYs3bsph -ej2gGY1dC3WffZvtELxGVdeR/p97nvbpGuC7mq+3qUymEOB8FSw9RvajQ9M8udWN -3gCMt09xbEuGKTLry7e9bm71KVsaLnV5F25oNwB6SQKBgAgRQKRhNciBMKMOhVBN -NDGZVdWcsi4Fwk+wpEGYQwd9BJofaJBzAwyPyRYCfFVw1P+baAJBKMNKGrRA+bmT -Ot6KuVlU/CmVgwuo4Y0StrO2Gk1BRaK7nr6t22xwYnPJ0/w/UxpADhrLEdx1Y+Te -vmBKExBNiMt1S065MqQF/LMb ------END PRIVATE KEY-----`) - -func initializeCA() error { - goproxyCa, err := tls.X509KeyPair(caCert, caKey) - if err != nil { - return err - } - if goproxyCa.Leaf, err = x509.ParseCertificate(goproxyCa.Certificate[0]); err != nil { - return err - } - goproxy.GoproxyCa = goproxyCa - goproxy.OkConnect = &goproxy.ConnectAction{Action: goproxy.ConnectAccept, TLSConfig: goproxy.TLSConfigFromCA(&goproxyCa)} - goproxy.MitmConnect = &goproxy.ConnectAction{Action: goproxy.ConnectMitm, TLSConfig: goproxy.TLSConfigFromCA(&goproxyCa)} - goproxy.HTTPMitmConnect = &goproxy.ConnectAction{Action: goproxy.ConnectHTTPMitm, TLSConfig: goproxy.TLSConfigFromCA(&goproxyCa)} - goproxy.RejectConnect = &goproxy.ConnectAction{Action: goproxy.ConnectReject, TLSConfig: goproxy.TLSConfigFromCA(&goproxyCa)} - - return nil -} diff --git a/internal/tools/proxy/proxy.go b/internal/tools/proxy/proxy.go deleted file mode 100644 index ce1228e1..00000000 --- a/internal/tools/proxy/proxy.go +++ /dev/null @@ -1,262 +0,0 @@ -package proxy - -import ( - "bytes" - "encoding/json" - "fmt" - "io" - "log/slog" - "net/http" - "net/url" - "os" - "strings" - - "github.com/elazarl/goproxy" - "github.com/gofiber/fiber/v2" - "golang.org/x/exp/maps" - "gorm.io/gorm" - - "github.com/ghostsecurity/reaper/internal/database/models" - "github.com/ghostsecurity/reaper/internal/handlers/websocket" - "github.com/ghostsecurity/reaper/internal/service" - "github.com/ghostsecurity/reaper/internal/types" -) - -type Proxy struct { - proxy *goproxy.ProxyHttpServer - pool *websocket.Pool - db *gorm.DB - shutdown chan struct{} -} - -func NewProxy(pool *websocket.Pool, db *gorm.DB) *Proxy { - p := goproxy.NewProxyHttpServer() - p.Verbose = true - return &Proxy{ - proxy: p, - pool: pool, - db: db, - shutdown: make(chan struct{}), - } -} - -// Start starts the proxy in the background -func (p *Proxy) Start() error { - host := os.Getenv("HOST") - port := os.Getenv("PROXY_PORT") - addr := fmt.Sprintf("%s:%s", host, port) - - slog.Info("Starting proxy", "address", addr) - - // TODO: clean this up - go func() { - server := &http.Server{Addr: addr, Handler: p.proxy} - go func() { - if err := server.ListenAndServe(); err != nil && err != http.ErrServerClosed { - slog.Error("Proxy server error", "error", err) - } - }() - - err := initializeCA() - if err != nil { - panic(err) - } - - // https CONNECT - p.proxy.OnRequest().HandleConnect(goproxy.AlwaysMitm) - - // request - p.proxy.OnRequest().DoFunc(p.httpRequestHandler) - - // response - p.proxy.OnResponse().DoFunc(p.httpResponseHandler) - - <-p.shutdown - if err := server.Close(); err != nil { - slog.Error("Error stopping proxy server", "error", err) - } - slog.Info("Proxy stopped") - }() - - return nil -} - -// Stop stops the proxy -func (p *Proxy) Stop() { - slog.Info("Stopping proxy") - close(p.shutdown) -} - -func (p *Proxy) httpRequestHandler(req *http.Request, ctx *goproxy.ProxyCtx) (*http.Request, *http.Response) { - uri := req.URL - slog.Info("Proxy HTTP request", "remote", uri) - - // save req to db - r, err := p.saveReq(req, ctx) - if err != nil { - slog.Error("could not save request to db", "error", err.Error()) - } - - m := &types.ProxyMessage{ - Type: types.MessageTypeExploreRequest, - Host: uri.Hostname(), - Path: uri.Path, - } - - p.pool.Broadcast <- m - - return r, nil -} - -func (p *Proxy) httpResponseHandler(resp *http.Response, ctx *goproxy.ProxyCtx) *http.Response { - slog.Info("Proxy HTTP response", "remote", resp.Request.RemoteAddr) - - m := &types.ProxyMessage{ - Type: types.MessageTypeExploreResponse, - Host: resp.Request.URL.Hostname(), - Method: resp.Request.Method, - Path: resp.Request.URL.Path, - Status: resp.StatusCode, - } - - p.pool.Broadcast <- m - - // save resp to db - r, err := p.saveResp(resp, ctx) - if err != nil { - slog.Error("could not save response to db", "error", err.Error()) - } - - return r -} - -// saveReq saves the request to the database, saves the request ID to the context, and returns the original request -func (p *Proxy) saveReq(req *http.Request, ctx *goproxy.ProxyCtx) (*http.Request, error) { - requestBody, err := io.ReadAll(req.Body) - if err != nil { - slog.Error("[proxy req handler]", "msg", "error reading request body", "error", err) - return nil, err - } - - bodyParams := bodyKeysToString(requestBody) - - request := models.Request{ - Source: types.RequestSourceProxy, - Method: req.Method, - Host: req.Host, - URL: req.URL.String(), - Headers: headersToString(req.Header), - Proto: req.Proto, - ProtoMajor: req.ProtoMajor, - ProtoMinor: req.ProtoMinor, - ContentType: req.Header.Get("Content-Type"), - ContentLength: req.ContentLength, - HeaderKeys: keysToString(req.Header), - ParamKeys: paramKeysToString(req.URL.Query()), - BodyKeys: bodyParams, - Body: string(requestBody), - } - - result := p.db.Create(&request) - if result.Error != nil { - slog.Error("[proxy req handler]", "msg", "error writing request to db", "error", result.Error) - } - - // save request ID to ctx - ctx.UserData = request.ID - - // replace the original request body - req.Body = io.NopCloser(bytes.NewBuffer(requestBody)) - - // we need the request body params to create/update the endpoint - _, err = service.CreateOrUpdateEndpoint(p.db, service.EndpointInput{ - Hostname: req.URL.Hostname(), - Path: req.URL.Path, - Method: req.Method, - Params: bodyParams, - }) - if err != nil { - slog.Error("[proxy req handler]", "msg", "error creating endpoint", "error", err) - } - - return req, nil -} - -// saveResp saves the response to the database, along with the request ID from the context, and returns the original response -func (p *Proxy) saveResp(resp *http.Response, ctx *goproxy.ProxyCtx) (*http.Response, error) { - responseBody, err := io.ReadAll(resp.Body) - if err != nil { - slog.Error("[proxy resp handler]", "msg", "error reading response body", "error", err) - return nil, err - } - - // only save if the response is json - body := `not saved` - json := strings.Contains(resp.Header.Get(fiber.HeaderContentType), fiber.MIMEApplicationJSON) - if json { - body = string(responseBody) - } - - response := models.Response{ - RequestID: ctx.UserData.(uint), // link to request - Status: resp.Status, - StatusCode: resp.StatusCode, - ContentType: resp.Header.Get(fiber.HeaderContentType), - ContentLength: resp.ContentLength, - Headers: headersToString(resp.Header), - Body: body, - } - - result := p.db.Create(&response) - if result.Error != nil { - slog.Error("[proxy resp handler]", "msg", "error writing response to db", "error", result.Error) - } - - // Replace the original response body - resp.Body = io.NopCloser(bytes.NewBuffer(responseBody)) - - return resp, nil -} - -// headersToString converts a map of headers to a newline delimited string -func headersToString(headers http.Header) string { - var sb strings.Builder - for key, values := range headers { - for _, value := range values { - sb.WriteString(fmt.Sprintf("%s: %s\n", key, value)) - } - } - return sb.String() -} - -// keysToString converts a map of headers to a comma-separated string of the header keys -func keysToString(headers http.Header) string { - var slice []string - for key := range headers { - slice = append(slice, key) - } - return strings.Join(slice, ",") -} - -// paramKeysToString converts a map of URL values (query params) to a comma-separated string of the keys -func paramKeysToString(values url.Values) string { - var slice []string - for key := range values { - slice = append(slice, key) - } - return strings.Join(slice, ",") -} - -// bodyKeysToString converts a JSON body to a comma-separated string of the keys -func bodyKeysToString(body []byte) string { - if len(body) == 0 { - return "" - } - var m map[string]interface{} - err := json.Unmarshal(body, &m) - if err != nil { - slog.Error("[proxy body keys]", "msg", "error unmarshalling body", "error", err) - return "" - } - return strings.Join(maps.Keys(m), ",") -} diff --git a/internal/tools/replay/replay.go b/internal/tools/replay/replay.go deleted file mode 100644 index 03decb40..00000000 --- a/internal/tools/replay/replay.go +++ /dev/null @@ -1,86 +0,0 @@ -package replay - -import ( - "bytes" - "context" - "io" - "net/http" - "strings" - "time" - - "github.com/ghostsecurity/reaper/internal/types" -) - -func Do(ctx context.Context, req *types.ReplayInput) (*types.ReplayResponse, error) { - var request *http.Request - var body io.Reader - - // setup HTTP client with a sensible timeout - t := http.DefaultTransport.(*http.Transport).Clone() - client := &http.Client{ - // TODO: make timeout configurable - Timeout: 2 * time.Second, - Transport: t, - } - - if req.Body != "" { - body = bytes.NewBufferString(req.Body) - } - - // new request - request, err := http.NewRequest(req.Method, req.URL, body) - if err != nil { - return nil, err - } - - // set headers - for key, value := range parseHeaderText(req.Headers) { - request.Header.Set(key, value) - } - - // send the request - resp, err := client.Do(request) - if err != nil { - return nil, err - } - responseBody, _ := io.ReadAll(resp.Body) - defer resp.Body.Close() - - replayResponse := types.ReplayResponse{ - Status: resp.Status, - StatusCode: resp.StatusCode, - Headers: resp.Header, - Body: responseBody, - } - - return &replayResponse, nil -} - -// parseHeaderText parses a newline delimited header string into a map -func parseHeaderText(header string) map[string]string { - m := make(map[string]string) - headers := strings.Split(header, "\n") - - for _, h := range headers { - parts := strings.SplitN(h, ":", 2) - if len(parts) == 2 { - key := strings.Trim(parts[0], " ") // header key - value := strings.Trim(parts[1], " ") // header value - if !shouldIgnoreHeader(key, value) { - m[key] = value - } - } - } - - return m -} - -func shouldIgnoreHeader(key, val string) bool { - // ignore connection: keep-alive - // we can't re-use a connection for a replay - if strings.ToLower(key) == "connection" && strings.ToLower(val) == "keep-alive" { - return true - } - - return false -} diff --git a/internal/tools/scan/httpx.go b/internal/tools/scan/httpx.go deleted file mode 100644 index 98662387..00000000 --- a/internal/tools/scan/httpx.go +++ /dev/null @@ -1,99 +0,0 @@ -package scan - -import ( - "log" - "log/slog" - "strings" - "time" - - "github.com/projectdiscovery/goflags" - "github.com/projectdiscovery/httpx/runner" - "gorm.io/gorm" - - "github.com/ghostsecurity/reaper/internal/database/models" - "github.com/ghostsecurity/reaper/internal/handlers/websocket" - "github.com/ghostsecurity/reaper/internal/types" -) - -func ProbeHosts(domain *models.Domain, hosts []string, db *gorm.DB, ws *websocket.Pool) { - // status - if domain != nil { - slog.Info("[httpx]", "message", "probing hosts", "domain", domain.Name, "hosts", len(hosts)) - domain.Status = types.DomainStatusProbing - db.Save(domain) - domain.BroadcastSync(ws) - } - - // run httpx - options := runner.Options{ - DisableStdin: true, // Running as a server, no stdin - Methods: "GET", - InputTargetHost: goflags.StringSlice(hosts), - OnResult: func(r runner.Result) { - handleHttpxResult(r.Input, r, db, ws) - }, - FollowRedirects: true, - MaxRedirects: 5, - Timeout: 10, - } - - if err := options.ValidateOptions(); err != nil { - slog.Error("[httpx]", "message", "invalid httpx options", "error", err) - return - } - - httpxRunner, err := runner.New(&options) - if err != nil { - log.Fatal(err) - } - defer httpxRunner.Close() - - httpxRunner.RunEnumeration() - - if domain != nil { - t := time.Now() - domain.Status = "completed" - domain.LastScannedAt = &t - db.Save(domain) - domain.BroadcastSync(ws) - } -} - -func handleHttpxResult(host string, r runner.Result, db *gorm.DB, ws *websocket.Pool) { - // DEBUG full detail - // slog.Info("[httpx]", "message", "httpx result", "host", host, "result", r) - // DEBUG just the host - slog.Info("[httpx]", "message", "httpx result", "host", host) - - if r.Err != nil { - slog.Error("[httpx]", "message", "httpx error", "host", host, "error", r.Err) - return - } - - if ws == nil { - slog.Error("[httpx]", "message", "no websocket pool available", "host", host) - return - } - - if db == nil { - slog.Error("[httpx]", "message", "no database connection available", "host", host) - return - } - - h := models.Host{ - Name: host, - Status: "live", - StatusCode: r.StatusCode, - Scheme: r.Scheme, - ContentType: r.ContentType, - CDNName: r.CDNName, - CDNType: r.CDNType, - Webserver: r.WebServer, - Tech: strings.Join(r.Technologies, "|"), - } - - res := db.Model(&h).Where(&models.Host{Name: host}).Updates(h) - if res.Error != nil { - slog.Error("[httpx]", "message", "failed to update host", "host", host, "error", res.Error) - } -} diff --git a/internal/tools/scan/scan.go b/internal/tools/scan/scan.go deleted file mode 100644 index 5af95d53..00000000 --- a/internal/tools/scan/scan.go +++ /dev/null @@ -1,32 +0,0 @@ -package scan - -import ( - "errors" - "log/slog" - - "gorm.io/gorm" - - "github.com/ghostsecurity/reaper/internal/database/models" -) - -// updateDomainHostCount updates the host count for a domain -func updateDomainHostCount(domain *models.Domain, db *gorm.DB) error { - res := db.First(&domain) - if res.RowsAffected == 0 { - slog.Error("[subfinder]", "message", "failed to update domain host count", "domain", domain.Name, "error", "domain not found") - return errors.New("domain not found") - } - count := int64(0) - - resp := db. - Model(&models.Host{}). - Where(&models.Host{DomainID: domain.ID}). - Count(&count) - if resp.Error != nil { - slog.Error("[subfinder]", "message", "failed to update domain host count", "domain", domain.Name, "error", resp.Error) - return resp.Error - } - domain.HostCount = int(count) - db.Model(&domain).Updates(domain) - return nil -} diff --git a/internal/tools/scan/subfinder.go b/internal/tools/scan/subfinder.go deleted file mode 100644 index 1877622c..00000000 --- a/internal/tools/scan/subfinder.go +++ /dev/null @@ -1,94 +0,0 @@ -package scan - -import ( - "bytes" - "context" - "io" - "log/slog" - - "github.com/projectdiscovery/subfinder/v2/pkg/resolve" - "github.com/projectdiscovery/subfinder/v2/pkg/runner" - "gorm.io/gorm" - - "github.com/ghostsecurity/reaper/internal/database/models" - "github.com/ghostsecurity/reaper/internal/handlers/websocket" -) - -// FindSubdomains runs subfinder and passes the results to a callback function -func FindSubdomains(domain models.Domain, db *gorm.DB, ws *websocket.Pool) { - // status - slog.Info("[subfinder]", "message", "scanning domain", "domain", domain.Name) - domain.Status = "scanning" - db.Save(&domain) - domain.BroadcastSync(ws) - - results := []string{} - - // run subfinder - subfinderOpts := &runner.Options{ - Threads: 10, // Thread controls the number of threads to use for active enumerations - Timeout: 30, // Timeout is the seconds to wait for sources to respond - MaxEnumerationTime: 10, // MaxEnumerationTime is the maximum amount of time in mins to wait for enumeration - ResultCallback: func(result *resolve.HostEntry) { - handleSubdomainResult(domain, result, db, ws, &results) - }, - // ProviderConfig: "your_provider_config.yaml", - } - - subfinder, err := runner.NewRunner(subfinderOpts) - if err != nil { - slog.Error("[subfinder]", "message", "failed to create subfinder runner", "domain", domain.Name, "error", err) - return - } - - output := &bytes.Buffer{} - // To run subdomain enumeration on a single domain - if err = subfinder.EnumerateSingleDomainWithCtx(context.Background(), domain.Name, []io.Writer{output}); err != nil { - slog.Error("[subfinder]", "message", "failed to enumerate domain", "domain", domain.Name, "error", err) - return - } - - err = updateDomainHostCount(&domain, db) - if err != nil { - slog.Error("[subfinder]", "message", "failed to update domain host count", "domain", domain.Name, "error", err) - return - } - - slog.Info("[subfinder]", "message", "probing hosts", "domain", domain.Name, "count", len(results)) - - ProbeHosts(&domain, results, db, ws) -} - -// handleSubdomainResult writes the subdomain result to the database and sends a broadcast websocket message -func handleSubdomainResult(domain models.Domain, result *resolve.HostEntry, db *gorm.DB, ws *websocket.Pool, results *[]string) { - slog.Info("[subfinder]", "message", "subdomain result", "result", result) - - *results = append(*results, result.Host) - - if ws == nil { - slog.Error("[subfinder]", "message", "no websocket pool available", "domain", domain.Name) - return - } - - if db == nil { - slog.Error("[subfinder]", "message", "no database connection available", "domain", domain.Name) - return - } - - host := models.Host{ - ProjectID: domain.ProjectID, - DomainID: domain.ID, - Name: result.Host, - Source: result.Source, - } - - res := db.Where(models.Host{ - ProjectID: host.ProjectID, - DomainID: host.DomainID, - Name: host.Name, - }).FirstOrCreate(&host) - if res.Error != nil { - slog.Error("[subfinder]", "message", "failed to create host", "error", res.Error) - return - } -} diff --git a/internal/tools/tunnel/tunnel.go b/internal/tools/tunnel/tunnel.go deleted file mode 100644 index 3a0e4abe..00000000 --- a/internal/tools/tunnel/tunnel.go +++ /dev/null @@ -1,90 +0,0 @@ -package tunnel - -import ( - "context" - "fmt" - "log/slog" - "net/url" - "os" - - "golang.ngrok.com/ngrok" - "golang.ngrok.com/ngrok/config" -) - -type Tunnel struct { - URL *string - Failed bool - shutdown chan struct{} -} - -func NewTunnel() *Tunnel { - return &Tunnel{ - shutdown: make(chan struct{}), - } -} - -func (t *Tunnel) Start() error { - slog.Info("Starting tunnel") - ctx := context.Background() - - // local listener - host := os.Getenv("HOST") - port := os.Getenv("PORT") - backend, _ := url.Parse(fmt.Sprintf("http://%s:%s", host, port)) - - slog.Info("Tunnel local listener", "backend", backend) - - go func() { - fwd, err := ngrok.ListenAndForward( - ctx, - backend, - config.HTTPEndpoint(), - // DEBUG - ngrok.WithLogger(&customLogger{logger: slog.New(slog.NewTextHandler(os.Stdout, nil))}), - ngrok.WithAuthtokenFromEnv(), - ) - if err != nil { - slog.Error("Error starting tunnel", "error", err) - return - } - - session := fwd.Session() - for _, v := range session.Warnings() { - slog.Warn("Tunnel warning", "warning", v) - } - - url := fwd.URL() - - if url == "" { - slog.Error("Tunnel could not be started") - t.Failed = true // tunnel failed to start - session.Close() - return - } - - slog.Info("Tunnel started", "url", url) - t.URL = &url - - <-t.shutdown - if err := session.Close(); err != nil { - slog.Error("Error stopping tunnel", "error", err) - } - slog.Info("Tunnel stopped") - }() - - return nil -} - -func (t *Tunnel) Stop() { - slog.Info("Stopping tunnel") - close(t.shutdown) -} - -type customLogger struct { - logger *slog.Logger -} - -func (l *customLogger) Log(ctx context.Context, level int, message string, data map[string]interface{}) { - // Implement logging logic here - l.logger.Log(ctx, slog.Level(level), message, "data", data) -} diff --git a/internal/types/message.go b/internal/types/message.go deleted file mode 100644 index 86d11023..00000000 --- a/internal/types/message.go +++ /dev/null @@ -1,169 +0,0 @@ -package types - -import ( - "time" -) - -type MessageType string - -const ( - MessageTypeExploreHost MessageType = "explore_host" - MessageTypeExploreEndpoint MessageType = "explore_endpoint" - MessageTypeScanDomain MessageType = "scan.domain" - MessageTypeScanDomainResult MessageType = "scan.domain.result" - MessageTypeScanSyncDomain MessageType = "scan.domain.sync" - MessageTypeNavigationFollow MessageType = "navigation.follow" - MessageTypeExploreRequest MessageType = "explore.request" - MessageTypeExploreResponse MessageType = "explore.response" - MessageTypeAttackResult MessageType = "attack.result" - MessageTypeAttackResultClear MessageType = "attack.result.clear" - MessageTypeAttackComplete MessageType = "attack.complete" - MessageTypeReportStatus MessageType = "report.status" - MessageTypeReportSync MessageType = "report.sync" - MessageTypeAgentSessionMessage MessageType = "agent.session.message" -) - -type ExploreHostMessage struct { - Type MessageType `json:"type"` - Name string `json:"name"` - Timestamp time.Time `json:"timestamp,omitempty"` -} - -func (h *ExploreHostMessage) GetType() MessageType { - return h.Type -} - -type ExploreEndpointMessage struct { - Type MessageType `json:"type"` - Path string `json:"path"` - Host string `json:"host"` - Timestamp time.Time `json:"timestamp,omitempty"` -} - -func (h *ExploreEndpointMessage) GetType() MessageType { - return h.Type -} - -type ProxyMessage struct { - Type MessageType `json:"type"` - Host string `json:"host"` - Method string `json:"method"` - Path string `json:"path"` - Status int `json:"status"` -} - -func (p *ProxyMessage) GetType() MessageType { - return p.Type -} - -type DomainMessage struct { - Type MessageType `json:"type"` - Domain string `json:"domain"` - Source string `json:"source"` - Timestamp time.Time `json:"timestamp,omitempty"` -} - -func (d *DomainMessage) GetType() MessageType { - return d.Type -} - -type HostMessage struct { - Type MessageType `json:"type"` - Host string `json:"host"` - IP string `json:"ip"` - Timestamp time.Time `json:"timestamp,omitempty"` -} - -func (h *HostMessage) GetType() MessageType { - return h.Type -} - -type SubfinderResultMessage struct { - Type MessageType `json:"type"` - Domain string `json:"domain"` - Host string `json:"host"` - Source string `json:"source"` -} - -func (m *SubfinderResultMessage) GetType() MessageType { - return m.Type -} - -type AttackCompleteMessage struct { - Type MessageType `json:"type"` -} - -func (m *AttackCompleteMessage) GetType() MessageType { - return m.Type -} - -type AttackResultMessage struct { - Type MessageType `json:"type"` - EndpointID uint `json:"endpoint_id"` // reaper endpoint id - TemplateName string `json:"template_name"` - TemplateAuthor string `json:"template_author"` - TemplateSeverity string `json:"template_severity"` - TemplateTags string `json:"template_tags"` - TemplateType string `json:"template_type"` - Hostname string `json:"hostname"` - Port string `json:"port"` - Scheme string `json:"scheme"` - URL string `json:"url"` - Endpoint string `json:"endpoint"` - Request string `json:"request"` - Response string `json:"response"` - IpAddress string `json:"ip_address"` - Command string `json:"command"` // curl command to reproduce the request - Timestamp time.Time `json:"timestamp,omitempty"` -} - -func (a *AttackResultMessage) GetType() MessageType { - return a.Type -} - -type DomainSyncMessage struct { - Type MessageType `json:"type"` - ID uint `json:"id"` - Status DomainStatus `json:"status"` - HostCount int `json:"host_count"` - LastScannedAt *time.Time `json:"last_scanned_at"` -} - -func (m *DomainSyncMessage) GetType() MessageType { - return m.Type -} - -type NavigationFollowMessage struct { - Type MessageType `json:"type"` - From string `json:"from"` - To string `json:"to"` - Timestamp time.Time `json:"timestamp,omitempty"` -} - -func (m *NavigationFollowMessage) GetType() MessageType { - return m.Type -} - -type ReportMessage struct { - Type MessageType `json:"type"` - Domain string `json:"domain"` - Markdown string `json:"markdown"` - Timestamp time.Time `json:"timestamp,omitempty"` -} - -func (m *ReportMessage) GetType() MessageType { - return m.Type -} - -type AgentSessionMessage struct { - Type MessageType `json:"type"` - SessionID uint `json:"session_id"` - AuthorID uint `json:"author_id"` - AuthorRole UserRole `json:"author_role"` - Content string `json:"content"` - Timestamp time.Time `json:"timestamp,omitempty"` -} - -func (m *AgentSessionMessage) GetType() MessageType { - return m.Type -} diff --git a/internal/types/type.go b/internal/types/type.go deleted file mode 100644 index 26d66aa4..00000000 --- a/internal/types/type.go +++ /dev/null @@ -1,64 +0,0 @@ -package types - -import ( - "net/http" - "time" -) - -type UserRole string - -const ( - UserRoleAgent UserRole = "agent" - UserRoleAdmin UserRole = "admin" - UserRoleViewer UserRole = "viewer" -) - -type DomainStatus string - -const ( - DomainStatusPending DomainStatus = "pending" - DomainStatusScanning DomainStatus = "scanning" - DomainStatusProbing DomainStatus = "probing" - DomainStatusIdle DomainStatus = "idle" -) - -type RequestSource string - -const ( - RequestSourceUser RequestSource = "user" - RequestSourceProxy RequestSource = "proxy" - RequestSourceSubfinder RequestSource = "subfinder" - RequestSourceHttpx RequestSource = "httpx" - RequestSourceFuzzer RequestSource = "fuzzer" - RequestSourceReplay RequestSource = "replay" -) - -type ReportStatus string - -const ( - ReportStatusCreated ReportStatus = "created" - ReportStatusPending ReportStatus = "pending" - ReportStatusDone ReportStatus = "done" -) - -type ReplayInput struct { - Method string `json:"method"` - URL string `json:"url"` - Headers string `json:"headers"` - Body string `json:"body"` -} - -type ReplayResponse struct { - Status string `json:"status"` - StatusCode int `json:"status_code"` - Headers http.Header `json:"headers"` - Body []byte `json:"body"` -} - -// AgentSession tracks agent interactions with a chat session -type AgentSession struct { - ID uint `json:"id"` - CreatedAt time.Time `json:"created_at"` - UpdatedAt time.Time `json:"updated_at"` - Status string `json:"status"` -} diff --git a/reaperbot/.gitignore b/reaperbot/.gitignore deleted file mode 100644 index cbac85de..00000000 --- a/reaperbot/.gitignore +++ /dev/null @@ -1,14 +0,0 @@ -# Python-generated files -__pycache__/ -*.py[oc] -build/ -dist/ -wheels/ -*.egg-info - -# Virtual environments -.venv - -# Config files -.env -utils/*.sqlite diff --git a/reaperbot/.python-version b/reaperbot/.python-version deleted file mode 100644 index 24ee5b1b..00000000 --- a/reaperbot/.python-version +++ /dev/null @@ -1 +0,0 @@ -3.13 diff --git a/reaperbot/Makefile b/reaperbot/Makefile deleted file mode 100644 index 0f56d866..00000000 --- a/reaperbot/Makefile +++ /dev/null @@ -1,18 +0,0 @@ -.PHONY: run ui clean help - -.DEFAULT_GOAL := help - -run: ## Start the FastAPI app using uvicorn - uv run python3 main.py - -ui: ## Open Chrome to the ReaperBot UI - open http://localhost:11000 - -clean: ## Remove SQLite database - @rm -f utils/.*messages.sqlite - -help: ## Show this help - @echo "Usage: make [target]\n" - @cat ${MAKEFILE_LIST} | grep "[#]# " | grep -v grep | sort | column -t -s '##' | sed -e 's/^/ /' - @echo "" - diff --git a/reaperbot/README.md b/reaperbot/README.md deleted file mode 100644 index 69c508dd..00000000 --- a/reaperbot/README.md +++ /dev/null @@ -1,63 +0,0 @@ -# ReaperBot - -ReaperBot is an experimental Agentic AI system designed specifically to orchestrate the Reaper project via its APIs to solve the Ghostbank challenge and showcase the emergent behavior of this type of system applied to the AppSec testing space. It uses multiple specialized agents using the [Pydantic-AI](https://ai.pydantic.dev/) framework powered by [OpenAI](https://openai.com/api/) models for tasks like discovering live hosts, scanning domains, identifying potential security vulnerabilities (e.g., BOLA/IDOR), and reporting on the findings. - -## Setup Instructions - -1. **Clone the repository**: - ```bash - git clone https://github.com/ghostsecurity/reaper.git - cd reaper/reaperbot - ``` - -2. **Ensure you have Python 3.13+ and uv installed**. - ```bash - python3 --version - uv -V - ``` - -3. **Install the dependencies**: - ```bash - uv sync - ``` - -4. **Obtain API keys**: - - [OpenAI API Key](https://platform.openai.com/account/api-keys) - - Reaper Token - Navigate to the Reaper UI and fetch the token by clicking the key icon in the lower left of the navbar. - -5. **Set up environment variables**: - Create a `.env` file based on the `sample.env` and fill in the required keys: - ```ini - OPENAI_API_KEY="sk_your_openai_api_key" - X_REAPER_TOKEN="your_reaper_api_key" - REAPER_BASE_URL="http://localhost:8000" - ``` - -6. **Run the application**: - Start the FastAPI app with Uvicorn: - ```bash - make run - ``` - -7. **Access the chat interface**: - ``` - make ui - ``` - or browse to `http://localhost:11000` - - ![ReaperBot Chat UI](static/chat-ui.png) - -## Usage - -Once the application is running, you can interact with ReaperBot through the WebSocket interface. Type in a command or request related to web application security, and ReaperBot will guide you through the steps to scan domains, find live hosts and endpoints, and test for vulnerabilities. - -### Example Commands: -- "Scan the (domain_name) domain" -- "What are the live hosts for (domain_name)?" -- "What endpoints in (domain_name) are vulnerable to BOLA?" -- "Which endpoints in the (domain_name) application are vulnerable to BOLA? Write a technical report on the findings." - - -## License - -This project is licensed under the Apache 2.0 License - see the [LICENSE](../LICENSE) file for details. diff --git a/reaperbot/__init__.py b/reaperbot/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/reaperbot/agents/__init__.py b/reaperbot/agents/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/reaperbot/agents/discoverer.py b/reaperbot/agents/discoverer.py deleted file mode 100644 index 865413b5..00000000 --- a/reaperbot/agents/discoverer.py +++ /dev/null @@ -1,60 +0,0 @@ -import asyncio - -from pydantic_ai import Agent -from dotenv import load_dotenv -from devtools import debug -from pydantic_ai.settings import ModelSettings -from agents.tools.reaper_tools import ( - reaper_get_scanned_domain_by_id, - reaper_get_scanned_domains, - reaper_scan_domain, - reaper_get_live_hosts_for_domains, - reaper_get_live_endpoints_for_domains, - reaper_get_requests_for_endpoint_id, -) - -load_dotenv() - -model_settings = ModelSettings(temperature=0.01, max_tokens=16384) -discoverer_agent = Agent( - 'openai:gpt-4o-mini', - result_type=str, - tools=[ - reaper_get_scanned_domain_by_id, - reaper_get_scanned_domains, - reaper_scan_domain, - reaper_get_live_hosts_for_domains, - reaper_get_live_endpoints_for_domains, - reaper_get_requests_for_endpoint_id, - ], - model_settings=model_settings, - system_prompt=""" - You are an advanced tool calling assistant interacting on behalf of - an expert application security engineer with a system called - Reaper to perform web application enumeration and testing actions to - gather data about target domains, hosts, and endpoints. - - The goal is to help the engineer perform some or all of the following - tasks for a given domain: - 1. Use a tool (reaper) to scan a domain to discover live hosts if not already - scanned by reaper. - 2. Use a tool (reaper) to retrieve live hosts in that domain - 3. Use a tool (reaper) to retrive live endpoints on those hosts with certain - characteristics useful for planning a test attack. - - The primary starting point for a workflow is a domain name, and most - workflows will be focused on that domain until the user changes to another - domain to focus on. Break down complex questions into simple steps that - can be answered with tool calls and execute them in logical order. - - Important: If you haven't been given a domain to focus on by - the user, prompt the user to choose one. Do not make up a domain to scan. - Do not use example.com, for example. If a tool is not available, do not - make up responses. - - You are encouraged to run these tools and use their response details to decide - which step to take next and run more tools to get the information you - need to answer the request. - """, - retries=2, -) \ No newline at end of file diff --git a/reaperbot/agents/reaperbot.py b/reaperbot/agents/reaperbot.py deleted file mode 100644 index b2e58322..00000000 --- a/reaperbot/agents/reaperbot.py +++ /dev/null @@ -1,92 +0,0 @@ -from pydantic_ai import Agent, RunContext -from pydantic_ai.settings import ModelSettings -from dataclasses import dataclass - -from agents.discoverer import discoverer_agent -from agents.tester import tester_agent -from utils.logging import send_log_message - -@dataclass -class ReaperBotDeps: # (1)! - discoverer_agent: Agent - tester_agent: Agent - -reaperbot_deps = ReaperBotDeps( - discoverer_agent=discoverer_agent, - tester_agent=tester_agent, -) - -model_settings = ModelSettings(temperature=0.1, max_tokens=16384) -reaperbot_agent = Agent( - 'openai:gpt-4o-mini', - deps_type=ReaperBotDeps, - result_type=str, - model_settings=model_settings, - system_prompt=( - "You are an assistant helping an expert application security engineer interact with several specialized agents via tools that can complete tasks and fetch data with tools of their own.", - "Your job is to take the input from the user, synthesize a step by step plan that aligns to the agents capabilities and tools, prompt the user with an outline of that plan, and execute that plan if the user confirms.", - "If the user does not confirm, you should prompt the user with a message asking for adjustments to the plan.", - "If the user does not confirm after a few retries, you should prompt the user with a message that you cannot help with that and provide some example questions you can ask.", - "Only prompt for confirmation if the user's question requires a plan of multiple steps, is actionable, and can be executed by the agents/tools available to you.", - "To provide the best answers about recommendations or fixes, be sure to have the relevant context about the application, fetch example request/responses to the application, and analyze its source code and related security findings.", - "Use the available agents for the actionable portions of the execution. If the user's question is not related to the capabilities of your tools/agents, say you cannot help with that and prompt the user with some example questions you can ask.", - "However, you are not a generalized security advice assistant, so only provide recommendations of steps to take that align with the agents/tools available to you.", - "Use the discoverer agent to perform live domain scans and host discovery.", - "Use the tester agent to perform live security testing of target applications, APIs, and endpoints.", - "When invoking an agent, provide it with sufficient context to perform the task and what it's expected to provide back.", - "If one agent responds with an inability to perform a task, see if another agent can perform the task.", - "If the tester tool responds with a test result, provide that to the user directly and do not overly summarize.", - "Summarize the actions taken, but provide the user with the full details and code snippets from the responses from the agents.", - "Domains have hosts and endpoints.", - "Apps/Applications are synonymous in this context.", - "Endpoints are synonymous with APIs in this context.", - "Apps have hosts, apis, and endpoints.", - "Apps have metadata, openapi specs, source code, security findings.", - "Source code has code, languages, and repo information.", - "Endpoints have requests/responses.", - ), - retries=1, -) -@reaperbot_agent.system_prompt -async def reaperbot_agent_system_prompt_example_questions(ctx: RunContext[str]) -> str: - examples = [ - "Scan the (domain_name) domain", - "Which applications are written in go?", - "Which hosts in the (domain_name) are live?", - "What is the status of the (domain_name) domain scan?", - "Which endpoints in the (domain_name) domain are susceptible to BOLA?", - "Write a technical security report of the endpoints vulnerable to BOLA in the (domain_name) domain.", - ] - title = 'The following are example questions you can ask me:\n' - return title + '\n- '.join(examples) - - -@reaperbot_agent.tool -async def invoke_discoverer_agent(ctx: RunContext[ReaperBotDeps], input_text: str) -> str: - """ - Discoverer Tool that interfaces/hands-off with the DiscovererAgent. - Performs live domain scans, host discovery, retrieves full request/responses hitting applications, - and other discovery tasks. - """ - deps: ReaperBotDeps = ctx.deps - await send_log_message(f"ReaperBot: Invoking Discoverer Agent with input: {input_text}") - res = await deps.discoverer_agent.run(input_text, deps=deps) - await send_log_message(f"ReaperBot: Discoverer Agent responded with: {res.data}") - return res.data - -@reaperbot_agent.tool -async def invoke_tester_agent(ctx: RunContext[ReaperBotDeps], input_text: str) -> str: - """ - Tester Tool that interfaces/hands-off with the TesterAgent. - Performs security testing of applications/apps, APIs, and endpoints for the following - vulnerabilities: - - BOLA/IDOR - - This agent can provide example code/scripts that would demonstrate how a security - vulnerability could be exploited in the application if present. - """ - deps: ReaperBotDeps = ctx.deps - await send_log_message(f"ReaperBot: Invoking Tester Agent with input: {input_text}") - res = await deps.tester_agent.run(input_text, deps=deps) - await send_log_message(f"ReaperBot: Tester Agent responded with: {res.data}") - return res.data \ No newline at end of file diff --git a/reaperbot/agents/tester.py b/reaperbot/agents/tester.py deleted file mode 100644 index 732d2661..00000000 --- a/reaperbot/agents/tester.py +++ /dev/null @@ -1,38 +0,0 @@ -import asyncio - -from pydantic_ai import Agent -from pydantic_ai.settings import ModelSettings -from dotenv import load_dotenv - -from agents.tester_bola import tester_bola_agent -from utils.logging import send_log_message - -load_dotenv() - -model_settings = ModelSettings(temperature=0.01, max_tokens=16384) -tester_agent = Agent( - 'openai:gpt-4o-mini', - result_type=str, - model_settings=model_settings, - system_prompt=""" - You are an application security tester agent that is focused on finding and - probing for validation of specific application security flaws. - - You have access to your own specialized agents via tools that you are - to delegate the actual testing actions to. Do not perform tests on your own. The - agent tools you have access to are your only testing abilities. If you are - asked to perform a test that you do not have a tool for, state that you - cannot perform that test and offer the types of tests that you can perform. - - Your job is to use only these tools to satisfy the high level request - from the orchestrator agent and produce a response derived solely from that data. - """, - retries=2, -) - -@tester_agent.tool_plain -async def invoke_tester_bola_agent(input_text: str) -> str: - """Tester Tool that interfaces/hands-off with the BOLA specific TesterAgent.""" - await send_log_message(f"Tester BOLA Agent: invoke_tester_bola_agent input: {input_text}") - res = await tester_bola_agent.run(input_text) - return res.data diff --git a/reaperbot/agents/tester_bola.py b/reaperbot/agents/tester_bola.py deleted file mode 100644 index 2d0ce276..00000000 --- a/reaperbot/agents/tester_bola.py +++ /dev/null @@ -1,54 +0,0 @@ -import asyncio - -from pydantic_ai import Agent -from pydantic_ai.settings import ModelSettings -from dotenv import load_dotenv -from devtools import debug - -from agents.tools.reaper_tools import ( - reaper_get_live_endpoints_for_domains, - reaper_get_requests_for_endpoint_id, - reaper_test_attack_endpoint_id, - reaper_get_attack_results, -) - -load_dotenv() - -model_settings = ModelSettings(temperature=0.01, max_tokens=16384) -tester_bola_agent = Agent( - 'openai:gpt-4o-mini', - result_type=str, - tools=[ - reaper_get_live_endpoints_for_domains, - reaper_get_requests_for_endpoint_id, - reaper_test_attack_endpoint_id, - reaper_get_attack_results, - ], - model_settings=model_settings, - system_prompt=""" - You are an application security tester agent that is focused on finding and - probing for validation of "Broken Object Level Accesss" (BOLA) / "Insecure - Direct Object Reference" (IDOR) flaws. - - You have access to tools that you are able to use to safely - perform probes against specific endpoints for bola/idor - susceptibility/vulnerability. These endpoints are typically GET requests - with url parameters and POST requests with body parameters. - - Break down complex questions into simple steps that can be answered with tool - calls and execute them in logical order. Actively attack/test only the - endpoints that are most likely to be susceptible unless otherwise - instructed. - - The agent tools you have access to are your only testing abilities. If you - are asked to perform a test that is not bola/idor related, state that you - cannot perform that test and offer the types of tests that you can perform. - - Your job is to use only these tools to satisfy the high level request - from the orchestrator agent and produce a response derived solely from that data. - - If no endpoints were found or found to be vulnerable, respond with "No BOLA/IDOR - vulnerabilities found." - """, - retries=2, -) \ No newline at end of file diff --git a/reaperbot/agents/tools/__init__.py b/reaperbot/agents/tools/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/reaperbot/agents/tools/reaper_api.py b/reaperbot/agents/tools/reaper_api.py deleted file mode 100644 index 426ffaed..00000000 --- a/reaperbot/agents/tools/reaper_api.py +++ /dev/null @@ -1,414 +0,0 @@ -import os -import re -import json -import httpx -import asyncio -import time -from dotenv import load_dotenv -from pydantic import BaseModel, Field -from typing import Literal, Optional -from tenacity import retry, stop_after_attempt, wait_exponential, RetryError - - -class Domain(BaseModel): - name: str = Field(..., description="The domain name to be scanned by Reaper", example="ghostbank.net") - -class ScannedDomain(BaseModel): - id: int - name: str - status: str - -class GetScannedDomainsResult(BaseModel): - domains: list[ScannedDomain] = [] - -class ScanDomainResult(BaseModel): - status: Literal["success", "error"] - domain_id: int = 0 - content: str - -class GetLiveHostsResult(BaseModel): - status: Literal["success", "error"] - hosts: list[str] = [] - -class LiveEndpoint(BaseModel): - endpoint_id: int - method: Literal["GET", "POST", "PUT", "PATCH", "DELETE", "OPTIONS", "HEAD"] - host: str - path: str - params: list[str] - -class GetLiveEndpointsResult(BaseModel): - endpoints: list[LiveEndpoint] - -class EndpointRequestResponse(BaseModel): - body: str - content_length: int - content_type: str - created_at: str - headers: str - id: int - request_id: int - status: str - status_code: int - updated_at: str - -class EndpointRequestRequest(BaseModel): - body: str - body_keys: str - content_length: int - content_type: str - created_at: str - header_keys: str - headers: str - host: str - id: int - method: str - param_keys: str - proto: str - proto_major: int - proto_minor: int - response: EndpointRequestResponse - source: str - url: str - -class GetRequestsForEndpointResult(BaseModel): - requests: list[EndpointRequestRequest] - - -class GetAttackEndpointResult(BaseModel): - attack_id: int - endpoint_id: int - param_key: str - status: Literal["success", "completed", "error"] - message: str - -class AttackResult(BaseModel): - created_at: str - endpoint: str - fuzz_attack_id: int - hostname: str - id: int - ip_address: str - port: int - request: str - response: str - scheme: Literal["http","https"] - status_code: int - updated_at: str - url: str - -class GetAttackResults(BaseModel): - attack_results: list[AttackResult] - status: Literal["success", "error"] - message: str - - -class ReaperAPI: - def __init__(self): - load_dotenv() - self.api_key = os.environ['X_REAPER_TOKEN'] - self.base_url = os.environ['REAPER_BASE_URL'] - self.headers = { - "Accept": "application/json", - "X-Reaper-Token": self.api_key - } - - class ScanStatusError(Exception): - """Custom exception to trigger retries.""" - pass - - async def get_scanned_domain_by_id(self, domain_id: int) -> ScannedDomain: - """Get the metadata of an already scanned domain by its id""" - - self.url = f"{self.base_url}/api/scan/domains/{domain_id}" - - async with httpx.AsyncClient() as client: - response = await client.get(self.url, headers=self.headers) - - domain = {} - if response.status_code == 200: - data = response.json() - - domain["id"] = data.get('id') - domain["name"] = data.get('name') - domain["status"] = data.get('status') - return ScannedDomain(**domain) - else: - raise - - - async def get_scanned_domains(self) -> GetScannedDomainsResult: - """Get the list of already scanned domains""" - - self.url = f"{self.base_url}/api/scan/domains" - - async with httpx.AsyncClient() as client: - response = await client.get(self.url, headers=self.headers) - - domains = [] - if response.status_code == 200: - data = response.json() - - for res in data: - domain = {} - domain["id"] = res.get('id') - domain["name"] = res.get('name') - domain["status"] = data.get('status') - domains.append(domain) - - return GetScannedDomainsResult(domains=domains) - - - async def scan_domain(self, domain: str) -> ScanDomainResult: - """Start scan for the domain and handle the status.""" - if not domain: - return ScanDomainResult(status="error", content="Domain is required but not provided.") - - self.url = f"{self.base_url}/api/scan/domains" - - # Start the scan - start_response = await self._post_scan_request(domain) - if start_response.status == "error": - return start_response - - # Wait for scan completion or handle conflict - try: - scan_result = await self._wait_for_scan_completion(domain) - return scan_result - except RetryError: - return ScanDomainResult(status="error", content="The scan was unable to complete in time after multiple retries.") - - - async def get_live_hosts(self, domain_id: int, domains: list[str]) -> GetLiveHostsResult: - if domain_id == 0: - return [] - - if domains is None or domains == []: - domains = ['.*'] - else: - domains = [f".*\\.{domain}|{domain}" for domain in domains] - - self.url = f"{self.base_url}/api/scan/domains/{domain_id}/hosts" - async with httpx.AsyncClient() as client: - response = await client.get(self.url, headers=self.headers) - - livehosts = [] - - if response.status_code == 200: - data = response.json() - for host in data: - if host.get('status') == "live": - host_domain = host.get('name', '') - if any(re.match(pattern, host_domain) for pattern in domains): - livehosts.append(host.get('name')) - - return GetLiveHostsResult(status="success", hosts=livehosts) - - - async def get_live_endpoints(self, domains: list[str], methods: list[str], params: bool = True) -> GetLiveEndpointsResult: - if domains is None or domains == []: - domains = ['.*'] - else: - domains = [f".*\\.{domain}|{domain}" for domain in domains] - - if methods is None or methods == []: - methods = ["GET", "POST", "PUT", "PATCH", "OPTIONS", "DELETE"] - - self.url = f"{self.base_url}/api/endpoints" - - async with httpx.AsyncClient() as client: - response = await client.get(self.url, headers=self.headers) - - endpoints = [] - - if response.status_code == 200: - data = response.json() - for host in data: - if host.get('method').upper() in methods: - host_domain = host.get('hostname', '') - if any(re.match(pattern, host_domain) for pattern in domains): - if params == False: - # Don't filter by presence of params - endpoints.append(host) - else: - # only add ones with get url params or post body params - if host.get("params") != "": - endpoints.append(host) - - live_endpoints = [] - for ep in endpoints: - entry = {} - entry["endpoint_id"] = ep.get('id') - entry["method"] = ep.get('method') - entry["host"] = ep.get('hostname') - entry["path"] = ep.get('path') - entry["params"] = ep.get('params').split(",") - live_endpoints.append(entry) - - return GetLiveEndpointsResult(endpoints=live_endpoints) - - - async def get_requests_for_endpoint(self, endpoint_id: int) -> GetRequestsForEndpointResult: - if endpoint_id == 0: - return [] - - self.url = f"{self.base_url}/api/endpoints/{endpoint_id}" - async with httpx.AsyncClient() as client: - response = await client.get(self.url, headers=self.headers) - - ep_id = 0 - ep_hostname = "" - ep_method = "" - ep_path = "" - if response.status_code == 200: - ep = response.json() - if ep.get('id'): - ep_id = ep.get('id') - ep_hostname = ep.get('hostname') - ep_method = ep.get('method') - ep_path = ep.get('path') - if ep_id == 0: - return json.dumps([]) - - reqs = [] - self.url = f"{self.base_url}/api/requests" - async with httpx.AsyncClient() as client: - response = await client.get(self.url, headers=self.headers) - - if response.status_code == 200: - pattern = f".*{ep_path}$" - data = response.json() - for req in data: - if req.get('method').upper() == ep_method.upper() and req.get('host').lower() == ep_hostname.lower() and re.match(pattern, req.get('url')): - reqs.append(req) - - return GetRequestsForEndpointResult(requests=reqs) - - - async def get_attack_endpoint(self, endpoint_id: int, param_key: str) -> GetAttackEndpointResult: - if endpoint_id is None: - return "endpoint_id required but not provided" - if param_key is None or param_key == "": - return "param_keys required but not provided" - - self.url = f"{self.base_url}/api/attack" - - data = {} - data["endpoint_id"] = int(endpoint_id) - data["params"] = [param_key] - async with httpx.AsyncClient() as client: - response = await client.post(self.url, headers=self.headers, json=data) - - if response.status_code == 200: - tries = 0 - max_tries = 8 - status = response.json().get('status') - attack_id = response.json().get('id') - while tries < max_tries: - self.url = f"{self.base_url}/api/attacks/{attack_id}" - async with httpx.AsyncClient() as client: - response = await client.get(self.url, headers=self.headers) - - if response.status_code == 200: - status = response.json().get('status') - result = GetAttackEndpointResult( - attack_id=int(attack_id), - endpoint_id=int(endpoint_id), - param_key=str(param_key), - status="success", - message="") - - if status == "success": - result.message = "Attack completed and found a vulnerable endpoint." - return result - elif status == "completed": - result.status = "completed" - result.message = "Attack completed but did not find a vulnerable endpoint. Try again with another param_key." - return result - else: - tries = tries + 1 - time.sleep(2 * 1.2 * tries) - else: - return GetAttackEndpointResult( - attack_id=0, - endpoint_id=int(endpoint_id), - param_key=str(param_key), - status="error", - message=f"There was an error launching the attack {response}") - - - async def get_attack_results(self, attack_id: int, limit: int) -> GetAttackResults: - if limit is None or limit == 0: - limit = 50 - if attack_id is None or attack_id == 0: - return "attack_id required but not provided" - - self.url = f"{self.base_url}/api/attacks/{attack_id}/results?limit={limit}" - - async with httpx.AsyncClient() as client: - response = await client.get(self.url, headers=self.headers) - - results = [] - if response.status_code == 200: - data = response.json() - for res in data: - results.append(res) - - return GetAttackResults(attack_results=results, status="success", - message=f"Successfully fetched the attack results") - else: - return GetAttackResults(attack_results=results, status="error", - message="Error fetching the attack results") - - - @retry(stop=stop_after_attempt(3), wait=wait_exponential(min=2, multiplier=1.2)) - async def _post_scan_request(self, domain: str) -> ScanDomainResult: - """Send a request to start scanning the domain.""" - data = {"name": domain, "auto_scan": True} - async with httpx.AsyncClient() as client: - response = await client.post(self.url, headers=self.headers, json=data) - if response.status_code == 409: - return ScanDomainResult(status="success", content=f"Scan already completed for domain '{domain}'.") - if response.status_code == 200: - domain_id = response.json().get('id') - return ScanDomainResult(status="success", domain_id=domain_id, content=f"Scan started for domain '{domain}'.") - else: - return ScanDomainResult(status="error", content=f"Error starting scan for domain '{domain}': {response.text}") - - - async def _get_domain_info(self, domain: str) -> Optional[dict]: - """Fetch domain scan info from the server.""" - async with httpx.AsyncClient() as client: - response = await client.get(self.url, headers=self.headers) - if response.status_code != 200: - return None - domains = response.json() - return next((dom for dom in domains if dom.get('name') == domain), None) - - - @retry(stop=stop_after_attempt(10), wait=wait_exponential(min=2, multiplier=1.1)) - async def _wait_for_scan_completion(self, domain: str) -> ScanDomainResult: - """Wait and check the status of a scan with retries.""" - domain_info = await self._get_domain_info(domain) - if domain_info: - status = domain_info.get('status') - domain_id = domain_info.get('id') - - if status == "completed": - return ScanDomainResult(status="success", domain_id=domain_id, content=f"Domain scan of: {domain} completed successfully.") - else: - raise self.ScanStatusError(f"Scan is in {status} status. Retrying...") - - return ScanDomainResult(status="error", content=f"Error fetching scan status for domain '{domain}'.") - - async def _handle_conflict(self, domain: str) -> ScanDomainResult: - """Handle cases where the scan is already in progress or completed.""" - domain_info = await self._get_domain_info(domain) - if domain_info: - status = domain_info.get('status') - domain_id = domain_info.get('id') - - if status == "completed": - return ScanDomainResult(status="success", domain_id=domain_id, content=f"Domain scan has already been performed.") - - return ScanDomainResult(status="error", content=f"Unable to fetch domain status or domain '{domain}' does not exist.") \ No newline at end of file diff --git a/reaperbot/agents/tools/reaper_tools.py b/reaperbot/agents/tools/reaper_tools.py deleted file mode 100644 index 02576514..00000000 --- a/reaperbot/agents/tools/reaper_tools.py +++ /dev/null @@ -1,179 +0,0 @@ -import asyncio - -from pydantic_ai import ModelRetry -from dotenv import load_dotenv -from devtools import debug -from agents.tools.reaper_api import (ReaperAPI, - Domain, - ScannedDomain, - GetScannedDomainsResult, - ScanDomainResult, - GetLiveHostsResult, - GetLiveEndpointsResult, - GetAttackEndpointResult, - GetRequestsForEndpointResult) -from utils.logging import send_log_message - -load_dotenv() - -async def reaper_get_scanned_domain_by_id(domain_id: int) -> ScannedDomain: - """ - Retrieves the record about a domain that reaper has already scanned. - Use this tool to avoid rescanning a domain that has already been scanned. - """ - try: - await send_log_message(f"Tool: GetScannedDomainById input: {domain_id}") - result = await ReaperAPI().get_scanned_domain_by_id(domain_id=domain_id) - await send_log_message(f"Tool: GetScannedDomainById result: {result}") - return result - except: - raise ModelRetry(f'Could not get the domain_id: {domain_id} metadata') - -async def reaper_get_scanned_domains() -> GetScannedDomainsResult: - """ - Retrieves a list of records about domains that reaper has already scanned. - Use this tool to avoid rescanning a domain that has already been scanned. - """ - try: - await send_log_message(f"Tool: GetScannedDomains input: -") - result = await ReaperAPI().get_scanned_domains() - await send_log_message(f"Tool: GetScannedDomains result: {result}") - return result - except: - raise ModelRetry('Could not get the domains list') - -async def reaper_scan_domain(domain: Domain) -> ScanDomainResult: - """ - Passively scan a domain to trigger reaper to collect/know about possible hosts - in that domain. This tool does NOT retrieve them. It only kicks off a scan - for them and waits until the scan is complete before the tool returns. It - does not return any results except for the domain_id and a status or error - message. Live hosts are retrieved only by the get_live_hosts_for_domains tool. - - Be sure to get the domain to scan from the user and prompt them for one - instead of making one up. Do not use example.com, for instance. - - Args: - domain: str - The domain to start a subdomain/host finding scan - """ - try: - await send_log_message(f"Tool: ScanDomain input: {domain.name}") - result = await ReaperAPI().scan_domain(domain.name) - await send_log_message(f"Tool: ScanDomain result: {result}") - return result - except: - raise ModelRetry('Could not get the live hosts') - - -async def reaper_get_live_hosts_for_domains(domain_id: int, domains: list[str]) -> GetLiveHostsResult: - """ - Get the list of live hosts from a passive scan tool named reaper. This - should be called after a domain has been scanned by the scan_domain - tool (to know the domain_id). Call this tool as often as needed to get - the most up to date information. - - Args: - domains: list[str] - The list of domains to filter live hosts by - """ - if domains == []: - raise ModelRetry('Provide the domain or domains to get live hosts for in the domains list[str]') - try: - await send_log_message(f"Tool: GetLiveHosts input: {domain_id} {domains}") - result = await ReaperAPI().get_live_hosts(domain_id=domain_id, domains=domains) - await send_log_message(f"Tool: GetLiveHosts result: {result}") - return result - except: - raise ModelRetry('Could not get the live hosts') - - -async def reaper_get_live_endpoints_for_domains(domains: list[str], methods: list[str], filter_on_params_usage: bool) -> GetLiveEndpointsResult: - """ - Get the list of valid and live endpoints from a passive scan tool named reaper. This - must be called after the get_live_hosts_for_domains tool has been made so that reaper - has knowledge of the live endpoints associated with those hosts. Call this tool - as often as needed to get the most up to date information. - - Set filter_on_params_usage to False by default. Set filter_on_params_usage - to True to filter endpoints that allow for GET requests with non-empty url parameters - or POST requests with keys in the body params tend to be candidates for BOLA or IDOR attacks. - - Args: - domains: A list of domains to filter the list of endpoints on. If an empty list, no domain filter is applied - methods: A list of http methods e.g. ["GET", "POST"] to filter the list of endpoints. If an empty list, return all live endpoints for all methods - filter_on_params_usage: Whether or not to filter endpoints based on params usage - """ - try: - await send_log_message(f"Tool: GetLiveEndpoints input: {domains} {methods} {filter_on_params_usage}") - result = await ReaperAPI().get_live_endpoints(domains=domains, methods=methods, params=filter_on_params_usage) - endpoints = [] - for endpoint in result.endpoints: - endpoints.append(f"{endpoint.endpoint_id} {endpoint.method} {endpoint.host}{endpoint.path} params: {endpoint.params}, ") - await send_log_message(f"Tool: GetLiveEndpoints result: {endpoints}") - return result - except: - raise ModelRetry('Could not get the live endpoints') - - -async def reaper_get_requests_for_endpoint_id(endpoint_id: int) -> GetRequestsForEndpointResult: - """ - For a given endpoint (by endpoint_id), fetch requests that reaper has seen to that endpoint. - Use that context when determining how to proceed with an attack before - carrying one out. For example, to know which param_key would be best to - attack from an attacker's perspective. - - Call this tool before running an attack to have the proper context and - example requests with full payloads first. - - Args: - endpoint_id: the reaper endpoint_id (int) to fetch full request and responses for to get proper context on parameters and body structure and actual example values - """ - try: - await send_log_message(f"Tool: GetRequestsForEndpoint endpoint_id: {endpoint_id}") - result = await ReaperAPI().get_requests_for_endpoint(endpoint_id=endpoint_id) - reqs = [] - for req in result.requests: - reqs.append(f"{req.id} {req.method} {req.url} params: \"{req.param_keys}\", body: \"{req.body_keys}\", ") - await send_log_message(f"Tool: GetRequestsForEndpoint result: {reqs}") - return result - except: - raise ModelRetry('Could not fetch requests for that endpoint') - - -async def reaper_test_attack_endpoint_id(endpoint_id: int, param_key: str) -> GetAttackEndpointResult: - """ - Send an endpoints' endpoint_id to be used to carry out a parameter fuzzing - attack for BOLA/IDOR using the passive scan tool named reaper. Always use - the get_requests_for_endpoint_id tool first to determine the one parameter - key that is most likely to be most dangerous for users and most beneficial - from an attacker's perspective if successful. Only use param_key values - from returned endpoints data. - - Args: - endpoint_id: the reaper endpoint_id (int) to probe - param_key: the key name of the parameter to focus the fuzzing test on. - """ - try: - await send_log_message(f"Tool: AttackEndpoint input: {endpoint_id} {param_key}") - result = await ReaperAPI().get_attack_endpoint(endpoint_id=endpoint_id, param_key=param_key) - await send_log_message(f"Tool: AttackEndpoint result: {result}") - return result - except: - raise ModelRetry('Could not attack that endpoint') - - -async def reaper_get_attack_results(attack_id: int) -> str: - """ - Fetch attack results by attack_id for tests/attacks already run using the passive scan tool named - reaper. Ensure the test_attack_endpoint_id tool has been run successfully - first. - - Args: - attack_id: the attack_id to fetch the results for in JSON - """ - try: - await send_log_message(f"Tool: GetAttackResults input: {attack_id}") - result = await ReaperAPI().get_attack_results(attack_id=attack_id, limit=25) - await send_log_message(f"Tool: GetAttackResults result: {result.status} {result.message}") - return result - except: - raise ModelRetry('Could not fetch attack results for that attack_id') \ No newline at end of file diff --git a/reaperbot/main.py b/reaperbot/main.py deleted file mode 100644 index dbd7eb44..00000000 --- a/reaperbot/main.py +++ /dev/null @@ -1,86 +0,0 @@ -import uvicorn -from typing import List -from dotenv import load_dotenv -from datetime import datetime -from asyncio import sleep -from devtools import debug -from contextlib import asynccontextmanager -from fastapi import FastAPI, WebSocket, Request, Depends -from fastapi.templating import Jinja2Templates -from fastapi.responses import HTMLResponse, FileResponse -from fastapi.staticfiles import StaticFiles -from starlette.websockets import WebSocketDisconnect - -from utils.database import Database, get_db, get_ws_db -from agents.reaperbot import reaperbot_agent, reaperbot_deps -from utils.logging import send_log_message -from utils.websockets import log_websockets - -load_dotenv() - -@asynccontextmanager -async def lifespan(_app: FastAPI): - async with Database.connect() as db: - yield {'db': db} - -app = FastAPI(lifespan=lifespan) - -templates = Jinja2Templates(directory="templates") -app.mount("/static", StaticFiles(directory="static"), name="static") - -chat_responses: List[str] = [] - -@app.websocket("/log") -async def log_websocket_endpoint(websocket: WebSocket): - """WebSocket endpoint for logging.""" - await websocket.accept() - log_websockets.append(websocket) - try: - while True: - await websocket.receive_text() - except WebSocketDisconnect: - if websocket in log_websockets: - log_websockets.remove(websocket) - -@app.websocket("/ws") -async def websocket_endpoint(websocket: WebSocket, db: Database = Depends(get_ws_db)): - """WebSocket endpoint for real-time AI responses.""" - await websocket.accept() - await sleep(0.2) # Add a small delay to ensure the connection is established - await send_log_message("ReaperBot is ready to assist.") - try: - while True: - user_message = await websocket.receive_text() - await send_log_message(f"ReaperBot: Processing user request: {user_message}") - messages = await db.get_messages("desc") - - async with reaperbot_agent.run_stream(user_message, deps=reaperbot_deps, message_history=messages) as result: - # debug(reaperbot_agent) - async for message in result.stream_text(delta=True): - await websocket.send_text(message) - await db.add_messages(result.new_messages_json()) - await send_log_message("ReaperBot: Response complete.") - except WebSocketDisconnect: - await send_log_message("ReaperBot offline.") - except Exception as e: - await send_log_message(f"Error: {str(e)}") - await send_log_message("ReaperBot offline.") - -@app.post("/clear_messages") -async def clear_messages(request: Request, db: Database = Depends(get_db)): - """Endpoint to clear the chat messages in the database.""" - await db.clear_messages() - return {"status": "success"} - -@app.get("/favicon.ico", include_in_schema=False) -async def favicon(): - """Serve the favicon.ico file.""" - return FileResponse("static/favicon.ico") - -@app.get("/", response_class=HTMLResponse) -async def chat_page(request: Request): - """Serve the chat page.""" - return templates.TemplateResponse("index.html", {"request": request, "chat_responses": chat_responses}) - -if __name__ == "__main__": - uvicorn.run("main:app", host="0.0.0.0", port=11000, log_level="info", reload=True) diff --git a/reaperbot/pyproject.toml b/reaperbot/pyproject.toml deleted file mode 100644 index 78358106..00000000 --- a/reaperbot/pyproject.toml +++ /dev/null @@ -1,19 +0,0 @@ -[project] -name = "reaperbot" -version = "0.1.0" -description = "ReaperBot Agentic AI" -readme = "README.md" -requires-python = ">=3.13" -dependencies = [ - "devtools>=0.12.2", - "fastapi>=0.115.8", - "httpx>=0.28.1", - "jinja2>=3.1.5", - "openai>=1.61.1", - "pydantic-ai>=0.0.22", - "python-dotenv>=1.0.1", - "python-multipart>=0.0.20", - "rich>=13.9.4", - "tenacity>=9.0.0", - "uvicorn[standard]>=0.33.0", -] diff --git a/reaperbot/sample.env b/reaperbot/sample.env deleted file mode 100644 index 8fd4d538..00000000 --- a/reaperbot/sample.env +++ /dev/null @@ -1,3 +0,0 @@ -OPENAI_API_KEY="" -X_REAPER_TOKEN="" -REAPER_BASE_URL="http://localhost:8000" diff --git a/reaperbot/static/chat-ui.png b/reaperbot/static/chat-ui.png deleted file mode 100644 index 48af328a..00000000 Binary files a/reaperbot/static/chat-ui.png and /dev/null differ diff --git a/reaperbot/static/favicon.ico b/reaperbot/static/favicon.ico deleted file mode 100644 index e69de29b..00000000 diff --git a/reaperbot/static/reaper.svg b/reaperbot/static/reaper.svg deleted file mode 100644 index fb880359..00000000 --- a/reaperbot/static/reaper.svg +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - diff --git a/reaperbot/templates/index.html b/reaperbot/templates/index.html deleted file mode 100644 index ea88aed2..00000000 --- a/reaperbot/templates/index.html +++ /dev/null @@ -1,241 +0,0 @@ - - - - - - - - ReaperBot - - - -
- -
-
-
-
-
Chat Conversation:
-
-
-
- -
-
-
-
-
-
- -
-
- -
-
-
-
-
-
- - -
-
-
-
- - - - - diff --git a/reaperbot/utils/__init__.py b/reaperbot/utils/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/reaperbot/utils/database.py b/reaperbot/utils/database.py deleted file mode 100644 index 1dc0381c..00000000 --- a/reaperbot/utils/database.py +++ /dev/null @@ -1,110 +0,0 @@ -import asyncio -from contextlib import asynccontextmanager -from functools import partial -from pathlib import Path -import sqlite3 -from dataclasses import dataclass -from typing import Any, AsyncIterator, Callable, LiteralString, TypeVar, List -from concurrent.futures.thread import ThreadPoolExecutor -from typing_extensions import Annotated, ParamSpec -from pydantic import Field, TypeAdapter -from pydantic_ai.messages import ModelMessage, ModelMessagesTypeAdapter -from datetime import datetime -from fastapi import WebSocket, Request - -THIS_DIR = Path(__file__).parent - -MessageTypeAdapter = TypeAdapter( - Annotated[ModelMessage, Field(discriminator='kind')] -) -P = ParamSpec('P') -R = TypeVar('R') - - -@dataclass -class Database: - """Rudimentary database to store chat messages in SQLite. - - The SQLite standard library package is synchronous, so we - use a thread pool executor to run queries asynchronously. - """ - - con: sqlite3.Connection - _loop: asyncio.AbstractEventLoop - _executor: ThreadPoolExecutor - - @classmethod - @asynccontextmanager - async def connect( - cls, file: Path = THIS_DIR / '.chat_app_messages.sqlite' - ) -> AsyncIterator['Database']: - loop = asyncio.get_event_loop() - executor = ThreadPoolExecutor(max_workers=1) - con = await loop.run_in_executor(executor, cls._connect, file) - slf = cls(con, loop, executor) - try: - yield slf - finally: - await slf._asyncify(con.close) - - @staticmethod - def _connect(file: Path) -> sqlite3.Connection: - con = sqlite3.connect(str(file)) - cur = con.cursor() - cur.execute( - 'CREATE TABLE IF NOT EXISTS messages (id INT PRIMARY KEY, message_list TEXT);' - ) - con.commit() - return con - - async def add_messages(self, messages: bytes): - await self._asyncify( - self._execute, - 'INSERT INTO messages (id, message_list) VALUES (?, ?);', - int(datetime.now().timestamp()), - messages, - commit=True, - ) - await self._asyncify(self.con.commit) - - async def get_messages(self, dir: str) -> List[ModelMessage]: # type: ignore - if not dir: - dir = "desc" - c = await self._asyncify( - self._execute, f"SELECT message_list FROM messages order by id {dir}" - ) - rows = await self._asyncify(c.fetchall) - messages: List[ModelMessage] = [] # type: ignore - for row in rows: - messages.extend(ModelMessagesTypeAdapter.validate_json(row[0])) - return messages - - async def clear_messages(self): - await self._asyncify( - self._execute, "DELETE FROM messages" - ) - await self._asyncify(self.con.commit) - - def _execute( - self, sql: LiteralString, *args: Any, commit: bool = False - ) -> sqlite3.Cursor: - cur = self.con.cursor() - cur.execute(sql, args) - if commit: - self.con.commit() - return cur - - async def _asyncify( - self, func: Callable[P, R], *args: P.args, **kwargs: P.kwargs - ) -> R: - return await self._loop.run_in_executor( # type: ignore - self._executor, - partial(func, **kwargs), - *args, # type: ignore - ) - -async def get_ws_db(ws: WebSocket) -> Database: - return ws.state.db - -async def get_db(request: Request) -> Database: - return request.state.db diff --git a/reaperbot/utils/logging.py b/reaperbot/utils/logging.py deleted file mode 100644 index 717022e1..00000000 --- a/reaperbot/utils/logging.py +++ /dev/null @@ -1,14 +0,0 @@ -from datetime import datetime -from starlette.websockets import WebSocketDisconnect -from .websockets import log_websockets - -async def send_log_message(message: str): - """Send a log message to all connected log WebSocket clients.""" - timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S") - log_message = f"[{timestamp}] {message}" - for websocket in log_websockets: - try: - await websocket.send_text(log_message) - except WebSocketDisconnect: - if websocket in log_websockets: - log_websockets.remove(websocket) diff --git a/reaperbot/utils/websockets.py b/reaperbot/utils/websockets.py deleted file mode 100644 index 86008e11..00000000 --- a/reaperbot/utils/websockets.py +++ /dev/null @@ -1,3 +0,0 @@ -from starlette.websockets import WebSocket - -log_websockets: list[WebSocket] = [] diff --git a/reaperbot/uv.lock b/reaperbot/uv.lock deleted file mode 100644 index 80229ad0..00000000 --- a/reaperbot/uv.lock +++ /dev/null @@ -1,940 +0,0 @@ -version = 1 -requires-python = ">=3.13" - -[[package]] -name = "annotated-types" -version = "0.7.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643 }, -] - -[[package]] -name = "anthropic" -version = "0.45.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "anyio" }, - { name = "distro" }, - { name = "httpx" }, - { name = "jiter" }, - { name = "pydantic" }, - { name = "sniffio" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/15/74/2b2485fc120da834c0c5be07462541ec082e9fa8851d845f2587e480535a/anthropic-0.45.2.tar.gz", hash = "sha256:32a18b9ecd12c91b2be4cae6ca2ab46a06937b5aa01b21308d97a6d29794fb5e", size = 200901 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/74/86/e81814e542d1eaeec84d2312bec93a99b9ef1d78d9bfae1fc5dd74abdf15/anthropic-0.45.2-py3-none-any.whl", hash = "sha256:ecd746f7274451dfcb7e1180571ead624c7e1195d1d46cb7c70143d2aedb4d35", size = 222797 }, -] - -[[package]] -name = "anyio" -version = "4.5.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "idna" }, - { name = "sniffio" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/4d/f9/9a7ce600ebe7804daf90d4d48b1c0510a4561ddce43a596be46676f82343/anyio-4.5.2.tar.gz", hash = "sha256:23009af4ed04ce05991845451e11ef02fc7c5ed29179ac9a420e5ad0ac7ddc5b", size = 171293 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/1b/b4/f7e396030e3b11394436358ca258a81d6010106582422f23443c16ca1873/anyio-4.5.2-py3-none-any.whl", hash = "sha256:c011ee36bc1e8ba40e5a81cb9df91925c218fe9b778554e0b56a21e1b5d4716f", size = 89766 }, -] - -[[package]] -name = "asttokens" -version = "2.4.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "six" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/45/1d/f03bcb60c4a3212e15f99a56085d93093a497718adf828d050b9d675da81/asttokens-2.4.1.tar.gz", hash = "sha256:b03869718ba9a6eb027e134bfdf69f38a236d681c83c160d510768af11254ba0", size = 62284 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/45/86/4736ac618d82a20d87d2f92ae19441ebc7ac9e7a581d7e58bbe79233b24a/asttokens-2.4.1-py2.py3-none-any.whl", hash = "sha256:051ed49c3dcae8913ea7cd08e46a606dba30b79993209636c4875bc1d637bc24", size = 27764 }, -] - -[[package]] -name = "cachetools" -version = "5.5.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d9/74/57df1ab0ce6bc5f6fa868e08de20df8ac58f9c44330c7671ad922d2bbeae/cachetools-5.5.1.tar.gz", hash = "sha256:70f238fbba50383ef62e55c6aff6d9673175fe59f7c6782c7a0b9e38f4a9df95", size = 28044 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ec/4e/de4ff18bcf55857ba18d3a4bd48c8a9fde6bb0980c9d20b263f05387fd88/cachetools-5.5.1-py3-none-any.whl", hash = "sha256:b76651fdc3b24ead3c648bbdeeb940c1b04d365b38b4af66788f9ec4a81d42bb", size = 9530 }, -] - -[[package]] -name = "certifi" -version = "2025.1.31" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/1c/ab/c9f1e32b7b1bf505bf26f0ef697775960db7932abeb7b516de930ba2705f/certifi-2025.1.31.tar.gz", hash = "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651", size = 167577 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/38/fc/bce832fd4fd99766c04d1ee0eead6b0ec6486fb100ae5e74c1d91292b982/certifi-2025.1.31-py3-none-any.whl", hash = "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe", size = 166393 }, -] - -[[package]] -name = "charset-normalizer" -version = "3.4.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/16/b0/572805e227f01586461c80e0fd25d65a2115599cc9dad142fee4b747c357/charset_normalizer-3.4.1.tar.gz", hash = "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3", size = 123188 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/38/94/ce8e6f63d18049672c76d07d119304e1e2d7c6098f0841b51c666e9f44a0/charset_normalizer-3.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda", size = 195698 }, - { url = "https://files.pythonhosted.org/packages/24/2e/dfdd9770664aae179a96561cc6952ff08f9a8cd09a908f259a9dfa063568/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313", size = 140162 }, - { url = "https://files.pythonhosted.org/packages/24/4e/f646b9093cff8fc86f2d60af2de4dc17c759de9d554f130b140ea4738ca6/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9", size = 150263 }, - { url = "https://files.pythonhosted.org/packages/5e/67/2937f8d548c3ef6e2f9aab0f6e21001056f692d43282b165e7c56023e6dd/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b", size = 142966 }, - { url = "https://files.pythonhosted.org/packages/52/ed/b7f4f07de100bdb95c1756d3a4d17b90c1a3c53715c1a476f8738058e0fa/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11", size = 144992 }, - { url = "https://files.pythonhosted.org/packages/96/2c/d49710a6dbcd3776265f4c923bb73ebe83933dfbaa841c5da850fe0fd20b/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f", size = 147162 }, - { url = "https://files.pythonhosted.org/packages/b4/41/35ff1f9a6bd380303dea55e44c4933b4cc3c4850988927d4082ada230273/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd", size = 140972 }, - { url = "https://files.pythonhosted.org/packages/fb/43/c6a0b685fe6910d08ba971f62cd9c3e862a85770395ba5d9cad4fede33ab/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2", size = 149095 }, - { url = "https://files.pythonhosted.org/packages/4c/ff/a9a504662452e2d2878512115638966e75633519ec11f25fca3d2049a94a/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886", size = 152668 }, - { url = "https://files.pythonhosted.org/packages/6c/71/189996b6d9a4b932564701628af5cee6716733e9165af1d5e1b285c530ed/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601", size = 150073 }, - { url = "https://files.pythonhosted.org/packages/e4/93/946a86ce20790e11312c87c75ba68d5f6ad2208cfb52b2d6a2c32840d922/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd", size = 145732 }, - { url = "https://files.pythonhosted.org/packages/cd/e5/131d2fb1b0dddafc37be4f3a2fa79aa4c037368be9423061dccadfd90091/charset_normalizer-3.4.1-cp313-cp313-win32.whl", hash = "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407", size = 95391 }, - { url = "https://files.pythonhosted.org/packages/27/f2/4f9a69cc7712b9b5ad8fdb87039fd89abba997ad5cbe690d1835d40405b0/charset_normalizer-3.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971", size = 102702 }, - { url = "https://files.pythonhosted.org/packages/0e/f6/65ecc6878a89bb1c23a086ea335ad4bf21a588990c3f535a227b9eea9108/charset_normalizer-3.4.1-py3-none-any.whl", hash = "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85", size = 49767 }, -] - -[[package]] -name = "click" -version = "8.1.8" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "colorama", marker = "platform_system == 'Windows'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/b9/2e/0090cbf739cee7d23781ad4b89a9894a41538e4fcf4c31dcdd705b78eb8b/click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a", size = 226593 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7e/d4/7ebdbd03970677812aac39c869717059dbb71a4cfc033ca6e5221787892c/click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2", size = 98188 }, -] - -[[package]] -name = "cohere" -version = "5.13.12" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "fastavro" }, - { name = "httpx" }, - { name = "httpx-sse" }, - { name = "pydantic" }, - { name = "pydantic-core" }, - { name = "requests" }, - { name = "tokenizers" }, - { name = "types-requests" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/f4/48/795c53b25b08ec353cc4f48dc5c199ac4615b3c331e716ac50c7cb07034c/cohere-5.13.12.tar.gz", hash = "sha256:97bb9ac107e580780b941acbabd3aa5e71960e6835398292c46aaa8a0a4cab88", size = 132860 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/50/c6/cffec9284d9713d28c6235a653a9a34c49b0f880f00cfa002252cdb8d033/cohere-5.13.12-py3-none-any.whl", hash = "sha256:2a043591a3e5280b47716a6b311e4c7f58e799364113a9cb81b50cd4f6c95f7e", size = 252856 }, -] - -[[package]] -name = "colorama" -version = "0.4.6" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335 }, -] - -[[package]] -name = "devtools" -version = "0.12.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "asttokens" }, - { name = "executing" }, - { name = "pygments" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/84/75/b78198620640d394bc435c17bb49db18419afdd6cfa3ed8bcfe14034ec80/devtools-0.12.2.tar.gz", hash = "sha256:efceab184cb35e3a11fa8e602cc4fadacaa2e859e920fc6f87bf130b69885507", size = 75005 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d1/ae/afb1487556e2dc827a17097aac8158a25b433a345386f0e249f6d2694ccb/devtools-0.12.2-py3-none-any.whl", hash = "sha256:c366e3de1df4cdd635f1ad8cbcd3af01a384d7abda71900e68d43b04eb6aaca7", size = 19411 }, -] - -[[package]] -name = "distro" -version = "1.9.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/fc/f8/98eea607f65de6527f8a2e8885fc8015d3e6f5775df186e443e0964a11c3/distro-1.9.0.tar.gz", hash = "sha256:2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed", size = 60722 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/12/b3/231ffd4ab1fc9d679809f356cebee130ac7daa00d6d6f3206dd4fd137e9e/distro-1.9.0-py3-none-any.whl", hash = "sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2", size = 20277 }, -] - -[[package]] -name = "eval-type-backport" -version = "0.2.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/30/ea/8b0ac4469d4c347c6a385ff09dc3c048c2d021696664e26c7ee6791631b5/eval_type_backport-0.2.2.tar.gz", hash = "sha256:f0576b4cf01ebb5bd358d02314d31846af5e07678387486e2c798af0e7d849c1", size = 9079 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ce/31/55cd413eaccd39125368be33c46de24a1f639f2e12349b0361b4678f3915/eval_type_backport-0.2.2-py3-none-any.whl", hash = "sha256:cb6ad7c393517f476f96d456d0412ea80f0a8cf96f6892834cd9340149111b0a", size = 5830 }, -] - -[[package]] -name = "executing" -version = "2.2.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/91/50/a9d80c47ff289c611ff12e63f7c5d13942c65d68125160cefd768c73e6e4/executing-2.2.0.tar.gz", hash = "sha256:5d108c028108fe2551d1a7b2e8b713341e2cb4fc0aa7dcf966fa4327a5226755", size = 978693 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7b/8f/c4d9bafc34ad7ad5d8dc16dd1347ee0e507a52c3adb6bfa8887e1c6a26ba/executing-2.2.0-py2.py3-none-any.whl", hash = "sha256:11387150cad388d62750327a53d3339fad4888b39a6fe233c3afbb54ecffd3aa", size = 26702 }, -] - -[[package]] -name = "fastapi" -version = "0.115.8" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "pydantic" }, - { name = "starlette" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/a2/b2/5a5dc4affdb6661dea100324e19a7721d5dc524b464fe8e366c093fd7d87/fastapi-0.115.8.tar.gz", hash = "sha256:0ce9111231720190473e222cdf0f07f7206ad7e53ea02beb1d2dc36e2f0741e9", size = 295403 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/8f/7d/2d6ce181d7a5f51dedb8c06206cbf0ec026a99bf145edd309f9e17c3282f/fastapi-0.115.8-py3-none-any.whl", hash = "sha256:753a96dd7e036b34eeef8babdfcfe3f28ff79648f86551eb36bfc1b0bf4a8cbf", size = 94814 }, -] - -[[package]] -name = "fastavro" -version = "1.10.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f3/67/7121d2221e998706cac00fa779ec44c1c943cb65e8a7ed1bd57d78d93f2c/fastavro-1.10.0.tar.gz", hash = "sha256:47bf41ac6d52cdfe4a3da88c75a802321321b37b663a900d12765101a5d6886f", size = 987970 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c9/c4/163cf154cc694c2dccc70cd6796db6214ac668a1260bf0310401dad188dc/fastavro-1.10.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:82263af0adfddb39c85f9517d736e1e940fe506dfcc35bc9ab9f85e0fa9236d8", size = 1022741 }, - { url = "https://files.pythonhosted.org/packages/38/01/a24598f5f31b8582a92fe9c41bf91caeed50d5b5eaa7576e6f8b23cb488d/fastavro-1.10.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:566c193109ff0ff84f1072a165b7106c4f96050078a4e6ac7391f81ca1ef3efa", size = 3237421 }, - { url = "https://files.pythonhosted.org/packages/a7/bf/08bcf65cfb7feb0e5b1329fafeb4a9b95b7b5ec723ba58c7dbd0d04ded34/fastavro-1.10.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e400d2e55d068404d9fea7c5021f8b999c6f9d9afa1d1f3652ec92c105ffcbdd", size = 3300222 }, - { url = "https://files.pythonhosted.org/packages/53/4d/a6c25f3166328f8306ec2e6be1123ed78a55b8ab774a43a661124508881f/fastavro-1.10.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9b8227497f71565270f9249fc9af32a93644ca683a0167cfe66d203845c3a038", size = 3233276 }, - { url = "https://files.pythonhosted.org/packages/47/1c/b2b2ce2bf866a248ae23e96a87b3b8369427ff79be9112073039bee1d245/fastavro-1.10.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8e62d04c65461b30ac6d314e4197ad666371e97ae8cb2c16f971d802f6c7f514", size = 3388936 }, - { url = "https://files.pythonhosted.org/packages/1f/2c/43927e22a2d57587b3aa09765098a6d833246b672d34c10c5f135414745a/fastavro-1.10.0-cp313-cp313-win_amd64.whl", hash = "sha256:86baf8c9740ab570d0d4d18517da71626fe9be4d1142bea684db52bd5adb078f", size = 483967 }, -] - -[[package]] -name = "filelock" -version = "3.17.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/dc/9c/0b15fb47b464e1b663b1acd1253a062aa5feecb07d4e597daea542ebd2b5/filelock-3.17.0.tar.gz", hash = "sha256:ee4e77401ef576ebb38cd7f13b9b28893194acc20a8e68e18730ba9c0e54660e", size = 18027 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/89/ec/00d68c4ddfedfe64159999e5f8a98fb8442729a63e2077eb9dcd89623d27/filelock-3.17.0-py3-none-any.whl", hash = "sha256:533dc2f7ba78dc2f0f531fc6c4940addf7b70a481e269a5a3b93be94ffbe8338", size = 16164 }, -] - -[[package]] -name = "fsspec" -version = "2025.2.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b5/79/68612ed99700e6413de42895aa725463e821a6b3be75c87fcce1b4af4c70/fsspec-2025.2.0.tar.gz", hash = "sha256:1c24b16eaa0a1798afa0337aa0db9b256718ab2a89c425371f5628d22c3b6afd", size = 292283 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e2/94/758680531a00d06e471ef649e4ec2ed6bf185356a7f9fbfbb7368a40bd49/fsspec-2025.2.0-py3-none-any.whl", hash = "sha256:9de2ad9ce1f85e1931858535bc882543171d197001a0a5eb2ddc04f1781ab95b", size = 184484 }, -] - -[[package]] -name = "google-auth" -version = "2.38.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "cachetools" }, - { name = "pyasn1-modules" }, - { name = "rsa" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/c6/eb/d504ba1daf190af6b204a9d4714d457462b486043744901a6eeea711f913/google_auth-2.38.0.tar.gz", hash = "sha256:8285113607d3b80a3f1543b75962447ba8a09fe85783432a784fdeef6ac094c4", size = 270866 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/9d/47/603554949a37bca5b7f894d51896a9c534b9eab808e2520a748e081669d0/google_auth-2.38.0-py2.py3-none-any.whl", hash = "sha256:e7dae6694313f434a2727bf2906f27ad259bae090d7aa896590d86feec3d9d4a", size = 210770 }, -] - -[[package]] -name = "griffe" -version = "1.5.6" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "colorama" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/88/f0/a001e06c321dfa220103418259afbac50b933eac7a86657a4b572f0517e8/griffe-1.5.6.tar.gz", hash = "sha256:181f6666d5aceb6cd6e2da5a2b646cfb431e47a0da1fda283845734b67e10944", size = 391173 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b6/87/505777c4e5ca9c4fa5ae53fa4b0d5c2ba13a6d55a503a5594e94a2ba9b5a/griffe-1.5.6-py3-none-any.whl", hash = "sha256:b2a3afe497c6c1f952e54a23095ecc09435016293e77af8478ed65df1022a394", size = 128176 }, -] - -[[package]] -name = "groq" -version = "0.18.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "anyio" }, - { name = "distro" }, - { name = "httpx" }, - { name = "pydantic" }, - { name = "sniffio" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/40/8c/e72c164474a88dfed6c7327ad53cb87ff11566b74b3a76d41dc7b94fc51c/groq-0.18.0.tar.gz", hash = "sha256:8e2ccfea406d68b3525af4b7c0e321fcb3d2a73fc60bb70b4156e6cd88c72f03", size = 117322 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b0/6c/5a53d632b44ef7655ac8d9b34432e13160917f9307c94b1467efd34e336e/groq-0.18.0-py3-none-any.whl", hash = "sha256:81d5ac00057a45d8ce559d23ab5d3b3893011d1f12c35187ab35a9182d826ea6", size = 121911 }, -] - -[[package]] -name = "h11" -version = "0.14.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f5/38/3af3d3633a34a3316095b39c8e8fb4853a28a536e55d347bd8d8e9a14b03/h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d", size = 100418 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/95/04/ff642e65ad6b90db43e668d70ffb6736436c7ce41fcc549f4e9472234127/h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761", size = 58259 }, -] - -[[package]] -name = "httpcore" -version = "1.0.7" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "certifi" }, - { name = "h11" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/6a/41/d7d0a89eb493922c37d343b607bc1b5da7f5be7e383740b4753ad8943e90/httpcore-1.0.7.tar.gz", hash = "sha256:8551cb62a169ec7162ac7be8d4817d561f60e08eaa485234898414bb5a8a0b4c", size = 85196 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/87/f5/72347bc88306acb359581ac4d52f23c0ef445b57157adedb9aee0cd689d2/httpcore-1.0.7-py3-none-any.whl", hash = "sha256:a3fff8f43dc260d5bd363d9f9cf1830fa3a458b332856f34282de498ed420edd", size = 78551 }, -] - -[[package]] -name = "httptools" -version = "0.6.4" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a7/9a/ce5e1f7e131522e6d3426e8e7a490b3a01f39a6696602e1c4f33f9e94277/httptools-0.6.4.tar.gz", hash = "sha256:4e93eee4add6493b59a5c514da98c939b244fce4a0d8879cd3f466562f4b7d5c", size = 240639 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/94/a3/9fe9ad23fd35f7de6b91eeb60848986058bd8b5a5c1e256f5860a160cc3e/httptools-0.6.4-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ade273d7e767d5fae13fa637f4d53b6e961fb7fd93c7797562663f0171c26660", size = 197214 }, - { url = "https://files.pythonhosted.org/packages/ea/d9/82d5e68bab783b632023f2fa31db20bebb4e89dfc4d2293945fd68484ee4/httptools-0.6.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:856f4bc0478ae143bad54a4242fccb1f3f86a6e1be5548fecfd4102061b3a083", size = 102431 }, - { url = "https://files.pythonhosted.org/packages/96/c1/cb499655cbdbfb57b577734fde02f6fa0bbc3fe9fb4d87b742b512908dff/httptools-0.6.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:322d20ea9cdd1fa98bd6a74b77e2ec5b818abdc3d36695ab402a0de8ef2865a3", size = 473121 }, - { url = "https://files.pythonhosted.org/packages/af/71/ee32fd358f8a3bb199b03261f10921716990808a675d8160b5383487a317/httptools-0.6.4-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4d87b29bd4486c0093fc64dea80231f7c7f7eb4dc70ae394d70a495ab8436071", size = 473805 }, - { url = "https://files.pythonhosted.org/packages/8a/0a/0d4df132bfca1507114198b766f1737d57580c9ad1cf93c1ff673e3387be/httptools-0.6.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:342dd6946aa6bda4b8f18c734576106b8a31f2fe31492881a9a160ec84ff4bd5", size = 448858 }, - { url = "https://files.pythonhosted.org/packages/1e/6a/787004fdef2cabea27bad1073bf6a33f2437b4dbd3b6fb4a9d71172b1c7c/httptools-0.6.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4b36913ba52008249223042dca46e69967985fb4051951f94357ea681e1f5dc0", size = 452042 }, - { url = "https://files.pythonhosted.org/packages/4d/dc/7decab5c404d1d2cdc1bb330b1bf70e83d6af0396fd4fc76fc60c0d522bf/httptools-0.6.4-cp313-cp313-win_amd64.whl", hash = "sha256:28908df1b9bb8187393d5b5db91435ccc9c8e891657f9cbb42a2541b44c82fc8", size = 87682 }, -] - -[[package]] -name = "httpx" -version = "0.28.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "anyio" }, - { name = "certifi" }, - { name = "httpcore" }, - { name = "idna" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517 }, -] - -[[package]] -name = "httpx-sse" -version = "0.4.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/4c/60/8f4281fa9bbf3c8034fd54c0e7412e66edbab6bc74c4996bd616f8d0406e/httpx-sse-0.4.0.tar.gz", hash = "sha256:1e81a3a3070ce322add1d3529ed42eb5f70817f45ed6ec915ab753f961139721", size = 12624 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e1/9b/a181f281f65d776426002f330c31849b86b31fc9d848db62e16f03ff739f/httpx_sse-0.4.0-py3-none-any.whl", hash = "sha256:f329af6eae57eaa2bdfd962b42524764af68075ea87370a2de920af5341e318f", size = 7819 }, -] - -[[package]] -name = "huggingface-hub" -version = "0.28.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "filelock" }, - { name = "fsspec" }, - { name = "packaging" }, - { name = "pyyaml" }, - { name = "requests" }, - { name = "tqdm" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/e7/ce/a734204aaae6c35a22f9956ebcd8d8708ae5b842e15d6f42bd6f49e634a4/huggingface_hub-0.28.1.tar.gz", hash = "sha256:893471090c98e3b6efbdfdacafe4052b20b84d59866fb6f54c33d9af18c303ae", size = 387074 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ea/da/6c2bea5327b640920267d3bf2c9fc114cfbd0a5de234d81cda80cc9e33c8/huggingface_hub-0.28.1-py3-none-any.whl", hash = "sha256:aa6b9a3ffdae939b72c464dbb0d7f99f56e649b55c3d52406f49e0a5a620c0a7", size = 464068 }, -] - -[[package]] -name = "idna" -version = "3.10" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442 }, -] - -[[package]] -name = "jinja2" -version = "3.1.5" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "markupsafe" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/af/92/b3130cbbf5591acf9ade8708c365f3238046ac7cb8ccba6e81abccb0ccff/jinja2-3.1.5.tar.gz", hash = "sha256:8fefff8dc3034e27bb80d67c671eb8a9bc424c0ef4c0826edbff304cceff43bb", size = 244674 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/bd/0f/2ba5fbcd631e3e88689309dbe978c5769e883e4b84ebfe7da30b43275c5a/jinja2-3.1.5-py3-none-any.whl", hash = "sha256:aba0f4dc9ed8013c424088f68a5c226f7d6097ed89b246d7749c2ec4175c6adb", size = 134596 }, -] - -[[package]] -name = "jiter" -version = "0.8.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f8/70/90bc7bd3932e651486861df5c8ffea4ca7c77d28e8532ddefe2abc561a53/jiter-0.8.2.tar.gz", hash = "sha256:cd73d3e740666d0e639f678adb176fad25c1bcbdae88d8d7b857e1783bb4212d", size = 163007 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/6c/b0/bfa1f6f2c956b948802ef5a021281978bf53b7a6ca54bb126fd88a5d014e/jiter-0.8.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:ca1f08b8e43dc3bd0594c992fb1fd2f7ce87f7bf0d44358198d6da8034afdf84", size = 301190 }, - { url = "https://files.pythonhosted.org/packages/a4/8f/396ddb4e292b5ea57e45ade5dc48229556b9044bad29a3b4b2dddeaedd52/jiter-0.8.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5672a86d55416ccd214c778efccf3266b84f87b89063b582167d803246354be4", size = 309334 }, - { url = "https://files.pythonhosted.org/packages/7f/68/805978f2f446fa6362ba0cc2e4489b945695940656edd844e110a61c98f8/jiter-0.8.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58dc9bc9767a1101f4e5e22db1b652161a225874d66f0e5cb8e2c7d1c438b587", size = 333918 }, - { url = "https://files.pythonhosted.org/packages/b3/99/0f71f7be667c33403fa9706e5b50583ae5106d96fab997fa7e2f38ee8347/jiter-0.8.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:37b2998606d6dadbb5ccda959a33d6a5e853252d921fec1792fc902351bb4e2c", size = 356057 }, - { url = "https://files.pythonhosted.org/packages/8d/50/a82796e421a22b699ee4d2ce527e5bcb29471a2351cbdc931819d941a167/jiter-0.8.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4ab9a87f3784eb0e098f84a32670cfe4a79cb6512fd8f42ae3d0709f06405d18", size = 379790 }, - { url = "https://files.pythonhosted.org/packages/3c/31/10fb012b00f6d83342ca9e2c9618869ab449f1aa78c8f1b2193a6b49647c/jiter-0.8.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:79aec8172b9e3c6d05fd4b219d5de1ac616bd8da934107325a6c0d0e866a21b6", size = 388285 }, - { url = "https://files.pythonhosted.org/packages/c8/81/f15ebf7de57be488aa22944bf4274962aca8092e4f7817f92ffa50d3ee46/jiter-0.8.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:711e408732d4e9a0208008e5892c2966b485c783cd2d9a681f3eb147cf36c7ef", size = 344764 }, - { url = "https://files.pythonhosted.org/packages/b3/e8/0cae550d72b48829ba653eb348cdc25f3f06f8a62363723702ec18e7be9c/jiter-0.8.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:653cf462db4e8c41995e33d865965e79641ef45369d8a11f54cd30888b7e6ff1", size = 376620 }, - { url = "https://files.pythonhosted.org/packages/b8/50/e5478ff9d82534a944c03b63bc217c5f37019d4a34d288db0f079b13c10b/jiter-0.8.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:9c63eaef32b7bebac8ebebf4dabebdbc6769a09c127294db6babee38e9f405b9", size = 510402 }, - { url = "https://files.pythonhosted.org/packages/8e/1e/3de48bbebbc8f7025bd454cedc8c62378c0e32dd483dece5f4a814a5cb55/jiter-0.8.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:eb21aaa9a200d0a80dacc7a81038d2e476ffe473ffdd9c91eb745d623561de05", size = 503018 }, - { url = "https://files.pythonhosted.org/packages/d5/cd/d5a5501d72a11fe3e5fd65c78c884e5164eefe80077680533919be22d3a3/jiter-0.8.2-cp313-cp313-win32.whl", hash = "sha256:789361ed945d8d42850f919342a8665d2dc79e7e44ca1c97cc786966a21f627a", size = 203190 }, - { url = "https://files.pythonhosted.org/packages/51/bf/e5ca301245ba951447e3ad677a02a64a8845b185de2603dabd83e1e4b9c6/jiter-0.8.2-cp313-cp313-win_amd64.whl", hash = "sha256:ab7f43235d71e03b941c1630f4b6e3055d46b6cb8728a17663eaac9d8e83a865", size = 203551 }, - { url = "https://files.pythonhosted.org/packages/2f/3c/71a491952c37b87d127790dd7a0b1ebea0514c6b6ad30085b16bbe00aee6/jiter-0.8.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:b426f72cd77da3fec300ed3bc990895e2dd6b49e3bfe6c438592a3ba660e41ca", size = 308347 }, - { url = "https://files.pythonhosted.org/packages/a0/4c/c02408042e6a7605ec063daed138e07b982fdb98467deaaf1c90950cf2c6/jiter-0.8.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b2dd880785088ff2ad21ffee205e58a8c1ddabc63612444ae41e5e4b321b39c0", size = 342875 }, - { url = "https://files.pythonhosted.org/packages/91/61/c80ef80ed8a0a21158e289ef70dac01e351d929a1c30cb0f49be60772547/jiter-0.8.2-cp313-cp313t-win_amd64.whl", hash = "sha256:3ac9f578c46f22405ff7f8b1f5848fb753cc4b8377fbec8470a7dc3997ca7566", size = 202374 }, -] - -[[package]] -name = "jsonpath-python" -version = "1.0.6" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b5/49/e582e50b0c54c1b47e714241c4a4767bf28758bf90212248aea8e1ce8516/jsonpath-python-1.0.6.tar.gz", hash = "sha256:dd5be4a72d8a2995c3f583cf82bf3cd1a9544cfdabf2d22595b67aff07349666", size = 18121 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/16/8a/d63959f4eff03893a00e6e63592e3a9f15b9266ed8e0275ab77f8c7dbc94/jsonpath_python-1.0.6-py3-none-any.whl", hash = "sha256:1e3b78df579f5efc23565293612decee04214609208a2335884b3ee3f786b575", size = 7552 }, -] - -[[package]] -name = "logfire-api" -version = "3.5.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/94/ae/44e0104022f1b52386cb5dfbcaaaa2e2e8c9a2bb335a65f609ffe34c1387/logfire_api-3.5.3.tar.gz", hash = "sha256:2c15a0ad6f12f39003f62550a35f9247c29c87b466f7839836f346867442a55c", size = 44669 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/5c/21/7f18dc3154caa396fb2161f89c980882111537a4261dbc7a6b902cf9fc58/logfire_api-3.5.3-py3-none-any.whl", hash = "sha256:abecb0d2e43f900c58582c333f261c8f9b187e72933cf3f5aec93685666f86ae", size = 73821 }, -] - -[[package]] -name = "markdown-it-py" -version = "3.0.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "mdurl" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/38/71/3b932df36c1a044d397a1f92d1cf91ee0a503d91e470cbd670aa66b07ed0/markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb", size = 74596 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", size = 87528 }, -] - -[[package]] -name = "markupsafe" -version = "2.1.5" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/87/5b/aae44c6655f3801e81aa3eef09dbbf012431987ba564d7231722f68df02d/MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b", size = 19384 } - -[[package]] -name = "mdurl" -version = "0.1.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979 }, -] - -[[package]] -name = "mistralai" -version = "1.5.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "eval-type-backport" }, - { name = "httpx" }, - { name = "jsonpath-python" }, - { name = "pydantic" }, - { name = "python-dateutil" }, - { name = "typing-inspect" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/16/9d/aba193fdfe0fc7403efa380189143d965becfb1bc7df3230e5c7664f8c53/mistralai-1.5.0.tar.gz", hash = "sha256:fd94bc93bc25aad9c6dd8005b1a0bc4ba1250c6b3fbf855a49936989cc6e5c0d", size = 131647 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/58/e7/7147c75c383a975c58c33f8e7ee7dbbb0e7390fbcb1ecd321f63e4c73efd/mistralai-1.5.0-py3-none-any.whl", hash = "sha256:9372537719f87bd6f9feef4747d0bf1f4fbe971f8c02945ca4b4bf3c94571c97", size = 271559 }, -] - -[[package]] -name = "mypy-extensions" -version = "1.0.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/98/a4/1ab47638b92648243faf97a5aeb6ea83059cc3624972ab6b8d2316078d3f/mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782", size = 4433 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/2a/e2/5d3f6ada4297caebe1a2add3b126fe800c96f56dbe5d1988a2cbe0b267aa/mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d", size = 4695 }, -] - -[[package]] -name = "openai" -version = "1.61.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "anyio" }, - { name = "distro" }, - { name = "httpx" }, - { name = "jiter" }, - { name = "pydantic" }, - { name = "sniffio" }, - { name = "tqdm" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/d9/cf/61e71ce64cf0a38f029da0f9a5f10c9fa0e69a7a977b537126dac50adfea/openai-1.61.1.tar.gz", hash = "sha256:ce1851507218209961f89f3520e06726c0aa7d0512386f0f977e3ac3e4f2472e", size = 350784 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/9a/b6/2e2a011b2dc27a6711376808b4cd8c922c476ea0f1420b39892117fa8563/openai-1.61.1-py3-none-any.whl", hash = "sha256:72b0826240ce26026ac2cd17951691f046e5be82ad122d20a8e1b30ca18bd11e", size = 463126 }, -] - -[[package]] -name = "packaging" -version = "24.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d0/63/68dbb6eb2de9cb10ee4c9c14a0148804425e13c4fb20d61cce69f53106da/packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f", size = 163950 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/88/ef/eb23f262cca3c0c4eb7ab1933c3b1f03d021f2c48f54763065b6f0e321be/packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759", size = 65451 }, -] - -[[package]] -name = "pyasn1" -version = "0.6.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ba/e9/01f1a64245b89f039897cb0130016d79f77d52669aae6ee7b159a6c4c018/pyasn1-0.6.1.tar.gz", hash = "sha256:6f580d2bdd84365380830acf45550f2511469f673cb4a5ae3857a3170128b034", size = 145322 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c8/f1/d6a797abb14f6283c0ddff96bbdd46937f64122b8c925cab503dd37f8214/pyasn1-0.6.1-py3-none-any.whl", hash = "sha256:0d632f46f2ba09143da3a8afe9e33fb6f92fa2320ab7e886e2d0f7672af84629", size = 83135 }, -] - -[[package]] -name = "pyasn1-modules" -version = "0.4.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "pyasn1" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/1d/67/6afbf0d507f73c32d21084a79946bfcfca5fbc62a72057e9c23797a737c9/pyasn1_modules-0.4.1.tar.gz", hash = "sha256:c28e2dbf9c06ad61c71a075c7e0f9fd0f1b0bb2d2ad4377f240d33ac2ab60a7c", size = 310028 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/77/89/bc88a6711935ba795a679ea6ebee07e128050d6382eaa35a0a47c8032bdc/pyasn1_modules-0.4.1-py3-none-any.whl", hash = "sha256:49bfa96b45a292b711e986f222502c1c9a5e1f4e568fc30e2574a6c7d07838fd", size = 181537 }, -] - -[[package]] -name = "pydantic" -version = "2.10.6" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "annotated-types" }, - { name = "pydantic-core" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/b7/ae/d5220c5c52b158b1de7ca89fc5edb72f304a70a4c540c84c8844bf4008de/pydantic-2.10.6.tar.gz", hash = "sha256:ca5daa827cce33de7a42be142548b0096bf05a7e7b365aebfa5f8eeec7128236", size = 761681 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f4/3c/8cc1cc84deffa6e25d2d0c688ebb80635dfdbf1dbea3e30c541c8cf4d860/pydantic-2.10.6-py3-none-any.whl", hash = "sha256:427d664bf0b8a2b34ff5dd0f5a18df00591adcee7198fbd71981054cef37b584", size = 431696 }, -] - -[[package]] -name = "pydantic-ai" -version = "0.0.22" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "pydantic-ai-slim", extra = ["anthropic", "cohere", "groq", "mistral", "openai", "vertexai"] }, -] -sdist = { url = "https://files.pythonhosted.org/packages/1e/16/244f7592f5b3ba9dde6d1c5682d3fcf9653ecf2b55800d7ec55919312deb/pydantic_ai-0.0.22.tar.gz", hash = "sha256:121af7542a0e80a4cd84d958e5675cb229215e1b744cbcc45c864f449ffbc56e", size = 70521 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/24/05/efaf3d2670deb61d10ee4bcef551ccf3de42348d3b0df53ee6247127119a/pydantic_ai-0.0.22-py3-none-any.whl", hash = "sha256:dd397bdadc78500c91bcc7667e212c315a990face4630de553022ae6c3d4face", size = 9837 }, -] - -[[package]] -name = "pydantic-ai-slim" -version = "0.0.22" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "eval-type-backport" }, - { name = "griffe" }, - { name = "httpx" }, - { name = "logfire-api" }, - { name = "pydantic" }, - { name = "pydantic-graph" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/7b/1f/be208faabd625fb01ecc6215ebda0bfef6557c15f6b7f656344969cee80b/pydantic_ai_slim-0.0.22.tar.gz", hash = "sha256:529f88c09cf190f583aa5c1bc2c1c84603f563aa8eb7697013e795e2e67c725b", size = 73151 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/3c/3a/e080e6007204affcf96ad0aa0a3aca9ec1cdbce2d0ef292097e70b85cd11/pydantic_ai_slim-0.0.22-py3-none-any.whl", hash = "sha256:18e5a60aceae9b62a1db02fe635926099ab7c2263564f3439827f37a1bfa8ea3", size = 93996 }, -] - -[package.optional-dependencies] -anthropic = [ - { name = "anthropic" }, -] -cohere = [ - { name = "cohere" }, -] -groq = [ - { name = "groq" }, -] -mistral = [ - { name = "mistralai" }, -] -openai = [ - { name = "openai" }, -] -vertexai = [ - { name = "google-auth" }, - { name = "requests" }, -] - -[[package]] -name = "pydantic-core" -version = "2.27.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/fc/01/f3e5ac5e7c25833db5eb555f7b7ab24cd6f8c322d3a3ad2d67a952dc0abc/pydantic_core-2.27.2.tar.gz", hash = "sha256:eb026e5a4c1fee05726072337ff51d1efb6f59090b7da90d30ea58625b1ffb39", size = 413443 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/41/b1/9bc383f48f8002f99104e3acff6cba1231b29ef76cfa45d1506a5cad1f84/pydantic_core-2.27.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:7d14bd329640e63852364c306f4d23eb744e0f8193148d4044dd3dacdaacbd8b", size = 1892709 }, - { url = "https://files.pythonhosted.org/packages/10/6c/e62b8657b834f3eb2961b49ec8e301eb99946245e70bf42c8817350cbefc/pydantic_core-2.27.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:82f91663004eb8ed30ff478d77c4d1179b3563df6cdb15c0817cd1cdaf34d154", size = 1811273 }, - { url = "https://files.pythonhosted.org/packages/ba/15/52cfe49c8c986e081b863b102d6b859d9defc63446b642ccbbb3742bf371/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71b24c7d61131bb83df10cc7e687433609963a944ccf45190cfc21e0887b08c9", size = 1823027 }, - { url = "https://files.pythonhosted.org/packages/b1/1c/b6f402cfc18ec0024120602bdbcebc7bdd5b856528c013bd4d13865ca473/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fa8e459d4954f608fa26116118bb67f56b93b209c39b008277ace29937453dc9", size = 1868888 }, - { url = "https://files.pythonhosted.org/packages/bd/7b/8cb75b66ac37bc2975a3b7de99f3c6f355fcc4d89820b61dffa8f1e81677/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce8918cbebc8da707ba805b7fd0b382816858728ae7fe19a942080c24e5b7cd1", size = 2037738 }, - { url = "https://files.pythonhosted.org/packages/c8/f1/786d8fe78970a06f61df22cba58e365ce304bf9b9f46cc71c8c424e0c334/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eda3f5c2a021bbc5d976107bb302e0131351c2ba54343f8a496dc8783d3d3a6a", size = 2685138 }, - { url = "https://files.pythonhosted.org/packages/a6/74/d12b2cd841d8724dc8ffb13fc5cef86566a53ed358103150209ecd5d1999/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd8086fa684c4775c27f03f062cbb9eaa6e17f064307e86b21b9e0abc9c0f02e", size = 1997025 }, - { url = "https://files.pythonhosted.org/packages/a0/6e/940bcd631bc4d9a06c9539b51f070b66e8f370ed0933f392db6ff350d873/pydantic_core-2.27.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8d9b3388db186ba0c099a6d20f0604a44eabdeef1777ddd94786cdae158729e4", size = 2004633 }, - { url = "https://files.pythonhosted.org/packages/50/cc/a46b34f1708d82498c227d5d80ce615b2dd502ddcfd8376fc14a36655af1/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7a66efda2387de898c8f38c0cf7f14fca0b51a8ef0b24bfea5849f1b3c95af27", size = 1999404 }, - { url = "https://files.pythonhosted.org/packages/ca/2d/c365cfa930ed23bc58c41463bae347d1005537dc8db79e998af8ba28d35e/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:18a101c168e4e092ab40dbc2503bdc0f62010e95d292b27827871dc85450d7ee", size = 2130130 }, - { url = "https://files.pythonhosted.org/packages/f4/d7/eb64d015c350b7cdb371145b54d96c919d4db516817f31cd1c650cae3b21/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ba5dd002f88b78a4215ed2f8ddbdf85e8513382820ba15ad5ad8955ce0ca19a1", size = 2157946 }, - { url = "https://files.pythonhosted.org/packages/a4/99/bddde3ddde76c03b65dfd5a66ab436c4e58ffc42927d4ff1198ffbf96f5f/pydantic_core-2.27.2-cp313-cp313-win32.whl", hash = "sha256:1ebaf1d0481914d004a573394f4be3a7616334be70261007e47c2a6fe7e50130", size = 1834387 }, - { url = "https://files.pythonhosted.org/packages/71/47/82b5e846e01b26ac6f1893d3c5f9f3a2eb6ba79be26eef0b759b4fe72946/pydantic_core-2.27.2-cp313-cp313-win_amd64.whl", hash = "sha256:953101387ecf2f5652883208769a79e48db18c6df442568a0b5ccd8c2723abee", size = 1990453 }, - { url = "https://files.pythonhosted.org/packages/51/b2/b2b50d5ecf21acf870190ae5d093602d95f66c9c31f9d5de6062eb329ad1/pydantic_core-2.27.2-cp313-cp313-win_arm64.whl", hash = "sha256:ac4dbfd1691affb8f48c2c13241a2e3b60ff23247cbcf981759c768b6633cf8b", size = 1885186 }, -] - -[[package]] -name = "pydantic-graph" -version = "0.0.22" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "httpx" }, - { name = "logfire-api" }, - { name = "pydantic" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/ec/43/c90a7c65e16f0ac05aaaadc12b5e28fe09aeb1826936872cf9ae8d0a758e/pydantic_graph-0.0.22.tar.gz", hash = "sha256:c72baca5c1ac7f5445a52bbe63c25c0d060c6b70b7de956700753b2401f470fe", size = 13697 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/11/3b/ea04ad0c1ab037fd00130bb59eb2d9e2cf97afe2d6bb65a206b274df9ef6/pydantic_graph-0.0.22-py3-none-any.whl", hash = "sha256:5388f0f877964bc5684c03f5ec91330e096d6f6a1e7fc82ca5cdeffeeeff1038", size = 16860 }, -] - -[[package]] -name = "pygments" -version = "2.19.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/7c/2d/c3338d48ea6cc0feb8446d8e6937e1408088a72a39937982cc6111d17f84/pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f", size = 4968581 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/8a/0b/9fcc47d19c48b59121088dd6da2488a49d5f72dacf8262e2790a1d2c7d15/pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c", size = 1225293 }, -] - -[[package]] -name = "python-dateutil" -version = "2.9.0.post0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "six" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892 }, -] - -[[package]] -name = "python-dotenv" -version = "1.0.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/bc/57/e84d88dfe0aec03b7a2d4327012c1627ab5f03652216c63d49846d7a6c58/python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca", size = 39115 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/6a/3e/b68c118422ec867fa7ab88444e1274aa40681c606d59ac27de5a5588f082/python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a", size = 19863 }, -] - -[[package]] -name = "python-multipart" -version = "0.0.20" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f3/87/f44d7c9f274c7ee665a29b885ec97089ec5dc034c7f3fafa03da9e39a09e/python_multipart-0.0.20.tar.gz", hash = "sha256:8dd0cab45b8e23064ae09147625994d090fa46f5b0d1e13af944c331a7fa9d13", size = 37158 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/45/58/38b5afbc1a800eeea951b9285d3912613f2603bdf897a4ab0f4bd7f405fc/python_multipart-0.0.20-py3-none-any.whl", hash = "sha256:8a62d3a8335e06589fe01f2a3e178cdcc632f3fbe0d492ad9ee0ec35aab1f104", size = 24546 }, -] - -[[package]] -name = "pyyaml" -version = "6.0.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/54/ed/79a089b6be93607fa5cdaedf301d7dfb23af5f25c398d5ead2525b063e17/pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", size = 130631 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ef/e3/3af305b830494fa85d95f6d95ef7fa73f2ee1cc8ef5b495c7c3269fb835f/PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba", size = 181309 }, - { url = "https://files.pythonhosted.org/packages/45/9f/3b1c20a0b7a3200524eb0076cc027a970d320bd3a6592873c85c92a08731/PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1", size = 171679 }, - { url = "https://files.pythonhosted.org/packages/7c/9a/337322f27005c33bcb656c655fa78325b730324c78620e8328ae28b64d0c/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133", size = 733428 }, - { url = "https://files.pythonhosted.org/packages/a3/69/864fbe19e6c18ea3cc196cbe5d392175b4cf3d5d0ac1403ec3f2d237ebb5/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484", size = 763361 }, - { url = "https://files.pythonhosted.org/packages/04/24/b7721e4845c2f162d26f50521b825fb061bc0a5afcf9a386840f23ea19fa/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5", size = 759523 }, - { url = "https://files.pythonhosted.org/packages/2b/b2/e3234f59ba06559c6ff63c4e10baea10e5e7df868092bf9ab40e5b9c56b6/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc", size = 726660 }, - { url = "https://files.pythonhosted.org/packages/fe/0f/25911a9f080464c59fab9027482f822b86bf0608957a5fcc6eaac85aa515/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652", size = 751597 }, - { url = "https://files.pythonhosted.org/packages/14/0d/e2c3b43bbce3cf6bd97c840b46088a3031085179e596d4929729d8d68270/PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", size = 140527 }, - { url = "https://files.pythonhosted.org/packages/fa/de/02b54f42487e3d3c6efb3f89428677074ca7bf43aae402517bc7cca949f3/PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", size = 156446 }, -] - -[[package]] -name = "reaperbot" -version = "0.1.0" -source = { virtual = "." } -dependencies = [ - { name = "devtools" }, - { name = "fastapi" }, - { name = "httpx" }, - { name = "jinja2" }, - { name = "openai" }, - { name = "pydantic-ai" }, - { name = "python-dotenv" }, - { name = "python-multipart" }, - { name = "rich" }, - { name = "tenacity" }, - { name = "uvicorn", extra = ["standard"] }, -] - -[package.metadata] -requires-dist = [ - { name = "devtools", specifier = ">=0.12.2" }, - { name = "fastapi", specifier = ">=0.115.8" }, - { name = "httpx", specifier = ">=0.28.1" }, - { name = "jinja2", specifier = ">=3.1.5" }, - { name = "openai", specifier = ">=1.61.1" }, - { name = "pydantic-ai", specifier = ">=0.0.22" }, - { name = "python-dotenv", specifier = ">=1.0.1" }, - { name = "python-multipart", specifier = ">=0.0.20" }, - { name = "rich", specifier = ">=13.9.4" }, - { name = "tenacity", specifier = ">=9.0.0" }, - { name = "uvicorn", extras = ["standard"], specifier = ">=0.33.0" }, -] - -[[package]] -name = "requests" -version = "2.32.3" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "certifi" }, - { name = "charset-normalizer" }, - { name = "idna" }, - { name = "urllib3" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/63/70/2bf7780ad2d390a8d301ad0b550f1581eadbd9a20f896afe06353c2a2913/requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", size = 131218 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", size = 64928 }, -] - -[[package]] -name = "rich" -version = "13.9.4" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "markdown-it-py" }, - { name = "pygments" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/ab/3a/0316b28d0761c6734d6bc14e770d85506c986c85ffb239e688eeaab2c2bc/rich-13.9.4.tar.gz", hash = "sha256:439594978a49a09530cff7ebc4b5c7103ef57baf48d5ea3184f21d9a2befa098", size = 223149 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/19/71/39c7c0d87f8d4e6c020a393182060eaefeeae6c01dab6a84ec346f2567df/rich-13.9.4-py3-none-any.whl", hash = "sha256:6049d5e6ec054bf2779ab3358186963bac2ea89175919d699e378b99738c2a90", size = 242424 }, -] - -[[package]] -name = "rsa" -version = "4.9" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "pyasn1" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/aa/65/7d973b89c4d2351d7fb232c2e452547ddfa243e93131e7cfa766da627b52/rsa-4.9.tar.gz", hash = "sha256:e38464a49c6c85d7f1351b0126661487a7e0a14a50f1675ec50eb34d4f20ef21", size = 29711 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/49/97/fa78e3d2f65c02c8e1268b9aba606569fe97f6c8f7c2d74394553347c145/rsa-4.9-py3-none-any.whl", hash = "sha256:90260d9058e514786967344d0ef75fa8727eed8a7d2e43ce9f4bcf1b536174f7", size = 34315 }, -] - -[[package]] -name = "six" -version = "1.17.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050 }, -] - -[[package]] -name = "sniffio" -version = "1.3.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235 }, -] - -[[package]] -name = "starlette" -version = "0.44.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "anyio" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/8d/b4/910f693584958b687b8f9c628f8217cfef19a42b64d2de7840814937365c/starlette-0.44.0.tar.gz", hash = "sha256:e35166950a3ccccc701962fe0711db0bc14f2ecd37c6f9fe5e3eae0cbaea8715", size = 2575579 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b6/c5/7ae467eeddb57260c8ce17a3a09f9f5edba35820fc022d7c55b7decd5d3a/starlette-0.44.0-py3-none-any.whl", hash = "sha256:19edeb75844c16dcd4f9dd72f22f9108c1539f3fc9c4c88885654fef64f85aea", size = 73412 }, -] - -[[package]] -name = "tenacity" -version = "9.0.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/cd/94/91fccdb4b8110642462e653d5dcb27e7b674742ad68efd146367da7bdb10/tenacity-9.0.0.tar.gz", hash = "sha256:807f37ca97d62aa361264d497b0e31e92b8027044942bfa756160d908320d73b", size = 47421 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b6/cb/b86984bed139586d01532a587464b5805f12e397594f19f931c4c2fbfa61/tenacity-9.0.0-py3-none-any.whl", hash = "sha256:93de0c98785b27fcf659856aa9f54bfbd399e29969b0621bc7f762bd441b4539", size = 28169 }, -] - -[[package]] -name = "tokenizers" -version = "0.21.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "huggingface-hub" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/20/41/c2be10975ca37f6ec40d7abd7e98a5213bb04f284b869c1a24e6504fd94d/tokenizers-0.21.0.tar.gz", hash = "sha256:ee0894bf311b75b0c03079f33859ae4b2334d675d4e93f5a4132e1eae2834fe4", size = 343021 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b0/5c/8b09607b37e996dc47e70d6a7b6f4bdd4e4d5ab22fe49d7374565c7fefaf/tokenizers-0.21.0-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:3c4c93eae637e7d2aaae3d376f06085164e1660f89304c0ab2b1d08a406636b2", size = 2647461 }, - { url = "https://files.pythonhosted.org/packages/22/7a/88e58bb297c22633ed1c9d16029316e5b5ac5ee44012164c2edede599a5e/tokenizers-0.21.0-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:f53ea537c925422a2e0e92a24cce96f6bc5046bbef24a1652a5edc8ba975f62e", size = 2563639 }, - { url = "https://files.pythonhosted.org/packages/f7/14/83429177c19364df27d22bc096d4c2e431e0ba43e56c525434f1f9b0fd00/tokenizers-0.21.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b177fb54c4702ef611de0c069d9169f0004233890e0c4c5bd5508ae05abf193", size = 2903304 }, - { url = "https://files.pythonhosted.org/packages/7e/db/3433eab42347e0dc5452d8fcc8da03f638c9accffefe5a7c78146666964a/tokenizers-0.21.0-cp39-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6b43779a269f4629bebb114e19c3fca0223296ae9fea8bb9a7a6c6fb0657ff8e", size = 2804378 }, - { url = "https://files.pythonhosted.org/packages/57/8b/7da5e6f89736c2ade02816b4733983fca1c226b0c42980b1ae9dc8fcf5cc/tokenizers-0.21.0-cp39-abi3-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9aeb255802be90acfd363626753fda0064a8df06031012fe7d52fd9a905eb00e", size = 3095488 }, - { url = "https://files.pythonhosted.org/packages/4d/f6/5ed6711093dc2c04a4e03f6461798b12669bc5a17c8be7cce1240e0b5ce8/tokenizers-0.21.0-cp39-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d8b09dbeb7a8d73ee204a70f94fc06ea0f17dcf0844f16102b9f414f0b7463ba", size = 3121410 }, - { url = "https://files.pythonhosted.org/packages/81/42/07600892d48950c5e80505b81411044a2d969368cdc0d929b1c847bf6697/tokenizers-0.21.0-cp39-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:400832c0904f77ce87c40f1a8a27493071282f785724ae62144324f171377273", size = 3388821 }, - { url = "https://files.pythonhosted.org/packages/22/06/69d7ce374747edaf1695a4f61b83570d91cc8bbfc51ccfecf76f56ab4aac/tokenizers-0.21.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e84ca973b3a96894d1707e189c14a774b701596d579ffc7e69debfc036a61a04", size = 3008868 }, - { url = "https://files.pythonhosted.org/packages/c8/69/54a0aee4d576045b49a0eb8bffdc495634309c823bf886042e6f46b80058/tokenizers-0.21.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:eb7202d231b273c34ec67767378cd04c767e967fda12d4a9e36208a34e2f137e", size = 8975831 }, - { url = "https://files.pythonhosted.org/packages/f7/f3/b776061e4f3ebf2905ba1a25d90380aafd10c02d406437a8ba22d1724d76/tokenizers-0.21.0-cp39-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:089d56db6782a73a27fd8abf3ba21779f5b85d4a9f35e3b493c7bbcbbf0d539b", size = 8920746 }, - { url = "https://files.pythonhosted.org/packages/d8/ee/ce83d5ec8b6844ad4c3ecfe3333d58ecc1adc61f0878b323a15355bcab24/tokenizers-0.21.0-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:c87ca3dc48b9b1222d984b6b7490355a6fdb411a2d810f6f05977258400ddb74", size = 9161814 }, - { url = "https://files.pythonhosted.org/packages/18/07/3e88e65c0ed28fa93aa0c4d264988428eef3df2764c3126dc83e243cb36f/tokenizers-0.21.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:4145505a973116f91bc3ac45988a92e618a6f83eb458f49ea0790df94ee243ff", size = 9357138 }, - { url = "https://files.pythonhosted.org/packages/15/b0/dc4572ca61555fc482ebc933f26cb407c6aceb3dc19c301c68184f8cad03/tokenizers-0.21.0-cp39-abi3-win32.whl", hash = "sha256:eb1702c2f27d25d9dd5b389cc1f2f51813e99f8ca30d9e25348db6585a97e24a", size = 2202266 }, - { url = "https://files.pythonhosted.org/packages/44/69/d21eb253fa91622da25585d362a874fa4710be600f0ea9446d8d0217cec1/tokenizers-0.21.0-cp39-abi3-win_amd64.whl", hash = "sha256:87841da5a25a3a5f70c102de371db120f41873b854ba65e52bccd57df5a3780c", size = 2389192 }, -] - -[[package]] -name = "tqdm" -version = "4.67.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "colorama", marker = "platform_system == 'Windows'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/a8/4b/29b4ef32e036bb34e4ab51796dd745cdba7ed47ad142a9f4a1eb8e0c744d/tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2", size = 169737 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2", size = 78540 }, -] - -[[package]] -name = "types-requests" -version = "2.32.0.20241016" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "urllib3" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/fa/3c/4f2a430c01a22abd49a583b6b944173e39e7d01b688190a5618bd59a2e22/types-requests-2.32.0.20241016.tar.gz", hash = "sha256:0d9cad2f27515d0e3e3da7134a1b6f28fb97129d86b867f24d9c726452634d95", size = 18065 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d7/01/485b3026ff90e5190b5e24f1711522e06c79f4a56c8f4b95848ac072e20f/types_requests-2.32.0.20241016-py3-none-any.whl", hash = "sha256:4195d62d6d3e043a4eaaf08ff8a62184584d2e8684e9d2aa178c7915a7da3747", size = 15836 }, -] - -[[package]] -name = "typing-extensions" -version = "4.12.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/df/db/f35a00659bc03fec321ba8bce9420de607a1d37f8342eee1863174c69557/typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8", size = 85321 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/26/9f/ad63fc0248c5379346306f8668cda6e2e2e9c95e01216d2b8ffd9ff037d0/typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", size = 37438 }, -] - -[[package]] -name = "typing-inspect" -version = "0.9.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "mypy-extensions" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/dc/74/1789779d91f1961fa9438e9a8710cdae6bd138c80d7303996933d117264a/typing_inspect-0.9.0.tar.gz", hash = "sha256:b23fc42ff6f6ef6954e4852c1fb512cdd18dbea03134f91f856a95ccc9461f78", size = 13825 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/65/f3/107a22063bf27bdccf2024833d3445f4eea42b2e598abfbd46f6a63b6cb0/typing_inspect-0.9.0-py3-none-any.whl", hash = "sha256:9ee6fc59062311ef8547596ab6b955e1b8aa46242d854bfc78f4f6b0eff35f9f", size = 8827 }, -] - -[[package]] -name = "urllib3" -version = "2.3.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/aa/63/e53da845320b757bf29ef6a9062f5c669fe997973f966045cb019c3f4b66/urllib3-2.3.0.tar.gz", hash = "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d", size = 307268 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c8/19/4ec628951a74043532ca2cf5d97b7b14863931476d117c471e8e2b1eb39f/urllib3-2.3.0-py3-none-any.whl", hash = "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df", size = 128369 }, -] - -[[package]] -name = "uvicorn" -version = "0.33.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "click" }, - { name = "h11" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/cb/81/a083ae41716b00df56d45d4b5f6ca8e90fc233a62e6c04ab3ad3c476b6c4/uvicorn-0.33.0.tar.gz", hash = "sha256:3577119f82b7091cf4d3d4177bfda0bae4723ed92ab1439e8d779de880c9cc59", size = 76590 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/98/79/2e2620337ef1e4ef7a058b351603b765f59ac28e6e3ac7c5e7cdee9ea1ab/uvicorn-0.33.0-py3-none-any.whl", hash = "sha256:2c30de4aeea83661a520abab179b24084a0019c0c1bbe137e5409f741cbde5f8", size = 62297 }, -] - -[package.optional-dependencies] -standard = [ - { name = "colorama", marker = "sys_platform == 'win32'" }, - { name = "httptools" }, - { name = "python-dotenv" }, - { name = "pyyaml" }, - { name = "uvloop", marker = "platform_python_implementation != 'PyPy' and sys_platform != 'cygwin' and sys_platform != 'win32'" }, - { name = "watchfiles" }, - { name = "websockets" }, -] - -[[package]] -name = "uvloop" -version = "0.21.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/af/c0/854216d09d33c543f12a44b393c402e89a920b1a0a7dc634c42de91b9cf6/uvloop-0.21.0.tar.gz", hash = "sha256:3bf12b0fda68447806a7ad847bfa591613177275d35b6724b1ee573faa3704e3", size = 2492741 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/3f/8d/2cbef610ca21539f0f36e2b34da49302029e7c9f09acef0b1c3b5839412b/uvloop-0.21.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:bfd55dfcc2a512316e65f16e503e9e450cab148ef11df4e4e679b5e8253a5281", size = 1468123 }, - { url = "https://files.pythonhosted.org/packages/93/0d/b0038d5a469f94ed8f2b2fce2434a18396d8fbfb5da85a0a9781ebbdec14/uvloop-0.21.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:787ae31ad8a2856fc4e7c095341cccc7209bd657d0e71ad0dc2ea83c4a6fa8af", size = 819325 }, - { url = "https://files.pythonhosted.org/packages/50/94/0a687f39e78c4c1e02e3272c6b2ccdb4e0085fda3b8352fecd0410ccf915/uvloop-0.21.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ee4d4ef48036ff6e5cfffb09dd192c7a5027153948d85b8da7ff705065bacc6", size = 4582806 }, - { url = "https://files.pythonhosted.org/packages/d2/19/f5b78616566ea68edd42aacaf645adbf71fbd83fc52281fba555dc27e3f1/uvloop-0.21.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3df876acd7ec037a3d005b3ab85a7e4110422e4d9c1571d4fc89b0fc41b6816", size = 4701068 }, - { url = "https://files.pythonhosted.org/packages/47/57/66f061ee118f413cd22a656de622925097170b9380b30091b78ea0c6ea75/uvloop-0.21.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bd53ecc9a0f3d87ab847503c2e1552b690362e005ab54e8a48ba97da3924c0dc", size = 4454428 }, - { url = "https://files.pythonhosted.org/packages/63/9a/0962b05b308494e3202d3f794a6e85abe471fe3cafdbcf95c2e8c713aabd/uvloop-0.21.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a5c39f217ab3c663dc699c04cbd50c13813e31d917642d459fdcec07555cc553", size = 4660018 }, -] - -[[package]] -name = "watchfiles" -version = "0.24.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "anyio" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/c8/27/2ba23c8cc85796e2d41976439b08d52f691655fdb9401362099502d1f0cf/watchfiles-0.24.0.tar.gz", hash = "sha256:afb72325b74fa7a428c009c1b8be4b4d7c2afedafb2982827ef2156646df2fe1", size = 37870 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/30/dc/6e9f5447ae14f645532468a84323a942996d74d5e817837a5c8ce9d16c69/watchfiles-0.24.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:3d2e3ab79a1771c530233cadfd277fcc762656d50836c77abb2e5e72b88e3a48", size = 373764 }, - { url = "https://files.pythonhosted.org/packages/79/c0/c3a9929c372816c7fc87d8149bd722608ea58dc0986d3ef7564c79ad7112/watchfiles-0.24.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:327763da824817b38ad125dcd97595f942d720d32d879f6c4ddf843e3da3fe90", size = 367873 }, - { url = "https://files.pythonhosted.org/packages/2e/11/ff9a4445a7cfc1c98caf99042df38964af12eed47d496dd5d0d90417349f/watchfiles-0.24.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd82010f8ab451dabe36054a1622870166a67cf3fce894f68895db6f74bbdc94", size = 438381 }, - { url = "https://files.pythonhosted.org/packages/48/a3/763ba18c98211d7bb6c0f417b2d7946d346cdc359d585cc28a17b48e964b/watchfiles-0.24.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d64ba08db72e5dfd5c33be1e1e687d5e4fcce09219e8aee893a4862034081d4e", size = 432809 }, - { url = "https://files.pythonhosted.org/packages/30/4c/616c111b9d40eea2547489abaf4ffc84511e86888a166d3a4522c2ba44b5/watchfiles-0.24.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1cf1f6dd7825053f3d98f6d33f6464ebdd9ee95acd74ba2c34e183086900a827", size = 451801 }, - { url = "https://files.pythonhosted.org/packages/b6/be/d7da83307863a422abbfeb12903a76e43200c90ebe5d6afd6a59d158edea/watchfiles-0.24.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:43e3e37c15a8b6fe00c1bce2473cfa8eb3484bbeecf3aefbf259227e487a03df", size = 468886 }, - { url = "https://files.pythonhosted.org/packages/1d/d3/3dfe131ee59d5e90b932cf56aba5c996309d94dafe3d02d204364c23461c/watchfiles-0.24.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:88bcd4d0fe1d8ff43675360a72def210ebad3f3f72cabfeac08d825d2639b4ab", size = 472973 }, - { url = "https://files.pythonhosted.org/packages/42/6c/279288cc5653a289290d183b60a6d80e05f439d5bfdfaf2d113738d0f932/watchfiles-0.24.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:999928c6434372fde16c8f27143d3e97201160b48a614071261701615a2a156f", size = 425282 }, - { url = "https://files.pythonhosted.org/packages/d6/d7/58afe5e85217e845edf26d8780c2d2d2ae77675eeb8d1b8b8121d799ce52/watchfiles-0.24.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:30bbd525c3262fd9f4b1865cb8d88e21161366561cd7c9e1194819e0a33ea86b", size = 612540 }, - { url = "https://files.pythonhosted.org/packages/6d/d5/b96eeb9fe3fda137200dd2f31553670cbc731b1e13164fd69b49870b76ec/watchfiles-0.24.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:edf71b01dec9f766fb285b73930f95f730bb0943500ba0566ae234b5c1618c18", size = 593625 }, - { url = "https://files.pythonhosted.org/packages/c1/e5/c326fe52ee0054107267608d8cea275e80be4455b6079491dfd9da29f46f/watchfiles-0.24.0-cp313-none-win32.whl", hash = "sha256:f4c96283fca3ee09fb044f02156d9570d156698bc3734252175a38f0e8975f07", size = 263899 }, - { url = "https://files.pythonhosted.org/packages/a6/8b/8a7755c5e7221bb35fe4af2dc44db9174f90ebf0344fd5e9b1e8b42d381e/watchfiles-0.24.0-cp313-none-win_amd64.whl", hash = "sha256:a974231b4fdd1bb7f62064a0565a6b107d27d21d9acb50c484d2cdba515b9366", size = 276622 }, -] - -[[package]] -name = "websockets" -version = "13.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e2/73/9223dbc7be3dcaf2a7bbf756c351ec8da04b1fa573edaf545b95f6b0c7fd/websockets-13.1.tar.gz", hash = "sha256:a3b3366087c1bc0a2795111edcadddb8b3b59509d5db5d7ea3fdd69f954a8878", size = 158549 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/51/20/2b99ca918e1cbd33c53db2cace5f0c0cd8296fc77558e1908799c712e1cd/websockets-13.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a9ab1e71d3d2e54a0aa646ab6d4eebfaa5f416fe78dfe4da2839525dc5d765c6", size = 157828 }, - { url = "https://files.pythonhosted.org/packages/b8/47/0932a71d3d9c0e9483174f60713c84cee58d62839a143f21a2bcdbd2d205/websockets-13.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b9d7439d7fab4dce00570bb906875734df13d9faa4b48e261c440a5fec6d9708", size = 155487 }, - { url = "https://files.pythonhosted.org/packages/a9/60/f1711eb59ac7a6c5e98e5637fef5302f45b6f76a2c9d64fd83bbb341377a/websockets-13.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:327b74e915cf13c5931334c61e1a41040e365d380f812513a255aa804b183418", size = 155721 }, - { url = "https://files.pythonhosted.org/packages/6a/e6/ba9a8db7f9d9b0e5f829cf626ff32677f39824968317223605a6b419d445/websockets-13.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:325b1ccdbf5e5725fdcb1b0e9ad4d2545056479d0eee392c291c1bf76206435a", size = 165609 }, - { url = "https://files.pythonhosted.org/packages/c1/22/4ec80f1b9c27a0aebd84ccd857252eda8418ab9681eb571b37ca4c5e1305/websockets-13.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:346bee67a65f189e0e33f520f253d5147ab76ae42493804319b5716e46dddf0f", size = 164556 }, - { url = "https://files.pythonhosted.org/packages/27/ac/35f423cb6bb15600438db80755609d27eda36d4c0b3c9d745ea12766c45e/websockets-13.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:91a0fa841646320ec0d3accdff5b757b06e2e5c86ba32af2e0815c96c7a603c5", size = 164993 }, - { url = "https://files.pythonhosted.org/packages/31/4e/98db4fd267f8be9e52e86b6ee4e9aa7c42b83452ea0ea0672f176224b977/websockets-13.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:18503d2c5f3943e93819238bf20df71982d193f73dcecd26c94514f417f6b135", size = 165360 }, - { url = "https://files.pythonhosted.org/packages/3f/15/3f0de7cda70ffc94b7e7024544072bc5b26e2c1eb36545291abb755d8cdb/websockets-13.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:a9cd1af7e18e5221d2878378fbc287a14cd527fdd5939ed56a18df8a31136bb2", size = 164745 }, - { url = "https://files.pythonhosted.org/packages/a1/6e/66b6b756aebbd680b934c8bdbb6dcb9ce45aad72cde5f8a7208dbb00dd36/websockets-13.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:70c5be9f416aa72aab7a2a76c90ae0a4fe2755c1816c153c1a2bcc3333ce4ce6", size = 164732 }, - { url = "https://files.pythonhosted.org/packages/35/c6/12e3aab52c11aeb289e3dbbc05929e7a9d90d7a9173958477d3ef4f8ce2d/websockets-13.1-cp313-cp313-win32.whl", hash = "sha256:624459daabeb310d3815b276c1adef475b3e6804abaf2d9d2c061c319f7f187d", size = 158709 }, - { url = "https://files.pythonhosted.org/packages/41/d8/63d6194aae711d7263df4498200c690a9c39fb437ede10f3e157a6343e0d/websockets-13.1-cp313-cp313-win_amd64.whl", hash = "sha256:c518e84bb59c2baae725accd355c8dc517b4a3ed8db88b4bc93c78dae2974bf2", size = 159144 }, - { url = "https://files.pythonhosted.org/packages/56/27/96a5cd2626d11c8280656c6c71d8ab50fe006490ef9971ccd154e0c42cd2/websockets-13.1-py3-none-any.whl", hash = "sha256:a9a396a6ad26130cdae92ae10c36af09d9bfe6cafe69670fd3b6da9b07b4044f", size = 152134 }, -] diff --git a/sample.env b/sample.env index 3132c131..192ed659 100644 --- a/sample.env +++ b/sample.env @@ -1,7 +1,4 @@ -COMPOSE_PROJECT_NAME=reaper ENV=development HOST=localhost PORT=8000 PROXY_PORT=8080 -NGROK_AUTHTOKEN=your_ngrok_token -OPENAI_API_KEY=your_openai_key diff --git a/scripts/install.sh b/scripts/install.sh new file mode 100755 index 00000000..a1f6d2f1 --- /dev/null +++ b/scripts/install.sh @@ -0,0 +1,152 @@ +#!/bin/bash +# install.sh +# Cross-platform installer for Ghost Security Reaper +# Supports: Linux (amd64, arm64), macOS (amd64, arm64) + +set -e + +# Configuration +REPO="ghostsecurity/reaper" +BIN_DIR="${HOME}/.ghost/bin" +BINARY_NAME="reaper" + +# Detect platform +detect_platform() { + local os arch + + # Detect OS + case "$(uname -s)" in + Linux*) os="linux" ;; + Darwin*) os="darwin" ;; + *) echo "Unsupported OS: $(uname -s)" >&2; exit 1 ;; + esac + + # Detect architecture + case "$(uname -m)" in + x86_64|amd64) arch="amd64" ;; + aarch64|arm64) arch="arm64" ;; + *) echo "Unsupported architecture: $(uname -m)" >&2; exit 1 ;; + esac + + echo "${os}_${arch}" +} + +# Get latest release version +get_latest_version() { + curl -sL "https://updates.ghostsecurity.ai/repos/${REPO}/releases/latest" | \ + grep '"tag_name":' | \ + sed -E 's/.*"([^"]+)".*/\1/' +} + +# Check if reaper is already installed and get version +get_installed_version() { + if [ -x "${BIN_DIR}/${BINARY_NAME}" ]; then + "${BIN_DIR}/${BINARY_NAME}" version 2>/dev/null | head -1 || echo "" + else + echo "" + fi +} + +# Extract bare version number for comparison +# "reaper 1.0.0" -> "1.0.0", "v1.0.0" -> "1.0.0" +normalize_version() { + echo "$1" | grep -oE '[0-9]+\.[0-9]+\.[0-9]+' | head -1 +} + +# Download and install from GitHub +install_from_github() { + local platform="$1" + local version="$2" + local os="${platform%_*}" + local arch="${platform#*_}" + local download_url + + # Construct download URL + download_url="https://github.com/${REPO}/releases/download/${version}/reaper_${os}_${arch}.tar.gz" + + echo "Downloading reaper ${version} for ${platform}..." + echo "URL: ${download_url}" + + # Create bin directory + mkdir -p "${BIN_DIR}" + + # Download and extract + local tmp_dir + tmp_dir=$(mktemp -d) + trap "rm -rf ${tmp_dir}" EXIT + + curl -sfL "${download_url}" -o "${tmp_dir}/reaper.tar.gz" || return 1 + tar xzf "${tmp_dir}/reaper.tar.gz" -C "${tmp_dir}" + + # Install binary + mv "${tmp_dir}/${BINARY_NAME}" "${BIN_DIR}/${BINARY_NAME}" + chmod +x "${BIN_DIR}/${BINARY_NAME}" + + # macOS: remove quarantine attribute + if [ "$os" = "darwin" ]; then + xattr -d com.apple.quarantine "${BIN_DIR}/${BINARY_NAME}" 2>/dev/null || true + fi + + echo "Installed to: ${BIN_DIR}/${BINARY_NAME}" + return 0 +} + +# Main +main() { + echo "Reaper Installer" + echo "================" + + # Detect platform + local platform + platform=$(detect_platform) + echo "Platform: ${platform}" + + # Get latest version from GitHub API + local latest_version + latest_version=$(get_latest_version) + + if [ -z "$latest_version" ]; then + echo "" + echo "ERROR: Could not fetch latest version from GitHub." + echo "Please ensure network access to github.com/ghostsecurity/reaper" + exit 1 + fi + + echo "Latest version: ${latest_version}" + + # Check if already installed and up to date + local installed_version + installed_version=$(get_installed_version) + echo "Installed version: ${installed_version:-none}" + + if [ -n "$installed_version" ]; then + local installed_normalized latest_normalized + installed_normalized=$(normalize_version "$installed_version") + latest_normalized=$(normalize_version "$latest_version") + + if [ "$installed_normalized" = "$latest_normalized" ]; then + echo "Already up to date!" + echo "Binary path: ${BIN_DIR}/${BINARY_NAME}" + exit 0 + fi + + echo "Updating from ${installed_normalized} to ${latest_normalized}..." + fi + + if install_from_github "$platform" "$latest_version"; then + echo "" + echo "Verification:" + "${BIN_DIR}/${BINARY_NAME}" version + echo "" + echo "Installation complete!" + echo "Binary path: ${BIN_DIR}/${BINARY_NAME}" + exit 0 + fi + + echo "" + echo "ERROR: Could not install reaper." + echo "Please ensure network access to github.com/ghostsecurity/reaper" + exit 1 +} + +main "$@" diff --git a/tests/embedded-ui.spec.ts b/tests/embedded-ui.spec.ts deleted file mode 100644 index f7ae86c3..00000000 --- a/tests/embedded-ui.spec.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { test, expect } from '@playwright/test'; - -test('sign in button', async ({ page }) => { - await page.goto('http://localhost:8000'); - - // Click the sign in button. - await page.getByRole('button', { name: 'Sign in' }).click(); - - // Expects page to have a heading with Scan title. - await expect(page.getByRole('heading', { name: 'Scan' })).toBeVisible(); -}); diff --git a/tests/readme.md b/tests/readme.md deleted file mode 100644 index f137543c..00000000 --- a/tests/readme.md +++ /dev/null @@ -1,3 +0,0 @@ -# Frontend UI Test - -TODO: add more UI tests here. \ No newline at end of file diff --git a/tls/ca.key b/tls/ca.key deleted file mode 100644 index 3dc3c757..00000000 --- a/tls/ca.key +++ /dev/null @@ -1,28 +0,0 @@ ------BEGIN PRIVATE KEY----- -MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC9eA5R9pwUKCoF -8SrJoF5/vm3nBB/0LO6vnPzaJMiVvHDz5iCynJAT372/80KcnfqViKvNPfU4nl8V -uWVIz1/dJ85i5k0Pi4FR8b1ge3vFToojK7YKXG8UkZBm1T7UEDgCYX9w26uPjVIF -CsMiPFvmBBWr1kU+Bu+Ipe6t5Wfx2kbOwgKepA+PWueDWnQV+JuPN7EsHTJ7pQkt -KeTckaNc+BhBSA32WBpn58BJ1fd3+95aWH+Zy5+spf5Y39futwJCWRJWGU7kY/Rr -a4gLhGP/+PWNSBOT+ZBu8WA3r+LEJX0uEKu2maMtBk85pnBzhomO6zpv8ZR+tCB4 -MmNIhZvTAgMBAAECggEAClDOiso1U5L06Bo/fPclHf8QEcYI4qz4Q98gFH/F3K0u -rdYnjUH2muERfjFwPNcMbSF3T8yMnOFhMO1v+nJb+E5cr3LK2vVP/FZVPBBiZpWG -R4WaOt8vJxIJKCglFxEDqPww9EPph9PRwDeGn0cProAmGT3TIEjquBMSDIK90Y47 -qvlO2Vn7VrFTYOqU+eM9VrLOd8Wy2FPUUfO10GVRvN0ZErkndVjevenqyWdmH3qM -DaPk+wIqGqcsk/1aP/ty0FM0/u9ctIJ4GSkyEhn/i6ZPpGcKQ+edcSgKa1OotLMr -Q7KoPgvG51Wpcbr6VWaobe8fSYegQtorY6hl9kB8iQKBgQDcrCf5zuKM9fQvTPSO -GqCGDDyrkUdHP+CC2wr/3Ipb3k/WySb6H9UUysO1uJ+xaRVQA8HzqaieUO3nEJMk -M5tmoJo2ioTagYXMyq+7DkfUmVyzka4RHqOqDiI2kMMoO5XuUwMz+Y57Xz6VxVwP -uJ429jnqxNLVCqaL2yDLUPaLawKBgQDbzRUvtcjBOHYUeMoWNX2E2mp9lOSI20T2 -Zynyu1WgtYrbR9QCf9TjnzjSNkXvqVUmQgZXZ0KBZrlalHZkmHDFxk9zXAOK4zth -X6nJtyXwFErs2ndL8RG9noL5uTz2MzFMhkdoEkafyku6aBlxXB7NNwTzW16FTh3Z -dC1Tnl7zOQKBgQCPS6el2wdYW7qWIJXJ1VaZ1UZsbqlnhf5HWu/4mACsiV807WhH -EfavSr/tuBbTAJbbX6VJkckyDQF/g07ZOj3WVcHuWuLMdUEqbA/TGwHf9zqwTJBJ -A6lpm0XyQuzHqnHA0d0JmitAx+d/ICqY9tyeeiO/5NG3j/P4a3IPNOL0QwKBgQCB -e2PCslTsNmWhE7MAuEwUClL3XdHvKTSL7yQQAPmlbay6Fqs3ObTgzng7pYs3bsph -ej2gGY1dC3WffZvtELxGVdeR/p97nvbpGuC7mq+3qUymEOB8FSw9RvajQ9M8udWN -3gCMt09xbEuGKTLry7e9bm71KVsaLnV5F25oNwB6SQKBgAgRQKRhNciBMKMOhVBN -NDGZVdWcsi4Fwk+wpEGYQwd9BJofaJBzAwyPyRYCfFVw1P+baAJBKMNKGrRA+bmT -Ot6KuVlU/CmVgwuo4Y0StrO2Gk1BRaK7nr6t22xwYnPJ0/w/UxpADhrLEdx1Y+Te -vmBKExBNiMt1S065MqQF/LMb ------END PRIVATE KEY----- diff --git a/tls/ca.pem b/tls/ca.pem deleted file mode 100644 index 481cc76d..00000000 --- a/tls/ca.pem +++ /dev/null @@ -1,25 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIENTCCAx2gAwIBAgIUDwdggwuOcbMyK6ftH/tM8Y3gsQgwDQYJKoZIhvcNAQEL -BQAwgakxCzAJBgNVBAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEPMA0GA1UEBwwGQXVz -dGluMR0wGwYDVQQKDBRHaG9zdCBTZWN1cml0eSwgSW5jLjETMBEGA1UECwwKR2hv -c3QgTGFiczEhMB8GA1UEAwwYcmVhcGVyLmdob3N0c2VjdXJpdHkuY29tMSIwIAYJ -KoZIhvcNAQkBFhNsYWJzQGdob3N0LnNlY3VyaXR5MB4XDTI1MTAyMTExMzYwMVoX -DTMwMTAyMDExMzYwMVowgakxCzAJBgNVBAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEP -MA0GA1UEBwwGQXVzdGluMR0wGwYDVQQKDBRHaG9zdCBTZWN1cml0eSwgSW5jLjET -MBEGA1UECwwKR2hvc3QgTGFiczEhMB8GA1UEAwwYcmVhcGVyLmdob3N0c2VjdXJp -dHkuY29tMSIwIAYJKoZIhvcNAQkBFhNsYWJzQGdob3N0LnNlY3VyaXR5MIIBIjAN -BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvXgOUfacFCgqBfEqyaBef75t5wQf -9Czur5z82iTIlbxw8+YgspyQE9+9v/NCnJ36lYirzT31OJ5fFbllSM9f3SfOYuZN -D4uBUfG9YHt7xU6KIyu2ClxvFJGQZtU+1BA4AmF/cNurj41SBQrDIjxb5gQVq9ZF -PgbviKXureVn8dpGzsICnqQPj1rng1p0FfibjzexLB0ye6UJLSnk3JGjXPgYQUgN -9lgaZ+fASdX3d/veWlh/mcufrKX+WN/X7rcCQlkSVhlO5GP0a2uIC4Rj//j1jUgT -k/mQbvFgN6/ixCV9LhCrtpmjLQZPOaZwc4aJjus6b/GUfrQgeDJjSIWb0wIDAQAB -o1MwUTAdBgNVHQ4EFgQUL48lnRsl0Zfeg+fwHd8cg6RXPoIwHwYDVR0jBBgwFoAU -L48lnRsl0Zfeg+fwHd8cg6RXPoIwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0B -AQsFAAOCAQEAn5zAPqldj148HoqYLwDDLDpkyt2I0473boLSj41iuc6nIokuzrQI -GIyq/lS3isvV7xisMMwLb+ON3/iqGhH7/QVJ69nM5NSvrtLLfy+tqsQjPRx/Gzo4 -91WlqwBd90Cj7SoYgGFdr9Tmx/YKGr+EgQfILYwepARRWqbSo50pYJ4Z039v8TDK -EiUQT9pu5aFmQXW8cCizMd4/HH8S/XSuSMabzdoYf5AkOg4tWzUf+MWZtb/FpW4h -8HYkgMSyYIW3/aT8Pv9Tlj5hsDbS753Y818tLH6VqsMni+YiHyS5ZqXnvT+wRGy6 -NEMKaF7lmehYmo7bRNOFNtFD3qj5ecN/8g== ------END CERTIFICATE----- diff --git a/tls/readme.txt b/tls/readme.txt deleted file mode 100644 index c7059b98..00000000 --- a/tls/readme.txt +++ /dev/null @@ -1 +0,0 @@ -local CA cert and key diff --git a/ui/.env b/ui/.env deleted file mode 100644 index b236dd08..00000000 --- a/ui/.env +++ /dev/null @@ -1,2 +0,0 @@ -VITE_BASE_URL=http://localhost:8000 -VITE_WS_URL=ws://localhost:8000/ws diff --git a/ui/README.md b/ui/README.md deleted file mode 100644 index 24c9cbc7..00000000 --- a/ui/README.md +++ /dev/null @@ -1,34 +0,0 @@ -# Vue 3 + TypeScript + Vite - -## Setup - -Run the installer - -``` -./install.sh -``` - -## Verify setup - -Load site in browser: [http://localhost:5173](http://localhost:5173) - - - -## Vue 3 + TypeScript + Vite - -This template should help get you started developing with Vue 3 and TypeScript in Vite. The template uses Vue 3 ` - - diff --git a/ui/install.sh b/ui/install.sh deleted file mode 100755 index 1f129482..00000000 --- a/ui/install.sh +++ /dev/null @@ -1,45 +0,0 @@ -#!/bin/bash -# -# Install all packages clean from latest - -# deps -yarn add axios \ - typescript@5.6.3 \ - pinia \ - vite \ - vue \ - vue-router@4 - -# dev deps -yarn add -D autoprefixer \ - class-variance-authority \ - cross-spawn \ - clsx \ - eslint \ - eslint-plugin-tailwindcss \ - eslint-plugin-vue \ - moment \ - radix-vue \ - tailwind-merge \ - tailwindcss-animate \ - tailwindcss \ - vue-tsc \ - vue-markdown-render \ - @eslint/js \ - @eslint/eslintrc \ - @headlessui/vue \ - @heroicons/vue \ - @radix-icons/vue \ - @tailwindcss/aspect-ratio \ - @tailwindcss/container-queries \ - @tailwindcss/forms \ - @tailwindcss/typography \ - @tailwindcss/aspect-ratio \ - @types/node \ - @types/markdown-it \ - @typescript-eslint/eslint-plugin \ - @typescript-eslint/parser \ - @unovis/ts \ - @unovis/vue \ - @vitejs/plugin-vue \ - @vueuse/core diff --git a/ui/node_modules/tailwindcss/stubs/.gitignore b/ui/node_modules/tailwindcss/stubs/.gitignore deleted file mode 100644 index f9be8dfe..00000000 --- a/ui/node_modules/tailwindcss/stubs/.gitignore +++ /dev/null @@ -1 +0,0 @@ -!* diff --git a/ui/node_modules/tailwindcss/stubs/.prettierrc.json b/ui/node_modules/tailwindcss/stubs/.prettierrc.json deleted file mode 100644 index 2fcc61ef..00000000 --- a/ui/node_modules/tailwindcss/stubs/.prettierrc.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "printWidth": 120, - "semi": false, - "singleQuote": true, - "trailingComma": "es5" -} diff --git a/ui/node_modules/tailwindcss/stubs/config.full.js b/ui/node_modules/tailwindcss/stubs/config.full.js deleted file mode 100644 index cced1525..00000000 --- a/ui/node_modules/tailwindcss/stubs/config.full.js +++ /dev/null @@ -1,1062 +0,0 @@ -module.exports = { - content: [], - presets: [], - darkMode: 'media', // or 'class' - theme: { - accentColor: ({ theme }) => ({ - ...theme('colors'), - auto: 'auto', - }), - animation: { - none: 'none', - spin: 'spin 1s linear infinite', - ping: 'ping 1s cubic-bezier(0, 0, 0.2, 1) infinite', - pulse: 'pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite', - bounce: 'bounce 1s infinite', - }, - aria: { - busy: 'busy="true"', - checked: 'checked="true"', - disabled: 'disabled="true"', - expanded: 'expanded="true"', - hidden: 'hidden="true"', - pressed: 'pressed="true"', - readonly: 'readonly="true"', - required: 'required="true"', - selected: 'selected="true"', - }, - aspectRatio: { - auto: 'auto', - square: '1 / 1', - video: '16 / 9', - }, - backdropBlur: ({ theme }) => theme('blur'), - backdropBrightness: ({ theme }) => theme('brightness'), - backdropContrast: ({ theme }) => theme('contrast'), - backdropGrayscale: ({ theme }) => theme('grayscale'), - backdropHueRotate: ({ theme }) => theme('hueRotate'), - backdropInvert: ({ theme }) => theme('invert'), - backdropOpacity: ({ theme }) => theme('opacity'), - backdropSaturate: ({ theme }) => theme('saturate'), - backdropSepia: ({ theme }) => theme('sepia'), - backgroundColor: ({ theme }) => theme('colors'), - backgroundImage: { - none: 'none', - 'gradient-to-t': 'linear-gradient(to top, var(--tw-gradient-stops))', - 'gradient-to-tr': 'linear-gradient(to top right, var(--tw-gradient-stops))', - 'gradient-to-r': 'linear-gradient(to right, var(--tw-gradient-stops))', - 'gradient-to-br': 'linear-gradient(to bottom right, var(--tw-gradient-stops))', - 'gradient-to-b': 'linear-gradient(to bottom, var(--tw-gradient-stops))', - 'gradient-to-bl': 'linear-gradient(to bottom left, var(--tw-gradient-stops))', - 'gradient-to-l': 'linear-gradient(to left, var(--tw-gradient-stops))', - 'gradient-to-tl': 'linear-gradient(to top left, var(--tw-gradient-stops))', - }, - backgroundOpacity: ({ theme }) => theme('opacity'), - backgroundPosition: { - bottom: 'bottom', - center: 'center', - left: 'left', - 'left-bottom': 'left bottom', - 'left-top': 'left top', - right: 'right', - 'right-bottom': 'right bottom', - 'right-top': 'right top', - top: 'top', - }, - backgroundSize: { - auto: 'auto', - cover: 'cover', - contain: 'contain', - }, - blur: { - 0: '0', - none: '', - sm: '4px', - DEFAULT: '8px', - md: '12px', - lg: '16px', - xl: '24px', - '2xl': '40px', - '3xl': '64px', - }, - borderColor: ({ theme }) => ({ - ...theme('colors'), - DEFAULT: theme('colors.gray.200', 'currentColor'), - }), - borderOpacity: ({ theme }) => theme('opacity'), - borderRadius: { - none: '0px', - sm: '0.125rem', - DEFAULT: '0.25rem', - md: '0.375rem', - lg: '0.5rem', - xl: '0.75rem', - '2xl': '1rem', - '3xl': '1.5rem', - full: '9999px', - }, - borderSpacing: ({ theme }) => ({ - ...theme('spacing'), - }), - borderWidth: { - DEFAULT: '1px', - 0: '0px', - 2: '2px', - 4: '4px', - 8: '8px', - }, - boxShadow: { - sm: '0 1px 2px 0 rgb(0 0 0 / 0.05)', - DEFAULT: '0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1)', - md: '0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1)', - lg: '0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1)', - xl: '0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1)', - '2xl': '0 25px 50px -12px rgb(0 0 0 / 0.25)', - inner: 'inset 0 2px 4px 0 rgb(0 0 0 / 0.05)', - none: 'none', - }, - boxShadowColor: ({ theme }) => theme('colors'), - brightness: { - 0: '0', - 50: '.5', - 75: '.75', - 90: '.9', - 95: '.95', - 100: '1', - 105: '1.05', - 110: '1.1', - 125: '1.25', - 150: '1.5', - 200: '2', - }, - caretColor: ({ theme }) => theme('colors'), - colors: ({ colors }) => ({ - inherit: colors.inherit, - current: colors.current, - transparent: colors.transparent, - black: colors.black, - white: colors.white, - slate: colors.slate, - gray: colors.gray, - zinc: colors.zinc, - neutral: colors.neutral, - stone: colors.stone, - red: colors.red, - orange: colors.orange, - amber: colors.amber, - yellow: colors.yellow, - lime: colors.lime, - green: colors.green, - emerald: colors.emerald, - teal: colors.teal, - cyan: colors.cyan, - sky: colors.sky, - blue: colors.blue, - indigo: colors.indigo, - violet: colors.violet, - purple: colors.purple, - fuchsia: colors.fuchsia, - pink: colors.pink, - rose: colors.rose, - }), - columns: { - auto: 'auto', - 1: '1', - 2: '2', - 3: '3', - 4: '4', - 5: '5', - 6: '6', - 7: '7', - 8: '8', - 9: '9', - 10: '10', - 11: '11', - 12: '12', - '3xs': '16rem', - '2xs': '18rem', - xs: '20rem', - sm: '24rem', - md: '28rem', - lg: '32rem', - xl: '36rem', - '2xl': '42rem', - '3xl': '48rem', - '4xl': '56rem', - '5xl': '64rem', - '6xl': '72rem', - '7xl': '80rem', - }, - container: {}, - content: { - none: 'none', - }, - contrast: { - 0: '0', - 50: '.5', - 75: '.75', - 100: '1', - 125: '1.25', - 150: '1.5', - 200: '2', - }, - cursor: { - auto: 'auto', - default: 'default', - pointer: 'pointer', - wait: 'wait', - text: 'text', - move: 'move', - help: 'help', - 'not-allowed': 'not-allowed', - none: 'none', - 'context-menu': 'context-menu', - progress: 'progress', - cell: 'cell', - crosshair: 'crosshair', - 'vertical-text': 'vertical-text', - alias: 'alias', - copy: 'copy', - 'no-drop': 'no-drop', - grab: 'grab', - grabbing: 'grabbing', - 'all-scroll': 'all-scroll', - 'col-resize': 'col-resize', - 'row-resize': 'row-resize', - 'n-resize': 'n-resize', - 'e-resize': 'e-resize', - 's-resize': 's-resize', - 'w-resize': 'w-resize', - 'ne-resize': 'ne-resize', - 'nw-resize': 'nw-resize', - 'se-resize': 'se-resize', - 'sw-resize': 'sw-resize', - 'ew-resize': 'ew-resize', - 'ns-resize': 'ns-resize', - 'nesw-resize': 'nesw-resize', - 'nwse-resize': 'nwse-resize', - 'zoom-in': 'zoom-in', - 'zoom-out': 'zoom-out', - }, - divideColor: ({ theme }) => theme('borderColor'), - divideOpacity: ({ theme }) => theme('borderOpacity'), - divideWidth: ({ theme }) => theme('borderWidth'), - dropShadow: { - sm: '0 1px 1px rgb(0 0 0 / 0.05)', - DEFAULT: ['0 1px 2px rgb(0 0 0 / 0.1)', '0 1px 1px rgb(0 0 0 / 0.06)'], - md: ['0 4px 3px rgb(0 0 0 / 0.07)', '0 2px 2px rgb(0 0 0 / 0.06)'], - lg: ['0 10px 8px rgb(0 0 0 / 0.04)', '0 4px 3px rgb(0 0 0 / 0.1)'], - xl: ['0 20px 13px rgb(0 0 0 / 0.03)', '0 8px 5px rgb(0 0 0 / 0.08)'], - '2xl': '0 25px 25px rgb(0 0 0 / 0.15)', - none: '0 0 #0000', - }, - fill: ({ theme }) => ({ - none: 'none', - ...theme('colors'), - }), - flex: { - 1: '1 1 0%', - auto: '1 1 auto', - initial: '0 1 auto', - none: 'none', - }, - flexBasis: ({ theme }) => ({ - auto: 'auto', - ...theme('spacing'), - '1/2': '50%', - '1/3': '33.333333%', - '2/3': '66.666667%', - '1/4': '25%', - '2/4': '50%', - '3/4': '75%', - '1/5': '20%', - '2/5': '40%', - '3/5': '60%', - '4/5': '80%', - '1/6': '16.666667%', - '2/6': '33.333333%', - '3/6': '50%', - '4/6': '66.666667%', - '5/6': '83.333333%', - '1/12': '8.333333%', - '2/12': '16.666667%', - '3/12': '25%', - '4/12': '33.333333%', - '5/12': '41.666667%', - '6/12': '50%', - '7/12': '58.333333%', - '8/12': '66.666667%', - '9/12': '75%', - '10/12': '83.333333%', - '11/12': '91.666667%', - full: '100%', - }), - flexGrow: { - 0: '0', - DEFAULT: '1', - }, - flexShrink: { - 0: '0', - DEFAULT: '1', - }, - fontFamily: { - sans: [ - 'ui-sans-serif', - 'system-ui', - 'sans-serif', - '"Apple Color Emoji"', - '"Segoe UI Emoji"', - '"Segoe UI Symbol"', - '"Noto Color Emoji"', - ], - serif: ['ui-serif', 'Georgia', 'Cambria', '"Times New Roman"', 'Times', 'serif'], - mono: [ - 'ui-monospace', - 'SFMono-Regular', - 'Menlo', - 'Monaco', - 'Consolas', - '"Liberation Mono"', - '"Courier New"', - 'monospace', - ], - }, - fontSize: { - xs: ['0.75rem', { lineHeight: '1rem' }], - sm: ['0.875rem', { lineHeight: '1.25rem' }], - base: ['1rem', { lineHeight: '1.5rem' }], - lg: ['1.125rem', { lineHeight: '1.75rem' }], - xl: ['1.25rem', { lineHeight: '1.75rem' }], - '2xl': ['1.5rem', { lineHeight: '2rem' }], - '3xl': ['1.875rem', { lineHeight: '2.25rem' }], - '4xl': ['2.25rem', { lineHeight: '2.5rem' }], - '5xl': ['3rem', { lineHeight: '1' }], - '6xl': ['3.75rem', { lineHeight: '1' }], - '7xl': ['4.5rem', { lineHeight: '1' }], - '8xl': ['6rem', { lineHeight: '1' }], - '9xl': ['8rem', { lineHeight: '1' }], - }, - fontWeight: { - thin: '100', - extralight: '200', - light: '300', - normal: '400', - medium: '500', - semibold: '600', - bold: '700', - extrabold: '800', - black: '900', - }, - gap: ({ theme }) => theme('spacing'), - gradientColorStops: ({ theme }) => theme('colors'), - gradientColorStopPositions: { - '0%': '0%', - '5%': '5%', - '10%': '10%', - '15%': '15%', - '20%': '20%', - '25%': '25%', - '30%': '30%', - '35%': '35%', - '40%': '40%', - '45%': '45%', - '50%': '50%', - '55%': '55%', - '60%': '60%', - '65%': '65%', - '70%': '70%', - '75%': '75%', - '80%': '80%', - '85%': '85%', - '90%': '90%', - '95%': '95%', - '100%': '100%', - }, - grayscale: { - 0: '0', - DEFAULT: '100%', - }, - gridAutoColumns: { - auto: 'auto', - min: 'min-content', - max: 'max-content', - fr: 'minmax(0, 1fr)', - }, - gridAutoRows: { - auto: 'auto', - min: 'min-content', - max: 'max-content', - fr: 'minmax(0, 1fr)', - }, - gridColumn: { - auto: 'auto', - 'span-1': 'span 1 / span 1', - 'span-2': 'span 2 / span 2', - 'span-3': 'span 3 / span 3', - 'span-4': 'span 4 / span 4', - 'span-5': 'span 5 / span 5', - 'span-6': 'span 6 / span 6', - 'span-7': 'span 7 / span 7', - 'span-8': 'span 8 / span 8', - 'span-9': 'span 9 / span 9', - 'span-10': 'span 10 / span 10', - 'span-11': 'span 11 / span 11', - 'span-12': 'span 12 / span 12', - 'span-full': '1 / -1', - }, - gridColumnEnd: { - auto: 'auto', - 1: '1', - 2: '2', - 3: '3', - 4: '4', - 5: '5', - 6: '6', - 7: '7', - 8: '8', - 9: '9', - 10: '10', - 11: '11', - 12: '12', - 13: '13', - }, - gridColumnStart: { - auto: 'auto', - 1: '1', - 2: '2', - 3: '3', - 4: '4', - 5: '5', - 6: '6', - 7: '7', - 8: '8', - 9: '9', - 10: '10', - 11: '11', - 12: '12', - 13: '13', - }, - gridRow: { - auto: 'auto', - 'span-1': 'span 1 / span 1', - 'span-2': 'span 2 / span 2', - 'span-3': 'span 3 / span 3', - 'span-4': 'span 4 / span 4', - 'span-5': 'span 5 / span 5', - 'span-6': 'span 6 / span 6', - 'span-7': 'span 7 / span 7', - 'span-8': 'span 8 / span 8', - 'span-9': 'span 9 / span 9', - 'span-10': 'span 10 / span 10', - 'span-11': 'span 11 / span 11', - 'span-12': 'span 12 / span 12', - 'span-full': '1 / -1', - }, - gridRowEnd: { - auto: 'auto', - 1: '1', - 2: '2', - 3: '3', - 4: '4', - 5: '5', - 6: '6', - 7: '7', - 8: '8', - 9: '9', - 10: '10', - 11: '11', - 12: '12', - 13: '13', - }, - gridRowStart: { - auto: 'auto', - 1: '1', - 2: '2', - 3: '3', - 4: '4', - 5: '5', - 6: '6', - 7: '7', - 8: '8', - 9: '9', - 10: '10', - 11: '11', - 12: '12', - 13: '13', - }, - gridTemplateColumns: { - none: 'none', - subgrid: 'subgrid', - 1: 'repeat(1, minmax(0, 1fr))', - 2: 'repeat(2, minmax(0, 1fr))', - 3: 'repeat(3, minmax(0, 1fr))', - 4: 'repeat(4, minmax(0, 1fr))', - 5: 'repeat(5, minmax(0, 1fr))', - 6: 'repeat(6, minmax(0, 1fr))', - 7: 'repeat(7, minmax(0, 1fr))', - 8: 'repeat(8, minmax(0, 1fr))', - 9: 'repeat(9, minmax(0, 1fr))', - 10: 'repeat(10, minmax(0, 1fr))', - 11: 'repeat(11, minmax(0, 1fr))', - 12: 'repeat(12, minmax(0, 1fr))', - }, - gridTemplateRows: { - none: 'none', - subgrid: 'subgrid', - 1: 'repeat(1, minmax(0, 1fr))', - 2: 'repeat(2, minmax(0, 1fr))', - 3: 'repeat(3, minmax(0, 1fr))', - 4: 'repeat(4, minmax(0, 1fr))', - 5: 'repeat(5, minmax(0, 1fr))', - 6: 'repeat(6, minmax(0, 1fr))', - 7: 'repeat(7, minmax(0, 1fr))', - 8: 'repeat(8, minmax(0, 1fr))', - 9: 'repeat(9, minmax(0, 1fr))', - 10: 'repeat(10, minmax(0, 1fr))', - 11: 'repeat(11, minmax(0, 1fr))', - 12: 'repeat(12, minmax(0, 1fr))', - }, - height: ({ theme }) => ({ - auto: 'auto', - ...theme('spacing'), - '1/2': '50%', - '1/3': '33.333333%', - '2/3': '66.666667%', - '1/4': '25%', - '2/4': '50%', - '3/4': '75%', - '1/5': '20%', - '2/5': '40%', - '3/5': '60%', - '4/5': '80%', - '1/6': '16.666667%', - '2/6': '33.333333%', - '3/6': '50%', - '4/6': '66.666667%', - '5/6': '83.333333%', - full: '100%', - screen: '100vh', - svh: '100svh', - lvh: '100lvh', - dvh: '100dvh', - min: 'min-content', - max: 'max-content', - fit: 'fit-content', - }), - hueRotate: { - 0: '0deg', - 15: '15deg', - 30: '30deg', - 60: '60deg', - 90: '90deg', - 180: '180deg', - }, - inset: ({ theme }) => ({ - auto: 'auto', - ...theme('spacing'), - '1/2': '50%', - '1/3': '33.333333%', - '2/3': '66.666667%', - '1/4': '25%', - '2/4': '50%', - '3/4': '75%', - full: '100%', - }), - invert: { - 0: '0', - DEFAULT: '100%', - }, - keyframes: { - spin: { - to: { - transform: 'rotate(360deg)', - }, - }, - ping: { - '75%, 100%': { - transform: 'scale(2)', - opacity: '0', - }, - }, - pulse: { - '50%': { - opacity: '.5', - }, - }, - bounce: { - '0%, 100%': { - transform: 'translateY(-25%)', - animationTimingFunction: 'cubic-bezier(0.8,0,1,1)', - }, - '50%': { - transform: 'none', - animationTimingFunction: 'cubic-bezier(0,0,0.2,1)', - }, - }, - }, - letterSpacing: { - tighter: '-0.05em', - tight: '-0.025em', - normal: '0em', - wide: '0.025em', - wider: '0.05em', - widest: '0.1em', - }, - lineHeight: { - none: '1', - tight: '1.25', - snug: '1.375', - normal: '1.5', - relaxed: '1.625', - loose: '2', - 3: '.75rem', - 4: '1rem', - 5: '1.25rem', - 6: '1.5rem', - 7: '1.75rem', - 8: '2rem', - 9: '2.25rem', - 10: '2.5rem', - }, - listStyleType: { - none: 'none', - disc: 'disc', - decimal: 'decimal', - }, - listStyleImage: { - none: 'none', - }, - margin: ({ theme }) => ({ - auto: 'auto', - ...theme('spacing'), - }), - lineClamp: { - 1: '1', - 2: '2', - 3: '3', - 4: '4', - 5: '5', - 6: '6', - }, - maxHeight: ({ theme }) => ({ - ...theme('spacing'), - none: 'none', - full: '100%', - screen: '100vh', - svh: '100svh', - lvh: '100lvh', - dvh: '100dvh', - min: 'min-content', - max: 'max-content', - fit: 'fit-content', - }), - maxWidth: ({ theme, breakpoints }) => ({ - ...theme('spacing'), - none: 'none', - xs: '20rem', - sm: '24rem', - md: '28rem', - lg: '32rem', - xl: '36rem', - '2xl': '42rem', - '3xl': '48rem', - '4xl': '56rem', - '5xl': '64rem', - '6xl': '72rem', - '7xl': '80rem', - full: '100%', - min: 'min-content', - max: 'max-content', - fit: 'fit-content', - prose: '65ch', - ...breakpoints(theme('screens')), - }), - minHeight: ({ theme }) => ({ - ...theme('spacing'), - full: '100%', - screen: '100vh', - svh: '100svh', - lvh: '100lvh', - dvh: '100dvh', - min: 'min-content', - max: 'max-content', - fit: 'fit-content', - }), - minWidth: ({ theme }) => ({ - ...theme('spacing'), - full: '100%', - min: 'min-content', - max: 'max-content', - fit: 'fit-content', - }), - objectPosition: { - bottom: 'bottom', - center: 'center', - left: 'left', - 'left-bottom': 'left bottom', - 'left-top': 'left top', - right: 'right', - 'right-bottom': 'right bottom', - 'right-top': 'right top', - top: 'top', - }, - opacity: { - 0: '0', - 5: '0.05', - 10: '0.1', - 15: '0.15', - 20: '0.2', - 25: '0.25', - 30: '0.3', - 35: '0.35', - 40: '0.4', - 45: '0.45', - 50: '0.5', - 55: '0.55', - 60: '0.6', - 65: '0.65', - 70: '0.7', - 75: '0.75', - 80: '0.8', - 85: '0.85', - 90: '0.9', - 95: '0.95', - 100: '1', - }, - order: { - first: '-9999', - last: '9999', - none: '0', - 1: '1', - 2: '2', - 3: '3', - 4: '4', - 5: '5', - 6: '6', - 7: '7', - 8: '8', - 9: '9', - 10: '10', - 11: '11', - 12: '12', - }, - outlineColor: ({ theme }) => theme('colors'), - outlineOffset: { - 0: '0px', - 1: '1px', - 2: '2px', - 4: '4px', - 8: '8px', - }, - outlineWidth: { - 0: '0px', - 1: '1px', - 2: '2px', - 4: '4px', - 8: '8px', - }, - padding: ({ theme }) => theme('spacing'), - placeholderColor: ({ theme }) => theme('colors'), - placeholderOpacity: ({ theme }) => theme('opacity'), - ringColor: ({ theme }) => ({ - DEFAULT: theme('colors.blue.500', '#3b82f6'), - ...theme('colors'), - }), - ringOffsetColor: ({ theme }) => theme('colors'), - ringOffsetWidth: { - 0: '0px', - 1: '1px', - 2: '2px', - 4: '4px', - 8: '8px', - }, - ringOpacity: ({ theme }) => ({ - DEFAULT: '0.5', - ...theme('opacity'), - }), - ringWidth: { - DEFAULT: '3px', - 0: '0px', - 1: '1px', - 2: '2px', - 4: '4px', - 8: '8px', - }, - rotate: { - 0: '0deg', - 1: '1deg', - 2: '2deg', - 3: '3deg', - 6: '6deg', - 12: '12deg', - 45: '45deg', - 90: '90deg', - 180: '180deg', - }, - saturate: { - 0: '0', - 50: '.5', - 100: '1', - 150: '1.5', - 200: '2', - }, - scale: { - 0: '0', - 50: '.5', - 75: '.75', - 90: '.9', - 95: '.95', - 100: '1', - 105: '1.05', - 110: '1.1', - 125: '1.25', - 150: '1.5', - }, - screens: { - sm: '640px', - md: '768px', - lg: '1024px', - xl: '1280px', - '2xl': '1536px', - }, - scrollMargin: ({ theme }) => ({ - ...theme('spacing'), - }), - scrollPadding: ({ theme }) => theme('spacing'), - sepia: { - 0: '0', - DEFAULT: '100%', - }, - skew: { - 0: '0deg', - 1: '1deg', - 2: '2deg', - 3: '3deg', - 6: '6deg', - 12: '12deg', - }, - space: ({ theme }) => ({ - ...theme('spacing'), - }), - spacing: { - px: '1px', - 0: '0px', - 0.5: '0.125rem', - 1: '0.25rem', - 1.5: '0.375rem', - 2: '0.5rem', - 2.5: '0.625rem', - 3: '0.75rem', - 3.5: '0.875rem', - 4: '1rem', - 5: '1.25rem', - 6: '1.5rem', - 7: '1.75rem', - 8: '2rem', - 9: '2.25rem', - 10: '2.5rem', - 11: '2.75rem', - 12: '3rem', - 14: '3.5rem', - 16: '4rem', - 20: '5rem', - 24: '6rem', - 28: '7rem', - 32: '8rem', - 36: '9rem', - 40: '10rem', - 44: '11rem', - 48: '12rem', - 52: '13rem', - 56: '14rem', - 60: '15rem', - 64: '16rem', - 72: '18rem', - 80: '20rem', - 96: '24rem', - }, - stroke: ({ theme }) => ({ - none: 'none', - ...theme('colors'), - }), - strokeWidth: { - 0: '0', - 1: '1', - 2: '2', - }, - supports: {}, - data: {}, - textColor: ({ theme }) => theme('colors'), - textDecorationColor: ({ theme }) => theme('colors'), - textDecorationThickness: { - auto: 'auto', - 'from-font': 'from-font', - 0: '0px', - 1: '1px', - 2: '2px', - 4: '4px', - 8: '8px', - }, - textIndent: ({ theme }) => ({ - ...theme('spacing'), - }), - textOpacity: ({ theme }) => theme('opacity'), - textUnderlineOffset: { - auto: 'auto', - 0: '0px', - 1: '1px', - 2: '2px', - 4: '4px', - 8: '8px', - }, - transformOrigin: { - center: 'center', - top: 'top', - 'top-right': 'top right', - right: 'right', - 'bottom-right': 'bottom right', - bottom: 'bottom', - 'bottom-left': 'bottom left', - left: 'left', - 'top-left': 'top left', - }, - transitionDelay: { - 0: '0s', - 75: '75ms', - 100: '100ms', - 150: '150ms', - 200: '200ms', - 300: '300ms', - 500: '500ms', - 700: '700ms', - 1000: '1000ms', - }, - transitionDuration: { - DEFAULT: '150ms', - 0: '0s', - 75: '75ms', - 100: '100ms', - 150: '150ms', - 200: '200ms', - 300: '300ms', - 500: '500ms', - 700: '700ms', - 1000: '1000ms', - }, - transitionProperty: { - none: 'none', - all: 'all', - DEFAULT: - 'color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter', - colors: 'color, background-color, border-color, text-decoration-color, fill, stroke', - opacity: 'opacity', - shadow: 'box-shadow', - transform: 'transform', - }, - transitionTimingFunction: { - DEFAULT: 'cubic-bezier(0.4, 0, 0.2, 1)', - linear: 'linear', - in: 'cubic-bezier(0.4, 0, 1, 1)', - out: 'cubic-bezier(0, 0, 0.2, 1)', - 'in-out': 'cubic-bezier(0.4, 0, 0.2, 1)', - }, - translate: ({ theme }) => ({ - ...theme('spacing'), - '1/2': '50%', - '1/3': '33.333333%', - '2/3': '66.666667%', - '1/4': '25%', - '2/4': '50%', - '3/4': '75%', - full: '100%', - }), - size: ({ theme }) => ({ - auto: 'auto', - ...theme('spacing'), - '1/2': '50%', - '1/3': '33.333333%', - '2/3': '66.666667%', - '1/4': '25%', - '2/4': '50%', - '3/4': '75%', - '1/5': '20%', - '2/5': '40%', - '3/5': '60%', - '4/5': '80%', - '1/6': '16.666667%', - '2/6': '33.333333%', - '3/6': '50%', - '4/6': '66.666667%', - '5/6': '83.333333%', - '1/12': '8.333333%', - '2/12': '16.666667%', - '3/12': '25%', - '4/12': '33.333333%', - '5/12': '41.666667%', - '6/12': '50%', - '7/12': '58.333333%', - '8/12': '66.666667%', - '9/12': '75%', - '10/12': '83.333333%', - '11/12': '91.666667%', - full: '100%', - min: 'min-content', - max: 'max-content', - fit: 'fit-content', - }), - width: ({ theme }) => ({ - auto: 'auto', - ...theme('spacing'), - '1/2': '50%', - '1/3': '33.333333%', - '2/3': '66.666667%', - '1/4': '25%', - '2/4': '50%', - '3/4': '75%', - '1/5': '20%', - '2/5': '40%', - '3/5': '60%', - '4/5': '80%', - '1/6': '16.666667%', - '2/6': '33.333333%', - '3/6': '50%', - '4/6': '66.666667%', - '5/6': '83.333333%', - '1/12': '8.333333%', - '2/12': '16.666667%', - '3/12': '25%', - '4/12': '33.333333%', - '5/12': '41.666667%', - '6/12': '50%', - '7/12': '58.333333%', - '8/12': '66.666667%', - '9/12': '75%', - '10/12': '83.333333%', - '11/12': '91.666667%', - full: '100%', - screen: '100vw', - svw: '100svw', - lvw: '100lvw', - dvw: '100dvw', - min: 'min-content', - max: 'max-content', - fit: 'fit-content', - }), - willChange: { - auto: 'auto', - scroll: 'scroll-position', - contents: 'contents', - transform: 'transform', - }, - zIndex: { - auto: 'auto', - 0: '0', - 10: '10', - 20: '20', - 30: '30', - 40: '40', - 50: '50', - }, - }, - plugins: [], -} diff --git a/ui/node_modules/tailwindcss/stubs/config.simple.js b/ui/node_modules/tailwindcss/stubs/config.simple.js deleted file mode 100644 index 9843c055..00000000 --- a/ui/node_modules/tailwindcss/stubs/config.simple.js +++ /dev/null @@ -1,7 +0,0 @@ -module.exports = { - content: [], - theme: { - extend: {}, - }, - plugins: [], -} diff --git a/ui/node_modules/tailwindcss/stubs/postcss.config.cjs b/ui/node_modules/tailwindcss/stubs/postcss.config.cjs deleted file mode 100644 index 33ad091d..00000000 --- a/ui/node_modules/tailwindcss/stubs/postcss.config.cjs +++ /dev/null @@ -1,6 +0,0 @@ -module.exports = { - plugins: { - tailwindcss: {}, - autoprefixer: {}, - }, -} diff --git a/ui/node_modules/tailwindcss/stubs/postcss.config.js b/ui/node_modules/tailwindcss/stubs/postcss.config.js deleted file mode 100644 index 2e7af2b7..00000000 --- a/ui/node_modules/tailwindcss/stubs/postcss.config.js +++ /dev/null @@ -1,6 +0,0 @@ -export default { - plugins: { - tailwindcss: {}, - autoprefixer: {}, - }, -} diff --git a/ui/node_modules/tailwindcss/stubs/tailwind.config.cjs b/ui/node_modules/tailwindcss/stubs/tailwind.config.cjs deleted file mode 100644 index 48b702b0..00000000 --- a/ui/node_modules/tailwindcss/stubs/tailwind.config.cjs +++ /dev/null @@ -1,2 +0,0 @@ -/** @type {import('tailwindcss').Config} */ -module.exports = __CONFIG__ diff --git a/ui/node_modules/tailwindcss/stubs/tailwind.config.js b/ui/node_modules/tailwindcss/stubs/tailwind.config.js deleted file mode 100644 index c5f54b45..00000000 --- a/ui/node_modules/tailwindcss/stubs/tailwind.config.js +++ /dev/null @@ -1,2 +0,0 @@ -/** @type {import('tailwindcss').Config} */ -export default __CONFIG__ diff --git a/ui/node_modules/tailwindcss/stubs/tailwind.config.ts b/ui/node_modules/tailwindcss/stubs/tailwind.config.ts deleted file mode 100644 index d9ea7111..00000000 --- a/ui/node_modules/tailwindcss/stubs/tailwind.config.ts +++ /dev/null @@ -1,3 +0,0 @@ -import type { Config } from 'tailwindcss' - -export default __CONFIG__ satisfies Config diff --git a/ui/package.json b/ui/package.json deleted file mode 100644 index 4d3a01fc..00000000 --- a/ui/package.json +++ /dev/null @@ -1,55 +0,0 @@ -{ - "name": "ui", - "private": true, - "version": "0.0.0", - "type": "module", - "scripts": { - "dev": "vite", - "build": "vue-tsc && NODE_ENV=production vite build", - "preview": "vite preview" - }, - "dependencies": { - "axios": "^1.12.2", - "pinia": "^3.0.1", - "typescript": "^5.7.3", - "vite": "^7.1.11", - "vue": "^3.5.13", - "vue-router": "^4.5.0" - }, - "devDependencies": { - "@eslint/eslintrc": "^3.2.0", - "@eslint/js": "^9.16.0", - "@headlessui/vue": "^1.7.23", - "@heroicons/vue": "^2.2.0", - "@iconify/vue": "^4.1.2", - "@radix-icons/vue": "^1.0.0", - "@tailwindcss/aspect-ratio": "^0.4.2", - "@tailwindcss/container-queries": "^0.1.1", - "@tailwindcss/forms": "^0.5.9", - "@tailwindcss/typography": "^0.5.15", - "@types/markdown-it": "^14.1.2", - "@types/node": "^22.10.2", - "@typescript-eslint/eslint-plugin": "^8.18.0", - "@typescript-eslint/parser": "^8.18.0", - "@unovis/ts": "^1.4.5", - "@unovis/vue": "^1.4.5", - "@vitejs/plugin-vue": "^5.2.1", - "@vueuse/core": "^12.0.0", - "autoprefixer": "^10.4.20", - "class-variance-authority": "^0.7.1", - "clsx": "^2.1.1", - "cross-spawn": "^7.0.6", - "date-fns": "^4.1.0", - "eslint": "^9.16.0", - "eslint-plugin-tailwindcss": "^3.17.5", - "eslint-plugin-vue": "^9.32.0", - "lucide-vue-next": "^0.447.0", - "moment": "^2.30.1", - "radix-vue": "^1.9.11", - "tailwind-merge": "^2.5.5", - "tailwindcss": "^3.4.16", - "tailwindcss-animate": "^1.0.7", - "vue-markdown-render": "^2.2.1", - "vue-tsc": "^2.2.2" - } -} diff --git a/ui/src/App.vue b/ui/src/App.vue deleted file mode 100644 index 2d161f9d..00000000 --- a/ui/src/App.vue +++ /dev/null @@ -1,197 +0,0 @@ - - - diff --git a/ui/src/assets/index.css b/ui/src/assets/index.css deleted file mode 100644 index 1b8ffca2..00000000 --- a/ui/src/assets/index.css +++ /dev/null @@ -1,60 +0,0 @@ -@tailwind base; -@tailwind components; -@tailwind utilities; - -@layer base { - * { - @apply border-border; - } - - body { - @apply bg-background text-foreground; - } -} -#report-markdown { - @apply whitespace-normal; -} -/* custom report markdown styles */ -#report-markdown h1 { - @apply scroll-m-20 text-4xl font-extrabold tracking-tight lg:text-2xl mt-0; -} - -#report-markdown h2 { - @apply mt-16 scroll-m-20 border-b pb-2 text-xl font-semibold tracking-tight transition-colors mt-4 border-black; -} - -#report-markdown h3 { - @apply scroll-m-20 text-lg font-semibold tracking-tight mt-4; -} - -#report-markdown h4 { - @apply scroll-m-20 text-base font-semibold tracking-tight mt-2; -} - -/* #report-markdown ul { - @apply my-0 ml-6 list-disc [&>li]:mt-0; -} */ -#report-markdown ol { - @apply my-0 ml-6 list-decimal mt-2; -} -#report-markdown ul { - @apply my-0 ml-6 list-disc mt-2; -} -#report-markdown p { - @apply my-0 ml-6 ms-0 me-0 mb-0 mt-2; -} - -#report-markdown pre { - @apply rounded bg-muted p-2 font-mono text-xs mt-2; -} -#report-markdown code { - @apply text-wrap; -} - -#report-markdown p code { - @apply rounded bg-muted p-1 font-mono font-semibold text-xs mt-2 text-wrap; -} - -#report-markdown li code { - @apply rounded bg-muted p-1 font-mono font-semibold text-xs mt-2 text-wrap; -} \ No newline at end of file diff --git a/ui/src/assets/reaper.svg b/ui/src/assets/reaper.svg deleted file mode 100644 index 5dbfe0f2..00000000 --- a/ui/src/assets/reaper.svg +++ /dev/null @@ -1,147 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ui/src/assets/themes.css b/ui/src/assets/themes.css deleted file mode 100644 index c7dfb684..00000000 --- a/ui/src/assets/themes.css +++ /dev/null @@ -1,775 +0,0 @@ -html { - color-scheme: light; -} - -html.dark { - color-scheme: dark; -} - -.theme-zinc { - --background: 0 0% 100%; - --foreground: 240 10% 3.9%; - - --muted: 240 4.8% 95.9%; - --muted-foreground: 240 3.8% 46.1%; - - --popover: 0 0% 100%; - --popover-foreground: 240 10% 3.9%; - - --card: 0 0% 100%; - --card-foreground: 240 10% 3.9%; - - --border: 240 5.9% 90%; - --input: 240 5.9% 90%; - - --primary: 240 5.9% 10%; - --primary-foreground: 0 0% 98%; - - --secondary: 240 4.8% 95.9%; - --secondary-foreground: 240 5.9% 10%; - - --accent: 240 4.8% 95.9%; - --accent-foreground: 240 5.9% 10%; - - --destructive: 0 84.2% 60.2%; - --destructive-foreground: 0 0% 98%; - - --ring: 240 5.9% 10%; - - --radius: 0.5rem; -} - -.theme-zinc.dark { - --background: 240 10% 3.9%; - --foreground: 0 0% 98%; - - --muted: 240 3.7% 15.9%; - --muted-foreground: 240 5% 64.9%; - - --popover: 240 10% 3.9%; - --popover-foreground: 0 0% 98%; - - --card: 240 10% 3.9%; - --card-foreground: 0 0% 98%; - - --border: 240 3.7% 15.9%; - --input: 240 3.7% 15.9%; - - --primary: 0 0% 98%; - --primary-foreground: 240 5.9% 10%; - - --secondary: 240 3.7% 15.9%; - --secondary-foreground: 0 0% 98%; - - --accent: 240 3.7% 15.9%; - --accent-foreground: 0 0% 98%; - - --destructive: 0 62.8% 30.6%; - --destructive-foreground: 0 0% 98%; - - --ring: 240 4.9% 83.9%; -} - -.theme-slate { - --background: 0 0% 100%; - --foreground: 222.2 84% 4.9%; - - --muted: 210 40% 96.1%; - --muted-foreground: 215.4 16.3% 46.9%; - - --popover: 0 0% 100%; - --popover-foreground: 222.2 84% 4.9%; - - --card: 0 0% 100%; - --card-foreground: 222.2 84% 4.9%; - - --border: 214.3 31.8% 91.4%; - --input: 214.3 31.8% 91.4%; - - --primary: 222.2 47.4% 11.2%; - --primary-foreground: 210 40% 98%; - - --secondary: 210 40% 96.1%; - --secondary-foreground: 222.2 47.4% 11.2%; - - --accent: 210 40% 96.1%; - --accent-foreground: 222.2 47.4% 11.2%; - - --destructive: 0 84.2% 60.2%; - --destructive-foreground: 210 40% 98%; - - --ring: 222.2 84% 4.9%; - - --radius: 0.5rem; -} - -.theme-slate.dark { - --background: 222.2 84% 4.9%; - --foreground: 210 40% 98%; - - --muted: 217.2 32.6% 17.5%; - --muted-foreground: 215 20.2% 65.1%; - - --popover: 222.2 84% 4.9%; - --popover-foreground: 210 40% 98%; - - --card: 222.2 84% 4.9%; - --card-foreground: 210 40% 98%; - - --border: 217.2 32.6% 17.5%; - --input: 217.2 32.6% 17.5%; - - --primary: 210 40% 98%; - --primary-foreground: 222.2 47.4% 11.2%; - - --secondary: 217.2 32.6% 17.5%; - --secondary-foreground: 210 40% 98%; - - --accent: 217.2 32.6% 17.5%; - --accent-foreground: 210 40% 98%; - - --destructive: 0 62.8% 30.6%; - --destructive-foreground: 210 40% 98%; - - --ring: 212.7 26.8% 83.9; -} - -.theme-stone { - --background: 0 0% 100%; - --foreground: 20 14.3% 4.1%; - - --muted: 60 4.8% 95.9%; - --muted-foreground: 25 5.3% 44.7%; - - --popover: 0 0% 100%; - --popover-foreground: 20 14.3% 4.1%; - - --card: 0 0% 100%; - --card-foreground: 20 14.3% 4.1%; - - --border: 20 5.9% 90%; - --input: 20 5.9% 90%; - - --primary: 24 9.8% 10%; - --primary-foreground: 60 9.1% 97.8%; - - --secondary: 60 4.8% 95.9%; - --secondary-foreground: 24 9.8% 10%; - - --accent: 60 4.8% 95.9%; - --accent-foreground: 24 9.8% 10%; - - --destructive: 0 84.2% 60.2%; - --destructive-foreground: 60 9.1% 97.8%; - - --ring: 20 14.3% 4.1%; - - --radius: 0.5rem; -} - -.theme-stone.dark { - --background: 20 14.3% 4.1%; - --foreground: 60 9.1% 97.8%; - - --muted: 12 6.5% 15.1%; - --muted-foreground: 24 5.4% 63.9%; - - --popover: 20 14.3% 4.1%; - --popover-foreground: 60 9.1% 97.8%; - - --card: 20 14.3% 4.1%; - --card-foreground: 60 9.1% 97.8%; - - --border: 12 6.5% 15.1%; - --input: 12 6.5% 15.1%; - - --primary: 60 9.1% 97.8%; - --primary-foreground: 24 9.8% 10%; - - --secondary: 12 6.5% 15.1%; - --secondary-foreground: 60 9.1% 97.8%; - - --accent: 12 6.5% 15.1%; - --accent-foreground: 60 9.1% 97.8%; - - --destructive: 0 62.8% 30.6%; - --destructive-foreground: 60 9.1% 97.8%; - - --ring: 24 5.7% 82.9%; -} - -.theme-gray { - --background: 0 0% 100%; - --foreground: 224 71.4% 4.1%; - - --muted: 220 14.3% 95.9%; - --muted-foreground: 220 8.9% 46.1%; - - --popover: 0 0% 100%; - --popover-foreground: 224 71.4% 4.1%; - - --card: 0 0% 100%; - --card-foreground: 224 71.4% 4.1%; - - --border: 220 13% 91%; - --input: 220 13% 91%; - - --primary: 220.9 39.3% 11%; - --primary-foreground: 210 20% 98%; - - --secondary: 220 14.3% 95.9%; - --secondary-foreground: 220.9 39.3% 11%; - - --accent: 220 14.3% 95.9%; - --accent-foreground: 220.9 39.3% 11%; - - --destructive: 0 84.2% 60.2%; - --destructive-foreground: 210 20% 98%; - - --ring: 224 71.4% 4.1%; - - --radius: 0.5rem; -} - -.theme-gray.dark { - --background: 224 71.4% 4.1%; - --foreground: 210 20% 98%; - - --muted: 215 27.9% 16.9%; - --muted-foreground: 217.9 10.6% 64.9%; - - --popover: 224 71.4% 4.1%; - --popover-foreground: 210 20% 98%; - - --card: 224 71.4% 4.1%; - --card-foreground: 210 20% 98%; - - --border: 215 27.9% 16.9%; - --input: 215 27.9% 16.9%; - - --primary: 210 20% 98%; - --primary-foreground: 220.9 39.3% 11%; - - --secondary: 215 27.9% 16.9%; - --secondary-foreground: 210 20% 98%; - - --accent: 215 27.9% 16.9%; - --accent-foreground: 210 20% 98%; - - --destructive: 0 62.8% 30.6%; - --destructive-foreground: 210 20% 98%; - - --ring: 216 12.2% 83.9%; -} - -.theme-neutral { - --background: 0 0% 100%; - --foreground: 0 0% 3.9%; - - --muted: 0 0% 96.1%; - --muted-foreground: 0 0% 45.1%; - - --popover: 0 0% 100%; - --popover-foreground: 0 0% 3.9%; - - --card: 0 0% 100%; - --card-foreground: 0 0% 3.9%; - - --border: 0 0% 89.8%; - --input: 0 0% 89.8%; - - --primary: 0 0% 9%; - --primary-foreground: 0 0% 98%; - - --secondary: 0 0% 96.1%; - --secondary-foreground: 0 0% 9%; - - --accent: 0 0% 96.1%; - --accent-foreground: 0 0% 9%; - - --destructive: 0 84.2% 60.2%; - --destructive-foreground: 0 0% 98%; - - --ring: 0 0% 3.9%; - - --radius: 0.5rem; -} - -.theme-neutral.dark { - --background: 0 0% 3.9%; - --foreground: 0 0% 98%; - - --muted: 0 0% 14.9%; - --muted-foreground: 0 0% 63.9%; - - --popover: 0 0% 3.9%; - --popover-foreground: 0 0% 98%; - - --card: 0 0% 3.9%; - --card-foreground: 0 0% 98%; - - --border: 0 0% 14.9%; - --input: 0 0% 14.9%; - - --primary: 0 0% 98%; - --primary-foreground: 0 0% 9%; - - --secondary: 0 0% 14.9%; - --secondary-foreground: 0 0% 98%; - - --accent: 0 0% 14.9%; - --accent-foreground: 0 0% 98%; - - --destructive: 0 62.8% 30.6%; - --destructive-foreground: 0 0% 98%; - - --ring: 0 0% 83.1%; -} - -.theme-red { - --background: 0 0% 100%; - --foreground: 0 0% 3.9%; - - --muted: 0 0% 96.1%; - --muted-foreground: 0 0% 45.1%; - - --popover: 0 0% 100%; - --popover-foreground: 0 0% 3.9%; - - --card: 0 0% 100%; - --card-foreground: 0 0% 3.9%; - - --border: 0 0% 89.8%; - --input: 0 0% 89.8%; - - --primary: 0 72.2% 50.6%; - --primary-foreground: 0 85.7% 97.3%; - - --secondary: 0 0% 96.1%; - --secondary-foreground: 0 0% 9%; - - --accent: 0 0% 96.1%; - --accent-foreground: 0 0% 9%; - - --destructive: 0 84.2% 60.2%; - --destructive-foreground: 0 0% 98%; - - --ring: 0 72.2% 50.6%; - - --radius: 0.5rem; -} - -.theme-red.dark { - --background: 0 0% 3.9%; - --foreground: 0 0% 98%; - - --muted: 0 0% 14.9%; - --muted-foreground: 0 0% 63.9%; - - --popover: 0 0% 3.9%; - --popover-foreground: 0 0% 98%; - - --card: 0 0% 3.9%; - --card-foreground: 0 0% 98%; - - --border: 0 0% 14.9%; - --input: 0 0% 14.9%; - - --primary: 0 72.2% 50.6%; - --primary-foreground: 0 85.7% 97.3%; - - --secondary: 0 0% 14.9%; - --secondary-foreground: 0 0% 98%; - - --accent: 0 0% 14.9%; - --accent-foreground: 0 0% 98%; - - --destructive: 0 62.8% 30.6%; - --destructive-foreground: 0 0% 98%; - - --ring: 0 72.2% 50.6%; -} - -.theme-rose { - --background: 0 0% 100%; - --foreground: 240 10% 3.9%; - - --muted: 240 4.8% 95.9%; - --muted-foreground: 240 3.8% 46.1%; - - --popover: 0 0% 100%; - --popover-foreground: 240 10% 3.9%; - - --card: 0 0% 100%; - --card-foreground: 240 10% 3.9%; - - --border: 240 5.9% 90%; - --input: 240 5.9% 90%; - - --primary: 346.8 77.2% 49.8%; - --primary-foreground: 355.7 100% 97.3%; - - --secondary: 240 4.8% 95.9%; - --secondary-foreground: 240 5.9% 10%; - - --accent: 240 4.8% 95.9%; - --accent-foreground: 240 5.9% 10%; - - --destructive: 0 84.2% 60.2%; - --destructive-foreground: 0 0% 98%; - - --ring: 346.8 77.2% 49.8%; - - --radius: 0.5rem; -} - -.theme-rose.dark { - --background: 20 14.3% 4.1%; - --foreground: 0 0% 95%; - - --muted: 0 0% 15%; - --muted-foreground: 240 5% 64.9%; - - --popover: 0 0% 9%; - --popover-foreground: 0 0% 95%; - - --card: 24 9.8% 10%; - --card-foreground: 0 0% 95%; - - --border: 240 3.7% 15.9%; - --input: 240 3.7% 15.9%; - - --primary: 346.8 77.2% 49.8%; - --primary-foreground: 355.7 100% 97.3%; - - --secondary: 240 3.7% 15.9%; - --secondary-foreground: 0 0% 98%; - - --accent: 12 6.5% 15.1%; - --accent-foreground: 0 0% 98%; - - --destructive: 0 62.8% 30.6%; - --destructive-foreground: 0 85.7% 97.3%; - - --ring: 346.8 77.2% 49.8%; -} - -.theme-orange { - --background: 0 0% 100%; - --foreground: 20 14.3% 4.1%; - - --muted: 60 4.8% 95.9%; - --muted-foreground: 25 5.3% 44.7%; - - --popover: 0 0% 100%; - --popover-foreground: 20 14.3% 4.1%; - - --card: 0 0% 100%; - --card-foreground: 20 14.3% 4.1%; - - --border: 20 5.9% 90%; - --input: 20 5.9% 90%; - - --primary: 24.6 95% 53.1%; - --primary-foreground: 60 9.1% 97.8%; - - --secondary: 60 4.8% 95.9%; - --secondary-foreground: 24 9.8% 10%; - - --accent: 60 4.8% 95.9%; - --accent-foreground: 24 9.8% 10%; - - --destructive: 0 84.2% 60.2%; - --destructive-foreground: 60 9.1% 97.8%; - - --ring: 24.6 95% 53.1%; - - --radius: 0.5rem; -} - -.theme-orange.dark { - --background: 20 14.3% 4.1%; - --foreground: 60 9.1% 97.8%; - - --muted: 12 6.5% 15.1%; - --muted-foreground: 24 5.4% 63.9%; - - --popover: 20 14.3% 4.1%; - --popover-foreground: 60 9.1% 97.8%; - - --card: 20 14.3% 4.1%; - --card-foreground: 60 9.1% 97.8%; - - --border: 12 6.5% 15.1%; - --input: 12 6.5% 15.1%; - - --primary: 20.5 90.2% 48.2%; - --primary-foreground: 60 9.1% 97.8%; - - --secondary: 12 6.5% 15.1%; - --secondary-foreground: 60 9.1% 97.8%; - - --accent: 12 6.5% 15.1%; - --accent-foreground: 60 9.1% 97.8%; - - --destructive: 0 72.2% 50.6%; - --destructive-foreground: 60 9.1% 97.8%; - - --ring: 20.5 90.2% 48.2%; -} - -.theme-green { - --background: 0 0% 100%; - --foreground: 240 10% 3.9%; - - --muted: 240 4.8% 95.9%; - --muted-foreground: 240 3.8% 46.1%; - - --popover: 0 0% 100%; - --popover-foreground: 240 10% 3.9%; - - --card: 0 0% 100%; - --card-foreground: 240 10% 3.9%; - - --border: 240 5.9% 90%; - --input: 240 5.9% 90%; - - --primary: 142.1 76.2% 36.3%; - --primary-foreground: 355.7 100% 97.3%; - - --secondary: 240 4.8% 95.9%; - --secondary-foreground: 240 5.9% 10%; - - --accent: 240 4.8% 95.9%; - --accent-foreground: 240 5.9% 10%; - - --destructive: 0 84.2% 60.2%; - --destructive-foreground: 0 0% 98%; - - --ring: 142.1 76.2% 36.3%; - - --radius: 0.5rem; -} - -.theme-green.dark { - --background: 20 14.3% 4.1%; - --foreground: 0 0% 95%; - - --muted: 0 0% 15%; - --muted-foreground: 240 5% 64.9%; - - --popover: 0 0% 9%; - --popover-foreground: 0 0% 95%; - - --card: 24 9.8% 10%; - --card-foreground: 0 0% 95%; - - --border: 240 3.7% 15.9%; - --input: 240 3.7% 15.9%; - - --primary: 142.1 70.6% 45.3%; - --primary-foreground: 144.9 80.4% 10%; - - --secondary: 240 3.7% 15.9%; - --secondary-foreground: 0 0% 98%; - - --accent: 12 6.5% 15.1%; - --accent-foreground: 0 0% 98%; - - --destructive: 0 62.8% 30.6%; - --destructive-foreground: 0 85.7% 97.3%; - - --ring: 142.4 71.8% 29.2%; -} - -.theme-blue { - --background: 0 0% 100%; - --foreground: 222.2 84% 4.9%; - - --muted: 210 40% 96.1%; - --muted-foreground: 215.4 16.3% 46.9%; - - --popover: 0 0% 100%; - --popover-foreground: 222.2 84% 4.9%; - - --card: 0 0% 100%; - --card-foreground: 222.2 84% 4.9%; - - --border: 214.3 31.8% 91.4%; - --input: 214.3 31.8% 91.4%; - - --primary: 221.2 83.2% 53.3%; - --primary-foreground: 210 40% 98%; - - --secondary: 210 40% 96.1%; - --secondary-foreground: 222.2 47.4% 11.2%; - - --accent: 210 40% 96.1%; - --accent-foreground: 222.2 47.4% 11.2%; - - --destructive: 0 84.2% 60.2%; - --destructive-foreground: 210 40% 98%; - - --ring: 221.2 83.2% 53.3%; - - --radius: 0.5rem; -} - -.theme-blue.dark { - --background: 222.2 84% 4.9%; - --foreground: 210 40% 98%; - - --muted: 217.2 32.6% 17.5%; - --muted-foreground: 215 20.2% 65.1%; - - --popover: 222.2 84% 4.9%; - --popover-foreground: 210 40% 98%; - - --card: 222.2 84% 4.9%; - --card-foreground: 210 40% 98%; - - --border: 217.2 32.6% 17.5%; - --input: 217.2 32.6% 17.5%; - - --primary: 217.2 91.2% 59.8%; - --primary-foreground: 222.2 47.4% 11.2%; - - --secondary: 217.2 32.6% 17.5%; - --secondary-foreground: 210 40% 98%; - - --accent: 217.2 32.6% 17.5%; - --accent-foreground: 210 40% 98%; - - --destructive: 0 62.8% 30.6%; - --destructive-foreground: 210 40% 98%; - - --ring: 224.3 76.3% 48%; -} - -.theme-yellow { - --background: 0 0% 100%; - --foreground: 20 14.3% 4.1%; - - --muted: 60 4.8% 95.9%; - --muted-foreground: 25 5.3% 44.7%; - - --popover: 0 0% 100%; - --popover-foreground: 20 14.3% 4.1%; - - --card: 0 0% 100%; - --card-foreground: 20 14.3% 4.1%; - - --border: 20 5.9% 90%; - --input: 20 5.9% 90%; - - --primary: 47.9 95.8% 53.1%; - --primary-foreground: 26 83.3% 14.1%; - - --secondary: 60 4.8% 95.9%; - --secondary-foreground: 24 9.8% 10%; - - --accent: 60 4.8% 95.9%; - --accent-foreground: 24 9.8% 10%; - - --destructive: 0 84.2% 60.2%; - --destructive-foreground: 60 9.1% 97.8%; - - --ring: 20 14.3% 4.1%; - - --radius: 0.5rem; -} - -.theme-yellow.dark { - --background: 20 14.3% 4.1%; - --foreground: 60 9.1% 97.8%; - - --muted: 12 6.5% 15.1%; - --muted-foreground: 24 5.4% 63.9%; - - --popover: 20 14.3% 4.1%; - --popover-foreground: 60 9.1% 97.8%; - - --card: 20 14.3% 4.1%; - --card-foreground: 60 9.1% 97.8%; - - --border: 12 6.5% 15.1%; - --input: 12 6.5% 15.1%; - - --primary: 47.9 95.8% 53.1%; - --primary-foreground: 26 83.3% 14.1%; - - --secondary: 12 6.5% 15.1%; - --secondary-foreground: 60 9.1% 97.8%; - - --accent: 12 6.5% 15.1%; - --accent-foreground: 60 9.1% 97.8%; - - --destructive: 0 62.8% 30.6%; - --destructive-foreground: 60 9.1% 97.8%; - - --ring: 35.5 91.7% 32.9%; -} - -.theme-violet { - --background: 0 0% 100%; - --foreground: 224 71.4% 4.1%; - - --muted: 220 14.3% 95.9%; - --muted-foreground: 220 8.9% 46.1%; - - --popover: 0 0% 100%; - --popover-foreground: 224 71.4% 4.1%; - - --card: 0 0% 100%; - --card-foreground: 224 71.4% 4.1%; - - --border: 220 13% 91%; - --input: 220 13% 91%; - - --primary: 262.1 83.3% 57.8%; - --primary-foreground: 210 20% 98%; - - --secondary: 220 14.3% 95.9%; - --secondary-foreground: 220.9 39.3% 11%; - - --accent: 220 14.3% 95.9%; - --accent-foreground: 220.9 39.3% 11%; - - --destructive: 0 84.2% 60.2%; - --destructive-foreground: 210 20% 98%; - - --ring: 262.1 83.3% 57.8%; - - --radius: 0.5rem; -} - -.theme-violet.dark { - --background: 224 71.4% 4.1%; - --foreground: 210 20% 98%; - - --muted: 215 27.9% 16.9%; - --muted-foreground: 217.9 10.6% 64.9%; - - --popover: 224 71.4% 4.1%; - --popover-foreground: 210 20% 98%; - - --card: 224 71.4% 4.1%; - --card-foreground: 210 20% 98%; - - --border: 215 27.9% 16.9%; - --input: 215 27.9% 16.9%; - - --primary: 263.4 70% 50.4%; - --primary-foreground: 210 20% 98%; - - --secondary: 215 27.9% 16.9%; - --secondary-foreground: 210 20% 98%; - - --accent: 215 27.9% 16.9%; - --accent-foreground: 210 20% 98%; - - --destructive: 0 62.8% 30.6%; - --destructive-foreground: 210 20% 98%; - - --ring: 263.4 70% 50.4%; -} \ No newline at end of file diff --git a/ui/src/assets/vue.svg b/ui/src/assets/vue.svg deleted file mode 100644 index 770e9d33..00000000 --- a/ui/src/assets/vue.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/ui/src/components/AgentMain.vue b/ui/src/components/AgentMain.vue deleted file mode 100644 index 6a45f017..00000000 --- a/ui/src/components/AgentMain.vue +++ /dev/null @@ -1,156 +0,0 @@ - - - diff --git a/ui/src/components/AgentSessionDisplay.vue b/ui/src/components/AgentSessionDisplay.vue deleted file mode 100644 index b798edfc..00000000 --- a/ui/src/components/AgentSessionDisplay.vue +++ /dev/null @@ -1,78 +0,0 @@ - - - diff --git a/ui/src/components/AgentSessionMessages.vue b/ui/src/components/AgentSessionMessages.vue deleted file mode 100644 index 3c79eabe..00000000 --- a/ui/src/components/AgentSessionMessages.vue +++ /dev/null @@ -1,81 +0,0 @@ - - - diff --git a/ui/src/components/AgentSessionsList.vue b/ui/src/components/AgentSessionsList.vue deleted file mode 100644 index e9aeee95..00000000 --- a/ui/src/components/AgentSessionsList.vue +++ /dev/null @@ -1,52 +0,0 @@ - - - diff --git a/ui/src/components/AttackDisplay.vue b/ui/src/components/AttackDisplay.vue deleted file mode 100644 index 4793bb91..00000000 --- a/ui/src/components/AttackDisplay.vue +++ /dev/null @@ -1,267 +0,0 @@ - - - diff --git a/ui/src/components/AttackList.vue b/ui/src/components/AttackList.vue deleted file mode 100644 index 3590ceb5..00000000 --- a/ui/src/components/AttackList.vue +++ /dev/null @@ -1,62 +0,0 @@ - - - \ No newline at end of file diff --git a/ui/src/components/AttackMain.vue b/ui/src/components/AttackMain.vue deleted file mode 100644 index 13b06ab5..00000000 --- a/ui/src/components/AttackMain.vue +++ /dev/null @@ -1,118 +0,0 @@ - - - diff --git a/ui/src/components/CollaborateMain.vue b/ui/src/components/CollaborateMain.vue deleted file mode 100644 index 44aae3b8..00000000 --- a/ui/src/components/CollaborateMain.vue +++ /dev/null @@ -1,120 +0,0 @@ - - - diff --git a/ui/src/components/DashboardMain.vue b/ui/src/components/DashboardMain.vue deleted file mode 100644 index bedb9c69..00000000 --- a/ui/src/components/DashboardMain.vue +++ /dev/null @@ -1,114 +0,0 @@ - - - diff --git a/ui/src/components/ExploreDisplay.vue b/ui/src/components/ExploreDisplay.vue deleted file mode 100644 index 23a725ac..00000000 --- a/ui/src/components/ExploreDisplay.vue +++ /dev/null @@ -1,48 +0,0 @@ - - - \ No newline at end of file diff --git a/ui/src/components/ExploreList.vue b/ui/src/components/ExploreList.vue deleted file mode 100644 index 944355d7..00000000 --- a/ui/src/components/ExploreList.vue +++ /dev/null @@ -1,74 +0,0 @@ - - - diff --git a/ui/src/components/ExploreMain.vue b/ui/src/components/ExploreMain.vue deleted file mode 100644 index 81d50e74..00000000 --- a/ui/src/components/ExploreMain.vue +++ /dev/null @@ -1,107 +0,0 @@ - - - diff --git a/ui/src/components/HelperHint.vue b/ui/src/components/HelperHint.vue deleted file mode 100644 index b7062219..00000000 --- a/ui/src/components/HelperHint.vue +++ /dev/null @@ -1,45 +0,0 @@ - - - diff --git a/ui/src/components/ProjectSwitcher.vue b/ui/src/components/ProjectSwitcher.vue deleted file mode 100644 index de3387df..00000000 --- a/ui/src/components/ProjectSwitcher.vue +++ /dev/null @@ -1,52 +0,0 @@ - - - - diff --git a/ui/src/components/ReplayDisplay.vue b/ui/src/components/ReplayDisplay.vue deleted file mode 100644 index ac9f5da4..00000000 --- a/ui/src/components/ReplayDisplay.vue +++ /dev/null @@ -1,206 +0,0 @@ - - - diff --git a/ui/src/components/ReplayList.vue b/ui/src/components/ReplayList.vue deleted file mode 100644 index 5f361564..00000000 --- a/ui/src/components/ReplayList.vue +++ /dev/null @@ -1,60 +0,0 @@ - - - \ No newline at end of file diff --git a/ui/src/components/ReplayMain.vue b/ui/src/components/ReplayMain.vue deleted file mode 100644 index 71d277f6..00000000 --- a/ui/src/components/ReplayMain.vue +++ /dev/null @@ -1,117 +0,0 @@ - - - diff --git a/ui/src/components/ReportsDisplay.vue b/ui/src/components/ReportsDisplay.vue deleted file mode 100644 index 3240a4f7..00000000 --- a/ui/src/components/ReportsDisplay.vue +++ /dev/null @@ -1,74 +0,0 @@ - - - diff --git a/ui/src/components/ReportsList.vue b/ui/src/components/ReportsList.vue deleted file mode 100644 index 47322356..00000000 --- a/ui/src/components/ReportsList.vue +++ /dev/null @@ -1,51 +0,0 @@ - - - \ No newline at end of file diff --git a/ui/src/components/ReportsMain.vue b/ui/src/components/ReportsMain.vue deleted file mode 100644 index 5c998468..00000000 --- a/ui/src/components/ReportsMain.vue +++ /dev/null @@ -1,116 +0,0 @@ - - - diff --git a/ui/src/components/ScanDisplay.vue b/ui/src/components/ScanDisplay.vue deleted file mode 100644 index 50ff3789..00000000 --- a/ui/src/components/ScanDisplay.vue +++ /dev/null @@ -1,180 +0,0 @@ - - - diff --git a/ui/src/components/ScanList.vue b/ui/src/components/ScanList.vue deleted file mode 100644 index 83999726..00000000 --- a/ui/src/components/ScanList.vue +++ /dev/null @@ -1,117 +0,0 @@ - - - diff --git a/ui/src/components/ScanMain.vue b/ui/src/components/ScanMain.vue deleted file mode 100644 index 5ec3be78..00000000 --- a/ui/src/components/ScanMain.vue +++ /dev/null @@ -1,157 +0,0 @@ - - - diff --git a/ui/src/components/SessionMain.vue b/ui/src/components/SessionMain.vue deleted file mode 100644 index 16818fb0..00000000 --- a/ui/src/components/SessionMain.vue +++ /dev/null @@ -1,88 +0,0 @@ - - - diff --git a/ui/src/components/SettingsMain.vue b/ui/src/components/SettingsMain.vue deleted file mode 100644 index 8b1dc3b3..00000000 --- a/ui/src/components/SettingsMain.vue +++ /dev/null @@ -1,112 +0,0 @@ - - - diff --git a/ui/src/components/SideNav.vue b/ui/src/components/SideNav.vue deleted file mode 100644 index 8d9f3ce7..00000000 --- a/ui/src/components/SideNav.vue +++ /dev/null @@ -1,173 +0,0 @@ - - - diff --git a/ui/src/components/SideNavCollaborate.vue b/ui/src/components/SideNavCollaborate.vue deleted file mode 100644 index 6d536817..00000000 --- a/ui/src/components/SideNavCollaborate.vue +++ /dev/null @@ -1,110 +0,0 @@ - - - \ No newline at end of file diff --git a/ui/src/components/SideNavScan.vue b/ui/src/components/SideNavScan.vue deleted file mode 100644 index fad05479..00000000 --- a/ui/src/components/SideNavScan.vue +++ /dev/null @@ -1,125 +0,0 @@ - - - \ No newline at end of file diff --git a/ui/src/components/SideNavSecondary.vue b/ui/src/components/SideNavSecondary.vue deleted file mode 100644 index fa70c5ad..00000000 --- a/ui/src/components/SideNavSecondary.vue +++ /dev/null @@ -1,134 +0,0 @@ - - - \ No newline at end of file diff --git a/ui/src/components/brand/GhostLogo.vue b/ui/src/components/brand/GhostLogo.vue deleted file mode 100644 index 2881bc92..00000000 --- a/ui/src/components/brand/GhostLogo.vue +++ /dev/null @@ -1,26 +0,0 @@ - \ No newline at end of file diff --git a/ui/src/components/shared/RequestMethod.vue b/ui/src/components/shared/RequestMethod.vue deleted file mode 100644 index 9f8b4c4f..00000000 --- a/ui/src/components/shared/RequestMethod.vue +++ /dev/null @@ -1,30 +0,0 @@ - - - diff --git a/ui/src/components/ui/alert/Alert.vue b/ui/src/components/ui/alert/Alert.vue deleted file mode 100644 index 964d61d5..00000000 --- a/ui/src/components/ui/alert/Alert.vue +++ /dev/null @@ -1,16 +0,0 @@ - - - diff --git a/ui/src/components/ui/alert/AlertDescription.vue b/ui/src/components/ui/alert/AlertDescription.vue deleted file mode 100644 index 2971a877..00000000 --- a/ui/src/components/ui/alert/AlertDescription.vue +++ /dev/null @@ -1,14 +0,0 @@ - - - diff --git a/ui/src/components/ui/alert/AlertTitle.vue b/ui/src/components/ui/alert/AlertTitle.vue deleted file mode 100644 index e28dd37e..00000000 --- a/ui/src/components/ui/alert/AlertTitle.vue +++ /dev/null @@ -1,14 +0,0 @@ - - - diff --git a/ui/src/components/ui/alert/index.ts b/ui/src/components/ui/alert/index.ts deleted file mode 100644 index eab63566..00000000 --- a/ui/src/components/ui/alert/index.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { cva, type VariantProps } from 'class-variance-authority' - -export { default as Alert } from './Alert.vue' -export { default as AlertDescription } from './AlertDescription.vue' -export { default as AlertTitle } from './AlertTitle.vue' - -export const alertVariants = cva( - 'relative w-full rounded-lg border px-4 py-3 text-sm [&>svg+div]:translate-y-[-3px] [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4 [&>svg]:text-foreground [&>svg~*]:pl-7', - { - variants: { - variant: { - default: 'bg-background text-foreground', - destructive: - 'border-destructive/50 text-destructive dark:border-destructive [&>svg]:text-destructive', - }, - }, - defaultVariants: { - variant: 'default', - }, - }, -) - -export type AlertVariants = VariantProps diff --git a/ui/src/components/ui/avatar/Avatar.vue b/ui/src/components/ui/avatar/Avatar.vue deleted file mode 100644 index 5b7b9fbf..00000000 --- a/ui/src/components/ui/avatar/Avatar.vue +++ /dev/null @@ -1,21 +0,0 @@ - - - diff --git a/ui/src/components/ui/avatar/AvatarFallback.vue b/ui/src/components/ui/avatar/AvatarFallback.vue deleted file mode 100644 index a671a219..00000000 --- a/ui/src/components/ui/avatar/AvatarFallback.vue +++ /dev/null @@ -1,11 +0,0 @@ - - - diff --git a/ui/src/components/ui/avatar/AvatarImage.vue b/ui/src/components/ui/avatar/AvatarImage.vue deleted file mode 100644 index 43499fa2..00000000 --- a/ui/src/components/ui/avatar/AvatarImage.vue +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/ui/src/components/ui/avatar/index.ts b/ui/src/components/ui/avatar/index.ts deleted file mode 100644 index c4af1a66..00000000 --- a/ui/src/components/ui/avatar/index.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { type VariantProps, cva } from 'class-variance-authority' - -export { default as Avatar } from './Avatar.vue' -export { default as AvatarImage } from './AvatarImage.vue' -export { default as AvatarFallback } from './AvatarFallback.vue' - -export const avatarVariant = cva( - 'inline-flex items-center justify-center font-normal text-foreground select-none shrink-0 bg-secondary overflow-hidden', - { - variants: { - size: { - sm: 'h-10 w-10 text-xs', - base: 'h-16 w-16 text-2xl', - lg: 'h-32 w-32 text-5xl', - }, - shape: { - circle: 'rounded-full', - square: 'rounded-md', - }, - }, - }, -) - -export type AvatarVariants = VariantProps diff --git a/ui/src/components/ui/badge/Badge.vue b/ui/src/components/ui/badge/Badge.vue deleted file mode 100644 index 2e8bdffa..00000000 --- a/ui/src/components/ui/badge/Badge.vue +++ /dev/null @@ -1,16 +0,0 @@ - - - diff --git a/ui/src/components/ui/badge/index.ts b/ui/src/components/ui/badge/index.ts deleted file mode 100644 index 20eda06a..00000000 --- a/ui/src/components/ui/badge/index.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { type VariantProps, cva } from 'class-variance-authority' - -export { default as Badge } from './Badge.vue' - -export const badgeVariants = cva( - 'inline-flex items-center rounded-md border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2', - { - variants: { - variant: { - default: - 'border-transparent bg-primary text-primary-foreground shadow hover:bg-primary/80', - secondary: - 'border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80', - destructive: - 'border-transparent bg-destructive text-destructive-foreground shadow hover:bg-destructive/80', - outline: 'text-foreground', - }, - }, - defaultVariants: { - variant: 'default', - }, - }, -) - -export type BadgeVariants = VariantProps diff --git a/ui/src/components/ui/button/Button.vue b/ui/src/components/ui/button/Button.vue deleted file mode 100644 index 5cfd668a..00000000 --- a/ui/src/components/ui/button/Button.vue +++ /dev/null @@ -1,26 +0,0 @@ - - - diff --git a/ui/src/components/ui/button/index.ts b/ui/src/components/ui/button/index.ts deleted file mode 100644 index 4bb4bdb9..00000000 --- a/ui/src/components/ui/button/index.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { type VariantProps, cva } from 'class-variance-authority' - -export { default as Button } from './Button.vue' - -export const buttonVariants = cva( - 'inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50', - { - variants: { - variant: { - default: 'bg-primary text-primary-foreground shadow hover:bg-primary/90', - destructive: - 'bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90', - outline: - 'border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground', - secondary: - 'bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80', - ghost: 'hover:bg-accent hover:text-accent-foreground', - link: 'text-primary underline-offset-4 hover:underline', - }, - size: { - default: 'h-9 px-4 py-2', - sm: 'h-8 rounded-md px-3 text-xs', - lg: 'h-10 rounded-md px-8', - icon: 'h-9 w-9', - }, - }, - defaultVariants: { - variant: 'default', - size: 'default', - }, - }, -) - -export type ButtonVariants = VariantProps diff --git a/ui/src/components/ui/calendar/Calendar.vue b/ui/src/components/ui/calendar/Calendar.vue deleted file mode 100644 index 0486e496..00000000 --- a/ui/src/components/ui/calendar/Calendar.vue +++ /dev/null @@ -1,60 +0,0 @@ - - - diff --git a/ui/src/components/ui/calendar/CalendarCell.vue b/ui/src/components/ui/calendar/CalendarCell.vue deleted file mode 100644 index 19c444e5..00000000 --- a/ui/src/components/ui/calendar/CalendarCell.vue +++ /dev/null @@ -1,24 +0,0 @@ - - - diff --git a/ui/src/components/ui/calendar/CalendarCellTrigger.vue b/ui/src/components/ui/calendar/CalendarCellTrigger.vue deleted file mode 100644 index 73e58d01..00000000 --- a/ui/src/components/ui/calendar/CalendarCellTrigger.vue +++ /dev/null @@ -1,38 +0,0 @@ - - - diff --git a/ui/src/components/ui/calendar/CalendarGrid.vue b/ui/src/components/ui/calendar/CalendarGrid.vue deleted file mode 100644 index 2fe5439a..00000000 --- a/ui/src/components/ui/calendar/CalendarGrid.vue +++ /dev/null @@ -1,24 +0,0 @@ - - - diff --git a/ui/src/components/ui/calendar/CalendarGridBody.vue b/ui/src/components/ui/calendar/CalendarGridBody.vue deleted file mode 100644 index 23d71ced..00000000 --- a/ui/src/components/ui/calendar/CalendarGridBody.vue +++ /dev/null @@ -1,11 +0,0 @@ - - - diff --git a/ui/src/components/ui/calendar/CalendarGridHead.vue b/ui/src/components/ui/calendar/CalendarGridHead.vue deleted file mode 100644 index b1356fb7..00000000 --- a/ui/src/components/ui/calendar/CalendarGridHead.vue +++ /dev/null @@ -1,12 +0,0 @@ - - - diff --git a/ui/src/components/ui/calendar/CalendarGridRow.vue b/ui/src/components/ui/calendar/CalendarGridRow.vue deleted file mode 100644 index 47fdb460..00000000 --- a/ui/src/components/ui/calendar/CalendarGridRow.vue +++ /dev/null @@ -1,21 +0,0 @@ - - - diff --git a/ui/src/components/ui/calendar/CalendarHeadCell.vue b/ui/src/components/ui/calendar/CalendarHeadCell.vue deleted file mode 100644 index d3b6380a..00000000 --- a/ui/src/components/ui/calendar/CalendarHeadCell.vue +++ /dev/null @@ -1,21 +0,0 @@ - - - diff --git a/ui/src/components/ui/calendar/CalendarHeader.vue b/ui/src/components/ui/calendar/CalendarHeader.vue deleted file mode 100644 index 8bfa1969..00000000 --- a/ui/src/components/ui/calendar/CalendarHeader.vue +++ /dev/null @@ -1,21 +0,0 @@ - - - diff --git a/ui/src/components/ui/calendar/CalendarHeading.vue b/ui/src/components/ui/calendar/CalendarHeading.vue deleted file mode 100644 index 7062d3db..00000000 --- a/ui/src/components/ui/calendar/CalendarHeading.vue +++ /dev/null @@ -1,27 +0,0 @@ - - - diff --git a/ui/src/components/ui/calendar/CalendarNextButton.vue b/ui/src/components/ui/calendar/CalendarNextButton.vue deleted file mode 100644 index 724e4616..00000000 --- a/ui/src/components/ui/calendar/CalendarNextButton.vue +++ /dev/null @@ -1,32 +0,0 @@ - - - diff --git a/ui/src/components/ui/calendar/CalendarPrevButton.vue b/ui/src/components/ui/calendar/CalendarPrevButton.vue deleted file mode 100644 index 4086a1c4..00000000 --- a/ui/src/components/ui/calendar/CalendarPrevButton.vue +++ /dev/null @@ -1,32 +0,0 @@ - - - diff --git a/ui/src/components/ui/calendar/index.ts b/ui/src/components/ui/calendar/index.ts deleted file mode 100644 index 5239a1bd..00000000 --- a/ui/src/components/ui/calendar/index.ts +++ /dev/null @@ -1,12 +0,0 @@ -export { default as Calendar } from './Calendar.vue' -export { default as CalendarCell } from './CalendarCell.vue' -export { default as CalendarCellTrigger } from './CalendarCellTrigger.vue' -export { default as CalendarGrid } from './CalendarGrid.vue' -export { default as CalendarGridBody } from './CalendarGridBody.vue' -export { default as CalendarGridHead } from './CalendarGridHead.vue' -export { default as CalendarGridRow } from './CalendarGridRow.vue' -export { default as CalendarHeadCell } from './CalendarHeadCell.vue' -export { default as CalendarHeader } from './CalendarHeader.vue' -export { default as CalendarHeading } from './CalendarHeading.vue' -export { default as CalendarNextButton } from './CalendarNextButton.vue' -export { default as CalendarPrevButton } from './CalendarPrevButton.vue' diff --git a/ui/src/components/ui/card/Card.vue b/ui/src/components/ui/card/Card.vue deleted file mode 100644 index 94b69033..00000000 --- a/ui/src/components/ui/card/Card.vue +++ /dev/null @@ -1,21 +0,0 @@ - - - diff --git a/ui/src/components/ui/card/CardContent.vue b/ui/src/components/ui/card/CardContent.vue deleted file mode 100644 index 785913a1..00000000 --- a/ui/src/components/ui/card/CardContent.vue +++ /dev/null @@ -1,14 +0,0 @@ - - - diff --git a/ui/src/components/ui/card/CardDescription.vue b/ui/src/components/ui/card/CardDescription.vue deleted file mode 100644 index d5faedd5..00000000 --- a/ui/src/components/ui/card/CardDescription.vue +++ /dev/null @@ -1,14 +0,0 @@ - - - diff --git a/ui/src/components/ui/card/CardFooter.vue b/ui/src/components/ui/card/CardFooter.vue deleted file mode 100644 index 1ed2efe5..00000000 --- a/ui/src/components/ui/card/CardFooter.vue +++ /dev/null @@ -1,14 +0,0 @@ - - - diff --git a/ui/src/components/ui/card/CardHeader.vue b/ui/src/components/ui/card/CardHeader.vue deleted file mode 100644 index 951d227e..00000000 --- a/ui/src/components/ui/card/CardHeader.vue +++ /dev/null @@ -1,14 +0,0 @@ - - - diff --git a/ui/src/components/ui/card/CardTitle.vue b/ui/src/components/ui/card/CardTitle.vue deleted file mode 100644 index fc302e25..00000000 --- a/ui/src/components/ui/card/CardTitle.vue +++ /dev/null @@ -1,18 +0,0 @@ - - - diff --git a/ui/src/components/ui/card/index.ts b/ui/src/components/ui/card/index.ts deleted file mode 100644 index 9ff6d5e7..00000000 --- a/ui/src/components/ui/card/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -export { default as Card } from './Card.vue' -export { default as CardContent } from './CardContent.vue' -export { default as CardDescription } from './CardDescription.vue' -export { default as CardFooter } from './CardFooter.vue' -export { default as CardHeader } from './CardHeader.vue' -export { default as CardTitle } from './CardTitle.vue' diff --git a/ui/src/components/ui/checkbox/Checkbox.vue b/ui/src/components/ui/checkbox/Checkbox.vue deleted file mode 100644 index 486f26ae..00000000 --- a/ui/src/components/ui/checkbox/Checkbox.vue +++ /dev/null @@ -1,33 +0,0 @@ - - - diff --git a/ui/src/components/ui/checkbox/index.ts b/ui/src/components/ui/checkbox/index.ts deleted file mode 100644 index 8c28c286..00000000 --- a/ui/src/components/ui/checkbox/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { default as Checkbox } from './Checkbox.vue' diff --git a/ui/src/components/ui/command/Command.vue b/ui/src/components/ui/command/Command.vue deleted file mode 100644 index fe7445c0..00000000 --- a/ui/src/components/ui/command/Command.vue +++ /dev/null @@ -1,30 +0,0 @@ - - - diff --git a/ui/src/components/ui/command/CommandDialog.vue b/ui/src/components/ui/command/CommandDialog.vue deleted file mode 100644 index 53f520bc..00000000 --- a/ui/src/components/ui/command/CommandDialog.vue +++ /dev/null @@ -1,21 +0,0 @@ - - - diff --git a/ui/src/components/ui/command/CommandEmpty.vue b/ui/src/components/ui/command/CommandEmpty.vue deleted file mode 100644 index 1295d2a0..00000000 --- a/ui/src/components/ui/command/CommandEmpty.vue +++ /dev/null @@ -1,20 +0,0 @@ - - - diff --git a/ui/src/components/ui/command/CommandGroup.vue b/ui/src/components/ui/command/CommandGroup.vue deleted file mode 100644 index ba6433e5..00000000 --- a/ui/src/components/ui/command/CommandGroup.vue +++ /dev/null @@ -1,29 +0,0 @@ - - - diff --git a/ui/src/components/ui/command/CommandInput.vue b/ui/src/components/ui/command/CommandInput.vue deleted file mode 100644 index c0a67265..00000000 --- a/ui/src/components/ui/command/CommandInput.vue +++ /dev/null @@ -1,33 +0,0 @@ - - - diff --git a/ui/src/components/ui/command/CommandItem.vue b/ui/src/components/ui/command/CommandItem.vue deleted file mode 100644 index 5c6a6ffe..00000000 --- a/ui/src/components/ui/command/CommandItem.vue +++ /dev/null @@ -1,26 +0,0 @@ - - - diff --git a/ui/src/components/ui/command/CommandList.vue b/ui/src/components/ui/command/CommandList.vue deleted file mode 100644 index 00d1b3a7..00000000 --- a/ui/src/components/ui/command/CommandList.vue +++ /dev/null @@ -1,27 +0,0 @@ - - - diff --git a/ui/src/components/ui/command/CommandSeparator.vue b/ui/src/components/ui/command/CommandSeparator.vue deleted file mode 100644 index 477799cc..00000000 --- a/ui/src/components/ui/command/CommandSeparator.vue +++ /dev/null @@ -1,23 +0,0 @@ - - - diff --git a/ui/src/components/ui/command/CommandShortcut.vue b/ui/src/components/ui/command/CommandShortcut.vue deleted file mode 100644 index 0d4da921..00000000 --- a/ui/src/components/ui/command/CommandShortcut.vue +++ /dev/null @@ -1,14 +0,0 @@ - - - diff --git a/ui/src/components/ui/command/index.ts b/ui/src/components/ui/command/index.ts deleted file mode 100644 index 0e35f4b9..00000000 --- a/ui/src/components/ui/command/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -export { default as Command } from './Command.vue' -export { default as CommandDialog } from './CommandDialog.vue' -export { default as CommandEmpty } from './CommandEmpty.vue' -export { default as CommandGroup } from './CommandGroup.vue' -export { default as CommandInput } from './CommandInput.vue' -export { default as CommandItem } from './CommandItem.vue' -export { default as CommandList } from './CommandList.vue' -export { default as CommandSeparator } from './CommandSeparator.vue' -export { default as CommandShortcut } from './CommandShortcut.vue' diff --git a/ui/src/components/ui/dialog/Dialog.vue b/ui/src/components/ui/dialog/Dialog.vue deleted file mode 100644 index a04c0262..00000000 --- a/ui/src/components/ui/dialog/Dialog.vue +++ /dev/null @@ -1,14 +0,0 @@ - - - diff --git a/ui/src/components/ui/dialog/DialogClose.vue b/ui/src/components/ui/dialog/DialogClose.vue deleted file mode 100644 index a64703e5..00000000 --- a/ui/src/components/ui/dialog/DialogClose.vue +++ /dev/null @@ -1,11 +0,0 @@ - - - diff --git a/ui/src/components/ui/dialog/DialogContent.vue b/ui/src/components/ui/dialog/DialogContent.vue deleted file mode 100644 index d8699c29..00000000 --- a/ui/src/components/ui/dialog/DialogContent.vue +++ /dev/null @@ -1,50 +0,0 @@ - - - diff --git a/ui/src/components/ui/dialog/DialogDescription.vue b/ui/src/components/ui/dialog/DialogDescription.vue deleted file mode 100644 index 3637b7ec..00000000 --- a/ui/src/components/ui/dialog/DialogDescription.vue +++ /dev/null @@ -1,24 +0,0 @@ - - - diff --git a/ui/src/components/ui/dialog/DialogFooter.vue b/ui/src/components/ui/dialog/DialogFooter.vue deleted file mode 100644 index ac2d0c18..00000000 --- a/ui/src/components/ui/dialog/DialogFooter.vue +++ /dev/null @@ -1,19 +0,0 @@ - - - diff --git a/ui/src/components/ui/dialog/DialogHeader.vue b/ui/src/components/ui/dialog/DialogHeader.vue deleted file mode 100644 index b2c9085d..00000000 --- a/ui/src/components/ui/dialog/DialogHeader.vue +++ /dev/null @@ -1,16 +0,0 @@ - - - diff --git a/ui/src/components/ui/dialog/DialogScrollContent.vue b/ui/src/components/ui/dialog/DialogScrollContent.vue deleted file mode 100644 index 190ca3ce..00000000 --- a/ui/src/components/ui/dialog/DialogScrollContent.vue +++ /dev/null @@ -1,59 +0,0 @@ - - - diff --git a/ui/src/components/ui/dialog/DialogTitle.vue b/ui/src/components/ui/dialog/DialogTitle.vue deleted file mode 100644 index 1bb40461..00000000 --- a/ui/src/components/ui/dialog/DialogTitle.vue +++ /dev/null @@ -1,29 +0,0 @@ - - - diff --git a/ui/src/components/ui/dialog/DialogTrigger.vue b/ui/src/components/ui/dialog/DialogTrigger.vue deleted file mode 100644 index ee0c12ff..00000000 --- a/ui/src/components/ui/dialog/DialogTrigger.vue +++ /dev/null @@ -1,11 +0,0 @@ - - - diff --git a/ui/src/components/ui/dialog/index.ts b/ui/src/components/ui/dialog/index.ts deleted file mode 100644 index 847e999f..00000000 --- a/ui/src/components/ui/dialog/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -export { default as Dialog } from './Dialog.vue' -export { default as DialogClose } from './DialogClose.vue' -export { default as DialogTrigger } from './DialogTrigger.vue' -export { default as DialogHeader } from './DialogHeader.vue' -export { default as DialogTitle } from './DialogTitle.vue' -export { default as DialogDescription } from './DialogDescription.vue' -export { default as DialogContent } from './DialogContent.vue' -export { default as DialogScrollContent } from './DialogScrollContent.vue' -export { default as DialogFooter } from './DialogFooter.vue' diff --git a/ui/src/components/ui/dropdown-menu/DropdownMenu.vue b/ui/src/components/ui/dropdown-menu/DropdownMenu.vue deleted file mode 100644 index b83d90b8..00000000 --- a/ui/src/components/ui/dropdown-menu/DropdownMenu.vue +++ /dev/null @@ -1,14 +0,0 @@ - - - diff --git a/ui/src/components/ui/dropdown-menu/DropdownMenuCheckboxItem.vue b/ui/src/components/ui/dropdown-menu/DropdownMenuCheckboxItem.vue deleted file mode 100644 index a6792a7a..00000000 --- a/ui/src/components/ui/dropdown-menu/DropdownMenuCheckboxItem.vue +++ /dev/null @@ -1,40 +0,0 @@ - - - diff --git a/ui/src/components/ui/dropdown-menu/DropdownMenuContent.vue b/ui/src/components/ui/dropdown-menu/DropdownMenuContent.vue deleted file mode 100644 index b33d58eb..00000000 --- a/ui/src/components/ui/dropdown-menu/DropdownMenuContent.vue +++ /dev/null @@ -1,38 +0,0 @@ - - - diff --git a/ui/src/components/ui/dropdown-menu/DropdownMenuGroup.vue b/ui/src/components/ui/dropdown-menu/DropdownMenuGroup.vue deleted file mode 100644 index 3f201352..00000000 --- a/ui/src/components/ui/dropdown-menu/DropdownMenuGroup.vue +++ /dev/null @@ -1,11 +0,0 @@ - - - diff --git a/ui/src/components/ui/dropdown-menu/DropdownMenuItem.vue b/ui/src/components/ui/dropdown-menu/DropdownMenuItem.vue deleted file mode 100644 index 04d3d60e..00000000 --- a/ui/src/components/ui/dropdown-menu/DropdownMenuItem.vue +++ /dev/null @@ -1,28 +0,0 @@ - - - diff --git a/ui/src/components/ui/dropdown-menu/DropdownMenuLabel.vue b/ui/src/components/ui/dropdown-menu/DropdownMenuLabel.vue deleted file mode 100644 index 5fa684e1..00000000 --- a/ui/src/components/ui/dropdown-menu/DropdownMenuLabel.vue +++ /dev/null @@ -1,24 +0,0 @@ - - - diff --git a/ui/src/components/ui/dropdown-menu/DropdownMenuRadioGroup.vue b/ui/src/components/ui/dropdown-menu/DropdownMenuRadioGroup.vue deleted file mode 100644 index 4a727904..00000000 --- a/ui/src/components/ui/dropdown-menu/DropdownMenuRadioGroup.vue +++ /dev/null @@ -1,19 +0,0 @@ - - - diff --git a/ui/src/components/ui/dropdown-menu/DropdownMenuRadioItem.vue b/ui/src/components/ui/dropdown-menu/DropdownMenuRadioItem.vue deleted file mode 100644 index a2fef4c9..00000000 --- a/ui/src/components/ui/dropdown-menu/DropdownMenuRadioItem.vue +++ /dev/null @@ -1,41 +0,0 @@ - - - diff --git a/ui/src/components/ui/dropdown-menu/DropdownMenuSeparator.vue b/ui/src/components/ui/dropdown-menu/DropdownMenuSeparator.vue deleted file mode 100644 index fc51205b..00000000 --- a/ui/src/components/ui/dropdown-menu/DropdownMenuSeparator.vue +++ /dev/null @@ -1,22 +0,0 @@ - - - diff --git a/ui/src/components/ui/dropdown-menu/DropdownMenuShortcut.vue b/ui/src/components/ui/dropdown-menu/DropdownMenuShortcut.vue deleted file mode 100644 index abaeda64..00000000 --- a/ui/src/components/ui/dropdown-menu/DropdownMenuShortcut.vue +++ /dev/null @@ -1,14 +0,0 @@ - - - diff --git a/ui/src/components/ui/dropdown-menu/DropdownMenuSub.vue b/ui/src/components/ui/dropdown-menu/DropdownMenuSub.vue deleted file mode 100644 index e0f4bd77..00000000 --- a/ui/src/components/ui/dropdown-menu/DropdownMenuSub.vue +++ /dev/null @@ -1,19 +0,0 @@ - - - diff --git a/ui/src/components/ui/dropdown-menu/DropdownMenuSubContent.vue b/ui/src/components/ui/dropdown-menu/DropdownMenuSubContent.vue deleted file mode 100644 index 446f9fb5..00000000 --- a/ui/src/components/ui/dropdown-menu/DropdownMenuSubContent.vue +++ /dev/null @@ -1,30 +0,0 @@ - - - diff --git a/ui/src/components/ui/dropdown-menu/DropdownMenuSubTrigger.vue b/ui/src/components/ui/dropdown-menu/DropdownMenuSubTrigger.vue deleted file mode 100644 index 00d04e09..00000000 --- a/ui/src/components/ui/dropdown-menu/DropdownMenuSubTrigger.vue +++ /dev/null @@ -1,33 +0,0 @@ - - - diff --git a/ui/src/components/ui/dropdown-menu/DropdownMenuTrigger.vue b/ui/src/components/ui/dropdown-menu/DropdownMenuTrigger.vue deleted file mode 100644 index 8efd5a92..00000000 --- a/ui/src/components/ui/dropdown-menu/DropdownMenuTrigger.vue +++ /dev/null @@ -1,13 +0,0 @@ - - - diff --git a/ui/src/components/ui/dropdown-menu/index.ts b/ui/src/components/ui/dropdown-menu/index.ts deleted file mode 100644 index 6f9446c3..00000000 --- a/ui/src/components/ui/dropdown-menu/index.ts +++ /dev/null @@ -1,16 +0,0 @@ -export { DropdownMenuPortal } from 'radix-vue' - -export { default as DropdownMenu } from './DropdownMenu.vue' -export { default as DropdownMenuTrigger } from './DropdownMenuTrigger.vue' -export { default as DropdownMenuContent } from './DropdownMenuContent.vue' -export { default as DropdownMenuGroup } from './DropdownMenuGroup.vue' -export { default as DropdownMenuRadioGroup } from './DropdownMenuRadioGroup.vue' -export { default as DropdownMenuItem } from './DropdownMenuItem.vue' -export { default as DropdownMenuCheckboxItem } from './DropdownMenuCheckboxItem.vue' -export { default as DropdownMenuRadioItem } from './DropdownMenuRadioItem.vue' -export { default as DropdownMenuShortcut } from './DropdownMenuShortcut.vue' -export { default as DropdownMenuSeparator } from './DropdownMenuSeparator.vue' -export { default as DropdownMenuLabel } from './DropdownMenuLabel.vue' -export { default as DropdownMenuSub } from './DropdownMenuSub.vue' -export { default as DropdownMenuSubTrigger } from './DropdownMenuSubTrigger.vue' -export { default as DropdownMenuSubContent } from './DropdownMenuSubContent.vue' diff --git a/ui/src/components/ui/input/Input.vue b/ui/src/components/ui/input/Input.vue deleted file mode 100644 index 1165ea55..00000000 --- a/ui/src/components/ui/input/Input.vue +++ /dev/null @@ -1,24 +0,0 @@ - - - diff --git a/ui/src/components/ui/input/index.ts b/ui/src/components/ui/input/index.ts deleted file mode 100644 index a691dd6c..00000000 --- a/ui/src/components/ui/input/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { default as Input } from './Input.vue' diff --git a/ui/src/components/ui/label/Label.vue b/ui/src/components/ui/label/Label.vue deleted file mode 100644 index 8fba8db4..00000000 --- a/ui/src/components/ui/label/Label.vue +++ /dev/null @@ -1,27 +0,0 @@ - - - diff --git a/ui/src/components/ui/label/index.ts b/ui/src/components/ui/label/index.ts deleted file mode 100644 index 572c2f01..00000000 --- a/ui/src/components/ui/label/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { default as Label } from './Label.vue' diff --git a/ui/src/components/ui/popover/Popover.vue b/ui/src/components/ui/popover/Popover.vue deleted file mode 100644 index 1a5873a3..00000000 --- a/ui/src/components/ui/popover/Popover.vue +++ /dev/null @@ -1,15 +0,0 @@ - - - diff --git a/ui/src/components/ui/popover/PopoverContent.vue b/ui/src/components/ui/popover/PopoverContent.vue deleted file mode 100644 index e691fe82..00000000 --- a/ui/src/components/ui/popover/PopoverContent.vue +++ /dev/null @@ -1,48 +0,0 @@ - - - diff --git a/ui/src/components/ui/popover/PopoverTrigger.vue b/ui/src/components/ui/popover/PopoverTrigger.vue deleted file mode 100644 index 22f4772a..00000000 --- a/ui/src/components/ui/popover/PopoverTrigger.vue +++ /dev/null @@ -1,11 +0,0 @@ - - - diff --git a/ui/src/components/ui/popover/index.ts b/ui/src/components/ui/popover/index.ts deleted file mode 100644 index 87f034a1..00000000 --- a/ui/src/components/ui/popover/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export { PopoverAnchor } from 'radix-vue' -export { default as Popover } from './Popover.vue' -export { default as PopoverTrigger } from './PopoverTrigger.vue' -export { default as PopoverContent } from './PopoverContent.vue' diff --git a/ui/src/components/ui/progress/Progress.vue b/ui/src/components/ui/progress/Progress.vue deleted file mode 100644 index 872e73e8..00000000 --- a/ui/src/components/ui/progress/Progress.vue +++ /dev/null @@ -1,39 +0,0 @@ - - - diff --git a/ui/src/components/ui/progress/index.ts b/ui/src/components/ui/progress/index.ts deleted file mode 100644 index eace9893..00000000 --- a/ui/src/components/ui/progress/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { default as Progress } from './Progress.vue' diff --git a/ui/src/components/ui/resizable/ResizableHandle.vue b/ui/src/components/ui/resizable/ResizableHandle.vue deleted file mode 100644 index 2cdaf66d..00000000 --- a/ui/src/components/ui/resizable/ResizableHandle.vue +++ /dev/null @@ -1,26 +0,0 @@ - - - diff --git a/ui/src/components/ui/resizable/ResizablePanelGroup.vue b/ui/src/components/ui/resizable/ResizablePanelGroup.vue deleted file mode 100644 index 6c317fa7..00000000 --- a/ui/src/components/ui/resizable/ResizablePanelGroup.vue +++ /dev/null @@ -1,21 +0,0 @@ - - - diff --git a/ui/src/components/ui/resizable/index.ts b/ui/src/components/ui/resizable/index.ts deleted file mode 100644 index 22a0a8a8..00000000 --- a/ui/src/components/ui/resizable/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export { default as ResizablePanelGroup } from './ResizablePanelGroup.vue' -export { default as ResizableHandle } from './ResizableHandle.vue' -export { SplitterPanel as ResizablePanel } from 'radix-vue' diff --git a/ui/src/components/ui/scroll-area/ScrollArea.vue b/ui/src/components/ui/scroll-area/ScrollArea.vue deleted file mode 100644 index 8f501cce..00000000 --- a/ui/src/components/ui/scroll-area/ScrollArea.vue +++ /dev/null @@ -1,29 +0,0 @@ - - - diff --git a/ui/src/components/ui/scroll-area/ScrollBar.vue b/ui/src/components/ui/scroll-area/ScrollBar.vue deleted file mode 100644 index efaaee2d..00000000 --- a/ui/src/components/ui/scroll-area/ScrollBar.vue +++ /dev/null @@ -1,30 +0,0 @@ - - - diff --git a/ui/src/components/ui/scroll-area/index.ts b/ui/src/components/ui/scroll-area/index.ts deleted file mode 100644 index 2bd4fae5..00000000 --- a/ui/src/components/ui/scroll-area/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { default as ScrollArea } from './ScrollArea.vue' -export { default as ScrollBar } from './ScrollBar.vue' diff --git a/ui/src/components/ui/select/Select.vue b/ui/src/components/ui/select/Select.vue deleted file mode 100644 index adc42fdf..00000000 --- a/ui/src/components/ui/select/Select.vue +++ /dev/null @@ -1,15 +0,0 @@ - - - diff --git a/ui/src/components/ui/select/SelectContent.vue b/ui/src/components/ui/select/SelectContent.vue deleted file mode 100644 index 4fe234b2..00000000 --- a/ui/src/components/ui/select/SelectContent.vue +++ /dev/null @@ -1,53 +0,0 @@ - - - diff --git a/ui/src/components/ui/select/SelectGroup.vue b/ui/src/components/ui/select/SelectGroup.vue deleted file mode 100644 index 407d8ad3..00000000 --- a/ui/src/components/ui/select/SelectGroup.vue +++ /dev/null @@ -1,19 +0,0 @@ - - - diff --git a/ui/src/components/ui/select/SelectItem.vue b/ui/src/components/ui/select/SelectItem.vue deleted file mode 100644 index c9a5cf7b..00000000 --- a/ui/src/components/ui/select/SelectItem.vue +++ /dev/null @@ -1,44 +0,0 @@ - - - diff --git a/ui/src/components/ui/select/SelectItemText.vue b/ui/src/components/ui/select/SelectItemText.vue deleted file mode 100644 index a0bb5c24..00000000 --- a/ui/src/components/ui/select/SelectItemText.vue +++ /dev/null @@ -1,11 +0,0 @@ - - - diff --git a/ui/src/components/ui/select/SelectLabel.vue b/ui/src/components/ui/select/SelectLabel.vue deleted file mode 100644 index e2025650..00000000 --- a/ui/src/components/ui/select/SelectLabel.vue +++ /dev/null @@ -1,13 +0,0 @@ - - - diff --git a/ui/src/components/ui/select/SelectScrollDownButton.vue b/ui/src/components/ui/select/SelectScrollDownButton.vue deleted file mode 100644 index 846411e4..00000000 --- a/ui/src/components/ui/select/SelectScrollDownButton.vue +++ /dev/null @@ -1,24 +0,0 @@ - - - diff --git a/ui/src/components/ui/select/SelectScrollUpButton.vue b/ui/src/components/ui/select/SelectScrollUpButton.vue deleted file mode 100644 index 308f0bd8..00000000 --- a/ui/src/components/ui/select/SelectScrollUpButton.vue +++ /dev/null @@ -1,24 +0,0 @@ - - - diff --git a/ui/src/components/ui/select/SelectSeparator.vue b/ui/src/components/ui/select/SelectSeparator.vue deleted file mode 100644 index 5ae593d2..00000000 --- a/ui/src/components/ui/select/SelectSeparator.vue +++ /dev/null @@ -1,17 +0,0 @@ - - - diff --git a/ui/src/components/ui/select/SelectTrigger.vue b/ui/src/components/ui/select/SelectTrigger.vue deleted file mode 100644 index 6c97d784..00000000 --- a/ui/src/components/ui/select/SelectTrigger.vue +++ /dev/null @@ -1,31 +0,0 @@ - - - diff --git a/ui/src/components/ui/select/SelectValue.vue b/ui/src/components/ui/select/SelectValue.vue deleted file mode 100644 index 4bc37dd8..00000000 --- a/ui/src/components/ui/select/SelectValue.vue +++ /dev/null @@ -1,11 +0,0 @@ - - - diff --git a/ui/src/components/ui/select/index.ts b/ui/src/components/ui/select/index.ts deleted file mode 100644 index b1d89eed..00000000 --- a/ui/src/components/ui/select/index.ts +++ /dev/null @@ -1,11 +0,0 @@ -export { default as Select } from './Select.vue' -export { default as SelectValue } from './SelectValue.vue' -export { default as SelectTrigger } from './SelectTrigger.vue' -export { default as SelectContent } from './SelectContent.vue' -export { default as SelectGroup } from './SelectGroup.vue' -export { default as SelectItem } from './SelectItem.vue' -export { default as SelectItemText } from './SelectItemText.vue' -export { default as SelectLabel } from './SelectLabel.vue' -export { default as SelectSeparator } from './SelectSeparator.vue' -export { default as SelectScrollUpButton } from './SelectScrollUpButton.vue' -export { default as SelectScrollDownButton } from './SelectScrollDownButton.vue' diff --git a/ui/src/components/ui/separator/Separator.vue b/ui/src/components/ui/separator/Separator.vue deleted file mode 100644 index 066618ab..00000000 --- a/ui/src/components/ui/separator/Separator.vue +++ /dev/null @@ -1,38 +0,0 @@ - - - diff --git a/ui/src/components/ui/separator/index.ts b/ui/src/components/ui/separator/index.ts deleted file mode 100644 index 2287bcb9..00000000 --- a/ui/src/components/ui/separator/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { default as Separator } from './Separator.vue' diff --git a/ui/src/components/ui/switch/Switch.vue b/ui/src/components/ui/switch/Switch.vue deleted file mode 100644 index ae4d13ae..00000000 --- a/ui/src/components/ui/switch/Switch.vue +++ /dev/null @@ -1,37 +0,0 @@ - - - diff --git a/ui/src/components/ui/switch/index.ts b/ui/src/components/ui/switch/index.ts deleted file mode 100644 index 87b4b17d..00000000 --- a/ui/src/components/ui/switch/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { default as Switch } from './Switch.vue' diff --git a/ui/src/components/ui/table/Table.vue b/ui/src/components/ui/table/Table.vue deleted file mode 100644 index a4238918..00000000 --- a/ui/src/components/ui/table/Table.vue +++ /dev/null @@ -1,16 +0,0 @@ - - - diff --git a/ui/src/components/ui/table/TableBody.vue b/ui/src/components/ui/table/TableBody.vue deleted file mode 100644 index ab7a937d..00000000 --- a/ui/src/components/ui/table/TableBody.vue +++ /dev/null @@ -1,14 +0,0 @@ - - - diff --git a/ui/src/components/ui/table/TableCaption.vue b/ui/src/components/ui/table/TableCaption.vue deleted file mode 100644 index 3904c563..00000000 --- a/ui/src/components/ui/table/TableCaption.vue +++ /dev/null @@ -1,14 +0,0 @@ - - - diff --git a/ui/src/components/ui/table/TableCell.vue b/ui/src/components/ui/table/TableCell.vue deleted file mode 100644 index 40c1f43e..00000000 --- a/ui/src/components/ui/table/TableCell.vue +++ /dev/null @@ -1,21 +0,0 @@ - - - diff --git a/ui/src/components/ui/table/TableEmpty.vue b/ui/src/components/ui/table/TableEmpty.vue deleted file mode 100644 index 43fe7e0c..00000000 --- a/ui/src/components/ui/table/TableEmpty.vue +++ /dev/null @@ -1,37 +0,0 @@ - - - diff --git a/ui/src/components/ui/table/TableFooter.vue b/ui/src/components/ui/table/TableFooter.vue deleted file mode 100644 index 693a4386..00000000 --- a/ui/src/components/ui/table/TableFooter.vue +++ /dev/null @@ -1,14 +0,0 @@ - - - diff --git a/ui/src/components/ui/table/TableHead.vue b/ui/src/components/ui/table/TableHead.vue deleted file mode 100644 index 11fb1010..00000000 --- a/ui/src/components/ui/table/TableHead.vue +++ /dev/null @@ -1,14 +0,0 @@ - - - diff --git a/ui/src/components/ui/table/TableHeader.vue b/ui/src/components/ui/table/TableHeader.vue deleted file mode 100644 index 220352f6..00000000 --- a/ui/src/components/ui/table/TableHeader.vue +++ /dev/null @@ -1,14 +0,0 @@ - - - diff --git a/ui/src/components/ui/table/TableRow.vue b/ui/src/components/ui/table/TableRow.vue deleted file mode 100644 index 5b9e8749..00000000 --- a/ui/src/components/ui/table/TableRow.vue +++ /dev/null @@ -1,14 +0,0 @@ - - - diff --git a/ui/src/components/ui/table/index.ts b/ui/src/components/ui/table/index.ts deleted file mode 100644 index 6fa181be..00000000 --- a/ui/src/components/ui/table/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -export { default as Table } from './Table.vue' -export { default as TableBody } from './TableBody.vue' -export { default as TableCell } from './TableCell.vue' -export { default as TableHead } from './TableHead.vue' -export { default as TableHeader } from './TableHeader.vue' -export { default as TableFooter } from './TableFooter.vue' -export { default as TableRow } from './TableRow.vue' -export { default as TableCaption } from './TableCaption.vue' -export { default as TableEmpty } from './TableEmpty.vue' diff --git a/ui/src/components/ui/tabs/Tabs.vue b/ui/src/components/ui/tabs/Tabs.vue deleted file mode 100644 index 2fa0971f..00000000 --- a/ui/src/components/ui/tabs/Tabs.vue +++ /dev/null @@ -1,15 +0,0 @@ - - - diff --git a/ui/src/components/ui/tabs/TabsContent.vue b/ui/src/components/ui/tabs/TabsContent.vue deleted file mode 100644 index c0aa0f35..00000000 --- a/ui/src/components/ui/tabs/TabsContent.vue +++ /dev/null @@ -1,22 +0,0 @@ - - - diff --git a/ui/src/components/ui/tabs/TabsList.vue b/ui/src/components/ui/tabs/TabsList.vue deleted file mode 100644 index e98011e9..00000000 --- a/ui/src/components/ui/tabs/TabsList.vue +++ /dev/null @@ -1,25 +0,0 @@ - - - diff --git a/ui/src/components/ui/tabs/TabsTrigger.vue b/ui/src/components/ui/tabs/TabsTrigger.vue deleted file mode 100644 index 7c4cbd33..00000000 --- a/ui/src/components/ui/tabs/TabsTrigger.vue +++ /dev/null @@ -1,29 +0,0 @@ - - - diff --git a/ui/src/components/ui/tabs/index.ts b/ui/src/components/ui/tabs/index.ts deleted file mode 100644 index fbea0c68..00000000 --- a/ui/src/components/ui/tabs/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export { default as Tabs } from './Tabs.vue' -export { default as TabsTrigger } from './TabsTrigger.vue' -export { default as TabsList } from './TabsList.vue' -export { default as TabsContent } from './TabsContent.vue' diff --git a/ui/src/components/ui/textarea/Textarea.vue b/ui/src/components/ui/textarea/Textarea.vue deleted file mode 100644 index e0d07a60..00000000 --- a/ui/src/components/ui/textarea/Textarea.vue +++ /dev/null @@ -1,24 +0,0 @@ - - -