[
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.md",
    "content": "---\nname: Bug report\nabout: Create a report to help us improve\ntitle: ''\nlabels: bug\nassignees: ''\n\n---\n\n** Please make sure you read the contribution guide and file the issues in the right place. **\n[Contribution guide.](https://google.github.io/adk-docs/contributing-guide/)\n\n## 🔴 Required Information\n*Please ensure all items in this section are completed to allow for efficient\ntriaging. If an item is not applicable to you - please mark it as N/A*\n\n**Describe the Bug:**\nA clear and concise description of what the bug is.\n\n**Steps to Reproduce:**\nPlease provide a numbered list of steps to reproduce the behavior:\n1. Install '...'\n2. Run '....'\n3. Open '....'\n4. Provide error or stacktrace\n\n**Expected Behavior:**\nA clear and concise description of what you expected to happen.\n\n**Observed Behavior:**\nWhat actually happened? Include error messages or crash stack traces here.\n\n**Environment Details:**\n\n - ADK Library Version:\n - OS: [e.g., macOS, Linux, Windows]\n - Go Version:\n\n**Model Information:**\n - Which model is being used: (e.g., gemini-2.5-pro)\n\n---\n\n## 🟡 Optional Information\n*Providing this information greatly speeds up the resolution process.*\n\n**Regression:**\nDid this work in a previous version of ADK? (Yes/No) If so, which one?\n\n**Logs:**\nPlease attach relevant logs. Wrap them in code blocks (```) or attach a\ntext file.\n```text\n// Paste logs here\n```\n\n**Screenshots / Video:**\nIf applicable, add screenshots or screen recordings to help explain\nyour problem.\n\n**Additional Context:**\nAdd any other context about the problem here.\n\n**Minimal Reproduction Code:**\nPlease provide a code snippet or a link to a Gist/repo that isolates the issue.\n```go\n// Code snippet here\n```\n\n**How often has this issue occurred?:**\n\n - Always (100%)\n - Often (50%+)\n - Intermittently (<50%)\n - Once / Rare\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.md",
    "content": "---\nname: Feature request\nabout: Suggest an idea for this project\ntitle: ''\nlabels: enhancement\nassignees: ''\n\n---\n\n** Please make sure you read the contribution guide and file the issues in the right place. **\n[Contribution guide.](https://google.github.io/adk-docs/contributing-guide/)\n\n## 🔴 Required Information\n*Please ensure all items in this section are completed to allow for efficient\ntriaging. If an item is not applicable to you - please mark it as N/A*\n\n### Is your feature request related to a specific problem?\nPlease describe the problem you are trying to solve. (Ex: \"I'm always frustrated\nwhen I have to manually handle X...\")\n\n### Proposed Solution\nA clear and concise description of the feature or API change you want.\nBe specific about input/outputs if this involves an API change.\n\n### Impact on your work\nHow does this feature impact your work and what are you trying to achieve?\nIf this is critical for you, tell us if there is a timeline by when you need\nthis feature.\n\n---\n\n## 🟡 Recommended Information\n\n### Alternatives Considered\nA clear and concise description of any alternative solutions or workarounds\nyou've considered.\n\n### Willingness to contribute\nAre you interested in implementing this feature yourself or submitting a PR?\n\n### Proposed API / Implementation\nIf you have ideas on how this should look in code, please share a\npseudo-code example.\n\n### Additional Context\nAdd any other context or screenshots about the feature request.\n"
  },
  {
    "path": ".github/actions/setup/action.yml",
    "content": "name: Setup\ndescription: Setup the environment\n\noutputs:\n  go-version:\n    description: 'Go version'\n    value: ${{ steps.setup-go.outputs.go-version }}\n\nruns:\n  using: 'composite'\n  steps:\n    - name: Set up Go\n      id: setup-go\n      uses: actions/setup-go@d35c59abb061a4a6fb18e82ac0862c26744d6ab5 # v5.5.0\n      with:\n        go-version-file: 'go.mod'\n        cache: false # wrapper for actions/cache that doesn't support all functionality\n\n    - name: Load Go cache\n      uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3\n      with:\n        path: |\n          ~/.cache/go-build\n          ~/go/pkg/mod\n        key: ${{ runner.os }}-go-build-${{ hashFiles('**/go.mod', '**/go.sum') }}\n        restore-keys: ${{ runner.os }}-go-build-\n"
  },
  {
    "path": ".github/pull_request_template.md",
    "content": "**Please ensure you have read the [contribution guide](./CONTRIBUTING.md) before creating a pull request.**\n\n### Link to Issue or Description of Change\n\n**1. Link to an existing issue (if applicable):**\n\n- Closes: #_issue_number_\n- Related: #_issue_number_\n\n**2. Or, if no issue exists, describe the change:**\n\n_If applicable, please follow the issue templates to provide as much detail as\npossible._\n\n**Problem:**\n_A clear and concise description of what the problem is._\n\n**Solution:**\n_A clear and concise description of what you want to happen and why you choose\nthis solution._\n\n### Testing Plan\n\n_Please describe the tests that you ran to verify your changes. This is required\nfor all PRs that are not small documentation or typo fixes._\n\n**Unit Tests:**\n\n- [ ] I have added or updated unit tests for my change.\n- [ ] All unit tests pass locally.\n\n_Please include a summary of passed go test results._\n\n**Manual End-to-End (E2E) Tests:**\n\n_Please provide instructions on how to manually test your changes, including any\nnecessary setup or configuration. Please provide logs or screenshots to help\nreviewers better understand the fix._\n\n### Checklist\n\n- [ ] I have read the [CONTRIBUTING.md](./CONTRIBUTING.md) document.\n- [ ] I have performed a self-review of my own code.\n- [ ] I have commented my code, particularly in hard-to-understand areas.\n- [ ] I have added tests that prove my fix is effective or that my feature works.\n- [ ] New and existing unit tests pass locally with my changes.\n- [ ] I have manually tested my changes end-to-end.\n- [ ] Any dependent changes have been merged and published in downstream modules.\n\n### Additional context\n\n_Add any other context or screenshots about the feature request here._\n\n"
  },
  {
    "path": ".github/workflows/go.yml",
    "content": "# This workflow will build a golang project\n# For more information see: \n# - https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-go\n# - https://golangci-lint.run/usage/configuration/\n\nname: Go\n\non:\n  push:\n    branches: [ \"main\" ]\n\n  pull_request:\n    branches: [ \"main\" ]\n\n  workflow_dispatch:\n\nconcurrency:\n  group: ${{ github.workflow }}-${{ github.head_ref || github.ref }}\n  cancel-in-progress: true\n\njobs:\n  test:\n    runs-on: ubuntu-latest\n    steps:\n    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd  # v6.0.2\n    \n    - name: Setup\n      uses: ./.github/actions/setup\n\n    - name: Tidy\n      run: go mod tidy -diff\n      \n    - name: Build\n      run: go build -mod=readonly -v ./...\n\n    - name: Test\n      run: go test -race -mod=readonly -v -count=1 -shuffle=on ./...\n  \n  lint:\n    runs-on: ubuntu-latest\n    steps:\n    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd  # v6.0.2\n    \n    - name: Setup\n      uses: ./.github/actions/setup\n    \n    - name: Lint\n      uses: golangci/golangci-lint-action@1e7e51e771db61008b38414a730f564565cf7c20  # v9.2.0\n      with:\n        install-mode: goinstall\n        version: 5256574b81bcedfbcae9099f745f6aee9335da10 # v2.3.1\n"
  },
  {
    "path": ".github/workflows/nightly.yml",
    "content": "name: Nightly\n\non:\n  schedule:\n    - cron: '0 2 * * *'  # 2 AM UTC daily\n\n  workflow_dispatch:\n\njobs:\n  test:\n    runs-on: ubuntu-latest\n    steps:\n    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd  # v6.0.2\n    \n    - name: Setup\n      uses: ./.github/actions/setup\n\n    - name: Nightly Test\n      run: go test -race -mod=readonly -v -count=1 -shuffle=on ./...\n\n  vulncheck:\n    runs-on: ubuntu-latest\n    steps:\n    - name: Run govulncheck\n      uses: golang/govulncheck-action@b625fbe08f3bccbe446d94fbf87fcc875a4f50ee # v1.0.4\n      with:\n           go-version-file: go.mod\n           repo-checkout: true"
  },
  {
    "path": ".gitignore",
    "content": "# .gitignore is restricted to the artifacts produced by go build and test.\n# for personal setup you can use personal .gitignore: `git config --global core.excludesfile ~/.gitignore`\n\n# Binaries for programs and plugins\n*.exe\n*.exe~\n*.dll\n*.so\n*.dylib\n\n# Test binary, built with `go test -c`\n*.test\n\n# Code coverage profiles and other test artifacts\n*.out\ncoverage.*\n*.coverprofile\nprofile.cov\n\n# Go workspace file\ngo.work\ngo.work.sum\n"
  },
  {
    "path": ".golangci.yml",
    "content": "version: \"2\"\n\nformatters:\n  enable:\n    - goimports\n    - gofumpt\n\n  settings:\n    goimports:\n      local-prefixes:\n        - google.golang.org/adk\n    gofumpt:\n      extra-rules: true\n      module-path: google.golang.org/adk\n\nlinters:\n  enable:\n    - goheader\n  \n  settings:\n    \n    goheader:\n      values:\n        const:\n          COMPANY: Google LLC\n        regexp:\n          YEAR: 20\\d\\d\n      template: |-\n        Copyright {{ YEAR }} {{ COMPANY }}\n        \n        Licensed under the Apache License, Version 2.0 (the \"License\");\n        you may not use this file except in compliance with the License.\n        You may obtain a copy of the License at\n        \n            http://www.apache.org/licenses/LICENSE-2.0\n        \n        Unless required by applicable law or agreed to in writing, software\n        distributed under the License is distributed on an \"AS IS\" BASIS,\n        WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n        See the License for the specific language governing permissions and\n        limitations under the License.\n    \n    staticcheck:\n      checks:\n        # The default config:\n        - all\n        - -ST1000\n        - -ST1003\n        - -ST1016 \n        - -ST1020\n        - -ST1021\n        - -ST1022\n        # Changes to the default config:\n        - -QF1001 # Exclude \"Apply De Morgan's law\"\n        - -QF1008 # Exclude \"Omit embedded fields from selector expression\"\n  \n  exclusions:\n    rules:\n      - path: 'internal/httprr/.*'\n        linters:\n          - goheader\n          - errcheck\n          - staticcheck\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "# How to contribute\n\nWe'd love to accept your patches and contributions to this project.\n\n-   [How to contribute](#how-to-contribute)\n-   [Before you begin](#before-you-begin)\n    -   [Sign our Contributor License Agreement](#sign-our-contributor-license-agreement)\n    -   [Review our community guidelines](#review-our-community-guidelines)\n    -   [Code reviews](#code-reviews)\n-   [Contribution workflow](#contribution-workflow)\n    -   [Finding Issues to Work On](#finding-issues-to-work-on)\n    -   [Requirement for PRs](#requirement-for-prs)\n    -   [Large or Complex Changes](#large-or-complex-changes)\n    -   [Testing Requirements](#testing-requirements)\n    -   [Unit Tests](#unit-tests)\n    -   [Manual End-to-End (E2E) Tests](#manual-end-to-end-e2e-tests)\n    -   [Documentation](#documentation)\n    -   [Alignment with adk-python](#alignment-with-adk-python)\n\n## Before you begin\n\n### Sign our Contributor License Agreement\n\nAll submissions to this project need to follow Google’s [Contributor\nLicense Agreement (CLA)](https://cla.developers.google.com/about), which\ncovers any original work of authorship included in the submission. This\ndoesn't prohibit the use of coding assistance tools, including tool-,\nAI-, or machine-generated code, as long as these submissions abide by the\nCLA's requirements.\n\nYou (or your employer) retain the copyright to your contribution; this simply\ngives us permission to use and redistribute your contributions as part of the\nproject.\n\nIf you or your current employer have already signed the Google CLA (even if it\nwas for a different project), you probably don't need to do it again.\n\nVisit <https://cla.developers.google.com/> to see your current agreements or to\nsign a new one.\n\n### Review our community guidelines\n\nThis project follows\n[Google's Open Source Community Guidelines](https://opensource.google/conduct/).\n\n### Code reviews\n\nAll submissions, including submissions by project members, require review. We\nuse GitHub pull requests for this purpose. Consult\n[GitHub Help](https://help.github.com/articles/about-pull-requests/) for more\ninformation on using pull requests.\n\n## Contribution workflow\n\n### Finding Issues to Work On\n\n-   Browse issues labeled **`good first issue`** (newcomer-friendly) or **`help\n    wanted`** (general contributions).\n-   For other issues, please kindly ask before contributing to avoid\n    duplication.\n\n### Requirement for PRs\n\n-   Code must follow [Google Go Style Guide](https://google.github.io/styleguide/go/index).\n-   All PRs, other than small documentation or typo fixes, should have an Issue\n    associated. If a relevant issue doesn't exist, please create one first or\n    you may instead describe the bug or feature directly within the PR\n    description, following the structure of our issue templates.\n-   Small, focused PRs. Keep changes minimal—one concern per PR.\n-   For bug fixes or features, please provide logs or screenshots after the fix\n    is applied to help reviewers better understand the fix.\n-   Please include a `testing plan` section in your PR to talk about how you\n    will test. This will save time for PR review. See `Testing Requirements`\n    section for more details.\n\n### Large or Complex Changes\n\nFor substantial features or architectural revisions:\n\n-   Open an Issue First: Outline your proposal, including design considerations\n    and impact.\n-   Gather Feedback: Discuss with maintainers and the community to ensure\n    alignment and avoid duplicate work.\n\n### Testing Requirements\n\nTo maintain code quality and prevent regressions, all code changes must include\ncomprehensive tests and verifiable end-to-end (E2E) evidence.\n\n#### Unit Tests\n\nPlease add or update unit tests for your change.\n\nRequirements for unit tests:\n\n-   Cover new features, edge cases, error conditions, and typical\n    use cases.\n-   Fast and isolated.\n-   Written clearly with descriptive names.\n-   Free of external dependencies (use mocks or fixtures as needed).\n-   Aim for high readability and maintainability; include comments for complex\n    scenarios.\n\n#### Manual End-to-End (E2E) Tests\n\nManual E2E tests ensure integrated flows work as intended. Your tests should\ncover all scenarios. Sometimes, it's also good to ensure relevant functionality\nis not impacted.\n\nDepending on your change:\n\n-   **ADK Web:**\n\n    -   Capture and attach relevant screenshots demonstrating the UI/UX changes\n        or outputs.\n    -   Label screenshots clearly in your PR description.\n\n-   **Runner:**\n\n    -   Provide testing setup. For example, the agent definition, and the\n        runner setup.\n    -   Include the command used and console output showing test results.\n    -   Highlight sections of the log that directly relate to your change.\n\n# ADK Web\n\n## Updating ADK web version to latest\n\n-   Run `./scripts/adk-web/update-adk-web.sh` to update the web UI to the latest version from [GitHub](https://github.com/google/adk-web).\n-   Run `docker run -it adk-web-builder:latest sh -c \"<COMMAND>\"` to start the container and debug the build, e.g.:\n    -   `docker run -it adk-web-builder:latest sh -c \"ls -alh dist/agent_framework_web/browser\"` to view the built files.\n    -   `docker run -it adk-web-builder:latest sh -c \"npm run build\"` to debug the build output.\n\n### Documentation\n\nFor any changes that impact user-facing documentation (guides, API reference,\ntutorials), please open a PR in the\n[adk-docs](https://github.com/google/adk-docs) repository to update the relevant\nparts before or alongside your code PR.\n\n### Alignment with adk-python\nWe lean on [adk-python](https://github.com/google/adk-python) for being the source of truth and one should refer to adk-python for validation.\n"
  },
  {
    "path": "LICENSE",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright 2025 Google LLC\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "README.md",
    "content": "# Agent Development Kit (ADK) for Go\n\n[![License](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](LICENSE)\n[![Go Doc](https://img.shields.io/badge/Go%20Package-Doc-blue.svg)](https://pkg.go.dev/google.golang.org/adk)\n[![Nightly Check](https://github.com/google/adk-go/actions/workflows/nightly.yml/badge.svg)](https://github.com/google/adk-go/actions/workflows/nightly.yml)\n[![r/agentdevelopmentkit](https://img.shields.io/badge/Reddit-r%2Fagentdevelopmentkit-FF4500?style=flat&logo=reddit&logoColor=white)](https://www.reddit.com/r/agentdevelopmentkit/)\n[![View Code Wiki](https://www.gstatic.com/_/boq-sdlc-agents-ui/_/r/YUi5dj2UWvE.svg)](https://codewiki.google/github.com/google/adk-go)\n\n<html>\n    <h2 align=\"center\">\n      <img src=\"https://raw.githubusercontent.com/google/adk-python/main/assets/agent-development-kit.png\" width=\"256\"/>\n    </h2>\n    <h3 align=\"center\">\n      An open-source, code-first Go toolkit for building, evaluating, and deploying sophisticated AI agents with flexibility and control.\n    </h3>\n    <h3 align=\"center\">\n      Important Links:\n      <a href=\"https://google.github.io/adk-docs/\">Docs</a> &\n      <a href=\"https://github.com/google/adk-go/tree/main/examples\">Samples</a> &\n      <a href=\"https://github.com/google/adk-python\">Python ADK</a> &\n      <a href=\"https://github.com/google/adk-java\">Java ADK</a> & \n      <a href=\"https://github.com/google/adk-web\">ADK Web</a>.\n    </h3>\n</html>\n\nAgent Development Kit (ADK) is a flexible and modular framework that applies software development principles to AI agent creation. It is designed to simplify building, deploying, and orchestrating agent workflows, from simple tasks to complex systems. While optimized for Gemini, ADK is model-agnostic, deployment-agnostic, and compatible with other frameworks.\n\nThis Go version of ADK is ideal for developers building cloud-native agent applications, leveraging Go's strengths in concurrency and performance.\n\n---\n\n## ✨ Key Features\n\n*   **Idiomatic Go:** Designed to feel natural and leverage the power of Go.\n*   **Rich Tool Ecosystem:** Utilize pre-built tools, custom functions, or integrate existing tools to give agents diverse capabilities.\n*   **Code-First Development:** Define agent logic, tools, and orchestration directly in Go for ultimate flexibility, testability, and versioning.\n*   **Modular Multi-Agent Systems:** Design scalable applications by composing multiple specialized agents.\n*   **Deploy Anywhere:** Easily containerize and deploy agents, with strong support for cloud-native environments like Google Cloud Run.\n\n## 🚀 Installation\n\nTo add ADK Go to your project, run:\n\n```bash\ngo get google.golang.org/adk\n```\n\n## 📄 License\n\nThis project is licensed under the Apache 2.0 License - see the\n[LICENSE](LICENSE) file for details.\n\nThe exception is internal/httprr - see its [LICENSE file](internal/httprr/LICENSE).\n"
  },
  {
    "path": "agent/agent.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage agent\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"iter\"\n\n\t\"go.opentelemetry.io/otel/trace\"\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/artifact\"\n\tagentinternal \"google.golang.org/adk/internal/agent\"\n\t\"google.golang.org/adk/internal/plugininternal/plugincontext\"\n\t\"google.golang.org/adk/internal/telemetry\"\n\t\"google.golang.org/adk/memory\"\n\t\"google.golang.org/adk/model\"\n\t\"google.golang.org/adk/session\"\n)\n\n// Agent is the base interface which all agents must implement.\n//\n// Agents are created with ADK constructors to ensure correct\n// init & configuration.\n// The constructors are available in this package and its subpackages.\n// For example: llmagent.New, workflow agents, remote agent or\n// agent.New.\n// NOTE: in future releases we will allow just implementing this interface.\n// For now agent.New is a correct solution to create custom agents.\ntype Agent interface {\n\tName() string\n\tDescription() string\n\tRun(InvocationContext) iter.Seq2[*session.Event, error]\n\tSubAgents() []Agent\n\n\tinternal() *agent\n}\n\n// New creates an Agent with a custom logic defined by Run function.\nfunc New(cfg Config) (Agent, error) {\n\tsubAgentSet := make(map[Agent]bool)\n\tfor _, subAgent := range cfg.SubAgents {\n\t\tif _, ok := subAgentSet[subAgent]; ok {\n\t\t\treturn nil, fmt.Errorf(\"error creating agent: subagent %q appears multiple times in subAgents\", subAgent.Name())\n\t\t}\n\t\tsubAgentSet[subAgent] = true\n\t}\n\treturn &agent{\n\t\tname:                 cfg.Name,\n\t\tdescription:          cfg.Description,\n\t\tsubAgents:            cfg.SubAgents,\n\t\tbeforeAgentCallbacks: cfg.BeforeAgentCallbacks,\n\t\trun:                  cfg.Run,\n\t\tafterAgentCallbacks:  cfg.AfterAgentCallbacks,\n\t\tState: agentinternal.State{\n\t\t\tAgentType: agentinternal.TypeCustomAgent,\n\t\t},\n\t}, nil\n}\n\n// Config is the configuration for creating a new Agent.\ntype Config struct {\n\t// Name must be a non-empty string, unique within the agent tree.\n\t// Agent name cannot be \"user\", since it's reserved for end-user's input.\n\tName string\n\t// Description of the agent's capability.\n\t//\n\t// LLM uses this to determine whether to delegate control to the agent.\n\t// One-line description is enough and preferred.\n\tDescription string\n\t// SubAgents are the child agents that this agent can delegate tasks to.\n\t// ADK will automatically set a parent of each sub-agent to this agent to\n\t// allow agent transferring across the tree.\n\tSubAgents []Agent\n\n\t// BeforeAgentCallbacks is a list of callbacks that are called sequentially\n\t// before the agent starts its run.\n\t//\n\t// If any callback returns non-nil content or error, then the agent run and\n\t// the remaining callbacks will be skipped, and a new event will be created\n\t// from the content or error of that callback.\n\tBeforeAgentCallbacks []BeforeAgentCallback\n\t// Run is the function that defines the agent's behavior.\n\tRun func(InvocationContext) iter.Seq2[*session.Event, error]\n\t// AfterAgentCallbacks is a list of callbacks that are called sequentially\n\t// after the agent has completed its run.\n\t//\n\t// If any callback returns non-nil content or error, then a new event will be\n\t// created from the content or error of that callback and the remaining\n\t// callbacks will be skipped.\n\tAfterAgentCallbacks []AfterAgentCallback\n}\n\n// Artifacts interface provides methods to work with artifacts of the current\n// session.\ntype Artifacts interface {\n\tSave(ctx context.Context, name string, data *genai.Part) (*artifact.SaveResponse, error)\n\tList(context.Context) (*artifact.ListResponse, error)\n\tLoad(ctx context.Context, name string) (*artifact.LoadResponse, error)\n\tLoadVersion(ctx context.Context, name string, version int) (*artifact.LoadResponse, error)\n}\n\n// Memory interface provides methods to access agent memory across the\n// sessions of the current user_id.\ntype Memory interface {\n\tAddSessionToMemory(context.Context, session.Session) error\n\tSearchMemory(ctx context.Context, query string) (*memory.SearchResponse, error)\n}\n\n// BeforeAgentCallback is a function that is called before the agent starts\n// its run.\n// If it returns non-nil content or error, the agent run will be skipped and a\n// new event will be created.\ntype BeforeAgentCallback func(CallbackContext) (*genai.Content, error)\n\n// AfterAgentCallback is a function that is called after the agent has completed\n// its run.\n// If it returns non-nil content or error, a new event will be created.\n//\n// The callback will be skipped also if EndInvocation was called before or\n// BeforeAgentCallbacks returned non-nil results.\ntype AfterAgentCallback func(CallbackContext) (*genai.Content, error)\n\ntype agent struct {\n\tagentinternal.State\n\n\tname, description string\n\tsubAgents         []Agent\n\n\tbeforeAgentCallbacks []BeforeAgentCallback\n\trun                  func(InvocationContext) iter.Seq2[*session.Event, error]\n\tafterAgentCallbacks  []AfterAgentCallback\n}\n\nfunc (a *agent) Name() string {\n\treturn a.name\n}\n\nfunc (a *agent) Description() string {\n\treturn a.description\n}\n\nfunc (a *agent) SubAgents() []Agent {\n\treturn a.subAgents\n}\n\nfunc (a *agent) Run(ctx InvocationContext) iter.Seq2[*session.Event, error] {\n\treturn func(yield func(*session.Event, error) bool) {\n\t\tspanCtx, span := telemetry.StartInvokeAgentSpan(ctx, a, ctx.Session().ID(), ctx.InvocationID())\n\t\tyield, endSpan := telemetry.WrapYield(span, yield, func(span trace.Span, event *session.Event, err error) {\n\t\t\ttelemetry.TraceAgentResult(span, telemetry.TraceAgentResultParams{\n\t\t\t\tResponseEvent: event,\n\t\t\t\tError:         err,\n\t\t\t})\n\t\t})\n\t\tdefer endSpan()\n\t\t// TODO: verify&update the setup here. Should we branch etc.\n\t\tctx := &invocationContext{\n\t\t\tContext:   ctx.WithContext(spanCtx),\n\t\t\tagent:     a,\n\t\t\tartifacts: ctx.Artifacts(),\n\t\t\tmemory:    ctx.Memory(),\n\t\t\tsession:   ctx.Session(),\n\n\t\t\tinvocationID:  ctx.InvocationID(),\n\t\t\tbranch:        ctx.Branch(),\n\t\t\tuserContent:   ctx.UserContent(),\n\t\t\trunConfig:     ctx.RunConfig(),\n\t\t\tendInvocation: ctx.Ended(),\n\t\t}\n\t\tevent, err := runBeforeAgentCallbacks(ctx)\n\t\tif event != nil || err != nil {\n\t\t\tif !yield(event, err) {\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\n\t\tif ctx.Ended() {\n\t\t\treturn\n\t\t}\n\n\t\tfor event, err := range a.run(ctx) {\n\t\t\tif event != nil && event.Author == \"\" {\n\t\t\t\tevent.Author = getAuthorForEvent(ctx, event)\n\t\t\t}\n\t\t\tif !yield(event, err) {\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\n\t\tif ctx.Ended() {\n\t\t\treturn\n\t\t}\n\n\t\tevent, err = runAfterAgentCallbacks(ctx)\n\t\tif event != nil || err != nil {\n\t\t\tyield(event, err)\n\t\t}\n\t}\n}\n\nfunc (a *agent) internal() *agent {\n\treturn a\n}\n\nfunc getAuthorForEvent(ctx InvocationContext, event *session.Event) string {\n\tif event.LLMResponse.Content != nil && event.LLMResponse.Content.Role == genai.RoleUser {\n\t\treturn genai.RoleUser\n\t}\n\n\treturn ctx.Agent().Name()\n}\n\n// runBeforeAgentCallbacks checks if any beforeAgentCallback returns non-nil content\n// then it skips agent run and returns callback result.\nfunc runBeforeAgentCallbacks(ctx InvocationContext) (*session.Event, error) {\n\tagent := ctx.Agent()\n\tpluginManager := pluginManagerFromContext(ctx)\n\n\tcallbackCtx := &callbackContext{\n\t\tContext:           ctx,\n\t\tinvocationContext: ctx,\n\t\tactions:           &session.EventActions{StateDelta: make(map[string]any), ArtifactDelta: make(map[string]int64)},\n\t}\n\n\tif pluginManager != nil {\n\t\tcontent, err := pluginManager.RunBeforeAgentCallback(callbackCtx)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"failed to run plugin before agent callback: %w\", err)\n\t\t}\n\t\tif content != nil {\n\t\t\tevent := session.NewEvent(ctx.InvocationID())\n\t\t\tevent.LLMResponse = model.LLMResponse{\n\t\t\t\tContent: content,\n\t\t\t}\n\t\t\tevent.Author = agent.Name()\n\t\t\tevent.Branch = ctx.Branch()\n\t\t\tevent.Actions = *callbackCtx.actions\n\t\t\tctx.EndInvocation()\n\t\t\treturn event, nil\n\t\t}\n\t}\n\n\tfor _, callback := range ctx.Agent().internal().beforeAgentCallbacks {\n\t\tcontent, err := callback(callbackCtx)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"failed to run before agent callback: %w\", err)\n\t\t}\n\t\tif content == nil {\n\t\t\tcontinue\n\t\t}\n\n\t\tevent := session.NewEvent(ctx.InvocationID())\n\t\tevent.LLMResponse = model.LLMResponse{\n\t\t\tContent: content,\n\t\t}\n\t\tevent.Author = agent.Name()\n\t\tevent.Branch = ctx.Branch()\n\t\tevent.Actions = *callbackCtx.actions\n\t\tctx.EndInvocation()\n\t\treturn event, nil\n\t}\n\n\t// check if has delta create event with it\n\tif len(callbackCtx.actions.StateDelta) > 0 {\n\t\tevent := session.NewEvent(ctx.InvocationID())\n\t\tevent.Author = agent.Name()\n\t\tevent.Branch = ctx.Branch()\n\t\tevent.Actions = *callbackCtx.actions\n\t\treturn event, nil\n\t}\n\n\treturn nil, nil\n}\n\n// runAfterAgentCallbacks checks if any afterAgentCallback returns non-nil content or a state modification\n// then it create a new event with the new content and state delta.\nfunc runAfterAgentCallbacks(ctx InvocationContext) (*session.Event, error) {\n\tagent := ctx.Agent()\n\tpluginManager := pluginManagerFromContext(ctx)\n\n\tcallbackCtx := &callbackContext{\n\t\tContext:           ctx,\n\t\tinvocationContext: ctx,\n\t\tactions:           &session.EventActions{StateDelta: make(map[string]any), ArtifactDelta: make(map[string]int64)},\n\t}\n\n\tif pluginManager != nil {\n\t\tcontent, err := pluginManager.RunAfterAgentCallback(callbackCtx)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"failed to run plugin after agent callback: %w\", err)\n\t\t}\n\t\tif content != nil {\n\t\t\tevent := session.NewEvent(ctx.InvocationID())\n\t\t\tevent.LLMResponse = model.LLMResponse{\n\t\t\t\tContent: content,\n\t\t\t}\n\t\t\tevent.Author = agent.Name()\n\t\t\tevent.Branch = ctx.Branch()\n\t\t\tevent.Actions = *callbackCtx.actions\n\t\t\treturn event, nil\n\t\t}\n\t}\n\n\tfor _, callback := range agent.internal().afterAgentCallbacks {\n\t\tnewContent, err := callback(callbackCtx)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"failed to run after agent callback: %w\", err)\n\t\t}\n\t\tif newContent == nil {\n\t\t\tcontinue\n\t\t}\n\n\t\tevent := session.NewEvent(ctx.InvocationID())\n\t\tevent.LLMResponse = model.LLMResponse{\n\t\t\tContent: newContent,\n\t\t}\n\t\tevent.Author = agent.Name()\n\t\tevent.Branch = ctx.Branch()\n\t\tevent.Actions = *callbackCtx.actions\n\t\t// TODO set context invocation ended\n\t\t// ctx.invocationEnded = true\n\t\treturn event, nil\n\t}\n\n\t// check if has delta create event with it\n\tif len(callbackCtx.actions.StateDelta) > 0 {\n\t\tevent := session.NewEvent(ctx.InvocationID())\n\t\tevent.Author = agent.Name()\n\t\tevent.Branch = ctx.Branch()\n\t\tevent.Actions = *callbackCtx.actions\n\t\treturn event, nil\n\t}\n\treturn nil, nil\n}\n\n// TODO: unify with internal/context.callbackContext\n\ntype callbackContext struct {\n\tcontext.Context\n\tinvocationContext InvocationContext\n\tactions           *session.EventActions\n}\n\nfunc (c *callbackContext) AgentName() string {\n\treturn c.invocationContext.Agent().Name()\n}\n\nfunc (c *callbackContext) ReadonlyState() session.ReadonlyState {\n\treturn c.invocationContext.Session().State()\n}\n\nfunc (c *callbackContext) State() session.State {\n\treturn &callbackContextState{ctx: c}\n}\n\nfunc (c *callbackContext) Artifacts() Artifacts {\n\treturn c.invocationContext.Artifacts()\n}\n\nfunc (c *callbackContext) InvocationID() string {\n\treturn c.invocationContext.InvocationID()\n}\n\nfunc (c *callbackContext) UserContent() *genai.Content {\n\treturn c.invocationContext.UserContent()\n}\n\n// AppName implements CallbackContext.\nfunc (c *callbackContext) AppName() string {\n\treturn c.invocationContext.Session().AppName()\n}\n\n// Branch implements CallbackContext.\nfunc (c *callbackContext) Branch() string {\n\treturn c.invocationContext.Branch()\n}\n\n// SessionID implements CallbackContext.\nfunc (c *callbackContext) SessionID() string {\n\treturn c.invocationContext.Session().ID()\n}\n\n// UserID implements CallbackContext.\nfunc (c *callbackContext) UserID() string {\n\treturn c.invocationContext.Session().UserID()\n}\n\nvar _ CallbackContext = (*callbackContext)(nil)\n\ntype callbackContextState struct {\n\tctx *callbackContext\n}\n\nfunc (c *callbackContextState) Get(key string) (any, error) {\n\tif c.ctx.actions != nil && c.ctx.actions.StateDelta != nil {\n\t\tif val, ok := c.ctx.actions.StateDelta[key]; ok {\n\t\t\treturn val, nil\n\t\t}\n\t}\n\treturn c.ctx.invocationContext.Session().State().Get(key)\n}\n\nfunc (c *callbackContextState) Set(key string, val any) error {\n\tif c.ctx.actions != nil && c.ctx.actions.StateDelta != nil {\n\t\tc.ctx.actions.StateDelta[key] = val\n\t}\n\treturn c.ctx.invocationContext.Session().State().Set(key, val)\n}\n\nfunc (c *callbackContextState) All() iter.Seq2[string, any] {\n\treturn c.ctx.invocationContext.Session().State().All()\n}\n\ntype invocationContext struct {\n\tcontext.Context\n\n\tagent     Agent\n\tartifacts Artifacts\n\tmemory    Memory\n\tsession   session.Session\n\n\tinvocationID  string\n\tbranch        string\n\tuserContent   *genai.Content\n\trunConfig     *RunConfig\n\tendInvocation bool\n}\n\nfunc (c *invocationContext) Agent() Agent {\n\treturn c.agent\n}\n\nfunc (c *invocationContext) Artifacts() Artifacts {\n\treturn c.artifacts\n}\n\nfunc (c *invocationContext) Memory() Memory {\n\treturn c.memory\n}\n\nfunc (c *invocationContext) Session() session.Session {\n\treturn c.session\n}\n\nfunc (c *invocationContext) InvocationID() string {\n\treturn c.invocationID\n}\n\nfunc (c *invocationContext) Branch() string {\n\treturn c.branch\n}\n\nfunc (c *invocationContext) UserContent() *genai.Content {\n\treturn c.userContent\n}\n\nfunc (c *invocationContext) RunConfig() *RunConfig {\n\treturn c.runConfig\n}\n\nfunc (c *invocationContext) EndInvocation() {\n\tc.endInvocation = true\n}\n\nfunc (c *invocationContext) Ended() bool {\n\treturn c.endInvocation\n}\n\nfunc (c *invocationContext) WithContext(ctx context.Context) InvocationContext {\n\tnewCtx := *c\n\tnewCtx.Context = ctx\n\treturn &newCtx\n}\n\nfunc pluginManagerFromContext(ctx context.Context) pluginManager {\n\ta := ctx.Value(plugincontext.PluginManagerCtxKey)\n\tm, ok := a.(pluginManager)\n\tif !ok {\n\t\treturn nil\n\t}\n\treturn m\n}\n\ntype pluginManager interface {\n\tRunBeforeAgentCallback(cctx CallbackContext) (*genai.Content, error)\n\tRunAfterAgentCallback(cctx CallbackContext) (*genai.Content, error)\n}\n\nvar _ InvocationContext = (*invocationContext)(nil)\n"
  },
  {
    "path": "agent/agent_test.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage agent\n\nimport (\n\t\"context\"\n\t\"iter\"\n\t\"testing\"\n\n\t\"github.com/google/go-cmp/cmp\"\n\t\"github.com/google/go-cmp/cmp/cmpopts\"\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/model\"\n\t\"google.golang.org/adk/session\"\n)\n\nfunc TestAgentCallbacks(t *testing.T) {\n\tt.Parallel()\n\n\ttests := []struct {\n\t\tname         string\n\t\tbeforeAgent  []BeforeAgentCallback\n\t\tafterAgent   []AfterAgentCallback\n\t\twantLLMCalls int\n\t\twantEvents   []*session.Event\n\t}{\n\t\t{\n\t\t\tname: \"before agent callback runs, no llm calls\",\n\t\t\tbeforeAgent: []BeforeAgentCallback{\n\t\t\t\tfunc(ctx CallbackContext) (*genai.Content, error) {\n\t\t\t\t\treturn genai.NewContentFromText(\"hello from before_agent_callback\", genai.RoleModel), nil\n\t\t\t\t},\n\t\t\t},\n\t\t\twantEvents: []*session.Event{\n\t\t\t\t{\n\t\t\t\t\tAuthor: \"test\",\n\t\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\t\tContent: genai.NewContentFromText(\"hello from before_agent_callback\", genai.RoleModel),\n\t\t\t\t\t},\n\t\t\t\t\tActions: session.EventActions{\n\t\t\t\t\t\tStateDelta:    map[string]any{},\n\t\t\t\t\t\tArtifactDelta: map[string]int64{},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"no callback effect if callbacks return nil\",\n\t\t\tbeforeAgent: []BeforeAgentCallback{\n\t\t\t\tfunc(ctx CallbackContext) (*genai.Content, error) {\n\t\t\t\t\treturn nil, nil\n\t\t\t\t},\n\t\t\t},\n\t\t\tafterAgent: []AfterAgentCallback{\n\t\t\t\tfunc(CallbackContext) (*genai.Content, error) {\n\t\t\t\t\treturn nil, nil\n\t\t\t\t},\n\t\t\t},\n\t\t\twantLLMCalls: 1,\n\t\t\twantEvents: []*session.Event{\n\t\t\t\t{\n\t\t\t\t\tAuthor: \"test\",\n\t\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\t\tContent: genai.NewContentFromText(\"hello\", genai.RoleModel),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"after agent callback create a new event with new content\",\n\t\t\tafterAgent: []AfterAgentCallback{\n\t\t\t\tfunc(CallbackContext) (*genai.Content, error) {\n\t\t\t\t\treturn genai.NewContentFromText(\"hello from after_agent_callback\", genai.RoleModel), nil\n\t\t\t\t},\n\t\t\t},\n\t\t\twantLLMCalls: 1,\n\t\t\twantEvents: []*session.Event{\n\t\t\t\t{\n\t\t\t\t\tAuthor: \"test\",\n\t\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\t\tContent: genai.NewContentFromText(\"hello\", genai.RoleModel),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tAuthor: \"test\",\n\t\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\t\tContent: genai.NewContentFromText(\"hello from after_agent_callback\", genai.RoleModel),\n\t\t\t\t\t},\n\t\t\t\t\tActions: session.EventActions{\n\t\t\t\t\t\tStateDelta:    map[string]any{},\n\t\t\t\t\t\tArtifactDelta: map[string]int64{},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tcustom := &customAgent{}\n\n\t\t\ttestAgent, err := New(Config{\n\t\t\t\tName:                 \"test\",\n\t\t\t\tBeforeAgentCallbacks: tt.beforeAgent,\n\t\t\t\tRun:                  custom.Run,\n\t\t\t\tAfterAgentCallbacks:  tt.afterAgent,\n\t\t\t})\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"failed to create agent: %v\", err)\n\t\t\t}\n\n\t\t\tctx := &invocationContext{\n\t\t\t\tContext: t.Context(),\n\t\t\t\tagent:   testAgent,\n\t\t\t\tsession: &mockSession{sessionID: \"test-session\"},\n\t\t\t}\n\t\t\tvar gotEvents []*session.Event\n\t\t\tfor event, err := range testAgent.Run(ctx) {\n\t\t\t\tif err != nil {\n\t\t\t\t\tt.Fatalf(\"unexpected error from the agent: %v\", err)\n\t\t\t\t}\n\n\t\t\t\tgotEvents = append(gotEvents, event)\n\t\t\t}\n\n\t\t\tif tt.wantLLMCalls != custom.callCounter {\n\t\t\t\tt.Errorf(\"unexpected want_llm_calls, got: %v, want: %v\", custom.callCounter, tt.wantLLMCalls)\n\t\t\t}\n\n\t\t\tif len(tt.wantEvents) != len(gotEvents) {\n\t\t\t\tt.Errorf(\"unexpected event lengths, got: %v, want: %v\", len(gotEvents), len(tt.wantEvents))\n\t\t\t}\n\n\t\t\tfor i, gotEvent := range gotEvents {\n\t\t\t\tif diff := cmp.Diff(tt.wantEvents[i], gotEvent, cmpopts.IgnoreFields(session.Event{}, \"ID\", \"Timestamp\", \"InvocationID\")); diff != \"\" {\n\t\t\t\t\tt.Errorf(\"diff in the events: got event[%d]: %v, want: %v, diff: %v\", i, gotEvent, tt.wantEvents[i], diff)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestEndInvocation_EndsBeforeMainCall(t *testing.T) {\n\tcustom := &customAgent{}\n\n\ttestAgent, err := New(Config{\n\t\tName: \"test\",\n\t\tBeforeAgentCallbacks: []BeforeAgentCallback{\n\t\t\tfunc(ctx CallbackContext) (*genai.Content, error) {\n\t\t\t\treturn nil, nil\n\t\t\t},\n\t\t},\n\t\tRun: custom.Run,\n\t})\n\tif err != nil {\n\t\tt.Fatalf(\"failed to create agent: %v\", err)\n\t}\n\n\tctx := &invocationContext{\n\t\tContext:       t.Context(),\n\t\tagent:         testAgent,\n\t\tendInvocation: true,\n\t\tsession:       &mockSession{sessionID: \"test-session\"},\n\t}\n\tfor _, err := range testAgent.Run(ctx) {\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"unexpected error from the agent: %v\", err)\n\t\t}\n\t}\n\n\t// Even though beforeAgentCallback returns nil, it stil doesn't call llm because\n\t// endInvocation is true.\n\tif custom.callCounter != 0 {\n\t\tt.Errorf(\"unexpected want_llm_calls, got: %v, want: %v\", custom.callCounter, 0)\n\t}\n}\n\nfunc TestEndInvocation_EndsAfterMainCall(t *testing.T) {\n\tcustom := &customAgent{endInvocation: true}\n\n\ttestAgent, err := New(Config{\n\t\tName: \"test\",\n\t\tAfterAgentCallbacks: []AfterAgentCallback{\n\t\t\tfunc(CallbackContext) (*genai.Content, error) {\n\t\t\t\treturn genai.NewContentFromText(\"hello from after_agent_callback\", genai.RoleModel), nil\n\t\t\t},\n\t\t},\n\t\tRun: custom.Run,\n\t})\n\tif err != nil {\n\t\tt.Fatalf(\"failed to create agent: %v\", err)\n\t}\n\n\tctx := &invocationContext{\n\t\tContext: t.Context(),\n\t\tagent:   testAgent,\n\t\tsession: &mockSession{sessionID: \"test-session\"},\n\t}\n\tvar gotEvents []*session.Event\n\tfor event, err := range testAgent.Run(ctx) {\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"unexpected error from the agent: %v\", err)\n\t\t}\n\t\tgotEvents = append(gotEvents, event)\n\t}\n\n\tif custom.callCounter != 1 {\n\t\tt.Errorf(\"unexpected want_llm_calls, got: %v, want: %v\", custom.callCounter, 0)\n\t}\n\t// Even though AfterAgentCallbacks is present, it's not returned because EndInvocation is set to true\n\twantEvent := &session.Event{\n\t\tAuthor: \"test\",\n\t\tLLMResponse: model.LLMResponse{\n\t\t\tContent: genai.NewContentFromText(\"hello\", genai.RoleModel),\n\t\t},\n\t}\n\tif len(gotEvents) != 1 {\n\t\tt.Errorf(\"unexpected number of events, got: %v, want: %v\", len(gotEvents), 1)\n\t}\n\tif diff := cmp.Diff(wantEvent, gotEvents[0], cmpopts.IgnoreFields(session.Event{}, \"ID\", \"Timestamp\", \"InvocationID\"),\n\t\tcmpopts.IgnoreFields(session.EventActions{}, \"StateDelta\")); diff != \"\" {\n\t\tt.Errorf(\"unexpected event, got: %v, want: %v, diff: %v\", gotEvents[0], wantEvent, diff)\n\t}\n}\n\n// TODO: create test util allowing to create custom agents, agent trees for test etc.\ntype customAgent struct {\n\tcallCounter   int\n\tendInvocation bool\n}\n\nfunc (a *customAgent) Run(ctx InvocationContext) iter.Seq2[*session.Event, error] {\n\treturn func(yield func(*session.Event, error) bool) {\n\t\ta.callCounter++\n\n\t\tif a.endInvocation {\n\t\t\tctx.EndInvocation()\n\t\t}\n\n\t\tyield(&session.Event{\n\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\tContent: genai.NewContentFromText(\"hello\", genai.RoleModel),\n\t\t\t},\n\t\t}, nil)\n\t}\n}\n\ntype testKey struct{}\n\nfunc TestWithContext(t *testing.T) {\n\tbaseCtx := t.Context()\n\tinv := &invocationContext{\n\t\tContext:      baseCtx,\n\t\tinvocationID: \"test\",\n\t\tbranch:       \"branch\",\n\t}\n\n\tkey := testKey{}\n\tval := \"val\"\n\tgot := inv.WithContext(context.WithValue(baseCtx, key, val))\n\n\tif got.Value(key) != val {\n\t\tt.Errorf(\"WithContext() did not update context\")\n\t}\n\tif diff := cmp.Diff(inv, got, cmp.AllowUnexported(invocationContext{}), cmpopts.IgnoreFields(invocationContext{}, \"Context\")); diff != \"\" {\n\t\tt.Errorf(\"WithContext() params mismatch (-want +got):\\n%s\", diff)\n\t}\n}\n\ntype mockSession struct {\n\tsession.Session\n\tsessionID string\n}\n\nfunc (m *mockSession) ID() string { return m.sessionID }\n"
  },
  {
    "path": "agent/context.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage agent\n\nimport (\n\t\"context\"\n\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/session\"\n)\n\n/*\nInvocationContext represents the context of an agent invocation.\n\nAn invocation:\n 1. Starts with a user message and ends with a final response.\n 2. Can contain one or multiple agent calls.\n 3. Is handled by runner.Run().\n\nAn invocation runs an agent until it does not request to transfer to another\nagent.\n\nAn agent call:\n 1. Is handled by agent.Run().\n 2. Ends when agent.Run() ends.\n\nAn agent call can contain one or multiple steps.\nFor example, LLM agent runs steps in a loop until:\n 1. A final response is generated.\n 2. The agent transfers to another agent.\n 3. EndInvocation() was called by the invocation context.\n\nA step:\n 1. Calls the LLM only once and yields its response.\n 2. Calls the tools and yields their responses if requested.\n\nThe summarization of the function response is considered another step, since\nit is another LLM call.\nA step ends when it's done calling LLM and tools, or if the EndInvocation() was\ncalled by invocation context at any time.\n\n\t┌─────────────────────── invocation ──────────────────────────┐\n\t┌──────────── llm_agent_call_1 ────────────┐ ┌─ agent_call_2 ─┐\n\t┌──── step_1 ────────┐ ┌───── step_2 ──────┐\n\t[call_llm] [call_tool] [call_llm] [transfer]\n*/\ntype InvocationContext interface {\n\tcontext.Context\n\n\t// Agent of this invocation context.\n\tAgent() Agent\n\n\t// Artifacts of the current session.\n\tArtifacts() Artifacts\n\n\t// Memory is scoped to sessions of the current user_id.\n\tMemory() Memory\n\n\t// Session of the current invocation context.\n\tSession() session.Session\n\n\tInvocationID() string\n\n\t// Branch of the invocation context.\n\t// The format is like agent_1.agent_2.agent_3, where agent_1 is the parent\n\t// of agent_2, and agent_2 is the parent of agent_3.\n\t//\n\t// Branch is used when multiple sub-agents shouldn't see their peer agents'\n\t// conversation history.\n\t//\n\t// Applicable to parallel agent because its sub-agents run concurrently.\n\tBranch() string\n\n\t// UserContent that started this invocation.\n\tUserContent() *genai.Content\n\n\t// RunConfig stores the runtime configuration used during this invocation.\n\tRunConfig() *RunConfig\n\n\t// EndInvocation ends the current invocation. This stops any planned agent\n\t// calls.\n\tEndInvocation()\n\t// Ended returns whether the invocation has ended.\n\tEnded() bool\n\n\t// WithContext returns a new instance of the context with overridden embedded context.\n\t// NOTE: This is a temporary solution and will be removed later. The proper solution\n\t// we plan is to stop embedding go context in adk context types and split it.\n\tWithContext(ctx context.Context) InvocationContext\n}\n\n// ReadonlyContext provides read-only access to invocation context data.\ntype ReadonlyContext interface {\n\tcontext.Context\n\n\t// UserContent that started this invocation.\n\tUserContent() *genai.Content\n\tInvocationID() string\n\tAgentName() string\n\tReadonlyState() session.ReadonlyState\n\n\tUserID() string\n\tAppName() string\n\tSessionID() string\n\t// Branch of the current invocation.\n\tBranch() string\n}\n\n// CallbackContext is passed to user callbacks during agent execution.\ntype CallbackContext interface {\n\tReadonlyContext\n\n\tArtifacts() Artifacts\n\tState() session.State\n}\n"
  },
  {
    "path": "agent/doc.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Package agent provides entities to build agents using ADK.\npackage agent\n"
  },
  {
    "path": "agent/llmagent/doc.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Package llmagent provides an LLM-based agent.\n// LLM agents use large language models to perform tasks based on instructions, user input,\n// deciding on actions to take, and executing actions using available tools or\n// delegating to sub agents.\npackage llmagent\n"
  },
  {
    "path": "agent/llmagent/llmagent.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage llmagent\n\nimport (\n\t\"fmt\"\n\t\"iter\"\n\t\"strings\"\n\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/agent\"\n\tagentinternal \"google.golang.org/adk/internal/agent\"\n\ticontext \"google.golang.org/adk/internal/context\"\n\t\"google.golang.org/adk/internal/llminternal\"\n\t\"google.golang.org/adk/model\"\n\t\"google.golang.org/adk/session\"\n\t\"google.golang.org/adk/tool\"\n)\n\n// New is a constructor for LLMAgent.\nfunc New(cfg Config) (agent.Agent, error) {\n\tbeforeModelCallbacks := make([]llminternal.BeforeModelCallback, 0, len(cfg.BeforeModelCallbacks))\n\tfor _, c := range cfg.BeforeModelCallbacks {\n\t\tbeforeModelCallbacks = append(beforeModelCallbacks, llminternal.BeforeModelCallback(c))\n\t}\n\n\tafterModelCallbacks := make([]llminternal.AfterModelCallback, 0, len(cfg.AfterModelCallbacks))\n\tfor _, c := range cfg.AfterModelCallbacks {\n\t\tafterModelCallbacks = append(afterModelCallbacks, llminternal.AfterModelCallback(c))\n\t}\n\n\tonModelErrorCallbacks := make([]llminternal.OnModelErrorCallback, 0, len(cfg.OnModelErrorCallbacks))\n\tfor _, c := range cfg.OnModelErrorCallbacks {\n\t\tonModelErrorCallbacks = append(onModelErrorCallbacks, llminternal.OnModelErrorCallback(c))\n\t}\n\n\tbeforeToolCallbacks := make([]llminternal.BeforeToolCallback, 0, len(cfg.BeforeToolCallbacks))\n\tfor _, c := range cfg.BeforeToolCallbacks {\n\t\tbeforeToolCallbacks = append(beforeToolCallbacks, llminternal.BeforeToolCallback(c))\n\t}\n\n\tafterToolCallbacks := make([]llminternal.AfterToolCallback, 0, len(cfg.AfterToolCallbacks))\n\tfor _, c := range cfg.AfterToolCallbacks {\n\t\tafterToolCallbacks = append(afterToolCallbacks, llminternal.AfterToolCallback(c))\n\t}\n\n\tonToolErrorCallback := make([]llminternal.OnToolErrorCallback, 0, len(cfg.OnToolErrorCallbacks))\n\tfor _, c := range cfg.OnToolErrorCallbacks {\n\t\tonToolErrorCallback = append(onToolErrorCallback, llminternal.OnToolErrorCallback(c))\n\t}\n\n\ta := &llmAgent{\n\t\tmodel:                 cfg.Model,\n\t\tbeforeModelCallbacks:  beforeModelCallbacks,\n\t\tafterModelCallbacks:   afterModelCallbacks,\n\t\tonModelErrorCallbacks: onModelErrorCallbacks,\n\t\tbeforeToolCallbacks:   beforeToolCallbacks,\n\t\tafterToolCallbacks:    afterToolCallbacks,\n\t\tonToolErrorCallbacks:  onToolErrorCallback,\n\t\tinstruction:           cfg.Instruction,\n\t\tinputSchema:           cfg.InputSchema,\n\t\toutputSchema:          cfg.OutputSchema,\n\n\t\tState: llminternal.State{\n\t\t\tModel:                    cfg.Model,\n\t\t\tGenerateContentConfig:    cfg.GenerateContentConfig,\n\t\t\tTools:                    cfg.Tools,\n\t\t\tToolsets:                 cfg.Toolsets,\n\t\t\tDisallowTransferToParent: cfg.DisallowTransferToParent,\n\t\t\tDisallowTransferToPeers:  cfg.DisallowTransferToPeers,\n\t\t\tInputSchema:              cfg.InputSchema,\n\t\t\tOutputSchema:             cfg.OutputSchema,\n\t\t\t// TODO: internal type for includeContents\n\t\t\tIncludeContents:           string(cfg.IncludeContents),\n\t\t\tInstruction:               cfg.Instruction,\n\t\t\tInstructionProvider:       llminternal.InstructionProvider(cfg.InstructionProvider),\n\t\t\tGlobalInstruction:         cfg.GlobalInstruction,\n\t\t\tGlobalInstructionProvider: llminternal.InstructionProvider(cfg.GlobalInstructionProvider),\n\t\t\tOutputKey:                 cfg.OutputKey,\n\t\t},\n\t}\n\n\tbaseAgent, err := agent.New(agent.Config{\n\t\tName:                 cfg.Name,\n\t\tDescription:          cfg.Description,\n\t\tSubAgents:            cfg.SubAgents,\n\t\tBeforeAgentCallbacks: cfg.BeforeAgentCallbacks,\n\t\tRun:                  a.run,\n\t\tAfterAgentCallbacks:  cfg.AfterAgentCallbacks,\n\t})\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to create agent: %w\", err)\n\t}\n\n\t// TODO: remove this in favor of the state reveal below.\n\ta.Agent = baseAgent\n\ta.AgentType = agentinternal.TypeLLMAgent\n\ta.Config = cfg\n\n\t// TODO: temporary hack to set the LLMAgent type field correctly. Currently, beforeAgentCallback for LLMAgent only\n\t// sees basic *agent.agent type: http://google3/third_party/golang/adk/agent/agent.go;l=177-201;rcl=869633263\n\t// So in BeforeAgentCallback, we cannot access llmAgent.State fields.\n\t// We should remote llminternal.State in favor of agentinternal.State.\n\n\tinternalAgent, ok := baseAgent.(agentinternal.Agent)\n\tif !ok {\n\t\treturn nil, fmt.Errorf(\"internal error: failed to convert to internal agent\")\n\t}\n\tstate := agentinternal.Reveal(internalAgent)\n\tstate.AgentType = agentinternal.TypeLLMAgent\n\tstate.Config = cfg\n\n\treturn a, nil\n}\n\n// Config of the LLMAgent.\ntype Config struct {\n\t// Name must be a non-empty string, unique within the agent tree.\n\t// Agent name cannot be \"user\", since it's reserved for end-user's input.\n\tName string\n\t// Description of the agent's capability.\n\t//\n\t// LLM uses this to determine whether to delegate control to the agent.\n\t// One-line description is enough and preferred.\n\tDescription string\n\t// SubAgents are the child agents that this agent can delegate tasks to.\n\t// ADK will automatically set a parent of each sub-agent to this agent to\n\t// allow agent transferring across the tree.\n\tSubAgents []agent.Agent\n\n\t// BeforeAgentCallbacks is a list of callbacks that are called sequentially\n\t// before the agent starts its run.\n\t//\n\t// If any callback returns non-nil content or error, then the agent run and\n\t// the remaining callbacks will be skipped, and a new event will be created\n\t// from the content or error of that callback.\n\tBeforeAgentCallbacks []agent.BeforeAgentCallback\n\t// AfterAgentCallbacks is a list of callbacks that are called sequentially\n\t// after the agent has completed its run.\n\t//\n\t// If any callback returns non-nil content or error, then a new event will be\n\t// created from the content or error of that callback and the remaining\n\t// callbacks will be skipped.\n\tAfterAgentCallbacks []agent.AfterAgentCallback\n\n\t// GenerateContentConfig is for the additional content generation\n\t// configuration.\n\t//\n\t// NOTE: not all fields are usable, e.g. tools must be configured via\n\t// `tools`.\n\t//\n\t// For example: use this config to adjust model temperature, configure\n\t// safety settings, etc.\n\tGenerateContentConfig *genai.GenerateContentConfig\n\n\t// BeforeModelCallbacks will be called in the order they are provided until\n\t// there's a callback that returns a non-nil LLMResponse or error. Then\n\t// actual LLM call is skipped, and the returned response/error is used.\n\t//\n\t// This provides an opportunity to inspect, log, or modify the `LLMRequest`\n\t// object. It can also be used to implement caching by returning a cached\n\t// `LLMResponse`, which would skip the actual model call.\n\tBeforeModelCallbacks []BeforeModelCallback\n\t// Model that is used by the agent.\n\tModel model.LLM\n\t// AfterModelCallbacks will be called in the order they are provided until\n\t// there's a callback that returns a non-nil LLMResponse or error. Then\n\t// actual LLM response is replaced with the returned response/error.\n\t//\n\t// This is the ideal place to log model responses, collect metrics on token\n\t// usage, or perform post-processing on the raw `LLMResponse`.\n\tAfterModelCallbacks []AfterModelCallback\n\n\tOnModelErrorCallbacks []OnModelErrorCallback\n\n\t// Instruction is set for the LLM model guiding the agent's behavior.\n\t//\n\t// The string is treated as a template:\n\t//  - There can be placeholders like {key_name} that will be resolved by ADK\n\t//    at runtime using session state and context.\n\t//  - key_name must match \"^[a-zA-Z_][a-zA-Z0-9_]*$\", otherwise it will be\n\t//    treated as a literal.\n\t//  - {artifact.key_name} can be used to insert the text content of the\n\t//    artifact named key_name.\n\t//\n\t// If the state variable or artifact does not exist, the agent will raise an\n\t// error. If you want to ignore the error, you can append a ? to the\n\t// variable name as in {var?} to make it optional.\n\t//\n\t// If templating logic for {} chars is not desired, then InstructionProvider\n\t// should be used.\n\tInstruction string\n\t// InstructionProvider allows to create instructions dynamically based on\n\t// the agent context.\n\t//\n\t// It takes over the Instruction field if both are set.\n\t//\n\t// InstructionProvider does not automatically substitute values to {} and\n\t// treats them as just a raw char.\n\t// If you need to inject session state variables, use\n\t// util/instructionutil.InjectSessionState helper.\n\tInstructionProvider InstructionProvider\n\n\t// GlobalInstruction is the instruction for all agents in the entire\n\t// agent tree.\n\t//\n\t// The string is treated as a template:\n\t//  - There can be placeholders like {key_name} that will be resolved by ADK\n\t//    at runtime using session state and context.\n\t//  - key_name must match \"^[a-zA-Z_][a-zA-Z0-9_]*$\", otherwise it will be\n\t//    treated as a literal.\n\t//  - {artifact.key_name} can be used to insert the text content of the\n\t//    artifact named key_name.\n\t//\n\t// If the state variable or artifact does not exist, the agent will raise an\n\t// error. If you want to ignore the error, you can append a ? to the\n\t// variable name as in {var?} to make it optional.\n\t//\n\t// ONLY the GlobalInstruction in the root agent will take effect.\n\t//\n\t// For example: GlobalInstruction can make all agents have a stable identity\n\t// or personality.\n\tGlobalInstruction string\n\t// GlobalInstructionProvider allows to create global instructions\n\t// dynamically based on the agent context.\n\t//\n\t// It takes over the GlobalInstruction field if both are set.\n\tGlobalInstructionProvider InstructionProvider\n\n\t// DisallowTransferToParent prevents transferring to parent agent if LLM\n\t// decides to.\n\tDisallowTransferToParent bool\n\t// DisallowTransferToPeers prevents transferring to peer agents.\n\tDisallowTransferToPeers bool\n\n\t// Whether to include contents (conversation history) in the model request.\n\tIncludeContents IncludeContents\n\n\t// TODO(ngeorgy): consider to switch to jsonschema for input and output schema.\n\t// The input schema when agent is used as a tool.\n\tInputSchema *genai.Schema\n\t// The output schema when agent replies.\n\t//\n\t// NOTE: when this is set, agent can only reply and cannot use any tools,\n\t// such as function tools, RAGs, agent transfer, etc.\n\tOutputSchema *genai.Schema\n\n\t// Callbacks are executed in the order they are provided.\n\t// If a callback returns result/error, then the execution of the callback\n\t// list stops AND the actual tool call is skipped.\n\tBeforeToolCallbacks []BeforeToolCallback\n\t// Tools available to the agent.\n\tTools []tool.Tool\n\t// Callbacks are executed in the order they are provided.\n\t// If a callback returns result/error, then the execution of the callback\n\t// list stops and this result/error is returned instead.\n\tAfterToolCallbacks []AfterToolCallback\n\t// Toolsets will be used by llmagent to extract tools and pass to the\n\t// underlying LLM.\n\tToolsets []tool.Toolset\n\n\tOnToolErrorCallbacks []OnToolErrorCallback\n\n\t// OutputKey is an optional parameter to specify the key in session state for the agent output.\n\t//\n\t// Typical uses cases are:\n\t// - Extracts agent reply for later use, such as in tools, callbacks, etc.\n\t// - Connects agents to coordinate with each other.\n\tOutputKey string\n}\n\n// BeforeModelCallback that is called before sending a request to the model.\n//\n// If it returns non-nil LLMResponse or error, the actual model call is skipped\n// and the returned response/error is used.\ntype BeforeModelCallback func(ctx agent.CallbackContext, llmRequest *model.LLMRequest) (*model.LLMResponse, error)\n\n// AfterModelCallback that is called after receiving a response from the model.\n//\n// If it returns non-nil LLMResponse or error, the actual model response/error\n// is replaced with the returned response/error.\ntype AfterModelCallback func(ctx agent.CallbackContext, llmResponse *model.LLMResponse, llmResponseError error) (*model.LLMResponse, error)\n\n// OnModelErrorCallback that is called when receiving an error response from the llm model.\n//\n// If it returns non-nil LLMResponse or error, the actual model response/error\n// is replaced with the returned response/error.\ntype OnModelErrorCallback func(ctx agent.CallbackContext, llmRequest *model.LLMRequest, llmResponseError error) (*model.LLMResponse, error)\n\n// BeforeToolCallback is executed before a tool's Run method.\n//\n// Callbacks are executed in the order they are provided.\n// If a callback returns a non-nil result or an error:\n// - execution of remaining callbacks stops\n// - the actual tool call is skipped\n// - the returned result is used as the tool result\n//\n// To modify tool arguments and still run the tool,\n// update args in place and return (nil, nil).\ntype BeforeToolCallback func(ctx tool.Context, tool tool.Tool, args map[string]any) (map[string]any, error)\n\n// AfterToolCallback is a function type executed after a tool's Run method has completed,\n// regardless of whether the tool returned a result or an error.\n//\n// Callbacks are executed in the order they are provided.\n// If a callback returns a non-nil result or an error:\n//   - execution of remaining callbacks stops\n//   - the returned result and/or error is used as the final tool output\ntype AfterToolCallback func(ctx tool.Context, tool tool.Tool, args, result map[string]any, err error) (map[string]any, error)\n\n// OnToolErrorCallback that is called when receiving an error response from tool execution.\n//\n// If it returns non-nil LLMResponse or error, the actual model response/error\n// is replaced with the returned response/error.\ntype OnToolErrorCallback func(ctx tool.Context, tool tool.Tool, args map[string]any, err error) (map[string]any, error)\n\n// IncludeContents controls what parts of prior conversation history is received by llmagent.\ntype IncludeContents string\n\nconst (\n\t// IncludeContentsNone makes the llmagent operate solely on its current turn (latest user input + any following agent events).\n\tIncludeContentsNone IncludeContents = \"none\"\n\t// IncludeContentsDefault is enabled by default. The llmagent receives the relevant conversation history.\n\tIncludeContentsDefault IncludeContents = \"default\"\n)\n\ntype llmAgent struct {\n\tagent.Agent\n\tllminternal.State\n\tagentState\n\n\tbeforeModelCallbacks  []llminternal.BeforeModelCallback\n\tmodel                 model.LLM\n\tafterModelCallbacks   []llminternal.AfterModelCallback\n\tinstruction           string\n\tonModelErrorCallbacks []llminternal.OnModelErrorCallback\n\n\tbeforeToolCallbacks  []llminternal.BeforeToolCallback\n\tafterToolCallbacks   []llminternal.AfterToolCallback\n\tonToolErrorCallbacks []llminternal.OnToolErrorCallback\n\n\tinputSchema  *genai.Schema\n\toutputSchema *genai.Schema\n}\n\ntype agentState = agentinternal.State\n\nfunc (a *llmAgent) run(ctx agent.InvocationContext) iter.Seq2[*session.Event, error] {\n\t// TODO: branch context?\n\tctx = icontext.NewInvocationContext(ctx, icontext.InvocationContextParams{\n\t\tArtifacts:    ctx.Artifacts(),\n\t\tMemory:       ctx.Memory(),\n\t\tSession:      ctx.Session(),\n\t\tBranch:       ctx.Branch(),\n\t\tAgent:        a,\n\t\tUserContent:  ctx.UserContent(),\n\t\tRunConfig:    ctx.RunConfig(),\n\t\tInvocationID: ctx.InvocationID(),\n\t})\n\n\tf := &llminternal.Flow{\n\t\tModel:                 a.model,\n\t\tRequestProcessors:     llminternal.DefaultRequestProcessors,\n\t\tResponseProcessors:    llminternal.DefaultResponseProcessors,\n\t\tBeforeModelCallbacks:  a.beforeModelCallbacks,\n\t\tAfterModelCallbacks:   a.afterModelCallbacks,\n\t\tOnModelErrorCallbacks: a.onModelErrorCallbacks,\n\t\tBeforeToolCallbacks:   a.beforeToolCallbacks,\n\t\tAfterToolCallbacks:    a.afterToolCallbacks,\n\t\tOnToolErrorCallbacks:  a.onToolErrorCallbacks,\n\t}\n\n\treturn func(yield func(*session.Event, error) bool) {\n\t\tfor ev, err := range f.Run(ctx) {\n\t\t\ta.maybeSaveOutputToState(ev)\n\t\t\tif !yield(ev, err) {\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t}\n}\n\n// maybeSaveOutputToState saves the model output to state if needed. skip if the event\n// was authored by some other agent (e.g. current agent transferred to another agent)\nfunc (a *llmAgent) maybeSaveOutputToState(event *session.Event) {\n\tif event == nil {\n\t\treturn\n\t}\n\tif event.Author != a.Name() {\n\t\t// TODO: log \"Skipping output save for agent %s: event authored by %s\"\n\t\treturn\n\t}\n\tif a.OutputKey != \"\" && !event.Partial && event.Content != nil && len(event.Content.Parts) > 0 {\n\t\tvar sb strings.Builder\n\t\tfor _, part := range event.Content.Parts {\n\t\t\tif part.Text != \"\" && !part.Thought {\n\t\t\t\tsb.WriteString(part.Text)\n\t\t\t}\n\t\t}\n\t\tresult := sb.String()\n\n\t\t// TODO: add output schema validation and unmarshalling\n\t\tif a.OutputSchema != nil {\n\t\t\t// If the result from the final chunk is just whitespace or empty,\n\t\t\t// it means this is an empty final chunk of a stream.\n\t\t\t// Do not attempt to parse it as JSON.\n\t\t\tif strings.TrimSpace(result) == \"\" {\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\n\t\tif event.Actions.StateDelta == nil {\n\t\t\tevent.Actions.StateDelta = make(map[string]any)\n\t\t}\n\n\t\tevent.Actions.StateDelta[a.OutputKey] = result\n\t}\n}\n\n// InstructionProvider allows to create instructions dynamically. It is called\n// on each agent invocation.\n//\n// NOTE: when InstructionProvider is used, ADK will NOT inject session state\n// placeholders into the instruction. You can use\n// util/instructionutil.InjectSessionState() helper if this functionality is needed.\ntype InstructionProvider func(ctx agent.ReadonlyContext) (string, error)\n"
  },
  {
    "path": "agent/llmagent/llmagent_saveoutput_test.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage llmagent\n\nimport (\n\t\"reflect\"\n\t\"testing\"\n\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/model\"\n\t\"google.golang.org/adk/session\"\n)\n\ntype MockOutputSchema struct {\n\tMessage    string  `json:\"message\"`\n\tConfidence float64 `json:\"confidence\"`\n}\n\n// createTestEvent is a helper to build events for tests.\nfunc createTestEvent(author, contentText string, isFinal bool) *session.Event {\n\tvar parts []*genai.Part\n\tif contentText != \"\" {\n\t\tparts = append(parts, &genai.Part{Text: contentText})\n\t}\n\n\tvar content *genai.Content\n\tif len(parts) > 0 {\n\t\tcontent = &genai.Content{Role: \"model\", Parts: parts}\n\t}\n\n\treturn &session.Event{\n\t\tInvocationID: \"test_invocation\",\n\t\tAuthor:       author,\n\t\tLLMResponse:  model.LLMResponse{Content: content, Partial: !isFinal},\n\t\tActions:      session.EventActions{StateDelta: make(map[string]any)},\n\t}\n}\n\nfunc TestLlmAgent_MaybeSaveOutputToState(t *testing.T) {\n\t// Define the structure for our test cases\n\ttestCases := []struct {\n\t\tname             string\n\t\tagentConfig      Config\n\t\tevent            *session.Event\n\t\twantStateDelta   map[string]any\n\t\tcustomEventParts []*genai.Part // For multi-part test\n\t}{\n\t\t{\n\t\t\tname:           \"skips when event author differs from agentConfig name\",\n\t\t\tagentConfig:    Config{Name: \"agent_a\", OutputKey: \"result\"},\n\t\t\tevent:          createTestEvent(\"agent_b\", \"Response from B\", true),\n\t\t\twantStateDelta: map[string]any{},\n\t\t},\n\t\t{\n\t\t\tname:           \"saves when event author matches agentConfig name\",\n\t\t\tagentConfig:    Config{Name: \"test_agent\", OutputKey: \"result\"},\n\t\t\tevent:          createTestEvent(\"test_agent\", \"Test response\", true),\n\t\t\twantStateDelta: map[string]any{\"result\": \"Test response\"},\n\t\t},\n\t\t{\n\t\t\tname:           \"skips when output_key is not set\",\n\t\t\tagentConfig:    Config{Name: \"test_agent\"}, // No OutputKey\n\t\t\tevent:          createTestEvent(\"test_agent\", \"Test response\", true),\n\t\t\twantStateDelta: map[string]any{},\n\t\t},\n\t\t{\n\t\t\tname:           \"skips for non-final responses\",\n\t\t\tagentConfig:    Config{Name: \"test_agent\", OutputKey: \"result\"},\n\t\t\tevent:          createTestEvent(\"test_agent\", \"*genai.Partial response\", false),\n\t\t\twantStateDelta: map[string]any{},\n\t\t},\n\t\t{\n\t\t\tname:           \"skips when event has no content text\",\n\t\t\tagentConfig:    Config{Name: \"test_agent\", OutputKey: \"result\"},\n\t\t\tevent:          createTestEvent(\"test_agent\", \"\", true),\n\t\t\twantStateDelta: map[string]any{},\n\t\t},\n\t\t{\n\t\t\tname:        \"concatenates multiple text parts\",\n\t\t\tagentConfig: Config{Name: \"test_agent\", OutputKey: \"result\"},\n\t\t\tevent:       createTestEvent(\"test_agent\", \"\", true), // Base event\n\t\t\tcustomEventParts: []*genai.Part{\n\t\t\t\t{Text: \"Hello \"},\n\t\t\t\t{Text: \"world\"},\n\t\t\t\t{Text: \"!\"},\n\t\t\t},\n\t\t\twantStateDelta: map[string]any{\"result\": \"Hello world!\"},\n\t\t},\n\t\t{\n\t\t\tname:           \"skips on case-sensitive name mismatch\",\n\t\t\tagentConfig:    Config{Name: \"TestAgent\", OutputKey: \"result\"},\n\t\t\tevent:          createTestEvent(\"testagent\", \"Test response\", true),\n\t\t\twantStateDelta: map[string]any{},\n\t\t},\n\t\t// TODO tests with OutputSchema\n\t}\n\n\t// Iterate over the test cases\n\tfor _, tc := range testCases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t// --- Setup for specific cases ---\n\t\t\tif tc.customEventParts != nil {\n\t\t\t\ttc.event.Content = &genai.Content{Role: \"model\", Parts: tc.customEventParts}\n\t\t\t}\n\n\t\t\t// --- Execution ---\n\t\t\t// The method modifies the event in-place, just like the Python version.\n\t\t\tcreatedAgent, err := New(tc.agentConfig)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"failed to create agent: %v\", err)\n\t\t\t}\n\t\t\tcreatedLlmAgent, ok := createdAgent.(*llmAgent)\n\t\t\tif !ok {\n\t\t\t\tt.Fatalf(\"failed to convert to llmagent\")\n\t\t\t}\n\t\t\tcreatedLlmAgent.maybeSaveOutputToState(tc.event)\n\n\t\t\t// --- Assertion ---\n\t\t\tgotStateDelta := tc.event.Actions.StateDelta\n\t\t\tif !reflect.DeepEqual(gotStateDelta, tc.wantStateDelta) {\n\t\t\t\tt.Errorf(\"stateDelta mismatch:\\ngot = %v\\nwant = %v\", gotStateDelta, tc.wantStateDelta)\n\t\t\t}\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "agent/llmagent/llmagent_test.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage llmagent_test\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"iter\"\n\t\"net/http\"\n\t\"path/filepath\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/google/go-cmp/cmp\"\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/agent\"\n\t\"google.golang.org/adk/agent/llmagent\"\n\t\"google.golang.org/adk/internal/testutil\"\n\t\"google.golang.org/adk/model\"\n\t\"google.golang.org/adk/model/gemini\"\n\t\"google.golang.org/adk/session\"\n\t\"google.golang.org/adk/tool\"\n\t\"google.golang.org/adk/tool/functiontool\"\n)\n\nconst modelName = \"gemini-2.5-flash\"\n\n//go:generate go test -httprecord=Test\n\nfunc TestLLMAgent(t *testing.T) {\n\terrNoNetwork := errors.New(\"no network\")\n\n\tfor _, tc := range []struct {\n\t\tname      string\n\t\ttransport http.RoundTripper\n\t\twantErr   error\n\t}{\n\t\t{\n\t\t\tname:      \"healthy_backend\",\n\t\t\ttransport: nil, // httprr + http.DefaultTransport\n\t\t},\n\t\t{\n\t\t\tname:      \"broken_backend\",\n\t\t\ttransport: roundTripperFunc(func(*http.Request) (*http.Response, error) { return nil, errNoNetwork }),\n\t\t\twantErr:   errNoNetwork,\n\t\t},\n\t} {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\tmodel := newGeminiModel(t, modelName, tc.transport)\n\t\t\ta, err := llmagent.New(llmagent.Config{\n\t\t\t\tName:                     \"hello_world_agent\",\n\t\t\t\tDescription:              \"hello world agent\",\n\t\t\t\tModel:                    model,\n\t\t\t\tInstruction:              \"Roll the dice and report only the result.\",\n\t\t\t\tGlobalInstruction:        \"Answer as precisely as possible.\",\n\t\t\t\tDisallowTransferToParent: true,\n\t\t\t\tDisallowTransferToPeers:  true,\n\t\t\t})\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"NewLLMAgent failed: %v\", err)\n\t\t\t}\n\t\t\t// TODO: set tools, planner.\n\t\t\trunner := testutil.NewTestAgentRunner(t, a)\n\t\t\tstream := runner.Run(t, \"test_session\", \"\")\n\t\t\ttexts, err := testutil.CollectTextParts(stream)\n\t\t\tif tc.wantErr != nil && !errors.Is(err, tc.wantErr) {\n\t\t\t\tt.Fatalf(\"stream = (%q, %v), want (_, %v)\", texts, err, tc.wantErr)\n\t\t\t}\n\t\t\tif tc.wantErr == nil && (err != nil || len(texts) != 1) {\n\t\t\t\tt.Fatalf(\"stream = (%q, %v), want exactly one text response\", texts, err)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestLLMAgentStreamingModeSSE(t *testing.T) {\n\tmodel := newGeminiModel(t, \"gemini-2.5-flash\", nil)\n\ta, err := llmagent.New(llmagent.Config{\n\t\tName:                     \"calculator\",\n\t\tDescription:              \"calculating agent\",\n\t\tModel:                    model,\n\t\tInstruction:              \"Think deep. Always double check the answer before making the conclusion.\",\n\t\tDisallowTransferToParent: true,\n\t\tDisallowTransferToPeers:  true,\n\t\tGenerateContentConfig: &genai.GenerateContentConfig{\n\t\t\tThinkingConfig: &genai.ThinkingConfig{\n\t\t\t\tIncludeThoughts: true, // can trigger multiple message.\n\t\t\t},\n\t\t},\n\t})\n\tif err != nil {\n\t\tt.Fatalf(\"NewLLMAgent failed: %v\", err)\n\t}\n\ttestRunner := testutil.NewTestAgentRunner(t, a)\n\tstream := testRunner.RunContentWithConfig(t, \"test_session\", genai.NewContentFromText(\"What is the sum of the first 50 prime numbers?\", \"user\"), agent.RunConfig{StreamingMode: agent.StreamingModeSSE})\n\tevents, err := testutil.CollectEvents(stream)\n\tgotThought := false\n\tnumContents := 0\n\tfor _, e := range events {\n\t\tt.Logf(\"event: %v\", e)\n\t\tif e.LLMResponse.Content == nil {\n\t\t\tcontinue\n\t\t}\n\t\tnumContents++\n\t\tfor _, p := range e.LLMResponse.Content.Parts {\n\t\t\tif p.Thought {\n\t\t\t\tgotThought = true\n\t\t\t}\n\t\t}\n\t}\n\tif err != nil {\n\t\tt.Fatalf(\"stream = (_, %v), want (_, nil)\", err)\n\t}\n\tif numContents <= 1 {\n\t\tt.Errorf(\"stream returned %d events with content, want more than 1 event\", numContents)\n\t}\n\tif !gotThought {\n\t\tt.Error(\"stream returned no thought, want thought\")\n\t}\n}\n\nfunc TestModelCallbacks(t *testing.T) {\n\tt.Parallel()\n\n\tfor _, tc := range []struct {\n\t\tname                 string\n\t\tllmResponses         []*genai.Content\n\t\tbeforeModelCallbacks []llmagent.BeforeModelCallback\n\t\tafterModelCallbacks  []llmagent.AfterModelCallback\n\t\tonModelErrorCallback []llmagent.OnModelErrorCallback\n\t\twantTexts            []string\n\t\twantErr              error\n\t}{\n\t\t{\n\t\t\tname: \"before model callback doesn't modify anything\",\n\t\t\tbeforeModelCallbacks: []llmagent.BeforeModelCallback{\n\t\t\t\tfunc(ctx agent.CallbackContext, llmRequest *model.LLMRequest) (*model.LLMResponse, error) {\n\t\t\t\t\treturn nil, nil\n\t\t\t\t},\n\t\t\t},\n\t\t\tllmResponses: []*genai.Content{\n\t\t\t\tgenai.NewContentFromText(\"hello from model\", genai.RoleModel),\n\t\t\t},\n\t\t\twantTexts: []string{\n\t\t\t\t\"hello from model\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"before model callback returns an error\",\n\t\t\tbeforeModelCallbacks: []llmagent.BeforeModelCallback{\n\t\t\t\tfunc(ctx agent.CallbackContext, llmRequest *model.LLMRequest) (*model.LLMResponse, error) {\n\t\t\t\t\treturn nil, fmt.Errorf(\"before_model_callback_error: %w\", http.ErrNoCookie)\n\t\t\t\t},\n\t\t\t\tfunc(ctx agent.CallbackContext, llmRequest *model.LLMRequest) (*model.LLMResponse, error) {\n\t\t\t\t\treturn nil, fmt.Errorf(\"before_model_callback_error: %w\", http.ErrHijacked)\n\t\t\t\t},\n\t\t\t},\n\t\t\tllmResponses: []*genai.Content{\n\t\t\t\tgenai.NewContentFromText(\"hello from model\", genai.RoleModel),\n\t\t\t},\n\t\t\twantErr: http.ErrNoCookie,\n\t\t},\n\t\t{\n\t\t\tname: \"before model callback returns new LLMResponse\",\n\t\t\tbeforeModelCallbacks: []llmagent.BeforeModelCallback{\n\t\t\t\tfunc(ctx agent.CallbackContext, llmRequest *model.LLMRequest) (*model.LLMResponse, error) {\n\t\t\t\t\treturn &model.LLMResponse{\n\t\t\t\t\t\tContent: genai.NewContentFromText(\"hello from before_model_callback\", genai.RoleModel),\n\t\t\t\t\t}, nil\n\t\t\t\t},\n\t\t\t\tfunc(ctx agent.CallbackContext, llmRequest *model.LLMRequest) (*model.LLMResponse, error) {\n\t\t\t\t\treturn &model.LLMResponse{\n\t\t\t\t\t\tContent: genai.NewContentFromText(\"unexpected text\", genai.RoleModel),\n\t\t\t\t\t}, nil\n\t\t\t\t},\n\t\t\t},\n\t\t\tllmResponses: []*genai.Content{\n\t\t\t\tgenai.NewContentFromText(\"hello from model\", genai.RoleModel),\n\t\t\t},\n\t\t\twantTexts: []string{\n\t\t\t\t\"hello from before_model_callback\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"before model callback returns both new LLMResponse and error\",\n\t\t\tbeforeModelCallbacks: []llmagent.BeforeModelCallback{\n\t\t\t\tfunc(ctx agent.CallbackContext, llmRequest *model.LLMRequest) (*model.LLMResponse, error) {\n\t\t\t\t\treturn &model.LLMResponse{\n\t\t\t\t\t\tContent: genai.NewContentFromText(\"hello from before_model_callback\", genai.RoleModel),\n\t\t\t\t\t}, fmt.Errorf(\"before_model_callback_error: %w\", http.ErrNoCookie)\n\t\t\t\t},\n\t\t\t},\n\t\t\tllmResponses: []*genai.Content{\n\t\t\t\tgenai.NewContentFromText(\"hello from model\", genai.RoleModel),\n\t\t\t},\n\t\t\twantErr: http.ErrNoCookie,\n\t\t},\n\t\t{\n\t\t\tname: \"after model callback doesn't modify anything\",\n\t\t\tafterModelCallbacks: []llmagent.AfterModelCallback{\n\t\t\t\tfunc(ctx agent.CallbackContext, llmResponse *model.LLMResponse, llmResponseError error) (*model.LLMResponse, error) {\n\t\t\t\t\treturn nil, nil\n\t\t\t\t},\n\t\t\t},\n\t\t\tllmResponses: []*genai.Content{\n\t\t\t\tgenai.NewContentFromText(\"hello from model\", genai.RoleModel),\n\t\t\t},\n\t\t\twantTexts: []string{\n\t\t\t\t\"hello from model\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"after model callback returns new LLMResponse\",\n\t\t\tafterModelCallbacks: []llmagent.AfterModelCallback{\n\t\t\t\tfunc(ctx agent.CallbackContext, llmResponse *model.LLMResponse, llmResponseError error) (*model.LLMResponse, error) {\n\t\t\t\t\treturn &model.LLMResponse{\n\t\t\t\t\t\tContent: genai.NewContentFromText(\"hello from after_model_callback\", genai.RoleModel),\n\t\t\t\t\t}, nil\n\t\t\t\t},\n\t\t\t\tfunc(ctx agent.CallbackContext, llmResponse *model.LLMResponse, llmResponseError error) (*model.LLMResponse, error) {\n\t\t\t\t\treturn &model.LLMResponse{\n\t\t\t\t\t\tContent: genai.NewContentFromText(\"unexpected text\", genai.RoleModel),\n\t\t\t\t\t}, nil\n\t\t\t\t},\n\t\t\t},\n\t\t\tllmResponses: []*genai.Content{\n\t\t\t\tgenai.NewContentFromText(\"hello from model\", genai.RoleModel),\n\t\t\t},\n\t\t\twantTexts: []string{\n\t\t\t\t\"hello from after_model_callback\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"after model callback returns error\",\n\t\t\tafterModelCallbacks: []llmagent.AfterModelCallback{\n\t\t\t\tfunc(ctx agent.CallbackContext, llmResponse *model.LLMResponse, llmResponseError error) (*model.LLMResponse, error) {\n\t\t\t\t\treturn nil, fmt.Errorf(\"error from after_model_callback: %w\", http.ErrNoCookie)\n\t\t\t\t},\n\t\t\t\tfunc(ctx agent.CallbackContext, llmResponse *model.LLMResponse, llmResponseError error) (*model.LLMResponse, error) {\n\t\t\t\t\treturn nil, fmt.Errorf(\"error from after_model_callback: %w\", http.ErrHijacked)\n\t\t\t\t},\n\t\t\t},\n\t\t\tllmResponses: []*genai.Content{\n\t\t\t\tgenai.NewContentFromText(\"hello from model\", genai.RoleModel),\n\t\t\t},\n\t\t\twantErr: http.ErrNoCookie,\n\t\t},\n\t\t{\n\t\t\tname: \"after model callback returns both new LLMResponse and error\",\n\t\t\tafterModelCallbacks: []llmagent.AfterModelCallback{\n\t\t\t\tfunc(ctx agent.CallbackContext, llmResponse *model.LLMResponse, llmResponseError error) (*model.LLMResponse, error) {\n\t\t\t\t\treturn &model.LLMResponse{\n\t\t\t\t\t\tContent: genai.NewContentFromText(\"hello from after_model_callback\", genai.RoleModel),\n\t\t\t\t\t}, fmt.Errorf(\"error from after_model_callback: %w\", http.ErrNoCookie)\n\t\t\t\t},\n\t\t\t},\n\t\t\tllmResponses: []*genai.Content{\n\t\t\t\tgenai.NewContentFromText(\"hello from model\", genai.RoleModel),\n\t\t\t},\n\t\t\twantErr: http.ErrNoCookie,\n\t\t},\n\t\t{\n\t\t\tname: \"on model error callback is not called\",\n\t\t\tonModelErrorCallback: []llmagent.OnModelErrorCallback{\n\t\t\t\tfunc(ctx agent.CallbackContext, llmRequest *model.LLMRequest, llmError error) (*model.LLMResponse, error) {\n\t\t\t\t\treturn &model.LLMResponse{\n\t\t\t\t\t\tContent: genai.NewContentFromText(\"hello from on_model_error_callback\", genai.RoleModel),\n\t\t\t\t\t}, fmt.Errorf(\"on_model_error_callback: %w\", http.ErrNoCookie)\n\t\t\t\t},\n\t\t\t},\n\t\t\tllmResponses: []*genai.Content{\n\t\t\t\tgenai.NewContentFromText(\"hello from model\", genai.RoleModel),\n\t\t\t},\n\t\t\twantTexts: []string{\n\t\t\t\t\"hello from model\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"on model error callback changes message\",\n\t\t\tonModelErrorCallback: []llmagent.OnModelErrorCallback{\n\t\t\t\tfunc(ctx agent.CallbackContext, llmRequest *model.LLMRequest, llmError error) (*model.LLMResponse, error) {\n\t\t\t\t\treturn &model.LLMResponse{\n\t\t\t\t\t\tContent: genai.NewContentFromText(\"hello from on_model_error_callback\", genai.RoleModel),\n\t\t\t\t\t}, nil\n\t\t\t\t},\n\t\t\t},\n\t\t\tllmResponses: []*genai.Content{},\n\t\t\twantTexts: []string{\n\t\t\t\t\"hello from on_model_error_callback\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"on model error callback changes err\",\n\t\t\tonModelErrorCallback: []llmagent.OnModelErrorCallback{\n\t\t\t\tfunc(ctx agent.CallbackContext, llmRequest *model.LLMRequest, llmError error) (*model.LLMResponse, error) {\n\t\t\t\t\treturn &model.LLMResponse{\n\t\t\t\t\t\tContent: genai.NewContentFromText(\"hello from on_model_error_callback\", genai.RoleModel),\n\t\t\t\t\t}, fmt.Errorf(\"error from on_model_error_callback: %w\", http.ErrNoCookie)\n\t\t\t\t},\n\t\t\t\tfunc(ctx agent.CallbackContext, llmRequest *model.LLMRequest, llmError error) (*model.LLMResponse, error) {\n\t\t\t\t\treturn &model.LLMResponse{\n\t\t\t\t\t\tContent: genai.NewContentFromText(\"hello from on_model_error_callback\", genai.RoleModel),\n\t\t\t\t\t}, fmt.Errorf(\"error from on_model_error_callback: %w\", http.ErrHijacked)\n\t\t\t\t},\n\t\t\t},\n\t\t\tllmResponses: []*genai.Content{},\n\t\t\twantErr:      http.ErrNoCookie,\n\t\t},\n\t\t{\n\t\t\tname: \"on model error callback returns both new LLMResponse and error\",\n\t\t\tonModelErrorCallback: []llmagent.OnModelErrorCallback{\n\t\t\t\tfunc(ctx agent.CallbackContext, llmRequest *model.LLMRequest, llmError error) (*model.LLMResponse, error) {\n\t\t\t\t\treturn &model.LLMResponse{\n\t\t\t\t\t\tContent: genai.NewContentFromText(\"hello from on_model_error_callback\", genai.RoleModel),\n\t\t\t\t\t}, fmt.Errorf(\"error from on_model_error_callback: %w\", http.ErrNoCookie)\n\t\t\t\t},\n\t\t\t},\n\t\t\tllmResponses: []*genai.Content{},\n\t\t\twantErr:      http.ErrNoCookie,\n\t\t},\n\t\t{\n\t\t\tname: \"on model error callback does not process before model callback error\",\n\t\t\tbeforeModelCallbacks: []llmagent.BeforeModelCallback{\n\t\t\t\tfunc(ctx agent.CallbackContext, llmRequest *model.LLMRequest) (*model.LLMResponse, error) {\n\t\t\t\t\treturn nil, fmt.Errorf(\"before_model_callback_error: %w\", http.ErrNoCookie)\n\t\t\t\t},\n\t\t\t},\n\t\t\tonModelErrorCallback: []llmagent.OnModelErrorCallback{\n\t\t\t\tfunc(ctx agent.CallbackContext, llmRequest *model.LLMRequest, llmError error) (*model.LLMResponse, error) {\n\t\t\t\t\treturn &model.LLMResponse{\n\t\t\t\t\t\tContent: genai.NewContentFromText(\"hello from on_model_error_callback\", genai.RoleModel),\n\t\t\t\t\t}, fmt.Errorf(\"error from on_model_error_callback: %w\", http.ErrHijacked)\n\t\t\t\t},\n\t\t\t},\n\t\t\tllmResponses: []*genai.Content{\n\t\t\t\tgenai.NewContentFromText(\"hello from model\", genai.RoleModel),\n\t\t\t},\n\t\t\twantErr: http.ErrNoCookie,\n\t\t},\n\t\t{\n\t\t\tname: \"on model error callback does not process before model callback message\",\n\t\t\tbeforeModelCallbacks: []llmagent.BeforeModelCallback{\n\t\t\t\tfunc(ctx agent.CallbackContext, llmRequest *model.LLMRequest) (*model.LLMResponse, error) {\n\t\t\t\t\treturn &model.LLMResponse{\n\t\t\t\t\t\tContent: genai.NewContentFromText(\"hello from before_model_callback\", genai.RoleModel),\n\t\t\t\t\t}, nil\n\t\t\t\t},\n\t\t\t},\n\t\t\tonModelErrorCallback: []llmagent.OnModelErrorCallback{\n\t\t\t\tfunc(ctx agent.CallbackContext, llmRequest *model.LLMRequest, llmError error) (*model.LLMResponse, error) {\n\t\t\t\t\treturn &model.LLMResponse{\n\t\t\t\t\t\tContent: genai.NewContentFromText(\"hello from on_model_error_callback\", genai.RoleModel),\n\t\t\t\t\t}, fmt.Errorf(\"error from on_model_error_callback: %w\", http.ErrHijacked)\n\t\t\t\t},\n\t\t\t},\n\t\t\tllmResponses: []*genai.Content{\n\t\t\t\tgenai.NewContentFromText(\"hello from model\", genai.RoleModel),\n\t\t\t},\n\t\t\twantTexts: []string{\n\t\t\t\t\"hello from before_model_callback\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"after error callback process on model error callback message\",\n\t\t\tonModelErrorCallback: []llmagent.OnModelErrorCallback{\n\t\t\t\tfunc(ctx agent.CallbackContext, llmRequest *model.LLMRequest, llmError error) (*model.LLMResponse, error) {\n\t\t\t\t\treturn &model.LLMResponse{\n\t\t\t\t\t\tContent: genai.NewContentFromText(\"hello from on_model_error_callback\", genai.RoleModel),\n\t\t\t\t\t}, nil\n\t\t\t\t},\n\t\t\t},\n\t\t\tafterModelCallbacks: []llmagent.AfterModelCallback{\n\t\t\t\tfunc(ctx agent.CallbackContext, llmResponse *model.LLMResponse, llmResponseError error) (*model.LLMResponse, error) {\n\t\t\t\t\treturn &model.LLMResponse{\n\t\t\t\t\t\tContent: genai.NewContentFromText(\"hello from after_model_callback\", genai.RoleModel),\n\t\t\t\t\t}, nil\n\t\t\t\t},\n\t\t\t},\n\t\t\tllmResponses: []*genai.Content{},\n\t\t\twantTexts: []string{\n\t\t\t\t\"hello from after_model_callback\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"after error callback does not process on model error callback error\",\n\t\t\tonModelErrorCallback: []llmagent.OnModelErrorCallback{\n\t\t\t\tfunc(ctx agent.CallbackContext, llmRequest *model.LLMRequest, llmError error) (*model.LLMResponse, error) {\n\t\t\t\t\treturn nil, fmt.Errorf(\"error from on_model_error_callback: %w\", http.ErrNoCookie)\n\t\t\t\t},\n\t\t\t},\n\t\t\tafterModelCallbacks: []llmagent.AfterModelCallback{\n\t\t\t\tfunc(ctx agent.CallbackContext, llmResponse *model.LLMResponse, llmResponseError error) (*model.LLMResponse, error) {\n\t\t\t\t\treturn nil, fmt.Errorf(\"error from after_model_callback: %w\", http.ErrHijacked)\n\t\t\t\t},\n\t\t\t},\n\t\t\tllmResponses: []*genai.Content{},\n\t\t\twantErr:      http.ErrNoCookie,\n\t\t},\n\t} {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\ttestLLM := &testutil.MockModel{\n\t\t\t\tResponses: tc.llmResponses,\n\t\t\t}\n\t\t\ta, err := llmagent.New(llmagent.Config{\n\t\t\t\tName:                  \"hello_world_agent\",\n\t\t\t\tModel:                 testLLM,\n\t\t\t\tBeforeModelCallbacks:  tc.beforeModelCallbacks,\n\t\t\t\tAfterModelCallbacks:   tc.afterModelCallbacks,\n\t\t\t\tOnModelErrorCallbacks: tc.onModelErrorCallback,\n\t\t\t})\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"failed to create llm agent: %v\", err)\n\t\t\t}\n\t\t\trunner := testutil.NewTestAgentRunner(t, a)\n\t\t\tstream := runner.Run(t, \"test_session\", \"\")\n\t\t\ttexts, err := testutil.CollectTextParts(stream)\n\t\t\tif tc.wantErr != nil && !errors.Is(err, tc.wantErr) {\n\t\t\t\tt.Fatalf(\"stream = (%q, %v), want (_, %v)\", texts, err, tc.wantErr)\n\t\t\t}\n\t\t\tif (err != nil) != (tc.wantErr != nil) {\n\t\t\t\tt.Fatalf(\"unexpected result from agent, got error: %v, want error: %v\", err, tc.wantErr)\n\t\t\t}\n\n\t\t\tif diff := cmp.Diff(tc.wantTexts, texts); diff != \"\" {\n\t\t\t\tt.Fatalf(\"unexpected result from agent, want: %v, got: %v, diff: %v\", tc.wantTexts, texts, diff)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestToolCallback(t *testing.T) {\n\ttype Args struct {\n\t\tSeed int `json:\"seed\"`\n\t}\n\ttype Result struct {\n\t\tNumber int `json:\"number\"`\n\t}\n\n\thandler := func(_ tool.Context, input Args) (Result, error) {\n\t\treturn Result{Number: 1}, nil\n\t}\n\trand, _ := functiontool.New(functiontool.Config{\n\t\tName:        \"rand_number\",\n\t\tDescription: \"returns random number\",\n\t}, handler)\n\n\tt.Run(\"before_callback_response_used\", func(t *testing.T) {\n\t\tmodel := newGeminiModel(t, modelName, nil)\n\t\tagent, err := llmagent.New(llmagent.Config{\n\t\t\tName:                     \"agent\",\n\t\t\tDescription:              \"random agent\",\n\t\t\tModel:                    model,\n\t\t\tInstruction:              \"IMPORTANT: output ONLY the result computed by the provided function, if the result is number:42 print only 42\",\n\t\t\tDisallowTransferToParent: true,\n\t\t\tDisallowTransferToPeers:  true,\n\t\t\tTools:                    []tool.Tool{rand},\n\t\t\tBeforeToolCallbacks: []llmagent.BeforeToolCallback{\n\t\t\t\tfunc(ctx tool.Context, tool tool.Tool, args map[string]any) (map[string]any, error) {\n\t\t\t\t\treturn nil, nil\n\t\t\t\t},\n\t\t\t\tfunc(ctx tool.Context, tool tool.Tool, args map[string]any) (map[string]any, error) {\n\t\t\t\t\treturn map[string]any{\"number\": \"7\"}, nil\n\t\t\t\t},\n\t\t\t},\n\t\t})\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"failed to create LLM Agent: %v\", err)\n\t\t}\n\n\t\trunner := testutil.NewTestAgentRunner(t, agent)\n\t\tstream := runner.Run(t, \"session1\", \"Generate random number with 5 as a seed.\")\n\n\t\tans, err := testutil.CollectTextParts(stream)\n\t\tif err != nil || len(ans) == 0 {\n\t\t\tt.Fatalf(\"agent returned (%v, %v), want result\", ans, err)\n\t\t}\n\t\tif got, want := strings.TrimSpace(ans[len(ans)-1]), \"7\"; got != want {\n\t\t\tt.Errorf(\"unexpected result from agent = (%v, %v), want ([%q], nil)\", ans, err, want)\n\t\t}\n\t})\n\n\tt.Run(\"extra_before_callback_skipped\", func(t *testing.T) {\n\t\tmodel := newGeminiModel(t, modelName, nil)\n\t\tagent, err := llmagent.New(llmagent.Config{\n\t\t\tName:                     \"agent\",\n\t\t\tDescription:              \"random agent\",\n\t\t\tModel:                    model,\n\t\t\tInstruction:              \"IMPORTANT: output ONLY the result computed by the provided function, if the result is number:42 print only 42\",\n\t\t\tDisallowTransferToParent: true,\n\t\t\tDisallowTransferToPeers:  true,\n\t\t\tTools:                    []tool.Tool{rand},\n\t\t\tBeforeToolCallbacks: []llmagent.BeforeToolCallback{\n\t\t\t\t// Since it retursn non nil, the next callback won't be executed.\n\t\t\t\tfunc(ctx tool.Context, tool tool.Tool, args map[string]any) (map[string]any, error) {\n\t\t\t\t\treturn map[string]any{\"number\": \"3\"}, nil\n\t\t\t\t},\n\t\t\t\tfunc(ctx tool.Context, tool tool.Tool, args map[string]any) (map[string]any, error) {\n\t\t\t\t\treturn map[string]any{\"number\": \"7\"}, nil\n\t\t\t\t},\n\t\t\t},\n\t\t})\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"failed to create LLM Agent: %v\", err)\n\t\t}\n\n\t\trunner := testutil.NewTestAgentRunner(t, agent)\n\t\tstream := runner.Run(t, \"session1\", \"Generate random number with 5 as a seed.\")\n\n\t\tans, err := testutil.CollectTextParts(stream)\n\t\tif err != nil || len(ans) == 0 {\n\t\t\tt.Fatalf(\"agent returned (%v, %v), want result\", ans, err)\n\t\t}\n\t\tif got, want := strings.TrimSpace(ans[len(ans)-1]), \"3\"; got != want {\n\t\t\tt.Errorf(\"unexpected result from agent = (%v, %v), want ([%q], nil)\", ans, err, want)\n\t\t}\n\t})\n\n\tt.Run(\"after_callback_response_used\", func(t *testing.T) {\n\t\tmodel := newGeminiModel(t, modelName, nil)\n\t\tagent, err := llmagent.New(llmagent.Config{\n\t\t\tName:                     \"agent\",\n\t\t\tDescription:              \"random agent\",\n\t\t\tModel:                    model,\n\t\t\tInstruction:              \"IMPORTANT: output ONLY the result computed by the provided function, if the result is number:42 print only 42\",\n\t\t\tDisallowTransferToParent: true,\n\t\t\tDisallowTransferToPeers:  true,\n\t\t\tTools:                    []tool.Tool{rand},\n\t\t\tAfterToolCallbacks: []llmagent.AfterToolCallback{\n\t\t\t\tfunc(ctx tool.Context, tool tool.Tool, args, result map[string]any, err error) (map[string]any, error) {\n\t\t\t\t\treturn nil, nil\n\t\t\t\t},\n\t\t\t\tfunc(ctx tool.Context, tool tool.Tool, args, result map[string]any, err error) (map[string]any, error) {\n\t\t\t\t\treturn map[string]any{\"number\": \"7\"}, nil\n\t\t\t\t},\n\t\t\t},\n\t\t})\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"failed to create LLM Agent: %v\", err)\n\t\t}\n\n\t\trunner := testutil.NewTestAgentRunner(t, agent)\n\t\tstream := runner.Run(t, \"session1\", \"Generate random number with 5 as a seed.\")\n\n\t\tans, err := testutil.CollectTextParts(stream)\n\t\tif err != nil || len(ans) == 0 {\n\t\t\tt.Fatalf(\"agent returned (%v, %v), want result\", ans, err)\n\t\t}\n\t\tif got, want := strings.TrimSpace(ans[len(ans)-1]), \"7\"; got != want {\n\t\t\tt.Errorf(\"unexpected result from agent = (%v, %v), want ([%q], nil)\", ans, err, want)\n\t\t}\n\t})\n\n\tt.Run(\"extra_after_callback_skipped\", func(t *testing.T) {\n\t\tmodel := newGeminiModel(t, modelName, nil)\n\t\tagent, err := llmagent.New(llmagent.Config{\n\t\t\tName:                     \"agent\",\n\t\t\tDescription:              \"random agent\",\n\t\t\tModel:                    model,\n\t\t\tInstruction:              \"IMPORTANT: output ONLY the result computed by the provided function, if the result is number:42 print only 42\",\n\t\t\tDisallowTransferToParent: true,\n\t\t\tDisallowTransferToPeers:  true,\n\t\t\tTools:                    []tool.Tool{rand},\n\t\t\tAfterToolCallbacks: []llmagent.AfterToolCallback{\n\t\t\t\t// Since it retursn non nil, the next callback won't be executed.\n\t\t\t\tfunc(ctx tool.Context, tool tool.Tool, args, result map[string]any, err error) (map[string]any, error) {\n\t\t\t\t\treturn map[string]any{\"number\": \"3\"}, nil\n\t\t\t\t},\n\t\t\t\tfunc(ctx tool.Context, tool tool.Tool, args, result map[string]any, err error) (map[string]any, error) {\n\t\t\t\t\treturn map[string]any{\"number\": \"7\"}, nil\n\t\t\t\t},\n\t\t\t},\n\t\t})\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"failed to create LLM Agent: %v\", err)\n\t\t}\n\n\t\trunner := testutil.NewTestAgentRunner(t, agent)\n\t\tstream := runner.Run(t, \"session1\", \"Generate random number with 5 as a seed.\")\n\n\t\tans, err := testutil.CollectTextParts(stream)\n\t\tif err != nil || len(ans) == 0 {\n\t\t\tt.Fatalf(\"agent returned (%v, %v), want result\", ans, err)\n\t\t}\n\t\tif got, want := strings.TrimSpace(ans[len(ans)-1]), \"3\"; got != want {\n\t\t\tt.Errorf(\"unexpected result from agent = (%v, %v), want ([%q], nil)\", ans, err, want)\n\t\t}\n\t})\n\n\tt.Run(\"after_callback_returned_when_used_with_before_callback\", func(t *testing.T) {\n\t\tmodel := newGeminiModel(t, modelName, nil)\n\t\tagent, err := llmagent.New(llmagent.Config{\n\t\t\tName:                     \"agent\",\n\t\t\tDescription:              \"random agent\",\n\t\t\tModel:                    model,\n\t\t\tInstruction:              \"IMPORTANT: output ONLY the result computed by the provided function, if the result is number:42 print only 42\",\n\t\t\tDisallowTransferToParent: true,\n\t\t\tDisallowTransferToPeers:  true,\n\t\t\tTools:                    []tool.Tool{rand},\n\t\t\tBeforeToolCallbacks: []llmagent.BeforeToolCallback{\n\t\t\t\tfunc(ctx tool.Context, tool tool.Tool, args map[string]any) (map[string]any, error) {\n\t\t\t\t\treturn map[string]any{\"number\": \"3\"}, nil\n\t\t\t\t},\n\t\t\t},\n\t\t\tAfterToolCallbacks: []llmagent.AfterToolCallback{\n\t\t\t\tfunc(ctx tool.Context, tool tool.Tool, args, result map[string]any, err error) (map[string]any, error) {\n\t\t\t\t\treturn map[string]any{\"number\": \"7\"}, nil\n\t\t\t\t},\n\t\t\t},\n\t\t})\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"failed to create LLM Agent: %v\", err)\n\t\t}\n\n\t\trunner := testutil.NewTestAgentRunner(t, agent)\n\t\tstream := runner.Run(t, \"session1\", \"Generate random number with 5 as a seed.\")\n\n\t\tans, err := testutil.CollectTextParts(stream)\n\t\tif err != nil || len(ans) == 0 {\n\t\t\tt.Fatalf(\"agent returned (%v, %v), want result\", ans, err)\n\t\t}\n\t\tif got, want := strings.TrimSpace(ans[len(ans)-1]), \"7\"; got != want {\n\t\t\tt.Errorf(\"unexpected result from agent = (%v, %v), want ([%q], nil)\", ans, err, want)\n\t\t}\n\t})\n\n\tt.Run(\"both_callbacks_return_nil_actual_tool_is_executed\", func(t *testing.T) {\n\t\tmodel := newGeminiModel(t, modelName, nil)\n\t\tagent, err := llmagent.New(llmagent.Config{\n\t\t\tName:                     \"agent\",\n\t\t\tDescription:              \"random agent\",\n\t\t\tModel:                    model,\n\t\t\tInstruction:              \"IMPORTANT: output ONLY the result computed by the provided function, if the result is number:42 print only 42\",\n\t\t\tDisallowTransferToParent: true,\n\t\t\tDisallowTransferToPeers:  true,\n\t\t\tTools:                    []tool.Tool{rand},\n\t\t\tBeforeToolCallbacks: []llmagent.BeforeToolCallback{\n\t\t\t\tfunc(ctx tool.Context, tool tool.Tool, args map[string]any) (map[string]any, error) {\n\t\t\t\t\treturn nil, nil\n\t\t\t\t},\n\t\t\t},\n\t\t\tAfterToolCallbacks: []llmagent.AfterToolCallback{\n\t\t\t\tfunc(ctx tool.Context, tool tool.Tool, args, result map[string]any, err error) (map[string]any, error) {\n\t\t\t\t\treturn nil, nil\n\t\t\t\t},\n\t\t\t},\n\t\t})\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"failed to create LLM Agent: %v\", err)\n\t\t}\n\n\t\trunner := testutil.NewTestAgentRunner(t, agent)\n\t\tstream := runner.Run(t, \"session1\", \"Generate random number with 5 as a seed.\")\n\n\t\tans, err := testutil.CollectTextParts(stream)\n\t\tif err != nil || len(ans) == 0 {\n\t\t\tt.Fatalf(\"agent returned (%v, %v), want result\", ans, err)\n\t\t}\n\t\tif got, want := strings.TrimSpace(ans[len(ans)-1]), \"1\"; got != want {\n\t\t\tt.Errorf(\"unexpected result from agent = (%v, %v), want ([%q], nil)\", ans, err, want)\n\t\t}\n\t})\n}\n\nfunc TestInstructionProvider(t *testing.T) {\n\tt.Parallel()\n\n\tfor _, tc := range []struct {\n\t\tname              string\n\t\tllmagentFunc      func(model.LLM) (agent.Agent, error)\n\t\twantLLMRequests   []*model.LLMRequest\n\t\twantAgentResponse []string\n\t\twantErr           error\n\t}{\n\t\t{\n\t\t\tname: \"instruction is evaluated\",\n\t\t\tllmagentFunc: func(model model.LLM) (agent.Agent, error) {\n\t\t\t\treturn llmagent.New(llmagent.Config{\n\t\t\t\t\tName:        \"test_agent\",\n\t\t\t\t\tModel:       model,\n\t\t\t\t\tInstruction: \"instruction {var} test\",\n\t\t\t\t})\n\t\t\t},\n\t\t\twantLLMRequests: []*model.LLMRequest{\n\t\t\t\t{\n\t\t\t\t\tModel: \"mock\",\n\t\t\t\t\tContents: []*genai.Content{\n\t\t\t\t\t\tgenai.NewContentFromText(\"user input\", genai.RoleUser),\n\t\t\t\t\t},\n\t\t\t\t\tConfig: &genai.GenerateContentConfig{\n\t\t\t\t\t\tSystemInstruction: &genai.Content{\n\t\t\t\t\t\t\tParts: []*genai.Part{\n\t\t\t\t\t\t\t\tgenai.NewPartFromText(\"instruction custom_value test\\n\\nYou are an agent. Your internal name is \\\"test_agent\\\".\"),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tRole: genai.RoleUser,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twantAgentResponse: []string{\n\t\t\t\t\"llm resp stub\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"instruction provider overrides instruction\",\n\t\t\tllmagentFunc: func(model model.LLM) (agent.Agent, error) {\n\t\t\t\treturn llmagent.New(llmagent.Config{\n\t\t\t\t\tName:        \"test_agent\",\n\t\t\t\t\tModel:       model,\n\t\t\t\t\tInstruction: \"instruction\",\n\t\t\t\t\tInstructionProvider: func(ctx agent.ReadonlyContext) (string, error) {\n\t\t\t\t\t\treturn \"instruction provider template {var} not evaluated\", nil\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t\t},\n\t\t\twantLLMRequests: []*model.LLMRequest{\n\t\t\t\t{\n\t\t\t\t\tModel: \"mock\",\n\t\t\t\t\tContents: []*genai.Content{\n\t\t\t\t\t\tgenai.NewContentFromText(\"user input\", genai.RoleUser),\n\t\t\t\t\t},\n\t\t\t\t\tConfig: &genai.GenerateContentConfig{\n\t\t\t\t\t\tSystemInstruction: &genai.Content{\n\t\t\t\t\t\t\tParts: []*genai.Part{\n\t\t\t\t\t\t\t\tgenai.NewPartFromText(\"instruction provider template {var} not evaluated\\n\\nYou are an agent. Your internal name is \\\"test_agent\\\".\"),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tRole: genai.RoleUser,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twantAgentResponse: []string{\n\t\t\t\t\"llm resp stub\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"global instruction provider overrides global instruction\",\n\t\t\tllmagentFunc: func(model model.LLM) (agent.Agent, error) {\n\t\t\t\treturn llmagent.New(llmagent.Config{\n\t\t\t\t\tName:              \"test_agent\",\n\t\t\t\t\tModel:             model,\n\t\t\t\t\tGlobalInstruction: \"instruction\",\n\t\t\t\t\tGlobalInstructionProvider: func(ctx agent.ReadonlyContext) (string, error) {\n\t\t\t\t\t\treturn \"global instruction provider template {var} not evaluated\", nil\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t\t},\n\t\t\twantLLMRequests: []*model.LLMRequest{\n\t\t\t\t{\n\t\t\t\t\tModel: \"mock\",\n\t\t\t\t\tContents: []*genai.Content{\n\t\t\t\t\t\tgenai.NewContentFromText(\"user input\", genai.RoleUser),\n\t\t\t\t\t},\n\t\t\t\t\tConfig: &genai.GenerateContentConfig{\n\t\t\t\t\t\tSystemInstruction: &genai.Content{\n\t\t\t\t\t\t\tParts: []*genai.Part{\n\t\t\t\t\t\t\t\tgenai.NewPartFromText(\"global instruction provider template {var} not evaluated\\n\\nYou are an agent. Your internal name is \\\"test_agent\\\".\"),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tRole: genai.RoleUser,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twantAgentResponse: []string{\n\t\t\t\t\"llm resp stub\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"global instruction provider merged with instruction provider\",\n\t\t\tllmagentFunc: func(model model.LLM) (agent.Agent, error) {\n\t\t\t\treturn llmagent.New(llmagent.Config{\n\t\t\t\t\tName:  \"test_agent\",\n\t\t\t\t\tModel: model,\n\t\t\t\t\tInstructionProvider: func(ctx agent.ReadonlyContext) (string, error) {\n\t\t\t\t\t\treturn \"instruction provider {var}\", nil\n\t\t\t\t\t},\n\t\t\t\t\tGlobalInstructionProvider: func(ctx agent.ReadonlyContext) (string, error) {\n\t\t\t\t\t\treturn \"global instruction provider {var}\", nil\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t\t},\n\t\t\twantLLMRequests: []*model.LLMRequest{\n\t\t\t\t{\n\t\t\t\t\tModel: \"mock\",\n\t\t\t\t\tContents: []*genai.Content{\n\t\t\t\t\t\tgenai.NewContentFromText(\"user input\", genai.RoleUser),\n\t\t\t\t\t},\n\t\t\t\t\tConfig: &genai.GenerateContentConfig{\n\t\t\t\t\t\tSystemInstruction: &genai.Content{\n\t\t\t\t\t\t\tParts: []*genai.Part{\n\t\t\t\t\t\t\t\tgenai.NewPartFromText(\"global instruction provider {var}\\n\\ninstruction provider {var}\\n\\nYou are an agent. Your internal name is \\\"test_agent\\\".\"),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tRole: genai.RoleUser,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twantAgentResponse: []string{\n\t\t\t\t\"llm resp stub\",\n\t\t\t},\n\t\t},\n\t} {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\tmodel := &testutil.MockModel{\n\t\t\t\tResponses: []*genai.Content{\n\t\t\t\t\tgenai.NewContentFromText(\"llm resp stub\", genai.RoleModel),\n\t\t\t\t},\n\t\t\t}\n\n\t\t\tagent, err := tc.llmagentFunc(model)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"failed to create LLM Agent: %v\", err)\n\t\t\t}\n\n\t\t\ttestRunner := testutil.NewTestAgentRunner(t, agent)\n\t\t\ttestRunner.SetInitSessionState(map[string]any{\"var\": \"custom_value\"})\n\n\t\t\tstream := testRunner.Run(t, \"session\", \"user input\")\n\n\t\t\tgotResp, err := testutil.CollectTextParts(stream)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"agent returned (%v, %v), want result\", gotResp, err)\n\t\t\t}\n\n\t\t\tif diff := cmp.Diff(tc.wantLLMRequests, model.Requests); diff != \"\" {\n\t\t\t\tt.Errorf(\"unexpected LLM requests, want: %v, got: %v, diff: %v\", tc.wantLLMRequests, model.Requests, diff)\n\t\t\t}\n\n\t\t\tif diff := cmp.Diff(tc.wantAgentResponse, gotResp); diff != \"\" {\n\t\t\t\tt.Errorf(\"unexpected agent response, want: %v, got: %v, diff: %v\", tc.wantAgentResponse, gotResp, diff)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestFunctionTool(t *testing.T) {\n\tmodel := newGeminiModel(t, modelName, nil)\n\n\ttype Args struct {\n\t\tA int `json:\"a\"`\n\t\tB int `json:\"b\"`\n\t}\n\ttype Result struct {\n\t\tSum int `json:\"sum\"`\n\t}\n\n\tprompt := \"what is the sum of 1 + 2?\"\n\thandler := func(_ tool.Context, input Args) (Result, error) {\n\t\tif input.A != 1 || input.B != 2 {\n\t\t\tt.Errorf(\"handler received %+v, want {a: 1, b: 2}\", input)\n\t\t}\n\t\treturn Result{Sum: input.A + input.B}, nil\n\t}\n\trand, _ := functiontool.New(functiontool.Config{\n\t\tName:        \"sum\",\n\t\tDescription: \"computes the sum of two numbers\",\n\t}, handler)\n\n\tagent, err := llmagent.New(llmagent.Config{\n\t\tName:        \"agent\",\n\t\tDescription: \"math agent\",\n\t\tModel:       model,\n\t\tInstruction: \"IMPORTANT: output ONLY the result computed by the provided function, if the result of 10 + 32 is 42 print only 42\",\n\t\t// TODO(hakim): set to false when autoflow is implemented.\n\t\tDisallowTransferToParent: true,\n\t\tDisallowTransferToPeers:  true,\n\t\tTools:                    []tool.Tool{rand},\n\t})\n\tif err != nil {\n\t\tt.Fatalf(\"failed to create LLM Agent: %v\", err)\n\t}\n\n\trunner := testutil.NewTestAgentRunner(t, agent)\n\tstream := runner.Run(t, \"session1\", prompt)\n\n\tans, err := testutil.CollectTextParts(stream)\n\tif err != nil || len(ans) == 0 {\n\t\tt.Fatalf(\"agent returned (%v, %v), want result\", ans, err)\n\t}\n\tif got, want := strings.TrimSpace(ans[len(ans)-1]), \"3\"; got != want {\n\t\tt.Errorf(\"unexpected result from agent = (%v, %v), want ([%q], nil)\", ans, err, want)\n\t}\n}\n\nfunc TestAgentTransfer(t *testing.T) {\n\t// Helpers to create genai.Content conveniently.\n\ttransferCall := func(agentName string) *genai.Content {\n\t\treturn genai.NewContentFromFunctionCall(\n\t\t\t\"transfer_to_agent\",\n\t\t\tmap[string]any{\"agent_name\": agentName},\n\t\t\t\"model\",\n\t\t)\n\t}\n\ttransferResponse := func() *genai.Content {\n\t\treturn genai.NewContentFromFunctionResponse(\n\t\t\t\"transfer_to_agent\", map[string]any{}, \"user\")\n\t}\n\ttext := func(text string) *genai.Content {\n\t\treturn genai.NewContentFromText(\n\t\t\ttext,\n\t\t\t\"model\",\n\t\t)\n\t}\n\t// returns a model that returns the prepopulated resp one by one.\n\ttestModel := func(resp ...*genai.Content) model.LLM {\n\t\treturn &testutil.MockModel{Responses: resp}\n\t}\n\n\ttype content struct {\n\t\tAuthor string\n\t\tParts  []*genai.Part\n\t}\n\t// contents returns (Author, Parts) stream extracted from the event stream.\n\tcontents := func(stream iter.Seq2[*session.Event, error]) ([]content, error) {\n\t\tvar ret []content\n\t\tfor ev, err := range stream {\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\tif ev.LLMResponse.Content == nil {\n\t\t\t\treturn nil, fmt.Errorf(\"unexpected event: %v\", ev)\n\t\t\t}\n\t\t\tfor _, p := range ev.LLMResponse.Content.Parts {\n\t\t\t\tif p.FunctionCall != nil {\n\t\t\t\t\tp.FunctionCall.ID = \"\"\n\t\t\t\t}\n\t\t\t\tif p.FunctionResponse != nil {\n\t\t\t\t\tp.FunctionResponse.ID = \"\"\n\t\t\t\t}\n\t\t\t}\n\t\t\tret = append(ret, content{Author: ev.Author, Parts: ev.LLMResponse.Content.Parts})\n\t\t}\n\t\treturn ret, nil\n\t}\n\n\tcheck := func(t *testing.T, rootAgent agent.Agent, wants [][]content) {\n\t\trunner := testutil.NewTestAgentRunner(t, rootAgent)\n\t\tfor i := range len(wants) {\n\t\t\tgot, err := contents(runner.Run(t, \"session_id\", fmt.Sprintf(\"round %d\", i)))\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"[round $d]: stream ended with an error: %v\", err)\n\t\t\t}\n\t\t\tif diff := cmp.Diff(wants[i], got); diff != \"\" {\n\t\t\t\tt.Errorf(\"[round %d] events diff (-want, +got) = %v\", i, diff)\n\t\t\t}\n\t\t}\n\t}\n\n\tt.Run(\"auto_to_auto\", func(t *testing.T) {\n\t\t// root_agent -- sub_agent_1\n\t\tmodel := testModel(\n\t\t\ttransferCall(\"sub_agent_1\"),\n\t\t\ttext(\"response1\"),\n\t\t\ttext(\"response2\"))\n\n\t\tsubAgent1, err := llmagent.New(llmagent.Config{\n\t\t\tName:  \"sub_agent_1\",\n\t\t\tModel: model,\n\t\t})\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"failed to create subAgent1: %v\", err)\n\t\t}\n\n\t\trootAgent, err := llmagent.New(llmagent.Config{\n\t\t\tName:      \"root_agent\",\n\t\t\tModel:     model,\n\t\t\tSubAgents: []agent.Agent{subAgent1},\n\t\t})\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"failed to create rootAgent: %v\", err)\n\t\t}\n\n\t\tcheck(t, rootAgent, [][]content{\n\t\t\t0: {\n\t\t\t\t{\"root_agent\", transferCall(\"sub_agent_1\").Parts},\n\t\t\t\t{\"root_agent\", transferResponse().Parts},\n\t\t\t\t{\"sub_agent_1\", text(\"response1\").Parts},\n\t\t\t},\n\t\t\t1: { // rootAgent should still be the current agent.\n\t\t\t\t{\"sub_agent_1\", text(\"response2\").Parts},\n\t\t\t},\n\t\t})\n\t})\n\n\tt.Run(\"auto_to_single\", func(t *testing.T) {\n\t\t// root_agent -- sub_agent_1 (single)\n\t\tmodel := testModel(\n\t\t\ttransferCall(\"sub_agent_1\"),\n\t\t\ttext(\"response1\"),\n\t\t\ttext(\"response2\"))\n\n\t\tsubAgent1, err := llmagent.New(llmagent.Config{\n\t\t\tName:                     \"sub_agent_1\",\n\t\t\tModel:                    model,\n\t\t\tDisallowTransferToParent: true,\n\t\t\tDisallowTransferToPeers:  true,\n\t\t})\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"failed to create subAgent1: %v\", err)\n\t\t}\n\n\t\trootAgent, err := llmagent.New(llmagent.Config{\n\t\t\tName:      \"root_agent\",\n\t\t\tModel:     model,\n\t\t\tSubAgents: []agent.Agent{subAgent1},\n\t\t})\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"failed to create rootAgent: %v\", err)\n\t\t}\n\n\t\tcheck(t, rootAgent, [][]content{\n\t\t\t0: {\n\t\t\t\t{\"root_agent\", transferCall(\"sub_agent_1\").Parts},\n\t\t\t\t{\"root_agent\", transferResponse().Parts},\n\t\t\t\t{\"sub_agent_1\", text(\"response1\").Parts},\n\t\t\t},\n\t\t\t1: { // rootAgent should still be the current agent.\n\t\t\t\t{\"root_agent\", text(\"response2\").Parts},\n\t\t\t},\n\t\t})\n\t})\n\n\tt.Run(\"auto_to_auto_to_single\", func(t *testing.T) {\n\t\t// root_agent -- sub_agent_1 -- sub_agent_1_1\n\t\tmodel := testModel(\n\t\t\ttransferCall(\"sub_agent_1\"),\n\t\t\ttransferCall(\"sub_agent_1_1\"),\n\t\t\ttext(\"response1\"),\n\t\t\ttext(\"response2\"))\n\n\t\tsubAgent1_1, err := llmagent.New(llmagent.Config{\n\t\t\tName:                     \"sub_agent_1_1\",\n\t\t\tModel:                    model,\n\t\t\tDisallowTransferToParent: true,\n\t\t\tDisallowTransferToPeers:  true,\n\t\t})\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"failed to create subAgent1_1: %v\", err)\n\t\t}\n\n\t\tsubAgent1, err := llmagent.New(llmagent.Config{\n\t\t\tName:      \"sub_agent_1\",\n\t\t\tModel:     model,\n\t\t\tSubAgents: []agent.Agent{subAgent1_1},\n\t\t})\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"failed to create subAgent1: %v\", err)\n\t\t}\n\n\t\trootAgent, err := llmagent.New(llmagent.Config{\n\t\t\tName:      \"root_agent\",\n\t\t\tModel:     model,\n\t\t\tSubAgents: []agent.Agent{subAgent1},\n\t\t})\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"failed to create rootAgent: %v\", err)\n\t\t}\n\n\t\tcheck(t, rootAgent, [][]content{\n\t\t\t0: {\n\t\t\t\t{\"root_agent\", transferCall(\"sub_agent_1\").Parts},\n\t\t\t\t{\"root_agent\", transferResponse().Parts},\n\t\t\t\t{\"sub_agent_1\", transferCall(\"sub_agent_1_1\").Parts},\n\t\t\t\t{\"sub_agent_1\", transferResponse().Parts},\n\t\t\t\t{\"sub_agent_1_1\", text(\"response1\").Parts},\n\t\t\t},\n\t\t\t1: {\n\t\t\t\t// sub_agent_1 should still be the current agent.\n\t\t\t\t// sub_agent_1_1 is single, so it should not be the current agent.\n\t\t\t\t// Otherwise, the conversation will be tied to sub_agent_1_1 forever.\n\t\t\t\t{\"sub_agent_1\", text(\"response2\").Parts},\n\t\t\t},\n\t\t})\n\t})\n\n\t// TODO: cover cases similar to adk-python's\n\t// tests/unittests/flows/llm_flows/test_agent_transfer.py\n\t//   - test_auto_to_sequential\n\t//   - test_auto_to_sequential_to_auto\n\t//   - test_auto_to_loop\n}\n\nfunc newGeminiModel(t *testing.T, modelName string, transport http.RoundTripper) model.LLM {\n\tcfg := &genai.ClientConfig{\n\t\tHTTPClient: &http.Client{Transport: transport},\n\t\tAPIKey:     \"fakeKey\",\n\t}\n\tif transport == nil { // use httprr\n\t\ttrace := filepath.Join(\"testdata\", strings.ReplaceAll(t.Name()+\".httprr\", \"/\", \"_\"))\n\t\tcfg = testutil.NewGeminiTestClientConfig(t, trace)\n\t}\n\tmodel, err := gemini.NewModel(t.Context(), modelName, cfg)\n\tif err != nil {\n\t\tt.Fatalf(\"failed to create model: %v\", err)\n\t}\n\treturn model\n}\n\ntype roundTripperFunc func(*http.Request) (*http.Response, error)\n\n// RoundTrip implements http.RoundTripper.\nfunc (fn roundTripperFunc) RoundTrip(req *http.Request) (*http.Response, error) {\n\treturn fn(req)\n}\n"
  },
  {
    "path": "agent/llmagent/state_agent_test.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage llmagent_test\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"iter\"\n\t\"maps\"\n\t\"math\"\n\t\"math/rand\"\n\t\"strings\"\n\t\"testing\"\n\t\"time\"\n\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/agent\"\n\t\"google.golang.org/adk/agent/llmagent\"\n\t\"google.golang.org/adk/model\"\n\t\"google.golang.org/adk/runner\"\n\t\"google.golang.org/adk/session\"\n\t\"google.golang.org/adk/tool\"\n\t\"google.golang.org/adk/tool/functiontool\"\n)\n\n// FakeLLM is a mock implementation of model.LLM for testing.\ntype FakeLLM struct {\n\tGenerateContentFunc func(ctx context.Context, req *model.LLMRequest, stream bool) (model.LLMResponse, error)\n}\n\nfunc (f *FakeLLM) Name() string {\n\treturn \"fake-llm\"\n}\n\nfunc (f *FakeLLM) GenerateContent(ctx context.Context, req *model.LLMRequest, stream bool) iter.Seq2[*model.LLMResponse, error] {\n\treturn func(yield func(*model.LLMResponse, error) bool) {\n\t\tif f.GenerateContentFunc != nil {\n\t\t\tresp, err := f.GenerateContentFunc(ctx, req, stream)\n\t\t\tyield(&resp, err)\n\t\t} else {\n\t\t\t// Default response\n\t\t\tyield(&model.LLMResponse{\n\t\t\t\tContent: genai.NewContentFromText(\"fake model response\", genai.RoleModel),\n\t\t\t}, nil)\n\t\t}\n\t}\n}\n\nvar testSessionService session.Service\n\ntype assertSessionParams struct {\n\ttitle                   string\n\tkeysInCtxSession        []string\n\tkeysInServiceSession    []string\n\tkeysNotInServiceSession []string\n}\n\nfunc assertSessionValues(\n\tt *testing.T,\n\tcctx agent.CallbackContext,\n\tparams *assertSessionParams,\n) {\n\tt.Helper()\n\n\tgetRequest := &session.GetRequest{\n\t\tAppName:   cctx.AppName(),\n\t\tUserID:    cctx.UserID(),\n\t\tSessionID: cctx.SessionID(),\n\t}\n\tgetResponse, err := testSessionService.Get(cctx, getRequest)\n\tif err != nil {\n\t\tt.Fatalf(\"[%s] Failed to get session from service: %v\", params.title, err)\n\t}\n\tsessionInService := getResponse.Session\n\n\tfor _, key := range params.keysInCtxSession {\n\t\tif _, err := cctx.State().Get(key); err != nil {\n\t\t\tt.Errorf(\"[%s] Key %s not found in context session state: %v\", params.title, key, err)\n\t\t}\n\t}\n\n\tfor _, key := range params.keysInServiceSession {\n\t\tif _, err := sessionInService.State().Get(key); err != nil {\n\t\t\tt.Errorf(\"[%s] Key %s not found in service session state: %v\", params.title, key, err)\n\t\t}\n\t}\n\n\tfor _, key := range params.keysNotInServiceSession {\n\t\tif val, err := sessionInService.State().Get(key); err == nil {\n\t\t\tt.Errorf(\"[%s] Key %s unexpectedly found in service session state with value: %v\", params.title, key, val)\n\t\t}\n\t}\n}\n\n// --- Callbacks (Modified to use *testing.T) ---\nfunc beforeAgentCallback(t *testing.T) agent.BeforeAgentCallback {\n\treturn func(cctx agent.CallbackContext) (*genai.Content, error) {\n\t\tif _, err := cctx.State().Get(\"before_agent_callback_state_key\"); err == nil {\n\t\t\treturn genai.NewContentFromText(\"Sorry, I can only reply once.\", genai.RoleModel), nil\n\t\t}\n\t\tif err := cctx.State().Set(\"before_agent_callback_state_key\", \"before_agent_callback_state_value\"); err != nil {\n\t\t\treturn nil, fmt.Errorf(\"failed to set state: %w\", err)\n\t\t}\n\t\tassertSessionValues(t, cctx, &assertSessionParams{\n\t\t\ttitle:                   \"In before_agent_callback\",\n\t\t\tkeysInCtxSession:        []string{\"before_agent_callback_state_key\"},\n\t\t\tkeysInServiceSession:    []string{},\n\t\t\tkeysNotInServiceSession: []string{\"before_agent_callback_state_key\"},\n\t\t},\n\t\t)\n\t\treturn nil, nil\n\t}\n}\n\nfunc beforeModelCallback(t *testing.T) func(ctx agent.CallbackContext, llmRequest *model.LLMRequest) (*model.LLMResponse, error) {\n\treturn func(cctx agent.CallbackContext, llmRequest *model.LLMRequest) (*model.LLMResponse, error) {\n\t\tif err := cctx.State().Set(\"before_model_callback_state_key\", \"before_model_callback_state_value\"); err != nil {\n\t\t\treturn nil, fmt.Errorf(\"failed to set state: %w\", err)\n\t\t}\n\t\tassertSessionValues(t, cctx, &assertSessionParams{\n\t\t\ttitle:                   \"In before_model_callback\",\n\t\t\tkeysInCtxSession:        []string{\"before_agent_callback_state_key\", \"before_model_callback_state_key\"},\n\t\t\tkeysInServiceSession:    []string{\"before_agent_callback_state_key\"},\n\t\t\tkeysNotInServiceSession: []string{\"before_model_callback_state_key\"},\n\t\t},\n\t\t)\n\t\treturn nil, nil\n\t}\n}\n\nfunc afterModelCallback(t *testing.T) func(ctx agent.CallbackContext, llmResponse *model.LLMResponse, llmResponseError error) (*model.LLMResponse, error) {\n\treturn func(cctx agent.CallbackContext, llmResponse *model.LLMResponse, err error) (*model.LLMResponse, error) {\n\t\tif err := cctx.State().Set(\"after_model_callback_state_key\", \"after_model_callback_state_value\"); err != nil {\n\t\t\treturn nil, fmt.Errorf(\"failed to set state: %w\", err)\n\t\t}\n\t\tassertSessionValues(t, cctx, &assertSessionParams{\n\t\t\ttitle:                   \"In after_model_callback\",\n\t\t\tkeysInCtxSession:        []string{\"before_agent_callback_state_key\", \"before_model_callback_state_key\", \"after_model_callback_state_key\"},\n\t\t\tkeysInServiceSession:    []string{\"before_agent_callback_state_key\"},\n\t\t\tkeysNotInServiceSession: []string{\"before_model_callback_state_key\", \"after_model_callback_state_key\"},\n\t\t},\n\t\t)\n\t\treturn nil, nil\n\t}\n}\n\nfunc afterAgentCallback(t *testing.T) agent.AfterAgentCallback {\n\treturn func(cctx agent.CallbackContext) (*genai.Content, error) {\n\t\tif err := cctx.State().Set(\"after_agent_callback_state_key\", \"after_agent_callback_state_value\"); err != nil {\n\t\t\treturn nil, fmt.Errorf(\"failed to set state: %w\", err)\n\t\t}\n\t\tassertSessionValues(t, cctx, &assertSessionParams{\n\t\t\ttitle:                   \"In after_agent_callback\",\n\t\t\tkeysInCtxSession:        []string{\"before_agent_callback_state_key\", \"before_model_callback_state_key\", \"after_model_callback_state_key\", \"after_agent_callback_state_key\"},\n\t\t\tkeysInServiceSession:    []string{\"before_agent_callback_state_key\", \"before_model_callback_state_key\", \"after_model_callback_state_key\"},\n\t\t\tkeysNotInServiceSession: []string{\"after_agent_callback_state_key\"},\n\t\t},\n\t\t)\n\t\treturn nil, nil\n\t}\n}\n\nfunc TestAgentSessionLifecycle(t *testing.T) {\n\tctx := context.Background()\n\ttestSessionService = session.InMemoryService()\n\n\t// Setup Fake LLM\n\tfakeLLM := &FakeLLM{\n\t\tGenerateContentFunc: func(ctx context.Context, req *model.LLMRequest, stream bool) (model.LLMResponse, error) {\n\t\t\treturn model.LLMResponse{\n\t\t\t\tContent: genai.NewContentFromText(\"test model response\", genai.RoleModel),\n\t\t\t}, nil\n\t\t},\n\t}\n\n\t// Define Agent\n\trootAgent, err := llmagent.New(llmagent.Config{\n\t\tName:                 \"root_agent\",\n\t\tDescription:          \"a verification agent.\",\n\t\tInstruction:          \"Test instruction\",\n\t\tModel:                fakeLLM,\n\t\tBeforeAgentCallbacks: []agent.BeforeAgentCallback{beforeAgentCallback(t)},\n\t\tBeforeModelCallbacks: []llmagent.BeforeModelCallback{beforeModelCallback(t)},\n\t\tAfterModelCallbacks:  []llmagent.AfterModelCallback{afterModelCallback(t)},\n\t\tAfterAgentCallbacks:  []agent.AfterAgentCallback{afterAgentCallback(t)},\n\t})\n\tif err != nil {\n\t\tt.Fatalf(\"Failed to create agent: %v\", err)\n\t}\n\n\t// Setup Runner\n\t// Note: This Runner setup is a simplified guess. Actual implementation might need more services.\n\tr, err := runner.New(runner.Config{\n\t\tAppName:        \"test_app\",\n\t\tAgent:          rootAgent,\n\t\tSessionService: testSessionService,\n\t})\n\tif err != nil {\n\t\tt.Fatalf(\"Failed to create runner: %v\", err)\n\t}\n\n\t// Create a session\n\tcreateReq := &session.CreateRequest{AppName: \"test_app\", UserID: \"test_user\"}\n\tcreateResp, err := testSessionService.Create(ctx, createReq)\n\tif err != nil {\n\t\tt.Fatalf(\"Failed to create session: %v\", err)\n\t}\n\tsessionID := createResp.Session.ID()\n\n\t// Run the agent\n\tuserContent := genai.NewContentFromText(\"Hello agent\", genai.RoleUser)\n\n\teventStream := r.Run(ctx, \"test_user\", sessionID, userContent, agent.RunConfig{})\n\n\t// Iterate through events to trigger agent execution\n\tfor _, err := range eventStream {\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"Error during agent run: %v\", err)\n\t\t}\n\t}\n\n\t// Final check of persisted state\n\tfinalSession, _ := testSessionService.Get(ctx, &session.GetRequest{AppName: \"test_app\", UserID: \"test_user\", SessionID: sessionID})\n\tfinalState := finalSession.Session.State()\n\texpectedKeys := []string{\n\t\t\"before_agent_callback_state_key\",\n\t\t\"before_model_callback_state_key\",\n\t\t\"after_model_callback_state_key\",\n\t\t\"after_agent_callback_state_key\",\n\t}\n\tfor _, key := range expectedKeys {\n\t\tif _, err := finalState.Get(key); err != nil {\n\t\t\tt.Errorf(\"Key %s not found in final session state: %v\", key, err)\n\t\t}\n\t}\n}\n\n// --- Tool Implementations ---\n\ntype WeatherArgs struct {\n\tLocation string `json:\"location\"`\n}\n\ntype WeatherResult struct {\n\tLocation    string    `json:\"location\"`\n\tTemperature int       `json:\"temperature\"`\n\tCondition   string    `json:\"condition\"`\n\tHumidity    int       `json:\"humidity\"`\n\tTimestamp   time.Time `json:\"timestamp\"`\n}\n\nfunc GetWeather(ctx tool.Context, args WeatherArgs) (WeatherResult, error) {\n\t// Simulate weather data\n\ttemperatures := []int{-10, -5, 0, 5, 10, 15, 20, 25, 30, 35}\n\tconditions := []string{\"sunny\", \"cloudy\", \"rainy\", \"snowy\", \"windy\"}\n\n\treturn WeatherResult{\n\t\tLocation:    args.Location,\n\t\tTemperature: temperatures[rand.Intn(len(temperatures))],\n\t\tCondition:   conditions[rand.Intn(len(conditions))],\n\t\tHumidity:    rand.Intn(61) + 30, // 30-90\n\t\tTimestamp:   time.Now(),\n\t}, nil\n}\n\ntype CalculationArgs struct {\n\tOperation string  `json:\"operation\"`\n\tX         float64 `json:\"x\"`\n\tY         float64 `json:\"y\"`\n}\n\ntype CalculationResult struct {\n\tOperation string    `json:\"operation\"`\n\tX         float64   `json:\"x\"`\n\tY         float64   `json:\"y\"`\n\tResult    any       `json:\"result\"`\n\tTimestamp time.Time `json:\"timestamp\"`\n}\n\nfunc Calculate(ctx tool.Context, args CalculationArgs) (CalculationResult, error) {\n\toperations := map[string]float64{\n\t\t\"add\":      args.X + args.Y,\n\t\t\"subtract\": args.X - args.Y,\n\t\t\"multiply\": args.X * args.Y,\n\t}\n\tif args.Operation == \"divide\" {\n\t\tif args.Y != 0 {\n\t\t\toperations[\"divide\"] = args.X / args.Y\n\t\t} else {\n\t\t\toperations[\"divide\"] = math.Inf(int(args.X))\n\t\t}\n\t}\n\n\tresult, ok := operations[strings.ToLower(args.Operation)]\n\tif !ok {\n\t\treturn CalculationResult{\n\t\t\tOperation: args.Operation,\n\t\t\tX:         args.X,\n\t\t\tY:         args.Y,\n\t\t\tResult:    \"Unknown operation\",\n\t\t\tTimestamp: time.Now(),\n\t\t}, nil\n\t}\n\n\treturn CalculationResult{\n\t\tOperation: args.Operation,\n\t\tX:         args.X,\n\t\tY:         args.Y,\n\t\tResult:    result,\n\t\tTimestamp: time.Now(),\n\t}, nil\n}\n\ntype LogActivityParams struct {\n\tMessage string `json:\"message\"`\n}\n\ntype LogEntry struct {\n\tTimestamp time.Time `json:\"timestamp\"`\n\tMessage   string    `json:\"message\"`\n}\n\ntype LogActivityResult struct {\n\tStatus       string   `json:\"status\"`\n\tEntry        LogEntry `json:\"entry\"`\n\tTotalEntries int      `json:\"total_entries\"`\n\terr          error\n}\n\nfunc LogActivity(ctx tool.Context, params LogActivityParams) (LogActivityResult, error) {\n\tvar activityLog []LogEntry\n\tval, err := ctx.State().Get(\"activity_log\")\n\tif err == nil {\n\t\tactivityLog, _ = val.([]LogEntry)\n\t}\n\n\tlogEntry := LogEntry{Timestamp: time.Now(), Message: params.Message}\n\tactivityLog = append(activityLog, logEntry)\n\tif err := ctx.State().Set(\"activity_log\", activityLog); err != nil {\n\t\treturn LogActivityResult{\n\t\t\terr: err,\n\t\t}, err\n\t}\n\n\treturn LogActivityResult{\n\t\tStatus:       \"logged\",\n\t\tEntry:        logEntry,\n\t\tTotalEntries: len(activityLog),\n\t\terr:          nil,\n\t}, nil\n}\n\n// --- Before Tool Callbacks ---\n\nfunc beforeToolAuditCallback(ctx tool.Context, t tool.Tool, args map[string]any) (map[string]any, error) {\n\tfmt.Printf(\"🔍 AUDIT: About to call tool '%s' with args: %v\\n\", t.Name(), args)\n\n\tvar auditLog []map[string]any\n\tval, err := ctx.State().Get(\"audit_log\")\n\tif err == nil {\n\t\tauditLog, _ = val.([]map[string]any)\n\t}\n\n\tauditLog = append(auditLog, map[string]any{\n\t\t\"type\":      \"before_call\",\n\t\t\"tool_name\": t.Name(),\n\t\t\"args\":      args,\n\t\t\"timestamp\": time.Now(),\n\t})\n\tif err := ctx.State().Set(\"audit_log\", auditLog); err != nil {\n\t\treturn nil, err\n\t}\n\treturn nil, nil // Continue execution\n}\n\nfunc beforeToolSecurityCallback(ctx tool.Context, t tool.Tool, args map[string]any) (map[string]any, error) {\n\tif t.Name() == \"get_weather\" {\n\t\tlocation := \"\"\n\t\tif loc, ok := args[\"location\"].(string); ok {\n\t\t\tlocation = loc\n\t\t}\n\t\trestricted := []string{\"classified\", \"secret\"}\n\t\tfor _, r := range restricted {\n\t\t\tif strings.ToLower(location) == r {\n\t\t\t\tfmt.Printf(\"🚫 SECURITY: Blocked weather request for restricted location: %s\\n\", location)\n\t\t\t\tif err := ctx.State().Set(\"security_log\", \"example\"); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn map[string]any{\n\t\t\t\t\t\"error\":              \"Access denied\",\n\t\t\t\t\t\"reason\":             \"Location access is restricted\",\n\t\t\t\t\t\"requested_location\": location,\n\t\t\t\t}, nil // Block execution\n\t\t\t}\n\t\t}\n\t}\n\treturn nil, nil // Continue execution\n}\n\nfunc beforeToolValidationCallback(ctx tool.Context, t tool.Tool, args map[string]any) (map[string]any, error) {\n\tif t.Name() == \"calculate\" {\n\t\toperation, _ := args[\"operation\"].(string)\n\t\ty, yOK := args[\"y\"].(float64)\n\t\tif strings.ToLower(operation) == \"divide\" && yOK && y == 0 {\n\t\t\tfmt.Println(\"🚫 VALIDATION: Prevented division by zero\")\n\t\t\treturn map[string]any{\n\t\t\t\t\"error\":     \"Division by zero\",\n\t\t\t\t\"operation\": operation,\n\t\t\t\t\"x\":         args[\"x\"],\n\t\t\t\t\"y\":         args[\"y\"],\n\t\t\t}, nil // Block execution\n\t\t}\n\t}\n\treturn nil, nil // Continue execution\n}\n\n// --- After Tool Callbacks ---\n\nfunc afterToolEnhancementCallback(ctx tool.Context, t tool.Tool, args, result map[string]any, err error) (map[string]any, error) {\n\tif err != nil {\n\t\treturn result, err // Don't enhance if there was an error\n\t}\n\tfmt.Printf(\"✨ ENHANCE: Adding metadata to response from '%s'\\n\", t.Name())\n\tenhancedResponse := make(map[string]any)\n\tmaps.Copy(enhancedResponse, result)\n\tenhancedResponse[\"enhanced\"] = true\n\tenhancedResponse[\"enhancement_timestamp\"] = time.Now()\n\tenhancedResponse[\"tool_name\"] = t.Name()\n\tenhancedResponse[\"execution_context\"] = \"live_streaming\"\n\treturn enhancedResponse, nil\n}\n\nfunc afterToolAsyncCallback(ctx tool.Context, t tool.Tool, args, result map[string]any, err error) (map[string]any, error) {\n\tif err != nil {\n\t\treturn result, err\n\t}\n\tfmt.Printf(\"🔄 ASYNC AFTER: Post-processing response from '%s'\\n\", t.Name())\n\tprocessedResponse := make(map[string]any)\n\tmaps.Copy(processedResponse, result)\n\tprocessedResponse[\"async_processed\"] = true\n\tprocessedResponse[\"processor\"] = \"async_after_callback\"\n\treturn processedResponse, nil\n}\n\n// --- Test Function ---\n\n// --- Helper function to collect tool results ---\nfunc collectToolResults(t *testing.T, stream iter.Seq2[*session.Event, error]) []map[string]any {\n\tt.Helper()\n\tvar results []map[string]any\n\tfor event, err := range stream {\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"Error iterating through event stream: %v\", err)\n\t\t}\n\t\tif event == nil || event.Content == nil {\n\t\t\tcontinue\n\t\t}\n\n\t\tfor _, part := range event.Content.Parts {\n\t\t\tif part.FunctionResponse != nil {\n\t\t\t\tif part.FunctionResponse.Response != nil {\n\t\t\t\t\tresults = append(results, part.FunctionResponse.Response)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn results\n}\n\nfunc TestToolCallbacksAgent(t *testing.T) {\n\t// Fake LLM to control tool calls\n\tctx := t.Context()\n\tservice := session.InMemoryService()\n\n\tfakeLLM := &FakeLLM{\n\t\tGenerateContentFunc: func(ctx context.Context, req *model.LLMRequest, stream bool) (model.LLMResponse, error) {\n\t\t\tvar userText string\n\t\t\tif len(req.Contents) == 1 && len(req.Contents[0].Parts) > 0 {\n\t\t\t\tuserText = string(req.Contents[0].Parts[0].Text)\n\t\t\t} else if len(req.Contents) > 1 {\n\t\t\t\tuserText = \"after func\"\n\t\t\t}\n\n\t\t\tvar name string\n\t\t\tvar args map[string]any\n\t\t\tswitch userText {\n\t\t\tcase \"weather in London\":\n\t\t\t\tname, args = \"get_weather\", map[string]any{\"location\": \"London\"}\n\t\t\tcase \"weather in secret\":\n\t\t\t\tname, args = \"get_weather\", map[string]any{\"location\": \"secret\"}\n\t\t\tcase \"calculate 5 plus 3\":\n\t\t\t\tname, args = \"calculate\", map[string]any{\"operation\": \"add\", \"x\": 5.0, \"y\": 3.0}\n\t\t\tcase \"calculate 5 divide by 0\":\n\t\t\t\tname, args = \"calculate\", map[string]any{\"operation\": \"divide\", \"x\": 5.0, \"y\": 0.0}\n\t\t\tcase \"log this message\":\n\t\t\t\tname, args = \"log_activity\", map[string]any{\"message\": \"test log\"}\n\t\t\tcase \"after func\":\n\t\t\t\treturn model.LLMResponse{\n\t\t\t\t\tContent: genai.NewContentFromText(\"Function Ended\", genai.RoleModel),\n\t\t\t\t}, nil\n\t\t\tdefault:\n\t\t\t\treturn model.LLMResponse{\n\t\t\t\t\tContent: genai.NewContentFromText(\"I'm not sure how to respond to that.\", genai.RoleModel),\n\t\t\t\t}, nil\n\t\t\t}\n\n\t\t\treturn model.LLMResponse{\n\t\t\t\tContent: genai.NewContentFromFunctionCall(name, args, genai.RoleModel),\n\t\t\t}, nil\n\t\t},\n\t}\n\n\t// Create tools\n\tgetWeatherTool, _ := functiontool.New(functiontool.Config{Name: \"get_weather\", Description: \"Get weather information\"}, GetWeather)\n\tcalculateTool, _ := functiontool.New(functiontool.Config{Name: \"calculate\", Description: \"Perform mathematical calculations\"}, Calculate)\n\tlogActivityTool, _ := functiontool.New(functiontool.Config{Name: \"log_activity\", Description: \"Log an activity message\"}, LogActivity)\n\n\tagentConfig := llmagent.Config{\n\t\tName:        \"tool_callbacks_agent\",\n\t\tDescription: \"Agent to test tool callbacks\",\n\t\tModel:       fakeLLM,\n\t\tInstruction: \"Follow user instructions to call tools.\",\n\t\tTools:       []tool.Tool{getWeatherTool, calculateTool, logActivityTool},\n\t\tBeforeToolCallbacks: []llmagent.BeforeToolCallback{\n\t\t\tbeforeToolAuditCallback,\n\t\t\tbeforeToolSecurityCallback,\n\t\t\tbeforeToolValidationCallback,\n\t\t},\n\t\tAfterToolCallbacks: []llmagent.AfterToolCallback{\n\t\t\tafterToolEnhancementCallback,\n\t\t\tafterToolAsyncCallback,\n\t\t},\n\t}\n\trootAgent, err := llmagent.New(agentConfig)\n\tif err != nil {\n\t\tt.Fatalf(\"Failed to create LLM Agent: %v\", err)\n\t}\n\n\t// Setup Runner\n\t// Note: This Runner setup is a simplified guess. Actual implementation might need more services.\n\tr, err := runner.New(runner.Config{\n\t\tAppName:        \"test_app\",\n\t\tAgent:          rootAgent,\n\t\tSessionService: service,\n\t})\n\tif err != nil {\n\t\tt.Fatalf(\"Failed to create runner: %v\", err)\n\t}\n\n\ttests := []struct {\n\t\tname            string\n\t\tquery           string\n\t\twantContent     []string // Substrings to check in the final response\n\t\tdontWantContent []string\n\t\twantStateKeys   []string\n\t}{\n\t\t{\n\t\t\tname:            \"Weather London - success\",\n\t\t\tquery:           \"weather in London\",\n\t\t\twantContent:     []string{\"London\", \"temperature\", \"enhanced:true\"},\n\t\t\tdontWantContent: []string{\"async_processed\"},\n\t\t},\n\t\t{\n\t\t\tname:          \"Weather Secret - blocked\",\n\t\t\tquery:         \"weather in secret\",\n\t\t\twantContent:   []string{\"Access denied\", \"Location access is restricted\", \"enhanced:true\"}, // Callbacks still run on the error result\n\t\t\twantStateKeys: []string{\"security_log\"},\n\t\t},\n\t\t{\n\t\t\tname:        \"Calculate Add - success\",\n\t\t\tquery:       \"calculate 5 plus 3\",\n\t\t\twantContent: []string{\"operation:add\", \"result:8\", \"enhanced:true\"},\n\t\t},\n\t\t{\n\t\t\tname:        \"Calculate Divide by Zero - blocked\",\n\t\t\tquery:       \"calculate 5 divide by 0\",\n\t\t\twantContent: []string{\"Division by zero\", \"enhanced:true\"}, // Callbacks still run\n\t\t},\n\t\t{\n\t\t\tname:          \"Log Activity - success\",\n\t\t\tquery:         \"log this message\",\n\t\t\twantContent:   []string{\"status:logged\", \"total_entries:1\", \"enhanced:true\"},\n\t\t\twantStateKeys: []string{\"activity_log\"},\n\t\t},\n\t}\n\n\tfor _, tc := range tests {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t// Create a session\n\t\t\tcreateReq := &session.CreateRequest{AppName: \"test_app\", UserID: \"test_user\"}\n\t\t\tcreateResp, err := service.Create(ctx, createReq)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"Failed to create session: %v\", err)\n\t\t\t}\n\t\t\tsessionID := createResp.Session.ID()\n\n\t\t\tuserContent := genai.NewContentFromText(tc.query, genai.RoleUser) // Session ID based on test name\n\t\t\teventStream := r.Run(ctx, \"test_user\", sessionID, userContent, agent.RunConfig{})\n\n\t\t\ttoolResults := collectToolResults(t, eventStream)\n\n\t\t\tif len(toolResults) == 0 {\n\t\t\t\tt.Fatalf(\"Expected tool results, got none\")\n\t\t\t}\n\t\t\tlastResult := toolResults[len(toolResults)-1]\n\n\t\t\t// Check for expected content in the string representation of the result\n\t\t\tresultStr := fmt.Sprintf(\"%v\", lastResult)\n\t\t\tfor _, want := range tc.wantContent {\n\t\t\t\tif !strings.Contains(resultStr, want) {\n\t\t\t\t\tt.Errorf(\"Expected content %q not found in tool result: %s\", want, resultStr)\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor _, dontWant := range tc.dontWantContent {\n\t\t\t\tif strings.Contains(resultStr, dontWant) {\n\t\t\t\t\tt.Errorf(\"Unexpected content %q found in tool result: %s\", dontWant, resultStr)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Check state for log activity\n\t\t\tif len(tc.wantStateKeys) > 0 {\n\t\t\t\tcurrentSession, err := service.Get(context.Background(), &session.GetRequest{\n\t\t\t\t\tAppName:   \"test_app\",\n\t\t\t\t\tUserID:    \"test_user\",\n\t\t\t\t\tSessionID: sessionID,\n\t\t\t\t})\n\t\t\t\tif err != nil {\n\t\t\t\t\tt.Fatalf(\"Failed to get session: %v\", err)\n\t\t\t\t}\n\t\t\t\tfor _, key := range tc.wantStateKeys {\n\t\t\t\t\tif _, err := currentSession.Session.State().Get(key); err != nil {\n\t\t\t\t\t\tt.Errorf(\"Expected key %q not found in session state\", key)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "agent/llmagent/testdata/TestFunctionTool.httprr",
    "content": "httprr trace v1\n980 1354\nPOST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent HTTP/1.1\r\nHost: generativelanguage.googleapis.com\r\nUser-Agent: Go-http-client/1.1\r\nContent-Length: 748\r\nContent-Type: application/json\r\n\r\n{\"contents\":[{\"parts\":[{\"text\":\"what is the sum of 1 + 2?\"}],\"role\":\"user\"}],\"generationConfig\":{},\"systemInstruction\":{\"parts\":[{\"text\":\"IMPORTANT: output ONLY the result computed by the provided function, if the result of 10 + 32 is 42 print only 42\\n\\nYou are an agent. Your internal name is \\\"agent\\\". The description about you is \\\"math agent\\\".\"}],\"role\":\"user\"},\"tools\":[{\"functionDeclarations\":[{\"description\":\"computes the sum of two numbers\",\"name\":\"sum\",\"parametersJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"a\":{\"type\":\"integer\"},\"b\":{\"type\":\"integer\"}},\"required\":[\"a\",\"b\"],\"type\":\"object\"},\"responseJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"sum\":{\"type\":\"integer\"}},\"required\":[\"sum\"],\"type\":\"object\"}}]}]}HTTP/2.0 200 OK\r\nContent-Type: application/json; charset=UTF-8\r\nDate: Tue, 10 Mar 2026 14:57:34 GMT\r\nServer: scaffolding on HTTPServer2\r\nServer-Timing: gfet4t7; dur=922\r\nVary: Origin\r\nVary: X-Origin\r\nVary: Referer\r\nX-Content-Type-Options: nosniff\r\nX-Frame-Options: SAMEORIGIN\r\nX-Xss-Protection: 0\r\n\r\n{\n  \"candidates\": [\n    {\n      \"content\": {\n        \"parts\": [\n          {\n            \"functionCall\": {\n              \"name\": \"sum\",\n              \"args\": {\n                \"a\": 1,\n                \"b\": 2\n              }\n            },\n            \"thoughtSignature\": \"CssBAb4+9vtA0YNySGDhNbWUekpgT0C4JzfoLAMCUxxSlERpI2LVij53p/T9qWJSHxNvQmxdYycF8yf/oRMZ0cnD1wKxww2tYiJpDtgJXwJRLKNaB6YpvNLH7gbW/3Sd2qNzdOlcbbenmh6gYBvjrngYKV8PYSoGj58y7BmJ7bpdwar93Q+wTGQNaeJLQeAJM+KqpF1IB6fZWk4EtotwxKnePkkMgFtwFGYXOZQjhnCudMJprOkORFhhoF4mujrSVU9uqWAIpkhahJn6d2I=\"\n          }\n        ],\n        \"role\": \"model\"\n      },\n      \"finishReason\": \"STOP\",\n      \"index\": 0,\n      \"finishMessage\": \"Model generated function call(s).\"\n    }\n  ],\n  \"usageMetadata\": {\n    \"promptTokenCount\": 155,\n    \"candidatesTokenCount\": 18,\n    \"totalTokenCount\": 223,\n    \"promptTokensDetails\": [\n      {\n        \"modality\": \"TEXT\",\n        \"tokenCount\": 155\n      }\n    ],\n    \"thoughtsTokenCount\": 50\n  },\n  \"modelVersion\": \"gemini-2.5-flash\",\n  \"responseId\": \"XTGwabD8KpaxkdUP3MTwoAk\"\n}\n1442 815\nPOST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent HTTP/1.1\r\nHost: generativelanguage.googleapis.com\r\nUser-Agent: Go-http-client/1.1\r\nContent-Length: 1209\r\nContent-Type: application/json\r\n\r\n{\"contents\":[{\"parts\":[{\"text\":\"what is the sum of 1 + 2?\"}],\"role\":\"user\"},{\"parts\":[{\"functionCall\":{\"args\":{\"a\":1,\"b\":2},\"name\":\"sum\"},\"thoughtSignature\":\"CssBAb4+9vtA0YNySGDhNbWUekpgT0C4JzfoLAMCUxxSlERpI2LVij53p/T9qWJSHxNvQmxdYycF8yf/oRMZ0cnD1wKxww2tYiJpDtgJXwJRLKNaB6YpvNLH7gbW/3Sd2qNzdOlcbbenmh6gYBvjrngYKV8PYSoGj58y7BmJ7bpdwar93Q+wTGQNaeJLQeAJM+KqpF1IB6fZWk4EtotwxKnePkkMgFtwFGYXOZQjhnCudMJprOkORFhhoF4mujrSVU9uqWAIpkhahJn6d2I=\"}],\"role\":\"model\"},{\"parts\":[{\"functionResponse\":{\"name\":\"sum\",\"response\":{\"sum\":3}}}],\"role\":\"user\"}],\"generationConfig\":{},\"systemInstruction\":{\"parts\":[{\"text\":\"IMPORTANT: output ONLY the result computed by the provided function, if the result of 10 + 32 is 42 print only 42\\n\\nYou are an agent. Your internal name is \\\"agent\\\". The description about you is \\\"math agent\\\".\"}],\"role\":\"user\"},\"tools\":[{\"functionDeclarations\":[{\"description\":\"computes the sum of two numbers\",\"name\":\"sum\",\"parametersJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"a\":{\"type\":\"integer\"},\"b\":{\"type\":\"integer\"}},\"required\":[\"a\",\"b\"],\"type\":\"object\"},\"responseJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"sum\":{\"type\":\"integer\"}},\"required\":[\"sum\"],\"type\":\"object\"}}]}]}HTTP/2.0 200 OK\r\nContent-Type: application/json; charset=UTF-8\r\nDate: Tue, 10 Mar 2026 14:57:35 GMT\r\nServer: scaffolding on HTTPServer2\r\nServer-Timing: gfet4t7; dur=571\r\nVary: Origin\r\nVary: X-Origin\r\nVary: Referer\r\nX-Content-Type-Options: nosniff\r\nX-Frame-Options: SAMEORIGIN\r\nX-Xss-Protection: 0\r\n\r\n{\n  \"candidates\": [\n    {\n      \"content\": {\n        \"parts\": [\n          {\n            \"text\": \"3\"\n          }\n        ],\n        \"role\": \"model\"\n      },\n      \"finishReason\": \"STOP\",\n      \"index\": 0\n    }\n  ],\n  \"usageMetadata\": {\n    \"promptTokenCount\": 186,\n    \"candidatesTokenCount\": 1,\n    \"totalTokenCount\": 187,\n    \"promptTokensDetails\": [\n      {\n        \"modality\": \"TEXT\",\n        \"tokenCount\": 186\n      }\n    ]\n  },\n  \"modelVersion\": \"gemini-2.5-flash\",\n  \"responseId\": \"XjGwaaPEI_H3nsEP2v-88AQ\"\n}\n"
  },
  {
    "path": "agent/llmagent/testdata/TestLLMAgentStreamingModeSSE.httprr",
    "content": "httprr trace v1\n648 8944\nPOST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:streamGenerateContent?alt=sse HTTP/1.1\r\nHost: generativelanguage.googleapis.com\r\nUser-Agent: Go-http-client/1.1\r\nContent-Length: 402\r\nContent-Type: application/json\r\n\r\n{\"contents\":[{\"parts\":[{\"text\":\"What is the sum of the first 50 prime numbers?\"}],\"role\":\"user\"}],\"generationConfig\":{\"thinkingConfig\":{\"includeThoughts\":true}},\"systemInstruction\":{\"parts\":[{\"text\":\"Think deep. Always double check the answer before making the conclusion.\\n\\nYou are an agent. Your internal name is \\\"calculator\\\". The description about you is \\\"calculating agent\\\".\"}],\"role\":\"user\"}}HTTP/2.0 200 OK\r\nConnection: close\r\nContent-Disposition: attachment\r\nContent-Type: text/event-stream\r\nDate: Tue, 10 Mar 2026 14:57:56 GMT\r\nServer: scaffolding on HTTPServer2\r\nServer-Timing: gfet4t7; dur=1828\r\nVary: Origin\r\nVary: X-Origin\r\nVary: Referer\r\nX-Content-Type-Options: nosniff\r\nX-Frame-Options: SAMEORIGIN\r\nX-Xss-Protection: 0\r\n\r\ndata: {\"candidates\": [{\"content\": {\"parts\": [{\"text\": \"**Calculating Prime Sum**\\n\\nI've begun working on this problem by identifying the need to sum the first 50 prime numbers. I've started listing them and have got through the first 16. The next step is to compute the rest of the list, verify the number of entries, and then calculate the sum.\\n\\n\\n\",\"thought\": true}],\"role\": \"model\"},\"index\": 0}],\"usageMetadata\": {\"promptTokenCount\": 51,\"totalTokenCount\": 165,\"promptTokensDetails\": [{\"modality\": \"TEXT\",\"tokenCount\": 51}],\"thoughtsTokenCount\": 114},\"modelVersion\": \"gemini-2.5-flash\",\"responseId\": \"cjGwadCGE7yvnsEP3tfsiQk\"}\r\n\r\ndata: {\"candidates\": [{\"content\": {\"parts\": [{\"text\": \"**Summing Prime Numbers**\\n\\nI've completed the list of the first 50 prime numbers and meticulously summed them in groups of ten. After verifying each subtotal, I've calculated the final sum, which I believe is 5117. I'll double-check everything, including the list and the sums.\\n\\n\\n\",\"thought\": true}],\"role\": \"model\"},\"index\": 0}],\"usageMetadata\": {\"promptTokenCount\": 51,\"totalTokenCount\": 896,\"promptTokensDetails\": [{\"modality\": \"TEXT\",\"tokenCount\": 51}],\"thoughtsTokenCount\": 845},\"modelVersion\": \"gemini-2.5-flash\",\"responseId\": \"cjGwadCGE7yvnsEP3tfsiQk\"}\r\n\r\ndata: {\"candidates\": [{\"content\": {\"parts\": [{\"text\": \"**Verifying Prime Sum**\\n\\nI've meticulously recalculated the sum of the first 50 prime numbers to confirm my previous total. After a careful re-evaluation of the list and individual group sums, I can confidently confirm that the total is indeed 5117. The analysis has concluded, and I stand by my answer.\\n\\n\\n\",\"thought\": true}],\"role\": \"model\"},\"index\": 0}],\"usageMetadata\": {\"promptTokenCount\": 51,\"totalTokenCount\": 1285,\"promptTokensDetails\": [{\"modality\": \"TEXT\",\"tokenCount\": 51}],\"thoughtsTokenCount\": 1234},\"modelVersion\": \"gemini-2.5-flash\",\"responseId\": \"cjGwadCGE7yvnsEP3tfsiQk\"}\r\n\r\ndata: {\"candidates\": [{\"content\": {\"parts\": [{\"text\": \"To find the sum of the first 50 prime numbers, I first need to list them and then add them up.\\n\\nThe first 50 prime numbers are:\\n1.  2\\n2.  3\\n3\"}],\"role\": \"model\"},\"index\": 0}],\"usageMetadata\": {\"promptTokenCount\": 51,\"candidatesTokenCount\": 44,\"totalTokenCount\": 1329,\"promptTokensDetails\": [{\"modality\": \"TEXT\",\"tokenCount\": 51}],\"thoughtsTokenCount\": 1234},\"modelVersion\": \"gemini-2.5-flash\",\"responseId\": \"cjGwadCGE7yvnsEP3tfsiQk\"}\r\n\r\ndata: {\"candidates\": [{\"content\": {\"parts\": [{\"text\": \".  5\\n4.  7\\n5.  11\\n6.  13\\n7.  17\\n8.  19\\n9.  23\\n10. 29\\n11\"}],\"role\": \"model\"},\"index\": 0}],\"usageMetadata\": {\"promptTokenCount\": 51,\"candidatesTokenCount\": 92,\"totalTokenCount\": 1377,\"promptTokensDetails\": [{\"modality\": \"TEXT\",\"tokenCount\": 51}],\"thoughtsTokenCount\": 1234},\"modelVersion\": \"gemini-2.5-flash\",\"responseId\": \"cjGwadCGE7yvnsEP3tfsiQk\"}\r\n\r\ndata: {\"candidates\": [{\"content\": {\"parts\": [{\"text\": \". 31\\n12. 37\\n13. 41\\n14. 43\\n15. 47\\n16. 53\\n17. 59\\n1\"}],\"role\": \"model\"},\"index\": 0}],\"usageMetadata\": {\"promptTokenCount\": 51,\"candidatesTokenCount\": 140,\"totalTokenCount\": 1425,\"promptTokensDetails\": [{\"modality\": \"TEXT\",\"tokenCount\": 51}],\"thoughtsTokenCount\": 1234},\"modelVersion\": \"gemini-2.5-flash\",\"responseId\": \"cjGwadCGE7yvnsEP3tfsiQk\"}\r\n\r\ndata: {\"candidates\": [{\"content\": {\"parts\": [{\"text\": \"8. 61\\n19. 67\\n20. 71\\n21. 73\\n22. 79\\n23. 83\\n24. 89\\n\"}],\"role\": \"model\"},\"index\": 0}],\"usageMetadata\": {\"promptTokenCount\": 51,\"candidatesTokenCount\": 187,\"totalTokenCount\": 1472,\"promptTokensDetails\": [{\"modality\": \"TEXT\",\"tokenCount\": 51}],\"thoughtsTokenCount\": 1234},\"modelVersion\": \"gemini-2.5-flash\",\"responseId\": \"cjGwadCGE7yvnsEP3tfsiQk\"}\r\n\r\ndata: {\"candidates\": [{\"content\": {\"parts\": [{\"text\": \"25. 97\\n26. 101\\n27. 103\\n28. 107\\n29. 109\\n30. 113\\n3\"}],\"role\": \"model\"},\"index\": 0}],\"usageMetadata\": {\"promptTokenCount\": 51,\"candidatesTokenCount\": 235,\"totalTokenCount\": 1520,\"promptTokensDetails\": [{\"modality\": \"TEXT\",\"tokenCount\": 51}],\"thoughtsTokenCount\": 1234},\"modelVersion\": \"gemini-2.5-flash\",\"responseId\": \"cjGwadCGE7yvnsEP3tfsiQk\"}\r\n\r\ndata: {\"candidates\": [{\"content\": {\"parts\": [{\"text\": \"1. 127\\n32. 131\\n33. 137\\n34. 139\\n35. 149\\n36. 151\\n3\"}],\"role\": \"model\"},\"index\": 0}],\"usageMetadata\": {\"promptTokenCount\": 51,\"candidatesTokenCount\": 283,\"totalTokenCount\": 1568,\"promptTokensDetails\": [{\"modality\": \"TEXT\",\"tokenCount\": 51}],\"thoughtsTokenCount\": 1234},\"modelVersion\": \"gemini-2.5-flash\",\"responseId\": \"cjGwadCGE7yvnsEP3tfsiQk\"}\r\n\r\ndata: {\"candidates\": [{\"content\": {\"parts\": [{\"text\": \"7. 157\\n38. 163\\n39. 167\\n40. 173\\n41. 179\\n42. 181\\n4\"}],\"role\": \"model\"},\"index\": 0}],\"usageMetadata\": {\"promptTokenCount\": 51,\"candidatesTokenCount\": 331,\"totalTokenCount\": 1616,\"promptTokensDetails\": [{\"modality\": \"TEXT\",\"tokenCount\": 51}],\"thoughtsTokenCount\": 1234},\"modelVersion\": \"gemini-2.5-flash\",\"responseId\": \"cjGwadCGE7yvnsEP3tfsiQk\"}\r\n\r\ndata: {\"candidates\": [{\"content\": {\"parts\": [{\"text\": \"3. 191\\n44. 193\\n45. 197\\n46. 199\\n47. 211\\n48. 223\\n4\"}],\"role\": \"model\"},\"index\": 0}],\"usageMetadata\": {\"promptTokenCount\": 51,\"candidatesTokenCount\": 379,\"totalTokenCount\": 1664,\"promptTokensDetails\": [{\"modality\": \"TEXT\",\"tokenCount\": 51}],\"thoughtsTokenCount\": 1234},\"modelVersion\": \"gemini-2.5-flash\",\"responseId\": \"cjGwadCGE7yvnsEP3tfsiQk\"}\r\n\r\ndata: {\"candidates\": [{\"content\": {\"parts\": [{\"text\": \"9. 227\\n50. 229\\n\\nNow, let's sum them:\\nSum (1-10) = 2 + 3 + 5 + 7 + 11 + 13\"}],\"role\": \"model\"},\"index\": 0}],\"usageMetadata\": {\"promptTokenCount\": 51,\"candidatesTokenCount\": 430,\"totalTokenCount\": 1715,\"promptTokensDetails\": [{\"modality\": \"TEXT\",\"tokenCount\": 51}],\"thoughtsTokenCount\": 1234},\"modelVersion\": \"gemini-2.5-flash\",\"responseId\": \"cjGwadCGE7yvnsEP3tfsiQk\"}\r\n\r\ndata: {\"candidates\": [{\"content\": {\"parts\": [{\"text\": \" + 17 + 19 + 23 + 29 = 129\\nSum (11-20) = 31 + 37 + 41 + 43 + \"}],\"role\": \"model\"},\"index\": 0}],\"usageMetadata\": {\"promptTokenCount\": 51,\"candidatesTokenCount\": 477,\"totalTokenCount\": 1762,\"promptTokensDetails\": [{\"modality\": \"TEXT\",\"tokenCount\": 51}],\"thoughtsTokenCount\": 1234},\"modelVersion\": \"gemini-2.5-flash\",\"responseId\": \"cjGwadCGE7yvnsEP3tfsiQk\"}\r\n\r\ndata: {\"candidates\": [{\"content\": {\"parts\": [{\"text\": \"47 + 53 + 59 + 61 + 67 + 71 = 510\\nSum (21-30) = 73 + 79 + 83\"}],\"role\": \"model\"},\"index\": 0}],\"usageMetadata\": {\"promptTokenCount\": 51,\"candidatesTokenCount\": 525,\"totalTokenCount\": 1810,\"promptTokensDetails\": [{\"modality\": \"TEXT\",\"tokenCount\": 51}],\"thoughtsTokenCount\": 1234},\"modelVersion\": \"gemini-2.5-flash\",\"responseId\": \"cjGwadCGE7yvnsEP3tfsiQk\"}\r\n\r\ndata: {\"candidates\": [{\"content\": {\"parts\": [{\"text\": \" + 89 + 97 + 101 + 103 + 107 + 109 + 113 = 954\\nSum (31-40) =\"}],\"role\": \"model\"},\"index\": 0}],\"usageMetadata\": {\"promptTokenCount\": 51,\"candidatesTokenCount\": 573,\"totalTokenCount\": 1858,\"promptTokensDetails\": [{\"modality\": \"TEXT\",\"tokenCount\": 51}],\"thoughtsTokenCount\": 1234},\"modelVersion\": \"gemini-2.5-flash\",\"responseId\": \"cjGwadCGE7yvnsEP3tfsiQk\"}\r\n\r\ndata: {\"candidates\": [{\"content\": {\"parts\": [{\"text\": \" 127 + 131 + 137 + 139 + 149 + 151 + 157 + 163 + 167 + 17\"}],\"role\": \"model\"},\"index\": 0}],\"usageMetadata\": {\"promptTokenCount\": 51,\"candidatesTokenCount\": 620,\"totalTokenCount\": 1905,\"promptTokensDetails\": [{\"modality\": \"TEXT\",\"tokenCount\": 51}],\"thoughtsTokenCount\": 1234},\"modelVersion\": \"gemini-2.5-flash\",\"responseId\": \"cjGwadCGE7yvnsEP3tfsiQk\"}\r\n\r\ndata: {\"candidates\": [{\"content\": {\"parts\": [{\"text\": \"3 = 1494\\nSum (41-50) = 179 + 181 + 191 + 193 + 197 + 199 + \"}],\"role\": \"model\"},\"index\": 0}],\"usageMetadata\": {\"promptTokenCount\": 51,\"candidatesTokenCount\": 667,\"totalTokenCount\": 1952,\"promptTokensDetails\": [{\"modality\": \"TEXT\",\"tokenCount\": 51}],\"thoughtsTokenCount\": 1234},\"modelVersion\": \"gemini-2.5-flash\",\"responseId\": \"cjGwadCGE7yvnsEP3tfsiQk\"}\r\n\r\ndata: {\"candidates\": [{\"content\": {\"parts\": [{\"text\": \"211 + 223 + 227 + 229 = 2030\\n\\nTotal Sum = 129 + 510 + 954 + 1494\"}],\"role\": \"model\"},\"index\": 0}],\"usageMetadata\": {\"promptTokenCount\": 51,\"candidatesTokenCount\": 715,\"totalTokenCount\": 2000,\"promptTokensDetails\": [{\"modality\": \"TEXT\",\"tokenCount\": 51}],\"thoughtsTokenCount\": 1234},\"modelVersion\": \"gemini-2.5-flash\",\"responseId\": \"cjGwadCGE7yvnsEP3tfsiQk\"}\r\n\r\ndata: {\"candidates\": [{\"content\": {\"parts\": [{\"text\": \" + 2030 = 5117\\n\\nThe sum of the first 50 prime numbers is 5117.\"}],\"role\": \"model\"},\"finishReason\": \"STOP\",\"index\": 0}],\"usageMetadata\": {\"promptTokenCount\": 51,\"candidatesTokenCount\": 745,\"totalTokenCount\": 2030,\"promptTokensDetails\": [{\"modality\": \"TEXT\",\"tokenCount\": 51}],\"thoughtsTokenCount\": 1234},\"modelVersion\": \"gemini-2.5-flash\",\"responseId\": \"cjGwadCGE7yvnsEP3tfsiQk\"}\r\n\r\n"
  },
  {
    "path": "agent/llmagent/testdata/TestLLMAgent_healthy_backend.httprr",
    "content": "httprr trace v1\n618 845\nPOST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent HTTP/1.1\r\nHost: generativelanguage.googleapis.com\r\nUser-Agent: Go-http-client/1.1\r\nContent-Length: 386\r\nContent-Type: application/json\r\n\r\n{\"contents\":[{\"parts\":[{\"text\":\"Handle the requests as specified in the System Instruction.\"}],\"role\":\"user\"}],\"generationConfig\":{},\"systemInstruction\":{\"parts\":[{\"text\":\"Answer as precisely as possible.\\n\\nRoll the dice and report only the result.\\n\\nYou are an agent. Your internal name is \\\"hello_world_agent\\\". The description about you is \\\"hello world agent\\\".\"}],\"role\":\"user\"}}HTTP/2.0 200 OK\r\nContent-Type: application/json; charset=UTF-8\r\nDate: Tue, 10 Mar 2026 14:58:30 GMT\r\nServer: scaffolding on HTTPServer2\r\nServer-Timing: gfet4t7; dur=1591\r\nVary: Origin\r\nVary: X-Origin\r\nVary: Referer\r\nX-Content-Type-Options: nosniff\r\nX-Frame-Options: SAMEORIGIN\r\nX-Xss-Protection: 0\r\n\r\n{\n  \"candidates\": [\n    {\n      \"content\": {\n        \"parts\": [\n          {\n            \"text\": \"4\"\n          }\n        ],\n        \"role\": \"model\"\n      },\n      \"finishReason\": \"STOP\",\n      \"index\": 0\n    }\n  ],\n  \"usageMetadata\": {\n    \"promptTokenCount\": 55,\n    \"candidatesTokenCount\": 1,\n    \"totalTokenCount\": 307,\n    \"promptTokensDetails\": [\n      {\n        \"modality\": \"TEXT\",\n        \"tokenCount\": 55\n      }\n    ],\n    \"thoughtsTokenCount\": 251\n  },\n  \"modelVersion\": \"gemini-2.5-flash\",\n  \"responseId\": \"lDGwaarTJd-unsEP-NWk0QU\"\n}\n"
  },
  {
    "path": "agent/llmagent/testdata/TestToolCallback_after_callback_response_used.httprr",
    "content": "httprr trace v1\n976 1549\nPOST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent HTTP/1.1\r\nHost: generativelanguage.googleapis.com\r\nUser-Agent: Go-http-client/1.1\r\nContent-Length: 744\r\nContent-Type: application/json\r\n\r\n{\"contents\":[{\"parts\":[{\"text\":\"Generate random number with 5 as a seed.\"}],\"role\":\"user\"}],\"generationConfig\":{},\"systemInstruction\":{\"parts\":[{\"text\":\"IMPORTANT: output ONLY the result computed by the provided function, if the result is number:42 print only 42\\n\\nYou are an agent. Your internal name is \\\"agent\\\". The description about you is \\\"random agent\\\".\"}],\"role\":\"user\"},\"tools\":[{\"functionDeclarations\":[{\"description\":\"returns random number\",\"name\":\"rand_number\",\"parametersJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"seed\":{\"type\":\"integer\"}},\"required\":[\"seed\"],\"type\":\"object\"},\"responseJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"number\":{\"type\":\"integer\"}},\"required\":[\"number\"],\"type\":\"object\"}}]}]}HTTP/2.0 200 OK\r\nContent-Type: application/json; charset=UTF-8\r\nDate: Tue, 10 Mar 2026 14:52:41 GMT\r\nServer: scaffolding on HTTPServer2\r\nServer-Timing: gfet4t7; dur=718\r\nVary: Origin\r\nVary: X-Origin\r\nVary: Referer\r\nX-Content-Type-Options: nosniff\r\nX-Frame-Options: SAMEORIGIN\r\nX-Xss-Protection: 0\r\n\r\n{\n  \"candidates\": [\n    {\n      \"content\": {\n        \"parts\": [\n          {\n            \"functionCall\": {\n              \"name\": \"rand_number\",\n              \"args\": {\n                \"seed\": 5\n              }\n            },\n            \"thoughtSignature\": \"CugCAb4+9vvc6qwu6MEzNuTOUy3EF0pFEtUyVr37qpYQ8/yuGK1RAiRRUl86Myw+fwxbjZ1tY0w2LBDFZxmUZlUStf8C0ccspZu9BQ1qi1C4NQEMQ1JyVTMoeR+T+rCmc9i6/VNR8MC2Yz4cU+o9pKP8wxDJejRGLvrXCjN4JSbhDf97qFRrtAoYtU834NexLmcQJG6RCSPLc0TL8AYVbwrKyiH5qgItuLnpbnbUlrwHzBZeZeyYigBqXbR2nQRCGeflVJ1Hi0n75B1hSbbdDKu6CkzDIWcNBzU9y7xJjv5Kt4J0EhzqZys4e2NZUKFfFhxGssQ5h/1GX+vtAlG0AJ9KzRg6yr5tsMW1RhibbVfMa8J/HkMouTz1pUMbbd9zTIBiEM1GGjIGTPjeMKeVSNyYRgYuHguwMbhy6lnB8xG0XI+MCPKyxAHLMJ47Fx+o3wvT3iRaDbzoAEnBxIEa+los8uM9QSAHAsJ6\"\n          }\n        ],\n        \"role\": \"model\"\n      },\n      \"finishReason\": \"STOP\",\n      \"index\": 0,\n      \"finishMessage\": \"Model generated function call(s).\"\n    }\n  ],\n  \"usageMetadata\": {\n    \"promptTokenCount\": 136,\n    \"candidatesTokenCount\": 15,\n    \"totalTokenCount\": 227,\n    \"promptTokensDetails\": [\n      {\n        \"modality\": \"TEXT\",\n        \"tokenCount\": 136\n      }\n    ],\n    \"thoughtsTokenCount\": 76\n  },\n  \"modelVersion\": \"gemini-2.5-flash\",\n  \"responseId\": \"ODCwaZyQMcuXkdUP28zB2As\"\n}\n1664 815\nPOST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent HTTP/1.1\r\nHost: generativelanguage.googleapis.com\r\nUser-Agent: Go-http-client/1.1\r\nContent-Length: 1431\r\nContent-Type: application/json\r\n\r\n{\"contents\":[{\"parts\":[{\"text\":\"Generate random number with 5 as a seed.\"}],\"role\":\"user\"},{\"parts\":[{\"functionCall\":{\"args\":{\"seed\":5},\"name\":\"rand_number\"},\"thoughtSignature\":\"CugCAb4+9vvc6qwu6MEzNuTOUy3EF0pFEtUyVr37qpYQ8/yuGK1RAiRRUl86Myw+fwxbjZ1tY0w2LBDFZxmUZlUStf8C0ccspZu9BQ1qi1C4NQEMQ1JyVTMoeR+T+rCmc9i6/VNR8MC2Yz4cU+o9pKP8wxDJejRGLvrXCjN4JSbhDf97qFRrtAoYtU834NexLmcQJG6RCSPLc0TL8AYVbwrKyiH5qgItuLnpbnbUlrwHzBZeZeyYigBqXbR2nQRCGeflVJ1Hi0n75B1hSbbdDKu6CkzDIWcNBzU9y7xJjv5Kt4J0EhzqZys4e2NZUKFfFhxGssQ5h/1GX+vtAlG0AJ9KzRg6yr5tsMW1RhibbVfMa8J/HkMouTz1pUMbbd9zTIBiEM1GGjIGTPjeMKeVSNyYRgYuHguwMbhy6lnB8xG0XI+MCPKyxAHLMJ47Fx+o3wvT3iRaDbzoAEnBxIEa+los8uM9QSAHAsJ6\"}],\"role\":\"model\"},{\"parts\":[{\"functionResponse\":{\"name\":\"rand_number\",\"response\":{\"number\":\"7\"}}}],\"role\":\"user\"}],\"generationConfig\":{},\"systemInstruction\":{\"parts\":[{\"text\":\"IMPORTANT: output ONLY the result computed by the provided function, if the result is number:42 print only 42\\n\\nYou are an agent. Your internal name is \\\"agent\\\". The description about you is \\\"random agent\\\".\"}],\"role\":\"user\"},\"tools\":[{\"functionDeclarations\":[{\"description\":\"returns random number\",\"name\":\"rand_number\",\"parametersJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"seed\":{\"type\":\"integer\"}},\"required\":[\"seed\"],\"type\":\"object\"},\"responseJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"number\":{\"type\":\"integer\"}},\"required\":[\"number\"],\"type\":\"object\"}}]}]}HTTP/2.0 200 OK\r\nContent-Type: application/json; charset=UTF-8\r\nDate: Tue, 10 Mar 2026 14:52:41 GMT\r\nServer: scaffolding on HTTPServer2\r\nServer-Timing: gfet4t7; dur=424\r\nVary: Origin\r\nVary: X-Origin\r\nVary: Referer\r\nX-Content-Type-Options: nosniff\r\nX-Frame-Options: SAMEORIGIN\r\nX-Xss-Protection: 0\r\n\r\n{\n  \"candidates\": [\n    {\n      \"content\": {\n        \"parts\": [\n          {\n            \"text\": \"7\"\n          }\n        ],\n        \"role\": \"model\"\n      },\n      \"finishReason\": \"STOP\",\n      \"index\": 0\n    }\n  ],\n  \"usageMetadata\": {\n    \"promptTokenCount\": 166,\n    \"candidatesTokenCount\": 1,\n    \"totalTokenCount\": 167,\n    \"promptTokensDetails\": [\n      {\n        \"modality\": \"TEXT\",\n        \"tokenCount\": 166\n      }\n    ]\n  },\n  \"modelVersion\": \"gemini-2.5-flash\",\n  \"responseId\": \"OTCwaZKPIPetkdUPqpmhqAo\"\n}\n"
  },
  {
    "path": "agent/llmagent/testdata/TestToolCallback_after_callback_returned_when_used_with_before_callback.httprr",
    "content": "httprr trace v1\n976 1421\nPOST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent HTTP/1.1\r\nHost: generativelanguage.googleapis.com\r\nUser-Agent: Go-http-client/1.1\r\nContent-Length: 744\r\nContent-Type: application/json\r\n\r\n{\"contents\":[{\"parts\":[{\"text\":\"Generate random number with 5 as a seed.\"}],\"role\":\"user\"}],\"generationConfig\":{},\"systemInstruction\":{\"parts\":[{\"text\":\"IMPORTANT: output ONLY the result computed by the provided function, if the result is number:42 print only 42\\n\\nYou are an agent. Your internal name is \\\"agent\\\". The description about you is \\\"random agent\\\".\"}],\"role\":\"user\"},\"tools\":[{\"functionDeclarations\":[{\"description\":\"returns random number\",\"name\":\"rand_number\",\"parametersJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"seed\":{\"type\":\"integer\"}},\"required\":[\"seed\"],\"type\":\"object\"},\"responseJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"number\":{\"type\":\"integer\"}},\"required\":[\"number\"],\"type\":\"object\"}}]}]}HTTP/2.0 200 OK\r\nContent-Type: application/json; charset=UTF-8\r\nDate: Tue, 10 Mar 2026 14:52:43 GMT\r\nServer: scaffolding on HTTPServer2\r\nServer-Timing: gfet4t7; dur=892\r\nVary: Origin\r\nVary: X-Origin\r\nVary: Referer\r\nX-Content-Type-Options: nosniff\r\nX-Frame-Options: SAMEORIGIN\r\nX-Xss-Protection: 0\r\n\r\n{\n  \"candidates\": [\n    {\n      \"content\": {\n        \"parts\": [\n          {\n            \"functionCall\": {\n              \"name\": \"rand_number\",\n              \"args\": {\n                \"seed\": 5\n              }\n            },\n            \"thoughtSignature\": \"CocCAb4+9vv9wlY80xSDfuzL9q9YBrF9gdbHJPZHEXYbFB0XmIsbwvlhcgZTx2xURUhbbR+iWGuRdMDEWnRUchz2tDC5kpM+JbGVrjWjgagjIIiQCtrlMGaTlHGXCVFUc4uRWsEUev+dT+nlBuqsZNtfhPXfcYzk4/3eQ2Z9zCWc5H7Gca5YHfPTyYpNzJFGWtuubZsGx5/QGbmYefWo5eMf5DJOsz199Qc9rWKk/esbeKMkITuHSditSKP/+vNfbXQ+XRvvtCgJ2z+9r3veipFmUXOYTmzT+HJoMKSwFyFSQ/PuKTN3irHIrYJnHq+riKyRSkcVCFRDrFt2lAsDDptJck4dZFZuMKk=\"\n          }\n        ],\n        \"role\": \"model\"\n      },\n      \"finishReason\": \"STOP\",\n      \"index\": 0,\n      \"finishMessage\": \"Model generated function call(s).\"\n    }\n  ],\n  \"usageMetadata\": {\n    \"promptTokenCount\": 136,\n    \"candidatesTokenCount\": 15,\n    \"totalTokenCount\": 211,\n    \"promptTokensDetails\": [\n      {\n        \"modality\": \"TEXT\",\n        \"tokenCount\": 136\n      }\n    ],\n    \"thoughtsTokenCount\": 60\n  },\n  \"modelVersion\": \"gemini-2.5-flash\",\n  \"responseId\": \"OzCwaZDsA9aCkdUP0bmRyAU\"\n}\n1536 815\nPOST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent HTTP/1.1\r\nHost: generativelanguage.googleapis.com\r\nUser-Agent: Go-http-client/1.1\r\nContent-Length: 1303\r\nContent-Type: application/json\r\n\r\n{\"contents\":[{\"parts\":[{\"text\":\"Generate random number with 5 as a seed.\"}],\"role\":\"user\"},{\"parts\":[{\"functionCall\":{\"args\":{\"seed\":5},\"name\":\"rand_number\"},\"thoughtSignature\":\"CocCAb4+9vv9wlY80xSDfuzL9q9YBrF9gdbHJPZHEXYbFB0XmIsbwvlhcgZTx2xURUhbbR+iWGuRdMDEWnRUchz2tDC5kpM+JbGVrjWjgagjIIiQCtrlMGaTlHGXCVFUc4uRWsEUev+dT+nlBuqsZNtfhPXfcYzk4/3eQ2Z9zCWc5H7Gca5YHfPTyYpNzJFGWtuubZsGx5/QGbmYefWo5eMf5DJOsz199Qc9rWKk/esbeKMkITuHSditSKP/+vNfbXQ+XRvvtCgJ2z+9r3veipFmUXOYTmzT+HJoMKSwFyFSQ/PuKTN3irHIrYJnHq+riKyRSkcVCFRDrFt2lAsDDptJck4dZFZuMKk=\"}],\"role\":\"model\"},{\"parts\":[{\"functionResponse\":{\"name\":\"rand_number\",\"response\":{\"number\":\"7\"}}}],\"role\":\"user\"}],\"generationConfig\":{},\"systemInstruction\":{\"parts\":[{\"text\":\"IMPORTANT: output ONLY the result computed by the provided function, if the result is number:42 print only 42\\n\\nYou are an agent. Your internal name is \\\"agent\\\". The description about you is \\\"random agent\\\".\"}],\"role\":\"user\"},\"tools\":[{\"functionDeclarations\":[{\"description\":\"returns random number\",\"name\":\"rand_number\",\"parametersJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"seed\":{\"type\":\"integer\"}},\"required\":[\"seed\"],\"type\":\"object\"},\"responseJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"number\":{\"type\":\"integer\"}},\"required\":[\"number\"],\"type\":\"object\"}}]}]}HTTP/2.0 200 OK\r\nContent-Type: application/json; charset=UTF-8\r\nDate: Tue, 10 Mar 2026 14:52:44 GMT\r\nServer: scaffolding on HTTPServer2\r\nServer-Timing: gfet4t7; dur=293\r\nVary: Origin\r\nVary: X-Origin\r\nVary: Referer\r\nX-Content-Type-Options: nosniff\r\nX-Frame-Options: SAMEORIGIN\r\nX-Xss-Protection: 0\r\n\r\n{\n  \"candidates\": [\n    {\n      \"content\": {\n        \"parts\": [\n          {\n            \"text\": \"7\"\n          }\n        ],\n        \"role\": \"model\"\n      },\n      \"finishReason\": \"STOP\",\n      \"index\": 0\n    }\n  ],\n  \"usageMetadata\": {\n    \"promptTokenCount\": 166,\n    \"candidatesTokenCount\": 1,\n    \"totalTokenCount\": 167,\n    \"promptTokensDetails\": [\n      {\n        \"modality\": \"TEXT\",\n        \"tokenCount\": 166\n      }\n    ]\n  },\n  \"modelVersion\": \"gemini-2.5-flash\",\n  \"responseId\": \"OzCwacXGOoaSkdUP-9_n2AY\"\n}\n"
  },
  {
    "path": "agent/llmagent/testdata/TestToolCallback_before_callback_response_used.httprr",
    "content": "httprr trace v1\n976 1409\nPOST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent HTTP/1.1\r\nHost: generativelanguage.googleapis.com\r\nUser-Agent: Go-http-client/1.1\r\nContent-Length: 744\r\nContent-Type: application/json\r\n\r\n{\"contents\":[{\"parts\":[{\"text\":\"Generate random number with 5 as a seed.\"}],\"role\":\"user\"}],\"generationConfig\":{},\"systemInstruction\":{\"parts\":[{\"text\":\"IMPORTANT: output ONLY the result computed by the provided function, if the result is number:42 print only 42\\n\\nYou are an agent. Your internal name is \\\"agent\\\". The description about you is \\\"random agent\\\".\"}],\"role\":\"user\"},\"tools\":[{\"functionDeclarations\":[{\"description\":\"returns random number\",\"name\":\"rand_number\",\"parametersJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"seed\":{\"type\":\"integer\"}},\"required\":[\"seed\"],\"type\":\"object\"},\"responseJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"number\":{\"type\":\"integer\"}},\"required\":[\"number\"],\"type\":\"object\"}}]}]}HTTP/2.0 200 OK\r\nContent-Type: application/json; charset=UTF-8\r\nDate: Tue, 10 Mar 2026 14:52:38 GMT\r\nServer: scaffolding on HTTPServer2\r\nServer-Timing: gfet4t7; dur=748\r\nVary: Origin\r\nVary: X-Origin\r\nVary: Referer\r\nX-Content-Type-Options: nosniff\r\nX-Frame-Options: SAMEORIGIN\r\nX-Xss-Protection: 0\r\n\r\n{\n  \"candidates\": [\n    {\n      \"content\": {\n        \"parts\": [\n          {\n            \"functionCall\": {\n              \"name\": \"rand_number\",\n              \"args\": {\n                \"seed\": 5\n              }\n            },\n            \"thoughtSignature\": \"Cv8BAb4+9vuiCXHA/S86tz6TiLryf5JZFA9pTP3tL02lJv+TF5DWLOtEaJpS8P0rvuk2jZWguCVmx+Z3PIFjeIa7RYJ4AuD3a4smR+uR3YAvVwCllB5kEKRx/d/g8kmv4tF/jPs6hO+gmBt90w35pXK9POe6+Upau7SuZtxksrflBCOTU19sibNANn39YhfptRt+t1edh9IJkV1llXya00beEMLgm+54shIz27aZ1vPnVazcrYgvvyukU/ayo4jZJDts8Of63PVVG8dgFKXMJEUHiN9Z708mC/5WMhAsJqqVqs4BWddausRNVcnLPH9d6oCXkwT095HXzUQlY/srI1tY\"\n          }\n        ],\n        \"role\": \"model\"\n      },\n      \"finishReason\": \"STOP\",\n      \"index\": 0,\n      \"finishMessage\": \"Model generated function call(s).\"\n    }\n  ],\n  \"usageMetadata\": {\n    \"promptTokenCount\": 136,\n    \"candidatesTokenCount\": 15,\n    \"totalTokenCount\": 207,\n    \"promptTokensDetails\": [\n      {\n        \"modality\": \"TEXT\",\n        \"tokenCount\": 136\n      }\n    ],\n    \"thoughtsTokenCount\": 56\n  },\n  \"modelVersion\": \"gemini-2.5-flash\",\n  \"responseId\": \"NTCwaeWwNp7tkdUPt6evsAU\"\n}\n1524 815\nPOST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent HTTP/1.1\r\nHost: generativelanguage.googleapis.com\r\nUser-Agent: Go-http-client/1.1\r\nContent-Length: 1291\r\nContent-Type: application/json\r\n\r\n{\"contents\":[{\"parts\":[{\"text\":\"Generate random number with 5 as a seed.\"}],\"role\":\"user\"},{\"parts\":[{\"functionCall\":{\"args\":{\"seed\":5},\"name\":\"rand_number\"},\"thoughtSignature\":\"Cv8BAb4+9vuiCXHA/S86tz6TiLryf5JZFA9pTP3tL02lJv+TF5DWLOtEaJpS8P0rvuk2jZWguCVmx+Z3PIFjeIa7RYJ4AuD3a4smR+uR3YAvVwCllB5kEKRx/d/g8kmv4tF/jPs6hO+gmBt90w35pXK9POe6+Upau7SuZtxksrflBCOTU19sibNANn39YhfptRt+t1edh9IJkV1llXya00beEMLgm+54shIz27aZ1vPnVazcrYgvvyukU/ayo4jZJDts8Of63PVVG8dgFKXMJEUHiN9Z708mC/5WMhAsJqqVqs4BWddausRNVcnLPH9d6oCXkwT095HXzUQlY/srI1tY\"}],\"role\":\"model\"},{\"parts\":[{\"functionResponse\":{\"name\":\"rand_number\",\"response\":{\"number\":\"7\"}}}],\"role\":\"user\"}],\"generationConfig\":{},\"systemInstruction\":{\"parts\":[{\"text\":\"IMPORTANT: output ONLY the result computed by the provided function, if the result is number:42 print only 42\\n\\nYou are an agent. Your internal name is \\\"agent\\\". The description about you is \\\"random agent\\\".\"}],\"role\":\"user\"},\"tools\":[{\"functionDeclarations\":[{\"description\":\"returns random number\",\"name\":\"rand_number\",\"parametersJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"seed\":{\"type\":\"integer\"}},\"required\":[\"seed\"],\"type\":\"object\"},\"responseJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"number\":{\"type\":\"integer\"}},\"required\":[\"number\"],\"type\":\"object\"}}]}]}HTTP/2.0 200 OK\r\nContent-Type: application/json; charset=UTF-8\r\nDate: Tue, 10 Mar 2026 14:52:39 GMT\r\nServer: scaffolding on HTTPServer2\r\nServer-Timing: gfet4t7; dur=394\r\nVary: Origin\r\nVary: X-Origin\r\nVary: Referer\r\nX-Content-Type-Options: nosniff\r\nX-Frame-Options: SAMEORIGIN\r\nX-Xss-Protection: 0\r\n\r\n{\n  \"candidates\": [\n    {\n      \"content\": {\n        \"parts\": [\n          {\n            \"text\": \"7\"\n          }\n        ],\n        \"role\": \"model\"\n      },\n      \"finishReason\": \"STOP\",\n      \"index\": 0\n    }\n  ],\n  \"usageMetadata\": {\n    \"promptTokenCount\": 166,\n    \"candidatesTokenCount\": 1,\n    \"totalTokenCount\": 167,\n    \"promptTokensDetails\": [\n      {\n        \"modality\": \"TEXT\",\n        \"tokenCount\": 166\n      }\n    ]\n  },\n  \"modelVersion\": \"gemini-2.5-flash\",\n  \"responseId\": \"NjCwafbaJ4enkdUP4qubqAk\"\n}\n"
  },
  {
    "path": "agent/llmagent/testdata/TestToolCallback_both_callbacks_return_nil_actual_tool_is_executed.httprr",
    "content": "httprr trace v1\n976 1566\nPOST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent HTTP/1.1\r\nHost: generativelanguage.googleapis.com\r\nUser-Agent: Go-http-client/1.1\r\nContent-Length: 744\r\nContent-Type: application/json\r\n\r\n{\"contents\":[{\"parts\":[{\"text\":\"Generate random number with 5 as a seed.\"}],\"role\":\"user\"}],\"generationConfig\":{},\"systemInstruction\":{\"parts\":[{\"text\":\"IMPORTANT: output ONLY the result computed by the provided function, if the result is number:42 print only 42\\n\\nYou are an agent. Your internal name is \\\"agent\\\". The description about you is \\\"random agent\\\".\"}],\"role\":\"user\"},\"tools\":[{\"functionDeclarations\":[{\"description\":\"returns random number\",\"name\":\"rand_number\",\"parametersJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"seed\":{\"type\":\"integer\"}},\"required\":[\"seed\"],\"type\":\"object\"},\"responseJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"number\":{\"type\":\"integer\"}},\"required\":[\"number\"],\"type\":\"object\"}}]}]}HTTP/2.0 200 OK\r\nContent-Type: application/json; charset=UTF-8\r\nDate: Tue, 10 Mar 2026 14:52:45 GMT\r\nServer: scaffolding on HTTPServer2\r\nServer-Timing: gfet4t7; dur=1149\r\nVary: Origin\r\nVary: X-Origin\r\nVary: Referer\r\nX-Content-Type-Options: nosniff\r\nX-Frame-Options: SAMEORIGIN\r\nX-Xss-Protection: 0\r\n\r\n{\n  \"candidates\": [\n    {\n      \"content\": {\n        \"parts\": [\n          {\n            \"functionCall\": {\n              \"name\": \"rand_number\",\n              \"args\": {\n                \"seed\": 5\n              }\n            },\n            \"thoughtSignature\": \"CvMCAb4+9vtDyZ0KEU3lK5jCnDCmza+fQGGG58b0oH1H6KFTPZI3iFo+hEV6hE+4Cnh5PzvDFg/YgfWQwXylYTILTu/9Yw0HAwxgN53cGm/ayTbTPFxnukDNmDS/K6rsGFtBoD29uTNTeXG4Xuvy4z+zwSSDV0PE4RBV6CaAxh7xR9KOSPg/5Ym63pKFS9LG7+rkqzhBm6QQS3wyxlsyRK9MHP/xlse+/WrADE3UDgoOEL/zd89vg2+mTr8E72NddFvruTo+r23XFabVnKlb/iLoh+TmLpIuwroi75o5cKnNuiZ/PXxo7P+Zr30ogwbltMzcKL/DEA1c1x+Z49UBtnU7+knzuGjPqCVR4qchfJWydI+FgBBbS+lbtNEBIwkM3Z24Dg9Q8kBY8/a3t5FR7PqFkvJ7Fx0kRPTtAGX0R42m/PVeYzrUSCp4aVReYDZh3FPPNqEWGxz2f2aBBMR5LaW8ABXO2kD6ZJnHv8+s0cvxjIyNg2Q=\"\n          }\n        ],\n        \"role\": \"model\"\n      },\n      \"finishReason\": \"STOP\",\n      \"index\": 0,\n      \"finishMessage\": \"Model generated function call(s).\"\n    }\n  ],\n  \"usageMetadata\": {\n    \"promptTokenCount\": 136,\n    \"candidatesTokenCount\": 15,\n    \"totalTokenCount\": 229,\n    \"promptTokensDetails\": [\n      {\n        \"modality\": \"TEXT\",\n        \"tokenCount\": 136\n      }\n    ],\n    \"thoughtsTokenCount\": 78\n  },\n  \"modelVersion\": \"gemini-2.5-flash\",\n  \"responseId\": \"PDCwafCwD6GF7M8Pn7bJqAE\"\n}\n1678 815\nPOST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent HTTP/1.1\r\nHost: generativelanguage.googleapis.com\r\nUser-Agent: Go-http-client/1.1\r\nContent-Length: 1445\r\nContent-Type: application/json\r\n\r\n{\"contents\":[{\"parts\":[{\"text\":\"Generate random number with 5 as a seed.\"}],\"role\":\"user\"},{\"parts\":[{\"functionCall\":{\"args\":{\"seed\":5},\"name\":\"rand_number\"},\"thoughtSignature\":\"CvMCAb4+9vtDyZ0KEU3lK5jCnDCmza+fQGGG58b0oH1H6KFTPZI3iFo+hEV6hE+4Cnh5PzvDFg/YgfWQwXylYTILTu/9Yw0HAwxgN53cGm/ayTbTPFxnukDNmDS/K6rsGFtBoD29uTNTeXG4Xuvy4z+zwSSDV0PE4RBV6CaAxh7xR9KOSPg/5Ym63pKFS9LG7+rkqzhBm6QQS3wyxlsyRK9MHP/xlse+/WrADE3UDgoOEL/zd89vg2+mTr8E72NddFvruTo+r23XFabVnKlb/iLoh+TmLpIuwroi75o5cKnNuiZ/PXxo7P+Zr30ogwbltMzcKL/DEA1c1x+Z49UBtnU7+knzuGjPqCVR4qchfJWydI+FgBBbS+lbtNEBIwkM3Z24Dg9Q8kBY8/a3t5FR7PqFkvJ7Fx0kRPTtAGX0R42m/PVeYzrUSCp4aVReYDZh3FPPNqEWGxz2f2aBBMR5LaW8ABXO2kD6ZJnHv8+s0cvxjIyNg2Q=\"}],\"role\":\"model\"},{\"parts\":[{\"functionResponse\":{\"name\":\"rand_number\",\"response\":{\"number\":1}}}],\"role\":\"user\"}],\"generationConfig\":{},\"systemInstruction\":{\"parts\":[{\"text\":\"IMPORTANT: output ONLY the result computed by the provided function, if the result is number:42 print only 42\\n\\nYou are an agent. Your internal name is \\\"agent\\\". The description about you is \\\"random agent\\\".\"}],\"role\":\"user\"},\"tools\":[{\"functionDeclarations\":[{\"description\":\"returns random number\",\"name\":\"rand_number\",\"parametersJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"seed\":{\"type\":\"integer\"}},\"required\":[\"seed\"],\"type\":\"object\"},\"responseJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"number\":{\"type\":\"integer\"}},\"required\":[\"number\"],\"type\":\"object\"}}]}]}HTTP/2.0 200 OK\r\nContent-Type: application/json; charset=UTF-8\r\nDate: Tue, 10 Mar 2026 14:52:45 GMT\r\nServer: scaffolding on HTTPServer2\r\nServer-Timing: gfet4t7; dur=439\r\nVary: Origin\r\nVary: X-Origin\r\nVary: Referer\r\nX-Content-Type-Options: nosniff\r\nX-Frame-Options: SAMEORIGIN\r\nX-Xss-Protection: 0\r\n\r\n{\n  \"candidates\": [\n    {\n      \"content\": {\n        \"parts\": [\n          {\n            \"text\": \"1\"\n          }\n        ],\n        \"role\": \"model\"\n      },\n      \"finishReason\": \"STOP\",\n      \"index\": 0\n    }\n  ],\n  \"usageMetadata\": {\n    \"promptTokenCount\": 166,\n    \"candidatesTokenCount\": 1,\n    \"totalTokenCount\": 167,\n    \"promptTokensDetails\": [\n      {\n        \"modality\": \"TEXT\",\n        \"tokenCount\": 166\n      }\n    ]\n  },\n  \"modelVersion\": \"gemini-2.5-flash\",\n  \"responseId\": \"PTCwab7MGOWD7M8PnPC9yQU\"\n}\n"
  },
  {
    "path": "agent/llmagent/testdata/TestToolCallback_extra_after_callback_skipped.httprr",
    "content": "httprr trace v1\n976 1493\nPOST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent HTTP/1.1\r\nHost: generativelanguage.googleapis.com\r\nUser-Agent: Go-http-client/1.1\r\nContent-Length: 744\r\nContent-Type: application/json\r\n\r\n{\"contents\":[{\"parts\":[{\"text\":\"Generate random number with 5 as a seed.\"}],\"role\":\"user\"}],\"generationConfig\":{},\"systemInstruction\":{\"parts\":[{\"text\":\"IMPORTANT: output ONLY the result computed by the provided function, if the result is number:42 print only 42\\n\\nYou are an agent. Your internal name is \\\"agent\\\". The description about you is \\\"random agent\\\".\"}],\"role\":\"user\"},\"tools\":[{\"functionDeclarations\":[{\"description\":\"returns random number\",\"name\":\"rand_number\",\"parametersJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"seed\":{\"type\":\"integer\"}},\"required\":[\"seed\"],\"type\":\"object\"},\"responseJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"number\":{\"type\":\"integer\"}},\"required\":[\"number\"],\"type\":\"object\"}}]}]}HTTP/2.0 200 OK\r\nContent-Type: application/json; charset=UTF-8\r\nDate: Tue, 10 Mar 2026 14:52:42 GMT\r\nServer: scaffolding on HTTPServer2\r\nServer-Timing: gfet4t7; dur=751\r\nVary: Origin\r\nVary: X-Origin\r\nVary: Referer\r\nX-Content-Type-Options: nosniff\r\nX-Frame-Options: SAMEORIGIN\r\nX-Xss-Protection: 0\r\n\r\n{\n  \"candidates\": [\n    {\n      \"content\": {\n        \"parts\": [\n          {\n            \"functionCall\": {\n              \"name\": \"rand_number\",\n              \"args\": {\n                \"seed\": 5\n              }\n            },\n            \"thoughtSignature\": \"CrwCAb4+9vuoZscYmNHbFm6Hl7XwmBgLRDVOpvS6zwLx57uGGzYrodnHDrseIc4rAjrQZB+65AWSRUl9FyYBsJyHYwuirfz8kMG2egbXP8/Y43wmWQeoRuOIwHxd3tOWb9ePoAUEU0HVrStulV9e4n7+Pr9mhWBSwTeWmeu+ji4H2ul6yjnMCZhuQsOe3+qLWekyuh23lq1AGtDnbLBM0SM4tHZcjry+MmRHsIwuXjrD21e397R7ui3Y9d8WmMlhuNymoGP/8EC7vFhwBaM+OPTTOKeMIGOgtMfj9jNVRy5pbaqM7+kmUxZs6ooTdaMJMWe6oZ1co+KalClngQbfIysU22ncyko4AtuDlPlseZnvjBjX0+Y9qlNP9Q4l0lhpUgrGnx6vyJo9YKHzCfWF0bOkqRME3KMjOFwvSK6vuA==\"\n          }\n        ],\n        \"role\": \"model\"\n      },\n      \"finishReason\": \"STOP\",\n      \"index\": 0,\n      \"finishMessage\": \"Model generated function call(s).\"\n    }\n  ],\n  \"usageMetadata\": {\n    \"promptTokenCount\": 136,\n    \"candidatesTokenCount\": 15,\n    \"totalTokenCount\": 219,\n    \"promptTokensDetails\": [\n      {\n        \"modality\": \"TEXT\",\n        \"tokenCount\": 136\n      }\n    ],\n    \"thoughtsTokenCount\": 68\n  },\n  \"modelVersion\": \"gemini-2.5-flash\",\n  \"responseId\": \"OTCwabPEOprf7M8P8_738Ag\"\n}\n1608 815\nPOST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent HTTP/1.1\r\nHost: generativelanguage.googleapis.com\r\nUser-Agent: Go-http-client/1.1\r\nContent-Length: 1375\r\nContent-Type: application/json\r\n\r\n{\"contents\":[{\"parts\":[{\"text\":\"Generate random number with 5 as a seed.\"}],\"role\":\"user\"},{\"parts\":[{\"functionCall\":{\"args\":{\"seed\":5},\"name\":\"rand_number\"},\"thoughtSignature\":\"CrwCAb4+9vuoZscYmNHbFm6Hl7XwmBgLRDVOpvS6zwLx57uGGzYrodnHDrseIc4rAjrQZB+65AWSRUl9FyYBsJyHYwuirfz8kMG2egbXP8/Y43wmWQeoRuOIwHxd3tOWb9ePoAUEU0HVrStulV9e4n7+Pr9mhWBSwTeWmeu+ji4H2ul6yjnMCZhuQsOe3+qLWekyuh23lq1AGtDnbLBM0SM4tHZcjry+MmRHsIwuXjrD21e397R7ui3Y9d8WmMlhuNymoGP/8EC7vFhwBaM+OPTTOKeMIGOgtMfj9jNVRy5pbaqM7+kmUxZs6ooTdaMJMWe6oZ1co+KalClngQbfIysU22ncyko4AtuDlPlseZnvjBjX0+Y9qlNP9Q4l0lhpUgrGnx6vyJo9YKHzCfWF0bOkqRME3KMjOFwvSK6vuA==\"}],\"role\":\"model\"},{\"parts\":[{\"functionResponse\":{\"name\":\"rand_number\",\"response\":{\"number\":\"3\"}}}],\"role\":\"user\"}],\"generationConfig\":{},\"systemInstruction\":{\"parts\":[{\"text\":\"IMPORTANT: output ONLY the result computed by the provided function, if the result is number:42 print only 42\\n\\nYou are an agent. Your internal name is \\\"agent\\\". The description about you is \\\"random agent\\\".\"}],\"role\":\"user\"},\"tools\":[{\"functionDeclarations\":[{\"description\":\"returns random number\",\"name\":\"rand_number\",\"parametersJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"seed\":{\"type\":\"integer\"}},\"required\":[\"seed\"],\"type\":\"object\"},\"responseJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"number\":{\"type\":\"integer\"}},\"required\":[\"number\"],\"type\":\"object\"}}]}]}HTTP/2.0 200 OK\r\nContent-Type: application/json; charset=UTF-8\r\nDate: Tue, 10 Mar 2026 14:52:43 GMT\r\nServer: scaffolding on HTTPServer2\r\nServer-Timing: gfet4t7; dur=349\r\nVary: Origin\r\nVary: X-Origin\r\nVary: Referer\r\nX-Content-Type-Options: nosniff\r\nX-Frame-Options: SAMEORIGIN\r\nX-Xss-Protection: 0\r\n\r\n{\n  \"candidates\": [\n    {\n      \"content\": {\n        \"parts\": [\n          {\n            \"text\": \"3\"\n          }\n        ],\n        \"role\": \"model\"\n      },\n      \"finishReason\": \"STOP\",\n      \"index\": 0\n    }\n  ],\n  \"usageMetadata\": {\n    \"promptTokenCount\": 166,\n    \"candidatesTokenCount\": 1,\n    \"totalTokenCount\": 167,\n    \"promptTokensDetails\": [\n      {\n        \"modality\": \"TEXT\",\n        \"tokenCount\": 166\n      }\n    ]\n  },\n  \"modelVersion\": \"gemini-2.5-flash\",\n  \"responseId\": \"OjCwaa7hK5vZ7M8PpLbA6Qs\"\n}\n"
  },
  {
    "path": "agent/llmagent/testdata/TestToolCallback_extra_before_callback_skipped.httprr",
    "content": "httprr trace v1\n976 1430\nPOST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent HTTP/1.1\r\nHost: generativelanguage.googleapis.com\r\nUser-Agent: Go-http-client/1.1\r\nContent-Length: 744\r\nContent-Type: application/json\r\n\r\n{\"contents\":[{\"parts\":[{\"text\":\"Generate random number with 5 as a seed.\"}],\"role\":\"user\"}],\"generationConfig\":{},\"systemInstruction\":{\"parts\":[{\"text\":\"IMPORTANT: output ONLY the result computed by the provided function, if the result is number:42 print only 42\\n\\nYou are an agent. Your internal name is \\\"agent\\\". The description about you is \\\"random agent\\\".\"}],\"role\":\"user\"},\"tools\":[{\"functionDeclarations\":[{\"description\":\"returns random number\",\"name\":\"rand_number\",\"parametersJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"seed\":{\"type\":\"integer\"}},\"required\":[\"seed\"],\"type\":\"object\"},\"responseJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"number\":{\"type\":\"integer\"}},\"required\":[\"number\"],\"type\":\"object\"}}]}]}HTTP/2.0 200 OK\r\nContent-Type: application/json; charset=UTF-8\r\nDate: Tue, 10 Mar 2026 14:52:40 GMT\r\nServer: scaffolding on HTTPServer2\r\nServer-Timing: gfet4t7; dur=1359\r\nVary: Origin\r\nVary: X-Origin\r\nVary: Referer\r\nX-Content-Type-Options: nosniff\r\nX-Frame-Options: SAMEORIGIN\r\nX-Xss-Protection: 0\r\n\r\n{\n  \"candidates\": [\n    {\n      \"content\": {\n        \"parts\": [\n          {\n            \"functionCall\": {\n              \"name\": \"rand_number\",\n              \"args\": {\n                \"seed\": 5\n              }\n            },\n            \"thoughtSignature\": \"Co4CAb4+9vshp23q730zmpKZA44y18kH57i34mjTjHqu63zEHBWY7uvTVnM/ct8OnEACaGkPS1ns8seAUWXuxgHXkmWRzzFFveogyu8/m8CbLxzfYaalGxiriSPCN9pLcIq6WfzwCIobgZh5szHcYKM4zOipgtV7f1eUX/wrGmuaNYBx7OurtouFK6x11rBjafcIaKp1PNrXHkxHwtQ7TEl0QegcsN4vVol82qyw4Pp+bl6PhzkjWvgqnNsnuPmJN8Emm6Ajf5ovW1GuPR9iTuAz6f1ncwyKlhZuLQMZKla7MsV7kcx+fUfFvJIF69A/FqH020HABFpD+CWaUzR0KaTWTcE3MvlZkmUy6sTx9a4R\"\n          }\n        ],\n        \"role\": \"model\"\n      },\n      \"finishReason\": \"STOP\",\n      \"index\": 0,\n      \"finishMessage\": \"Model generated function call(s).\"\n    }\n  ],\n  \"usageMetadata\": {\n    \"promptTokenCount\": 136,\n    \"candidatesTokenCount\": 15,\n    \"totalTokenCount\": 211,\n    \"promptTokensDetails\": [\n      {\n        \"modality\": \"TEXT\",\n        \"tokenCount\": 136\n      }\n    ],\n    \"thoughtsTokenCount\": 60\n  },\n  \"modelVersion\": \"gemini-2.5-flash\",\n  \"responseId\": \"NzCwaf7JAvrikdUPuqqn8QU\"\n}\n1544 815\nPOST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent HTTP/1.1\r\nHost: generativelanguage.googleapis.com\r\nUser-Agent: Go-http-client/1.1\r\nContent-Length: 1311\r\nContent-Type: application/json\r\n\r\n{\"contents\":[{\"parts\":[{\"text\":\"Generate random number with 5 as a seed.\"}],\"role\":\"user\"},{\"parts\":[{\"functionCall\":{\"args\":{\"seed\":5},\"name\":\"rand_number\"},\"thoughtSignature\":\"Co4CAb4+9vshp23q730zmpKZA44y18kH57i34mjTjHqu63zEHBWY7uvTVnM/ct8OnEACaGkPS1ns8seAUWXuxgHXkmWRzzFFveogyu8/m8CbLxzfYaalGxiriSPCN9pLcIq6WfzwCIobgZh5szHcYKM4zOipgtV7f1eUX/wrGmuaNYBx7OurtouFK6x11rBjafcIaKp1PNrXHkxHwtQ7TEl0QegcsN4vVol82qyw4Pp+bl6PhzkjWvgqnNsnuPmJN8Emm6Ajf5ovW1GuPR9iTuAz6f1ncwyKlhZuLQMZKla7MsV7kcx+fUfFvJIF69A/FqH020HABFpD+CWaUzR0KaTWTcE3MvlZkmUy6sTx9a4R\"}],\"role\":\"model\"},{\"parts\":[{\"functionResponse\":{\"name\":\"rand_number\",\"response\":{\"number\":\"3\"}}}],\"role\":\"user\"}],\"generationConfig\":{},\"systemInstruction\":{\"parts\":[{\"text\":\"IMPORTANT: output ONLY the result computed by the provided function, if the result is number:42 print only 42\\n\\nYou are an agent. Your internal name is \\\"agent\\\". The description about you is \\\"random agent\\\".\"}],\"role\":\"user\"},\"tools\":[{\"functionDeclarations\":[{\"description\":\"returns random number\",\"name\":\"rand_number\",\"parametersJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"seed\":{\"type\":\"integer\"}},\"required\":[\"seed\"],\"type\":\"object\"},\"responseJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"number\":{\"type\":\"integer\"}},\"required\":[\"number\"],\"type\":\"object\"}}]}]}HTTP/2.0 200 OK\r\nContent-Type: application/json; charset=UTF-8\r\nDate: Tue, 10 Mar 2026 14:52:40 GMT\r\nServer: scaffolding on HTTPServer2\r\nServer-Timing: gfet4t7; dur=402\r\nVary: Origin\r\nVary: X-Origin\r\nVary: Referer\r\nX-Content-Type-Options: nosniff\r\nX-Frame-Options: SAMEORIGIN\r\nX-Xss-Protection: 0\r\n\r\n{\n  \"candidates\": [\n    {\n      \"content\": {\n        \"parts\": [\n          {\n            \"text\": \"3\"\n          }\n        ],\n        \"role\": \"model\"\n      },\n      \"finishReason\": \"STOP\",\n      \"index\": 0\n    }\n  ],\n  \"usageMetadata\": {\n    \"promptTokenCount\": 166,\n    \"candidatesTokenCount\": 1,\n    \"totalTokenCount\": 167,\n    \"promptTokensDetails\": [\n      {\n        \"modality\": \"TEXT\",\n        \"tokenCount\": 166\n      }\n    ]\n  },\n  \"modelVersion\": \"gemini-2.5-flash\",\n  \"responseId\": \"ODCwaevWGfH3nsEP2v-88AQ\"\n}\n"
  },
  {
    "path": "agent/loader.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage agent\n\nimport (\n\t\"fmt\"\n)\n\n// Loader allows to load a particular agent by name and get the root agent\ntype Loader interface {\n\t// ListAgents returns a list of names of all agents\n\tListAgents() []string\n\t// LoadAgent returns an agent by its name. Returns error if there is no agent with such a name.\n\tLoadAgent(name string) (Agent, error)\n\t// RootAgent returns the root agent\n\tRootAgent() Agent\n}\n\n// multiLoader should be used when you have multiple agents\ntype multiLoader struct {\n\tagentMap map[string]Agent\n\troot     Agent\n}\n\n// singleLoader should be used when you have only one agent\ntype singleLoader struct {\n\troot Agent\n}\n\n// NewSingleLoader returns a loader with only one agent, which becomes the root agent\nfunc NewSingleLoader(a Agent) Loader {\n\treturn &singleLoader{root: a}\n}\n\n// singleAgentLoader implements AgentLoader. Returns root agent's name\nfunc (s *singleLoader) ListAgents() []string {\n\treturn []string{s.root.Name()}\n}\n\n// singleAgentLoader implements AgentLoader. Returns root for empty name and for root.Name(), error otherwise.\nfunc (s *singleLoader) LoadAgent(name string) (Agent, error) {\n\tif name == \"\" {\n\t\treturn s.root, nil\n\t}\n\tif name == s.root.Name() {\n\t\treturn s.root, nil\n\t}\n\treturn nil, fmt.Errorf(\"cannot load agent '%s' - provide an empty string or use '%s'\", name, s.root.Name())\n}\n\n// singleAgentLoader implements AgentLoader. Returns the root agent.\nfunc (s *singleLoader) RootAgent() Agent {\n\treturn s.root\n}\n\n// NewMultiLoader returns a new AgentLoader with the given root Agent and other agents.\n// Returns an error if more than one agent (including root) shares the same name\nfunc NewMultiLoader(root Agent, agents ...Agent) (Loader, error) {\n\tm := make(map[string]Agent)\n\tm[root.Name()] = root\n\tfor _, a := range agents {\n\t\tif _, ok := m[a.Name()]; ok {\n\t\t\t// duplicate name\n\t\t\treturn nil, fmt.Errorf(\"duplicate agent name: %s\", a.Name())\n\t\t}\n\t\tm[a.Name()] = a\n\t}\n\treturn &multiLoader{\n\t\tagentMap: m,\n\t\troot:     root,\n\t}, nil\n}\n\n// multiAgentLoader implements AgentLoader. Returns the list of all agents' names (including root agent)\nfunc (m *multiLoader) ListAgents() []string {\n\tagents := make([]string, 0, len(m.agentMap))\n\tfor name := range m.agentMap {\n\t\tagents = append(agents, name)\n\t}\n\treturn agents\n}\n\n// multiAgentLoader implements LoadAgent. Returns an agent with given name or error if no such an agent is found\nfunc (m *multiLoader) LoadAgent(name string) (Agent, error) {\n\tagent, ok := m.agentMap[name]\n\tif !ok {\n\t\treturn nil, fmt.Errorf(\"agent %s not found. Please specify one of those: %v\", name, m.ListAgents())\n\t}\n\treturn agent, nil\n}\n\n// multiAgentLoader implements LoadAgent.\nfunc (m *multiLoader) RootAgent() Agent {\n\treturn m.root\n}\n"
  },
  {
    "path": "agent/loader_test.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage agent\n\nimport (\n\t\"iter\"\n\t\"testing\"\n\n\t\"google.golang.org/adk/session\"\n)\n\nvar _ Agent = (*testAgent)(nil)\n\ntype testAgent struct {\n\tname string\n}\n\nfunc (a *testAgent) Name() string {\n\treturn a.name\n}\n\nfunc (a *testAgent) Description() string {\n\tpanic(\"not implemented\")\n}\n\nfunc (a *testAgent) Run(InvocationContext) iter.Seq2[*session.Event, error] {\n\tpanic(\"not implemented\")\n}\n\nfunc (a *testAgent) SubAgents() []Agent {\n\tpanic(\"not implemented\")\n}\n\nfunc (a *testAgent) internal() *agent {\n\tpanic(\"not implemented\")\n}\n\nfunc TestDuplicateName(t *testing.T) {\n\tagent1 := &testAgent{name: \"weather_time_agent\"}\n\t// duplicate name\n\tagent2 := &testAgent{name: \"weather_time_agent\"}\n\tagent3 := &testAgent{name: \"unique\"}\n\n\ttests := []struct {\n\t\tname    string\n\t\troot    Agent\n\t\tagents  []Agent\n\t\twantErr bool\n\t}{\n\t\t{\n\t\t\tname:    \"root only\",\n\t\t\troot:    agent1,\n\t\t\tagents:  []Agent{},\n\t\t\twantErr: false,\n\t\t},\n\t\t{\n\t\t\tname:    \"root duplicate object\",\n\t\t\troot:    agent1,\n\t\t\tagents:  []Agent{agent1},\n\t\t\twantErr: true,\n\t\t},\n\t\t{\n\t\t\tname:    \"root duplicate name\",\n\t\t\troot:    agent1,\n\t\t\tagents:  []Agent{agent2},\n\t\t\twantErr: true,\n\t\t},\n\t\t{\n\t\t\tname:    \"non-root duplicate name\",\n\t\t\troot:    agent3,\n\t\t\tagents:  []Agent{agent1, agent2},\n\t\t\twantErr: true,\n\t\t},\n\t\t{\n\t\t\tname:    \"non-root duplicate object\",\n\t\t\troot:    agent3,\n\t\t\tagents:  []Agent{agent1, agent1},\n\t\t\twantErr: true,\n\t\t},\n\t\t{\n\t\t\tname:    \"no duplicates\",\n\t\t\troot:    agent1,\n\t\t\tagents:  []Agent{agent3},\n\t\t\twantErr: false,\n\t\t},\n\t}\n\tfor _, tt := range tests {\n\t\t_, err := NewMultiLoader(tt.root, tt.agents...)\n\t\tif (err != nil) != tt.wantErr {\n\t\t\tt.Errorf(\"NewMultiLoader() name=%v, error = %v, wantErr %v\", tt.name, err, tt.wantErr)\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "agent/remoteagent/a2a_agent.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage remoteagent\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"iter\"\n\t\"log\"\n\t\"time\"\n\n\t\"github.com/a2aproject/a2a-go/a2a\"\n\t\"github.com/a2aproject/a2a-go/a2aclient\"\n\t\"github.com/a2aproject/a2a-go/a2aclient/agentcard\"\n\n\t\"google.golang.org/adk/agent\"\n\tagentinternal \"google.golang.org/adk/internal/agent\"\n\tiremoteagent \"google.golang.org/adk/internal/agent/remoteagent\"\n\t\"google.golang.org/adk/server/adka2a\"\n\t\"google.golang.org/adk/session\"\n)\n\n// BeforeA2ARequestCallback is called before sending a request to the remote agent.\n//\n// If it returns non-nil result or error, the actual call is skipped and the returned value is used\n// as the agent invocation result.\ntype BeforeA2ARequestCallback func(ctx agent.CallbackContext, req *a2a.MessageSendParams) (*session.Event, error)\n\n// A2AEventConverter can be used to provide a custom implementation of A2A event transformation logic.\ntype A2AEventConverter func(ctx agent.InvocationContext, req *a2a.MessageSendParams, event a2a.Event, err error) (*session.Event, error)\n\n// AfterA2ARequestCallback is called after receiving a response from the remote agent and converting it to a session.Event.\n// In streaming responses the callback is invoked for every request. Session event parameter might be nil if conversion logic\n// decides to not emit an A2A event.\n//\n// If it returns non-nil result or error, it gets emitted instead of the original result.\ntype AfterA2ARequestCallback func(ctx agent.CallbackContext, req *a2a.MessageSendParams, resp *session.Event, err error) (*session.Event, error)\n\n// A2ARemoteTaskCleanupCallback is called if Run exited before a terminal event was received from the remote A2A server.\ntype A2ARemoteTaskCleanupCallback func(ctx context.Context, card *a2a.AgentCard, client *a2aclient.Client, taskInfo a2a.TaskInfo, cause error)\n\n// A2AConfig is used to describe and configure a remote agent.\ntype A2AConfig struct {\n\tName        string\n\tDescription string\n\n\t// AgentCardSource can be either an http(s) URL or a local file path. If a2a.AgentCard\n\t// is not provided, the source is used to resolve the card during the first agent invocation.\n\tAgentCard       *a2a.AgentCard\n\tAgentCardSource string\n\t// CardResolveOptions can be used to provide a set of agencard.Resolver configurations.\n\tCardResolveOptions []agentcard.ResolveOption\n\n\t// BeforeAgentCallbacks is a list of callbacks that are called sequentially\n\t// before the agent starts its run.\n\t//\n\t// If any callback returns non-nil content or error, then the agent run and\n\t// the remaining callbacks will be skipped, and a new event will be created\n\t// from the content or error of that callback.\n\tBeforeAgentCallbacks []agent.BeforeAgentCallback\n\t// BeforeRequestCallbacks will be called in the order they are provided until\n\t// there's a callback that returns a non-nil result or error. Then the\n\t// actual request is skipped, and the returned response/error is used.\n\t//\n\t// This provides an opportunity to inspect, log, or modify the request object.\n\t// It can also be used to implement caching by returning a cached\n\t// response, which would skip the actual remote agent call.\n\tBeforeRequestCallbacks []BeforeA2ARequestCallback\n\t// Converter is used to convert a2a.Event to session.Event. If not provided, adka2a.ToSessionEvent\n\t// is used as the default implementation and errors are converted to events with error payload.\n\tConverter A2AEventConverter\n\t// AfterRequestCallbacks will be called in the order they are provided until\n\t// there's a callback that returns a non-nil result or error. Then\n\t// the actual remote agent event is replaced with the returned result/error.\n\t//\n\t// This is the ideal place to log agent responses, collect metrics on token or perform\n\t// pre-processing of events before a mapper is invoked.\n\tAfterRequestCallbacks []AfterA2ARequestCallback\n\t// AfterAgentCallbacks is a list of callbacks that are called sequentially\n\t// after the agent has completed its run.\n\t//\n\t// If any callback returns non-nil content or error, then a new event will be\n\t// created from the content or error of that callback and the remaining\n\t// callbacks will be skipped.\n\tAfterAgentCallbacks []agent.AfterAgentCallback\n\n\t// A2APartConverter is a custom converter for converting A2A parts to GenAI parts.\n\t// Implementations should generally remember to leverage adka2a.ToGenAiPart for default conversions\n\t// nil returns are considered intentionally dropped parts.\n\tA2APartConverter adka2a.A2APartConverter\n\n\t// GenAIPartConverter is a custom converter for converting GenAI parts to A2A parts.\n\t// Implementations should generally remember to leverage adka2a.ToA2APart for default conversions\n\t// nil returns are considered intentionally dropped parts.\n\tGenAIPartConverter adka2a.GenAIPartConverter\n\n\t// ClientFactory can be used to provide a set of a2aclient.Client configurations.\n\tClientFactory *a2aclient.Factory\n\t// MessageSendConfig is attached to a2a.MessageSendParams sent on every agent invocation.\n\tMessageSendConfig *a2a.MessageSendConfig\n\n\t// RemoteTaskCleanupCallback is called if Run exited before a terminal event was received from the remote A2A server.\n\t// If Run exited due to an error including context cancellation it will be passed as cause.\n\t// The context passed to this callback is the original context, but with Err() removed by context.WithoutCancel.\n\t// If no callback is provided the default behavior is to make a cancel RPC request with 5 second timeout.\n\tRemoteTaskCleanupCallback A2ARemoteTaskCleanupCallback\n}\n\n// NewA2A creates a remote A2A agent. A2A (Agent-To-Agent) protocol is used for communication with an\n// agent which can run in a different process or on a different host.\nfunc NewA2A(cfg A2AConfig) (agent.Agent, error) {\n\tif cfg.AgentCard == nil && cfg.AgentCardSource == \"\" {\n\t\treturn nil, fmt.Errorf(\"either AgentCard or AgentCardSource must be provided\")\n\t}\n\n\tremoteAgent := &a2aAgent{\n\t\tserverConfig: &iremoteagent.A2AServerConfig{\n\t\t\tAgentCard:          cfg.AgentCard,\n\t\t\tAgentCardSource:    cfg.AgentCardSource,\n\t\t\tCardResolveOptions: cfg.CardResolveOptions,\n\t\t\tClientFactory:      cfg.ClientFactory,\n\t\t},\n\t}\n\tagent, err := agent.New(agent.Config{\n\t\tName:                 cfg.Name,\n\t\tDescription:          cfg.Description,\n\t\tBeforeAgentCallbacks: cfg.BeforeAgentCallbacks,\n\t\tAfterAgentCallbacks:  cfg.AfterAgentCallbacks,\n\t\tRun: func(ic agent.InvocationContext) iter.Seq2[*session.Event, error] {\n\t\t\treturn remoteAgent.run(ic, cfg)\n\t\t},\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinternalAgent, ok := agent.(agentinternal.Agent)\n\tif !ok {\n\t\treturn nil, fmt.Errorf(\"internal error: failed to convert to internal agent\")\n\t}\n\tstate := agentinternal.Reveal(internalAgent)\n\tstate.AgentType = agentinternal.TypeRemoteAgent\n\tstate.Config = iremoteagent.RemoteAgentState{A2A: remoteAgent.serverConfig}\n\n\treturn agent, nil\n}\n\ntype a2aAgent struct {\n\tserverConfig *iremoteagent.A2AServerConfig\n}\n\nfunc (a *a2aAgent) run(ctx agent.InvocationContext, cfg A2AConfig) iter.Seq2[*session.Event, error] {\n\treturn func(yield func(*session.Event, error) bool) {\n\t\tagentCard, client, err := iremoteagent.CreateA2AClient(ctx, a.serverConfig)\n\t\tif err != nil {\n\t\t\tyield(toErrorEvent(ctx, fmt.Errorf(\"client creation failed: %w\", err)), nil)\n\t\t\treturn\n\t\t}\n\t\tdefer destroy(client)\n\n\t\tmsg, err := newMessage(ctx, cfg)\n\t\tif err != nil {\n\t\t\tyield(toErrorEvent(ctx, fmt.Errorf(\"message creation failed: %w\", err)), nil)\n\t\t\treturn\n\t\t}\n\n\t\treq := &a2a.MessageSendParams{Message: msg, Config: cfg.MessageSendConfig}\n\n\t\tprocessor := newRunProcessor(cfg, req)\n\n\t\tif bcbResp, bcbErr := processor.runBeforeA2ARequestCallbacks(ctx); bcbResp != nil || bcbErr != nil {\n\t\t\tif acbResp, acbErr := processor.runAfterA2ARequestCallbacks(ctx, bcbResp, bcbErr); acbResp != nil || acbErr != nil {\n\t\t\t\tyield(acbResp, acbErr)\n\t\t\t} else {\n\t\t\t\tyield(bcbResp, bcbErr)\n\t\t\t}\n\t\t\treturn\n\t\t}\n\n\t\tif len(msg.Parts) == 0 {\n\t\t\tresp := adka2a.NewRemoteAgentEvent(ctx)\n\t\t\tif cbResp, cbErr := processor.runAfterA2ARequestCallbacks(ctx, resp, err); cbResp != nil || cbErr != nil {\n\t\t\t\tyield(cbResp, cbErr)\n\t\t\t} else {\n\t\t\t\tyield(resp, nil)\n\t\t\t}\n\t\t\treturn\n\t\t}\n\n\t\tvar lastErr error\n\t\tyieldErr := func(err error) bool {\n\t\t\tlastErr = err\n\t\t\treturn yield(nil, err)\n\t\t}\n\n\t\tvar lastEvent a2a.Event\n\t\tdefer func() {\n\t\t\terr := lastErr\n\t\t\tif err == nil && ctx.Err() != nil {\n\t\t\t\terr = context.Cause(ctx)\n\t\t\t}\n\t\t\tcleanupRemoteTask(ctx, cfg, agentCard, client, lastEvent, err)\n\t\t}()\n\n\t\tprocessEvent := func(a2aEvent a2a.Event, a2aErr error) bool {\n\t\t\tif a2aEvent != nil {\n\t\t\t\tlastEvent = a2aEvent\n\t\t\t}\n\n\t\t\tvar err error\n\t\t\tvar event *session.Event\n\t\t\tif cfg.Converter != nil {\n\t\t\t\tevent, err = cfg.Converter(ctx, req, a2aEvent, a2aErr)\n\t\t\t} else {\n\t\t\t\tevent, err = processor.convertToSessionEvent(ctx, a2aEvent, a2aErr)\n\t\t\t}\n\n\t\t\tif cbResp, cbErr := processor.runAfterA2ARequestCallbacks(ctx, event, err); cbResp != nil || cbErr != nil {\n\t\t\t\tif cbErr != nil {\n\t\t\t\t\treturn yieldErr(cbErr)\n\t\t\t\t}\n\t\t\t\tevent = cbResp\n\t\t\t\terr = nil\n\t\t\t}\n\n\t\t\tif err != nil {\n\t\t\t\treturn yieldErr(err)\n\t\t\t}\n\n\t\t\tif event != nil { // an event might be skipped\n\t\t\t\tfor _, toEmit := range processor.aggregatePartial(ctx, a2aEvent, event) {\n\t\t\t\t\tif !yield(toEmit, nil) {\n\t\t\t\t\t\treturn false\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true\n\t\t}\n\n\t\tif ctx.RunConfig().StreamingMode == agent.StreamingModeNone {\n\t\t\ta2aEvent, a2aErr := client.SendMessage(ctx, req)\n\t\t\tprocessEvent(a2aEvent, a2aErr)\n\t\t\treturn\n\t\t}\n\n\t\tfor a2aEvent, a2aErr := range client.SendStreamingMessage(ctx, req) {\n\t\t\tif !processEvent(a2aEvent, a2aErr) {\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc cleanupRemoteTask(ctx context.Context, cfg A2AConfig, card *a2a.AgentCard, client *a2aclient.Client, lastEvent a2a.Event, cause error) {\n\tif lastEvent == nil {\n\t\treturn\n\t}\n\ttaskID := lastEvent.TaskInfo().TaskID\n\tif taskID == \"\" {\n\t\treturn\n\t}\n\tif _, ok := lastEvent.(*a2a.Message); ok {\n\t\treturn\n\t}\n\tvar state a2a.TaskState\n\tif tu, ok := lastEvent.(*a2a.TaskStatusUpdateEvent); ok {\n\t\tstate = tu.Status.State\n\t}\n\tif t, ok := lastEvent.(*a2a.Task); ok {\n\t\tstate = t.Status.State\n\t}\n\tif state.Terminal() {\n\t\treturn\n\t}\n\n\tctx = context.WithoutCancel(ctx)\n\n\tif cfg.RemoteTaskCleanupCallback != nil {\n\t\tcfg.RemoteTaskCleanupCallback(ctx, card, client, lastEvent.TaskInfo(), cause)\n\t\treturn\n\t}\n\n\tif state == a2a.TaskStateInputRequired && cause == nil {\n\t\treturn\n\t}\n\tcancelCtx, cancelTimeout := context.WithTimeout(ctx, 5*time.Second)\n\tdefer cancelTimeout()\n\t_, err := client.CancelTask(cancelCtx, &a2a.TaskIDParams{ID: taskID})\n\tif err != nil {\n\t\tlog.Printf(\"failed to cancel task %s: %v\", taskID, err)\n\t}\n}\n\nfunc newMessage(ctx agent.InvocationContext, cfg A2AConfig) (*a2a.Message, error) {\n\tevents := ctx.Session().Events()\n\tif userFnCall := getUserFunctionCallAt(events, events.Len()-1); userFnCall != nil {\n\t\tevent := userFnCall.response\n\t\tparts, err := convertParts(ctx, cfg, event)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tmsg := a2a.NewMessage(a2a.MessageRoleUser, parts...)\n\t\tmsg.TaskID = userFnCall.taskID\n\t\tmsg.ContextID = userFnCall.contextID\n\t\treturn msg, nil\n\t}\n\n\tparts, contextID := toMissingRemoteSessionParts(ctx, events, cfg)\n\tmsg := a2a.NewMessage(a2a.MessageRoleUser, parts...)\n\tmsg.ContextID = contextID\n\treturn msg, nil\n}\n\nfunc toErrorEvent(ctx agent.InvocationContext, err error) *session.Event {\n\tevent := adka2a.NewRemoteAgentEvent(ctx)\n\tevent.ErrorMessage = err.Error()\n\tevent.CustomMetadata = map[string]any{adka2a.ToADKMetaKey(\"error\"): err.Error()}\n\tevent.TurnComplete = true\n\treturn event\n}\n\nfunc convertParts(ctx agent.InvocationContext, cfg A2AConfig, event *session.Event) ([]a2a.Part, error) {\n\tparts := make([]a2a.Part, 0, len(event.Content.Parts))\n\tif cfg.GenAIPartConverter != nil {\n\t\tfor _, part := range event.Content.Parts {\n\t\t\tcp, err := cfg.GenAIPartConverter(ctx, event, part)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\tif cp != nil {\n\t\t\t\tparts = append(parts, cp)\n\t\t\t}\n\t\t}\n\t} else {\n\t\tvar err error\n\t\tparts, err = adka2a.ToA2AParts(event.Content.Parts, event.LongRunningToolIDs)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"event part conversion failed: %w\", err)\n\t\t}\n\t}\n\treturn parts, nil\n}\n\nfunc destroy(client *a2aclient.Client) {\n\tif err := client.Destroy(); err != nil {\n\t\tlog.Printf(\"failed to destroy client: %v\", err)\n\t}\n}\n"
  },
  {
    "path": "agent/remoteagent/a2a_agent_run_processor.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage remoteagent\n\nimport (\n\t\"fmt\"\n\t\"maps\"\n\t\"slices\"\n\n\t\"github.com/a2aproject/a2a-go/a2a\"\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/agent\"\n\ticontext \"google.golang.org/adk/internal/context\"\n\t\"google.golang.org/adk/internal/converters\"\n\t\"google.golang.org/adk/server/adka2a\"\n\t\"google.golang.org/adk/session\"\n)\n\ntype artifactAggregation struct {\n\tparts      []*genai.Part\n\tcitations  *genai.CitationMetadata\n\tgrounding  *genai.GroundingMetadata\n\tcustomMeta map[string]any\n\tusage      *genai.GenerateContentResponseUsageMetadata\n}\n\ntype a2aAgentRunProcessor struct {\n\tconfig        A2AConfig\n\tpartConverter adka2a.A2APartConverter\n\trequest       *a2a.MessageSendParams\n\n\t// partial event contents emitted before the terminal event\n\taggregations map[a2a.ArtifactID]*artifactAggregation\n\t// used to emit aggregations in the order of last update\n\taggregationOrder []a2a.ArtifactID\n}\n\nfunc newRunProcessor(config A2AConfig, request *a2a.MessageSendParams) *a2aAgentRunProcessor {\n\treturn &a2aAgentRunProcessor{\n\t\tconfig:        config,\n\t\trequest:       request,\n\t\tpartConverter: config.A2APartConverter,\n\t\taggregations:  make(map[a2a.ArtifactID]*artifactAggregation),\n\t}\n}\n\n// aggregatePartial stores contents of partial events to emit them with the terminal event.\n// It can modify the original event or return a new event to emit before the provided event.\nfunc (p *a2aAgentRunProcessor) aggregatePartial(ctx agent.InvocationContext, a2aEvent a2a.Event, event *session.Event) []*session.Event {\n\t// ADK partial events should be aggregated by ADK and emitted as a non-partial artifact update.\n\t// That's why we skip them regardless of the actual isPartial value.\n\t// This is the legacy [adka2a.OutputMode].\n\tif a2aEvent != nil && adka2a.IsPartialFlagSet(a2aEvent.Meta()) {\n\t\treturn []*session.Event{event}\n\t}\n\n\t// RemoteAgent event stream finished, emit any aggregated events data we have before the final event\n\tif statusUpdate, ok := a2aEvent.(*a2a.TaskStatusUpdateEvent); ok && statusUpdate.Final {\n\t\tvar events []*session.Event\n\t\tfor _, aid := range p.aggregationOrder {\n\t\t\tif agg, ok := p.aggregations[aid]; ok {\n\t\t\t\tevents = append(events, p.buildNonPartialAggregation(ctx, agg))\n\t\t\t}\n\t\t}\n\t\treturn append(events, event)\n\t}\n\n\t// RemoteAgent published a snapshot which should have all the data we potentially aggregated.\n\t// Reset the aggregation so that it is not published twice.\n\tif _, ok := a2aEvent.(*a2a.Task); ok {\n\t\tp.aggregations = map[a2a.ArtifactID]*artifactAggregation{}\n\t\tp.aggregationOrder = nil\n\t\treturn []*session.Event{event}\n\t}\n\n\tupdate, ok := a2aEvent.(*a2a.TaskArtifactUpdateEvent)\n\tif !ok { // do not aggregate status updates\n\t\treturn []*session.Event{event}\n\t}\n\n\tif !update.Append { // non-append event resets aggregation\n\t\tp.removeAggregation(update.Artifact.ID)\n\t\tif update.LastChunk { // non-append event which is the last chunk must already be non-partial\n\t\t\tevent.Partial = false\n\t\t\treturn []*session.Event{event}\n\t\t}\n\t}\n\n\taggregation := p.aggregations[update.Artifact.ID]\n\tif aggregation == nil {\n\t\taggregation = &artifactAggregation{}\n\t\tp.aggregations[update.Artifact.ID] = aggregation\n\t}\n\n\tp.updateAggregation(update.Artifact.ID, aggregation, event)\n\n\tif !update.LastChunk {\n\t\treturn []*session.Event{event}\n\t}\n\n\t// emit partial last chunk and follow by the non-partial aggregated event\n\tp.removeAggregation(update.Artifact.ID)\n\treturn []*session.Event{event, p.buildNonPartialAggregation(ctx, aggregation)}\n}\n\nfunc (p *a2aAgentRunProcessor) removeAggregation(aid a2a.ArtifactID) {\n\tdelete(p.aggregations, aid)\n\tp.removeFromOrder(aid)\n}\n\nfunc (p *a2aAgentRunProcessor) removeFromOrder(aid a2a.ArtifactID) {\n\tp.aggregationOrder = slices.DeleteFunc(p.aggregationOrder, func(id a2a.ArtifactID) bool {\n\t\treturn id == aid\n\t})\n}\n\nfunc (p *a2aAgentRunProcessor) updateAggregation(aid a2a.ArtifactID, agg *artifactAggregation, event *session.Event) {\n\tif event.Content != nil {\n\t\tfor _, part := range event.Content.Parts {\n\t\t\tif part.Text != \"\" { // collapse small text-block parts to bigger text blocks\n\t\t\t\tif len(agg.parts) > 0 {\n\t\t\t\t\tlastPart := agg.parts[len(agg.parts)-1]\n\t\t\t\t\t// check if last part is a text block of the same 'Thought' type\n\t\t\t\t\tif lastPart.Text != \"\" && lastPart.Thought == part.Thought {\n\t\t\t\t\t\tlastPart.Text += part.Text\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tagg.parts = append(agg.parts, &genai.Part{\n\t\t\t\t\tText:    part.Text,\n\t\t\t\t\tThought: part.Thought,\n\t\t\t\t})\n\t\t\t} else {\n\t\t\t\tagg.parts = append(agg.parts, part)\n\t\t\t}\n\t\t}\n\t}\n\n\tif event.CitationMetadata != nil {\n\t\tif agg.citations == nil {\n\t\t\tagg.citations = &genai.CitationMetadata{}\n\t\t}\n\t\tagg.citations.Citations = append(agg.citations.Citations, event.CitationMetadata.Citations...)\n\t}\n\tif event.CustomMetadata != nil {\n\t\tif agg.customMeta == nil {\n\t\t\tagg.customMeta = make(map[string]any)\n\t\t}\n\t\tmaps.Copy(agg.customMeta, event.CustomMetadata)\n\t}\n\tif event.GroundingMetadata != nil {\n\t\tagg.grounding = event.GroundingMetadata\n\t}\n\tif event.UsageMetadata != nil { // cumulative\n\t\tagg.usage = event.UsageMetadata\n\t}\n\n\tp.removeFromOrder(aid)\n\tp.aggregationOrder = append(p.aggregationOrder, aid)\n}\n\nfunc (p *a2aAgentRunProcessor) buildNonPartialAggregation(ctx agent.InvocationContext, agg *artifactAggregation) *session.Event {\n\tparts := agg.parts\n\tresult := adka2a.NewRemoteAgentEvent(ctx)\n\tresult.Content = genai.NewContentFromParts(parts, genai.RoleModel)\n\tresult.CustomMetadata = agg.customMeta\n\tresult.GroundingMetadata = agg.grounding\n\tresult.CitationMetadata = agg.citations\n\tresult.UsageMetadata = agg.usage\n\treturn result\n}\n\n// convertToSessionEvent converts A2A client SendStreamingMessage result to a session event. Returns nil if nothing should be emitted.\nfunc (p *a2aAgentRunProcessor) convertToSessionEvent(ctx agent.InvocationContext, a2aEvent a2a.Event, err error) (*session.Event, error) {\n\tif err != nil {\n\t\tevent := toErrorEvent(ctx, err)\n\t\tp.updateCustomMetadata(event, nil)\n\t\treturn event, nil\n\t}\n\n\tevent, err := adka2a.ToSessionEventWithParts(ctx, a2aEvent, p.partConverter)\n\tif err != nil {\n\t\tevent := toErrorEvent(ctx, fmt.Errorf(\"failed to convert a2aEvent: %w\", err))\n\t\tp.updateCustomMetadata(event, nil)\n\t\treturn event, nil\n\t}\n\n\tif event != nil {\n\t\tp.updateCustomMetadata(event, a2aEvent)\n\t}\n\n\treturn event, nil\n}\n\nfunc (p *a2aAgentRunProcessor) runBeforeA2ARequestCallbacks(ctx agent.InvocationContext) (*session.Event, error) {\n\tcctx := icontext.NewCallbackContext(ctx)\n\tfor _, callback := range p.config.BeforeRequestCallbacks {\n\t\tif cbResp, cbErr := callback(cctx, p.request); cbResp != nil || cbErr != nil {\n\t\t\treturn cbResp, cbErr\n\t\t}\n\t}\n\treturn nil, nil\n}\n\nfunc (p *a2aAgentRunProcessor) runAfterA2ARequestCallbacks(ctx agent.InvocationContext, resp *session.Event, err error) (*session.Event, error) {\n\tcctx := icontext.NewCallbackContext(ctx)\n\tfor _, callback := range p.config.AfterRequestCallbacks {\n\t\tif cbEvent, cbErr := callback(cctx, p.request, resp, err); cbEvent != nil || cbErr != nil {\n\t\t\treturn cbEvent, cbErr\n\t\t}\n\t}\n\treturn nil, nil\n}\n\nfunc (p *a2aAgentRunProcessor) updateCustomMetadata(event *session.Event, response a2a.Event) {\n\ttoAdd := map[string]any{}\n\tif p.request != nil && event.TurnComplete {\n\t\t// only add request to the final event to avoid massive data duplication during streaming\n\t\ttoAdd[\"request\"] = p.request\n\t}\n\tif response != nil {\n\t\ttoAdd[\"response\"] = response\n\t}\n\tif len(toAdd) == 0 {\n\t\treturn\n\t}\n\tif event.CustomMetadata == nil {\n\t\tevent.CustomMetadata = map[string]any{}\n\t}\n\tfor k, v := range toAdd {\n\t\tif v == nil {\n\t\t\tcontinue\n\t\t}\n\t\tpayload, err := converters.ToMapStructure(v)\n\t\tif err == nil {\n\t\t\tevent.CustomMetadata[adka2a.ToADKMetaKey(k)] = payload\n\t\t} else {\n\t\t\tevent.CustomMetadata[adka2a.ToADKMetaKey(k+\"_codec_error\")] = err.Error()\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "agent/remoteagent/a2a_agent_run_processor_test.go",
    "content": "// Copyright 2026 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage remoteagent\n\nimport (\n\t\"testing\"\n\n\t\"github.com/a2aproject/a2a-go/a2a\"\n\t\"github.com/google/go-cmp/cmp\"\n\t\"github.com/google/go-cmp/cmp/cmpopts\"\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/agent\"\n\ticontext \"google.golang.org/adk/internal/context\"\n\t\"google.golang.org/adk/internal/utils\"\n\t\"google.golang.org/adk/model\"\n\t\"google.golang.org/adk/server/adka2a\"\n\t\"google.golang.org/adk/session\"\n)\n\nfunc TestA2AAgentRunProcessor_aggregatePartial(t *testing.T) {\n\ttype updateFlags struct {\n\t\tappend    bool\n\t\tlastChunk bool\n\t}\n\ttask := &a2a.Task{ID: a2a.NewTaskID(), ContextID: a2a.NewContextID()}\n\tnewArtifactUpdate := func(aid a2a.ArtifactID, flags updateFlags, text string) *a2a.TaskArtifactUpdateEvent {\n\t\treturn &a2a.TaskArtifactUpdateEvent{\n\t\t\tTaskID:    task.ID,\n\t\t\tContextID: task.ContextID,\n\t\t\tArtifact:  &a2a.Artifact{ID: aid, Parts: a2a.ContentParts{a2a.TextPart{Text: text}}},\n\t\t\tLastChunk: flags.lastChunk,\n\t\t\tAppend:    flags.append,\n\t\t}\n\t}\n\n\tnewPartialEvent := func(text string) *session.Event {\n\t\treturn &session.Event{LLMResponse: model.LLMResponse{\n\t\t\tPartial: true,\n\t\t\tContent: genai.NewContentFromText(text, genai.RoleModel),\n\t\t}}\n\t}\n\tnewCompletedEvent := func(parts ...*genai.Part) *session.Event {\n\t\te := &session.Event{LLMResponse: model.LLMResponse{TurnComplete: true}}\n\t\tif len(parts) > 0 {\n\t\t\te.Content = genai.NewContentFromParts(parts, genai.RoleModel)\n\t\t}\n\t\treturn e\n\t}\n\tnewEvent := func(parts ...*genai.Part) *session.Event {\n\t\te := &session.Event{LLMResponse: model.LLMResponse{Partial: false}}\n\t\tif len(parts) > 0 {\n\t\t\te.Content = genai.NewContentFromParts(parts, genai.RoleModel)\n\t\t}\n\t\treturn e\n\t}\n\twithADKPartial := func(event *a2a.TaskArtifactUpdateEvent, partial bool) *a2a.TaskArtifactUpdateEvent {\n\t\tevent.Metadata = map[string]any{adka2a.ToA2AMetaKey(\"partial\"): partial}\n\t\treturn event\n\t}\n\n\taid1, aid2 := a2a.NewArtifactID(), a2a.NewArtifactID()\n\ttests := []struct {\n\t\tname       string\n\t\tevents     []a2a.Event\n\t\twantEvents []*session.Event\n\t}{\n\t\t{\n\t\t\tname: \"do not aggregate when ADK events\",\n\t\t\tevents: []a2a.Event{\n\t\t\t\twithADKPartial(a2a.NewArtifactUpdateEvent(task, aid1, a2a.TextPart{Text: \"Hel\"}), true),\n\t\t\t\twithADKPartial(a2a.NewArtifactUpdateEvent(task, aid1, a2a.TextPart{Text: \"lo\"}), true),\n\t\t\t\twithADKPartial(a2a.NewArtifactUpdateEvent(task, aid1, a2a.TextPart{Text: \"Hello\"}), false),\n\t\t\t\tnewFinalStatusUpdate(task, a2a.TaskStateCompleted),\n\t\t\t},\n\t\t\twantEvents: []*session.Event{\n\t\t\t\tnewPartialEvent(\"Hel\"),\n\t\t\t\tnewPartialEvent(\"lo\"),\n\t\t\t\tnewEvent(genai.NewPartFromText(\"Hello\")),\n\t\t\t\tnewCompletedEvent(),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"aggregation reset by final snapshot\",\n\t\t\tevents: []a2a.Event{\n\t\t\t\ta2a.NewArtifactUpdateEvent(task, \"a1\", a2a.TextPart{Text: \"ignore me\"}),\n\t\t\t\t&a2a.Task{\n\t\t\t\t\tID:        task.ID,\n\t\t\t\t\tArtifacts: []*a2a.Artifact{{Parts: a2a.ContentParts{a2a.TextPart{Text: \"done\"}}}},\n\t\t\t\t\tStatus:    a2a.TaskStatus{State: a2a.TaskStateCompleted},\n\t\t\t\t},\n\t\t\t},\n\t\t\twantEvents: []*session.Event{\n\t\t\t\tnewPartialEvent(\"ignore me\"),\n\t\t\t\tnewCompletedEvent(genai.NewPartFromText(\"done\")),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"aggregation reset by non-final snapshot\",\n\t\t\tevents: []a2a.Event{\n\t\t\t\ta2a.NewArtifactUpdateEvent(task, \"a1\", a2a.TextPart{Text: \"foo\"}),\n\t\t\t\t&a2a.Task{ID: task.ID},\n\t\t\t\ta2a.NewArtifactUpdateEvent(task, \"a1\", a2a.TextPart{Text: \"bar\"}),\n\t\t\t\tnewFinalStatusUpdate(task, a2a.TaskStateCompleted),\n\t\t\t},\n\t\t\twantEvents: []*session.Event{\n\t\t\t\tnewPartialEvent(\"foo\"),\n\t\t\t\tnewPartialEvent(\"bar\"),\n\t\t\t\tnewEvent(genai.NewPartFromText(\"bar\")),\n\t\t\t\tnewCompletedEvent(),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"[append=true, lastChunk=false] emit aggregated on final status\",\n\t\t\tevents: []a2a.Event{\n\t\t\t\tnewArtifactUpdate(aid1, updateFlags{append: true}, \"Hel\"),\n\t\t\t\tnewArtifactUpdate(aid1, updateFlags{append: true}, \"lo\"),\n\t\t\t\tnewFinalStatusUpdate(task, a2a.TaskStateCompleted),\n\t\t\t},\n\t\t\twantEvents: []*session.Event{\n\t\t\t\tnewPartialEvent(\"Hel\"),\n\t\t\t\tnewPartialEvent(\"lo\"),\n\t\t\t\tnewEvent(genai.NewPartFromText(\"Hello\")),\n\t\t\t\tnewCompletedEvent(),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"[append=true, lastChunk=false] emit multiple aggregated on final status\",\n\t\t\tevents: []a2a.Event{\n\t\t\t\tnewArtifactUpdate(aid1, updateFlags{append: true}, \"Foo\"),\n\t\t\t\tnewArtifactUpdate(aid2, updateFlags{append: true}, \"Bar\"),\n\t\t\t\tnewFinalStatusUpdate(task, a2a.TaskStateCompleted),\n\t\t\t},\n\t\t\twantEvents: []*session.Event{\n\t\t\t\tnewPartialEvent(\"Foo\"),\n\t\t\t\tnewPartialEvent(\"Bar\"),\n\t\t\t\tnewEvent(genai.NewPartFromText(\"Foo\")),\n\t\t\t\tnewEvent(genai.NewPartFromText(\"Bar\")),\n\t\t\t\tnewCompletedEvent(),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"last updated aggregation is emitted last\",\n\t\t\tevents: []a2a.Event{\n\t\t\t\tnewArtifactUpdate(aid1, updateFlags{append: true}, \"Foo\"),\n\t\t\t\tnewArtifactUpdate(aid2, updateFlags{append: true}, \"Bar\"),\n\t\t\t\tnewArtifactUpdate(aid1, updateFlags{append: true}, \"Baz\"),\n\t\t\t\tnewFinalStatusUpdate(task, a2a.TaskStateCompleted),\n\t\t\t},\n\t\t\twantEvents: []*session.Event{\n\t\t\t\tnewPartialEvent(\"Foo\"),\n\t\t\t\tnewPartialEvent(\"Bar\"),\n\t\t\t\tnewPartialEvent(\"Baz\"),\n\t\t\t\tnewEvent(genai.NewPartFromText(\"Bar\")),\n\t\t\t\tnewEvent(genai.NewPartFromText(\"FooBaz\")),\n\t\t\t\tnewCompletedEvent(),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"[append=true, lastChunk=true] results in partial followed by non-partial\",\n\t\t\tevents: []a2a.Event{\n\t\t\t\tnewArtifactUpdate(aid1, updateFlags{append: true}, \"Hel\"),\n\t\t\t\tnewArtifactUpdate(aid1, updateFlags{append: true, lastChunk: true}, \"lo\"),\n\t\t\t\tnewArtifactUpdate(aid2, updateFlags{append: true}, \"bar\"),\n\t\t\t\tnewFinalStatusUpdate(task, a2a.TaskStateCompleted),\n\t\t\t},\n\t\t\twantEvents: []*session.Event{\n\t\t\t\tnewPartialEvent(\"Hel\"),\n\t\t\t\tnewPartialEvent(\"lo\"),\n\t\t\t\tnewEvent(genai.NewPartFromText(\"Hello\")),\n\t\t\t\tnewPartialEvent(\"bar\"),\n\t\t\t\tnewEvent(genai.NewPartFromText(\"bar\")),\n\t\t\t\tnewCompletedEvent(),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"[append=false, lastChunk=true] results in non-partial\",\n\t\t\tevents: []a2a.Event{\n\t\t\t\tnewArtifactUpdate(aid1, updateFlags{append: true}, \"Hel\"),\n\t\t\t\tnewArtifactUpdate(aid1, updateFlags{append: false, lastChunk: true}, \"Hello\"),\n\t\t\t\tnewArtifactUpdate(aid2, updateFlags{append: true}, \"bar\"),\n\t\t\t\tnewFinalStatusUpdate(task, a2a.TaskStateCompleted),\n\t\t\t},\n\t\t\twantEvents: []*session.Event{\n\t\t\t\tnewPartialEvent(\"Hel\"),\n\t\t\t\tnewEvent(genai.NewPartFromText(\"Hello\")),\n\t\t\t\tnewPartialEvent(\"bar\"),\n\t\t\t\tnewEvent(genai.NewPartFromText(\"bar\")),\n\t\t\t\tnewCompletedEvent(),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"[append=false, lastChunk=true] as first event non-partial\",\n\t\t\tevents: []a2a.Event{\n\t\t\t\tnewArtifactUpdate(aid1, updateFlags{append: false, lastChunk: true}, \"Hello\"),\n\t\t\t\tnewArtifactUpdate(aid2, updateFlags{append: true}, \"bar\"),\n\t\t\t\tnewFinalStatusUpdate(task, a2a.TaskStateCompleted),\n\t\t\t},\n\t\t\twantEvents: []*session.Event{\n\t\t\t\tnewEvent(genai.NewPartFromText(\"Hello\")),\n\t\t\t\tnewPartialEvent(\"bar\"),\n\t\t\t\tnewEvent(genai.NewPartFromText(\"bar\")),\n\t\t\t\tnewCompletedEvent(),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"[append=false, lastChunk=false] resets aggregation\",\n\t\t\tevents: []a2a.Event{\n\t\t\t\tnewArtifactUpdate(aid1, updateFlags{append: true}, \"Foo\"),\n\t\t\t\tnewArtifactUpdate(aid1, updateFlags{append: false}, \"Bar\"),\n\t\t\t\tnewFinalStatusUpdate(task, a2a.TaskStateCompleted),\n\t\t\t},\n\t\t\twantEvents: []*session.Event{\n\t\t\t\tnewPartialEvent(\"Foo\"),\n\t\t\t\tnewPartialEvent(\"Bar\"),\n\t\t\t\tnewEvent(genai.NewPartFromText(\"Bar\")),\n\t\t\t\tnewCompletedEvent(),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"thoughts aggregation\",\n\t\t\tevents: []a2a.Event{\n\t\t\t\ta2a.NewArtifactUpdateEvent(task, \"a1\", a2a.TextPart{\n\t\t\t\t\tText:     \"thinking...\",\n\t\t\t\t\tMetadata: map[string]any{adka2a.ToA2AMetaKey(\"thought\"): true},\n\t\t\t\t}),\n\t\t\t\ta2a.NewArtifactUpdateEvent(task, \"a1\", a2a.TextPart{Text: \"done\"}),\n\t\t\t\tnewFinalStatusUpdate(task, a2a.TaskStateCompleted),\n\t\t\t},\n\t\t\twantEvents: []*session.Event{\n\t\t\t\t{LLMResponse: model.LLMResponse{\n\t\t\t\t\tPartial: true,\n\t\t\t\t\tContent: &genai.Content{Parts: []*genai.Part{{Thought: true, Text: \"thinking...\"}}, Role: genai.RoleModel},\n\t\t\t\t}},\n\t\t\t\tnewPartialEvent(\"done\"),\n\t\t\t\tnewEvent(\n\t\t\t\t\t&genai.Part{Thought: true, Text: \"thinking...\"},\n\t\t\t\t\t&genai.Part{Text: \"done\"},\n\t\t\t\t),\n\t\t\t\tnewCompletedEvent(),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"interleaved thought and text\",\n\t\t\tevents: []a2a.Event{\n\t\t\t\ta2a.NewArtifactUpdateEvent(task, \"a1\", a2a.TextPart{\n\t\t\t\t\tText:     \"thinking1\",\n\t\t\t\t\tMetadata: map[string]any{adka2a.ToA2AMetaKey(\"thought\"): true},\n\t\t\t\t}),\n\t\t\t\ta2a.NewArtifactUpdateEvent(task, \"a1\", a2a.TextPart{Text: \"text1\"}),\n\t\t\t\ta2a.NewArtifactUpdateEvent(task, \"a1\", a2a.TextPart{\n\t\t\t\t\tText:     \"thinking2\",\n\t\t\t\t\tMetadata: map[string]any{adka2a.ToA2AMetaKey(\"thought\"): true},\n\t\t\t\t}),\n\t\t\t\ta2a.NewArtifactUpdateEvent(task, \"a1\", a2a.TextPart{Text: \"text2\"}),\n\t\t\t\tnewFinalStatusUpdate(task, a2a.TaskStateCompleted),\n\t\t\t},\n\t\t\twantEvents: []*session.Event{\n\t\t\t\t{LLMResponse: model.LLMResponse{\n\t\t\t\t\tPartial: true,\n\t\t\t\t\tContent: &genai.Content{Parts: []*genai.Part{{Thought: true, Text: \"thinking1\"}}, Role: genai.RoleModel},\n\t\t\t\t}},\n\t\t\t\tnewPartialEvent(\"text1\"),\n\t\t\t\t{LLMResponse: model.LLMResponse{\n\t\t\t\t\tPartial: true,\n\t\t\t\t\tContent: &genai.Content{Parts: []*genai.Part{{Thought: true, Text: \"thinking2\"}}, Role: genai.RoleModel},\n\t\t\t\t}},\n\t\t\t\tnewPartialEvent(\"text2\"),\n\t\t\t\tnewEvent(\n\t\t\t\t\t&genai.Part{Thought: true, Text: \"thinking1\"},\n\t\t\t\t\t&genai.Part{Text: \"text1\"},\n\t\t\t\t\t&genai.Part{Thought: true, Text: \"thinking2\"},\n\t\t\t\t\t&genai.Part{Text: \"text2\"},\n\t\t\t\t),\n\t\t\t\tnewCompletedEvent(),\n\t\t\t},\n\t\t},\n\t}\n\n\tfor _, tc := range tests {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\tagnt := utils.Must(agent.New(agent.Config{}))\n\t\t\tctx := icontext.NewInvocationContext(t.Context(), icontext.InvocationContextParams{\n\t\t\t\tAgent: agnt,\n\t\t\t})\n\n\t\t\tp := newRunProcessor(A2AConfig{}, nil)\n\t\t\tvar gotEvents []*session.Event\n\n\t\t\tfor _, event := range tc.events {\n\n\t\t\t\tadkEvent, err := adka2a.ToSessionEvent(ctx, event)\n\t\t\t\tif err != nil {\n\t\t\t\t\tt.Fatalf(\"ToSessionEvent failed: %v\", err)\n\t\t\t\t}\n\n\t\t\t\tif adkEvent == nil {\n\t\t\t\t\t// Handle Task snapshot resetting aggregation even if it doesn't produce an event\n\t\t\t\t\tif _, ok := event.(*a2a.Task); ok {\n\t\t\t\t\t\tp.aggregatePartial(ctx, event, nil)\n\t\t\t\t\t}\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\n\t\t\t\tgotEvents = append(gotEvents, p.aggregatePartial(ctx, event, adkEvent)...)\n\t\t\t}\n\t\t\topts := []cmp.Option{\n\t\t\t\tcmpopts.IgnoreFields(session.Event{}, \"ID\", \"Timestamp\", \"InvocationID\", \"Author\", \"Branch\", \"CustomMetadata\", \"Actions\"),\n\t\t\t}\n\t\t\tif diff := cmp.Diff(tc.wantEvents, gotEvents, opts...); diff != \"\" {\n\t\t\t\tt.Errorf(\"mismatch (-want +got):\\n%s\", diff)\n\t\t\t}\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "agent/remoteagent/a2a_agent_test.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage remoteagent\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"iter\"\n\t\"net/http\"\n\t\"net/http/httptest\"\n\t\"strings\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/a2aproject/a2a-go/a2a\"\n\t\"github.com/a2aproject/a2a-go/a2aclient\"\n\t\"github.com/a2aproject/a2a-go/a2asrv\"\n\t\"github.com/a2aproject/a2a-go/a2asrv/eventqueue\"\n\t\"github.com/google/go-cmp/cmp\"\n\t\"github.com/google/go-cmp/cmp/cmpopts\"\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/agent\"\n\ticontext \"google.golang.org/adk/internal/context\"\n\t\"google.golang.org/adk/internal/utils\"\n\t\"google.golang.org/adk/model\"\n\t\"google.golang.org/adk/runner\"\n\t\"google.golang.org/adk/server/adka2a\"\n\t\"google.golang.org/adk/session\"\n)\n\ntype mockA2AExecutor struct {\n\texecuteFn func(ctx context.Context, reqCtx *a2asrv.RequestContext, queue eventqueue.Queue) error\n\tcancelFn  func(ctx context.Context, reqCtx *a2asrv.RequestContext, queue eventqueue.Queue) error\n\tcleanupFn func(ctx context.Context, reqCtx *a2asrv.RequestContext, result a2a.SendMessageResult, cause error)\n}\n\nvar _ a2asrv.AgentExecutor = (*mockA2AExecutor)(nil)\n\nfunc (e *mockA2AExecutor) Execute(ctx context.Context, reqCtx *a2asrv.RequestContext, queue eventqueue.Queue) error {\n\tif e.executeFn != nil {\n\t\treturn e.executeFn(ctx, reqCtx, queue)\n\t}\n\treturn fmt.Errorf(\"not implemented\")\n}\n\nfunc (e *mockA2AExecutor) Cancel(ctx context.Context, reqCtx *a2asrv.RequestContext, queue eventqueue.Queue) error {\n\tif e.cancelFn != nil {\n\t\treturn e.cancelFn(ctx, reqCtx, queue)\n\t}\n\tev := a2a.NewStatusUpdateEvent(reqCtx, a2a.TaskStateCanceled, nil)\n\tev.Final = true\n\treturn queue.Write(ctx, ev)\n}\n\nfunc (e *mockA2AExecutor) Cleanup(ctx context.Context, reqCtx *a2asrv.RequestContext, result a2a.SendMessageResult, cause error) {\n\tif e.cleanupFn != nil {\n\t\te.cleanupFn(ctx, reqCtx, result, cause)\n\t}\n}\n\ntype testA2AServer struct {\n\t*httptest.Server\n\thandler a2asrv.RequestHandler\n}\n\nfunc startA2AServer(agentExecutor a2asrv.AgentExecutor) *testA2AServer {\n\trequestHandler := a2asrv.NewHandler(agentExecutor)\n\treturn &testA2AServer{\n\t\tServer:  httptest.NewServer(a2asrv.NewJSONRPCHandler(requestHandler)),\n\t\thandler: requestHandler,\n\t}\n}\n\nfunc newA2ARemoteAgent(t *testing.T, name string, server *testA2AServer) agent.Agent {\n\tt.Helper()\n\tcard := &a2a.AgentCard{PreferredTransport: a2a.TransportProtocolJSONRPC, URL: server.URL, Capabilities: a2a.AgentCapabilities{Streaming: true}}\n\treturn utils.Must(NewA2A(A2AConfig{AgentCard: card, Name: name}))\n}\n\nfunc newInvocationContext(t *testing.T, events []*session.Event) agent.InvocationContext {\n\treturn newInvocationContextWithStreamingMode(t, events, agent.StreamingModeSSE)\n}\n\nfunc prepareSession(t *testing.T, ctx context.Context, events []*session.Event) session.Session {\n\tt.Helper()\n\tservice := session.InMemoryService()\n\tresp, err := service.Create(ctx, &session.CreateRequest{AppName: t.Name(), UserID: \"test\"})\n\tif err != nil {\n\t\tt.Fatalf(\"sessionService.Create() error = %v\", err)\n\t}\n\tfor _, event := range events {\n\t\tif err := service.AppendEvent(ctx, resp.Session, event); err != nil {\n\t\t\tt.Fatalf(\"sessionService.AppendEvent() error = %v\", err)\n\t\t}\n\t}\n\treturn resp.Session\n}\n\nfunc newInvocationContextWithStreamingMode(t *testing.T, events []*session.Event, streamingMode agent.StreamingMode) agent.InvocationContext {\n\tt.Helper()\n\tctx := t.Context()\n\tsession := prepareSession(t, ctx, events)\n\tic := icontext.NewInvocationContext(ctx, icontext.InvocationContextParams{\n\t\tSession: session,\n\t\tRunConfig: &agent.RunConfig{\n\t\t\tStreamingMode: streamingMode,\n\t\t},\n\t})\n\treturn ic\n}\n\nfunc runAndCollect(ic agent.InvocationContext, agnt agent.Agent) ([]*session.Event, error) {\n\tvar collected []*session.Event\n\tfor ev, err := range agnt.Run(ic) {\n\t\tif err != nil {\n\t\t\treturn collected, err\n\t\t}\n\t\tcollected = append(collected, ev)\n\t}\n\treturn collected, nil\n}\n\nfunc toLLMResponses(events []*session.Event) []model.LLMResponse {\n\tvar result []model.LLMResponse\n\tfor _, v := range events {\n\t\tresult = append(result, v.LLMResponse)\n\t}\n\treturn result\n}\n\nfunc newADKEventReplay(t *testing.T, name string, events []*session.Event) agent.Agent {\n\tt.Helper()\n\tagnt, err := agent.New(agent.Config{\n\t\tName: name,\n\t\tRun: func(ic agent.InvocationContext) iter.Seq2[*session.Event, error] {\n\t\t\treturn func(yield func(*session.Event, error) bool) {\n\t\t\t\tfor _, ev := range events {\n\t\t\t\t\tev.InvocationID = ic.InvocationID()\n\t\t\t\t\tev.Branch = ic.Branch()\n\t\t\t\t\tev.Author = name\n\t\t\t\t\tif !yield(ev, nil) {\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t})\n\tif err != nil {\n\t\tt.Fatalf(\"agent.New() error = %v\", err)\n\t}\n\treturn agnt\n}\n\nfunc newA2AEventReplay(t *testing.T, events []a2a.Event) a2asrv.AgentExecutor {\n\treturn &mockA2AExecutor{\n\t\texecuteFn: func(ctx context.Context, reqCtx *a2asrv.RequestContext, queue eventqueue.Queue) error {\n\t\t\tfor _, ev := range events {\n\t\t\t\t// A2A stack is going to fail the request if events don't have correct taskID and contextID\n\t\t\t\tswitch v := ev.(type) {\n\t\t\t\tcase *a2a.Message:\n\t\t\t\t\tv.TaskID = reqCtx.TaskID\n\t\t\t\t\tv.ContextID = reqCtx.ContextID\n\t\t\t\tcase *a2a.Task:\n\t\t\t\t\tv.ID = reqCtx.TaskID\n\t\t\t\t\tv.ContextID = reqCtx.ContextID\n\t\t\t\tcase *a2a.TaskStatusUpdateEvent:\n\t\t\t\t\tv.TaskID = reqCtx.TaskID\n\t\t\t\t\tv.ContextID = reqCtx.ContextID\n\t\t\t\tcase *a2a.TaskArtifactUpdateEvent:\n\t\t\t\t\tv.TaskID = reqCtx.TaskID\n\t\t\t\t\tv.ContextID = reqCtx.ContextID\n\t\t\t\t}\n\t\t\t\tif err := queue.Write(ctx, ev); err != nil {\n\t\t\t\t\tt.Errorf(\"queue.Write() error = %v\", err)\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn nil\n\t\t},\n\t}\n}\n\nfunc newUserHello() *session.Event {\n\tevent := session.NewEvent(\"invocation\")\n\tevent.Author = \"user\"\n\tevent.Content = genai.NewContentFromText(\"hello\", genai.RoleUser)\n\treturn event\n}\n\nfunc newFinalStatusUpdate(task *a2a.Task, state a2a.TaskState, msgParts ...a2a.Part) *a2a.TaskStatusUpdateEvent {\n\tevent := a2a.NewStatusUpdateEvent(task, state, nil)\n\tif len(msgParts) > 0 {\n\t\tevent.Status.Message = a2a.NewMessageForTask(a2a.MessageRoleAgent, task, msgParts...)\n\t}\n\tevent.Final = true\n\treturn event\n}\n\nfunc TestRemoteAgent_ADK2ADK(t *testing.T) {\n\ttestCases := []struct {\n\t\tname          string\n\t\tremoteEvents  []*session.Event\n\t\twantResponses []model.LLMResponse\n\t\twantEscalate  bool\n\t\twantTransfer  string\n\t\tnoStreaming   bool\n\t}{\n\t\t{\n\t\t\tname: \"text streaming\",\n\t\t\tremoteEvents: []*session.Event{\n\t\t\t\t{LLMResponse: model.LLMResponse{Content: genai.NewContentFromText(\"hello \", genai.RoleModel), Partial: true}},\n\t\t\t\t{LLMResponse: model.LLMResponse{Content: genai.NewContentFromText(\"world\", genai.RoleModel), Partial: true, TurnComplete: true}},\n\t\t\t\t{LLMResponse: model.LLMResponse{Content: genai.NewContentFromText(\"hello world\", genai.RoleModel)}},\n\t\t\t},\n\t\t\twantResponses: []model.LLMResponse{\n\t\t\t\t{Content: genai.NewContentFromText(\"hello \", genai.RoleModel), Partial: true},\n\t\t\t\t{Content: genai.NewContentFromText(\"world\", genai.RoleModel), Partial: true},\n\t\t\t\t{Content: genai.NewContentFromText(\"hello world\", genai.RoleModel)},\n\t\t\t\t{TurnComplete: true},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"text streaming - no streaming mode\",\n\t\t\tremoteEvents: []*session.Event{\n\t\t\t\t{LLMResponse: model.LLMResponse{Content: genai.NewContentFromText(\"hello world\", genai.RoleModel)}},\n\t\t\t},\n\t\t\twantResponses: []model.LLMResponse{\n\t\t\t\t{Content: genai.NewContentFromText(\"hello world\", genai.RoleModel), TurnComplete: true},\n\t\t\t},\n\t\t\tnoStreaming: true,\n\t\t},\n\t\t{\n\t\t\tname: \"code execution\",\n\t\t\tremoteEvents: []*session.Event{\n\t\t\t\t{LLMResponse: model.LLMResponse{Content: genai.NewContentFromExecutableCode(\"print('hello')\", genai.LanguagePython, genai.RoleModel)}},\n\t\t\t\t{LLMResponse: model.LLMResponse{Content: genai.NewContentFromCodeExecutionResult(genai.OutcomeOK, \"hello\", genai.RoleModel)}},\n\t\t\t},\n\t\t\twantResponses: []model.LLMResponse{\n\t\t\t\t{Content: genai.NewContentFromExecutableCode(\"print('hello')\", genai.LanguagePython, genai.RoleModel)},\n\t\t\t\t{Content: genai.NewContentFromCodeExecutionResult(genai.OutcomeOK, \"hello\", genai.RoleModel)},\n\t\t\t\t{TurnComplete: true},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"function calls\",\n\t\t\tremoteEvents: []*session.Event{\n\t\t\t\t{LLMResponse: model.LLMResponse{Content: genai.NewContentFromFunctionCall(\"get_weather\", map[string]any{\"city\": \"Warsaw\"}, genai.RoleModel)}},\n\t\t\t\t{LLMResponse: model.LLMResponse{Content: genai.NewContentFromFunctionResponse(\"get_weather\", map[string]any{\"temo\": \"1C\"}, genai.RoleModel)}},\n\t\t\t},\n\t\t\twantResponses: []model.LLMResponse{\n\t\t\t\t{Content: genai.NewContentFromFunctionCall(\"get_weather\", map[string]any{\"city\": \"Warsaw\"}, genai.RoleModel)},\n\t\t\t\t{Content: genai.NewContentFromFunctionResponse(\"get_weather\", map[string]any{\"temo\": \"1C\"}, genai.RoleModel)},\n\t\t\t\t{TurnComplete: true},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"files\",\n\t\t\tremoteEvents: []*session.Event{\n\t\t\t\t{LLMResponse: model.LLMResponse{Content: genai.NewContentFromBytes([]byte(\"hello\"), \"text\", genai.RoleModel)}},\n\t\t\t\t{LLMResponse: model.LLMResponse{Content: genai.NewContentFromURI(\"http://text.com/text.txt\", \"text\", genai.RoleModel)}},\n\t\t\t},\n\t\t\twantResponses: []model.LLMResponse{\n\t\t\t\t{Content: genai.NewContentFromBytes([]byte(\"hello\"), \"text\", genai.RoleModel)},\n\t\t\t\t{Content: genai.NewContentFromURI(\"http://text.com/text.txt\", \"text\", genai.RoleModel)},\n\t\t\t\t{TurnComplete: true},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"escalation\",\n\t\t\tremoteEvents: []*session.Event{\n\t\t\t\t{\n\t\t\t\t\tLLMResponse: model.LLMResponse{Content: genai.NewContentFromText(\"stop\", genai.RoleModel)},\n\t\t\t\t\tActions:     session.EventActions{Escalate: true},\n\t\t\t\t},\n\t\t\t},\n\t\t\twantResponses: []model.LLMResponse{\n\t\t\t\t{Content: genai.NewContentFromText(\"stop\", genai.RoleModel)},\n\t\t\t\t{TurnComplete: true},\n\t\t\t},\n\t\t\twantEscalate: true,\n\t\t},\n\t\t{\n\t\t\tname: \"transfer\",\n\t\t\tremoteEvents: []*session.Event{\n\t\t\t\t{\n\t\t\t\t\tLLMResponse: model.LLMResponse{Content: genai.NewContentFromText(\"stop\", genai.RoleModel)},\n\t\t\t\t\tActions:     session.EventActions{TransferToAgent: \"a-2\"},\n\t\t\t\t},\n\t\t\t},\n\t\t\twantResponses: []model.LLMResponse{\n\t\t\t\t{Content: genai.NewContentFromText(\"stop\", genai.RoleModel)},\n\t\t\t\t{TurnComplete: true},\n\t\t\t},\n\t\t\twantTransfer: \"a-2\",\n\t\t},\n\t\t{\n\t\t\tname: \"long-running function call\",\n\t\t\tremoteEvents: []*session.Event{\n\t\t\t\t{LLMResponse: model.LLMResponse{Content: genai.NewContentFromText(\"Hello!\", genai.RoleModel), Partial: true}},\n\t\t\t\t{LLMResponse: model.LLMResponse{Content: genai.NewContentFromText(\" I'll need your approval first:\", genai.RoleModel), Partial: true}},\n\t\t\t\t{LLMResponse: model.LLMResponse{Content: genai.NewContentFromText(\"Hello! I'll need your approval first:\", genai.RoleModel)}},\n\t\t\t\t{\n\t\t\t\t\tLLMResponse: model.LLMResponse{Content: genai.NewContentFromParts(\n\t\t\t\t\t\t[]*genai.Part{{FunctionCall: &genai.FunctionCall{Name: \"create_ticket\", ID: \"abc-123\"}}}, genai.RoleModel,\n\t\t\t\t\t)},\n\t\t\t\t\tLongRunningToolIDs: []string{\"abc-123\"},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tLLMResponse: model.LLMResponse{Content: genai.NewContentFromParts(\n\t\t\t\t\t\t[]*genai.Part{{FunctionResponse: &genai.FunctionResponse{\n\t\t\t\t\t\t\tName: \"create_ticket\", ID: \"abc-123\", Response: map[string]any{\"ticket_id\": \"123\"},\n\t\t\t\t\t\t}}}, genai.RoleModel,\n\t\t\t\t\t)},\n\t\t\t\t\tLongRunningToolIDs: []string{\"abc-123\"},\n\t\t\t\t},\n\t\t\t\t{LLMResponse: model.LLMResponse{Content: genai.NewContentFromText(\"Waiting for the approval to continue.\", genai.RoleModel)}},\n\t\t\t},\n\t\t\twantResponses: []model.LLMResponse{\n\t\t\t\t{Content: genai.NewContentFromText(\"Hello!\", genai.RoleModel), Partial: true},\n\t\t\t\t{Content: genai.NewContentFromText(\" I'll need your approval first:\", genai.RoleModel), Partial: true},\n\t\t\t\t// Aggregated partial responses are emitted before a long-running function call\n\t\t\t\t{Content: genai.NewContentFromText(\"Hello! I'll need your approval first:\", genai.RoleModel)},\n\t\t\t\t{Content: genai.NewContentFromText(\"Waiting for the approval to continue.\", genai.RoleModel)},\n\t\t\t\t{\n\t\t\t\t\tContent: genai.NewContentFromParts(\n\t\t\t\t\t\t[]*genai.Part{\n\t\t\t\t\t\t\t{FunctionCall: &genai.FunctionCall{Name: \"create_ticket\", ID: \"abc-123\"}},\n\t\t\t\t\t\t\t{FunctionResponse: &genai.FunctionResponse{Name: \"create_ticket\", ID: \"abc-123\", Response: map[string]any{\"ticket_id\": \"123\"}}},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tgenai.RoleModel,\n\t\t\t\t\t),\n\t\t\t\t\tTurnComplete: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"metadata\",\n\t\t\tremoteEvents: []*session.Event{\n\t\t\t\t{\n\t\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\t\tContent:           genai.NewContentFromText(\"hello\", genai.RoleModel),\n\t\t\t\t\t\tCitationMetadata:  &genai.CitationMetadata{Citations: []*genai.Citation{{Title: \"Title1\"}, {Title: \"Title2\"}}},\n\t\t\t\t\t\tUsageMetadata:     &genai.GenerateContentResponseUsageMetadata{CandidatesTokenCount: 12, ThoughtsTokenCount: 42},\n\t\t\t\t\t\tGroundingMetadata: &genai.GroundingMetadata{SourceFlaggingUris: []*genai.GroundingMetadataSourceFlaggingURI{{SourceID: \"id1\"}}},\n\t\t\t\t\t\tCustomMetadata:    map[string]any{\"nested\": map[string]any{\"key\": \"value\"}},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twantResponses: []model.LLMResponse{\n\t\t\t\t{\n\t\t\t\t\tContent:           genai.NewContentFromText(\"hello\", genai.RoleModel),\n\t\t\t\t\tCitationMetadata:  &genai.CitationMetadata{Citations: []*genai.Citation{{Title: \"Title1\"}, {Title: \"Title2\"}}},\n\t\t\t\t\tUsageMetadata:     &genai.GenerateContentResponseUsageMetadata{CandidatesTokenCount: 12, ThoughtsTokenCount: 42},\n\t\t\t\t\tGroundingMetadata: &genai.GroundingMetadata{SourceFlaggingUris: []*genai.GroundingMetadataSourceFlaggingURI{{SourceID: \"id1\"}}},\n\t\t\t\t\tCustomMetadata:    map[string]any{\"nested\": map[string]any{\"key\": \"value\"}},\n\t\t\t\t},\n\t\t\t\t{TurnComplete: true},\n\t\t\t},\n\t\t},\n\t}\n\n\tignoreFields := []cmp.Option{\n\t\tcmpopts.IgnoreFields(model.LLMResponse{}, \"CustomMetadata\"),\n\t}\n\n\tfor _, outputMode := range []adka2a.OutputMode{adka2a.OutputArtifactPerRun, adka2a.OutputArtifactPerEvent} {\n\t\tfor _, tc := range testCases {\n\t\t\tt.Run(tc.name+\" \"+string(outputMode), func(t *testing.T) {\n\t\t\t\texecutor := adka2a.NewExecutor(adka2a.ExecutorConfig{\n\t\t\t\t\tOutputMode: outputMode,\n\t\t\t\t\tRunnerConfig: runner.Config{\n\t\t\t\t\t\tAppName:        \"RemoteAgentTest\",\n\t\t\t\t\t\tSessionService: session.InMemoryService(),\n\t\t\t\t\t\tAgent:          newADKEventReplay(t, \"root\", tc.remoteEvents),\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t\t\tremoteAgent := newA2ARemoteAgent(t, \"a2a\", startA2AServer(executor))\n\n\t\t\t\tmode := agent.StreamingModeSSE\n\t\t\t\tif tc.noStreaming {\n\t\t\t\t\tmode = agent.StreamingModeNone\n\t\t\t\t}\n\t\t\t\tictx := newInvocationContextWithStreamingMode(t, []*session.Event{newUserHello()}, mode)\n\t\t\t\tgotEvents, err := runAndCollect(ictx, remoteAgent)\n\t\t\t\tif err != nil {\n\t\t\t\t\tt.Fatalf(\"agent.Run() error = %v\", err)\n\t\t\t\t}\n\t\t\t\tgotResponses := toLLMResponses(gotEvents)\n\t\t\t\tif diff := cmp.Diff(tc.wantResponses, gotResponses, ignoreFields...); diff != \"\" {\n\t\t\t\t\tt.Fatalf(\"agent.Run() wrong result (+got,-want):\\ngot = %+v\\nwant = %+v\\ndiff = %s\", gotResponses, tc.wantResponses, diff)\n\t\t\t\t}\n\t\t\t\tvar lastActions *session.EventActions\n\t\t\t\tfor i, event := range gotEvents {\n\t\t\t\t\tif _, ok := event.CustomMetadata[adka2a.ToADKMetaKey(\"response\")]; !ok {\n\t\t\t\t\t\tif aggregated, _ := event.CustomMetadata[adka2a.ToADKMetaKey(\"aggregated\")].(bool); !aggregated {\n\t\t\t\t\t\t\tt.Fatalf(\"event.CustomMetadata = %v, want meta[%q] = original event or meta[%q] = true\", event.CustomMetadata, adka2a.ToADKMetaKey(\"response\"), adka2a.ToADKMetaKey(\"aggregated\"))\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\twantRequest := i == len(gotEvents)-1\n\t\t\t\t\tif _, ok := event.CustomMetadata[adka2a.ToADKMetaKey(\"request\")]; ok != wantRequest {\n\t\t\t\t\t\tt.Fatalf(\"event.CustomMetadata = %v, want request = %v\", event.CustomMetadata, wantRequest)\n\t\t\t\t\t}\n\t\t\t\t\tlastActions = &event.Actions\n\t\t\t\t}\n\t\t\t\tif tc.wantEscalate != lastActions.Escalate {\n\t\t\t\t\tt.Fatalf(\"lastActions.Escalate = %v, want %v\", lastActions.Escalate, tc.wantEscalate)\n\t\t\t\t}\n\t\t\t\tif tc.wantTransfer != lastActions.TransferToAgent {\n\t\t\t\t\tt.Fatalf(\"lastActions.TransferToAgent = %v, want %v\", lastActions.TransferToAgent, tc.wantTransfer)\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\t}\n}\n\nfunc TestRemoteAgent_ADK2A2A(t *testing.T) {\n\ttask := &a2a.Task{ID: a2a.NewTaskID(), ContextID: a2a.NewContextID()}\n\tartifactEvent := a2a.NewArtifactEvent(task)\n\n\ttestCases := []struct {\n\t\tname          string\n\t\tremoteEvents  []a2a.Event\n\t\twantResponses []model.LLMResponse\n\t}{\n\t\t{\n\t\t\tname:          \"empty message\",\n\t\t\tremoteEvents:  []a2a.Event{a2a.NewMessage(a2a.MessageRoleAgent)},\n\t\t\twantResponses: []model.LLMResponse{{TurnComplete: true}},\n\t\t},\n\t\t{\n\t\t\tname: \"message\",\n\t\t\tremoteEvents: []a2a.Event{\n\t\t\t\ta2a.NewMessage(a2a.MessageRoleAgent, a2a.TextPart{Text: \"hello\"}, a2a.TextPart{Text: \"world\"}),\n\t\t\t},\n\t\t\twantResponses: []model.LLMResponse{\n\t\t\t\t{\n\t\t\t\t\tTurnComplete: true,\n\t\t\t\t\tContent: &genai.Content{\n\t\t\t\t\t\tParts: []*genai.Part{genai.NewPartFromText(\"hello\"), genai.NewPartFromText(\"world\")},\n\t\t\t\t\t\tRole:  genai.RoleModel,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"empty task\",\n\t\t\tremoteEvents: []a2a.Event{\n\t\t\t\t&a2a.Task{Status: a2a.TaskStatus{State: a2a.TaskStateCompleted}},\n\t\t\t},\n\t\t\twantResponses: []model.LLMResponse{{TurnComplete: true}},\n\t\t},\n\t\t{\n\t\t\tname: \"task with status message\",\n\t\t\tremoteEvents: []a2a.Event{\n\t\t\t\t&a2a.Task{Status: a2a.TaskStatus{\n\t\t\t\t\tState:   a2a.TaskStateCompleted,\n\t\t\t\t\tMessage: a2a.NewMessage(a2a.MessageRoleAgent, a2a.TextPart{Text: \"hello\"}),\n\t\t\t\t}},\n\t\t\t},\n\t\t\twantResponses: []model.LLMResponse{{\n\t\t\t\tTurnComplete: true,\n\t\t\t\tContent:      genai.NewContentFromText(\"hello\", genai.RoleModel),\n\t\t\t}},\n\t\t},\n\t\t{\n\t\t\tname: \"task with multipart artifact\",\n\t\t\tremoteEvents: []a2a.Event{\n\t\t\t\t&a2a.Task{\n\t\t\t\t\tStatus: a2a.TaskStatus{State: a2a.TaskStateCompleted},\n\t\t\t\t\tArtifacts: []*a2a.Artifact{\n\t\t\t\t\t\t{Parts: a2a.ContentParts{a2a.TextPart{Text: \"hello\"}, a2a.TextPart{Text: \"world\"}}},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twantResponses: []model.LLMResponse{\n\t\t\t\t{\n\t\t\t\t\tTurnComplete: true,\n\t\t\t\t\tContent: &genai.Content{\n\t\t\t\t\t\tParts: []*genai.Part{genai.NewPartFromText(\"hello\"), genai.NewPartFromText(\"world\")},\n\t\t\t\t\t\tRole:  genai.RoleModel,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"multiple tasks\",\n\t\t\tremoteEvents: []a2a.Event{\n\t\t\t\t&a2a.Task{Status: a2a.TaskStatus{\n\t\t\t\t\tState:   a2a.TaskStateWorking,\n\t\t\t\t\tMessage: a2a.NewMessage(a2a.MessageRoleAgent, a2a.TextPart{Text: \"hello\"}),\n\t\t\t\t}},\n\t\t\t\t&a2a.Task{\n\t\t\t\t\tStatus: a2a.TaskStatus{State: a2a.TaskStateCompleted},\n\t\t\t\t\tArtifacts: []*a2a.Artifact{\n\t\t\t\t\t\t{Parts: a2a.ContentParts{a2a.TextPart{Text: \"world\"}}},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twantResponses: []model.LLMResponse{\n\t\t\t\t{Content: genai.NewContentFromText(\"hello\", genai.RoleModel)},\n\t\t\t\t{Content: genai.NewContentFromText(\"world\", genai.RoleModel), TurnComplete: true},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"task with multiple artifacts\",\n\t\t\tremoteEvents: []a2a.Event{\n\t\t\t\t&a2a.Task{\n\t\t\t\t\tStatus: a2a.TaskStatus{State: a2a.TaskStateCompleted},\n\t\t\t\t\tArtifacts: []*a2a.Artifact{\n\t\t\t\t\t\t{Parts: a2a.ContentParts{a2a.TextPart{Text: \"hello\"}}},\n\t\t\t\t\t\t{Parts: a2a.ContentParts{a2a.TextPart{Text: \"world\"}}},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twantResponses: []model.LLMResponse{\n\t\t\t\t{\n\t\t\t\t\tTurnComplete: true,\n\t\t\t\t\tContent: &genai.Content{\n\t\t\t\t\t\tParts: []*genai.Part{genai.NewPartFromText(\"hello\"), genai.NewPartFromText(\"world\")},\n\t\t\t\t\t\tRole:  genai.RoleModel,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"artifact parts translation\",\n\t\t\tremoteEvents: []a2a.Event{\n\t\t\t\tartifactEvent,\n\t\t\t\ta2a.NewArtifactUpdateEvent(task, artifactEvent.Artifact.ID, a2a.TextPart{Text: \"hello\"}),\n\t\t\t\ta2a.NewArtifactUpdateEvent(task, artifactEvent.Artifact.ID, a2a.TextPart{Text: \"world\"}),\n\t\t\t\tnewFinalStatusUpdate(task, a2a.TaskStateCompleted),\n\t\t\t},\n\t\t\twantResponses: []model.LLMResponse{\n\t\t\t\t{Content: genai.NewContentFromText(\"hello\", genai.RoleModel), Partial: true},\n\t\t\t\t{Content: genai.NewContentFromText(\"world\", genai.RoleModel), Partial: true},\n\t\t\t\t{Content: genai.NewContentFromText(\"helloworld\", genai.RoleModel)},\n\t\t\t\t{TurnComplete: true},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"non-final status update messages as thoughts\",\n\t\t\tremoteEvents: []a2a.Event{\n\t\t\t\ta2a.NewStatusUpdateEvent(task, a2a.TaskStateSubmitted, a2a.NewMessage(a2a.MessageRoleAgent, a2a.TextPart{Text: \"submitted...\\n\"})),\n\t\t\t\ta2a.NewStatusUpdateEvent(task, a2a.TaskStateWorking, a2a.NewMessage(a2a.MessageRoleAgent, a2a.TextPart{Text: \"working...\\n\"})),\n\t\t\t\tnewFinalStatusUpdate(task, a2a.TaskStateCompleted, a2a.TextPart{Text: \"completed!\"}),\n\t\t\t},\n\t\t\twantResponses: []model.LLMResponse{\n\t\t\t\t{Content: &genai.Content{Parts: []*genai.Part{{Text: \"submitted...\\n\", Thought: true}}, Role: genai.RoleModel}, Partial: true},\n\t\t\t\t{Content: &genai.Content{Parts: []*genai.Part{{Text: \"working...\\n\", Thought: true}}, Role: genai.RoleModel}, Partial: true},\n\t\t\t\t{Content: genai.NewContentFromText(\"completed!\", genai.RoleModel), TurnComplete: true},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"empty non-final status updates ignored\",\n\t\t\tremoteEvents: []a2a.Event{\n\t\t\t\ta2a.NewStatusUpdateEvent(task, a2a.TaskStateSubmitted, nil),\n\t\t\t\ta2a.NewStatusUpdateEvent(task, a2a.TaskStateWorking, nil),\n\t\t\t\tnewFinalStatusUpdate(task, a2a.TaskStateCompleted),\n\t\t\t},\n\t\t\twantResponses: []model.LLMResponse{\n\t\t\t\t{TurnComplete: true},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"partial and non-partial event aggregation\",\n\t\t\tremoteEvents: []a2a.Event{\n\t\t\t\tartifactEvent,\n\t\t\t\t&a2a.TaskArtifactUpdateEvent{\n\t\t\t\t\tTaskID:    task.ID,\n\t\t\t\t\tContextID: task.ContextID,\n\t\t\t\t\tArtifact:  &a2a.Artifact{ID: artifactEvent.Artifact.ID, Parts: a2a.ContentParts{a2a.TextPart{Text: \"1\"}}},\n\t\t\t\t\tAppend:    true,\n\t\t\t\t},\n\t\t\t\t&a2a.TaskArtifactUpdateEvent{\n\t\t\t\t\tTaskID:    task.ID,\n\t\t\t\t\tContextID: task.ContextID,\n\t\t\t\t\tArtifact:  &a2a.Artifact{ID: artifactEvent.Artifact.ID, Parts: a2a.ContentParts{a2a.TextPart{Text: \"2\"}}},\n\t\t\t\t\tAppend:    true,\n\t\t\t\t},\n\t\t\t\t&a2a.TaskArtifactUpdateEvent{\n\t\t\t\t\tTaskID:    task.ID,\n\t\t\t\t\tContextID: task.ContextID,\n\t\t\t\t\tArtifact:  &a2a.Artifact{ID: artifactEvent.Artifact.ID, Parts: a2a.ContentParts{a2a.TextPart{Text: \"3\"}}},\n\t\t\t\t\tAppend:    false,\n\t\t\t\t},\n\t\t\t\t&a2a.TaskArtifactUpdateEvent{\n\t\t\t\t\tTaskID:    task.ID,\n\t\t\t\t\tContextID: task.ContextID,\n\t\t\t\t\tArtifact:  &a2a.Artifact{ID: artifactEvent.Artifact.ID, Parts: a2a.ContentParts{a2a.TextPart{Text: \"4\"}}},\n\t\t\t\t\tAppend:    true,\n\t\t\t\t},\n\t\t\t\tnewFinalStatusUpdate(task, a2a.TaskStateCompleted, a2a.TextPart{Text: \"5\"}),\n\t\t\t},\n\t\t\twantResponses: []model.LLMResponse{\n\t\t\t\t{Content: genai.NewContentFromText(\"1\", genai.RoleModel), Partial: true},\n\t\t\t\t{Content: genai.NewContentFromText(\"2\", genai.RoleModel), Partial: true},\n\t\t\t\t{Content: genai.NewContentFromText(\"3\", genai.RoleModel), Partial: true},\n\t\t\t\t{Content: genai.NewContentFromText(\"4\", genai.RoleModel), Partial: true},\n\t\t\t\t{Content: genai.NewContentFromText(\"34\", genai.RoleModel)},\n\t\t\t\t{Content: genai.NewContentFromText(\"5\", genai.RoleModel), TurnComplete: true},\n\t\t\t},\n\t\t},\n\t}\n\n\tignoreFields := []cmp.Option{\n\t\tcmpopts.IgnoreFields(model.LLMResponse{}, \"CustomMetadata\"),\n\t}\n\n\tfor _, tc := range testCases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\texecutor := newA2AEventReplay(t, tc.remoteEvents)\n\t\t\tremoteAgent := newA2ARemoteAgent(t, \"a2a\", startA2AServer(executor))\n\n\t\t\tictx := newInvocationContext(t, []*session.Event{newUserHello()})\n\t\t\tgotEvents, err := runAndCollect(ictx, remoteAgent)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"agent.Run() error = %v\", err)\n\t\t\t}\n\t\t\tgotResponses := toLLMResponses(gotEvents)\n\t\t\tif diff := cmp.Diff(tc.wantResponses, gotResponses, ignoreFields...); diff != \"\" {\n\t\t\t\tt.Fatalf(\"agent.Run() wrong result (+got,-want):\\ngot = %+v\\nwant = %+v\\ndiff = %s\", gotResponses, tc.wantResponses, diff)\n\t\t\t}\n\n\t\t\tfor i, event := range gotEvents {\n\t\t\t\tif _, ok := event.CustomMetadata[adka2a.ToADKMetaKey(\"response\")]; !ok {\n\t\t\t\t\tif aggregated, _ := event.CustomMetadata[adka2a.ToADKMetaKey(\"aggregated\")].(bool); !aggregated {\n\t\t\t\t\t\tt.Fatalf(\"event.CustomMetadata = %v, want meta[%q] = original event or meta[%q] = true\", event.CustomMetadata, adka2a.ToADKMetaKey(\"response\"), adka2a.ToADKMetaKey(\"aggregated\"))\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\twantOriginalRequest := len(gotEvents)-1 == i\n\t\t\t\tif _, ok := event.CustomMetadata[adka2a.ToADKMetaKey(\"request\")]; ok != wantOriginalRequest {\n\t\t\t\t\tt.Fatalf(\"event.CustomMetadata = %v, want original request = %v\", event.CustomMetadata, wantOriginalRequest)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestRemoteAgent_RequestCallbacks(t *testing.T) {\n\ttestCases := []struct {\n\t\tname          string\n\t\tsessionEvents []*session.Event\n\t\tevents        func(*a2asrv.RequestContext) []a2a.Event\n\t\tbefore        []BeforeA2ARequestCallback\n\t\tafter         []AfterA2ARequestCallback\n\t\tconverter     A2AEventConverter\n\t\twantResponses []model.LLMResponse\n\t\twantErr       error\n\t}{\n\t\t{\n\t\t\tname: \"request and response modification\",\n\t\t\tevents: func(rc *a2asrv.RequestContext) []a2a.Event {\n\t\t\t\treturn []a2a.Event{a2a.NewMessage(a2a.MessageRoleAgent, a2a.TextPart{Text: \"foo\"})}\n\t\t\t},\n\t\t\tbefore: []BeforeA2ARequestCallback{\n\t\t\t\tfunc(ctx agent.CallbackContext, req *a2a.MessageSendParams) (*session.Event, error) {\n\t\t\t\t\treq.Metadata = map[string]any{\"counter\": 1}\n\t\t\t\t\treturn nil, nil\n\t\t\t\t},\n\t\t\t},\n\t\t\tafter: []AfterA2ARequestCallback{\n\t\t\t\tfunc(ctx agent.CallbackContext, req *a2a.MessageSendParams, result *session.Event, err error) (*session.Event, error) {\n\t\t\t\t\tresult.Content = genai.NewContentFromText(result.Content.Parts[0].Text+\"bar\", genai.RoleModel)\n\t\t\t\t\tresult.CustomMetadata = req.Metadata\n\t\t\t\t\treturn nil, nil\n\t\t\t\t},\n\t\t\t},\n\t\t\twantResponses: []model.LLMResponse{\n\t\t\t\t{\n\t\t\t\t\tContent:        genai.NewContentFromText(\"foobar\", genai.RoleModel),\n\t\t\t\t\tCustomMetadata: map[string]any{\"counter\": 1},\n\t\t\t\t\tTurnComplete:   true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"after invoked for every event\",\n\t\t\tevents: func(rc *a2asrv.RequestContext) []a2a.Event {\n\t\t\t\tartifactEvent := a2a.NewArtifactEvent(rc, a2a.TextPart{Text: \"Hello\"})\n\t\t\t\tfinalEvent := a2a.NewStatusUpdateEvent(rc, a2a.TaskStateCompleted, nil)\n\t\t\t\tfinalEvent.Final = true\n\t\t\t\treturn []a2a.Event{\n\t\t\t\t\tartifactEvent,\n\t\t\t\t\ta2a.NewArtifactUpdateEvent(rc, artifactEvent.Artifact.ID, a2a.TextPart{Text: \", world!\"}),\n\t\t\t\t\tfinalEvent,\n\t\t\t\t}\n\t\t\t},\n\t\t\tafter: []AfterA2ARequestCallback{\n\t\t\t\tfunc(ctx agent.CallbackContext, req *a2a.MessageSendParams, result *session.Event, err error) (*session.Event, error) {\n\t\t\t\t\tresult.CustomMetadata = map[string]any{\"foo\": \"bar\"}\n\t\t\t\t\treturn nil, nil\n\t\t\t\t},\n\t\t\t},\n\t\t\twantResponses: []model.LLMResponse{\n\t\t\t\t{\n\t\t\t\t\tPartial:        true,\n\t\t\t\t\tContent:        genai.NewContentFromText(\"Hello\", genai.RoleModel),\n\t\t\t\t\tCustomMetadata: map[string]any{\"foo\": \"bar\"},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tPartial:        true,\n\t\t\t\t\tContent:        genai.NewContentFromText(\", world!\", genai.RoleModel),\n\t\t\t\t\tCustomMetadata: map[string]any{\"foo\": \"bar\"},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tContent:        genai.NewContentFromText(\"Hello, world!\", genai.RoleModel),\n\t\t\t\t\tCustomMetadata: map[string]any{\"foo\": \"bar\"},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tTurnComplete:   true,\n\t\t\t\t\tCustomMetadata: map[string]any{\"foo\": \"bar\"},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"after error stops the run\",\n\t\t\tevents: func(rc *a2asrv.RequestContext) []a2a.Event {\n\t\t\t\tfinalEvent := a2a.NewStatusUpdateEvent(rc, a2a.TaskStateCompleted, nil)\n\t\t\t\tfinalEvent.Final = true\n\t\t\t\treturn []a2a.Event{\n\t\t\t\t\ta2a.NewArtifactEvent(rc, a2a.TextPart{Text: \"Hello\"}),\n\t\t\t\t\tfinalEvent,\n\t\t\t\t}\n\t\t\t},\n\t\t\tafter: []AfterA2ARequestCallback{\n\t\t\t\tfunc(ctx agent.CallbackContext, req *a2a.MessageSendParams, result *session.Event, err error) (*session.Event, error) {\n\t\t\t\t\treturn nil, fmt.Errorf(\"rejected\")\n\t\t\t\t},\n\t\t\t},\n\t\t\twantErr: fmt.Errorf(\"rejected\"),\n\t\t},\n\t\t{\n\t\t\tname: \"request overwrite with response\",\n\t\t\tbefore: []BeforeA2ARequestCallback{\n\t\t\t\tfunc(ctx agent.CallbackContext, req *a2a.MessageSendParams) (*session.Event, error) {\n\t\t\t\t\treturn &session.Event{LLMResponse: model.LLMResponse{Content: genai.NewContentFromText(\"hello\", genai.RoleModel)}}, nil\n\t\t\t\t},\n\t\t\t},\n\t\t\twantResponses: []model.LLMResponse{{Content: genai.NewContentFromText(\"hello\", genai.RoleModel)}},\n\t\t},\n\t\t{\n\t\t\tname: \"request overwrite with error\",\n\t\t\tbefore: []BeforeA2ARequestCallback{\n\t\t\t\tfunc(ctx agent.CallbackContext, req *a2a.MessageSendParams) (*session.Event, error) {\n\t\t\t\t\treturn nil, fmt.Errorf(\"failed\")\n\t\t\t\t},\n\t\t\t},\n\t\t\twantErr: fmt.Errorf(\"failed\"),\n\t\t},\n\t\t{\n\t\t\tname: \"response overwrite\",\n\t\t\tafter: []AfterA2ARequestCallback{\n\t\t\t\tfunc(ctx agent.CallbackContext, req *a2a.MessageSendParams, result *session.Event, err error) (*session.Event, error) {\n\t\t\t\t\treturn &session.Event{LLMResponse: model.LLMResponse{Content: genai.NewContentFromText(\"hello\", genai.RoleModel)}}, nil\n\t\t\t\t},\n\t\t\t},\n\t\t\twantResponses: []model.LLMResponse{{Content: genai.NewContentFromText(\"hello\", genai.RoleModel)}},\n\t\t},\n\t\t{\n\t\t\tname: \"response overwrite with error\",\n\t\t\tafter: []AfterA2ARequestCallback{\n\t\t\t\tfunc(ctx agent.CallbackContext, req *a2a.MessageSendParams, result *session.Event, err error) (*session.Event, error) {\n\t\t\t\t\treturn nil, fmt.Errorf(\"failed\")\n\t\t\t\t},\n\t\t\t},\n\t\t\twantErr: fmt.Errorf(\"failed\"),\n\t\t},\n\t\t{\n\t\t\tname: \"before interceptor short-circuit\",\n\t\t\tbefore: []BeforeA2ARequestCallback{\n\t\t\t\tfunc(ctx agent.CallbackContext, req *a2a.MessageSendParams) (*session.Event, error) {\n\t\t\t\t\treturn nil, fmt.Errorf(\"failed\")\n\t\t\t\t},\n\t\t\t\tfunc(ctx agent.CallbackContext, req *a2a.MessageSendParams) (*session.Event, error) {\n\t\t\t\t\tt.Fatalf(\"not called\")\n\t\t\t\t\treturn nil, nil\n\t\t\t\t},\n\t\t\t},\n\t\t\twantErr: fmt.Errorf(\"failed\"),\n\t\t},\n\t\t{\n\t\t\tname: \"after interceptor short-circuit\",\n\t\t\tafter: []AfterA2ARequestCallback{\n\t\t\t\tfunc(ctx agent.CallbackContext, req *a2a.MessageSendParams, result *session.Event, err error) (*session.Event, error) {\n\t\t\t\t\treturn nil, fmt.Errorf(\"failed\")\n\t\t\t\t},\n\t\t\t\tfunc(ctx agent.CallbackContext, req *a2a.MessageSendParams, result *session.Event, err error) (*session.Event, error) {\n\t\t\t\t\tt.Fatalf(\"not called\")\n\t\t\t\t\treturn nil, nil\n\t\t\t\t},\n\t\t\t},\n\t\t\twantErr: fmt.Errorf(\"failed\"),\n\t\t},\n\t\t{\n\t\t\tname:          \"after interceptor for empty session\",\n\t\t\tsessionEvents: []*session.Event{},\n\t\t\tafter: []AfterA2ARequestCallback{\n\t\t\t\tfunc(ctx agent.CallbackContext, req *a2a.MessageSendParams, result *session.Event, err error) (*session.Event, error) {\n\t\t\t\t\tif len(req.Message.Parts) != 0 {\n\t\t\t\t\t\tt.Fatalf(\"got %d parts, expected empty message\", len(req.Message.Parts))\n\t\t\t\t\t}\n\t\t\t\t\treturn nil, fmt.Errorf(\"empty session\")\n\t\t\t\t},\n\t\t\t},\n\t\t\twantErr: fmt.Errorf(\"empty session\"),\n\t\t},\n\t\t{\n\t\t\tname: \"converter error\",\n\t\t\tconverter: func(ctx agent.InvocationContext, req *a2a.MessageSendParams, event a2a.Event, err error) (*session.Event, error) {\n\t\t\t\treturn nil, fmt.Errorf(\"failed\")\n\t\t\t},\n\t\t\twantErr: fmt.Errorf(\"failed\"),\n\t\t},\n\t\t{\n\t\t\tname: \"converter custom response\",\n\t\t\tconverter: func(ctx agent.InvocationContext, req *a2a.MessageSendParams, event a2a.Event, err error) (*session.Event, error) {\n\t\t\t\treturn &session.Event{LLMResponse: model.LLMResponse{Content: genai.NewContentFromText(\"hello\", genai.RoleModel)}}, nil\n\t\t\t},\n\t\t\twantResponses: []model.LLMResponse{{Content: genai.NewContentFromText(\"hello\", genai.RoleModel)}},\n\t\t},\n\t\t{\n\t\t\tname: \"after interceptor invoked with before result\",\n\t\t\tbefore: []BeforeA2ARequestCallback{\n\t\t\t\tfunc(ctx agent.CallbackContext, req *a2a.MessageSendParams) (*session.Event, error) {\n\t\t\t\t\treturn nil, fmt.Errorf(\"before error\")\n\t\t\t\t},\n\t\t\t},\n\t\t\tafter: []AfterA2ARequestCallback{\n\t\t\t\tfunc(ctx agent.CallbackContext, req *a2a.MessageSendParams, result *session.Event, err error) (*session.Event, error) {\n\t\t\t\t\treturn nil, fmt.Errorf(\"after error\")\n\t\t\t\t},\n\t\t\t},\n\t\t\twantErr: fmt.Errorf(\"after error\"),\n\t\t},\n\t}\n\n\tfor _, tc := range testCases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\texecutor := &mockA2AExecutor{\n\t\t\t\texecuteFn: func(ctx context.Context, reqCtx *a2asrv.RequestContext, queue eventqueue.Queue) error {\n\t\t\t\t\tif tc.events != nil {\n\t\t\t\t\t\tfor _, event := range tc.events(reqCtx) {\n\t\t\t\t\t\t\tif err := queue.Write(ctx, event); err != nil {\n\t\t\t\t\t\t\t\treturn err\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t}\n\t\t\t\t\treturn queue.Write(ctx, a2a.NewMessage(a2a.MessageRoleAgent, a2a.TextPart{Text: \"Hi!\"}))\n\t\t\t\t},\n\t\t\t}\n\t\t\tserver := startA2AServer(executor)\n\t\t\tcard := &a2a.AgentCard{PreferredTransport: a2a.TransportProtocolJSONRPC, URL: server.URL, Capabilities: a2a.AgentCapabilities{Streaming: true}}\n\t\t\tremoteAgent, err := NewA2A(A2AConfig{\n\t\t\t\tName:                   \"a2a\",\n\t\t\t\tAgentCard:              card,\n\t\t\t\tBeforeRequestCallbacks: tc.before,\n\t\t\t\tAfterRequestCallbacks:  tc.after,\n\t\t\t\tConverter:              tc.converter,\n\t\t\t})\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"remoteagent.NewA2A() error = %v\", err)\n\t\t\t}\n\n\t\t\tsessionEvents := []*session.Event{newUserHello()}\n\t\t\tif tc.sessionEvents != nil {\n\t\t\t\tsessionEvents = tc.sessionEvents\n\t\t\t}\n\t\t\tictx := newInvocationContext(t, sessionEvents)\n\t\t\tgotEvents, err := runAndCollect(ictx, remoteAgent)\n\t\t\tif err != nil && tc.wantErr == nil {\n\t\t\t\tt.Fatalf(\"agent.Run() error = %v, want nil\", err)\n\t\t\t}\n\t\t\tif err == nil && tc.wantErr != nil {\n\t\t\t\tt.Fatalf(\"agent.Run() error = nil, want %v\", tc.wantErr)\n\t\t\t}\n\t\t\tgotResponses := toLLMResponses(gotEvents)\n\t\t\tif diff := cmp.Diff(tc.wantResponses, gotResponses); diff != \"\" {\n\t\t\t\tt.Fatalf(\"agent.Run() wrong result (+got,-want):\\ngot = %+v\\nwant = %+v\\ndiff = %s\", gotResponses, tc.wantResponses, diff)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestRemoteAgent_RequestPayload(t *testing.T) {\n\tremoteAgentName, notRemoteAgentName := \"a2a\", \"not-a2a\"\n\ttestCases := []struct {\n\t\tname          string\n\t\tsessionEvents []*session.Event\n\t\twantRequest   *a2a.MessageSendParams\n\t}{\n\t\t{\n\t\t\tname:          \"only user message\",\n\t\t\tsessionEvents: []*session.Event{newUserHello()},\n\t\t\twantRequest: &a2a.MessageSendParams{\n\t\t\t\tMessage: &a2a.Message{\n\t\t\t\t\tRole:  a2a.MessageRoleUser,\n\t\t\t\t\tParts: []a2a.Part{a2a.TextPart{Text: \"hello\"}},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"history included\",\n\t\t\tsessionEvents: []*session.Event{\n\t\t\t\tnewUserHello(),\n\t\t\t\t{\n\t\t\t\t\tAuthor: notRemoteAgentName,\n\t\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\t\tContent: genai.NewContentFromText(\"hi\", genai.RoleModel),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tAuthor: \"user\",\n\t\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\t\tContent: genai.NewContentFromText(\"how are you?\", genai.RoleUser),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twantRequest: &a2a.MessageSendParams{\n\t\t\t\tMessage: &a2a.Message{\n\t\t\t\t\tRole: a2a.MessageRoleUser,\n\t\t\t\t\tParts: []a2a.Part{\n\t\t\t\t\t\ta2a.TextPart{Text: \"hello\"},\n\t\t\t\t\t\ta2a.TextPart{Text: \"For context:\"},\n\t\t\t\t\t\ta2a.TextPart{Text: fmt.Sprintf(\"[%s] said: hi\", notRemoteAgentName)},\n\t\t\t\t\t\ta2a.TextPart{Text: \"how are you?\"},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"history split by remote agent response\",\n\t\t\tsessionEvents: []*session.Event{\n\t\t\t\t{Author: \"user\", LLMResponse: model.LLMResponse{Content: genai.NewContentFromText(\"msg1\", genai.RoleUser)}},\n\t\t\t\t{Author: notRemoteAgentName, LLMResponse: model.LLMResponse{Content: genai.NewContentFromText(\"resp1\", genai.RoleModel)}},\n\t\t\t\t{\n\t\t\t\t\tAuthor: remoteAgentName,\n\t\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\t\tContent:        genai.NewContentFromText(\"resp2\", genai.RoleModel),\n\t\t\t\t\t\tCustomMetadata: adka2a.ToCustomMetadata(\"\", \"ctx-123\"),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t// only data from this point should be included, because other parts should already be present\n\t\t\t\t// in the remote agent's session\n\t\t\t\t{Author: \"user\", LLMResponse: model.LLMResponse{Content: genai.NewContentFromText(\"msg3\", genai.RoleUser)}},\n\t\t\t\t{Author: notRemoteAgentName, LLMResponse: model.LLMResponse{Content: genai.NewContentFromText(\"resp3\", genai.RoleModel)}},\n\t\t\t},\n\t\t\twantRequest: &a2a.MessageSendParams{\n\t\t\t\tMessage: &a2a.Message{\n\t\t\t\t\tRole:      a2a.MessageRoleUser,\n\t\t\t\t\tContextID: \"ctx-123\",\n\t\t\t\t\tParts: []a2a.Part{\n\t\t\t\t\t\ta2a.TextPart{Text: \"msg3\"},\n\t\t\t\t\t\ta2a.TextPart{Text: \"For context:\"},\n\t\t\t\t\t\ta2a.TextPart{Text: fmt.Sprintf(\"[%s] said: resp3\", notRemoteAgentName)},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"function call response\",\n\t\t\tsessionEvents: []*session.Event{\n\t\t\t\t{Author: \"user\", LLMResponse: model.LLMResponse{Content: genai.NewContentFromText(\"start\", genai.RoleUser)}},\n\t\t\t\t{\n\t\t\t\t\tAuthor: remoteAgentName,\n\t\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\t\tContent: genai.NewContentFromParts([]*genai.Part{\n\t\t\t\t\t\t\t{FunctionCall: &genai.FunctionCall{Name: \"fn\", ID: \"call-1\"}},\n\t\t\t\t\t\t}, genai.RoleModel),\n\t\t\t\t\t\tCustomMetadata: adka2a.ToCustomMetadata(\"task-1\", \"ctx-1\"),\n\t\t\t\t\t},\n\t\t\t\t\tLongRunningToolIDs: []string{\"call-1\"},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tAuthor: remoteAgentName,\n\t\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\t\tContent: genai.NewContentFromParts([]*genai.Part{\n\t\t\t\t\t\t\t{FunctionResponse: &genai.FunctionResponse{Name: \"fn\", ID: \"call-1\", Response: map[string]any{\"status\": \"pending\"}}},\n\t\t\t\t\t\t\tgenai.NewPartFromText(\"I'll need to wait for an approval first\"),\n\t\t\t\t\t\t}, genai.RoleModel),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tAuthor: \"user\",\n\t\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\t\tContent: genai.NewContentFromParts([]*genai.Part{\n\t\t\t\t\t\t\tgenai.NewPartFromText(\"lgtm:\"),\n\t\t\t\t\t\t\t{FunctionResponse: &genai.FunctionResponse{Name: \"fn\", ID: \"call-1\", Response: map[string]any{\"status\": \"approved\"}}},\n\t\t\t\t\t\t}, genai.RoleUser),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twantRequest: &a2a.MessageSendParams{\n\t\t\t\tMessage: &a2a.Message{\n\t\t\t\t\tRole:      a2a.MessageRoleUser,\n\t\t\t\t\tTaskID:    \"task-1\",\n\t\t\t\t\tContextID: \"ctx-1\",\n\t\t\t\t\tParts: []a2a.Part{\n\t\t\t\t\t\ta2a.TextPart{Text: \"lgtm:\"},\n\t\t\t\t\t\ta2a.DataPart{\n\t\t\t\t\t\t\tData: map[string]any{\n\t\t\t\t\t\t\t\t\"id\":       \"call-1\",\n\t\t\t\t\t\t\t\t\"name\":     \"fn\",\n\t\t\t\t\t\t\t\t\"response\": map[string]any{\"status\": \"approved\"},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tMetadata: map[string]any{\"adk_type\": \"function_response\"},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n\n\tserver := startA2AServer(newA2AEventReplay(t, []a2a.Event{}))\n\tcard := &a2a.AgentCard{PreferredTransport: a2a.TransportProtocolJSONRPC, URL: server.URL, Capabilities: a2a.AgentCapabilities{Streaming: true}}\n\n\tfor _, tc := range testCases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\tt.Parallel()\n\n\t\t\terrRejected := errors.New(\"rejected\")\n\t\t\tvar gotRequest *a2a.MessageSendParams\n\t\t\tremoteAgent, err := NewA2A(A2AConfig{\n\t\t\t\tName:      remoteAgentName,\n\t\t\t\tAgentCard: card,\n\t\t\t\tBeforeRequestCallbacks: []BeforeA2ARequestCallback{\n\t\t\t\t\tfunc(ctx agent.CallbackContext, req *a2a.MessageSendParams) (*session.Event, error) {\n\t\t\t\t\t\tgotRequest = req\n\t\t\t\t\t\treturn nil, errRejected\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t})\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"remoteagent.NewA2A() error = %v\", err)\n\t\t\t}\n\n\t\t\tictx := newInvocationContext(t, tc.sessionEvents)\n\t\t\tif _, err := runAndCollect(ictx, remoteAgent); !errors.Is(err, errRejected) {\n\t\t\t\tt.Fatalf(\"agent.Run() error = %v, want %v\", err, errRejected)\n\t\t\t}\n\n\t\t\tignoreFields := []cmp.Option{\n\t\t\t\tcmpopts.IgnoreFields(a2a.Message{}, \"ID\"),\n\t\t\t}\n\t\t\tif diff := cmp.Diff(tc.wantRequest, gotRequest, ignoreFields...); diff != \"\" {\n\t\t\t\tt.Fatalf(\"agent.Run() sent unexpected request (+got,-want):\\ngot = %+v\\nwant = %+v\\ndiff = %s\", gotRequest, tc.wantRequest, diff)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestRemoteAgent_EmptyResultForEmptySession(t *testing.T) {\n\tictx := newInvocationContext(t, []*session.Event{})\n\n\texecutor := newA2AEventReplay(t, []a2a.Event{\n\t\ta2a.NewMessage(a2a.MessageRoleAgent, a2a.TextPart{Text: \"will not be invoked, because input is empty\"}),\n\t})\n\n\tagentName := \"a2a agent\"\n\tremoteAgent := newA2ARemoteAgent(t, agentName, startA2AServer(executor))\n\n\tgotEvents, err := runAndCollect(ictx, remoteAgent)\n\tif err != nil {\n\t\tt.Fatalf(\"runAndCollect() error = %v\", err)\n\t}\n\n\twantEvents := []*session.Event{\n\t\t{\n\t\t\tInvocationID: ictx.InvocationID(), Author: agentName, Branch: ictx.Branch(),\n\t\t\tActions: session.EventActions{StateDelta: map[string]any{}, ArtifactDelta: map[string]int64{}},\n\t\t},\n\t}\n\tignoreFields := []cmp.Option{\n\t\tcmpopts.IgnoreFields(session.Event{}, \"ID\"),\n\t\tcmpopts.IgnoreFields(session.Event{}, \"Timestamp\"),\n\t}\n\tif diff := cmp.Diff(wantEvents, gotEvents, ignoreFields...); diff != \"\" {\n\t\tt.Fatalf(\"agent.Run() wrong result (+got,-want):\\ngot = %+v\\nwant = %+v\\ndiff = %s\", gotEvents, wantEvents, diff)\n\t}\n}\n\nfunc TestRemoteAgent_ResolvesAgentCard(t *testing.T) {\n\tremoteEvents := []a2a.Event{a2a.NewMessage(a2a.MessageRoleAgent, a2a.TextPart{Text: \"Hello!\"})}\n\twantResponses := []model.LLMResponse{{Content: genai.NewContentFromText(\"Hello!\", genai.RoleModel), TurnComplete: true}}\n\n\texecutor := newA2AEventReplay(t, remoteEvents)\n\thandler := a2asrv.NewHandler(executor)\n\n\tvar cardServer *httptest.Server\n\tmux := http.NewServeMux()\n\tmux.Handle(\"/invoke\", a2asrv.NewJSONRPCHandler(handler))\n\tmux.HandleFunc(\"/.well-known/agent-card.json\", func(w http.ResponseWriter, r *http.Request) {\n\t\turl := fmt.Sprintf(\"%s/invoke\", cardServer.URL)\n\t\tcard := &a2a.AgentCard{PreferredTransport: a2a.TransportProtocolJSONRPC, URL: url, Capabilities: a2a.AgentCapabilities{Streaming: true}}\n\t\tif err := json.NewEncoder(w).Encode(card); err != nil {\n\t\t\tt.Errorf(\"json.Encode(agentCard) error = %v\", err)\n\t\t}\n\t})\n\tcardServer = httptest.NewServer(mux)\n\n\tremoteAgent, err := NewA2A(A2AConfig{Name: \"a2a\", AgentCardSource: cardServer.URL})\n\tif err != nil {\n\t\tt.Fatalf(\"remoteagent.NewA2A() error = %v\", err)\n\t}\n\n\tictx := newInvocationContext(t, []*session.Event{newUserHello()})\n\tgotEvents, err := runAndCollect(ictx, remoteAgent)\n\tif err != nil {\n\t\tt.Fatalf(\"agent.Run() error = %v\", err)\n\t}\n\n\tignoreFields := []cmp.Option{\n\t\tcmpopts.IgnoreFields(model.LLMResponse{}, \"CustomMetadata\"),\n\t}\n\tgotResponses := toLLMResponses(gotEvents)\n\tif diff := cmp.Diff(wantResponses, gotResponses, ignoreFields...); diff != \"\" {\n\t\tt.Fatalf(\"agent.Run() wrong result (+got,-want):\\ngot = %+v\\nwant = %+v\\ndiff = %s\", gotResponses, wantResponses, diff)\n\t}\n}\n\nfunc TestRemoteAgent_ErrorEventIfNoCompatibleTransport(t *testing.T) {\n\tremoteEvents := []a2a.Event{a2a.NewMessage(a2a.MessageRoleAgent, a2a.TextPart{Text: \"will not be invoked!\"})}\n\texecutor := newA2AEventReplay(t, remoteEvents)\n\tserver := startA2AServer(executor)\n\n\tremoteAgent, err := NewA2A(A2AConfig{\n\t\tName:          \"a2a\",\n\t\tClientFactory: a2aclient.NewFactory(a2aclient.WithDefaultsDisabled()),\n\t\tAgentCard: &a2a.AgentCard{\n\t\t\tPreferredTransport: a2a.TransportProtocolJSONRPC,\n\t\t\tURL:                server.URL,\n\t\t},\n\t})\n\tif err != nil {\n\t\tt.Fatalf(\"remoteagent.NewA2A() error = %v\", err)\n\t}\n\n\tictx := newInvocationContext(t, []*session.Event{newUserHello()})\n\tgotEvents, err := runAndCollect(ictx, remoteAgent)\n\tif err != nil {\n\t\tt.Fatalf(\"agent.Run() error = %v\", err)\n\t}\n\n\tif len(gotEvents) != 1 {\n\t\tt.Fatalf(\"len(events) = %d, want 1\", len(gotEvents))\n\t}\n\tif !strings.Contains(gotEvents[0].ErrorMessage, \"no compatible transports found\") {\n\t\tt.Fatalf(\"event.ErrorMessage = %s, want to contain %q\", gotEvents[0].ErrorMessage, \"no compatible transports found\")\n\t}\n}\n\nfunc TestRemoteAgent_ErrorEventOnServerError(t *testing.T) {\n\texecutorErr := fmt.Errorf(\"mockExecutor failed\")\n\texecutor := &mockA2AExecutor{\n\t\texecuteFn: func(ctx context.Context, reqCtx *a2asrv.RequestContext, q eventqueue.Queue) error {\n\t\t\treturn executorErr\n\t\t},\n\t}\n\n\tremoteAgent := newA2ARemoteAgent(t, \"a2a agent\", startA2AServer(executor))\n\n\tictx := newInvocationContext(t, []*session.Event{newUserHello()})\n\tgotEvents, err := runAndCollect(ictx, remoteAgent)\n\tif err != nil {\n\t\tt.Fatalf(\"agent.Run() error = %v\", err)\n\t}\n\n\tif len(gotEvents) != 1 {\n\t\tt.Fatalf(\"len(events) = %d, want 1\", len(gotEvents))\n\t}\n\tif gotEvents[0].ErrorMessage == \"\" {\n\t\tt.Fatal(\"event.ErrorMessage empty, want non-empty\")\n\t}\n}\n\nfunc TestRemoteAgent_CustomConverters(t *testing.T) {\n\toriginalA2APart := a2a.TextPart{Text: \"hello\"}\n\tcustomA2APart := a2a.TextPart{Text: \"modified\"}\n\tmockGenAIPartConverter := func(ctx context.Context, event *session.Event, part *genai.Part) (a2a.Part, error) {\n\t\treturn customA2APart, nil\n\t}\n\n\ttests := []struct {\n\t\tname string\n\t\tcfg  A2AConfig\n\t\twant a2a.Part\n\t}{\n\t\t{\n\t\t\tname: \"custom converter\",\n\t\t\tcfg:  A2AConfig{GenAIPartConverter: mockGenAIPartConverter},\n\t\t\twant: customA2APart,\n\t\t},\n\t\t{\n\t\t\tname: \"default converter\",\n\t\t\twant: originalA2APart,\n\t\t},\n\t}\n\tfor _, tc := range tests {\n\t\tevents := []*session.Event{newUserHello()}\n\t\tictx := newTestInvocationContext(t, \"a2a agent\", events...)\n\t\tmsg, err := newMessage(ictx, tc.cfg)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"newMessage() error = %v\", err)\n\t\t}\n\t\tif len(msg.Parts) != 1 {\n\t\t\tt.Fatalf(\"len(msg.Parts) = %d, want 1\", len(msg.Parts))\n\t\t}\n\t\tif textPart, ok := msg.Parts[0].(a2a.TextPart); !ok || textPart.Text != tc.want.(a2a.TextPart).Text {\n\t\t\tt.Fatalf(\"msg.Parts[0] = %+v, want %+v\", msg.Parts[0], tc.want)\n\t\t}\n\t}\n}\n\nfunc TestRemoteAgent_CleanupCallback(t *testing.T) {\n\ttestCases := []struct {\n\t\tname                  string\n\t\tevents                func(*a2asrv.RequestContext) []a2a.Event\n\t\tafterRequestCallbacks []AfterA2ARequestCallback\n\t\teventConverter        A2AEventConverter\n\t\tbreakAfter            int\n\t\tcancelContextAfter    int\n\t\twantCause             string\n\t}{\n\t\t{\n\t\t\tname: \"after request callback error\",\n\t\t\tafterRequestCallbacks: []AfterA2ARequestCallback{\n\t\t\t\tfunc(ctx agent.CallbackContext, req *a2a.MessageSendParams, resp *session.Event, err error) (*session.Event, error) {\n\t\t\t\t\treturn nil, fmt.Errorf(\"callback error\")\n\t\t\t\t},\n\t\t\t},\n\t\t\twantCause: \"callback error\",\n\t\t},\n\t\t{\n\t\t\tname: \"part converter error\",\n\t\t\teventConverter: func(ctx agent.InvocationContext, req *a2a.MessageSendParams, event a2a.Event, err error) (*session.Event, error) {\n\t\t\t\tif _, ok := event.(*a2a.TaskArtifactUpdateEvent); ok {\n\t\t\t\t\treturn nil, fmt.Errorf(\"converter error\")\n\t\t\t\t}\n\t\t\t\treturn adka2a.ToSessionEvent(ctx, event)\n\t\t\t},\n\t\t\twantCause: \"converter error\",\n\t\t},\n\t\t{\n\t\t\tname:               \"agent run context canceled\",\n\t\t\tcancelContextAfter: 1,\n\t\t\twantCause:          \"context canceled\",\n\t\t},\n\t\t{\n\t\t\tname:       \"yield returns false\",\n\t\t\tbreakAfter: 1,\n\t\t\twantCause:  \"\",\n\t\t},\n\t}\n\n\tfor _, tc := range testCases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\tvar (\n\t\t\t\tcleanupCalled bool\n\t\t\t\tcleanupTaskID a2a.TaskID\n\t\t\t\tcleanupCause  error\n\t\t\t)\n\t\t\tcleanupCallback := func(ctx context.Context, card *a2a.AgentCard, client *a2aclient.Client, task a2a.TaskInfo, cause error) {\n\t\t\t\tcleanupCalled = true\n\t\t\t\tcleanupTaskID = task.TaskID\n\t\t\t\tcleanupCause = cause\n\t\t\t\tif _, err := client.CancelTask(ctx, &a2a.TaskIDParams{ID: task.TaskID}); err != nil {\n\t\t\t\t\tt.Errorf(\"client.CancelTask() error = %v\", err)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tremoteTaskIDChan := make(chan a2a.TaskID, 1)\n\t\t\texecutor := &mockA2AExecutor{\n\t\t\t\texecuteFn: func(ctx context.Context, reqCtx *a2asrv.RequestContext, queue eventqueue.Queue) error {\n\t\t\t\t\tremoteTaskIDChan <- reqCtx.TaskID\n\t\t\t\t\tif err := queue.Write(ctx, a2a.NewSubmittedTask(reqCtx, reqCtx.Message)); err != nil {\n\t\t\t\t\t\treturn err\n\t\t\t\t\t}\n\t\t\t\t\tfor ctx.Err() == nil {\n\t\t\t\t\t\tdata := a2a.DataPart{Data: map[string]any{\"foo\": \"bar\"}}\n\t\t\t\t\t\tif err := queue.Write(ctx, a2a.NewArtifactEvent(reqCtx, data)); err != nil {\n\t\t\t\t\t\t\treturn err\n\t\t\t\t\t\t}\n\t\t\t\t\t\ttime.Sleep(1 * time.Millisecond)\n\t\t\t\t\t}\n\t\t\t\t\tfinalUpdate := a2a.NewStatusUpdateEvent(reqCtx, a2a.TaskStateCompleted, nil)\n\t\t\t\t\tfinalUpdate.Final = true\n\t\t\t\t\treturn queue.Write(ctx, finalUpdate)\n\t\t\t\t},\n\t\t\t}\n\t\t\tserver := startA2AServer(executor)\n\t\t\tdefer server.Close()\n\n\t\t\tcard := &a2a.AgentCard{PreferredTransport: a2a.TransportProtocolJSONRPC, URL: server.URL, Capabilities: a2a.AgentCapabilities{Streaming: true}}\n\t\t\tremoteAgent, err := NewA2A(A2AConfig{\n\t\t\t\tName:                      \"a2a\",\n\t\t\t\tAgentCard:                 card,\n\t\t\t\tRemoteTaskCleanupCallback: cleanupCallback,\n\t\t\t\tConverter:                 tc.eventConverter,\n\t\t\t\tAfterRequestCallbacks:     tc.afterRequestCallbacks,\n\t\t\t})\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"NewA2A() error = %v\", err)\n\t\t\t}\n\n\t\t\tictxCtx, cancel := context.WithCancel(t.Context())\n\t\t\tdefer cancel()\n\t\t\tsession := prepareSession(t, ictxCtx, []*session.Event{newUserHello()})\n\t\t\tictx := icontext.NewInvocationContext(ictxCtx, icontext.InvocationContextParams{\n\t\t\t\tSession:   session,\n\t\t\t\tRunConfig: &agent.RunConfig{StreamingMode: agent.StreamingModeSSE},\n\t\t\t})\n\n\t\t\tcount := 0\n\t\t\tfor _, err := range remoteAgent.Run(ictx) {\n\t\t\t\tif err != nil {\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tcount++\n\t\t\t\tif tc.cancelContextAfter > 0 && count >= tc.cancelContextAfter {\n\t\t\t\t\tcancel()\n\t\t\t\t}\n\t\t\t\tif tc.breakAfter > 0 && count >= tc.breakAfter {\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\n\t\t\texpectedTaskID := <-remoteTaskIDChan\n\t\t\tif !cleanupCalled {\n\t\t\t\tt.Fatal(\"RemoteTaskCleanupCallback was not called\")\n\t\t\t}\n\t\t\tif cleanupTaskID != expectedTaskID {\n\t\t\t\tt.Fatalf(\"cleanupTaskID = %v, want %v\", cleanupTaskID, expectedTaskID)\n\t\t\t}\n\t\t\tif tc.wantCause != \"\" {\n\t\t\t\tif cleanupCause == nil {\n\t\t\t\t\tif tc.wantCause != \"\" {\n\t\t\t\t\t\tt.Fatalf(\"cleanupCause is nil, want to contain %q\", tc.wantCause)\n\t\t\t\t\t}\n\t\t\t\t} else if !strings.Contains(cleanupCause.Error(), tc.wantCause) {\n\t\t\t\t\tt.Fatalf(\"cleanupCause = %v, want to contain %q\", cleanupCause, tc.wantCause)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tclient := newA2AClient(t, server)\n\t\t\ttask, err := client.GetTask(t.Context(), &a2a.TaskQueryParams{ID: expectedTaskID})\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"client.CancelTask() error = %v\", err)\n\t\t\t}\n\t\t\tif task.Status.State != a2a.TaskStateCanceled {\n\t\t\t\tt.Fatalf(\"task.Status.State = %q, want %q\", task.Status.State, a2a.TaskStateCanceled)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestRemoteAgent_PartConverter(t *testing.T) {\n\tevent := &session.Event{\n\t\tLLMResponse: model.LLMResponse{Content: genai.NewContentFromParts([]*genai.Part{\n\t\t\t{Text: \"KEEP\"},\n\t\t\t{Text: \"DROP\"},\n\t\t}, genai.RoleModel)},\n\t}\n\n\tcfg := A2AConfig{\n\t\tGenAIPartConverter: func(ctx context.Context, event *session.Event, p *genai.Part) (a2a.Part, error) {\n\t\t\tif p.Text == \"DROP\" {\n\t\t\t\treturn nil, nil\n\t\t\t}\n\t\t\treturn a2a.TextPart{Text: p.Text}, nil\n\t\t},\n\t}\n\n\tictx := newTestInvocationContext(t, \"test-agent\", newUserHello())\n\n\tparts, err := convertParts(ictx, cfg, event)\n\tif err != nil {\n\t\tt.Fatalf(\"convertParts() error = %v\", err)\n\t}\n\n\tif len(parts) != 1 {\n\t\tt.Errorf(\"Expected 1 part after filtering, got %d\", len(parts))\n\t}\n\n\tfor _, p := range parts {\n\t\tif p == nil {\n\t\t\tt.Fatalf(\"got nil part, want it filtered out.\")\n\t\t}\n\n\t\tif tp, ok := p.(a2a.TextPart); ok && tp.Text != \"KEEP\" {\n\t\t\tt.Errorf(\"got %s, want 'KEEP'\", tp.Text)\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "agent/remoteagent/a2a_e2e_test.go",
    "content": "// Copyright 2026 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage remoteagent\n\n//go:generate go test -httprecord=.*\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"iter\"\n\t\"net/http\"\n\t\"path/filepath\"\n\t\"strings\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/a2aproject/a2a-go/a2a\"\n\t\"github.com/a2aproject/a2a-go/a2aclient\"\n\t\"github.com/a2aproject/a2a-go/a2asrv\"\n\t\"github.com/a2aproject/a2a-go/a2asrv/eventqueue\"\n\t\"github.com/google/go-cmp/cmp\"\n\t\"github.com/google/go-cmp/cmp/cmpopts\"\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/agent\"\n\t\"google.golang.org/adk/agent/llmagent\"\n\t\"google.golang.org/adk/agent/workflowagents/sequentialagent\"\n\t\"google.golang.org/adk/internal/converters\"\n\t\"google.golang.org/adk/internal/httprr\"\n\t\"google.golang.org/adk/internal/testutil\"\n\t\"google.golang.org/adk/internal/utils\"\n\t\"google.golang.org/adk/model\"\n\t\"google.golang.org/adk/model/gemini\"\n\t\"google.golang.org/adk/runner\"\n\t\"google.golang.org/adk/server/adka2a\"\n\t\"google.golang.org/adk/session\"\n\t\"google.golang.org/adk/tool\"\n\t\"google.golang.org/adk/tool/functiontool\"\n)\n\nconst (\n\tapprovalToolName            = \"request_approval\"\n\tmodelTextRequiresApproval   = \"need to request approval first!\"\n\tmodelTextWaitingForApproval = \"waiting for user's approval...\"\n\tmodelTextTaskComplete       = \"Task complete!\"\n\n\ttransferToolName      = \"transfer_to_agent\"\n\tmodelTextRootTransfer = \"transfering... please hold... beepboop...\"\n)\n\ntype approvalStatus string\n\nvar (\n\tapprovalStatusPending  approvalStatus = \"pending\"\n\tapprovalStatusApproved approvalStatus = \"approved\"\n\tapprovalStatusVerified approvalStatus = \"verified\"\n)\n\ntype approval struct {\n\tStatus   approvalStatus `json:\"status\"`\n\tTicketID string         `json:\"ticket_id\"`\n}\n\n/**\n * a2aclient -> a2aserver -> adka2a.Executor -> llmagent with a long running tool\n */\nfunc TestA2AInputRequired(t *testing.T) {\n\ttestCases := []struct {\n\t\tname                    string\n\t\ttool                    tool.Tool\n\t\tcreateApproval          func(t *testing.T, toolCall *genai.FunctionCall, pendingResponse *genai.FunctionResponse) *genai.Part\n\t\twantFirstArtifactParts  a2a.ContentParts\n\t\twantSecondArtifactParts a2a.ContentParts\n\t}{\n\t\t{\n\t\t\tname: \"long-running\",\n\t\t\ttool: newLongRunningTool(t),\n\t\t\tcreateApproval: func(t *testing.T, toolCall *genai.FunctionCall, pendingResponse *genai.FunctionResponse) *genai.Part {\n\t\t\t\treturn createLongRunningToolApproval(t, pendingResponse)\n\t\t\t},\n\t\t\twantFirstArtifactParts: a2a.ContentParts{\n\t\t\t\ta2a.TextPart{Text: modelTextRequiresApproval},\n\t\t\t\ta2a.TextPart{Text: modelTextWaitingForApproval},\n\t\t\t},\n\t\t\twantSecondArtifactParts: a2a.ContentParts{a2a.TextPart{Text: modelTextTaskComplete}},\n\t\t},\n\t\t{\n\t\t\tname: \"tool confirmation\",\n\t\t\ttool: newToolConfirmation(t),\n\t\t\tcreateApproval: func(t *testing.T, toolCall *genai.FunctionCall, pendingResponse *genai.FunctionResponse) *genai.Part {\n\t\t\t\treturn createToolConfirmationApproval(t, toolCall)\n\t\t\t},\n\t\t\twantFirstArtifactParts: a2a.ContentParts{\n\t\t\t\ta2a.TextPart{Text: modelTextRequiresApproval},\n\t\t\t\ta2a.DataPart{\n\t\t\t\t\tData:     map[string]any{\"name\": approvalToolName},\n\t\t\t\t\tMetadata: map[string]any{\"adk_is_long_running\": false, \"adk_type\": \"function_call\"},\n\t\t\t\t},\n\t\t\t\ta2a.DataPart{\n\t\t\t\t\tData: map[string]any{\n\t\t\t\t\t\t\"name\":     approvalToolName,\n\t\t\t\t\t\t\"response\": map[string]any{\"status\": string(approvalStatusPending)},\n\t\t\t\t\t},\n\t\t\t\t\tMetadata: map[string]any{\"adk_type\": \"function_response\"},\n\t\t\t\t},\n\t\t\t},\n\t\t\twantSecondArtifactParts: a2a.ContentParts{\n\t\t\t\ta2a.DataPart{\n\t\t\t\t\tData: map[string]any{\n\t\t\t\t\t\t\"name\":     approvalToolName,\n\t\t\t\t\t\t\"response\": map[string]any{\"status\": string(approvalStatusVerified)},\n\t\t\t\t\t},\n\t\t\t\t\tMetadata: map[string]any{\"adk_type\": \"function_response\"},\n\t\t\t\t},\n\t\t\t\ta2a.TextPart{Text: modelTextTaskComplete},\n\t\t\t},\n\t\t},\n\t}\n\n\tfor _, tc := range testCases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\tt.Parallel()\n\n\t\t\t// Server\n\t\t\tinputRequestingAgent := newInputRequestingAgent(t, \"agent-b\", tc.tool)\n\t\t\texecutor := newAgentExecutor(inputRequestingAgent, nil, adka2a.OutputArtifactPerRun)\n\t\t\tserver := startA2AServer(executor)\n\t\t\tdefer server.Close()\n\n\t\t\t// Client\n\t\t\tclient := newA2AClient(t, server)\n\n\t\t\t// Initial message triggers input required\n\t\t\ttaskContent := \"Perform important task!\"\n\t\t\tmsg1 := a2a.NewMessage(a2a.MessageRoleUser, a2a.TextPart{Text: taskContent})\n\t\t\ttask1 := mustSendMessage(t, client, msg1)\n\t\t\tif task1.Status.State != a2a.TaskStateInputRequired {\n\t\t\t\tt.Fatalf(\"client.SendMessage(Initial) result state = %q, want %q\", task1.Status.State, a2a.TaskStateInputRequired)\n\t\t\t}\n\t\t\tif len(task1.Artifacts) != 1 {\n\t\t\t\tt.Fatalf(\"len(task.Artifacts) = %d, want 1\", len(task1.Artifacts))\n\t\t\t}\n\n\t\t\t// Incomplete followup keeps the task in input-required\n\t\t\tincompleteFollowupText := \"Is it really necessary?\"\n\t\t\tmsg2 := a2a.NewMessageForTask(a2a.MessageRoleUser, task1, a2a.TextPart{Text: incompleteFollowupText})\n\t\t\ttask2 := mustSendMessage(t, client, msg2)\n\t\t\tif task2.Status.State != a2a.TaskStateInputRequired {\n\t\t\t\tt.Fatalf(\"client.SendMessage(IncompleteInput) result state = %q, want %q\", task2.Status.State, a2a.TaskStateInputRequired)\n\t\t\t}\n\t\t\tif len(task2.Artifacts) != 1 {\n\t\t\t\tt.Fatalf(\"len(task.Artifacts) = %d, want 1\", len(task2.Artifacts))\n\t\t\t}\n\n\t\t\t// Required input gets delivered\n\n\t\t\t// Verify that error message is present\n\t\t\tif len(task2.Status.Message.Parts) < 2 {\n\t\t\t\tt.Fatalf(\"task2.Status.Message.Parts len = %d; want >= 2\", len(task2.Status.Message.Parts))\n\t\t\t}\n\t\t\t// The last part should be the error message\n\t\t\tlastPart := task2.Status.Message.Parts[len(task2.Status.Message.Parts)-1]\n\t\t\ttp, ok := lastPart.(a2a.TextPart)\n\t\t\tif !ok {\n\t\t\t\tt.Fatalf(\"last part is not TextPart\")\n\t\t\t}\n\t\t\tif !strings.Contains(tp.Text, \"no input provided\") {\n\t\t\t\tt.Errorf(\"last part text = %q; want it to contain 'no input provided'\", tp.Text)\n\t\t\t}\n\n\t\t\t// Another incomplete followup should not accumulate error messages\n\t\t\tmsg2a := a2a.NewMessageForTask(a2a.MessageRoleUser, task1, a2a.TextPart{Text: \"Still debating?\"})\n\t\t\ttask2a := mustSendMessage(t, client, msg2a)\n\t\t\tif task2a.Status.State != a2a.TaskStateInputRequired {\n\t\t\t\tt.Fatalf(\"client.SendMessage(IncompleteInput 2) result state = %q, want %q\", task2a.Status.State, a2a.TaskStateInputRequired)\n\t\t\t}\n\n\t\t\t// Count validation errors in parts\n\t\t\tvalidationErrors := 0\n\t\t\tfor _, p := range task2a.Status.Message.Parts {\n\t\t\t\tif tp, ok := p.(a2a.TextPart); ok && strings.Contains(tp.Text, \"no input provided\") {\n\t\t\t\t\tvalidationErrors++\n\t\t\t\t}\n\t\t\t}\n\t\t\tif validationErrors != 1 {\n\t\t\t\tt.Errorf(\"validationErrors count = %d; want 1\", validationErrors)\n\t\t\t}\n\n\t\t\t// Check for adk_request_confirmation\n\t\t\ttoolCall, pendingResponse := findLongRunningCall(t, toGenaiParts(t, task2.Status.Message.Parts))\n\t\t\tapprovedResponse := tc.createApproval(t, toolCall, pendingResponse)\n\n\t\t\tmsg3 := a2a.NewMessageForTask(a2a.MessageRoleUser, task2,\n\t\t\t\ta2a.TextPart{Text: \"LGTM\"},\n\t\t\t\ttoA2AParts(t, []*genai.Part{approvedResponse}, []string{toolCall.ID})[0],\n\t\t\t)\n\t\t\ttask3 := mustSendMessage(t, client, msg3)\n\t\t\tif task3.Status.State != a2a.TaskStateCompleted {\n\t\t\t\tt.Fatalf(\"client.SendMessage(IncompleteInput) result state = %q, want %q\", task3.Status.State, a2a.TaskStateCompleted)\n\t\t\t}\n\n\t\t\t// Verify the final task state\n\t\t\topts := []cmp.Option{\n\t\t\t\tcmpopts.EquateEmpty(),\n\t\t\t\tcmpopts.IgnoreMapEntries(func(k string, v any) bool { return strings.HasSuffix(k, \"id\") }),\n\t\t\t\tcmpopts.IgnoreFields(a2a.Message{}, \"ID\"),\n\t\t\t}\n\t\t\tif len(task3.Artifacts) != 2 {\n\t\t\t\tt.Fatalf(\"len(task.Artifacts) = %d, want 2\", len(task3.Artifacts))\n\t\t\t}\n\n\t\t\tgotHistory := task3.History\n\t\t\twantHistory := []*a2a.Message{msg1, msg2, task1.Status.Message, msg2a, task2a.Status.Message, msg3, task2a.Status.Message}\n\t\t\tif diff := cmp.Diff(wantHistory, gotHistory, opts...); diff != \"\" {\n\t\t\t\tt.Fatalf(\"unexpected history (+got,-want) diff:\\n%s\", diff)\n\t\t\t}\n\n\t\t\tgotFirstArtifactParts := adka2a.WithoutPartialArtifacts(task3.Artifacts)[0].Parts\n\t\t\tif diff := cmp.Diff(tc.wantFirstArtifactParts, gotFirstArtifactParts, opts...); diff != \"\" {\n\t\t\t\tt.Fatalf(\"unexpected artifact parts (+got,-want) diff:\\n%s\", diff)\n\t\t\t}\n\n\t\t\tgotSecondArtifactParts := task3.Artifacts[1].Parts\n\t\t\tif diff := cmp.Diff(tc.wantSecondArtifactParts, gotSecondArtifactParts, opts...); diff != \"\" {\n\t\t\t\tt.Fatalf(\"unexpected artifact parts (+got,-want) diff:\\n%s\", diff)\n\t\t\t}\n\t\t})\n\t}\n}\n\n/**\n * a2aclient -> server A -> adka2a.Executor A ->-> llmagent with remote subagent ->\n * \t\tremotesubagent -> server B -> adka2a.Executor B -> llmagent with a long running tool\n */\nfunc TestA2AMultiHopInputRequired(t *testing.T) {\n\tremoteAgentName := \"remote-agent-B\"\n\ttestCases := []struct {\n\t\tname                    string\n\t\ttool                    tool.Tool\n\t\tcreateApproval          func(t *testing.T, toolCall *genai.FunctionCall, pendingResponse *genai.FunctionResponse) *genai.Part\n\t\twantFirstArtifactParts  a2a.ContentParts\n\t\twantSecondArtifactParts a2a.ContentParts\n\t}{\n\t\t{\n\t\t\tname: \"long-running\",\n\t\t\ttool: newLongRunningTool(t),\n\t\t\tcreateApproval: func(t *testing.T, toolCall *genai.FunctionCall, pendingResponse *genai.FunctionResponse) *genai.Part {\n\t\t\t\treturn createLongRunningToolApproval(t, pendingResponse)\n\t\t\t},\n\t\t\twantFirstArtifactParts: toA2AParts(t, []*genai.Part{\n\t\t\t\tgenai.NewPartFromText(modelTextRootTransfer),\n\t\t\t\tgenai.NewPartFromFunctionCall(transferToolName, map[string]any{\"agent_name\": remoteAgentName}),\n\t\t\t\tgenai.NewPartFromFunctionResponse(transferToolName, nil),\n\t\t\t\tgenai.NewPartFromText(modelTextRequiresApproval),\n\t\t\t\tgenai.NewPartFromText(modelTextWaitingForApproval),\n\t\t\t}, []string{}),\n\t\t\twantSecondArtifactParts: a2a.ContentParts{\n\t\t\t\ta2a.TextPart{Text: modelTextTaskComplete},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"tool confirmation\",\n\t\t\ttool: newToolConfirmation(t),\n\t\t\tcreateApproval: func(t *testing.T, toolCall *genai.FunctionCall, pendingResponse *genai.FunctionResponse) *genai.Part {\n\t\t\t\treturn createToolConfirmationApproval(t, toolCall)\n\t\t\t},\n\t\t\twantFirstArtifactParts: toA2AParts(t, []*genai.Part{\n\t\t\t\tgenai.NewPartFromText(modelTextRootTransfer),\n\t\t\t\tgenai.NewPartFromFunctionCall(transferToolName, map[string]any{\"agent_name\": remoteAgentName}),\n\t\t\t\tgenai.NewPartFromFunctionResponse(transferToolName, nil),\n\t\t\t\tgenai.NewPartFromText(modelTextRequiresApproval),\n\t\t\t\tgenai.NewPartFromFunctionCall(approvalToolName, nil),\n\t\t\t\tgenai.NewPartFromFunctionResponse(approvalToolName, map[string]any{\"status\": string(approvalStatusPending)}),\n\t\t\t}, []string{}),\n\t\t\twantSecondArtifactParts: a2a.ContentParts{\n\t\t\t\ta2a.DataPart{\n\t\t\t\t\tData: map[string]any{\n\t\t\t\t\t\t\"name\":     approvalToolName,\n\t\t\t\t\t\t\"response\": map[string]any{\"status\": string(approvalStatusVerified)},\n\t\t\t\t\t},\n\t\t\t\t\tMetadata: map[string]any{\"adk_type\": \"function_response\"},\n\t\t\t\t},\n\t\t\t\ta2a.TextPart{Text: modelTextTaskComplete},\n\t\t\t},\n\t\t},\n\t}\n\n\tfor _, tc := range testCases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\tt.Parallel()\n\n\t\t\t// Server B\n\t\t\tinputRequestingAgent := newInputRequestingAgent(t, \"agent-b\", tc.tool)\n\t\t\texecutorB := newAgentExecutor(inputRequestingAgent, nil, adka2a.OutputArtifactPerEvent)\n\t\t\tserverB := startA2AServer(executorB)\n\t\t\tdefer serverB.Close()\n\n\t\t\t// Server A\n\t\t\tremoteAgent := newA2ARemoteAgent(t, remoteAgentName, serverB)\n\t\t\trootAgent := newRootAgent(\"root\", remoteAgent)\n\t\t\texecutorA := newAgentExecutor(rootAgent, nil, adka2a.OutputArtifactPerRun)\n\t\t\tserverA := startA2AServer(executorA)\n\t\t\tdefer serverA.Close()\n\n\t\t\t// Client for Server A\n\t\t\tclient := newA2AClient(t, serverA)\n\n\t\t\t// Initial message triggers input required\n\t\t\tmsg1 := a2a.NewMessage(a2a.MessageRoleUser, a2a.TextPart{Text: \"Hello, perform important task!\"})\n\t\t\ttask1 := mustSendMessage(t, client, msg1)\n\t\t\tif task1.Status.State != a2a.TaskStateInputRequired {\n\t\t\t\tt.Fatalf(\"client.SendMessage(Initial) result state = %q, want %q\", task1.Status.State, a2a.TaskStateInputRequired)\n\t\t\t}\n\n\t\t\t// Incomplete followup keeps the task in input-required\n\t\t\tmsg2 := a2a.NewMessageForTask(a2a.MessageRoleUser, task1, a2a.TextPart{Text: \"Is it really necessary?\"})\n\t\t\ttask2 := mustSendMessage(t, client, msg2)\n\t\t\tif task2.Status.State != a2a.TaskStateInputRequired {\n\t\t\t\tt.Fatalf(\"client.SendMessage(IncompleteInput) result state = %q, want %q\", task2.Status.State, a2a.TaskStateInputRequired)\n\t\t\t}\n\n\t\t\t// Required input gets delivered\n\t\t\ttoolCall, pendingResponse := findLongRunningCall(t, toGenaiParts(t, filterPartial(task2.Status.Message.Parts)))\n\t\t\tapprovedResponse := tc.createApproval(t, toolCall, pendingResponse)\n\t\t\tmsg3 := a2a.NewMessageForTask(a2a.MessageRoleUser, task2,\n\t\t\t\ta2a.TextPart{Text: \"LGTM\"},\n\t\t\t\ttoA2AParts(t, []*genai.Part{approvedResponse}, nil)[0],\n\t\t\t)\n\t\t\ttask3 := mustSendMessage(t, client, msg3)\n\t\t\tif task3.Status.State != a2a.TaskStateCompleted {\n\t\t\t\tt.Fatalf(\"client.SendMessage(IncompleteInput) result state = %q, want %q\", task3.Status.State, a2a.TaskStateCompleted)\n\t\t\t}\n\n\t\t\t// Verify task on server A\n\t\t\topts := []cmp.Option{\n\t\t\t\tcmpopts.EquateEmpty(),\n\t\t\t\tcmpopts.IgnoreMapEntries(func(k string, v any) bool {\n\t\t\t\t\treturn strings.HasSuffix(k, \"id\")\n\t\t\t\t}),\n\t\t\t}\n\t\t\tgotHistory := task3.History\n\t\t\twantHistory := []*a2a.Message{msg1, msg2, task1.Status.Message, msg3, task2.Status.Message}\n\t\t\tif diff := cmp.Diff(wantHistory, gotHistory, opts...); diff != \"\" {\n\t\t\t\tt.Fatalf(\"unexpected history (+got,-want) diff:\\n%s\", diff)\n\t\t\t}\n\n\t\t\tgotFirstArtifactParts := a2a.ContentParts(filterPartial(task3.Artifacts[0].Parts))\n\t\t\tif diff := cmp.Diff(tc.wantFirstArtifactParts, gotFirstArtifactParts, opts...); diff != \"\" {\n\t\t\t\tt.Fatalf(\"unexpected artifact parts (+got,-want) diff:\\n%s\", diff)\n\t\t\t}\n\n\t\t\tgotSecondArtifactParts := a2a.ContentParts(filterPartial(adka2a.WithoutPartialArtifacts(task3.Artifacts)[1].Parts))\n\t\t\tif diff := cmp.Diff(tc.wantSecondArtifactParts, gotSecondArtifactParts, opts...); diff != \"\" {\n\t\t\t\tt.Fatalf(\"unexpected artifact parts (+got,-want) diff:\\n%s\", diff)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestA2ACleanupPropagation(t *testing.T) {\n\t// Remote A2A server publishes a submitted task and start generating artifact updates\n\t// until it detects a context cancelation\n\tremoteTaskIDChan, remoteCleanupCalledChan := make(chan a2a.TaskID, 1), make(chan struct{})\n\tserverB := startA2AServer(&mockA2AExecutor{\n\t\texecuteFn: func(ctx context.Context, reqCtx *a2asrv.RequestContext, queue eventqueue.Queue) error {\n\t\t\tremoteTaskIDChan <- reqCtx.TaskID\n\t\t\tif err := queue.Write(ctx, a2a.NewSubmittedTask(reqCtx, reqCtx.Message)); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tfor ctx.Err() == nil {\n\t\t\t\tif err := queue.Write(ctx, a2a.NewArtifactEvent(reqCtx, a2a.TextPart{Text: \"foo\"})); err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\ttime.Sleep(1 * time.Millisecond)\n\t\t\t}\n\t\t\tfinalUpdate := a2a.NewStatusUpdateEvent(reqCtx, a2a.TaskStateCompleted, nil)\n\t\t\tfinalUpdate.Final = true\n\t\t\treturn queue.Write(ctx, finalUpdate)\n\t\t},\n\t\tcleanupFn: func(ctx context.Context, reqCtx *a2asrv.RequestContext, result a2a.SendMessageResult, cause error) {\n\t\t\tclose(remoteCleanupCalledChan)\n\t\t},\n\t})\n\tdefer serverB.Close()\n\n\t// Root server connects to server B through remote subagent\n\tremoteAgentB := newA2ARemoteAgent(t, \"remote-agent-b\", serverB)\n\trootA := newRootAgent(\"agent-b\", remoteAgentB)\n\texecutorA := newAgentExecutor(rootA, nil, adka2a.OutputArtifactPerEvent)\n\tserverA := startA2AServer(executorA)\n\tdefer serverA.Close()\n\n\tclient := newA2AClient(t, serverA)\n\n\t// Send a streaming message in a detached goroutine, passing status update through chan\n\tstatusUpdateEventChan := make(chan a2a.Event, 10)\n\tgo func() {\n\t\tdefer close(statusUpdateEventChan)\n\t\tmsg := a2a.NewMessage(a2a.MessageRoleUser, a2a.TextPart{Text: \"work\"})\n\t\tfor event, err := range client.SendStreamingMessage(t.Context(), &a2a.MessageSendParams{Message: msg}) {\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"client.SendStreamingMessage() error = %v\", err)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif _, ok := event.(*a2a.TaskArtifactUpdateEvent); ok {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tstatusUpdateEventChan <- event\n\t\t}\n\t}()\n\n\t// Issue a task cancellation request\n\ttaskID := (<-statusUpdateEventChan).TaskInfo().TaskID\n\tcancelResultChan := make(chan *a2a.Task, 1)\n\tgo func() {\n\t\tdefer close(cancelResultChan)\n\t\ttask, err := client.CancelTask(t.Context(), &a2a.TaskIDParams{ID: taskID})\n\t\tif err != nil {\n\t\t\tt.Errorf(\"client.CancelTask() error = %v\", err)\n\t\t\treturn\n\t\t}\n\t\tcancelResultChan <- task\n\t}()\n\n\t// Check the streaming message sender got a cancelled state task in their response\n\tvar lastStreamingUpdate a2a.Event\n\tfor event := range statusUpdateEventChan {\n\t\tlastStreamingUpdate = event\n\t}\n\tif tu, ok := lastStreamingUpdate.(*a2a.TaskStatusUpdateEvent); ok {\n\t\tif tu.Status.State != a2a.TaskStateCanceled {\n\t\t\tt.Errorf(\"lastStreamingUpdate.Status.State = %q, want %q\", tu.Status.State, a2a.TaskStateCanceled)\n\t\t}\n\t} else {\n\t\tt.Fatalf(\"type(lastStreamingUpdate) = %T, want *a2a.TaskStatusUpdateEvent\", lastStreamingUpdate)\n\t}\n\n\t// Check subagent task got cancelled when the parent task was cancelled\n\t<-remoteCleanupCalledChan\n\tremoteTaskID := <-remoteTaskIDChan\n\tremoteClient := newA2AClient(t, serverB)\n\tremoteTask, err := remoteClient.GetTask(t.Context(), &a2a.TaskQueryParams{ID: remoteTaskID})\n\tif err != nil {\n\t\tt.Fatalf(\"remoteClient.GetTask() error = %v\", err)\n\t}\n\tif remoteTask.Status.State != a2a.TaskStateCanceled {\n\t\tt.Errorf(\"remoteTask.Status.State = %q, want %q\", remoteTask.Status.State, a2a.TaskStateCanceled)\n\t}\n}\n\nfunc TestA2ASingleHopFinalResponse(t *testing.T) {\n\ttestCases := []struct {\n\t\tname              string\n\t\tagentFn           func(*testing.T) agent.Agent\n\t\twantArtifactParts a2a.ContentParts\n\t\twantState         a2a.TaskState\n\t\twantStatusContain string\n\t\twantPartial       bool\n\t}{\n\t\t{\n\t\t\tname: \"streaming\",\n\t\t\tagentFn: func(t *testing.T) agent.Agent {\n\t\t\t\tbeep := newADKEventReplay(t, \"beep\", []*session.Event{\n\t\t\t\t\t{LLMResponse: model.LLMResponse{Content: genai.NewContentFromText(\"Hello,\", genai.RoleModel), Partial: true}},\n\t\t\t\t\t{LLMResponse: model.LLMResponse{Content: genai.NewContentFromText(\" I am beep!\", genai.RoleModel), Partial: true, TurnComplete: true}},\n\t\t\t\t\t{LLMResponse: model.LLMResponse{Content: genai.NewContentFromText(\"Hello, I am beep!\", genai.RoleModel)}},\n\t\t\t\t})\n\t\t\t\tboop := newADKEventReplay(t, \"boop\", []*session.Event{\n\t\t\t\t\t{LLMResponse: model.LLMResponse{Content: genai.NewContentFromText(\"I am boop\", genai.RoleModel), Partial: true}},\n\t\t\t\t\t{LLMResponse: model.LLMResponse{Content: genai.NewContentFromText(\". We are\", genai.RoleModel), Partial: true}},\n\t\t\t\t\t{LLMResponse: model.LLMResponse{Content: genai.NewContentFromText(\"here to help!\", genai.RoleModel), Partial: true, TurnComplete: true}},\n\t\t\t\t\t{LLMResponse: model.LLMResponse{Content: genai.NewContentFromText(\"I am boop. We are here to help!\", genai.RoleModel)}},\n\t\t\t\t})\n\t\t\t\treturn utils.Must(sequentialagent.New(sequentialagent.Config{\n\t\t\t\t\tAgentConfig: agent.Config{Name: \"root\", SubAgents: []agent.Agent{beep, boop}},\n\t\t\t\t}))\n\t\t\t},\n\t\t\twantState: a2a.TaskStateCompleted,\n\t\t\twantArtifactParts: a2a.ContentParts{\n\t\t\t\ta2a.TextPart{Text: \"Hello, I am beep!\"},\n\t\t\t\ta2a.TextPart{Text: \"I am boop. We are here to help!\"},\n\t\t\t},\n\t\t\twantPartial: true,\n\t\t},\n\t\t{\n\t\t\tname: \"non-streaming\",\n\t\t\tagentFn: func(t *testing.T) agent.Agent {\n\t\t\t\tbeep := newADKEventReplay(t, \"beep\", []*session.Event{\n\t\t\t\t\t{LLMResponse: model.LLMResponse{Content: genai.NewContentFromText(\"Hello, I am beep!\", genai.RoleModel)}},\n\t\t\t\t})\n\t\t\t\tboop := newADKEventReplay(t, \"boop\", []*session.Event{\n\t\t\t\t\t{LLMResponse: model.LLMResponse{Content: genai.NewContentFromText(\"I am boop. We are here to help!\", genai.RoleModel)}},\n\t\t\t\t})\n\t\t\t\treturn utils.Must(sequentialagent.New(sequentialagent.Config{\n\t\t\t\t\tAgentConfig: agent.Config{Name: \"root\", SubAgents: []agent.Agent{beep, boop}},\n\t\t\t\t}))\n\t\t\t},\n\t\t\twantState: a2a.TaskStateCompleted,\n\t\t\twantArtifactParts: a2a.ContentParts{\n\t\t\t\ta2a.TextPart{Text: \"Hello, I am beep!\"},\n\t\t\t\ta2a.TextPart{Text: \"I am boop. We are here to help!\"},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"internal error\",\n\t\t\tagentFn: func(t *testing.T) agent.Agent {\n\t\t\t\treturn utils.Must(agent.New(agent.Config{\n\t\t\t\t\tRun: func(ic agent.InvocationContext) iter.Seq2[*session.Event, error] {\n\t\t\t\t\t\treturn func(yield func(*session.Event, error) bool) {}\n\t\t\t\t\t},\n\t\t\t\t}))\n\t\t\t},\n\t\t\twantStatusContain: \"app_name and user_id are required, got app_name: \",\n\t\t\twantState:         a2a.TaskStateFailed,\n\t\t\twantArtifactParts: a2a.ContentParts{},\n\t\t},\n\t\t{\n\t\t\tname: \"llm mid-response error response\",\n\t\t\tagentFn: func(t *testing.T) agent.Agent {\n\t\t\t\tevent := 0\n\t\t\t\tllmModel := newGeminiModel(t, \"gemini-2.5-flash\")\n\t\t\t\treturn utils.Must(llmagent.New(llmagent.Config{\n\t\t\t\t\tName:  \"model-agent\",\n\t\t\t\t\tModel: llmModel,\n\t\t\t\t\tAfterModelCallbacks: []llmagent.AfterModelCallback{\n\t\t\t\t\t\tfunc(ctx agent.CallbackContext, llmResponse *model.LLMResponse, llmResponseError error) (*model.LLMResponse, error) {\n\t\t\t\t\t\t\tif event < 2 {\n\t\t\t\t\t\t\t\tevent++\n\t\t\t\t\t\t\t\treturn nil, nil\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn &model.LLMResponse{ErrorCode: \"500\", ErrorMessage: \"Model Failed!\"}, nil\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tInstruction: \"You are a helpful assistant.\",\n\t\t\t\t}))\n\t\t\t},\n\t\t\twantStatusContain: \"Model Failed!\",\n\t\t\twantState:         a2a.TaskStateFailed,\n\t\t\twantArtifactParts: a2a.ContentParts{},\n\t\t\twantPartial:       true,\n\t\t},\n\t\t{\n\t\t\tname: \"llm mid-response error\",\n\t\t\tagentFn: func(t *testing.T) agent.Agent {\n\t\t\t\tevent := 0\n\t\t\t\tllmModel := newGeminiModel(t, \"gemini-2.5-flash\")\n\t\t\t\treturn utils.Must(llmagent.New(llmagent.Config{\n\t\t\t\t\tName:  \"model-agent\",\n\t\t\t\t\tModel: llmModel,\n\t\t\t\t\tAfterModelCallbacks: []llmagent.AfterModelCallback{\n\t\t\t\t\t\tfunc(ctx agent.CallbackContext, llmResponse *model.LLMResponse, llmResponseError error) (*model.LLMResponse, error) {\n\t\t\t\t\t\t\tif event < 2 {\n\t\t\t\t\t\t\t\tevent++\n\t\t\t\t\t\t\t\treturn nil, nil\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn nil, fmt.Errorf(\"connection error!\")\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tInstruction: \"You are a helpful assistant.\",\n\t\t\t\t}))\n\t\t\t},\n\t\t\twantStatusContain: \"connection error!\",\n\t\t\twantState:         a2a.TaskStateFailed,\n\t\t\twantArtifactParts: a2a.ContentParts{},\n\t\t\twantPartial:       true,\n\t\t},\n\t}\n\tfor _, tc := range testCases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\texecutor := newAgentExecutor(tc.agentFn(t), nil, adka2a.OutputArtifactPerRun)\n\t\t\tserver := startA2AServer(executor)\n\t\t\tdefer server.Close()\n\n\t\t\tclient := newA2AClient(t, server)\n\t\t\tmsg := a2a.NewMessage(a2a.MessageRoleUser, a2a.TextPart{Text: \"Tell me about the current weather\"})\n\t\t\ttask := mustSendMessage(t, client, msg)\n\t\t\tif task.Status.State != tc.wantState {\n\t\t\t\tt.Fatalf(\"client.SendMessage(Initial) result state = %q, want %q\", task.Status.State, tc.wantState)\n\t\t\t}\n\n\t\t\tnonPartialArtifacts := adka2a.WithoutPartialArtifacts(task.Artifacts)\n\t\t\twantResponse := len(tc.wantArtifactParts) > 0\n\t\t\tif wantResponse {\n\t\t\t\tif len(nonPartialArtifacts) != 1 {\n\t\t\t\t\tt.Fatalf(\"len(artifacts) = %d, want 1\", len(nonPartialArtifacts))\n\t\t\t\t}\n\t\t\t\tif diff := cmp.Diff(tc.wantArtifactParts, nonPartialArtifacts[0].Parts); diff != \"\" {\n\t\t\t\t\tt.Fatalf(\"task wrong artifact parts (+got,-want) diff = %s\", diff)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif tc.wantStatusContain != \"\" {\n\t\t\t\tif task.Status.Message == nil || len(task.Status.Message.Parts) != 1 {\n\t\t\t\t\tt.Fatalf(\"got status message = %v, want message with one part\", task.Status.Message)\n\t\t\t\t}\n\t\t\t\tif tp, ok := task.Status.Message.Parts[0].(a2a.TextPart); !ok || !strings.Contains(tp.Text, tc.wantStatusContain) {\n\t\t\t\t\tt.Fatalf(\"got status message = %v, want text containing %q\", task.Status.Message.Parts[0], tc.wantStatusContain)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif !tc.wantPartial {\n\t\t\t\tif wantResponse && len(task.Artifacts) != 1 {\n\t\t\t\t\tt.Fatalf(\"len(artifacts) = %d, want 1\", len(task.Artifacts))\n\t\t\t\t}\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\twantArtifactCount := 1\n\t\t\tif wantResponse {\n\t\t\t\twantArtifactCount++\n\t\t\t}\n\t\t\tif wantResponse && len(task.Artifacts) != wantArtifactCount {\n\t\t\t\tt.Fatalf(\"len(artifacts) = %d, want %d\", len(task.Artifacts), wantArtifactCount)\n\t\t\t}\n\t\t\tvar partialArtifact *a2a.Artifact\n\t\t\tif adka2a.IsPartial(task.Artifacts[0].Metadata) {\n\t\t\t\tpartialArtifact = task.Artifacts[0]\n\t\t\t} else {\n\t\t\t\tpartialArtifact = task.Artifacts[1]\n\t\t\t}\n\t\t\twantPartialParts := a2a.ContentParts{a2a.DataPart{Data: map[string]any{}, Metadata: map[string]any{\"adk_partial\": true}}}\n\t\t\tif diff := cmp.Diff(wantPartialParts, partialArtifact.Parts); diff != \"\" {\n\t\t\t\tt.Fatalf(\"task wrong artifact parts (+got,-want) diff = %s\", diff)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestA2ARemoteAgentStreamingGeminiSuccess(t *testing.T) {\n\t// Server B with replayable LLMAgent\n\tllmModel := newGeminiModel(t, \"gemini-2.5-flash\")\n\tmodelAgent := utils.Must(llmagent.New(llmagent.Config{\n\t\tName:        \"model-agent\",\n\t\tModel:       llmModel,\n\t\tInstruction: \"You are a helpful assistant.\",\n\t}))\n\texecutorB := newAgentExecutor(modelAgent, nil, adka2a.OutputArtifactPerEvent)\n\tserverB := startA2AServer(executorB)\n\tdefer serverB.Close()\n\n\t// Server A with RemoteAgent\n\tremoteAgent := newA2ARemoteAgent(t, \"remote-agent\", serverB)\n\tserviceA := session.InMemoryService()\n\texecutorA := newAgentExecutor(remoteAgent, serviceA, adka2a.OutputArtifactPerRun)\n\tserverA := startA2AServer(executorA)\n\tdefer serverA.Close()\n\n\tctx := t.Context()\n\tclient := newA2AClient(t, serverA)\n\tmsg := a2a.NewMessage(a2a.MessageRoleUser, a2a.TextPart{Text: \"tell me about the capital of Poland\"})\n\tmsg.ContextID = a2a.NewContextID()\n\n\t// Make streaming request and aggregate results\n\tvar taskID a2a.TaskID\n\tpartialText, finalText := \"\", \"\"\n\tfor event, err := range client.SendStreamingMessage(t.Context(), &a2a.MessageSendParams{Message: msg}) {\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"client.SendStreamingMessage() error = %v\", err)\n\t\t}\n\t\tif tau, ok := event.(*a2a.TaskArtifactUpdateEvent); ok {\n\t\t\tif adka2a.IsPartial(tau.Metadata) && tau.LastChunk {\n\t\t\t\tif len(tau.Artifact.Parts) != 1 {\n\t\t\t\t\tt.Fatalf(\"got %d parts in final partial artifact update, want 1\", len(tau.Artifact.Parts))\n\t\t\t\t}\n\t\t\t\tif dp, ok := tau.Artifact.Parts[0].(a2a.DataPart); !ok || len(dp.Data) > 0 {\n\t\t\t\t\tt.Fatalf(\"got %v part in final partial artifact update, want empty data part\", tau.Artifact.Parts[0])\n\t\t\t\t}\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tif adka2a.IsPartial(tau.Metadata) {\n\t\t\t\tfor _, p := range tau.Artifact.Parts {\n\t\t\t\t\tpartialText += p.(a2a.TextPart).Text\n\t\t\t\t}\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tif len(finalText) > 0 {\n\t\t\t\tt.Fatal(\"got multiple non-partial updates, want 1\")\n\t\t\t}\n\t\t\tfinalText = tau.Artifact.Parts[0].(a2a.TextPart).Text\n\t\t}\n\t\ttaskID = event.TaskInfo().TaskID\n\t}\n\n\t// Check streaming contents\n\tif len(finalText) == 0 {\n\t\tt.Fatal(\"got empty final text\")\n\t}\n\tif diff := cmp.Diff(partialText, finalText); diff != \"\" {\n\t\tt.Fatalf(\"got final event text different from streaming (+got, -want), diff = %s\", diff)\n\t}\n\n\t// Check A2A Task state\n\ttask, err := client.GetTask(ctx, &a2a.TaskQueryParams{ID: taskID})\n\tif err != nil {\n\t\tt.Fatalf(\"client.GetTask() error = %v\", err)\n\t}\n\tif task.Status.State != a2a.TaskStateCompleted {\n\t\tt.Fatalf(\"task state = %q, want %q\", task.Status.State, a2a.TaskStateCompleted)\n\t}\n\n\t// Check Session Store state\n\tfullSessionResp, err := serviceA.Get(ctx, &session.GetRequest{\n\t\tAppName:   remoteAgent.Name(),\n\t\tUserID:    \"A2A_USER_\" + msg.ContextID,\n\t\tSessionID: msg.ContextID,\n\t})\n\tif err != nil {\n\t\tt.Fatalf(\"serviceA.GetSession() error = %v\", err)\n\t}\n\tevents := fullSessionResp.Session.Events()\n\tif events.Len() != 3 {\n\t\tt.Fatalf(\"got event count = %d, want [user-msg, response, turn-complete]\", events.Len())\n\t}\n\tif events.At(0).Author != \"user\" {\n\t\tt.Fatalf(\"got first event author = %s, want user\", events.At(0).Author)\n\t}\n\tif !events.At(2).TurnComplete || events.At(2).Content != nil {\n\t\tt.Fatalf(\"got last event turn complete = true with no content, got turn complete = %v, content = %v\", events.At(2).TurnComplete, events.At(2).Content)\n\t}\n\tif len(events.At(1).Content.Parts) != 1 {\n\t\tt.Fatalf(\"got content event with %d parts, want 1\", len(events.At(1).Content.Parts))\n\t}\n\tif diff := cmp.Diff(finalText, events.At(1).Content.Parts[0].Text); diff != \"\" {\n\t\tt.Fatalf(\"got content event text different from A2A response (+got, -want), diff = %s\", diff)\n\t}\n}\n\nfunc TestA2ARemoteAgentStreamingGeminiError(t *testing.T) {\n\t// Server B with replayable LLMAgent which fails after emitting some events\n\teventCount := 0\n\tconst errorMessage = \"connection error!\"\n\tllmModel := newGeminiModel(t, \"gemini-2.5-flash\")\n\tmodelAgent := utils.Must(llmagent.New(llmagent.Config{\n\t\tName:        \"model-agent\",\n\t\tModel:       llmModel,\n\t\tInstruction: \"You are a helpful assistant.\",\n\t\tAfterModelCallbacks: []llmagent.AfterModelCallback{\n\t\t\tfunc(ctx agent.CallbackContext, llmResponse *model.LLMResponse, llmResponseError error) (*model.LLMResponse, error) {\n\t\t\t\tif eventCount < 3 {\n\t\t\t\t\teventCount++\n\t\t\t\t\treturn nil, nil\n\t\t\t\t}\n\t\t\t\treturn nil, errors.New(errorMessage)\n\t\t\t},\n\t\t},\n\t}))\n\texecutorB := newAgentExecutor(modelAgent, nil, adka2a.OutputArtifactPerRun)\n\tserverB := startA2AServer(executorB)\n\tdefer serverB.Close()\n\n\t// Server A with RemoteAgent\n\tremoteAgent := newA2ARemoteAgent(t, \"remote-agent\", serverB)\n\tserviceA := session.InMemoryService()\n\texecutorA := newAgentExecutor(remoteAgent, serviceA, adka2a.OutputArtifactPerRun)\n\tserverA := startA2AServer(executorA)\n\tdefer serverA.Close()\n\n\tctx := t.Context()\n\tclient := newA2AClient(t, serverA)\n\tmsg := a2a.NewMessage(a2a.MessageRoleUser, a2a.TextPart{Text: \"tell me about the capital of Poland\"})\n\tmsg.ContextID = a2a.NewContextID()\n\n\t// Make streaming request and aggregate results\n\tvar taskID a2a.TaskID\n\tfor event, err := range client.SendStreamingMessage(t.Context(), &a2a.MessageSendParams{Message: msg}) {\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"client.SendStreamingMessage() error = %v\", err)\n\t\t}\n\t\ttaskID = event.TaskInfo().TaskID\n\t}\n\n\t// Check A2A Task state\n\ttask, err := client.GetTask(ctx, &a2a.TaskQueryParams{ID: taskID})\n\tif err != nil {\n\t\tt.Fatalf(\"client.GetTask() error = %v\", err)\n\t}\n\tif task.Status.State != a2a.TaskStateFailed {\n\t\tt.Fatalf(\"task state = %q, want %q\", task.Status.State, a2a.TaskStateFailed)\n\t}\n\tif task.Status.Message == nil || len(task.Status.Message.Parts) != 1 {\n\t\tt.Fatalf(\"task status message = %v, want 1 part\", task.Status.Message)\n\t}\n\tif tp, ok := task.Status.Message.Parts[0].(a2a.TextPart); !ok || !strings.Contains(tp.Text, errorMessage) {\n\t\tt.Fatalf(\"task status message = %v, want containing %q\", task.Status.Message.Parts[0], errorMessage)\n\t}\n\tif len(task.Artifacts) != 1 || len(adka2a.WithoutPartialArtifacts(task.Artifacts)) != 0 {\n\t\tt.Fatalf(\"task artifacts = %v, want single partial artifact\", task.Artifacts)\n\t}\n\tif dp, ok := task.Artifacts[0].Parts[0].(a2a.DataPart); !ok || len(dp.Data) != 0 {\n\t\tt.Fatalf(\"task artifact = %v, want reset partial artifact\", task.Artifacts[0])\n\t}\n\n\t// Check Session Store state\n\tfullSessionResp, err := serviceA.Get(ctx, &session.GetRequest{\n\t\tAppName:   remoteAgent.Name(),\n\t\tUserID:    \"A2A_USER_\" + msg.ContextID,\n\t\tSessionID: msg.ContextID,\n\t})\n\tif err != nil {\n\t\tt.Fatalf(\"serviceA.GetSession() error = %v\", err)\n\t}\n\tevents := fullSessionResp.Session.Events()\n\tif events.Len() != 2 {\n\t\tt.Fatalf(\"got event count = %d, want 2\", events.Len())\n\t}\n\tif !strings.Contains(events.At(1).ErrorMessage, errorMessage) {\n\t\tt.Fatalf(\"got event error message = %q, want containing %q\", events.At(1).ErrorMessage, errorMessage)\n\t}\n}\n\ntype llmStub struct {\n\tname            string\n\tgenerateContent func(ctx context.Context, req *model.LLMRequest, stream bool) iter.Seq2[*model.LLMResponse, error]\n}\n\nfunc (d *llmStub) Name() string {\n\treturn d.name\n}\n\nfunc (d *llmStub) GenerateContent(ctx context.Context, req *model.LLMRequest, stream bool) iter.Seq2[*model.LLMResponse, error] {\n\treturn d.generateContent(ctx, req, stream)\n}\n\nfunc newLongRunningTool(t *testing.T) tool.Tool {\n\tt.Helper()\n\trequestApproval, err := functiontool.New(functiontool.Config{\n\t\tName:          approvalToolName,\n\t\tDescription:   \"Request approval before proceeding.\",\n\t\tIsLongRunning: true,\n\t}, func(ctx tool.Context, x map[string]any) (approval, error) {\n\t\treturn approval{Status: approvalStatusPending, TicketID: a2a.NewContextID()}, nil\n\t})\n\tif err != nil {\n\t\tt.Fatalf(\"functiontool.New() error = %v\", err)\n\t}\n\treturn requestApproval\n}\n\nfunc newToolConfirmation(t *testing.T) tool.Tool {\n\tt.Helper()\n\n\trequestApproval, err := functiontool.New(functiontool.Config{\n\t\tName:        approvalToolName,\n\t\tDescription: \"Request approval before proceeding.\",\n\t}, func(ctx tool.Context, x map[string]any) (approval, error) {\n\t\tconfirmation := ctx.ToolConfirmation()\n\t\tif confirmation == nil {\n\t\t\tticketID := a2a.NewContextID()\n\t\t\tif err := ctx.RequestConfirmation(\"I need approval\", map[string]string{\"ticket_id\": ticketID}); err != nil {\n\t\t\t\treturn approval{}, err\n\t\t\t}\n\t\t\treturn approval{Status: approvalStatusPending, TicketID: ticketID}, nil\n\t\t}\n\t\tif !confirmation.Confirmed {\n\t\t\treturn approval{}, fmt.Errorf(\"confirmation was rejected\")\n\t\t}\n\t\tjsonBytes, err := json.Marshal(confirmation.Payload)\n\t\tif err != nil {\n\t\t\treturn approval{}, fmt.Errorf(\"error marshalling payload %s: %w\", confirmation.Payload, err)\n\t\t}\n\t\tvar payload approval\n\t\tif err := json.Unmarshal(jsonBytes, &payload); err != nil {\n\t\t\treturn approval{}, fmt.Errorf(\"error unmarshalling payload %s: %w\", confirmation.Payload, err)\n\t\t}\n\t\treturn approval{Status: approvalStatusVerified, TicketID: payload.TicketID}, nil\n\t})\n\tif err != nil {\n\t\tt.Fatalf(\"functiontool.New() error = %v\", err)\n\t}\n\treturn requestApproval\n}\n\nfunc newInputRequestingAgent(t *testing.T, name string, requestApproval tool.Tool) agent.Agent {\n\tt.Helper()\n\treturn utils.Must(llmagent.New(llmagent.Config{\n\t\tName:  name,\n\t\tTools: []tool.Tool{requestApproval},\n\t\tModel: &llmStub{\n\t\t\tgenerateContent: func(ctx context.Context, req *model.LLMRequest, stream bool) iter.Seq2[*model.LLMResponse, error] {\n\t\t\t\treturn func(yield func(*model.LLMResponse, error) bool) {\n\t\t\t\t\tlastMessage := req.Contents[len(req.Contents)-1]\n\t\t\t\t\tapprovalResult := utils.FunctionResponses(lastMessage)\n\t\t\t\t\tvar content *genai.Content\n\t\t\t\t\tswitch {\n\t\t\t\t\tcase len(approvalResult) == 0: // the first model invocation - invoke a long running tool\n\t\t\t\t\t\tcontent = genai.NewContentFromParts([]*genai.Part{\n\t\t\t\t\t\t\tgenai.NewPartFromText(modelTextRequiresApproval),\n\t\t\t\t\t\t\tgenai.NewPartFromFunctionCall(approvalToolName, map[string]any{}),\n\t\t\t\t\t\t}, genai.RoleModel)\n\t\t\t\t\tcase len(approvalResult) == 1 && approvalResult[0].Response[\"status\"] == string(approvalStatusPending): // the tool returned a pending result\n\t\t\t\t\t\tcontent = genai.NewContentFromText(modelTextWaitingForApproval, genai.RoleModel)\n\t\t\t\t\tdefault: // user approval is in the session\n\t\t\t\t\t\tcontent = genai.NewContentFromText(modelTextTaskComplete, genai.RoleModel)\n\t\t\t\t\t}\n\t\t\t\t\tyield(&model.LLMResponse{Content: content}, nil)\n\t\t\t\t}\n\t\t\t},\n\t\t},\n\t}))\n}\n\nfunc newRootAgent(name string, subAgent agent.Agent) agent.Agent {\n\treturn utils.Must(llmagent.New(llmagent.Config{\n\t\tName:      name,\n\t\tSubAgents: []agent.Agent{subAgent},\n\t\tModel: &llmStub{\n\t\t\tname: name + \"-model\",\n\t\t\tgenerateContent: func(ctx context.Context, req *model.LLMRequest, stream bool) iter.Seq2[*model.LLMResponse, error] {\n\t\t\t\treturn func(yield func(*model.LLMResponse, error) bool) {\n\t\t\t\t\tyield(&model.LLMResponse{\n\t\t\t\t\t\tContent: genai.NewContentFromParts([]*genai.Part{\n\t\t\t\t\t\t\tgenai.NewPartFromText(modelTextRootTransfer),\n\t\t\t\t\t\t\tgenai.NewPartFromFunctionCall(transferToolName, map[string]any{\"agent_name\": subAgent.Name()}),\n\t\t\t\t\t\t}, genai.RoleModel),\n\t\t\t\t\t}, nil)\n\t\t\t\t}\n\t\t\t},\n\t\t},\n\t}))\n}\n\nfunc newAgentExecutor(agnt agent.Agent, service session.Service, mode adka2a.OutputMode) a2asrv.AgentExecutor {\n\tif service == nil {\n\t\tservice = session.InMemoryService()\n\t}\n\treturn adka2a.NewExecutor(adka2a.ExecutorConfig{\n\t\tOutputMode: mode,\n\t\tRunnerConfig: runner.Config{\n\t\t\tAppName:        agnt.Name(),\n\t\t\tSessionService: service,\n\t\t\tAgent:          agnt,\n\t\t},\n\t\tRunConfig: agent.RunConfig{StreamingMode: agent.StreamingModeSSE},\n\t})\n}\n\nfunc mustSendMessage(t *testing.T, client *a2aclient.Client, msg *a2a.Message) *a2a.Task {\n\tt.Helper()\n\tsendParams := &a2a.MessageSendParams{Message: msg}\n\tresult, err := client.SendMessage(t.Context(), sendParams)\n\tif err != nil {\n\t\tt.Fatalf(\"client.SendMessage() error = %v\", err)\n\t}\n\ttask, ok := result.(*a2a.Task)\n\tif !ok {\n\t\tt.Fatalf(\"client.SendMessage() result is %T, want *a2a.Task\", result)\n\t}\n\treturn task\n}\n\nfunc filterPartial(parts []a2a.Part) []a2a.Part {\n\tvar result []a2a.Part\n\tfor _, p := range parts {\n\t\tif b, _ := p.Meta()[adka2a.ToA2AMetaKey(\"partial\")].(bool); b {\n\t\t\tcontinue\n\t\t}\n\t\tresult = append(result, p)\n\t}\n\treturn result\n}\n\nfunc findLongRunningCall(t *testing.T, parts []*genai.Part) (*genai.FunctionCall, *genai.FunctionResponse) {\n\tt.Helper()\n\tcontent := genai.NewContentFromParts(parts, genai.RoleModel)\n\tcalls := utils.FunctionCalls(content)\n\tresponses := utils.FunctionResponses(content)\n\tif len(calls) > 1 {\n\t\tt.Fatalf(\"got %d calls, want 1\", len(calls))\n\t}\n\tif len(responses) > 1 {\n\t\tt.Fatalf(\"got %d responses, want 1\", len(responses))\n\t}\n\tvar call *genai.FunctionCall\n\tif len(calls) == 1 {\n\t\tcall = calls[0]\n\t}\n\tvar response *genai.FunctionResponse\n\tif len(responses) == 1 {\n\t\tresponse = responses[0]\n\t}\n\treturn call, response\n}\n\nfunc toA2AParts(t *testing.T, parts []*genai.Part, callIDs []string) []a2a.Part {\n\tt.Helper()\n\ta2aParts, err := adka2a.ToA2AParts(parts, callIDs)\n\tif err != nil {\n\t\tt.Fatalf(\"adka2a.ToA2AParts() error = %v\", err)\n\t}\n\treturn a2aParts\n}\n\nfunc toGenaiParts(t *testing.T, a2aParts []a2a.Part) []*genai.Part {\n\tt.Helper()\n\tparts, err := adka2a.ToGenAIParts(a2aParts)\n\tif err != nil {\n\t\tt.Fatalf(\"adka2a.ToGenAIParts() error = %v\", err)\n\t}\n\treturn parts\n}\n\nfunc toMap(t *testing.T, v any) map[string]any {\n\tt.Helper()\n\tresult, err := converters.ToMapStructure(v)\n\tif err != nil {\n\t\tt.Fatalf(\"converters.ToMapStructure error = %v\", err)\n\t}\n\treturn result\n}\n\nfunc fromMap[T any](t *testing.T, m map[string]any) *T {\n\tt.Helper()\n\tresult, err := converters.FromMapStructure[T](m)\n\tif err != nil {\n\t\tt.Fatalf(\"converters.FromMapStructure() error = %v\", err)\n\t}\n\treturn result\n}\n\nfunc newA2AClient(t *testing.T, server *testA2AServer) *a2aclient.Client {\n\tt.Helper()\n\n\tresult, err := a2aclient.NewFromCard(t.Context(), &a2a.AgentCard{\n\t\tPreferredTransport: a2a.TransportProtocolJSONRPC,\n\t\tURL:                server.URL, Capabilities: a2a.AgentCapabilities{Streaming: true},\n\t})\n\tif err != nil {\n\t\tt.Fatalf(\"a2aclient.NewFromEndpoints() error = %v\", err)\n\t}\n\treturn result\n}\n\nfunc createLongRunningToolApproval(t *testing.T, pendingResponse *genai.FunctionResponse) *genai.Part {\n\tt.Helper()\n\tpendingApproval := fromMap[approval](t, pendingResponse.Response)\n\tresponse := genai.NewPartFromFunctionResponse(approvalToolName, toMap(t, approval{\n\t\tStatus:   approvalStatusApproved,\n\t\tTicketID: pendingApproval.TicketID,\n\t}))\n\tresponse.FunctionResponse.ID = pendingResponse.ID\n\treturn response\n}\n\nfunc createToolConfirmationApproval(t *testing.T, toolCall *genai.FunctionCall) *genai.Part {\n\tt.Helper()\n\ttcMap, ok := toolCall.Args[\"toolConfirmation\"].(map[string]any)\n\tif !ok {\n\t\tt.Fatalf(\"toolCall = %v, want toolConfirmation\", toolCall)\n\t}\n\tpayloadMap, ok := tcMap[\"payload\"].(map[string]any)\n\tif !ok {\n\t\tt.Fatalf(\"toolCall = %v, want payload\", toolCall)\n\t}\n\tticketID, ok := payloadMap[\"ticket_id\"].(string)\n\tif !ok {\n\t\tt.Fatalf(\"toolCall = %v, want ticket_id\", toolCall)\n\t}\n\treturn &genai.Part{\n\t\tFunctionResponse: &genai.FunctionResponse{\n\t\t\tID:   toolCall.ID,\n\t\t\tName: toolCall.Name,\n\t\t\tResponse: map[string]any{\n\t\t\t\t\"confirmed\": true,\n\t\t\t\t\"payload\":   map[string]string{\"ticket_id\": ticketID},\n\t\t\t},\n\t\t},\n\t}\n}\n\nfunc newGeminiTestClientConfig(t *testing.T, rrfile string) (http.RoundTripper, bool) {\n\tt.Helper()\n\trr, err := testutil.NewGeminiTransport(rrfile)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\t// Ensure the transport is closed to flush data and release locks\n\tif c, ok := rr.(io.Closer); ok {\n\t\tt.Cleanup(func() {\n\t\t\tif err := c.Close(); err != nil {\n\t\t\t\tt.Errorf(\"failed to close transport: %v\", err)\n\t\t\t}\n\t\t})\n\t}\n\n\trecording, _ := httprr.Recording(rrfile)\n\treturn rr, recording\n}\n\nfunc newGeminiModel(t *testing.T, modelName string) model.LLM {\n\tapiKey := \"fakeKey\"\n\ttrace := filepath.Join(\"testdata\", strings.ReplaceAll(t.Name()+\".httprr\", \"/\", \"_\"))\n\trecording := false\n\ttransport, recording := newGeminiTestClientConfig(t, trace)\n\tif recording { // if we are recording httprr trace, don't use the fakeKey.\n\t\tapiKey = \"\"\n\t}\n\n\tmodel, err := gemini.NewModel(t.Context(), modelName, &genai.ClientConfig{\n\t\tHTTPClient: &http.Client{Transport: transport},\n\t\tAPIKey:     apiKey,\n\t})\n\tif err != nil {\n\t\tt.Fatalf(\"failed to create model: %v\", err)\n\t}\n\treturn model\n}\n\nfunc TestA2AMultiHopInputRequiredCancellation(t *testing.T) {\n\tremoteAgentName := \"remote-agent-B\"\n\tremoteTaskIDChan := make(chan a2a.TaskID, 1)\n\tserverB := startA2AServer(&mockA2AExecutor{\n\t\texecuteFn: func(ctx context.Context, reqCtx *a2asrv.RequestContext, queue eventqueue.Queue) error {\n\t\t\tremoteTaskIDChan <- reqCtx.TaskID\n\t\t\tev := a2a.NewStatusUpdateEvent(reqCtx, a2a.TaskStateInputRequired, a2a.NewMessage(a2a.MessageRoleAgent, a2a.DataPart{\n\t\t\t\tData:     map[string]any{\"id\": \"call-1\", \"name\": \"foo\"},\n\t\t\t\tMetadata: map[string]any{\"adk_is_long_running\": true, \"adk_type\": \"function_call\"},\n\t\t\t}))\n\t\t\tev.Final = true\n\t\t\treturn queue.Write(ctx, ev)\n\t\t},\n\t\tcancelFn: func(ctx context.Context, reqCtx *a2asrv.RequestContext, queue eventqueue.Queue) error {\n\t\t\tev := a2a.NewStatusUpdateEvent(reqCtx, a2a.TaskStateCanceled, nil)\n\t\t\tev.Final = true\n\t\t\treturn queue.Write(ctx, ev)\n\t\t},\n\t})\n\tdefer serverB.Close()\n\n\t// Server A\n\tremoteAgent := newA2ARemoteAgent(t, remoteAgentName, serverB)\n\trootAgent := newRootAgent(\"root\", remoteAgent)\n\texecutorA := newAgentExecutor(rootAgent, nil, adka2a.OutputArtifactPerRun)\n\tserverA := startA2AServer(executorA)\n\tdefer serverA.Close()\n\n\t// Send message\n\tclientA := newA2AClient(t, serverA)\n\tmsg1 := a2a.NewMessage(a2a.MessageRoleUser, a2a.TextPart{Text: \"Hello\"})\n\ttask1 := mustSendMessage(t, clientA, msg1)\n\tif task1.Status.State != a2a.TaskStateInputRequired {\n\t\tt.Fatalf(\"task1.Status.State = %q, want %q\", task1.Status.State, a2a.TaskStateInputRequired)\n\t}\n\n\t// Cancel the task on Server A\n\t_, err := clientA.CancelTask(t.Context(), &a2a.TaskIDParams{ID: task1.ID})\n\tif err != nil {\n\t\tt.Fatalf(\"client.CancelTask() error = %v\", err)\n\t}\n\n\t// Verify that Server B's task was cancelled\n\tremoteTaskID := <-remoteTaskIDChan\n\tclientB := newA2AClient(t, serverB)\n\tremoteTask, err := clientB.GetTask(t.Context(), &a2a.TaskQueryParams{ID: remoteTaskID})\n\tif err != nil {\n\t\tt.Fatalf(\"client.CancelTask() error = %v\", err)\n\t}\n\tif remoteTask.Status.State != a2a.TaskStateCanceled {\n\t\tt.Fatalf(\"remoteTask.Status.State = %q, want %q\", remoteTask.Status.State, a2a.TaskStateCanceled)\n\t}\n}\n"
  },
  {
    "path": "agent/remoteagent/doc.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Package remoteagent allows to use a remote ADK agents.\npackage remoteagent\n"
  },
  {
    "path": "agent/remoteagent/testdata/TestA2ARemoteAgentStreamingGeminiError.httprr",
    "content": "httprr trace v1\n501 6929\nPOST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:streamGenerateContent?alt=sse HTTP/1.1\r\nHost: generativelanguage.googleapis.com\r\nUser-Agent: Go-http-client/1.1\r\nContent-Length: 255\r\nContent-Type: application/json\r\n\r\n{\"contents\":[{\"parts\":[{\"text\":\"tell me about the capital of Poland\"}],\"role\":\"user\"}],\"generationConfig\":{},\"systemInstruction\":{\"parts\":[{\"text\":\"You are a helpful assistant.\\n\\nYou are an agent. Your internal name is \\\"model-agent\\\".\"}],\"role\":\"user\"}}HTTP/2.0 200 OK\r\nConnection: close\r\nContent-Disposition: attachment\r\nContent-Type: text/event-stream\r\nDate: Tue, 10 Mar 2026 14:12:50 GMT\r\nServer: scaffolding on HTTPServer2\r\nServer-Timing: gfet4t7; dur=811\r\nVary: Origin\r\nVary: X-Origin\r\nVary: Referer\r\nX-Content-Type-Options: nosniff\r\nX-Frame-Options: SAMEORIGIN\r\nX-Xss-Protection: 0\r\n\r\ndata: {\"candidates\": [{\"content\": {\"parts\": [{\"text\": \"The capital of Poland is **Warsaw** (Polish: *Warszawa*).\\n\\nHere's some information about it:\\n\\n*   **Location\"}],\"role\": \"model\"},\"index\": 0}],\"usageMetadata\": {\"promptTokenCount\": 30,\"candidatesTokenCount\": 31,\"totalTokenCount\": 91,\"promptTokensDetails\": [{\"modality\": \"TEXT\",\"tokenCount\": 30}],\"thoughtsTokenCount\": 30},\"modelVersion\": \"gemini-2.5-flash\",\"responseId\": \"4SawaZC7Oojp7M8P7KjSyAc\"}\r\n\r\ndata: {\"candidates\": [{\"content\": {\"parts\": [{\"text\": \":** It's located in east-central Poland, on the Vistula River.\\n*   **Population:** It's the largest city in Poland, with a metropolitan area of over 3 million people.\\n*   **\"}],\"role\": \"model\"},\"index\": 0}],\"usageMetadata\": {\"promptTokenCount\": 30,\"candidatesTokenCount\": 79,\"totalTokenCount\": 139,\"promptTokensDetails\": [{\"modality\": \"TEXT\",\"tokenCount\": 30}],\"thoughtsTokenCount\": 30},\"modelVersion\": \"gemini-2.5-flash\",\"responseId\": \"4SawaZC7Oojp7M8P7KjSyAc\"}\r\n\r\ndata: {\"candidates\": [{\"content\": {\"parts\": [{\"text\": \"History & Resilience:** Warsaw has a incredibly dramatic history, most notably its near-total destruction during World War II, particularly during the Warsaw Uprising in 1944. An estimated 85% of its buildings were destroyed.\"}],\"role\": \"model\"},\"index\": 0}],\"usageMetadata\": {\"promptTokenCount\": 30,\"candidatesTokenCount\": 127,\"totalTokenCount\": 187,\"promptTokensDetails\": [{\"modality\": \"TEXT\",\"tokenCount\": 30}],\"thoughtsTokenCount\": 30},\"modelVersion\": \"gemini-2.5-flash\",\"responseId\": \"4SawaZC7Oojp7M8P7KjSyAc\"}\r\n\r\ndata: {\"candidates\": [{\"content\": {\"parts\": [{\"text\": \"\\n*   **Reconstruction:** Despite the devastation, the city was meticulously rebuilt, often using original bricks and careful historical documentation. This includes the famous **Old Town**, which was so faithfully reconstructed that it was designated a **UNESCO World Heritage Site** in\"}],\"role\": \"model\"},\"index\": 0}],\"usageMetadata\": {\"promptTokenCount\": 30,\"candidatesTokenCount\": 177,\"totalTokenCount\": 237,\"promptTokensDetails\": [{\"modality\": \"TEXT\",\"tokenCount\": 30}],\"thoughtsTokenCount\": 30},\"modelVersion\": \"gemini-2.5-flash\",\"responseId\": \"4SawaZC7Oojp7M8P7KjSyAc\"}\r\n\r\ndata: {\"candidates\": [{\"content\": {\"parts\": [{\"text\": \" 1980 as \\\"an outstanding example of a near-total reconstruction of a historical continuity and cultural heritage destroyed by World War II.\\\"\\n*   **Modern City:** Today, Warsaw is a vibrant, modern European capital, a major\"}],\"role\": \"model\"},\"index\": 0}],\"usageMetadata\": {\"promptTokenCount\": 30,\"candidatesTokenCount\": 225,\"totalTokenCount\": 285,\"promptTokensDetails\": [{\"modality\": \"TEXT\",\"tokenCount\": 30}],\"thoughtsTokenCount\": 30},\"modelVersion\": \"gemini-2.5-flash\",\"responseId\": \"4SawaZC7Oojp7M8P7KjSyAc\"}\r\n\r\ndata: {\"candidates\": [{\"content\": {\"parts\": [{\"text\": \" economic, political, and cultural hub. It boasts a dynamic skyline with numerous skyscrapers, reflecting its rapid growth and development since the fall of communism.\\n*   **Key Landmarks & Attractions:**\\n    *   **Old Town (Stare\"}],\"role\": \"model\"},\"index\": 0}],\"usageMetadata\": {\"promptTokenCount\": 30,\"candidatesTokenCount\": 273,\"totalTokenCount\": 333,\"promptTokensDetails\": [{\"modality\": \"TEXT\",\"tokenCount\": 30}],\"thoughtsTokenCount\": 30},\"modelVersion\": \"gemini-2.5-flash\",\"responseId\": \"4SawaZC7Oojp7M8P7KjSyAc\"}\r\n\r\ndata: {\"candidates\": [{\"content\": {\"parts\": [{\"text\": \" Miasto):** Market Square, Royal Castle, Barbican.\\n    *   **Palace of Culture and Science:** A controversial but iconic gift from the Soviet Union, offering panoramic views.\\n    *   **Łazienki Park\"}],\"role\": \"model\"},\"index\": 0}],\"usageMetadata\": {\"promptTokenCount\": 30,\"candidatesTokenCount\": 322,\"totalTokenCount\": 382,\"promptTokensDetails\": [{\"modality\": \"TEXT\",\"tokenCount\": 30}],\"thoughtsTokenCount\": 30},\"modelVersion\": \"gemini-2.5-flash\",\"responseId\": \"4SawaZC7Oojp7M8P7KjSyAc\"}\r\n\r\ndata: {\"candidates\": [{\"content\": {\"parts\": [{\"text\": \":** A beautiful park with palaces, an amphitheater, and a monument to Frédéric Chopin.\\n    *   **Warsaw Uprising Museum:** A powerful and moving museum dedicated to the 1944 uprising.\\n    *   **\"}],\"role\": \"model\"},\"index\": 0}],\"usageMetadata\": {\"promptTokenCount\": 30,\"candidatesTokenCount\": 371,\"totalTokenCount\": 431,\"promptTokensDetails\": [{\"modality\": \"TEXT\",\"tokenCount\": 30}],\"thoughtsTokenCount\": 30},\"modelVersion\": \"gemini-2.5-flash\",\"responseId\": \"4SawaZC7Oojp7M8P7KjSyAc\"}\r\n\r\ndata: {\"candidates\": [{\"content\": {\"parts\": [{\"text\": \"POLIN Museum of the History of Polish Jews:** An award-winning museum exploring the thousand-year history of Jews in Poland.\\n    *   **Royal Route:** A historic route connecting the Royal Castle with the Wilanów Palace,\"}],\"role\": \"model\"},\"index\": 0}],\"usageMetadata\": {\"promptTokenCount\": 30,\"candidatesTokenCount\": 419,\"totalTokenCount\": 479,\"promptTokensDetails\": [{\"modality\": \"TEXT\",\"tokenCount\": 30}],\"thoughtsTokenCount\": 30},\"modelVersion\": \"gemini-2.5-flash\",\"responseId\": \"4SawaZC7Oojp7M8P7KjSyAc\"}\r\n\r\ndata: {\"candidates\": [{\"content\": {\"parts\": [{\"text\": \" lined with churches, palaces, and statues.\\n*   **Culture:** It's a major center for arts and culture, with numerous theaters, museums, art galleries, and music venues. Chopin, the famous composer, spent his early\"}],\"role\": \"model\"},\"index\": 0}],\"usageMetadata\": {\"promptTokenCount\": 30,\"candidatesTokenCount\": 467,\"totalTokenCount\": 527,\"promptTokensDetails\": [{\"modality\": \"TEXT\",\"tokenCount\": 30}],\"thoughtsTokenCount\": 30},\"modelVersion\": \"gemini-2.5-flash\",\"responseId\": \"4SawaZC7Oojp7M8P7KjSyAc\"}\r\n\r\ndata: {\"candidates\": [{\"content\": {\"parts\": [{\"text\": \" life in Warsaw.\\n*   **Economy:** Warsaw is Poland's primary economic engine, home to numerous international companies, financial institutions, and a thriving startup scene.\\n\\nIn essence, Warsaw is a city that embodies resilience, rebirth, and a blend\"}],\"role\": \"model\"},\"index\": 0}],\"usageMetadata\": {\"promptTokenCount\": 30,\"candidatesTokenCount\": 518,\"totalTokenCount\": 578,\"promptTokensDetails\": [{\"modality\": \"TEXT\",\"tokenCount\": 30}],\"thoughtsTokenCount\": 30},\"modelVersion\": \"gemini-2.5-flash\",\"responseId\": \"4SawaZC7Oojp7M8P7KjSyAc\"}\r\n\r\ndata: {\"candidates\": [{\"content\": {\"parts\": [{\"text\": \" of rich history with dynamic modernity.\"}],\"role\": \"model\"},\"finishReason\": \"STOP\",\"index\": 0}],\"usageMetadata\": {\"promptTokenCount\": 30,\"candidatesTokenCount\": 525,\"totalTokenCount\": 585,\"promptTokensDetails\": [{\"modality\": \"TEXT\",\"tokenCount\": 30}],\"thoughtsTokenCount\": 30},\"modelVersion\": \"gemini-2.5-flash\",\"responseId\": \"4SawaZC7Oojp7M8P7KjSyAc\"}\r\n\r\n"
  },
  {
    "path": "agent/remoteagent/testdata/TestA2ARemoteAgentStreamingGeminiSuccess.httprr",
    "content": "httprr trace v1\n501 6279\nPOST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:streamGenerateContent?alt=sse HTTP/1.1\r\nHost: generativelanguage.googleapis.com\r\nUser-Agent: Go-http-client/1.1\r\nContent-Length: 255\r\nContent-Type: application/json\r\n\r\n{\"contents\":[{\"parts\":[{\"text\":\"tell me about the capital of Poland\"}],\"role\":\"user\"}],\"generationConfig\":{},\"systemInstruction\":{\"parts\":[{\"text\":\"You are a helpful assistant.\\n\\nYou are an agent. Your internal name is \\\"model-agent\\\".\"}],\"role\":\"user\"}}HTTP/2.0 200 OK\r\nConnection: close\r\nContent-Disposition: attachment\r\nContent-Type: text/event-stream\r\nDate: Tue, 10 Mar 2026 14:12:37 GMT\r\nServer: scaffolding on HTTPServer2\r\nServer-Timing: gfet4t7; dur=686\r\nVary: Origin\r\nVary: X-Origin\r\nVary: Referer\r\nX-Content-Type-Options: nosniff\r\nX-Frame-Options: SAMEORIGIN\r\nX-Xss-Protection: 0\r\n\r\ndata: {\"candidates\": [{\"content\": {\"parts\": [{\"text\": \"The capital of Poland is **Warsaw** (Polish: *Warszawa*).\\n\\nHere's a brief overview:\\n\\n*   **Location:**\"}],\"role\": \"model\"},\"index\": 0}],\"usageMetadata\": {\"promptTokenCount\": 30,\"candidatesTokenCount\": 31,\"totalTokenCount\": 94,\"promptTokensDetails\": [{\"modality\": \"TEXT\",\"tokenCount\": 30}],\"thoughtsTokenCount\": 33},\"modelVersion\": \"gemini-2.5-flash\",\"responseId\": \"1Cawad6GGqqAvdIPveLuiAU\"}\r\n\r\ndata: {\"candidates\": [{\"content\": {\"parts\": [{\"text\": \" Situated on the Vistula River in east-central Poland.\\n*   **History:** Warsaw has a long and often tragic history. It became the capital in 1596 when King Sigismund III Vasa moved his court from Krakow.\"}],\"role\": \"model\"},\"index\": 0}],\"usageMetadata\": {\"promptTokenCount\": 30,\"candidatesTokenCount\": 82,\"totalTokenCount\": 145,\"promptTokensDetails\": [{\"modality\": \"TEXT\",\"tokenCount\": 30}],\"thoughtsTokenCount\": 33},\"modelVersion\": \"gemini-2.5-flash\",\"responseId\": \"1Cawad6GGqqAvdIPveLuiAU\"}\r\n\r\ndata: {\"candidates\": [{\"content\": {\"parts\": [{\"text\": \" It was completely devastated during World War II, particularly during the Warsaw Uprising in 1944. An estimated 85% of its buildings were destroyed.\\n*   **Reconstruction:** After the war, the city underwent an astonishing\"}],\"role\": \"model\"},\"index\": 0}],\"usageMetadata\": {\"promptTokenCount\": 30,\"candidatesTokenCount\": 132,\"totalTokenCount\": 195,\"promptTokensDetails\": [{\"modality\": \"TEXT\",\"tokenCount\": 30}],\"thoughtsTokenCount\": 33},\"modelVersion\": \"gemini-2.5-flash\",\"responseId\": \"1Cawad6GGqqAvdIPveLuiAU\"}\r\n\r\ndata: {\"candidates\": [{\"content\": {\"parts\": [{\"text\": \" and meticulous reconstruction, with many historical buildings, especially in the Old Town, being rebuilt to their pre-war appearance. This effort led to its **Old Town being designated a UNESCO World Heritage Site** in 1980, recognized as\"}],\"role\": \"model\"},\"index\": 0}],\"usageMetadata\": {\"promptTokenCount\": 30,\"candidatesTokenCount\": 181,\"totalTokenCount\": 244,\"promptTokensDetails\": [{\"modality\": \"TEXT\",\"tokenCount\": 30}],\"thoughtsTokenCount\": 33},\"modelVersion\": \"gemini-2.5-flash\",\"responseId\": \"1Cawad6GGqqAvdIPveLuiAU\"}\r\n\r\ndata: {\"candidates\": [{\"content\": {\"parts\": [{\"text\": \" \\\"an outstanding example of a near-total reconstruction of a span of history covering the 13th to the 20th century.\\\"\\n*   **Modern City:** Today, Warsaw is a vibrant metropolis, the largest city in Poland, and\"}],\"role\": \"model\"},\"index\": 0}],\"usageMetadata\": {\"promptTokenCount\": 30,\"candidatesTokenCount\": 232,\"totalTokenCount\": 295,\"promptTokensDetails\": [{\"modality\": \"TEXT\",\"tokenCount\": 30}],\"thoughtsTokenCount\": 33},\"modelVersion\": \"gemini-2.5-flash\",\"responseId\": \"1Cawad6GGqqAvdIPveLuiAU\"}\r\n\r\ndata: {\"candidates\": [{\"content\": {\"parts\": [{\"text\": \" the country's economic, political, and cultural hub. It's known for its mix of historical architecture, modern skyscrapers, green spaces, and lively cultural scene.\\n*   **Key Landmarks:**\\n    *   **Old Town\"}],\"role\": \"model\"},\"index\": 0}],\"usageMetadata\": {\"promptTokenCount\": 30,\"candidatesTokenCount\": 280,\"totalTokenCount\": 343,\"promptTokensDetails\": [{\"modality\": \"TEXT\",\"tokenCount\": 30}],\"thoughtsTokenCount\": 33},\"modelVersion\": \"gemini-2.5-flash\",\"responseId\": \"1Cawad6GGqqAvdIPveLuiAU\"}\r\n\r\ndata: {\"candidates\": [{\"content\": {\"parts\": [{\"text\": \" Market Square:** The heart of the Old Town, surrounded by colorful merchant houses.\\n    *   **Royal Castle:** The former residence of Polish monarchs.\\n    *   **Palace of Culture and Science:** A controversial but iconic gift\"}],\"role\": \"model\"},\"index\": 0}],\"usageMetadata\": {\"promptTokenCount\": 30,\"candidatesTokenCount\": 328,\"totalTokenCount\": 391,\"promptTokensDetails\": [{\"modality\": \"TEXT\",\"tokenCount\": 30}],\"thoughtsTokenCount\": 33},\"modelVersion\": \"gemini-2.5-flash\",\"responseId\": \"1Cawad6GGqqAvdIPveLuiAU\"}\r\n\r\ndata: {\"candidates\": [{\"content\": {\"parts\": [{\"text\": \" from the Soviet Union, now housing museums, theaters, and offices.\\n    *   **Łazienki Park:** A beautiful 18th-century park complex with palaces, pavilions, and a famous monument to Frédéric Chopin.\"}],\"role\": \"model\"},\"index\": 0}],\"usageMetadata\": {\"promptTokenCount\": 30,\"candidatesTokenCount\": 376,\"totalTokenCount\": 439,\"promptTokensDetails\": [{\"modality\": \"TEXT\",\"tokenCount\": 30}],\"thoughtsTokenCount\": 33},\"modelVersion\": \"gemini-2.5-flash\",\"responseId\": \"1Cawad6GGqqAvdIPveLuiAU\"}\r\n\r\ndata: {\"candidates\": [{\"content\": {\"parts\": [{\"text\": \"\\n    *   **Warsaw Uprising Museum:** A powerful museum documenting the 1944 uprising.\\n    *   **POLIN Museum of the History of Polish Jews:** A modern, award-winning museum exploring the thousand\"}],\"role\": \"model\"},\"index\": 0}],\"usageMetadata\": {\"promptTokenCount\": 30,\"candidatesTokenCount\": 422,\"totalTokenCount\": 485,\"promptTokensDetails\": [{\"modality\": \"TEXT\",\"tokenCount\": 30}],\"thoughtsTokenCount\": 33},\"modelVersion\": \"gemini-2.5-flash\",\"responseId\": \"1Cawad6GGqqAvdIPveLuiAU\"}\r\n\r\ndata: {\"candidates\": [{\"content\": {\"parts\": [{\"text\": \"-year history of Jews in Poland.\\n*   **Economy:** Warsaw is a major financial center and a hub for international businesses, higher education, and research.\\n\\nIt's a city that truly embodies resilience and a testament to the human\"}],\"role\": \"model\"},\"index\": 0}],\"usageMetadata\": {\"promptTokenCount\": 30,\"candidatesTokenCount\": 471,\"totalTokenCount\": 534,\"promptTokensDetails\": [{\"modality\": \"TEXT\",\"tokenCount\": 30}],\"thoughtsTokenCount\": 33},\"modelVersion\": \"gemini-2.5-flash\",\"responseId\": \"1Cawad6GGqqAvdIPveLuiAU\"}\r\n\r\ndata: {\"candidates\": [{\"content\": {\"parts\": [{\"text\": \" spirit to rebuild and thrive.\"}],\"role\": \"model\"},\"finishReason\": \"STOP\",\"index\": 0}],\"usageMetadata\": {\"promptTokenCount\": 30,\"candidatesTokenCount\": 477,\"totalTokenCount\": 540,\"promptTokensDetails\": [{\"modality\": \"TEXT\",\"tokenCount\": 30}],\"thoughtsTokenCount\": 33},\"modelVersion\": \"gemini-2.5-flash\",\"responseId\": \"1Cawad6GGqqAvdIPveLuiAU\"}\r\n\r\n"
  },
  {
    "path": "agent/remoteagent/testdata/TestA2ASingleHopFinalResponse_llm_mid-response_error.httprr",
    "content": "httprr trace v1\n499 1280\nPOST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:streamGenerateContent?alt=sse HTTP/1.1\r\nHost: generativelanguage.googleapis.com\r\nUser-Agent: Go-http-client/1.1\r\nContent-Length: 253\r\nContent-Type: application/json\r\n\r\n{\"contents\":[{\"parts\":[{\"text\":\"Tell me about the current weather\"}],\"role\":\"user\"}],\"generationConfig\":{},\"systemInstruction\":{\"parts\":[{\"text\":\"You are a helpful assistant.\\n\\nYou are an agent. Your internal name is \\\"model-agent\\\".\"}],\"role\":\"user\"}}HTTP/2.0 200 OK\r\nConnection: close\r\nContent-Disposition: attachment\r\nContent-Type: text/event-stream\r\nDate: Tue, 10 Mar 2026 14:12:23 GMT\r\nServer: scaffolding on HTTPServer2\r\nServer-Timing: gfet4t7; dur=761\r\nVary: Origin\r\nVary: X-Origin\r\nVary: Referer\r\nX-Content-Type-Options: nosniff\r\nX-Frame-Options: SAMEORIGIN\r\nX-Xss-Protection: 0\r\n\r\ndata: {\"candidates\": [{\"content\": {\"parts\": [{\"text\": \"I can help you with that! To give you the most accurate weather, I need to know your current location or the location you're interested\"}],\"role\": \"model\"},\"index\": 0}],\"usageMetadata\": {\"promptTokenCount\": 29,\"candidatesTokenCount\": 29,\"totalTokenCount\": 94,\"promptTokensDetails\": [{\"modality\": \"TEXT\",\"tokenCount\": 29}],\"thoughtsTokenCount\": 36},\"modelVersion\": \"gemini-2.5-flash\",\"responseId\": \"xiawabjkJuPd7M8PkYmgyAo\"}\r\n\r\ndata: {\"candidates\": [{\"content\": {\"parts\": [{\"text\": \" in.\\n\\nCould you please tell me the city and country (and state/province if applicable)?\"}],\"role\": \"model\"},\"finishReason\": \"STOP\",\"index\": 0}],\"usageMetadata\": {\"promptTokenCount\": 29,\"candidatesTokenCount\": 49,\"totalTokenCount\": 114,\"promptTokensDetails\": [{\"modality\": \"TEXT\",\"tokenCount\": 29}],\"thoughtsTokenCount\": 36},\"modelVersion\": \"gemini-2.5-flash\",\"responseId\": \"xiawabjkJuPd7M8PkYmgyAo\"}\r\n\r\n"
  },
  {
    "path": "agent/remoteagent/testdata/TestA2ASingleHopFinalResponse_llm_mid-response_error_response.httprr",
    "content": "httprr trace v1\n499 2185\nPOST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:streamGenerateContent?alt=sse HTTP/1.1\r\nHost: generativelanguage.googleapis.com\r\nUser-Agent: Go-http-client/1.1\r\nContent-Length: 253\r\nContent-Type: application/json\r\n\r\n{\"contents\":[{\"parts\":[{\"text\":\"Tell me about the current weather\"}],\"role\":\"user\"}],\"generationConfig\":{},\"systemInstruction\":{\"parts\":[{\"text\":\"You are a helpful assistant.\\n\\nYou are an agent. Your internal name is \\\"model-agent\\\".\"}],\"role\":\"user\"}}HTTP/2.0 200 OK\r\nConnection: close\r\nContent-Disposition: attachment\r\nContent-Type: text/event-stream\r\nDate: Tue, 10 Mar 2026 14:12:22 GMT\r\nServer: scaffolding on HTTPServer2\r\nServer-Timing: gfet4t7; dur=2179\r\nVary: Origin\r\nVary: X-Origin\r\nVary: Referer\r\nX-Content-Type-Options: nosniff\r\nX-Frame-Options: SAMEORIGIN\r\nX-Xss-Protection: 0\r\n\r\ndata: {\"candidates\": [{\"content\": {\"parts\": [{\"text\": \"I can help you with that! However, I don'\"}],\"role\": \"model\"},\"index\": 0}],\"usageMetadata\": {\"promptTokenCount\": 29,\"candidatesTokenCount\": 12,\"totalTokenCount\": 240,\"promptTokensDetails\": [{\"modality\": \"TEXT\",\"tokenCount\": 29}],\"thoughtsTokenCount\": 199},\"modelVersion\": \"gemini-2.5-flash\",\"responseId\": \"wyawaZq1OqfNkdUPu_SioAU\"}\r\n\r\ndata: {\"candidates\": [{\"content\": {\"parts\": [{\"text\": \"t have access to real-time information or your current location.\\n\\nTo tell you about the weather, I'll need to know:\\n\\n*   **What city and country** are you interested in? (e.g., \\\"London\"}],\"role\": \"model\"},\"index\": 0}],\"usageMetadata\": {\"promptTokenCount\": 29,\"candidatesTokenCount\": 61,\"totalTokenCount\": 289,\"promptTokensDetails\": [{\"modality\": \"TEXT\",\"tokenCount\": 29}],\"thoughtsTokenCount\": 199},\"modelVersion\": \"gemini-2.5-flash\",\"responseId\": \"wyawaZq1OqfNkdUPu_SioAU\"}\r\n\r\ndata: {\"candidates\": [{\"content\": {\"parts\": [{\"text\": \", UK\\\" or \\\"New York City, USA\\\")\\n*   **What state or province** too, if applicable (e.g., \\\"Portland, Oregon, USA\\\")\\n\\nOnce you tell me the location, I can look up\"}],\"role\": \"model\"},\"index\": 0}],\"usageMetadata\": {\"promptTokenCount\": 29,\"candidatesTokenCount\": 109,\"totalTokenCount\": 337,\"promptTokensDetails\": [{\"modality\": \"TEXT\",\"tokenCount\": 29}],\"thoughtsTokenCount\": 199},\"modelVersion\": \"gemini-2.5-flash\",\"responseId\": \"wyawaZq1OqfNkdUPu_SioAU\"}\r\n\r\ndata: {\"candidates\": [{\"content\": {\"parts\": [{\"text\": \" the current weather for you!\"}],\"role\": \"model\"},\"finishReason\": \"STOP\",\"index\": 0}],\"usageMetadata\": {\"promptTokenCount\": 29,\"candidatesTokenCount\": 115,\"totalTokenCount\": 343,\"promptTokensDetails\": [{\"modality\": \"TEXT\",\"tokenCount\": 29}],\"thoughtsTokenCount\": 199},\"modelVersion\": \"gemini-2.5-flash\",\"responseId\": \"wyawaZq1OqfNkdUPu_SioAU\"}\r\n\r\n"
  },
  {
    "path": "agent/remoteagent/utils.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage remoteagent\n\nimport (\n\t\"fmt\"\n\t\"slices\"\n\n\t\"github.com/a2aproject/a2a-go/a2a\"\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/agent\"\n\t\"google.golang.org/adk/server/adka2a\"\n\t\"google.golang.org/adk/session\"\n)\n\ntype userFunctionCall struct {\n\tresponse  *session.Event\n\ttaskID    a2a.TaskID\n\tcontextID string\n}\n\n// toUserFunctionCall returns a non-nil struct when the last event in the session has a FunctionResponse\n// with user-provided data. The struct contains both call and response events.\nfunc getUserFunctionCallAt(events session.Events, index int) *userFunctionCall {\n\tif index < 0 || index >= events.Len() {\n\t\treturn nil\n\t}\n\tcandidate := events.At(index)\n\tif candidate.Author != \"user\" {\n\t\treturn nil\n\t}\n\tfnCallID, ok := getFunctionResponseCallID(candidate)\n\tif !ok {\n\t\treturn nil\n\t}\n\tfor i := index - 1; i >= 0; i-- {\n\t\trequest := events.At(i)\n\t\tif !isFunctionCallEvent(request, fnCallID) {\n\t\t\tcontinue\n\t\t}\n\t\tresult := &userFunctionCall{response: candidate}\n\t\ttid, ctxID := adka2a.GetA2ATaskInfo(request)\n\t\tresult.taskID = tid\n\t\tresult.contextID = ctxID\n\t\treturn result\n\t}\n\treturn nil\n}\n\nfunc isFunctionCallEvent(event *session.Event, callID string) bool {\n\tif event == nil || event.Content == nil {\n\t\treturn false\n\t}\n\treturn slices.ContainsFunc(event.Content.Parts, func(part *genai.Part) bool {\n\t\treturn part.FunctionCall != nil && part.FunctionCall.ID == callID\n\t})\n}\n\n// getFunctionResponseCallID finds the first part with non-nil FunctionResponse and returns the call ID.\nfunc getFunctionResponseCallID(event *session.Event) (string, bool) {\n\tif event.Content == nil {\n\t\treturn \"\", false\n\t}\n\tresponsePartIndex := slices.IndexFunc(event.Content.Parts, func(part *genai.Part) bool {\n\t\treturn part.FunctionResponse != nil\n\t})\n\tif responsePartIndex < 0 {\n\t\treturn \"\", false\n\t}\n\treturn event.Content.Parts[responsePartIndex].FunctionResponse.ID, true\n}\n\n// toMissingRemoteSessionParts returns content parts for all events we think are not present in the remote session\n// and a2a contextID if it was found in a remote agent event metadata.\n// We iterate session events backward until all events are processed or an event authored by a remote agent is found.\n// Parts from all events we processed are returned as a single list.\n// The returned contextID might be an empty string. This means the current remote agent invocation is not associates with\n// any of the previous one. In this case a new contextID will be generated on the remote server.\nfunc toMissingRemoteSessionParts(ctx agent.InvocationContext, events session.Events, cfg A2AConfig) ([]a2a.Part, string) {\n\tpartCount, contextID := 0, \"\"\n\t// only events after this index are not in the remote session\n\tlastRemoteResponseIndex := -1\n\tfor i := events.Len() - 1; i >= 0; i-- {\n\t\tevent := events.At(i)\n\t\tif event.LLMResponse.Content != nil {\n\t\t\tpartCount += len(event.Content.Parts)\n\t\t}\n\t\tif event.Author == ctx.Agent().Name() {\n\t\t\tlastRemoteResponseIndex = i\n\t\t\t_, contextID = adka2a.GetA2ATaskInfo(event)\n\t\t\tbreak\n\t\t}\n\t}\n\n\tresult := make([]a2a.Part, 0, partCount)\n\tfor i := lastRemoteResponseIndex + 1; i < events.Len(); i++ {\n\t\tevent := events.At(i)\n\t\tif event.Author != \"user\" && event.Author != ctx.Agent().Name() {\n\t\t\tevent = presentAsUserMessage(ctx, event)\n\t\t}\n\t\tif event.Content == nil || len(event.Content.Parts) == 0 {\n\t\t\tcontinue\n\t\t}\n\t\tparts, err := convertParts(ctx, cfg, event)\n\t\tif err != nil {\n\t\t\t// TODO(yarolegovich): log error\n\t\t\tcontinue\n\t\t}\n\t\tresult = append(result, parts...)\n\t}\n\treturn result, contextID\n}\n\nfunc presentAsUserMessage(ctx agent.InvocationContext, agentEvent *session.Event) *session.Event {\n\tevent := session.NewEvent(ctx.InvocationID())\n\tevent.Author = \"user\"\n\n\tif agentEvent.Content == nil {\n\t\treturn event\n\t}\n\n\tparts := make([]*genai.Part, 0, len(agentEvent.Content.Parts)+1)\n\tparts = append(parts, &genai.Part{Text: \"For context:\"})\n\tfor _, part := range agentEvent.Content.Parts {\n\t\tif part.Thought {\n\t\t\tcontinue\n\t\t}\n\t\tif part.Text != \"\" {\n\t\t\ttext := fmt.Sprintf(\"[%s] said: %s\", agentEvent.Author, part.Text)\n\t\t\tparts = append(parts, genai.NewPartFromText(text))\n\t\t} else if part.FunctionCall != nil {\n\t\t\tcall := part.FunctionCall\n\t\t\ttext := fmt.Sprintf(\"[%s] called tool %s with parameters: %v\", agentEvent.Author, call.Name, call.Args)\n\t\t\tparts = append(parts, genai.NewPartFromText(text))\n\t\t} else if part.FunctionResponse != nil {\n\t\t\tresp := part.FunctionResponse\n\t\t\ttext := fmt.Sprintf(\"[%s] %s tool returned result: %v\", agentEvent.Author, resp.Name, resp.Response)\n\t\t\tparts = append(parts, genai.NewPartFromText(text))\n\t\t} else {\n\t\t\tparts = append(parts, part)\n\t\t}\n\t}\n\tif len(parts) > 1 { // not only \"For context:\" part\n\t\tevent.Content = genai.NewContentFromParts(parts, genai.RoleUser)\n\t}\n\treturn event\n}\n"
  },
  {
    "path": "agent/remoteagent/utils_test.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage remoteagent\n\nimport (\n\t\"fmt\"\n\t\"testing\"\n\n\t\"github.com/a2aproject/a2a-go/a2a\"\n\t\"github.com/google/go-cmp/cmp\"\n\t\"github.com/google/go-cmp/cmp/cmpopts\"\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/agent\"\n\ticontext \"google.golang.org/adk/internal/context\"\n\t\"google.golang.org/adk/model\"\n\t\"google.golang.org/adk/server/adka2a\"\n\t\"google.golang.org/adk/session\"\n)\n\nfunc newTestInvocationContext(t *testing.T, agentName string, events ...*session.Event) agent.InvocationContext {\n\tt.Helper()\n\tctx := t.Context()\n\tstore := session.InMemoryService()\n\tresp, err := store.Create(ctx, &session.CreateRequest{AppName: \"test\", UserID: \"test-user\"})\n\tif err != nil {\n\t\tt.Errorf(\"store.Create() error = %v\", err)\n\t\treturn nil\n\t}\n\tfor _, event := range events {\n\t\tif err := store.AppendEvent(ctx, resp.Session, event); err != nil {\n\t\t\tt.Errorf(\"store.AppendEvent() error = %v\", err)\n\t\t\treturn nil\n\t\t}\n\t}\n\tagent, err := agent.New(agent.Config{Name: agentName})\n\tif err != nil {\n\t\tt.Errorf(\"agent.New() error = %v\", err)\n\t\treturn nil\n\t}\n\treturn icontext.NewInvocationContext(ctx, icontext.InvocationContextParams{\n\t\tAgent:   agent,\n\t\tSession: resp.Session,\n\t})\n}\n\nfunc newEventFromParts(author string, parts ...*genai.Part) *session.Event {\n\tvar role genai.Role = genai.RoleModel\n\tif author == \"user\" {\n\t\trole = genai.RoleUser\n\t}\n\tevent := &session.Event{Author: author, Actions: session.EventActions{StateDelta: map[string]any{}, ArtifactDelta: map[string]int64{}}}\n\tif len(parts) > 0 {\n\t\tevent.Content = genai.NewContentFromParts(parts, role)\n\t}\n\treturn event\n}\n\nfunc TestGetUserFunctionCallAt(t *testing.T) {\n\ttestCases := []struct {\n\t\tname    string\n\t\tevents  []*session.Event\n\t\tatIndex int\n\t\tsuccess bool\n\t}{\n\t\t{\n\t\t\tname: \"success\",\n\t\t\tevents: []*session.Event{\n\t\t\t\tnewEventFromParts(genai.RoleModel, &genai.Part{FunctionCall: &genai.FunctionCall{ID: \"id-1\"}}),\n\t\t\t\tnewEventFromParts(genai.RoleUser, &genai.Part{FunctionResponse: &genai.FunctionResponse{ID: \"id-1\"}}),\n\t\t\t},\n\t\t\tatIndex: 1,\n\t\t\tsuccess: true,\n\t\t},\n\t\t{\n\t\t\tname: \"success with event in-between\",\n\t\t\tevents: []*session.Event{\n\t\t\t\tnewEventFromParts(genai.RoleModel, &genai.Part{FunctionCall: &genai.FunctionCall{ID: \"id-1\"}}),\n\t\t\t\tnewEventFromParts(genai.RoleModel, &genai.Part{Text: \"another event\"}),\n\t\t\t\tnewEventFromParts(genai.RoleUser, &genai.Part{FunctionResponse: &genai.FunctionResponse{ID: \"id-1\"}}),\n\t\t\t},\n\t\t\tatIndex: 2,\n\t\t\tsuccess: true,\n\t\t},\n\t\t{\n\t\t\tname: \"success with multiple parts in-between\",\n\t\t\tevents: []*session.Event{\n\t\t\t\tnewEventFromParts(genai.RoleModel,\n\t\t\t\t\t&genai.Part{Text: \"calling\"},\n\t\t\t\t\t&genai.Part{FunctionCall: &genai.FunctionCall{ID: \"id-1\"}},\n\t\t\t\t\t&genai.Part{Text: \"called\"},\n\t\t\t\t),\n\t\t\t\tnewEventFromParts(genai.RoleUser,\n\t\t\t\t\t&genai.Part{Text: \"responding\"},\n\t\t\t\t\t&genai.Part{FunctionResponse: &genai.FunctionResponse{ID: \"id-1\"}},\n\t\t\t\t\t&genai.Part{Text: \"responded\"},\n\t\t\t\t),\n\t\t\t},\n\t\t\tatIndex: 1,\n\t\t\tsuccess: true,\n\t\t},\n\t\t{\n\t\t\tname: \"failf if not response index\",\n\t\t\tevents: []*session.Event{\n\t\t\t\tnewEventFromParts(genai.RoleModel, &genai.Part{FunctionCall: &genai.FunctionCall{ID: \"id-1\"}}),\n\t\t\t\tnewEventFromParts(genai.RoleModel, &genai.Part{Text: \"another event\"}),\n\t\t\t\tnewEventFromParts(genai.RoleUser, &genai.Part{FunctionResponse: &genai.FunctionResponse{ID: \"id-1\"}}),\n\t\t\t},\n\t\t\tatIndex: 1,\n\t\t\tsuccess: false,\n\t\t},\n\t\t{\n\t\t\tname: \"fail if not user author\",\n\t\t\tevents: []*session.Event{\n\t\t\t\tnewEventFromParts(genai.RoleModel, &genai.Part{FunctionCall: &genai.FunctionCall{ID: \"id-1\"}}),\n\t\t\t\tnewEventFromParts(genai.RoleModel, &genai.Part{FunctionResponse: &genai.FunctionResponse{ID: \"id-1\"}}),\n\t\t\t},\n\t\t\tsuccess: false,\n\t\t},\n\t\t{\n\t\t\tname: \"fail if no matching function call\",\n\t\t\tevents: []*session.Event{\n\t\t\t\tnewEventFromParts(genai.RoleModel, &genai.Part{FunctionCall: &genai.FunctionCall{ID: \"id-2\"}}),\n\t\t\t\tnewEventFromParts(genai.RoleUser, &genai.Part{FunctionResponse: &genai.FunctionResponse{ID: \"id-1\"}}),\n\t\t\t},\n\t\t\tsuccess: false,\n\t\t},\n\t}\n\tfor _, tc := range testCases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\tictx := newTestInvocationContext(t, \"test-agent\", tc.events...)\n\t\t\tgot := getUserFunctionCallAt(ictx.Session().Events(), tc.atIndex)\n\t\t\tif !tc.success && got != nil {\n\t\t\t\tt.Errorf(\"getUserFunctionCallAt() = %v, want nil\", got)\n\t\t\t}\n\t\t\tif tc.success && got == nil {\n\t\t\t\tt.Error(\"getUserFunctionCallAt() = nil, want non-nil\")\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestToMissingRemoteSessionParts(t *testing.T) {\n\tremoteName := \"remote-agent\"\n\ttestCases := []struct {\n\t\tname          string\n\t\tevents        []*session.Event\n\t\twantParts     []a2a.Part\n\t\twantContextID string\n\t}{\n\t\t{\n\t\t\tname: \"all message parts collected\",\n\t\t\tevents: []*session.Event{\n\t\t\t\tnewEventFromParts(\"user\", &genai.Part{Text: \"hello\"}),\n\t\t\t\tnewEventFromParts(\"user\", &genai.Part{Text: \"foo\"}, &genai.Part{Text: \"bar\"}),\n\t\t\t},\n\t\t\twantParts: []a2a.Part{\n\t\t\t\ta2a.TextPart{Text: \"hello\"},\n\t\t\t\ta2a.TextPart{Text: \"foo\"},\n\t\t\t\ta2a.TextPart{Text: \"bar\"},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"other agent messages are rephrased\",\n\t\t\tevents: []*session.Event{\n\t\t\t\tnewEventFromParts(\"another-agent\", &genai.Part{Text: \"foo\"}),\n\t\t\t\tnewEventFromParts(\"user\", &genai.Part{Text: \"bar\"}),\n\t\t\t},\n\t\t\twantParts: []a2a.Part{\n\t\t\t\ta2a.TextPart{Text: \"For context:\"},\n\t\t\t\ta2a.TextPart{Text: \"[another-agent] said: foo\"},\n\t\t\t\ta2a.TextPart{Text: \"bar\"},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"other agent thoughts are skipped\",\n\t\t\tevents: []*session.Event{\n\t\t\t\tnewEventFromParts(\"another-agent\", &genai.Part{Text: \"foo\", Thought: true}),\n\t\t\t\tnewEventFromParts(\"user\", &genai.Part{Text: \"bar\"}),\n\t\t\t},\n\t\t\twantParts: []a2a.Part{\n\t\t\t\ta2a.TextPart{Text: \"bar\"},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"events before the last remote response excluded\",\n\t\t\tevents: []*session.Event{\n\t\t\t\tnewEventFromParts(\"user\", &genai.Part{Text: \"hello\"}),\n\t\t\t\tnewEventFromParts(remoteName, &genai.Part{Text: \"hi\"}),\n\t\t\t\tnewEventFromParts(\"user\", &genai.Part{Text: \"foo\"}),\n\t\t\t\tnewEventFromParts(\"user\", &genai.Part{Text: \"bar\"}),\n\t\t\t},\n\t\t\twantParts: []a2a.Part{\n\t\t\t\ta2a.TextPart{Text: \"foo\"},\n\t\t\t\ta2a.TextPart{Text: \"bar\"},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"contextID of the last remote agent response returned\",\n\t\t\tevents: []*session.Event{\n\t\t\t\t{\n\t\t\t\t\tAuthor: remoteName,\n\t\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\t\tContent:        genai.NewContentFromParts([]*genai.Part{{Text: \"hi\"}}, genai.RoleModel),\n\t\t\t\t\t\tCustomMetadata: adka2a.ToCustomMetadata(a2a.NewTaskID(), \"ctxID-123\"),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twantParts:     []a2a.Part{},\n\t\t\twantContextID: \"ctxID-123\",\n\t\t},\n\t}\n\tfor _, tc := range testCases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\tictx := newTestInvocationContext(t, remoteName, tc.events...)\n\t\t\tgotParts, gotContextID := toMissingRemoteSessionParts(ictx, ictx.Session().Events(), A2AConfig{})\n\t\t\tif tc.wantContextID != gotContextID {\n\t\t\t\tt.Errorf(\"toMissingRemoteSessionParts() contextID = %s, want %s\", gotContextID, tc.wantContextID)\n\t\t\t}\n\t\t\tif diff := cmp.Diff(tc.wantParts, gotParts); diff != \"\" {\n\t\t\t\tt.Errorf(\"toMissingRemoteSessionParts() wrong result (+got,-want):\\ngot = %v\\nwant = %v\\ndiff = %v\", gotParts, tc.wantParts, diff)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestPresentAsUserMessage(t *testing.T) {\n\ttestCases := []struct {\n\t\tname  string\n\t\tinput *session.Event\n\t\twant  *session.Event\n\t}{\n\t\t{\n\t\t\tname:  \"text presented\",\n\t\t\tinput: newEventFromParts(\"some agent\", genai.NewPartFromText(\"hello\")),\n\t\t\twant: newEventFromParts(\n\t\t\t\t\"user\",\n\t\t\t\tgenai.NewPartFromText(\"For context:\"),\n\t\t\t\tgenai.NewPartFromText(\"[some agent] said: hello\"),\n\t\t\t),\n\t\t},\n\t\t{\n\t\t\tname:  \"function call presented\",\n\t\t\tinput: newEventFromParts(\"some agent\", genai.NewPartFromFunctionCall(\"get_weather\", map[string]any{\"city\": \"Warsaw\"})),\n\t\t\twant: newEventFromParts(\n\t\t\t\t\"user\",\n\t\t\t\tgenai.NewPartFromText(\"For context:\"),\n\t\t\t\tgenai.NewPartFromText(fmt.Sprintf(\"[some agent] called tool get_weather with parameters: %v\", map[string]any{\"city\": \"Warsaw\"})),\n\t\t\t),\n\t\t},\n\t\t{\n\t\t\tname:  \"function call result presented\",\n\t\t\tinput: newEventFromParts(\"some agent\", genai.NewPartFromFunctionResponse(\"get_weather\", map[string]any{\"temp\": \"1C\"})),\n\t\t\twant: newEventFromParts(\n\t\t\t\t\"user\",\n\t\t\t\tgenai.NewPartFromText(\"For context:\"),\n\t\t\t\tgenai.NewPartFromText(fmt.Sprintf(\"[some agent] get_weather tool returned result: %v\", map[string]any{\"temp\": \"1C\"})),\n\t\t\t),\n\t\t},\n\t\t{\n\t\t\tname: \"other part types unmodified\",\n\t\t\tinput: newEventFromParts(\n\t\t\t\t\"some agent\",\n\t\t\t\tgenai.NewPartFromFile(genai.File{Name: \"cat.png\"}),\n\t\t\t\tgenai.NewPartFromExecutableCode(\"print('hello, world!')\", genai.LanguagePython),\n\t\t\t\tgenai.NewPartFromCodeExecutionResult(genai.OutcomeOK, \"hello, world!\"),\n\t\t\t),\n\t\t\twant: newEventFromParts(\n\t\t\t\t\"user\",\n\t\t\t\tgenai.NewPartFromText(\"For context:\"),\n\t\t\t\tgenai.NewPartFromFile(genai.File{Name: \"cat.png\"}),\n\t\t\t\tgenai.NewPartFromExecutableCode(\"print('hello, world!')\", genai.LanguagePython),\n\t\t\t\tgenai.NewPartFromCodeExecutionResult(genai.OutcomeOK, \"hello, world!\"),\n\t\t\t),\n\t\t},\n\t\t{\n\t\t\tname:  \"thought skipped\",\n\t\t\tinput: newEventFromParts(\"some agent\", &genai.Part{Text: \"hello\", Thought: true}),\n\t\t\twant:  newEventFromParts(\"user\"),\n\t\t},\n\t\t{\n\t\t\tname:  \"thought with other parts\",\n\t\t\tinput: newEventFromParts(\"some agent\", &genai.Part{Text: \"thinking...\", Thought: true}, genai.NewPartFromText(\"done\")),\n\t\t\twant: newEventFromParts(\n\t\t\t\t\"user\",\n\t\t\t\tgenai.NewPartFromText(\"For context:\"),\n\t\t\t\tgenai.NewPartFromText(\"[some agent] said: done\"),\n\t\t\t),\n\t\t},\n\t}\n\tignoreFields := []cmp.Option{\n\t\tcmpopts.IgnoreFields(session.Event{}, \"ID\"),\n\t\tcmpopts.IgnoreFields(session.Event{}, \"InvocationID\"),\n\t\tcmpopts.IgnoreFields(session.Event{}, \"Timestamp\"),\n\t}\n\tfor _, tc := range testCases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\tictx := newTestInvocationContext(t, \"test\")\n\t\t\tgot := presentAsUserMessage(ictx, tc.input)\n\t\t\tif diff := cmp.Diff(tc.want, got, ignoreFields...); diff != \"\" {\n\t\t\t\tt.Errorf(\"presentAsUserMessage() wrong result (+got,-want):\\ngot = %+v\\nwant = %+v\\ndiff = %v\", got, tc.want, diff)\n\t\t\t}\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "agent/run_config.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage agent\n\n// StreamingMode defines the streaming mode for agent execution.\ntype StreamingMode string\n\nconst (\n\t// StreamingModeNone indicates no streaming.\n\tStreamingModeNone StreamingMode = \"none\"\n\t// StreamingModeSSE enables server-sent events streaming, one-way, where\n\t// LLM response parts are streamed immediately as they are generated.\n\tStreamingModeSSE StreamingMode = \"sse\"\n)\n\n// RunConfig controls runtime behavior of an agent.\ntype RunConfig struct {\n\t// StreamingMode defines the streaming mode for an agent.\n\tStreamingMode StreamingMode\n\t// If true, ADK runner will save each part of the user input that is a blob\n\t// (e.g., images, files) as an artifact.\n\tSaveInputBlobsAsArtifacts bool\n}\n"
  },
  {
    "path": "agent/workflowagents/loopagent/agent.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Package loopagent provides an agent that repeatedly runs its sub-agents for a\n// specified number of iterations or until termination condition is met.\npackage loopagent\n\nimport (\n\t\"fmt\"\n\t\"iter\"\n\n\t\"google.golang.org/adk/agent\"\n\tagentinternal \"google.golang.org/adk/internal/agent\"\n\t\"google.golang.org/adk/session\"\n)\n\n// Config defines the configuration for a LoopAgent.\ntype Config struct {\n\t// Basic agent setup.\n\tAgentConfig agent.Config\n\n\t// If MaxIterations == 0, then LoopAgent runs indefinitely or until any\n\t// sub-agent escalates.\n\tMaxIterations uint\n}\n\n// New creates a LoopAgent.\n//\n// LoopAgent repeatedly runs its sub-agents in sequence for a specified number\n// of iterations or until a termination condition is met.\n//\n// Use the LoopAgent when your workflow involves repetition or iterative\n// refinement, such as like revising code.\nfunc New(cfg Config) (agent.Agent, error) {\n\tif cfg.AgentConfig.Run != nil {\n\t\treturn nil, fmt.Errorf(\"LoopAgent doesn't allow custom Run implementations\")\n\t}\n\n\tloopAgentImpl := &loopAgent{\n\t\tmaxIterations: cfg.MaxIterations,\n\t}\n\tcfg.AgentConfig.Run = loopAgentImpl.Run\n\n\tloopAgent, err := agent.New(cfg.AgentConfig)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to create base agent: %w\", err)\n\t}\n\n\tinternalAgent, ok := loopAgent.(agentinternal.Agent)\n\tif !ok {\n\t\treturn nil, fmt.Errorf(\"internal error: failed to convert to internal agent\")\n\t}\n\tstate := agentinternal.Reveal(internalAgent)\n\tstate.AgentType = agentinternal.TypeLoopAgent\n\tstate.Config = cfg\n\n\treturn loopAgent, nil\n}\n\ntype loopAgent struct {\n\tmaxIterations uint\n}\n\nfunc (a *loopAgent) Run(ctx agent.InvocationContext) iter.Seq2[*session.Event, error] {\n\tcount := a.maxIterations\n\n\treturn func(yield func(*session.Event, error) bool) {\n\t\tfor {\n\t\t\tshouldExit := false\n\t\t\tfor _, subAgent := range ctx.Agent().SubAgents() {\n\t\t\t\tfor event, err := range subAgent.Run(ctx) {\n\t\t\t\t\t// TODO: ensure consistency -- if there's an error, return and close iterator, verify everywhere in ADK.\n\t\t\t\t\tif !yield(event, err) {\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\n\t\t\t\t\tif event != nil && event.Actions.Escalate {\n\t\t\t\t\t\tshouldExit = true\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif shouldExit {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif count > 0 {\n\t\t\t\tcount--\n\t\t\t\tif count == 0 {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "agent/workflowagents/loopagent/agent_test.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage loopagent_test\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"iter\"\n\t\"testing\"\n\n\t\"github.com/google/go-cmp/cmp\"\n\t\"github.com/google/go-cmp/cmp/cmpopts\"\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/agent\"\n\t\"google.golang.org/adk/agent/llmagent\"\n\t\"google.golang.org/adk/agent/workflowagents/loopagent\"\n\t\"google.golang.org/adk/model\"\n\t\"google.golang.org/adk/runner\"\n\t\"google.golang.org/adk/session\"\n\t\"google.golang.org/adk/tool\"\n\t\"google.golang.org/adk/tool/functiontool\"\n)\n\nfunc TestNewLoopAgent(t *testing.T) {\n\ttype args struct {\n\t\tmaxIterations uint\n\t\tsubAgents     []agent.Agent\n\t}\n\n\ttests := []struct {\n\t\tname       string\n\t\targs       args\n\t\twantEvents []*session.Event\n\t\twantErr    bool\n\t}{\n\t\t{\n\t\t\tname: \"infinite loop\",\n\t\t\targs: args{\n\t\t\t\tmaxIterations: 0,\n\t\t\t\tsubAgents:     []agent.Agent{newCustomAgent(t, 0)},\n\t\t\t},\n\t\t\twantEvents: []*session.Event{\n\t\t\t\t{\n\t\t\t\t\tAuthor: \"custom_agent_0\",\n\t\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\t\tContent: &genai.Content{\n\t\t\t\t\t\t\tParts: []*genai.Part{\n\t\t\t\t\t\t\t\tgenai.NewPartFromText(\"hello 0\"),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tRole: genai.RoleModel,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tActions: session.EventActions{},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"loop agent with max iterations\",\n\t\t\targs: args{\n\t\t\t\tmaxIterations: 1,\n\t\t\t\tsubAgents:     []agent.Agent{newCustomAgent(t, 0)},\n\t\t\t},\n\t\t\twantEvents: []*session.Event{\n\t\t\t\t{\n\t\t\t\t\tAuthor: \"custom_agent_0\",\n\t\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\t\tContent: &genai.Content{\n\t\t\t\t\t\t\tParts: []*genai.Part{\n\t\t\t\t\t\t\t\tgenai.NewPartFromText(\"hello 0\"),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tRole: genai.RoleModel,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tActions: session.EventActions{},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"loop agent with max iterations and 2 sub agents\",\n\t\t\targs: args{\n\t\t\t\tmaxIterations: 1,\n\t\t\t\tsubAgents:     []agent.Agent{newCustomAgent(t, 0), newCustomAgent(t, 1)},\n\t\t\t},\n\t\t\twantEvents: []*session.Event{\n\t\t\t\t{\n\t\t\t\t\tAuthor: \"custom_agent_0\",\n\t\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\t\tContent: &genai.Content{\n\t\t\t\t\t\t\tParts: []*genai.Part{\n\t\t\t\t\t\t\t\tgenai.NewPartFromText(\"hello 0\"),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tRole: genai.RoleModel,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tActions: session.EventActions{},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tAuthor: \"custom_agent_1\",\n\t\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\t\tContent: &genai.Content{\n\t\t\t\t\t\t\tParts: []*genai.Part{\n\t\t\t\t\t\t\t\tgenai.NewPartFromText(\"hello 1\"),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tRole: genai.RoleModel,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tActions: session.EventActions{},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"loop with escalate function returns sumarization\",\n\t\t\targs: args{\n\t\t\t\tmaxIterations: 2,\n\t\t\t\tsubAgents:     []agent.Agent{newLmmAgentWithFunctionCall(t, 0, false), newCustomAgent(t, 1)},\n\t\t\t},\n\t\t\twantEvents: []*session.Event{\n\t\t\t\t{\n\t\t\t\t\tAuthor: \"custom_agent_0\",\n\t\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\t\tContent: genai.NewContentFromFunctionCall(\"exampleFunction\", make(map[string]any), genai.RoleModel),\n\t\t\t\t\t},\n\t\t\t\t\tActions: session.EventActions{\n\t\t\t\t\t\tStateDelta:    map[string]any{},\n\t\t\t\t\t\tArtifactDelta: map[string]int64{},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tAuthor: \"custom_agent_0\",\n\t\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\t\tContent: genai.NewContentFromFunctionResponse(\"exampleFunction\", make(map[string]any), genai.RoleUser),\n\t\t\t\t\t},\n\t\t\t\t\tActions: session.EventActions{\n\t\t\t\t\t\tEscalate:      true,\n\t\t\t\t\t\tStateDelta:    map[string]any{},\n\t\t\t\t\t\tArtifactDelta: map[string]int64{},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tAuthor: \"custom_agent_0\",\n\t\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\t\tContent: &genai.Content{\n\t\t\t\t\t\t\tParts: []*genai.Part{\n\t\t\t\t\t\t\t\tgenai.NewPartFromText(\"hello 0\"),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tRole: genai.RoleModel,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tActions: session.EventActions{\n\t\t\t\t\t\tStateDelta:    map[string]any{},\n\t\t\t\t\t\tArtifactDelta: map[string]int64{},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"loop with escalate function returns sumarization\",\n\t\t\targs: args{\n\t\t\t\tmaxIterations: 2,\n\t\t\t\tsubAgents:     []agent.Agent{newLmmAgentWithFunctionCall(t, 0, true), newCustomAgent(t, 1)},\n\t\t\t},\n\t\t\twantEvents: []*session.Event{\n\t\t\t\t{\n\t\t\t\t\tAuthor: \"custom_agent_0\",\n\t\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\t\tContent: genai.NewContentFromFunctionCall(\"exampleFunction\", make(map[string]any), genai.RoleModel),\n\t\t\t\t\t},\n\t\t\t\t\tActions: session.EventActions{\n\t\t\t\t\t\tStateDelta:    map[string]any{},\n\t\t\t\t\t\tArtifactDelta: map[string]int64{},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tAuthor: \"custom_agent_0\",\n\t\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\t\tContent: genai.NewContentFromFunctionResponse(\"exampleFunction\", make(map[string]any), genai.RoleUser),\n\t\t\t\t\t},\n\t\t\t\t\tActions: session.EventActions{\n\t\t\t\t\t\tEscalate:          true,\n\t\t\t\t\t\tSkipSummarization: true,\n\t\t\t\t\t\tStateDelta:        map[string]any{},\n\t\t\t\t\t\tArtifactDelta:     map[string]int64{},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tctx := t.Context()\n\n\t\t\tloopAgent, err := loopagent.New(loopagent.Config{\n\t\t\t\tMaxIterations: tt.args.maxIterations,\n\t\t\t\tAgentConfig: agent.Config{\n\t\t\t\t\tName:      \"test_agent\",\n\t\t\t\t\tSubAgents: tt.args.subAgents,\n\t\t\t\t},\n\t\t\t})\n\t\t\tif (err != nil) != tt.wantErr {\n\t\t\t\tt.Errorf(\"NewLoopAgent() error = %v, wantErr %v\", err, tt.wantErr)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tvar gotEvents []*session.Event\n\n\t\t\tsessionService := session.InMemoryService()\n\n\t\t\tagentRunner, err := runner.New(runner.Config{\n\t\t\t\tAppName:        \"test_app\",\n\t\t\t\tAgent:          loopAgent,\n\t\t\t\tSessionService: sessionService,\n\t\t\t})\n\t\t\tif err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\n\t\t\t_, err = sessionService.Create(ctx, &session.CreateRequest{\n\t\t\t\tAppName:   \"test_app\",\n\t\t\t\tUserID:    \"user_id\",\n\t\t\t\tSessionID: \"session_id\",\n\t\t\t})\n\t\t\tif err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\n\t\t\tfor event, err := range agentRunner.Run(ctx, \"user_id\", \"session_id\", genai.NewContentFromText(\"user input\", genai.RoleUser), agent.RunConfig{}) {\n\t\t\t\tif err != nil {\n\t\t\t\t\tt.Errorf(\"got unexpected error: %v\", err)\n\t\t\t\t}\n\n\t\t\t\tif tt.args.maxIterations == 0 && len(gotEvents) == len(tt.wantEvents) {\n\t\t\t\t\tbreak\n\t\t\t\t}\n\n\t\t\t\tgotEvents = append(gotEvents, event)\n\t\t\t}\n\n\t\t\tif len(tt.wantEvents) != len(gotEvents) {\n\t\t\t\tt.Fatalf(\"Unexpected event length, got: %v, want: %v\", len(gotEvents), len(tt.wantEvents))\n\t\t\t}\n\n\t\t\tignoreFields := []cmp.Option{\n\t\t\t\tcmpopts.IgnoreFields(session.Event{}, \"ID\", \"InvocationID\", \"Timestamp\"),\n\t\t\t\tcmpopts.IgnoreFields(genai.FunctionCall{}, \"ID\"),\n\t\t\t\tcmpopts.IgnoreFields(genai.FunctionResponse{}, \"ID\"),\n\t\t\t}\n\n\t\t\tfor i, gotEvent := range gotEvents {\n\t\t\t\ttt.wantEvents[i].Timestamp = gotEvent.Timestamp\n\t\t\t\tif diff := cmp.Diff(tt.wantEvents[i], gotEvent, ignoreFields...); diff != \"\" {\n\t\t\t\t\tt.Errorf(\"event[%v] mismatch (-want +got):\\n%s\", i, diff)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc newCustomAgent(t *testing.T, id int) agent.Agent {\n\tt.Helper()\n\n\tcustomAgent := &customAgent{\n\t\tid: id,\n\t}\n\n\ta, err := agent.New(agent.Config{\n\t\tName: fmt.Sprintf(\"custom_agent_%v\", id),\n\t\tRun:  customAgent.Run,\n\t})\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\treturn a\n}\n\n// TODO: create test util allowing to create custom agents, agent trees for\ntype customAgent struct {\n\tid          int\n\tcallCounter int\n}\n\nfunc (a *customAgent) Run(agent.InvocationContext) iter.Seq2[*session.Event, error] {\n\treturn func(yield func(*session.Event, error) bool) {\n\t\ta.callCounter++\n\n\t\tyield(&session.Event{\n\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\tContent: genai.NewContentFromText(fmt.Sprintf(\"hello %v\", a.id), genai.RoleModel),\n\t\t\t},\n\t\t}, nil)\n\t}\n}\n\ntype EmptyArgs struct{}\n\nfunc exampleFunctionThatEscalates(ctx tool.Context, myArgs EmptyArgs) (map[string]string, error) {\n\tctx.Actions().Escalate = true\n\tctx.Actions().SkipSummarization = false\n\treturn map[string]string{}, nil\n}\n\nfunc exampleFunctionThatEscalatesAndSkips(ctx tool.Context, myArgs EmptyArgs) (map[string]string, error) {\n\tctx.Actions().Escalate = true\n\tctx.Actions().SkipSummarization = true\n\treturn map[string]string{}, nil\n}\n\nfunc newLmmAgentWithFunctionCall(t *testing.T, id int, skipSummarization bool) agent.Agent {\n\tt.Helper()\n\n\texampleFunction := exampleFunctionThatEscalates\n\tif skipSummarization {\n\t\texampleFunction = exampleFunctionThatEscalatesAndSkips\n\t}\n\n\texampleFunctionThatEscalatesTool, err := functiontool.New(functiontool.Config{\n\t\tName:        \"exampleFunction\",\n\t\tDescription: \"Call this function to escalate\\n\",\n\t}, exampleFunction)\n\tif err != nil {\n\t\tt.Fatalf(\"error creating exampleFunction tool: %s\", err)\n\t}\n\n\tcustomAgent, err := llmagent.New(llmagent.Config{\n\t\tName:  fmt.Sprintf(\"custom_agent_%v\", id),\n\t\tModel: &FakeLLM{id: id, callCounter: 0, skipSummarization: skipSummarization},\n\t\tTools: []tool.Tool{exampleFunctionThatEscalatesTool},\n\t})\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\treturn customAgent\n}\n\n// FakeLLM is a mock implementation of model.LLM for testing.\ntype FakeLLM struct {\n\tid                int\n\tcallCounter       int\n\tskipSummarization bool\n}\n\nfunc (f *FakeLLM) Name() string {\n\treturn \"fake-llm\"\n}\n\nfunc (f *FakeLLM) GenerateContent(ctx context.Context, req *model.LLMRequest, stream bool) iter.Seq2[*model.LLMResponse, error] {\n\treturn func(yield func(*model.LLMResponse, error) bool) {\n\t\tf.callCounter++\n\n\t\tif len(req.Contents) == 1 {\n\t\t\tif !yield(&model.LLMResponse{\n\t\t\t\tContent: genai.NewContentFromFunctionCall(\"exampleFunction\", make(map[string]any), genai.RoleModel),\n\t\t\t}, nil) {\n\t\t\t\treturn\n\t\t\t}\n\t\t} else {\n\t\t\tif !yield(&model.LLMResponse{\n\t\t\t\tContent: genai.NewContentFromText(fmt.Sprintf(\"hello %v\", f.id), genai.RoleModel),\n\t\t\t}, nil) {\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "agent/workflowagents/parallelagent/agent.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Package parallelagent provides an agent that runs its sub-agents in parallel.\npackage parallelagent\n\nimport (\n\t\"fmt\"\n\t\"iter\"\n\n\t\"golang.org/x/sync/errgroup\"\n\n\t\"google.golang.org/adk/agent\"\n\tagentinternal \"google.golang.org/adk/internal/agent\"\n\ticontext \"google.golang.org/adk/internal/context\"\n\t\"google.golang.org/adk/session\"\n)\n\n// Config defines the configuration for a ParallelAgent.\ntype Config struct {\n\t// Basic agent setup.\n\tAgentConfig agent.Config\n}\n\n// New creates a ParallelAgent.\n//\n// Parallel agent runs its sub-agents in parallel in isolated manner.\n//\n// This approach is beneficial for scenarios requiring multiple perspectives or\n// attempts on a single task, such as:\n// - Running different algorithms simultaneously.\n// - Generating multiple responses for review by a subsequent evaluation agent.\nfunc New(cfg Config) (agent.Agent, error) {\n\tif cfg.AgentConfig.Run != nil {\n\t\treturn nil, fmt.Errorf(\"ParallelAgent doesn't allow custom Run implementations\")\n\t}\n\n\tcfg.AgentConfig.Run = run\n\n\tparallelAgent, err := agent.New(cfg.AgentConfig)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinternalAgent, ok := parallelAgent.(agentinternal.Agent)\n\tif !ok {\n\t\treturn nil, fmt.Errorf(\"internal error: failed to convert to internal agent\")\n\t}\n\tstate := agentinternal.Reveal(internalAgent)\n\tstate.AgentType = agentinternal.TypeParallelAgent\n\tstate.Config = cfg\n\n\treturn parallelAgent, nil\n}\n\nfunc run(ctx agent.InvocationContext) iter.Seq2[*session.Event, error] {\n\tcurAgent := ctx.Agent()\n\n\tvar (\n\t\terrGroup, errGroupCtx = errgroup.WithContext(ctx)\n\t\tdoneChan              = make(chan bool)\n\t\tresultsChan           = make(chan result)\n\t)\n\n\tfor _, sa := range ctx.Agent().SubAgents() {\n\t\tbranch := fmt.Sprintf(\"%s.%s\", curAgent.Name(), sa.Name())\n\t\tif ctx.Branch() != \"\" {\n\t\t\tbranch = fmt.Sprintf(\"%s.%s\", ctx.Branch(), branch)\n\t\t}\n\t\tsubAgent := sa\n\t\terrGroup.Go(func() error {\n\t\t\tsubCtx := icontext.NewInvocationContext(errGroupCtx, icontext.InvocationContextParams{\n\t\t\t\tArtifacts:    ctx.Artifacts(),\n\t\t\t\tMemory:       ctx.Memory(),\n\t\t\t\tSession:      ctx.Session(),\n\t\t\t\tBranch:       branch,\n\t\t\t\tAgent:        subAgent,\n\t\t\t\tUserContent:  ctx.UserContent(),\n\t\t\t\tRunConfig:    ctx.RunConfig(),\n\t\t\t\tInvocationID: ctx.InvocationID(),\n\t\t\t})\n\n\t\t\tif err := runSubAgent(subCtx, subAgent, resultsChan, doneChan); err != nil {\n\t\t\t\treturn fmt.Errorf(\"failed to run sub-agent %q: %w\", subAgent.Name(), err)\n\t\t\t}\n\n\t\t\treturn nil\n\t\t})\n\t}\n\n\tgo func() {\n\t\tif err := errGroup.Wait(); err != nil {\n\t\t\tselect {\n\t\t\tcase resultsChan <- result{err: err}:\n\t\t\tcase <-doneChan:\n\t\t\t}\n\t\t}\n\t\tclose(resultsChan)\n\t}()\n\n\treturn func(yield func(*session.Event, error) bool) {\n\t\tdefer close(doneChan)\n\n\t\tfor res := range resultsChan {\n\t\t\tshouldContinue := yield(res.event, res.err)\n\n\t\t\t// Signal sub-agent that event processing (including session append) is complete\n\t\t\tif res.ackChan != nil {\n\t\t\t\tclose(res.ackChan)\n\t\t\t}\n\n\t\t\tif !shouldContinue {\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc runSubAgent(ctx agent.InvocationContext, agent agent.Agent, results chan<- result, done <-chan bool) error {\n\tfor event, err := range agent.Run(ctx) {\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tackChan := make(chan struct{})\n\n\t\tselect {\n\t\tcase <-done:\n\t\t\treturn nil\n\t\tcase <-ctx.Done():\n\t\t\treturn ctx.Err()\n\t\tcase results <- result{\n\t\t\tevent:   event,\n\t\t\tackChan: ackChan,\n\t\t}:\n\t\t\t// Wait for runner to finish processing before continuing to next iteration\n\t\t\tselect {\n\t\t\tcase <-ackChan:\n\t\t\tcase <-done:\n\t\t\t\treturn nil\n\t\t\tcase <-ctx.Done():\n\t\t\t\treturn ctx.Err()\n\t\t\t}\n\t\t}\n\t}\n\treturn nil\n}\n\ntype result struct {\n\tevent   *session.Event\n\terr     error\n\tackChan chan struct{}\n}\n"
  },
  {
    "path": "agent/workflowagents/parallelagent/agent_test.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage parallelagent_test\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"iter\"\n\trand \"math/rand/v2\"\n\t\"net/http\"\n\t\"path/filepath\"\n\t\"slices\"\n\t\"strings\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/google/go-cmp/cmp\"\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/agent\"\n\t\"google.golang.org/adk/agent/llmagent\"\n\t\"google.golang.org/adk/agent/workflowagents/loopagent\"\n\t\"google.golang.org/adk/agent/workflowagents/parallelagent\"\n\t\"google.golang.org/adk/internal/httprr\"\n\t\"google.golang.org/adk/internal/testutil\"\n\t\"google.golang.org/adk/model\"\n\t\"google.golang.org/adk/model/gemini\"\n\t\"google.golang.org/adk/runner\"\n\t\"google.golang.org/adk/session\"\n\t\"google.golang.org/adk/tool\"\n\t\"google.golang.org/adk/tool/functiontool\"\n)\n\nconst modelName = \"gemini-2.5-flash\"\n\nfunc TestNewParallelAgent(t *testing.T) {\n\ttests := []struct {\n\t\tname          string\n\t\tmaxIterations uint\n\t\tnumSubAgents  int\n\t\tagentError    error // one of the subAgents will return this error\n\t\tcancelContext bool\n\t\twantEvents    []*session.Event\n\t\twantErr       bool\n\t}{\n\t\t{\n\t\t\tname:          \"subagents complete run\",\n\t\t\tmaxIterations: 2,\n\t\t\tnumSubAgents:  3,\n\t\t\twantEvents: func() []*session.Event {\n\t\t\t\tvar res []*session.Event\n\t\t\t\tfor agentID := 1; agentID <= 3; agentID++ {\n\t\t\t\t\tfor responseCount := 1; responseCount <= 2; responseCount++ {\n\t\t\t\t\t\tres = append(res, &session.Event{\n\t\t\t\t\t\t\tAuthor: fmt.Sprintf(\"sub%d\", agentID),\n\t\t\t\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\t\t\t\tContent: &genai.Content{\n\t\t\t\t\t\t\t\t\tParts: []*genai.Part{\n\t\t\t\t\t\t\t\t\t\tgenai.NewPartFromText(fmt.Sprintf(\"hello %d\", agentID)),\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\tRole: genai.RoleModel,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn res\n\t\t\t}(),\n\t\t},\n\t\t{\n\t\t\tname:          \"handle ctx cancel\", // terminates infinite agent loop\n\t\t\tmaxIterations: 0,\n\t\t\tcancelContext: true,\n\t\t\twantErr:       true,\n\t\t},\n\t\t{\n\t\t\t// one agent returns error, other agents run infinitely\n\t\t\tname:          \"agent returns error\",\n\t\t\tmaxIterations: 0,\n\t\t\tnumSubAgents:  100,\n\t\t\tagentError:    fmt.Errorf(\"agent error\"),\n\t\t\twantErr:       true,\n\t\t},\n\t}\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tt.Parallel()\n\n\t\t\tctx := t.Context()\n\n\t\t\tparallelAgent := newParallelAgent(t, tt.maxIterations, tt.numSubAgents, tt.agentError)\n\n\t\t\tvar gotEvents []*session.Event\n\n\t\t\tsessionService := session.InMemoryService()\n\n\t\t\tagentRunner, err := runner.New(runner.Config{\n\t\t\t\tAppName:        \"test_app\",\n\t\t\t\tAgent:          parallelAgent,\n\t\t\t\tSessionService: sessionService,\n\t\t\t})\n\t\t\tif err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\n\t\t\t_, err = sessionService.Create(ctx, &session.CreateRequest{\n\t\t\t\tAppName:   \"test_app\",\n\t\t\t\tUserID:    \"user_id\",\n\t\t\t\tSessionID: \"session_id\",\n\t\t\t})\n\t\t\tif err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\n\t\t\tctx, cancel := context.WithCancel(ctx)\n\t\t\tdefer cancel()\n\n\t\t\tif tt.cancelContext {\n\t\t\t\tgo func() {\n\t\t\t\t\ttime.Sleep(5 * time.Millisecond)\n\t\t\t\t\tcancel()\n\t\t\t\t}()\n\t\t\t}\n\n\t\t\tfor event, err := range agentRunner.Run(ctx, \"user_id\", \"session_id\", genai.NewContentFromText(\"user input\", genai.RoleUser), agent.RunConfig{}) {\n\t\t\t\tif tt.wantErr != (err != nil) {\n\t\t\t\t\tif tt.cancelContext && err == nil {\n\t\t\t\t\t\t// In case of context cancellation some events can be processed before cancel is applied.\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\t\t\t\t\tif tt.agentError != nil && err == nil {\n\t\t\t\t\t\t// In case of agent error some events from other agents can be processed before error is returned.\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\t\t\t\t\tt.Errorf(\"got unexpected error: %v\", err)\n\t\t\t\t}\n\n\t\t\t\tgotEvents = append(gotEvents, event)\n\t\t\t}\n\n\t\t\tif tt.wantEvents != nil {\n\t\t\t\teventCompareFunc := func(e1, e2 *session.Event) int {\n\t\t\t\t\tif e1.Author <= e2.Author {\n\t\t\t\t\t\treturn -1\n\t\t\t\t\t}\n\t\t\t\t\tif e1.Author == e2.Author {\n\t\t\t\t\t\treturn 0\n\t\t\t\t\t}\n\t\t\t\t\treturn 1\n\t\t\t\t}\n\n\t\t\t\tslices.SortFunc(tt.wantEvents, eventCompareFunc)\n\t\t\t\tslices.SortFunc(gotEvents, eventCompareFunc)\n\n\t\t\t\tif diff := cmp.Diff(tt.wantEvents, gotEvents); diff != \"\" {\n\t\t\t\t\tt.Errorf(\"events mismatch (-want +got):\\n%s\", diff)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n}\n\n// newParallelAgent creates parallel agent with 2 subagents emitting maxIterations events or infinitely if maxIterations==0.\nfunc newParallelAgent(t *testing.T, maxIterations uint, numSubAgents int, agentErr error) agent.Agent {\n\tvar subAgents []agent.Agent\n\n\tfor i := 1; i <= numSubAgents; i++ {\n\t\tsubAgents = append(subAgents, must(loopagent.New(loopagent.Config{\n\t\t\tMaxIterations: maxIterations,\n\t\t\tAgentConfig: agent.Config{\n\t\t\t\tName: fmt.Sprintf(\"loop_agent_%d\", i),\n\t\t\t\tSubAgents: []agent.Agent{\n\t\t\t\t\tmust(agent.New(agent.Config{\n\t\t\t\t\t\tName: fmt.Sprintf(\"sub%d\", i),\n\t\t\t\t\t\tRun:  customRun(i, nil),\n\t\t\t\t\t},\n\t\t\t\t\t)),\n\t\t\t\t},\n\t\t\t},\n\t\t})))\n\t}\n\n\tif agentErr != nil {\n\t\tsubAgents = append(subAgents, must(agent.New(agent.Config{\n\t\t\tName: \"error_agent\",\n\t\t\tRun:  customRun(-1, agentErr),\n\t\t})))\n\t}\n\n\tagent, err := parallelagent.New(parallelagent.Config{\n\t\tAgentConfig: agent.Config{\n\t\t\tName:      \"test_agent\",\n\t\t\tSubAgents: subAgents,\n\t\t},\n\t})\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\treturn agent\n}\n\nfunc must[T agent.Agent](a T, err error) T {\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn a\n}\n\nfunc customRun(id int, agentErr error) func(agent.InvocationContext) iter.Seq2[*session.Event, error] {\n\treturn func(agent.InvocationContext) iter.Seq2[*session.Event, error] {\n\t\treturn func(yield func(*session.Event, error) bool) {\n\t\t\ttime.Sleep((time.Duration(rand.IntN(5) + 1)) * time.Millisecond)\n\t\t\tif agentErr != nil {\n\t\t\t\tyield(nil, agentErr)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tyield(&session.Event{\n\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\tContent: genai.NewContentFromText(fmt.Sprintf(\"hello %v\", id), genai.RoleModel),\n\t\t\t\t},\n\t\t\t}, nil)\n\t\t}\n\t}\n}\n\nfunc TestParallelAgentWithTools(t *testing.T) {\n\tagent1 := createAgentWithGemini(t, \"agent1\")\n\tagent2 := createAgentWithGemini(t, \"agent2\")\n\n\tparallelAgent, err := parallelagent.New(parallelagent.Config{\n\t\tAgentConfig: agent.Config{\n\t\t\tName:      \"parallel_test\",\n\t\t\tSubAgents: []agent.Agent{agent1, agent2},\n\t\t},\n\t})\n\tif err != nil {\n\t\tt.Fatalf(\"Failed to create parallel agent: %v\", err)\n\t}\n\n\trunner := testutil.NewTestAgentRunner(t, parallelAgent)\n\tstream := runner.Run(t, \"test_session\", \"Search for AI news\")\n\n\tevents, err := testutil.CollectEvents(stream)\n\tif err != nil {\n\t\tt.Fatalf(\"Agent run failed: %v\", err)\n\t}\n\n\tif len(events) < 2 {\n\t\tt.Errorf(\"Expected at least 2 events from parallel agents, got %d\", len(events))\n\t}\n\n\t// Count FunctionCall and FunctionResponse events per branch\n\tbranchCalls := make(map[string]int)\n\tbranchResponses := make(map[string]int)\n\n\tfor _, ev := range events {\n\t\tbranch := ev.Branch\n\t\tif ev.LLMResponse.Content != nil {\n\t\t\tfor _, part := range ev.LLMResponse.Content.Parts {\n\t\t\t\tif part.FunctionCall != nil {\n\t\t\t\t\tbranchCalls[branch]++\n\t\t\t\t}\n\t\t\t\tif part.FunctionResponse != nil {\n\t\t\t\t\tbranchResponses[branch]++\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tfor branch, calls := range branchCalls {\n\t\tresponses := branchResponses[branch]\n\t\tif calls > responses {\n\t\t\tt.Errorf(\"Branch %s: session has %d FunctionCalls but only %d FunctionResponses. \"+\n\t\t\t\t\"This indicates race condition: agent read session before FunctionResponse was appended.\",\n\t\t\t\tbranch, calls, responses)\n\t\t}\n\t}\n}\n\nfunc createAgentWithGemini(t *testing.T, name string) agent.Agent {\n\tt.Helper()\n\n\tsearchTool, err := functiontool.New(\n\t\tfunctiontool.Config{\n\t\t\tName:        fmt.Sprintf(\"search_tool_%s\", name),\n\t\t\tDescription: \"Search for information on the web\",\n\t\t},\n\t\tfunc(ctx tool.Context, args struct{ Query string }) (string, error) {\n\t\t\treturn fmt.Sprintf(\"search result for '%s' from %s\", args.Query, name), nil\n\t\t},\n\t)\n\tif err != nil {\n\t\tt.Fatalf(\"Failed to create search tool: %v\", err)\n\t}\n\n\tanalyzeTool, err := functiontool.New(\n\t\tfunctiontool.Config{\n\t\t\tName:        fmt.Sprintf(\"analyze_tool_%s\", name),\n\t\t\tDescription: \"Analyze data and return insights\",\n\t\t},\n\t\tfunc(ctx tool.Context, args struct{ Data string }) (string, error) {\n\t\t\treturn fmt.Sprintf(\"analysis result for '%s' from %s\", args.Data, name), nil\n\t\t},\n\t)\n\tif err != nil {\n\t\tt.Fatalf(\"Failed to create analyze tool: %v\", err)\n\t}\n\n\tmodel := newGeminiModelForTest(t, modelName, name)\n\n\ta, err := llmagent.New(llmagent.Config{\n\t\tName:        name,\n\t\tDescription: fmt.Sprintf(\"Test agent %s that searches for information\", name),\n\t\tModel:       model,\n\t\tTools:       []tool.Tool{searchTool, analyzeTool},\n\t\tInstruction: \"Use the search tool to find information, then provide a brief response.\",\n\t})\n\tif err != nil {\n\t\tt.Fatalf(\"Failed to create agent %s: %v\", name, err)\n\t}\n\n\treturn a\n}\n\nfunc newGeminiModelForTest(t *testing.T, modelName, agentName string) model.LLM {\n\tt.Helper()\n\n\ttrace := filepath.Join(\"testdata\", fmt.Sprintf(\"%s_%s.httprr\",\n\t\tstrings.ReplaceAll(t.Name(), \"/\", \"_\"), agentName))\n\n\tapiKey := \"fakeKey\"\n\ttransport, recording := newGeminiTestTransport(t, trace)\n\tif recording {\n\t\tapiKey = \"\"\n\t}\n\n\tmodel, err := gemini.NewModel(t.Context(), modelName, &genai.ClientConfig{\n\t\tHTTPClient: &http.Client{Transport: transport},\n\t\tAPIKey:     apiKey,\n\t})\n\tif err != nil {\n\t\tt.Fatalf(\"Failed to create Gemini model: %v\", err)\n\t}\n\treturn model\n}\n\nfunc newGeminiTestTransport(t *testing.T, rrfile string) (http.RoundTripper, bool) {\n\tt.Helper()\n\trr, err := testutil.NewGeminiTransport(rrfile)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\trecording, _ := httprr.Recording(rrfile)\n\treturn rr, recording\n}\n\n// TestParallelAgent_PropagatesContextError verifies that if the context is canceled,\n// the iterator yields the error from errgroup.Wait().\nfunc TestParallelAgent_PropagatesContextError(t *testing.T) {\n\tt.Parallel()\n\n\t// Create a sub-agent that yields an event and then waits.\n\t// We want to trigger runSubAgent returning ctx.Err().\n\tsubAgent := must(agent.New(agent.Config{\n\t\tName: \"yielder\",\n\t\tRun: func(ctx agent.InvocationContext) iter.Seq2[*session.Event, error] {\n\t\t\treturn func(yield func(*session.Event, error) bool) {\n\t\t\t\t// Yield one event so we engage runSubAgent logic\n\t\t\t\tif !yield(&session.Event{\n\t\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\t\tContent: genai.NewContentFromText(\"hello\", genai.RoleModel),\n\t\t\t\t\t},\n\t\t\t\t}, nil) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\t// Wait for context cancellation\n\t\t\t\t<-ctx.Done()\n\t\t\t}\n\t\t},\n\t}))\n\n\tparallelAgent, err := parallelagent.New(parallelagent.Config{\n\t\tAgentConfig: agent.Config{\n\t\t\tName:      \"parallel_agent\",\n\t\t\tSubAgents: []agent.Agent{subAgent},\n\t\t},\n\t})\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\tspy := &spyAgent{Agent: parallelAgent}\n\n\tctx, cancel := context.WithCancel(t.Context())\n\n\tsessionService := session.InMemoryService()\n\t_, _ = sessionService.Create(ctx, &session.CreateRequest{\n\t\tAppName:   \"test_app\",\n\t\tUserID:    \"user_id\",\n\t\tSessionID: \"session_id\",\n\t})\n\n\tr, err := runner.New(runner.Config{\n\t\tAppName:        \"test_app\",\n\t\tAgent:          spy,\n\t\tSessionService: sessionService,\n\t})\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\tgo func() {\n\t\t// Wait a tiny bit to ensure we started\n\t\ttime.Sleep(10 * time.Millisecond)\n\t\tcancel()\n\t}()\n\n\tfor range r.Run(ctx, \"user_id\", \"session_id\", genai.NewContentFromText(\"hi\", genai.RoleUser), agent.RunConfig{}) {\n\t\t// Simulate processing delay so that ackChan takes time,\n\t\t// increasing chance runSubAgent is blocked on ackChan when cancel happens?\n\t\ttime.Sleep(100 * time.Millisecond)\n\t}\n\n\tif spy.yieldedError == nil {\n\t\tt.Fatal(\"Expected parallelAgent to yield an error (e.g. context canceled), but it yielded nil\")\n\t}\n\n\tt.Logf(\"Yielded error: %v\", spy.yieldedError)\n}\n\ntype spyAgent struct {\n\tagent.Agent\n\tyieldedError error\n}\n\nfunc (s *spyAgent) Run(ctx agent.InvocationContext) iter.Seq2[*session.Event, error] {\n\tnext := s.Agent.Run(ctx)\n\treturn func(yield func(*session.Event, error) bool) {\n\t\tfor event, err := range next {\n\t\t\tif err != nil {\n\t\t\t\ts.yieldedError = err\n\t\t\t}\n\t\t\tif !yield(event, err) {\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc TestParallelAgent_StateSync(t *testing.T) {\n\tctx := t.Context()\n\n\tvar gotValue any\n\tvar gotErr error\n\n\tsubAgent, err := agent.New(agent.Config{\n\t\tName: \"test_subagent\",\n\t\tRun: func(agent.InvocationContext) iter.Seq2[*session.Event, error] {\n\t\t\treturn func(yield func(*session.Event, error) bool) {\n\t\t\t\tevent := &session.Event{\n\t\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\t\tContent: genai.NewContentFromText(\"hello\", genai.RoleModel),\n\t\t\t\t\t},\n\t\t\t\t\tActions: session.EventActions{\n\t\t\t\t\t\tStateDelta: map[string]any{\"test_key\": \"test_value\"},\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t\tyield(event, nil)\n\t\t\t}\n\t\t},\n\t\tAfterAgentCallbacks: []agent.AfterAgentCallback{\n\t\t\tfunc(c agent.CallbackContext) (*genai.Content, error) {\n\t\t\t\tgotValue, gotErr = c.State().Get(\"test_key\")\n\t\t\t\treturn nil, nil\n\t\t\t},\n\t\t},\n\t})\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\tparallelAgent, err := parallelagent.New(parallelagent.Config{\n\t\tAgentConfig: agent.Config{\n\t\t\tName:      \"test_parallel_agent\",\n\t\t\tSubAgents: []agent.Agent{subAgent},\n\t\t},\n\t})\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\tsessionService := session.InMemoryService()\n\tagentRunner, err := runner.New(runner.Config{\n\t\tAppName:        \"test_app\",\n\t\tAgent:          parallelAgent,\n\t\tSessionService: sessionService,\n\t})\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\t_, err = sessionService.Create(ctx, &session.CreateRequest{\n\t\tAppName:   \"test_app\",\n\t\tUserID:    \"user_id\",\n\t\tSessionID: \"session_id\",\n\t})\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\tfor _, err := range agentRunner.Run(ctx, \"user_id\", \"session_id\", genai.NewContentFromText(\"user input\", genai.RoleUser), agent.RunConfig{}) {\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t}\n\n\tif gotErr != nil {\n\t\tt.Fatalf(\"expected to get value from state, got error: %v\", gotErr)\n\t}\n\tif gotValue != \"test_value\" {\n\t\tt.Fatalf(\"expected state value 'test_value', got %v\", gotValue)\n\t}\n}\n"
  },
  {
    "path": "agent/workflowagents/parallelagent/testdata/TestParallelAgentWithTools_agent1.httprr",
    "content": "httprr trace v1\n1127 1361\nPOST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent HTTP/1.1\r\nHost: generativelanguage.googleapis.com\r\nUser-Agent: Go-http-client/1.1\r\nContent-Length: 895\r\nContent-Type: application/json\r\n\r\n{\"contents\":[{\"parts\":[{\"text\":\"Search for AI news\"}],\"role\":\"user\"}],\"generationConfig\":{},\"systemInstruction\":{\"parts\":[{\"text\":\"Use the search tool to find information, then provide a brief response.\\n\\nYou are an agent. Your internal name is \\\"agent1\\\". The description about you is \\\"Test agent agent1 that searches for information\\\".\"}],\"role\":\"user\"},\"tools\":[{\"functionDeclarations\":[{\"description\":\"Search for information on the web\",\"name\":\"search_tool_agent1\",\"parametersJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"Query\":{\"type\":\"string\"}},\"required\":[\"Query\"],\"type\":\"object\"},\"responseJsonSchema\":{\"type\":\"string\"}},{\"description\":\"Analyze data and return insights\",\"name\":\"analyze_tool_agent1\",\"parametersJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"Data\":{\"type\":\"string\"}},\"required\":[\"Data\"],\"type\":\"object\"},\"responseJsonSchema\":{\"type\":\"string\"}}]}]}HTTP/2.0 200 OK\r\nContent-Type: application/json; charset=UTF-8\r\nDate: Tue, 10 Mar 2026 14:10:09 GMT\r\nServer: scaffolding on HTTPServer2\r\nServer-Timing: gfet4t7; dur=839\r\nVary: Origin\r\nVary: X-Origin\r\nVary: Referer\r\nX-Content-Type-Options: nosniff\r\nX-Frame-Options: SAMEORIGIN\r\nX-Xss-Protection: 0\r\n\r\n{\n  \"candidates\": [\n    {\n      \"content\": {\n        \"parts\": [\n          {\n            \"functionCall\": {\n              \"name\": \"search_tool_agent1\",\n              \"args\": {\n                \"Query\": \"AI news\"\n              }\n            },\n            \"thoughtSignature\": \"Cs4BAb4+9vs/4CDsMN0qNsrfQFxWS9FvZlzpMygp9/H8v7tHgE7QyJQQND6DgpT7KC5MPOLDWDfE1fBKCe300RWjHUy7Uu7kCaXjLq4vX1ob5IURvlj0wIjyQsNOGOwmLWdjW3Fz/HUQGsi3Y8tVKGkt7e+f80C88cFrC8DKIpOtGw9HhJjGBBoXfGyZ50d+od5M1czN5oNOqSYIQ91F5BbZO7CigLdb+VvgFP/nUMJIpd6SKEO/i6qX8u5zU/hX52GG7S1kx3IwtPS7U9uRNEg=\"\n          }\n        ],\n        \"role\": \"model\"\n      },\n      \"finishReason\": \"STOP\",\n      \"index\": 0,\n      \"finishMessage\": \"Model generated function call(s).\"\n    }\n  ],\n  \"usageMetadata\": {\n    \"promptTokenCount\": 130,\n    \"candidatesTokenCount\": 19,\n    \"totalTokenCount\": 194,\n    \"promptTokensDetails\": [\n      {\n        \"modality\": \"TEXT\",\n        \"tokenCount\": 130\n      }\n    ],\n    \"thoughtsTokenCount\": 45\n  },\n  \"modelVersion\": \"gemini-2.5-flash\",\n  \"responseId\": \"QCawaf6pHYiEkdUP_4aqmAU\"\n}\n1672 1285\nPOST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent HTTP/1.1\r\nHost: generativelanguage.googleapis.com\r\nUser-Agent: Go-http-client/1.1\r\nContent-Length: 1439\r\nContent-Type: application/json\r\n\r\n{\"contents\":[{\"parts\":[{\"text\":\"Search for AI news\"}],\"role\":\"user\"},{\"parts\":[{\"functionCall\":{\"args\":{\"Query\":\"AI news\"},\"name\":\"search_tool_agent1\"},\"thoughtSignature\":\"Cs4BAb4+9vs/4CDsMN0qNsrfQFxWS9FvZlzpMygp9/H8v7tHgE7QyJQQND6DgpT7KC5MPOLDWDfE1fBKCe300RWjHUy7Uu7kCaXjLq4vX1ob5IURvlj0wIjyQsNOGOwmLWdjW3Fz/HUQGsi3Y8tVKGkt7e+f80C88cFrC8DKIpOtGw9HhJjGBBoXfGyZ50d+od5M1czN5oNOqSYIQ91F5BbZO7CigLdb+VvgFP/nUMJIpd6SKEO/i6qX8u5zU/hX52GG7S1kx3IwtPS7U9uRNEg=\"}],\"role\":\"model\"},{\"parts\":[{\"functionResponse\":{\"name\":\"search_tool_agent1\",\"response\":{\"result\":\"search result for 'AI news' from agent1\"}}}],\"role\":\"user\"}],\"generationConfig\":{},\"systemInstruction\":{\"parts\":[{\"text\":\"Use the search tool to find information, then provide a brief response.\\n\\nYou are an agent. Your internal name is \\\"agent1\\\". The description about you is \\\"Test agent agent1 that searches for information\\\".\"}],\"role\":\"user\"},\"tools\":[{\"functionDeclarations\":[{\"description\":\"Search for information on the web\",\"name\":\"search_tool_agent1\",\"parametersJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"Query\":{\"type\":\"string\"}},\"required\":[\"Query\"],\"type\":\"object\"},\"responseJsonSchema\":{\"type\":\"string\"}},{\"description\":\"Analyze data and return insights\",\"name\":\"analyze_tool_agent1\",\"parametersJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"Data\":{\"type\":\"string\"}},\"required\":[\"Data\"],\"type\":\"object\"},\"responseJsonSchema\":{\"type\":\"string\"}}]}]}HTTP/2.0 200 OK\r\nContent-Type: application/json; charset=UTF-8\r\nDate: Tue, 10 Mar 2026 14:10:10 GMT\r\nServer: scaffolding on HTTPServer2\r\nServer-Timing: gfet4t7; dur=1082\r\nVary: Origin\r\nVary: X-Origin\r\nVary: Referer\r\nX-Content-Type-Options: nosniff\r\nX-Frame-Options: SAMEORIGIN\r\nX-Xss-Protection: 0\r\n\r\n{\n  \"candidates\": [\n    {\n      \"content\": {\n        \"parts\": [\n          {\n            \"text\": \"Here is the search result for AI news: search result for 'AI news' from agent1.\",\n            \"thoughtSignature\": \"Cu4BAb4+9vtaTYs8CebYXN1nfuRbiQBmXSWp58SnOAbDC1F68YwGLpA16BfNWyIn68p7gnkut9YA1iGf5jeverwXhK1bzyJKS9nVIeZlPsihCJEaMtHxt/G/gAKrIL9e9QJ9PBjNUWrKclT1l58vOUcF+nm45mgeRbVj7gcxAlM5xnCLnokBeR05H38P3PX9zYQeWv5fWHkDmSW1bhzj89mnVdjTWtsYMvjuveOzCjF2TDriPaa9Iq8ss5NRWNMcIfqZhRCQYmn6rK9yXTS//JlpxxleNVMZ865QcKku2mYTimymfGXE+bA6Jp6H7i3Ddg==\"\n          }\n        ],\n        \"role\": \"model\"\n      },\n      \"finishReason\": \"STOP\",\n      \"index\": 0\n    }\n  ],\n  \"usageMetadata\": {\n    \"promptTokenCount\": 176,\n    \"candidatesTokenCount\": 20,\n    \"totalTokenCount\": 238,\n    \"promptTokensDetails\": [\n      {\n        \"modality\": \"TEXT\",\n        \"tokenCount\": 176\n      }\n    ],\n    \"thoughtsTokenCount\": 42\n  },\n  \"modelVersion\": \"gemini-2.5-flash\",\n  \"responseId\": \"QSawacavC4jp7M8P3JPTmAo\"\n}\n"
  },
  {
    "path": "agent/workflowagents/parallelagent/testdata/TestParallelAgentWithTools_agent2.httprr",
    "content": "httprr trace v1\n1127 1537\nPOST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent HTTP/1.1\r\nHost: generativelanguage.googleapis.com\r\nUser-Agent: Go-http-client/1.1\r\nContent-Length: 895\r\nContent-Type: application/json\r\n\r\n{\"contents\":[{\"parts\":[{\"text\":\"Search for AI news\"}],\"role\":\"user\"}],\"generationConfig\":{},\"systemInstruction\":{\"parts\":[{\"text\":\"Use the search tool to find information, then provide a brief response.\\n\\nYou are an agent. Your internal name is \\\"agent2\\\". The description about you is \\\"Test agent agent2 that searches for information\\\".\"}],\"role\":\"user\"},\"tools\":[{\"functionDeclarations\":[{\"description\":\"Search for information on the web\",\"name\":\"search_tool_agent2\",\"parametersJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"Query\":{\"type\":\"string\"}},\"required\":[\"Query\"],\"type\":\"object\"},\"responseJsonSchema\":{\"type\":\"string\"}},{\"description\":\"Analyze data and return insights\",\"name\":\"analyze_tool_agent2\",\"parametersJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"Data\":{\"type\":\"string\"}},\"required\":[\"Data\"],\"type\":\"object\"},\"responseJsonSchema\":{\"type\":\"string\"}}]}]}HTTP/2.0 200 OK\r\nContent-Type: application/json; charset=UTF-8\r\nDate: Tue, 10 Mar 2026 14:10:09 GMT\r\nServer: scaffolding on HTTPServer2\r\nServer-Timing: gfet4t7; dur=839\r\nVary: Origin\r\nVary: X-Origin\r\nVary: Referer\r\nX-Content-Type-Options: nosniff\r\nX-Frame-Options: SAMEORIGIN\r\nX-Xss-Protection: 0\r\n\r\n{\n  \"candidates\": [\n    {\n      \"content\": {\n        \"parts\": [\n          {\n            \"functionCall\": {\n              \"name\": \"search_tool_agent2\",\n              \"args\": {\n                \"Query\": \"AI news\"\n              }\n            },\n            \"thoughtSignature\": \"CtICAb4+9vtlb0gcS4vqZ08t7q9ey+1CXWXyovOKA2owAQsWvdbT4bXw7XN7ebSC4pkLTSQnH7uJEKmhn/fhW1as+hykHUqV/MeKN29HBLrY+h1U6GMRjbY6ORp+V+yA/H1k7ugH4TPeFMhZXKV7R3ioZx2Qc1EFP5KnEe5QoJcbaDITPb3UCLgTBSK29DfhhS5yaDrrXniRiHrjeROrBCgOYmhPp+/B7mgpg2s+QYHN5dzJZHzfxSAKT0TsuzJYLlF0lFk+jSmQWahPQPxyLpGlimzP8nehd+vFn1JUog54+0pSS81K7kgVPg9BwIWbUQiTWMyi+H9R3lIcPcWS93WNWRt9dDGoiq8+pI/dTn+ML/WD6eUqYJ5LaniZrkWaVWKw82Q54Vk9aYOX7WvTn+Yqx08I5sFZj0NM79KZjuvMe4v2lNkyGSBwEHUQmJqQuuzoMVs=\"\n          }\n        ],\n        \"role\": \"model\"\n      },\n      \"finishReason\": \"STOP\",\n      \"index\": 0,\n      \"finishMessage\": \"Model generated function call(s).\"\n    }\n  ],\n  \"usageMetadata\": {\n    \"promptTokenCount\": 130,\n    \"candidatesTokenCount\": 19,\n    \"totalTokenCount\": 229,\n    \"promptTokensDetails\": [\n      {\n        \"modality\": \"TEXT\",\n        \"tokenCount\": 130\n      }\n    ],\n    \"thoughtsTokenCount\": 80\n  },\n  \"modelVersion\": \"gemini-2.5-flash\",\n  \"responseId\": \"QCawafHoFpHrnsEPpaTr2Qw\"\n}\n1848 895\nPOST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent HTTP/1.1\r\nHost: generativelanguage.googleapis.com\r\nUser-Agent: Go-http-client/1.1\r\nContent-Length: 1615\r\nContent-Type: application/json\r\n\r\n{\"contents\":[{\"parts\":[{\"text\":\"Search for AI news\"}],\"role\":\"user\"},{\"parts\":[{\"functionCall\":{\"args\":{\"Query\":\"AI news\"},\"name\":\"search_tool_agent2\"},\"thoughtSignature\":\"CtICAb4+9vtlb0gcS4vqZ08t7q9ey+1CXWXyovOKA2owAQsWvdbT4bXw7XN7ebSC4pkLTSQnH7uJEKmhn/fhW1as+hykHUqV/MeKN29HBLrY+h1U6GMRjbY6ORp+V+yA/H1k7ugH4TPeFMhZXKV7R3ioZx2Qc1EFP5KnEe5QoJcbaDITPb3UCLgTBSK29DfhhS5yaDrrXniRiHrjeROrBCgOYmhPp+/B7mgpg2s+QYHN5dzJZHzfxSAKT0TsuzJYLlF0lFk+jSmQWahPQPxyLpGlimzP8nehd+vFn1JUog54+0pSS81K7kgVPg9BwIWbUQiTWMyi+H9R3lIcPcWS93WNWRt9dDGoiq8+pI/dTn+ML/WD6eUqYJ5LaniZrkWaVWKw82Q54Vk9aYOX7WvTn+Yqx08I5sFZj0NM79KZjuvMe4v2lNkyGSBwEHUQmJqQuuzoMVs=\"}],\"role\":\"model\"},{\"parts\":[{\"functionResponse\":{\"name\":\"search_tool_agent2\",\"response\":{\"result\":\"search result for 'AI news' from agent2\"}}}],\"role\":\"user\"}],\"generationConfig\":{},\"systemInstruction\":{\"parts\":[{\"text\":\"Use the search tool to find information, then provide a brief response.\\n\\nYou are an agent. Your internal name is \\\"agent2\\\". The description about you is \\\"Test agent agent2 that searches for information\\\".\"}],\"role\":\"user\"},\"tools\":[{\"functionDeclarations\":[{\"description\":\"Search for information on the web\",\"name\":\"search_tool_agent2\",\"parametersJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"Query\":{\"type\":\"string\"}},\"required\":[\"Query\"],\"type\":\"object\"},\"responseJsonSchema\":{\"type\":\"string\"}},{\"description\":\"Analyze data and return insights\",\"name\":\"analyze_tool_agent2\",\"parametersJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"Data\":{\"type\":\"string\"}},\"required\":[\"Data\"],\"type\":\"object\"},\"responseJsonSchema\":{\"type\":\"string\"}}]}]}HTTP/2.0 200 OK\r\nContent-Type: application/json; charset=UTF-8\r\nDate: Tue, 10 Mar 2026 14:10:10 GMT\r\nServer: scaffolding on HTTPServer2\r\nServer-Timing: gfet4t7; dur=917\r\nVary: Origin\r\nVary: X-Origin\r\nVary: Referer\r\nX-Content-Type-Options: nosniff\r\nX-Frame-Options: SAMEORIGIN\r\nX-Xss-Protection: 0\r\n\r\n{\n  \"candidates\": [\n    {\n      \"content\": {\n        \"parts\": [\n          {\n            \"text\": \"I found some AI news for you. Would you like me to analyze it or something else?\"\n          }\n        ],\n        \"role\": \"model\"\n      },\n      \"finishReason\": \"STOP\",\n      \"index\": 0\n    }\n  ],\n  \"usageMetadata\": {\n    \"promptTokenCount\": 176,\n    \"candidatesTokenCount\": 19,\n    \"totalTokenCount\": 195,\n    \"promptTokensDetails\": [\n      {\n        \"modality\": \"TEXT\",\n        \"tokenCount\": 176\n      }\n    ]\n  },\n  \"modelVersion\": \"gemini-2.5-flash\",\n  \"responseId\": \"QSawad76G9v6nsEP1paPoAU\"\n}\n"
  },
  {
    "path": "agent/workflowagents/sequentialagent/agent.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Package sequentialagent provides an agent that runs its sub-agents in a sequence.\npackage sequentialagent\n\nimport (\n\t\"fmt\"\n\t\"iter\"\n\n\t\"google.golang.org/adk/agent\"\n\tagentinternal \"google.golang.org/adk/internal/agent\"\n\t\"google.golang.org/adk/session\"\n)\n\n// New creates a SequentialAgent.\n//\n// SequentialAgent executes its sub-agents once, in the order they are listed.\n//\n// Use the SequentialAgent when you want the execution to occur in a fixed,\n// strict order.\nfunc New(cfg Config) (agent.Agent, error) {\n\tif cfg.AgentConfig.Run != nil {\n\t\treturn nil, fmt.Errorf(\"LoopAgent doesn't allow custom Run implementations\")\n\t}\n\n\tsequentialAgentImpl := &sequentialAgent{}\n\tcfg.AgentConfig.Run = sequentialAgentImpl.Run\n\n\tsequentialAgent, err := agent.New(cfg.AgentConfig)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to create base agent: %w\", err)\n\t}\n\n\tinternalAgent, ok := sequentialAgent.(agentinternal.Agent)\n\tif !ok {\n\t\treturn nil, fmt.Errorf(\"internal error: failed to convert to internal agent\")\n\t}\n\tstate := agentinternal.Reveal(internalAgent)\n\tstate.AgentType = agentinternal.TypeSequentialAgent\n\tstate.Config = cfg\n\n\treturn sequentialAgent, nil\n}\n\n// Config defines the configuration for a SequentialAgent.\ntype Config struct {\n\t// Basic agent setup.\n\tAgentConfig agent.Config\n}\n\ntype sequentialAgent struct{}\n\nfunc (a *sequentialAgent) Run(ctx agent.InvocationContext) iter.Seq2[*session.Event, error] {\n\treturn func(yield func(*session.Event, error) bool) {\n\t\tfor _, subAgent := range ctx.Agent().SubAgents() {\n\t\t\tfor event, err := range subAgent.Run(ctx) {\n\t\t\t\t// TODO: ensure consistency -- if there's an error, return and close iterator, verify everywhere in ADK.\n\t\t\t\tif !yield(event, err) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "agent/workflowagents/sequentialagent/agent_test.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage sequentialagent_test\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"iter\"\n\t\"testing\"\n\n\t\"github.com/google/go-cmp/cmp\"\n\t\"github.com/google/go-cmp/cmp/cmpopts\"\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/agent\"\n\t\"google.golang.org/adk/agent/llmagent\"\n\t\"google.golang.org/adk/agent/workflowagents/sequentialagent\"\n\t\"google.golang.org/adk/model\"\n\t\"google.golang.org/adk/runner\"\n\t\"google.golang.org/adk/session\"\n)\n\nfunc TestNewSequentialAgent(t *testing.T) {\n\ttype args struct {\n\t\tmaxIterations uint\n\t\tsubAgents     []agent.Agent\n\t}\n\n\tsameAgent := newSequentialAgent(t, []agent.Agent{newCustomAgent(t, 1), newCustomAgent(t, 2)}, \"same_agent\")\n\n\ttests := []struct {\n\t\tname           string\n\t\targs           args\n\t\twantEvents     []*session.Event\n\t\twantErr        bool\n\t\twantErrMessage string\n\t}{\n\t\t{\n\t\t\tname: \"ok\",\n\t\t\targs: args{\n\t\t\t\tmaxIterations: 0,\n\t\t\t\tsubAgents:     []agent.Agent{newCustomAgent(t, 0), newCustomAgent(t, 1)},\n\t\t\t},\n\t\t\twantEvents: []*session.Event{\n\t\t\t\t{\n\t\t\t\t\tAuthor: \"custom_agent_0\",\n\t\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\t\tContent: &genai.Content{\n\t\t\t\t\t\t\tParts: []*genai.Part{\n\t\t\t\t\t\t\t\tgenai.NewPartFromText(\"hello 0\"),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tRole: genai.RoleModel,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tActions: session.EventActions{\n\t\t\t\t\t\tStateDelta:    map[string]any{},\n\t\t\t\t\t\tArtifactDelta: map[string]int64{},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tAuthor: \"custom_agent_1\",\n\t\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\t\tContent: &genai.Content{\n\t\t\t\t\t\t\tParts: []*genai.Part{\n\t\t\t\t\t\t\t\tgenai.NewPartFromText(\"hello 1\"),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tRole: genai.RoleModel,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tActions: session.EventActions{\n\t\t\t\t\t\tStateDelta:    map[string]any{},\n\t\t\t\t\t\tArtifactDelta: map[string]int64{},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"ok with inner sequential\",\n\t\t\targs: args{\n\t\t\t\tmaxIterations: 0,\n\t\t\t\tsubAgents:     []agent.Agent{newCustomAgent(t, 0), newSequentialAgent(t, []agent.Agent{newCustomAgent(t, 1), newCustomAgent(t, 2)}, \"test_agent1\"), newCustomAgent(t, 3)},\n\t\t\t},\n\t\t\twantEvents: []*session.Event{\n\t\t\t\t{\n\t\t\t\t\tAuthor: \"custom_agent_0\",\n\t\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\t\tContent: &genai.Content{\n\t\t\t\t\t\t\tParts: []*genai.Part{\n\t\t\t\t\t\t\t\tgenai.NewPartFromText(\"hello 0\"),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tRole: genai.RoleModel,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tActions: session.EventActions{\n\t\t\t\t\t\tStateDelta:    map[string]any{},\n\t\t\t\t\t\tArtifactDelta: map[string]int64{},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tAuthor: \"custom_agent_1\",\n\t\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\t\tContent: &genai.Content{\n\t\t\t\t\t\t\tParts: []*genai.Part{\n\t\t\t\t\t\t\t\tgenai.NewPartFromText(\"hello 1\"),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tRole: genai.RoleModel,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tActions: session.EventActions{\n\t\t\t\t\t\tStateDelta:    map[string]any{},\n\t\t\t\t\t\tArtifactDelta: map[string]int64{},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tAuthor: \"custom_agent_2\",\n\t\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\t\tContent: &genai.Content{\n\t\t\t\t\t\t\tParts: []*genai.Part{\n\t\t\t\t\t\t\t\tgenai.NewPartFromText(\"hello 2\"),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tRole: genai.RoleModel,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tActions: session.EventActions{\n\t\t\t\t\t\tStateDelta:    map[string]any{},\n\t\t\t\t\t\tArtifactDelta: map[string]int64{},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tAuthor: \"custom_agent_3\",\n\t\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\t\tContent: &genai.Content{\n\t\t\t\t\t\t\tParts: []*genai.Part{\n\t\t\t\t\t\t\t\tgenai.NewPartFromText(\"hello 3\"),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tRole: genai.RoleModel,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tActions: session.EventActions{\n\t\t\t\t\t\tStateDelta:    map[string]any{},\n\t\t\t\t\t\tArtifactDelta: map[string]int64{},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"err with inner sequential with same name as root\",\n\t\t\targs: args{\n\t\t\t\tmaxIterations: 0,\n\t\t\t\tsubAgents:     []agent.Agent{newCustomAgent(t, 0), newSequentialAgent(t, []agent.Agent{newCustomAgent(t, 1), newCustomAgent(t, 2)}, \"test_agent1\"), newCustomAgent(t, 3)},\n\t\t\t},\n\t\t\twantErr:        true,\n\t\t\twantErrMessage: `failed to create agent tree: agent names must be unique in the agent tree, found duplicate: \"test_agent\"`,\n\t\t},\n\t\t{\n\t\t\tname: \"err with 2 levels of inner sequential with same name as root \",\n\t\t\targs: args{\n\t\t\t\tmaxIterations: 0,\n\t\t\t\tsubAgents: []agent.Agent{newCustomAgent(t, 0), newSequentialAgent(t, []agent.Agent{\n\t\t\t\t\tnewSequentialAgent(t, []agent.Agent{newCustomAgent(t, 1), newCustomAgent(t, 2)}, \"test_agent1\"),\n\t\t\t\t}, \"test_agent\"), newCustomAgent(t, 3)},\n\t\t\t},\n\t\t\twantErr:        true,\n\t\t\twantErrMessage: `failed to create agent tree: agent names must be unique in the agent tree, found duplicate: \"test_agent\"`,\n\t\t},\n\t\t{\n\t\t\tname: \"err with 2 levels of inner sequential with same name as parent \",\n\t\t\targs: args{\n\t\t\t\tmaxIterations: 0,\n\t\t\t\tsubAgents: []agent.Agent{newCustomAgent(t, 0), newSequentialAgent(t, []agent.Agent{\n\t\t\t\t\tnewSequentialAgent(t, []agent.Agent{newCustomAgent(t, 1), newCustomAgent(t, 2)}, \"test_agent1\"),\n\t\t\t\t}, \"test_agent1\"), newCustomAgent(t, 3)},\n\t\t\t},\n\t\t\twantErr:        true,\n\t\t\twantErrMessage: `failed to create agent tree: agent names must be unique in the agent tree, found duplicate: \"test_agent1\"`,\n\t\t},\n\t\t{\n\t\t\tname: \"err with repeated inner sequential\",\n\t\t\targs: args{\n\t\t\t\tmaxIterations: 0,\n\t\t\t\tsubAgents:     []agent.Agent{newCustomAgent(t, 0), sameAgent, sameAgent, newCustomAgent(t, 3)},\n\t\t\t},\n\t\t\twantErr:        true,\n\t\t\twantErrMessage: `failed to create base agent: error creating agent: subagent \"same_agent\" appears multiple times in subAgents`,\n\t\t},\n\t\t{\n\t\t\tname: \"err with repeated inner sequential in two levels\",\n\t\t\targs: args{\n\t\t\t\tmaxIterations: 0,\n\t\t\t\tsubAgents: []agent.Agent{\n\t\t\t\t\tnewCustomAgent(t, 0), newSequentialAgent(t, []agent.Agent{sameAgent}, \"test_agent1\"),\n\t\t\t\t\tsameAgent, newCustomAgent(t, 3),\n\t\t\t\t},\n\t\t\t},\n\t\t\twantErr:        true,\n\t\t\twantErrMessage: `failed to create agent tree: \"same_agent\" agent cannot have >1 parents, found: \"test_agent1\", \"test_agent\"`,\n\t\t},\n\t}\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tctx := t.Context()\n\n\t\t\tsequentialAgent, err := sequentialagent.New(sequentialagent.Config{\n\t\t\t\tAgentConfig: agent.Config{\n\t\t\t\t\tName:      \"test_agent\",\n\t\t\t\t\tSubAgents: tt.args.subAgents,\n\t\t\t\t},\n\t\t\t})\n\t\t\tif err != nil {\n\t\t\t\tif !tt.wantErr {\n\t\t\t\t\tt.Errorf(\"NewSequentialAgent() error = %v, wantErr %v\", err, tt.wantErr)\n\t\t\t\t}\n\t\t\t\tif diff := cmp.Diff(tt.wantErrMessage, err.Error()); diff != \"\" {\n\t\t\t\t\tt.Errorf(\"err message mismatch (-want +got):\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tvar gotEvents []*session.Event\n\n\t\t\tsessionService := session.InMemoryService()\n\n\t\t\tagentRunner, err := runner.New(runner.Config{\n\t\t\t\tAppName:        \"test_app\",\n\t\t\t\tAgent:          sequentialAgent,\n\t\t\t\tSessionService: sessionService,\n\t\t\t})\n\t\t\tif err != nil {\n\t\t\t\tif !tt.wantErr {\n\t\t\t\t\tt.Fatalf(\"NewSequentialAgent() error = %v, wantErr %v\", err, tt.wantErr)\n\t\t\t\t}\n\t\t\t\tif diff := cmp.Diff(tt.wantErrMessage, err.Error()); diff != \"\" {\n\t\t\t\t\tt.Fatalf(\"err message mismatch (-want +got):\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t_, err = sessionService.Create(ctx, &session.CreateRequest{\n\t\t\t\tAppName:   \"test_app\",\n\t\t\t\tUserID:    \"user_id\",\n\t\t\t\tSessionID: \"session_id\",\n\t\t\t})\n\t\t\tif err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\n\t\t\t// run twice, the second time it will need to determine which agent to use, and we want to get the same result\n\t\t\tgotEvents = make([]*session.Event, 0)\n\t\t\tfor range 2 {\n\t\t\t\tfor event, err := range agentRunner.Run(ctx, \"user_id\", \"session_id\", genai.NewContentFromText(\"user input\", genai.RoleUser), agent.RunConfig{}) {\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tt.Errorf(\"got unexpected error: %v\", err)\n\t\t\t\t\t}\n\n\t\t\t\t\tif tt.args.maxIterations == 0 && len(gotEvents) == len(tt.wantEvents) {\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\n\t\t\t\t\tgotEvents = append(gotEvents, event)\n\t\t\t\t}\n\n\t\t\t\tif len(tt.wantEvents) != len(gotEvents) {\n\t\t\t\t\tt.Fatalf(\"Unexpected event length, got: %v, want: %v\", len(gotEvents), len(tt.wantEvents))\n\t\t\t\t}\n\n\t\t\t\tfor i, gotEvent := range gotEvents {\n\t\t\t\t\ttt.wantEvents[i].Timestamp = gotEvent.Timestamp\n\t\t\t\t\tif diff := cmp.Diff(tt.wantEvents[i], gotEvent, cmpopts.IgnoreFields(session.Event{}, \"ID\", \"Timestamp\", \"InvocationID\")); diff != \"\" {\n\t\t\t\t\t\tt.Errorf(\"event[i] mismatch (-want +got):\\n%s\", diff)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc newCustomAgent(t *testing.T, id int) agent.Agent {\n\tt.Helper()\n\n\ta, err := llmagent.New(llmagent.Config{\n\t\tName:  fmt.Sprintf(\"custom_agent_%v\", id),\n\t\tModel: &FakeLLM{id: id, callCounter: 0},\n\t})\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\treturn a\n}\n\nfunc newSequentialAgent(t *testing.T, subAgents []agent.Agent, name string) agent.Agent {\n\tt.Helper()\n\n\tsequentialAgent, err := sequentialagent.New(sequentialagent.Config{\n\t\tAgentConfig: agent.Config{\n\t\t\tName:      name,\n\t\t\tSubAgents: subAgents,\n\t\t},\n\t})\n\tif err != nil {\n\t\tt.Fatalf(\"NewSequentialAgent() error = %v\", err)\n\t}\n\n\treturn sequentialAgent\n}\n\n// FakeLLM is a mock implementation of model.LLM for testing.\ntype FakeLLM struct {\n\tid          int\n\tcallCounter int\n}\n\nfunc (f *FakeLLM) Name() string {\n\treturn \"fake-llm\"\n}\n\nfunc (f *FakeLLM) GenerateContent(ctx context.Context, req *model.LLMRequest, stream bool) iter.Seq2[*model.LLMResponse, error] {\n\treturn func(yield func(*model.LLMResponse, error) bool) {\n\t\tf.callCounter++\n\n\t\tyield(&model.LLMResponse{\n\t\t\tContent: genai.NewContentFromText(fmt.Sprintf(\"hello %v\", f.id), genai.RoleModel),\n\t\t}, nil)\n\t}\n}\n"
  },
  {
    "path": "artifact/artifact_key_test.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage artifact\n\nimport (\n\t\"testing\"\n\n\t\"github.com/google/go-cmp/cmp\"\n)\n\nfunc TestArtifactKey(t *testing.T) {\n\tkey := artifactKey{\n\t\tAppName:   \"testapp\",\n\t\tUserID:    \"testuser\",\n\t\tSessionID: \"testsession\",\n\t\tFileName:  \"testfile\",\n\t\tVersion:   123,\n\t}\n\tvar key2 artifactKey\n\terr := key2.Decode(key.Encode())\n\tif err != nil {\n\t\tt.Fatalf(\"error decoding key:%s\", err)\n\t}\n\tif diff := cmp.Diff(key, key2); diff != \"\" {\n\t\tt.Errorf(\"key mismatch (-want +got):\\n%s\", diff)\n\t}\n}\n"
  },
  {
    "path": "artifact/gcsartifact/gcs_client.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage gcsartifact\n\nimport (\n\t\"context\"\n\t\"io\"\n\n\t\"cloud.google.com/go/storage\"\n)\n\n// ------------------------ Defining interfaces to enable mocking --------------------------------\n// gcsClient is an interface that a gcs client must satisfy.\ntype gcsClient interface {\n\tbucket(name string) gcsBucket\n}\n\n// gcsBucket is an interface that a gcs bucket handle must satisfy.\ntype gcsBucket interface {\n\tobject(name string) gcsObject\n\tobjects(ctx context.Context, q *storage.Query) gcsObjectIterator\n}\n\n// gcsObject is an interface that a gcs object handle must satisfy.\ntype gcsObject interface {\n\tnewWriter(ctx context.Context) gcsWriter\n\tnewReader(ctx context.Context) (io.ReadCloser, error)\n\tdelete(ctx context.Context) error\n\tattrs(ctx context.Context) (*storage.ObjectAttrs, error)\n}\n\n// gcsObjectIterator\ntype gcsObjectIterator interface {\n\tnext() (*storage.ObjectAttrs, error)\n}\n\n// gcsObjectWriter\ntype gcsWriter interface {\n\tio.Writer // Provides Write(p []byte) (n int, err error)\n\tio.Closer // Provides Close() error\n\tSetContentType(string)\n}\n\n// ---------------------- Wrapper Implementations for Real gcs Types --------------------------------\n// gcsClientWrapper wraps a storage.Client to satisfy the gcsClient interface.\ntype gcsClientWrapper struct {\n\tclient *storage.Client\n}\n\n// Bucket returns a gcsBucketWrapper that satisfies the gcsBucket interface.\nfunc (w *gcsClientWrapper) bucket(name string) gcsBucket {\n\treturn &gcsBucketWrapper{\n\t\tbucket: w.client.Bucket(name),\n\t}\n}\n\n// gcsBucketWrapper wraps a storage.BucketHandle to satisfy the gcsBucket interface.\ntype gcsBucketWrapper struct {\n\tbucket *storage.BucketHandle\n}\n\n// Object returns a gcsObjectWrapper that satisfies the gcsObject interface.\nfunc (w *gcsBucketWrapper) object(name string) gcsObject {\n\tobjectHandle := w.bucket.Object(name)\n\treturn &gcsObjectWrapper{object: objectHandle}\n}\n\n// Objects implements the gcsBucket interface for gcsBucketWrapper.\n// It directly calls the underlying storage.BucketHandle's Objects method.\n// The gcsBucketWrapper returns an implementation of the gcsObjectIterator interface.\nfunc (w *gcsBucketWrapper) objects(ctx context.Context, q *storage.Query) gcsObjectIterator {\n\t// This is the real gcs iterator.\n\trealIterator := w.bucket.Objects(ctx, q)\n\t// We return a wrapper around the real iterator.\n\treturn &gcsObjectIteratorWrapper{iter: realIterator}\n}\n\n// gcsObjectWrapper wraps a storage.ObjectHandle to satisfy the gcsObject interface.\ntype gcsObjectWrapper struct {\n\tobject *storage.ObjectHandle\n}\n\n// NewWriter implements the gcsObject interface for gcsObjectWrapper.\nfunc (w *gcsObjectWrapper) newWriter(ctx context.Context) gcsWriter {\n\treturn &gcsWriterWrapper{w: w.object.NewWriter(ctx)}\n}\n\n// NewReader implements the gcsObject interface for gcsObjectWrapper.\nfunc (w *gcsObjectWrapper) newReader(ctx context.Context) (io.ReadCloser, error) {\n\treturn w.object.NewReader(ctx)\n}\n\n// Delete implements the gcsObject interface for gcsObjectWrapper.\nfunc (w *gcsObjectWrapper) delete(ctx context.Context) error {\n\treturn w.object.Delete(ctx)\n}\n\n// Attrs implements the gcsObject interface for gcsObjectWrapper.\nfunc (w *gcsObjectWrapper) attrs(ctx context.Context) (*storage.ObjectAttrs, error) {\n\treturn w.object.Attrs(ctx)\n}\n\n// Create the wrapper for the real iterator.\ntype gcsObjectIteratorWrapper struct {\n\titer *storage.ObjectIterator\n}\n\nfunc (w *gcsObjectIteratorWrapper) next() (*storage.ObjectAttrs, error) {\n\treturn w.iter.Next()\n}\n\n// gcsWriterWrapper wraps the real gcs writer to satisfy our ObjectWriter interface.\ntype gcsWriterWrapper struct {\n\tw *storage.Writer\n}\n\nfunc (g *gcsWriterWrapper) Write(p []byte) (n int, err error) {\n\treturn g.w.Write(p)\n}\n\nfunc (g *gcsWriterWrapper) Close() error {\n\treturn g.w.Close()\n}\n\nfunc (g *gcsWriterWrapper) SetContentType(cType string) {\n\tg.w.ContentType = cType\n}\n\nvar (\n\t_ gcsClient         = (*gcsClientWrapper)(nil)\n\t_ gcsBucket         = (*gcsBucketWrapper)(nil)\n\t_ gcsObject         = (*gcsObjectWrapper)(nil)\n\t_ gcsObjectIterator = (*gcsObjectIteratorWrapper)(nil)\n\t_ gcsWriter         = (*gcsWriterWrapper)(nil)\n)\n"
  },
  {
    "path": "artifact/gcsartifact/gcs_test.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage gcsartifact\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"io\"\n\t\"io/fs\"\n\t\"strings\"\n\t\"sync\"\n\t\"testing\"\n\t\"time\"\n\n\t\"cloud.google.com/go/storage\"\n\t\"google.golang.org/api/iterator\"\n\n\t\"google.golang.org/adk/artifact\"\n\t\"google.golang.org/adk/internal/artifact/tests\"\n)\n\n// newGCSArtifactServiceForTesting creates a gcsService for the specified bucket using a mocked inmemory client\nfunc newGCSArtifactServiceForTesting(bucketName string) (artifact.Service, error) {\n\tclient := newFakeClient()\n\ts := &gcsService{\n\t\tbucketName:    bucketName,\n\t\tstorageClient: client,\n\t\tbucket:        client.bucket(bucketName),\n\t}\n\treturn s, nil\n}\n\nfunc TestGCSArtifactService(t *testing.T) {\n\tfactory := func(t *testing.T) (artifact.Service, error) {\n\t\treturn newGCSArtifactServiceForTesting(\"new\")\n\t}\n\ttests.TestArtifactService(t, \"GCS\", factory)\n}\n\n// ---------------------------------- Mock Implementations -----------------------------------\n// fakeClient implements the gcsClient interface for testing.\ntype fakeClient struct {\n\tinMemoryBucket gcsBucket\n}\n\nfunc newFakeClient() gcsClient {\n\treturn &fakeClient{\n\t\tinMemoryBucket: &fakeBucket{\n\t\t\tobjectsMap: make(map[string]*fakeObject),\n\t\t},\n\t}\n}\n\n// Bucket returns the singleton in-memory bucket.\nfunc (c *fakeClient) bucket(name string) gcsBucket {\n\treturn c.inMemoryBucket\n}\n\n// fakeBucket implements the gcsBucket interface for testing.\ntype fakeBucket struct {\n\tmu         sync.Mutex\n\tobjectsMap map[string]*fakeObject\n}\n\n// Object returns a fake object from the in-memory store.\nfunc (f *fakeBucket) object(name string) gcsObject {\n\tf.mu.Lock()\n\tdefer f.mu.Unlock()\n\tif _, ok := f.objectsMap[name]; !ok {\n\t\tf.objectsMap[name] = &fakeObject{name: name}\n\t}\n\treturn f.objectsMap[name]\n}\n\n// Objects simulates iterating over objects with a prefix.\nfunc (f *fakeBucket) objects(ctx context.Context, q *storage.Query) gcsObjectIterator {\n\tf.mu.Lock()\n\tdefer f.mu.Unlock()\n\n\tvar matchingObjects []*fakeObject\n\tfor name, obj := range f.objectsMap {\n\t\tif q != nil && q.Prefix != \"\" && !strings.HasPrefix(name, q.Prefix) {\n\t\t\tcontinue\n\t\t}\n\t\tif !obj.deleted {\n\t\t\tmatchingObjects = append(matchingObjects, obj)\n\t\t}\n\t}\n\n\t// This is the key change. We return a custom type that has a `Next` method\n\t// that manages its own state and returns the correct values.\n\treturn &fakeObjectIterator{\n\t\tobjects: matchingObjects,\n\t\tindex:   0,\n\t}\n}\n\n// fakeObject implements the gcsObject interface for testing.\ntype fakeObject struct {\n\tmu          sync.Mutex\n\tname        string\n\tdata        []byte\n\tdeleted     bool\n\tcontentType string\n}\n\n// NewWriter returns a fake writer that stores data in memory.\nfunc (f *fakeObject) newWriter(ctx context.Context) gcsWriter {\n\tf.mu.Lock()\n\tdefer f.mu.Unlock()\n\tf.deleted = false // A write operation \"undeletes\" the object\n\tf.data = nil      // Clear existing data\n\treturn &fakeWriter{obj: f, buffer: &bytes.Buffer{}}\n}\n\n// Attrs returns fake attributes for the object.\nfunc (f *fakeObject) attrs(ctx context.Context) (*storage.ObjectAttrs, error) {\n\tf.mu.Lock()\n\tdefer f.mu.Unlock()\n\tif f.deleted || f.data == nil {\n\t\treturn nil, storage.ErrObjectNotExist\n\t}\n\treturn &storage.ObjectAttrs{Name: f.name, Created: time.Now(), ContentType: f.contentType}, nil\n}\n\n// Delete marks the object as deleted in memory.\nfunc (f *fakeObject) delete(ctx context.Context) error {\n\tf.mu.Lock()\n\tdefer f.mu.Unlock()\n\tf.deleted = true\n\treturn nil\n}\n\n// NewReader returns a reader for the in-memory data.\nfunc (f *fakeObject) newReader(ctx context.Context) (io.ReadCloser, error) {\n\tf.mu.Lock()\n\tdefer f.mu.Unlock()\n\tif f.deleted || f.data == nil {\n\t\treturn nil, fs.ErrNotExist\n\t}\n\treturn io.NopCloser(bytes.NewReader(f.data)), nil\n}\n\n// fakeWriter is a helper type to simulate an *storage.Writer\ntype fakeWriter struct {\n\tobj         *fakeObject\n\tbuffer      *bytes.Buffer\n\tcontentType string\n}\n\nfunc (w *fakeWriter) Write(p []byte) (n int, err error) {\n\treturn w.buffer.Write(p)\n}\n\nfunc (w *fakeWriter) Close() error {\n\tw.obj.mu.Lock()\n\tdefer w.obj.mu.Unlock()\n\tw.obj.data = w.buffer.Bytes()\n\tw.obj.contentType = w.contentType\n\treturn nil\n}\n\n// SetContentType implements the final piece of the interface.\nfunc (w *fakeWriter) SetContentType(cType string) {\n\tw.contentType = cType\n}\n\n// fakeObjectIterator is a fake iterator that returns attributes from a slice.\n// This type is the key to solving the 'unknown field' error.\ntype fakeObjectIterator struct {\n\tobjects []*fakeObject\n\tindex   int\n}\n\n// Next implements the iterator pattern.\n// It returns the next object in the slice or an iterator.Done error.\nfunc (i *fakeObjectIterator) next() (*storage.ObjectAttrs, error) {\n\tif i.index >= len(i.objects) {\n\t\treturn nil, iterator.Done\n\t}\n\tobj := i.objects[i.index]\n\ti.index++\n\treturn &storage.ObjectAttrs{Name: obj.name, ContentType: obj.contentType}, nil\n}\n\nvar (\n\t_ gcsClient         = (*fakeClient)(nil)\n\t_ gcsBucket         = (*fakeBucket)(nil)\n\t_ gcsObject         = (*fakeObject)(nil)\n\t_ gcsObjectIterator = (*fakeObjectIterator)(nil)\n\t_ gcsWriter         = (*fakeWriter)(nil)\n)\n"
  },
  {
    "path": "artifact/gcsartifact/service.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Package gcsartifact provides a Google Cloud Storage (GCS) [artifact.Service].\n//\n// This package allows storing and retrieving artifacts in a GCS bucket.\n// Artifacts are organized by application name, user ID, session ID, and filename,\n// with support for versioning.\npackage gcsartifact\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"io\"\n\t\"io/fs\"\n\t\"maps\"\n\t\"slices\"\n\t\"sort\"\n\t\"strconv\"\n\t\"strings\"\n\n\t\"cloud.google.com/go/storage\"\n\t\"golang.org/x/sync/errgroup\"\n\t\"google.golang.org/api/iterator\"\n\t\"google.golang.org/api/option\"\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/artifact\"\n)\n\n// gcsService is a google cloud storage implementation of the Service.\ntype gcsService struct {\n\tbucketName    string\n\tstorageClient gcsClient\n\tbucket        gcsBucket\n}\n\n// NewService creates a Google Cloud Storage service for the specified bucket.\nfunc NewService(ctx context.Context, bucketName string, opts ...option.ClientOption) (artifact.Service, error) {\n\tstorageClient, err := storage.NewClient(ctx, opts...)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to create gcs service: %w\", err)\n\t}\n\t// Wrap the real client\n\tclientWrapper := &gcsClientWrapper{client: storageClient}\n\ts := &gcsService{\n\t\tbucketName:    bucketName,\n\t\tstorageClient: clientWrapper,\n\t\tbucket:        clientWrapper.bucket(bucketName),\n\t}\n\treturn s, nil\n}\n\n// fileHasUserNamespace checks if a filename indicates a user-namespaced blob.\nfunc fileHasUserNamespace(filename string) bool {\n\treturn strings.HasPrefix(filename, \"user:\")\n}\n\n// buildBlobName constructs the blob name in GCS.\nfunc buildBlobName(appName, userID, sessionID, fileName string, version int64) string {\n\tif fileHasUserNamespace(fileName) {\n\t\treturn fmt.Sprintf(\"%s/%s/user/%s/%d\", appName, userID, fileName, version)\n\t}\n\treturn fmt.Sprintf(\"%s/%s/%s/%s/%d\", appName, userID, sessionID, fileName, version)\n}\n\nfunc buildBlobNamePrefix(appName, userID, sessionID, fileName string) string {\n\tif fileHasUserNamespace(fileName) {\n\t\treturn fmt.Sprintf(\"%s/%s/user/%s/\", appName, userID, fileName)\n\t}\n\treturn fmt.Sprintf(\"%s/%s/%s/%s/\", appName, userID, sessionID, fileName)\n}\n\nfunc buildSessionPrefix(appName, userID, sessionID string) string {\n\treturn fmt.Sprintf(\"%s/%s/%s/\", appName, userID, sessionID)\n}\n\nfunc buildUserPrefix(appName, userID string) string {\n\treturn fmt.Sprintf(\"%s/%s/user/\", appName, userID)\n}\n\n// Save implements [artifact.Service]\nfunc (s *gcsService) Save(ctx context.Context, req *artifact.SaveRequest) (_ *artifact.SaveResponse, err error) {\n\terr = req.Validate()\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"request validation failed: %w\", err)\n\t}\n\tappName, userID, sessionID, fileName := req.AppName, req.UserID, req.SessionID, req.FileName\n\tnewArtifact := req.Part\n\n\tnextVersion := int64(1)\n\n\t// TODO race condition, could use mutex but it's a remote resource so the issue would still occurs\n\t// with multiple consumers, and gcs does not have transactions spanning several operations\n\tresponse, err := s.versions(ctx, &artifact.VersionsRequest{\n\t\tAppName: req.AppName, UserID: req.UserID, SessionID: req.SessionID, FileName: req.FileName,\n\t})\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to list artifact versions: %w\", err)\n\t}\n\tif len(response.Versions) > 0 {\n\t\tnextVersion = slices.Max(response.Versions) + 1\n\t}\n\n\tblobName := buildBlobName(appName, userID, sessionID, fileName, nextVersion)\n\twriter := s.bucket.object(blobName).newWriter(ctx)\n\tdefer func() {\n\t\tif closeErr := writer.Close(); closeErr != nil && err == nil {\n\t\t\terr = fmt.Errorf(\"failed to close blob writer: %w\", closeErr)\n\t\t}\n\t}()\n\n\tif newArtifact.InlineData != nil {\n\t\twriter.SetContentType(newArtifact.InlineData.MIMEType)\n\t\tif _, err := writer.Write(newArtifact.InlineData.Data); err != nil {\n\t\t\treturn nil, fmt.Errorf(\"failed to write blob to GCS: %w\", err)\n\t\t}\n\t} else {\n\t\twriter.SetContentType(\"text/plain\")\n\t\tif _, err := writer.Write([]byte(newArtifact.Text)); err != nil {\n\t\t\treturn nil, fmt.Errorf(\"failed to write text to GCS: %w\", err)\n\t\t}\n\t}\n\n\treturn &artifact.SaveResponse{Version: nextVersion}, nil\n}\n\n// Delete implements [artifact.Service]\nfunc (s *gcsService) Delete(ctx context.Context, req *artifact.DeleteRequest) error {\n\terr := req.Validate()\n\tif err != nil {\n\t\treturn fmt.Errorf(\"request validation failed: %w\", err)\n\t}\n\tappName, userID, sessionID, fileName := req.AppName, req.UserID, req.SessionID, req.FileName\n\tversion := req.Version\n\n\t// Delete specific version\n\tif version != 0 {\n\t\tblobName := buildBlobName(appName, userID, sessionID, fileName, version)\n\t\tif err := s.bucket.object(blobName).delete(ctx); err != nil {\n\t\t\treturn fmt.Errorf(\"failed to delete artifact: %w\", err)\n\t\t}\n\t\treturn nil\n\t}\n\n\t// Delete all versions\n\tresponse, err := s.versions(ctx, &artifact.VersionsRequest{\n\t\tAppName: req.AppName, UserID: req.UserID, SessionID: req.SessionID, FileName: req.FileName,\n\t})\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to fetch versions on delete artifact: %w\", err)\n\t}\n\n\tg, gctx := errgroup.WithContext(ctx)\n\n\t// delete versions in parallel\n\tfor _, version := range response.Versions {\n\t\tv := version // capture loop variable for goroutine\n\n\t\tg.Go(func() error {\n\t\t\tblobName := buildBlobName(appName, userID, sessionID, fileName, v)\n\t\t\tobj := s.bucket.object(blobName)\n\t\t\tif err := obj.delete(gctx); err != nil {\n\t\t\t\treturn fmt.Errorf(\"failed to delete artifact %s: %w\", blobName, err)\n\t\t\t}\n\t\t\treturn nil // nil error indicates success for this goroutine\n\t\t})\n\t}\n\n\treturn g.Wait()\n}\n\n// Load implements [artifact.Service]\nfunc (s *gcsService) Load(ctx context.Context, req *artifact.LoadRequest) (_ *artifact.LoadResponse, err error) {\n\terr = req.Validate()\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"request validation failed: %w\", err)\n\t}\n\tappName, userID, sessionID, fileName := req.AppName, req.UserID, req.SessionID, req.FileName\n\tversion := req.Version\n\n\tif version == 0 {\n\t\tresponse, err := s.versions(ctx, &artifact.VersionsRequest{\n\t\t\tAppName: req.AppName, UserID: req.UserID, SessionID: req.SessionID, FileName: req.FileName,\n\t\t})\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"failed to list artifact versions: %w\", err)\n\t\t}\n\t\tif len(response.Versions) == 0 {\n\t\t\treturn nil, fmt.Errorf(\"artifact not found: %w\", fs.ErrNotExist)\n\t\t}\n\t\tversion = slices.Max(response.Versions)\n\t}\n\n\tblobName := buildBlobName(appName, userID, sessionID, fileName, version)\n\tblob := s.bucket.object(blobName)\n\n\t// Check if the blob exists before trying to read it\n\tattrs, err := blob.attrs(ctx)\n\tif err != nil {\n\t\tif err == storage.ErrObjectNotExist {\n\t\t\treturn nil, fmt.Errorf(\"artifact '%s' not found: %w\", blobName, fs.ErrNotExist)\n\t\t}\n\t\treturn nil, fmt.Errorf(\"could not get blob attributes: %w\", err)\n\t}\n\n\t// Create a reader to stream the blob's content\n\treader, err := blob.newReader(ctx)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"could not create reader for blob '%s': %w\", blobName, err)\n\t}\n\tdefer func() {\n\t\tif closeErr := reader.Close(); closeErr != nil && err == nil {\n\t\t\terr = fmt.Errorf(\"failed to close blob reader: %w\", closeErr)\n\t\t}\n\t}()\n\n\t// Read all the content into a byte slice\n\tdata, err := io.ReadAll(reader)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"could not read data from blob '%s': %w\", blobName, err)\n\t}\n\n\t// Create the genai.Part and return the response.\n\tpart := genai.NewPartFromBytes(data, attrs.ContentType)\n\n\treturn &artifact.LoadResponse{Part: part}, nil\n}\n\n// fetchFilenamesFromPrefix is a reusable helper function.\nfunc (s *gcsService) fetchFilenamesFromPrefix(ctx context.Context, prefix string, filenamesSet map[string]bool) error {\n\t// Add a guard clause to prevent a panic if a nil map is passed.\n\tif filenamesSet == nil {\n\t\treturn fmt.Errorf(\"filenamesSet cannot be nil\")\n\t}\n\n\tquery := &storage.Query{\n\t\tPrefix: prefix,\n\t}\n\t// Only fill the attribute Name of the blob, the other attributes will have defaults.\n\terr := query.SetAttrSelection([]string{\"Name\"})\n\tif err != nil {\n\t\treturn fmt.Errorf(\"error setting query attribute selection: %w\", err)\n\t}\n\tblobsIterator := s.bucket.objects(ctx, query)\n\n\tfor {\n\t\tblob, err := blobsIterator.next()\n\t\tif err == iterator.Done {\n\t\t\tbreak\n\t\t}\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"error iterating blobs: %w\", err)\n\t\t}\n\t\tsegments := strings.Split(blob.Name, \"/\")\n\t\tif len(segments) < 2 {\n\t\t\treturn fmt.Errorf(\"error iterating blobs: incorrect number of segments in path %q\", blob.Name)\n\t\t}\n\t\t// Extract filename from path: appName/userId/sessionId/filename/version or appName/userId/user/filename/version\n\t\t// Note: filenames with path separators are rejected during validation (see service.go Validate methods)\n\t\tfilename := segments[len(segments)-2]\n\t\tfilenamesSet[filename] = true\n\t}\n\n\treturn nil\n}\n\n// List implements [artifact.Service]\nfunc (s *gcsService) List(ctx context.Context, req *artifact.ListRequest) (*artifact.ListResponse, error) {\n\terr := req.Validate()\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"request validation failed: %w\", err)\n\t}\n\tappName, userID, sessionID := req.AppName, req.UserID, req.SessionID\n\tfilenamesSet := map[string]bool{}\n\n\t// Fetch filenames for the session.\n\terr = s.fetchFilenamesFromPrefix(ctx, buildSessionPrefix(appName, userID, sessionID), filenamesSet)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to fetch session filenames: %w\", err)\n\t}\n\n\t// Fetch filenames for the user.\n\terr = s.fetchFilenamesFromPrefix(ctx, buildUserPrefix(appName, userID), filenamesSet)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to fetch user filenames: %w\", err)\n\t}\n\n\tfilenames := slices.Collect(maps.Keys(filenamesSet))\n\tsort.Strings(filenames)\n\treturn &artifact.ListResponse{FileNames: filenames}, nil\n}\n\n// versions internal function that does not return error if versions are empty\nfunc (s *gcsService) versions(ctx context.Context, req *artifact.VersionsRequest) (*artifact.VersionsResponse, error) {\n\terr := req.Validate()\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"request validation failed: %w\", err)\n\t}\n\tappName, userID, sessionID, fileName := req.AppName, req.UserID, req.SessionID, req.FileName\n\n\tprefix := buildBlobNamePrefix(appName, userID, sessionID, fileName)\n\tquery := &storage.Query{\n\t\tPrefix: prefix,\n\t}\n\tblobsIterator := s.bucket.objects(ctx, query)\n\n\tversions := make([]int64, 0)\n\tfor {\n\t\tblob, err := blobsIterator.next()\n\t\tif err == iterator.Done {\n\t\t\tbreak\n\t\t}\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"error iterating blobs: %w\", err)\n\t\t}\n\t\tsegments := strings.Split(blob.Name, \"/\")\n\t\tif len(segments) < 1 {\n\t\t\treturn nil, fmt.Errorf(\"error iterating blobs: incorrect number of segments in path %q\", blob.Name)\n\t\t}\n\t\tversion, err := strconv.ParseInt(segments[len(segments)-1], 10, 64)\n\t\t// if the file version is not convertible to number, just ignore it\n\t\tif err != nil {\n\t\t\tcontinue\n\t\t}\n\t\tversions = append(versions, version)\n\t}\n\treturn &artifact.VersionsResponse{Versions: versions}, nil\n}\n\n// Versions implements [artifact.Service] and returns an error if no versions are found.\nfunc (s *gcsService) Versions(ctx context.Context, req *artifact.VersionsRequest) (*artifact.VersionsResponse, error) {\n\tresponse, err := s.versions(ctx, req)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif len(response.Versions) == 0 {\n\t\treturn nil, fmt.Errorf(\"artifact not found: %w\", fs.ErrNotExist)\n\t}\n\treturn response, nil\n}\n"
  },
  {
    "path": "artifact/inmemory.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage artifact\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"io/fs\"\n\t\"iter\"\n\t\"maps\"\n\t\"math\"\n\t\"slices\"\n\t\"sort\"\n\t\"strings\"\n\t\"sync\"\n\n\t\"google.golang.org/genai\"\n\t\"rsc.io/omap\"\n\t\"rsc.io/ordered\"\n)\n\n// inMemoryService is an in-memory implementation of the Service.\n// It is primarily for testing and demonstration purposes.\ntype inMemoryService struct {\n\tmu sync.RWMutex\n\t// ordered(appName, userID, sessionID) -> session\n\tartifacts omap.Map[string, *genai.Part]\n}\n\n// InMemoryService returns a new in-memory artifact service.\nfunc InMemoryService() Service {\n\treturn &inMemoryService{}\n}\n\n// fileHasUserNamespace checks if a filename indicates a user scoped artifact.\nfunc fileHasUserNamespace(filename string) bool {\n\treturn strings.HasPrefix(filename, \"user:\")\n}\n\n// userScopedArtifactKey defines the string for the part of the path used by user scope files\n// this key is used to store user artifacts within user namespace (available to all sessions for given app+user_id)\nconst userScopedArtifactKey = \"user\"\n\ntype artifactKey struct {\n\tAppName   string\n\tUserID    string\n\tSessionID string\n\tFileName  string\n\tVersion   int64\n}\n\n// Encode encodes the artifactKey into a string.\nfunc (ak artifactKey) Encode() string {\n\treturn string(ordered.Encode(ak.AppName, ak.UserID, ak.SessionID, ak.FileName, ordered.Rev(ak.Version)))\n}\n\n// Decode decodes the string key into an artifactKey.\nfunc (ak *artifactKey) Decode(key string) error {\n\tvar v ordered.Reverse[int64]\n\terr := ordered.Decode([]byte(key), &ak.AppName, &ak.UserID, &ak.SessionID, &ak.FileName, &v)\n\tif err != nil {\n\t\treturn err\n\t}\n\tak.Version = v.Value()\n\treturn nil\n}\n\n// scan returns an iterator over all key-value pairs\n// in the range begin ≤ key ≤ end.\n// TODO: add a concurrent tests.\nfunc (s *inMemoryService) scan(lo, hi string) iter.Seq2[artifactKey, *genai.Part] {\n\treturn func(yield func(key artifactKey, val *genai.Part) bool) {\n\t\tfor k, val := range s.artifacts.Scan(lo, hi) {\n\t\t\tvar key artifactKey\n\t\t\tif err := key.Decode(k); err != nil {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tif !yield(key, val) {\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc (s *inMemoryService) find(appName, userID, sessionID, fileName string) (int64, *genai.Part, bool) {\n\tlo := artifactKey{AppName: appName, UserID: userID, SessionID: sessionID, FileName: fileName, Version: math.MaxInt64}.Encode()\n\thi := artifactKey{AppName: appName, UserID: userID, SessionID: sessionID, FileName: fileName, Version: 0}.Encode()\n\tfor key, val := range s.scan(lo, hi) {\n\t\t// first key is the latest one.\n\t\treturn key.Version, val, true\n\t}\n\treturn 0, nil, false\n}\n\nfunc (s *inMemoryService) get(appName, userID, sessionID, fileName string, version int64) (*genai.Part, bool) {\n\tkey := artifactKey{\n\t\tAppName:   appName,\n\t\tUserID:    userID,\n\t\tSessionID: sessionID,\n\t\tFileName:  fileName,\n\t\tVersion:   version,\n\t}.Encode()\n\treturn s.artifacts.Get(key)\n}\n\nfunc (s *inMemoryService) set(appName, userID, sessionID, fileName string, version int64, artifact *genai.Part) {\n\tkey := artifactKey{\n\t\tAppName:   appName,\n\t\tUserID:    userID,\n\t\tSessionID: sessionID,\n\t\tFileName:  fileName,\n\t\tVersion:   version,\n\t}.Encode()\n\ts.artifacts.Set(key, artifact)\n}\n\nfunc (s *inMemoryService) delete(appName, userID, sessionID, fileName string, version int64) {\n\tkey := artifactKey{\n\t\tAppName:   appName,\n\t\tUserID:    userID,\n\t\tSessionID: sessionID,\n\t\tFileName:  fileName,\n\t\tVersion:   version,\n\t}.Encode()\n\ts.artifacts.Delete(key)\n}\n\n// Save implements [artifact.Service]\nfunc (s *inMemoryService) Save(ctx context.Context, req *SaveRequest) (*SaveResponse, error) {\n\terr := req.Validate()\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"request validation failed: %w\", err)\n\t}\n\tappName, userID, sessionID, fileName := req.AppName, req.UserID, req.SessionID, req.FileName\n\tartifact := req.Part\n\t// If file is user scoped, store it under user scope path\n\tif fileHasUserNamespace(fileName) {\n\t\tsessionID = userScopedArtifactKey\n\t}\n\n\ts.mu.Lock()\n\tdefer s.mu.Unlock()\n\n\tnextVersion := int64(1)\n\tif internalVer, _, ok := s.find(appName, userID, sessionID, fileName); ok {\n\t\tnextVersion = internalVer + 1\n\t}\n\ts.set(appName, userID, sessionID, fileName, nextVersion, artifact)\n\treturn &SaveResponse{Version: nextVersion}, nil\n}\n\n// Delete implements [artifact.Service]\nfunc (s *inMemoryService) Delete(ctx context.Context, req *DeleteRequest) error {\n\terr := req.Validate()\n\tif err != nil {\n\t\treturn fmt.Errorf(\"request validation failed: %w\", err)\n\t}\n\tappName, userID, sessionID, fileName := req.AppName, req.UserID, req.SessionID, req.FileName\n\tversion := req.Version\n\t// If file is user scoped, adjust artifactKey part\n\tif fileHasUserNamespace(fileName) {\n\t\tsessionID = userScopedArtifactKey\n\t}\n\n\ts.mu.Lock()\n\tdefer s.mu.Unlock()\n\n\tif version != 0 {\n\t\ts.delete(appName, userID, sessionID, fileName, version)\n\t\treturn nil\n\t}\n\n\t// pick the latest version\n\tlo := artifactKey{AppName: appName, UserID: userID, SessionID: sessionID, FileName: fileName, Version: math.MaxInt64}.Encode()\n\thi := artifactKey{AppName: appName, UserID: userID, SessionID: sessionID, FileName: fileName}.Encode()\n\ts.artifacts.DeleteRange(lo, hi)\n\treturn nil\n}\n\n// Load implements [artifact.Service]\nfunc (s *inMemoryService) Load(ctx context.Context, req *LoadRequest) (*LoadResponse, error) {\n\terr := req.Validate()\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"request validation failed: %w\", err)\n\t}\n\tappName, userID, sessionID, fileName := req.AppName, req.UserID, req.SessionID, req.FileName\n\tversion := req.Version\n\t// If file is user scoped, adjust artifactKey part\n\tif fileHasUserNamespace(fileName) {\n\t\tsessionID = userScopedArtifactKey\n\t}\n\n\ts.mu.RLock()\n\tdefer s.mu.RUnlock()\n\n\tif version > 0 {\n\t\tartifact, ok := s.get(appName, userID, sessionID, fileName, version)\n\t\tif !ok {\n\t\t\treturn nil, fmt.Errorf(\"artifact not found: %w\", fs.ErrNotExist)\n\t\t}\n\t\treturn &LoadResponse{Part: artifact}, nil\n\t}\n\t// pick the latest version\n\t_, artifact, ok := s.find(appName, userID, sessionID, fileName)\n\tif !ok {\n\t\treturn nil, fmt.Errorf(\"artifact not found: %w\", fs.ErrNotExist)\n\t}\n\treturn &LoadResponse{Part: artifact}, nil\n}\n\n// List implements [artifact.Service]\nfunc (s *inMemoryService) List(ctx context.Context, req *ListRequest) (*ListResponse, error) {\n\terr := req.Validate()\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"request validation failed: %w\", err)\n\t}\n\tappName, userID, sessionID := req.AppName, req.UserID, req.SessionID\n\ts.mu.RLock()\n\tdefer s.mu.RUnlock()\n\n\tfiles := map[string]bool{}\n\tlo := artifactKey{AppName: appName, UserID: userID, SessionID: sessionID}.Encode()\n\thi := artifactKey{AppName: appName, UserID: userID, SessionID: sessionID + \"\\x00\"}.Encode()\n\t// TODO(hyangah): extend omap to search key only and skip value decoding.\n\tfor key := range s.scan(lo, hi) {\n\t\tif key.SessionID != sessionID { // scan includes key matching `hi`\n\t\t\tcontinue\n\t\t}\n\t\tfiles[key.FileName] = true\n\t}\n\n\t// Besides the session specific artifacts, also retrieve user scoped artifacts.\n\tuserScopeLo := artifactKey{AppName: appName, UserID: userID, SessionID: userScopedArtifactKey}.Encode()\n\tuserScopeHi := artifactKey{AppName: appName, UserID: userID, SessionID: userScopedArtifactKey + \"\\x00\"}.Encode()\n\t// TODO: extend omap to search key only and skip value decoding.\n\tfor key := range s.scan(userScopeLo, userScopeHi) {\n\t\tif key.SessionID != userScopedArtifactKey { // scan includes key matching `userScopeHi`\n\t\t\tcontinue\n\t\t}\n\t\tfiles[key.FileName] = true\n\t}\n\n\tfilenames := slices.Collect(maps.Keys(files))\n\tsort.Strings(filenames)\n\treturn &ListResponse{FileNames: filenames}, nil\n}\n\n// Versions implements [artifact.Service] and returns an error if no versions are found.\nfunc (s *inMemoryService) Versions(ctx context.Context, req *VersionsRequest) (*VersionsResponse, error) {\n\terr := req.Validate()\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"request validation failed: %w\", err)\n\t}\n\tappName, userID, sessionID, fileName := req.AppName, req.UserID, req.SessionID, req.FileName\n\tif fileHasUserNamespace(fileName) {\n\t\tsessionID = userScopedArtifactKey\n\t}\n\n\ts.mu.RLock()\n\tdefer s.mu.RUnlock()\n\n\tvar versions []int64\n\tlo := artifactKey{AppName: appName, UserID: userID, SessionID: sessionID, FileName: fileName, Version: math.MaxInt64}.Encode()\n\thi := artifactKey{AppName: appName, UserID: userID, SessionID: sessionID, FileName: fileName}.Encode()\n\t// TODO(hyangah): extend omap to search key only and skip value decoding.\n\tfor key := range s.scan(lo, hi) {\n\t\tversions = append(versions, key.Version)\n\t}\n\tif len(versions) == 0 {\n\t\treturn nil, fmt.Errorf(\"artifact not found: %w\", fs.ErrNotExist)\n\t}\n\treturn &VersionsResponse{Versions: versions}, nil\n}\n\nvar _ Service = (*inMemoryService)(nil)\n"
  },
  {
    "path": "artifact/inmemory_test.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage artifact_test\n\nimport (\n\t\"testing\"\n\n\t\"google.golang.org/adk/artifact\"\n\t\"google.golang.org/adk/internal/artifact/tests\"\n)\n\nfunc TestInMemoryArtifactService(t *testing.T) {\n\tfactory := func(t *testing.T) (artifact.Service, error) {\n\t\treturn artifact.InMemoryService(), nil\n\t}\n\ttests.TestArtifactService(t, \"InMemory\", factory)\n}\n"
  },
  {
    "path": "artifact/request_validation_test.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage artifact\n\nimport (\n\t\"fmt\"\n\t\"reflect\"\n\t\"testing\"\n\n\t\"google.golang.org/genai\"\n)\n\n// Validator describes a type that can validate itself.\ntype Validator interface {\n\tValidate() error\n}\n\ntype ValidatorTestCase struct {\n\tname       string\n\treq        Validator\n\twantErr    bool\n\twantErrMsg string\n}\n\n// Test suite for the SaveRequest Validate method\nfunc TestSaveRequest_Validate(t *testing.T) {\n\t// Define test cases\n\ttestCases := []ValidatorTestCase{\n\t\t{\n\t\t\tname: \"Valid request from bytes\",\n\t\t\treq: &SaveRequest{\n\t\t\t\tAppName:   \"MyApp\",\n\t\t\t\tUserID:    \"user-123\",\n\t\t\t\tSessionID: \"sess-abc\",\n\t\t\t\tFileName:  \"file.txt\",\n\t\t\t\tPart:      genai.NewPartFromBytes([]byte(\"data\"), \"text/plain\"),\n\t\t\t},\n\t\t\twantErr: false,\n\t\t},\n\t\t{\n\t\t\tname: \"Valid request from text\",\n\t\t\treq: &SaveRequest{\n\t\t\t\tAppName:   \"MyApp\",\n\t\t\t\tUserID:    \"user-123\",\n\t\t\t\tSessionID: \"sess-abc\",\n\t\t\t\tFileName:  \"file.txt\",\n\t\t\t\tPart:      genai.NewPartFromText(\"data\"),\n\t\t\t},\n\t\t\twantErr: false,\n\t\t},\n\t\t{\n\t\t\tname: \"Missing AppName\",\n\t\t\treq: &SaveRequest{\n\t\t\t\tUserID:    \"user-123\",\n\t\t\t\tSessionID: \"sess-abc\",\n\t\t\t\tFileName:  \"file.txt\",\n\t\t\t\tPart:      genai.NewPartFromBytes([]byte(\"data\"), \"text/plain\"),\n\t\t\t},\n\t\t\twantErr:    true,\n\t\t\twantErrMsg: \"invalid save request: missing required fields: AppName\",\n\t\t},\n\t\t{\n\t\t\tname: \"Missing multiple fields\",\n\t\t\treq: &SaveRequest{\n\t\t\t\tAppName: \"MyApp\",\n\t\t\t\tPart:    genai.NewPartFromBytes([]byte(\"data\"), \"text/plain\"),\n\t\t\t},\n\t\t\twantErr:    true,\n\t\t\twantErrMsg: \"invalid save request: missing required fields: UserID, SessionID, FileName\",\n\t\t},\n\t\t{\n\t\t\tname: \"Missing Part (nil slice)\",\n\t\t\treq: &SaveRequest{\n\t\t\t\tAppName:   \"MyApp\",\n\t\t\t\tUserID:    \"user-123\",\n\t\t\t\tSessionID: \"sess-abc\",\n\t\t\t\tFileName:  \"file.txt\",\n\t\t\t\tPart:      nil,\n\t\t\t},\n\t\t\twantErr:    true,\n\t\t\twantErrMsg: \"invalid save request: missing required fields: Part\",\n\t\t},\n\t\t{\n\t\t\tname: \"Missing Part.Inline (nil slice)\",\n\t\t\treq: &SaveRequest{\n\t\t\t\tAppName:   \"MyApp\",\n\t\t\t\tUserID:    \"user-123\",\n\t\t\t\tSessionID: \"sess-abc\",\n\t\t\t\tFileName:  \"file.txt\",\n\t\t\t\tPart:      genai.NewPartFromFunctionCall(\"example\", nil),\n\t\t\t},\n\t\t\twantErr:    true,\n\t\t\twantErrMsg: \"invalid save request: Part.InlineData or Part.Text has to be set\",\n\t\t},\n\t\t{\n\t\t\tname:       \"Completely empty request\",\n\t\t\treq:        &SaveRequest{},\n\t\t\twantErr:    true,\n\t\t\twantErrMsg: \"invalid save request: missing required fields: AppName, UserID, SessionID, FileName, Part\",\n\t\t},\n\t\t{\n\t\t\tname: \"FileName with path separator\",\n\t\t\treq: &SaveRequest{\n\t\t\t\tAppName:   \"MyApp\",\n\t\t\t\tUserID:    \"user-123\",\n\t\t\t\tSessionID: \"sess-abc\",\n\t\t\t\tFileName:  \"path/to/file.txt\",\n\t\t\t\tPart:      genai.NewPartFromBytes([]byte(\"data\"), \"text/plain\"),\n\t\t\t},\n\t\t\twantErr:    true,\n\t\t\twantErrMsg: \"invalid name: filename cannot contain path separators\",\n\t\t},\n\t}\n\texecuteValidatorTestCases(t, \"SaveRequest\", testCases)\n}\n\n// Test suite for the LoadRequest Validate method\nfunc TestLoadRequest_Validate(t *testing.T) {\n\t// Define test cases\n\ttestCases := []ValidatorTestCase{\n\t\t{\n\t\t\tname: \"Valid request\",\n\t\t\treq: &LoadRequest{\n\t\t\t\tAppName:   \"MyApp\",\n\t\t\t\tUserID:    \"user-123\",\n\t\t\t\tSessionID: \"sess-abc\",\n\t\t\t\tFileName:  \"file.txt\",\n\t\t\t},\n\t\t\twantErr: false,\n\t\t},\n\t\t{\n\t\t\tname: \"Missing AppName\",\n\t\t\treq: &LoadRequest{\n\t\t\t\tUserID:    \"user-123\",\n\t\t\t\tSessionID: \"sess-abc\",\n\t\t\t\tFileName:  \"file.txt\",\n\t\t\t},\n\t\t\twantErr:    true,\n\t\t\twantErrMsg: \"invalid load request: missing required fields: AppName\",\n\t\t},\n\t\t{\n\t\t\tname: \"Missing multiple fields\",\n\t\t\treq: &LoadRequest{\n\t\t\t\tAppName: \"MyApp\",\n\t\t\t},\n\t\t\twantErr:    true,\n\t\t\twantErrMsg: \"invalid load request: missing required fields: UserID, SessionID, FileName\",\n\t\t},\n\t\t{\n\t\t\tname:       \"Completely empty request\",\n\t\t\treq:        &LoadRequest{},\n\t\t\twantErr:    true,\n\t\t\twantErrMsg: \"invalid load request: missing required fields: AppName, UserID, SessionID, FileName\",\n\t\t},\n\t\t{\n\t\t\tname: \"FileName with path separator\",\n\t\t\treq: &LoadRequest{\n\t\t\t\tAppName:   \"MyApp\",\n\t\t\t\tUserID:    \"user-123\",\n\t\t\t\tSessionID: \"sess-abc\",\n\t\t\t\tFileName:  \"a/b.txt\",\n\t\t\t},\n\t\t\twantErr:    true,\n\t\t\twantErrMsg: \"invalid name: filename cannot contain path separators\",\n\t\t},\n\t}\n\texecuteValidatorTestCases(t, \"LoadRequest\", testCases)\n}\n\n// Test suite for the DeleteRequest Validate method\nfunc TestDeleteRequest_Validate(t *testing.T) {\n\t// Define test cases\n\ttestCases := []ValidatorTestCase{\n\t\t{\n\t\t\tname: \"Valid request\",\n\t\t\treq: &DeleteRequest{\n\t\t\t\tAppName:   \"MyApp\",\n\t\t\t\tUserID:    \"user-123\",\n\t\t\t\tSessionID: \"sess-abc\",\n\t\t\t\tFileName:  \"file.txt\",\n\t\t\t},\n\t\t\twantErr: false,\n\t\t},\n\t\t{\n\t\t\tname: \"Missing AppName\",\n\t\t\treq: &DeleteRequest{\n\t\t\t\tUserID:    \"user-123\",\n\t\t\t\tSessionID: \"sess-abc\",\n\t\t\t\tFileName:  \"file.txt\",\n\t\t\t},\n\t\t\twantErr:    true,\n\t\t\twantErrMsg: \"invalid delete request: missing required fields: AppName\",\n\t\t},\n\t\t{\n\t\t\tname: \"Missing multiple fields\",\n\t\t\treq: &DeleteRequest{\n\t\t\t\tAppName: \"MyApp\",\n\t\t\t},\n\t\t\twantErr:    true,\n\t\t\twantErrMsg: \"invalid delete request: missing required fields: UserID, SessionID, FileName\",\n\t\t},\n\t\t{\n\t\t\tname:       \"Completely empty request\",\n\t\t\treq:        &DeleteRequest{},\n\t\t\twantErr:    true,\n\t\t\twantErrMsg: \"invalid delete request: missing required fields: AppName, UserID, SessionID, FileName\",\n\t\t},\n\t\t{\n\t\t\tname: \"FileName with path separator\",\n\t\t\treq: &DeleteRequest{\n\t\t\t\tAppName:   \"MyApp\",\n\t\t\t\tUserID:    \"user-123\",\n\t\t\t\tSessionID: \"sess-abc\",\n\t\t\t\tFileName:  \"dir/file.txt\",\n\t\t\t},\n\t\t\twantErr:    true,\n\t\t\twantErrMsg: \"invalid name: filename cannot contain path separators\",\n\t\t},\n\t}\n\texecuteValidatorTestCases(t, \"DeleteRequest\", testCases)\n}\n\n// Test suite for the ListRequest Validate method\nfunc TestListRequest_Validate(t *testing.T) {\n\t// Define test cases\n\ttestCases := []ValidatorTestCase{\n\t\t{\n\t\t\tname: \"Valid request\",\n\t\t\treq: &ListRequest{\n\t\t\t\tAppName:   \"MyApp\",\n\t\t\t\tUserID:    \"user-123\",\n\t\t\t\tSessionID: \"sess-abc\",\n\t\t\t},\n\t\t\twantErr: false,\n\t\t},\n\t\t{\n\t\t\tname: \"Missing AppName\",\n\t\t\treq: &ListRequest{\n\t\t\t\tUserID:    \"user-123\",\n\t\t\t\tSessionID: \"sess-abc\",\n\t\t\t},\n\t\t\twantErr:    true,\n\t\t\twantErrMsg: \"invalid list request: missing required fields: AppName\",\n\t\t},\n\t\t{\n\t\t\tname: \"Missing multiple fields\",\n\t\t\treq: &ListRequest{\n\t\t\t\tAppName: \"MyApp\",\n\t\t\t},\n\t\t\twantErr:    true,\n\t\t\twantErrMsg: \"invalid list request: missing required fields: UserID, SessionID\",\n\t\t},\n\t\t{\n\t\t\tname:       \"Completely empty request\",\n\t\t\treq:        &ListRequest{},\n\t\t\twantErr:    true,\n\t\t\twantErrMsg: \"invalid list request: missing required fields: AppName, UserID, SessionID\",\n\t\t},\n\t}\n\texecuteValidatorTestCases(t, \"ListRequest\", testCases)\n}\n\n// Test suite for the VersionsRequest Validate method\nfunc TestVersionsRequest_Validate(t *testing.T) {\n\t// Define test cases\n\ttestCases := []ValidatorTestCase{\n\t\t{\n\t\t\tname: \"Valid request\",\n\t\t\treq: &VersionsRequest{\n\t\t\t\tAppName:   \"MyApp\",\n\t\t\t\tUserID:    \"user-123\",\n\t\t\t\tSessionID: \"sess-abc\",\n\t\t\t\tFileName:  \"file.txt\",\n\t\t\t},\n\t\t\twantErr: false,\n\t\t},\n\t\t{\n\t\t\tname: \"Missing AppName\",\n\t\t\treq: &VersionsRequest{\n\t\t\t\tUserID:    \"user-123\",\n\t\t\t\tSessionID: \"sess-abc\",\n\t\t\t\tFileName:  \"file.txt\",\n\t\t\t},\n\t\t\twantErr:    true,\n\t\t\twantErrMsg: \"invalid versions request: missing required fields: AppName\",\n\t\t},\n\t\t{\n\t\t\tname: \"Missing multiple fields\",\n\t\t\treq: &VersionsRequest{\n\t\t\t\tAppName: \"MyApp\",\n\t\t\t},\n\t\t\twantErr:    true,\n\t\t\twantErrMsg: \"invalid versions request: missing required fields: UserID, SessionID, FileName\",\n\t\t},\n\t\t{\n\t\t\tname:       \"Completely empty request\",\n\t\t\treq:        &VersionsRequest{},\n\t\t\twantErr:    true,\n\t\t\twantErrMsg: \"invalid versions request: missing required fields: AppName, UserID, SessionID, FileName\",\n\t\t},\n\t\t{\n\t\t\tname: \"FileName with path separator\",\n\t\t\treq: &VersionsRequest{\n\t\t\t\tAppName:   \"MyApp\",\n\t\t\t\tUserID:    \"user-123\",\n\t\t\t\tSessionID: \"sess-abc\",\n\t\t\t\tFileName:  \"folder/file.txt\",\n\t\t\t},\n\t\t\twantErr:    true,\n\t\t\twantErrMsg: \"invalid name: filename cannot contain path separators\",\n\t\t},\n\t}\n\texecuteValidatorTestCases(t, \"VersionsRequest\", testCases)\n}\n\nfunc executeValidatorTestCases(t *testing.T, requestTypeName string, testCases []ValidatorTestCase) {\n\t// Run the tests\n\tfor _, tc := range testCases {\n\t\tt.Run(fmt.Sprintf(\"%s_%s\", requestTypeName, tc.name), func(t *testing.T) {\n\t\t\terr := tc.req.Validate()\n\n\t\t\tif (err != nil) != tc.wantErr {\n\t\t\t\tt.Errorf(\"Validate() error = %v, wantErr %v\", err, tc.wantErr)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif err != nil && err.Error() != tc.wantErrMsg {\n\t\t\t\t// NOTE: This simple string comparison works because our function produces a sorted, predictable output.\n\t\t\t\tt.Errorf(\"Validate() error msg = %q, wantErrMsg %q\", err.Error(), tc.wantErrMsg)\n\t\t\t}\n\t\t})\n\t}\n}\n\n// Test suite for the reusable helper function using a slice of structs\nfunc TestValidateRequiredStrings(t *testing.T) {\n\ttestCases := []struct {\n\t\tname  string\n\t\tinput []requiredField\n\t\twant  []string\n\t}{\n\t\t{\n\t\t\tname: \"No missing fields\",\n\t\t\tinput: []requiredField{\n\t\t\t\t{Name: \"FieldA\", Value: \"valueA\"},\n\t\t\t\t{Name: \"FieldB\", Value: \"valueB\"},\n\t\t\t},\n\t\t\twant: nil,\n\t\t},\n\t\t{\n\t\t\tname: \"One missing field\",\n\t\t\tinput: []requiredField{\n\t\t\t\t{Name: \"FieldA\", Value: \"valueA\"},\n\t\t\t\t{Name: \"FieldB\", Value: \"\"},\n\t\t\t},\n\t\t\twant: []string{\"FieldB\"},\n\t\t},\n\t\t{\n\t\t\tname: \"Multiple missing fields\",\n\t\t\tinput: []requiredField{\n\t\t\t\t{Name: \"FieldA\", Value: \"\"},\n\t\t\t\t{Name: \"FieldB\", Value: \"valueB\"},\n\t\t\t\t{Name: \"FieldC\", Value: \"\"},\n\t\t\t},\n\t\t\t// The order now matches the input order\n\t\t\twant: []string{\"FieldA\", \"FieldC\"},\n\t\t},\n\t\t{\n\t\t\tname:  \"Empty input slice\",\n\t\t\tinput: []requiredField{},\n\t\t\twant:  nil,\n\t\t},\n\t}\n\n\tfor _, tc := range testCases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\tgot := validateRequiredStrings(tc.input)\n\t\t\tif !reflect.DeepEqual(got, tc.want) {\n\t\t\t\tt.Errorf(\"validateRequiredStrings() = %v, want %v\", got, tc.want)\n\t\t\t}\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "artifact/service.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Package artifact provides a service for managing artifacts.\n//\n// An artifact is a file identified by an application name, a user ID, a session ID,\n// and a filename. The service provides basic storage operations for artifacts,\n// such as Save, Load, Delete, and List. It also supports versioning of artifacts.\npackage artifact\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"strings\"\n\n\t\"google.golang.org/genai\"\n)\n\n// Service is the artifact storage service.\ntype Service interface {\n\t// Save saves an artifact to the artifact service storage.\n\t// The artifact is a file identified by the app name, user ID, session ID, and fileName.\n\t// After saving the artifact, a revision ID is returned to identify the artifact version.\n\tSave(ctx context.Context, req *SaveRequest) (*SaveResponse, error)\n\t// Load loads an artifact from the storage.\n\t// The artifact is a file identified by the appName, userID, sessionID and fileName.\n\tLoad(ctx context.Context, req *LoadRequest) (*LoadResponse, error)\n\t// Delete deletes an artifact. Deleting a non-existing entry is not an error.\n\tDelete(ctx context.Context, req *DeleteRequest) error\n\t// List lists all the artifact filenames within a session.\n\tList(ctx context.Context, req *ListRequest) (*ListResponse, error)\n\t// Versions lists all versions of an artifact.\n\tVersions(ctx context.Context, req *VersionsRequest) (*VersionsResponse, error)\n}\n\n// requiredField is an internal type to use on validate operations\ntype requiredField struct {\n\tName  string\n\tValue string\n}\n\n// SaveRequest is the parameter for [ArtifactService.Save].\ntype SaveRequest struct {\n\tAppName, UserID, SessionID, FileName string\n\t// Part is the artifact to store.\n\tPart *genai.Part\n\n\t// Below are optional fields.\n\n\t// If set, the artifact will be saved with this version.\n\t// If unset, a new version will be created.\n\tVersion int64\n}\n\n// validateRequiredStrings checks a slice of fields in order.\n// It returns the names of any fields with empty values, preserving the original order.\nfunc validateRequiredStrings(fields []requiredField) []string {\n\tvar missingFields []string\n\tfor _, field := range fields {\n\t\tif field.Value == \"\" {\n\t\t\tmissingFields = append(missingFields, field.Name)\n\t\t}\n\t}\n\treturn missingFields\n}\n\n// Validate checks if the struct is valid or if it is missing fields.\nfunc (req *SaveRequest) Validate() error {\n\t// Define the fields to check in the desired order\n\tfieldsToCheck := []requiredField{\n\t\t{Name: \"AppName\", Value: req.AppName},\n\t\t{Name: \"UserID\", Value: req.UserID},\n\t\t{Name: \"SessionID\", Value: req.SessionID},\n\t\t{Name: \"FileName\", Value: req.FileName},\n\t}\n\n\t// Use the helper function for all required string fields\n\tmissingFields := validateRequiredStrings(fieldsToCheck)\n\n\t// Perform checks that don't fit the helper\n\tif req.Part == nil {\n\t\tmissingFields = append(missingFields, \"Part\")\n\t}\n\n\t// If the slice has any items, it means fields were missing.\n\tif len(missingFields) > 0 {\n\t\treturn fmt.Errorf(\"invalid save request: missing required fields: %s\", strings.Join(missingFields, \", \"))\n\t}\n\n\tif req.Part.Text == \"\" && req.Part.InlineData == nil {\n\t\treturn fmt.Errorf(\"invalid save request: Part.InlineData or Part.Text has to be set\")\n\t}\n\n\t// Validate that FileName doesn't contain path separators\n\tif err := validateFileName(req.FileName); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc validateFileName(name string) error {\n\tif strings.Contains(name, \"/\") || strings.Contains(name, \"\\\\\") {\n\t\treturn fmt.Errorf(\"invalid name: filename cannot contain path separators\")\n\t}\n\treturn nil\n}\n\n// SaveResponse is the return type of [ArtifactService.Save].\ntype SaveResponse struct {\n\tVersion int64\n}\n\n// LoadRequest is the parameter for [ArtifactService.Load].\ntype LoadRequest struct {\n\tAppName, UserID, SessionID, FileName string\n\n\t// Below are optional fields.\n\tVersion int64\n}\n\n// Validate checks if the struct is valid or if it is missing fields.\nfunc (req *LoadRequest) Validate() error {\n\t// Define the fields to check in the desired order\n\tfieldsToCheck := []requiredField{\n\t\t{Name: \"AppName\", Value: req.AppName},\n\t\t{Name: \"UserID\", Value: req.UserID},\n\t\t{Name: \"SessionID\", Value: req.SessionID},\n\t\t{Name: \"FileName\", Value: req.FileName},\n\t}\n\n\t// Use the helper function for all required string fields\n\tmissingFields := validateRequiredStrings(fieldsToCheck)\n\n\t// If the slice has any items, it means fields were missing.\n\tif len(missingFields) > 0 {\n\t\treturn fmt.Errorf(\"invalid load request: missing required fields: %s\", strings.Join(missingFields, \", \"))\n\t}\n\n\t// Validate that FileName doesn't contain path separators\n\tif err := validateFileName(req.FileName); err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\n// LoadResponse is the return type of [ArtifactService.Load].\ntype LoadResponse struct {\n\t// Part is the artifact stored.\n\tPart *genai.Part\n}\n\n// DeleteRequest is the parameter for [ArtifactService.Delete].\ntype DeleteRequest struct {\n\tAppName, UserID, SessionID, FileName string\n\n\t// Below are optional fields.\n\tVersion int64\n}\n\n// Validate checks if the struct is valid or if it is missing fields.\nfunc (req *DeleteRequest) Validate() error {\n\t// Define the fields to check in the desired order\n\tfieldsToCheck := []requiredField{\n\t\t{Name: \"AppName\", Value: req.AppName},\n\t\t{Name: \"UserID\", Value: req.UserID},\n\t\t{Name: \"SessionID\", Value: req.SessionID},\n\t\t{Name: \"FileName\", Value: req.FileName},\n\t}\n\n\t// Use the helper function for all required string fields\n\tmissingFields := validateRequiredStrings(fieldsToCheck)\n\n\t// If the slice has any items, it means fields were missing.\n\tif len(missingFields) > 0 {\n\t\treturn fmt.Errorf(\"invalid delete request: missing required fields: %s\", strings.Join(missingFields, \", \"))\n\t}\n\n\t// Validate that FileName doesn't contain path separators\n\tif err := validateFileName(req.FileName); err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\n// ListRequest is the parameter for [ArtifactService.List].\ntype ListRequest struct {\n\tAppName, UserID, SessionID string\n}\n\n// Validate checks if the struct is valid or if it is missing a field.\nfunc (req *ListRequest) Validate() error {\n\t// Define the fields to check in the desired order\n\tfieldsToCheck := []requiredField{\n\t\t{Name: \"AppName\", Value: req.AppName},\n\t\t{Name: \"UserID\", Value: req.UserID},\n\t\t{Name: \"SessionID\", Value: req.SessionID},\n\t}\n\n\t// Use the helper function for all required string fields\n\tmissingFields := validateRequiredStrings(fieldsToCheck)\n\n\t// If the slice has any items, it means fields were missing.\n\tif len(missingFields) > 0 {\n\t\treturn fmt.Errorf(\"invalid list request: missing required fields: %s\", strings.Join(missingFields, \", \"))\n\t}\n\treturn nil\n}\n\n// ListResponse is the return type of [ArtifactService.List].\ntype ListResponse struct {\n\tFileNames []string\n}\n\n// VersionsRequest is the parameter for [ArtifactService.Versions].\ntype VersionsRequest struct {\n\tAppName, UserID, SessionID, FileName string\n}\n\n// Validate checks if the struct is valid or if its missing field\nfunc (req *VersionsRequest) Validate() error {\n\t// Define the fields to check in the desired order\n\tfieldsToCheck := []requiredField{\n\t\t{Name: \"AppName\", Value: req.AppName},\n\t\t{Name: \"UserID\", Value: req.UserID},\n\t\t{Name: \"SessionID\", Value: req.SessionID},\n\t\t{Name: \"FileName\", Value: req.FileName},\n\t}\n\n\t// Use the helper function for all required string fields\n\tmissingFields := validateRequiredStrings(fieldsToCheck)\n\n\t// If the slice has any items, it means fields were missing.\n\tif len(missingFields) > 0 {\n\t\treturn fmt.Errorf(\"invalid versions request: missing required fields: %s\", strings.Join(missingFields, \", \"))\n\t}\n\n\t// Validate that FileName doesn't contain path separators\n\tif err := validateFileName(req.FileName); err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\n// VersionsResponse is the parameter for [ArtifactService.Versions].\ntype VersionsResponse struct {\n\tVersions []int64\n}\n"
  },
  {
    "path": "cmd/adkgo/adkgo.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// adkgo is a CLI tool to help deploy and test an ADK application.\npackage main\n\nimport (\n\t_ \"google.golang.org/adk/cmd/adkgo/internal/deploy/cloudrun\"\n\t\"google.golang.org/adk/cmd/adkgo/internal/root\"\n)\n\nfunc main() {\n\troot.Execute()\n}\n"
  },
  {
    "path": "cmd/adkgo/internal/deploy/cloudrun/cloudrun.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Package cloudrun handles command line parameters and execution logic for cloudrun deployment.\npackage cloudrun\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"os/exec\"\n\t\"path\"\n\t\"path/filepath\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/spf13/cobra\"\n\n\t\"google.golang.org/adk/cmd/adkgo/internal/deploy\"\n\t\"google.golang.org/adk/internal/cli/util\"\n)\n\ntype gCloudFlags struct {\n\tregion      string\n\tprojectName string\n}\n\ntype cloudRunServiceFlags struct {\n\tserviceName     string\n\tserverPort      int\n\ta2aAgentCardURL string\n\ta2a             bool // enable a2a or not\n\tapi             bool // enable api or not\n\twebui           bool // enable webui or not\n}\n\ntype localProxyFlags struct {\n\tport int\n}\n\ntype buildFlags struct {\n\ttempDir             string\n\texecPath            string\n\texecFile            string\n\tdockerfileBuildPath string\n}\n\ntype sourceFlags struct {\n\tsrcBasePath    string\n\tentryPointPath string\n}\n\ntype deployCloudRunFlags struct {\n\tgcloud   gCloudFlags\n\tcloudRun cloudRunServiceFlags\n\tproxy    localProxyFlags\n\tbuild    buildFlags\n\tsource   sourceFlags\n}\n\nvar flags deployCloudRunFlags\n\n// cloudrunCmd represents the cloudrun command\nvar cloudrunCmd = &cobra.Command{\n\tUse:   \"cloudrun\",\n\tShort: \"Deploys the application to cloudrun.\",\n\tLong: `Deployment prepares a Dockerfile which is fed with locally compiled server executable containing Web UI static files.\n\tService on Cloudrun is created using this information. \n\tLocal proxy adding authentication is started. \n\t`,\n\tRunE: func(cmd *cobra.Command, args []string) error {\n\t\treturn flags.deployOnCloudRun()\n\t},\n}\n\n// init creates flags and adds subcommand to parent\nfunc init() {\n\tdeploy.DeployCmd.AddCommand(cloudrunCmd)\n\n\tcloudrunCmd.PersistentFlags().StringVarP(&flags.gcloud.region, \"region\", \"r\", \"\", \"GCP Region\")\n\tcloudrunCmd.PersistentFlags().StringVarP(&flags.gcloud.projectName, \"project_name\", \"p\", \"\", \"GCP Project Name\")\n\tcloudrunCmd.PersistentFlags().StringVarP(&flags.cloudRun.serviceName, \"service_name\", \"s\", \"\", \"Cloud Run Service name\")\n\tcloudrunCmd.PersistentFlags().StringVarP(&flags.build.tempDir, \"temp_dir\", \"t\", \"\", \"Temp dir for build, defaults to os.TempDir() if not specified\")\n\tcloudrunCmd.PersistentFlags().IntVar(&flags.proxy.port, \"proxy_port\", 8081, \"Local proxy port\")\n\tcloudrunCmd.PersistentFlags().IntVar(&flags.cloudRun.serverPort, \"server_port\", 8080, \"Cloudrun server port\")\n\tcloudrunCmd.PersistentFlags().StringVarP(&flags.source.entryPointPath, \"entry_point_path\", \"e\", \"\", \"Path to an entry point (go 'main')\")\n\tcloudrunCmd.PersistentFlags().BoolVar(&flags.cloudRun.a2a, \"a2a\", true, \"Enable A2A\")\n\tcloudrunCmd.PersistentFlags().StringVarP(&flags.cloudRun.a2aAgentCardURL, \"a2a_agent_url\", \"a\", \"http://127.0.0.1:8081\", \"A2A agent card URL as advertised in the public agent card\")\n\tcloudrunCmd.PersistentFlags().BoolVar(&flags.cloudRun.api, \"api\", true, \"Enable API\")\n\tcloudrunCmd.PersistentFlags().BoolVar(&flags.cloudRun.webui, \"webui\", true, \"Enable Web UI\")\n}\n\n// computeFlags uses command line arguments to create a full config\nfunc (f *deployCloudRunFlags) computeFlags() error {\n\treturn util.LogStartStop(\"Computing flags & preparing temp\",\n\t\tfunc(p util.Printer) error {\n\t\t\tabsp, err := filepath.Abs(flags.source.entryPointPath)\n\t\t\tif err != nil {\n\t\t\t\treturn fmt.Errorf(\"cannot make an absolute path from '%v': %w\", f.source.entryPointPath, err)\n\t\t\t}\n\t\t\tf.source.entryPointPath = absp\n\n\t\t\tif flags.build.tempDir == \"\" {\n\t\t\t\tflags.build.tempDir = os.TempDir()\n\t\t\t}\n\t\t\tabsp, err = filepath.Abs(flags.build.tempDir)\n\t\t\tif err != nil {\n\t\t\t\treturn fmt.Errorf(\"cannot make an absolute path from '%v': %w\", f.build.tempDir, err)\n\t\t\t}\n\t\t\tf.build.tempDir, err = os.MkdirTemp(absp, \"cloudrun_\"+time.Now().Format(\"20060102_150405__\")+\"*\")\n\t\t\tif err != nil {\n\t\t\t\treturn fmt.Errorf(\"cannot create a temporary sub directory in '%v': %w\", absp, err)\n\t\t\t}\n\t\t\tp(\"Using temp dir:\", f.build.tempDir)\n\n\t\t\t// come up with a executable name based on entry point path\n\t\t\tdir, file := path.Split(f.source.entryPointPath)\n\t\t\tf.source.srcBasePath = dir\n\t\t\tf.source.entryPointPath = file\n\t\t\tif f.build.execPath == \"\" {\n\t\t\t\texec, err := util.StripExtension(f.source.entryPointPath, \".go\")\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn fmt.Errorf(\"cannot strip '.go' extension from entry point path '%v': %w\", f.source.entryPointPath, err)\n\t\t\t\t}\n\t\t\t\tf.build.execFile = exec\n\t\t\t\tf.build.execPath = path.Join(f.build.tempDir, exec)\n\t\t\t}\n\t\t\tf.build.dockerfileBuildPath = path.Join(f.build.tempDir, \"Dockerfile\")\n\n\t\t\treturn nil\n\t\t})\n}\n\nfunc (f *deployCloudRunFlags) cleanTemp() error {\n\treturn util.LogStartStop(\"Cleaning temp\",\n\t\tfunc(p util.Printer) error {\n\t\t\tp(\"Clean temp starting with\", f.build.tempDir)\n\t\t\terr := os.RemoveAll(f.build.tempDir)\n\t\t\tif err != nil {\n\t\t\t\treturn fmt.Errorf(\"failed to clean temp directory %v: %w\", f.build.tempDir, err)\n\t\t\t}\n\t\t\treturn nil\n\t\t})\n}\n\n// compileEntryPoint builds locally the server using flags and environment variables in order to be run in CloudRun containter\nfunc (f *deployCloudRunFlags) compileEntryPoint() error {\n\treturn util.LogStartStop(\"Compiling server\",\n\t\tfunc(p util.Printer) error {\n\t\t\tp(\"Using\", f.source.entryPointPath, \"as entry point\")\n\t\t\t// for help on ldflags you can run go build -ldflags=\"--help\" ./examples/quickstart/main.go\n\t\t\t//    -s    disable symbol table\n\t\t\t//    -w    disable DWARF generation\n\t\t\t//   using those flags reduces the size of an executable\n\t\t\tcmd := exec.Command(\"go\", \"build\", \"-ldflags\", \"-s -w\", \"-o\", f.build.execPath, f.source.entryPointPath)\n\n\t\t\tcmd.Dir = f.source.srcBasePath\n\t\t\t// build using staticallly linked libs, for linux/amd64\n\t\t\tcmd.Env = append(os.Environ(), \"CGO_ENABLED=0\", \"GOOS=linux\", \"GOARCH=amd64\")\n\t\t\treturn util.LogCommand(cmd, p)\n\t\t})\n}\n\n// prepareDockerfile creates a temporary Dockerfile which will be executed by CloudRun\nfunc (f *deployCloudRunFlags) prepareDockerfile() error {\n\treturn util.LogStartStop(\"Preparing Dockerfile\",\n\t\tfunc(p util.Printer) error {\n\t\t\tp(\"Writing:\", f.build.dockerfileBuildPath)\n\n\t\t\tvar b strings.Builder\n\t\t\tb.WriteString(`\nFROM gcr.io/distroless/static-debian11\n\nCOPY ` + f.build.execFile + `  /app/` + f.build.execFile + `\nEXPOSE ` + strconv.Itoa(flags.cloudRun.serverPort) + `\n# Command to run the executable when the container starts\nCMD [\"/app/` + f.build.execFile + `\", \"web\", \"-port\", \"` + strconv.Itoa(flags.cloudRun.serverPort) + `\"`)\n\n\t\t\tif flags.cloudRun.api {\n\t\t\t\tb.WriteString(`, \"api\", \"-webui_address\", \"127.0.0.1:` + strconv.Itoa(f.proxy.port) + `\"`)\n\t\t\t}\n\t\t\tif flags.cloudRun.a2a {\n\t\t\t\tb.WriteString(`, \"a2a\", \"--a2a_agent_url\", \"` + flags.cloudRun.a2aAgentCardURL + `\"`)\n\t\t\t}\n\t\t\tif flags.cloudRun.webui {\n\t\t\t\tb.WriteString(`, \"webui\", \"--api_server_address\", \"http://127.0.0.1:` + strconv.Itoa(f.proxy.port) + `/api\"]\n\t\t\t\t`)\n\t\t\t}\n\t\t\treturn os.WriteFile(f.build.dockerfileBuildPath, []byte(b.String()), 0o600)\n\t\t})\n}\n\n// gcloudDeployToCloudRun invokes gcloud to deploy source on CloudRun\nfunc (f *deployCloudRunFlags) gcloudDeployToCloudRun() error {\n\treturn util.LogStartStop(\"Deploying to Cloud Run\",\n\t\tfunc(p util.Printer) error {\n\t\t\tparams := []string{\n\t\t\t\t\"run\", \"deploy\", f.cloudRun.serviceName,\n\t\t\t\t\"--source\", \".\",\n\t\t\t\t\"--set-secrets=GOOGLE_API_KEY=GOOGLE_API_KEY:latest\",\n\t\t\t\t\"--region\", f.gcloud.region,\n\t\t\t\t\"--project\", f.gcloud.projectName,\n\t\t\t\t\"--ingress\", \"all\",\n\t\t\t\t\"--no-allow-unauthenticated\",\n\t\t\t}\n\n\t\t\tcmd := exec.Command(\"gcloud\", params...)\n\n\t\t\tcmd.Dir = f.build.tempDir\n\t\t\treturn util.LogCommand(cmd, p)\n\t\t})\n}\n\n// runGcloudProxy invokes gcloud to create a proxy which will add authentication headers to requests\nfunc (f *deployCloudRunFlags) runGcloudProxy() error {\n\treturn util.LogStartStop(\"Running local gcloud authenticating proxy\",\n\t\tfunc(p util.Printer) error {\n\t\t\ttargetWidth := 80\n\n\t\t\tp(strings.Repeat(\"-\", targetWidth))\n\t\t\tp(util.CenterString(\"\", targetWidth))\n\t\t\tp(util.CenterString(\"Running ADK Web UI on http://127.0.0.1:\"+strconv.Itoa(f.proxy.port)+\"/ui/    <-- open this\", targetWidth))\n\t\t\tp(util.CenterString(\"ADK REST API on http://127.0.0.1:\"+strconv.Itoa(f.proxy.port)+\"/api/         \", targetWidth))\n\t\t\tp(util.CenterString(\"\", targetWidth))\n\t\t\tp(util.CenterString(\"Press Ctrl-C to stop\", targetWidth))\n\t\t\tp(util.CenterString(\"\", targetWidth))\n\t\t\tp(strings.Repeat(\"-\", targetWidth))\n\n\t\t\tcmd := exec.Command(\"gcloud\", \"run\", \"services\", \"proxy\", f.cloudRun.serviceName, \"--project\", f.gcloud.projectName, \"--port\", strconv.Itoa(f.proxy.port), \"--region\", f.gcloud.region)\n\t\t\treturn util.LogCommand(cmd, p)\n\t\t})\n}\n\n// deployOnCloudRun executes the sequence of actions preparing and deploying the agent to CloudRun. Then runs authenticating proxy to newly deployed service\nfunc (f *deployCloudRunFlags) deployOnCloudRun() error {\n\tfmt.Println(flags)\n\n\terr := f.computeFlags()\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = f.compileEntryPoint()\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = f.prepareDockerfile()\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = f.gcloudDeployToCloudRun()\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = f.cleanTemp()\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = f.runGcloudProxy()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "cmd/adkgo/internal/deploy/deploy.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Package deploy allows to run deployment-related subcommands.\npackage deploy\n\nimport (\n\t\"github.com/spf13/cobra\"\n\n\t\"google.golang.org/adk/cmd/adkgo/internal/root\"\n)\n\n// DeployCmd represents the deploy command.\nvar DeployCmd = &cobra.Command{\n\tUse:   \"deploy\",\n\tShort: \"Makes deployment to various platforms easy\",\n\tLong:  `Please see subcommands for details`,\n\tRunE: func(cmd *cobra.Command, args []string) error {\n\t\tif len(args) == 0 {\n\t\t\treturn cmd.Help()\n\t\t}\n\t\treturn nil\n\t},\n}\n\nfunc init() {\n\troot.RootCmd.AddCommand(DeployCmd)\n}\n"
  },
  {
    "path": "cmd/adkgo/internal/root/root.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Package root handles command line parameters\npackage root\n\nimport (\n\t\"os\"\n\n\t\"github.com/spf13/cobra\"\n)\n\n// RootCmd represents the base command when called without any subcommands\nvar RootCmd = &cobra.Command{\n\tUse:   \"adkgo\",\n\tShort: \"CLI tool for use with ADK-GO\",\n\tLong:  `adkgo is a CLI tool which allows developer to quickly deploy and test an agentic application`,\n}\n\n// Execute adds all child commands to the root command and sets flags appropriately.\nfunc Execute() {\n\terr := RootCmd.Execute()\n\tif err != nil {\n\t\tos.Exit(1)\n\t}\n}\n"
  },
  {
    "path": "cmd/internal/adkcli/main.go",
    "content": "// Copyright 2026 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"io/fs\"\n\t\"log\"\n\t\"os\"\n\t\"path/filepath\"\n\n\t\"google.golang.org/adk/agent\"\n\t\"google.golang.org/adk/cmd/launcher\"\n\t\"google.golang.org/adk/cmd/launcher/full\"\n\t\"google.golang.org/adk/internal/configurable\"\n\t\"google.golang.org/adk/internal/configurable/conformance\"\n\t\"google.golang.org/adk/internal/configurable/conformance/replayplugin\"\n\t\"google.golang.org/adk/plugin\"\n\t\"google.golang.org/adk/runner\"\n)\n\nfunc main() {\n\t// 1. Get the Current Working Directory (where the user typed 'adk')\n\tcwd, err := os.Getwd()\n\tif err != nil {\n\t\tlog.Fatalf(\"Error getting current directory: %v\", err)\n\t}\n\n\t// Register callbacks for the conformance agents\n\terr = conformance.RegisterCallbacks()\n\tif err != nil {\n\t\tlog.Fatalf(\"Error registering callbacks: %v\", err)\n\t}\n\terr = conformance.RegisterFunctions()\n\tif err != nil {\n\t\tlog.Fatalf(\"Error registering functions: %v\", err)\n\t}\n\n\tfmt.Printf(\"🔍 Scanning for 'root_agent.yaml' in: %s\\n\", cwd)\n\n\t// 2. Crawl folder structure to find all configs\n\tvar agentConfigs []string\n\n\terr = filepath.WalkDir(cwd, func(path string, d fs.DirEntry, err error) error {\n\t\tif err != nil {\n\t\t\t// Report error but continue walking other files\n\t\t\tfmt.Printf(\"Warning: skipping %q due to error: %v\\n\", path, err)\n\t\t\treturn nil\n\t\t}\n\n\t\t// Check if it matches the filename we are looking for\n\t\tif !d.IsDir() && d.Name() == \"root_agent.yaml\" {\n\t\t\tagentConfigs = append(agentConfigs, path)\n\t\t}\n\t\treturn nil\n\t})\n\tif err != nil {\n\t\tlog.Fatalf(\"Error walking the path: %v\", err)\n\t}\n\n\t// 3. Check if we found anything\n\tif len(agentConfigs) == 0 {\n\t\tfmt.Printf(\"❌ No 'root_agent.yaml' files found in %s or subdirectories\\n\", cwd)\n\t\tos.Exit(1)\n\t}\n\n\tfmt.Printf(\"🚀 Found %d agent config(s)\\n\", len(agentConfigs))\n\tagentsMap := make(map[string]agent.Agent, len(agentConfigs))\n\t// 4. Iterate and Load all agents found\n\tfor _, configPath := range agentConfigs {\n\t\tfmt.Printf(\"➡️  Loading agent from: %s\\n\", configPath)\n\n\t\t// This reads the YAML, finds the 'agent_class', and calls the registered factory.\n\t\tmyAgent, err := configurable.FromConfig(context.Background(), configPath)\n\t\tif err != nil {\n\t\t\tlog.Printf(\"⚠️  Error loading agent at %s: %v\", configPath, err)\n\t\t\tcontinue // Skip this one and try the next\n\t\t}\n\t\tfmt.Printf(\"✅ Agent loaded successfully: %s\\n\", myAgent.Name())\n\n\t\tfolderName := filepath.Base(filepath.Dir(configPath))\n\t\tfmt.Printf(\"✅ Agent folder name: %s\\n\", folderName)\n\n\t\tif _, ok := agentsMap[folderName]; ok {\n\t\t\tlog.Printf(\"⚠️  Agent %s already exists, skipping\", folderName)\n\t\t\tcontinue\n\t\t}\n\t\tagentsMap[folderName] = myAgent\n\t}\n\n\tctx := context.Background()\n\n\tloader, err := conformance.NewConformanceAgentLoader(agentsMap)\n\tif err != nil {\n\t\tlog.Fatalf(\"Error loading agent: %v\", err)\n\t}\n\n\tconfig := &launcher.Config{\n\t\tAgentLoader: loader,\n\t\tPluginConfig: runner.PluginConfig{\n\t\t\tPlugins: []*plugin.Plugin{\n\t\t\t\treplayplugin.MustNew(cwd),\n\t\t\t},\n\t\t},\n\t}\n\n\tl := full.NewLauncher()\n\tif err = l.Execute(ctx, config, os.Args[1:]); err != nil {\n\t\tlog.Fatalf(\"Run failed: %v\\n\\n%s\", err, l.CommandLineSyntax())\n\t}\n}\n"
  },
  {
    "path": "cmd/launcher/console/console.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Package console provides a simple way to interact with an agent from console application.\npackage console\n\nimport (\n\t\"bufio\"\n\t\"context\"\n\t\"errors\"\n\t\"flag\"\n\t\"fmt\"\n\t\"io\"\n\t\"log\"\n\t\"os\"\n\t\"os/signal\"\n\t\"time\"\n\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/agent\"\n\t\"google.golang.org/adk/cmd/launcher\"\n\t\"google.golang.org/adk/cmd/launcher/internal/telemetry\"\n\t\"google.golang.org/adk/cmd/launcher/universal\"\n\t\"google.golang.org/adk/internal/cli/util\"\n\t\"google.golang.org/adk/runner\"\n\t\"google.golang.org/adk/session\"\n)\n\n// consoleConfig contains command-line params for console launcher\ntype consoleConfig struct {\n\tstreamingMode       agent.StreamingMode\n\tstreamingModeString string // command-line param to be converted to agent.StreamingMode\n\totelToCloud         bool\n\tshutdownTimeout     time.Duration\n}\n\n// consoleLauncher allows to interact with an agent in console\ntype consoleLauncher struct {\n\tflags  *flag.FlagSet  // flags are used to parse command-line arguments\n\tconfig *consoleConfig // config contains parsed command-line parameters\n}\n\n// NewLauncher creates new console launcher\nfunc NewLauncher() launcher.SubLauncher {\n\tconfig := &consoleConfig{}\n\n\tfs := flag.NewFlagSet(\"console\", flag.ContinueOnError)\n\tfs.StringVar(&config.streamingModeString, \"streaming_mode\", \"\",\n\t\tfmt.Sprintf(\"defines streaming mode (%s|%s)\", agent.StreamingModeNone, agent.StreamingModeSSE))\n\tfs.DurationVar(&config.shutdownTimeout, \"shutdown-timeout\", 2*time.Second, \"Console shutdown timeout (i.e. '10s', '2m' - see time.ParseDuration for details) - for waiting for active requests to finish during shutdown\")\n\tfs.BoolVar(&config.otelToCloud, \"otel_to_cloud\", false, \"Enables/disables OpenTelemetry export to GCP: telemetry.googleapis.com. See adk-go/telemetry package for details about supported options, credentials and environment variables.\")\n\treturn &consoleLauncher{config: config, flags: fs}\n}\n\n// Run implements launcher.SubLauncher. It starts the console interaction loop.\nfunc (l *consoleLauncher) Run(ctx context.Context, config *launcher.Config) error {\n\tctx, cancel := signal.NotifyContext(ctx, os.Interrupt)\n\tdefer cancel()\n\n\ttelemetry, err := telemetry.InitAndSetGlobalOtelProviders(ctx, config, l.config.otelToCloud)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"telemetry initialization failed: %v\", err)\n\t}\n\tdefer func() {\n\t\tshutdownCtx, cancel := context.WithTimeout(context.Background(), l.config.shutdownTimeout)\n\t\tdefer cancel()\n\t\tif err := telemetry.Shutdown(shutdownCtx); err != nil {\n\t\t\tlog.Printf(\"telemetry shutdown failed: %v\", err)\n\t\t}\n\t}()\n\n\t// userID and appName are not important at this moment, we can just use any\n\tuserID, appName := \"console_user\", \"console_app\"\n\n\tsessionService := config.SessionService\n\tif sessionService == nil {\n\t\tsessionService = session.InMemoryService()\n\t}\n\n\tresp, err := sessionService.Create(ctx, &session.CreateRequest{\n\t\tAppName: appName,\n\t\tUserID:  userID,\n\t})\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to create the session service: %v\", err)\n\t}\n\n\trootAgent := config.AgentLoader.RootAgent()\n\n\tsession := resp.Session\n\n\tr, err := runner.New(runner.Config{\n\t\tAppName:         appName,\n\t\tAgent:           rootAgent,\n\t\tSessionService:  sessionService,\n\t\tArtifactService: config.ArtifactService,\n\t\tPluginConfig:    config.PluginConfig,\n\t})\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to create runner: %v\", err)\n\t}\n\n\tinputChan := make(chan string)\n\treadErrChan := make(chan error, 1)\n\n\tgo func() {\n\t\treader := bufio.NewReader(os.Stdin)\n\t\tfor {\n\t\t\tuserInput, err := reader.ReadString('\\n')\n\t\t\tif err != nil {\n\t\t\t\treadErrChan <- err\n\t\t\t\treturn\n\t\t\t}\n\t\t\tinputChan <- userInput\n\t\t}\n\t}()\n\t// Print an initial newline to work around PTY/exec buffering issues in some environments.\n\tfmt.Println()\n\n\tfmt.Print(\"\\nUser -> \")\n\n\t// Resolve \"auto\" streaming mode once per session (stdout TTY-ness doesn't change).\n\tdefaultStreamingMode := l.config.streamingMode\n\tif defaultStreamingMode == \"\" {\n\t\t// Stdlib-only terminal heuristic: stdout is a character device.\n\t\t// Avoids adding golang.org/x/term dependency (golangci-lint failed to load its export data in CI).\n\t\tif fi, err := os.Stdout.Stat(); err == nil && (fi.Mode()&os.ModeCharDevice) != 0 {\n\t\t\tdefaultStreamingMode = agent.StreamingModeSSE\n\t\t} else {\n\t\t\tdefaultStreamingMode = agent.StreamingModeNone\n\t\t}\n\t}\n\n\tfor {\n\t\tselect {\n\t\tcase <-ctx.Done():\n\t\t\treturn nil\n\t\tcase err := <-readErrChan:\n\t\t\tif errors.Is(err, io.EOF) {\n\t\t\t\tfmt.Println(\"\\nEOF detected, exiting...\")\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\tlog.Fatal(err)\n\t\tcase userInput := <-inputChan:\n\n\t\t\tuserMsg := genai.NewContentFromText(userInput, genai.RoleUser)\n\t\t\tstreamingMode := l.config.streamingMode\n\t\t\tif streamingMode == \"\" {\n\t\t\t\tstreamingMode = defaultStreamingMode\n\t\t\t}\n\n\t\t\tfmt.Print(\"\\nAgent -> \")\n\t\t\tprevText := \"\"\n\t\t\tfor event, err := range r.Run(ctx, userID, session.ID(), userMsg, agent.RunConfig{\n\t\t\t\tStreamingMode: streamingMode,\n\t\t\t}) {\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"\\nAGENT_ERROR: %v\\n\", err)\n\t\t\t\t} else {\n\t\t\t\t\tif event.LLMResponse.Content == nil {\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\n\t\t\t\t\ttext := \"\"\n\t\t\t\t\tfor _, p := range event.LLMResponse.Content.Parts {\n\t\t\t\t\t\ttext += p.Text\n\t\t\t\t\t}\n\n\t\t\t\t\tif streamingMode != agent.StreamingModeSSE {\n\t\t\t\t\t\tfmt.Print(text)\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\n\t\t\t\t\t// In SSE mode, always print partial responses and capture them.\n\t\t\t\t\tif !event.IsFinalResponse() {\n\t\t\t\t\t\tfmt.Print(text)\n\t\t\t\t\t\tprevText += text\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only print final response if it doesn't match previously captured text.\n\t\t\t\t\tif text != prevText {\n\t\t\t\t\t\tfmt.Print(text)\n\t\t\t\t\t}\n\n\t\t\t\t\tprevText = \"\"\n\t\t\t\t}\n\t\t\t}\n\t\t\tfmt.Print(\"\\nUser -> \")\n\t\t}\n\t}\n}\n\n// Parse implements launcher.SubLauncher. After parsing console-specific\n// arguments returns remaining un-parsed arguments\nfunc (l *consoleLauncher) Parse(args []string) ([]string, error) {\n\terr := l.flags.Parse(args)\n\tif err != nil || !l.flags.Parsed() {\n\t\treturn nil, fmt.Errorf(\"failed to parse flags: %v\", err)\n\t}\n\tif l.config.streamingModeString != \"\" &&\n\t\tl.config.streamingModeString != string(agent.StreamingModeNone) &&\n\t\tl.config.streamingModeString != string(agent.StreamingModeSSE) {\n\t\treturn nil, fmt.Errorf(\"invalid streaming_mode: %v. Should be (%s|%s)\", l.config.streamingModeString,\n\t\t\tagent.StreamingModeNone, agent.StreamingModeSSE)\n\t}\n\tl.config.streamingMode = agent.StreamingMode(l.config.streamingModeString)\n\treturn l.flags.Args(), nil\n}\n\n// Keyword implements launcher.SubLauncher. Returns the command-line keyword for this launcher.\nfunc (l *consoleLauncher) Keyword() string {\n\treturn \"console\"\n}\n\n// CommandLineSyntax implements launcher.SubLauncher. Returns the command-line syntax for the console launcher.\nfunc (l *consoleLauncher) CommandLineSyntax() string {\n\treturn util.FormatFlagUsage(l.flags)\n}\n\n// SimpleDescription implements launcher.SubLauncher. Returns a simple description of the console launcher.\nfunc (l *consoleLauncher) SimpleDescription() string {\n\treturn \"runs an agent in console mode.\"\n}\n\n// Execute implements launcher.Launcher. It parses arguments and runs the launcher.\nfunc (l *consoleLauncher) Execute(ctx context.Context, config *launcher.Config, args []string) error {\n\tremainingArgs, err := l.Parse(args)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"cannot parse args: %w\", err)\n\t}\n\t// do not accept additional arguments\n\terr = universal.ErrorOnUnparsedArgs(remainingArgs)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"cannot parse all the arguments: %w\", err)\n\t}\n\treturn l.Run(ctx, config)\n}\n"
  },
  {
    "path": "cmd/launcher/full/full.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Package full provides easy way to play with ADK with all available options\npackage full\n\nimport (\n\t\"google.golang.org/adk/cmd/launcher\"\n\t\"google.golang.org/adk/cmd/launcher/console\"\n\t\"google.golang.org/adk/cmd/launcher/universal\"\n\t\"google.golang.org/adk/cmd/launcher/web\"\n\t\"google.golang.org/adk/cmd/launcher/web/a2a\"\n\t\"google.golang.org/adk/cmd/launcher/web/api\"\n\t\"google.golang.org/adk/cmd/launcher/web/webui\"\n)\n\n// NewLauncher returnes the most versatile universal launcher with all options built-in.\nfunc NewLauncher() launcher.Launcher {\n\treturn universal.NewLauncher(console.NewLauncher(), web.NewLauncher(webui.NewLauncher(), a2a.NewLauncher(), api.NewLauncher()))\n}\n"
  },
  {
    "path": "cmd/launcher/internal/telemetry/telemetry.go",
    "content": "// Copyright 2026 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Package telemetry contains the internal shared logic for initializing telemetry in launchers.\npackage telemetry\n\nimport (\n\t\"context\"\n\n\t\"google.golang.org/adk/cmd/launcher\"\n\t\"google.golang.org/adk/telemetry\"\n)\n\n// InitAndSetGlobalOtelProviders initializes telemetry and sets the global OTel providers.\nfunc InitAndSetGlobalOtelProviders(ctx context.Context, config *launcher.Config, otelToCloud bool) (*telemetry.Providers, error) {\n\topts := append(config.TelemetryOptions, telemetry.WithOtelToCloud(otelToCloud))\n\ttelemetryProviders, err := telemetry.New(ctx, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\ttelemetryProviders.SetGlobalOtelProviders()\n\treturn telemetryProviders, nil\n}\n"
  },
  {
    "path": "cmd/launcher/launcher.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Package launcher provides ways to interact with agents.\npackage launcher\n\nimport (\n\t\"context\"\n\n\t\"github.com/a2aproject/a2a-go/a2asrv\"\n\n\t\"google.golang.org/adk/agent\"\n\t\"google.golang.org/adk/artifact\"\n\t\"google.golang.org/adk/memory\"\n\t\"google.golang.org/adk/runner\"\n\t\"google.golang.org/adk/session\"\n\t\"google.golang.org/adk/telemetry\"\n)\n\n// Launcher is the main interface for running an ADK application.\n// It is responsible for parsing command-line arguments and executing the\n// corresponding logic.\ntype Launcher interface {\n\t// Execute parses command-line arguments and runs the launcher.\n\tExecute(ctx context.Context, config *Config, args []string) error\n\t// CommandLineSyntax returns a string describing the command-line flags and arguments.\n\tCommandLineSyntax() string\n}\n\n// SubLauncher is an interface for launchers that can be composed within a parent\n// launcher, like the universal launcher. Each SubLauncher corresponds to a\n// specific mode of operation (e.g., 'console' or 'web').\ntype SubLauncher interface {\n\t// Keyword returns the command-line keyword that activates this sub-launcher.\n\tKeyword() string\n\t// Parse parses the arguments for the sub-launcher. It should return any unparsed arguments.\n\tParse(args []string) ([]string, error)\n\t// CommandLineSyntax returns a string describing the command-line flags and arguments for the sub-launcher.\n\tCommandLineSyntax() string\n\t// SimpleDescription provides a brief, one-line description of the sub-launcher's function.\n\tSimpleDescription() string\n\t// Run executes the sub-launcher's main logic.\n\tRun(ctx context.Context, config *Config) error\n}\n\n// Config contains parameters for web & console execution: sessions, artifacts, agents etc\ntype Config struct {\n\tSessionService   session.Service\n\tArtifactService  artifact.Service\n\tMemoryService    memory.Service\n\tAgentLoader      agent.Loader\n\tA2AOptions       []a2asrv.RequestHandlerOption\n\tPluginConfig     runner.PluginConfig\n\tTelemetryOptions []telemetry.Option\n}\n"
  },
  {
    "path": "cmd/launcher/prod/prod.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Package prod provides easy way to play with ADK with all available options without\n// development support (no console, no ADK Web UI) including only production\n// options like the REST API and A2A support.\npackage prod\n\nimport (\n\t\"google.golang.org/adk/cmd/launcher\"\n\t\"google.golang.org/adk/cmd/launcher/universal\"\n\t\"google.golang.org/adk/cmd/launcher/web\"\n\t\"google.golang.org/adk/cmd/launcher/web/a2a\"\n\t\"google.golang.org/adk/cmd/launcher/web/api\"\n)\n\n// NewLauncher returns a launcher capable of serving ADK REST API and A2A.\nfunc NewLauncher() launcher.Launcher {\n\treturn universal.NewLauncher(web.NewLauncher(api.NewLauncher(), a2a.NewLauncher()))\n}\n"
  },
  {
    "path": "cmd/launcher/universal/universal.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Package universal provides an umbrella over launchers (console and web).\n// It allowes to choose one launcher by command-line parameters and uses\n// it to parse the rest of arguments and then execute the launcher\npackage universal\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"strings\"\n\n\t\"google.golang.org/adk/cmd/launcher\"\n)\n\n// uniLauncher contains information about sublaunchers\ntype uniLauncher struct {\n\tchosenLauncher launcher.SubLauncher // the chosen launcher - after parsing command-line args\n\tsublaunchers   []launcher.SubLauncher\n}\n\n// Execute implements launcher.Launcher. Parses args and runs the chosen launcher. Returns error if there are non-parsed arguments.\nfunc (l *uniLauncher) Execute(ctx context.Context, config *launcher.Config, args []string) error {\n\treturn l.ParseAndRun(ctx, config, args, ErrorOnUnparsedArgs)\n}\n\n// NewLauncher returns a new universal launcher. The first element on launcher list will be the default one if there are no arguments specified\nfunc NewLauncher(sublaunchers ...launcher.SubLauncher) launcher.Launcher {\n\treturn &uniLauncher{\n\t\tsublaunchers: sublaunchers,\n\t}\n}\n\n// ParseAndRun parses arguments and runs the chosen sublauncher. It allows to provide a\n// hook for processing any remaining arguments.\nfunc (l *uniLauncher) ParseAndRun(ctx context.Context, config *launcher.Config, args []string, parseRemaining func([]string) error) error {\n\tremainingArgs, err := l.parse(args)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif parseRemaining != nil {\n\t\terr = parseRemaining(remainingArgs)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\t// args are parsed\n\treturn l.run(ctx, config)\n}\n\n// run executes the chosen sublauncher.\nfunc (l *uniLauncher) run(ctx context.Context, config *launcher.Config) error {\n\treturn l.chosenLauncher.Run(ctx, config)\n}\n\n// parse parses arguments and remembers which sublauncher should be run later\nfunc (l *uniLauncher) parse(args []string) ([]string, error) {\n\tkeyToSublauncher := make(map[string]launcher.SubLauncher)\n\tfor _, l := range l.sublaunchers {\n\t\tif _, ok := keyToSublauncher[l.Keyword()]; ok {\n\t\t\treturn nil, fmt.Errorf(\"cannot create universal launcher. Keywords for sublaunchers should be unique and they are not: '%s'\", l.Keyword())\n\t\t}\n\t\tkeyToSublauncher[l.Keyword()] = l\n\t}\n\n\tif len(l.sublaunchers) == 0 {\n\t\t// no sub launchers\n\t\treturn args, fmt.Errorf(\"there are no sub launchers to parse the arguments\")\n\t}\n\t// default to the first one in the list\n\tl.chosenLauncher = l.sublaunchers[0]\n\n\tif len(args) == 0 {\n\t\t// execute the default one\n\t\treturn l.chosenLauncher.Parse(args)\n\t}\n\t// there are arguments\n\tkey := args[0]\n\tif keyLauncher, ok := keyToSublauncher[key]; ok {\n\t\t// match found, use it, continue parsing without the matching keyword\n\t\tl.chosenLauncher = keyLauncher\n\t\treturn l.chosenLauncher.Parse(args[1:])\n\t}\n\t// no match found,\n\treturn l.chosenLauncher.Parse(args)\n}\n\n// CommandLineSyntax implements launcher.Launcher.\nfunc (l *uniLauncher) CommandLineSyntax() string {\n\tif len(l.sublaunchers) == 0 {\n\t\t// no sub launchers\n\t\treturn l.simpleDescription() + \"\\n\\nThere are no sublaunchers to format syntax for.\"\n\t}\n\tvar b strings.Builder\n\tfmt.Fprintf(&b, \"Arguments: Specify one of the following:\\n\")\n\tfor _, l := range l.sublaunchers {\n\t\tfmt.Fprintf(&b, \"  * %s - %s\\n\", l.Keyword(), l.SimpleDescription())\n\t}\n\tfmt.Fprintf(&b, \"Details:\\n\")\n\tfor _, l := range l.sublaunchers {\n\t\tfmt.Fprintf(&b, \"  %s\\n%s\\n\", l.Keyword(), l.CommandLineSyntax())\n\t}\n\n\treturn b.String()\n}\n\n// simpleDescription provides a brief explanation of the universal launcher.\nfunc (l *uniLauncher) simpleDescription() string {\n\treturn `Universal launcher acts as a router, routing command line arguments to one of its sublaunchers. \n\tThe sublauncher is chosen by the first argument - a keyword. \n\tIf there are no arguments at all or the first one is not recognized by any of the sublaunchers, the first sublauncher is used.`\n}\n\n// ErrorOnUnparsedArgs returns an error if there are any unparsed arguments left.\nfunc ErrorOnUnparsedArgs(args []string) error {\n\tif len(args) > 0 {\n\t\treturn fmt.Errorf(\"cannot parse following arguments: %v\", args)\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "cmd/launcher/web/a2a/a2a.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Package a2a provides a sublauncher that provides A2A capabilities.\npackage a2a\n\nimport (\n\t\"flag\"\n\t\"fmt\"\n\t\"net/url\"\n\n\ta2acore \"github.com/a2aproject/a2a-go/a2a\"\n\t\"github.com/a2aproject/a2a-go/a2asrv\"\n\t\"github.com/gorilla/mux\"\n\n\t\"google.golang.org/adk/cmd/launcher\"\n\t\"google.golang.org/adk/cmd/launcher/web\"\n\t\"google.golang.org/adk/internal/cli/util\"\n\t\"google.golang.org/adk/runner\"\n\t\"google.golang.org/adk/server/adka2a\"\n)\n\n// apiPath is a suffix used to build an A2A invocation URL\nconst apiPath = \"/a2a/invoke\"\n\n// a2aConfig contains parameters for launching ADK A2A server\ntype a2aConfig struct {\n\tagentURL string // user-provided url which will be used in the agent card to specify url for invoking A2A\n}\n\ntype a2aLauncher struct {\n\tflags  *flag.FlagSet // flags are used to parse command-line arguments\n\tconfig *a2aConfig\n}\n\n// NewLauncher creates new a2a launcher. It extends Web launcher\nfunc NewLauncher() web.Sublauncher {\n\tconfig := &a2aConfig{}\n\n\tfs := flag.NewFlagSet(\"a2a\", flag.ContinueOnError)\n\n\tfs.StringVar(&config.agentURL, \"a2a_agent_url\", \"http://localhost:8080\", \"A2A host URL as advertised in the public agent card. It is used by A2A clients as a connection endpoint.\")\n\n\treturn &a2aLauncher{\n\t\tconfig: config,\n\t\tflags:  fs,\n\t}\n}\n\n// CommandLineSyntax implements web.Sublauncher. Returns the command-line syntax for the A2A launcher.\nfunc (a *a2aLauncher) CommandLineSyntax() string {\n\treturn util.FormatFlagUsage(a.flags)\n}\n\n// Keyword implements web.Sublauncher. Returns the command-line keyword for A2A launcher.\nfunc (a *a2aLauncher) Keyword() string {\n\treturn \"a2a\"\n}\n\nfunc (a *a2aLauncher) Parse(args []string) ([]string, error) {\n\terr := a.flags.Parse(args)\n\tif err != nil || !a.flags.Parsed() {\n\t\treturn nil, fmt.Errorf(\"failed to parse a2a flags: %v\", err)\n\t}\n\trestArgs := a.flags.Args()\n\treturn restArgs, nil\n}\n\n// SetupSubrouters implements the web.Sublauncher interface. It adds A2A paths to the main router.\nfunc (a *a2aLauncher) SetupSubrouters(router *mux.Router, config *launcher.Config) error {\n\tpublicURL, err := url.JoinPath(a.config.agentURL, apiPath)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\trootAgent := config.AgentLoader.RootAgent()\n\tagentCard := &a2acore.AgentCard{\n\t\tName:                              rootAgent.Name(),\n\t\tDescription:                       rootAgent.Description(),\n\t\tDefaultInputModes:                 []string{\"text/plain\"},\n\t\tDefaultOutputModes:                []string{\"text/plain\"},\n\t\tURL:                               publicURL,\n\t\tPreferredTransport:                a2acore.TransportProtocolJSONRPC,\n\t\tSkills:                            adka2a.BuildAgentSkills(rootAgent),\n\t\tCapabilities:                      a2acore.AgentCapabilities{Streaming: true},\n\t\tSupportsAuthenticatedExtendedCard: false,\n\t}\n\trouter.Handle(a2asrv.WellKnownAgentCardPath, a2asrv.NewStaticAgentCardHandler(agentCard))\n\n\tagent := config.AgentLoader.RootAgent()\n\texecutor := adka2a.NewExecutor(adka2a.ExecutorConfig{\n\t\tRunnerConfig: runner.Config{\n\t\t\tAppName:         agent.Name(),\n\t\t\tAgent:           agent,\n\t\t\tSessionService:  config.SessionService,\n\t\t\tArtifactService: config.ArtifactService,\n\t\t\tPluginConfig:    config.PluginConfig,\n\t\t},\n\t})\n\treqHandler := a2asrv.NewHandler(executor, config.A2AOptions...)\n\trouter.Handle(apiPath, a2asrv.NewJSONRPCHandler(reqHandler))\n\treturn nil\n}\n\n// SimpleDescription implements web.Sublauncher\nfunc (a *a2aLauncher) SimpleDescription() string {\n\treturn fmt.Sprintf(\"starts A2A server which handles jsonrpc requests on %s path\", apiPath)\n}\n\n// UserMessage implements web.Sublauncher.\nfunc (a *a2aLauncher) UserMessage(webUrl string, printer func(v ...any)) {\n\tprinter(fmt.Sprintf(\"       a2a:  you can access A2A using jsonrpc protocol: %s\", webUrl))\n}\n"
  },
  {
    "path": "cmd/launcher/web/a2a/a2a_test.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage a2a\n\nimport (\n\t\"iter\"\n\t\"net\"\n\t\"strconv\"\n\t\"testing\"\n\t\"time\"\n\n\ta2acore \"github.com/a2aproject/a2a-go/a2a\"\n\t\"github.com/a2aproject/a2a-go/a2aclient\"\n\t\"github.com/a2aproject/a2a-go/a2aclient/agentcard\"\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/agent\"\n\t\"google.golang.org/adk/cmd/launcher\"\n\t\"google.golang.org/adk/cmd/launcher/web\"\n\t\"google.golang.org/adk/session\"\n)\n\nfunc getFreePort(t *testing.T) int {\n\tt.Helper()\n\taddr, err := net.ResolveTCPAddr(\"tcp\", \"localhost:0\")\n\tif err != nil {\n\t\tt.Fatalf(\"net.ResolveTCPAddr() error = %v\", err)\n\t}\n\tlistener, err := net.ListenTCP(\"tcp\", addr)\n\tif err != nil {\n\t\tt.Fatalf(\"net.ListenTCP() error = %v\", err)\n\t}\n\ttcpAddr, ok := listener.Addr().(*net.TCPAddr)\n\tif !ok {\n\t\tt.Fatalf(\"listener.Addr() = %T, want net.TCPAddr\", listener.Addr())\n\t}\n\tport := tcpAddr.Port\n\tif err := listener.Close(); err != nil {\n\t\tt.Fatalf(\"listener.Close() error = %v\", err)\n\t}\n\treturn port\n}\n\nfunc TestWebLauncher_ServesA2A(t *testing.T) {\n\tctx := t.Context()\n\n\tport := getFreePort(t)\n\n\tl := web.NewLauncher(NewLauncher())\n\t_, err := l.Parse([]string{\n\t\t\"--port\", strconv.Itoa(port),\n\t\t\"a2a\", \"--a2a_agent_url\", \"http://localhost:\" + strconv.Itoa(port),\n\t})\n\tif err != nil {\n\t\tt.Fatalf(\"web.NewLauncher() error = %v\", err)\n\t}\n\n\twantMessage := \"Hello, world!\"\n\tagnt, err := agent.New(agent.Config{\n\t\tName: \"HelloWorldAgent\",\n\t\tRun: func(ic agent.InvocationContext) iter.Seq2[*session.Event, error] {\n\t\t\treturn func(yield func(*session.Event, error) bool) {\n\t\t\t\tevent := session.NewEvent(ic.InvocationID())\n\t\t\t\tevent.Content = genai.NewContentFromText(wantMessage, genai.RoleModel)\n\t\t\t\tyield(event, nil)\n\t\t\t}\n\t\t},\n\t})\n\tif err != nil {\n\t\tt.Fatalf(\"agent.New() error = %v\", err)\n\t}\n\tconfig := &launcher.Config{\n\t\tAgentLoader:    agent.NewSingleLoader(agnt),\n\t\tSessionService: session.InMemoryService(),\n\t}\n\n\tgo func() {\n\t\tif err := l.Run(t.Context(), config); err != nil {\n\t\t\tt.Errorf(\"launcher.Run() error = %v\", err)\n\t\t}\n\t}()\n\n\tvar card *a2acore.AgentCard\n\tfor retry := range 3 {\n\t\ttime.Sleep(10 * time.Millisecond) // give server time to start\n\t\tcard, err = agentcard.DefaultResolver.Resolve(ctx, \"http://localhost:\"+strconv.Itoa(port))\n\t\tif err == nil {\n\t\t\tbreak\n\t\t}\n\t\tif retry == 2 {\n\t\t\tt.Fatalf(\"cardResolver.Resolve() error = %v\", err)\n\t\t}\n\t}\n\n\tclient, err := a2aclient.NewFromCard(ctx, card)\n\tif err != nil {\n\t\tt.Fatalf(\"a2aclient.NewFromCard() error = %v\", err)\n\t}\n\n\tgot, err := client.SendMessage(ctx, &a2acore.MessageSendParams{\n\t\tMessage: a2acore.NewMessage(a2acore.MessageRoleUser, a2acore.TextPart{Text: \"Hi!\"}),\n\t})\n\tif err != nil {\n\t\tt.Fatalf(\"client.SendMessage() error = %v\", err)\n\t}\n\ttask, ok := got.(*a2acore.Task)\n\tif !ok {\n\t\tt.Fatalf(\"client.SendMessage() result type = %T, want a2a.Task\", got)\n\t}\n\tif len(task.Artifacts) != 1 {\n\t\tt.Fatalf(\"len(task.Artifacts) = %d, want 1\", len(task.Artifacts))\n\t}\n\tparts := task.Artifacts[0].Parts\n\tif len(parts) != 1 {\n\t\tt.Fatalf(\"len(task.Artifacts[0].Parts) = %d, want 1\", len(parts))\n\t}\n\tif gotPart, ok := parts[0].(a2acore.TextPart); !ok || gotPart.Text != wantMessage {\n\t\tt.Fatalf(\"task.Artifacts[0].Parts[0] = %v, want %v\", parts[0], a2acore.TextPart{Text: wantMessage})\n\t}\n}\n"
  },
  {
    "path": "cmd/launcher/web/api/api.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Package api provides a sublauncher that adds ADK REST API capabilities.\npackage api\n\nimport (\n\t\"flag\"\n\t\"fmt\"\n\t\"net/http\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/gorilla/mux\"\n\n\t\"google.golang.org/adk/cmd/launcher\"\n\tweblauncher \"google.golang.org/adk/cmd/launcher/web\"\n\t\"google.golang.org/adk/internal/cli/util\"\n\t\"google.golang.org/adk/server/adkrest\"\n\t\"google.golang.org/adk/telemetry\"\n)\n\n// apiConfig contains parametres for lauching ADK REST API\ntype apiConfig struct {\n\tfrontendAddress string\n\tpathPrefix      string\n\tsseWriteTimeout time.Duration\n}\n\n// apiLauncher can launch ADK REST API\ntype apiLauncher struct {\n\tflags  *flag.FlagSet\n\tconfig *apiConfig\n}\n\n// CommandLineSyntax returns the command-line syntax for the API launcher.\nfunc (a *apiLauncher) CommandLineSyntax() string {\n\treturn util.FormatFlagUsage(a.flags)\n}\n\n// Adds CORS headers which allow calling ADK REST API from another web app (like ADK WebUI)\nfunc corsWithArgs(frontendAddress string) func(next http.Handler) http.Handler {\n\treturn func(next http.Handler) http.Handler {\n\t\treturn http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {\n\t\t\tw.Header().Set(\"Access-Control-Allow-Origin\", frontendAddress)\n\t\t\tw.Header().Set(\"Access-Control-Allow-Methods\", \"GET, POST, PUT, DELETE, OPTIONS\")\n\t\t\tw.Header().Set(\"Access-Control-Allow-Headers\", \"Content-Type, Authorization\")\n\t\t\tif r.Method == \"OPTIONS\" {\n\t\t\t\tw.WriteHeader(http.StatusOK)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tnext.ServeHTTP(w, r)\n\t\t})\n\t}\n}\n\n// UserMessage implements web.Sublauncher. Prints message to the user\nfunc (a *apiLauncher) UserMessage(webURL string, printer func(v ...any)) {\n\tprinter(fmt.Sprintf(\"       api:  you can access API using %s%s\", webURL, a.config.pathPrefix))\n\tprinter(fmt.Sprintf(\"       api:      for instance: %s%s/list-apps\", webURL, a.config.pathPrefix))\n}\n\n// SetupSubrouters adds the API router to the parent router.\nfunc (a *apiLauncher) SetupSubrouters(router *mux.Router, config *launcher.Config) error {\n\t// Create the ADK REST API handler\n\trestServer, err := adkrest.NewServer(adkrest.ServerConfig{\n\t\tSessionService:  config.SessionService,\n\t\tMemoryService:   config.MemoryService,\n\t\tAgentLoader:     config.AgentLoader,\n\t\tArtifactService: config.ArtifactService,\n\t\tSSEWriteTimeout: a.config.sseWriteTimeout,\n\t\tPluginConfig:    config.PluginConfig,\n\t})\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to create REST server: %w\", err)\n\t}\n\n\tconfig.TelemetryOptions = append(config.TelemetryOptions, telemetry.WithSpanProcessors(restServer.SpanProcessor()), telemetry.WithLogRecordProcessors(restServer.LogProcessor()))\n\n\t// Wrap it with CORS middleware\n\tcorsHandler := corsWithArgs(a.config.frontendAddress)(restServer)\n\n\t// If prefix is empty, don't use PathPrefix(\"\") because it's too greedy.\n\t// Instead, attach the handler to the main router directly.\n\tif a.config.pathPrefix == \"\" || a.config.pathPrefix == \"/\" {\n\t\t// This allows other routes (like /ui/) to match first if registered\n\t\trouter.Methods(\"GET\", \"POST\", \"DELETE\", \"OPTIONS\").Handler(corsHandler)\n\t} else {\n\t\trouter.Methods(\"GET\", \"POST\", \"DELETE\", \"OPTIONS\").\n\t\t\tPathPrefix(a.config.pathPrefix).\n\t\t\tHandler(http.StripPrefix(a.config.pathPrefix, corsHandler))\n\t}\n\treturn nil\n}\n\n// Keyword implements web.Sublauncher. Returns the command-line keyword for API launcher.\nfunc (a *apiLauncher) Keyword() string {\n\treturn \"api\"\n}\n\n// Parse parses the command-line arguments for the API launcher.\nfunc (a *apiLauncher) Parse(args []string) ([]string, error) {\n\terr := a.flags.Parse(args)\n\tif err != nil || !a.flags.Parsed() {\n\t\treturn nil, fmt.Errorf(\"failed to parse api flags: %v\", err)\n\t}\n\tp := a.config.pathPrefix\n\tif !strings.HasPrefix(p, \"/\") {\n\t\tp = \"/\" + p\n\t}\n\ta.config.pathPrefix = strings.TrimSuffix(p, \"/\")\n\n\trestArgs := a.flags.Args()\n\treturn restArgs, nil\n}\n\n// SimpleDescription implements web.Sublauncher. Returns a simple description of the API launcher.\nfunc (a *apiLauncher) SimpleDescription() string {\n\treturn \"starts ADK REST API server, accepting origins specified by webui_address (CORS)\"\n}\n\n// NewLauncher creates new api launcher. It extends Web launcher\nfunc NewLauncher() weblauncher.Sublauncher {\n\tconfig := &apiConfig{}\n\n\tfs := flag.NewFlagSet(\"web\", flag.ContinueOnError)\n\tfs.StringVar(&config.frontendAddress, \"webui_address\", \"localhost:8080\", \"ADK WebUI address as seen from the user browser. It's used to allow CORS requests. Please specify only hostname and (optionally) port.\")\n\tfs.StringVar(&config.pathPrefix, \"path_prefix\", \"/api\", \"ADK REST API path prefix. Default is '/api'.\")\n\tfs.DurationVar(&config.sseWriteTimeout, \"sse-write-timeout\", 120*time.Second, \"SSE server write timeout (i.e. '10s', '2m' - see time.ParseDuration for details) - for writing the SSE response after reading the headers & body\")\n\n\treturn &apiLauncher{\n\t\tconfig: config,\n\t\tflags:  fs,\n\t}\n}\n"
  },
  {
    "path": "cmd/launcher/web/web.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Package web provides a way to run ADK using a web server.\npackage web\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"flag\"\n\t\"fmt\"\n\t\"log\"\n\t\"net/http\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/gorilla/mux\"\n\n\t\"google.golang.org/adk/cmd/launcher\"\n\t\"google.golang.org/adk/cmd/launcher/internal/telemetry\"\n\t\"google.golang.org/adk/cmd/launcher/universal\"\n\t\"google.golang.org/adk/internal/cli/util\"\n\t\"google.golang.org/adk/session\"\n)\n\n// webConfig contains parameters for launching web server\ntype webConfig struct {\n\tport            int\n\twriteTimeout    time.Duration\n\treadTimeout     time.Duration\n\tidleTimeout     time.Duration\n\tshutdownTimeout time.Duration\n\totelToCloud     bool\n}\n\n// webLauncher can launch web server\ntype webLauncher struct {\n\tflags        *flag.FlagSet\n\tconfig       *webConfig\n\tsublaunchers []Sublauncher\n\t// maps keyword to sublauncher for the keywords parsed from command line\n\tactiveSublaunchers map[string]Sublauncher\n}\n\n// Execute implements launcher.Launcher.\nfunc (w *webLauncher) Execute(ctx context.Context, config *launcher.Config, args []string) error {\n\tremainingArgs, err := w.Parse(args)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"cannot parse args: %w\", err)\n\t}\n\t// do not accept additional arguments\n\terr = universal.ErrorOnUnparsedArgs(remainingArgs)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"cannot parse all the arguments: %w\", err)\n\t}\n\treturn w.Run(ctx, config)\n}\n\n// Sublauncher defines an interface for extending the WebLauncher.\n// Each sublauncher can add its own routes, wrap existing handlers, and parse its own command-line flags.\ntype Sublauncher interface {\n\t// Keyword is used to request usage of the Sublauncher from command-line\n\tKeyword() string\n\t// Parse after parsing command line args returns the remaining un-parsed arguments or error\n\tParse(args []string) ([]string, error)\n\t// CommandLineSyntax returns a formatted string explaining command line syntax to end user\n\tCommandLineSyntax() string\n\t// SimpleDescription returns a short explanatory text displayed to end user\n\tSimpleDescription() string\n\n\t// SetupSubrouters adds sublauncher-specific routes to the router.\n\tSetupSubrouters(router *mux.Router, config *launcher.Config) error\n\t// UserMessage is a hook for sublaunchers to print a message to the user when the web server starts.\n\tUserMessage(webURL string, printer func(v ...any))\n}\n\n// CommandLineSyntax implements launcher.Launcher.\nfunc (w *webLauncher) CommandLineSyntax() string {\n\tvar b strings.Builder\n\tfmt.Fprint(&b, util.FormatFlagUsage(w.flags))\n\tfmt.Fprintf(&b, \"  You may specify sublaunchers:\\n\")\n\tfor _, l := range w.sublaunchers {\n\t\tfmt.Fprintf(&b, \"    * %s - %s\\n\", l.Keyword(), l.SimpleDescription())\n\t}\n\tfmt.Fprintf(&b, \"  Sublaunchers syntax:\\n\")\n\tfor _, l := range w.sublaunchers {\n\t\tfmt.Fprintf(&b, \"    %s\\n  %s\\n\", l.Keyword(), l.CommandLineSyntax())\n\t}\n\treturn b.String()\n}\n\n// Keyword implements launcher.SubLauncher.\nfunc (w *webLauncher) Keyword() string {\n\treturn \"web\"\n}\n\n// Parse implements launcher.SubLauncher. It parses the web launcher's flags\n// and then iterates through the remaining arguments to find and parse arguments\n// for any specified sublaunchers. It returns any arguments that are not processed.\nfunc (w *webLauncher) Parse(args []string) ([]string, error) {\n\tkeyToSublauncher := make(map[string]Sublauncher)\n\tfor _, l := range w.sublaunchers {\n\t\tif _, ok := keyToSublauncher[l.Keyword()]; ok {\n\t\t\treturn nil, fmt.Errorf(\"cannot create universal launcher. Keywords for sublaunchers should be unique and they are not: '%s'\", l.Keyword())\n\t\t}\n\t\tkeyToSublauncher[l.Keyword()] = l\n\t}\n\n\terr := w.flags.Parse(args)\n\tif err != nil || !w.flags.Parsed() {\n\t\treturn nil, fmt.Errorf(\"failed to parse web flags: %v\", err)\n\t}\n\n\trestArgs := w.flags.Args()\n\tw.activeSublaunchers = make(map[string]Sublauncher)\n\n\tfor len(restArgs) > 0 {\n\t\tkeyword := restArgs[0]\n\t\tif _, ok := w.activeSublaunchers[keyword]; ok {\n\t\t\t// already processed\n\t\t\treturn restArgs, fmt.Errorf(\"the keyword %q is specified and processed more than once, which is not allowed\", keyword)\n\t\t}\n\n\t\tif sublauncher, ok := keyToSublauncher[keyword]; ok {\n\t\t\t// skip the keyword and move on\n\t\t\trestArgs, err = sublauncher.Parse(restArgs[1:])\n\t\t\tif err != nil {\n\t\t\t\treturn nil, fmt.Errorf(\"the %q launcher cannot parse arguments: %v\", keyword, err)\n\t\t\t}\n\t\t\tw.activeSublaunchers[keyword] = sublauncher\n\t\t} else {\n\t\t\t// not known keyword, let it be processed elsewhere\n\t\t\tbreak\n\t\t}\n\t}\n\treturn restArgs, nil\n}\n\n// Run implements launcher.SubLauncher.\nfunc (w *webLauncher) Run(ctx context.Context, config *launcher.Config) error {\n\tif config.SessionService == nil {\n\t\tconfig.SessionService = session.InMemoryService()\n\t}\n\n\trouter := BuildBaseRouter()\n\n\t// check if there are any active sublaunchers\n\tif len(w.activeSublaunchers) == 0 {\n\t\tavailableSublaunchers := make([]string, len(w.sublaunchers))\n\t\tfor i, l := range w.sublaunchers {\n\t\t\tavailableSublaunchers[i] = l.Keyword()\n\t\t}\n\t\treturn fmt.Errorf(\"no active sublaunchers found - please specify them in the command line. Possible values: %v\", availableSublaunchers)\n\t}\n\n\t// Setup subrouters\n\tfor _, l := range w.sublaunchers {\n\t\tif _, isActive := w.activeSublaunchers[l.Keyword()]; isActive {\n\t\t\tif err := l.SetupSubrouters(router, config); err != nil {\n\t\t\t\treturn fmt.Errorf(\"%s subrouter setup failed: %v\", l.Keyword(), err)\n\t\t\t}\n\t\t}\n\t}\n\n\tlog.Printf(\"Starting the web server: %+v\", w.config)\n\tlog.Println()\n\twebUrl := fmt.Sprintf(\"http://localhost:%v\", fmt.Sprint(w.config.port))\n\tlog.Printf(\"Web servers starts on %s\", webUrl)\n\tfor _, l := range w.activeSublaunchers {\n\t\tl.UserMessage(webUrl, log.Println)\n\t}\n\tlog.Println()\n\n\tsrv := http.Server{\n\t\tAddr:         fmt.Sprintf(\":%v\", fmt.Sprint(w.config.port)),\n\t\tWriteTimeout: w.config.writeTimeout,\n\t\tReadTimeout:  w.config.readTimeout,\n\t\tIdleTimeout:  w.config.idleTimeout,\n\t\tHandler:      router,\n\t}\n\n\terrChan := make(chan error, 1)\n\tgo func() {\n\t\tif err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {\n\t\t\terrChan <- err\n\t\t}\n\t\tclose(errChan)\n\t}()\n\n\ttelemetryService, err := telemetry.InitAndSetGlobalOtelProviders(ctx, config, w.config.otelToCloud)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"telemetry initialization failed: %v\", err)\n\t}\n\n\tselect {\n\tcase <-ctx.Done():\n\t\tlog.Println(\"Shutting down the web server...\")\n\t\tshutdownCtx, cancel := context.WithTimeout(context.Background(), w.config.shutdownTimeout)\n\t\tdefer cancel()\n\t\tserverErr := srv.Shutdown(shutdownCtx)\n\t\ttelemetryErr := telemetryService.Shutdown(shutdownCtx)\n\t\treturn errors.Join(serverErr, telemetryErr)\n\tcase err, ok := <-errChan:\n\t\tif !ok {\n\t\t\treturn nil\n\t\t}\n\t\treturn fmt.Errorf(\"server failed: %v\", err)\n\t}\n}\n\n// SimpleDescription implements launcher.SubLauncher.\nfunc (w *webLauncher) SimpleDescription() string {\n\treturn \"starts web server with additional sub-servers specified by sublaunchers\"\n}\n\n// NewLauncher creates a new WebLauncher. It should be extended by providing\n// one or more Sublaunchers that add the actual content and functionality.\nfunc NewLauncher(sublaunchers ...Sublauncher) launcher.SubLauncher {\n\tconfig := &webConfig{}\n\n\tfs := flag.NewFlagSet(\"web\", flag.ContinueOnError)\n\tfs.IntVar(&config.port, \"port\", 8080, \"Localhost port for the server\")\n\tfs.DurationVar(&config.writeTimeout, \"write-timeout\", 15*time.Second, \"Server write timeout (i.e. '10s', '2m' - see time.ParseDuration for details) - for writing the response after reading the headers & body\")\n\tfs.DurationVar(&config.readTimeout, \"read-timeout\", 15*time.Second, \"Server read timeout (i.e. '10s', '2m' - see time.ParseDuration for details) - for reading the whole request including body\")\n\tfs.DurationVar(&config.idleTimeout, \"idle-timeout\", 60*time.Second, \"Server idle timeout (i.e. '10s', '2m' - see time.ParseDuration for details) - for waiting for the next request (only when keep-alive is enabled)\")\n\tfs.DurationVar(&config.shutdownTimeout, \"shutdown-timeout\", 15*time.Second, \"Server shutdown timeout (i.e. '10s', '2m' - see time.ParseDuration for details) - for waiting for active requests to finish during shutdown\")\n\tfs.BoolVar(&config.otelToCloud, \"otel_to_cloud\", false, \"Enables/disables OpenTelemetry export to GCP: telemetry.googleapis.com. See adk-go/telemetry package for details about supported options, credentials and environment variables.\")\n\n\treturn &webLauncher{\n\t\tconfig:       config,\n\t\tflags:        fs,\n\t\tsublaunchers: sublaunchers,\n\t}\n}\n\n// logger is a middleware that logs the HTTP method, request URI, and the time taken to process the request.\nfunc logger(inner http.Handler) http.Handler {\n\treturn http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {\n\t\tstart := time.Now()\n\n\t\tinner.ServeHTTP(w, r)\n\n\t\tlog.Printf(\n\t\t\t\"%s %s %s\",\n\t\t\tr.Method,\n\t\t\tr.RequestURI,\n\t\t\ttime.Since(start),\n\t\t)\n\t})\n}\n\n// BuildBaseRouter returns the main router, which can be extended by sub-routers.\nfunc BuildBaseRouter() *mux.Router {\n\trouter := mux.NewRouter().StrictSlash(true)\n\trouter.Use(logger)\n\treturn router\n}\n"
  },
  {
    "path": "cmd/launcher/web/webui/distr/assets/audio-processor.js",
    "content": "/**\n * Copyright 2025 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nclass AudioProcessor extends AudioWorkletProcessor {\n    constructor() {\n        super();\n        this.targetSampleRate = 22000;  // Change to your desired rate\n        this.originalSampleRate = sampleRate; // Browser's sample rate\n        this.resampleRatio = this.originalSampleRate / this.targetSampleRate;\n    }\n\n    process(inputs, outputs, parameters) {\n        const input = inputs[0];\n        if (input.length > 0) {\n            let audioData = input[0]; // Get first channel's data\n            \n            if (this.resampleRatio !== 1) {\n                audioData = this.resample(audioData);\n            }\n\n            this.port.postMessage(audioData);\n        }\n        return true; // Keep processor alive\n    }\n\n    resample(audioData) {\n        const newLength = Math.round(audioData.length / this.resampleRatio);\n        const resampled = new Float32Array(newLength);\n\n        for (let i = 0; i < newLength; i++) {\n            const srcIndex = Math.floor(i * this.resampleRatio);\n            resampled[i] = audioData[srcIndex]; // Nearest neighbor resampling\n        }\n        return resampled;\n    }\n}\n\nregisterProcessor('audio-processor', AudioProcessor);\n"
  },
  {
    "path": "cmd/launcher/web/webui/distr/assets/config/runtime-config.json",
    "content": "{\n  \"backendUrl\": \"\"\n}"
  },
  {
    "path": "cmd/launcher/web/webui/distr/chunk-2FK4DXD6.js",
    "content": "import{$a as c,Ca as o,Fb as h,Kb as y,Pa as a,Xb as C,Yb as g,db as d,lc as v,ld as _,md as w,tb as s,ub as l,vb as p,wb as m,xb as u,yb as f}from\"./chunk-7TJPJFPQ.js\";import\"./chunk-W7GRJBO5.js\";var D=e=>[e];function M(e,F){if(e&1&&h(0,0),e&2){let i=F.$implicit,n=y();m(\"surfaceId\",n.surfaceId())(\"component\",i)}}var T=(()=>{class e extends _{static \\u0275fac=(()=>{let i;return function(t){return(i||(i=o(e)))(t||e)}})();static \\u0275cmp=c({type:e,selectors:[[\"a2ui-card\"]],features:[d],decls:3,vars:6,consts:[[\"a2ui-renderer\",\"\",3,\"surfaceId\",\"component\"]],template:function(n,t){if(n&1&&(u(0,\"section\"),l(1,M,1,2,\"ng-container\",0,s),f()),n&2){let r=t.component().properties,I=r.children||v(4,D,r.child);C(t.theme.additionalStyles==null?null:t.theme.additionalStyles.Card),g(t.theme.components.Card),a(),p(I)}},dependencies:[w],styles:[`a2ui-card{display:block;flex:var(--weight);min-height:0;overflow:auto}a2ui-card>section{height:100%;width:100%;min-height:0;overflow:auto}a2ui-card>section>*{height:100%;width:100%}\n`],encapsulation:2})}return e})();export{T as Card};\n"
  },
  {
    "path": "cmd/launcher/web/webui/distr/chunk-4ZK7FQPX.js",
    "content": "import{$a as s,Ab as m,Ac as I,Bb as d,Ca as a,Kb as p,Pa as i,Xb as u,Yb as v,Zb as f,_b as y,db as r,fc as g,gc as h,hc as x,ld as M,pb as c,rb as l,uc as C}from\"./chunk-7TJPJFPQ.js\";import\"./chunk-W7GRJBO5.js\";function _(e,D){if(e&1&&(m(0,\"section\")(1,\"span\",1),f(2),d()()),e&2){let t=p(),n=x(0);u(t.theme.additionalStyles==null?null:t.theme.additionalStyles.Icon),v(t.theme.components.Icon),i(2),y(n)}}var S=(()=>{class e extends M{name=I.required();resolvedName=C(()=>this.resolvePrimitive(this.name()));static \\u0275fac=(()=>{let t;return function(o){return(t||(t=a(e)))(o||e)}})();static \\u0275cmp=s({type:e,selectors:[[\"a2ui-icon\"]],inputs:{name:[1,\"name\"]},features:[r],decls:2,vars:2,consts:[[3,\"class\",\"style\"],[1,\"g-icon\"]],template:function(n,o){if(n&1&&(g(0),c(1,_,3,5,\"section\",0)),n&2){let N=h(o.resolvedName());i(),l(N?1:-1)}},styles:[\"[_nghost-%COMP%]{display:block;flex:var(--weight);min-height:0;overflow:auto}\"]})}return e})();export{S as Icon};\n"
  },
  {
    "path": "cmd/launcher/web/webui/distr/chunk-7TJPJFPQ.js",
    "content": "import{a as M,b as P,e as pr,g as lt}from\"./chunk-W7GRJBO5.js\";var me=null,Li=!1,Ha=1,tD=null,ne=Symbol(\"SIGNAL\");function I(e){let t=me;return me=e,t}function ji(){return me}var Qt={version:0,lastCleanEpoch:0,dirty:!1,producers:void 0,producersTail:void 0,consumers:void 0,consumersTail:void 0,recomputing:!1,consumerAllowSignalWrites:!1,consumerIsAlwaysLive:!1,kind:\"unknown\",producerMustRecompute:()=>!1,producerRecomputeValue:()=>{},consumerMarkedDirty:()=>{},consumerOnSignalRead:()=>{}};function Kt(e){if(Li)throw new Error(\"\");if(me===null)return;me.consumerOnSignalRead(e);let t=me.producersTail;if(t!==void 0&&t.producer===e)return;let n,r=me.recomputing;if(r&&(n=t!==void 0?t.nextProducer:me.producers,n!==void 0&&n.producer===e)){me.producersTail=n,n.lastReadVersion=e.version;return}let o=e.consumersTail;if(o!==void 0&&o.consumer===me&&(!r||rD(o,me)))return;let i=mr(me),s={producer:e,consumer:me,nextProducer:n,prevConsumer:o,lastReadVersion:e.version,nextConsumer:void 0};me.producersTail=s,t!==void 0?t.nextProducer=s:me.producers=s,i&&Fh(e,s)}function Nh(){Ha++}function xn(e){if(!(mr(e)&&!e.dirty)&&!(!e.dirty&&e.lastCleanEpoch===Ha)){if(!e.producerMustRecompute(e)&&!gr(e)){hr(e);return}e.producerRecomputeValue(e),hr(e)}}function $a(e){if(e.consumers===void 0)return;let t=Li;Li=!0;try{for(let n=e.consumers;n!==void 0;n=n.nextConsumer){let r=n.consumer;r.dirty||nD(r)}}finally{Li=t}}function Ua(){return me?.consumerAllowSignalWrites!==!1}function nD(e){e.dirty=!0,$a(e),e.consumerMarkedDirty?.(e)}function hr(e){e.dirty=!1,e.lastCleanEpoch=Ha}function Tt(e){return e&&kh(e),I(e)}function kh(e){e.producersTail=void 0,e.recomputing=!0}function Jt(e,t){I(t),e&&Rh(e)}function Rh(e){e.recomputing=!1;let t=e.producersTail,n=t!==void 0?t.nextProducer:e.producers;if(n!==void 0){if(mr(e))do n=za(n);while(n!==void 0);t!==void 0?t.nextProducer=void 0:e.producers=void 0}}function gr(e){for(let t=e.producers;t!==void 0;t=t.nextProducer){let n=t.producer,r=t.lastReadVersion;if(r!==n.version||(xn(n),r!==n.version))return!0}return!1}function Xt(e){if(mr(e)){let t=e.producers;for(;t!==void 0;)t=za(t)}e.producers=void 0,e.producersTail=void 0,e.consumers=void 0,e.consumersTail=void 0}function Fh(e,t){let n=e.consumersTail,r=mr(e);if(n!==void 0?(t.nextConsumer=n.nextConsumer,n.nextConsumer=t):(t.nextConsumer=void 0,e.consumers=t),t.prevConsumer=n,e.consumersTail=t,!r)for(let o=e.producers;o!==void 0;o=o.nextProducer)Fh(o.producer,o)}function za(e){let t=e.producer,n=e.nextProducer,r=e.nextConsumer,o=e.prevConsumer;if(e.nextConsumer=void 0,e.prevConsumer=void 0,r!==void 0?r.prevConsumer=o:t.consumersTail=o,o!==void 0)o.nextConsumer=r;else if(t.consumers=r,!mr(t)){let i=t.producers;for(;i!==void 0;)i=za(i)}return n}function mr(e){return e.consumerIsAlwaysLive||e.consumers!==void 0}function bo(e){tD?.(e)}function rD(e,t){let n=t.producersTail;if(n!==void 0){let r=t.producers;do{if(r===e)return!0;if(r===n)break;r=r.nextProducer}while(r!==void 0)}return!1}function vo(e,t){return Object.is(e,t)}function Do(e,t){let n=Object.create(oD);n.computation=e,t!==void 0&&(n.equal=t);let r=()=>{if(xn(n),Kt(n),n.value===dt)throw n.error;return n.value};return r[ne]=n,bo(n),r}var Yt=Symbol(\"UNSET\"),wn=Symbol(\"COMPUTING\"),dt=Symbol(\"ERRORED\"),oD=P(M({},Qt),{value:Yt,dirty:!0,error:null,equal:vo,kind:\"computed\",producerMustRecompute(e){return e.value===Yt||e.value===wn},producerRecomputeValue(e){if(e.value===wn)throw new Error(\"\");let t=e.value;e.value=wn;let n=Tt(e),r,o=!1;try{r=e.computation(),I(null),o=t!==Yt&&t!==dt&&r!==dt&&e.equal(t,r)}catch(i){r=dt,e.error=i}finally{Jt(e,n)}if(o){e.value=t;return}e.value=r,e.version++}});function iD(){throw new Error}var Oh=iD;function Ph(e){Oh(e)}function qa(e){Oh=e}var sD=null;function Ga(e,t){let n=Object.create(Eo);n.value=e,t!==void 0&&(n.equal=t);let r=()=>Lh(n);return r[ne]=n,bo(n),[r,s=>In(n,s),s=>Bi(n,s)]}function Lh(e){return Kt(e),e.value}function In(e,t){Ua()||Ph(e),e.equal(e.value,t)||(e.value=t,uD(e))}function Bi(e,t){Ua()||Ph(e),In(e,t(e.value))}var Eo=P(M({},Qt),{equal:vo,value:void 0,kind:\"signal\"});function uD(e){e.version++,Nh(),$a(e),sD?.(e)}var Wa=P(M({},Qt),{consumerIsAlwaysLive:!0,consumerAllowSignalWrites:!0,dirty:!0,kind:\"effect\"});function Za(e){if(e.dirty=!1,e.version>0&&!gr(e))return;e.version++;let t=Tt(e);try{e.cleanup(),e.fn()}finally{Jt(e,t)}}function k(e){return typeof e==\"function\"}function yr(e){let n=e(r=>{Error.call(r),r.stack=new Error().stack});return n.prototype=Object.create(Error.prototype),n.prototype.constructor=n,n}var Vi=yr(e=>function(n){e(this),this.message=n?`${n.length} errors occurred during unsubscription:\n${n.map((r,o)=>`${o+1}) ${r.toString()}`).join(`\n  `)}`:\"\",this.name=\"UnsubscriptionError\",this.errors=n});function Tn(e,t){if(e){let n=e.indexOf(t);0<=n&&e.splice(n,1)}}var X=class e{constructor(t){this.initialTeardown=t,this.closed=!1,this._parentage=null,this._finalizers=null}unsubscribe(){let t;if(!this.closed){this.closed=!0;let{_parentage:n}=this;if(n)if(this._parentage=null,Array.isArray(n))for(let i of n)i.remove(this);else n.remove(this);let{initialTeardown:r}=this;if(k(r))try{r()}catch(i){t=i instanceof Vi?i.errors:[i]}let{_finalizers:o}=this;if(o){this._finalizers=null;for(let i of o)try{jh(i)}catch(s){t=t??[],s instanceof Vi?t=[...t,...s.errors]:t.push(s)}}if(t)throw new Vi(t)}}add(t){var n;if(t&&t!==this)if(this.closed)jh(t);else{if(t instanceof e){if(t.closed||t._hasParent(this))return;t._addParent(this)}(this._finalizers=(n=this._finalizers)!==null&&n!==void 0?n:[]).push(t)}}_hasParent(t){let{_parentage:n}=this;return n===t||Array.isArray(n)&&n.includes(t)}_addParent(t){let{_parentage:n}=this;this._parentage=Array.isArray(n)?(n.push(t),n):n?[n,t]:t}_removeParent(t){let{_parentage:n}=this;n===t?this._parentage=null:Array.isArray(n)&&Tn(n,t)}remove(t){let{_finalizers:n}=this;n&&Tn(n,t),t instanceof e&&t._removeParent(this)}};X.EMPTY=(()=>{let e=new X;return e.closed=!0,e})();var Ya=X.EMPTY;function Hi(e){return e instanceof X||e&&\"closed\"in e&&k(e.remove)&&k(e.add)&&k(e.unsubscribe)}function jh(e){k(e)?e():e.unsubscribe()}var We={onUnhandledError:null,onStoppedNotification:null,Promise:void 0,useDeprecatedSynchronousErrorHandling:!1,useDeprecatedNextContext:!1};var br={setTimeout(e,t,...n){let{delegate:r}=br;return r?.setTimeout?r.setTimeout(e,t,...n):setTimeout(e,t,...n)},clearTimeout(e){let{delegate:t}=br;return(t?.clearTimeout||clearTimeout)(e)},delegate:void 0};function $i(e){br.setTimeout(()=>{let{onUnhandledError:t}=We;if(t)t(e);else throw e})}function St(){}var Bh=Qa(\"C\",void 0,void 0);function Vh(e){return Qa(\"E\",void 0,e)}function Hh(e){return Qa(\"N\",e,void 0)}function Qa(e,t,n){return{kind:e,value:t,error:n}}var Sn=null;function vr(e){if(We.useDeprecatedSynchronousErrorHandling){let t=!Sn;if(t&&(Sn={errorThrown:!1,error:null}),e(),t){let{errorThrown:n,error:r}=Sn;if(Sn=null,n)throw r}}else e()}function $h(e){We.useDeprecatedSynchronousErrorHandling&&Sn&&(Sn.errorThrown=!0,Sn.error=e)}var Mn=class extends X{constructor(t){super(),this.isStopped=!1,t?(this.destination=t,Hi(t)&&t.add(this)):this.destination=lD}static create(t,n,r){return new Ze(t,n,r)}next(t){this.isStopped?Ja(Hh(t),this):this._next(t)}error(t){this.isStopped?Ja(Vh(t),this):(this.isStopped=!0,this._error(t))}complete(){this.isStopped?Ja(Bh,this):(this.isStopped=!0,this._complete())}unsubscribe(){this.closed||(this.isStopped=!0,super.unsubscribe(),this.destination=null)}_next(t){this.destination.next(t)}_error(t){try{this.destination.error(t)}finally{this.unsubscribe()}}_complete(){try{this.destination.complete()}finally{this.unsubscribe()}}},aD=Function.prototype.bind;function Ka(e,t){return aD.call(e,t)}var Xa=class{constructor(t){this.partialObserver=t}next(t){let{partialObserver:n}=this;if(n.next)try{n.next(t)}catch(r){Ui(r)}}error(t){let{partialObserver:n}=this;if(n.error)try{n.error(t)}catch(r){Ui(r)}else Ui(t)}complete(){let{partialObserver:t}=this;if(t.complete)try{t.complete()}catch(n){Ui(n)}}},Ze=class extends Mn{constructor(t,n,r){super();let o;if(k(t)||!t)o={next:t??void 0,error:n??void 0,complete:r??void 0};else{let i;this&&We.useDeprecatedNextContext?(i=Object.create(t),i.unsubscribe=()=>this.unsubscribe(),o={next:t.next&&Ka(t.next,i),error:t.error&&Ka(t.error,i),complete:t.complete&&Ka(t.complete,i)}):o=t}this.destination=new Xa(o)}};function Ui(e){We.useDeprecatedSynchronousErrorHandling?$h(e):$i(e)}function cD(e){throw e}function Ja(e,t){let{onStoppedNotification:n}=We;n&&br.setTimeout(()=>n(e,t))}var lD={closed:!0,next:St,error:cD,complete:St};var Dr=typeof Symbol==\"function\"&&Symbol.observable||\"@@observable\";function Ee(e){return e}function dD(...e){return ec(e)}function ec(e){return e.length===0?Ee:e.length===1?e[0]:function(n){return e.reduce((r,o)=>o(r),n)}}var B=(()=>{class e{constructor(n){n&&(this._subscribe=n)}lift(n){let r=new e;return r.source=this,r.operator=n,r}subscribe(n,r,o){let i=pD(n)?n:new Ze(n,r,o);return vr(()=>{let{operator:s,source:u}=this;i.add(s?s.call(i,u):u?this._subscribe(i):this._trySubscribe(i))}),i}_trySubscribe(n){try{return this._subscribe(n)}catch(r){n.error(r)}}forEach(n,r){return r=Uh(r),new r((o,i)=>{let s=new Ze({next:u=>{try{n(u)}catch(a){i(a),s.unsubscribe()}},error:i,complete:o});this.subscribe(s)})}_subscribe(n){var r;return(r=this.source)===null||r===void 0?void 0:r.subscribe(n)}[Dr](){return this}pipe(...n){return ec(n)(this)}toPromise(n){return n=Uh(n),new n((r,o)=>{let i;this.subscribe(s=>i=s,s=>o(s),()=>r(i))})}}return e.create=t=>new e(t),e})();function Uh(e){var t;return(t=e??We.Promise)!==null&&t!==void 0?t:Promise}function fD(e){return e&&k(e.next)&&k(e.error)&&k(e.complete)}function pD(e){return e&&e instanceof Mn||fD(e)&&Hi(e)}function tc(e){return k(e?.lift)}function j(e){return t=>{if(tc(t))return t.lift(function(n){try{return e(n,this)}catch(r){this.error(r)}});throw new TypeError(\"Unable to lift unknown Observable type\")}}function R(e,t,n,r,o){return new nc(e,t,n,r,o)}var nc=class extends Mn{constructor(t,n,r,o,i,s){super(t),this.onFinalize=i,this.shouldUnsubscribe=s,this._next=n?function(u){try{n(u)}catch(a){t.error(a)}}:super._next,this._error=o?function(u){try{o(u)}catch(a){t.error(a)}finally{this.unsubscribe()}}:super._error,this._complete=r?function(){try{r()}catch(u){t.error(u)}finally{this.unsubscribe()}}:super._complete}unsubscribe(){var t;if(!this.shouldUnsubscribe||this.shouldUnsubscribe()){let{closed:n}=this;super.unsubscribe(),!n&&((t=this.onFinalize)===null||t===void 0||t.call(this))}}};function zh(){return j((e,t)=>{let n=null;e._refCount++;let r=R(t,void 0,void 0,void 0,()=>{if(!e||e._refCount<=0||0<--e._refCount){n=null;return}let o=e._connection,i=n;n=null,o&&(!i||o===i)&&o.unsubscribe(),t.unsubscribe()});e.subscribe(r),r.closed||(n=e.connect())})}var rc=class extends B{constructor(t,n){super(),this.source=t,this.subjectFactory=n,this._subject=null,this._refCount=0,this._connection=null,tc(t)&&(this.lift=t.lift)}_subscribe(t){return this.getSubject().subscribe(t)}getSubject(){let t=this._subject;return(!t||t.isStopped)&&(this._subject=this.subjectFactory()),this._subject}_teardown(){this._refCount=0;let{_connection:t}=this;this._subject=this._connection=null,t?.unsubscribe()}connect(){let t=this._connection;if(!t){t=this._connection=new X;let n=this.getSubject();t.add(this.source.subscribe(R(n,void 0,()=>{this._teardown(),n.complete()},r=>{this._teardown(),n.error(r)},()=>this._teardown()))),t.closed&&(this._connection=null,t=X.EMPTY)}return t}refCount(){return zh()(this)}};var Er={schedule(e){let t=requestAnimationFrame,n=cancelAnimationFrame,{delegate:r}=Er;r&&(t=r.requestAnimationFrame,n=r.cancelAnimationFrame);let o=t(i=>{n=void 0,e(i)});return new X(()=>n?.(o))},requestAnimationFrame(...e){let{delegate:t}=Er;return(t?.requestAnimationFrame||requestAnimationFrame)(...e)},cancelAnimationFrame(...e){let{delegate:t}=Er;return(t?.cancelAnimationFrame||cancelAnimationFrame)(...e)},delegate:void 0};var qh=yr(e=>function(){e(this),this.name=\"ObjectUnsubscribedError\",this.message=\"object unsubscribed\"});var ce=(()=>{class e extends B{constructor(){super(),this.closed=!1,this.currentObservers=null,this.observers=[],this.isStopped=!1,this.hasError=!1,this.thrownError=null}lift(n){let r=new zi(this,this);return r.operator=n,r}_throwIfClosed(){if(this.closed)throw new qh}next(n){vr(()=>{if(this._throwIfClosed(),!this.isStopped){this.currentObservers||(this.currentObservers=Array.from(this.observers));for(let r of this.currentObservers)r.next(n)}})}error(n){vr(()=>{if(this._throwIfClosed(),!this.isStopped){this.hasError=this.isStopped=!0,this.thrownError=n;let{observers:r}=this;for(;r.length;)r.shift().error(n)}})}complete(){vr(()=>{if(this._throwIfClosed(),!this.isStopped){this.isStopped=!0;let{observers:n}=this;for(;n.length;)n.shift().complete()}})}unsubscribe(){this.isStopped=this.closed=!0,this.observers=this.currentObservers=null}get observed(){var n;return((n=this.observers)===null||n===void 0?void 0:n.length)>0}_trySubscribe(n){return this._throwIfClosed(),super._trySubscribe(n)}_subscribe(n){return this._throwIfClosed(),this._checkFinalizedStatuses(n),this._innerSubscribe(n)}_innerSubscribe(n){let{hasError:r,isStopped:o,observers:i}=this;return r||o?Ya:(this.currentObservers=null,i.push(n),new X(()=>{this.currentObservers=null,Tn(i,n)}))}_checkFinalizedStatuses(n){let{hasError:r,thrownError:o,isStopped:i}=this;r?n.error(o):i&&n.complete()}asObservable(){let n=new B;return n.source=this,n}}return e.create=(t,n)=>new zi(t,n),e})(),zi=class extends ce{constructor(t,n){super(),this.destination=t,this.source=n}next(t){var n,r;(r=(n=this.destination)===null||n===void 0?void 0:n.next)===null||r===void 0||r.call(n,t)}error(t){var n,r;(r=(n=this.destination)===null||n===void 0?void 0:n.error)===null||r===void 0||r.call(n,t)}complete(){var t,n;(n=(t=this.destination)===null||t===void 0?void 0:t.complete)===null||n===void 0||n.call(t)}_subscribe(t){var n,r;return(r=(n=this.source)===null||n===void 0?void 0:n.subscribe(t))!==null&&r!==void 0?r:Ya}};var Co=class extends ce{constructor(t){super(),this._value=t}get value(){return this.getValue()}_subscribe(t){let n=super._subscribe(t);return!n.closed&&t.next(this._value),n}getValue(){let{hasError:t,thrownError:n,_value:r}=this;if(t)throw n;return this._throwIfClosed(),r}next(t){super.next(this._value=t)}};var _o={now(){return(_o.delegate||Date).now()},delegate:void 0};var wo=class extends ce{constructor(t=1/0,n=1/0,r=_o){super(),this._bufferSize=t,this._windowTime=n,this._timestampProvider=r,this._buffer=[],this._infiniteTimeWindow=!0,this._infiniteTimeWindow=n===1/0,this._bufferSize=Math.max(1,t),this._windowTime=Math.max(1,n)}next(t){let{isStopped:n,_buffer:r,_infiniteTimeWindow:o,_timestampProvider:i,_windowTime:s}=this;n||(r.push(t),!o&&r.push(i.now()+s)),this._trimBuffer(),super.next(t)}_subscribe(t){this._throwIfClosed(),this._trimBuffer();let n=this._innerSubscribe(t),{_infiniteTimeWindow:r,_buffer:o}=this,i=o.slice();for(let s=0;s<i.length&&!t.closed;s+=r?1:2)t.next(i[s]);return this._checkFinalizedStatuses(t),n}_trimBuffer(){let{_bufferSize:t,_timestampProvider:n,_buffer:r,_infiniteTimeWindow:o}=this,i=(o?1:2)*t;if(t<1/0&&i<r.length&&r.splice(0,r.length-i),!o){let s=n.now(),u=0;for(let a=1;a<r.length&&r[a]<=s;a+=2)u=a;u&&r.splice(0,u+1)}}};var qi=class extends X{constructor(t,n){super()}schedule(t,n=0){return this}};var xo={setInterval(e,t,...n){let{delegate:r}=xo;return r?.setInterval?r.setInterval(e,t,...n):setInterval(e,t,...n)},clearInterval(e){let{delegate:t}=xo;return(t?.clearInterval||clearInterval)(e)},delegate:void 0};var en=class extends qi{constructor(t,n){super(t,n),this.scheduler=t,this.work=n,this.pending=!1}schedule(t,n=0){var r;if(this.closed)return this;this.state=t;let o=this.id,i=this.scheduler;return o!=null&&(this.id=this.recycleAsyncId(i,o,n)),this.pending=!0,this.delay=n,this.id=(r=this.id)!==null&&r!==void 0?r:this.requestAsyncId(i,this.id,n),this}requestAsyncId(t,n,r=0){return xo.setInterval(t.flush.bind(t,this),r)}recycleAsyncId(t,n,r=0){if(r!=null&&this.delay===r&&this.pending===!1)return n;n!=null&&xo.clearInterval(n)}execute(t,n){if(this.closed)return new Error(\"executing a cancelled action\");this.pending=!1;let r=this._execute(t,n);if(r)return r;this.pending===!1&&this.id!=null&&(this.id=this.recycleAsyncId(this.scheduler,this.id,null))}_execute(t,n){let r=!1,o;try{this.work(t)}catch(i){r=!0,o=i||new Error(\"Scheduled action threw falsy error\")}if(r)return this.unsubscribe(),o}unsubscribe(){if(!this.closed){let{id:t,scheduler:n}=this,{actions:r}=n;this.work=this.state=this.scheduler=null,this.pending=!1,Tn(r,this),t!=null&&(this.id=this.recycleAsyncId(n,t,null)),this.delay=null,super.unsubscribe()}}};var hD=1,oc,ic={};function Gh(e){return e in ic?(delete ic[e],!0):!1}var Wh={setImmediate(e){let t=hD++;return ic[t]=!0,oc||(oc=Promise.resolve()),oc.then(()=>Gh(t)&&e()),t},clearImmediate(e){Gh(e)}};var{setImmediate:gD,clearImmediate:mD}=Wh,Io={setImmediate(...e){let{delegate:t}=Io;return(t?.setImmediate||gD)(...e)},clearImmediate(e){let{delegate:t}=Io;return(t?.clearImmediate||mD)(e)},delegate:void 0};var Gi=class extends en{constructor(t,n){super(t,n),this.scheduler=t,this.work=n}requestAsyncId(t,n,r=0){return r!==null&&r>0?super.requestAsyncId(t,n,r):(t.actions.push(this),t._scheduled||(t._scheduled=Io.setImmediate(t.flush.bind(t,void 0))))}recycleAsyncId(t,n,r=0){var o;if(r!=null?r>0:this.delay>0)return super.recycleAsyncId(t,n,r);let{actions:i}=t;n!=null&&((o=i[i.length-1])===null||o===void 0?void 0:o.id)!==n&&(Io.clearImmediate(n),t._scheduled===n&&(t._scheduled=void 0))}};var Cr=class e{constructor(t,n=e.now){this.schedulerActionCtor=t,this.now=n}schedule(t,n=0,r){return new this.schedulerActionCtor(this,t).schedule(r,n)}};Cr.now=_o.now;var tn=class extends Cr{constructor(t,n=Cr.now){super(t,n),this.actions=[],this._active=!1}flush(t){let{actions:n}=this;if(this._active){n.push(t);return}let r;this._active=!0;do if(r=t.execute(t.state,t.delay))break;while(t=n.shift());if(this._active=!1,r){for(;t=n.shift();)t.unsubscribe();throw r}}};var Wi=class extends tn{flush(t){this._active=!0;let n=this._scheduled;this._scheduled=void 0;let{actions:r}=this,o;t=t||r.shift();do if(o=t.execute(t.state,t.delay))break;while((t=r[0])&&t.id===n&&r.shift());if(this._active=!1,o){for(;(t=r[0])&&t.id===n&&r.shift();)t.unsubscribe();throw o}}};var yD=new Wi(Gi);var _r=new tn(en),sc=_r;var Zi=class extends en{constructor(t,n){super(t,n),this.scheduler=t,this.work=n}requestAsyncId(t,n,r=0){return r!==null&&r>0?super.requestAsyncId(t,n,r):(t.actions.push(this),t._scheduled||(t._scheduled=Er.requestAnimationFrame(()=>t.flush(void 0))))}recycleAsyncId(t,n,r=0){var o;if(r!=null?r>0:this.delay>0)return super.recycleAsyncId(t,n,r);let{actions:i}=t;n!=null&&n===t._scheduled&&((o=i[i.length-1])===null||o===void 0?void 0:o.id)!==n&&(Er.cancelAnimationFrame(n),t._scheduled=void 0)}};var Yi=class extends tn{flush(t){this._active=!0;let n;t?n=t.id:(n=this._scheduled,this._scheduled=void 0);let{actions:r}=this,o;t=t||r.shift();do if(o=t.execute(t.state,t.delay))break;while((t=r[0])&&t.id===n&&r.shift());if(this._active=!1,o){for(;(t=r[0])&&t.id===n&&r.shift();)t.unsubscribe();throw o}}};var bD=new Yi(Zi);var Mt=new B(e=>e.complete());function Qi(e){return e&&k(e.schedule)}function uc(e){return e[e.length-1]}function nn(e){return k(uc(e))?e.pop():void 0}function ft(e){return Qi(uc(e))?e.pop():void 0}function Zh(e,t){return typeof uc(e)==\"number\"?e.pop():t}function tk(e,t,n,r){var o=arguments.length,i=o<3?t:r===null?r=Object.getOwnPropertyDescriptor(t,n):r,s;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")i=Reflect.decorate(e,t,n,r);else for(var u=e.length-1;u>=0;u--)(s=e[u])&&(i=(o<3?s(i):o>3?s(t,n,i):s(t,n))||i);return o>3&&i&&Object.defineProperty(t,n,i),i}function Qh(e,t,n,r){function o(i){return i instanceof n?i:new n(function(s){s(i)})}return new(n||(n=Promise))(function(i,s){function u(l){try{c(r.next(l))}catch(d){s(d)}}function a(l){try{c(r.throw(l))}catch(d){s(d)}}function c(l){l.done?i(l.value):o(l.value).then(u,a)}c((r=r.apply(e,t||[])).next())})}function Yh(e){var t=typeof Symbol==\"function\"&&Symbol.iterator,n=t&&e[t],r=0;if(n)return n.call(e);if(e&&typeof e.length==\"number\")return{next:function(){return e&&r>=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}};throw new TypeError(t?\"Object is not iterable.\":\"Symbol.iterator is not defined.\")}function An(e){return this instanceof An?(this.v=e,this):new An(e)}function Kh(e,t,n){if(!Symbol.asyncIterator)throw new TypeError(\"Symbol.asyncIterator is not defined.\");var r=n.apply(e,t||[]),o,i=[];return o=Object.create((typeof AsyncIterator==\"function\"?AsyncIterator:Object).prototype),u(\"next\"),u(\"throw\"),u(\"return\",s),o[Symbol.asyncIterator]=function(){return this},o;function s(f){return function(p){return Promise.resolve(p).then(f,d)}}function u(f,p){r[f]&&(o[f]=function(m){return new Promise(function(g,y){i.push([f,m,g,y])>1||a(f,m)})},p&&(o[f]=p(o[f])))}function a(f,p){try{c(r[f](p))}catch(m){h(i[0][3],m)}}function c(f){f.value instanceof An?Promise.resolve(f.value.v).then(l,d):h(i[0][2],f)}function l(f){a(\"next\",f)}function d(f){a(\"throw\",f)}function h(f,p){f(p),i.shift(),i.length&&a(i[0][0],i[0][1])}}function Jh(e){if(!Symbol.asyncIterator)throw new TypeError(\"Symbol.asyncIterator is not defined.\");var t=e[Symbol.asyncIterator],n;return t?t.call(e):(e=typeof Yh==\"function\"?Yh(e):e[Symbol.iterator](),n={},r(\"next\"),r(\"throw\"),r(\"return\"),n[Symbol.asyncIterator]=function(){return this},n);function r(i){n[i]=e[i]&&function(s){return new Promise(function(u,a){s=e[i](s),o(u,a,s.done,s.value)})}}function o(i,s,u,a){Promise.resolve(a).then(function(c){i({value:c,done:u})},s)}}var wr=e=>e&&typeof e.length==\"number\"&&typeof e!=\"function\";function Ki(e){return k(e?.then)}function Ji(e){return k(e[Dr])}function Xi(e){return Symbol.asyncIterator&&k(e?.[Symbol.asyncIterator])}function es(e){return new TypeError(`You provided ${e!==null&&typeof e==\"object\"?\"an invalid object\":`'${e}'`} where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.`)}function vD(){return typeof Symbol!=\"function\"||!Symbol.iterator?\"@@iterator\":Symbol.iterator}var ts=vD();function ns(e){return k(e?.[ts])}function rs(e){return Kh(this,arguments,function*(){let n=e.getReader();try{for(;;){let{value:r,done:o}=yield An(n.read());if(o)return yield An(void 0);yield yield An(r)}}finally{n.releaseLock()}})}function os(e){return k(e?.getReader)}function z(e){if(e instanceof B)return e;if(e!=null){if(Ji(e))return DD(e);if(wr(e))return ED(e);if(Ki(e))return CD(e);if(Xi(e))return Xh(e);if(ns(e))return _D(e);if(os(e))return wD(e)}throw es(e)}function DD(e){return new B(t=>{let n=e[Dr]();if(k(n.subscribe))return n.subscribe(t);throw new TypeError(\"Provided object does not correctly implement Symbol.observable\")})}function ED(e){return new B(t=>{for(let n=0;n<e.length&&!t.closed;n++)t.next(e[n]);t.complete()})}function CD(e){return new B(t=>{e.then(n=>{t.closed||(t.next(n),t.complete())},n=>t.error(n)).then(null,$i)})}function _D(e){return new B(t=>{for(let n of e)if(t.next(n),t.closed)return;t.complete()})}function Xh(e){return new B(t=>{xD(e,t).catch(n=>t.error(n))})}function wD(e){return Xh(rs(e))}function xD(e,t){var n,r,o,i;return Qh(this,void 0,void 0,function*(){try{for(n=Jh(e);r=yield n.next(),!r.done;){let s=r.value;if(t.next(s),t.closed)return}}catch(s){o={error:s}}finally{try{r&&!r.done&&(i=n.return)&&(yield i.call(n))}finally{if(o)throw o.error}}t.complete()})}function Me(e,t,n,r=0,o=!1){let i=t.schedule(function(){n(),o?e.add(this.schedule(null,r)):this.unsubscribe()},r);if(e.add(i),!o)return i}function To(e,t=0){return j((n,r)=>{n.subscribe(R(r,o=>Me(r,e,()=>r.next(o),t),()=>Me(r,e,()=>r.complete(),t),o=>Me(r,e,()=>r.error(o),t)))})}function is(e,t=0){return j((n,r)=>{r.add(e.schedule(()=>n.subscribe(r),t))})}function e0(e,t){return z(e).pipe(is(t),To(t))}function t0(e,t){return z(e).pipe(is(t),To(t))}function n0(e,t){return new B(n=>{let r=0;return t.schedule(function(){r===e.length?n.complete():(n.next(e[r++]),n.closed||this.schedule())})})}function r0(e,t){return new B(n=>{let r;return Me(n,t,()=>{r=e[ts](),Me(n,t,()=>{let o,i;try{({value:o,done:i}=r.next())}catch(s){n.error(s);return}i?n.complete():n.next(o)},0,!0)}),()=>k(r?.return)&&r.return()})}function ss(e,t){if(!e)throw new Error(\"Iterable cannot be null\");return new B(n=>{Me(n,t,()=>{let r=e[Symbol.asyncIterator]();Me(n,t,()=>{r.next().then(o=>{o.done?n.complete():n.next(o.value)})},0,!0)})})}function o0(e,t){return ss(rs(e),t)}function i0(e,t){if(e!=null){if(Ji(e))return e0(e,t);if(wr(e))return n0(e,t);if(Ki(e))return t0(e,t);if(Xi(e))return ss(e,t);if(ns(e))return r0(e,t);if(os(e))return o0(e,t)}throw es(e)}function pt(e,t){return t?i0(e,t):z(e)}function us(...e){let t=ft(e);return pt(e,t)}function ID(e,t){let n=k(e)?e:()=>e,r=o=>o.error(n());return new B(t?o=>t.schedule(r,0,o):r)}function TD(e){return!!e&&(e instanceof B||k(e.lift)&&k(e.subscribe))}var Nn=yr(e=>function(){e(this),this.name=\"EmptyError\",this.message=\"no elements in sequence\"});function ac(e,t){let n=typeof t==\"object\";return new Promise((r,o)=>{let i=new Ze({next:s=>{r(s),i.unsubscribe()},error:o,complete:()=>{n?r(t.defaultValue):o(new Nn)}});e.subscribe(i)})}function s0(e){return e instanceof Date&&!isNaN(e)}function Ce(e,t){return j((n,r)=>{let o=0;n.subscribe(R(r,i=>{r.next(e.call(t,i,o++))}))})}var{isArray:SD}=Array;function MD(e,t){return SD(t)?e(...t):e(t)}function xr(e){return Ce(t=>MD(e,t))}var{isArray:AD}=Array,{getPrototypeOf:ND,prototype:kD,keys:RD}=Object;function as(e){if(e.length===1){let t=e[0];if(AD(t))return{args:t,keys:null};if(FD(t)){let n=RD(t);return{args:n.map(r=>t[r]),keys:n}}}return{args:e,keys:null}}function FD(e){return e&&typeof e==\"object\"&&ND(e)===kD}function cs(e,t){return e.reduce((n,r,o)=>(n[r]=t[o],n),{})}function OD(...e){let t=ft(e),n=nn(e),{args:r,keys:o}=as(e);if(r.length===0)return pt([],t);let i=new B(PD(r,t,o?s=>cs(o,s):Ee));return n?i.pipe(xr(n)):i}function PD(e,t,n=Ee){return r=>{u0(t,()=>{let{length:o}=e,i=new Array(o),s=o,u=o;for(let a=0;a<o;a++)u0(t,()=>{let c=pt(e[a],t),l=!1;c.subscribe(R(r,d=>{i[a]=d,l||(l=!0,u--),u||r.next(n(i.slice()))},()=>{--s||r.complete()}))},r)},r)}}function u0(e,t,n){e?Me(n,e,t):t()}function a0(e,t,n,r,o,i,s,u){let a=[],c=0,l=0,d=!1,h=()=>{d&&!a.length&&!c&&t.complete()},f=m=>c<r?p(m):a.push(m),p=m=>{i&&t.next(m),c++;let g=!1;z(n(m,l++)).subscribe(R(t,y=>{o?.(y),i?f(y):t.next(y)},()=>{g=!0},void 0,()=>{if(g)try{for(c--;a.length&&c<r;){let y=a.shift();s?Me(t,s,()=>p(y)):p(y)}h()}catch(y){t.error(y)}}))};return e.subscribe(R(t,f,()=>{d=!0,h()})),()=>{u?.()}}function At(e,t,n=1/0){return k(t)?At((r,o)=>Ce((i,s)=>t(r,i,o,s))(z(e(r,o))),n):(typeof t==\"number\"&&(n=t),j((r,o)=>a0(r,o,e,n)))}function So(e=1/0){return At(Ee,e)}function c0(){return So(1)}function ls(...e){return c0()(pt(e,ft(e)))}function LD(e){return new B(t=>{z(e()).subscribe(t)})}function jD(...e){let t=nn(e),{args:n,keys:r}=as(e),o=new B(i=>{let{length:s}=n;if(!s){i.complete();return}let u=new Array(s),a=s,c=s;for(let l=0;l<s;l++){let d=!1;z(n[l]).subscribe(R(i,h=>{d||(d=!0,c--),u[l]=h},()=>a--,void 0,()=>{(!a||!d)&&(c||i.next(r?cs(r,u):u),i.complete())}))}});return t?o.pipe(xr(t)):o}var BD=[\"addListener\",\"removeListener\"],VD=[\"addEventListener\",\"removeEventListener\"],HD=[\"on\",\"off\"];function cc(e,t,n,r){if(k(n)&&(r=n,n=void 0),r)return cc(e,t,n).pipe(xr(r));let[o,i]=zD(e)?VD.map(s=>u=>e[s](t,u,n)):$D(e)?BD.map(l0(e,t)):UD(e)?HD.map(l0(e,t)):[];if(!o&&wr(e))return At(s=>cc(s,t,n))(z(e));if(!o)throw new TypeError(\"Invalid event target\");return new B(s=>{let u=(...a)=>s.next(1<a.length?a:a[0]);return o(u),()=>i(u)})}function l0(e,t){return n=>r=>e[n](t,r)}function $D(e){return k(e.addListener)&&k(e.removeListener)}function UD(e){return k(e.on)&&k(e.off)}function zD(e){return k(e.addEventListener)&&k(e.removeEventListener)}function lc(e=0,t,n=sc){let r=-1;return t!=null&&(Qi(t)?n=t:r=t),new B(o=>{let i=s0(e)?+e-n.now():e;i<0&&(i=0);let s=0;return n.schedule(function(){o.closed||(o.next(s++),0<=r?this.schedule(void 0,r):o.complete())},i)})}function qD(...e){let t=ft(e),n=Zh(e,1/0),r=e;return r.length?r.length===1?z(r[0]):So(n)(pt(r,t)):Mt}var GD=new B(St);var{isArray:WD}=Array;function d0(e){return e.length===1&&WD(e[0])?e[0]:e}function rn(e,t){return j((n,r)=>{let o=0;n.subscribe(R(r,i=>e.call(t,i,o++)&&r.next(i)))})}function ZD(...e){let t=nn(e),n=d0(e);return n.length?new B(r=>{let o=n.map(()=>[]),i=n.map(()=>!1);r.add(()=>{o=i=null});for(let s=0;!r.closed&&s<n.length;s++)z(n[s]).subscribe(R(r,u=>{if(o[s].push(u),o.every(a=>a.length)){let a=o.map(c=>c.shift());r.next(t?t(...a):a),o.some((c,l)=>!c.length&&i[l])&&r.complete()}},()=>{i[s]=!0,!o[s].length&&r.complete()}));return()=>{o=i=null}}):Mt}function f0(e){return j((t,n)=>{let r=!1,o=null,i=null,s=!1,u=()=>{if(i?.unsubscribe(),i=null,r){r=!1;let c=o;o=null,n.next(c)}s&&n.complete()},a=()=>{i=null,s&&n.complete()};t.subscribe(R(n,c=>{r=!0,o=c,i||z(e(c)).subscribe(i=R(n,u,a))},()=>{s=!0,(!r||!i||i.closed)&&n.complete()}))})}function YD(e,t=_r){return f0(()=>lc(e,t))}function dc(e){return j((t,n)=>{let r=null,o=!1,i;r=t.subscribe(R(n,void 0,void 0,s=>{i=z(e(s,dc(e)(t))),r?(r.unsubscribe(),r=null,i.subscribe(n)):o=!0})),o&&(r.unsubscribe(),r=null,i.subscribe(n))})}function fc(e,t){return k(t)?At(e,t,1):At(e,1)}function p0(e,t=_r){return j((n,r)=>{let o=null,i=null,s=null,u=()=>{if(o){o.unsubscribe(),o=null;let c=i;i=null,r.next(c)}};function a(){let c=s+e,l=t.now();if(l<c){o=this.schedule(void 0,c-l),r.add(o);return}u()}n.subscribe(R(r,c=>{i=c,s=t.now(),o||(o=t.schedule(a,e),r.add(o))},()=>{u(),r.complete()},void 0,()=>{i=o=null}))})}function h0(e){return j((t,n)=>{let r=!1;t.subscribe(R(n,o=>{r=!0,n.next(o)},()=>{r||n.next(e),n.complete()}))})}function pc(e){return e<=0?()=>Mt:j((t,n)=>{let r=0;t.subscribe(R(n,o=>{++r<=e&&(n.next(o),e<=r&&n.complete())}))})}function QD(e){return Ce(()=>e)}function g0(e,t=Ee){return e=e??KD,j((n,r)=>{let o,i=!0;n.subscribe(R(r,s=>{let u=t(s);(i||!e(o,u))&&(i=!1,o=u,r.next(s))}))})}function KD(e,t){return e===t}function m0(e=JD){return j((t,n)=>{let r=!1;t.subscribe(R(n,o=>{r=!0,n.next(o)},()=>r?n.complete():n.error(e())))})}function JD(){return new Nn}function ds(e){return j((t,n)=>{try{t.subscribe(n)}finally{n.add(e)}})}function XD(e,t){let n=arguments.length>=2;return r=>r.pipe(e?rn((o,i)=>e(o,i,r)):Ee,pc(1),n?h0(t):m0(()=>new Nn))}function eE(e){return e<=0?()=>Mt:j((t,n)=>{let r=[];t.subscribe(R(n,o=>{r.push(o),e<r.length&&r.shift()},()=>{for(let o of r)n.next(o);n.complete()},void 0,()=>{r=null}))})}function y0(){return j((e,t)=>{let n,r=!1;e.subscribe(R(t,o=>{let i=n;n=o,r&&t.next([i,o]),r=!0}))})}function fs(e={}){let{connector:t=()=>new ce,resetOnError:n=!0,resetOnComplete:r=!0,resetOnRefCountZero:o=!0}=e;return i=>{let s,u,a,c=0,l=!1,d=!1,h=()=>{u?.unsubscribe(),u=void 0},f=()=>{h(),s=a=void 0,l=d=!1},p=()=>{let m=s;f(),m?.unsubscribe()};return j((m,g)=>{c++,!d&&!l&&h();let y=a=a??t();g.add(()=>{c--,c===0&&!d&&!l&&(u=hc(p,o))}),y.subscribe(g),!s&&c>0&&(s=new Ze({next:v=>y.next(v),error:v=>{d=!0,h(),u=hc(f,n,v),y.error(v)},complete:()=>{l=!0,h(),u=hc(f,r),y.complete()}}),z(m).subscribe(s))})(i)}}function hc(e,t,...n){if(t===!0){e();return}if(t===!1)return;let r=new Ze({next:()=>{r.unsubscribe(),e()}});return z(t(...n)).subscribe(r)}function b0(e,t,n){let r,o=!1;return e&&typeof e==\"object\"?{bufferSize:r=1/0,windowTime:t=1/0,refCount:o=!1,scheduler:n}=e:r=e??1/0,fs({connector:()=>new wo(r,t,n),resetOnError:!0,resetOnComplete:!1,resetOnRefCountZero:o})}function v0(e){return rn((t,n)=>e<=n)}function D0(...e){let t=ft(e);return j((n,r)=>{(t?ls(e,n,t):ls(e,n)).subscribe(r)})}function ps(e,t){return j((n,r)=>{let o=null,i=0,s=!1,u=()=>s&&!o&&r.complete();n.subscribe(R(r,a=>{o?.unsubscribe();let c=0,l=i++;z(e(a,l)).subscribe(o=R(r,d=>r.next(t?t(a,d,l,c++):d),()=>{o=null,u()}))},()=>{s=!0,u()}))})}function tE(e){return j((t,n)=>{z(e).subscribe(R(n,()=>n.complete(),St)),!n.closed&&t.subscribe(n)})}function nE(e,t=!1){return j((n,r)=>{let o=0;n.subscribe(R(r,i=>{let s=e(i,o++);(s||t)&&r.next(i),!s&&r.complete()}))})}function E0(e,t,n){let r=k(e)||t||n?{next:e,error:t,complete:n}:e;return r?j((o,i)=>{var s;(s=r.subscribe)===null||s===void 0||s.call(r);let u=!0;o.subscribe(R(i,a=>{var c;(c=r.next)===null||c===void 0||c.call(r,a),i.next(a)},()=>{var a;u=!1,(a=r.complete)===null||a===void 0||a.call(r),i.complete()},a=>{var c;u=!1,(c=r.error)===null||c===void 0||c.call(r,a),i.error(a)},()=>{var a,c;u&&((a=r.unsubscribe)===null||a===void 0||a.call(r)),(c=r.finalize)===null||c===void 0||c.call(r)}))}):Ee}function rE(...e){let t=nn(e);return j((n,r)=>{let o=e.length,i=new Array(o),s=e.map(()=>!1),u=!1;for(let a=0;a<o;a++)z(e[a]).subscribe(R(r,c=>{i[a]=c,!u&&!s[a]&&(s[a]=!0,(u=s.every(Ee))&&(s=null))},St));n.subscribe(R(r,a=>{if(u){let c=[a,...i];r.next(t?t(...c):c)}}))})}var gc;function hs(){return gc}function ht(e){let t=gc;return gc=e,t}var C0=Symbol(\"NotFound\");function Ir(e){return e===C0||e?.name===\"\\u0275NotFound\"}function mc(e,t,n){let r=Object.create(oE);r.source=e,r.computation=t,n!=null&&(r.equal=n);let i=()=>{if(xn(r),Kt(r),r.value===dt)throw r.error;return r.value};return i[ne]=r,bo(r),i}function _0(e,t){xn(e),In(e,t),hr(e)}function w0(e,t){if(xn(e),e.value===dt)throw e.error;Bi(e,t),hr(e)}var oE=P(M({},Qt),{value:Yt,dirty:!0,error:null,equal:vo,kind:\"linkedSignal\",producerMustRecompute(e){return e.value===Yt||e.value===wn},producerRecomputeValue(e){if(e.value===wn)throw new Error(\"\");let t=e.value;e.value=wn;let n=Tt(e),r;try{let o=e.source(),i=t===Yt||t===dt?void 0:{source:e.sourceValue,value:t};r=e.computation(o,i),e.sourceValue=o}catch(o){r=dt,e.error=o}finally{Jt(e,n)}if(t!==Yt&&r!==dt&&e.equal(t,r)){e.value=t;return}e.value=r,e.version++}});function x0(e){let t=I(null);try{return e()}finally{I(t)}}var Es=\"https://angular.dev/best-practices/security#preventing-cross-site-scripting-xss\",C=class extends Error{code;constructor(t,n){super(mt(t,n)),this.code=t}};function iE(e){return`NG0${Math.abs(e)}`}function mt(e,t){return`${iE(e)}${t?\": \"+t:\"\"}`}var xe=globalThis;function W(e){for(let t in e)if(e[t]===W)return t;throw Error(\"\")}function A0(e,t){for(let n in t)t.hasOwnProperty(n)&&!e.hasOwnProperty(n)&&(e[n]=t[n])}function Oo(e){if(typeof e==\"string\")return e;if(Array.isArray(e))return`[${e.map(Oo).join(\", \")}]`;if(e==null)return\"\"+e;let t=e.overriddenName||e.name;if(t)return`${t}`;let n=e.toString();if(n==null)return\"\"+n;let r=n.indexOf(`\n`);return r>=0?n.slice(0,r):n}function Cs(e,t){return e?t?`${e} ${t}`:e:t||\"\"}var sE=W({__forward_ref__:W});function _s(e){return e.__forward_ref__=_s,e}function se(e){return Mc(e)?e():e}function Mc(e){return typeof e==\"function\"&&e.hasOwnProperty(sE)&&e.__forward_ref__===_s}function T(e){return{token:e.token,providedIn:e.providedIn||null,factory:e.factory,value:void 0}}function yt(e){return{providers:e.providers||[],imports:e.imports||[]}}function Po(e){return aE(e,ws)}function uE(e){return Po(e)!==null}function aE(e,t){return e.hasOwnProperty(t)&&e[t]||null}function cE(e){let t=e?.[ws]??null;return t||null}function bc(e){return e&&e.hasOwnProperty(ms)?e[ms]:null}var ws=W({\\u0275prov:W}),ms=W({\\u0275inj:W}),x=class{_desc;ngMetadataName=\"InjectionToken\";\\u0275prov;constructor(t,n){this._desc=t,this.\\u0275prov=void 0,typeof n==\"number\"?this.__NG_ELEMENT_ID__=n:n!==void 0&&(this.\\u0275prov=T({token:this,providedIn:n.providedIn||\"root\",factory:n.factory}))}get multi(){return this}toString(){return`InjectionToken ${this._desc}`}};function Ac(e){return e&&!!e.\\u0275providers}var Nc=W({\\u0275cmp:W}),kc=W({\\u0275dir:W}),Rc=W({\\u0275pipe:W}),Fc=W({\\u0275mod:W}),Ao=W({\\u0275fac:W}),Pn=W({__NG_ELEMENT_ID__:W}),I0=W({__NG_ENV_ID__:W});function Oc(e){return Is(e,\"@NgModule\"),e[Fc]||null}function bt(e){return Is(e,\"@Component\"),e[Nc]||null}function xs(e){return Is(e,\"@Directive\"),e[kc]||null}function N0(e){return Is(e,\"@Pipe\"),e[Rc]||null}function Is(e,t){if(e==null)throw new C(-919,!1)}function Ve(e){return typeof e==\"string\"?e:e==null?\"\":String(e)}var k0=W({ngErrorCode:W}),lE=W({ngErrorMessage:W}),dE=W({ngTokenPath:W});function Pc(e,t){return R0(\"\",-200,t)}function Ts(e,t){throw new C(-201,!1)}function R0(e,t,n){let r=new C(t,e);return r[k0]=t,r[lE]=e,n&&(r[dE]=n),r}function fE(e){return e[k0]}var vc;function F0(){return vc}function _e(e){let t=vc;return vc=e,t}function Lc(e,t,n){let r=Po(e);if(r&&r.providedIn==\"root\")return r.value===void 0?r.value=r.factory():r.value;if(n&8)return null;if(t!==void 0)return t;Ts(e,\"\")}var pE={},kn=pE,hE=\"__NG_DI_FLAG__\",Dc=class{injector;constructor(t){this.injector=t}retrieve(t,n){let r=Rn(n)||0;try{return this.injector.get(t,r&8?null:kn,r)}catch(o){if(Ir(o))return o;throw o}}};function gE(e,t=0){let n=hs();if(n===void 0)throw new C(-203,!1);if(n===null)return Lc(e,void 0,t);{let r=mE(t),o=n.retrieve(e,r);if(Ir(o)){if(r.optional)return null;throw o}return o}}function A(e,t=0){return(F0()||gE)(se(e),t)}function b(e,t){return A(e,Rn(t))}function Rn(e){return typeof e>\"u\"||typeof e==\"number\"?e:0|(e.optional&&8)|(e.host&&1)|(e.self&&2)|(e.skipSelf&&4)}function mE(e){return{optional:!!(e&8),host:!!(e&1),self:!!(e&2),skipSelf:!!(e&4)}}function Ec(e){let t=[];for(let n=0;n<e.length;n++){let r=se(e[n]);if(Array.isArray(r)){if(r.length===0)throw new C(900,!1);let o,i=0;for(let s=0;s<r.length;s++){let u=r[s],a=yE(u);typeof a==\"number\"?a===-1?o=u.token:i|=a:o=u}t.push(A(o,i))}else t.push(A(r))}return t}function yE(e){return e[hE]}function on(e,t){let n=e.hasOwnProperty(Ao);return n?e[Ao]:null}function O0(e,t,n){if(e.length!==t.length)return!1;for(let r=0;r<e.length;r++){let o=e[r],i=t[r];if(n&&(o=n(o),i=n(i)),i!==o)return!1}return!0}function P0(e){return e.flat(Number.POSITIVE_INFINITY)}function Ss(e,t){e.forEach(n=>Array.isArray(n)?Ss(n,t):t(n))}function jc(e,t,n){t>=e.length?e.push(n):e.splice(t,0,n)}function Lo(e,t){return t>=e.length-1?e.pop():e.splice(t,1)[0]}function L0(e,t){let n=[];for(let r=0;r<e;r++)n.push(t);return n}function j0(e,t,n,r){let o=e.length;if(o==t)e.push(n,r);else if(o===1)e.push(r,e[0]),e[0]=n;else{for(o--,e.push(e[o-1],e[o]);o>t;){let i=o-2;e[o]=e[i],o--}e[t]=n,e[t+1]=r}}function jo(e,t,n){let r=Sr(e,t);return r>=0?e[r|1]=n:(r=~r,j0(e,r,t,n)),r}function Ms(e,t){let n=Sr(e,t);if(n>=0)return e[n|1]}function Sr(e,t){return bE(e,t,1)}function bE(e,t,n){let r=0,o=e.length>>n;for(;o!==r;){let i=r+(o-r>>1),s=e[i<<n];if(t===s)return i<<n;s>t?o=i:r=i+1}return~(o<<n)}var Ye={},ye=[],Mr=new x(\"\"),Bc=new x(\"\",-1),Vc=new x(\"\"),No=class{get(t,n=kn){if(n===kn){let o=R0(\"\",-201);throw o.name=\"\\u0275NotFound\",o}return n}};function Ln(e){return{\\u0275providers:e}}function B0(...e){return{\\u0275providers:Hc(!0,e),\\u0275fromNgModule:!0}}function Hc(e,...t){let n=[],r=new Set,o,i=s=>{n.push(s)};return Ss(t,s=>{let u=s;ys(u,i,[],r)&&(o||=[],o.push(u))}),o!==void 0&&V0(o,i),n}function V0(e,t){for(let n=0;n<e.length;n++){let{ngModule:r,providers:o}=e[n];$c(o,i=>{t(i,r)})}}function ys(e,t,n,r){if(e=se(e),!e)return!1;let o=null,i=bc(e),s=!i&&bt(e);if(!i&&!s){let a=e.ngModule;if(i=bc(a),i)o=a;else return!1}else{if(s&&!s.standalone)return!1;o=e}let u=r.has(o);if(s){if(u)return!1;if(r.add(o),s.dependencies){let a=typeof s.dependencies==\"function\"?s.dependencies():s.dependencies;for(let c of a)ys(c,t,n,r)}}else if(i){if(i.imports!=null&&!u){r.add(o);let c;Ss(i.imports,l=>{ys(l,t,n,r)&&(c||=[],c.push(l))}),c!==void 0&&V0(c,t)}if(!u){let c=on(o)||(()=>new o);t({provide:o,useFactory:c,deps:ye},o),t({provide:Vc,useValue:o,multi:!0},o),t({provide:Mr,useValue:()=>A(o),multi:!0},o)}let a=i.providers;if(a!=null&&!u){let c=e;$c(a,l=>{t(l,c)})}}else return!1;return o!==e&&e.providers!==void 0}function $c(e,t){for(let n of e)Ac(n)&&(n=n.\\u0275providers),Array.isArray(n)?$c(n,t):t(n)}var vE=W({provide:String,useValue:W});function H0(e){return e!==null&&typeof e==\"object\"&&vE in e}function DE(e){return!!(e&&e.useExisting)}function EE(e){return!!(e&&e.useFactory)}function Fn(e){return typeof e==\"function\"}function $0(e){return!!e.useClass}var Bo=new x(\"\"),gs={},T0={},yc;function Ar(){return yc===void 0&&(yc=new No),yc}var we=class{},On=class extends we{parent;source;scopes;records=new Map;_ngOnDestroyHooks=new Set;_onDestroyHooks=[];get destroyed(){return this._destroyed}_destroyed=!1;injectorDefTypes;constructor(t,n,r,o){super(),this.parent=n,this.source=r,this.scopes=o,_c(t,s=>this.processProvider(s)),this.records.set(Bc,Tr(void 0,this)),o.has(\"environment\")&&this.records.set(we,Tr(void 0,this));let i=this.records.get(Bo);i!=null&&typeof i.value==\"string\"&&this.scopes.add(i.value),this.injectorDefTypes=new Set(this.get(Vc,ye,{self:!0}))}retrieve(t,n){let r=Rn(n)||0;try{return this.get(t,kn,r)}catch(o){if(Ir(o))return o;throw o}}destroy(){Mo(this),this._destroyed=!0;let t=I(null);try{for(let r of this._ngOnDestroyHooks)r.ngOnDestroy();let n=this._onDestroyHooks;this._onDestroyHooks=[];for(let r of n)r()}finally{this.records.clear(),this._ngOnDestroyHooks.clear(),this.injectorDefTypes.clear(),I(t)}}onDestroy(t){return Mo(this),this._onDestroyHooks.push(t),()=>this.removeOnDestroy(t)}runInContext(t){Mo(this);let n=ht(this),r=_e(void 0),o;try{return t()}finally{ht(n),_e(r)}}get(t,n=kn,r){if(Mo(this),t.hasOwnProperty(I0))return t[I0](this);let o=Rn(r),i,s=ht(this),u=_e(void 0);try{if(!(o&4)){let c=this.records.get(t);if(c===void 0){let l=IE(t)&&Po(t);l&&this.injectableDefInScope(l)?c=Tr(Cc(t),gs):c=null,this.records.set(t,c)}if(c!=null)return this.hydrate(t,c,o)}let a=o&2?Ar():this.parent;return n=o&8&&n===kn?null:n,a.get(t,n)}catch(a){let c=fE(a);throw c===-200||c===-201?new C(c,null):a}finally{_e(u),ht(s)}}resolveInjectorInitializers(){let t=I(null),n=ht(this),r=_e(void 0),o;try{let i=this.get(Mr,ye,{self:!0});for(let s of i)s()}finally{ht(n),_e(r),I(t)}}toString(){return\"R3Injector[...]\"}processProvider(t){t=se(t);let n=Fn(t)?t:se(t&&t.provide),r=_E(t);if(!Fn(t)&&t.multi===!0){let o=this.records.get(n);o||(o=Tr(void 0,gs,!0),o.factory=()=>Ec(o.multi),this.records.set(n,o)),n=t,o.multi.push(t)}this.records.set(n,r)}hydrate(t,n,r){let o=I(null);try{if(n.value===T0)throw Pc(\"\");return n.value===gs&&(n.value=T0,n.value=n.factory(void 0,r)),typeof n.value==\"object\"&&n.value&&xE(n.value)&&this._ngOnDestroyHooks.add(n.value),n.value}finally{I(o)}}injectableDefInScope(t){if(!t.providedIn)return!1;let n=se(t.providedIn);return typeof n==\"string\"?n===\"any\"||this.scopes.has(n):this.injectorDefTypes.has(n)}removeOnDestroy(t){let n=this._onDestroyHooks.indexOf(t);n!==-1&&this._onDestroyHooks.splice(n,1)}};function Cc(e){let t=Po(e),n=t!==null?t.factory:on(e);if(n!==null)return n;if(e instanceof x)throw new C(-204,!1);if(e instanceof Function)return CE(e);throw new C(-204,!1)}function CE(e){if(e.length>0)throw new C(-204,!1);let n=cE(e);return n!==null?()=>n.factory(e):()=>new e}function _E(e){if(H0(e))return Tr(void 0,e.useValue);{let t=Uc(e);return Tr(t,gs)}}function Uc(e,t,n){let r;if(Fn(e)){let o=se(e);return on(o)||Cc(o)}else if(H0(e))r=()=>se(e.useValue);else if(EE(e))r=()=>e.useFactory(...Ec(e.deps||[]));else if(DE(e))r=(o,i)=>A(se(e.useExisting),i!==void 0&&i&8?8:void 0);else{let o=se(e&&(e.useClass||e.provide));if(wE(e))r=()=>new o(...Ec(e.deps));else return on(o)||Cc(o)}return r}function Mo(e){if(e.destroyed)throw new C(-205,!1)}function Tr(e,t,n=!1){return{factory:e,value:t,multi:n?[]:void 0}}function wE(e){return!!e.deps}function xE(e){return e!==null&&typeof e==\"object\"&&typeof e.ngOnDestroy==\"function\"}function IE(e){return typeof e==\"function\"||typeof e==\"object\"&&e.ngMetadataName===\"InjectionToken\"}function _c(e,t){for(let n of e)Array.isArray(n)?_c(n,t):n&&Ac(n)?_c(n.\\u0275providers,t):t(n)}function Nr(e,t){let n;e instanceof On?(Mo(e),n=e):n=new Dc(e);let r,o=ht(n),i=_e(void 0);try{return t()}finally{ht(o),_e(i)}}function As(){return F0()!==void 0||hs()!=null}function TE(e){if(!As())throw new C(-203,!1)}var Qe=0,S=1,L=2,ue=3,He=4,Ie=5,jn=6,kr=7,ee=8,Rt=9,Ke=10,Z=11,Rr=12,zc=13,Bn=14,ve=15,an=16,Vn=17,vt=18,Ft=19,qc=20,kt=21,Ns=22,sn=23,Ne=24,Hn=25,cn=26,Q=27,U0=1,Gc=6,ln=7,Vo=8,$n=9,te=10;function Ot(e){return Array.isArray(e)&&typeof e[U0]==\"object\"}function Je(e){return Array.isArray(e)&&e[U0]===!0}function Wc(e){return(e.flags&4)!==0}function Dt(e){return e.componentOffset>-1}function Fr(e){return(e.flags&1)===1}function Xe(e){return!!e.template}function Or(e){return(e[L]&512)!==0}function Un(e){return(e[L]&256)===256}var Zc=\"svg\",z0=\"math\";function $e(e){for(;Array.isArray(e);)e=e[Qe];return e}function Yc(e,t){return $e(t[e])}function Ue(e,t){return $e(t[e.index])}function ks(e,t){return e.data[t]}function Ho(e,t){return e[t]}function $o(e,t,n,r){n>=e.data.length&&(e.data[n]=null,e.blueprint[n]=null),t[n]=r}function ke(e,t){let n=t[e];return Ot(n)?n:n[Qe]}function q0(e){return(e[L]&4)===4}function Rs(e){return(e[L]&128)===128}function G0(e){return Je(e[ue])}function Re(e,t){return t==null?null:e[t]}function Qc(e){e[Vn]=0}function Kc(e){e[L]&1024||(e[L]|=1024,Rs(e)&&zn(e))}function W0(e,t){for(;e>0;)t=t[Bn],e--;return t}function Uo(e){return!!(e[L]&9216||e[Ne]?.dirty)}function Fs(e){e[Ke].changeDetectionScheduler?.notify(8),e[L]&64&&(e[L]|=1024),Uo(e)&&zn(e)}function zn(e){e[Ke].changeDetectionScheduler?.notify(0);let t=un(e);for(;t!==null&&!(t[L]&8192||(t[L]|=8192,!Rs(t)));)t=un(t)}function Jc(e,t){if(Un(e))throw new C(911,!1);e[kt]===null&&(e[kt]=[]),e[kt].push(t)}function Z0(e,t){if(e[kt]===null)return;let n=e[kt].indexOf(t);n!==-1&&e[kt].splice(n,1)}function un(e){let t=e[ue];return Je(t)?t[ue]:t}function Xc(e){return e[kr]??=[]}function el(e){return e.cleanup??=[]}function Y0(e,t,n,r){let o=Xc(t);o.push(n),e.firstCreatePass&&el(e).push(r,o.length-1)}var V={lFrame:ug(null),bindingsEnabled:!0,skipHydrationRootTNode:null};var wc=!1;function Q0(){return V.lFrame.elementDepthCount}function K0(){V.lFrame.elementDepthCount++}function tl(){V.lFrame.elementDepthCount--}function Os(){return V.bindingsEnabled}function nl(){return V.skipHydrationRootTNode!==null}function rl(e){return V.skipHydrationRootTNode===e}function ol(){V.skipHydrationRootTNode=null}function _(){return V.lFrame.lView}function G(){return V.lFrame.tView}function J0(e){return V.lFrame.contextLView=e,e[ee]}function X0(e){return V.lFrame.contextLView=null,e}function re(){let e=il();for(;e!==null&&e.type===64;)e=e.parent;return e}function il(){return V.lFrame.currentTNode}function eg(){let e=V.lFrame,t=e.currentTNode;return e.isParent?t:t.parent}function qn(e,t){let n=V.lFrame;n.currentTNode=e,n.isParent=t}function sl(){return V.lFrame.isParent}function ul(){V.lFrame.isParent=!1}function al(){return V.lFrame.contextLView}function cl(){return wc}function ko(e){let t=wc;return wc=e,t}function Pr(){let e=V.lFrame,t=e.bindingRootIndex;return t===-1&&(t=e.bindingRootIndex=e.tView.bindingStartIndex),t}function ll(){return V.lFrame.bindingIndex}function tg(e){return V.lFrame.bindingIndex=e}function et(){return V.lFrame.bindingIndex++}function zo(e){let t=V.lFrame,n=t.bindingIndex;return t.bindingIndex=t.bindingIndex+e,n}function ng(){return V.lFrame.inI18n}function rg(e,t){let n=V.lFrame;n.bindingIndex=n.bindingRootIndex=e,Ps(t)}function og(){return V.lFrame.currentDirectiveIndex}function Ps(e){V.lFrame.currentDirectiveIndex=e}function ig(e){let t=V.lFrame.currentDirectiveIndex;return t===-1?null:e[t]}function Ls(){return V.lFrame.currentQueryIndex}function qo(e){V.lFrame.currentQueryIndex=e}function SE(e){let t=e[S];return t.type===2?t.declTNode:t.type===1?e[Ie]:null}function dl(e,t,n){if(n&4){let o=t,i=e;for(;o=o.parent,o===null&&!(n&1);)if(o=SE(i),o===null||(i=i[Bn],o.type&10))break;if(o===null)return!1;t=o,e=i}let r=V.lFrame=sg();return r.currentTNode=t,r.lView=e,!0}function js(e){let t=sg(),n=e[S];V.lFrame=t,t.currentTNode=n.firstChild,t.lView=e,t.tView=n,t.contextLView=e,t.bindingIndex=n.bindingStartIndex,t.inI18n=!1}function sg(){let e=V.lFrame,t=e===null?null:e.child;return t===null?ug(e):t}function ug(e){let t={currentTNode:null,isParent:!0,lView:null,tView:null,selectedIndex:-1,contextLView:null,elementDepthCount:0,currentNamespace:null,currentDirectiveIndex:-1,bindingRootIndex:-1,bindingIndex:-1,currentQueryIndex:0,parent:e,child:null,inI18n:!1};return e!==null&&(e.child=t),t}function ag(){let e=V.lFrame;return V.lFrame=e.parent,e.currentTNode=null,e.lView=null,e}var fl=ag;function Bs(){let e=ag();e.isParent=!0,e.tView=null,e.selectedIndex=-1,e.contextLView=null,e.elementDepthCount=0,e.currentDirectiveIndex=-1,e.currentNamespace=null,e.bindingRootIndex=-1,e.bindingIndex=-1,e.currentQueryIndex=0}function cg(e){return(V.lFrame.contextLView=W0(e,V.lFrame.contextLView))[ee]}function ze(){return V.lFrame.selectedIndex}function dn(e){V.lFrame.selectedIndex=e}function fn(){let e=V.lFrame;return ks(e.tView,e.selectedIndex)}function lg(){V.lFrame.currentNamespace=Zc}function dg(){ME()}function ME(){V.lFrame.currentNamespace=null}function fg(){return V.lFrame.currentNamespace}var pg=!0;function Vs(){return pg}function Go(e){pg=e}function xc(e,t=null,n=null,r){let o=pl(e,t,n,r);return o.resolveInjectorInitializers(),o}function pl(e,t=null,n=null,r,o=new Set){let i=[n||ye,B0(e)],s;return new On(i,t||Ar(),s||null,o)}var fe=class e{static THROW_IF_NOT_FOUND=kn;static NULL=new No;static create(t,n){if(Array.isArray(t))return xc({name:\"\"},n,t,\"\");{let r=t.name??\"\";return xc({name:r},t.parent,t.providers,r)}}static \\u0275prov=T({token:e,providedIn:\"any\",factory:()=>A(Bc)});static __NG_ELEMENT_ID__=-1},K=new x(\"\"),Fe=(()=>{class e{static __NG_ELEMENT_ID__=AE;static __NG_ENV_ID__=n=>n}return e})(),bs=class extends Fe{_lView;constructor(t){super(),this._lView=t}get destroyed(){return Un(this._lView)}onDestroy(t){let n=this._lView;return Jc(n,t),()=>Z0(n,t)}};function AE(){return new bs(_())}var hg=!1,gg=new x(\"\"),Gn=(()=>{class e{taskId=0;pendingTasks=new Set;destroyed=!1;pendingTask=new Co(!1);debugTaskTracker=b(gg,{optional:!0});get hasPendingTasks(){return this.destroyed?!1:this.pendingTask.value}get hasPendingTasksObservable(){return this.destroyed?new B(n=>{n.next(!1),n.complete()}):this.pendingTask}add(){!this.hasPendingTasks&&!this.destroyed&&this.pendingTask.next(!0);let n=this.taskId++;return this.pendingTasks.add(n),this.debugTaskTracker?.add(n),n}has(n){return this.pendingTasks.has(n)}remove(n){this.pendingTasks.delete(n),this.debugTaskTracker?.remove(n),this.pendingTasks.size===0&&this.hasPendingTasks&&this.pendingTask.next(!1)}ngOnDestroy(){this.pendingTasks.clear(),this.hasPendingTasks&&this.pendingTask.next(!1),this.destroyed=!0,this.pendingTask.unsubscribe()}static \\u0275prov=T({token:e,providedIn:\"root\",factory:()=>new e})}return e})(),Ic=class extends ce{__isAsync;destroyRef=void 0;pendingTasks=void 0;constructor(t=!1){super(),this.__isAsync=t,As()&&(this.destroyRef=b(Fe,{optional:!0})??void 0,this.pendingTasks=b(Gn,{optional:!0})??void 0)}emit(t){let n=I(null);try{super.next(t)}finally{I(n)}}subscribe(t,n,r){let o=t,i=n||(()=>null),s=r;if(t&&typeof t==\"object\"){let a=t;o=a.next?.bind(a),i=a.error?.bind(a),s=a.complete?.bind(a)}this.__isAsync&&(i=this.wrapInTimeout(i),o&&(o=this.wrapInTimeout(o)),s&&(s=this.wrapInTimeout(s)));let u=super.subscribe({next:o,error:i,complete:s});return t instanceof X&&t.add(u),u}wrapInTimeout(t){return n=>{let r=this.pendingTasks?.add();setTimeout(()=>{try{t(n)}finally{r!==void 0&&this.pendingTasks?.remove(r)}})}}},Nt=Ic;function vs(...e){}function hl(e){let t,n;function r(){e=vs;try{n!==void 0&&typeof cancelAnimationFrame==\"function\"&&cancelAnimationFrame(n),t!==void 0&&clearTimeout(t)}catch(o){}}return t=setTimeout(()=>{e(),r()}),typeof requestAnimationFrame==\"function\"&&(n=requestAnimationFrame(()=>{e(),r()})),()=>r()}function mg(e){return queueMicrotask(()=>e()),()=>{e=vs}}var gl=\"isAngularZone\",Ro=gl+\"_ID\",NE=0,be=class e{hasPendingMacrotasks=!1;hasPendingMicrotasks=!1;isStable=!0;onUnstable=new Nt(!1);onMicrotaskEmpty=new Nt(!1);onStable=new Nt(!1);onError=new Nt(!1);constructor(t){let{enableLongStackTrace:n=!1,shouldCoalesceEventChangeDetection:r=!1,shouldCoalesceRunChangeDetection:o=!1,scheduleInRootZone:i=hg}=t;if(typeof Zone>\"u\")throw new C(908,!1);Zone.assertZonePatched();let s=this;s._nesting=0,s._outer=s._inner=Zone.current,Zone.TaskTrackingZoneSpec&&(s._inner=s._inner.fork(new Zone.TaskTrackingZoneSpec)),n&&Zone.longStackTraceZoneSpec&&(s._inner=s._inner.fork(Zone.longStackTraceZoneSpec)),s.shouldCoalesceEventChangeDetection=!o&&r,s.shouldCoalesceRunChangeDetection=o,s.callbackScheduled=!1,s.scheduleInRootZone=i,FE(s)}static isInAngularZone(){return typeof Zone<\"u\"&&Zone.current.get(gl)===!0}static assertInAngularZone(){if(!e.isInAngularZone())throw new C(909,!1)}static assertNotInAngularZone(){if(e.isInAngularZone())throw new C(909,!1)}run(t,n,r){return this._inner.run(t,n,r)}runTask(t,n,r,o){let i=this._inner,s=i.scheduleEventTask(\"NgZoneEvent: \"+o,t,kE,vs,vs);try{return i.runTask(s,n,r)}finally{i.cancelTask(s)}}runGuarded(t,n,r){return this._inner.runGuarded(t,n,r)}runOutsideAngular(t){return this._outer.run(t)}},kE={};function ml(e){if(e._nesting==0&&!e.hasPendingMicrotasks&&!e.isStable)try{e._nesting++,e.onMicrotaskEmpty.emit(null)}finally{if(e._nesting--,!e.hasPendingMicrotasks)try{e.runOutsideAngular(()=>e.onStable.emit(null))}finally{e.isStable=!0}}}function RE(e){if(e.isCheckStableRunning||e.callbackScheduled)return;e.callbackScheduled=!0;function t(){hl(()=>{e.callbackScheduled=!1,Tc(e),e.isCheckStableRunning=!0,ml(e),e.isCheckStableRunning=!1})}e.scheduleInRootZone?Zone.root.run(()=>{t()}):e._outer.run(()=>{t()}),Tc(e)}function FE(e){let t=()=>{RE(e)},n=NE++;e._inner=e._inner.fork({name:\"angular\",properties:{[gl]:!0,[Ro]:n,[Ro+n]:!0},onInvokeTask:(r,o,i,s,u,a)=>{if(OE(a))return r.invokeTask(i,s,u,a);try{return S0(e),r.invokeTask(i,s,u,a)}finally{(e.shouldCoalesceEventChangeDetection&&s.type===\"eventTask\"||e.shouldCoalesceRunChangeDetection)&&t(),M0(e)}},onInvoke:(r,o,i,s,u,a,c)=>{try{return S0(e),r.invoke(i,s,u,a,c)}finally{e.shouldCoalesceRunChangeDetection&&!e.callbackScheduled&&!PE(a)&&t(),M0(e)}},onHasTask:(r,o,i,s)=>{r.hasTask(i,s),o===i&&(s.change==\"microTask\"?(e._hasPendingMicrotasks=s.microTask,Tc(e),ml(e)):s.change==\"macroTask\"&&(e.hasPendingMacrotasks=s.macroTask))},onHandleError:(r,o,i,s)=>(r.handleError(i,s),e.runOutsideAngular(()=>e.onError.emit(s)),!1)})}function Tc(e){e._hasPendingMicrotasks||(e.shouldCoalesceEventChangeDetection||e.shouldCoalesceRunChangeDetection)&&e.callbackScheduled===!0?e.hasPendingMicrotasks=!0:e.hasPendingMicrotasks=!1}function S0(e){e._nesting++,e.isStable&&(e.isStable=!1,e.onUnstable.emit(null))}function M0(e){e._nesting--,ml(e)}var Fo=class{hasPendingMicrotasks=!1;hasPendingMacrotasks=!1;isStable=!0;onUnstable=new Nt;onMicrotaskEmpty=new Nt;onStable=new Nt;onError=new Nt;run(t,n,r){return t.apply(n,r)}runGuarded(t,n,r){return t.apply(n,r)}runOutsideAngular(t){return t()}runTask(t,n,r,o){return t.apply(n,r)}};function OE(e){return yg(e,\"__ignore_ng_zone__\")}function PE(e){return yg(e,\"__scheduler_tick__\")}function yg(e,t){return!Array.isArray(e)||e.length!==1?!1:e[0]?.data?.[t]===!0}var Be=class{_console=console;handleError(t){this._console.error(\"ERROR\",t)}},Pt=new x(\"\",{factory:()=>{let e=b(be),t=b(we),n;return r=>{e.runOutsideAngular(()=>{t.destroyed&&!n?setTimeout(()=>{throw r}):(n??=t.get(Be),n.handleError(r))})}}}),bg={provide:Mr,useValue:()=>{let e=b(Be,{optional:!0})},multi:!0};function pn(e,t){let[n,r,o]=Ga(e,t?.equal),i=n,s=i[ne];return i.set=r,i.update=o,i.asReadonly=Wo.bind(i),i}function Wo(){let e=this[ne];if(e.readonlyFn===void 0){let t=()=>this();t[ne]=e,e.readonlyFn=t}return e.readonlyFn}var Lr=(()=>{class e{view;node;constructor(n,r){this.view=n,this.node=r}static __NG_ELEMENT_ID__=LE}return e})();function LE(){return new Lr(_(),re())}var gt=class{},Zo=new x(\"\",{factory:()=>!0});var yl=new x(\"\"),Wn=(()=>{class e{internalPendingTasks=b(Gn);scheduler=b(gt);errorHandler=b(Pt);add(){let n=this.internalPendingTasks.add();return()=>{this.internalPendingTasks.has(n)&&(this.scheduler.notify(11),this.internalPendingTasks.remove(n))}}run(n){let r=this.add();n().catch(this.errorHandler).finally(r)}static \\u0275prov=T({token:e,providedIn:\"root\",factory:()=>new e})}return e})(),Hs=(()=>{class e{static \\u0275prov=T({token:e,providedIn:\"root\",factory:()=>new Sc})}return e})(),Sc=class{dirtyEffectCount=0;queues=new Map;add(t){this.enqueue(t),this.schedule(t)}schedule(t){t.dirty&&this.dirtyEffectCount++}remove(t){let n=t.zone,r=this.queues.get(n);r.has(t)&&(r.delete(t),t.dirty&&this.dirtyEffectCount--)}enqueue(t){let n=t.zone;this.queues.has(n)||this.queues.set(n,new Set);let r=this.queues.get(n);r.has(t)||r.add(t)}flush(){for(;this.dirtyEffectCount>0;){let t=!1;for(let[n,r]of this.queues)n===null?t||=this.flushQueue(r):t||=n.run(()=>this.flushQueue(r));t||(this.dirtyEffectCount=0)}}flushQueue(t){let n=!1;for(let r of t)r.dirty&&(this.dirtyEffectCount--,n=!0,r.run());return n}},Ds=class{[ne];constructor(t){this[ne]=t}destroy(){this[ne].destroy()}};function Yo(e,t){let n=t?.injector??b(fe),r=t?.manualCleanup!==!0?n.get(Fe):null,o,i=n.get(Lr,null,{optional:!0}),s=n.get(gt);return i!==null?(o=VE(i.view,s,e),r instanceof bs&&r._lView===i.view&&(r=null)):o=HE(e,n.get(Hs),s),o.injector=n,r!==null&&(o.onDestroyFns=[r.onDestroy(()=>o.destroy())]),new Ds(o)}var vg=P(M({},Wa),{cleanupFns:void 0,zone:null,onDestroyFns:null,run(){let e=ko(!1);try{Za(this)}finally{ko(e)}},cleanup(){if(!this.cleanupFns?.length)return;let e=I(null);try{for(;this.cleanupFns.length;)this.cleanupFns.pop()()}finally{this.cleanupFns=[],I(e)}}}),jE=P(M({},vg),{consumerMarkedDirty(){this.scheduler.schedule(this),this.notifier.notify(12)},destroy(){if(Xt(this),this.onDestroyFns!==null)for(let e of this.onDestroyFns)e();this.cleanup(),this.scheduler.remove(this)}}),BE=P(M({},vg),{consumerMarkedDirty(){this.view[L]|=8192,zn(this.view),this.notifier.notify(13)},destroy(){if(Xt(this),this.onDestroyFns!==null)for(let e of this.onDestroyFns)e();this.cleanup(),this.view[sn]?.delete(this)}});function VE(e,t,n){let r=Object.create(BE);return r.view=e,r.zone=typeof Zone<\"u\"?Zone.current:null,r.notifier=t,r.fn=Dg(r,n),e[sn]??=new Set,e[sn].add(r),r.consumerMarkedDirty(r),r}function HE(e,t,n){let r=Object.create(jE);return r.fn=Dg(r,e),r.scheduler=t,r.notifier=n,r.zone=typeof Zone<\"u\"?Zone.current:null,r.scheduler.add(r),r.notifier.notify(12),r}function Dg(e,t){return()=>{t(n=>(e.cleanupFns??=[]).push(n))}}function si(e){return{toString:e}.toString()}function ZE(e){return typeof e==\"function\"}function om(e,t,n,r){t!==null?t.applyValueToInputSignal(t,r):e[n]=r}var Qs=class{previousValue;currentValue;firstChange;constructor(t,n,r){this.previousValue=t,this.currentValue=n,this.firstChange=r}isFirstChange(){return this.firstChange}},mu=(()=>{let e=()=>im;return e.ngInherit=!0,e})();function im(e){return e.type.prototype.ngOnChanges&&(e.setInput=QE),YE}function YE(){let e=um(this),t=e?.current;if(t){let n=e.previous;if(n===Ye)e.previous=t;else for(let r in t)n[r]=t[r];e.current=null,this.ngOnChanges(t)}}function QE(e,t,n,r,o){let i=this.declaredInputs[r],s=um(e)||KE(e,{previous:Ye,current:null}),u=s.current||(s.current={}),a=s.previous,c=a[i];u[i]=new Qs(c&&c.currentValue,n,a===Ye),om(e,t,o,n)}var sm=\"__ngSimpleChanges__\";function um(e){return e[sm]||null}function KE(e,t){return e[sm]=t}var Eg=[];var Y=function(e,t=null,n){for(let r=0;r<Eg.length;r++){let o=Eg[r];o(e,t,n)}},q=(function(e){return e[e.TemplateCreateStart=0]=\"TemplateCreateStart\",e[e.TemplateCreateEnd=1]=\"TemplateCreateEnd\",e[e.TemplateUpdateStart=2]=\"TemplateUpdateStart\",e[e.TemplateUpdateEnd=3]=\"TemplateUpdateEnd\",e[e.LifecycleHookStart=4]=\"LifecycleHookStart\",e[e.LifecycleHookEnd=5]=\"LifecycleHookEnd\",e[e.OutputStart=6]=\"OutputStart\",e[e.OutputEnd=7]=\"OutputEnd\",e[e.BootstrapApplicationStart=8]=\"BootstrapApplicationStart\",e[e.BootstrapApplicationEnd=9]=\"BootstrapApplicationEnd\",e[e.BootstrapComponentStart=10]=\"BootstrapComponentStart\",e[e.BootstrapComponentEnd=11]=\"BootstrapComponentEnd\",e[e.ChangeDetectionStart=12]=\"ChangeDetectionStart\",e[e.ChangeDetectionEnd=13]=\"ChangeDetectionEnd\",e[e.ChangeDetectionSyncStart=14]=\"ChangeDetectionSyncStart\",e[e.ChangeDetectionSyncEnd=15]=\"ChangeDetectionSyncEnd\",e[e.AfterRenderHooksStart=16]=\"AfterRenderHooksStart\",e[e.AfterRenderHooksEnd=17]=\"AfterRenderHooksEnd\",e[e.ComponentStart=18]=\"ComponentStart\",e[e.ComponentEnd=19]=\"ComponentEnd\",e[e.DeferBlockStateStart=20]=\"DeferBlockStateStart\",e[e.DeferBlockStateEnd=21]=\"DeferBlockStateEnd\",e[e.DynamicComponentStart=22]=\"DynamicComponentStart\",e[e.DynamicComponentEnd=23]=\"DynamicComponentEnd\",e[e.HostBindingsUpdateStart=24]=\"HostBindingsUpdateStart\",e[e.HostBindingsUpdateEnd=25]=\"HostBindingsUpdateEnd\",e})(q||{});function JE(e,t,n){let{ngOnChanges:r,ngOnInit:o,ngDoCheck:i}=t.type.prototype;if(r){let s=im(t);(n.preOrderHooks??=[]).push(e,s),(n.preOrderCheckHooks??=[]).push(e,s)}o&&(n.preOrderHooks??=[]).push(0-e,o),i&&((n.preOrderHooks??=[]).push(e,i),(n.preOrderCheckHooks??=[]).push(e,i))}function am(e,t){for(let n=t.directiveStart,r=t.directiveEnd;n<r;n++){let i=e.data[n].type.prototype,{ngAfterContentInit:s,ngAfterContentChecked:u,ngAfterViewInit:a,ngAfterViewChecked:c,ngOnDestroy:l}=i;s&&(e.contentHooks??=[]).push(-n,s),u&&((e.contentHooks??=[]).push(n,u),(e.contentCheckHooks??=[]).push(n,u)),a&&(e.viewHooks??=[]).push(-n,a),c&&((e.viewHooks??=[]).push(n,c),(e.viewCheckHooks??=[]).push(n,c)),l!=null&&(e.destroyHooks??=[]).push(n,l)}}function Gs(e,t,n){cm(e,t,3,n)}function Ws(e,t,n,r){(e[L]&3)===n&&cm(e,t,n,r)}function bl(e,t){let n=e[L];(n&3)===t&&(n&=16383,n+=1,e[L]=n)}function cm(e,t,n,r){let o=r!==void 0?e[Vn]&65535:0,i=r??-1,s=t.length-1,u=0;for(let a=o;a<s;a++)if(typeof t[a+1]==\"number\"){if(u=t[a],r!=null&&u>=r)break}else t[a]<0&&(e[Vn]+=65536),(u<i||i==-1)&&(XE(e,n,t,a),e[Vn]=(e[Vn]&4294901760)+a+2),a++}function Cg(e,t){Y(q.LifecycleHookStart,e,t);let n=I(null);try{t.call(e)}finally{I(n),Y(q.LifecycleHookEnd,e,t)}}function XE(e,t,n,r){let o=n[r]<0,i=n[r+1],s=o?-n[r]:n[r],u=e[s];o?e[L]>>14<e[Vn]>>16&&(e[L]&3)===t&&(e[L]+=16384,Cg(u,i)):Cg(u,i)}var Br=-1,Qn=class{factory;name;injectImpl;resolving=!1;canSeeViewProviders;multi;componentProviders;index;providerFactory;constructor(t,n,r,o){this.factory=t,this.name=o,this.canSeeViewProviders=n,this.injectImpl=r}};function eC(e){return(e.flags&8)!==0}function tC(e){return(e.flags&16)!==0}function nC(e,t,n){let r=0;for(;r<n.length;){let o=n[r];if(typeof o==\"number\"){if(o!==0)break;r++;let i=n[r++],s=n[r++],u=n[r++];e.setAttribute(t,s,u,i)}else{let i=o,s=n[++r];rC(i)?e.setProperty(t,i,s):e.setAttribute(t,i,s),r++}}return r}function lm(e){return e===3||e===4||e===6}function rC(e){return e.charCodeAt(0)===64}function Vr(e,t){if(!(t===null||t.length===0))if(e===null||e.length===0)e=t.slice();else{let n=-1;for(let r=0;r<t.length;r++){let o=t[r];typeof o==\"number\"?n=o:n===0||(n===-1||n===2?_g(e,n,o,null,t[++r]):_g(e,n,o,null,null))}}return e}function _g(e,t,n,r,o){let i=0,s=e.length;if(t===-1)s=-1;else for(;i<e.length;){let u=e[i++];if(typeof u==\"number\"){if(u===t){s=-1;break}else if(u>t){s=i-1;break}}}for(;i<e.length;){let u=e[i];if(typeof u==\"number\")break;if(u===n){o!==null&&(e[i+1]=o);return}i++,o!==null&&i++}s!==-1&&(e.splice(s,0,t),i=s+1),e.splice(i++,0,n),o!==null&&e.splice(i++,0,o)}function dm(e){return e!==Br}function Ks(e){return e&32767}function oC(e){return e>>16}function Js(e,t){let n=oC(e),r=t;for(;n>0;)r=r[Bn],n--;return r}var Sl=!0;function Xs(e){let t=Sl;return Sl=e,t}var iC=256,fm=iC-1,pm=5,sC=0,Et={};function uC(e,t,n){let r;typeof n==\"string\"?r=n.charCodeAt(0)||0:n.hasOwnProperty(Pn)&&(r=n[Pn]),r==null&&(r=n[Pn]=sC++);let o=r&fm,i=1<<o;t.data[e+(o>>pm)]|=i}function eu(e,t){let n=hm(e,t);if(n!==-1)return n;let r=t[S];r.firstCreatePass&&(e.injectorIndex=t.length,vl(r.data,e),vl(t,null),vl(r.blueprint,null));let o=dd(e,t),i=e.injectorIndex;if(dm(o)){let s=Ks(o),u=Js(o,t),a=u[S].data;for(let c=0;c<8;c++)t[i+c]=u[s+c]|a[s+c]}return t[i+8]=o,i}function vl(e,t){e.push(0,0,0,0,0,0,0,0,t)}function hm(e,t){return e.injectorIndex===-1||e.parent&&e.parent.injectorIndex===e.injectorIndex||t[e.injectorIndex+8]===null?-1:e.injectorIndex}function dd(e,t){if(e.parent&&e.parent.injectorIndex!==-1)return e.parent.injectorIndex;let n=0,r=null,o=t;for(;o!==null;){if(r=vm(o),r===null)return Br;if(n++,o=o[Bn],r.injectorIndex!==-1)return r.injectorIndex|n<<16}return Br}function Ml(e,t,n){uC(e,t,n)}function aC(e,t){if(t===\"class\")return e.classes;if(t===\"style\")return e.styles;let n=e.attrs;if(n){let r=n.length,o=0;for(;o<r;){let i=n[o];if(lm(i))break;if(i===0)o=o+2;else if(typeof i==\"number\")for(o++;o<r&&typeof n[o]==\"string\";)o++;else{if(i===t)return n[o+1];o=o+2}}}return null}function gm(e,t,n){if(n&8||e!==void 0)return e;Ts(t,\"NodeInjector\")}function mm(e,t,n,r){if(n&8&&r===void 0&&(r=null),(n&3)===0){let o=e[Rt],i=_e(void 0);try{return o?o.get(t,r,n&8):Lc(t,r,n&8)}finally{_e(i)}}return gm(r,t,n)}function ym(e,t,n,r=0,o){if(e!==null){if(t[L]&2048&&!(r&2)){let s=fC(e,t,n,r,Et);if(s!==Et)return s}let i=bm(e,t,n,r,Et);if(i!==Et)return i}return mm(t,n,r,o)}function bm(e,t,n,r,o){let i=lC(n);if(typeof i==\"function\"){if(!dl(t,e,r))return r&1?gm(o,n,r):mm(t,n,r,o);try{let s;if(s=i(r),s==null&&!(r&8))Ts(n);else return s}finally{fl()}}else if(typeof i==\"number\"){let s=null,u=hm(e,t),a=Br,c=r&1?t[ve][Ie]:null;for((u===-1||r&4)&&(a=u===-1?dd(e,t):t[u+8],a===Br||!xg(r,!1)?u=-1:(s=t[S],u=Ks(a),t=Js(a,t)));u!==-1;){let l=t[S];if(wg(i,u,l.data)){let d=cC(u,t,n,s,r,c);if(d!==Et)return d}a=t[u+8],a!==Br&&xg(r,t[S].data[u+8]===c)&&wg(i,u,t)?(s=l,u=Ks(a),t=Js(a,t)):u=-1}}return o}function cC(e,t,n,r,o,i){let s=t[S],u=s.data[e+8],a=r==null?Dt(u)&&Sl:r!=s&&(u.type&3)!==0,c=o&1&&i===u,l=Zs(u,s,n,a,c);return l!==null?Jo(t,s,l,u,o):Et}function Zs(e,t,n,r,o){let i=e.providerIndexes,s=t.data,u=i&1048575,a=e.directiveStart,c=e.directiveEnd,l=i>>20,d=r?u:u+l,h=o?u+l:c;for(let f=d;f<h;f++){let p=s[f];if(f<a&&n===p||f>=a&&p.type===n)return f}if(o){let f=s[a];if(f&&Xe(f)&&f.type===n)return a}return null}function Jo(e,t,n,r,o){let i=e[n],s=t.data;if(i instanceof Qn){let u=i;if(u.resolving)throw Pc(\"\");let a=Xs(u.canSeeViewProviders);u.resolving=!0;let c=s[n].type||s[n],l,d=u.injectImpl?_e(u.injectImpl):null,h=dl(e,r,0);try{i=e[n]=u.factory(void 0,o,s,e,r),t.firstCreatePass&&n>=r.directiveStart&&JE(n,s[n],t)}finally{d!==null&&_e(d),Xs(a),u.resolving=!1,fl()}}return i}function lC(e){if(typeof e==\"string\")return e.charCodeAt(0)||0;let t=e.hasOwnProperty(Pn)?e[Pn]:void 0;return typeof t==\"number\"?t>=0?t&fm:dC:t}function wg(e,t,n){let r=1<<e;return!!(n[t+(e>>pm)]&r)}function xg(e,t){return!(e&2)&&!(e&1&&t)}var Zn=class{_tNode;_lView;constructor(t,n){this._tNode=t,this._lView=n}get(t,n,r){return ym(this._tNode,this._lView,t,Rn(r),n)}};function dC(){return new Zn(re(),_())}function tr(e){return si(()=>{let t=e.prototype.constructor,n=t[Ao]||Al(t),r=Object.prototype,o=Object.getPrototypeOf(e.prototype).constructor;for(;o&&o!==r;){let i=o[Ao]||Al(o);if(i&&i!==n)return i;o=Object.getPrototypeOf(o)}return i=>new i})}function Al(e){return Mc(e)?()=>{let t=Al(se(e));return t&&t()}:on(e)}function fC(e,t,n,r,o){let i=e,s=t;for(;i!==null&&s!==null&&s[L]&2048&&!Or(s);){let u=bm(i,s,n,r|2,Et);if(u!==Et)return u;let a=i.parent;if(!a){let c=s[qc];if(c){let l=c.get(n,Et,r&-5);if(l!==Et)return l}a=vm(s),s=s[Bn]}i=a}return o}function vm(e){let t=e[S],n=t.type;return n===2?t.declTNode:n===1?e[Ie]:null}function fd(e){return aC(re(),e)}function pC(){return Gr(re(),_())}function Gr(e,t){return new jt(Ue(e,t))}var jt=(()=>{class e{nativeElement;constructor(n){this.nativeElement=n}static __NG_ELEMENT_ID__=pC}return e})();function Dm(e){return e instanceof jt?e.nativeElement:e}function hC(){return this._results[Symbol.iterator]()}var tu=class{_emitDistinctChangesOnly;dirty=!0;_onDirty=void 0;_results=[];_changesDetected=!1;_changes=void 0;length=0;first=void 0;last=void 0;get changes(){return this._changes??=new ce}constructor(t=!1){this._emitDistinctChangesOnly=t}get(t){return this._results[t]}map(t){return this._results.map(t)}filter(t){return this._results.filter(t)}find(t){return this._results.find(t)}reduce(t,n){return this._results.reduce(t,n)}forEach(t){this._results.forEach(t)}some(t){return this._results.some(t)}toArray(){return this._results.slice()}toString(){return this._results.toString()}reset(t,n){this.dirty=!1;let r=P0(t);(this._changesDetected=!O0(this._results,r,n))&&(this._results=r,this.length=r.length,this.last=r[this.length-1],this.first=r[0])}notifyOnChanges(){this._changes!==void 0&&(this._changesDetected||!this._emitDistinctChangesOnly)&&this._changes.next(this)}onDirty(t){this._onDirty=t}setDirty(){this.dirty=!0,this._onDirty?.()}destroy(){this._changes!==void 0&&(this._changes.complete(),this._changes.unsubscribe())}[Symbol.iterator]=hC};function Em(e){return(e.flags&128)===128}var pd=(function(e){return e[e.OnPush=0]=\"OnPush\",e[e.Eager=1]=\"Eager\",e[e.Default=1]=\"Default\",e})(pd||{}),Cm=new Map,gC=0;function mC(){return gC++}function yC(e){Cm.set(e[Ft],e)}function Nl(e){Cm.delete(e[Ft])}var Ig=\"__ngContext__\";function Hr(e,t){Ot(t)?(e[Ig]=t[Ft],yC(t)):e[Ig]=t}function _m(e){return xm(e[Rr])}function wm(e){return xm(e[He])}function xm(e){for(;e!==null&&!Je(e);)e=e[He];return e}var kl;function hd(e){kl=e}function Im(){if(kl!==void 0)return kl;if(typeof document<\"u\")return document;throw new C(210,!1)}var yu=new x(\"\",{factory:()=>bC}),bC=\"ng\";var bu=new x(\"\"),nr=new x(\"\",{providedIn:\"platform\",factory:()=>\"unknown\"}),vC=new x(\"\"),vu=new x(\"\",{factory:()=>b(K).body?.querySelector(\"[ngCspNonce]\")?.getAttribute(\"ngCspNonce\")||null});var Tm=\"r\";var Sm=\"di\";var Mm=!1,Am=new x(\"\",{factory:()=>Mm});var Nm=new x(\"\");var DC=(e,t,n,r)=>{};function EC(e,t,n,r){DC(e,t,n,r)}function Du(e){return(e.flags&32)===32}var CC=()=>null;function km(e,t,n=!1){return CC(e,t,n)}function Rm(e,t){let n=e.contentQueries;if(n!==null){let r=I(null);try{for(let o=0;o<n.length;o+=2){let i=n[o],s=n[o+1];if(s!==-1){let u=e.data[s];qo(i),u.contentQueries(2,t[s],s)}}}finally{I(r)}}}function Rl(e,t,n){qo(0);let r=I(null);try{t(e,n)}finally{I(r)}}function gd(e,t,n){if(Wc(t)){let r=I(null);try{let o=t.directiveStart,i=t.directiveEnd;for(let s=o;s<i;s++){let u=e.data[s];if(u.contentQueries){let a=n[s];u.contentQueries(1,a,s)}}}finally{I(r)}}}var nt=(function(e){return e[e.Emulated=0]=\"Emulated\",e[e.None=2]=\"None\",e[e.ShadowDom=3]=\"ShadowDom\",e[e.ExperimentalIsolatedShadowDom=4]=\"ExperimentalIsolatedShadowDom\",e})(nt||{});var $s;function _C(){if($s===void 0&&($s=null,xe.trustedTypes))try{$s=xe.trustedTypes.createPolicy(\"angular\",{createHTML:e=>e,createScript:e=>e,createScriptURL:e=>e})}catch(e){}return $s}function Eu(e){return _C()?.createHTML(e)||e}var Us;function wC(){if(Us===void 0&&(Us=null,xe.trustedTypes))try{Us=xe.trustedTypes.createPolicy(\"angular#unsafe-bypass\",{createHTML:e=>e,createScript:e=>e,createScriptURL:e=>e})}catch(e){}return Us}function Tg(e){return wC()?.createHTML(e)||e}var Lt=class{changingThisBreaksApplicationSecurity;constructor(t){this.changingThisBreaksApplicationSecurity=t}toString(){return`SafeValue must use [property]=binding: ${this.changingThisBreaksApplicationSecurity} (see ${Es})`}},Fl=class extends Lt{getTypeName(){return\"HTML\"}},Ol=class extends Lt{getTypeName(){return\"Style\"}},Pl=class extends Lt{getTypeName(){return\"Script\"}},Ll=class extends Lt{getTypeName(){return\"URL\"}},jl=class extends Lt{getTypeName(){return\"ResourceURL\"}};function Oe(e){return e instanceof Lt?e.changingThisBreaksApplicationSecurity:e}function Bt(e,t){let n=Fm(e);if(n!=null&&n!==t){if(n===\"ResourceURL\"&&t===\"URL\")return!0;throw new Error(`Required a safe ${t}, got a ${n} (see ${Es})`)}return n===t}function Fm(e){return e instanceof Lt&&e.getTypeName()||null}function md(e){return new Fl(e)}function yd(e){return new Ol(e)}function bd(e){return new Pl(e)}function vd(e){return new Ll(e)}function Dd(e){return new jl(e)}function xC(e){let t=new Vl(e);return IC()?new Bl(t):t}var Bl=class{inertDocumentHelper;constructor(t){this.inertDocumentHelper=t}getInertBodyElement(t){t=\"<body><remove></remove>\"+t;try{let n=new window.DOMParser().parseFromString(Eu(t),\"text/html\").body;return n===null?this.inertDocumentHelper.getInertBodyElement(t):(n.firstChild?.remove(),n)}catch(n){return null}}},Vl=class{defaultDoc;inertDocument;constructor(t){this.defaultDoc=t,this.inertDocument=this.defaultDoc.implementation.createHTMLDocument(\"sanitization-inert\")}getInertBodyElement(t){let n=this.inertDocument.createElement(\"template\");return n.innerHTML=Eu(t),n}};function IC(){try{return!!new window.DOMParser().parseFromString(Eu(\"\"),\"text/html\")}catch(e){return!1}}var TC=/^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:\\/?#]*(?:[\\/?#]|$))/i;function ui(e){return e=String(e),e.match(TC)?e:\"unsafe:\"+e}function Vt(e){let t={};for(let n of e.split(\",\"))t[n]=!0;return t}function ai(...e){let t={};for(let n of e)for(let r in n)n.hasOwnProperty(r)&&(t[r]=!0);return t}var Om=Vt(\"area,br,col,hr,img,wbr\"),Pm=Vt(\"colgroup,dd,dt,li,p,tbody,td,tfoot,th,thead,tr\"),Lm=Vt(\"rp,rt\"),SC=ai(Lm,Pm),MC=ai(Pm,Vt(\"address,article,aside,blockquote,caption,center,del,details,dialog,dir,div,dl,figure,figcaption,footer,h1,h2,h3,h4,h5,h6,header,hgroup,hr,ins,main,map,menu,nav,ol,pre,section,summary,table,ul\")),AC=ai(Lm,Vt(\"a,abbr,acronym,audio,b,bdi,bdo,big,br,cite,code,del,dfn,em,font,i,img,ins,kbd,label,map,mark,picture,q,ruby,rp,rt,s,samp,small,source,span,strike,strong,sub,sup,time,track,tt,u,var,video\")),Sg=ai(Om,MC,AC,SC),jm=Vt(\"background,cite,href,itemtype,longdesc,poster,src,xlink:href\"),NC=Vt(\"abbr,accesskey,align,alt,autoplay,axis,bgcolor,border,cellpadding,cellspacing,class,clear,color,cols,colspan,compact,controls,coords,datetime,default,dir,download,face,headers,height,hidden,hreflang,hspace,ismap,itemscope,itemprop,kind,label,lang,language,loop,media,muted,nohref,nowrap,open,preload,rel,rev,role,rows,rowspan,rules,scope,scrolling,shape,size,sizes,span,srclang,srcset,start,summary,tabindex,target,title,translate,type,usemap,valign,value,vspace,width\"),kC=Vt(\"aria-activedescendant,aria-atomic,aria-autocomplete,aria-busy,aria-checked,aria-colcount,aria-colindex,aria-colspan,aria-controls,aria-current,aria-describedby,aria-details,aria-disabled,aria-dropeffect,aria-errormessage,aria-expanded,aria-flowto,aria-grabbed,aria-haspopup,aria-hidden,aria-invalid,aria-keyshortcuts,aria-label,aria-labelledby,aria-level,aria-live,aria-modal,aria-multiline,aria-multiselectable,aria-orientation,aria-owns,aria-placeholder,aria-posinset,aria-pressed,aria-readonly,aria-relevant,aria-required,aria-roledescription,aria-rowcount,aria-rowindex,aria-rowspan,aria-selected,aria-setsize,aria-sort,aria-valuemax,aria-valuemin,aria-valuenow,aria-valuetext\"),RC=ai(jm,NC,kC),FC=Vt(\"script,style,template\");var Hl=class{sanitizedSomething=!1;buf=[];sanitizeChildren(t){let n=t.firstChild,r=!0,o=[];for(;n;){if(n.nodeType===Node.ELEMENT_NODE?r=this.startElement(n):n.nodeType===Node.TEXT_NODE?this.chars(n.nodeValue):this.sanitizedSomething=!0,r&&n.firstChild){o.push(n),n=LC(n);continue}for(;n;){n.nodeType===Node.ELEMENT_NODE&&this.endElement(n);let i=PC(n);if(i){n=i;break}n=o.pop()}}return this.buf.join(\"\")}startElement(t){let n=Mg(t).toLowerCase();if(!Sg.hasOwnProperty(n))return this.sanitizedSomething=!0,!FC.hasOwnProperty(n);this.buf.push(\"<\"),this.buf.push(n);let r=t.attributes;for(let o=0;o<r.length;o++){let i=r.item(o),s=i.name,u=s.toLowerCase();if(!RC.hasOwnProperty(u)){this.sanitizedSomething=!0;continue}let a=i.value;jm[u]&&(a=ui(a)),this.buf.push(\" \",s,'=\"',Ag(a),'\"')}return this.buf.push(\">\"),!0}endElement(t){let n=Mg(t).toLowerCase();Sg.hasOwnProperty(n)&&!Om.hasOwnProperty(n)&&(this.buf.push(\"</\"),this.buf.push(n),this.buf.push(\">\"))}chars(t){this.buf.push(Ag(t))}};function OC(e,t){return(e.compareDocumentPosition(t)&Node.DOCUMENT_POSITION_CONTAINED_BY)!==Node.DOCUMENT_POSITION_CONTAINED_BY}function PC(e){let t=e.nextSibling;if(t&&e!==t.previousSibling)throw Bm(t);return t}function LC(e){let t=e.firstChild;if(t&&OC(e,t))throw Bm(t);return t}function Mg(e){let t=e.nodeName;return typeof t==\"string\"?t:\"FORM\"}function Bm(e){return new Error(`Failed to sanitize html because the element is clobbered: ${e.outerHTML}`)}var jC=/[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g,BC=/([^\\#-~ |!])/g;function Ag(e){return e.replace(/&/g,\"&amp;\").replace(jC,function(t){let n=t.charCodeAt(0),r=t.charCodeAt(1);return\"&#\"+((n-55296)*1024+(r-56320)+65536)+\";\"}).replace(BC,function(t){return\"&#\"+t.charCodeAt(0)+\";\"}).replace(/</g,\"&lt;\").replace(/>/g,\"&gt;\")}var zs;function Cu(e,t){let n=null;try{zs=zs||xC(e);let r=t?String(t):\"\";n=zs.getInertBodyElement(r);let o=5,i=r;do{if(o===0)throw new Error(\"Failed to sanitize html because the input is unstable\");o--,r=i,i=n.innerHTML,n=zs.getInertBodyElement(r)}while(r!==i);let u=new Hl().sanitizeChildren(Ng(n)||n);return Eu(u)}finally{if(n){let r=Ng(n)||n;for(;r.firstChild;)r.firstChild.remove()}}}function Ng(e){return\"content\"in e&&VC(e)?e.content:null}function VC(e){return e.nodeType===Node.ELEMENT_NODE&&e.nodeName===\"TEMPLATE\"}var HC=/^>|^->|<!--|-->|--!>|<!-$/g,$C=/(<|>)/g,UC=\"\\u200B$1\\u200B\";function zC(e){return e.replace(HC,t=>t.replace($C,UC))}function qC(e,t){return e.createText(t)}function GC(e,t,n){e.setValue(t,n)}function WC(e,t){return e.createComment(zC(t))}function Vm(e,t,n){return e.createElement(t,n)}function nu(e,t,n,r,o){e.insertBefore(t,n,r,o)}function Hm(e,t,n){e.appendChild(t,n)}function kg(e,t,n,r,o){r!==null?nu(e,t,n,r,o):Hm(e,t,n)}function $m(e,t,n,r){e.removeChild(null,t,n,r)}function ZC(e,t,n){e.setAttribute(t,\"style\",n)}function YC(e,t,n){n===\"\"?e.removeAttribute(t,\"class\"):e.setAttribute(t,\"class\",n)}function Um(e,t,n){let{mergedAttrs:r,classes:o,styles:i}=n;r!==null&&nC(e,t,r),o!==null&&YC(e,t,o),i!==null&&ZC(e,t,i)}var Pe=(function(e){return e[e.NONE=0]=\"NONE\",e[e.HTML=1]=\"HTML\",e[e.STYLE=2]=\"STYLE\",e[e.SCRIPT=3]=\"SCRIPT\",e[e.URL=4]=\"URL\",e[e.RESOURCE_URL=5]=\"RESOURCE_URL\",e})(Pe||{});function Ed(e){let t=zm();return t?Tg(t.sanitize(Pe.HTML,e)||\"\"):Bt(e,\"HTML\")?Tg(Oe(e)):Cu(Im(),Ve(e))}function QC(e){let t=zm();return t?t.sanitize(Pe.URL,e)||\"\":Bt(e,\"URL\")?Oe(e):ui(Ve(e))}function zm(){let e=_();return e&&e[Ke].sanitizer}function KC(e){return e.ownerDocument.defaultView}function JC(e){return e.ownerDocument}function qm(e){return e instanceof Function?e():e}function XC(e,t,n){let r=e.length;for(;;){let o=e.indexOf(t,n);if(o===-1)return o;if(o===0||e.charCodeAt(o-1)<=32){let i=t.length;if(o+i===r||e.charCodeAt(o+i)<=32)return o}n=o+1}}var Gm=\"ng-template\";function e_(e,t,n,r){let o=0;if(r){for(;o<t.length&&typeof t[o]==\"string\";o+=2)if(t[o]===\"class\"&&XC(t[o+1].toLowerCase(),n,0)!==-1)return!0}else if(Cd(e))return!1;if(o=t.indexOf(1,o),o>-1){let i;for(;++o<t.length&&typeof(i=t[o])==\"string\";)if(i.toLowerCase()===n)return!0}return!1}function Cd(e){return e.type===4&&e.value!==Gm}function t_(e,t,n){let r=e.type===4&&!n?Gm:e.value;return t===r}function n_(e,t,n){let r=4,o=e.attrs,i=o!==null?i_(o):0,s=!1;for(let u=0;u<t.length;u++){let a=t[u];if(typeof a==\"number\"){if(!s&&!tt(r)&&!tt(a))return!1;if(s&&tt(a))continue;s=!1,r=a|r&1;continue}if(!s)if(r&4){if(r=2|r&1,a!==\"\"&&!t_(e,a,n)||a===\"\"&&t.length===1){if(tt(r))return!1;s=!0}}else if(r&8){if(o===null||!e_(e,o,a,n)){if(tt(r))return!1;s=!0}}else{let c=t[++u],l=r_(a,o,Cd(e),n);if(l===-1){if(tt(r))return!1;s=!0;continue}if(c!==\"\"){let d;if(l>i?d=\"\":d=o[l+1].toLowerCase(),r&2&&c!==d){if(tt(r))return!1;s=!0}}}}return tt(r)||s}function tt(e){return(e&1)===0}function r_(e,t,n,r){if(t===null)return-1;let o=0;if(r||!n){let i=!1;for(;o<t.length;){let s=t[o];if(s===e)return o;if(s===3||s===6)i=!0;else if(s===1||s===2){let u=t[++o];for(;typeof u==\"string\";)u=t[++o];continue}else{if(s===4)break;if(s===0){o+=4;continue}}o+=i?1:2}return-1}else return s_(t,e)}function Wm(e,t,n=!1){for(let r=0;r<t.length;r++)if(n_(e,t[r],n))return!0;return!1}function o_(e){let t=e.attrs;if(t!=null){let n=t.indexOf(5);if((n&1)===0)return t[n+1]}return null}function i_(e){for(let t=0;t<e.length;t++){let n=e[t];if(lm(n))return t}return e.length}function s_(e,t){let n=e.indexOf(4);if(n>-1)for(n++;n<e.length;){let r=e[n];if(typeof r==\"number\")return-1;if(r===t)return n;n++}return-1}function u_(e,t){e:for(let n=0;n<t.length;n++){let r=t[n];if(e.length===r.length){for(let o=0;o<e.length;o++)if(e[o]!==r[o])continue e;return!0}}return!1}function Rg(e,t){return e?\":not(\"+t.trim()+\")\":t}function a_(e){let t=e[0],n=1,r=2,o=\"\",i=!1;for(;n<e.length;){let s=e[n];if(typeof s==\"string\")if(r&2){let u=e[++n];o+=\"[\"+s+(u.length>0?'=\"'+u+'\"':\"\")+\"]\"}else r&8?o+=\".\"+s:r&4&&(o+=\" \"+s);else o!==\"\"&&!tt(s)&&(t+=Rg(i,o),o=\"\"),r=s,i=i||!tt(r);n++}return o!==\"\"&&(t+=Rg(i,o)),t}function c_(e){return e.map(a_).join(\",\")}function l_(e){let t=[],n=[],r=1,o=2;for(;r<e.length;){let i=e[r];if(typeof i==\"string\")o===2?i!==\"\"&&t.push(i,e[++r]):o===8&&n.push(i);else{if(!tt(o))break;o=i}r++}return n.length&&t.push(1,...n),t}var le={};function _d(e,t,n,r,o,i,s,u,a,c,l){let d=Q+r,h=d+o,f=d_(d,h),p=typeof c==\"function\"?c():c;return f[S]={type:e,blueprint:f,template:n,queries:null,viewQuery:u,declTNode:t,data:f.slice().fill(null,d),bindingStartIndex:d,expandoStartIndex:h,hostBindingOpCodes:null,firstCreatePass:!0,firstUpdatePass:!0,staticViewQueries:!1,staticContentQueries:!1,preOrderHooks:null,preOrderCheckHooks:null,contentHooks:null,contentCheckHooks:null,viewHooks:null,viewCheckHooks:null,destroyHooks:null,cleanup:null,contentQueries:null,components:null,directiveRegistry:typeof i==\"function\"?i():i,pipeRegistry:typeof s==\"function\"?s():s,firstChild:null,schemas:a,consts:p,incompleteFirstPass:!1,ssrId:l}}function d_(e,t){let n=[];for(let r=0;r<t;r++)n.push(r<e?null:le);return n}function f_(e){let t=e.tView;return t===null||t.incompleteFirstPass?e.tView=_d(1,null,e.template,e.decls,e.vars,e.directiveDefs,e.pipeDefs,e.viewQuery,e.schemas,e.consts,e.id):t}function wd(e,t,n,r,o,i,s,u,a,c,l){let d=t.blueprint.slice();return d[Qe]=o,d[L]=r|4|128|8|64|1024,(c!==null||e&&e[L]&2048)&&(d[L]|=2048),Qc(d),d[ue]=d[Bn]=e,d[ee]=n,d[Ke]=s||e&&e[Ke],d[Z]=u||e&&e[Z],d[Rt]=a||e&&e[Rt]||null,d[Ie]=i,d[Ft]=mC(),d[jn]=l,d[qc]=c,d[ve]=t.type==2?e[ve]:d,d}function p_(e,t,n){let r=Ue(t,e),o=f_(n),i=e[Ke].rendererFactory,s=xd(e,wd(e,o,null,Zm(n),r,t,null,i.createRenderer(r,n),null,null,null));return e[t.index]=s}function Zm(e){let t=16;return e.signals?t=4096:e.onPush&&(t=64),t}function Ym(e,t,n,r){if(n===0)return-1;let o=t.length;for(let i=0;i<n;i++)t.push(r),e.blueprint.push(r),e.data.push(null);return o}function xd(e,t){return e[Rr]?e[zc][He]=t:e[Rr]=t,e[zc]=t,t}function Wr(e=1){Qm(G(),_(),ze()+e,!1)}function Qm(e,t,n,r){if(!r)if((t[L]&3)===3){let i=e.preOrderCheckHooks;i!==null&&Gs(t,i,n)}else{let i=e.preOrderHooks;i!==null&&Ws(t,i,0,n)}dn(n)}var _u=(function(e){return e[e.None=0]=\"None\",e[e.SignalBased=1]=\"SignalBased\",e[e.HasDecoratorInputTransform=2]=\"HasDecoratorInputTransform\",e})(_u||{});function hn(e,t,n,r){let o=I(null);try{let[i,s,u]=e.inputs[n],a=null;(s&_u.SignalBased)!==0&&(a=t[i][ne]),a!==null&&a.transformFn!==void 0?r=a.transformFn(r):u!==null&&(r=u.call(t,r)),e.setInput!==null?e.setInput(t,a,r,n,i):om(t,a,i,r)}finally{I(o)}}var rt=(function(e){return e[e.Important=1]=\"Important\",e[e.DashCase=2]=\"DashCase\",e})(rt||{}),h_;function Id(e,t){return h_(e,t)}var HP=typeof document<\"u\"&&typeof document?.documentElement?.getAnimations==\"function\";var $l=new WeakMap,Ul=new WeakSet;function g_(e,t){let n=$l.get(e);if(!n||n.length===0)return;let r=t.parentNode,o=t.previousSibling;for(let i=n.length-1;i>=0;i--){let s=n[i],u=s.parentNode;s===t?(n.splice(i,1),Ul.add(s),s.dispatchEvent(new CustomEvent(\"animationend\",{detail:{cancel:!0}}))):(o&&s===o||u&&r&&u!==r)&&(n.splice(i,1),s.dispatchEvent(new CustomEvent(\"animationend\",{detail:{cancel:!0}})),s.parentNode?.removeChild(s))}}function m_(e,t){let n=$l.get(e);n?n.includes(t)||n.push(t):$l.set(e,[t])}var Kn=new Set,wu=(function(e){return e[e.CHANGE_DETECTION=0]=\"CHANGE_DETECTION\",e[e.AFTER_NEXT_RENDER=1]=\"AFTER_NEXT_RENDER\",e})(wu||{}),ot=new x(\"\"),Fg=new Set;function Ct(e){Fg.has(e)||(Fg.add(e),performance?.mark?.(\"mark_feature_usage\",{detail:{feature:e}}))}var xu=(()=>{class e{impl=null;execute(){this.impl?.execute()}static \\u0275prov=T({token:e,providedIn:\"root\",factory:()=>new e})}return e})(),Td=[0,1,2,3],Sd=(()=>{class e{ngZone=b(be);scheduler=b(gt);errorHandler=b(Be,{optional:!0});sequences=new Set;deferredRegistrations=new Set;executing=!1;constructor(){b(ot,{optional:!0})}execute(){let n=this.sequences.size>0;n&&Y(q.AfterRenderHooksStart),this.executing=!0;for(let r of Td)for(let o of this.sequences)if(!(o.erroredOrDestroyed||!o.hooks[r]))try{o.pipelinedValue=this.ngZone.runOutsideAngular(()=>this.maybeTrace(()=>{let i=o.hooks[r];return i(o.pipelinedValue)},o.snapshot))}catch(i){o.erroredOrDestroyed=!0,this.errorHandler?.handleError(i)}this.executing=!1;for(let r of this.sequences)r.afterRun(),r.once&&(this.sequences.delete(r),r.destroy());for(let r of this.deferredRegistrations)this.sequences.add(r);this.deferredRegistrations.size>0&&this.scheduler.notify(7),this.deferredRegistrations.clear(),n&&Y(q.AfterRenderHooksEnd)}register(n){let{view:r}=n;r!==void 0?((r[Hn]??=[]).push(n),zn(r),r[L]|=8192):this.executing?this.deferredRegistrations.add(n):this.addSequence(n)}addSequence(n){this.sequences.add(n),this.scheduler.notify(7)}unregister(n){this.executing&&this.sequences.has(n)?(n.erroredOrDestroyed=!0,n.pipelinedValue=void 0,n.once=!0):(this.sequences.delete(n),this.deferredRegistrations.delete(n))}maybeTrace(n,r){return r?r.run(wu.AFTER_NEXT_RENDER,n):n()}static \\u0275prov=T({token:e,providedIn:\"root\",factory:()=>new e})}return e})(),Xo=class{impl;hooks;view;once;snapshot;erroredOrDestroyed=!1;pipelinedValue=void 0;unregisterOnDestroy;constructor(t,n,r,o,i,s=null){this.impl=t,this.hooks=n,this.view=r,this.once=o,this.snapshot=s,this.unregisterOnDestroy=i?.onDestroy(()=>this.destroy())}afterRun(){this.erroredOrDestroyed=!1,this.pipelinedValue=void 0,this.snapshot?.dispose(),this.snapshot=null}destroy(){this.impl.unregister(this),this.unregisterOnDestroy?.();let t=this.view?.[Hn];t&&(this.view[Hn]=t.filter(n=>n!==this))}};function y_(e,t){let n=t?.injector??b(fe);return Ct(\"NgAfterNextRender\"),v_(e,n,t,!0)}function b_(e){return e instanceof Function?[void 0,void 0,e,void 0]:[e.earlyRead,e.write,e.mixedReadWrite,e.read]}function v_(e,t,n,r){let o=t.get(xu);o.impl??=t.get(Sd);let i=t.get(ot,null,{optional:!0}),s=n?.manualCleanup!==!0?t.get(Fe):null,u=t.get(Lr,null,{optional:!0}),a=new Xo(o.impl,b_(e),u?.view,r,s,i?.snapshot(null));return o.impl.register(a),a}var Km=new x(\"\",{factory:()=>({queue:new Set,isScheduled:!1,scheduler:null,injector:b(we)})});function Jm(e,t,n){let r=e.get(Km);if(Array.isArray(t))for(let o of t)r.queue.add(o),n?.detachedLeaveAnimationFns?.push(o);else r.queue.add(t),n?.detachedLeaveAnimationFns?.push(t);r.scheduler&&r.scheduler(e)}function D_(e,t){let n=e.get(Km);if(t.detachedLeaveAnimationFns){for(let r of t.detachedLeaveAnimationFns)n.queue.delete(r);t.detachedLeaveAnimationFns=void 0}}function E_(e,t){for(let[n,r]of t)Jm(e,r.animateFns)}function Og(e,t,n,r){let o=e?.[cn]?.enter;t!==null&&o&&o.has(n.index)&&E_(r,o)}function jr(e,t,n,r,o,i,s,u){if(o!=null){let a,c=!1;Je(o)?a=o:Ot(o)&&(c=!0,o=o[Qe]);let l=$e(o);e===0&&r!==null?(Og(u,r,i,n),s==null?Hm(t,r,l):nu(t,r,l,s||null,!0)):e===1&&r!==null?(Og(u,r,i,n),nu(t,r,l,s||null,!0),g_(i,l)):e===2?(u?.[cn]?.leave?.has(i.index)&&m_(i,l),Pg(u,i,n,d=>{if(Ul.has(l)){Ul.delete(l);return}$m(t,l,c,d)})):e===3&&Pg(u,i,n,()=>{t.destroyNode(l)}),a!=null&&k_(t,e,n,a,i,r,s)}}function C_(e,t){Xm(e,t),t[Qe]=null,t[Ie]=null}function __(e,t,n,r,o,i){r[Qe]=o,r[Ie]=t,Tu(e,r,n,1,o,i)}function Xm(e,t){t[Ke].changeDetectionScheduler?.notify(9),Tu(e,t,t[Z],2,null,null)}function w_(e){let t=e[Rr];if(!t)return Dl(e[S],e);for(;t;){let n=null;if(Ot(t))n=t[Rr];else{let r=t[te];r&&(n=r)}if(!n){for(;t&&!t[He]&&t!==e;)Ot(t)&&Dl(t[S],t),t=t[ue];t===null&&(t=e),Ot(t)&&Dl(t[S],t),n=t&&t[He]}t=n}}function Md(e,t){let n=e[$n],r=n.indexOf(t);n.splice(r,1)}function Iu(e,t){if(Un(t))return;let n=t[Z];n.destroyNode&&Tu(e,t,n,3,null,null),w_(t)}function Dl(e,t){if(Un(t))return;let n=I(null);try{t[L]&=-129,t[L]|=256,t[Ne]&&Xt(t[Ne]),T_(e,t),I_(e,t),t[S].type===1&&t[Z].destroy();let r=t[an];if(r!==null&&Je(t[ue])){r!==t[ue]&&Md(r,t);let o=t[vt];o!==null&&o.detachView(e)}Nl(t)}finally{I(n)}}function Pg(e,t,n,r){let o=e?.[cn];if(o==null||o.leave==null||!o.leave.has(t.index))return r(!1);e&&Kn.add(e[Ft]),Jm(n,()=>{if(o.leave&&o.leave.has(t.index)){let s=o.leave.get(t.index),u=[];if(s){for(let a=0;a<s.animateFns.length;a++){let c=s.animateFns[a],{promise:l}=c();u.push(l)}o.detachedLeaveAnimationFns=void 0}o.running=Promise.allSettled(u),x_(e,r)}else e&&Kn.delete(e[Ft]),r(!1)},o)}function x_(e,t){let n=e[cn]?.running;if(n){n.then(()=>{e[cn].running=void 0,Kn.delete(e[Ft]),t(!0)});return}t(!1)}function I_(e,t){let n=e.cleanup,r=t[kr];if(n!==null)for(let s=0;s<n.length-1;s+=2)if(typeof n[s]==\"string\"){let u=n[s+3];u>=0?r[u]():r[-u].unsubscribe(),s+=2}else{let u=r[n[s+1]];n[s].call(u)}r!==null&&(t[kr]=null);let o=t[kt];if(o!==null){t[kt]=null;for(let s=0;s<o.length;s++){let u=o[s];u()}}let i=t[sn];if(i!==null){t[sn]=null;for(let s of i)s.destroy()}}function T_(e,t){let n;if(e!=null&&(n=e.destroyHooks)!=null)for(let r=0;r<n.length;r+=2){let o=t[n[r]];if(!(o instanceof Qn)){let i=n[r+1];if(Array.isArray(i))for(let s=0;s<i.length;s+=2){let u=o[i[s]],a=i[s+1];Y(q.LifecycleHookStart,u,a);try{a.call(u)}finally{Y(q.LifecycleHookEnd,u,a)}}else{Y(q.LifecycleHookStart,o,i);try{i.call(o)}finally{Y(q.LifecycleHookEnd,o,i)}}}}}function ey(e,t,n){return S_(e,t.parent,n)}function S_(e,t,n){let r=t;for(;r!==null&&r.type&168;)t=r,r=t.parent;if(r===null)return n[Qe];if(Dt(r)){let{encapsulation:o}=e.data[r.directiveStart+r.componentOffset];if(o===nt.None||o===nt.Emulated)return null}return Ue(r,n)}function ty(e,t,n){return A_(e,t,n)}function M_(e,t,n){return e.type&40?Ue(e,n):null}var A_=M_,Lg;function Ad(e,t,n,r){let o=ey(e,r,t),i=t[Z],s=r.parent||t[Ie],u=ty(s,r,t);if(o!=null)if(Array.isArray(n))for(let a=0;a<n.length;a++)kg(i,o,n[a],u,!1);else kg(i,o,n,u,!1);Lg!==void 0&&Lg(i,r,t,n,o)}function Qo(e,t){if(t!==null){let n=t.type;if(n&3)return Ue(t,e);if(n&4)return zl(-1,e[t.index]);if(n&8){let r=t.child;if(r!==null)return Qo(e,r);{let o=e[t.index];return Je(o)?zl(-1,o):$e(o)}}else{if(n&128)return Qo(e,t.next);if(n&32)return Id(t,e)()||$e(e[t.index]);{let r=ny(e,t);if(r!==null){if(Array.isArray(r))return r[0];let o=un(e[ve]);return Qo(o,r)}else return Qo(e,t.next)}}}return null}function ny(e,t){if(t!==null){let r=e[ve][Ie],o=t.projection;return r.projection[o]}return null}function zl(e,t){let n=te+e+1;if(n<t.length){let r=t[n],o=r[S].firstChild;if(o!==null)return Qo(r,o)}return t[ln]}function Nd(e,t,n,r,o,i,s){for(;n!=null;){let u=r[Rt];if(n.type===128){n=n.next;continue}let a=r[n.index],c=n.type;if(s&&t===0&&(a&&Hr($e(a),r),n.flags|=2),!Du(n))if(c&8)Nd(e,t,n.child,r,o,i,!1),jr(t,e,u,o,a,n,i,r);else if(c&32){let l=Id(n,r),d;for(;d=l();)jr(t,e,u,o,d,n,i,r);jr(t,e,u,o,a,n,i,r)}else c&16?ry(e,t,r,n,o,i):jr(t,e,u,o,a,n,i,r);n=s?n.projectionNext:n.next}}function Tu(e,t,n,r,o,i){Nd(n,r,e.firstChild,t,o,i,!1)}function N_(e,t,n){let r=t[Z],o=ey(e,n,t),i=n.parent||t[Ie],s=ty(i,n,t);ry(r,0,t,n,o,s)}function ry(e,t,n,r,o,i){let s=n[ve],a=s[Ie].projection[r.projection];if(Array.isArray(a))for(let c=0;c<a.length;c++){let l=a[c];jr(t,e,n[Rt],o,l,r,i,n)}else{let c=a,l=s[ue];Em(r)&&(c.flags|=128),Nd(e,t,c,l,o,i,!0)}}function k_(e,t,n,r,o,i,s){let u=r[ln],a=$e(r);u!==a&&jr(t,e,n,i,u,o,s);for(let c=te;c<r.length;c++){let l=r[c];Tu(l[S],l,e,t,i,u)}}function R_(e,t,n,r,o){if(t)o?e.addClass(n,r):e.removeClass(n,r);else{let i=r.indexOf(\"-\")===-1?void 0:rt.DashCase;o==null?e.removeStyle(n,r,i):(typeof o==\"string\"&&o.endsWith(\"!important\")&&(o=o.slice(0,-10),i|=rt.Important),e.setStyle(n,r,o,i))}}function oy(e,t,n,r,o){let i=ze(),s=r&2;try{dn(-1),s&&t.length>Q&&Qm(e,t,Q,!1);let u=s?q.TemplateUpdateStart:q.TemplateCreateStart;Y(u,o,n),n(r,o)}finally{dn(i);let u=s?q.TemplateUpdateEnd:q.TemplateCreateEnd;Y(u,o,n)}}function Su(e,t,n){j_(e,t,n),(n.flags&64)===64&&B_(e,t,n)}function ci(e,t,n=Ue){let r=t.localNames;if(r!==null){let o=t.index+1;for(let i=0;i<r.length;i+=2){let s=r[i+1],u=s===-1?n(t,e):e[s];e[o++]=u}}}function F_(e,t,n,r){let i=r.get(Am,Mm)||n===nt.ShadowDom||n===nt.ExperimentalIsolatedShadowDom,s=e.selectRootElement(t,i);return O_(s),s}function O_(e){P_(e)}var P_=()=>null;function L_(e){return e===\"class\"?\"className\":e===\"for\"?\"htmlFor\":e===\"formaction\"?\"formAction\":e===\"innerHtml\"?\"innerHTML\":e===\"readonly\"?\"readOnly\":e===\"tabindex\"?\"tabIndex\":e}function iy(e,t,n,r,o,i){let s=t[S];if(Mu(e,s,t,n,r)){Dt(e)&&uy(t,e.index);return}e.type&3&&(n=L_(n)),sy(e,t,n,r,o,i)}function sy(e,t,n,r,o,i){if(e.type&3){let s=Ue(e,t);r=i!=null?i(r,e.value||\"\",n):r,o.setProperty(s,n,r)}else e.type&12}function uy(e,t){let n=ke(t,e);n[L]&16||(n[L]|=64)}function j_(e,t,n){let r=n.directiveStart,o=n.directiveEnd;Dt(n)&&p_(t,n,e.data[r+n.componentOffset]),e.firstCreatePass||eu(n,t);let i=n.initialInputs;for(let s=r;s<o;s++){let u=e.data[s],a=Jo(t,e,s,n);if(Hr(a,t),i!==null&&$_(t,s-r,a,u,n,i),Xe(u)){let c=ke(n.index,t);c[ee]=Jo(t,e,s,n)}}}function B_(e,t,n){let r=n.directiveStart,o=n.directiveEnd,i=n.index,s=og();try{dn(i);for(let u=r;u<o;u++){let a=e.data[u],c=t[u];Ps(u),(a.hostBindings!==null||a.hostVars!==0||a.hostAttrs!==null)&&V_(a,c)}}finally{dn(-1),Ps(s)}}function V_(e,t){e.hostBindings!==null&&e.hostBindings(1,t)}function kd(e,t){let n=e.directiveRegistry,r=null;if(n)for(let o=0;o<n.length;o++){let i=n[o];Wm(t,i.selectors,!1)&&(r??=[],Xe(i)?r.unshift(i):r.push(i))}return r}function H_(e,t,n,r,o,i){let s=Ue(e,t);ay(t[Z],s,i,e.value,n,r,o)}function ay(e,t,n,r,o,i,s){if(i==null)e.removeAttribute(t,o,n);else{let u=s==null?Ve(i):s(i,r||\"\",o);e.setAttribute(t,o,u,n)}}function $_(e,t,n,r,o,i){let s=i[t];if(s!==null)for(let u=0;u<s.length;u+=2){let a=s[u],c=s[u+1];hn(r,n,a,c)}}function Rd(e,t,n,r,o){let i=Q+n,s=t[S],u=o(s,t,e,r,n);t[i]=u,qn(e,!0);let a=e.type===2;return a?(Um(t[Z],u,e),(Q0()===0||Fr(e))&&Hr(u,t),K0()):Hr(u,t),Vs()&&(!a||!Du(e))&&Ad(s,t,u,e),e}function Fd(e){let t=e;return sl()?ul():(t=t.parent,qn(t,!1)),t}function U_(e,t){let n=e[Rt];if(!n)return;let r;try{r=n.get(Pt,null)}catch(o){r=null}r?.(t)}function Mu(e,t,n,r,o){let i=e.inputs?.[r],s=e.hostDirectiveInputs?.[r],u=!1;if(s)for(let a=0;a<s.length;a+=2){let c=s[a],l=s[a+1],d=t.data[c];hn(d,n[c],l,o),u=!0}if(i)for(let a of i){let c=n[a],l=t.data[a];hn(l,c,r,o),u=!0}return u}function z_(e,t,n,r,o,i){let s=null,u=null,a=null,c=!1,l=e.directiveToIndex.get(r.type);if(typeof l==\"number\"?s=l:[s,u,a]=l,u!==null&&a!==null&&e.hostDirectiveInputs?.hasOwnProperty(o)){let d=e.hostDirectiveInputs[o];for(let h=0;h<d.length;h+=2){let f=d[h];if(f>=u&&f<=a){let p=t.data[f],m=d[h+1];hn(p,n[f],m,i),c=!0}else if(f>a)break}}return s!==null&&r.inputs.hasOwnProperty(o)&&(hn(r,n[s],o,i),c=!0),c}function q_(e,t){let n=ke(t,e),r=n[S];G_(r,n);let o=n[Qe];o!==null&&n[jn]===null&&(n[jn]=km(o,n[Rt])),Y(q.ComponentStart);try{Od(r,n,n[ee])}finally{Y(q.ComponentEnd,n[ee])}}function G_(e,t){for(let n=t.length;n<e.blueprint.length;n++)t.push(e.blueprint[n])}function Od(e,t,n){js(t);try{let r=e.viewQuery;r!==null&&Rl(1,r,n);let o=e.template;o!==null&&oy(e,t,o,1,n),e.firstCreatePass&&(e.firstCreatePass=!1),t[vt]?.finishViewCreation(e),e.staticContentQueries&&Rm(e,t),e.staticViewQueries&&Rl(2,e.viewQuery,n);let i=e.components;i!==null&&W_(t,i)}catch(r){throw e.firstCreatePass&&(e.incompleteFirstPass=!0,e.firstCreatePass=!1),r}finally{t[L]&=-5,Bs()}}function W_(e,t){for(let n=0;n<t.length;n++)q_(e,t[n])}function li(e,t,n,r){let o=I(null);try{let i=t.tView,u=e[L]&4096?4096:16,a=wd(e,i,n,u,null,t,null,null,r?.injector??null,r?.embeddedViewInjector??null,r?.dehydratedView??null),c=e[t.index];a[an]=c;let l=e[vt];return l!==null&&(a[vt]=l.createEmbeddedView(i)),Od(i,a,n),a}finally{I(o)}}function $r(e,t){return!t||t.firstChild===null||Em(e)}function ei(e,t,n,r,o=!1){for(;n!==null;){if(n.type===128){n=o?n.projectionNext:n.next;continue}let i=t[n.index];i!==null&&r.push($e(i)),Je(i)&&cy(i,r);let s=n.type;if(s&8)ei(e,t,n.child,r);else if(s&32){let u=Id(n,t),a;for(;a=u();)r.push(a)}else if(s&16){let u=ny(t,n);if(Array.isArray(u))r.push(...u);else{let a=un(t[ve]);ei(a[S],a,u,r,!0)}}n=o?n.projectionNext:n.next}return r}function cy(e,t){for(let n=te;n<e.length;n++){let r=e[n],o=r[S].firstChild;o!==null&&ei(r[S],r,o,t)}e[ln]!==e[Qe]&&t.push(e[ln])}function ly(e){if(e[Hn]!==null){for(let t of e[Hn])t.impl.addSequence(t);e[Hn].length=0}}var dy=[];function Z_(e){return e[Ne]??Y_(e)}function Y_(e){let t=dy.pop()??Object.create(K_);return t.lView=e,t}function Q_(e){e.lView[Ne]!==e&&(e.lView=null,dy.push(e))}var K_=P(M({},Qt),{consumerIsAlwaysLive:!0,kind:\"template\",consumerMarkedDirty:e=>{zn(e.lView)},consumerOnSignalRead(){this.lView[Ne]=this}});function J_(e){let t=e[Ne]??Object.create(X_);return t.lView=e,t}var X_=P(M({},Qt),{consumerIsAlwaysLive:!0,kind:\"template\",consumerMarkedDirty:e=>{let t=un(e.lView);for(;t&&!fy(t[S]);)t=un(t);t&&Kc(t)},consumerOnSignalRead(){this.lView[Ne]=this}});function fy(e){return e.type!==2}function py(e){if(e[sn]===null)return;let t=!0;for(;t;){let n=!1;for(let r of e[sn])r.dirty&&(n=!0,r.zone===null||Zone.current===r.zone?r.run():r.zone.run(()=>r.run()));t=n&&!!(e[L]&8192)}}var ew=100;function hy(e,t=0){let r=e[Ke].rendererFactory,o=!1;o||r.begin?.();try{tw(e,t)}finally{o||r.end?.()}}function tw(e,t){let n=cl();try{ko(!0),ql(e,t);let r=0;for(;Uo(e);){if(r===ew)throw new C(103,!1);r++,ql(e,1)}}finally{ko(n)}}function nw(e,t,n,r){if(Un(t))return;let o=t[L],i=!1,s=!1;js(t);let u=!0,a=null,c=null;i||(fy(e)?(c=Z_(t),a=Tt(c)):ji()===null?(u=!1,c=J_(t),a=Tt(c)):t[Ne]&&(Xt(t[Ne]),t[Ne]=null));try{Qc(t),tg(e.bindingStartIndex),n!==null&&oy(e,t,n,2,r);let l=(o&3)===3;if(!i)if(l){let f=e.preOrderCheckHooks;f!==null&&Gs(t,f,null)}else{let f=e.preOrderHooks;f!==null&&Ws(t,f,0,null),bl(t,0)}if(s||rw(t),py(t),gy(t,0),e.contentQueries!==null&&Rm(e,t),!i)if(l){let f=e.contentCheckHooks;f!==null&&Gs(t,f)}else{let f=e.contentHooks;f!==null&&Ws(t,f,1),bl(t,1)}iw(e,t);let d=e.components;d!==null&&yy(t,d,0);let h=e.viewQuery;if(h!==null&&Rl(2,h,r),!i)if(l){let f=e.viewCheckHooks;f!==null&&Gs(t,f)}else{let f=e.viewHooks;f!==null&&Ws(t,f,2),bl(t,2)}if(e.firstUpdatePass===!0&&(e.firstUpdatePass=!1),t[Ns]){for(let f of t[Ns])f();t[Ns]=null}i||(ly(t),t[L]&=-73)}catch(l){throw i||zn(t),l}finally{c!==null&&(Jt(c,a),u&&Q_(c)),Bs()}}function gy(e,t){for(let n=_m(e);n!==null;n=wm(n))for(let r=te;r<n.length;r++){let o=n[r];my(o,t)}}function rw(e){for(let t=_m(e);t!==null;t=wm(t)){if(!(t[L]&2))continue;let n=t[$n];for(let r=0;r<n.length;r++){let o=n[r];Kc(o)}}}function ow(e,t,n){Y(q.ComponentStart);let r=ke(t,e);try{my(r,n)}finally{Y(q.ComponentEnd,r[ee])}}function my(e,t){Rs(e)&&ql(e,t)}function ql(e,t){let r=e[S],o=e[L],i=e[Ne],s=!!(t===0&&o&16);if(s||=!!(o&64&&t===0),s||=!!(o&1024),s||=!!(i?.dirty&&gr(i)),s||=!1,i&&(i.dirty=!1),e[L]&=-9217,s)nw(r,e,r.template,e[ee]);else if(o&8192){let u=I(null);try{py(e),gy(e,1);let a=r.components;a!==null&&yy(e,a,1),ly(e)}finally{I(u)}}}function yy(e,t,n){for(let r=0;r<t.length;r++)ow(e,t[r],n)}function iw(e,t){let n=e.hostBindingOpCodes;if(n!==null)try{for(let r=0;r<n.length;r++){let o=n[r];if(o<0)dn(~o);else{let i=o,s=n[++r],u=n[++r];rg(s,i);let a=t[i];Y(q.HostBindingsUpdateStart,a);try{u(2,a)}finally{Y(q.HostBindingsUpdateEnd,a)}}}}finally{dn(-1)}}function Au(e,t){let n=cl()?64:1088;for(e[Ke].changeDetectionScheduler?.notify(t);e;){e[L]|=n;let r=un(e);if(Or(e)&&!r)return e;e=r}return null}function by(e,t,n,r){return[e,!0,0,t,null,r,null,n,null,null]}function vy(e,t){let n=te+t;if(n<e.length)return e[n]}function di(e,t,n,r=!0){let o=t[S];if(sw(o,t,e,n),r){let s=zl(n,e),u=t[Z],a=u.parentNode(e[ln]);a!==null&&__(o,e[Ie],u,t,a,s)}let i=t[jn];i!==null&&i.firstChild!==null&&(i.firstChild=null)}function Dy(e,t){let n=ti(e,t);return n!==void 0&&Iu(n[S],n),n}function ti(e,t){if(e.length<=te)return;let n=te+t,r=e[n];if(r){let o=r[an];o!==null&&o!==e&&Md(o,r),t>0&&(e[n-1][He]=r[He]);let i=Lo(e,te+t);C_(r[S],r);let s=i[vt];s!==null&&s.detachView(i[S]),r[ue]=null,r[He]=null,r[L]&=-129}return r}function sw(e,t,n,r){let o=te+r,i=n.length;r>0&&(n[o-1][He]=t),r<i-te?(t[He]=n[o],jc(n,te+r,t)):(n.push(t),t[He]=null),t[ue]=n;let s=t[an];s!==null&&n!==s&&Ey(s,t);let u=t[vt];u!==null&&u.insertView(e),Fs(t),t[L]|=128}function Ey(e,t){let n=e[$n],r=t[ue];if(Ot(r))e[L]|=2;else{let o=r[ue][ve];t[ve]!==o&&(e[L]|=2)}n===null?e[$n]=[t]:n.push(t)}var gn=class{_lView;_cdRefInjectingView;_appRef=null;_attachedToViewContainer=!1;exhaustive;get rootNodes(){let t=this._lView,n=t[S];return ei(n,t,n.firstChild,[])}constructor(t,n){this._lView=t,this._cdRefInjectingView=n}get context(){return this._lView[ee]}set context(t){this._lView[ee]=t}get destroyed(){return Un(this._lView)}destroy(){if(this._appRef)this._appRef.detachView(this);else if(this._attachedToViewContainer){let t=this._lView[ue];if(Je(t)){let n=t[Vo],r=n?n.indexOf(this):-1;r>-1&&(ti(t,r),Lo(n,r))}this._attachedToViewContainer=!1}Iu(this._lView[S],this._lView)}onDestroy(t){Jc(this._lView,t)}markForCheck(){Au(this._cdRefInjectingView||this._lView,4)}detach(){this._lView[L]&=-129}reattach(){Fs(this._lView),this._lView[L]|=128}detectChanges(){this._lView[L]|=1024,hy(this._lView)}checkNoChanges(){}attachToViewContainerRef(){if(this._appRef)throw new C(902,!1);this._attachedToViewContainer=!0}detachFromAppRef(){this._appRef=null;let t=Or(this._lView),n=this._lView[an];n!==null&&!t&&Md(n,this._lView),Xm(this._lView[S],this._lView)}attachToAppRef(t){if(this._attachedToViewContainer)throw new C(902,!1);this._appRef=t;let n=Or(this._lView),r=this._lView[an];r!==null&&!n&&Ey(r,this._lView),Fs(this._lView)}};var mn=(()=>{class e{_declarationLView;_declarationTContainer;elementRef;static __NG_ELEMENT_ID__=uw;constructor(n,r,o){this._declarationLView=n,this._declarationTContainer=r,this.elementRef=o}get ssrId(){return this._declarationTContainer.tView?.ssrId||null}createEmbeddedView(n,r){return this.createEmbeddedViewImpl(n,r)}createEmbeddedViewImpl(n,r,o){let i=li(this._declarationLView,this._declarationTContainer,n,{embeddedViewInjector:r,dehydratedView:o});return new gn(i)}}return e})();function uw(){return Nu(re(),_())}function Nu(e,t){return e.type&4?new mn(t,e,Gr(e,t)):null}function rr(e,t,n,r,o){let i=e.data[t];if(i===null)i=aw(e,t,n,r,o),ng()&&(i.flags|=32);else if(i.type&64){i.type=n,i.value=r,i.attrs=o;let s=eg();i.injectorIndex=s===null?-1:s.injectorIndex}return qn(i,!0),i}function aw(e,t,n,r,o){let i=il(),s=sl(),u=s?i:i&&i.parent,a=e.data[t]=lw(e,u,n,t,r,o);return cw(e,a,i,s),a}function cw(e,t,n,r){e.firstChild===null&&(e.firstChild=t),n!==null&&(r?n.child==null&&t.parent!==null&&(n.child=t):n.next===null&&(n.next=t,t.prev=n))}function lw(e,t,n,r,o,i){let s=t?t.injectorIndex:-1,u=0;return nl()&&(u|=128),{type:n,index:r,insertBeforeIndex:null,injectorIndex:s,directiveStart:-1,directiveEnd:-1,directiveStylingLast:-1,componentOffset:-1,controlDirectiveIndex:-1,customControlIndex:-1,propertyBindings:null,flags:u,providerIndexes:0,value:o,attrs:i,mergedAttrs:null,localNames:null,initialInputs:null,inputs:null,hostDirectiveInputs:null,outputs:null,hostDirectiveOutputs:null,directiveToIndex:null,tView:null,next:null,prev:null,projectionNext:null,child:null,parent:t,projection:null,styles:null,stylesWithoutHost:null,residualStyles:void 0,classes:null,classesWithoutHost:null,residualClasses:void 0,classBindings:0,styleBindings:0}}function dw(e){let t=e[Gc]??[],r=e[ue][Z],o=[];for(let i of t)i.data[Sm]!==void 0?o.push(i):fw(i,r);e[Gc]=o}function fw(e,t){let n=0,r=e.firstChild;if(r){let o=e.data[Tm];for(;n<o;){let i=r.nextSibling;$m(t,r,!1),r=i,n++}}}var pw=()=>null,hw=()=>null;function ru(e,t){return pw(e,t)}function Cy(e,t,n){return hw(e,t,n)}var _y=class{},ku=class{},Gl=class{resolveComponentFactory(t){throw new C(917,!1)}},fi=class{static NULL=new Gl},Jn=class{},pi=(()=>{class e{destroyNode=null;static __NG_ELEMENT_ID__=()=>gw()}return e})();function gw(){let e=_(),t=re(),n=ke(t.index,e);return(Ot(n)?n:e)[Z]}var wy=(()=>{class e{static \\u0275prov=T({token:e,providedIn:\"root\",factory:()=>null})}return e})();var Ys={},Wl=class{injector;parentInjector;constructor(t,n){this.injector=t,this.parentInjector=n}get(t,n,r){let o=this.injector.get(t,Ys,r);return o!==Ys||n===Ys?o:this.parentInjector.get(t,n,r)}};function ou(e,t,n){let r=n?e.styles:null,o=n?e.classes:null,i=0;if(t!==null)for(let s=0;s<t.length;s++){let u=t[s];if(typeof u==\"number\")i=u;else if(i==1)o=Cs(o,u);else if(i==2){let a=u,c=t[++s];r=Cs(r,a+\": \"+c+\";\")}}n?e.styles=r:e.stylesWithoutHost=r,n?e.classes=o:e.classesWithoutHost=o}function oe(e,t=0){let n=_();if(n===null)return A(e,t);let r=re();return ym(r,n,se(e),t)}function mw(){let e=\"invalid\";throw new Error(e)}function xy(e,t,n,r,o){let i=r===null?null:{\"\":-1},s=o(e,n);if(s!==null){let u=s,a=null,c=null;for(let l of s)if(l.resolveHostDirectives!==null){[u,a,c]=l.resolveHostDirectives(s);break}vw(e,t,n,u,i,a,c)}i!==null&&r!==null&&yw(n,r,i)}function yw(e,t,n){let r=e.localNames=[];for(let o=0;o<t.length;o+=2){let i=n[t[o+1]];if(i==null)throw new C(-301,!1);r.push(t[o],i)}}function bw(e,t,n){t.componentOffset=n,(e.components??=[]).push(t.index)}function vw(e,t,n,r,o,i,s){let u=r.length,a=null;for(let h=0;h<u;h++){let f=r[h];a===null&&Xe(f)&&(a=f,bw(e,n,h)),Ml(eu(n,t),e,f.type)}xw(n,e.data.length,u),a?.viewProvidersResolver&&a.viewProvidersResolver(a);for(let h=0;h<u;h++){let f=r[h];f.providersResolver&&f.providersResolver(f)}let c=!1,l=!1,d=Ym(e,t,u,null);u>0&&(n.directiveToIndex=new Map);for(let h=0;h<u;h++){let f=r[h];if(n.mergedAttrs=Vr(n.mergedAttrs,f.hostAttrs),Ew(e,n,t,d,f),ww(d,f,o),s!==null&&s.has(f)){let[m,g]=s.get(f);n.directiveToIndex.set(f.type,[d,m+n.directiveStart,g+n.directiveStart])}else(i===null||!i.has(f))&&n.directiveToIndex.set(f.type,d);f.contentQueries!==null&&(n.flags|=4),(f.hostBindings!==null||f.hostAttrs!==null||f.hostVars!==0)&&(n.flags|=64);let p=f.type.prototype;!c&&(p.ngOnChanges||p.ngOnInit||p.ngDoCheck)&&((e.preOrderHooks??=[]).push(n.index),c=!0),!l&&(p.ngOnChanges||p.ngDoCheck)&&((e.preOrderCheckHooks??=[]).push(n.index),l=!0),d++}Dw(e,n,i)}function Dw(e,t,n){for(let r=t.directiveStart;r<t.directiveEnd;r++){let o=e.data[r];if(n===null||!n.has(o))jg(0,t,o,r),jg(1,t,o,r),Vg(t,r,!1);else{let i=n.get(o);Bg(0,t,i,r),Bg(1,t,i,r),Vg(t,r,!0)}}}function jg(e,t,n,r){let o=e===0?n.inputs:n.outputs;for(let i in o)if(o.hasOwnProperty(i)){let s;e===0?s=t.inputs??={}:s=t.outputs??={},s[i]??=[],s[i].push(r),Iy(t,i)}}function Bg(e,t,n,r){let o=e===0?n.inputs:n.outputs;for(let i in o)if(o.hasOwnProperty(i)){let s=o[i],u;e===0?u=t.hostDirectiveInputs??={}:u=t.hostDirectiveOutputs??={},u[s]??=[],u[s].push(r,i),Iy(t,s)}}function Iy(e,t){t===\"class\"?e.flags|=8:t===\"style\"&&(e.flags|=16)}function Vg(e,t,n){let{attrs:r,inputs:o,hostDirectiveInputs:i}=e;if(r===null||!n&&o===null||n&&i===null||Cd(e)){e.initialInputs??=[],e.initialInputs.push(null);return}let s=null,u=0;for(;u<r.length;){let a=r[u];if(a===0){u+=4;continue}else if(a===5){u+=2;continue}else if(typeof a==\"number\")break;if(!n&&o.hasOwnProperty(a)){let c=o[a];for(let l of c)if(l===t){s??=[],s.push(a,r[u+1]);break}}else if(n&&i.hasOwnProperty(a)){let c=i[a];for(let l=0;l<c.length;l+=2)if(c[l]===t){s??=[],s.push(c[l+1],r[u+1]);break}}u+=2}e.initialInputs??=[],e.initialInputs.push(s)}function Ew(e,t,n,r,o){e.data[r]=o;let i=o.factory||(o.factory=on(o.type,!0)),s=new Qn(i,Xe(o),oe,null);e.blueprint[r]=s,n[r]=s,Cw(e,t,r,Ym(e,n,o.hostVars,le),o)}function Cw(e,t,n,r,o){let i=o.hostBindings;if(i){let s=e.hostBindingOpCodes;s===null&&(s=e.hostBindingOpCodes=[]);let u=~t.index;_w(s)!=u&&s.push(u),s.push(n,r,i)}}function _w(e){let t=e.length;for(;t>0;){let n=e[--t];if(typeof n==\"number\"&&n<0)return n}return 0}function ww(e,t,n){if(n){if(t.exportAs)for(let r=0;r<t.exportAs.length;r++)n[t.exportAs[r]]=e;Xe(t)&&(n[\"\"]=e)}}function xw(e,t,n){e.flags|=1,e.directiveStart=t,e.directiveEnd=t+n,e.providerIndexes=t}function Pd(e,t,n,r,o,i,s,u){let a=t[S],c=a.consts,l=Re(c,s),d=rr(a,e,n,r,l);return i&&xy(a,t,d,Re(c,u),o),d.mergedAttrs=Vr(d.mergedAttrs,d.attrs),d.attrs!==null&&ou(d,d.attrs,!1),d.mergedAttrs!==null&&ou(d,d.mergedAttrs,!0),a.queries!==null&&a.queries.elementStart(a,d),d}function Ld(e,t){am(e,t),Wc(t)&&e.queries.elementEnd(t)}function Iw(e,t,n,r,o,i){let s=t.consts,u=Re(s,o),a=rr(t,e,n,r,u);if(a.mergedAttrs=Vr(a.mergedAttrs,a.attrs),i!=null){let c=Re(s,i);a.localNames=[];for(let l=0;l<c.length;l+=2)a.localNames.push(c[l],-1)}return a.attrs!==null&&ou(a,a.attrs,!1),a.mergedAttrs!==null&&ou(a,a.mergedAttrs,!0),t.queries!==null&&t.queries.elementStart(t,a),a}function jd(e){return Ru(e)?Array.isArray(e)||!(e instanceof Map)&&Symbol.iterator in e:!1}function Ty(e,t){if(Array.isArray(e))for(let n=0;n<e.length;n++)t(e[n]);else{let n=e[Symbol.iterator](),r;for(;!(r=n.next()).done;)t(r.value)}}function Ru(e){return e!==null&&(typeof e==\"function\"||typeof e==\"object\")}function Bd(e,t,n){return e[t]=n}function Tw(e,t){return e[t]}function Te(e,t,n){if(n===le)return!1;let r=e[t];return Object.is(r,n)?!1:(e[t]=n,!0)}function iu(e,t,n,r){let o=Te(e,t,n);return Te(e,t+1,r)||o}function Sw(e,t,n,r,o,i){let s=iu(e,t,n,r);return iu(e,t+2,o,i)||s}function Yn(e,t,n){return function r(o){let i=Dt(e)?ke(e.index,t):t;Au(i,5);let s=t[ee],u=Hg(t,s,n,o),a=r.__ngNextListenerFn__;for(;a;)u=Hg(t,s,a,o)&&u,a=a.__ngNextListenerFn__;return u}}function Hg(e,t,n,r){let o=I(null);try{return Y(q.OutputStart,t,n),n(r)!==!1}catch(i){return U_(e,i),!1}finally{Y(q.OutputEnd,t,n),I(o)}}function Vd(e,t,n,r,o,i,s,u){let a=Fr(e),c=!1,l=null;if(!r&&a&&(l=Aw(t,n,i,e.index)),l!==null){let d=l.__ngLastListenerFn__||l;d.__ngNextListenerFn__=s,l.__ngLastListenerFn__=s,c=!0}else{let d=Ue(e,n),h=r?r(d):d;EC(n,h,i,u);let f=o.listen(h,i,u);if(!Mw(i)){let p=r?m=>r($e(m[e.index])):e.index;Sy(p,t,n,i,u,f,!1)}}return c}function Mw(e){return e.startsWith(\"animation\")||e.startsWith(\"transition\")}function Aw(e,t,n,r){let o=e.cleanup;if(o!=null)for(let i=0;i<o.length-1;i+=2){let s=o[i];if(s===n&&o[i+1]===r){let u=t[kr],a=o[i+2];return u&&u.length>a?u[a]:null}typeof s==\"string\"&&(i+=2)}return null}function Sy(e,t,n,r,o,i,s){let u=t.firstCreatePass?el(t):null,a=Xc(n),c=a.length;a.push(o,i),u&&u.push(r,e,c,(c+1)*(s?-1:1))}function su(e,t,n,r,o,i){let s=t[n],u=t[S],c=u.data[n].outputs[r],d=s[c].subscribe(i);Sy(e.index,u,t,o,i,d,!0)}function Nw(){let e=_(),t=G(),n=re();if(t.firstCreatePass&&Rw(t,n),n.controlDirectiveIndex===-1)return;Ct(\"NgSignalForms\");let r=e[n.controlDirectiveIndex];t.data[n.controlDirectiveIndex].controlDef.create(r,new uu(e,t,n))}function kw(){let e=_(),t=G(),n=fn();if(n.controlDirectiveIndex===-1)return;let r=t.data[n.controlDirectiveIndex].controlDef,o=e[n.controlDirectiveIndex];r.update(o,new uu(e,t,n))}var uu=class{lView;tView;tNode;hasPassThrough;constructor(t,n,r){this.lView=t,this.tView=n,this.tNode=r,this.hasPassThrough=!!(r.flags&4096)}get customControl(){return this.tNode.customControlIndex!==-1?this.lView[this.tNode.customControlIndex]:void 0}get descriptor(){return`<${this.tNode.value}>`}listenToCustomControlOutput(t,n){My(this.tView.data[this.tNode.customControlIndex],t)&&su(this.tNode,this.lView,this.tNode.customControlIndex,t,t,Yn(this.tNode,this.lView,n))}listenToCustomControlModel(t){let n=this.tNode.flags&1024?\"valueChange\":\"checkedChange\";su(this.tNode,this.lView,this.tNode.customControlIndex,n,n,Yn(this.tNode,this.lView,t))}listenToDom(t,n){Vd(this.tNode,this.tView,this.lView,void 0,this.lView[Z],t,n,Yn(this.tNode,this.lView,n))}setInputOnDirectives(t,n){let r=this.tNode.inputs?.[t],o=this.tNode.hostDirectiveInputs?.[t];if(!r&&!o)return!1;if(r)for(let i of r){let s=this.tView.data[i],u=this.lView[i];hn(s,u,t,n)}if(o)for(let i=0;i<o.length;i+=2){let s=o[i],u=o[i+1],a=this.tView.data[s],c=this.lView[s];hn(a,c,u,n)}return!0}setCustomControlModelInput(t){let n=this.lView[this.tNode.customControlIndex],r=this.tView.data[this.tNode.customControlIndex],o=this.tNode.flags&1024?\"value\":\"checked\";hn(r,n,o,t)}customControlHasInput(t){return this.tNode.customControlIndex===-1?!1:this.tView.data[this.tNode.customControlIndex].inputs[t]!=null}};function Rw(e,t,n){for(let o=t.directiveStart;o<t.directiveEnd;o++)if(e.data[o].controlDef){t.controlDirectiveIndex=o;break}if(t.controlDirectiveIndex===-1)return;let r=e.data[t.controlDirectiveIndex].controlDef;if(r.passThroughInput&&(t.inputs?.[r.passThroughInput]?.length??0)>1){t.flags|=4096;return}Fw(e,t)}function Fw(e,t){for(let n=t.directiveStart;n<t.directiveEnd;n++){let r=e.data[n];if($g(r,\"value\")){t.flags|=1024,t.customControlIndex=n;return}if($g(r,\"checked\")){t.flags|=2048,t.customControlIndex=n;return}}}function $g(e,t){return Ow(e,t)&&My(e,t+\"Change\")}function Ow(e,t){return t in e.inputs}function My(e,t){return t in e.outputs}var ni=Symbol(\"BINDING\"),Ug={kind:\"input\",requiredVars:1};function zg(e,t,n){let r=_(),o=et();if(Te(r,o,n)){let i=r[S],s=fn(),u=ke(s.index,r);Au(u,1);let a=i.directiveRegistry[e],c=z_(s,i,r,a,t,n)}}function U(e,t){if(e===\"formField\"){let r={[ni]:Ug,create:()=>{Nw()},update:()=>{zg(r.targetIdx,e,t()),kw()}};return r}let n={[ni]:Ug,update:()=>zg(n.targetIdx,e,t())};return n}function Ay(e){return e.debugInfo?.className||e.type.name||null}var au=class extends fi{ngModule;constructor(t){super(),this.ngModule=t}resolveComponentFactory(t){let n=bt(t);return new yn(n,this.ngModule)}};function Pw(e){return Object.keys(e).map(t=>{let[n,r,o]=e[t],i={propName:n,templateName:t,isSignal:(r&_u.SignalBased)!==0};return o&&(i.transform=o),i})}function Lw(e){return Object.keys(e).map(t=>({propName:e[t],templateName:t}))}function jw(e,t,n){let r=t instanceof we?t:t?.injector;return r&&e.getStandaloneInjector!==null&&(r=e.getStandaloneInjector(r)||r),r?new Wl(n,r):n}function Bw(e){let t=e.get(Jn,null);if(t===null)throw new C(407,!1);let n=e.get(wy,null),r=e.get(gt,null),o=e.get(ot,null,{optional:!0});return{rendererFactory:t,sanitizer:n,changeDetectionScheduler:r,ngReflect:!1,tracingService:o}}function Vw(e,t){let n=Ny(e);return Vm(t,n,n===\"svg\"?Zc:n===\"math\"?z0:null)}function Ny(e){return(e.selectors[0][0]||\"div\").toLowerCase()}var yn=class extends ku{componentDef;ngModule;selector;componentType;ngContentSelectors;isBoundToModule;cachedInputs=null;cachedOutputs=null;get inputs(){return this.cachedInputs??=Pw(this.componentDef.inputs),this.cachedInputs}get outputs(){return this.cachedOutputs??=Lw(this.componentDef.outputs),this.cachedOutputs}constructor(t,n){super(),this.componentDef=t,this.ngModule=n,this.componentType=t.type,this.selector=c_(t.selectors),this.ngContentSelectors=t.ngContentSelectors??[],this.isBoundToModule=!!n}create(t,n,r,o,i,s){Y(q.DynamicComponentStart);let u=I(null);try{let a=this.componentDef,c=jw(a,o||this.ngModule,t),l=Bw(c),d=l.tracingService;return d&&d.componentCreate?d.componentCreate(Ay(a),()=>this.createComponentRef(l,c,n,r,i,s)):this.createComponentRef(l,c,n,r,i,s)}finally{I(u)}}createComponentRef(t,n,r,o,i,s){let u=this.componentDef,a=Hw(o,u,s,i),c=t.rendererFactory.createRenderer(null,u),l=o?F_(c,o,u.encapsulation,n):Vw(u,c),d=s?.some(qg)||i?.some(p=>typeof p!=\"function\"&&p.bindings.some(qg)),h=wd(null,a,null,512|Zm(u),null,null,t,c,n,null,km(l,n,!0));h[Q]=l,js(h);let f=null;try{let p=Pd(Q,h,2,\"#host\",()=>a.directiveRegistry,!0,0);Um(c,l,p),Hr(l,h),Su(a,h,p),gd(a,p,h),Ld(a,p),r!==void 0&&Uw(p,this.ngContentSelectors,r),f=ke(p.index,h),h[ee]=f[ee],Od(a,h,null)}catch(p){throw f!==null&&Nl(f),Nl(h),p}finally{Y(q.DynamicComponentEnd),Bs()}return new cu(this.componentType,h,!!d)}};function Hw(e,t,n,r){let o=e?[\"ng-version\",\"21.2.4\"]:l_(t.selectors[0]),i=null,s=null,u=0;if(n)for(let l of n)u+=l[ni].requiredVars,l.create&&(l.targetIdx=0,(i??=[]).push(l)),l.update&&(l.targetIdx=0,(s??=[]).push(l));if(r)for(let l=0;l<r.length;l++){let d=r[l];if(typeof d!=\"function\")for(let h of d.bindings){u+=h[ni].requiredVars;let f=l+1;h.create&&(h.targetIdx=f,(i??=[]).push(h)),h.update&&(h.targetIdx=f,(s??=[]).push(h))}}let a=[t];if(r)for(let l of r){let d=typeof l==\"function\"?l:l.type,h=xs(d);a.push(h)}return _d(0,null,$w(i,s),1,u,a,null,null,null,[o],null)}function $w(e,t){return!e&&!t?null:n=>{if(n&1&&e)for(let r of e)r.create();if(n&2&&t)for(let r of t)r.update()}}function qg(e){let t=e[ni].kind;return t===\"input\"||t===\"twoWay\"}var cu=class extends _y{_rootLView;_hasInputBindings;instance;hostView;changeDetectorRef;componentType;location;previousInputValues=null;_tNode;constructor(t,n,r){super(),this._rootLView=n,this._hasInputBindings=r,this._tNode=ks(n[S],Q),this.location=Gr(this._tNode,n),this.instance=ke(this._tNode.index,n)[ee],this.hostView=this.changeDetectorRef=new gn(n,void 0),this.componentType=t}setInput(t,n){this._hasInputBindings;let r=this._tNode;if(this.previousInputValues??=new Map,this.previousInputValues.has(t)&&Object.is(this.previousInputValues.get(t),n))return;let o=this._rootLView,i=Mu(r,o[S],o,t,n);this.previousInputValues.set(t,n);let s=ke(r.index,o);Au(s,1)}get injector(){return new Zn(this._tNode,this._rootLView)}destroy(){this.hostView.destroy()}onDestroy(t){this.hostView.onDestroy(t)}};function Uw(e,t,n){let r=e.projection=[];for(let o=0;o<t.length;o++){let i=n[o];r.push(i!=null&&i.length?Array.from(i):null)}}var it=(()=>{class e{static __NG_ELEMENT_ID__=zw}return e})();function zw(){let e=re();return ky(e,_())}var Zl=class e extends it{_lContainer;_hostTNode;_hostLView;constructor(t,n,r){super(),this._lContainer=t,this._hostTNode=n,this._hostLView=r}get element(){return Gr(this._hostTNode,this._hostLView)}get injector(){return new Zn(this._hostTNode,this._hostLView)}get parentInjector(){let t=dd(this._hostTNode,this._hostLView);if(dm(t)){let n=Js(t,this._hostLView),r=Ks(t),o=n[S].data[r+8];return new Zn(o,n)}else return new Zn(null,this._hostLView)}clear(){for(;this.length>0;)this.remove(this.length-1)}get(t){let n=Gg(this._lContainer);return n!==null&&n[t]||null}get length(){return this._lContainer.length-te}createEmbeddedView(t,n,r){let o,i;typeof r==\"number\"?o=r:r!=null&&(o=r.index,i=r.injector);let s=ru(this._lContainer,t.ssrId),u=t.createEmbeddedViewImpl(n||{},i,s);return this.insertImpl(u,o,$r(this._hostTNode,s)),u}createComponent(t,n,r,o,i,s,u){let a=t&&!ZE(t),c;if(a)c=n;else{let g=n||{};c=g.index,r=g.injector,o=g.projectableNodes,i=g.environmentInjector||g.ngModuleRef,s=g.directives,u=g.bindings}let l=a?t:new yn(bt(t)),d=r||this.parentInjector;if(!i&&l.ngModule==null){let y=(a?d:this.parentInjector).get(we,null);y&&(i=y)}let h=bt(l.componentType??{}),f=ru(this._lContainer,h?.id??null),p=f?.firstChild??null,m=l.create(d,o,p,i,s,u);return this.insertImpl(m.hostView,c,$r(this._hostTNode,f)),m}insert(t,n){return this.insertImpl(t,n,!0)}insertImpl(t,n,r){let o=t._lView;if(G0(o)){let u=this.indexOf(t);if(u!==-1)this.detach(u);else{let a=o[ue],c=new e(a,a[Ie],a[ue]);c.detach(c.indexOf(t))}}let i=this._adjustIndex(n),s=this._lContainer;return di(s,o,i,r),t.attachToViewContainerRef(),jc(El(s),i,t),t}move(t,n){return this.insert(t,n)}indexOf(t){let n=Gg(this._lContainer);return n!==null?n.indexOf(t):-1}remove(t){let n=this._adjustIndex(t,-1),r=ti(this._lContainer,n);r&&(Lo(El(this._lContainer),n),Iu(r[S],r))}detach(t){let n=this._adjustIndex(t,-1),r=ti(this._lContainer,n);return r&&Lo(El(this._lContainer),n)!=null?new gn(r):null}_adjustIndex(t,n=0){return t??this.length+n}};function Gg(e){return e[Vo]}function El(e){return e[Vo]||(e[Vo]=[])}function ky(e,t){let n,r=t[e.index];return Je(r)?n=r:(n=by(r,t,null,e),t[e.index]=n,xd(t,n)),Gw(n,t,e,r),new Zl(n,e,t)}function qw(e,t){let n=e[Z],r=n.createComment(\"\"),o=Ue(t,e),i=n.parentNode(o);return nu(n,i,r,n.nextSibling(o),!1),r}var Gw=Yw,Ww=()=>!1;function Zw(e,t,n){return Ww(e,t,n)}function Yw(e,t,n,r){if(e[ln])return;let o;n.type&8?o=$e(r):o=qw(t,n),e[ln]=o}var Yl=class e{queryList;matches=null;constructor(t){this.queryList=t}clone(){return new e(this.queryList)}setDirty(){this.queryList.setDirty()}},Ql=class e{queries;constructor(t=[]){this.queries=t}createEmbeddedView(t){let n=t.queries;if(n!==null){let r=t.contentQueries!==null?t.contentQueries[0]:n.length,o=[];for(let i=0;i<r;i++){let s=n.getByIndex(i),u=this.queries[s.indexInDeclarationView];o.push(u.clone())}return new e(o)}return null}insertView(t){this.dirtyQueriesWithMatches(t)}detachView(t){this.dirtyQueriesWithMatches(t)}finishViewCreation(t){this.dirtyQueriesWithMatches(t)}dirtyQueriesWithMatches(t){for(let n=0;n<this.queries.length;n++)$d(t,n).matches!==null&&this.queries[n].setDirty()}},lu=class{flags;read;predicate;constructor(t,n,r=null){this.flags=n,this.read=r,typeof t==\"string\"?this.predicate=ex(t):this.predicate=t}},Kl=class e{queries;constructor(t=[]){this.queries=t}elementStart(t,n){for(let r=0;r<this.queries.length;r++)this.queries[r].elementStart(t,n)}elementEnd(t){for(let n=0;n<this.queries.length;n++)this.queries[n].elementEnd(t)}embeddedTView(t){let n=null;for(let r=0;r<this.length;r++){let o=n!==null?n.length:0,i=this.getByIndex(r).embeddedTView(t,o);i&&(i.indexInDeclarationView=r,n!==null?n.push(i):n=[i])}return n!==null?new e(n):null}template(t,n){for(let r=0;r<this.queries.length;r++)this.queries[r].template(t,n)}getByIndex(t){return this.queries[t]}get length(){return this.queries.length}track(t){this.queries.push(t)}},Jl=class e{metadata;matches=null;indexInDeclarationView=-1;crossesNgTemplate=!1;_declarationNodeIndex;_appliesToNextNode=!0;constructor(t,n=-1){this.metadata=t,this._declarationNodeIndex=n}elementStart(t,n){this.isApplyingToNode(n)&&this.matchTNode(t,n)}elementEnd(t){this._declarationNodeIndex===t.index&&(this._appliesToNextNode=!1)}template(t,n){this.elementStart(t,n)}embeddedTView(t,n){return this.isApplyingToNode(t)?(this.crossesNgTemplate=!0,this.addMatch(-t.index,n),new e(this.metadata)):null}isApplyingToNode(t){if(this._appliesToNextNode&&(this.metadata.flags&1)!==1){let n=this._declarationNodeIndex,r=t.parent;for(;r!==null&&r.type&8&&r.index!==n;)r=r.parent;return n===(r!==null?r.index:-1)}return this._appliesToNextNode}matchTNode(t,n){let r=this.metadata.predicate;if(Array.isArray(r))for(let o=0;o<r.length;o++){let i=r[o];this.matchTNodeWithReadOption(t,n,Qw(n,i)),this.matchTNodeWithReadOption(t,n,Zs(n,t,i,!1,!1))}else r===mn?n.type&4&&this.matchTNodeWithReadOption(t,n,-1):this.matchTNodeWithReadOption(t,n,Zs(n,t,r,!1,!1))}matchTNodeWithReadOption(t,n,r){if(r!==null){let o=this.metadata.read;if(o!==null)if(o===jt||o===it||o===mn&&n.type&4)this.addMatch(n.index,-2);else{let i=Zs(n,t,o,!1,!1);i!==null&&this.addMatch(n.index,i)}else this.addMatch(n.index,r)}}addMatch(t,n){this.matches===null?this.matches=[t,n]:this.matches.push(t,n)}};function Qw(e,t){let n=e.localNames;if(n!==null){for(let r=0;r<n.length;r+=2)if(n[r]===t)return n[r+1]}return null}function Kw(e,t){return e.type&11?Gr(e,t):e.type&4?Nu(e,t):null}function Jw(e,t,n,r){return n===-1?Kw(t,e):n===-2?Xw(e,t,r):Jo(e,e[S],n,t)}function Xw(e,t,n){if(n===jt)return Gr(t,e);if(n===mn)return Nu(t,e);if(n===it)return ky(t,e)}function Ry(e,t,n,r){let o=t[vt].queries[r];if(o.matches===null){let i=e.data,s=n.matches,u=[];for(let a=0;s!==null&&a<s.length;a+=2){let c=s[a];if(c<0)u.push(null);else{let l=i[c];u.push(Jw(t,l,s[a+1],n.metadata.read))}}o.matches=u}return o.matches}function Xl(e,t,n,r){let o=e.queries.getByIndex(n),i=o.matches;if(i!==null){let s=Ry(e,t,o,n);for(let u=0;u<i.length;u+=2){let a=i[u];if(a>0)r.push(s[u/2]);else{let c=i[u+1],l=t[-a];for(let d=te;d<l.length;d++){let h=l[d];h[an]===h[ue]&&Xl(h[S],h,c,r)}if(l[$n]!==null){let d=l[$n];for(let h=0;h<d.length;h++){let f=d[h];Xl(f[S],f,c,r)}}}}}return r}function Hd(e,t){return e[vt].queries[t].queryList}function Fy(e,t,n){let r=new tu((n&4)===4);return Y0(e,t,r,r.destroy),(t[vt]??=new Ql).queries.push(new Yl(r))-1}function Oy(e,t,n){let r=G();return r.firstCreatePass&&(Ly(r,new lu(e,t,n),-1),(t&2)===2&&(r.staticViewQueries=!0)),Fy(r,_(),t)}function Py(e,t,n,r){let o=G();if(o.firstCreatePass){let i=re();Ly(o,new lu(t,n,r),i.index),tx(o,e),(n&2)===2&&(o.staticContentQueries=!0)}return Fy(o,_(),n)}function ex(e){return e.split(\",\").map(t=>t.trim())}function Ly(e,t,n){e.queries===null&&(e.queries=new Kl),e.queries.track(new Jl(t,n))}function tx(e,t){let n=e.contentQueries||(e.contentQueries=[]),r=n.length?n[n.length-1]:-1;t!==r&&n.push(e.queries.length-1,t)}function $d(e,t){return e.queries.getByIndex(t)}function jy(e,t){let n=e[S],r=$d(n,t);return r.crossesNgTemplate?Xl(n,e,t,[]):Ry(n,e,r,t)}function Ud(e,t,n){let r,o=Do(()=>{r._dirtyCounter();let i=nx(r,e);if(t&&i===void 0)throw new C(-951,!1);return i});return r=o[ne],r._dirtyCounter=pn(0),r._flatValue=void 0,o}function zd(e){return Ud(!0,!1,e)}function qd(e){return Ud(!0,!0,e)}function By(e){return Ud(!1,!1,e)}function Vy(e,t){let n=e[ne];n._lView=_(),n._queryIndex=t,n._queryList=Hd(n._lView,t),n._queryList.onDirty(()=>n._dirtyCounter.update(r=>r+1))}function nx(e,t){let n=e._lView,r=e._queryIndex;if(n===void 0||r===void 0||n[L]&4)return t?void 0:ye;let o=Hd(n,r),i=jy(n,r);return o.reset(i,Dm),t?o.first:o._changesDetected||e._flatValue===void 0?e._flatValue=o.toArray():e._flatValue}var bn=class{},Hy=class{};function Gd(e,t){return new ri(e,t??null,[])}var ri=class extends bn{ngModuleType;_parent;_bootstrapComponents=[];_r3Injector;instance;destroyCbs=[];componentFactoryResolver=new au(this);constructor(t,n,r,o=!0){super(),this.ngModuleType=t,this._parent=n;let i=Oc(t);this._bootstrapComponents=qm(i.bootstrap),this._r3Injector=pl(t,n,[{provide:bn,useValue:this},{provide:fi,useValue:this.componentFactoryResolver},...r],Oo(t),new Set([\"environment\"])),o&&this.resolveInjectorInitializers()}resolveInjectorInitializers(){this._r3Injector.resolveInjectorInitializers(),this.instance=this._r3Injector.get(this.ngModuleType)}get injector(){return this._r3Injector}destroy(){let t=this._r3Injector;!t.destroyed&&t.destroy(),this.destroyCbs.forEach(n=>n()),this.destroyCbs=null}onDestroy(t){this.destroyCbs.push(t)}},du=class extends Hy{moduleType;constructor(t){super(),this.moduleType=t}create(t){return new ri(this.moduleType,t,[])}};var oi=class extends bn{injector;componentFactoryResolver=new au(this);instance=null;constructor(t){super();let n=new On([...t.providers,{provide:bn,useValue:this},{provide:fi,useValue:this.componentFactoryResolver}],t.parent||Ar(),t.debugName,new Set([\"environment\"]));this.injector=n,t.runEnvironmentInitializers&&n.resolveInjectorInitializers()}destroy(){this.injector.destroy()}onDestroy(t){this.injector.onDestroy(t)}};function $y(e,t,n=null){return new oi({providers:e,parent:t,debugName:n,runEnvironmentInitializers:!0}).injector}var rx=(()=>{class e{_injector;cachedInjectors=new Map;constructor(n){this._injector=n}getOrCreateStandaloneInjector(n){if(!n.standalone)return null;if(!this.cachedInjectors.has(n)){let r=Hc(!1,n.type),o=r.length>0?$y([r],this._injector,\"\"):null;this.cachedInjectors.set(n,o)}return this.cachedInjectors.get(n)}ngOnDestroy(){try{for(let n of this.cachedInjectors.values())n!==null&&n.destroy()}finally{this.cachedInjectors.clear()}}static \\u0275prov=T({token:e,providedIn:\"environment\",factory:()=>new e(A(we))})}return e})();function Zr(e){return si(()=>{let t=Uy(e),n=P(M({},t),{decls:e.decls,vars:e.vars,template:e.template,consts:e.consts||null,ngContentSelectors:e.ngContentSelectors,onPush:e.changeDetection===pd.OnPush,directiveDefs:null,pipeDefs:null,dependencies:t.standalone&&e.dependencies||null,getStandaloneInjector:t.standalone?o=>o.get(rx).getOrCreateStandaloneInjector(n):null,getExternalStyles:null,signals:e.signals??!1,data:e.data||{},encapsulation:e.encapsulation||nt.Emulated,styles:e.styles||ye,_:null,schemas:e.schemas||null,tView:null,id:\"\"});t.standalone&&Ct(\"NgStandalone\"),zy(n);let r=e.dependencies;return n.directiveDefs=Wg(r,ox),n.pipeDefs=Wg(r,N0),n.id=ux(n),n})}function ox(e){return bt(e)||xs(e)}function Ht(e){return si(()=>({type:e.type,bootstrap:e.bootstrap||ye,declarations:e.declarations||ye,imports:e.imports||ye,exports:e.exports||ye,transitiveCompileScopes:null,schemas:e.schemas||null,id:e.id||null}))}function ix(e,t){if(e==null)return Ye;let n={};for(let r in e)if(e.hasOwnProperty(r)){let o=e[r],i,s,u,a;Array.isArray(o)?(u=o[0],i=o[1],s=o[2]??i,a=o[3]||null):(i=o,s=o,u=_u.None,a=null),n[i]=[r,u,a],t[i]=s}return n}function sx(e){if(e==null)return Ye;let t={};for(let n in e)e.hasOwnProperty(n)&&(t[e[n]]=n);return t}function st(e){return si(()=>{let t=Uy(e);return zy(t),t})}function Fu(e){return{type:e.type,name:e.name,factory:null,pure:e.pure!==!1,standalone:e.standalone??!0,onDestroy:e.type.prototype.ngOnDestroy||null}}function Uy(e){let t={};return{type:e.type,providersResolver:null,viewProvidersResolver:null,factory:null,hostBindings:e.hostBindings||null,hostVars:e.hostVars||0,hostAttrs:e.hostAttrs||null,contentQueries:e.contentQueries||null,declaredInputs:t,inputConfig:e.inputs||Ye,exportAs:e.exportAs||null,standalone:e.standalone??!0,signals:e.signals===!0,selectors:e.selectors||ye,viewQuery:e.viewQuery||null,features:e.features||null,setInput:null,resolveHostDirectives:null,hostDirectives:null,controlDef:null,inputs:ix(e.inputs,t),outputs:sx(e.outputs),debugInfo:null}}function zy(e){e.features?.forEach(t=>t(e))}function Wg(e,t){return e?()=>{let n=typeof e==\"function\"?e():e,r=[];for(let o of n){let i=t(o);i!==null&&r.push(i)}return r}:null}function ux(e){let t=0,n=typeof e.consts==\"function\"?\"\":e.consts,r=[e.selectors,e.ngContentSelectors,e.hostVars,e.hostAttrs,n,e.vars,e.decls,e.encapsulation,e.standalone,e.signals,e.exportAs,JSON.stringify(e.inputs),JSON.stringify(e.outputs),Object.getOwnPropertyNames(e.type.prototype),!!e.contentQueries,!!e.viewQuery];for(let i of r.join(\"|\"))t=Math.imul(31,t)+i.charCodeAt(0)<<0;return t+=2147483648,\"c\"+t}function ax(e){let t=n=>{let r=Array.isArray(e);n.hostDirectives===null?(n.resolveHostDirectives=cx,n.hostDirectives=r?e.map(ed):[e]):r?n.hostDirectives.unshift(...e.map(ed)):n.hostDirectives.unshift(e)};return t.ngInherit=!0,t}function cx(e){let t=[],n=!1,r=null,o=null;for(let i=0;i<e.length;i++){let s=e[i];if(s.hostDirectives!==null){let u=t.length;r??=new Map,o??=new Map,qy(s,t,r),o.set(s,[u,t.length-1])}i===0&&Xe(s)&&(n=!0,t.push(s))}for(let i=n?1:0;i<e.length;i++)t.push(e[i]);return[t,r,o]}function qy(e,t,n){if(e.hostDirectives!==null)for(let r of e.hostDirectives)if(typeof r==\"function\"){let o=r();for(let i of o)Zg(ed(i),t,n)}else Zg(r,t,n)}function Zg(e,t,n){let r=xs(e.directive);lx(r.declaredInputs,e.inputs),qy(r,t,n),n.set(r,e),t.push(r)}function ed(e){return typeof e==\"function\"?{directive:se(e),inputs:Ye,outputs:Ye}:{directive:se(e.directive),inputs:Yg(e.inputs),outputs:Yg(e.outputs)}}function Yg(e){if(e===void 0||e.length===0)return Ye;let t={};for(let n=0;n<e.length;n+=2)t[e[n]]=e[n+1];return t}function lx(e,t){for(let n in t)if(t.hasOwnProperty(n)){let r=t[n],o=e[n];e[r]=o}}function dx(e){return Object.getPrototypeOf(e.prototype).constructor}function Yr(e){let t=dx(e.type),n=!0,r=[e];for(;t;){let o;if(Xe(e))o=t.\\u0275cmp||t.\\u0275dir;else{if(t.\\u0275cmp)throw new C(903,!1);o=t.\\u0275dir}if(o){if(n){r.push(o);let s=e;s.inputs=Cl(e.inputs),s.declaredInputs=Cl(e.declaredInputs),s.outputs=Cl(e.outputs);let u=o.hostBindings;u&&mx(e,u);let a=o.viewQuery,c=o.contentQueries;if(a&&hx(e,a),c&&gx(e,c),fx(e,o),A0(e.outputs,o.outputs),Xe(o)&&o.data.animation){let l=e.data;l.animation=(l.animation||[]).concat(o.data.animation)}}let i=o.features;if(i)for(let s=0;s<i.length;s++){let u=i[s];u&&u.ngInherit&&u(e),u===Yr&&(n=!1)}}t=Object.getPrototypeOf(t)}px(r)}function fx(e,t){for(let n in t.inputs){if(!t.inputs.hasOwnProperty(n)||e.inputs.hasOwnProperty(n))continue;let r=t.inputs[n];r!==void 0&&(e.inputs[n]=r,e.declaredInputs[n]=t.declaredInputs[n])}}function px(e){let t=0,n=null;for(let r=e.length-1;r>=0;r--){let o=e[r];o.hostVars=t+=o.hostVars,o.hostAttrs=Vr(o.hostAttrs,n=Vr(n,o.hostAttrs))}}function Cl(e){return e===Ye?{}:e===ye?[]:e}function hx(e,t){let n=e.viewQuery;n?e.viewQuery=(r,o)=>{t(r,o),n(r,o)}:e.viewQuery=t}function gx(e,t){let n=e.contentQueries;n?e.contentQueries=(r,o,i)=>{t(r,o,i),n(r,o,i)}:e.contentQueries=t}function mx(e,t){let n=e.hostBindings;n?e.hostBindings=(r,o)=>{t(r,o),n(r,o)}:e.hostBindings=t}function Gy(e,t,n,r,o,i,s,u){if(n.firstCreatePass){e.mergedAttrs=Vr(e.mergedAttrs,e.attrs);let l=e.tView=_d(2,e,o,i,s,n.directiveRegistry,n.pipeRegistry,null,n.schemas,n.consts,null);n.queries!==null&&(n.queries.template(n,e),l.queries=n.queries.embeddedTView(e))}u&&(e.flags|=u),qn(e,!1);let a=bx(n,t,e,r);Vs()&&Ad(n,t,a,e),Hr(a,t);let c=by(a,t,a,e);t[r+Q]=c,xd(t,c),Zw(c,e,t)}function yx(e,t,n,r,o,i,s,u,a,c,l){let d=n+Q,h;return t.firstCreatePass?(h=rr(t,d,4,s||null,u||null),Os()&&xy(t,e,h,Re(t.consts,c),kd),am(t,h)):h=t.data[d],Gy(h,e,t,n,r,o,i,a),Fr(h)&&Su(t,e,h),c!=null&&ci(e,h,l),h}function Ur(e,t,n,r,o,i,s,u,a,c,l){let d=n+Q,h;if(t.firstCreatePass){if(h=rr(t,d,4,s||null,u||null),c!=null){let f=Re(t.consts,c);h.localNames=[];for(let p=0;p<f.length;p+=2)h.localNames.push(f[p],-1)}}else h=t.data[d];return Gy(h,e,t,n,r,o,i,a),c!=null&&ci(e,h,l),h}function Wy(e,t,n,r,o,i,s,u){let a=_(),c=G(),l=Re(c.consts,i);return yx(a,c,e,t,n,r,o,l,void 0,s,u),Wy}function Zy(e,t,n,r,o,i,s,u){let a=_(),c=G(),l=Re(c.consts,i);return Ur(a,c,e,t,n,r,o,l,void 0,s,u),Zy}var bx=vx;function vx(e,t,n,r){return Go(!0),t[Z].createComment(\"\")}var Yy=(()=>{class e{log(n){console.log(n)}warn(n){console.warn(n)}static \\u0275fac=function(r){return new(r||e)};static \\u0275prov=T({token:e,factory:e.\\u0275fac,providedIn:\"platform\"})}return e})();function Wd(e){return typeof e==\"function\"&&e[ne]!==void 0}function Zd(e){return Wd(e)&&typeof e.set==\"function\"}var Ou=new x(\"\"),Pu=new x(\"\"),hi=(()=>{class e{_ngZone;registry;_isZoneStable=!0;_callbacks=[];_taskTrackingZone=null;_destroyRef;constructor(n,r,o){this._ngZone=n,this.registry=r,As()&&(this._destroyRef=b(Fe,{optional:!0})??void 0),Yd||(Ky(o),o.addToWindow(r)),this._watchAngularEvents(),n.run(()=>{this._taskTrackingZone=typeof Zone>\"u\"?null:Zone.current.get(\"TaskTrackingZone\")})}_watchAngularEvents(){let n=this._ngZone.onUnstable.subscribe({next:()=>{this._isZoneStable=!1}}),r=this._ngZone.runOutsideAngular(()=>this._ngZone.onStable.subscribe({next:()=>{be.assertNotInAngularZone(),queueMicrotask(()=>{this._isZoneStable=!0,this._runCallbacksIfReady()})}}));this._destroyRef?.onDestroy(()=>{n.unsubscribe(),r.unsubscribe()})}isStable(){return this._isZoneStable&&!this._ngZone.hasPendingMacrotasks}_runCallbacksIfReady(){if(this.isStable())queueMicrotask(()=>{for(;this._callbacks.length!==0;){let n=this._callbacks.pop();clearTimeout(n.timeoutId),n.doneCb()}});else{let n=this.getPendingTasks();this._callbacks=this._callbacks.filter(r=>r.updateCb&&r.updateCb(n)?(clearTimeout(r.timeoutId),!1):!0)}}getPendingTasks(){return this._taskTrackingZone?this._taskTrackingZone.macroTasks.map(n=>({source:n.source,creationLocation:n.creationLocation,data:n.data})):[]}addCallback(n,r,o){let i=-1;r&&r>0&&(i=setTimeout(()=>{this._callbacks=this._callbacks.filter(s=>s.timeoutId!==i),n()},r)),this._callbacks.push({doneCb:n,timeoutId:i,updateCb:o})}whenStable(n,r,o){if(o&&!this._taskTrackingZone)throw new Error('Task tracking zone is required when passing an update callback to whenStable(). Is \"zone.js/plugins/task-tracking\" loaded?');this.addCallback(n,r,o),this._runCallbacksIfReady()}registerApplication(n){this.registry.registerApplication(n,this)}unregisterApplication(n){this.registry.unregisterApplication(n)}findProviders(n,r,o){return[]}static \\u0275fac=function(r){return new(r||e)(A(be),A(Qy),A(Pu))};static \\u0275prov=T({token:e,factory:e.\\u0275fac})}return e})(),Qy=(()=>{class e{_applications=new Map;registerApplication(n,r){this._applications.set(n,r)}unregisterApplication(n){this._applications.delete(n)}unregisterAllApplications(){this._applications.clear()}getTestability(n){return this._applications.get(n)||null}getAllTestabilities(){return Array.from(this._applications.values())}getAllRootElements(){return Array.from(this._applications.keys())}findTestabilityInTree(n,r=!0){return Yd?.findTestabilityInTree(this,n,r)??null}static \\u0275fac=function(r){return new(r||e)};static \\u0275prov=T({token:e,factory:e.\\u0275fac,providedIn:\"platform\"})}return e})();function Ky(e){Yd=e}var Yd;function gi(e){return!!e&&typeof e.then==\"function\"}function Lu(e){return!!e&&typeof e.subscribe==\"function\"}var Qd=new x(\"\");function Dx(e){return Ln([{provide:Qd,multi:!0,useValue:e}])}var Kd=(()=>{class e{resolve;reject;initialized=!1;done=!1;donePromise=new Promise((n,r)=>{this.resolve=n,this.reject=r});appInits=b(Qd,{optional:!0})??[];injector=b(fe);constructor(){}runInitializers(){if(this.initialized)return;let n=[];for(let o of this.appInits){let i=Nr(this.injector,o);if(gi(i))n.push(i);else if(Lu(i)){let s=new Promise((u,a)=>{i.subscribe({complete:u,error:a})});n.push(s)}}let r=()=>{this.done=!0,this.resolve()};Promise.all(n).then(()=>{r()}).catch(o=>{this.reject(o)}),n.length===0&&r(),this.initialized=!0}static \\u0275fac=function(r){return new(r||e)};static \\u0275prov=T({token:e,factory:e.\\u0275fac,providedIn:\"root\"})}return e})(),Jy=new x(\"\");function Xy(){qa(()=>{let e=\"\";throw new C(600,e)})}function eb(e){return e.isBoundToModule}var Ex=10;var Qr=(()=>{class e{_runningTick=!1;_destroyed=!1;_destroyListeners=[];_views=[];internalErrorHandler=b(Pt);afterRenderManager=b(xu);zonelessEnabled=b(Zo);rootEffectScheduler=b(Hs);dirtyFlags=0;tracingSnapshot=null;allTestViews=new Set;autoDetectTestViews=new Set;includeAllTestViews=!1;afterTick=new ce;get allViews(){return[...(this.includeAllTestViews?this.allTestViews:this.autoDetectTestViews).keys(),...this._views]}get destroyed(){return this._destroyed}componentTypes=[];components=[];internalPendingTask=b(Gn);get isStable(){return this.internalPendingTask.hasPendingTasksObservable.pipe(Ce(n=>!n))}constructor(){b(ot,{optional:!0})}whenStable(){let n;return new Promise(r=>{n=this.isStable.subscribe({next:o=>{o&&r()}})}).finally(()=>{n.unsubscribe()})}_injector=b(we);_rendererFactory=null;get injector(){return this._injector}bootstrap(n,r){return this.bootstrapImpl(n,r)}bootstrapImpl(n,r,o=fe.NULL){return this._injector.get(be).run(()=>{Y(q.BootstrapComponentStart);let s=n instanceof ku;if(!this._injector.get(Kd).done){let p=\"\";throw new C(405,p)}let a;s?a=n:a=this._injector.get(fi).resolveComponentFactory(n),this.componentTypes.push(a.componentType);let c=eb(a)?void 0:this._injector.get(bn),l=r||a.selector,d=a.create(o,[],l,c),h=d.location.nativeElement,f=d.injector.get(Ou,null);return f?.registerApplication(h),d.onDestroy(()=>{this.detachView(d.hostView),Ko(this.components,d),f?.unregisterApplication(h)}),this._loadComponent(d),Y(q.BootstrapComponentEnd,d),d})}tick(){this.zonelessEnabled||(this.dirtyFlags|=1),this._tick()}_tick(){Y(q.ChangeDetectionStart),this.tracingSnapshot!==null?this.tracingSnapshot.run(wu.CHANGE_DETECTION,this.tickImpl):this.tickImpl()}tickImpl=()=>{if(this._runningTick)throw Y(q.ChangeDetectionEnd),new C(101,!1);let n=I(null);try{this._runningTick=!0,this.synchronize()}finally{this._runningTick=!1,this.tracingSnapshot?.dispose(),this.tracingSnapshot=null,I(n),this.afterTick.next(),Y(q.ChangeDetectionEnd)}};synchronize(){this._rendererFactory===null&&!this._injector.destroyed&&(this._rendererFactory=this._injector.get(Jn,null,{optional:!0}));let n=0;for(;this.dirtyFlags!==0&&n++<Ex;){Y(q.ChangeDetectionSyncStart);try{this.synchronizeOnce()}finally{Y(q.ChangeDetectionSyncEnd)}}}synchronizeOnce(){this.dirtyFlags&16&&(this.dirtyFlags&=-17,this.rootEffectScheduler.flush());let n=!1;if(this.dirtyFlags&7){let r=!!(this.dirtyFlags&1);this.dirtyFlags&=-8,this.dirtyFlags|=8;for(let{_lView:o}of this.allViews){if(!r&&!Uo(o))continue;let i=r&&!this.zonelessEnabled?0:1;hy(o,i),n=!0}if(this.dirtyFlags&=-5,this.syncDirtyFlagsWithViews(),this.dirtyFlags&23)return}n||(this._rendererFactory?.begin?.(),this._rendererFactory?.end?.()),this.dirtyFlags&8&&(this.dirtyFlags&=-9,this.afterRenderManager.execute()),this.syncDirtyFlagsWithViews()}syncDirtyFlagsWithViews(){if(this.allViews.some(({_lView:n})=>Uo(n))){this.dirtyFlags|=2;return}else this.dirtyFlags&=-8}attachView(n){let r=n;this._views.push(r),r.attachToAppRef(this)}detachView(n){let r=n;Ko(this._views,r),r.detachFromAppRef()}_loadComponent(n){this.attachView(n.hostView);try{this.tick()}catch(o){this.internalErrorHandler(o)}this.components.push(n),this._injector.get(Jy,[]).forEach(o=>o(n))}ngOnDestroy(){if(!this._destroyed)try{this._destroyListeners.forEach(n=>n()),this._views.slice().forEach(n=>n.destroy())}finally{this._destroyed=!0,this._views=[],this._destroyListeners=[]}}onDestroy(n){return this._destroyListeners.push(n),()=>Ko(this._destroyListeners,n)}destroy(){if(this._destroyed)throw new C(406,!1);let n=this._injector;n.destroy&&!n.destroyed&&n.destroy()}get viewCount(){return this._views.length}static \\u0275fac=function(r){return new(r||e)};static \\u0275prov=T({token:e,factory:e.\\u0275fac,providedIn:\"root\"})}return e})();function Ko(e,t){let n=e.indexOf(t);n>-1&&e.splice(n,1)}function tb(e,t){let n=_(),r=et();if(Te(n,r,t)){let o=G(),i=fn();if(Mu(i,o,n,e,t))Dt(i)&&uy(n,i.index);else{let u=Ue(i,n);ay(n[Z],u,null,i.value,e,t,null)}}return tb}function ju(e,t,n,r){let o=_(),i=et();if(Te(o,i,t)){let s=G(),u=fn();H_(u,o,e,t,n,r)}return ju}function Cx(){return _()[ve][ee]}var td=class{destroy(t){}updateValue(t,n){}swap(t,n){let r=Math.min(t,n),o=Math.max(t,n),i=this.detach(o);if(o-r>1){let s=this.detach(r);this.attach(r,i),this.attach(o,s)}else this.attach(r,i)}move(t,n){this.attach(n,this.detach(t))}};function _l(e,t,n,r,o){return e===n&&Object.is(t,r)?1:Object.is(o(e,t),o(n,r))?-1:0}function _x(e,t,n,r){let o,i,s=0,u=e.length-1,a=void 0;if(Array.isArray(t)){I(r);let c=t.length-1;for(I(null);s<=u&&s<=c;){let l=e.at(s),d=t[s],h=_l(s,l,s,d,n);if(h!==0){h<0&&e.updateValue(s,d),s++;continue}let f=e.at(u),p=t[c],m=_l(u,f,c,p,n);if(m!==0){m<0&&e.updateValue(u,p),u--,c--;continue}let g=n(s,l),y=n(u,f),v=n(s,d);if(Object.is(v,y)){let w=n(c,p);Object.is(w,g)?(e.swap(s,u),e.updateValue(u,p),c--,u--):e.move(u,s),e.updateValue(s,d),s++;continue}if(o??=new fu,i??=Kg(e,s,u,n),nd(e,o,s,v))e.updateValue(s,d),s++,u++;else if(i.has(v))o.set(g,e.detach(s)),u--;else{let w=e.create(s,t[s]);e.attach(s,w),s++,u++}}for(;s<=c;)Qg(e,o,n,s,t[s]),s++}else if(t!=null){I(r);let c=t[Symbol.iterator]();I(null);let l=c.next();for(;!l.done&&s<=u;){let d=e.at(s),h=l.value,f=_l(s,d,s,h,n);if(f!==0)f<0&&e.updateValue(s,h),s++,l=c.next();else{o??=new fu,i??=Kg(e,s,u,n);let p=n(s,h);if(nd(e,o,s,p))e.updateValue(s,h),s++,u++,l=c.next();else if(!i.has(p))e.attach(s,e.create(s,h)),s++,u++,l=c.next();else{let m=n(s,d);o.set(m,e.detach(s)),u--}}}for(;!l.done;)Qg(e,o,n,e.length,l.value),l=c.next()}for(;s<=u;)e.destroy(e.detach(u--));o?.forEach(c=>{e.destroy(c)})}function nd(e,t,n,r){return t!==void 0&&t.has(r)?(e.attach(n,t.get(r)),t.delete(r),!0):!1}function Qg(e,t,n,r,o){if(nd(e,t,r,n(r,o)))e.updateValue(r,o);else{let i=e.create(r,o);e.attach(r,i)}}function Kg(e,t,n,r){let o=new Set;for(let i=t;i<=n;i++)o.add(r(i,e.at(i)));return o}var fu=class{kvMap=new Map;_vMap=void 0;has(t){return this.kvMap.has(t)}delete(t){if(!this.has(t))return!1;let n=this.kvMap.get(t);return this._vMap!==void 0&&this._vMap.has(n)?(this.kvMap.set(t,this._vMap.get(n)),this._vMap.delete(n)):this.kvMap.delete(t),!0}get(t){return this.kvMap.get(t)}set(t,n){if(this.kvMap.has(t)){let r=this.kvMap.get(t);this._vMap===void 0&&(this._vMap=new Map);let o=this._vMap;for(;o.has(r);)r=o.get(r);o.set(r,n)}else this.kvMap.set(t,n)}forEach(t){for(let[n,r]of this.kvMap)if(t(r,n),this._vMap!==void 0){let o=this._vMap;for(;o.has(r);)r=o.get(r),t(r,n)}}};function Jd(e,t,n,r,o,i,s,u){Ct(\"NgControlFlow\");let a=_(),c=G(),l=Re(c.consts,i);return Ur(a,c,e,t,n,r,o,l,256,s,u),Xd}function Xd(e,t,n,r,o,i,s,u){Ct(\"NgControlFlow\");let a=_(),c=G(),l=Re(c.consts,i);return Ur(a,c,e,t,n,r,o,l,512,s,u),Xd}function ef(e,t){Ct(\"NgControlFlow\");let n=_(),r=et(),o=n[r]!==le?n[r]:-1,i=o!==-1?pu(n,Q+o):void 0,s=0;if(Te(n,r,e)){let u=I(null);try{if(i!==void 0&&Dy(i,s),e!==-1){let a=Q+e,c=pu(n,a),l=sd(n[S],a),d=Cy(c,l,n),h=li(n,l,t,{dehydratedView:d});di(c,h,s,$r(l,d))}}finally{I(u)}}else if(i!==void 0){let u=vy(i,s);u!==void 0&&(u[ee]=t)}}var rd=class{lContainer;$implicit;$index;constructor(t,n,r){this.lContainer=t,this.$implicit=n,this.$index=r}get $count(){return this.lContainer.length-te}};function wx(e){return e}function Bu(e,t){return t}var od=class{hasEmptyBlock;trackByFn;liveCollection;constructor(t,n,r){this.hasEmptyBlock=t,this.trackByFn=n,this.liveCollection=r}};function Vu(e,t,n,r,o,i,s,u,a,c,l,d,h){Ct(\"NgControlFlow\");let f=_(),p=G(),m=a!==void 0,g=_(),y=u?s.bind(g[ve][ee]):s,v=new od(m,y);g[Q+e]=v,Ur(f,p,e+1,t,n,r,o,Re(p.consts,i),256),m&&Ur(f,p,e+2,a,c,l,d,Re(p.consts,h),512)}var id=class extends td{lContainer;hostLView;templateTNode;operationsCounter=void 0;needsIndexUpdate=!1;constructor(t,n,r){super(),this.lContainer=t,this.hostLView=n,this.templateTNode=r}get length(){return this.lContainer.length-te}at(t){return this.getLView(t)[ee].$implicit}attach(t,n){let r=n[jn];this.needsIndexUpdate||=t!==this.length,di(this.lContainer,n,t,$r(this.templateTNode,r)),xx(this.lContainer,t)}detach(t){return this.needsIndexUpdate||=t!==this.length-1,Ix(this.lContainer,t),Tx(this.lContainer,t)}create(t,n){let r=ru(this.lContainer,this.templateTNode.tView.ssrId);return li(this.hostLView,this.templateTNode,new rd(this.lContainer,n,t),{dehydratedView:r})}destroy(t){Iu(t[S],t)}updateValue(t,n){this.getLView(t)[ee].$implicit=n}reset(){this.needsIndexUpdate=!1}updateIndexes(){if(this.needsIndexUpdate)for(let t=0;t<this.length;t++)this.getLView(t)[ee].$index=t}getLView(t){return Sx(this.lContainer,t)}};function Hu(e){let t=I(null),n=ze();try{let r=_(),o=r[S],i=r[n],s=n+1,u=pu(r,s);if(i.liveCollection===void 0){let c=sd(o,s);i.liveCollection=new id(u,r,c)}else i.liveCollection.reset();let a=i.liveCollection;if(_x(a,e,i.trackByFn,t),a.updateIndexes(),i.hasEmptyBlock){let c=et(),l=a.length===0;if(Te(r,c,l)){let d=n+2,h=pu(r,d);if(l){let f=sd(o,d),p=Cy(h,f,r),m=li(r,f,void 0,{dehydratedView:p});di(h,m,0,$r(f,p))}else o.firstUpdatePass&&dw(h),Dy(h,0)}}}finally{I(t)}}function pu(e,t){return e[t]}function xx(e,t){if(e.length<=te)return;let n=te+t,r=e[n],o=r?r[cn]:void 0;if(r&&o&&o.detachedLeaveAnimationFns&&o.detachedLeaveAnimationFns.length>0){let i=r[Rt];D_(i,o),Kn.delete(r[Ft]),o.detachedLeaveAnimationFns=void 0}}function Ix(e,t){if(e.length<=te)return;let n=te+t,r=e[n],o=r?r[cn]:void 0;o&&o.leave&&o.leave.size>0&&(o.detachedLeaveAnimationFns=[])}function Tx(e,t){return ti(e,t)}function Sx(e,t){return vy(e,t)}function sd(e,t){return ks(e,t)}function Kr(e,t,n){let r=_(),o=et();if(Te(r,o,t)){let i=G(),s=fn();iy(s,r,e,t,r[Z],n)}return Kr}function ud(e,t,n,r,o){Mu(t,e,n,o?\"class\":\"style\",r)}function Xn(e,t,n,r){let o=_(),i=o[S],s=e+Q,u=i.firstCreatePass?Pd(s,o,2,t,kd,Os(),n,r):i.data[s];if(Dt(u)){let a=o[Ke].tracingService;if(a&&a.componentCreate){let c=i.data[u.directiveStart+u.componentOffset];return a.componentCreate(Ay(c),()=>(Jg(e,t,o,u,r),Xn))}}return Jg(e,t,o,u,r),Xn}function Jg(e,t,n,r,o){if(Rd(r,n,e,t,rb),Fr(r)){let i=n[S];Su(i,n,r),gd(i,r,n)}o!=null&&ci(n,r)}function Jr(){let e=G(),t=re(),n=Fd(t);return e.firstCreatePass&&Ld(e,n),rl(n)&&ol(),tl(),n.classesWithoutHost!=null&&eC(n)&&ud(e,n,_(),n.classesWithoutHost,!0),n.stylesWithoutHost!=null&&tC(n)&&ud(e,n,_(),n.stylesWithoutHost,!1),Jr}function nb(e,t,n,r){return Xn(e,t,n,r),Jr(),nb}function tf(e,t,n,r){let o=_(),i=o[S],s=e+Q,u=i.firstCreatePass?Iw(s,i,2,t,n,r):i.data[s];return Rd(u,o,e,t,rb),r!=null&&ci(o,u),tf}function nf(){let e=re(),t=Fd(e);return rl(t)&&ol(),tl(),nf}function $u(e,t,n,r){return tf(e,t,n,r),nf(),$u}var rb=(e,t,n,r,o)=>(Go(!0),Vm(t[Z],r,fg()));function rf(e,t,n){let r=_(),o=r[S],i=e+Q,s=o.firstCreatePass?Pd(i,r,8,\"ng-container\",kd,Os(),t,n):o.data[i];if(Rd(s,r,e,\"ng-container\",Mx),Fr(s)){let u=r[S];Su(u,r,s),gd(u,s,r)}return n!=null&&ci(r,s),rf}function of(){let e=G(),t=re(),n=Fd(t);return e.firstCreatePass&&Ld(e,n),of}function Xr(e,t,n){return rf(e,t,n),of(),Xr}var Mx=(e,t,n,r,o)=>(Go(!0),WC(t[Z],\"\"));function Ax(){return _()}function Uu(e,t,n){let r=_(),o=et();if(Te(r,o,t)){let i=G(),s=fn();sy(s,r,e,t,r[Z],n)}return Uu}var mi=\"en-US\";var Nx=mi;function ob(e){typeof e==\"string\"&&(Nx=e.toLowerCase().replace(/_/g,\"-\"))}function ib(e,t,n){let r=_(),o=G(),i=re();return ub(o,r,r[Z],i,e,t,n),ib}function sb(e,t,n){let r=_(),o=G(),i=re();return(i.type&3||n)&&Vd(i,o,r,n,r[Z],e,t,Yn(i,r,t)),sb}function ub(e,t,n,r,o,i,s){let u=!0,a=null;if((r.type&3||s)&&(a??=Yn(r,t,i),Vd(r,e,t,s,n,o,i,a)&&(u=!1)),u){let c=r.outputs?.[o],l=r.hostDirectiveOutputs?.[o];if(l&&l.length)for(let d=0;d<l.length;d+=2){let h=l[d],f=l[d+1];a??=Yn(r,t,i),su(r,t,h,f,o,a)}if(c&&c.length)for(let d of c)a??=Yn(r,t,i),su(r,t,d,o,o,a)}}function yi(e=1){return cg(e)}function kx(e,t){let n=null,r=o_(e);for(let o=0;o<t.length;o++){let i=t[o];if(i===\"*\"){n=o;continue}if(r===null?Wm(e,i,!0):u_(r,i))return o}return n}function Rx(e){let t=_()[ve][Ie];if(!t.projection){let n=e?e.length:1,r=t.projection=L0(n,null),o=r.slice(),i=t.child;for(;i!==null;){if(i.type!==128){let s=e?kx(i,e):0;s!==null&&(o[s]?o[s].projectionNext=i:r[s]=i,o[s]=i)}i=i.next}}}function Fx(e,t=0,n,r,o,i){let s=_(),u=G(),a=r?e+1:null;a!==null&&Ur(s,u,a,r,o,i,null,n);let c=rr(u,Q+e,16,null,n||null);c.projection===null&&(c.projection=t),ul();let d=!s[jn]||nl();s[ve][Ie].projection[c.projection]===null&&a!==null?Ox(s,u,a):d&&!Du(c)&&N_(u,s,c)}function Ox(e,t,n){let r=Q+n,o=t.data[r],i=e[r],s=ru(i,o.tView.ssrId),u=li(e,o,void 0,{dehydratedView:s});di(i,u,0,$r(o,s))}function ab(e,t,n,r){return Py(e,t,n,r),ab}function cb(e,t,n){return Oy(e,t,n),cb}function Px(e){let t=_(),n=G(),r=Ls();qo(r+1);let o=$d(n,r);if(e.dirty&&q0(t)===((o.metadata.flags&2)===2)){if(o.matches===null)e.reset([]);else{let i=jy(t,r);e.reset(i,Dm),e.notifyOnChanges()}return!0}return!1}function Lx(){return Hd(_(),Ls())}function lb(e,t,n,r,o){return Vy(t,Py(e,n,r,o)),lb}function db(e,t,n,r){return Vy(e,Oy(t,n,r)),db}function jx(e=1){qo(Ls()+e)}function Bx(e){let t=al();return Ho(t,Q+e)}function qs(e,t){return e<<17|t<<2}function er(e){return e>>17&32767}function Vx(e){return(e&2)==2}function Hx(e,t){return e&131071|t<<17}function ad(e){return e|2}function zr(e){return(e&131068)>>2}function wl(e,t){return e&-131069|t<<2}function $x(e){return(e&1)===1}function cd(e){return e|1}function Ux(e,t,n,r,o,i){let s=i?t.classBindings:t.styleBindings,u=er(s),a=zr(s);e[r]=n;let c=!1,l;if(Array.isArray(n)){let d=n;l=d[1],(l===null||Sr(d,l)>0)&&(c=!0)}else l=n;if(o)if(a!==0){let h=er(e[u+1]);e[r+1]=qs(h,u),h!==0&&(e[h+1]=wl(e[h+1],r)),e[u+1]=Hx(e[u+1],r)}else e[r+1]=qs(u,0),u!==0&&(e[u+1]=wl(e[u+1],r)),u=r;else e[r+1]=qs(a,0),u===0?u=r:e[a+1]=wl(e[a+1],r),a=r;c&&(e[r+1]=ad(e[r+1])),Xg(e,l,r,!0),Xg(e,l,r,!1),zx(t,l,e,r,i),s=qs(u,a),i?t.classBindings=s:t.styleBindings=s}function zx(e,t,n,r,o){let i=o?e.residualClasses:e.residualStyles;i!=null&&typeof t==\"string\"&&Sr(i,t)>=0&&(n[r+1]=cd(n[r+1]))}function Xg(e,t,n,r){let o=e[n+1],i=t===null,s=r?er(o):zr(o),u=!1;for(;s!==0&&(u===!1||i);){let a=e[s],c=e[s+1];qx(a,t)&&(u=!0,e[s+1]=r?cd(c):ad(c)),s=r?er(c):zr(c)}u&&(e[n+1]=r?ad(o):cd(o))}function qx(e,t){return e===null||t==null||(Array.isArray(e)?e[1]:e)===t?!0:Array.isArray(e)&&typeof t==\"string\"?Sr(e,t)>=0:!1}var ae={textEnd:0,key:0,keyEnd:0,value:0,valueEnd:0};function fb(e){return e.substring(ae.key,ae.keyEnd)}function Gx(e){return e.substring(ae.value,ae.valueEnd)}function Wx(e){return gb(e),pb(e,qr(e,0,ae.textEnd))}function pb(e,t){let n=ae.textEnd;return n===t?-1:(t=ae.keyEnd=Yx(e,ae.key=t,n),qr(e,t,n))}function Zx(e){return gb(e),hb(e,qr(e,0,ae.textEnd))}function hb(e,t){let n=ae.textEnd,r=ae.key=qr(e,t,n);return n===r?-1:(r=ae.keyEnd=Qx(e,r,n),r=em(e,r,n,58),r=ae.value=qr(e,r,n),r=ae.valueEnd=Kx(e,r,n),em(e,r,n,59))}function gb(e){ae.key=0,ae.keyEnd=0,ae.value=0,ae.valueEnd=0,ae.textEnd=e.length}function qr(e,t,n){for(;t<n&&e.charCodeAt(t)<=32;)t++;return t}function Yx(e,t,n){for(;t<n&&e.charCodeAt(t)>32;)t++;return t}function Qx(e,t,n){let r;for(;t<n&&((r=e.charCodeAt(t))===45||r===95||(r&-33)>=65&&(r&-33)<=90||r>=48&&r<=57);)t++;return t}function em(e,t,n,r){return t=qr(e,t,n),t<n&&t++,t}function Kx(e,t,n){let r=-1,o=-1,i=-1,s=t,u=s;for(;s<n;){let a=e.charCodeAt(s++);if(a===59)return u;a===34||a===39?u=s=tm(e,a,s,n):t===s-4&&i===85&&o===82&&r===76&&a===40?u=s=tm(e,41,s,n):a>32&&(u=s),i=o,o=r,r=a&-33}return u}function tm(e,t,n,r){let o=-1,i=n;for(;i<r;){let s=e.charCodeAt(i++);if(s==t&&o!==92)return i;s==92&&o===92?o=0:o=s}throw new Error}function zu(e,t,n){return yb(e,t,n,!1),zu}function mb(e,t){return yb(e,t,null,!0),mb}function eo(e){bb(Eb,Jx,e,!1)}function Jx(e,t){for(let n=Zx(t);n>=0;n=hb(t,n))Eb(e,fb(t),Gx(t))}function bi(e){bb(iI,Xx,e,!0)}function Xx(e,t){for(let n=Wx(t);n>=0;n=pb(t,n))jo(e,fb(t),!0)}function yb(e,t,n,r){let o=_(),i=G(),s=zo(2);if(i.firstUpdatePass&&Db(i,e,s,r),t!==le&&Te(o,s,t)){let u=i.data[ze()];Cb(i,u,o,o[Z],e,o[s+1]=uI(t,n),r,s)}}function bb(e,t,n,r){let o=G(),i=zo(2);o.firstUpdatePass&&Db(o,null,i,r);let s=_();if(n!==le&&Te(s,i,n)){let u=o.data[ze()];if(_b(u,r)&&!vb(o,i)){let a=r?u.classesWithoutHost:u.stylesWithoutHost;a!==null&&(n=Cs(a,n||\"\")),ud(o,u,s,n,r)}else sI(o,u,s,s[Z],s[i+1],s[i+1]=oI(e,t,n),r,i)}}function vb(e,t){return t>=e.expandoStartIndex}function Db(e,t,n,r){let o=e.data;if(o[n+1]===null){let i=o[ze()],s=vb(e,n);_b(i,r)&&t===null&&!s&&(t=!1),t=eI(o,i,t,r),Ux(o,i,t,n,s,r)}}function eI(e,t,n,r){let o=ig(e),i=r?t.residualClasses:t.residualStyles;if(o===null)(r?t.classBindings:t.styleBindings)===0&&(n=xl(null,e,t,n,r),n=ii(n,t.attrs,r),i=null);else{let s=t.directiveStylingLast;if(s===-1||e[s]!==o)if(n=xl(o,e,t,n,r),i===null){let a=tI(e,t,r);a!==void 0&&Array.isArray(a)&&(a=xl(null,e,t,a[1],r),a=ii(a,t.attrs,r),nI(e,t,r,a))}else i=rI(e,t,r)}return i!==void 0&&(r?t.residualClasses=i:t.residualStyles=i),n}function tI(e,t,n){let r=n?t.classBindings:t.styleBindings;if(zr(r)!==0)return e[er(r)]}function nI(e,t,n,r){let o=n?t.classBindings:t.styleBindings;e[er(o)]=r}function rI(e,t,n){let r,o=t.directiveEnd;for(let i=1+t.directiveStylingLast;i<o;i++){let s=e[i].hostAttrs;r=ii(r,s,n)}return ii(r,t.attrs,n)}function xl(e,t,n,r,o){let i=null,s=n.directiveEnd,u=n.directiveStylingLast;for(u===-1?u=n.directiveStart:u++;u<s&&(i=t[u],r=ii(r,i.hostAttrs,o),i!==e);)u++;return e!==null&&(n.directiveStylingLast=u),r}function ii(e,t,n){let r=n?1:2,o=-1;if(t!==null)for(let i=0;i<t.length;i++){let s=t[i];typeof s==\"number\"?o=s:o===r&&(Array.isArray(e)||(e=e===void 0?[]:[\"\",e]),jo(e,s,n?!0:t[++i]))}return e===void 0?null:e}function oI(e,t,n){if(n==null||n===\"\")return ye;let r=[],o=Oe(n);if(Array.isArray(o))for(let i=0;i<o.length;i++)e(r,o[i],!0);else if(o instanceof Set)for(let i of o)e(r,i,!0);else if(typeof o==\"object\")for(let i in o)o.hasOwnProperty(i)&&e(r,i,o[i]);else typeof o==\"string\"&&t(r,o);return r}function Eb(e,t,n){jo(e,t,Oe(n))}function iI(e,t,n){let r=String(t);r!==\"\"&&!r.includes(\" \")&&jo(e,r,n)}function sI(e,t,n,r,o,i,s,u){o===le&&(o=ye);let a=0,c=0,l=0<o.length?o[0]:null,d=0<i.length?i[0]:null;for(;l!==null||d!==null;){let h=a<o.length?o[a+1]:void 0,f=c<i.length?i[c+1]:void 0,p=null,m;l===d?(a+=2,c+=2,h!==f&&(p=d,m=f)):d===null||l!==null&&l<d?(a+=2,p=l):(c+=2,p=d,m=f),p!==null&&Cb(e,t,n,r,p,m,s,u),l=a<o.length?o[a]:null,d=c<i.length?i[c]:null}}function Cb(e,t,n,r,o,i,s,u){if(!(t.type&3))return;let a=e.data,c=a[u+1],l=$x(c)?nm(a,t,n,o,zr(c),s):void 0;if(!hu(l)){hu(i)||Vx(c)&&(i=nm(a,null,n,o,u,s));let d=Yc(ze(),n);R_(r,s,d,o,i)}}function nm(e,t,n,r,o,i){let s=t===null,u;for(;o>0;){let a=e[o],c=Array.isArray(a),l=c?a[1]:a,d=l===null,h=n[o+1];h===le&&(h=d?ye:void 0);let f=d?Ms(h,r):l===r?h:void 0;if(c&&!hu(f)&&(f=Ms(a,r)),hu(f)&&(u=f,s))return u;let p=e[o+1];o=s?er(p):zr(p)}if(t!==null){let a=i?t.residualClasses:t.residualStyles;a!=null&&(u=Ms(a,r))}return u}function hu(e){return e!==void 0}function uI(e,t){return e==null||e===\"\"||(typeof t==\"string\"?e=e+t:typeof e==\"object\"&&(e=Oo(Oe(e)))),e}function _b(e,t){return(e.flags&(t?8:16))!==0}function aI(e,t=\"\"){let n=_(),r=G(),o=e+Q,i=r.firstCreatePass?rr(r,o,1,t,null):r.data[o],s=cI(r,n,i,t);n[o]=s,Vs()&&Ad(r,n,s,i),qn(i,!1)}var cI=(e,t,n,r)=>(Go(!0),qC(t[Z],r));function lI(e,t,n,r=\"\"){return Te(e,et(),n)?t+Ve(n)+r:le}function dI(e,t,n,r,o,i=\"\"){let s=ll(),u=iu(e,s,n,o);return zo(2),u?t+Ve(n)+r+Ve(o)+i:le}function fI(e,t,n,r,o,i,s,u,a,c=\"\"){let l=ll(),d=Sw(e,l,n,o,s,a);return zo(4),d?t+Ve(n)+r+Ve(o)+i+Ve(s)+u+Ve(a)+c:le}function wb(e){return sf(\"\",e),wb}function sf(e,t,n){let r=_(),o=lI(r,e,t,n);return o!==le&&uf(r,ze(),o),sf}function xb(e,t,n,r,o){let i=_(),s=dI(i,e,t,n,r,o);return s!==le&&uf(i,ze(),s),xb}function Ib(e,t,n,r,o,i,s,u,a){let c=_(),l=fI(c,e,t,n,r,o,i,s,u,a);return l!==le&&uf(c,ze(),l),Ib}function uf(e,t,n){let r=Yc(t,e);GC(e[Z],r,n)}function Tb(e,t,n){Zd(t)&&(t=t());let r=_(),o=et();if(Te(r,o,t)){let i=G(),s=fn();iy(s,r,e,t,r[Z],n)}return Tb}function pI(e,t){let n=Zd(e);return n&&e.set(t),n}function Sb(e,t){let n=_(),r=G(),o=re();return ub(r,n,n[Z],o,e,t),Sb}var Mb={};function qu(e){Ct(\"NgLet\");let t=G(),n=_(),r=e+Q,o=rr(t,r,128,null,null);return qn(o,!1),$o(t,n,r,Mb),qu}function Gu(e){let t=G(),n=_(),r=ze();return $o(t,n,r,e),e}function Wu(e){let t=al(),n=Ho(t,Q+e);if(n===Mb)throw new C(314,!1);return n}function hI(e){return Te(_(),et(),e)?Ve(e):le}function rm(e,t,n){let r=G();r.firstCreatePass&&Ab(t,r.data,r.blueprint,Xe(e),n)}function Ab(e,t,n,r,o){if(e=se(e),Array.isArray(e))for(let i=0;i<e.length;i++)Ab(e[i],t,n,r,o);else{let i=G(),s=_(),u=re(),a=Fn(e)?e:se(e.provide),c=Uc(e),l=u.providerIndexes&1048575,d=u.directiveStart,h=u.providerIndexes>>20;if(Fn(e)||!e.multi){let f=new Qn(c,o,oe,null),p=Tl(a,t,o?l:l+h,d);p===-1?(Ml(eu(u,s),i,a),Il(i,e,t.length),t.push(a),u.directiveStart++,u.directiveEnd++,o&&(u.providerIndexes+=1048576),n.push(f),s.push(f)):(n[p]=f,s[p]=f)}else{let f=Tl(a,t,l+h,d),p=Tl(a,t,l,l+h),m=f>=0&&n[f],g=p>=0&&n[p];if(o&&!g||!o&&!m){Ml(eu(u,s),i,a);let y=yI(o?mI:gI,n.length,o,r,c,e);!o&&g&&(n[p].providerFactory=y),Il(i,e,t.length,0),t.push(a),u.directiveStart++,u.directiveEnd++,o&&(u.providerIndexes+=1048576),n.push(y),s.push(y)}else{let y=Nb(n[o?p:f],c,!o&&r);Il(i,e,f>-1?f:p,y)}!o&&r&&g&&n[p].componentProviders++}}}function Il(e,t,n,r){let o=Fn(t),i=$0(t);if(o||i){let a=(i?se(t.useClass):t).prototype.ngOnDestroy;if(a){let c=e.destroyHooks||(e.destroyHooks=[]);if(!o&&t.multi){let l=c.indexOf(n);l===-1?c.push(n,[r,a]):c[l+1].push(r,a)}else c.push(n,a)}}}function Nb(e,t,n){return n&&e.componentProviders++,e.multi.push(t)-1}function Tl(e,t,n,r){for(let o=n;o<r;o++)if(t[o]===e)return o;return-1}function gI(e,t,n,r,o){return ld(this.multi,[])}function mI(e,t,n,r,o){let i=this.multi,s;if(this.providerFactory){let u=this.providerFactory.componentProviders,a=Jo(r,r[S],this.providerFactory.index,o);s=a.slice(0,u),ld(i,s);for(let c=u;c<a.length;c++)s.push(a[c])}else s=[],ld(i,s);return s}function ld(e,t){for(let n=0;n<e.length;n++){let r=e[n];t.push(r())}return t}function yI(e,t,n,r,o,i){let s=new Qn(e,n,oe,null);return s.multi=[],s.index=t,s.componentProviders=0,Nb(s,o,r&&!n),s}function bI(e,t){return n=>{n.providersResolver=(r,o)=>rm(r,o?o(e):e,!1),t&&(n.viewProvidersResolver=(r,o)=>rm(r,o?o(t):t,!0))}}function vI(e,t){let n=Pr()+e,r=_();return r[n]===le?Bd(r,n,t()):Tw(r,n)}function DI(e,t,n){return Rb(_(),Pr(),e,t,n)}function EI(e,t,n,r){return Fb(_(),Pr(),e,t,n,r)}function kb(e,t){let n=e[t];return n===le?void 0:n}function Rb(e,t,n,r,o,i){let s=t+n;return Te(e,s,o)?Bd(e,s+1,i?r.call(i,o):r(o)):kb(e,s+1)}function Fb(e,t,n,r,o,i,s){let u=t+n;return iu(e,u,o,i)?Bd(e,u+2,s?r.call(s,o,i):r(o,i)):kb(e,u+2)}function CI(e,t){let n=G(),r,o=e+Q;n.firstCreatePass?(r=_I(t,n.pipeRegistry),n.data[o]=r,r.onDestroy&&(n.destroyHooks??=[]).push(o,r.onDestroy)):r=n.data[o];let i=r.factory||(r.factory=on(r.type,!0)),s,u=_e(oe);try{let a=Xs(!1),c=i();return Xs(a),$o(n,_(),o,c),c}finally{_e(u)}}function _I(e,t){if(t)for(let n=t.length-1;n>=0;n--){let r=t[n];if(e===r.name)return r}}function wI(e,t,n){let r=e+Q,o=_(),i=Ho(o,r);return Ob(o,r)?Rb(o,Pr(),t,i.transform,n,i):i.transform(n)}function xI(e,t,n,r){let o=e+Q,i=_(),s=Ho(i,o);return Ob(i,o)?Fb(i,Pr(),t,s.transform,n,r,s):s.transform(n,r)}function Ob(e,t){return e[S].data[t].pure}function II(e,t){return Nu(e,t)}var gu=class{ngModuleFactory;componentFactories;constructor(t,n){this.ngModuleFactory=t,this.componentFactories=n}},TI=(()=>{class e{compileModuleSync(n){return new du(n)}compileModuleAsync(n){return Promise.resolve(this.compileModuleSync(n))}compileModuleAndAllComponentsSync(n){let r=this.compileModuleSync(n),o=Oc(n),i=qm(o.declarations).reduce((s,u)=>{let a=bt(u);return a&&s.push(new yn(a)),s},[]);return new gu(r,i)}compileModuleAndAllComponentsAsync(n){return Promise.resolve(this.compileModuleAndAllComponentsSync(n))}clearCache(){}clearCacheFor(n){}getModuleId(n){}static \\u0275fac=function(r){return new(r||e)};static \\u0275prov=T({token:e,factory:e.\\u0275fac,providedIn:\"root\"})}return e})();var Pb=(()=>{class e{applicationErrorHandler=b(Pt);appRef=b(Qr);taskService=b(Gn);ngZone=b(be);zonelessEnabled=b(Zo);tracing=b(ot,{optional:!0});zoneIsDefined=typeof Zone<\"u\"&&!!Zone.root.run;schedulerTickApplyArgs=[{data:{__scheduler_tick__:!0}}];subscriptions=new X;angularZoneId=this.zoneIsDefined?this.ngZone._inner?.get(Ro):null;scheduleInRootZone=!this.zonelessEnabled&&this.zoneIsDefined&&(b(yl,{optional:!0})??!1);cancelScheduledCallback=null;useMicrotaskScheduler=!1;runningTick=!1;pendingRenderTaskId=null;constructor(){this.subscriptions.add(this.appRef.afterTick.subscribe(()=>{let n=this.taskService.add();if(!this.runningTick&&(this.cleanup(),!this.zonelessEnabled||this.appRef.includeAllTestViews)){this.taskService.remove(n);return}this.switchToMicrotaskScheduler(),this.taskService.remove(n)})),this.subscriptions.add(this.ngZone.onUnstable.subscribe(()=>{this.runningTick||this.cleanup()}))}switchToMicrotaskScheduler(){this.ngZone.runOutsideAngular(()=>{let n=this.taskService.add();this.useMicrotaskScheduler=!0,queueMicrotask(()=>{this.useMicrotaskScheduler=!1,this.taskService.remove(n)})})}notify(n){if(!this.zonelessEnabled&&n===5)return;switch(n){case 0:{this.appRef.dirtyFlags|=2;break}case 3:case 2:case 4:case 5:case 1:{this.appRef.dirtyFlags|=4;break}case 6:{this.appRef.dirtyFlags|=2;break}case 12:{this.appRef.dirtyFlags|=16;break}case 13:{this.appRef.dirtyFlags|=2;break}case 11:break;default:this.appRef.dirtyFlags|=8}if(this.appRef.tracingSnapshot=this.tracing?.snapshot(this.appRef.tracingSnapshot)??null,!this.shouldScheduleTick())return;let r=this.useMicrotaskScheduler?mg:hl;this.pendingRenderTaskId=this.taskService.add(),this.scheduleInRootZone?this.cancelScheduledCallback=Zone.root.run(()=>r(()=>this.tick())):this.cancelScheduledCallback=this.ngZone.runOutsideAngular(()=>r(()=>this.tick()))}shouldScheduleTick(){return!(this.appRef.destroyed||this.pendingRenderTaskId!==null||this.runningTick||this.appRef._runningTick||!this.zonelessEnabled&&this.zoneIsDefined&&Zone.current.get(Ro+this.angularZoneId))}tick(){if(this.runningTick||this.appRef.destroyed)return;if(this.appRef.dirtyFlags===0){this.cleanup();return}!this.zonelessEnabled&&this.appRef.dirtyFlags&7&&(this.appRef.dirtyFlags|=1);let n=this.taskService.add();try{this.ngZone.run(()=>{this.runningTick=!0,this.appRef._tick()},void 0,this.schedulerTickApplyArgs)}catch(r){this.applicationErrorHandler(r)}finally{this.taskService.remove(n),this.cleanup()}}ngOnDestroy(){this.subscriptions.unsubscribe(),this.cleanup()}cleanup(){if(this.runningTick=!1,this.cancelScheduledCallback?.(),this.cancelScheduledCallback=null,this.pendingRenderTaskId!==null){let n=this.pendingRenderTaskId;this.pendingRenderTaskId=null,this.taskService.remove(n)}}static \\u0275fac=function(r){return new(r||e)};static \\u0275prov=T({token:e,factory:e.\\u0275fac,providedIn:\"root\"})}return e})();function Lb(){return[{provide:gt,useExisting:Pb},{provide:be,useClass:Fo},{provide:Zo,useValue:!0}]}function SI(){return typeof $localize<\"u\"&&$localize.locale||mi}var Zu=new x(\"\",{factory:()=>b(Zu,{optional:!0,skipSelf:!0})||SI()});var Yu=class{destroyed=!1;listeners=null;errorHandler=b(Be,{optional:!0});destroyRef=b(Fe);constructor(){this.destroyRef.onDestroy(()=>{this.destroyed=!0,this.listeners=null})}subscribe(t){if(this.destroyed)throw new C(953,!1);return(this.listeners??=[]).push(t),{unsubscribe:()=>{let n=this.listeners?.indexOf(t);n!==void 0&&n!==-1&&this.listeners?.splice(n,1)}}}emit(t){if(this.destroyed){console.warn(mt(953,!1));return}if(this.listeners===null)return;let n=I(null);try{for(let r of this.listeners)try{r(t)}catch(o){this.errorHandler?.handleError(o)}}finally{I(n)}}};function De(e){return x0(e)}function Se(e,t){return Do(e,t?.equal)}var MI=e=>e;function af(e,t){if(typeof e==\"function\"){let n=mc(e,MI,t?.equal);return jb(n,t?.debugName)}else{let n=mc(e.source,e.computation,e.equal);return jb(n,e.debugName)}}function jb(e,t){let n=e[ne],r=e;return r.set=o=>_0(n,o),r.update=o=>w0(n,o),r.asReadonly=Wo.bind(e),r}function AI(e){let t=e.request,n=e.params??t??(()=>null);return new Qu(n,kI(e),e.defaultValue,e.equal?NI(e.equal):void 0,e.debugName,e.injector??b(fe))}var cf=class{value;isLoading;constructor(t,n){this.value=t,this.value.set=this.set.bind(this),this.value.update=this.update.bind(this),this.value.asReadonly=Wo,this.isLoading=Se(()=>this.status()===\"loading\"||this.status()===\"reloading\",void 0)}isError=Se(()=>this.status()===\"error\");update(t){this.set(t(De(this.value)))}isValueDefined=Se(()=>this.isError()?!1:this.value()!==void 0);_snapshot;get snapshot(){return this._snapshot??=Se(()=>{let t=this.status();return t===\"error\"?{status:\"error\",error:this.error()}:{status:t,value:this.value()}})}hasValue(){return this.isValueDefined()}asReadonly(){return this}},Qu=class extends cf{loaderFn;equal;debugName;pendingTasks;state;extRequest;effectRef;pendingController;resolvePendingTask=void 0;destroyed=!1;unregisterOnDestroy;status;error;constructor(t,n,r,o,i,s,u){super(Se(()=>{let a=this.state().stream?.();if(!a||this.state().status===\"loading\"&&this.error())return r;if(!lf(a))throw new Ku(this.error());return a.value},{equal:o}),i),this.loaderFn=n,this.equal=o,this.debugName=i,this.extRequest=af({source:t,computation:a=>({request:a,reload:0})}),this.state=af({source:this.extRequest,computation:(a,c)=>{if(c){let l=a.request===void 0?\"idle\":\"loading\";return{extRequest:a,status:l,previousStatus:Bb(c.value),stream:c.value.extRequest.request===a.request?c.value.stream:void 0}}else{let l=u?.(a.request);u=void 0;let d=a.request===void 0?\"idle\":l?\"resolved\":\"loading\";return{extRequest:a,status:d,previousStatus:\"idle\",stream:l}}}}),this.effectRef=Yo(this.loadEffect.bind(this),{injector:s,manualCleanup:!0}),this.pendingTasks=s.get(Wn),this.unregisterOnDestroy=s.get(Fe).onDestroy(()=>this.destroy()),this.status=Se(()=>Bb(this.state()),void 0),this.error=Se(()=>{let a=this.state().stream?.();return a&&!lf(a)?a.error:void 0},void 0)}set(t){if(this.destroyed)return;let n=De(this.error),r=De(this.state);if(!n){let o=De(this.value);if(r.status===\"local\"&&(this.equal?this.equal(o,t):o===t))return}this.state.set({extRequest:r.extRequest,status:\"local\",previousStatus:\"local\",stream:pn({value:t},void 0)}),this.abortInProgressLoad()}reload(){let{status:t}=De(this.state);return t===\"idle\"||t===\"loading\"?!1:(this.extRequest.update(({request:n,reload:r})=>({request:n,reload:r+1})),!0)}destroy(){this.destroyed=!0,this.unregisterOnDestroy(),this.effectRef.destroy(),this.abortInProgressLoad(),this.state.set({extRequest:{request:void 0,reload:0},status:\"idle\",previousStatus:\"idle\",stream:void 0})}loadEffect(){return lt(this,null,function*(){let t=this.extRequest(),{status:n,previousStatus:r}=De(this.state);if(t.request===void 0)return;if(n!==\"loading\")return;this.abortInProgressLoad();let o=this.resolvePendingTask=this.pendingTasks.add(),{signal:i}=this.pendingController=new AbortController;try{let s=yield De(()=>this.loaderFn({params:t.request,abortSignal:i,previous:{status:r}}));if(i.aborted||De(this.extRequest)!==t)return;this.state.set({extRequest:t,status:\"resolved\",previousStatus:\"resolved\",stream:s})}catch(s){if(i.aborted||De(this.extRequest)!==t)return;this.state.set({extRequest:t,status:\"resolved\",previousStatus:\"error\",stream:pn({error:ff(s)},void 0)})}finally{o?.(),o=void 0}})}abortInProgressLoad(){De(()=>this.pendingController?.abort()),this.pendingController=void 0,this.resolvePendingTask?.(),this.resolvePendingTask=void 0}};function NI(e){return(t,n)=>t===void 0||n===void 0?t===n:e(t,n)}function kI(e){return RI(e)?e.stream:t=>lt(null,null,function*(){try{return pn({value:yield e.loader(t)},void 0)}catch(n){return pn({error:ff(n)},void 0)}})}function RI(e){return!!e.stream}function Bb(e){switch(e.status){case\"loading\":return e.extRequest.reload===0?\"loading\":\"reloading\";case\"resolved\":return lf(e.stream())?\"resolved\":\"error\";default:return e.status}}function lf(e){return e.error===void 0}function ff(e){return FI(e)?e:new df(e)}function FI(e){return e instanceof Error||typeof e==\"object\"&&typeof e.name==\"string\"&&typeof e.message==\"string\"}var Ku=class extends Error{constructor(t){super(t.message,{cause:t})}},df=class extends Error{constructor(t){super(String(t),{cause:t})}};var Yb=Symbol(\"InputSignalNode#UNSET\"),zI=P(M({},Eo),{transformFn:void 0,applyValueToInputSignal(e,t){In(e,t)}});function Qb(e,t){let n=Object.create(zI);n.value=e,n.transformFn=t?.transform;function r(){if(Kt(n),n.value===Yb){let o=null;throw new C(-950,o)}return n.value}return r[ne]=n,r}var Vb=class{attributeName;constructor(t){this.attributeName=t}__NG_ELEMENT_ID__=()=>fd(this.attributeName);toString(){return`HostAttributeToken ${this.attributeName}`}},gB=(()=>{let e=new x(\"\");return e.__NG_ELEMENT_ID__=t=>{let n=re();if(n===null)throw new C(-204,!1);if(n.type&2)return n.value;if(t&8)return null;throw new C(-204,!1)},e})();function mB(e){return new Yu}function Hb(e,t){return Qb(e,t)}function qI(e){return Qb(Yb,e)}var Ae=(Hb.required=qI,Hb);function $b(e,t){return zd(t)}function GI(e,t){return qd(t)}var yB=($b.required=GI,$b);function bB(e,t){return By(t)}function Ub(e,t){return zd(t)}function WI(e,t){return qd(t)}var vB=(Ub.required=WI,Ub);var hf=new x(\"\"),ZI=new x(\"\");function vi(e){return!e.moduleRef}function YI(e){let t=vi(e)?e.r3Injector:e.moduleRef.injector,n=t.get(be);return n.run(()=>{vi(e)?e.r3Injector.resolveInjectorInitializers():e.moduleRef.resolveInjectorInitializers();let r=t.get(Pt),o;if(n.runOutsideAngular(()=>{o=n.onError.subscribe({next:r})}),vi(e)){let i=()=>t.destroy(),s=e.platformInjector.get(hf);s.add(i),t.onDestroy(()=>{o.unsubscribe(),s.delete(i)})}else{let i=()=>e.moduleRef.destroy(),s=e.platformInjector.get(hf);s.add(i),e.moduleRef.onDestroy(()=>{Ko(e.allPlatformModules,e.moduleRef),o.unsubscribe(),s.delete(i)})}return KI(r,n,()=>{let i=t.get(Gn),s=i.add(),u=t.get(Kd);return u.runInitializers(),u.donePromise.then(()=>{let a=t.get(Zu,mi);if(ob(a||mi),!t.get(ZI,!0))return vi(e)?t.get(Qr):(e.allPlatformModules.push(e.moduleRef),e.moduleRef);if(vi(e)){let l=t.get(Qr);return e.rootComponent!==void 0&&l.bootstrap(e.rootComponent),l}else return QI?.(e.moduleRef,e.allPlatformModules),e.moduleRef}).finally(()=>{i.remove(s)})})})}var QI;function KI(e,t,n){try{let r=n();return gi(r)?r.catch(o=>{throw t.runOutsideAngular(()=>e(o)),o}):r}catch(r){throw t.runOutsideAngular(()=>e(r)),r}}var Ju=null;function JI(e=[],t){return fe.create({name:t,providers:[{provide:Bo,useValue:\"platform\"},{provide:hf,useValue:new Set([()=>Ju=null])},...e]})}function XI(e=[]){if(Ju)return Ju;let t=JI(e);return Ju=t,Xy(),e2(t),t}function e2(e){let t=e.get(bu,null);Nr(e,()=>{t?.forEach(n=>n())})}var t2=1e4;var DB=t2-1e3;var _f=(()=>{class e{static __NG_ELEMENT_ID__=n2}return e})();function n2(e){return r2(re(),_(),(e&16)===16)}function r2(e,t,n){if(Dt(e)&&!n){let r=ke(e.index,t);return new gn(r,r)}else if(e.type&175){let r=t[ve];return new gn(r,t)}return null}var gf=class{supports(t){return jd(t)}create(t){return new mf(t)}},o2=(e,t)=>t,mf=class{length=0;collection;_linkedRecords=null;_unlinkedRecords=null;_previousItHead=null;_itHead=null;_itTail=null;_additionsHead=null;_additionsTail=null;_movesHead=null;_movesTail=null;_removalsHead=null;_removalsTail=null;_identityChangesHead=null;_identityChangesTail=null;_trackByFn;constructor(t){this._trackByFn=t||o2}forEachItem(t){let n;for(n=this._itHead;n!==null;n=n._next)t(n)}forEachOperation(t){let n=this._itHead,r=this._removalsHead,o=0,i=null;for(;n||r;){let s=!r||n&&n.currentIndex<zb(r,o,i)?n:r,u=zb(s,o,i),a=s.currentIndex;if(s===r)o--,r=r._nextRemoved;else if(n=n._next,s.previousIndex==null)o++;else{i||(i=[]);let c=u-o,l=a-o;if(c!=l){for(let h=0;h<c;h++){let f=h<i.length?i[h]:i[h]=0,p=f+h;l<=p&&p<c&&(i[h]=f+1)}let d=s.previousIndex;i[d]=l-c}}u!==a&&t(s,u,a)}}forEachPreviousItem(t){let n;for(n=this._previousItHead;n!==null;n=n._nextPrevious)t(n)}forEachAddedItem(t){let n;for(n=this._additionsHead;n!==null;n=n._nextAdded)t(n)}forEachMovedItem(t){let n;for(n=this._movesHead;n!==null;n=n._nextMoved)t(n)}forEachRemovedItem(t){let n;for(n=this._removalsHead;n!==null;n=n._nextRemoved)t(n)}forEachIdentityChange(t){let n;for(n=this._identityChangesHead;n!==null;n=n._nextIdentityChange)t(n)}diff(t){if(t==null&&(t=[]),!jd(t))throw new C(900,!1);return this.check(t)?this:null}onDestroy(){}check(t){this._reset();let n=this._itHead,r=!1,o,i,s;if(Array.isArray(t)){this.length=t.length;for(let u=0;u<this.length;u++)i=t[u],s=this._trackByFn(u,i),n===null||!Object.is(n.trackById,s)?(n=this._mismatch(n,i,s,u),r=!0):(r&&(n=this._verifyReinsertion(n,i,s,u)),Object.is(n.item,i)||this._addIdentityChange(n,i)),n=n._next}else o=0,Ty(t,u=>{s=this._trackByFn(o,u),n===null||!Object.is(n.trackById,s)?(n=this._mismatch(n,u,s,o),r=!0):(r&&(n=this._verifyReinsertion(n,u,s,o)),Object.is(n.item,u)||this._addIdentityChange(n,u)),n=n._next,o++}),this.length=o;return this._truncate(n),this.collection=t,this.isDirty}get isDirty(){return this._additionsHead!==null||this._movesHead!==null||this._removalsHead!==null||this._identityChangesHead!==null}_reset(){if(this.isDirty){let t;for(t=this._previousItHead=this._itHead;t!==null;t=t._next)t._nextPrevious=t._next;for(t=this._additionsHead;t!==null;t=t._nextAdded)t.previousIndex=t.currentIndex;for(this._additionsHead=this._additionsTail=null,t=this._movesHead;t!==null;t=t._nextMoved)t.previousIndex=t.currentIndex;this._movesHead=this._movesTail=null,this._removalsHead=this._removalsTail=null,this._identityChangesHead=this._identityChangesTail=null}}_mismatch(t,n,r,o){let i;return t===null?i=this._itTail:(i=t._prev,this._remove(t)),t=this._unlinkedRecords===null?null:this._unlinkedRecords.get(r,null),t!==null?(Object.is(t.item,n)||this._addIdentityChange(t,n),this._reinsertAfter(t,i,o)):(t=this._linkedRecords===null?null:this._linkedRecords.get(r,o),t!==null?(Object.is(t.item,n)||this._addIdentityChange(t,n),this._moveAfter(t,i,o)):t=this._addAfter(new yf(n,r),i,o)),t}_verifyReinsertion(t,n,r,o){let i=this._unlinkedRecords===null?null:this._unlinkedRecords.get(r,null);return i!==null?t=this._reinsertAfter(i,t._prev,o):t.currentIndex!=o&&(t.currentIndex=o,this._addToMoves(t,o)),t}_truncate(t){for(;t!==null;){let n=t._next;this._addToRemovals(this._unlink(t)),t=n}this._unlinkedRecords!==null&&this._unlinkedRecords.clear(),this._additionsTail!==null&&(this._additionsTail._nextAdded=null),this._movesTail!==null&&(this._movesTail._nextMoved=null),this._itTail!==null&&(this._itTail._next=null),this._removalsTail!==null&&(this._removalsTail._nextRemoved=null),this._identityChangesTail!==null&&(this._identityChangesTail._nextIdentityChange=null)}_reinsertAfter(t,n,r){this._unlinkedRecords!==null&&this._unlinkedRecords.remove(t);let o=t._prevRemoved,i=t._nextRemoved;return o===null?this._removalsHead=i:o._nextRemoved=i,i===null?this._removalsTail=o:i._prevRemoved=o,this._insertAfter(t,n,r),this._addToMoves(t,r),t}_moveAfter(t,n,r){return this._unlink(t),this._insertAfter(t,n,r),this._addToMoves(t,r),t}_addAfter(t,n,r){return this._insertAfter(t,n,r),this._additionsTail===null?this._additionsTail=this._additionsHead=t:this._additionsTail=this._additionsTail._nextAdded=t,t}_insertAfter(t,n,r){let o=n===null?this._itHead:n._next;return t._next=o,t._prev=n,o===null?this._itTail=t:o._prev=t,n===null?this._itHead=t:n._next=t,this._linkedRecords===null&&(this._linkedRecords=new Xu),this._linkedRecords.put(t),t.currentIndex=r,t}_remove(t){return this._addToRemovals(this._unlink(t))}_unlink(t){this._linkedRecords!==null&&this._linkedRecords.remove(t);let n=t._prev,r=t._next;return n===null?this._itHead=r:n._next=r,r===null?this._itTail=n:r._prev=n,t}_addToMoves(t,n){return t.previousIndex===n||(this._movesTail===null?this._movesTail=this._movesHead=t:this._movesTail=this._movesTail._nextMoved=t),t}_addToRemovals(t){return this._unlinkedRecords===null&&(this._unlinkedRecords=new Xu),this._unlinkedRecords.put(t),t.currentIndex=null,t._nextRemoved=null,this._removalsTail===null?(this._removalsTail=this._removalsHead=t,t._prevRemoved=null):(t._prevRemoved=this._removalsTail,this._removalsTail=this._removalsTail._nextRemoved=t),t}_addIdentityChange(t,n){return t.item=n,this._identityChangesTail===null?this._identityChangesTail=this._identityChangesHead=t:this._identityChangesTail=this._identityChangesTail._nextIdentityChange=t,t}},yf=class{item;trackById;currentIndex=null;previousIndex=null;_nextPrevious=null;_prev=null;_next=null;_prevDup=null;_nextDup=null;_prevRemoved=null;_nextRemoved=null;_nextAdded=null;_nextMoved=null;_nextIdentityChange=null;constructor(t,n){this.item=t,this.trackById=n}},bf=class{_head=null;_tail=null;add(t){this._head===null?(this._head=this._tail=t,t._nextDup=null,t._prevDup=null):(this._tail._nextDup=t,t._prevDup=this._tail,t._nextDup=null,this._tail=t)}get(t,n){let r;for(r=this._head;r!==null;r=r._nextDup)if((n===null||n<=r.currentIndex)&&Object.is(r.trackById,t))return r;return null}remove(t){let n=t._prevDup,r=t._nextDup;return n===null?this._head=r:n._nextDup=r,r===null?this._tail=n:r._prevDup=n,this._head===null}},Xu=class{map=new Map;put(t){let n=t.trackById,r=this.map.get(n);r||(r=new bf,this.map.set(n,r)),r.add(t)}get(t,n){let r=t,o=this.map.get(r);return o?o.get(t,n):null}remove(t){let n=t.trackById;return this.map.get(n).remove(t)&&this.map.delete(n),t}get isEmpty(){return this.map.size===0}clear(){this.map.clear()}};function zb(e,t,n){let r=e.previousIndex;if(r===null)return r;let o=0;return n&&r<n.length&&(o=n[r]),r+t+o}var vf=class{supports(t){return t instanceof Map||Ru(t)}create(){return new Df}},Df=class{_records=new Map;_mapHead=null;_appendAfter=null;_previousMapHead=null;_changesHead=null;_changesTail=null;_additionsHead=null;_additionsTail=null;_removalsHead=null;get isDirty(){return this._additionsHead!==null||this._changesHead!==null||this._removalsHead!==null}forEachItem(t){let n;for(n=this._mapHead;n!==null;n=n._next)t(n)}forEachPreviousItem(t){let n;for(n=this._previousMapHead;n!==null;n=n._nextPrevious)t(n)}forEachChangedItem(t){let n;for(n=this._changesHead;n!==null;n=n._nextChanged)t(n)}forEachAddedItem(t){let n;for(n=this._additionsHead;n!==null;n=n._nextAdded)t(n)}forEachRemovedItem(t){let n;for(n=this._removalsHead;n!==null;n=n._nextRemoved)t(n)}diff(t){if(!t)t=new Map;else if(!(t instanceof Map||Ru(t)))throw new C(900,!1);return this.check(t)?this:null}check(t){this._reset();let n=this._mapHead;if(this._appendAfter=null,this._forEach(t,(r,o)=>{if(n&&n.key===o)this._maybeAddToChanges(n,r),this._appendAfter=n,n=n._next;else{let i=this._getOrCreateRecordForKey(o,r);n=this._insertBeforeOrAppend(n,i)}}),n){n._prev&&(n._prev._next=null),this._removalsHead=n;for(let r=n;r!==null;r=r._nextRemoved)r===this._mapHead&&(this._mapHead=null),this._records.delete(r.key),r._nextRemoved=r._next,r.previousValue=r.currentValue,r.currentValue=null,r._prev=null,r._next=null}return this._changesTail&&(this._changesTail._nextChanged=null),this._additionsTail&&(this._additionsTail._nextAdded=null),this.isDirty}_insertBeforeOrAppend(t,n){if(t){let r=t._prev;return n._next=t,n._prev=r,t._prev=n,r&&(r._next=n),t===this._mapHead&&(this._mapHead=n),this._appendAfter=t,t}return this._appendAfter?(this._appendAfter._next=n,n._prev=this._appendAfter):this._mapHead=n,this._appendAfter=n,null}_getOrCreateRecordForKey(t,n){if(this._records.has(t)){let o=this._records.get(t);this._maybeAddToChanges(o,n);let i=o._prev,s=o._next;return i&&(i._next=s),s&&(s._prev=i),o._next=null,o._prev=null,o}let r=new Ef(t);return this._records.set(t,r),r.currentValue=n,this._addToAdditions(r),r}_reset(){if(this.isDirty){let t;for(this._previousMapHead=this._mapHead,t=this._previousMapHead;t!==null;t=t._next)t._nextPrevious=t._next;for(t=this._changesHead;t!==null;t=t._nextChanged)t.previousValue=t.currentValue;for(t=this._additionsHead;t!=null;t=t._nextAdded)t.previousValue=t.currentValue;this._changesHead=this._changesTail=null,this._additionsHead=this._additionsTail=null,this._removalsHead=null}}_maybeAddToChanges(t,n){Object.is(n,t.currentValue)||(t.previousValue=t.currentValue,t.currentValue=n,this._addToChanges(t))}_addToAdditions(t){this._additionsHead===null?this._additionsHead=this._additionsTail=t:(this._additionsTail._nextAdded=t,this._additionsTail=t)}_addToChanges(t){this._changesHead===null?this._changesHead=this._changesTail=t:(this._changesTail._nextChanged=t,this._changesTail=t)}_forEach(t,n){t instanceof Map?t.forEach(n):Object.keys(t).forEach(r=>n(t[r],r))}},Ef=class{key;previousValue=null;currentValue=null;_nextPrevious=null;_next=null;_prev=null;_nextAdded=null;_nextRemoved=null;_nextChanged=null;constructor(t){this.key=t}};function qb(){return new wf([new gf])}var wf=(()=>{class e{factories;static \\u0275prov=T({token:e,providedIn:\"root\",factory:qb});constructor(n){this.factories=n}static create(n,r){if(r!=null){let o=r.factories.slice();n=n.concat(o)}return new e(n)}static extend(n){return{provide:e,useFactory:()=>{let r=b(e,{optional:!0,skipSelf:!0});return e.create(n,r||qb())}}}find(n){let r=this.factories.find(o=>o.supports(n));if(r!=null)return r;throw new C(901,!1)}}return e})();function Gb(){return new ea([new vf])}var ea=(()=>{class e{static \\u0275prov=T({token:e,providedIn:\"root\",factory:Gb});factories;constructor(n){this.factories=n}static create(n,r){if(r){let o=r.factories.slice();n=n.concat(o)}return new e(n)}static extend(n){return{provide:e,useFactory:()=>{let r=b(e,{optional:!0,skipSelf:!0});return e.create(n,r||Gb())}}}find(n){let r=this.factories.find(o=>o.supports(n));if(r)return r;throw new C(901,!1)}}return e})();var Kb=(()=>{class e{constructor(n){}static \\u0275fac=function(r){return new(r||e)(A(Qr))};static \\u0275mod=Ht({type:e});static \\u0275inj=yt({})}return e})();function Jb(e){let{rootComponent:t,appProviders:n,platformProviders:r,platformRef:o}=e;Y(q.BootstrapApplicationStart);try{let i=o?.injector??XI(r),s=[Lb(),bg,...n||[]],u=new oi({providers:s,parent:i,debugName:\"\",runEnvironmentInitializers:!1});return YI({r3Injector:u.injector,platformInjector:i,rootComponent:t})}catch(i){return Promise.reject(i)}finally{Y(q.BootstrapApplicationEnd)}}function i2(e){return typeof e==\"boolean\"?e:e!=null&&e!==\"false\"}function s2(e,t=NaN){return!isNaN(parseFloat(e))&&!isNaN(Number(e))?Number(e):t}var pf=Symbol(\"NOT_SET\"),Xb=new Set,u2=P(M({},Eo),{kind:\"afterRenderEffectPhase\",consumerIsAlwaysLive:!0,consumerAllowSignalWrites:!0,value:pf,cleanup:null,consumerMarkedDirty(){if(this.sequence.impl.executing){if(this.sequence.lastPhase===null||this.sequence.lastPhase<this.phase)return;this.sequence.erroredOrDestroyed=!0}this.sequence.scheduler.notify(7)},phaseFn(e){if(this.sequence.lastPhase=this.phase,!this.dirty)return this.signal;if(this.dirty=!1,this.value!==pf&&!gr(this))return this.signal;try{for(let o of this.cleanup??Xb)o()}finally{this.cleanup?.clear()}let t=[];e!==void 0&&t.push(e),t.push(this.registerCleanupFn);let n=Tt(this),r;try{r=this.userFn.apply(null,t)}finally{Jt(this,n)}return(this.value===pf||!this.equal(this.value,r))&&(this.value=r,this.version++),this.signal}}),Cf=class extends Xo{scheduler;lastPhase=null;nodes=[void 0,void 0,void 0,void 0];onDestroyFns=null;constructor(t,n,r,o,i,s=null){super(t,[void 0,void 0,void 0,void 0],r,!1,i.get(Fe),s),this.scheduler=o;for(let u of Td){let a=n[u];if(a===void 0)continue;let c=Object.create(u2);c.sequence=this,c.phase=u,c.userFn=a,c.dirty=!0,c.signal=()=>(Kt(c),c.value),c.signal[ne]=c,c.registerCleanupFn=l=>(c.cleanup??=new Set).add(l),this.nodes[u]=c,this.hooks[u]=l=>c.phaseFn(l)}}afterRun(){super.afterRun(),this.lastPhase=null}destroy(){if(this.onDestroyFns!==null)for(let t of this.onDestroyFns)t();super.destroy();for(let t of this.nodes)if(t)try{for(let n of t.cleanup??Xb)n()}finally{Xt(t)}}};function EB(e,t){let n=t?.injector??b(fe),r=n.get(gt),o=n.get(xu),i=n.get(ot,null,{optional:!0});o.impl??=n.get(Sd);let s=e;typeof s==\"function\"&&(s={mixedReadWrite:e});let u=n.get(Lr,null,{optional:!0}),a=new Cf(o.impl,[s.earlyRead,s.write,s.mixedReadWrite,s.read],u?.view,r,n,i?.snapshot(null));return o.impl.register(a),a}function CB(e,t){let n=bt(e),r=t.elementInjector||Ar();return new yn(n).create(r,t.projectableNodes,t.hostElement,t.environmentInjector,t.directives,t.bindings)}function _B(e){let t=bt(e);if(!t)return null;let n=new yn(t);return{get selector(){return n.selector},get type(){return n.componentType},get inputs(){return n.inputs},get outputs(){return n.outputs},get ngContentSelectors(){return n.ngContentSelectors},get isStandalone(){return t.standalone},get isSignal(){return t.signals}}}var ro={};pr(ro,{appendToAll:()=>l2,createThemeStyles:()=>d2,merge:()=>c2,structuralStyles:()=>f2,toProp:()=>Le});var a2=`\n  &:not([disabled]) {\n    cursor: pointer;\n    opacity: var(--opacity, 0);\n    transition: opacity var(--speed, 0.2s) cubic-bezier(0, 0, 0.3, 1);\n\n    &:hover,\n    &:focus {\n      opacity: 1;\n    }\n  }`,e1=`\n  ${new Array(21).fill(0).map((e,t)=>`.behavior-ho-${t*5} {\n          --opacity: ${t/20};\n          ${a2}\n        }`).join(`\n`)}\n\n  .behavior-o-s {\n    overflow: scroll;\n  }\n\n  .behavior-o-a {\n    overflow: auto;\n  }\n\n  .behavior-o-h {\n    overflow: hidden;\n  }\n\n  .behavior-sw-n {\n    scrollbar-width: none;\n  }\n`;var t1=`\n  ${new Array(25).fill(0).map((e,t)=>`\n        .border-bw-${t} { border-width: ${t}px; }\n        .border-btw-${t} { border-top-width: ${t}px; }\n        .border-bbw-${t} { border-bottom-width: ${t}px; }\n        .border-blw-${t} { border-left-width: ${t}px; }\n        .border-brw-${t} { border-right-width: ${t}px; }\n\n        .border-ow-${t} { outline-width: ${t}px; }\n        .border-br-${t} { border-radius: ${t*4}px; overflow: hidden;}`).join(`\n`)}\n\n  .border-br-50pc {\n    border-radius: 50%;\n  }\n\n  .border-bs-s {\n    border-style: solid;\n  }\n`;var xf=[0,5,10,15,20,25,30,35,40,50,60,70,80,90,95,98,99,100];function c2(...e){let t={};for(let n of e)for(let[r,o]of Object.entries(n)){let i=r.split(\"-\").with(-1,\"\").join(\"-\"),s=Object.keys(t).filter(u=>u.startsWith(i));for(let u of s)delete t[u];t[r]=o}return t}function l2(e,t,...n){let r=structuredClone(e);for(let o of n)for(let i of Object.keys(o)){let s=i.split(\"-\").with(-1,\"\").join(\"-\");for(let[u,a]of Object.entries(r)){if(t.includes(u))continue;let c=!1;for(let l=0;l<a.length;l++)a[l].startsWith(s)&&(c=!0,a[l]=i);c||a.push(i)}}return r}function d2(e){let t={};for(let n of Object.values(e))for(let[r,o]of Object.entries(n)){let i=Le(r);t[i]=o}return t}function Le(e){return e.startsWith(\"nv\")?`--nv-${e.slice(2)}`:`--${e[0]}-${e.slice(1)}`}var to=e=>`\n    ${e.map(t=>{let n=If(t);return`.color-bc-${t} { border-color: light-dark(var(${Le(t)}), var(${Le(n)})); }`}).join(`\n`)}\n\n    ${e.map(t=>{let n=If(t),r=[`.color-bgc-${t} { background-color: light-dark(var(${Le(t)}), var(${Le(n)})); }`,`.color-bbgc-${t}::backdrop { background-color: light-dark(var(${Le(t)}), var(${Le(n)})); }`];for(let o=.1;o<1;o+=.1)r.push(`.color-bbgc-${t}_${(o*100).toFixed(0)}::backdrop {\n            background-color: light-dark(oklch(from var(${Le(t)}) l c h / calc(alpha * ${o.toFixed(1)})), oklch(from var(${Le(n)}) l c h / calc(alpha * ${o.toFixed(1)})) );\n          }\n        `);return r.join(`\n`)}).join(`\n`)}\n\n  ${e.map(t=>{let n=If(t);return`.color-c-${t} { color: light-dark(var(${Le(t)}), var(${Le(n)})); }`}).join(`\n`)}\n  `,If=e=>{let t=e.match(/^([a-z]+)(\\d+)$/);if(!t)return e;let[,n,r]=t,i=100-parseInt(r,10),s=xf.reduce((u,a)=>Math.abs(a-i)<Math.abs(u-i)?a:u);return`${n}${s}`},no=e=>xf.map(t=>`${e}${t}`),n1=[to(no(\"p\")),to(no(\"s\")),to(no(\"t\")),to(no(\"n\")),to(no(\"nv\")),to(no(\"e\")),`\n    .color-bgc-transparent {\n      background-color: transparent;\n    }\n\n    :host {\n      color-scheme: var(--color-scheme);\n    }\n  `];var r1=`\n  .g-icon {\n    font-family: \"Material Symbols Outlined\", \"Google Symbols\";\n    font-weight: normal;\n    font-style: normal;\n    font-display: optional;\n    font-size: 20px;\n    width: 1em;\n    height: 1em;\n    user-select: none;\n    line-height: 1;\n    letter-spacing: normal;\n    text-transform: none;\n    display: inline-block;\n    white-space: nowrap;\n    word-wrap: normal;\n    direction: ltr;\n    -webkit-font-feature-settings: \"liga\";\n    -webkit-font-smoothing: antialiased;\n    overflow: hidden;\n\n    font-variation-settings: \"FILL\" 0, \"wght\" 300, \"GRAD\" 0, \"opsz\" 48,\n      \"ROND\" 100;\n\n    &.filled {\n      font-variation-settings: \"FILL\" 1, \"wght\" 300, \"GRAD\" 0, \"opsz\" 48,\n        \"ROND\" 100;\n    }\n\n    &.filled-heavy {\n      font-variation-settings: \"FILL\" 1, \"wght\" 700, \"GRAD\" 0, \"opsz\" 48,\n        \"ROND\" 100;\n    }\n  }\n`;var o1=`\n  :host {\n    ${new Array(16).fill(0).map((e,t)=>`--g-${t+1}: ${(t+1)*4}px;`).join(`\n`)}\n  }\n\n  ${new Array(49).fill(0).map((e,t)=>{let n=t-24,r=n<0?`n${Math.abs(n)}`:n.toString();return`\n        .layout-p-${r} { --padding: ${n*4}px; padding: var(--padding); }\n        .layout-pt-${r} { padding-top: ${n*4}px; }\n        .layout-pr-${r} { padding-right: ${n*4}px; }\n        .layout-pb-${r} { padding-bottom: ${n*4}px; }\n        .layout-pl-${r} { padding-left: ${n*4}px; }\n\n        .layout-m-${r} { --margin: ${n*4}px; margin: var(--margin); }\n        .layout-mt-${r} { margin-top: ${n*4}px; }\n        .layout-mr-${r} { margin-right: ${n*4}px; }\n        .layout-mb-${r} { margin-bottom: ${n*4}px; }\n        .layout-ml-${r} { margin-left: ${n*4}px; }\n\n        .layout-t-${r} { top: ${n*4}px; }\n        .layout-r-${r} { right: ${n*4}px; }\n        .layout-b-${r} { bottom: ${n*4}px; }\n        .layout-l-${r} { left: ${n*4}px; }`}).join(`\n`)}\n\n  ${new Array(25).fill(0).map((e,t)=>`\n        .layout-g-${t} { gap: ${t*4}px; }`).join(`\n`)}\n\n  ${new Array(8).fill(0).map((e,t)=>`\n        .layout-grd-col${t+1} { grid-template-columns: ${\"1fr \".repeat(t+1).trim()}; }`).join(`\n`)}\n\n  .layout-pos-a {\n    position: absolute;\n  }\n\n  .layout-pos-rel {\n    position: relative;\n  }\n\n  .layout-dsp-none {\n    display: none;\n  }\n\n  .layout-dsp-block {\n    display: block;\n  }\n\n  .layout-dsp-grid {\n    display: grid;\n  }\n\n  .layout-dsp-iflex {\n    display: inline-flex;\n  }\n\n  .layout-dsp-flexvert {\n    display: flex;\n    flex-direction: column;\n  }\n\n  .layout-dsp-flexhor {\n    display: flex;\n    flex-direction: row;\n  }\n\n  .layout-fw-w {\n    flex-wrap: wrap;\n  }\n\n  .layout-al-fs {\n    align-items: start;\n  }\n\n  .layout-al-fe {\n    align-items: end;\n  }\n\n  .layout-al-c {\n    align-items: center;\n  }\n\n  .layout-as-n {\n    align-self: normal;\n  }\n\n  .layout-js-c {\n    justify-self: center;\n  }\n\n  .layout-sp-c {\n    justify-content: center;\n  }\n\n  .layout-sp-ev {\n    justify-content: space-evenly;\n  }\n\n  .layout-sp-bt {\n    justify-content: space-between;\n  }\n\n  .layout-sp-s {\n    justify-content: start;\n  }\n\n  .layout-sp-e {\n    justify-content: end;\n  }\n\n  .layout-ji-e {\n    justify-items: end;\n  }\n\n  .layout-r-none {\n    resize: none;\n  }\n\n  .layout-fs-c {\n    field-sizing: content;\n  }\n\n  .layout-fs-n {\n    field-sizing: none;\n  }\n\n  .layout-flx-0 {\n    flex: 0 0 auto;\n  }\n\n  .layout-flx-1 {\n    flex: 1 0 auto;\n  }\n\n  .layout-c-s {\n    contain: strict;\n  }\n\n  /** Widths **/\n\n  ${new Array(10).fill(0).map((e,t)=>{let n=(t+1)*10;return`.layout-w-${n} { width: ${n}%; max-width: ${n}%; }`}).join(`\n`)}\n\n  ${new Array(16).fill(0).map((e,t)=>{let n=t*4;return`.layout-wp-${t} { width: ${n}px; }`}).join(`\n`)}\n\n  /** Heights **/\n\n  ${new Array(10).fill(0).map((e,t)=>{let n=(t+1)*10;return`.layout-h-${n} { height: ${n}%; }`}).join(`\n`)}\n\n  ${new Array(16).fill(0).map((e,t)=>{let n=t*4;return`.layout-hp-${t} { height: ${n}px; }`}).join(`\n`)}\n\n  .layout-el-cv {\n    & img,\n    & video {\n      width: 100%;\n      height: 100%;\n      object-fit: cover;\n      margin: 0;\n    }\n  }\n\n  .layout-ar-sq {\n    aspect-ratio: 1 / 1;\n  }\n\n  .layout-ex-fb {\n    margin: calc(var(--padding) * -1) 0 0 calc(var(--padding) * -1);\n    width: calc(100% + var(--padding) * 2);\n    height: calc(100% + var(--padding) * 2);\n  }\n`;var i1=`\n  ${new Array(21).fill(0).map((e,t)=>`.opacity-el-${t*5} { opacity: ${t/20}; }`).join(`\n`)}\n`;var s1=`\n  :host {\n    --default-font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n    --default-font-family-mono: \"Courier New\", Courier, monospace;\n  }\n\n  .typography-f-s {\n    font-family: var(--font-family, var(--default-font-family));\n    font-optical-sizing: auto;\n    font-variation-settings: \"slnt\" 0, \"wdth\" 100, \"GRAD\" 0;\n  }\n\n  .typography-f-sf {\n    font-family: var(--font-family-flex, var(--default-font-family));\n    font-optical-sizing: auto;\n  }\n\n  .typography-f-c {\n    font-family: var(--font-family-mono, var(--default-font-family));\n    font-optical-sizing: auto;\n    font-variation-settings: \"slnt\" 0, \"wdth\" 100, \"GRAD\" 0;\n  }\n\n  .typography-v-r {\n    font-variation-settings: \"slnt\" 0, \"wdth\" 100, \"GRAD\" 0, \"ROND\" 100;\n  }\n\n  .typography-ta-s {\n    text-align: start;\n  }\n\n  .typography-ta-c {\n    text-align: center;\n  }\n\n  .typography-fs-n {\n    font-style: normal;\n  }\n\n  .typography-fs-i {\n    font-style: italic;\n  }\n\n  .typography-sz-ls {\n    font-size: 11px;\n    line-height: 16px;\n  }\n\n  .typography-sz-lm {\n    font-size: 12px;\n    line-height: 16px;\n  }\n\n  .typography-sz-ll {\n    font-size: 14px;\n    line-height: 20px;\n  }\n\n  .typography-sz-bs {\n    font-size: 12px;\n    line-height: 16px;\n  }\n\n  .typography-sz-bm {\n    font-size: 14px;\n    line-height: 20px;\n  }\n\n  .typography-sz-bl {\n    font-size: 16px;\n    line-height: 24px;\n  }\n\n  .typography-sz-ts {\n    font-size: 14px;\n    line-height: 20px;\n  }\n\n  .typography-sz-tm {\n    font-size: 16px;\n    line-height: 24px;\n  }\n\n  .typography-sz-tl {\n    font-size: 22px;\n    line-height: 28px;\n  }\n\n  .typography-sz-hs {\n    font-size: 24px;\n    line-height: 32px;\n  }\n\n  .typography-sz-hm {\n    font-size: 28px;\n    line-height: 36px;\n  }\n\n  .typography-sz-hl {\n    font-size: 32px;\n    line-height: 40px;\n  }\n\n  .typography-sz-ds {\n    font-size: 36px;\n    line-height: 44px;\n  }\n\n  .typography-sz-dm {\n    font-size: 45px;\n    line-height: 52px;\n  }\n\n  .typography-sz-dl {\n    font-size: 57px;\n    line-height: 64px;\n  }\n\n  .typography-ws-p {\n    white-space: pre-line;\n  }\n\n  .typography-ws-nw {\n    white-space: nowrap;\n  }\n\n  .typography-td-none {\n    text-decoration: none;\n  }\n\n  /** Weights **/\n\n  ${new Array(9).fill(0).map((e,t)=>{let n=(t+1)*100;return`.typography-w-${n} { font-weight: ${n}; }`}).join(`\n`)}\n`;var f2=[e1,t1,n1,r1,o1,i1,s1].flat(1/0).join(`\n`);var Wf={};pr(Wf,{isComponentArrayReference:()=>Sf,isObject:()=>$,isPath:()=>Tf,isResolvedAudioPlayer:()=>Mf,isResolvedButton:()=>Af,isResolvedCard:()=>Nf,isResolvedCheckbox:()=>kf,isResolvedColumn:()=>Rf,isResolvedDateTimeInput:()=>Ff,isResolvedDivider:()=>Of,isResolvedIcon:()=>Lf,isResolvedImage:()=>Pf,isResolvedList:()=>jf,isResolvedModal:()=>Bf,isResolvedMultipleChoice:()=>Vf,isResolvedRow:()=>Hf,isResolvedSlider:()=>$f,isResolvedTabs:()=>Uf,isResolvedText:()=>zf,isResolvedTextField:()=>qf,isResolvedVideo:()=>Gf,isValueMap:()=>h2});function h2(e){return $(e)&&\"key\"in e}function Tf(e,t){return e===\"path\"&&typeof t==\"string\"}function $(e){return typeof e==\"object\"&&e!==null&&!Array.isArray(e)}function Sf(e){return $(e)?\"explicitList\"in e||\"template\"in e:!1}function Ut(e){return $(e)&&(\"path\"in e||\"literal\"in e&&typeof e.literal==\"string\"||\"literalString\"in e)}function g2(e){return $(e)&&(\"path\"in e||\"literal\"in e&&typeof e.literal==\"number\"||\"literalNumber\"in e)}function m2(e){return $(e)&&(\"path\"in e||\"literal\"in e&&typeof e.literal==\"boolean\"||\"literalBoolean\"in e)}function $t(e){return!(!$(e)||!(\"id\"in e&&\"type\"in e&&\"properties\"in e))}function Mf(e){return $(e)&&\"url\"in e&&Ut(e.url)}function Af(e){return $(e)&&\"child\"in e&&$t(e.child)&&\"action\"in e}function Nf(e){return $(e)?\"child\"in e?$t(e.child):\"children\"in e?Array.isArray(e.children)&&e.children.every($t):!1:!1}function kf(e){return $(e)&&\"label\"in e&&Ut(e.label)&&\"value\"in e&&m2(e.value)}function Rf(e){return $(e)&&\"children\"in e&&Array.isArray(e.children)&&e.children.every($t)}function Ff(e){return $(e)&&\"value\"in e&&Ut(e.value)}function Of(e){return $(e)}function Pf(e){return $(e)&&\"url\"in e&&Ut(e.url)}function Lf(e){return $(e)&&\"name\"in e&&Ut(e.name)}function jf(e){return $(e)&&\"children\"in e&&Array.isArray(e.children)&&e.children.every($t)}function Bf(e){return $(e)&&\"entryPointChild\"in e&&$t(e.entryPointChild)&&\"contentChild\"in e&&$t(e.contentChild)}function Vf(e){return $(e)&&\"selections\"in e}function Hf(e){return $(e)&&\"children\"in e&&Array.isArray(e.children)&&e.children.every($t)}function $f(e){return $(e)&&\"value\"in e&&g2(e.value)}function y2(e){return $(e)&&\"title\"in e&&Ut(e.title)&&\"child\"in e&&$t(e.child)}function Uf(e){return $(e)&&\"tabItems\"in e&&Array.isArray(e.tabItems)&&e.tabItems.every(y2)}function zf(e){return $(e)&&\"text\"in e&&Ut(e.text)}function qf(e){return $(e)&&\"label\"in e&&Ut(e.label)}function Gf(e){return $(e)&&\"url\"in e&&Ut(e.url)}var ta=(()=>{class e{static{this.DEFAULT_SURFACE_ID=\"@default\"}constructor(n={mapCtor:Map,arrayCtor:Array,setCtor:Set,objCtor:Object}){this.opts=n,this.mapCtor=Map,this.arrayCtor=Array,this.setCtor=Set,this.objCtor=Object,this.arrayCtor=n.arrayCtor,this.mapCtor=n.mapCtor,this.setCtor=n.setCtor,this.objCtor=n.objCtor,this.surfaces=new n.mapCtor}getSurfaces(){return this.surfaces}clearSurfaces(){this.surfaces.clear()}processMessages(n){for(let r of n)r.beginRendering&&this.handleBeginRendering(r.beginRendering,r.beginRendering.surfaceId),r.surfaceUpdate&&this.handleSurfaceUpdate(r.surfaceUpdate,r.surfaceUpdate.surfaceId),r.dataModelUpdate&&this.handleDataModelUpdate(r.dataModelUpdate,r.dataModelUpdate.surfaceId),r.deleteSurface&&this.handleDeleteSurface(r.deleteSurface)}getData(n,r,o=e.DEFAULT_SURFACE_ID){let i=this.getOrCreateSurface(o);if(!i)return null;let s;return r===\".\"||r===\"\"?s=n.dataContextPath??\"/\":s=this.resolvePath(r,n.dataContextPath),this.getDataByPath(i.dataModel,s)}setData(n,r,o,i=e.DEFAULT_SURFACE_ID){if(!n){console.warn(\"No component node set\");return}let s=this.getOrCreateSurface(i);if(!s)return;let u;r===\".\"||r===\"\"?u=n.dataContextPath??\"/\":u=this.resolvePath(r,n.dataContextPath),this.setDataByPath(s.dataModel,u,o)}resolvePath(n,r){return n.startsWith(\"/\")?n:r&&r!==\"/\"?r.endsWith(\"/\")?`${r}${n}`:`${r}/${n}`:`/${n}`}parseIfJsonString(n){if(typeof n!=\"string\")return n;let r=n.trim();if(r.startsWith(\"{\")&&r.endsWith(\"}\")||r.startsWith(\"[\")&&r.endsWith(\"]\"))try{return JSON.parse(n)}catch(o){return console.warn(`Failed to parse potential JSON string: \"${n.substring(0,50)}...\"`,o),n}return n}convertKeyValueArrayToMap(n){let r=new this.mapCtor;for(let o of n){if(!$(o)||!(\"key\"in o))continue;let i=o.key,s=this.findValueKey(o);if(!s)continue;let u=o[s];s===\"valueMap\"&&Array.isArray(u)?u=this.convertKeyValueArrayToMap(u):typeof u==\"string\"&&(u=this.parseIfJsonString(u)),this.setDataByPath(r,i,u)}return r}setDataByPath(n,r,o){if(Array.isArray(o)&&(o.length===0||$(o[0])&&\"key\"in o[0]))if(o.length===1&&$(o[0])&&o[0].key===\".\"){let c=o[0],l=this.findValueKey(c);l?(o=c[l],l===\"valueMap\"&&Array.isArray(o)?o=this.convertKeyValueArrayToMap(o):typeof o==\"string\"&&(o=this.parseIfJsonString(o))):o=this.convertKeyValueArrayToMap(o)}else o=this.convertKeyValueArrayToMap(o);let i=this.normalizePath(r).split(\"/\").filter(c=>c);if(i.length===0){if(o instanceof Map||$(o)){!(o instanceof Map)&&$(o)&&(o=new this.mapCtor(Object.entries(o))),n.clear();for(let[c,l]of o.entries())n.set(c,l)}else console.error(\"Cannot set root of DataModel to a non-Map value.\");return}let s=n;for(let c=0;c<i.length-1;c++){let l=i[c],d;s instanceof Map?d=s.get(l):Array.isArray(s)&&/^\\d+$/.test(l)&&(d=s[parseInt(l,10)]),(d===void 0||typeof d!=\"object\"||d===null)&&(d=new this.mapCtor,s instanceof this.mapCtor?s.set(l,d):Array.isArray(s)&&(s[parseInt(l,10)]=d)),s=d}let u=i[i.length-1],a=o;s instanceof this.mapCtor?s.set(u,a):Array.isArray(s)&&/^\\d+$/.test(u)&&(s[parseInt(u,10)]=a)}normalizePath(n){return\"/\"+n.replace(/\\[(\\d+)\\]/g,\".$1\").split(\".\").filter(i=>i.length>0).join(\"/\")}getDataByPath(n,r){let o=this.normalizePath(r).split(\"/\").filter(s=>s),i=n;for(let s of o){if(i==null)return null;if(i instanceof Map)i=i.get(s);else if(Array.isArray(i)&&/^\\d+$/.test(s))i=i[parseInt(s,10)];else if($(i))i=i[s];else return null}return i}getOrCreateSurface(n){let r=this.surfaces.get(n);return r||(r=new this.objCtor({rootComponentId:null,componentTree:null,dataModel:new this.mapCtor,components:new this.mapCtor,styles:new this.objCtor}),this.surfaces.set(n,r)),r}handleBeginRendering(n,r){let o=this.getOrCreateSurface(r);o.rootComponentId=n.root,o.styles=n.styles??{},this.rebuildComponentTree(o)}handleSurfaceUpdate(n,r){let o=this.getOrCreateSurface(r);for(let i of n.components)o.components.set(i.id,i);this.rebuildComponentTree(o)}handleDataModelUpdate(n,r){let o=this.getOrCreateSurface(r),i=n.path??\"/\";this.setDataByPath(o.dataModel,i,n.contents),this.rebuildComponentTree(o)}handleDeleteSurface(n){this.surfaces.delete(n.surfaceId)}rebuildComponentTree(n){if(!n.rootComponentId){n.componentTree=null;return}let r=new this.setCtor;n.componentTree=this.buildNodeRecursive(n.rootComponentId,n,r,\"/\",\"\")}findValueKey(n){return Object.keys(n).find(r=>r.startsWith(\"value\"))}buildNodeRecursive(n,r,o,i,s=\"\"){let u=`${n}${s}`,{components:a}=r;if(!a.has(n))return null;if(o.has(u))throw new Error(`Circular dependency for component \"${u}\".`);o.add(u);let c=a.get(n),l=c.component??{},d=Object.keys(l)[0],h=l[d],f=new this.objCtor;if($(h))for(let[m,g]of Object.entries(h))f[m]=this.resolvePropertyValue(g,r,o,i,s);o.delete(u);let p={id:u,dataContextPath:i,weight:c.weight??\"initial\"};switch(d){case\"Text\":if(!zf(f))throw new Error(`Invalid data; expected ${d}`);return new this.objCtor(P(M({},p),{type:\"Text\",properties:f}));case\"Image\":if(!Pf(f))throw new Error(`Invalid data; expected ${d}`);return new this.objCtor(P(M({},p),{type:\"Image\",properties:f}));case\"Icon\":if(!Lf(f))throw new Error(`Invalid data; expected ${d}`);return new this.objCtor(P(M({},p),{type:\"Icon\",properties:f}));case\"Video\":if(!Gf(f))throw new Error(`Invalid data; expected ${d}`);return new this.objCtor(P(M({},p),{type:\"Video\",properties:f}));case\"AudioPlayer\":if(!Mf(f))throw new Error(`Invalid data; expected ${d}`);return new this.objCtor(P(M({},p),{type:\"AudioPlayer\",properties:f}));case\"Row\":if(!Hf(f))throw new Error(`Invalid data; expected ${d}`);return new this.objCtor(P(M({},p),{type:\"Row\",properties:f}));case\"Column\":if(!Rf(f))throw new Error(`Invalid data; expected ${d}`);return new this.objCtor(P(M({},p),{type:\"Column\",properties:f}));case\"List\":if(!jf(f))throw new Error(`Invalid data; expected ${d}`);return new this.objCtor(P(M({},p),{type:\"List\",properties:f}));case\"Card\":if(!Nf(f))throw new Error(`Invalid data; expected ${d}`);return new this.objCtor(P(M({},p),{type:\"Card\",properties:f}));case\"Tabs\":if(!Uf(f))throw new Error(`Invalid data; expected ${d}`);return new this.objCtor(P(M({},p),{type:\"Tabs\",properties:f}));case\"Divider\":if(!Of(f))throw new Error(`Invalid data; expected ${d}`);return new this.objCtor(P(M({},p),{type:\"Divider\",properties:f}));case\"Modal\":if(!Bf(f))throw new Error(`Invalid data; expected ${d}`);return new this.objCtor(P(M({},p),{type:\"Modal\",properties:f}));case\"Button\":if(!Af(f))throw new Error(`Invalid data; expected ${d}`);return new this.objCtor(P(M({},p),{type:\"Button\",properties:f}));case\"CheckBox\":if(!kf(f))throw new Error(`Invalid data; expected ${d}`);return new this.objCtor(P(M({},p),{type:\"CheckBox\",properties:f}));case\"TextField\":if(!qf(f))throw new Error(`Invalid data; expected ${d}`);return new this.objCtor(P(M({},p),{type:\"TextField\",properties:f}));case\"DateTimeInput\":if(!Ff(f))throw new Error(`Invalid data; expected ${d}`);return new this.objCtor(P(M({},p),{type:\"DateTimeInput\",properties:f}));case\"MultipleChoice\":if(!Vf(f))throw new Error(`Invalid data; expected ${d}`);return new this.objCtor(P(M({},p),{type:\"MultipleChoice\",properties:f}));case\"Slider\":if(!$f(f))throw new Error(`Invalid data; expected ${d}`);return new this.objCtor(P(M({},p),{type:\"Slider\",properties:f}));default:return new this.objCtor(P(M({},p),{type:d,properties:f}))}}resolvePropertyValue(n,r,o,i,s=\"\"){if(typeof n==\"string\"&&r.components.has(n))return this.buildNodeRecursive(n,r,o,i,s);if(Sf(n)){if(n.explicitList)return n.explicitList.map(u=>this.buildNodeRecursive(u,r,o,i,s));if(n.template){let u=this.resolvePath(n.template.dataBinding,i),a=this.getDataByPath(r.dataModel,u),c=n.template;if(Array.isArray(a))return a.map((d,h)=>{let m=`:${[...i.split(\"/\").filter(y=>/^\\d+$/.test(y)),h].join(\":\")}`,g=`${u}/${h}`;return this.buildNodeRecursive(c.componentId,r,o,g,m)});let l=this.mapCtor;return a instanceof l?Array.from(a.keys(),d=>{let h=`:${d}`,f=`${u}/${d}`;return this.buildNodeRecursive(c.componentId,r,o,f,h)}):new this.arrayCtor}}if(Array.isArray(n))return n.map(u=>this.resolvePropertyValue(u,r,o,i,s));if($(n)){let u=new this.objCtor;for(let[a,c]of Object.entries(n)){let l=c;if(Tf(a,c)&&i!==\"/\"){l=c.replace(/^\\.?\\/item/,\"\").replace(/^\\.?\\/text/,\"\").replace(/^\\.?\\/label/,\"\").replace(/^\\.?\\//,\"\"),u[a]=l;continue}u[a]=this.resolvePropertyValue(l,r,o,i,s)}return u}return n}}return e})();var b2=Object.defineProperty,v2=(e,t,n)=>t in e?b2(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,Zf=(e,t,n)=>(v2(e,typeof t!=\"symbol\"?t+\"\":t,n),n),D2=(e,t,n)=>{if(!t.has(e))throw TypeError(\"Cannot \"+n)},Yf=(e,t)=>{if(Object(t)!==t)throw TypeError('Cannot use the \"in\" operator on this value');return e.has(t)},na=(e,t,n)=>{if(t.has(e))throw TypeError(\"Cannot add the same private member more than once\");t instanceof WeakSet?t.add(e):t.set(e,n)},u1=(e,t,n)=>(D2(e,t,\"access private method\"),n);function a1(e,t){return Object.is(e,t)}var ie=null,Di=!1,ra=1,oa=Symbol(\"SIGNAL\");function oo(e){let t=ie;return ie=e,t}function E2(){return ie}function C2(){return Di}var ep={version:0,lastCleanEpoch:0,dirty:!1,producerNode:void 0,producerLastReadVersion:void 0,producerIndexOfThis:void 0,nextProducerIndex:0,liveConsumerNode:void 0,liveConsumerIndexOfThis:void 0,consumerAllowSignalWrites:!1,consumerIsAlwaysLive:!1,producerMustRecompute:()=>!1,producerRecomputeValue:()=>{},consumerMarkedDirty:()=>{},consumerOnSignalRead:()=>{}};function sa(e){if(Di)throw new Error(\"\");if(ie===null)return;ie.consumerOnSignalRead(e);let t=ie.nextProducerIndex++;if(io(ie),t<ie.producerNode.length&&ie.producerNode[t]!==e&&Jf(ie)){let n=ie.producerNode[t];ua(n,ie.producerIndexOfThis[t])}ie.producerNode[t]!==e&&(ie.producerNode[t]=e,ie.producerIndexOfThis[t]=Jf(ie)?d1(e,ie,t):0),ie.producerLastReadVersion[t]=e.version}function _2(){ra++}function c1(e){if(!(!e.dirty&&e.lastCleanEpoch===ra)){if(!e.producerMustRecompute(e)&&!S2(e)){e.dirty=!1,e.lastCleanEpoch=ra;return}e.producerRecomputeValue(e),e.dirty=!1,e.lastCleanEpoch=ra}}function l1(e){if(e.liveConsumerNode===void 0)return;let t=Di;Di=!0;try{for(let n of e.liveConsumerNode)n.dirty||x2(n)}finally{Di=t}}function w2(){return ie?.consumerAllowSignalWrites!==!1}function x2(e){var t;e.dirty=!0,l1(e),(t=e.consumerMarkedDirty)==null||t.call(e.wrapper??e)}function I2(e){return e&&(e.nextProducerIndex=0),oo(e)}function T2(e,t){if(oo(t),!(!e||e.producerNode===void 0||e.producerIndexOfThis===void 0||e.producerLastReadVersion===void 0)){if(Jf(e))for(let n=e.nextProducerIndex;n<e.producerNode.length;n++)ua(e.producerNode[n],e.producerIndexOfThis[n]);for(;e.producerNode.length>e.nextProducerIndex;)e.producerNode.pop(),e.producerLastReadVersion.pop(),e.producerIndexOfThis.pop()}}function S2(e){io(e);for(let t=0;t<e.producerNode.length;t++){let n=e.producerNode[t],r=e.producerLastReadVersion[t];if(r!==n.version||(c1(n),r!==n.version))return!0}return!1}function d1(e,t,n){var r;if(tp(e),io(e),e.liveConsumerNode.length===0){(r=e.watched)==null||r.call(e.wrapper);for(let o=0;o<e.producerNode.length;o++)e.producerIndexOfThis[o]=d1(e.producerNode[o],e,o)}return e.liveConsumerIndexOfThis.push(n),e.liveConsumerNode.push(t)-1}function ua(e,t){var n;if(tp(e),io(e),e.liveConsumerNode.length===1){(n=e.unwatched)==null||n.call(e.wrapper);for(let o=0;o<e.producerNode.length;o++)ua(e.producerNode[o],e.producerIndexOfThis[o])}let r=e.liveConsumerNode.length-1;if(e.liveConsumerNode[t]=e.liveConsumerNode[r],e.liveConsumerIndexOfThis[t]=e.liveConsumerIndexOfThis[r],e.liveConsumerNode.length--,e.liveConsumerIndexOfThis.length--,t<e.liveConsumerNode.length){let o=e.liveConsumerIndexOfThis[t],i=e.liveConsumerNode[t];io(i),i.producerIndexOfThis[o]=t}}function Jf(e){var t;return e.consumerIsAlwaysLive||(((t=e?.liveConsumerNode)==null?void 0:t.length)??0)>0}function io(e){e.producerNode??(e.producerNode=[]),e.producerIndexOfThis??(e.producerIndexOfThis=[]),e.producerLastReadVersion??(e.producerLastReadVersion=[])}function tp(e){e.liveConsumerNode??(e.liveConsumerNode=[]),e.liveConsumerIndexOfThis??(e.liveConsumerIndexOfThis=[])}function f1(e){if(c1(e),sa(e),e.value===Xf)throw e.error;return e.value}function M2(e){let t=Object.create(A2);t.computation=e;let n=()=>f1(t);return n[oa]=t,n}var Qf=Symbol(\"UNSET\"),Kf=Symbol(\"COMPUTING\"),Xf=Symbol(\"ERRORED\"),A2=P(M({},ep),{value:Qf,dirty:!0,error:null,equal:a1,producerMustRecompute(e){return e.value===Qf||e.value===Kf},producerRecomputeValue(e){if(e.value===Kf)throw new Error(\"Detected cycle in computations.\");let t=e.value;e.value=Kf;let n=I2(e),r,o=!1;try{r=e.computation.call(e.wrapper),o=t!==Qf&&t!==Xf&&e.equal.call(e.wrapper,t,r)}catch(i){r=Xf,e.error=i}finally{T2(e,n)}if(o){e.value=t;return}e.value=r,e.version++}});function N2(){throw new Error}var k2=N2;function R2(){k2()}function F2(e){let t=Object.create(L2);t.value=e;let n=()=>(sa(t),t.value);return n[oa]=t,n}function O2(){return sa(this),this.value}function P2(e,t){w2()||R2(),e.equal.call(e.wrapper,e.value,t)||(e.value=t,j2(e))}var L2=P(M({},ep),{equal:a1,value:void 0});function j2(e){e.version++,_2(),l1(e)}var pe=Symbol(\"node\"),ia;(e=>{var t,n,r,o,i,s;class u{constructor(l,d={}){na(this,n),Zf(this,t);let f=F2(l)[oa];if(this[pe]=f,f.wrapper=this,d){let p=d.equals;p&&(f.equal=p),f.watched=d[e.subtle.watched],f.unwatched=d[e.subtle.unwatched]}}get(){if(!(0,e.isState)(this))throw new TypeError(\"Wrong receiver type for Signal.State.prototype.get\");return O2.call(this[pe])}set(l){if(!(0,e.isState)(this))throw new TypeError(\"Wrong receiver type for Signal.State.prototype.set\");if(C2())throw new Error(\"Writes to signals not permitted during Watcher callback\");let d=this[pe];P2(d,l)}}t=pe,n=new WeakSet,r=function(){},e.isState=c=>typeof c==\"object\"&&Yf(n,c),e.State=u;class a{constructor(l,d){na(this,i),Zf(this,o);let f=M2(l)[oa];if(f.consumerAllowSignalWrites=!0,this[pe]=f,f.wrapper=this,d){let p=d.equals;p&&(f.equal=p),f.watched=d[e.subtle.watched],f.unwatched=d[e.subtle.unwatched]}}get(){if(!(0,e.isComputed)(this))throw new TypeError(\"Wrong receiver type for Signal.Computed.prototype.get\");return f1(this[pe])}}o=pe,i=new WeakSet,s=function(){},e.isComputed=c=>typeof c==\"object\"&&Yf(i,c),e.Computed=a,(c=>{var l,d,h,f,p;function m(E){let N,O=null;try{O=oo(null),N=E()}finally{oo(O)}return N}c.untrack=m;function g(E){var N;if(!(0,e.isComputed)(E)&&!(0,e.isWatcher)(E))throw new TypeError(\"Called introspectSources without a Computed or Watcher argument\");return((N=E[pe].producerNode)==null?void 0:N.map(O=>O.wrapper))??[]}c.introspectSources=g;function y(E){var N;if(!(0,e.isComputed)(E)&&!(0,e.isState)(E))throw new TypeError(\"Called introspectSinks without a Signal argument\");return((N=E[pe].liveConsumerNode)==null?void 0:N.map(O=>O.wrapper))??[]}c.introspectSinks=y;function v(E){if(!(0,e.isComputed)(E)&&!(0,e.isState)(E))throw new TypeError(\"Called hasSinks without a Signal argument\");let N=E[pe].liveConsumerNode;return N?N.length>0:!1}c.hasSinks=v;function w(E){if(!(0,e.isComputed)(E)&&!(0,e.isWatcher)(E))throw new TypeError(\"Called hasSources without a Computed or Watcher argument\");let N=E[pe].producerNode;return N?N.length>0:!1}c.hasSources=w;class D{constructor(N){na(this,d),na(this,f),Zf(this,l);let O=Object.create(ep);O.wrapper=this,O.consumerMarkedDirty=N,O.consumerIsAlwaysLive=!0,O.consumerAllowSignalWrites=!1,O.producerNode=[],this[pe]=O}watch(...N){if(!(0,e.isWatcher)(this))throw new TypeError(\"Called unwatch without Watcher receiver\");u1(this,f,p).call(this,N);let O=this[pe];O.dirty=!1;let J=oo(O);for(let ct of N)sa(ct[pe]);oo(J)}unwatch(...N){if(!(0,e.isWatcher)(this))throw new TypeError(\"Called unwatch without Watcher receiver\");u1(this,f,p).call(this,N);let O=this[pe];io(O);for(let J=O.producerNode.length-1;J>=0;J--)if(N.includes(O.producerNode[J].wrapper)){ua(O.producerNode[J],O.producerIndexOfThis[J]);let ct=O.producerNode.length-1;if(O.producerNode[J]=O.producerNode[ct],O.producerIndexOfThis[J]=O.producerIndexOfThis[ct],O.producerNode.length--,O.producerIndexOfThis.length--,O.nextProducerIndex--,J<O.producerNode.length){let yo=O.producerIndexOfThis[J],Pi=O.producerNode[J];tp(Pi),Pi.liveConsumerIndexOfThis[yo]=J}}}getPending(){if(!(0,e.isWatcher)(this))throw new TypeError(\"Called getPending without Watcher receiver\");return this[pe].producerNode.filter(O=>O.dirty).map(O=>O.wrapper)}}l=pe,d=new WeakSet,h=function(){},f=new WeakSet,p=function(E){for(let N of E)if(!(0,e.isComputed)(N)&&!(0,e.isState)(N))throw new TypeError(\"Called watch/unwatch without a Computed or State argument\")},e.isWatcher=E=>Yf(d,E),c.Watcher=D;function F(){var E;return(E=E2())==null?void 0:E.wrapper}c.currentComputed=F,c.watched=Symbol(\"watched\"),c.unwatched=Symbol(\"unwatched\")})(e.subtle||(e.subtle={}))})(ia||(ia={}));var qe=(e=null)=>new ia.State(e,{equals:()=>!1});var B2=new Set([Symbol.iterator,\"concat\",\"entries\",\"every\",\"filter\",\"find\",\"findIndex\",\"flat\",\"flatMap\",\"forEach\",\"includes\",\"indexOf\",\"join\",\"keys\",\"lastIndexOf\",\"map\",\"reduce\",\"reduceRight\",\"slice\",\"some\",\"values\"]),V2=new Set([\"fill\",\"push\",\"unshift\"]);function p1(e){if(typeof e==\"symbol\")return null;let t=Number(e);return isNaN(t)?null:t%1===0?t:null}var Ei=class e{static from(t,n,r){return n?new e(Array.from(t,n,r)):new e(Array.from(t))}static of(...t){return new e(t)}constructor(t=[]){let n=t.slice(),r=this,o=new Map,i=!1;return new Proxy(n,{get(s,u){let a=p1(u);if(a!==null)return r.#n(a),r.#e.get(),s[a];if(u===\"length\")return i?i=!1:r.#e.get(),s[u];if(V2.has(u)&&(i=!0),B2.has(u)){let c=o.get(u);return c===void 0&&(c=(...l)=>(r.#e.get(),s[u](...l)),o.set(u,c)),c}return s[u]},set(s,u,a){s[u]=a;let c=p1(u);return c!==null?(r.#r(c),r.#e.set(null)):u===\"length\"&&r.#e.set(null),!0},getPrototypeOf(){return e.prototype}})}#e=qe();#t=new Map;#n(t){let n=this.#t.get(t);n===void 0&&(n=qe(),this.#t.set(t,n)),n.get()}#r(t){let n=this.#t.get(t);n&&n.set(null)}};Object.setPrototypeOf(Ei.prototype,Array.prototype);var Ci=class{collection=qe();storages=new Map;vals;readStorageFor(t){let{storages:n}=this,r=n.get(t);r===void 0&&(r=qe(),n.set(t,r)),r.get()}dirtyStorageFor(t){let n=this.storages.get(t);n&&n.set(null)}constructor(t){this.vals=t?new Map(t):new Map}get(t){return this.readStorageFor(t),this.vals.get(t)}has(t){return this.readStorageFor(t),this.vals.has(t)}entries(){return this.collection.get(),this.vals.entries()}keys(){return this.collection.get(),this.vals.keys()}values(){return this.collection.get(),this.vals.values()}forEach(t){this.collection.get(),this.vals.forEach(t)}get size(){return this.collection.get(),this.vals.size}[Symbol.iterator](){return this.collection.get(),this.vals[Symbol.iterator]()}get[Symbol.toStringTag](){return this.vals[Symbol.toStringTag]}set(t,n){return this.dirtyStorageFor(t),this.collection.set(null),this.vals.set(t,n),this}delete(t){return this.dirtyStorageFor(t),this.collection.set(null),this.vals.delete(t)}clear(){this.storages.forEach(t=>t.set(null)),this.collection.set(null),this.vals.clear()}};Object.setPrototypeOf(Ci.prototype,Map.prototype);var np=class e{static fromEntries(t){return new e(Object.fromEntries(t))}#e=new Map;#t=qe();constructor(t={}){let n=Object.getPrototypeOf(t),r=Object.getOwnPropertyDescriptors(t),o=Object.create(n);for(let s in r)Object.defineProperty(o,s,r[s]);let i=this;return new Proxy(o,{get(s,u,a){return i.#n(u),Reflect.get(s,u,a)},has(s,u){return i.#n(u),u in s},ownKeys(s){return i.#t.get(),Reflect.ownKeys(s)},set(s,u,a,c){let l=Reflect.set(s,u,a,c);return i.#r(u),i.#o(),l},deleteProperty(s,u){return u in s&&(delete s[u],i.#r(u),i.#o()),!0},getPrototypeOf(){return e.prototype}})}#n(t){let n=this.#e.get(t);n===void 0&&(n=qe(),this.#e.set(t,n)),n.get()}#r(t){let n=this.#e.get(t);n&&n.set(null)}#o(){this.#t.set(null)}},h1=np;var _i=class{collection=qe();storages=new Map;vals;storageFor(t){let n=this.storages,r=n.get(t);return r===void 0&&(r=qe(),n.set(t,r)),r}dirtyStorageFor(t){let n=this.storages.get(t);n&&n.set(null)}constructor(t){this.vals=new Set(t)}has(t){return this.storageFor(t).get(),this.vals.has(t)}entries(){return this.collection.get(),this.vals.entries()}keys(){return this.collection.get(),this.vals.keys()}values(){return this.collection.get(),this.vals.values()}forEach(t){this.collection.get(),this.vals.forEach(t)}get size(){return this.collection.get(),this.vals.size}[Symbol.iterator](){return this.collection.get(),this.vals[Symbol.iterator]()}get[Symbol.toStringTag](){return this.vals[Symbol.toStringTag]}add(t){return this.dirtyStorageFor(t),this.collection.set(null),this.vals.add(t),this}delete(t){return this.dirtyStorageFor(t),this.collection.set(null),this.vals.delete(t)}clear(){this.storages.forEach(t=>t.set(null)),this.collection.set(null),this.vals.clear()}};Object.setPrototypeOf(_i.prototype,Set.prototype);function g1(){return new ta({arrayCtor:Ei,mapCtor:Ci,objCtor:h1,setCtor:_i})}var m1={createSignalA2uiMessageProcessor:g1,A2uiMessageProcessor:ta,Guards:Wf};var y1=null;function _t(){return y1}function rp(e){y1??=e}var wi=class{},Dn=(()=>{class e{historyGo(n){throw new Error(\"\")}static \\u0275fac=function(r){return new(r||e)};static \\u0275prov=T({token:e,factory:()=>b(b1),providedIn:\"platform\"})}return e})(),H2=new x(\"\"),b1=(()=>{class e extends Dn{_location;_history;_doc=b(K);constructor(){super(),this._location=window.location,this._history=window.history}getBaseHrefFromDOM(){return _t().getBaseHref(this._doc)}onPopState(n){let r=_t().getGlobalEventTarget(this._doc,\"window\");return r.addEventListener(\"popstate\",n,!1),()=>r.removeEventListener(\"popstate\",n)}onHashChange(n){let r=_t().getGlobalEventTarget(this._doc,\"window\");return r.addEventListener(\"hashchange\",n,!1),()=>r.removeEventListener(\"hashchange\",n)}get href(){return this._location.href}get protocol(){return this._location.protocol}get hostname(){return this._location.hostname}get port(){return this._location.port}get pathname(){return this._location.pathname}get search(){return this._location.search}get hash(){return this._location.hash}set pathname(n){this._location.pathname=n}pushState(n,r,o){this._history.pushState(n,r,o)}replaceState(n,r,o){this._history.replaceState(n,r,o)}forward(){this._history.forward()}back(){this._history.back()}historyGo(n=0){this._history.go(n)}getState(){return this._history.state}static \\u0275fac=function(r){return new(r||e)};static \\u0275prov=T({token:e,factory:()=>new e,providedIn:\"platform\"})}return e})();function aa(e,t){return e?t?e.endsWith(\"/\")?t.startsWith(\"/\")?e+t.slice(1):e+t:t.startsWith(\"/\")?e+t:`${e}/${t}`:e:t}function v1(e){let t=e.search(/#|\\?|$/);return e[t-1]===\"/\"?e.slice(0,t-1)+e.slice(t):e}function ut(e){return e&&e[0]!==\"?\"?`?${e}`:e}var so=(()=>{class e{historyGo(n){throw new Error(\"\")}static \\u0275fac=function(r){return new(r||e)};static \\u0275prov=T({token:e,factory:()=>b(E1),providedIn:\"root\"})}return e})(),ca=new x(\"\"),E1=(()=>{class e extends so{_platformLocation;_baseHref;_removeListenerFns=[];constructor(n,r){super(),this._platformLocation=n,this._baseHref=r??this._platformLocation.getBaseHrefFromDOM()??b(K).location?.origin??\"\"}ngOnDestroy(){for(;this._removeListenerFns.length;)this._removeListenerFns.pop()()}onPopState(n){this._removeListenerFns.push(this._platformLocation.onPopState(n),this._platformLocation.onHashChange(n))}getBaseHref(){return this._baseHref}prepareExternalUrl(n){return aa(this._baseHref,n)}path(n=!1){let r=this._platformLocation.pathname+ut(this._platformLocation.search),o=this._platformLocation.hash;return o&&n?`${r}${o}`:r}pushState(n,r,o,i){let s=this.prepareExternalUrl(o+ut(i));this._platformLocation.pushState(n,r,s)}replaceState(n,r,o,i){let s=this.prepareExternalUrl(o+ut(i));this._platformLocation.replaceState(n,r,s)}forward(){this._platformLocation.forward()}back(){this._platformLocation.back()}getState(){return this._platformLocation.getState()}historyGo(n=0){this._platformLocation.historyGo?.(n)}static \\u0275fac=function(r){return new(r||e)(A(Dn),A(ca,8))};static \\u0275prov=T({token:e,factory:e.\\u0275fac,providedIn:\"root\"})}return e})();var C1=(()=>{class e{_subject=new ce;_basePath;_locationStrategy;_urlChangeListeners=[];_urlChangeSubscription=null;constructor(n){this._locationStrategy=n;let r=this._locationStrategy.getBaseHref();this._basePath=z2(v1(D1(r))),this._locationStrategy.onPopState(o=>{this._subject.next({url:this.path(!0),pop:!0,state:o.state,type:o.type})})}ngOnDestroy(){this._urlChangeSubscription?.unsubscribe(),this._urlChangeListeners=[]}path(n=!1){return this.normalize(this._locationStrategy.path(n))}getState(){return this._locationStrategy.getState()}isCurrentPathEqualTo(n,r=\"\"){return this.path()==this.normalize(n+ut(r))}normalize(n){return e.stripTrailingSlash(U2(this._basePath,D1(n)))}prepareExternalUrl(n){return n&&n[0]!==\"/\"&&(n=\"/\"+n),this._locationStrategy.prepareExternalUrl(n)}go(n,r=\"\",o=null){this._locationStrategy.pushState(o,\"\",n,r),this._notifyUrlChangeListeners(this.prepareExternalUrl(n+ut(r)),o)}replaceState(n,r=\"\",o=null){this._locationStrategy.replaceState(o,\"\",n,r),this._notifyUrlChangeListeners(this.prepareExternalUrl(n+ut(r)),o)}forward(){this._locationStrategy.forward()}back(){this._locationStrategy.back()}historyGo(n=0){this._locationStrategy.historyGo?.(n)}onUrlChange(n){return this._urlChangeListeners.push(n),this._urlChangeSubscription??=this.subscribe(r=>{this._notifyUrlChangeListeners(r.url,r.state)}),()=>{let r=this._urlChangeListeners.indexOf(n);this._urlChangeListeners.splice(r,1),this._urlChangeListeners.length===0&&(this._urlChangeSubscription?.unsubscribe(),this._urlChangeSubscription=null)}}_notifyUrlChangeListeners(n=\"\",r){this._urlChangeListeners.forEach(o=>o(n,r))}subscribe(n,r,o){return this._subject.subscribe({next:n,error:r??void 0,complete:o??void 0})}static normalizeQueryParams=ut;static joinWithSlash=aa;static stripTrailingSlash=v1;static \\u0275fac=function(r){return new(r||e)(A(so))};static \\u0275prov=T({token:e,factory:()=>$2(),providedIn:\"root\"})}return e})();function $2(){return new C1(A(so))}function U2(e,t){if(!e||!t.startsWith(e))return t;let n=t.substring(e.length);return n===\"\"||[\"/\",\";\",\"?\",\"#\"].includes(n[0])?n:t}function D1(e){return e.replace(/\\/index.html$/,\"\")}function z2(e){if(new RegExp(\"^(https?:)?//\").test(e)){let[,n]=e.split(/\\/\\/[^\\/]+/);return n}return e}var q2=(()=>{class e extends so{_platformLocation;_baseHref=\"\";_removeListenerFns=[];constructor(n,r){super(),this._platformLocation=n,r!=null&&(this._baseHref=r)}ngOnDestroy(){for(;this._removeListenerFns.length;)this._removeListenerFns.pop()()}onPopState(n){this._removeListenerFns.push(this._platformLocation.onPopState(n),this._platformLocation.onHashChange(n))}getBaseHref(){return this._baseHref}path(n=!1){let r=this._platformLocation.hash??\"#\";return r.length>0?r.substring(1):r}prepareExternalUrl(n){let r=aa(this._baseHref,n);return r.length>0?\"#\"+r:r}pushState(n,r,o,i){let s=this.prepareExternalUrl(o+ut(i))||this._platformLocation.pathname;this._platformLocation.pushState(n,r,s)}replaceState(n,r,o,i){let s=this.prepareExternalUrl(o+ut(i))||this._platformLocation.pathname;this._platformLocation.replaceState(n,r,s)}forward(){this._platformLocation.forward()}back(){this._platformLocation.back()}getState(){return this._platformLocation.getState()}historyGo(n=0){this._platformLocation.historyGo?.(n)}static \\u0275fac=function(r){return new(r||e)(A(Dn),A(ca,8))};static \\u0275prov=T({token:e,factory:e.\\u0275fac})}return e})();var op=/\\s+/,_1=[],G2=(()=>{class e{_ngEl;_renderer;initialClasses=_1;rawClass;stateMap=new Map;constructor(n,r){this._ngEl=n,this._renderer=r}set klass(n){this.initialClasses=n!=null?n.trim().split(op):_1}set ngClass(n){this.rawClass=typeof n==\"string\"?n.trim().split(op):n}ngDoCheck(){for(let r of this.initialClasses)this._updateState(r,!0);let n=this.rawClass;if(Array.isArray(n)||n instanceof Set)for(let r of n)this._updateState(r,!0);else if(n!=null)for(let r of Object.keys(n))this._updateState(r,!!n[r]);this._applyStateDiff()}_updateState(n,r){let o=this.stateMap.get(n);o!==void 0?(o.enabled!==r&&(o.changed=!0,o.enabled=r),o.touched=!0):this.stateMap.set(n,{enabled:r,changed:!0,touched:!0})}_applyStateDiff(){for(let n of this.stateMap){let r=n[0],o=n[1];o.changed?(this._toggleClass(r,o.enabled),o.changed=!1):o.touched||(o.enabled&&this._toggleClass(r,!1),this.stateMap.delete(r)),o.touched=!1}}_toggleClass(n,r){n=n.trim(),n.length>0&&n.split(op).forEach(o=>{r?this._renderer.addClass(this._ngEl.nativeElement,o):this._renderer.removeClass(this._ngEl.nativeElement,o)})}static \\u0275fac=function(r){return new(r||e)(oe(jt),oe(pi))};static \\u0275dir=st({type:e,selectors:[[\"\",\"ngClass\",\"\"]],inputs:{klass:[0,\"class\",\"klass\"],ngClass:\"ngClass\"}})}return e})(),W2=(()=>{class e{_viewContainerRef;ngComponentOutlet=null;ngComponentOutletInputs;ngComponentOutletInjector;ngComponentOutletEnvironmentInjector;ngComponentOutletContent;ngComponentOutletNgModule;_componentRef;_moduleRef;_inputsUsed=new Map;get componentInstance(){return this._componentRef?.instance??null}constructor(n){this._viewContainerRef=n}_needToReCreateNgModuleInstance(n){return n.ngComponentOutletNgModule!==void 0}_needToReCreateComponentInstance(n){return n.ngComponentOutlet!==void 0||n.ngComponentOutletContent!==void 0||n.ngComponentOutletInjector!==void 0||n.ngComponentOutletEnvironmentInjector!==void 0||this._needToReCreateNgModuleInstance(n)}ngOnChanges(n){if(this._needToReCreateComponentInstance(n)&&(this._viewContainerRef.clear(),this._inputsUsed.clear(),this._componentRef=void 0,this.ngComponentOutlet)){let r=this.ngComponentOutletInjector||this._viewContainerRef.parentInjector;this._needToReCreateNgModuleInstance(n)&&(this._moduleRef?.destroy(),this.ngComponentOutletNgModule?this._moduleRef=Gd(this.ngComponentOutletNgModule,Z2(r)):this._moduleRef=void 0),this._componentRef=this._viewContainerRef.createComponent(this.ngComponentOutlet,{injector:r,ngModuleRef:this._moduleRef,projectableNodes:this.ngComponentOutletContent,environmentInjector:this.ngComponentOutletEnvironmentInjector})}}ngDoCheck(){if(this._componentRef){if(this.ngComponentOutletInputs)for(let n of Object.keys(this.ngComponentOutletInputs))this._inputsUsed.set(n,!0);this._applyInputStateDiff(this._componentRef)}}ngOnDestroy(){this._moduleRef?.destroy()}_applyInputStateDiff(n){for(let[r,o]of this._inputsUsed)o?(n.setInput(r,this.ngComponentOutletInputs[r]),this._inputsUsed.set(r,!1)):(n.setInput(r,void 0),this._inputsUsed.delete(r))}static \\u0275fac=function(r){return new(r||e)(oe(it))};static \\u0275dir=st({type:e,selectors:[[\"\",\"ngComponentOutlet\",\"\"]],inputs:{ngComponentOutlet:\"ngComponentOutlet\",ngComponentOutletInputs:\"ngComponentOutletInputs\",ngComponentOutletInjector:\"ngComponentOutletInjector\",ngComponentOutletEnvironmentInjector:\"ngComponentOutletEnvironmentInjector\",ngComponentOutletContent:\"ngComponentOutletContent\",ngComponentOutletNgModule:\"ngComponentOutletNgModule\"},exportAs:[\"ngComponentOutlet\"],features:[mu]})}return e})();function Z2(e){return e.get(bn).injector}var la=class{$implicit;ngForOf;index;count;constructor(t,n,r,o){this.$implicit=t,this.ngForOf=n,this.index=r,this.count=o}get first(){return this.index===0}get last(){return this.index===this.count-1}get even(){return this.index%2===0}get odd(){return!this.even}},T1=(()=>{class e{_viewContainer;_template;_differs;set ngForOf(n){this._ngForOf=n,this._ngForOfDirty=!0}set ngForTrackBy(n){this._trackByFn=n}get ngForTrackBy(){return this._trackByFn}_ngForOf=null;_ngForOfDirty=!0;_differ=null;_trackByFn;constructor(n,r,o){this._viewContainer=n,this._template=r,this._differs=o}set ngForTemplate(n){n&&(this._template=n)}ngDoCheck(){if(this._ngForOfDirty){this._ngForOfDirty=!1;let n=this._ngForOf;!this._differ&&n&&(this._differ=this._differs.find(n).create(this.ngForTrackBy))}if(this._differ){let n=this._differ.diff(this._ngForOf);n&&this._applyChanges(n)}}_applyChanges(n){let r=this._viewContainer;n.forEachOperation((o,i,s)=>{if(o.previousIndex==null)r.createEmbeddedView(this._template,new la(o.item,this._ngForOf,-1,-1),s===null?void 0:s);else if(s==null)r.remove(i===null?void 0:i);else if(i!==null){let u=r.get(i);r.move(u,s),w1(u,o)}});for(let o=0,i=r.length;o<i;o++){let u=r.get(o).context;u.index=o,u.count=i,u.ngForOf=this._ngForOf}n.forEachIdentityChange(o=>{let i=r.get(o.currentIndex);w1(i,o)})}static ngTemplateContextGuard(n,r){return!0}static \\u0275fac=function(r){return new(r||e)(oe(it),oe(mn),oe(wf))};static \\u0275dir=st({type:e,selectors:[[\"\",\"ngFor\",\"\",\"ngForOf\",\"\"]],inputs:{ngForOf:\"ngForOf\",ngForTrackBy:\"ngForTrackBy\",ngForTemplate:\"ngForTemplate\"}})}return e})();function w1(e,t){e.context.$implicit=t.item}var Y2=(()=>{class e{_viewContainer;_context=new da;_thenTemplateRef=null;_elseTemplateRef=null;_thenViewRef=null;_elseViewRef=null;constructor(n,r){this._viewContainer=n,this._thenTemplateRef=r}set ngIf(n){this._context.$implicit=this._context.ngIf=n,this._updateView()}set ngIfThen(n){x1(n,!1),this._thenTemplateRef=n,this._thenViewRef=null,this._updateView()}set ngIfElse(n){x1(n,!1),this._elseTemplateRef=n,this._elseViewRef=null,this._updateView()}_updateView(){this._context.$implicit?this._thenViewRef||(this._viewContainer.clear(),this._elseViewRef=null,this._thenTemplateRef&&(this._thenViewRef=this._viewContainer.createEmbeddedView(this._thenTemplateRef,this._context))):this._elseViewRef||(this._viewContainer.clear(),this._thenViewRef=null,this._elseTemplateRef&&(this._elseViewRef=this._viewContainer.createEmbeddedView(this._elseTemplateRef,this._context)))}static ngIfUseIfTypeGuard;static ngTemplateGuard_ngIf;static ngTemplateContextGuard(n,r){return!0}static \\u0275fac=function(r){return new(r||e)(oe(it),oe(mn))};static \\u0275dir=st({type:e,selectors:[[\"\",\"ngIf\",\"\"]],inputs:{ngIf:\"ngIf\",ngIfThen:\"ngIfThen\",ngIfElse:\"ngIfElse\"}})}return e})(),da=class{$implicit=null;ngIf=null};function x1(e,t){if(e&&!e.createEmbeddedView)throw new C(2020,!1)}var Q2=(()=>{class e{_ngEl;_differs;_renderer;_ngStyle=null;_differ=null;constructor(n,r,o){this._ngEl=n,this._differs=r,this._renderer=o}set ngStyle(n){this._ngStyle=n,!this._differ&&n&&(this._differ=this._differs.find(n).create())}ngDoCheck(){if(this._differ){let n=this._differ.diff(this._ngStyle);n&&this._applyChanges(n)}}_setStyle(n,r){let[o,i]=n.split(\".\"),s=o.indexOf(\"-\")===-1?void 0:rt.DashCase;r!=null?this._renderer.setStyle(this._ngEl.nativeElement,o,i?`${r}${i}`:r,s):this._renderer.removeStyle(this._ngEl.nativeElement,o,s)}_applyChanges(n){n.forEachRemovedItem(r=>this._setStyle(r.key,null)),n.forEachAddedItem(r=>this._setStyle(r.key,r.currentValue)),n.forEachChangedItem(r=>this._setStyle(r.key,r.currentValue))}static \\u0275fac=function(r){return new(r||e)(oe(jt),oe(ea),oe(pi))};static \\u0275dir=st({type:e,selectors:[[\"\",\"ngStyle\",\"\"]],inputs:{ngStyle:\"ngStyle\"}})}return e})(),K2=(()=>{class e{_viewContainerRef;_viewRef=null;ngTemplateOutletContext=null;ngTemplateOutlet=null;ngTemplateOutletInjector=null;injector=b(fe);constructor(n){this._viewContainerRef=n}ngOnChanges(n){if(this._shouldRecreateView(n)){let r=this._viewContainerRef;if(this._viewRef&&r.remove(r.indexOf(this._viewRef)),!this.ngTemplateOutlet){this._viewRef=null;return}let o=this._createContextForwardProxy();this._viewRef=r.createEmbeddedView(this.ngTemplateOutlet,o,{injector:this._getInjector()})}}_getInjector(){return this.ngTemplateOutletInjector===\"outlet\"?this.injector:this.ngTemplateOutletInjector??void 0}_shouldRecreateView(n){return!!n.ngTemplateOutlet||!!n.ngTemplateOutletInjector}_createContextForwardProxy(){return new Proxy({},{set:(n,r,o)=>this.ngTemplateOutletContext?Reflect.set(this.ngTemplateOutletContext,r,o):!1,get:(n,r,o)=>{if(this.ngTemplateOutletContext)return Reflect.get(this.ngTemplateOutletContext,r,o)}})}static \\u0275fac=function(r){return new(r||e)(oe(it))};static \\u0275dir=st({type:e,selectors:[[\"\",\"ngTemplateOutlet\",\"\"]],inputs:{ngTemplateOutletContext:\"ngTemplateOutletContext\",ngTemplateOutlet:\"ngTemplateOutlet\",ngTemplateOutletInjector:\"ngTemplateOutletInjector\"},features:[mu]})}return e})();function J2(e,t){return new C(2100,!1)}var ip=class{createSubscription(t,n,r){return De(()=>t.subscribe({next:n,error:r}))}dispose(t){De(()=>t.unsubscribe())}},sp=class{createSubscription(t,n,r){return t.then(o=>n?.(o),o=>r?.(o)),{unsubscribe:()=>{n=null,r=null}}}dispose(t){t.unsubscribe()}},X2=new sp,eT=new ip,tT=(()=>{class e{_ref;_latestValue=null;markForCheckOnValueUpdate=!0;_subscription=null;_obj=null;_strategy=null;applicationErrorHandler=b(Pt);constructor(n){this._ref=n}ngOnDestroy(){this._subscription&&this._dispose(),this._ref=null}transform(n){if(!this._obj){if(n)try{this.markForCheckOnValueUpdate=!1,this._subscribe(n)}finally{this.markForCheckOnValueUpdate=!0}return this._latestValue}return n!==this._obj?(this._dispose(),this.transform(n)):this._latestValue}_subscribe(n){this._obj=n,this._strategy=this._selectStrategy(n),this._subscription=this._strategy.createSubscription(n,r=>this._updateLatestValue(n,r),r=>this.applicationErrorHandler(r))}_selectStrategy(n){if(gi(n))return X2;if(Lu(n))return eT;throw J2(e,n)}_dispose(){this._strategy.dispose(this._subscription),this._latestValue=null,this._subscription=null,this._obj=null}_updateLatestValue(n,r){n===this._obj&&(this._latestValue=r,this.markForCheckOnValueUpdate&&this._ref?.markForCheck())}static \\u0275fac=function(r){return new(r||e)(oe(_f,16))};static \\u0275pipe=Fu({name:\"async\",type:e,pure:!1})}return e})();function nT(e,t){return{key:e,value:t}}var rT=(()=>{class e{differs;constructor(n){this.differs=n}differ;keyValues=[];compareFn=I1;transform(n,r=I1){if(!n||!(n instanceof Map)&&typeof n!=\"object\")return null;this.differ??=this.differs.find(n).create();let o=this.differ.diff(n),i=r!==this.compareFn;return o&&(this.keyValues=[],o.forEachItem(s=>{this.keyValues.push(nT(s.key,s.currentValue))})),(o||i)&&(r&&this.keyValues.sort(r),this.compareFn=r),this.keyValues}static \\u0275fac=function(r){return new(r||e)(oe(ea,16))};static \\u0275pipe=Fu({name:\"keyvalue\",type:e,pure:!1})}return e})();function I1(e,t){let n=e.key,r=t.key;if(n===r)return 0;if(n==null)return 1;if(r==null)return-1;if(typeof n==\"string\"&&typeof r==\"string\")return n<r?-1:1;if(typeof n==\"number\"&&typeof r==\"number\")return n-r;if(typeof n==\"boolean\"&&typeof r==\"boolean\")return n<r?-1:1;let o=String(n),i=String(r);return o==i?0:o<i?-1:1}var up=(()=>{class e{static \\u0275fac=function(r){return new(r||e)};static \\u0275mod=Ht({type:e});static \\u0275inj=yt({})}return e})();function xi(e,t){t=encodeURIComponent(t);for(let n of e.split(\";\")){let r=n.indexOf(\"=\"),[o,i]=r==-1?[n,\"\"]:[n.slice(0,r),n.slice(r+1)];if(o.trim()===t)return decodeURIComponent(i)}return null}var or=class{};var cp=\"browser\";function S1(e){return e===cp}var QV=(()=>{class e{static \\u0275prov=T({token:e,providedIn:\"root\",factory:()=>new ap(b(K),window)})}return e})(),ap=class{document;window;offset=()=>[0,0];constructor(t,n){this.document=t,this.window=n}setOffset(t){Array.isArray(t)?this.offset=()=>t:this.offset=t}getScrollPosition(){return[this.window.scrollX,this.window.scrollY]}scrollToPosition(t,n){this.window.scrollTo(P(M({},n),{left:t[0],top:t[1]}))}scrollToAnchor(t,n){let r=oT(this.document,t);r&&(this.scrollToElement(r,n),r.focus())}setHistoryScrollRestoration(t){try{this.window.history.scrollRestoration=t}catch(n){console.warn(mt(2400,!1))}}scrollToElement(t,n){let r=t.getBoundingClientRect(),o=r.left+this.window.pageXOffset,i=r.top+this.window.pageYOffset,s=this.offset();this.window.scrollTo(P(M({},n),{left:o-s[0],top:i-s[1]}))}};function oT(e,t){let n=e.getElementById(t)||e.getElementsByName(t)[0];if(n)return n;if(typeof e.createTreeWalker==\"function\"&&e.body&&typeof e.body.attachShadow==\"function\"){let r=e.createTreeWalker(e.body,NodeFilter.SHOW_ELEMENT),o=r.currentNode;for(;o;){let i=o.shadowRoot;if(i){let s=i.getElementById(t)||i.querySelector(`[name=\"${t}\"]`);if(s)return s}o=r.nextNode()}}return null}var Ii=class{_doc;constructor(t){this._doc=t}manager},fa=(()=>{class e extends Ii{constructor(n){super(n)}supports(n){return!0}addEventListener(n,r,o,i){return n.addEventListener(r,o,i),()=>this.removeEventListener(n,r,o,i)}removeEventListener(n,r,o,i){return n.removeEventListener(r,o,i)}static \\u0275fac=function(r){return new(r||e)(A(K))};static \\u0275prov=T({token:e,factory:e.\\u0275fac})}return e})(),ga=new x(\"\"),pp=(()=>{class e{_zone;_plugins;_eventNameToPlugin=new Map;constructor(n,r){this._zone=r,n.forEach(s=>{s.manager=this});let o=n.filter(s=>!(s instanceof fa));this._plugins=o.slice().reverse();let i=n.find(s=>s instanceof fa);i&&this._plugins.push(i)}addEventListener(n,r,o,i){return this._findPluginFor(r).addEventListener(n,r,o,i)}getZone(){return this._zone}_findPluginFor(n){let r=this._eventNameToPlugin.get(n);if(r)return r;if(r=this._plugins.find(i=>i.supports(n)),!r)throw new C(5101,!1);return this._eventNameToPlugin.set(n,r),r}static \\u0275fac=function(r){return new(r||e)(A(ga),A(be))};static \\u0275prov=T({token:e,factory:e.\\u0275fac})}return e})(),lp=\"ng-app-id\";function M1(e){for(let t of e)t.remove()}function A1(e,t){let n=t.createElement(\"style\");return n.textContent=e,n}function iT(e,t,n,r){let o=e.head?.querySelectorAll(`style[${lp}=\"${t}\"],link[${lp}=\"${t}\"]`);if(o)for(let i of o)i.removeAttribute(lp),i instanceof HTMLLinkElement?r.set(i.href.slice(i.href.lastIndexOf(\"/\")+1),{usage:0,elements:[i]}):i.textContent&&n.set(i.textContent,{usage:0,elements:[i]})}function fp(e,t){let n=t.createElement(\"link\");return n.setAttribute(\"rel\",\"stylesheet\"),n.setAttribute(\"href\",e),n}var hp=(()=>{class e{doc;appId;nonce;inline=new Map;external=new Map;hosts=new Set;constructor(n,r,o,i={}){this.doc=n,this.appId=r,this.nonce=o,iT(n,r,this.inline,this.external),this.hosts.add(n.head)}addStyles(n,r){for(let o of n)this.addUsage(o,this.inline,A1);r?.forEach(o=>this.addUsage(o,this.external,fp))}removeStyles(n,r){for(let o of n)this.removeUsage(o,this.inline);r?.forEach(o=>this.removeUsage(o,this.external))}addUsage(n,r,o){let i=r.get(n);i?i.usage++:r.set(n,{usage:1,elements:[...this.hosts].map(s=>this.addElement(s,o(n,this.doc)))})}removeUsage(n,r){let o=r.get(n);o&&(o.usage--,o.usage<=0&&(M1(o.elements),r.delete(n)))}ngOnDestroy(){for(let[,{elements:n}]of[...this.inline,...this.external])M1(n);this.hosts.clear()}addHost(n){this.hosts.add(n);for(let[r,{elements:o}]of this.inline)o.push(this.addElement(n,A1(r,this.doc)));for(let[r,{elements:o}]of this.external)o.push(this.addElement(n,fp(r,this.doc)))}removeHost(n){this.hosts.delete(n)}addElement(n,r){return this.nonce&&r.setAttribute(\"nonce\",this.nonce),n.appendChild(r)}static \\u0275fac=function(r){return new(r||e)(A(K),A(yu),A(vu,8),A(nr))};static \\u0275prov=T({token:e,factory:e.\\u0275fac})}return e})(),dp={svg:\"http://www.w3.org/2000/svg\",xhtml:\"http://www.w3.org/1999/xhtml\",xlink:\"http://www.w3.org/1999/xlink\",xml:\"http://www.w3.org/XML/1998/namespace\",xmlns:\"http://www.w3.org/2000/xmlns/\",math:\"http://www.w3.org/1998/Math/MathML\"},gp=/%COMP%/g;var k1=\"%COMP%\",sT=`_nghost-${k1}`,uT=`_ngcontent-${k1}`,aT=!0,cT=new x(\"\",{factory:()=>aT});function lT(e){return uT.replace(gp,e)}function dT(e){return sT.replace(gp,e)}function R1(e,t){return t.map(n=>n.replace(gp,e))}var mp=(()=>{class e{eventManager;sharedStylesHost;appId;removeStylesOnCompDestroy;doc;ngZone;nonce;tracingService;rendererByCompId=new Map;defaultRenderer;constructor(n,r,o,i,s,u,a=null,c=null){this.eventManager=n,this.sharedStylesHost=r,this.appId=o,this.removeStylesOnCompDestroy=i,this.doc=s,this.ngZone=u,this.nonce=a,this.tracingService=c,this.defaultRenderer=new Ti(n,s,u,this.tracingService)}createRenderer(n,r){if(!n||!r)return this.defaultRenderer;let o=this.getOrCreateRenderer(n,r);return o instanceof ha?o.applyToHost(n):o instanceof Si&&o.applyStyles(),o}getOrCreateRenderer(n,r){let o=this.rendererByCompId,i=o.get(r.id);if(!i){let s=this.doc,u=this.ngZone,a=this.eventManager,c=this.sharedStylesHost,l=this.removeStylesOnCompDestroy,d=this.tracingService;switch(r.encapsulation){case nt.Emulated:i=new ha(a,c,r,this.appId,l,s,u,d);break;case nt.ShadowDom:return new pa(a,n,r,s,u,this.nonce,d,c);case nt.ExperimentalIsolatedShadowDom:return new pa(a,n,r,s,u,this.nonce,d);default:i=new Si(a,c,r,l,s,u,d);break}o.set(r.id,i)}return i}ngOnDestroy(){this.rendererByCompId.clear()}componentReplaced(n){this.rendererByCompId.delete(n)}static \\u0275fac=function(r){return new(r||e)(A(pp),A(hp),A(yu),A(cT),A(K),A(be),A(vu),A(ot,8))};static \\u0275prov=T({token:e,factory:e.\\u0275fac})}return e})(),Ti=class{eventManager;doc;ngZone;tracingService;data=Object.create(null);throwOnSyntheticProps=!0;constructor(t,n,r,o){this.eventManager=t,this.doc=n,this.ngZone=r,this.tracingService=o}destroy(){}destroyNode=null;createElement(t,n){return n?this.doc.createElementNS(dp[n]||n,t):this.doc.createElement(t)}createComment(t){return this.doc.createComment(t)}createText(t){return this.doc.createTextNode(t)}appendChild(t,n){(N1(t)?t.content:t).appendChild(n)}insertBefore(t,n,r){t&&(N1(t)?t.content:t).insertBefore(n,r)}removeChild(t,n){n.remove()}selectRootElement(t,n){let r=typeof t==\"string\"?this.doc.querySelector(t):t;if(!r)throw new C(-5104,!1);return n||(r.textContent=\"\"),r}parentNode(t){return t.parentNode}nextSibling(t){return t.nextSibling}setAttribute(t,n,r,o){if(o){n=o+\":\"+n;let i=dp[o];i?t.setAttributeNS(i,n,r):t.setAttribute(n,r)}else t.setAttribute(n,r)}removeAttribute(t,n,r){if(r){let o=dp[r];o?t.removeAttributeNS(o,n):t.removeAttribute(`${r}:${n}`)}else t.removeAttribute(n)}addClass(t,n){t.classList.add(n)}removeClass(t,n){t.classList.remove(n)}setStyle(t,n,r,o){o&(rt.DashCase|rt.Important)?t.style.setProperty(n,r,o&rt.Important?\"important\":\"\"):t.style[n]=r}removeStyle(t,n,r){r&rt.DashCase?t.style.removeProperty(n):t.style[n]=\"\"}setProperty(t,n,r){t!=null&&(t[n]=r)}setValue(t,n){t.nodeValue=n}listen(t,n,r,o){if(typeof t==\"string\"&&(t=_t().getGlobalEventTarget(this.doc,t),!t))throw new C(5102,!1);let i=this.decoratePreventDefault(r);return this.tracingService?.wrapEventListener&&(i=this.tracingService.wrapEventListener(t,n,i)),this.eventManager.addEventListener(t,n,i,o)}decoratePreventDefault(t){return n=>{if(n===\"__ngUnwrap__\")return t;t(n)===!1&&n.preventDefault()}}};function N1(e){return e.tagName===\"TEMPLATE\"&&e.content!==void 0}var pa=class extends Ti{hostEl;sharedStylesHost;shadowRoot;constructor(t,n,r,o,i,s,u,a){super(t,o,i,u),this.hostEl=n,this.sharedStylesHost=a,this.shadowRoot=n.attachShadow({mode:\"open\"}),this.sharedStylesHost&&this.sharedStylesHost.addHost(this.shadowRoot);let c=r.styles;c=R1(r.id,c);for(let d of c){let h=document.createElement(\"style\");s&&h.setAttribute(\"nonce\",s),h.textContent=d,this.shadowRoot.appendChild(h)}let l=r.getExternalStyles?.();if(l)for(let d of l){let h=fp(d,o);s&&h.setAttribute(\"nonce\",s),this.shadowRoot.appendChild(h)}}nodeOrShadowRoot(t){return t===this.hostEl?this.shadowRoot:t}appendChild(t,n){return super.appendChild(this.nodeOrShadowRoot(t),n)}insertBefore(t,n,r){return super.insertBefore(this.nodeOrShadowRoot(t),n,r)}removeChild(t,n){return super.removeChild(null,n)}parentNode(t){return this.nodeOrShadowRoot(super.parentNode(this.nodeOrShadowRoot(t)))}destroy(){this.sharedStylesHost&&this.sharedStylesHost.removeHost(this.shadowRoot)}},Si=class extends Ti{sharedStylesHost;removeStylesOnCompDestroy;styles;styleUrls;constructor(t,n,r,o,i,s,u,a){super(t,i,s,u),this.sharedStylesHost=n,this.removeStylesOnCompDestroy=o;let c=r.styles;this.styles=a?R1(a,c):c,this.styleUrls=r.getExternalStyles?.(a)}applyStyles(){this.sharedStylesHost.addStyles(this.styles,this.styleUrls)}destroy(){this.removeStylesOnCompDestroy&&Kn.size===0&&this.sharedStylesHost.removeStyles(this.styles,this.styleUrls)}},ha=class extends Si{contentAttr;hostAttr;constructor(t,n,r,o,i,s,u,a){let c=o+\"-\"+r.id;super(t,n,r,i,s,u,a,c),this.contentAttr=lT(c),this.hostAttr=dT(c)}applyToHost(t){this.applyStyles(),this.setAttribute(t,this.hostAttr,\"\")}createElement(t,n){let r=super.createElement(t,n);return super.setAttribute(r,this.contentAttr,\"\"),r}};var ma=class e extends wi{supportsDOMEvents=!0;static makeCurrent(){rp(new e)}onAndCancel(t,n,r,o){return t.addEventListener(n,r,o),()=>{t.removeEventListener(n,r,o)}}dispatchEvent(t,n){t.dispatchEvent(n)}remove(t){t.remove()}createElement(t,n){return n=n||this.getDefaultDocument(),n.createElement(t)}createHtmlDocument(){return document.implementation.createHTMLDocument(\"fakeTitle\")}getDefaultDocument(){return document}isElementNode(t){return t.nodeType===Node.ELEMENT_NODE}isShadowRoot(t){return t instanceof DocumentFragment}getGlobalEventTarget(t,n){return n===\"window\"?window:n===\"document\"?t:n===\"body\"?t.body:null}getBaseHref(t){let n=fT();return n==null?null:pT(n)}resetBaseElement(){Mi=null}getUserAgent(){return window.navigator.userAgent}getCookie(t){return xi(document.cookie,t)}},Mi=null;function fT(){return Mi=Mi||document.head.querySelector(\"base\"),Mi?Mi.getAttribute(\"href\"):null}function pT(e){return new URL(e,document.baseURI).pathname}var ya=class{addToWindow(t){xe.getAngularTestability=(r,o=!0)=>{let i=t.findTestabilityInTree(r,o);if(i==null)throw new C(5103,!1);return i},xe.getAllAngularTestabilities=()=>t.getAllTestabilities(),xe.getAllAngularRootElements=()=>t.getAllRootElements();let n=r=>{let o=xe.getAllAngularTestabilities(),i=o.length,s=function(){i--,i==0&&r()};o.forEach(u=>{u.whenStable(s)})};xe.frameworkStabilizers||(xe.frameworkStabilizers=[]),xe.frameworkStabilizers.push(n)}findTestabilityInTree(t,n,r){if(n==null)return null;let o=t.getTestability(n);return o??(r?_t().isShadowRoot(n)?this.findTestabilityInTree(t,n.host,!0):this.findTestabilityInTree(t,n.parentElement,!0):null)}},hT=(()=>{class e{build(){return new XMLHttpRequest}static \\u0275fac=function(r){return new(r||e)};static \\u0275prov=T({token:e,factory:e.\\u0275fac})}return e})(),F1=[\"alt\",\"control\",\"meta\",\"shift\"],gT={\"\\b\":\"Backspace\",\"\t\":\"Tab\",\"\\x7F\":\"Delete\",\"\\x1B\":\"Escape\",Del:\"Delete\",Esc:\"Escape\",Left:\"ArrowLeft\",Right:\"ArrowRight\",Up:\"ArrowUp\",Down:\"ArrowDown\",Menu:\"ContextMenu\",Scroll:\"ScrollLock\",Win:\"OS\"},mT={alt:e=>e.altKey,control:e=>e.ctrlKey,meta:e=>e.metaKey,shift:e=>e.shiftKey},O1=(()=>{class e extends Ii{constructor(n){super(n)}supports(n){return e.parseEventName(n)!=null}addEventListener(n,r,o,i){let s=e.parseEventName(r),u=e.eventCallback(s.fullKey,o,this.manager.getZone());return this.manager.getZone().runOutsideAngular(()=>_t().onAndCancel(n,s.domEventName,u,i))}static parseEventName(n){let r=n.toLowerCase().split(\".\"),o=r.shift();if(r.length===0||!(o===\"keydown\"||o===\"keyup\"))return null;let i=e._normalizeKey(r.pop()),s=\"\",u=r.indexOf(\"code\");if(u>-1&&(r.splice(u,1),s=\"code.\"),F1.forEach(c=>{let l=r.indexOf(c);l>-1&&(r.splice(l,1),s+=c+\".\")}),s+=i,r.length!=0||i.length===0)return null;let a={};return a.domEventName=o,a.fullKey=s,a}static matchEventFullKeyCode(n,r){let o=gT[n.key]||n.key,i=\"\";return r.indexOf(\"code.\")>-1&&(o=n.code,i=\"code.\"),o==null||!o?!1:(o=o.toLowerCase(),o===\" \"?o=\"space\":o===\".\"&&(o=\"dot\"),F1.forEach(s=>{if(s!==o){let u=mT[s];u(n)&&(i+=s+\".\")}}),i+=o,i===r)}static eventCallback(n,r,o){return i=>{e.matchEventFullKeyCode(i,n)&&o.runGuarded(()=>r(i))}}static _normalizeKey(n){return n===\"esc\"?\"escape\":n}static \\u0275fac=function(r){return new(r||e)(A(K))};static \\u0275prov=T({token:e,factory:e.\\u0275fac})}return e})();function yT(e,t,n){return lt(this,null,function*(){let r=M({rootComponent:e},bT(t,n));return Jb(r)})}function bT(e,t){return{platformRef:t?.platformRef,appProviders:[...P1,...e?.providers??[]],platformProviders:CT}}function vT(){ma.makeCurrent()}function DT(){return new Be}function ET(){return hd(document),document}var CT=[{provide:nr,useValue:cp},{provide:bu,useValue:vT,multi:!0},{provide:K,useFactory:ET}];var _T=[{provide:Pu,useClass:ya},{provide:Ou,useClass:hi},{provide:hi,useClass:hi}],P1=[{provide:Bo,useValue:\"root\"},{provide:Be,useFactory:DT},{provide:ga,useClass:fa,multi:!0},{provide:ga,useClass:O1,multi:!0},mp,hp,pp,{provide:Jn,useExisting:mp},{provide:or,useClass:hT},[]],wT=(()=>{class e{constructor(){}static \\u0275fac=function(r){return new(r||e)};static \\u0275mod=Ht({type:e});static \\u0275inj=yt({providers:[...P1,..._T],imports:[up,Kb]})}return e})();var En=class e{headers;normalizedNames=new Map;lazyInit;lazyUpdate=null;constructor(t){t?typeof t==\"string\"?this.lazyInit=()=>{this.headers=new Map,t.split(`\n`).forEach(n=>{let r=n.indexOf(\":\");if(r>0){let o=n.slice(0,r),i=n.slice(r+1).trim();this.addHeaderEntry(o,i)}})}:typeof Headers<\"u\"&&t instanceof Headers?(this.headers=new Map,t.forEach((n,r)=>{this.addHeaderEntry(r,n)})):this.lazyInit=()=>{this.headers=new Map,Object.entries(t).forEach(([n,r])=>{this.setHeaderEntries(n,r)})}:this.headers=new Map}has(t){return this.init(),this.headers.has(t.toLowerCase())}get(t){this.init();let n=this.headers.get(t.toLowerCase());return n&&n.length>0?n[0]:null}keys(){return this.init(),Array.from(this.normalizedNames.values())}getAll(t){return this.init(),this.headers.get(t.toLowerCase())||null}append(t,n){return this.clone({name:t,value:n,op:\"a\"})}set(t,n){return this.clone({name:t,value:n,op:\"s\"})}delete(t,n){return this.clone({name:t,value:n,op:\"d\"})}maybeSetNormalizedName(t,n){this.normalizedNames.has(n)||this.normalizedNames.set(n,t)}init(){this.lazyInit&&(this.lazyInit instanceof e?this.copyFrom(this.lazyInit):this.lazyInit(),this.lazyInit=null,this.lazyUpdate&&(this.lazyUpdate.forEach(t=>this.applyUpdate(t)),this.lazyUpdate=null))}copyFrom(t){t.init(),Array.from(t.headers.keys()).forEach(n=>{this.headers.set(n,t.headers.get(n)),this.normalizedNames.set(n,t.normalizedNames.get(n))})}clone(t){let n=new e;return n.lazyInit=this.lazyInit&&this.lazyInit instanceof e?this.lazyInit:this,n.lazyUpdate=(this.lazyUpdate||[]).concat([t]),n}applyUpdate(t){let n=t.name.toLowerCase();switch(t.op){case\"a\":case\"s\":let r=t.value;if(typeof r==\"string\"&&(r=[r]),r.length===0)return;this.maybeSetNormalizedName(t.name,n);let o=(t.op===\"a\"?this.headers.get(n):void 0)||[];o.push(...r),this.headers.set(n,o);break;case\"d\":let i=t.value;if(!i)this.headers.delete(n),this.normalizedNames.delete(n);else{let s=this.headers.get(n);if(!s)return;s=s.filter(u=>i.indexOf(u)===-1),s.length===0?(this.headers.delete(n),this.normalizedNames.delete(n)):this.headers.set(n,s)}break}}addHeaderEntry(t,n){let r=t.toLowerCase();this.maybeSetNormalizedName(t,r),this.headers.has(r)?this.headers.get(r).push(n):this.headers.set(r,[n])}setHeaderEntries(t,n){let r=(Array.isArray(n)?n:[n]).map(i=>i.toString()),o=t.toLowerCase();this.headers.set(o,r),this.maybeSetNormalizedName(t,o)}forEach(t){this.init(),Array.from(this.normalizedNames.keys()).forEach(n=>t(this.normalizedNames.get(n),this.headers.get(n)))}};var va=class{map=new Map;set(t,n){return this.map.set(t,n),this}get(t){return this.map.has(t)||this.map.set(t,t.defaultValue()),this.map.get(t)}delete(t){return this.map.delete(t),this}has(t){return this.map.has(t)}keys(){return this.map.keys()}},Da=class{encodeKey(t){return L1(t)}encodeValue(t){return L1(t)}decodeKey(t){return decodeURIComponent(t)}decodeValue(t){return decodeURIComponent(t)}};function xT(e,t){let n=new Map;return e.length>0&&e.replace(/^\\?/,\"\").split(\"&\").forEach(o=>{let i=o.indexOf(\"=\"),[s,u]=i==-1?[t.decodeKey(o),\"\"]:[t.decodeKey(o.slice(0,i)),t.decodeValue(o.slice(i+1))],a=n.get(s)||[];a.push(u),n.set(s,a)}),n}var IT=/%(\\d[a-f0-9])/gi,TT={40:\"@\",\"3A\":\":\",24:\"$\",\"2C\":\",\",\"3B\":\";\",\"3D\":\"=\",\"3F\":\"?\",\"2F\":\"/\"};function L1(e){return encodeURIComponent(e).replace(IT,(t,n)=>TT[n]??t)}function ba(e){return`${e}`}var zt=class e{map;encoder;updates=null;cloneFrom=null;constructor(t={}){if(this.encoder=t.encoder||new Da,t.fromString){if(t.fromObject)throw new C(2805,!1);this.map=xT(t.fromString,this.encoder)}else t.fromObject?(this.map=new Map,Object.keys(t.fromObject).forEach(n=>{let r=t.fromObject[n],o=Array.isArray(r)?r.map(ba):[ba(r)];this.map.set(n,o)})):this.map=null}has(t){return this.init(),this.map.has(t)}get(t){this.init();let n=this.map.get(t);return n?n[0]:null}getAll(t){return this.init(),this.map.get(t)||null}keys(){return this.init(),Array.from(this.map.keys())}append(t,n){return this.clone({param:t,value:n,op:\"a\"})}appendAll(t){let n=[];return Object.keys(t).forEach(r=>{let o=t[r];Array.isArray(o)?o.forEach(i=>{n.push({param:r,value:i,op:\"a\"})}):n.push({param:r,value:o,op:\"a\"})}),this.clone(n)}set(t,n){return this.clone({param:t,value:n,op:\"s\"})}delete(t,n){return this.clone({param:t,value:n,op:\"d\"})}toString(){return this.init(),this.keys().map(t=>{let n=this.encoder.encodeKey(t);return this.map.get(t).map(r=>n+\"=\"+this.encoder.encodeValue(r)).join(\"&\")}).filter(t=>t!==\"\").join(\"&\")}clone(t){let n=new e({encoder:this.encoder});return n.cloneFrom=this.cloneFrom||this,n.updates=(this.updates||[]).concat(t),n}init(){this.map===null&&(this.map=new Map),this.cloneFrom!==null&&(this.cloneFrom.init(),this.cloneFrom.keys().forEach(t=>this.map.set(t,this.cloneFrom.map.get(t))),this.updates.forEach(t=>{switch(t.op){case\"a\":case\"s\":let n=(t.op===\"a\"?this.map.get(t.param):void 0)||[];n.push(ba(t.value)),this.map.set(t.param,n);break;case\"d\":if(t.value!==void 0){let r=this.map.get(t.param)||[],o=r.indexOf(ba(t.value));o!==-1&&r.splice(o,1),r.length>0?this.map.set(t.param,r):this.map.delete(t.param)}else{this.map.delete(t.param);break}}}),this.cloneFrom=this.updates=null)}};function ST(e){switch(e){case\"DELETE\":case\"GET\":case\"HEAD\":case\"OPTIONS\":case\"JSONP\":return!1;default:return!0}}function j1(e){return typeof ArrayBuffer<\"u\"&&e instanceof ArrayBuffer}function B1(e){return typeof Blob<\"u\"&&e instanceof Blob}function V1(e){return typeof FormData<\"u\"&&e instanceof FormData}function MT(e){return typeof URLSearchParams<\"u\"&&e instanceof URLSearchParams}var H1=\"Content-Type\",$1=\"Accept\",z1=\"text/plain\",q1=\"application/json\",AT=`${q1}, ${z1}, */*`,uo=class e{url;body=null;headers;context;reportProgress=!1;withCredentials=!1;credentials;keepalive=!1;cache;priority;mode;redirect;referrer;integrity;referrerPolicy;responseType=\"json\";method;params;urlWithParams;transferCache;timeout;constructor(t,n,r,o){this.url=n,this.method=t.toUpperCase();let i;if(ST(this.method)||o?(this.body=r!==void 0?r:null,i=o):i=r,i){if(this.reportProgress=!!i.reportProgress,this.withCredentials=!!i.withCredentials,this.keepalive=!!i.keepalive,i.responseType&&(this.responseType=i.responseType),i.headers&&(this.headers=i.headers),i.context&&(this.context=i.context),i.params&&(this.params=i.params),i.priority&&(this.priority=i.priority),i.cache&&(this.cache=i.cache),i.credentials&&(this.credentials=i.credentials),typeof i.timeout==\"number\"){if(i.timeout<1||!Number.isInteger(i.timeout))throw new C(2822,\"\");this.timeout=i.timeout}i.mode&&(this.mode=i.mode),i.redirect&&(this.redirect=i.redirect),i.integrity&&(this.integrity=i.integrity),i.referrer&&(this.referrer=i.referrer),i.referrerPolicy&&(this.referrerPolicy=i.referrerPolicy),this.transferCache=i.transferCache}if(this.headers??=new En,this.context??=new va,!this.params)this.params=new zt,this.urlWithParams=n;else{let s=this.params.toString();if(s.length===0)this.urlWithParams=n;else{let u=n.indexOf(\"?\"),a=u===-1?\"?\":u<n.length-1?\"&\":\"\";this.urlWithParams=n+a+s}}}serializeBody(){return this.body===null?null:typeof this.body==\"string\"||j1(this.body)||B1(this.body)||V1(this.body)||MT(this.body)?this.body:this.body instanceof zt?this.body.toString():typeof this.body==\"object\"||typeof this.body==\"boolean\"||Array.isArray(this.body)?JSON.stringify(this.body):this.body.toString()}detectContentTypeHeader(){return this.body===null||V1(this.body)?null:B1(this.body)?this.body.type||null:j1(this.body)?null:typeof this.body==\"string\"?z1:this.body instanceof zt?\"application/x-www-form-urlencoded;charset=UTF-8\":typeof this.body==\"object\"||typeof this.body==\"number\"||typeof this.body==\"boolean\"?q1:null}clone(t={}){let n=t.method||this.method,r=t.url||this.url,o=t.responseType||this.responseType,i=t.keepalive??this.keepalive,s=t.priority||this.priority,u=t.cache||this.cache,a=t.mode||this.mode,c=t.redirect||this.redirect,l=t.credentials||this.credentials,d=t.referrer||this.referrer,h=t.integrity||this.integrity,f=t.referrerPolicy||this.referrerPolicy,p=t.transferCache??this.transferCache,m=t.timeout??this.timeout,g=t.body!==void 0?t.body:this.body,y=t.withCredentials??this.withCredentials,v=t.reportProgress??this.reportProgress,w=t.headers||this.headers,D=t.params||this.params,F=t.context??this.context;return t.setHeaders!==void 0&&(w=Object.keys(t.setHeaders).reduce((E,N)=>E.set(N,t.setHeaders[N]),w)),t.setParams&&(D=Object.keys(t.setParams).reduce((E,N)=>E.set(N,t.setParams[N]),D)),new e(n,r,g,{params:D,headers:w,context:F,reportProgress:v,responseType:o,withCredentials:y,transferCache:p,keepalive:i,cache:u,priority:s,timeout:m,mode:a,redirect:c,credentials:l,referrer:d,integrity:h,referrerPolicy:f})}},ir=(function(e){return e[e.Sent=0]=\"Sent\",e[e.UploadProgress=1]=\"UploadProgress\",e[e.ResponseHeader=2]=\"ResponseHeader\",e[e.DownloadProgress=3]=\"DownloadProgress\",e[e.Response=4]=\"Response\",e[e.User=5]=\"User\",e})(ir||{}),co=class{headers;status;statusText;url;ok;type;redirected;responseType;constructor(t,n=200,r=\"OK\"){this.headers=t.headers||new En,this.status=t.status!==void 0?t.status:n,this.statusText=t.statusText||r,this.url=t.url||null,this.redirected=t.redirected,this.responseType=t.responseType,this.ok=this.status>=200&&this.status<300}},Ea=class e extends co{constructor(t={}){super(t)}type=ir.ResponseHeader;clone(t={}){return new e({headers:t.headers||this.headers,status:t.status!==void 0?t.status:this.status,statusText:t.statusText||this.statusText,url:t.url||this.url||void 0})}},Ai=class e extends co{body;constructor(t={}){super(t),this.body=t.body!==void 0?t.body:null}type=ir.Response;clone(t={}){return new e({body:t.body!==void 0?t.body:this.body,headers:t.headers||this.headers,status:t.status!==void 0?t.status:this.status,statusText:t.statusText||this.statusText,url:t.url||this.url||void 0,redirected:t.redirected??this.redirected,responseType:t.responseType??this.responseType})}},ao=class extends co{name=\"HttpErrorResponse\";message;error;ok=!1;constructor(t){super(t,0,\"Unknown Error\"),this.status>=200&&this.status<300?this.message=`Http failure during parsing for ${t.url||\"(unknown url)\"}`:this.message=`Http failure response for ${t.url||\"(unknown url)\"}: ${t.status} ${t.statusText}`,this.error=t.error||null}},NT=200,kT=204;var RT=new x(\"\");var FT=/^\\)\\]\\}',?\\n/;var bp=(()=>{class e{xhrFactory;tracingService=b(ot,{optional:!0});constructor(n){this.xhrFactory=n}maybePropagateTrace(n){return this.tracingService?.propagate?this.tracingService.propagate(n):n}handle(n){if(n.method===\"JSONP\")throw new C(-2800,!1);let r=this.xhrFactory;return us(null).pipe(ps(()=>new B(i=>{let s=r.build();if(s.open(n.method,n.urlWithParams),n.withCredentials&&(s.withCredentials=!0),n.headers.forEach((g,y)=>s.setRequestHeader(g,y.join(\",\"))),n.headers.has($1)||s.setRequestHeader($1,AT),!n.headers.has(H1)){let g=n.detectContentTypeHeader();g!==null&&s.setRequestHeader(H1,g)}if(n.timeout&&(s.timeout=n.timeout),n.responseType){let g=n.responseType.toLowerCase();s.responseType=g!==\"json\"?g:\"text\"}let u=n.serializeBody(),a=null,c=()=>{if(a!==null)return a;let g=s.statusText||\"OK\",y=new En(s.getAllResponseHeaders()),v=s.responseURL||n.url;return a=new Ea({headers:y,status:s.status,statusText:g,url:v}),a},l=this.maybePropagateTrace(()=>{let{headers:g,status:y,statusText:v,url:w}=c(),D=null;y!==kT&&(D=typeof s.response>\"u\"?s.responseText:s.response),y===0&&(y=D?NT:0);let F=y>=200&&y<300;if(n.responseType===\"json\"&&typeof D==\"string\"){let E=D;D=D.replace(FT,\"\");try{D=D!==\"\"?JSON.parse(D):null}catch(N){D=E,F&&(F=!1,D={error:N,text:D})}}F?(i.next(new Ai({body:D,headers:g,status:y,statusText:v,url:w||void 0})),i.complete()):i.error(new ao({error:D,headers:g,status:y,statusText:v,url:w||void 0}))}),d=this.maybePropagateTrace(g=>{let{url:y}=c(),v=new ao({error:g,status:s.status||0,statusText:s.statusText||\"Unknown Error\",url:y||void 0});i.error(v)}),h=d;n.timeout&&(h=this.maybePropagateTrace(g=>{let{url:y}=c(),v=new ao({error:new DOMException(\"Request timed out\",\"TimeoutError\"),status:s.status||0,statusText:s.statusText||\"Request timeout\",url:y||void 0});i.error(v)}));let f=!1,p=this.maybePropagateTrace(g=>{f||(i.next(c()),f=!0);let y={type:ir.DownloadProgress,loaded:g.loaded};g.lengthComputable&&(y.total=g.total),n.responseType===\"text\"&&s.responseText&&(y.partialText=s.responseText),i.next(y)}),m=this.maybePropagateTrace(g=>{let y={type:ir.UploadProgress,loaded:g.loaded};g.lengthComputable&&(y.total=g.total),i.next(y)});return s.addEventListener(\"load\",l),s.addEventListener(\"error\",d),s.addEventListener(\"timeout\",h),s.addEventListener(\"abort\",d),n.reportProgress&&(s.addEventListener(\"progress\",p),u!==null&&s.upload&&s.upload.addEventListener(\"progress\",m)),s.send(u),i.next({type:ir.Sent}),()=>{s.removeEventListener(\"error\",d),s.removeEventListener(\"abort\",d),s.removeEventListener(\"load\",l),s.removeEventListener(\"timeout\",h),n.reportProgress&&(s.removeEventListener(\"progress\",p),u!==null&&s.upload&&s.upload.removeEventListener(\"progress\",m)),s.readyState!==s.DONE&&s.abort()}})))}static \\u0275fac=function(r){return new(r||e)(A(or))};static \\u0275prov=T({token:e,factory:e.\\u0275fac,providedIn:\"root\"})}return e})();function G1(e,t){return t(e)}function OT(e,t){return(n,r)=>t.intercept(n,{handle:o=>e(o,r)})}function PT(e,t,n){return(r,o)=>Nr(n,()=>t(r,i=>e(i,o)))}var W1=new x(\"\"),vp=new x(\"\",{factory:()=>[]}),Z1=new x(\"\"),Dp=new x(\"\",{factory:()=>!0});function LT(){let e=null;return(t,n)=>{e===null&&(e=(b(W1,{optional:!0})??[]).reduceRight(OT,G1));let r=b(Wn);if(b(Dp)){let i=r.add();return e(t,n).pipe(ds(i))}else return e(t,n)}}var Ep=(()=>{class e{static \\u0275fac=function(r){return new(r||e)};static \\u0275prov=T({token:e,factory:function(r){let o=null;return r?o=new(r||e):o=A(bp),o},providedIn:\"root\"})}return e})();var Ca=(()=>{class e{backend;injector;chain=null;pendingTasks=b(Wn);contributeToStability=b(Dp);constructor(n,r){this.backend=n,this.injector=r}handle(n){if(this.chain===null){let r=Array.from(new Set([...this.injector.get(vp),...this.injector.get(Z1,[])]));this.chain=r.reduceRight((o,i)=>PT(o,i,this.injector),G1)}if(this.contributeToStability){let r=this.pendingTasks.add();return this.chain(n,o=>this.backend.handle(o)).pipe(ds(r))}else return this.chain(n,r=>this.backend.handle(r))}static \\u0275fac=function(r){return new(r||e)(A(Ep),A(we))};static \\u0275prov=T({token:e,factory:e.\\u0275fac,providedIn:\"root\"})}return e})(),Cp=(()=>{class e{static \\u0275fac=function(r){return new(r||e)};static \\u0275prov=T({token:e,factory:function(r){let o=null;return r?o=new(r||e):o=A(Ca),o},providedIn:\"root\"})}return e})();function yp(e,t){return{body:t,headers:e.headers,context:e.context,observe:e.observe,params:e.params,reportProgress:e.reportProgress,responseType:e.responseType,withCredentials:e.withCredentials,credentials:e.credentials,transferCache:e.transferCache,timeout:e.timeout,keepalive:e.keepalive,priority:e.priority,cache:e.cache,mode:e.mode,redirect:e.redirect,integrity:e.integrity,referrer:e.referrer,referrerPolicy:e.referrerPolicy}}var Y1=(()=>{class e{handler;constructor(n){this.handler=n}request(n,r,o={}){let i;if(n instanceof uo)i=n;else{let a;o.headers instanceof En?a=o.headers:a=new En(o.headers);let c;o.params&&(o.params instanceof zt?c=o.params:c=new zt({fromObject:o.params})),i=new uo(n,r,o.body!==void 0?o.body:null,{headers:a,context:o.context,params:c,reportProgress:o.reportProgress,responseType:o.responseType||\"json\",withCredentials:o.withCredentials,transferCache:o.transferCache,keepalive:o.keepalive,priority:o.priority,cache:o.cache,mode:o.mode,redirect:o.redirect,credentials:o.credentials,referrer:o.referrer,referrerPolicy:o.referrerPolicy,integrity:o.integrity,timeout:o.timeout})}let s=us(i).pipe(fc(a=>this.handler.handle(a)));if(n instanceof uo||o.observe===\"events\")return s;let u=s.pipe(rn(a=>a instanceof Ai));switch(o.observe||\"body\"){case\"body\":switch(i.responseType){case\"arraybuffer\":return u.pipe(Ce(a=>{if(a.body!==null&&!(a.body instanceof ArrayBuffer))throw new C(2806,!1);return a.body}));case\"blob\":return u.pipe(Ce(a=>{if(a.body!==null&&!(a.body instanceof Blob))throw new C(2807,!1);return a.body}));case\"text\":return u.pipe(Ce(a=>{if(a.body!==null&&typeof a.body!=\"string\")throw new C(2808,!1);return a.body}));default:return u.pipe(Ce(a=>a.body))}case\"response\":return u;default:throw new C(2809,!1)}}delete(n,r={}){return this.request(\"DELETE\",n,r)}get(n,r={}){return this.request(\"GET\",n,r)}head(n,r={}){return this.request(\"HEAD\",n,r)}jsonp(n,r){return this.request(\"JSONP\",n,{params:new zt().append(r,\"JSONP_CALLBACK\"),observe:\"body\",responseType:\"json\"})}options(n,r={}){return this.request(\"OPTIONS\",n,r)}patch(n,r,o={}){return this.request(\"PATCH\",n,yp(o,r))}post(n,r,o={}){return this.request(\"POST\",n,yp(o,r))}put(n,r,o={}){return this.request(\"PUT\",n,yp(o,r))}static \\u0275fac=function(r){return new(r||e)(A(Cp))};static \\u0275prov=T({token:e,factory:e.\\u0275fac,providedIn:\"root\"})}return e})();var jT=new x(\"\",{factory:()=>!0}),BT=\"XSRF-TOKEN\",VT=new x(\"\",{factory:()=>BT}),HT=\"X-XSRF-TOKEN\",$T=new x(\"\",{factory:()=>HT}),UT=(()=>{class e{cookieName=b(VT);doc=b(K);lastCookieString=\"\";lastToken=null;parseCount=0;getToken(){let n=this.doc.cookie||\"\";return n!==this.lastCookieString&&(this.parseCount++,this.lastToken=xi(n,this.cookieName),this.lastCookieString=n),this.lastToken}static \\u0275fac=function(r){return new(r||e)};static \\u0275prov=T({token:e,factory:e.\\u0275fac,providedIn:\"root\"})}return e})(),Q1=(()=>{class e{static \\u0275fac=function(r){return new(r||e)};static \\u0275prov=T({token:e,factory:function(r){let o=null;return r?o=new(r||e):o=A(UT),o},providedIn:\"root\"})}return e})();function zT(e,t){if(!b(jT)||e.method===\"GET\"||e.method===\"HEAD\")return t(e);try{let o=b(Dn).href,{origin:i}=new URL(o),{origin:s}=new URL(e.url,i);if(i!==s)return t(e)}catch(o){return t(e)}let n=b(Q1).getToken(),r=b($T);return n!=null&&!e.headers.has(r)&&(e=e.clone({headers:e.headers.set(r,n)})),t(e)}var _p=(function(e){return e[e.Interceptors=0]=\"Interceptors\",e[e.LegacyInterceptors=1]=\"LegacyInterceptors\",e[e.CustomXsrfConfiguration=2]=\"CustomXsrfConfiguration\",e[e.NoXsrfProtection=3]=\"NoXsrfProtection\",e[e.JsonpSupport=4]=\"JsonpSupport\",e[e.RequestsMadeViaParent=5]=\"RequestsMadeViaParent\",e[e.Fetch=6]=\"Fetch\",e})(_p||{});function qT(e,t){return{\\u0275kind:e,\\u0275providers:t}}function K1(...e){let t=[Y1,Ca,{provide:Cp,useExisting:Ca},{provide:Ep,useFactory:()=>b(RT,{optional:!0})??b(bp)},{provide:vp,useValue:zT,multi:!0}];for(let n of e)t.push(...n.\\u0275providers);return Ln(t)}var U1=new x(\"\");function J1(){return qT(_p.LegacyInterceptors,[{provide:U1,useFactory:LT},{provide:vp,useExisting:U1,multi:!0}])}var GT=(()=>{class e{static \\u0275fac=function(r){return new(r||e)};static \\u0275mod=Ht({type:e});static \\u0275inj=yt({providers:[K1(J1())]})}return e})();var p$=(()=>{class e{_doc;constructor(n){this._doc=n}getTitle(){return this._doc.title}setTitle(n){this._doc.title=n||\"\"}static \\u0275fac=function(r){return new(r||e)(A(K))};static \\u0275prov=T({token:e,factory:e.\\u0275fac,providedIn:\"root\"})}return e})();var wp=(()=>{class e{static \\u0275fac=function(r){return new(r||e)};static \\u0275prov=T({token:e,factory:function(r){let o=null;return r?o=new(r||e):o=A(WT),o},providedIn:\"root\"})}return e})(),WT=(()=>{class e extends wp{_doc;constructor(n){super(),this._doc=n}sanitize(n,r){if(r==null)return null;switch(n){case Pe.NONE:return r;case Pe.HTML:return Bt(r,\"HTML\")?Oe(r):Cu(this._doc,String(r)).toString();case Pe.STYLE:return Bt(r,\"Style\")?Oe(r):r;case Pe.SCRIPT:if(Bt(r,\"Script\"))return Oe(r);throw new C(5200,!1);case Pe.URL:return Bt(r,\"URL\")?Oe(r):ui(String(r));case Pe.RESOURCE_URL:if(Bt(r,\"ResourceURL\"))return Oe(r);throw new C(5201,!1);default:throw new C(5202,!1)}}bypassSecurityTrustHtml(n){return md(n)}bypassSecurityTrustStyle(n){return yd(n)}bypassSecurityTrustScript(n){return bd(n)}bypassSecurityTrustUrl(n){return vd(n)}bypassSecurityTrustResourceUrl(n){return Dd(n)}static \\u0275fac=function(r){return new(r||e)(A(K))};static \\u0275prov=T({token:e,factory:e.\\u0275fac,providedIn:\"root\"})}return e})();var Rp={};pr(Rp,{arrayReplaceAt:()=>kp,assign:()=>po,escapeHtml:()=>Wt,escapeRE:()=>AS,fromCodePoint:()=>Ri,has:()=>vS,isMdAsciiPunct:()=>cr,isPunctChar:()=>ar,isSpace:()=>H,isString:()=>Fa,isValidEntityCode:()=>Oa,isWhiteSpace:()=>ur,lib:()=>NS,normalizeReference:()=>lr,unescapeAll:()=>Gt,unescapeMd:()=>wS});var Ta={};pr(Ta,{decode:()=>Ni,encode:()=>xa,format:()=>lo,parse:()=>ki});var X1={};function ZT(e){let t=X1[e];if(t)return t;t=X1[e]=[];for(let n=0;n<128;n++){let r=String.fromCharCode(n);t.push(r)}for(let n=0;n<e.length;n++){let r=e.charCodeAt(n);t[r]=\"%\"+(\"0\"+r.toString(16).toUpperCase()).slice(-2)}return t}function _a(e,t){typeof t!=\"string\"&&(t=_a.defaultChars);let n=ZT(t);return e.replace(/(%[a-f0-9]{2})+/gi,function(r){let o=\"\";for(let i=0,s=r.length;i<s;i+=3){let u=parseInt(r.slice(i+1,i+3),16);if(u<128){o+=n[u];continue}if((u&224)===192&&i+3<s){let a=parseInt(r.slice(i+4,i+6),16);if((a&192)===128){let c=u<<6&1984|a&63;c<128?o+=\"\\uFFFD\\uFFFD\":o+=String.fromCharCode(c),i+=3;continue}}if((u&240)===224&&i+6<s){let a=parseInt(r.slice(i+4,i+6),16),c=parseInt(r.slice(i+7,i+9),16);if((a&192)===128&&(c&192)===128){let l=u<<12&61440|a<<6&4032|c&63;l<2048||l>=55296&&l<=57343?o+=\"\\uFFFD\\uFFFD\\uFFFD\":o+=String.fromCharCode(l),i+=6;continue}}if((u&248)===240&&i+9<s){let a=parseInt(r.slice(i+4,i+6),16),c=parseInt(r.slice(i+7,i+9),16),l=parseInt(r.slice(i+10,i+12),16);if((a&192)===128&&(c&192)===128&&(l&192)===128){let d=u<<18&1835008|a<<12&258048|c<<6&4032|l&63;d<65536||d>1114111?o+=\"\\uFFFD\\uFFFD\\uFFFD\\uFFFD\":(d-=65536,o+=String.fromCharCode(55296+(d>>10),56320+(d&1023))),i+=9;continue}}o+=\"\\uFFFD\"}return o})}_a.defaultChars=\";/?:@&=+$,#\";_a.componentChars=\"\";var Ni=_a;var ev={};function YT(e){let t=ev[e];if(t)return t;t=ev[e]=[];for(let n=0;n<128;n++){let r=String.fromCharCode(n);/^[0-9a-z]$/i.test(r)?t.push(r):t.push(\"%\"+(\"0\"+n.toString(16).toUpperCase()).slice(-2))}for(let n=0;n<e.length;n++)t[e.charCodeAt(n)]=e[n];return t}function wa(e,t,n){typeof t!=\"string\"&&(n=t,t=wa.defaultChars),typeof n>\"u\"&&(n=!0);let r=YT(t),o=\"\";for(let i=0,s=e.length;i<s;i++){let u=e.charCodeAt(i);if(n&&u===37&&i+2<s&&/^[0-9a-f]{2}$/i.test(e.slice(i+1,i+3))){o+=e.slice(i,i+3),i+=2;continue}if(u<128){o+=r[u];continue}if(u>=55296&&u<=57343){if(u>=55296&&u<=56319&&i+1<s){let a=e.charCodeAt(i+1);if(a>=56320&&a<=57343){o+=encodeURIComponent(e[i]+e[i+1]),i++;continue}}o+=\"%EF%BF%BD\";continue}o+=encodeURIComponent(e[i])}return o}wa.defaultChars=\";/?:@&=+$,-_.!~*'()#\";wa.componentChars=\"-_.!~*'()\";var xa=wa;function lo(e){let t=\"\";return t+=e.protocol||\"\",t+=e.slashes?\"//\":\"\",t+=e.auth?e.auth+\"@\":\"\",e.hostname&&e.hostname.indexOf(\":\")!==-1?t+=\"[\"+e.hostname+\"]\":t+=e.hostname||\"\",t+=e.port?\":\"+e.port:\"\",t+=e.pathname||\"\",t+=e.search||\"\",t+=e.hash||\"\",t}function Ia(){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 QT=/^([a-z0-9.+-]+:)/i,KT=/:[0-9]*$/,JT=/^(\\/\\/?(?!\\/)[^\\?\\s]*)(\\?[^\\s]*)?$/,XT=[\"<\",\">\",'\"',\"`\",\" \",\"\\r\",`\n`,\"\t\"],eS=[\"{\",\"}\",\"|\",\"\\\\\",\"^\",\"`\"].concat(XT),tS=[\"'\"].concat(eS),tv=[\"%\",\"/\",\"?\",\";\",\"#\"].concat(tS),nv=[\"/\",\"?\",\"#\"],nS=255,rv=/^[+a-z0-9A-Z_-]{0,63}$/,rS=/^([+a-z0-9A-Z_-]{0,63})(.*)$/,ov={javascript:!0,\"javascript:\":!0},iv={http:!0,https:!0,ftp:!0,gopher:!0,file:!0,\"http:\":!0,\"https:\":!0,\"ftp:\":!0,\"gopher:\":!0,\"file:\":!0};function oS(e,t){if(e&&e instanceof Ia)return e;let n=new Ia;return n.parse(e,t),n}Ia.prototype.parse=function(e,t){let n,r,o,i=e;if(i=i.trim(),!t&&e.split(\"#\").length===1){let c=JT.exec(i);if(c)return this.pathname=c[1],c[2]&&(this.search=c[2]),this}let s=QT.exec(i);if(s&&(s=s[0],n=s.toLowerCase(),this.protocol=s,i=i.substr(s.length)),(t||s||i.match(/^\\/\\/[^@\\/]+@[^@\\/]+/))&&(o=i.substr(0,2)===\"//\",o&&!(s&&ov[s])&&(i=i.substr(2),this.slashes=!0)),!ov[s]&&(o||s&&!iv[s])){let c=-1;for(let p=0;p<nv.length;p++)r=i.indexOf(nv[p]),r!==-1&&(c===-1||r<c)&&(c=r);let l,d;c===-1?d=i.lastIndexOf(\"@\"):d=i.lastIndexOf(\"@\",c),d!==-1&&(l=i.slice(0,d),i=i.slice(d+1),this.auth=l),c=-1;for(let p=0;p<tv.length;p++)r=i.indexOf(tv[p]),r!==-1&&(c===-1||r<c)&&(c=r);c===-1&&(c=i.length),i[c-1]===\":\"&&c--;let h=i.slice(0,c);i=i.slice(c),this.parseHost(h),this.hostname=this.hostname||\"\";let f=this.hostname[0]===\"[\"&&this.hostname[this.hostname.length-1]===\"]\";if(!f){let p=this.hostname.split(/\\./);for(let m=0,g=p.length;m<g;m++){let y=p[m];if(y&&!y.match(rv)){let v=\"\";for(let w=0,D=y.length;w<D;w++)y.charCodeAt(w)>127?v+=\"x\":v+=y[w];if(!v.match(rv)){let w=p.slice(0,m),D=p.slice(m+1),F=y.match(rS);F&&(w.push(F[1]),D.unshift(F[2])),D.length&&(i=D.join(\".\")+i),this.hostname=w.join(\".\");break}}}}this.hostname.length>nS&&(this.hostname=\"\"),f&&(this.hostname=this.hostname.substr(1,this.hostname.length-2))}let u=i.indexOf(\"#\");u!==-1&&(this.hash=i.substr(u),i=i.slice(0,u));let a=i.indexOf(\"?\");return a!==-1&&(this.search=i.substr(a),i=i.slice(0,a)),i&&(this.pathname=i),iv[n]&&this.hostname&&!this.pathname&&(this.pathname=\"\"),this};Ia.prototype.parseHost=function(e){let t=KT.exec(e);t&&(t=t[0],t!==\":\"&&(this.port=t.substr(1)),e=e.substr(0,e.length-t.length)),e&&(this.hostname=e)};var ki=oS;var xp={};pr(xp,{Any:()=>Sa,Cc:()=>Ma,Cf:()=>sv,P:()=>fo,S:()=>Aa,Z:()=>Na});var Sa=/[\\0-\\uD7FF\\uE000-\\uFFFF]|[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF]/;var Ma=/[\\0-\\x1F\\x7F-\\x9F]/;var sv=/[\\xAD\\u0600-\\u0605\\u061C\\u06DD\\u070F\\u0890\\u0891\\u08E2\\u180E\\u200B-\\u200F\\u202A-\\u202E\\u2060-\\u2064\\u2066-\\u206F\\uFEFF\\uFFF9-\\uFFFB]|\\uD804[\\uDCBD\\uDCCD]|\\uD80D[\\uDC30-\\uDC3F]|\\uD82F[\\uDCA0-\\uDCA3]|\\uD834[\\uDD73-\\uDD7A]|\\uDB40[\\uDC01\\uDC20-\\uDC7F]/;var fo=/[!-#%-\\*,-\\/:;\\?@\\[-\\]_\\{\\}\\xA1\\xA7\\xAB\\xB6\\xB7\\xBB\\xBF\\u037E\\u0387\\u055A-\\u055F\\u0589\\u058A\\u05BE\\u05C0\\u05C3\\u05C6\\u05F3\\u05F4\\u0609\\u060A\\u060C\\u060D\\u061B\\u061D-\\u061F\\u066A-\\u066D\\u06D4\\u0700-\\u070D\\u07F7-\\u07F9\\u0830-\\u083E\\u085E\\u0964\\u0965\\u0970\\u09FD\\u0A76\\u0AF0\\u0C77\\u0C84\\u0DF4\\u0E4F\\u0E5A\\u0E5B\\u0F04-\\u0F12\\u0F14\\u0F3A-\\u0F3D\\u0F85\\u0FD0-\\u0FD4\\u0FD9\\u0FDA\\u104A-\\u104F\\u10FB\\u1360-\\u1368\\u1400\\u166E\\u169B\\u169C\\u16EB-\\u16ED\\u1735\\u1736\\u17D4-\\u17D6\\u17D8-\\u17DA\\u1800-\\u180A\\u1944\\u1945\\u1A1E\\u1A1F\\u1AA0-\\u1AA6\\u1AA8-\\u1AAD\\u1B5A-\\u1B60\\u1B7D\\u1B7E\\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-\\u2E4F\\u2E52-\\u2E5D\\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[\\uDEAD\\uDF55-\\uDF59\\uDF86-\\uDF89]|\\uD804[\\uDC47-\\uDC4D\\uDCBB\\uDCBC\\uDCBE-\\uDCC1\\uDD40-\\uDD43\\uDD74\\uDD75\\uDDC5-\\uDDC8\\uDDCD\\uDDDB\\uDDDD-\\uDDDF\\uDE38-\\uDE3D\\uDEA9]|\\uD805[\\uDC4B-\\uDC4F\\uDC5A\\uDC5B\\uDC5D\\uDCC6\\uDDC1-\\uDDD7\\uDE41-\\uDE43\\uDE60-\\uDE6C\\uDEB9\\uDF3C-\\uDF3E]|\\uD806[\\uDC3B\\uDD44-\\uDD46\\uDDE2\\uDE3F-\\uDE46\\uDE9A-\\uDE9C\\uDE9E-\\uDEA2\\uDF00-\\uDF09]|\\uD807[\\uDC41-\\uDC45\\uDC70\\uDC71\\uDEF7\\uDEF8\\uDF43-\\uDF4F\\uDFFF]|\\uD809[\\uDC70-\\uDC74]|\\uD80B[\\uDFF1\\uDFF2]|\\uD81A[\\uDE6E\\uDE6F\\uDEF5\\uDF37-\\uDF3B\\uDF44]|\\uD81B[\\uDE97-\\uDE9A\\uDFE2]|\\uD82F\\uDC9F|\\uD836[\\uDE87-\\uDE8B]|\\uD83A[\\uDD5E\\uDD5F]/;var Aa=/[\\$\\+<->\\^`\\|~\\xA2-\\xA6\\xA8\\xA9\\xAC\\xAE-\\xB1\\xB4\\xB8\\xD7\\xF7\\u02C2-\\u02C5\\u02D2-\\u02DF\\u02E5-\\u02EB\\u02ED\\u02EF-\\u02FF\\u0375\\u0384\\u0385\\u03F6\\u0482\\u058D-\\u058F\\u0606-\\u0608\\u060B\\u060E\\u060F\\u06DE\\u06E9\\u06FD\\u06FE\\u07F6\\u07FE\\u07FF\\u0888\\u09F2\\u09F3\\u09FA\\u09FB\\u0AF1\\u0B70\\u0BF3-\\u0BFA\\u0C7F\\u0D4F\\u0D79\\u0E3F\\u0F01-\\u0F03\\u0F13\\u0F15-\\u0F17\\u0F1A-\\u0F1F\\u0F34\\u0F36\\u0F38\\u0FBE-\\u0FC5\\u0FC7-\\u0FCC\\u0FCE\\u0FCF\\u0FD5-\\u0FD8\\u109E\\u109F\\u1390-\\u1399\\u166D\\u17DB\\u1940\\u19DE-\\u19FF\\u1B61-\\u1B6A\\u1B74-\\u1B7C\\u1FBD\\u1FBF-\\u1FC1\\u1FCD-\\u1FCF\\u1FDD-\\u1FDF\\u1FED-\\u1FEF\\u1FFD\\u1FFE\\u2044\\u2052\\u207A-\\u207C\\u208A-\\u208C\\u20A0-\\u20C0\\u2100\\u2101\\u2103-\\u2106\\u2108\\u2109\\u2114\\u2116-\\u2118\\u211E-\\u2123\\u2125\\u2127\\u2129\\u212E\\u213A\\u213B\\u2140-\\u2144\\u214A-\\u214D\\u214F\\u218A\\u218B\\u2190-\\u2307\\u230C-\\u2328\\u232B-\\u2426\\u2440-\\u244A\\u249C-\\u24E9\\u2500-\\u2767\\u2794-\\u27C4\\u27C7-\\u27E5\\u27F0-\\u2982\\u2999-\\u29D7\\u29DC-\\u29FB\\u29FE-\\u2B73\\u2B76-\\u2B95\\u2B97-\\u2BFF\\u2CE5-\\u2CEA\\u2E50\\u2E51\\u2E80-\\u2E99\\u2E9B-\\u2EF3\\u2F00-\\u2FD5\\u2FF0-\\u2FFF\\u3004\\u3012\\u3013\\u3020\\u3036\\u3037\\u303E\\u303F\\u309B\\u309C\\u3190\\u3191\\u3196-\\u319F\\u31C0-\\u31E3\\u31EF\\u3200-\\u321E\\u322A-\\u3247\\u3250\\u3260-\\u327F\\u328A-\\u32B0\\u32C0-\\u33FF\\u4DC0-\\u4DFF\\uA490-\\uA4C6\\uA700-\\uA716\\uA720\\uA721\\uA789\\uA78A\\uA828-\\uA82B\\uA836-\\uA839\\uAA77-\\uAA79\\uAB5B\\uAB6A\\uAB6B\\uFB29\\uFBB2-\\uFBC2\\uFD40-\\uFD4F\\uFDCF\\uFDFC-\\uFDFF\\uFE62\\uFE64-\\uFE66\\uFE69\\uFF04\\uFF0B\\uFF1C-\\uFF1E\\uFF3E\\uFF40\\uFF5C\\uFF5E\\uFFE0-\\uFFE6\\uFFE8-\\uFFEE\\uFFFC\\uFFFD]|\\uD800[\\uDD37-\\uDD3F\\uDD79-\\uDD89\\uDD8C-\\uDD8E\\uDD90-\\uDD9C\\uDDA0\\uDDD0-\\uDDFC]|\\uD802[\\uDC77\\uDC78\\uDEC8]|\\uD805\\uDF3F|\\uD807[\\uDFD5-\\uDFF1]|\\uD81A[\\uDF3C-\\uDF3F\\uDF45]|\\uD82F\\uDC9C|\\uD833[\\uDF50-\\uDFC3]|\\uD834[\\uDC00-\\uDCF5\\uDD00-\\uDD26\\uDD29-\\uDD64\\uDD6A-\\uDD6C\\uDD83\\uDD84\\uDD8C-\\uDDA9\\uDDAE-\\uDDEA\\uDE00-\\uDE41\\uDE45\\uDF00-\\uDF56]|\\uD835[\\uDEC1\\uDEDB\\uDEFB\\uDF15\\uDF35\\uDF4F\\uDF6F\\uDF89\\uDFA9\\uDFC3]|\\uD836[\\uDC00-\\uDDFF\\uDE37-\\uDE3A\\uDE6D-\\uDE74\\uDE76-\\uDE83\\uDE85\\uDE86]|\\uD838[\\uDD4F\\uDEFF]|\\uD83B[\\uDCAC\\uDCB0\\uDD2E\\uDEF0\\uDEF1]|\\uD83C[\\uDC00-\\uDC2B\\uDC30-\\uDC93\\uDCA0-\\uDCAE\\uDCB1-\\uDCBF\\uDCC1-\\uDCCF\\uDCD1-\\uDCF5\\uDD0D-\\uDDAD\\uDDE6-\\uDE02\\uDE10-\\uDE3B\\uDE40-\\uDE48\\uDE50\\uDE51\\uDE60-\\uDE65\\uDF00-\\uDFFF]|\\uD83D[\\uDC00-\\uDED7\\uDEDC-\\uDEEC\\uDEF0-\\uDEFC\\uDF00-\\uDF76\\uDF7B-\\uDFD9\\uDFE0-\\uDFEB\\uDFF0]|\\uD83E[\\uDC00-\\uDC0B\\uDC10-\\uDC47\\uDC50-\\uDC59\\uDC60-\\uDC87\\uDC90-\\uDCAD\\uDCB0\\uDCB1\\uDD00-\\uDE53\\uDE60-\\uDE6D\\uDE70-\\uDE7C\\uDE80-\\uDE88\\uDE90-\\uDEBD\\uDEBF-\\uDEC5\\uDECE-\\uDEDB\\uDEE0-\\uDEE8\\uDEF0-\\uDEF8\\uDF00-\\uDF92\\uDF94-\\uDFCA]/;var Na=/[ \\xA0\\u1680\\u2000-\\u200A\\u2028\\u2029\\u202F\\u205F\\u3000]/;var uv=new Uint16Array('\\u1D41<\\xD5\\u0131\\u028A\\u049D\\u057B\\u05D0\\u0675\\u06DE\\u07A2\\u07D6\\u080F\\u0A4A\\u0A91\\u0DA1\\u0E6D\\u0F09\\u0F26\\u10CA\\u1228\\u12E1\\u1415\\u149D\\u14C3\\u14DF\\u1525\\0\\0\\0\\0\\0\\0\\u156B\\u16CD\\u198D\\u1C12\\u1DDD\\u1F7E\\u2060\\u21B0\\u228D\\u23C0\\u23FB\\u2442\\u2824\\u2912\\u2D08\\u2E48\\u2FCE\\u3016\\u32BA\\u3639\\u37AC\\u38FE\\u3A28\\u3A71\\u3AE0\\u3B2E\\u0800EMabcfglmnoprstu\\\\bfms\\x7F\\x84\\x8B\\x90\\x95\\x98\\xA6\\xB3\\xB9\\xC8\\xCFlig\\u803B\\xC6\\u40C6P\\u803B&\\u4026cute\\u803B\\xC1\\u40C1reve;\\u4102\\u0100iyx}rc\\u803B\\xC2\\u40C2;\\u4410r;\\uC000\\u{1D504}rave\\u803B\\xC0\\u40C0pha;\\u4391acr;\\u4100d;\\u6A53\\u0100gp\\x9D\\xA1on;\\u4104f;\\uC000\\u{1D538}plyFunction;\\u6061ing\\u803B\\xC5\\u40C5\\u0100cs\\xBE\\xC3r;\\uC000\\u{1D49C}ign;\\u6254ilde\\u803B\\xC3\\u40C3ml\\u803B\\xC4\\u40C4\\u0400aceforsu\\xE5\\xFB\\xFE\\u0117\\u011C\\u0122\\u0127\\u012A\\u0100cr\\xEA\\xF2kslash;\\u6216\\u0176\\xF6\\xF8;\\u6AE7ed;\\u6306y;\\u4411\\u0180crt\\u0105\\u010B\\u0114ause;\\u6235noullis;\\u612Ca;\\u4392r;\\uC000\\u{1D505}pf;\\uC000\\u{1D539}eve;\\u42D8c\\xF2\\u0113mpeq;\\u624E\\u0700HOacdefhilorsu\\u014D\\u0151\\u0156\\u0180\\u019E\\u01A2\\u01B5\\u01B7\\u01BA\\u01DC\\u0215\\u0273\\u0278\\u027Ecy;\\u4427PY\\u803B\\xA9\\u40A9\\u0180cpy\\u015D\\u0162\\u017Aute;\\u4106\\u0100;i\\u0167\\u0168\\u62D2talDifferentialD;\\u6145leys;\\u612D\\u0200aeio\\u0189\\u018E\\u0194\\u0198ron;\\u410Cdil\\u803B\\xC7\\u40C7rc;\\u4108nint;\\u6230ot;\\u410A\\u0100dn\\u01A7\\u01ADilla;\\u40B8terDot;\\u40B7\\xF2\\u017Fi;\\u43A7rcle\\u0200DMPT\\u01C7\\u01CB\\u01D1\\u01D6ot;\\u6299inus;\\u6296lus;\\u6295imes;\\u6297o\\u0100cs\\u01E2\\u01F8kwiseContourIntegral;\\u6232eCurly\\u0100DQ\\u0203\\u020FoubleQuote;\\u601Duote;\\u6019\\u0200lnpu\\u021E\\u0228\\u0247\\u0255on\\u0100;e\\u0225\\u0226\\u6237;\\u6A74\\u0180git\\u022F\\u0236\\u023Aruent;\\u6261nt;\\u622FourIntegral;\\u622E\\u0100fr\\u024C\\u024E;\\u6102oduct;\\u6210nterClockwiseContourIntegral;\\u6233oss;\\u6A2Fcr;\\uC000\\u{1D49E}p\\u0100;C\\u0284\\u0285\\u62D3ap;\\u624D\\u0580DJSZacefios\\u02A0\\u02AC\\u02B0\\u02B4\\u02B8\\u02CB\\u02D7\\u02E1\\u02E6\\u0333\\u048D\\u0100;o\\u0179\\u02A5trahd;\\u6911cy;\\u4402cy;\\u4405cy;\\u440F\\u0180grs\\u02BF\\u02C4\\u02C7ger;\\u6021r;\\u61A1hv;\\u6AE4\\u0100ay\\u02D0\\u02D5ron;\\u410E;\\u4414l\\u0100;t\\u02DD\\u02DE\\u6207a;\\u4394r;\\uC000\\u{1D507}\\u0100af\\u02EB\\u0327\\u0100cm\\u02F0\\u0322ritical\\u0200ADGT\\u0300\\u0306\\u0316\\u031Ccute;\\u40B4o\\u0174\\u030B\\u030D;\\u42D9bleAcute;\\u42DDrave;\\u4060ilde;\\u42DCond;\\u62C4ferentialD;\\u6146\\u0470\\u033D\\0\\0\\0\\u0342\\u0354\\0\\u0405f;\\uC000\\u{1D53B}\\u0180;DE\\u0348\\u0349\\u034D\\u40A8ot;\\u60DCqual;\\u6250ble\\u0300CDLRUV\\u0363\\u0372\\u0382\\u03CF\\u03E2\\u03F8ontourIntegra\\xEC\\u0239o\\u0274\\u0379\\0\\0\\u037B\\xBB\\u0349nArrow;\\u61D3\\u0100eo\\u0387\\u03A4ft\\u0180ART\\u0390\\u0396\\u03A1rrow;\\u61D0ightArrow;\\u61D4e\\xE5\\u02CAng\\u0100LR\\u03AB\\u03C4eft\\u0100AR\\u03B3\\u03B9rrow;\\u67F8ightArrow;\\u67FAightArrow;\\u67F9ight\\u0100AT\\u03D8\\u03DErrow;\\u61D2ee;\\u62A8p\\u0241\\u03E9\\0\\0\\u03EFrrow;\\u61D1ownArrow;\\u61D5erticalBar;\\u6225n\\u0300ABLRTa\\u0412\\u042A\\u0430\\u045E\\u047F\\u037Crrow\\u0180;BU\\u041D\\u041E\\u0422\\u6193ar;\\u6913pArrow;\\u61F5reve;\\u4311eft\\u02D2\\u043A\\0\\u0446\\0\\u0450ightVector;\\u6950eeVector;\\u695Eector\\u0100;B\\u0459\\u045A\\u61BDar;\\u6956ight\\u01D4\\u0467\\0\\u0471eeVector;\\u695Fector\\u0100;B\\u047A\\u047B\\u61C1ar;\\u6957ee\\u0100;A\\u0486\\u0487\\u62A4rrow;\\u61A7\\u0100ct\\u0492\\u0497r;\\uC000\\u{1D49F}rok;\\u4110\\u0800NTacdfglmopqstux\\u04BD\\u04C0\\u04C4\\u04CB\\u04DE\\u04E2\\u04E7\\u04EE\\u04F5\\u0521\\u052F\\u0536\\u0552\\u055D\\u0560\\u0565G;\\u414AH\\u803B\\xD0\\u40D0cute\\u803B\\xC9\\u40C9\\u0180aiy\\u04D2\\u04D7\\u04DCron;\\u411Arc\\u803B\\xCA\\u40CA;\\u442Dot;\\u4116r;\\uC000\\u{1D508}rave\\u803B\\xC8\\u40C8ement;\\u6208\\u0100ap\\u04FA\\u04FEcr;\\u4112ty\\u0253\\u0506\\0\\0\\u0512mallSquare;\\u65FBerySmallSquare;\\u65AB\\u0100gp\\u0526\\u052Aon;\\u4118f;\\uC000\\u{1D53C}silon;\\u4395u\\u0100ai\\u053C\\u0549l\\u0100;T\\u0542\\u0543\\u6A75ilde;\\u6242librium;\\u61CC\\u0100ci\\u0557\\u055Ar;\\u6130m;\\u6A73a;\\u4397ml\\u803B\\xCB\\u40CB\\u0100ip\\u056A\\u056Fsts;\\u6203onentialE;\\u6147\\u0280cfios\\u0585\\u0588\\u058D\\u05B2\\u05CCy;\\u4424r;\\uC000\\u{1D509}lled\\u0253\\u0597\\0\\0\\u05A3mallSquare;\\u65FCerySmallSquare;\\u65AA\\u0370\\u05BA\\0\\u05BF\\0\\0\\u05C4f;\\uC000\\u{1D53D}All;\\u6200riertrf;\\u6131c\\xF2\\u05CB\\u0600JTabcdfgorst\\u05E8\\u05EC\\u05EF\\u05FA\\u0600\\u0612\\u0616\\u061B\\u061D\\u0623\\u066C\\u0672cy;\\u4403\\u803B>\\u403Emma\\u0100;d\\u05F7\\u05F8\\u4393;\\u43DCreve;\\u411E\\u0180eiy\\u0607\\u060C\\u0610dil;\\u4122rc;\\u411C;\\u4413ot;\\u4120r;\\uC000\\u{1D50A};\\u62D9pf;\\uC000\\u{1D53E}eater\\u0300EFGLST\\u0635\\u0644\\u064E\\u0656\\u065B\\u0666qual\\u0100;L\\u063E\\u063F\\u6265ess;\\u62DBullEqual;\\u6267reater;\\u6AA2ess;\\u6277lantEqual;\\u6A7Eilde;\\u6273cr;\\uC000\\u{1D4A2};\\u626B\\u0400Aacfiosu\\u0685\\u068B\\u0696\\u069B\\u069E\\u06AA\\u06BE\\u06CARDcy;\\u442A\\u0100ct\\u0690\\u0694ek;\\u42C7;\\u405Eirc;\\u4124r;\\u610ClbertSpace;\\u610B\\u01F0\\u06AF\\0\\u06B2f;\\u610DizontalLine;\\u6500\\u0100ct\\u06C3\\u06C5\\xF2\\u06A9rok;\\u4126mp\\u0144\\u06D0\\u06D8ownHum\\xF0\\u012Fqual;\\u624F\\u0700EJOacdfgmnostu\\u06FA\\u06FE\\u0703\\u0707\\u070E\\u071A\\u071E\\u0721\\u0728\\u0744\\u0778\\u078B\\u078F\\u0795cy;\\u4415lig;\\u4132cy;\\u4401cute\\u803B\\xCD\\u40CD\\u0100iy\\u0713\\u0718rc\\u803B\\xCE\\u40CE;\\u4418ot;\\u4130r;\\u6111rave\\u803B\\xCC\\u40CC\\u0180;ap\\u0720\\u072F\\u073F\\u0100cg\\u0734\\u0737r;\\u412AinaryI;\\u6148lie\\xF3\\u03DD\\u01F4\\u0749\\0\\u0762\\u0100;e\\u074D\\u074E\\u622C\\u0100gr\\u0753\\u0758ral;\\u622Bsection;\\u62C2isible\\u0100CT\\u076C\\u0772omma;\\u6063imes;\\u6062\\u0180gpt\\u077F\\u0783\\u0788on;\\u412Ef;\\uC000\\u{1D540}a;\\u4399cr;\\u6110ilde;\\u4128\\u01EB\\u079A\\0\\u079Ecy;\\u4406l\\u803B\\xCF\\u40CF\\u0280cfosu\\u07AC\\u07B7\\u07BC\\u07C2\\u07D0\\u0100iy\\u07B1\\u07B5rc;\\u4134;\\u4419r;\\uC000\\u{1D50D}pf;\\uC000\\u{1D541}\\u01E3\\u07C7\\0\\u07CCr;\\uC000\\u{1D4A5}rcy;\\u4408kcy;\\u4404\\u0380HJacfos\\u07E4\\u07E8\\u07EC\\u07F1\\u07FD\\u0802\\u0808cy;\\u4425cy;\\u440Cppa;\\u439A\\u0100ey\\u07F6\\u07FBdil;\\u4136;\\u441Ar;\\uC000\\u{1D50E}pf;\\uC000\\u{1D542}cr;\\uC000\\u{1D4A6}\\u0580JTaceflmost\\u0825\\u0829\\u082C\\u0850\\u0863\\u09B3\\u09B8\\u09C7\\u09CD\\u0A37\\u0A47cy;\\u4409\\u803B<\\u403C\\u0280cmnpr\\u0837\\u083C\\u0841\\u0844\\u084Dute;\\u4139bda;\\u439Bg;\\u67EAlacetrf;\\u6112r;\\u619E\\u0180aey\\u0857\\u085C\\u0861ron;\\u413Ddil;\\u413B;\\u441B\\u0100fs\\u0868\\u0970t\\u0500ACDFRTUVar\\u087E\\u08A9\\u08B1\\u08E0\\u08E6\\u08FC\\u092F\\u095B\\u0390\\u096A\\u0100nr\\u0883\\u088FgleBracket;\\u67E8row\\u0180;BR\\u0899\\u089A\\u089E\\u6190ar;\\u61E4ightArrow;\\u61C6eiling;\\u6308o\\u01F5\\u08B7\\0\\u08C3bleBracket;\\u67E6n\\u01D4\\u08C8\\0\\u08D2eeVector;\\u6961ector\\u0100;B\\u08DB\\u08DC\\u61C3ar;\\u6959loor;\\u630Aight\\u0100AV\\u08EF\\u08F5rrow;\\u6194ector;\\u694E\\u0100er\\u0901\\u0917e\\u0180;AV\\u0909\\u090A\\u0910\\u62A3rrow;\\u61A4ector;\\u695Aiangle\\u0180;BE\\u0924\\u0925\\u0929\\u62B2ar;\\u69CFqual;\\u62B4p\\u0180DTV\\u0937\\u0942\\u094CownVector;\\u6951eeVector;\\u6960ector\\u0100;B\\u0956\\u0957\\u61BFar;\\u6958ector\\u0100;B\\u0965\\u0966\\u61BCar;\\u6952ight\\xE1\\u039Cs\\u0300EFGLST\\u097E\\u098B\\u0995\\u099D\\u09A2\\u09ADqualGreater;\\u62DAullEqual;\\u6266reater;\\u6276ess;\\u6AA1lantEqual;\\u6A7Dilde;\\u6272r;\\uC000\\u{1D50F}\\u0100;e\\u09BD\\u09BE\\u62D8ftarrow;\\u61DAidot;\\u413F\\u0180npw\\u09D4\\u0A16\\u0A1Bg\\u0200LRlr\\u09DE\\u09F7\\u0A02\\u0A10eft\\u0100AR\\u09E6\\u09ECrrow;\\u67F5ightArrow;\\u67F7ightArrow;\\u67F6eft\\u0100ar\\u03B3\\u0A0Aight\\xE1\\u03BFight\\xE1\\u03CAf;\\uC000\\u{1D543}er\\u0100LR\\u0A22\\u0A2CeftArrow;\\u6199ightArrow;\\u6198\\u0180cht\\u0A3E\\u0A40\\u0A42\\xF2\\u084C;\\u61B0rok;\\u4141;\\u626A\\u0400acefiosu\\u0A5A\\u0A5D\\u0A60\\u0A77\\u0A7C\\u0A85\\u0A8B\\u0A8Ep;\\u6905y;\\u441C\\u0100dl\\u0A65\\u0A6FiumSpace;\\u605Flintrf;\\u6133r;\\uC000\\u{1D510}nusPlus;\\u6213pf;\\uC000\\u{1D544}c\\xF2\\u0A76;\\u439C\\u0480Jacefostu\\u0AA3\\u0AA7\\u0AAD\\u0AC0\\u0B14\\u0B19\\u0D91\\u0D97\\u0D9Ecy;\\u440Acute;\\u4143\\u0180aey\\u0AB4\\u0AB9\\u0ABEron;\\u4147dil;\\u4145;\\u441D\\u0180gsw\\u0AC7\\u0AF0\\u0B0Eative\\u0180MTV\\u0AD3\\u0ADF\\u0AE8ediumSpace;\\u600Bhi\\u0100cn\\u0AE6\\u0AD8\\xEB\\u0AD9eryThi\\xEE\\u0AD9ted\\u0100GL\\u0AF8\\u0B06reaterGreate\\xF2\\u0673essLes\\xF3\\u0A48Line;\\u400Ar;\\uC000\\u{1D511}\\u0200Bnpt\\u0B22\\u0B28\\u0B37\\u0B3Areak;\\u6060BreakingSpace;\\u40A0f;\\u6115\\u0680;CDEGHLNPRSTV\\u0B55\\u0B56\\u0B6A\\u0B7C\\u0BA1\\u0BEB\\u0C04\\u0C5E\\u0C84\\u0CA6\\u0CD8\\u0D61\\u0D85\\u6AEC\\u0100ou\\u0B5B\\u0B64ngruent;\\u6262pCap;\\u626DoubleVerticalBar;\\u6226\\u0180lqx\\u0B83\\u0B8A\\u0B9Bement;\\u6209ual\\u0100;T\\u0B92\\u0B93\\u6260ilde;\\uC000\\u2242\\u0338ists;\\u6204reater\\u0380;EFGLST\\u0BB6\\u0BB7\\u0BBD\\u0BC9\\u0BD3\\u0BD8\\u0BE5\\u626Fqual;\\u6271ullEqual;\\uC000\\u2267\\u0338reater;\\uC000\\u226B\\u0338ess;\\u6279lantEqual;\\uC000\\u2A7E\\u0338ilde;\\u6275ump\\u0144\\u0BF2\\u0BFDownHump;\\uC000\\u224E\\u0338qual;\\uC000\\u224F\\u0338e\\u0100fs\\u0C0A\\u0C27tTriangle\\u0180;BE\\u0C1A\\u0C1B\\u0C21\\u62EAar;\\uC000\\u29CF\\u0338qual;\\u62ECs\\u0300;EGLST\\u0C35\\u0C36\\u0C3C\\u0C44\\u0C4B\\u0C58\\u626Equal;\\u6270reater;\\u6278ess;\\uC000\\u226A\\u0338lantEqual;\\uC000\\u2A7D\\u0338ilde;\\u6274ested\\u0100GL\\u0C68\\u0C79reaterGreater;\\uC000\\u2AA2\\u0338essLess;\\uC000\\u2AA1\\u0338recedes\\u0180;ES\\u0C92\\u0C93\\u0C9B\\u6280qual;\\uC000\\u2AAF\\u0338lantEqual;\\u62E0\\u0100ei\\u0CAB\\u0CB9verseElement;\\u620CghtTriangle\\u0180;BE\\u0CCB\\u0CCC\\u0CD2\\u62EBar;\\uC000\\u29D0\\u0338qual;\\u62ED\\u0100qu\\u0CDD\\u0D0CuareSu\\u0100bp\\u0CE8\\u0CF9set\\u0100;E\\u0CF0\\u0CF3\\uC000\\u228F\\u0338qual;\\u62E2erset\\u0100;E\\u0D03\\u0D06\\uC000\\u2290\\u0338qual;\\u62E3\\u0180bcp\\u0D13\\u0D24\\u0D4Eset\\u0100;E\\u0D1B\\u0D1E\\uC000\\u2282\\u20D2qual;\\u6288ceeds\\u0200;EST\\u0D32\\u0D33\\u0D3B\\u0D46\\u6281qual;\\uC000\\u2AB0\\u0338lantEqual;\\u62E1ilde;\\uC000\\u227F\\u0338erset\\u0100;E\\u0D58\\u0D5B\\uC000\\u2283\\u20D2qual;\\u6289ilde\\u0200;EFT\\u0D6E\\u0D6F\\u0D75\\u0D7F\\u6241qual;\\u6244ullEqual;\\u6247ilde;\\u6249erticalBar;\\u6224cr;\\uC000\\u{1D4A9}ilde\\u803B\\xD1\\u40D1;\\u439D\\u0700Eacdfgmoprstuv\\u0DBD\\u0DC2\\u0DC9\\u0DD5\\u0DDB\\u0DE0\\u0DE7\\u0DFC\\u0E02\\u0E20\\u0E22\\u0E32\\u0E3F\\u0E44lig;\\u4152cute\\u803B\\xD3\\u40D3\\u0100iy\\u0DCE\\u0DD3rc\\u803B\\xD4\\u40D4;\\u441Eblac;\\u4150r;\\uC000\\u{1D512}rave\\u803B\\xD2\\u40D2\\u0180aei\\u0DEE\\u0DF2\\u0DF6cr;\\u414Cga;\\u43A9cron;\\u439Fpf;\\uC000\\u{1D546}enCurly\\u0100DQ\\u0E0E\\u0E1AoubleQuote;\\u601Cuote;\\u6018;\\u6A54\\u0100cl\\u0E27\\u0E2Cr;\\uC000\\u{1D4AA}ash\\u803B\\xD8\\u40D8i\\u016C\\u0E37\\u0E3Cde\\u803B\\xD5\\u40D5es;\\u6A37ml\\u803B\\xD6\\u40D6er\\u0100BP\\u0E4B\\u0E60\\u0100ar\\u0E50\\u0E53r;\\u603Eac\\u0100ek\\u0E5A\\u0E5C;\\u63DEet;\\u63B4arenthesis;\\u63DC\\u0480acfhilors\\u0E7F\\u0E87\\u0E8A\\u0E8F\\u0E92\\u0E94\\u0E9D\\u0EB0\\u0EFCrtialD;\\u6202y;\\u441Fr;\\uC000\\u{1D513}i;\\u43A6;\\u43A0usMinus;\\u40B1\\u0100ip\\u0EA2\\u0EADncareplan\\xE5\\u069Df;\\u6119\\u0200;eio\\u0EB9\\u0EBA\\u0EE0\\u0EE4\\u6ABBcedes\\u0200;EST\\u0EC8\\u0EC9\\u0ECF\\u0EDA\\u627Aqual;\\u6AAFlantEqual;\\u627Cilde;\\u627Eme;\\u6033\\u0100dp\\u0EE9\\u0EEEuct;\\u620Fortion\\u0100;a\\u0225\\u0EF9l;\\u621D\\u0100ci\\u0F01\\u0F06r;\\uC000\\u{1D4AB};\\u43A8\\u0200Ufos\\u0F11\\u0F16\\u0F1B\\u0F1FOT\\u803B\"\\u4022r;\\uC000\\u{1D514}pf;\\u611Acr;\\uC000\\u{1D4AC}\\u0600BEacefhiorsu\\u0F3E\\u0F43\\u0F47\\u0F60\\u0F73\\u0FA7\\u0FAA\\u0FAD\\u1096\\u10A9\\u10B4\\u10BEarr;\\u6910G\\u803B\\xAE\\u40AE\\u0180cnr\\u0F4E\\u0F53\\u0F56ute;\\u4154g;\\u67EBr\\u0100;t\\u0F5C\\u0F5D\\u61A0l;\\u6916\\u0180aey\\u0F67\\u0F6C\\u0F71ron;\\u4158dil;\\u4156;\\u4420\\u0100;v\\u0F78\\u0F79\\u611Cerse\\u0100EU\\u0F82\\u0F99\\u0100lq\\u0F87\\u0F8Eement;\\u620Builibrium;\\u61CBpEquilibrium;\\u696Fr\\xBB\\u0F79o;\\u43A1ght\\u0400ACDFTUVa\\u0FC1\\u0FEB\\u0FF3\\u1022\\u1028\\u105B\\u1087\\u03D8\\u0100nr\\u0FC6\\u0FD2gleBracket;\\u67E9row\\u0180;BL\\u0FDC\\u0FDD\\u0FE1\\u6192ar;\\u61E5eftArrow;\\u61C4eiling;\\u6309o\\u01F5\\u0FF9\\0\\u1005bleBracket;\\u67E7n\\u01D4\\u100A\\0\\u1014eeVector;\\u695Dector\\u0100;B\\u101D\\u101E\\u61C2ar;\\u6955loor;\\u630B\\u0100er\\u102D\\u1043e\\u0180;AV\\u1035\\u1036\\u103C\\u62A2rrow;\\u61A6ector;\\u695Biangle\\u0180;BE\\u1050\\u1051\\u1055\\u62B3ar;\\u69D0qual;\\u62B5p\\u0180DTV\\u1063\\u106E\\u1078ownVector;\\u694FeeVector;\\u695Cector\\u0100;B\\u1082\\u1083\\u61BEar;\\u6954ector\\u0100;B\\u1091\\u1092\\u61C0ar;\\u6953\\u0100pu\\u109B\\u109Ef;\\u611DndImplies;\\u6970ightarrow;\\u61DB\\u0100ch\\u10B9\\u10BCr;\\u611B;\\u61B1leDelayed;\\u69F4\\u0680HOacfhimoqstu\\u10E4\\u10F1\\u10F7\\u10FD\\u1119\\u111E\\u1151\\u1156\\u1161\\u1167\\u11B5\\u11BB\\u11BF\\u0100Cc\\u10E9\\u10EEHcy;\\u4429y;\\u4428FTcy;\\u442Ccute;\\u415A\\u0280;aeiy\\u1108\\u1109\\u110E\\u1113\\u1117\\u6ABCron;\\u4160dil;\\u415Erc;\\u415C;\\u4421r;\\uC000\\u{1D516}ort\\u0200DLRU\\u112A\\u1134\\u113E\\u1149ownArrow\\xBB\\u041EeftArrow\\xBB\\u089AightArrow\\xBB\\u0FDDpArrow;\\u6191gma;\\u43A3allCircle;\\u6218pf;\\uC000\\u{1D54A}\\u0272\\u116D\\0\\0\\u1170t;\\u621Aare\\u0200;ISU\\u117B\\u117C\\u1189\\u11AF\\u65A1ntersection;\\u6293u\\u0100bp\\u118F\\u119Eset\\u0100;E\\u1197\\u1198\\u628Fqual;\\u6291erset\\u0100;E\\u11A8\\u11A9\\u6290qual;\\u6292nion;\\u6294cr;\\uC000\\u{1D4AE}ar;\\u62C6\\u0200bcmp\\u11C8\\u11DB\\u1209\\u120B\\u0100;s\\u11CD\\u11CE\\u62D0et\\u0100;E\\u11CD\\u11D5qual;\\u6286\\u0100ch\\u11E0\\u1205eeds\\u0200;EST\\u11ED\\u11EE\\u11F4\\u11FF\\u627Bqual;\\u6AB0lantEqual;\\u627Dilde;\\u627FTh\\xE1\\u0F8C;\\u6211\\u0180;es\\u1212\\u1213\\u1223\\u62D1rset\\u0100;E\\u121C\\u121D\\u6283qual;\\u6287et\\xBB\\u1213\\u0580HRSacfhiors\\u123E\\u1244\\u1249\\u1255\\u125E\\u1271\\u1276\\u129F\\u12C2\\u12C8\\u12D1ORN\\u803B\\xDE\\u40DEADE;\\u6122\\u0100Hc\\u124E\\u1252cy;\\u440By;\\u4426\\u0100bu\\u125A\\u125C;\\u4009;\\u43A4\\u0180aey\\u1265\\u126A\\u126Fron;\\u4164dil;\\u4162;\\u4422r;\\uC000\\u{1D517}\\u0100ei\\u127B\\u1289\\u01F2\\u1280\\0\\u1287efore;\\u6234a;\\u4398\\u0100cn\\u128E\\u1298kSpace;\\uC000\\u205F\\u200ASpace;\\u6009lde\\u0200;EFT\\u12AB\\u12AC\\u12B2\\u12BC\\u623Cqual;\\u6243ullEqual;\\u6245ilde;\\u6248pf;\\uC000\\u{1D54B}ipleDot;\\u60DB\\u0100ct\\u12D6\\u12DBr;\\uC000\\u{1D4AF}rok;\\u4166\\u0AE1\\u12F7\\u130E\\u131A\\u1326\\0\\u132C\\u1331\\0\\0\\0\\0\\0\\u1338\\u133D\\u1377\\u1385\\0\\u13FF\\u1404\\u140A\\u1410\\u0100cr\\u12FB\\u1301ute\\u803B\\xDA\\u40DAr\\u0100;o\\u1307\\u1308\\u619Fcir;\\u6949r\\u01E3\\u1313\\0\\u1316y;\\u440Eve;\\u416C\\u0100iy\\u131E\\u1323rc\\u803B\\xDB\\u40DB;\\u4423blac;\\u4170r;\\uC000\\u{1D518}rave\\u803B\\xD9\\u40D9acr;\\u416A\\u0100di\\u1341\\u1369er\\u0100BP\\u1348\\u135D\\u0100ar\\u134D\\u1350r;\\u405Fac\\u0100ek\\u1357\\u1359;\\u63DFet;\\u63B5arenthesis;\\u63DDon\\u0100;P\\u1370\\u1371\\u62C3lus;\\u628E\\u0100gp\\u137B\\u137Fon;\\u4172f;\\uC000\\u{1D54C}\\u0400ADETadps\\u1395\\u13AE\\u13B8\\u13C4\\u03E8\\u13D2\\u13D7\\u13F3rrow\\u0180;BD\\u1150\\u13A0\\u13A4ar;\\u6912ownArrow;\\u61C5ownArrow;\\u6195quilibrium;\\u696Eee\\u0100;A\\u13CB\\u13CC\\u62A5rrow;\\u61A5own\\xE1\\u03F3er\\u0100LR\\u13DE\\u13E8eftArrow;\\u6196ightArrow;\\u6197i\\u0100;l\\u13F9\\u13FA\\u43D2on;\\u43A5ing;\\u416Ecr;\\uC000\\u{1D4B0}ilde;\\u4168ml\\u803B\\xDC\\u40DC\\u0480Dbcdefosv\\u1427\\u142C\\u1430\\u1433\\u143E\\u1485\\u148A\\u1490\\u1496ash;\\u62ABar;\\u6AEBy;\\u4412ash\\u0100;l\\u143B\\u143C\\u62A9;\\u6AE6\\u0100er\\u1443\\u1445;\\u62C1\\u0180bty\\u144C\\u1450\\u147Aar;\\u6016\\u0100;i\\u144F\\u1455cal\\u0200BLST\\u1461\\u1465\\u146A\\u1474ar;\\u6223ine;\\u407Ceparator;\\u6758ilde;\\u6240ThinSpace;\\u600Ar;\\uC000\\u{1D519}pf;\\uC000\\u{1D54D}cr;\\uC000\\u{1D4B1}dash;\\u62AA\\u0280cefos\\u14A7\\u14AC\\u14B1\\u14B6\\u14BCirc;\\u4174dge;\\u62C0r;\\uC000\\u{1D51A}pf;\\uC000\\u{1D54E}cr;\\uC000\\u{1D4B2}\\u0200fios\\u14CB\\u14D0\\u14D2\\u14D8r;\\uC000\\u{1D51B};\\u439Epf;\\uC000\\u{1D54F}cr;\\uC000\\u{1D4B3}\\u0480AIUacfosu\\u14F1\\u14F5\\u14F9\\u14FD\\u1504\\u150F\\u1514\\u151A\\u1520cy;\\u442Fcy;\\u4407cy;\\u442Ecute\\u803B\\xDD\\u40DD\\u0100iy\\u1509\\u150Drc;\\u4176;\\u442Br;\\uC000\\u{1D51C}pf;\\uC000\\u{1D550}cr;\\uC000\\u{1D4B4}ml;\\u4178\\u0400Hacdefos\\u1535\\u1539\\u153F\\u154B\\u154F\\u155D\\u1560\\u1564cy;\\u4416cute;\\u4179\\u0100ay\\u1544\\u1549ron;\\u417D;\\u4417ot;\\u417B\\u01F2\\u1554\\0\\u155BoWidt\\xE8\\u0AD9a;\\u4396r;\\u6128pf;\\u6124cr;\\uC000\\u{1D4B5}\\u0BE1\\u1583\\u158A\\u1590\\0\\u15B0\\u15B6\\u15BF\\0\\0\\0\\0\\u15C6\\u15DB\\u15EB\\u165F\\u166D\\0\\u1695\\u169B\\u16B2\\u16B9\\0\\u16BEcute\\u803B\\xE1\\u40E1reve;\\u4103\\u0300;Ediuy\\u159C\\u159D\\u15A1\\u15A3\\u15A8\\u15AD\\u623E;\\uC000\\u223E\\u0333;\\u623Frc\\u803B\\xE2\\u40E2te\\u80BB\\xB4\\u0306;\\u4430lig\\u803B\\xE6\\u40E6\\u0100;r\\xB2\\u15BA;\\uC000\\u{1D51E}rave\\u803B\\xE0\\u40E0\\u0100ep\\u15CA\\u15D6\\u0100fp\\u15CF\\u15D4sym;\\u6135\\xE8\\u15D3ha;\\u43B1\\u0100ap\\u15DFc\\u0100cl\\u15E4\\u15E7r;\\u4101g;\\u6A3F\\u0264\\u15F0\\0\\0\\u160A\\u0280;adsv\\u15FA\\u15FB\\u15FF\\u1601\\u1607\\u6227nd;\\u6A55;\\u6A5Clope;\\u6A58;\\u6A5A\\u0380;elmrsz\\u1618\\u1619\\u161B\\u161E\\u163F\\u164F\\u1659\\u6220;\\u69A4e\\xBB\\u1619sd\\u0100;a\\u1625\\u1626\\u6221\\u0461\\u1630\\u1632\\u1634\\u1636\\u1638\\u163A\\u163C\\u163E;\\u69A8;\\u69A9;\\u69AA;\\u69AB;\\u69AC;\\u69AD;\\u69AE;\\u69AFt\\u0100;v\\u1645\\u1646\\u621Fb\\u0100;d\\u164C\\u164D\\u62BE;\\u699D\\u0100pt\\u1654\\u1657h;\\u6222\\xBB\\xB9arr;\\u637C\\u0100gp\\u1663\\u1667on;\\u4105f;\\uC000\\u{1D552}\\u0380;Eaeiop\\u12C1\\u167B\\u167D\\u1682\\u1684\\u1687\\u168A;\\u6A70cir;\\u6A6F;\\u624Ad;\\u624Bs;\\u4027rox\\u0100;e\\u12C1\\u1692\\xF1\\u1683ing\\u803B\\xE5\\u40E5\\u0180cty\\u16A1\\u16A6\\u16A8r;\\uC000\\u{1D4B6};\\u402Amp\\u0100;e\\u12C1\\u16AF\\xF1\\u0288ilde\\u803B\\xE3\\u40E3ml\\u803B\\xE4\\u40E4\\u0100ci\\u16C2\\u16C8onin\\xF4\\u0272nt;\\u6A11\\u0800Nabcdefiklnoprsu\\u16ED\\u16F1\\u1730\\u173C\\u1743\\u1748\\u1778\\u177D\\u17E0\\u17E6\\u1839\\u1850\\u170D\\u193D\\u1948\\u1970ot;\\u6AED\\u0100cr\\u16F6\\u171Ek\\u0200ceps\\u1700\\u1705\\u170D\\u1713ong;\\u624Cpsilon;\\u43F6rime;\\u6035im\\u0100;e\\u171A\\u171B\\u623Dq;\\u62CD\\u0176\\u1722\\u1726ee;\\u62BDed\\u0100;g\\u172C\\u172D\\u6305e\\xBB\\u172Drk\\u0100;t\\u135C\\u1737brk;\\u63B6\\u0100oy\\u1701\\u1741;\\u4431quo;\\u601E\\u0280cmprt\\u1753\\u175B\\u1761\\u1764\\u1768aus\\u0100;e\\u010A\\u0109ptyv;\\u69B0s\\xE9\\u170Cno\\xF5\\u0113\\u0180ahw\\u176F\\u1771\\u1773;\\u43B2;\\u6136een;\\u626Cr;\\uC000\\u{1D51F}g\\u0380costuvw\\u178D\\u179D\\u17B3\\u17C1\\u17D5\\u17DB\\u17DE\\u0180aiu\\u1794\\u1796\\u179A\\xF0\\u0760rc;\\u65EFp\\xBB\\u1371\\u0180dpt\\u17A4\\u17A8\\u17ADot;\\u6A00lus;\\u6A01imes;\\u6A02\\u0271\\u17B9\\0\\0\\u17BEcup;\\u6A06ar;\\u6605riangle\\u0100du\\u17CD\\u17D2own;\\u65BDp;\\u65B3plus;\\u6A04e\\xE5\\u1444\\xE5\\u14ADarow;\\u690D\\u0180ako\\u17ED\\u1826\\u1835\\u0100cn\\u17F2\\u1823k\\u0180lst\\u17FA\\u05AB\\u1802ozenge;\\u69EBriangle\\u0200;dlr\\u1812\\u1813\\u1818\\u181D\\u65B4own;\\u65BEeft;\\u65C2ight;\\u65B8k;\\u6423\\u01B1\\u182B\\0\\u1833\\u01B2\\u182F\\0\\u1831;\\u6592;\\u65914;\\u6593ck;\\u6588\\u0100eo\\u183E\\u184D\\u0100;q\\u1843\\u1846\\uC000=\\u20E5uiv;\\uC000\\u2261\\u20E5t;\\u6310\\u0200ptwx\\u1859\\u185E\\u1867\\u186Cf;\\uC000\\u{1D553}\\u0100;t\\u13CB\\u1863om\\xBB\\u13CCtie;\\u62C8\\u0600DHUVbdhmptuv\\u1885\\u1896\\u18AA\\u18BB\\u18D7\\u18DB\\u18EC\\u18FF\\u1905\\u190A\\u1910\\u1921\\u0200LRlr\\u188E\\u1890\\u1892\\u1894;\\u6557;\\u6554;\\u6556;\\u6553\\u0280;DUdu\\u18A1\\u18A2\\u18A4\\u18A6\\u18A8\\u6550;\\u6566;\\u6569;\\u6564;\\u6567\\u0200LRlr\\u18B3\\u18B5\\u18B7\\u18B9;\\u655D;\\u655A;\\u655C;\\u6559\\u0380;HLRhlr\\u18CA\\u18CB\\u18CD\\u18CF\\u18D1\\u18D3\\u18D5\\u6551;\\u656C;\\u6563;\\u6560;\\u656B;\\u6562;\\u655Fox;\\u69C9\\u0200LRlr\\u18E4\\u18E6\\u18E8\\u18EA;\\u6555;\\u6552;\\u6510;\\u650C\\u0280;DUdu\\u06BD\\u18F7\\u18F9\\u18FB\\u18FD;\\u6565;\\u6568;\\u652C;\\u6534inus;\\u629Flus;\\u629Eimes;\\u62A0\\u0200LRlr\\u1919\\u191B\\u191D\\u191F;\\u655B;\\u6558;\\u6518;\\u6514\\u0380;HLRhlr\\u1930\\u1931\\u1933\\u1935\\u1937\\u1939\\u193B\\u6502;\\u656A;\\u6561;\\u655E;\\u653C;\\u6524;\\u651C\\u0100ev\\u0123\\u1942bar\\u803B\\xA6\\u40A6\\u0200ceio\\u1951\\u1956\\u195A\\u1960r;\\uC000\\u{1D4B7}mi;\\u604Fm\\u0100;e\\u171A\\u171Cl\\u0180;bh\\u1968\\u1969\\u196B\\u405C;\\u69C5sub;\\u67C8\\u016C\\u1974\\u197El\\u0100;e\\u1979\\u197A\\u6022t\\xBB\\u197Ap\\u0180;Ee\\u012F\\u1985\\u1987;\\u6AAE\\u0100;q\\u06DC\\u06DB\\u0CE1\\u19A7\\0\\u19E8\\u1A11\\u1A15\\u1A32\\0\\u1A37\\u1A50\\0\\0\\u1AB4\\0\\0\\u1AC1\\0\\0\\u1B21\\u1B2E\\u1B4D\\u1B52\\0\\u1BFD\\0\\u1C0C\\u0180cpr\\u19AD\\u19B2\\u19DDute;\\u4107\\u0300;abcds\\u19BF\\u19C0\\u19C4\\u19CA\\u19D5\\u19D9\\u6229nd;\\u6A44rcup;\\u6A49\\u0100au\\u19CF\\u19D2p;\\u6A4Bp;\\u6A47ot;\\u6A40;\\uC000\\u2229\\uFE00\\u0100eo\\u19E2\\u19E5t;\\u6041\\xEE\\u0693\\u0200aeiu\\u19F0\\u19FB\\u1A01\\u1A05\\u01F0\\u19F5\\0\\u19F8s;\\u6A4Don;\\u410Ddil\\u803B\\xE7\\u40E7rc;\\u4109ps\\u0100;s\\u1A0C\\u1A0D\\u6A4Cm;\\u6A50ot;\\u410B\\u0180dmn\\u1A1B\\u1A20\\u1A26il\\u80BB\\xB8\\u01ADptyv;\\u69B2t\\u8100\\xA2;e\\u1A2D\\u1A2E\\u40A2r\\xE4\\u01B2r;\\uC000\\u{1D520}\\u0180cei\\u1A3D\\u1A40\\u1A4Dy;\\u4447ck\\u0100;m\\u1A47\\u1A48\\u6713ark\\xBB\\u1A48;\\u43C7r\\u0380;Ecefms\\u1A5F\\u1A60\\u1A62\\u1A6B\\u1AA4\\u1AAA\\u1AAE\\u65CB;\\u69C3\\u0180;el\\u1A69\\u1A6A\\u1A6D\\u42C6q;\\u6257e\\u0261\\u1A74\\0\\0\\u1A88rrow\\u0100lr\\u1A7C\\u1A81eft;\\u61BAight;\\u61BB\\u0280RSacd\\u1A92\\u1A94\\u1A96\\u1A9A\\u1A9F\\xBB\\u0F47;\\u64C8st;\\u629Birc;\\u629Aash;\\u629Dnint;\\u6A10id;\\u6AEFcir;\\u69C2ubs\\u0100;u\\u1ABB\\u1ABC\\u6663it\\xBB\\u1ABC\\u02EC\\u1AC7\\u1AD4\\u1AFA\\0\\u1B0Aon\\u0100;e\\u1ACD\\u1ACE\\u403A\\u0100;q\\xC7\\xC6\\u026D\\u1AD9\\0\\0\\u1AE2a\\u0100;t\\u1ADE\\u1ADF\\u402C;\\u4040\\u0180;fl\\u1AE8\\u1AE9\\u1AEB\\u6201\\xEE\\u1160e\\u0100mx\\u1AF1\\u1AF6ent\\xBB\\u1AE9e\\xF3\\u024D\\u01E7\\u1AFE\\0\\u1B07\\u0100;d\\u12BB\\u1B02ot;\\u6A6Dn\\xF4\\u0246\\u0180fry\\u1B10\\u1B14\\u1B17;\\uC000\\u{1D554}o\\xE4\\u0254\\u8100\\xA9;s\\u0155\\u1B1Dr;\\u6117\\u0100ao\\u1B25\\u1B29rr;\\u61B5ss;\\u6717\\u0100cu\\u1B32\\u1B37r;\\uC000\\u{1D4B8}\\u0100bp\\u1B3C\\u1B44\\u0100;e\\u1B41\\u1B42\\u6ACF;\\u6AD1\\u0100;e\\u1B49\\u1B4A\\u6AD0;\\u6AD2dot;\\u62EF\\u0380delprvw\\u1B60\\u1B6C\\u1B77\\u1B82\\u1BAC\\u1BD4\\u1BF9arr\\u0100lr\\u1B68\\u1B6A;\\u6938;\\u6935\\u0270\\u1B72\\0\\0\\u1B75r;\\u62DEc;\\u62DFarr\\u0100;p\\u1B7F\\u1B80\\u61B6;\\u693D\\u0300;bcdos\\u1B8F\\u1B90\\u1B96\\u1BA1\\u1BA5\\u1BA8\\u622Arcap;\\u6A48\\u0100au\\u1B9B\\u1B9Ep;\\u6A46p;\\u6A4Aot;\\u628Dr;\\u6A45;\\uC000\\u222A\\uFE00\\u0200alrv\\u1BB5\\u1BBF\\u1BDE\\u1BE3rr\\u0100;m\\u1BBC\\u1BBD\\u61B7;\\u693Cy\\u0180evw\\u1BC7\\u1BD4\\u1BD8q\\u0270\\u1BCE\\0\\0\\u1BD2re\\xE3\\u1B73u\\xE3\\u1B75ee;\\u62CEedge;\\u62CFen\\u803B\\xA4\\u40A4earrow\\u0100lr\\u1BEE\\u1BF3eft\\xBB\\u1B80ight\\xBB\\u1BBDe\\xE4\\u1BDD\\u0100ci\\u1C01\\u1C07onin\\xF4\\u01F7nt;\\u6231lcty;\\u632D\\u0980AHabcdefhijlorstuwz\\u1C38\\u1C3B\\u1C3F\\u1C5D\\u1C69\\u1C75\\u1C8A\\u1C9E\\u1CAC\\u1CB7\\u1CFB\\u1CFF\\u1D0D\\u1D7B\\u1D91\\u1DAB\\u1DBB\\u1DC6\\u1DCDr\\xF2\\u0381ar;\\u6965\\u0200glrs\\u1C48\\u1C4D\\u1C52\\u1C54ger;\\u6020eth;\\u6138\\xF2\\u1133h\\u0100;v\\u1C5A\\u1C5B\\u6010\\xBB\\u090A\\u016B\\u1C61\\u1C67arow;\\u690Fa\\xE3\\u0315\\u0100ay\\u1C6E\\u1C73ron;\\u410F;\\u4434\\u0180;ao\\u0332\\u1C7C\\u1C84\\u0100gr\\u02BF\\u1C81r;\\u61CAtseq;\\u6A77\\u0180glm\\u1C91\\u1C94\\u1C98\\u803B\\xB0\\u40B0ta;\\u43B4ptyv;\\u69B1\\u0100ir\\u1CA3\\u1CA8sht;\\u697F;\\uC000\\u{1D521}ar\\u0100lr\\u1CB3\\u1CB5\\xBB\\u08DC\\xBB\\u101E\\u0280aegsv\\u1CC2\\u0378\\u1CD6\\u1CDC\\u1CE0m\\u0180;os\\u0326\\u1CCA\\u1CD4nd\\u0100;s\\u0326\\u1CD1uit;\\u6666amma;\\u43DDin;\\u62F2\\u0180;io\\u1CE7\\u1CE8\\u1CF8\\u40F7de\\u8100\\xF7;o\\u1CE7\\u1CF0ntimes;\\u62C7n\\xF8\\u1CF7cy;\\u4452c\\u026F\\u1D06\\0\\0\\u1D0Arn;\\u631Eop;\\u630D\\u0280lptuw\\u1D18\\u1D1D\\u1D22\\u1D49\\u1D55lar;\\u4024f;\\uC000\\u{1D555}\\u0280;emps\\u030B\\u1D2D\\u1D37\\u1D3D\\u1D42q\\u0100;d\\u0352\\u1D33ot;\\u6251inus;\\u6238lus;\\u6214quare;\\u62A1blebarwedg\\xE5\\xFAn\\u0180adh\\u112E\\u1D5D\\u1D67ownarrow\\xF3\\u1C83arpoon\\u0100lr\\u1D72\\u1D76ef\\xF4\\u1CB4igh\\xF4\\u1CB6\\u0162\\u1D7F\\u1D85karo\\xF7\\u0F42\\u026F\\u1D8A\\0\\0\\u1D8Ern;\\u631Fop;\\u630C\\u0180cot\\u1D98\\u1DA3\\u1DA6\\u0100ry\\u1D9D\\u1DA1;\\uC000\\u{1D4B9};\\u4455l;\\u69F6rok;\\u4111\\u0100dr\\u1DB0\\u1DB4ot;\\u62F1i\\u0100;f\\u1DBA\\u1816\\u65BF\\u0100ah\\u1DC0\\u1DC3r\\xF2\\u0429a\\xF2\\u0FA6angle;\\u69A6\\u0100ci\\u1DD2\\u1DD5y;\\u445Fgrarr;\\u67FF\\u0900Dacdefglmnopqrstux\\u1E01\\u1E09\\u1E19\\u1E38\\u0578\\u1E3C\\u1E49\\u1E61\\u1E7E\\u1EA5\\u1EAF\\u1EBD\\u1EE1\\u1F2A\\u1F37\\u1F44\\u1F4E\\u1F5A\\u0100Do\\u1E06\\u1D34o\\xF4\\u1C89\\u0100cs\\u1E0E\\u1E14ute\\u803B\\xE9\\u40E9ter;\\u6A6E\\u0200aioy\\u1E22\\u1E27\\u1E31\\u1E36ron;\\u411Br\\u0100;c\\u1E2D\\u1E2E\\u6256\\u803B\\xEA\\u40EAlon;\\u6255;\\u444Dot;\\u4117\\u0100Dr\\u1E41\\u1E45ot;\\u6252;\\uC000\\u{1D522}\\u0180;rs\\u1E50\\u1E51\\u1E57\\u6A9Aave\\u803B\\xE8\\u40E8\\u0100;d\\u1E5C\\u1E5D\\u6A96ot;\\u6A98\\u0200;ils\\u1E6A\\u1E6B\\u1E72\\u1E74\\u6A99nters;\\u63E7;\\u6113\\u0100;d\\u1E79\\u1E7A\\u6A95ot;\\u6A97\\u0180aps\\u1E85\\u1E89\\u1E97cr;\\u4113ty\\u0180;sv\\u1E92\\u1E93\\u1E95\\u6205et\\xBB\\u1E93p\\u01001;\\u1E9D\\u1EA4\\u0133\\u1EA1\\u1EA3;\\u6004;\\u6005\\u6003\\u0100gs\\u1EAA\\u1EAC;\\u414Bp;\\u6002\\u0100gp\\u1EB4\\u1EB8on;\\u4119f;\\uC000\\u{1D556}\\u0180als\\u1EC4\\u1ECE\\u1ED2r\\u0100;s\\u1ECA\\u1ECB\\u62D5l;\\u69E3us;\\u6A71i\\u0180;lv\\u1EDA\\u1EDB\\u1EDF\\u43B5on\\xBB\\u1EDB;\\u43F5\\u0200csuv\\u1EEA\\u1EF3\\u1F0B\\u1F23\\u0100io\\u1EEF\\u1E31rc\\xBB\\u1E2E\\u0269\\u1EF9\\0\\0\\u1EFB\\xED\\u0548ant\\u0100gl\\u1F02\\u1F06tr\\xBB\\u1E5Dess\\xBB\\u1E7A\\u0180aei\\u1F12\\u1F16\\u1F1Als;\\u403Dst;\\u625Fv\\u0100;D\\u0235\\u1F20D;\\u6A78parsl;\\u69E5\\u0100Da\\u1F2F\\u1F33ot;\\u6253rr;\\u6971\\u0180cdi\\u1F3E\\u1F41\\u1EF8r;\\u612Fo\\xF4\\u0352\\u0100ah\\u1F49\\u1F4B;\\u43B7\\u803B\\xF0\\u40F0\\u0100mr\\u1F53\\u1F57l\\u803B\\xEB\\u40EBo;\\u60AC\\u0180cip\\u1F61\\u1F64\\u1F67l;\\u4021s\\xF4\\u056E\\u0100eo\\u1F6C\\u1F74ctatio\\xEE\\u0559nential\\xE5\\u0579\\u09E1\\u1F92\\0\\u1F9E\\0\\u1FA1\\u1FA7\\0\\0\\u1FC6\\u1FCC\\0\\u1FD3\\0\\u1FE6\\u1FEA\\u2000\\0\\u2008\\u205Allingdotse\\xF1\\u1E44y;\\u4444male;\\u6640\\u0180ilr\\u1FAD\\u1FB3\\u1FC1lig;\\u8000\\uFB03\\u0269\\u1FB9\\0\\0\\u1FBDg;\\u8000\\uFB00ig;\\u8000\\uFB04;\\uC000\\u{1D523}lig;\\u8000\\uFB01lig;\\uC000fj\\u0180alt\\u1FD9\\u1FDC\\u1FE1t;\\u666Dig;\\u8000\\uFB02ns;\\u65B1of;\\u4192\\u01F0\\u1FEE\\0\\u1FF3f;\\uC000\\u{1D557}\\u0100ak\\u05BF\\u1FF7\\u0100;v\\u1FFC\\u1FFD\\u62D4;\\u6AD9artint;\\u6A0D\\u0100ao\\u200C\\u2055\\u0100cs\\u2011\\u2052\\u03B1\\u201A\\u2030\\u2038\\u2045\\u2048\\0\\u2050\\u03B2\\u2022\\u2025\\u2027\\u202A\\u202C\\0\\u202E\\u803B\\xBD\\u40BD;\\u6153\\u803B\\xBC\\u40BC;\\u6155;\\u6159;\\u615B\\u01B3\\u2034\\0\\u2036;\\u6154;\\u6156\\u02B4\\u203E\\u2041\\0\\0\\u2043\\u803B\\xBE\\u40BE;\\u6157;\\u615C5;\\u6158\\u01B6\\u204C\\0\\u204E;\\u615A;\\u615D8;\\u615El;\\u6044wn;\\u6322cr;\\uC000\\u{1D4BB}\\u0880Eabcdefgijlnorstv\\u2082\\u2089\\u209F\\u20A5\\u20B0\\u20B4\\u20F0\\u20F5\\u20FA\\u20FF\\u2103\\u2112\\u2138\\u0317\\u213E\\u2152\\u219E\\u0100;l\\u064D\\u2087;\\u6A8C\\u0180cmp\\u2090\\u2095\\u209Dute;\\u41F5ma\\u0100;d\\u209C\\u1CDA\\u43B3;\\u6A86reve;\\u411F\\u0100iy\\u20AA\\u20AErc;\\u411D;\\u4433ot;\\u4121\\u0200;lqs\\u063E\\u0642\\u20BD\\u20C9\\u0180;qs\\u063E\\u064C\\u20C4lan\\xF4\\u0665\\u0200;cdl\\u0665\\u20D2\\u20D5\\u20E5c;\\u6AA9ot\\u0100;o\\u20DC\\u20DD\\u6A80\\u0100;l\\u20E2\\u20E3\\u6A82;\\u6A84\\u0100;e\\u20EA\\u20ED\\uC000\\u22DB\\uFE00s;\\u6A94r;\\uC000\\u{1D524}\\u0100;g\\u0673\\u061Bmel;\\u6137cy;\\u4453\\u0200;Eaj\\u065A\\u210C\\u210E\\u2110;\\u6A92;\\u6AA5;\\u6AA4\\u0200Eaes\\u211B\\u211D\\u2129\\u2134;\\u6269p\\u0100;p\\u2123\\u2124\\u6A8Arox\\xBB\\u2124\\u0100;q\\u212E\\u212F\\u6A88\\u0100;q\\u212E\\u211Bim;\\u62E7pf;\\uC000\\u{1D558}\\u0100ci\\u2143\\u2146r;\\u610Am\\u0180;el\\u066B\\u214E\\u2150;\\u6A8E;\\u6A90\\u8300>;cdlqr\\u05EE\\u2160\\u216A\\u216E\\u2173\\u2179\\u0100ci\\u2165\\u2167;\\u6AA7r;\\u6A7Aot;\\u62D7Par;\\u6995uest;\\u6A7C\\u0280adels\\u2184\\u216A\\u2190\\u0656\\u219B\\u01F0\\u2189\\0\\u218Epro\\xF8\\u209Er;\\u6978q\\u0100lq\\u063F\\u2196les\\xF3\\u2088i\\xED\\u066B\\u0100en\\u21A3\\u21ADrtneqq;\\uC000\\u2269\\uFE00\\xC5\\u21AA\\u0500Aabcefkosy\\u21C4\\u21C7\\u21F1\\u21F5\\u21FA\\u2218\\u221D\\u222F\\u2268\\u227Dr\\xF2\\u03A0\\u0200ilmr\\u21D0\\u21D4\\u21D7\\u21DBrs\\xF0\\u1484f\\xBB\\u2024il\\xF4\\u06A9\\u0100dr\\u21E0\\u21E4cy;\\u444A\\u0180;cw\\u08F4\\u21EB\\u21EFir;\\u6948;\\u61ADar;\\u610Firc;\\u4125\\u0180alr\\u2201\\u220E\\u2213rts\\u0100;u\\u2209\\u220A\\u6665it\\xBB\\u220Alip;\\u6026con;\\u62B9r;\\uC000\\u{1D525}s\\u0100ew\\u2223\\u2229arow;\\u6925arow;\\u6926\\u0280amopr\\u223A\\u223E\\u2243\\u225E\\u2263rr;\\u61FFtht;\\u623Bk\\u0100lr\\u2249\\u2253eftarrow;\\u61A9ightarrow;\\u61AAf;\\uC000\\u{1D559}bar;\\u6015\\u0180clt\\u226F\\u2274\\u2278r;\\uC000\\u{1D4BD}as\\xE8\\u21F4rok;\\u4127\\u0100bp\\u2282\\u2287ull;\\u6043hen\\xBB\\u1C5B\\u0AE1\\u22A3\\0\\u22AA\\0\\u22B8\\u22C5\\u22CE\\0\\u22D5\\u22F3\\0\\0\\u22F8\\u2322\\u2367\\u2362\\u237F\\0\\u2386\\u23AA\\u23B4cute\\u803B\\xED\\u40ED\\u0180;iy\\u0771\\u22B0\\u22B5rc\\u803B\\xEE\\u40EE;\\u4438\\u0100cx\\u22BC\\u22BFy;\\u4435cl\\u803B\\xA1\\u40A1\\u0100fr\\u039F\\u22C9;\\uC000\\u{1D526}rave\\u803B\\xEC\\u40EC\\u0200;ino\\u073E\\u22DD\\u22E9\\u22EE\\u0100in\\u22E2\\u22E6nt;\\u6A0Ct;\\u622Dfin;\\u69DCta;\\u6129lig;\\u4133\\u0180aop\\u22FE\\u231A\\u231D\\u0180cgt\\u2305\\u2308\\u2317r;\\u412B\\u0180elp\\u071F\\u230F\\u2313in\\xE5\\u078Ear\\xF4\\u0720h;\\u4131f;\\u62B7ed;\\u41B5\\u0280;cfot\\u04F4\\u232C\\u2331\\u233D\\u2341are;\\u6105in\\u0100;t\\u2338\\u2339\\u621Eie;\\u69DDdo\\xF4\\u2319\\u0280;celp\\u0757\\u234C\\u2350\\u235B\\u2361al;\\u62BA\\u0100gr\\u2355\\u2359er\\xF3\\u1563\\xE3\\u234Darhk;\\u6A17rod;\\u6A3C\\u0200cgpt\\u236F\\u2372\\u2376\\u237By;\\u4451on;\\u412Ff;\\uC000\\u{1D55A}a;\\u43B9uest\\u803B\\xBF\\u40BF\\u0100ci\\u238A\\u238Fr;\\uC000\\u{1D4BE}n\\u0280;Edsv\\u04F4\\u239B\\u239D\\u23A1\\u04F3;\\u62F9ot;\\u62F5\\u0100;v\\u23A6\\u23A7\\u62F4;\\u62F3\\u0100;i\\u0777\\u23AElde;\\u4129\\u01EB\\u23B8\\0\\u23BCcy;\\u4456l\\u803B\\xEF\\u40EF\\u0300cfmosu\\u23CC\\u23D7\\u23DC\\u23E1\\u23E7\\u23F5\\u0100iy\\u23D1\\u23D5rc;\\u4135;\\u4439r;\\uC000\\u{1D527}ath;\\u4237pf;\\uC000\\u{1D55B}\\u01E3\\u23EC\\0\\u23F1r;\\uC000\\u{1D4BF}rcy;\\u4458kcy;\\u4454\\u0400acfghjos\\u240B\\u2416\\u2422\\u2427\\u242D\\u2431\\u2435\\u243Bppa\\u0100;v\\u2413\\u2414\\u43BA;\\u43F0\\u0100ey\\u241B\\u2420dil;\\u4137;\\u443Ar;\\uC000\\u{1D528}reen;\\u4138cy;\\u4445cy;\\u445Cpf;\\uC000\\u{1D55C}cr;\\uC000\\u{1D4C0}\\u0B80ABEHabcdefghjlmnoprstuv\\u2470\\u2481\\u2486\\u248D\\u2491\\u250E\\u253D\\u255A\\u2580\\u264E\\u265E\\u2665\\u2679\\u267D\\u269A\\u26B2\\u26D8\\u275D\\u2768\\u278B\\u27C0\\u2801\\u2812\\u0180art\\u2477\\u247A\\u247Cr\\xF2\\u09C6\\xF2\\u0395ail;\\u691Barr;\\u690E\\u0100;g\\u0994\\u248B;\\u6A8Bar;\\u6962\\u0963\\u24A5\\0\\u24AA\\0\\u24B1\\0\\0\\0\\0\\0\\u24B5\\u24BA\\0\\u24C6\\u24C8\\u24CD\\0\\u24F9ute;\\u413Amptyv;\\u69B4ra\\xEE\\u084Cbda;\\u43BBg\\u0180;dl\\u088E\\u24C1\\u24C3;\\u6991\\xE5\\u088E;\\u6A85uo\\u803B\\xAB\\u40ABr\\u0400;bfhlpst\\u0899\\u24DE\\u24E6\\u24E9\\u24EB\\u24EE\\u24F1\\u24F5\\u0100;f\\u089D\\u24E3s;\\u691Fs;\\u691D\\xEB\\u2252p;\\u61ABl;\\u6939im;\\u6973l;\\u61A2\\u0180;ae\\u24FF\\u2500\\u2504\\u6AABil;\\u6919\\u0100;s\\u2509\\u250A\\u6AAD;\\uC000\\u2AAD\\uFE00\\u0180abr\\u2515\\u2519\\u251Drr;\\u690Crk;\\u6772\\u0100ak\\u2522\\u252Cc\\u0100ek\\u2528\\u252A;\\u407B;\\u405B\\u0100es\\u2531\\u2533;\\u698Bl\\u0100du\\u2539\\u253B;\\u698F;\\u698D\\u0200aeuy\\u2546\\u254B\\u2556\\u2558ron;\\u413E\\u0100di\\u2550\\u2554il;\\u413C\\xEC\\u08B0\\xE2\\u2529;\\u443B\\u0200cqrs\\u2563\\u2566\\u256D\\u257Da;\\u6936uo\\u0100;r\\u0E19\\u1746\\u0100du\\u2572\\u2577har;\\u6967shar;\\u694Bh;\\u61B2\\u0280;fgqs\\u258B\\u258C\\u0989\\u25F3\\u25FF\\u6264t\\u0280ahlrt\\u2598\\u25A4\\u25B7\\u25C2\\u25E8rrow\\u0100;t\\u0899\\u25A1a\\xE9\\u24F6arpoon\\u0100du\\u25AF\\u25B4own\\xBB\\u045Ap\\xBB\\u0966eftarrows;\\u61C7ight\\u0180ahs\\u25CD\\u25D6\\u25DErrow\\u0100;s\\u08F4\\u08A7arpoon\\xF3\\u0F98quigarro\\xF7\\u21F0hreetimes;\\u62CB\\u0180;qs\\u258B\\u0993\\u25FAlan\\xF4\\u09AC\\u0280;cdgs\\u09AC\\u260A\\u260D\\u261D\\u2628c;\\u6AA8ot\\u0100;o\\u2614\\u2615\\u6A7F\\u0100;r\\u261A\\u261B\\u6A81;\\u6A83\\u0100;e\\u2622\\u2625\\uC000\\u22DA\\uFE00s;\\u6A93\\u0280adegs\\u2633\\u2639\\u263D\\u2649\\u264Bppro\\xF8\\u24C6ot;\\u62D6q\\u0100gq\\u2643\\u2645\\xF4\\u0989gt\\xF2\\u248C\\xF4\\u099Bi\\xED\\u09B2\\u0180ilr\\u2655\\u08E1\\u265Asht;\\u697C;\\uC000\\u{1D529}\\u0100;E\\u099C\\u2663;\\u6A91\\u0161\\u2669\\u2676r\\u0100du\\u25B2\\u266E\\u0100;l\\u0965\\u2673;\\u696Alk;\\u6584cy;\\u4459\\u0280;acht\\u0A48\\u2688\\u268B\\u2691\\u2696r\\xF2\\u25C1orne\\xF2\\u1D08ard;\\u696Bri;\\u65FA\\u0100io\\u269F\\u26A4dot;\\u4140ust\\u0100;a\\u26AC\\u26AD\\u63B0che\\xBB\\u26AD\\u0200Eaes\\u26BB\\u26BD\\u26C9\\u26D4;\\u6268p\\u0100;p\\u26C3\\u26C4\\u6A89rox\\xBB\\u26C4\\u0100;q\\u26CE\\u26CF\\u6A87\\u0100;q\\u26CE\\u26BBim;\\u62E6\\u0400abnoptwz\\u26E9\\u26F4\\u26F7\\u271A\\u272F\\u2741\\u2747\\u2750\\u0100nr\\u26EE\\u26F1g;\\u67ECr;\\u61FDr\\xEB\\u08C1g\\u0180lmr\\u26FF\\u270D\\u2714eft\\u0100ar\\u09E6\\u2707ight\\xE1\\u09F2apsto;\\u67FCight\\xE1\\u09FDparrow\\u0100lr\\u2725\\u2729ef\\xF4\\u24EDight;\\u61AC\\u0180afl\\u2736\\u2739\\u273Dr;\\u6985;\\uC000\\u{1D55D}us;\\u6A2Dimes;\\u6A34\\u0161\\u274B\\u274Fst;\\u6217\\xE1\\u134E\\u0180;ef\\u2757\\u2758\\u1800\\u65CAnge\\xBB\\u2758ar\\u0100;l\\u2764\\u2765\\u4028t;\\u6993\\u0280achmt\\u2773\\u2776\\u277C\\u2785\\u2787r\\xF2\\u08A8orne\\xF2\\u1D8Car\\u0100;d\\u0F98\\u2783;\\u696D;\\u600Eri;\\u62BF\\u0300achiqt\\u2798\\u279D\\u0A40\\u27A2\\u27AE\\u27BBquo;\\u6039r;\\uC000\\u{1D4C1}m\\u0180;eg\\u09B2\\u27AA\\u27AC;\\u6A8D;\\u6A8F\\u0100bu\\u252A\\u27B3o\\u0100;r\\u0E1F\\u27B9;\\u601Arok;\\u4142\\u8400<;cdhilqr\\u082B\\u27D2\\u2639\\u27DC\\u27E0\\u27E5\\u27EA\\u27F0\\u0100ci\\u27D7\\u27D9;\\u6AA6r;\\u6A79re\\xE5\\u25F2mes;\\u62C9arr;\\u6976uest;\\u6A7B\\u0100Pi\\u27F5\\u27F9ar;\\u6996\\u0180;ef\\u2800\\u092D\\u181B\\u65C3r\\u0100du\\u2807\\u280Dshar;\\u694Ahar;\\u6966\\u0100en\\u2817\\u2821rtneqq;\\uC000\\u2268\\uFE00\\xC5\\u281E\\u0700Dacdefhilnopsu\\u2840\\u2845\\u2882\\u288E\\u2893\\u28A0\\u28A5\\u28A8\\u28DA\\u28E2\\u28E4\\u0A83\\u28F3\\u2902Dot;\\u623A\\u0200clpr\\u284E\\u2852\\u2863\\u287Dr\\u803B\\xAF\\u40AF\\u0100et\\u2857\\u2859;\\u6642\\u0100;e\\u285E\\u285F\\u6720se\\xBB\\u285F\\u0100;s\\u103B\\u2868to\\u0200;dlu\\u103B\\u2873\\u2877\\u287Bow\\xEE\\u048Cef\\xF4\\u090F\\xF0\\u13D1ker;\\u65AE\\u0100oy\\u2887\\u288Cmma;\\u6A29;\\u443Cash;\\u6014asuredangle\\xBB\\u1626r;\\uC000\\u{1D52A}o;\\u6127\\u0180cdn\\u28AF\\u28B4\\u28C9ro\\u803B\\xB5\\u40B5\\u0200;acd\\u1464\\u28BD\\u28C0\\u28C4s\\xF4\\u16A7ir;\\u6AF0ot\\u80BB\\xB7\\u01B5us\\u0180;bd\\u28D2\\u1903\\u28D3\\u6212\\u0100;u\\u1D3C\\u28D8;\\u6A2A\\u0163\\u28DE\\u28E1p;\\u6ADB\\xF2\\u2212\\xF0\\u0A81\\u0100dp\\u28E9\\u28EEels;\\u62A7f;\\uC000\\u{1D55E}\\u0100ct\\u28F8\\u28FDr;\\uC000\\u{1D4C2}pos\\xBB\\u159D\\u0180;lm\\u2909\\u290A\\u290D\\u43BCtimap;\\u62B8\\u0C00GLRVabcdefghijlmoprstuvw\\u2942\\u2953\\u297E\\u2989\\u2998\\u29DA\\u29E9\\u2A15\\u2A1A\\u2A58\\u2A5D\\u2A83\\u2A95\\u2AA4\\u2AA8\\u2B04\\u2B07\\u2B44\\u2B7F\\u2BAE\\u2C34\\u2C67\\u2C7C\\u2CE9\\u0100gt\\u2947\\u294B;\\uC000\\u22D9\\u0338\\u0100;v\\u2950\\u0BCF\\uC000\\u226B\\u20D2\\u0180elt\\u295A\\u2972\\u2976ft\\u0100ar\\u2961\\u2967rrow;\\u61CDightarrow;\\u61CE;\\uC000\\u22D8\\u0338\\u0100;v\\u297B\\u0C47\\uC000\\u226A\\u20D2ightarrow;\\u61CF\\u0100Dd\\u298E\\u2993ash;\\u62AFash;\\u62AE\\u0280bcnpt\\u29A3\\u29A7\\u29AC\\u29B1\\u29CCla\\xBB\\u02DEute;\\u4144g;\\uC000\\u2220\\u20D2\\u0280;Eiop\\u0D84\\u29BC\\u29C0\\u29C5\\u29C8;\\uC000\\u2A70\\u0338d;\\uC000\\u224B\\u0338s;\\u4149ro\\xF8\\u0D84ur\\u0100;a\\u29D3\\u29D4\\u666El\\u0100;s\\u29D3\\u0B38\\u01F3\\u29DF\\0\\u29E3p\\u80BB\\xA0\\u0B37mp\\u0100;e\\u0BF9\\u0C00\\u0280aeouy\\u29F4\\u29FE\\u2A03\\u2A10\\u2A13\\u01F0\\u29F9\\0\\u29FB;\\u6A43on;\\u4148dil;\\u4146ng\\u0100;d\\u0D7E\\u2A0Aot;\\uC000\\u2A6D\\u0338p;\\u6A42;\\u443Dash;\\u6013\\u0380;Aadqsx\\u0B92\\u2A29\\u2A2D\\u2A3B\\u2A41\\u2A45\\u2A50rr;\\u61D7r\\u0100hr\\u2A33\\u2A36k;\\u6924\\u0100;o\\u13F2\\u13F0ot;\\uC000\\u2250\\u0338ui\\xF6\\u0B63\\u0100ei\\u2A4A\\u2A4Ear;\\u6928\\xED\\u0B98ist\\u0100;s\\u0BA0\\u0B9Fr;\\uC000\\u{1D52B}\\u0200Eest\\u0BC5\\u2A66\\u2A79\\u2A7C\\u0180;qs\\u0BBC\\u2A6D\\u0BE1\\u0180;qs\\u0BBC\\u0BC5\\u2A74lan\\xF4\\u0BE2i\\xED\\u0BEA\\u0100;r\\u0BB6\\u2A81\\xBB\\u0BB7\\u0180Aap\\u2A8A\\u2A8D\\u2A91r\\xF2\\u2971rr;\\u61AEar;\\u6AF2\\u0180;sv\\u0F8D\\u2A9C\\u0F8C\\u0100;d\\u2AA1\\u2AA2\\u62FC;\\u62FAcy;\\u445A\\u0380AEadest\\u2AB7\\u2ABA\\u2ABE\\u2AC2\\u2AC5\\u2AF6\\u2AF9r\\xF2\\u2966;\\uC000\\u2266\\u0338rr;\\u619Ar;\\u6025\\u0200;fqs\\u0C3B\\u2ACE\\u2AE3\\u2AEFt\\u0100ar\\u2AD4\\u2AD9rro\\xF7\\u2AC1ightarro\\xF7\\u2A90\\u0180;qs\\u0C3B\\u2ABA\\u2AEAlan\\xF4\\u0C55\\u0100;s\\u0C55\\u2AF4\\xBB\\u0C36i\\xED\\u0C5D\\u0100;r\\u0C35\\u2AFEi\\u0100;e\\u0C1A\\u0C25i\\xE4\\u0D90\\u0100pt\\u2B0C\\u2B11f;\\uC000\\u{1D55F}\\u8180\\xAC;in\\u2B19\\u2B1A\\u2B36\\u40ACn\\u0200;Edv\\u0B89\\u2B24\\u2B28\\u2B2E;\\uC000\\u22F9\\u0338ot;\\uC000\\u22F5\\u0338\\u01E1\\u0B89\\u2B33\\u2B35;\\u62F7;\\u62F6i\\u0100;v\\u0CB8\\u2B3C\\u01E1\\u0CB8\\u2B41\\u2B43;\\u62FE;\\u62FD\\u0180aor\\u2B4B\\u2B63\\u2B69r\\u0200;ast\\u0B7B\\u2B55\\u2B5A\\u2B5Flle\\xEC\\u0B7Bl;\\uC000\\u2AFD\\u20E5;\\uC000\\u2202\\u0338lint;\\u6A14\\u0180;ce\\u0C92\\u2B70\\u2B73u\\xE5\\u0CA5\\u0100;c\\u0C98\\u2B78\\u0100;e\\u0C92\\u2B7D\\xF1\\u0C98\\u0200Aait\\u2B88\\u2B8B\\u2B9D\\u2BA7r\\xF2\\u2988rr\\u0180;cw\\u2B94\\u2B95\\u2B99\\u619B;\\uC000\\u2933\\u0338;\\uC000\\u219D\\u0338ghtarrow\\xBB\\u2B95ri\\u0100;e\\u0CCB\\u0CD6\\u0380chimpqu\\u2BBD\\u2BCD\\u2BD9\\u2B04\\u0B78\\u2BE4\\u2BEF\\u0200;cer\\u0D32\\u2BC6\\u0D37\\u2BC9u\\xE5\\u0D45;\\uC000\\u{1D4C3}ort\\u026D\\u2B05\\0\\0\\u2BD6ar\\xE1\\u2B56m\\u0100;e\\u0D6E\\u2BDF\\u0100;q\\u0D74\\u0D73su\\u0100bp\\u2BEB\\u2BED\\xE5\\u0CF8\\xE5\\u0D0B\\u0180bcp\\u2BF6\\u2C11\\u2C19\\u0200;Ees\\u2BFF\\u2C00\\u0D22\\u2C04\\u6284;\\uC000\\u2AC5\\u0338et\\u0100;e\\u0D1B\\u2C0Bq\\u0100;q\\u0D23\\u2C00c\\u0100;e\\u0D32\\u2C17\\xF1\\u0D38\\u0200;Ees\\u2C22\\u2C23\\u0D5F\\u2C27\\u6285;\\uC000\\u2AC6\\u0338et\\u0100;e\\u0D58\\u2C2Eq\\u0100;q\\u0D60\\u2C23\\u0200gilr\\u2C3D\\u2C3F\\u2C45\\u2C47\\xEC\\u0BD7lde\\u803B\\xF1\\u40F1\\xE7\\u0C43iangle\\u0100lr\\u2C52\\u2C5Ceft\\u0100;e\\u0C1A\\u2C5A\\xF1\\u0C26ight\\u0100;e\\u0CCB\\u2C65\\xF1\\u0CD7\\u0100;m\\u2C6C\\u2C6D\\u43BD\\u0180;es\\u2C74\\u2C75\\u2C79\\u4023ro;\\u6116p;\\u6007\\u0480DHadgilrs\\u2C8F\\u2C94\\u2C99\\u2C9E\\u2CA3\\u2CB0\\u2CB6\\u2CD3\\u2CE3ash;\\u62ADarr;\\u6904p;\\uC000\\u224D\\u20D2ash;\\u62AC\\u0100et\\u2CA8\\u2CAC;\\uC000\\u2265\\u20D2;\\uC000>\\u20D2nfin;\\u69DE\\u0180Aet\\u2CBD\\u2CC1\\u2CC5rr;\\u6902;\\uC000\\u2264\\u20D2\\u0100;r\\u2CCA\\u2CCD\\uC000<\\u20D2ie;\\uC000\\u22B4\\u20D2\\u0100At\\u2CD8\\u2CDCrr;\\u6903rie;\\uC000\\u22B5\\u20D2im;\\uC000\\u223C\\u20D2\\u0180Aan\\u2CF0\\u2CF4\\u2D02rr;\\u61D6r\\u0100hr\\u2CFA\\u2CFDk;\\u6923\\u0100;o\\u13E7\\u13E5ear;\\u6927\\u1253\\u1A95\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\u2D2D\\0\\u2D38\\u2D48\\u2D60\\u2D65\\u2D72\\u2D84\\u1B07\\0\\0\\u2D8D\\u2DAB\\0\\u2DC8\\u2DCE\\0\\u2DDC\\u2E19\\u2E2B\\u2E3E\\u2E43\\u0100cs\\u2D31\\u1A97ute\\u803B\\xF3\\u40F3\\u0100iy\\u2D3C\\u2D45r\\u0100;c\\u1A9E\\u2D42\\u803B\\xF4\\u40F4;\\u443E\\u0280abios\\u1AA0\\u2D52\\u2D57\\u01C8\\u2D5Alac;\\u4151v;\\u6A38old;\\u69BClig;\\u4153\\u0100cr\\u2D69\\u2D6Dir;\\u69BF;\\uC000\\u{1D52C}\\u036F\\u2D79\\0\\0\\u2D7C\\0\\u2D82n;\\u42DBave\\u803B\\xF2\\u40F2;\\u69C1\\u0100bm\\u2D88\\u0DF4ar;\\u69B5\\u0200acit\\u2D95\\u2D98\\u2DA5\\u2DA8r\\xF2\\u1A80\\u0100ir\\u2D9D\\u2DA0r;\\u69BEoss;\\u69BBn\\xE5\\u0E52;\\u69C0\\u0180aei\\u2DB1\\u2DB5\\u2DB9cr;\\u414Dga;\\u43C9\\u0180cdn\\u2DC0\\u2DC5\\u01CDron;\\u43BF;\\u69B6pf;\\uC000\\u{1D560}\\u0180ael\\u2DD4\\u2DD7\\u01D2r;\\u69B7rp;\\u69B9\\u0380;adiosv\\u2DEA\\u2DEB\\u2DEE\\u2E08\\u2E0D\\u2E10\\u2E16\\u6228r\\xF2\\u1A86\\u0200;efm\\u2DF7\\u2DF8\\u2E02\\u2E05\\u6A5Dr\\u0100;o\\u2DFE\\u2DFF\\u6134f\\xBB\\u2DFF\\u803B\\xAA\\u40AA\\u803B\\xBA\\u40BAgof;\\u62B6r;\\u6A56lope;\\u6A57;\\u6A5B\\u0180clo\\u2E1F\\u2E21\\u2E27\\xF2\\u2E01ash\\u803B\\xF8\\u40F8l;\\u6298i\\u016C\\u2E2F\\u2E34de\\u803B\\xF5\\u40F5es\\u0100;a\\u01DB\\u2E3As;\\u6A36ml\\u803B\\xF6\\u40F6bar;\\u633D\\u0AE1\\u2E5E\\0\\u2E7D\\0\\u2E80\\u2E9D\\0\\u2EA2\\u2EB9\\0\\0\\u2ECB\\u0E9C\\0\\u2F13\\0\\0\\u2F2B\\u2FBC\\0\\u2FC8r\\u0200;ast\\u0403\\u2E67\\u2E72\\u0E85\\u8100\\xB6;l\\u2E6D\\u2E6E\\u40B6le\\xEC\\u0403\\u0269\\u2E78\\0\\0\\u2E7Bm;\\u6AF3;\\u6AFDy;\\u443Fr\\u0280cimpt\\u2E8B\\u2E8F\\u2E93\\u1865\\u2E97nt;\\u4025od;\\u402Eil;\\u6030enk;\\u6031r;\\uC000\\u{1D52D}\\u0180imo\\u2EA8\\u2EB0\\u2EB4\\u0100;v\\u2EAD\\u2EAE\\u43C6;\\u43D5ma\\xF4\\u0A76ne;\\u660E\\u0180;tv\\u2EBF\\u2EC0\\u2EC8\\u43C0chfork\\xBB\\u1FFD;\\u43D6\\u0100au\\u2ECF\\u2EDFn\\u0100ck\\u2ED5\\u2EDDk\\u0100;h\\u21F4\\u2EDB;\\u610E\\xF6\\u21F4s\\u0480;abcdemst\\u2EF3\\u2EF4\\u1908\\u2EF9\\u2EFD\\u2F04\\u2F06\\u2F0A\\u2F0E\\u402Bcir;\\u6A23ir;\\u6A22\\u0100ou\\u1D40\\u2F02;\\u6A25;\\u6A72n\\u80BB\\xB1\\u0E9Dim;\\u6A26wo;\\u6A27\\u0180ipu\\u2F19\\u2F20\\u2F25ntint;\\u6A15f;\\uC000\\u{1D561}nd\\u803B\\xA3\\u40A3\\u0500;Eaceinosu\\u0EC8\\u2F3F\\u2F41\\u2F44\\u2F47\\u2F81\\u2F89\\u2F92\\u2F7E\\u2FB6;\\u6AB3p;\\u6AB7u\\xE5\\u0ED9\\u0100;c\\u0ECE\\u2F4C\\u0300;acens\\u0EC8\\u2F59\\u2F5F\\u2F66\\u2F68\\u2F7Eppro\\xF8\\u2F43urlye\\xF1\\u0ED9\\xF1\\u0ECE\\u0180aes\\u2F6F\\u2F76\\u2F7Approx;\\u6AB9qq;\\u6AB5im;\\u62E8i\\xED\\u0EDFme\\u0100;s\\u2F88\\u0EAE\\u6032\\u0180Eas\\u2F78\\u2F90\\u2F7A\\xF0\\u2F75\\u0180dfp\\u0EEC\\u2F99\\u2FAF\\u0180als\\u2FA0\\u2FA5\\u2FAAlar;\\u632Eine;\\u6312urf;\\u6313\\u0100;t\\u0EFB\\u2FB4\\xEF\\u0EFBrel;\\u62B0\\u0100ci\\u2FC0\\u2FC5r;\\uC000\\u{1D4C5};\\u43C8ncsp;\\u6008\\u0300fiopsu\\u2FDA\\u22E2\\u2FDF\\u2FE5\\u2FEB\\u2FF1r;\\uC000\\u{1D52E}pf;\\uC000\\u{1D562}rime;\\u6057cr;\\uC000\\u{1D4C6}\\u0180aeo\\u2FF8\\u3009\\u3013t\\u0100ei\\u2FFE\\u3005rnion\\xF3\\u06B0nt;\\u6A16st\\u0100;e\\u3010\\u3011\\u403F\\xF1\\u1F19\\xF4\\u0F14\\u0A80ABHabcdefhilmnoprstux\\u3040\\u3051\\u3055\\u3059\\u30E0\\u310E\\u312B\\u3147\\u3162\\u3172\\u318E\\u3206\\u3215\\u3224\\u3229\\u3258\\u326E\\u3272\\u3290\\u32B0\\u32B7\\u0180art\\u3047\\u304A\\u304Cr\\xF2\\u10B3\\xF2\\u03DDail;\\u691Car\\xF2\\u1C65ar;\\u6964\\u0380cdenqrt\\u3068\\u3075\\u3078\\u307F\\u308F\\u3094\\u30CC\\u0100eu\\u306D\\u3071;\\uC000\\u223D\\u0331te;\\u4155i\\xE3\\u116Emptyv;\\u69B3g\\u0200;del\\u0FD1\\u3089\\u308B\\u308D;\\u6992;\\u69A5\\xE5\\u0FD1uo\\u803B\\xBB\\u40BBr\\u0580;abcfhlpstw\\u0FDC\\u30AC\\u30AF\\u30B7\\u30B9\\u30BC\\u30BE\\u30C0\\u30C3\\u30C7\\u30CAp;\\u6975\\u0100;f\\u0FE0\\u30B4s;\\u6920;\\u6933s;\\u691E\\xEB\\u225D\\xF0\\u272El;\\u6945im;\\u6974l;\\u61A3;\\u619D\\u0100ai\\u30D1\\u30D5il;\\u691Ao\\u0100;n\\u30DB\\u30DC\\u6236al\\xF3\\u0F1E\\u0180abr\\u30E7\\u30EA\\u30EEr\\xF2\\u17E5rk;\\u6773\\u0100ak\\u30F3\\u30FDc\\u0100ek\\u30F9\\u30FB;\\u407D;\\u405D\\u0100es\\u3102\\u3104;\\u698Cl\\u0100du\\u310A\\u310C;\\u698E;\\u6990\\u0200aeuy\\u3117\\u311C\\u3127\\u3129ron;\\u4159\\u0100di\\u3121\\u3125il;\\u4157\\xEC\\u0FF2\\xE2\\u30FA;\\u4440\\u0200clqs\\u3134\\u3137\\u313D\\u3144a;\\u6937dhar;\\u6969uo\\u0100;r\\u020E\\u020Dh;\\u61B3\\u0180acg\\u314E\\u315F\\u0F44l\\u0200;ips\\u0F78\\u3158\\u315B\\u109Cn\\xE5\\u10BBar\\xF4\\u0FA9t;\\u65AD\\u0180ilr\\u3169\\u1023\\u316Esht;\\u697D;\\uC000\\u{1D52F}\\u0100ao\\u3177\\u3186r\\u0100du\\u317D\\u317F\\xBB\\u047B\\u0100;l\\u1091\\u3184;\\u696C\\u0100;v\\u318B\\u318C\\u43C1;\\u43F1\\u0180gns\\u3195\\u31F9\\u31FCht\\u0300ahlrst\\u31A4\\u31B0\\u31C2\\u31D8\\u31E4\\u31EErrow\\u0100;t\\u0FDC\\u31ADa\\xE9\\u30C8arpoon\\u0100du\\u31BB\\u31BFow\\xEE\\u317Ep\\xBB\\u1092eft\\u0100ah\\u31CA\\u31D0rrow\\xF3\\u0FEAarpoon\\xF3\\u0551ightarrows;\\u61C9quigarro\\xF7\\u30CBhreetimes;\\u62CCg;\\u42DAingdotse\\xF1\\u1F32\\u0180ahm\\u320D\\u3210\\u3213r\\xF2\\u0FEAa\\xF2\\u0551;\\u600Foust\\u0100;a\\u321E\\u321F\\u63B1che\\xBB\\u321Fmid;\\u6AEE\\u0200abpt\\u3232\\u323D\\u3240\\u3252\\u0100nr\\u3237\\u323Ag;\\u67EDr;\\u61FEr\\xEB\\u1003\\u0180afl\\u3247\\u324A\\u324Er;\\u6986;\\uC000\\u{1D563}us;\\u6A2Eimes;\\u6A35\\u0100ap\\u325D\\u3267r\\u0100;g\\u3263\\u3264\\u4029t;\\u6994olint;\\u6A12ar\\xF2\\u31E3\\u0200achq\\u327B\\u3280\\u10BC\\u3285quo;\\u603Ar;\\uC000\\u{1D4C7}\\u0100bu\\u30FB\\u328Ao\\u0100;r\\u0214\\u0213\\u0180hir\\u3297\\u329B\\u32A0re\\xE5\\u31F8mes;\\u62CAi\\u0200;efl\\u32AA\\u1059\\u1821\\u32AB\\u65B9tri;\\u69CEluhar;\\u6968;\\u611E\\u0D61\\u32D5\\u32DB\\u32DF\\u332C\\u3338\\u3371\\0\\u337A\\u33A4\\0\\0\\u33EC\\u33F0\\0\\u3428\\u3448\\u345A\\u34AD\\u34B1\\u34CA\\u34F1\\0\\u3616\\0\\0\\u3633cute;\\u415Bqu\\xEF\\u27BA\\u0500;Eaceinpsy\\u11ED\\u32F3\\u32F5\\u32FF\\u3302\\u330B\\u330F\\u331F\\u3326\\u3329;\\u6AB4\\u01F0\\u32FA\\0\\u32FC;\\u6AB8on;\\u4161u\\xE5\\u11FE\\u0100;d\\u11F3\\u3307il;\\u415Frc;\\u415D\\u0180Eas\\u3316\\u3318\\u331B;\\u6AB6p;\\u6ABAim;\\u62E9olint;\\u6A13i\\xED\\u1204;\\u4441ot\\u0180;be\\u3334\\u1D47\\u3335\\u62C5;\\u6A66\\u0380Aacmstx\\u3346\\u334A\\u3357\\u335B\\u335E\\u3363\\u336Drr;\\u61D8r\\u0100hr\\u3350\\u3352\\xEB\\u2228\\u0100;o\\u0A36\\u0A34t\\u803B\\xA7\\u40A7i;\\u403Bwar;\\u6929m\\u0100in\\u3369\\xF0nu\\xF3\\xF1t;\\u6736r\\u0100;o\\u3376\\u2055\\uC000\\u{1D530}\\u0200acoy\\u3382\\u3386\\u3391\\u33A0rp;\\u666F\\u0100hy\\u338B\\u338Fcy;\\u4449;\\u4448rt\\u026D\\u3399\\0\\0\\u339Ci\\xE4\\u1464ara\\xEC\\u2E6F\\u803B\\xAD\\u40AD\\u0100gm\\u33A8\\u33B4ma\\u0180;fv\\u33B1\\u33B2\\u33B2\\u43C3;\\u43C2\\u0400;deglnpr\\u12AB\\u33C5\\u33C9\\u33CE\\u33D6\\u33DE\\u33E1\\u33E6ot;\\u6A6A\\u0100;q\\u12B1\\u12B0\\u0100;E\\u33D3\\u33D4\\u6A9E;\\u6AA0\\u0100;E\\u33DB\\u33DC\\u6A9D;\\u6A9Fe;\\u6246lus;\\u6A24arr;\\u6972ar\\xF2\\u113D\\u0200aeit\\u33F8\\u3408\\u340F\\u3417\\u0100ls\\u33FD\\u3404lsetm\\xE9\\u336Ahp;\\u6A33parsl;\\u69E4\\u0100dl\\u1463\\u3414e;\\u6323\\u0100;e\\u341C\\u341D\\u6AAA\\u0100;s\\u3422\\u3423\\u6AAC;\\uC000\\u2AAC\\uFE00\\u0180flp\\u342E\\u3433\\u3442tcy;\\u444C\\u0100;b\\u3438\\u3439\\u402F\\u0100;a\\u343E\\u343F\\u69C4r;\\u633Ff;\\uC000\\u{1D564}a\\u0100dr\\u344D\\u0402es\\u0100;u\\u3454\\u3455\\u6660it\\xBB\\u3455\\u0180csu\\u3460\\u3479\\u349F\\u0100au\\u3465\\u346Fp\\u0100;s\\u1188\\u346B;\\uC000\\u2293\\uFE00p\\u0100;s\\u11B4\\u3475;\\uC000\\u2294\\uFE00u\\u0100bp\\u347F\\u348F\\u0180;es\\u1197\\u119C\\u3486et\\u0100;e\\u1197\\u348D\\xF1\\u119D\\u0180;es\\u11A8\\u11AD\\u3496et\\u0100;e\\u11A8\\u349D\\xF1\\u11AE\\u0180;af\\u117B\\u34A6\\u05B0r\\u0165\\u34AB\\u05B1\\xBB\\u117Car\\xF2\\u1148\\u0200cemt\\u34B9\\u34BE\\u34C2\\u34C5r;\\uC000\\u{1D4C8}tm\\xEE\\xF1i\\xEC\\u3415ar\\xE6\\u11BE\\u0100ar\\u34CE\\u34D5r\\u0100;f\\u34D4\\u17BF\\u6606\\u0100an\\u34DA\\u34EDight\\u0100ep\\u34E3\\u34EApsilo\\xEE\\u1EE0h\\xE9\\u2EAFs\\xBB\\u2852\\u0280bcmnp\\u34FB\\u355E\\u1209\\u358B\\u358E\\u0480;Edemnprs\\u350E\\u350F\\u3511\\u3515\\u351E\\u3523\\u352C\\u3531\\u3536\\u6282;\\u6AC5ot;\\u6ABD\\u0100;d\\u11DA\\u351Aot;\\u6AC3ult;\\u6AC1\\u0100Ee\\u3528\\u352A;\\u6ACB;\\u628Alus;\\u6ABFarr;\\u6979\\u0180eiu\\u353D\\u3552\\u3555t\\u0180;en\\u350E\\u3545\\u354Bq\\u0100;q\\u11DA\\u350Feq\\u0100;q\\u352B\\u3528m;\\u6AC7\\u0100bp\\u355A\\u355C;\\u6AD5;\\u6AD3c\\u0300;acens\\u11ED\\u356C\\u3572\\u3579\\u357B\\u3326ppro\\xF8\\u32FAurlye\\xF1\\u11FE\\xF1\\u11F3\\u0180aes\\u3582\\u3588\\u331Bppro\\xF8\\u331Aq\\xF1\\u3317g;\\u666A\\u0680123;Edehlmnps\\u35A9\\u35AC\\u35AF\\u121C\\u35B2\\u35B4\\u35C0\\u35C9\\u35D5\\u35DA\\u35DF\\u35E8\\u35ED\\u803B\\xB9\\u40B9\\u803B\\xB2\\u40B2\\u803B\\xB3\\u40B3;\\u6AC6\\u0100os\\u35B9\\u35BCt;\\u6ABEub;\\u6AD8\\u0100;d\\u1222\\u35C5ot;\\u6AC4s\\u0100ou\\u35CF\\u35D2l;\\u67C9b;\\u6AD7arr;\\u697Bult;\\u6AC2\\u0100Ee\\u35E4\\u35E6;\\u6ACC;\\u628Blus;\\u6AC0\\u0180eiu\\u35F4\\u3609\\u360Ct\\u0180;en\\u121C\\u35FC\\u3602q\\u0100;q\\u1222\\u35B2eq\\u0100;q\\u35E7\\u35E4m;\\u6AC8\\u0100bp\\u3611\\u3613;\\u6AD4;\\u6AD6\\u0180Aan\\u361C\\u3620\\u362Drr;\\u61D9r\\u0100hr\\u3626\\u3628\\xEB\\u222E\\u0100;o\\u0A2B\\u0A29war;\\u692Alig\\u803B\\xDF\\u40DF\\u0BE1\\u3651\\u365D\\u3660\\u12CE\\u3673\\u3679\\0\\u367E\\u36C2\\0\\0\\0\\0\\0\\u36DB\\u3703\\0\\u3709\\u376C\\0\\0\\0\\u3787\\u0272\\u3656\\0\\0\\u365Bget;\\u6316;\\u43C4r\\xEB\\u0E5F\\u0180aey\\u3666\\u366B\\u3670ron;\\u4165dil;\\u4163;\\u4442lrec;\\u6315r;\\uC000\\u{1D531}\\u0200eiko\\u3686\\u369D\\u36B5\\u36BC\\u01F2\\u368B\\0\\u3691e\\u01004f\\u1284\\u1281a\\u0180;sv\\u3698\\u3699\\u369B\\u43B8ym;\\u43D1\\u0100cn\\u36A2\\u36B2k\\u0100as\\u36A8\\u36AEppro\\xF8\\u12C1im\\xBB\\u12ACs\\xF0\\u129E\\u0100as\\u36BA\\u36AE\\xF0\\u12C1rn\\u803B\\xFE\\u40FE\\u01EC\\u031F\\u36C6\\u22E7es\\u8180\\xD7;bd\\u36CF\\u36D0\\u36D8\\u40D7\\u0100;a\\u190F\\u36D5r;\\u6A31;\\u6A30\\u0180eps\\u36E1\\u36E3\\u3700\\xE1\\u2A4D\\u0200;bcf\\u0486\\u36EC\\u36F0\\u36F4ot;\\u6336ir;\\u6AF1\\u0100;o\\u36F9\\u36FC\\uC000\\u{1D565}rk;\\u6ADA\\xE1\\u3362rime;\\u6034\\u0180aip\\u370F\\u3712\\u3764d\\xE5\\u1248\\u0380adempst\\u3721\\u374D\\u3740\\u3751\\u3757\\u375C\\u375Fngle\\u0280;dlqr\\u3730\\u3731\\u3736\\u3740\\u3742\\u65B5own\\xBB\\u1DBBeft\\u0100;e\\u2800\\u373E\\xF1\\u092E;\\u625Cight\\u0100;e\\u32AA\\u374B\\xF1\\u105Aot;\\u65ECinus;\\u6A3Alus;\\u6A39b;\\u69CDime;\\u6A3Bezium;\\u63E2\\u0180cht\\u3772\\u377D\\u3781\\u0100ry\\u3777\\u377B;\\uC000\\u{1D4C9};\\u4446cy;\\u445Brok;\\u4167\\u0100io\\u378B\\u378Ex\\xF4\\u1777head\\u0100lr\\u3797\\u37A0eftarro\\xF7\\u084Fightarrow\\xBB\\u0F5D\\u0900AHabcdfghlmoprstuw\\u37D0\\u37D3\\u37D7\\u37E4\\u37F0\\u37FC\\u380E\\u381C\\u3823\\u3834\\u3851\\u385D\\u386B\\u38A9\\u38CC\\u38D2\\u38EA\\u38F6r\\xF2\\u03EDar;\\u6963\\u0100cr\\u37DC\\u37E2ute\\u803B\\xFA\\u40FA\\xF2\\u1150r\\u01E3\\u37EA\\0\\u37EDy;\\u445Eve;\\u416D\\u0100iy\\u37F5\\u37FArc\\u803B\\xFB\\u40FB;\\u4443\\u0180abh\\u3803\\u3806\\u380Br\\xF2\\u13ADlac;\\u4171a\\xF2\\u13C3\\u0100ir\\u3813\\u3818sht;\\u697E;\\uC000\\u{1D532}rave\\u803B\\xF9\\u40F9\\u0161\\u3827\\u3831r\\u0100lr\\u382C\\u382E\\xBB\\u0957\\xBB\\u1083lk;\\u6580\\u0100ct\\u3839\\u384D\\u026F\\u383F\\0\\0\\u384Arn\\u0100;e\\u3845\\u3846\\u631Cr\\xBB\\u3846op;\\u630Fri;\\u65F8\\u0100al\\u3856\\u385Acr;\\u416B\\u80BB\\xA8\\u0349\\u0100gp\\u3862\\u3866on;\\u4173f;\\uC000\\u{1D566}\\u0300adhlsu\\u114B\\u3878\\u387D\\u1372\\u3891\\u38A0own\\xE1\\u13B3arpoon\\u0100lr\\u3888\\u388Cef\\xF4\\u382Digh\\xF4\\u382Fi\\u0180;hl\\u3899\\u389A\\u389C\\u43C5\\xBB\\u13FAon\\xBB\\u389Aparrows;\\u61C8\\u0180cit\\u38B0\\u38C4\\u38C8\\u026F\\u38B6\\0\\0\\u38C1rn\\u0100;e\\u38BC\\u38BD\\u631Dr\\xBB\\u38BDop;\\u630Eng;\\u416Fri;\\u65F9cr;\\uC000\\u{1D4CA}\\u0180dir\\u38D9\\u38DD\\u38E2ot;\\u62F0lde;\\u4169i\\u0100;f\\u3730\\u38E8\\xBB\\u1813\\u0100am\\u38EF\\u38F2r\\xF2\\u38A8l\\u803B\\xFC\\u40FCangle;\\u69A7\\u0780ABDacdeflnoprsz\\u391C\\u391F\\u3929\\u392D\\u39B5\\u39B8\\u39BD\\u39DF\\u39E4\\u39E8\\u39F3\\u39F9\\u39FD\\u3A01\\u3A20r\\xF2\\u03F7ar\\u0100;v\\u3926\\u3927\\u6AE8;\\u6AE9as\\xE8\\u03E1\\u0100nr\\u3932\\u3937grt;\\u699C\\u0380eknprst\\u34E3\\u3946\\u394B\\u3952\\u395D\\u3964\\u3996app\\xE1\\u2415othin\\xE7\\u1E96\\u0180hir\\u34EB\\u2EC8\\u3959op\\xF4\\u2FB5\\u0100;h\\u13B7\\u3962\\xEF\\u318D\\u0100iu\\u3969\\u396Dgm\\xE1\\u33B3\\u0100bp\\u3972\\u3984setneq\\u0100;q\\u397D\\u3980\\uC000\\u228A\\uFE00;\\uC000\\u2ACB\\uFE00setneq\\u0100;q\\u398F\\u3992\\uC000\\u228B\\uFE00;\\uC000\\u2ACC\\uFE00\\u0100hr\\u399B\\u399Fet\\xE1\\u369Ciangle\\u0100lr\\u39AA\\u39AFeft\\xBB\\u0925ight\\xBB\\u1051y;\\u4432ash\\xBB\\u1036\\u0180elr\\u39C4\\u39D2\\u39D7\\u0180;be\\u2DEA\\u39CB\\u39CFar;\\u62BBq;\\u625Alip;\\u62EE\\u0100bt\\u39DC\\u1468a\\xF2\\u1469r;\\uC000\\u{1D533}tr\\xE9\\u39AEsu\\u0100bp\\u39EF\\u39F1\\xBB\\u0D1C\\xBB\\u0D59pf;\\uC000\\u{1D567}ro\\xF0\\u0EFBtr\\xE9\\u39B4\\u0100cu\\u3A06\\u3A0Br;\\uC000\\u{1D4CB}\\u0100bp\\u3A10\\u3A18n\\u0100Ee\\u3980\\u3A16\\xBB\\u397En\\u0100Ee\\u3992\\u3A1E\\xBB\\u3990igzag;\\u699A\\u0380cefoprs\\u3A36\\u3A3B\\u3A56\\u3A5B\\u3A54\\u3A61\\u3A6Airc;\\u4175\\u0100di\\u3A40\\u3A51\\u0100bg\\u3A45\\u3A49ar;\\u6A5Fe\\u0100;q\\u15FA\\u3A4F;\\u6259erp;\\u6118r;\\uC000\\u{1D534}pf;\\uC000\\u{1D568}\\u0100;e\\u1479\\u3A66at\\xE8\\u1479cr;\\uC000\\u{1D4CC}\\u0AE3\\u178E\\u3A87\\0\\u3A8B\\0\\u3A90\\u3A9B\\0\\0\\u3A9D\\u3AA8\\u3AAB\\u3AAF\\0\\0\\u3AC3\\u3ACE\\0\\u3AD8\\u17DC\\u17DFtr\\xE9\\u17D1r;\\uC000\\u{1D535}\\u0100Aa\\u3A94\\u3A97r\\xF2\\u03C3r\\xF2\\u09F6;\\u43BE\\u0100Aa\\u3AA1\\u3AA4r\\xF2\\u03B8r\\xF2\\u09EBa\\xF0\\u2713is;\\u62FB\\u0180dpt\\u17A4\\u3AB5\\u3ABE\\u0100fl\\u3ABA\\u17A9;\\uC000\\u{1D569}im\\xE5\\u17B2\\u0100Aa\\u3AC7\\u3ACAr\\xF2\\u03CEr\\xF2\\u0A01\\u0100cq\\u3AD2\\u17B8r;\\uC000\\u{1D4CD}\\u0100pt\\u17D6\\u3ADCr\\xE9\\u17D4\\u0400acefiosu\\u3AF0\\u3AFD\\u3B08\\u3B0C\\u3B11\\u3B15\\u3B1B\\u3B21c\\u0100uy\\u3AF6\\u3AFBte\\u803B\\xFD\\u40FD;\\u444F\\u0100iy\\u3B02\\u3B06rc;\\u4177;\\u444Bn\\u803B\\xA5\\u40A5r;\\uC000\\u{1D536}cy;\\u4457pf;\\uC000\\u{1D56A}cr;\\uC000\\u{1D4CE}\\u0100cm\\u3B26\\u3B29y;\\u444El\\u803B\\xFF\\u40FF\\u0500acdefhiosw\\u3B42\\u3B48\\u3B54\\u3B58\\u3B64\\u3B69\\u3B6D\\u3B74\\u3B7A\\u3B80cute;\\u417A\\u0100ay\\u3B4D\\u3B52ron;\\u417E;\\u4437ot;\\u417C\\u0100et\\u3B5D\\u3B61tr\\xE6\\u155Fa;\\u43B6r;\\uC000\\u{1D537}cy;\\u4436grarr;\\u61DDpf;\\uC000\\u{1D56B}cr;\\uC000\\u{1D4CF}\\u0100jn\\u3B85\\u3B87;\\u600Dj;\\u600C'.split(\"\").map(e=>e.charCodeAt(0)));var av=new Uint16Array(\"\\u0200aglq\t\u0015\u0018\\x1B\\u026D\u000f\\0\\0\u0012p;\\u4026os;\\u4027t;\\u403Et;\\u403Cuot;\\u4022\".split(\"\").map(e=>e.charCodeAt(0)));var Ip,iS=new Map([[0,65533],[128,8364],[130,8218],[131,402],[132,8222],[133,8230],[134,8224],[135,8225],[136,710],[137,8240],[138,352],[139,8249],[140,338],[142,381],[145,8216],[146,8217],[147,8220],[148,8221],[149,8226],[150,8211],[151,8212],[152,732],[153,8482],[154,353],[155,8250],[156,339],[158,382],[159,376]]),Tp=(Ip=String.fromCodePoint)!==null&&Ip!==void 0?Ip:function(e){let t=\"\";return e>65535&&(e-=65536,t+=String.fromCharCode(e>>>10&1023|55296),e=56320|e&1023),t+=String.fromCharCode(e),t};function Sp(e){var t;return e>=55296&&e<=57343||e>1114111?65533:(t=iS.get(e))!==null&&t!==void 0?t:e}var ge=(function(e){return e[e.NUM=35]=\"NUM\",e[e.SEMI=59]=\"SEMI\",e[e.EQUALS=61]=\"EQUALS\",e[e.ZERO=48]=\"ZERO\",e[e.NINE=57]=\"NINE\",e[e.LOWER_A=97]=\"LOWER_A\",e[e.LOWER_F=102]=\"LOWER_F\",e[e.LOWER_X=120]=\"LOWER_X\",e[e.LOWER_Z=122]=\"LOWER_Z\",e[e.UPPER_A=65]=\"UPPER_A\",e[e.UPPER_F=70]=\"UPPER_F\",e[e.UPPER_Z=90]=\"UPPER_Z\",e})(ge||{}),sS=32,sr=(function(e){return e[e.VALUE_LENGTH=49152]=\"VALUE_LENGTH\",e[e.BRANCH_LENGTH=16256]=\"BRANCH_LENGTH\",e[e.JUMP_TABLE=127]=\"JUMP_TABLE\",e})(sr||{});function Mp(e){return e>=ge.ZERO&&e<=ge.NINE}function uS(e){return e>=ge.UPPER_A&&e<=ge.UPPER_F||e>=ge.LOWER_A&&e<=ge.LOWER_F}function aS(e){return e>=ge.UPPER_A&&e<=ge.UPPER_Z||e>=ge.LOWER_A&&e<=ge.LOWER_Z||Mp(e)}function cS(e){return e===ge.EQUALS||aS(e)}var he=(function(e){return e[e.EntityStart=0]=\"EntityStart\",e[e.NumericStart=1]=\"NumericStart\",e[e.NumericDecimal=2]=\"NumericDecimal\",e[e.NumericHex=3]=\"NumericHex\",e[e.NamedEntity=4]=\"NamedEntity\",e})(he||{}),qt=(function(e){return e[e.Legacy=0]=\"Legacy\",e[e.Strict=1]=\"Strict\",e[e.Attribute=2]=\"Attribute\",e})(qt||{}),ka=class{constructor(t,n,r){this.decodeTree=t,this.emitCodePoint=n,this.errors=r,this.state=he.EntityStart,this.consumed=1,this.result=0,this.treeIndex=0,this.excess=1,this.decodeMode=qt.Strict}startEntity(t){this.decodeMode=t,this.state=he.EntityStart,this.result=0,this.treeIndex=0,this.excess=1,this.consumed=1}write(t,n){switch(this.state){case he.EntityStart:return t.charCodeAt(n)===ge.NUM?(this.state=he.NumericStart,this.consumed+=1,this.stateNumericStart(t,n+1)):(this.state=he.NamedEntity,this.stateNamedEntity(t,n));case he.NumericStart:return this.stateNumericStart(t,n);case he.NumericDecimal:return this.stateNumericDecimal(t,n);case he.NumericHex:return this.stateNumericHex(t,n);case he.NamedEntity:return this.stateNamedEntity(t,n)}}stateNumericStart(t,n){return n>=t.length?-1:(t.charCodeAt(n)|sS)===ge.LOWER_X?(this.state=he.NumericHex,this.consumed+=1,this.stateNumericHex(t,n+1)):(this.state=he.NumericDecimal,this.stateNumericDecimal(t,n))}addToNumericResult(t,n,r,o){if(n!==r){let i=r-n;this.result=this.result*Math.pow(o,i)+parseInt(t.substr(n,i),o),this.consumed+=i}}stateNumericHex(t,n){let r=n;for(;n<t.length;){let o=t.charCodeAt(n);if(Mp(o)||uS(o))n+=1;else return this.addToNumericResult(t,r,n,16),this.emitNumericEntity(o,3)}return this.addToNumericResult(t,r,n,16),-1}stateNumericDecimal(t,n){let r=n;for(;n<t.length;){let o=t.charCodeAt(n);if(Mp(o))n+=1;else return this.addToNumericResult(t,r,n,10),this.emitNumericEntity(o,2)}return this.addToNumericResult(t,r,n,10),-1}emitNumericEntity(t,n){var r;if(this.consumed<=n)return(r=this.errors)===null||r===void 0||r.absenceOfDigitsInNumericCharacterReference(this.consumed),0;if(t===ge.SEMI)this.consumed+=1;else if(this.decodeMode===qt.Strict)return 0;return this.emitCodePoint(Sp(this.result),this.consumed),this.errors&&(t!==ge.SEMI&&this.errors.missingSemicolonAfterCharacterReference(),this.errors.validateNumericCharacterReference(this.result)),this.consumed}stateNamedEntity(t,n){let{decodeTree:r}=this,o=r[this.treeIndex],i=(o&sr.VALUE_LENGTH)>>14;for(;n<t.length;n++,this.excess++){let s=t.charCodeAt(n);if(this.treeIndex=lS(r,o,this.treeIndex+Math.max(1,i),s),this.treeIndex<0)return this.result===0||this.decodeMode===qt.Attribute&&(i===0||cS(s))?0:this.emitNotTerminatedNamedEntity();if(o=r[this.treeIndex],i=(o&sr.VALUE_LENGTH)>>14,i!==0){if(s===ge.SEMI)return this.emitNamedEntityData(this.treeIndex,i,this.consumed+this.excess);this.decodeMode!==qt.Strict&&(this.result=this.treeIndex,this.consumed+=this.excess,this.excess=0)}}return-1}emitNotTerminatedNamedEntity(){var t;let{result:n,decodeTree:r}=this,o=(r[n]&sr.VALUE_LENGTH)>>14;return this.emitNamedEntityData(n,o,this.consumed),(t=this.errors)===null||t===void 0||t.missingSemicolonAfterCharacterReference(),this.consumed}emitNamedEntityData(t,n,r){let{decodeTree:o}=this;return this.emitCodePoint(n===1?o[t]&~sr.VALUE_LENGTH:o[t+1],r),n===3&&this.emitCodePoint(o[t+2],r),r}end(){var t;switch(this.state){case he.NamedEntity:return this.result!==0&&(this.decodeMode!==qt.Attribute||this.result===this.treeIndex)?this.emitNotTerminatedNamedEntity():0;case he.NumericDecimal:return this.emitNumericEntity(0,2);case he.NumericHex:return this.emitNumericEntity(0,3);case he.NumericStart:return(t=this.errors)===null||t===void 0||t.absenceOfDigitsInNumericCharacterReference(this.consumed),0;case he.EntityStart:return 0}}};function cv(e){let t=\"\",n=new ka(e,r=>t+=Tp(r));return function(o,i){let s=0,u=0;for(;(u=o.indexOf(\"&\",u))>=0;){t+=o.slice(s,u),n.startEntity(i);let c=n.write(o,u+1);if(c<0){s=u+n.end();break}s=u+c,u=c===0?s+1:s}let a=t+o.slice(s);return t=\"\",a}}function lS(e,t,n,r){let o=(t&sr.BRANCH_LENGTH)>>7,i=t&sr.JUMP_TABLE;if(o===0)return i!==0&&r===i?n:-1;if(i){let a=r-i;return a<0||a>=o?-1:e[n+a]-1}let s=n,u=s+o-1;for(;s<=u;){let a=s+u>>>1,c=e[a];if(c<r)s=a+1;else if(c>r)u=a-1;else return e[a+o]}return-1}var dS=cv(uv),U$=cv(av);function Cn(e,t=qt.Legacy){return dS(e,t)}function Ra(e){for(let t=1;t<e.length;t++)e[t][0]+=e[t-1][0]+1;return e}var fS=new Map(Ra([[9,\"&Tab;\"],[0,\"&NewLine;\"],[22,\"&excl;\"],[0,\"&quot;\"],[0,\"&num;\"],[0,\"&dollar;\"],[0,\"&percnt;\"],[0,\"&amp;\"],[0,\"&apos;\"],[0,\"&lpar;\"],[0,\"&rpar;\"],[0,\"&ast;\"],[0,\"&plus;\"],[0,\"&comma;\"],[1,\"&period;\"],[0,\"&sol;\"],[10,\"&colon;\"],[0,\"&semi;\"],[0,{v:\"&lt;\",n:8402,o:\"&nvlt;\"}],[0,{v:\"&equals;\",n:8421,o:\"&bne;\"}],[0,{v:\"&gt;\",n:8402,o:\"&nvgt;\"}],[0,\"&quest;\"],[0,\"&commat;\"],[26,\"&lbrack;\"],[0,\"&bsol;\"],[0,\"&rbrack;\"],[0,\"&Hat;\"],[0,\"&lowbar;\"],[0,\"&DiacriticalGrave;\"],[5,{n:106,o:\"&fjlig;\"}],[20,\"&lbrace;\"],[0,\"&verbar;\"],[0,\"&rbrace;\"],[34,\"&nbsp;\"],[0,\"&iexcl;\"],[0,\"&cent;\"],[0,\"&pound;\"],[0,\"&curren;\"],[0,\"&yen;\"],[0,\"&brvbar;\"],[0,\"&sect;\"],[0,\"&die;\"],[0,\"&copy;\"],[0,\"&ordf;\"],[0,\"&laquo;\"],[0,\"&not;\"],[0,\"&shy;\"],[0,\"&circledR;\"],[0,\"&macr;\"],[0,\"&deg;\"],[0,\"&PlusMinus;\"],[0,\"&sup2;\"],[0,\"&sup3;\"],[0,\"&acute;\"],[0,\"&micro;\"],[0,\"&para;\"],[0,\"&centerdot;\"],[0,\"&cedil;\"],[0,\"&sup1;\"],[0,\"&ordm;\"],[0,\"&raquo;\"],[0,\"&frac14;\"],[0,\"&frac12;\"],[0,\"&frac34;\"],[0,\"&iquest;\"],[0,\"&Agrave;\"],[0,\"&Aacute;\"],[0,\"&Acirc;\"],[0,\"&Atilde;\"],[0,\"&Auml;\"],[0,\"&angst;\"],[0,\"&AElig;\"],[0,\"&Ccedil;\"],[0,\"&Egrave;\"],[0,\"&Eacute;\"],[0,\"&Ecirc;\"],[0,\"&Euml;\"],[0,\"&Igrave;\"],[0,\"&Iacute;\"],[0,\"&Icirc;\"],[0,\"&Iuml;\"],[0,\"&ETH;\"],[0,\"&Ntilde;\"],[0,\"&Ograve;\"],[0,\"&Oacute;\"],[0,\"&Ocirc;\"],[0,\"&Otilde;\"],[0,\"&Ouml;\"],[0,\"&times;\"],[0,\"&Oslash;\"],[0,\"&Ugrave;\"],[0,\"&Uacute;\"],[0,\"&Ucirc;\"],[0,\"&Uuml;\"],[0,\"&Yacute;\"],[0,\"&THORN;\"],[0,\"&szlig;\"],[0,\"&agrave;\"],[0,\"&aacute;\"],[0,\"&acirc;\"],[0,\"&atilde;\"],[0,\"&auml;\"],[0,\"&aring;\"],[0,\"&aelig;\"],[0,\"&ccedil;\"],[0,\"&egrave;\"],[0,\"&eacute;\"],[0,\"&ecirc;\"],[0,\"&euml;\"],[0,\"&igrave;\"],[0,\"&iacute;\"],[0,\"&icirc;\"],[0,\"&iuml;\"],[0,\"&eth;\"],[0,\"&ntilde;\"],[0,\"&ograve;\"],[0,\"&oacute;\"],[0,\"&ocirc;\"],[0,\"&otilde;\"],[0,\"&ouml;\"],[0,\"&div;\"],[0,\"&oslash;\"],[0,\"&ugrave;\"],[0,\"&uacute;\"],[0,\"&ucirc;\"],[0,\"&uuml;\"],[0,\"&yacute;\"],[0,\"&thorn;\"],[0,\"&yuml;\"],[0,\"&Amacr;\"],[0,\"&amacr;\"],[0,\"&Abreve;\"],[0,\"&abreve;\"],[0,\"&Aogon;\"],[0,\"&aogon;\"],[0,\"&Cacute;\"],[0,\"&cacute;\"],[0,\"&Ccirc;\"],[0,\"&ccirc;\"],[0,\"&Cdot;\"],[0,\"&cdot;\"],[0,\"&Ccaron;\"],[0,\"&ccaron;\"],[0,\"&Dcaron;\"],[0,\"&dcaron;\"],[0,\"&Dstrok;\"],[0,\"&dstrok;\"],[0,\"&Emacr;\"],[0,\"&emacr;\"],[2,\"&Edot;\"],[0,\"&edot;\"],[0,\"&Eogon;\"],[0,\"&eogon;\"],[0,\"&Ecaron;\"],[0,\"&ecaron;\"],[0,\"&Gcirc;\"],[0,\"&gcirc;\"],[0,\"&Gbreve;\"],[0,\"&gbreve;\"],[0,\"&Gdot;\"],[0,\"&gdot;\"],[0,\"&Gcedil;\"],[1,\"&Hcirc;\"],[0,\"&hcirc;\"],[0,\"&Hstrok;\"],[0,\"&hstrok;\"],[0,\"&Itilde;\"],[0,\"&itilde;\"],[0,\"&Imacr;\"],[0,\"&imacr;\"],[2,\"&Iogon;\"],[0,\"&iogon;\"],[0,\"&Idot;\"],[0,\"&imath;\"],[0,\"&IJlig;\"],[0,\"&ijlig;\"],[0,\"&Jcirc;\"],[0,\"&jcirc;\"],[0,\"&Kcedil;\"],[0,\"&kcedil;\"],[0,\"&kgreen;\"],[0,\"&Lacute;\"],[0,\"&lacute;\"],[0,\"&Lcedil;\"],[0,\"&lcedil;\"],[0,\"&Lcaron;\"],[0,\"&lcaron;\"],[0,\"&Lmidot;\"],[0,\"&lmidot;\"],[0,\"&Lstrok;\"],[0,\"&lstrok;\"],[0,\"&Nacute;\"],[0,\"&nacute;\"],[0,\"&Ncedil;\"],[0,\"&ncedil;\"],[0,\"&Ncaron;\"],[0,\"&ncaron;\"],[0,\"&napos;\"],[0,\"&ENG;\"],[0,\"&eng;\"],[0,\"&Omacr;\"],[0,\"&omacr;\"],[2,\"&Odblac;\"],[0,\"&odblac;\"],[0,\"&OElig;\"],[0,\"&oelig;\"],[0,\"&Racute;\"],[0,\"&racute;\"],[0,\"&Rcedil;\"],[0,\"&rcedil;\"],[0,\"&Rcaron;\"],[0,\"&rcaron;\"],[0,\"&Sacute;\"],[0,\"&sacute;\"],[0,\"&Scirc;\"],[0,\"&scirc;\"],[0,\"&Scedil;\"],[0,\"&scedil;\"],[0,\"&Scaron;\"],[0,\"&scaron;\"],[0,\"&Tcedil;\"],[0,\"&tcedil;\"],[0,\"&Tcaron;\"],[0,\"&tcaron;\"],[0,\"&Tstrok;\"],[0,\"&tstrok;\"],[0,\"&Utilde;\"],[0,\"&utilde;\"],[0,\"&Umacr;\"],[0,\"&umacr;\"],[0,\"&Ubreve;\"],[0,\"&ubreve;\"],[0,\"&Uring;\"],[0,\"&uring;\"],[0,\"&Udblac;\"],[0,\"&udblac;\"],[0,\"&Uogon;\"],[0,\"&uogon;\"],[0,\"&Wcirc;\"],[0,\"&wcirc;\"],[0,\"&Ycirc;\"],[0,\"&ycirc;\"],[0,\"&Yuml;\"],[0,\"&Zacute;\"],[0,\"&zacute;\"],[0,\"&Zdot;\"],[0,\"&zdot;\"],[0,\"&Zcaron;\"],[0,\"&zcaron;\"],[19,\"&fnof;\"],[34,\"&imped;\"],[63,\"&gacute;\"],[65,\"&jmath;\"],[142,\"&circ;\"],[0,\"&caron;\"],[16,\"&breve;\"],[0,\"&DiacriticalDot;\"],[0,\"&ring;\"],[0,\"&ogon;\"],[0,\"&DiacriticalTilde;\"],[0,\"&dblac;\"],[51,\"&DownBreve;\"],[127,\"&Alpha;\"],[0,\"&Beta;\"],[0,\"&Gamma;\"],[0,\"&Delta;\"],[0,\"&Epsilon;\"],[0,\"&Zeta;\"],[0,\"&Eta;\"],[0,\"&Theta;\"],[0,\"&Iota;\"],[0,\"&Kappa;\"],[0,\"&Lambda;\"],[0,\"&Mu;\"],[0,\"&Nu;\"],[0,\"&Xi;\"],[0,\"&Omicron;\"],[0,\"&Pi;\"],[0,\"&Rho;\"],[1,\"&Sigma;\"],[0,\"&Tau;\"],[0,\"&Upsilon;\"],[0,\"&Phi;\"],[0,\"&Chi;\"],[0,\"&Psi;\"],[0,\"&ohm;\"],[7,\"&alpha;\"],[0,\"&beta;\"],[0,\"&gamma;\"],[0,\"&delta;\"],[0,\"&epsi;\"],[0,\"&zeta;\"],[0,\"&eta;\"],[0,\"&theta;\"],[0,\"&iota;\"],[0,\"&kappa;\"],[0,\"&lambda;\"],[0,\"&mu;\"],[0,\"&nu;\"],[0,\"&xi;\"],[0,\"&omicron;\"],[0,\"&pi;\"],[0,\"&rho;\"],[0,\"&sigmaf;\"],[0,\"&sigma;\"],[0,\"&tau;\"],[0,\"&upsi;\"],[0,\"&phi;\"],[0,\"&chi;\"],[0,\"&psi;\"],[0,\"&omega;\"],[7,\"&thetasym;\"],[0,\"&Upsi;\"],[2,\"&phiv;\"],[0,\"&piv;\"],[5,\"&Gammad;\"],[0,\"&digamma;\"],[18,\"&kappav;\"],[0,\"&rhov;\"],[3,\"&epsiv;\"],[0,\"&backepsilon;\"],[10,\"&IOcy;\"],[0,\"&DJcy;\"],[0,\"&GJcy;\"],[0,\"&Jukcy;\"],[0,\"&DScy;\"],[0,\"&Iukcy;\"],[0,\"&YIcy;\"],[0,\"&Jsercy;\"],[0,\"&LJcy;\"],[0,\"&NJcy;\"],[0,\"&TSHcy;\"],[0,\"&KJcy;\"],[1,\"&Ubrcy;\"],[0,\"&DZcy;\"],[0,\"&Acy;\"],[0,\"&Bcy;\"],[0,\"&Vcy;\"],[0,\"&Gcy;\"],[0,\"&Dcy;\"],[0,\"&IEcy;\"],[0,\"&ZHcy;\"],[0,\"&Zcy;\"],[0,\"&Icy;\"],[0,\"&Jcy;\"],[0,\"&Kcy;\"],[0,\"&Lcy;\"],[0,\"&Mcy;\"],[0,\"&Ncy;\"],[0,\"&Ocy;\"],[0,\"&Pcy;\"],[0,\"&Rcy;\"],[0,\"&Scy;\"],[0,\"&Tcy;\"],[0,\"&Ucy;\"],[0,\"&Fcy;\"],[0,\"&KHcy;\"],[0,\"&TScy;\"],[0,\"&CHcy;\"],[0,\"&SHcy;\"],[0,\"&SHCHcy;\"],[0,\"&HARDcy;\"],[0,\"&Ycy;\"],[0,\"&SOFTcy;\"],[0,\"&Ecy;\"],[0,\"&YUcy;\"],[0,\"&YAcy;\"],[0,\"&acy;\"],[0,\"&bcy;\"],[0,\"&vcy;\"],[0,\"&gcy;\"],[0,\"&dcy;\"],[0,\"&iecy;\"],[0,\"&zhcy;\"],[0,\"&zcy;\"],[0,\"&icy;\"],[0,\"&jcy;\"],[0,\"&kcy;\"],[0,\"&lcy;\"],[0,\"&mcy;\"],[0,\"&ncy;\"],[0,\"&ocy;\"],[0,\"&pcy;\"],[0,\"&rcy;\"],[0,\"&scy;\"],[0,\"&tcy;\"],[0,\"&ucy;\"],[0,\"&fcy;\"],[0,\"&khcy;\"],[0,\"&tscy;\"],[0,\"&chcy;\"],[0,\"&shcy;\"],[0,\"&shchcy;\"],[0,\"&hardcy;\"],[0,\"&ycy;\"],[0,\"&softcy;\"],[0,\"&ecy;\"],[0,\"&yucy;\"],[0,\"&yacy;\"],[1,\"&iocy;\"],[0,\"&djcy;\"],[0,\"&gjcy;\"],[0,\"&jukcy;\"],[0,\"&dscy;\"],[0,\"&iukcy;\"],[0,\"&yicy;\"],[0,\"&jsercy;\"],[0,\"&ljcy;\"],[0,\"&njcy;\"],[0,\"&tshcy;\"],[0,\"&kjcy;\"],[1,\"&ubrcy;\"],[0,\"&dzcy;\"],[7074,\"&ensp;\"],[0,\"&emsp;\"],[0,\"&emsp13;\"],[0,\"&emsp14;\"],[1,\"&numsp;\"],[0,\"&puncsp;\"],[0,\"&ThinSpace;\"],[0,\"&hairsp;\"],[0,\"&NegativeMediumSpace;\"],[0,\"&zwnj;\"],[0,\"&zwj;\"],[0,\"&lrm;\"],[0,\"&rlm;\"],[0,\"&dash;\"],[2,\"&ndash;\"],[0,\"&mdash;\"],[0,\"&horbar;\"],[0,\"&Verbar;\"],[1,\"&lsquo;\"],[0,\"&CloseCurlyQuote;\"],[0,\"&lsquor;\"],[1,\"&ldquo;\"],[0,\"&CloseCurlyDoubleQuote;\"],[0,\"&bdquo;\"],[1,\"&dagger;\"],[0,\"&Dagger;\"],[0,\"&bull;\"],[2,\"&nldr;\"],[0,\"&hellip;\"],[9,\"&permil;\"],[0,\"&pertenk;\"],[0,\"&prime;\"],[0,\"&Prime;\"],[0,\"&tprime;\"],[0,\"&backprime;\"],[3,\"&lsaquo;\"],[0,\"&rsaquo;\"],[3,\"&oline;\"],[2,\"&caret;\"],[1,\"&hybull;\"],[0,\"&frasl;\"],[10,\"&bsemi;\"],[7,\"&qprime;\"],[7,{v:\"&MediumSpace;\",n:8202,o:\"&ThickSpace;\"}],[0,\"&NoBreak;\"],[0,\"&af;\"],[0,\"&InvisibleTimes;\"],[0,\"&ic;\"],[72,\"&euro;\"],[46,\"&tdot;\"],[0,\"&DotDot;\"],[37,\"&complexes;\"],[2,\"&incare;\"],[4,\"&gscr;\"],[0,\"&hamilt;\"],[0,\"&Hfr;\"],[0,\"&Hopf;\"],[0,\"&planckh;\"],[0,\"&hbar;\"],[0,\"&imagline;\"],[0,\"&Ifr;\"],[0,\"&lagran;\"],[0,\"&ell;\"],[1,\"&naturals;\"],[0,\"&numero;\"],[0,\"&copysr;\"],[0,\"&weierp;\"],[0,\"&Popf;\"],[0,\"&Qopf;\"],[0,\"&realine;\"],[0,\"&real;\"],[0,\"&reals;\"],[0,\"&rx;\"],[3,\"&trade;\"],[1,\"&integers;\"],[2,\"&mho;\"],[0,\"&zeetrf;\"],[0,\"&iiota;\"],[2,\"&bernou;\"],[0,\"&Cayleys;\"],[1,\"&escr;\"],[0,\"&Escr;\"],[0,\"&Fouriertrf;\"],[1,\"&Mellintrf;\"],[0,\"&order;\"],[0,\"&alefsym;\"],[0,\"&beth;\"],[0,\"&gimel;\"],[0,\"&daleth;\"],[12,\"&CapitalDifferentialD;\"],[0,\"&dd;\"],[0,\"&ee;\"],[0,\"&ii;\"],[10,\"&frac13;\"],[0,\"&frac23;\"],[0,\"&frac15;\"],[0,\"&frac25;\"],[0,\"&frac35;\"],[0,\"&frac45;\"],[0,\"&frac16;\"],[0,\"&frac56;\"],[0,\"&frac18;\"],[0,\"&frac38;\"],[0,\"&frac58;\"],[0,\"&frac78;\"],[49,\"&larr;\"],[0,\"&ShortUpArrow;\"],[0,\"&rarr;\"],[0,\"&darr;\"],[0,\"&harr;\"],[0,\"&updownarrow;\"],[0,\"&nwarr;\"],[0,\"&nearr;\"],[0,\"&LowerRightArrow;\"],[0,\"&LowerLeftArrow;\"],[0,\"&nlarr;\"],[0,\"&nrarr;\"],[1,{v:\"&rarrw;\",n:824,o:\"&nrarrw;\"}],[0,\"&Larr;\"],[0,\"&Uarr;\"],[0,\"&Rarr;\"],[0,\"&Darr;\"],[0,\"&larrtl;\"],[0,\"&rarrtl;\"],[0,\"&LeftTeeArrow;\"],[0,\"&mapstoup;\"],[0,\"&map;\"],[0,\"&DownTeeArrow;\"],[1,\"&hookleftarrow;\"],[0,\"&hookrightarrow;\"],[0,\"&larrlp;\"],[0,\"&looparrowright;\"],[0,\"&harrw;\"],[0,\"&nharr;\"],[1,\"&lsh;\"],[0,\"&rsh;\"],[0,\"&ldsh;\"],[0,\"&rdsh;\"],[1,\"&crarr;\"],[0,\"&cularr;\"],[0,\"&curarr;\"],[2,\"&circlearrowleft;\"],[0,\"&circlearrowright;\"],[0,\"&leftharpoonup;\"],[0,\"&DownLeftVector;\"],[0,\"&RightUpVector;\"],[0,\"&LeftUpVector;\"],[0,\"&rharu;\"],[0,\"&DownRightVector;\"],[0,\"&dharr;\"],[0,\"&dharl;\"],[0,\"&RightArrowLeftArrow;\"],[0,\"&udarr;\"],[0,\"&LeftArrowRightArrow;\"],[0,\"&leftleftarrows;\"],[0,\"&upuparrows;\"],[0,\"&rightrightarrows;\"],[0,\"&ddarr;\"],[0,\"&leftrightharpoons;\"],[0,\"&Equilibrium;\"],[0,\"&nlArr;\"],[0,\"&nhArr;\"],[0,\"&nrArr;\"],[0,\"&DoubleLeftArrow;\"],[0,\"&DoubleUpArrow;\"],[0,\"&DoubleRightArrow;\"],[0,\"&dArr;\"],[0,\"&DoubleLeftRightArrow;\"],[0,\"&DoubleUpDownArrow;\"],[0,\"&nwArr;\"],[0,\"&neArr;\"],[0,\"&seArr;\"],[0,\"&swArr;\"],[0,\"&lAarr;\"],[0,\"&rAarr;\"],[1,\"&zigrarr;\"],[6,\"&larrb;\"],[0,\"&rarrb;\"],[15,\"&DownArrowUpArrow;\"],[7,\"&loarr;\"],[0,\"&roarr;\"],[0,\"&hoarr;\"],[0,\"&forall;\"],[0,\"&comp;\"],[0,{v:\"&part;\",n:824,o:\"&npart;\"}],[0,\"&exist;\"],[0,\"&nexist;\"],[0,\"&empty;\"],[1,\"&Del;\"],[0,\"&Element;\"],[0,\"&NotElement;\"],[1,\"&ni;\"],[0,\"&notni;\"],[2,\"&prod;\"],[0,\"&coprod;\"],[0,\"&sum;\"],[0,\"&minus;\"],[0,\"&MinusPlus;\"],[0,\"&dotplus;\"],[1,\"&Backslash;\"],[0,\"&lowast;\"],[0,\"&compfn;\"],[1,\"&radic;\"],[2,\"&prop;\"],[0,\"&infin;\"],[0,\"&angrt;\"],[0,{v:\"&ang;\",n:8402,o:\"&nang;\"}],[0,\"&angmsd;\"],[0,\"&angsph;\"],[0,\"&mid;\"],[0,\"&nmid;\"],[0,\"&DoubleVerticalBar;\"],[0,\"&NotDoubleVerticalBar;\"],[0,\"&and;\"],[0,\"&or;\"],[0,{v:\"&cap;\",n:65024,o:\"&caps;\"}],[0,{v:\"&cup;\",n:65024,o:\"&cups;\"}],[0,\"&int;\"],[0,\"&Int;\"],[0,\"&iiint;\"],[0,\"&conint;\"],[0,\"&Conint;\"],[0,\"&Cconint;\"],[0,\"&cwint;\"],[0,\"&ClockwiseContourIntegral;\"],[0,\"&awconint;\"],[0,\"&there4;\"],[0,\"&becaus;\"],[0,\"&ratio;\"],[0,\"&Colon;\"],[0,\"&dotminus;\"],[1,\"&mDDot;\"],[0,\"&homtht;\"],[0,{v:\"&sim;\",n:8402,o:\"&nvsim;\"}],[0,{v:\"&backsim;\",n:817,o:\"&race;\"}],[0,{v:\"&ac;\",n:819,o:\"&acE;\"}],[0,\"&acd;\"],[0,\"&VerticalTilde;\"],[0,\"&NotTilde;\"],[0,{v:\"&eqsim;\",n:824,o:\"&nesim;\"}],[0,\"&sime;\"],[0,\"&NotTildeEqual;\"],[0,\"&cong;\"],[0,\"&simne;\"],[0,\"&ncong;\"],[0,\"&ap;\"],[0,\"&nap;\"],[0,\"&ape;\"],[0,{v:\"&apid;\",n:824,o:\"&napid;\"}],[0,\"&backcong;\"],[0,{v:\"&asympeq;\",n:8402,o:\"&nvap;\"}],[0,{v:\"&bump;\",n:824,o:\"&nbump;\"}],[0,{v:\"&bumpe;\",n:824,o:\"&nbumpe;\"}],[0,{v:\"&doteq;\",n:824,o:\"&nedot;\"}],[0,\"&doteqdot;\"],[0,\"&efDot;\"],[0,\"&erDot;\"],[0,\"&Assign;\"],[0,\"&ecolon;\"],[0,\"&ecir;\"],[0,\"&circeq;\"],[1,\"&wedgeq;\"],[0,\"&veeeq;\"],[1,\"&triangleq;\"],[2,\"&equest;\"],[0,\"&ne;\"],[0,{v:\"&Congruent;\",n:8421,o:\"&bnequiv;\"}],[0,\"&nequiv;\"],[1,{v:\"&le;\",n:8402,o:\"&nvle;\"}],[0,{v:\"&ge;\",n:8402,o:\"&nvge;\"}],[0,{v:\"&lE;\",n:824,o:\"&nlE;\"}],[0,{v:\"&gE;\",n:824,o:\"&ngE;\"}],[0,{v:\"&lnE;\",n:65024,o:\"&lvertneqq;\"}],[0,{v:\"&gnE;\",n:65024,o:\"&gvertneqq;\"}],[0,{v:\"&ll;\",n:new Map(Ra([[824,\"&nLtv;\"],[7577,\"&nLt;\"]]))}],[0,{v:\"&gg;\",n:new Map(Ra([[824,\"&nGtv;\"],[7577,\"&nGt;\"]]))}],[0,\"&between;\"],[0,\"&NotCupCap;\"],[0,\"&nless;\"],[0,\"&ngt;\"],[0,\"&nle;\"],[0,\"&nge;\"],[0,\"&lesssim;\"],[0,\"&GreaterTilde;\"],[0,\"&nlsim;\"],[0,\"&ngsim;\"],[0,\"&LessGreater;\"],[0,\"&gl;\"],[0,\"&NotLessGreater;\"],[0,\"&NotGreaterLess;\"],[0,\"&pr;\"],[0,\"&sc;\"],[0,\"&prcue;\"],[0,\"&sccue;\"],[0,\"&PrecedesTilde;\"],[0,{v:\"&scsim;\",n:824,o:\"&NotSucceedsTilde;\"}],[0,\"&NotPrecedes;\"],[0,\"&NotSucceeds;\"],[0,{v:\"&sub;\",n:8402,o:\"&NotSubset;\"}],[0,{v:\"&sup;\",n:8402,o:\"&NotSuperset;\"}],[0,\"&nsub;\"],[0,\"&nsup;\"],[0,\"&sube;\"],[0,\"&supe;\"],[0,\"&NotSubsetEqual;\"],[0,\"&NotSupersetEqual;\"],[0,{v:\"&subne;\",n:65024,o:\"&varsubsetneq;\"}],[0,{v:\"&supne;\",n:65024,o:\"&varsupsetneq;\"}],[1,\"&cupdot;\"],[0,\"&UnionPlus;\"],[0,{v:\"&sqsub;\",n:824,o:\"&NotSquareSubset;\"}],[0,{v:\"&sqsup;\",n:824,o:\"&NotSquareSuperset;\"}],[0,\"&sqsube;\"],[0,\"&sqsupe;\"],[0,{v:\"&sqcap;\",n:65024,o:\"&sqcaps;\"}],[0,{v:\"&sqcup;\",n:65024,o:\"&sqcups;\"}],[0,\"&CirclePlus;\"],[0,\"&CircleMinus;\"],[0,\"&CircleTimes;\"],[0,\"&osol;\"],[0,\"&CircleDot;\"],[0,\"&circledcirc;\"],[0,\"&circledast;\"],[1,\"&circleddash;\"],[0,\"&boxplus;\"],[0,\"&boxminus;\"],[0,\"&boxtimes;\"],[0,\"&dotsquare;\"],[0,\"&RightTee;\"],[0,\"&dashv;\"],[0,\"&DownTee;\"],[0,\"&bot;\"],[1,\"&models;\"],[0,\"&DoubleRightTee;\"],[0,\"&Vdash;\"],[0,\"&Vvdash;\"],[0,\"&VDash;\"],[0,\"&nvdash;\"],[0,\"&nvDash;\"],[0,\"&nVdash;\"],[0,\"&nVDash;\"],[0,\"&prurel;\"],[1,\"&LeftTriangle;\"],[0,\"&RightTriangle;\"],[0,{v:\"&LeftTriangleEqual;\",n:8402,o:\"&nvltrie;\"}],[0,{v:\"&RightTriangleEqual;\",n:8402,o:\"&nvrtrie;\"}],[0,\"&origof;\"],[0,\"&imof;\"],[0,\"&multimap;\"],[0,\"&hercon;\"],[0,\"&intcal;\"],[0,\"&veebar;\"],[1,\"&barvee;\"],[0,\"&angrtvb;\"],[0,\"&lrtri;\"],[0,\"&bigwedge;\"],[0,\"&bigvee;\"],[0,\"&bigcap;\"],[0,\"&bigcup;\"],[0,\"&diam;\"],[0,\"&sdot;\"],[0,\"&sstarf;\"],[0,\"&divideontimes;\"],[0,\"&bowtie;\"],[0,\"&ltimes;\"],[0,\"&rtimes;\"],[0,\"&leftthreetimes;\"],[0,\"&rightthreetimes;\"],[0,\"&backsimeq;\"],[0,\"&curlyvee;\"],[0,\"&curlywedge;\"],[0,\"&Sub;\"],[0,\"&Sup;\"],[0,\"&Cap;\"],[0,\"&Cup;\"],[0,\"&fork;\"],[0,\"&epar;\"],[0,\"&lessdot;\"],[0,\"&gtdot;\"],[0,{v:\"&Ll;\",n:824,o:\"&nLl;\"}],[0,{v:\"&Gg;\",n:824,o:\"&nGg;\"}],[0,{v:\"&leg;\",n:65024,o:\"&lesg;\"}],[0,{v:\"&gel;\",n:65024,o:\"&gesl;\"}],[2,\"&cuepr;\"],[0,\"&cuesc;\"],[0,\"&NotPrecedesSlantEqual;\"],[0,\"&NotSucceedsSlantEqual;\"],[0,\"&NotSquareSubsetEqual;\"],[0,\"&NotSquareSupersetEqual;\"],[2,\"&lnsim;\"],[0,\"&gnsim;\"],[0,\"&precnsim;\"],[0,\"&scnsim;\"],[0,\"&nltri;\"],[0,\"&NotRightTriangle;\"],[0,\"&nltrie;\"],[0,\"&NotRightTriangleEqual;\"],[0,\"&vellip;\"],[0,\"&ctdot;\"],[0,\"&utdot;\"],[0,\"&dtdot;\"],[0,\"&disin;\"],[0,\"&isinsv;\"],[0,\"&isins;\"],[0,{v:\"&isindot;\",n:824,o:\"&notindot;\"}],[0,\"&notinvc;\"],[0,\"&notinvb;\"],[1,{v:\"&isinE;\",n:824,o:\"&notinE;\"}],[0,\"&nisd;\"],[0,\"&xnis;\"],[0,\"&nis;\"],[0,\"&notnivc;\"],[0,\"&notnivb;\"],[6,\"&barwed;\"],[0,\"&Barwed;\"],[1,\"&lceil;\"],[0,\"&rceil;\"],[0,\"&LeftFloor;\"],[0,\"&rfloor;\"],[0,\"&drcrop;\"],[0,\"&dlcrop;\"],[0,\"&urcrop;\"],[0,\"&ulcrop;\"],[0,\"&bnot;\"],[1,\"&profline;\"],[0,\"&profsurf;\"],[1,\"&telrec;\"],[0,\"&target;\"],[5,\"&ulcorn;\"],[0,\"&urcorn;\"],[0,\"&dlcorn;\"],[0,\"&drcorn;\"],[2,\"&frown;\"],[0,\"&smile;\"],[9,\"&cylcty;\"],[0,\"&profalar;\"],[7,\"&topbot;\"],[6,\"&ovbar;\"],[1,\"&solbar;\"],[60,\"&angzarr;\"],[51,\"&lmoustache;\"],[0,\"&rmoustache;\"],[2,\"&OverBracket;\"],[0,\"&bbrk;\"],[0,\"&bbrktbrk;\"],[37,\"&OverParenthesis;\"],[0,\"&UnderParenthesis;\"],[0,\"&OverBrace;\"],[0,\"&UnderBrace;\"],[2,\"&trpezium;\"],[4,\"&elinters;\"],[59,\"&blank;\"],[164,\"&circledS;\"],[55,\"&boxh;\"],[1,\"&boxv;\"],[9,\"&boxdr;\"],[3,\"&boxdl;\"],[3,\"&boxur;\"],[3,\"&boxul;\"],[3,\"&boxvr;\"],[7,\"&boxvl;\"],[7,\"&boxhd;\"],[7,\"&boxhu;\"],[7,\"&boxvh;\"],[19,\"&boxH;\"],[0,\"&boxV;\"],[0,\"&boxdR;\"],[0,\"&boxDr;\"],[0,\"&boxDR;\"],[0,\"&boxdL;\"],[0,\"&boxDl;\"],[0,\"&boxDL;\"],[0,\"&boxuR;\"],[0,\"&boxUr;\"],[0,\"&boxUR;\"],[0,\"&boxuL;\"],[0,\"&boxUl;\"],[0,\"&boxUL;\"],[0,\"&boxvR;\"],[0,\"&boxVr;\"],[0,\"&boxVR;\"],[0,\"&boxvL;\"],[0,\"&boxVl;\"],[0,\"&boxVL;\"],[0,\"&boxHd;\"],[0,\"&boxhD;\"],[0,\"&boxHD;\"],[0,\"&boxHu;\"],[0,\"&boxhU;\"],[0,\"&boxHU;\"],[0,\"&boxvH;\"],[0,\"&boxVh;\"],[0,\"&boxVH;\"],[19,\"&uhblk;\"],[3,\"&lhblk;\"],[3,\"&block;\"],[8,\"&blk14;\"],[0,\"&blk12;\"],[0,\"&blk34;\"],[13,\"&square;\"],[8,\"&blacksquare;\"],[0,\"&EmptyVerySmallSquare;\"],[1,\"&rect;\"],[0,\"&marker;\"],[2,\"&fltns;\"],[1,\"&bigtriangleup;\"],[0,\"&blacktriangle;\"],[0,\"&triangle;\"],[2,\"&blacktriangleright;\"],[0,\"&rtri;\"],[3,\"&bigtriangledown;\"],[0,\"&blacktriangledown;\"],[0,\"&dtri;\"],[2,\"&blacktriangleleft;\"],[0,\"&ltri;\"],[6,\"&loz;\"],[0,\"&cir;\"],[32,\"&tridot;\"],[2,\"&bigcirc;\"],[8,\"&ultri;\"],[0,\"&urtri;\"],[0,\"&lltri;\"],[0,\"&EmptySmallSquare;\"],[0,\"&FilledSmallSquare;\"],[8,\"&bigstar;\"],[0,\"&star;\"],[7,\"&phone;\"],[49,\"&female;\"],[1,\"&male;\"],[29,\"&spades;\"],[2,\"&clubs;\"],[1,\"&hearts;\"],[0,\"&diamondsuit;\"],[3,\"&sung;\"],[2,\"&flat;\"],[0,\"&natural;\"],[0,\"&sharp;\"],[163,\"&check;\"],[3,\"&cross;\"],[8,\"&malt;\"],[21,\"&sext;\"],[33,\"&VerticalSeparator;\"],[25,\"&lbbrk;\"],[0,\"&rbbrk;\"],[84,\"&bsolhsub;\"],[0,\"&suphsol;\"],[28,\"&LeftDoubleBracket;\"],[0,\"&RightDoubleBracket;\"],[0,\"&lang;\"],[0,\"&rang;\"],[0,\"&Lang;\"],[0,\"&Rang;\"],[0,\"&loang;\"],[0,\"&roang;\"],[7,\"&longleftarrow;\"],[0,\"&longrightarrow;\"],[0,\"&longleftrightarrow;\"],[0,\"&DoubleLongLeftArrow;\"],[0,\"&DoubleLongRightArrow;\"],[0,\"&DoubleLongLeftRightArrow;\"],[1,\"&longmapsto;\"],[2,\"&dzigrarr;\"],[258,\"&nvlArr;\"],[0,\"&nvrArr;\"],[0,\"&nvHarr;\"],[0,\"&Map;\"],[6,\"&lbarr;\"],[0,\"&bkarow;\"],[0,\"&lBarr;\"],[0,\"&dbkarow;\"],[0,\"&drbkarow;\"],[0,\"&DDotrahd;\"],[0,\"&UpArrowBar;\"],[0,\"&DownArrowBar;\"],[2,\"&Rarrtl;\"],[2,\"&latail;\"],[0,\"&ratail;\"],[0,\"&lAtail;\"],[0,\"&rAtail;\"],[0,\"&larrfs;\"],[0,\"&rarrfs;\"],[0,\"&larrbfs;\"],[0,\"&rarrbfs;\"],[2,\"&nwarhk;\"],[0,\"&nearhk;\"],[0,\"&hksearow;\"],[0,\"&hkswarow;\"],[0,\"&nwnear;\"],[0,\"&nesear;\"],[0,\"&seswar;\"],[0,\"&swnwar;\"],[8,{v:\"&rarrc;\",n:824,o:\"&nrarrc;\"}],[1,\"&cudarrr;\"],[0,\"&ldca;\"],[0,\"&rdca;\"],[0,\"&cudarrl;\"],[0,\"&larrpl;\"],[2,\"&curarrm;\"],[0,\"&cularrp;\"],[7,\"&rarrpl;\"],[2,\"&harrcir;\"],[0,\"&Uarrocir;\"],[0,\"&lurdshar;\"],[0,\"&ldrushar;\"],[2,\"&LeftRightVector;\"],[0,\"&RightUpDownVector;\"],[0,\"&DownLeftRightVector;\"],[0,\"&LeftUpDownVector;\"],[0,\"&LeftVectorBar;\"],[0,\"&RightVectorBar;\"],[0,\"&RightUpVectorBar;\"],[0,\"&RightDownVectorBar;\"],[0,\"&DownLeftVectorBar;\"],[0,\"&DownRightVectorBar;\"],[0,\"&LeftUpVectorBar;\"],[0,\"&LeftDownVectorBar;\"],[0,\"&LeftTeeVector;\"],[0,\"&RightTeeVector;\"],[0,\"&RightUpTeeVector;\"],[0,\"&RightDownTeeVector;\"],[0,\"&DownLeftTeeVector;\"],[0,\"&DownRightTeeVector;\"],[0,\"&LeftUpTeeVector;\"],[0,\"&LeftDownTeeVector;\"],[0,\"&lHar;\"],[0,\"&uHar;\"],[0,\"&rHar;\"],[0,\"&dHar;\"],[0,\"&luruhar;\"],[0,\"&ldrdhar;\"],[0,\"&ruluhar;\"],[0,\"&rdldhar;\"],[0,\"&lharul;\"],[0,\"&llhard;\"],[0,\"&rharul;\"],[0,\"&lrhard;\"],[0,\"&udhar;\"],[0,\"&duhar;\"],[0,\"&RoundImplies;\"],[0,\"&erarr;\"],[0,\"&simrarr;\"],[0,\"&larrsim;\"],[0,\"&rarrsim;\"],[0,\"&rarrap;\"],[0,\"&ltlarr;\"],[1,\"&gtrarr;\"],[0,\"&subrarr;\"],[1,\"&suplarr;\"],[0,\"&lfisht;\"],[0,\"&rfisht;\"],[0,\"&ufisht;\"],[0,\"&dfisht;\"],[5,\"&lopar;\"],[0,\"&ropar;\"],[4,\"&lbrke;\"],[0,\"&rbrke;\"],[0,\"&lbrkslu;\"],[0,\"&rbrksld;\"],[0,\"&lbrksld;\"],[0,\"&rbrkslu;\"],[0,\"&langd;\"],[0,\"&rangd;\"],[0,\"&lparlt;\"],[0,\"&rpargt;\"],[0,\"&gtlPar;\"],[0,\"&ltrPar;\"],[3,\"&vzigzag;\"],[1,\"&vangrt;\"],[0,\"&angrtvbd;\"],[6,\"&ange;\"],[0,\"&range;\"],[0,\"&dwangle;\"],[0,\"&uwangle;\"],[0,\"&angmsdaa;\"],[0,\"&angmsdab;\"],[0,\"&angmsdac;\"],[0,\"&angmsdad;\"],[0,\"&angmsdae;\"],[0,\"&angmsdaf;\"],[0,\"&angmsdag;\"],[0,\"&angmsdah;\"],[0,\"&bemptyv;\"],[0,\"&demptyv;\"],[0,\"&cemptyv;\"],[0,\"&raemptyv;\"],[0,\"&laemptyv;\"],[0,\"&ohbar;\"],[0,\"&omid;\"],[0,\"&opar;\"],[1,\"&operp;\"],[1,\"&olcross;\"],[0,\"&odsold;\"],[1,\"&olcir;\"],[0,\"&ofcir;\"],[0,\"&olt;\"],[0,\"&ogt;\"],[0,\"&cirscir;\"],[0,\"&cirE;\"],[0,\"&solb;\"],[0,\"&bsolb;\"],[3,\"&boxbox;\"],[3,\"&trisb;\"],[0,\"&rtriltri;\"],[0,{v:\"&LeftTriangleBar;\",n:824,o:\"&NotLeftTriangleBar;\"}],[0,{v:\"&RightTriangleBar;\",n:824,o:\"&NotRightTriangleBar;\"}],[11,\"&iinfin;\"],[0,\"&infintie;\"],[0,\"&nvinfin;\"],[4,\"&eparsl;\"],[0,\"&smeparsl;\"],[0,\"&eqvparsl;\"],[5,\"&blacklozenge;\"],[8,\"&RuleDelayed;\"],[1,\"&dsol;\"],[9,\"&bigodot;\"],[0,\"&bigoplus;\"],[0,\"&bigotimes;\"],[1,\"&biguplus;\"],[1,\"&bigsqcup;\"],[5,\"&iiiint;\"],[0,\"&fpartint;\"],[2,\"&cirfnint;\"],[0,\"&awint;\"],[0,\"&rppolint;\"],[0,\"&scpolint;\"],[0,\"&npolint;\"],[0,\"&pointint;\"],[0,\"&quatint;\"],[0,\"&intlarhk;\"],[10,\"&pluscir;\"],[0,\"&plusacir;\"],[0,\"&simplus;\"],[0,\"&plusdu;\"],[0,\"&plussim;\"],[0,\"&plustwo;\"],[1,\"&mcomma;\"],[0,\"&minusdu;\"],[2,\"&loplus;\"],[0,\"&roplus;\"],[0,\"&Cross;\"],[0,\"&timesd;\"],[0,\"&timesbar;\"],[1,\"&smashp;\"],[0,\"&lotimes;\"],[0,\"&rotimes;\"],[0,\"&otimesas;\"],[0,\"&Otimes;\"],[0,\"&odiv;\"],[0,\"&triplus;\"],[0,\"&triminus;\"],[0,\"&tritime;\"],[0,\"&intprod;\"],[2,\"&amalg;\"],[0,\"&capdot;\"],[1,\"&ncup;\"],[0,\"&ncap;\"],[0,\"&capand;\"],[0,\"&cupor;\"],[0,\"&cupcap;\"],[0,\"&capcup;\"],[0,\"&cupbrcap;\"],[0,\"&capbrcup;\"],[0,\"&cupcup;\"],[0,\"&capcap;\"],[0,\"&ccups;\"],[0,\"&ccaps;\"],[2,\"&ccupssm;\"],[2,\"&And;\"],[0,\"&Or;\"],[0,\"&andand;\"],[0,\"&oror;\"],[0,\"&orslope;\"],[0,\"&andslope;\"],[1,\"&andv;\"],[0,\"&orv;\"],[0,\"&andd;\"],[0,\"&ord;\"],[1,\"&wedbar;\"],[6,\"&sdote;\"],[3,\"&simdot;\"],[2,{v:\"&congdot;\",n:824,o:\"&ncongdot;\"}],[0,\"&easter;\"],[0,\"&apacir;\"],[0,{v:\"&apE;\",n:824,o:\"&napE;\"}],[0,\"&eplus;\"],[0,\"&pluse;\"],[0,\"&Esim;\"],[0,\"&Colone;\"],[0,\"&Equal;\"],[1,\"&ddotseq;\"],[0,\"&equivDD;\"],[0,\"&ltcir;\"],[0,\"&gtcir;\"],[0,\"&ltquest;\"],[0,\"&gtquest;\"],[0,{v:\"&leqslant;\",n:824,o:\"&nleqslant;\"}],[0,{v:\"&geqslant;\",n:824,o:\"&ngeqslant;\"}],[0,\"&lesdot;\"],[0,\"&gesdot;\"],[0,\"&lesdoto;\"],[0,\"&gesdoto;\"],[0,\"&lesdotor;\"],[0,\"&gesdotol;\"],[0,\"&lap;\"],[0,\"&gap;\"],[0,\"&lne;\"],[0,\"&gne;\"],[0,\"&lnap;\"],[0,\"&gnap;\"],[0,\"&lEg;\"],[0,\"&gEl;\"],[0,\"&lsime;\"],[0,\"&gsime;\"],[0,\"&lsimg;\"],[0,\"&gsiml;\"],[0,\"&lgE;\"],[0,\"&glE;\"],[0,\"&lesges;\"],[0,\"&gesles;\"],[0,\"&els;\"],[0,\"&egs;\"],[0,\"&elsdot;\"],[0,\"&egsdot;\"],[0,\"&el;\"],[0,\"&eg;\"],[2,\"&siml;\"],[0,\"&simg;\"],[0,\"&simlE;\"],[0,\"&simgE;\"],[0,{v:\"&LessLess;\",n:824,o:\"&NotNestedLessLess;\"}],[0,{v:\"&GreaterGreater;\",n:824,o:\"&NotNestedGreaterGreater;\"}],[1,\"&glj;\"],[0,\"&gla;\"],[0,\"&ltcc;\"],[0,\"&gtcc;\"],[0,\"&lescc;\"],[0,\"&gescc;\"],[0,\"&smt;\"],[0,\"&lat;\"],[0,{v:\"&smte;\",n:65024,o:\"&smtes;\"}],[0,{v:\"&late;\",n:65024,o:\"&lates;\"}],[0,\"&bumpE;\"],[0,{v:\"&PrecedesEqual;\",n:824,o:\"&NotPrecedesEqual;\"}],[0,{v:\"&sce;\",n:824,o:\"&NotSucceedsEqual;\"}],[2,\"&prE;\"],[0,\"&scE;\"],[0,\"&precneqq;\"],[0,\"&scnE;\"],[0,\"&prap;\"],[0,\"&scap;\"],[0,\"&precnapprox;\"],[0,\"&scnap;\"],[0,\"&Pr;\"],[0,\"&Sc;\"],[0,\"&subdot;\"],[0,\"&supdot;\"],[0,\"&subplus;\"],[0,\"&supplus;\"],[0,\"&submult;\"],[0,\"&supmult;\"],[0,\"&subedot;\"],[0,\"&supedot;\"],[0,{v:\"&subE;\",n:824,o:\"&nsubE;\"}],[0,{v:\"&supE;\",n:824,o:\"&nsupE;\"}],[0,\"&subsim;\"],[0,\"&supsim;\"],[2,{v:\"&subnE;\",n:65024,o:\"&varsubsetneqq;\"}],[0,{v:\"&supnE;\",n:65024,o:\"&varsupsetneqq;\"}],[2,\"&csub;\"],[0,\"&csup;\"],[0,\"&csube;\"],[0,\"&csupe;\"],[0,\"&subsup;\"],[0,\"&supsub;\"],[0,\"&subsub;\"],[0,\"&supsup;\"],[0,\"&suphsub;\"],[0,\"&supdsub;\"],[0,\"&forkv;\"],[0,\"&topfork;\"],[0,\"&mlcp;\"],[8,\"&Dashv;\"],[1,\"&Vdashl;\"],[0,\"&Barv;\"],[0,\"&vBar;\"],[0,\"&vBarv;\"],[1,\"&Vbar;\"],[0,\"&Not;\"],[0,\"&bNot;\"],[0,\"&rnmid;\"],[0,\"&cirmid;\"],[0,\"&midcir;\"],[0,\"&topcir;\"],[0,\"&nhpar;\"],[0,\"&parsim;\"],[9,{v:\"&parsl;\",n:8421,o:\"&nparsl;\"}],[44343,{n:new Map(Ra([[56476,\"&Ascr;\"],[1,\"&Cscr;\"],[0,\"&Dscr;\"],[2,\"&Gscr;\"],[2,\"&Jscr;\"],[0,\"&Kscr;\"],[2,\"&Nscr;\"],[0,\"&Oscr;\"],[0,\"&Pscr;\"],[0,\"&Qscr;\"],[1,\"&Sscr;\"],[0,\"&Tscr;\"],[0,\"&Uscr;\"],[0,\"&Vscr;\"],[0,\"&Wscr;\"],[0,\"&Xscr;\"],[0,\"&Yscr;\"],[0,\"&Zscr;\"],[0,\"&ascr;\"],[0,\"&bscr;\"],[0,\"&cscr;\"],[0,\"&dscr;\"],[1,\"&fscr;\"],[1,\"&hscr;\"],[0,\"&iscr;\"],[0,\"&jscr;\"],[0,\"&kscr;\"],[0,\"&lscr;\"],[0,\"&mscr;\"],[0,\"&nscr;\"],[1,\"&pscr;\"],[0,\"&qscr;\"],[0,\"&rscr;\"],[0,\"&sscr;\"],[0,\"&tscr;\"],[0,\"&uscr;\"],[0,\"&vscr;\"],[0,\"&wscr;\"],[0,\"&xscr;\"],[0,\"&yscr;\"],[0,\"&zscr;\"],[52,\"&Afr;\"],[0,\"&Bfr;\"],[1,\"&Dfr;\"],[0,\"&Efr;\"],[0,\"&Ffr;\"],[0,\"&Gfr;\"],[2,\"&Jfr;\"],[0,\"&Kfr;\"],[0,\"&Lfr;\"],[0,\"&Mfr;\"],[0,\"&Nfr;\"],[0,\"&Ofr;\"],[0,\"&Pfr;\"],[0,\"&Qfr;\"],[1,\"&Sfr;\"],[0,\"&Tfr;\"],[0,\"&Ufr;\"],[0,\"&Vfr;\"],[0,\"&Wfr;\"],[0,\"&Xfr;\"],[0,\"&Yfr;\"],[1,\"&afr;\"],[0,\"&bfr;\"],[0,\"&cfr;\"],[0,\"&dfr;\"],[0,\"&efr;\"],[0,\"&ffr;\"],[0,\"&gfr;\"],[0,\"&hfr;\"],[0,\"&ifr;\"],[0,\"&jfr;\"],[0,\"&kfr;\"],[0,\"&lfr;\"],[0,\"&mfr;\"],[0,\"&nfr;\"],[0,\"&ofr;\"],[0,\"&pfr;\"],[0,\"&qfr;\"],[0,\"&rfr;\"],[0,\"&sfr;\"],[0,\"&tfr;\"],[0,\"&ufr;\"],[0,\"&vfr;\"],[0,\"&wfr;\"],[0,\"&xfr;\"],[0,\"&yfr;\"],[0,\"&zfr;\"],[0,\"&Aopf;\"],[0,\"&Bopf;\"],[1,\"&Dopf;\"],[0,\"&Eopf;\"],[0,\"&Fopf;\"],[0,\"&Gopf;\"],[1,\"&Iopf;\"],[0,\"&Jopf;\"],[0,\"&Kopf;\"],[0,\"&Lopf;\"],[0,\"&Mopf;\"],[1,\"&Oopf;\"],[3,\"&Sopf;\"],[0,\"&Topf;\"],[0,\"&Uopf;\"],[0,\"&Vopf;\"],[0,\"&Wopf;\"],[0,\"&Xopf;\"],[0,\"&Yopf;\"],[1,\"&aopf;\"],[0,\"&bopf;\"],[0,\"&copf;\"],[0,\"&dopf;\"],[0,\"&eopf;\"],[0,\"&fopf;\"],[0,\"&gopf;\"],[0,\"&hopf;\"],[0,\"&iopf;\"],[0,\"&jopf;\"],[0,\"&kopf;\"],[0,\"&lopf;\"],[0,\"&mopf;\"],[0,\"&nopf;\"],[0,\"&oopf;\"],[0,\"&popf;\"],[0,\"&qopf;\"],[0,\"&ropf;\"],[0,\"&sopf;\"],[0,\"&topf;\"],[0,\"&uopf;\"],[0,\"&vopf;\"],[0,\"&wopf;\"],[0,\"&xopf;\"],[0,\"&yopf;\"],[0,\"&zopf;\"]]))}],[8906,\"&fflig;\"],[0,\"&filig;\"],[0,\"&fllig;\"],[0,\"&ffilig;\"],[0,\"&ffllig;\"]]));var pS=new Map([[34,\"&quot;\"],[38,\"&amp;\"],[39,\"&apos;\"],[60,\"&lt;\"],[62,\"&gt;\"]]),hS=String.prototype.codePointAt!=null?(e,t)=>e.codePointAt(t):(e,t)=>(e.charCodeAt(t)&64512)===55296?(e.charCodeAt(t)-55296)*1024+e.charCodeAt(t+1)-56320+65536:e.charCodeAt(t);function Ap(e,t){return function(r){let o,i=0,s=\"\";for(;o=e.exec(r);)i!==o.index&&(s+=r.substring(i,o.index)),s+=t.get(o[0].charCodeAt(0)),i=o.index+1;return s+r.substring(i)}}var lv=Ap(/[&<>'\"]/g,pS),dv=Ap(/[\"&\\u00A0]/g,new Map([[34,\"&quot;\"],[38,\"&amp;\"],[160,\"&nbsp;\"]])),fv=Ap(/[&<>\\u00A0]/g,new Map([[38,\"&amp;\"],[60,\"&lt;\"],[62,\"&gt;\"],[160,\"&nbsp;\"]]));function yS(e){return Object.prototype.toString.call(e)}function Fa(e){return yS(e)===\"[object String]\"}var bS=Object.prototype.hasOwnProperty;function vS(e,t){return bS.call(e,t)}function po(e){return Array.prototype.slice.call(arguments,1).forEach(function(n){if(n){if(typeof n!=\"object\")throw new TypeError(n+\"must be object\");Object.keys(n).forEach(function(r){e[r]=n[r]})}}),e}function kp(e,t,n){return[].concat(e.slice(0,t),n,e.slice(t+1))}function Oa(e){return!(e>=55296&&e<=57343||e>=64976&&e<=65007||(e&65535)===65535||(e&65535)===65534||e>=0&&e<=8||e===11||e>=14&&e<=31||e>=127&&e<=159||e>1114111)}function Ri(e){if(e>65535){e-=65536;let t=55296+(e>>10),n=56320+(e&1023);return String.fromCharCode(t,n)}return String.fromCharCode(e)}var gv=/\\\\([!\"#$%&'()*+,\\-./:;<=>?@[\\\\\\]^_`{|}~])/g,DS=/&([a-z#][a-z0-9]{1,31});/gi,ES=new RegExp(gv.source+\"|\"+DS.source,\"gi\"),CS=/^#((?:x[a-f0-9]{1,8}|[0-9]{1,8}))$/i;function _S(e,t){if(t.charCodeAt(0)===35&&CS.test(t)){let r=t[1].toLowerCase()===\"x\"?parseInt(t.slice(2),16):parseInt(t.slice(1),10);return Oa(r)?Ri(r):e}let n=Cn(e);return n!==e?n:e}function wS(e){return e.indexOf(\"\\\\\")<0?e:e.replace(gv,\"$1\")}function Gt(e){return e.indexOf(\"\\\\\")<0&&e.indexOf(\"&\")<0?e:e.replace(ES,function(t,n,r){return n||_S(t,r)})}var xS=/[&<>\"]/,IS=/[&<>\"]/g,TS={\"&\":\"&amp;\",\"<\":\"&lt;\",\">\":\"&gt;\",'\"':\"&quot;\"};function SS(e){return TS[e]}function Wt(e){return xS.test(e)?e.replace(IS,SS):e}var MS=/[.?*+^$[\\]\\\\(){}|-]/g;function AS(e){return e.replace(MS,\"\\\\$&\")}function H(e){switch(e){case 9:case 32:return!0}return!1}function ur(e){if(e>=8192&&e<=8202)return!0;switch(e){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}function ar(e){return fo.test(e)||Aa.test(e)}function cr(e){switch(e){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 lr(e){return e=e.trim().replace(/\\s+/g,\" \"),\"\\u1E9E\".toLowerCase()===\"\\u1E7E\"&&(e=e.replace(/ẞ/g,\"\\xDF\")),e.toLowerCase().toUpperCase()}var NS={mdurl:Ta,ucmicro:xp};var Lp={};pr(Lp,{parseLinkDestination:()=>Op,parseLinkLabel:()=>Fp,parseLinkTitle:()=>Pp});function Fp(e,t,n){let r,o,i,s,u=e.posMax,a=e.pos;for(e.pos=t+1,r=1;e.pos<u;){if(i=e.src.charCodeAt(e.pos),i===93&&(r--,r===0)){o=!0;break}if(s=e.pos,e.md.inline.skipToken(e),i===91){if(s===e.pos-1)r++;else if(n)return e.pos=a,-1}}let c=-1;return o&&(c=e.pos),e.pos=a,c}function Op(e,t,n){let r,o=t,i={ok:!1,pos:0,str:\"\"};if(e.charCodeAt(o)===60){for(o++;o<n;){if(r=e.charCodeAt(o),r===10||r===60)return i;if(r===62)return i.pos=o+1,i.str=Gt(e.slice(t+1,o)),i.ok=!0,i;if(r===92&&o+1<n){o+=2;continue}o++}return i}let s=0;for(;o<n&&(r=e.charCodeAt(o),!(r===32||r<32||r===127));){if(r===92&&o+1<n){if(e.charCodeAt(o+1)===32)break;o+=2;continue}if(r===40&&(s++,s>32))return i;if(r===41){if(s===0)break;s--}o++}return t===o||s!==0||(i.str=Gt(e.slice(t,o)),i.pos=o,i.ok=!0),i}function Pp(e,t,n,r){let o,i=t,s={ok:!1,can_continue:!1,pos:0,str:\"\",marker:0};if(r)s.str=r.str,s.marker=r.marker;else{if(i>=n)return s;let u=e.charCodeAt(i);if(u!==34&&u!==39&&u!==40)return s;t++,i++,u===40&&(u=41),s.marker=u}for(;i<n;){if(o=e.charCodeAt(i),o===s.marker)return s.pos=i+1,s.str+=Gt(e.slice(t,i)),s.ok=!0,s;if(o===40&&s.marker===41)return s;o===92&&i+1<n&&i++,i++}return s.can_continue=!0,s.str+=Gt(e.slice(t,i)),s}var wt={};wt.code_inline=function(e,t,n,r,o){let i=e[t];return\"<code\"+o.renderAttrs(i)+\">\"+Wt(i.content)+\"</code>\"};wt.code_block=function(e,t,n,r,o){let i=e[t];return\"<pre\"+o.renderAttrs(i)+\"><code>\"+Wt(e[t].content)+`</code></pre>\n`};wt.fence=function(e,t,n,r,o){let i=e[t],s=i.info?Gt(i.info).trim():\"\",u=\"\",a=\"\";if(s){let l=s.split(/(\\s+)/g);u=l[0],a=l.slice(2).join(\"\")}let c;if(n.highlight?c=n.highlight(i.content,u,a)||Wt(i.content):c=Wt(i.content),c.indexOf(\"<pre\")===0)return c+`\n`;if(s){let l=i.attrIndex(\"class\"),d=i.attrs?i.attrs.slice():[];l<0?d.push([\"class\",n.langPrefix+u]):(d[l]=d[l].slice(),d[l][1]+=\" \"+n.langPrefix+u);let h={attrs:d};return`<pre><code${o.renderAttrs(h)}>${c}</code></pre>\n`}return`<pre><code${o.renderAttrs(i)}>${c}</code></pre>\n`};wt.image=function(e,t,n,r,o){let i=e[t];return i.attrs[i.attrIndex(\"alt\")][1]=o.renderInlineAsText(i.children,n,r),o.renderToken(e,t,n)};wt.hardbreak=function(e,t,n){return n.xhtmlOut?`<br />\n`:`<br>\n`};wt.softbreak=function(e,t,n){return n.breaks?n.xhtmlOut?`<br />\n`:`<br>\n`:`\n`};wt.text=function(e,t){return Wt(e[t].content)};wt.html_block=function(e,t){return e[t].content};wt.html_inline=function(e,t){return e[t].content};function ho(){this.rules=po({},wt)}ho.prototype.renderAttrs=function(t){let n,r,o;if(!t.attrs)return\"\";for(o=\"\",n=0,r=t.attrs.length;n<r;n++)o+=\" \"+Wt(t.attrs[n][0])+'=\"'+Wt(t.attrs[n][1])+'\"';return o};ho.prototype.renderToken=function(t,n,r){let o=t[n],i=\"\";if(o.hidden)return\"\";o.block&&o.nesting!==-1&&n&&t[n-1].hidden&&(i+=`\n`),i+=(o.nesting===-1?\"</\":\"<\")+o.tag,i+=this.renderAttrs(o),o.nesting===0&&r.xhtmlOut&&(i+=\" /\");let s=!1;if(o.block&&(s=!0,o.nesting===1&&n+1<t.length)){let u=t[n+1];(u.type===\"inline\"||u.hidden||u.nesting===-1&&u.tag===o.tag)&&(s=!1)}return i+=s?`>\n`:\">\",i};ho.prototype.renderInline=function(e,t,n){let r=\"\",o=this.rules;for(let i=0,s=e.length;i<s;i++){let u=e[i].type;typeof o[u]<\"u\"?r+=o[u](e,i,t,n,this):r+=this.renderToken(e,i,t)}return r};ho.prototype.renderInlineAsText=function(e,t,n){let r=\"\";for(let o=0,i=e.length;o<i;o++)switch(e[o].type){case\"text\":r+=e[o].content;break;case\"image\":r+=this.renderInlineAsText(e[o].children,t,n);break;case\"html_inline\":case\"html_block\":r+=e[o].content;break;case\"softbreak\":case\"hardbreak\":r+=`\n`;break;default:}return r};ho.prototype.render=function(e,t,n){let r=\"\",o=this.rules;for(let i=0,s=e.length;i<s;i++){let u=e[i].type;u===\"inline\"?r+=this.renderInline(e[i].children,t,n):typeof o[u]<\"u\"?r+=o[u](e,i,t,n,this):r+=this.renderToken(e,i,t,n)}return r};var mv=ho;function at(){this.__rules__=[],this.__cache__=null}at.prototype.__find__=function(e){for(let t=0;t<this.__rules__.length;t++)if(this.__rules__[t].name===e)return t;return-1};at.prototype.__compile__=function(){let e=this,t=[\"\"];e.__rules__.forEach(function(n){n.enabled&&n.alt.forEach(function(r){t.indexOf(r)<0&&t.push(r)})}),e.__cache__={},t.forEach(function(n){e.__cache__[n]=[],e.__rules__.forEach(function(r){r.enabled&&(n&&r.alt.indexOf(n)<0||e.__cache__[n].push(r.fn))})})};at.prototype.at=function(e,t,n){let r=this.__find__(e),o=n||{};if(r===-1)throw new Error(\"Parser rule not found: \"+e);this.__rules__[r].fn=t,this.__rules__[r].alt=o.alt||[],this.__cache__=null};at.prototype.before=function(e,t,n,r){let o=this.__find__(e),i=r||{};if(o===-1)throw new Error(\"Parser rule not found: \"+e);this.__rules__.splice(o,0,{name:t,enabled:!0,fn:n,alt:i.alt||[]}),this.__cache__=null};at.prototype.after=function(e,t,n,r){let o=this.__find__(e),i=r||{};if(o===-1)throw new Error(\"Parser rule not found: \"+e);this.__rules__.splice(o+1,0,{name:t,enabled:!0,fn:n,alt:i.alt||[]}),this.__cache__=null};at.prototype.push=function(e,t,n){let r=n||{};this.__rules__.push({name:e,enabled:!0,fn:t,alt:r.alt||[]}),this.__cache__=null};at.prototype.enable=function(e,t){Array.isArray(e)||(e=[e]);let n=[];return e.forEach(function(r){let o=this.__find__(r);if(o<0){if(t)return;throw new Error(\"Rules manager: invalid rule name \"+r)}this.__rules__[o].enabled=!0,n.push(r)},this),this.__cache__=null,n};at.prototype.enableOnly=function(e,t){Array.isArray(e)||(e=[e]),this.__rules__.forEach(function(n){n.enabled=!1}),this.enable(e,t)};at.prototype.disable=function(e,t){Array.isArray(e)||(e=[e]);let n=[];return e.forEach(function(r){let o=this.__find__(r);if(o<0){if(t)return;throw new Error(\"Rules manager: invalid rule name \"+r)}this.__rules__[o].enabled=!1,n.push(r)},this),this.__cache__=null,n};at.prototype.getRules=function(e){return this.__cache__===null&&this.__compile__(),this.__cache__[e]||[]};var dr=at;function go(e,t,n){this.type=e,this.tag=t,this.attrs=null,this.map=null,this.nesting=n,this.level=0,this.children=null,this.content=\"\",this.markup=\"\",this.info=\"\",this.meta=null,this.block=!1,this.hidden=!1}go.prototype.attrIndex=function(t){if(!this.attrs)return-1;let n=this.attrs;for(let r=0,o=n.length;r<o;r++)if(n[r][0]===t)return r;return-1};go.prototype.attrPush=function(t){this.attrs?this.attrs.push(t):this.attrs=[t]};go.prototype.attrSet=function(t,n){let r=this.attrIndex(t),o=[t,n];r<0?this.attrPush(o):this.attrs[r]=o};go.prototype.attrGet=function(t){let n=this.attrIndex(t),r=null;return n>=0&&(r=this.attrs[n][1]),r};go.prototype.attrJoin=function(t,n){let r=this.attrIndex(t);r<0?this.attrPush([t,n]):this.attrs[r][1]=this.attrs[r][1]+\" \"+n};var Zt=go;function yv(e,t,n){this.src=e,this.env=n,this.tokens=[],this.inlineMode=!1,this.md=t}yv.prototype.Token=Zt;var bv=yv;var kS=/\\r\\n?|\\n/g,RS=/\\0/g;function jp(e){let t;t=e.src.replace(kS,`\n`),t=t.replace(RS,\"\\uFFFD\"),e.src=t}function Bp(e){let t;e.inlineMode?(t=new e.Token(\"inline\",\"\",0),t.content=e.src,t.map=[0,1],t.children=[],e.tokens.push(t)):e.md.block.parse(e.src,e.md,e.env,e.tokens)}function Vp(e){let t=e.tokens;for(let n=0,r=t.length;n<r;n++){let o=t[n];o.type===\"inline\"&&e.md.inline.parse(o.content,e.md,e.env,o.children)}}function FS(e){return/^<a[>\\s]/i.test(e)}function OS(e){return/^<\\/a\\s*>/i.test(e)}function Hp(e){let t=e.tokens;if(e.md.options.linkify)for(let n=0,r=t.length;n<r;n++){if(t[n].type!==\"inline\"||!e.md.linkify.pretest(t[n].content))continue;let o=t[n].children,i=0;for(let s=o.length-1;s>=0;s--){let u=o[s];if(u.type===\"link_close\"){for(s--;o[s].level!==u.level&&o[s].type!==\"link_open\";)s--;continue}if(u.type===\"html_inline\"&&(FS(u.content)&&i>0&&i--,OS(u.content)&&i++),!(i>0)&&u.type===\"text\"&&e.md.linkify.test(u.content)){let a=u.content,c=e.md.linkify.match(a),l=[],d=u.level,h=0;c.length>0&&c[0].index===0&&s>0&&o[s-1].type===\"text_special\"&&(c=c.slice(1));for(let f=0;f<c.length;f++){let p=c[f].url,m=e.md.normalizeLink(p);if(!e.md.validateLink(m))continue;let g=c[f].text;c[f].schema?c[f].schema===\"mailto:\"&&!/^mailto:/i.test(g)?g=e.md.normalizeLinkText(\"mailto:\"+g).replace(/^mailto:/,\"\"):g=e.md.normalizeLinkText(g):g=e.md.normalizeLinkText(\"http://\"+g).replace(/^http:\\/\\//,\"\");let y=c[f].index;if(y>h){let F=new e.Token(\"text\",\"\",0);F.content=a.slice(h,y),F.level=d,l.push(F)}let v=new e.Token(\"link_open\",\"a\",1);v.attrs=[[\"href\",m]],v.level=d++,v.markup=\"linkify\",v.info=\"auto\",l.push(v);let w=new e.Token(\"text\",\"\",0);w.content=g,w.level=d,l.push(w);let D=new e.Token(\"link_close\",\"a\",-1);D.level=--d,D.markup=\"linkify\",D.info=\"auto\",l.push(D),h=c[f].lastIndex}if(h<a.length){let f=new e.Token(\"text\",\"\",0);f.content=a.slice(h),f.level=d,l.push(f)}t[n].children=o=kp(o,s,l)}}}}var vv=/\\+-|\\.\\.|\\?\\?\\?\\?|!!!!|,,|--/,PS=/\\((c|tm|r)\\)/i,LS=/\\((c|tm|r)\\)/ig,jS={c:\"\\xA9\",r:\"\\xAE\",tm:\"\\u2122\"};function BS(e,t){return jS[t.toLowerCase()]}function VS(e){let t=0;for(let n=e.length-1;n>=0;n--){let r=e[n];r.type===\"text\"&&!t&&(r.content=r.content.replace(LS,BS)),r.type===\"link_open\"&&r.info===\"auto\"&&t--,r.type===\"link_close\"&&r.info===\"auto\"&&t++}}function HS(e){let t=0;for(let n=e.length-1;n>=0;n--){let r=e[n];r.type===\"text\"&&!t&&vv.test(r.content)&&(r.content=r.content.replace(/\\+-/g,\"\\xB1\").replace(/\\.{2,}/g,\"\\u2026\").replace(/([?!])…/g,\"$1..\").replace(/([?!]){4,}/g,\"$1$1$1\").replace(/,{2,}/g,\",\").replace(/(^|[^-])---(?=[^-]|$)/mg,\"$1\\u2014\").replace(/(^|\\s)--(?=\\s|$)/mg,\"$1\\u2013\").replace(/(^|[^-\\s])--(?=[^-\\s]|$)/mg,\"$1\\u2013\")),r.type===\"link_open\"&&r.info===\"auto\"&&t--,r.type===\"link_close\"&&r.info===\"auto\"&&t++}}function $p(e){let t;if(e.md.options.typographer)for(t=e.tokens.length-1;t>=0;t--)e.tokens[t].type===\"inline\"&&(PS.test(e.tokens[t].content)&&VS(e.tokens[t].children),vv.test(e.tokens[t].content)&&HS(e.tokens[t].children))}var $S=/['\"]/,Dv=/['\"]/g,Ev=\"\\u2019\";function Pa(e,t,n){return e.slice(0,t)+n+e.slice(t+1)}function US(e,t){let n,r=[];for(let o=0;o<e.length;o++){let i=e[o],s=e[o].level;for(n=r.length-1;n>=0&&!(r[n].level<=s);n--);if(r.length=n+1,i.type!==\"text\")continue;let u=i.content,a=0,c=u.length;e:for(;a<c;){Dv.lastIndex=a;let l=Dv.exec(u);if(!l)break;let d=!0,h=!0;a=l.index+1;let f=l[0]===\"'\",p=32;if(l.index-1>=0)p=u.charCodeAt(l.index-1);else for(n=o-1;n>=0&&!(e[n].type===\"softbreak\"||e[n].type===\"hardbreak\");n--)if(e[n].content){p=e[n].content.charCodeAt(e[n].content.length-1);break}let m=32;if(a<c)m=u.charCodeAt(a);else for(n=o+1;n<e.length&&!(e[n].type===\"softbreak\"||e[n].type===\"hardbreak\");n++)if(e[n].content){m=e[n].content.charCodeAt(0);break}let g=cr(p)||ar(String.fromCharCode(p)),y=cr(m)||ar(String.fromCharCode(m)),v=ur(p),w=ur(m);if(w?d=!1:y&&(v||g||(d=!1)),v?h=!1:g&&(w||y||(h=!1)),m===34&&l[0]==='\"'&&p>=48&&p<=57&&(h=d=!1),d&&h&&(d=g,h=y),!d&&!h){f&&(i.content=Pa(i.content,l.index,Ev));continue}if(h)for(n=r.length-1;n>=0;n--){let D=r[n];if(r[n].level<s)break;if(D.single===f&&r[n].level===s){D=r[n];let F,E;f?(F=t.md.options.quotes[2],E=t.md.options.quotes[3]):(F=t.md.options.quotes[0],E=t.md.options.quotes[1]),i.content=Pa(i.content,l.index,E),e[D.token].content=Pa(e[D.token].content,D.pos,F),a+=E.length-1,D.token===o&&(a+=F.length-1),u=i.content,c=u.length,r.length=n;continue e}}d?r.push({token:o,pos:l.index,single:f,level:s}):h&&f&&(i.content=Pa(i.content,l.index,Ev))}}}function Up(e){if(e.md.options.typographer)for(let t=e.tokens.length-1;t>=0;t--)e.tokens[t].type!==\"inline\"||!$S.test(e.tokens[t].content)||US(e.tokens[t].children,e)}function zp(e){let t,n,r=e.tokens,o=r.length;for(let i=0;i<o;i++){if(r[i].type!==\"inline\")continue;let s=r[i].children,u=s.length;for(t=0;t<u;t++)s[t].type===\"text_special\"&&(s[t].type=\"text\");for(t=n=0;t<u;t++)s[t].type===\"text\"&&t+1<u&&s[t+1].type===\"text\"?s[t+1].content=s[t].content+s[t+1].content:(t!==n&&(s[n]=s[t]),n++);t!==n&&(s.length=n)}}var qp=[[\"normalize\",jp],[\"block\",Bp],[\"inline\",Vp],[\"linkify\",Hp],[\"replacements\",$p],[\"smartquotes\",Up],[\"text_join\",zp]];function Gp(){this.ruler=new dr;for(let e=0;e<qp.length;e++)this.ruler.push(qp[e][0],qp[e][1])}Gp.prototype.process=function(e){let t=this.ruler.getRules(\"\");for(let n=0,r=t.length;n<r;n++)t[n](e)};Gp.prototype.State=bv;var Cv=Gp;function xt(e,t,n,r){this.src=e,this.md=t,this.env=n,this.tokens=r,this.bMarks=[],this.eMarks=[],this.tShift=[],this.sCount=[],this.bsCount=[],this.blkIndent=0,this.line=0,this.lineMax=0,this.tight=!1,this.ddIndent=-1,this.listIndent=-1,this.parentType=\"root\",this.level=0;let o=this.src;for(let i=0,s=0,u=0,a=0,c=o.length,l=!1;s<c;s++){let d=o.charCodeAt(s);if(!l)if(H(d)){u++,d===9?a+=4-a%4:a++;continue}else l=!0;(d===10||s===c-1)&&(d!==10&&s++,this.bMarks.push(i),this.eMarks.push(s),this.tShift.push(u),this.sCount.push(a),this.bsCount.push(0),l=!1,u=0,a=0,i=s+1)}this.bMarks.push(o.length),this.eMarks.push(o.length),this.tShift.push(0),this.sCount.push(0),this.bsCount.push(0),this.lineMax=this.bMarks.length-1}xt.prototype.push=function(e,t,n){let r=new Zt(e,t,n);return r.block=!0,n<0&&this.level--,r.level=this.level,n>0&&this.level++,this.tokens.push(r),r};xt.prototype.isEmpty=function(t){return this.bMarks[t]+this.tShift[t]>=this.eMarks[t]};xt.prototype.skipEmptyLines=function(t){for(let n=this.lineMax;t<n&&!(this.bMarks[t]+this.tShift[t]<this.eMarks[t]);t++);return t};xt.prototype.skipSpaces=function(t){for(let n=this.src.length;t<n;t++){let r=this.src.charCodeAt(t);if(!H(r))break}return t};xt.prototype.skipSpacesBack=function(t,n){if(t<=n)return t;for(;t>n;)if(!H(this.src.charCodeAt(--t)))return t+1;return t};xt.prototype.skipChars=function(t,n){for(let r=this.src.length;t<r&&this.src.charCodeAt(t)===n;t++);return t};xt.prototype.skipCharsBack=function(t,n,r){if(t<=r)return t;for(;t>r;)if(n!==this.src.charCodeAt(--t))return t+1;return t};xt.prototype.getLines=function(t,n,r,o){if(t>=n)return\"\";let i=new Array(n-t);for(let s=0,u=t;u<n;u++,s++){let a=0,c=this.bMarks[u],l=c,d;for(u+1<n||o?d=this.eMarks[u]+1:d=this.eMarks[u];l<d&&a<r;){let h=this.src.charCodeAt(l);if(H(h))h===9?a+=4-(a+this.bsCount[u])%4:a++;else if(l-c<this.tShift[u])a++;else break;l++}a>r?i[s]=new Array(a-r+1).join(\" \")+this.src.slice(l,d):i[s]=this.src.slice(l,d)}return i.join(\"\")};xt.prototype.Token=Zt;var _v=xt;var zS=65536;function Wp(e,t){let n=e.bMarks[t]+e.tShift[t],r=e.eMarks[t];return e.src.slice(n,r)}function wv(e){let t=[],n=e.length,r=0,o=e.charCodeAt(r),i=!1,s=0,u=\"\";for(;r<n;)o===124&&(i?(u+=e.substring(s,r-1),s=r):(t.push(u+e.substring(s,r)),u=\"\",s=r+1)),i=o===92,r++,o=e.charCodeAt(r);return t.push(u+e.substring(s)),t}function Zp(e,t,n,r){if(t+2>n)return!1;let o=t+1;if(e.sCount[o]<e.blkIndent||e.sCount[o]-e.blkIndent>=4)return!1;let i=e.bMarks[o]+e.tShift[o];if(i>=e.eMarks[o])return!1;let s=e.src.charCodeAt(i++);if(s!==124&&s!==45&&s!==58||i>=e.eMarks[o])return!1;let u=e.src.charCodeAt(i++);if(u!==124&&u!==45&&u!==58&&!H(u)||s===45&&H(u))return!1;for(;i<e.eMarks[o];){let D=e.src.charCodeAt(i);if(D!==124&&D!==45&&D!==58&&!H(D))return!1;i++}let a=Wp(e,t+1),c=a.split(\"|\"),l=[];for(let D=0;D<c.length;D++){let F=c[D].trim();if(!F){if(D===0||D===c.length-1)continue;return!1}if(!/^:?-+:?$/.test(F))return!1;F.charCodeAt(F.length-1)===58?l.push(F.charCodeAt(0)===58?\"center\":\"right\"):F.charCodeAt(0)===58?l.push(\"left\"):l.push(\"\")}if(a=Wp(e,t).trim(),a.indexOf(\"|\")===-1||e.sCount[t]-e.blkIndent>=4)return!1;c=wv(a),c.length&&c[0]===\"\"&&c.shift(),c.length&&c[c.length-1]===\"\"&&c.pop();let d=c.length;if(d===0||d!==l.length)return!1;if(r)return!0;let h=e.parentType;e.parentType=\"table\";let f=e.md.block.ruler.getRules(\"blockquote\"),p=e.push(\"table_open\",\"table\",1),m=[t,0];p.map=m;let g=e.push(\"thead_open\",\"thead\",1);g.map=[t,t+1];let y=e.push(\"tr_open\",\"tr\",1);y.map=[t,t+1];for(let D=0;D<c.length;D++){let F=e.push(\"th_open\",\"th\",1);l[D]&&(F.attrs=[[\"style\",\"text-align:\"+l[D]]]);let E=e.push(\"inline\",\"\",0);E.content=c[D].trim(),E.children=[],e.push(\"th_close\",\"th\",-1)}e.push(\"tr_close\",\"tr\",-1),e.push(\"thead_close\",\"thead\",-1);let v,w=0;for(o=t+2;o<n&&!(e.sCount[o]<e.blkIndent);o++){let D=!1;for(let E=0,N=f.length;E<N;E++)if(f[E](e,o,n,!0)){D=!0;break}if(D||(a=Wp(e,o).trim(),!a)||e.sCount[o]-e.blkIndent>=4||(c=wv(a),c.length&&c[0]===\"\"&&c.shift(),c.length&&c[c.length-1]===\"\"&&c.pop(),w+=d-c.length,w>zS))break;if(o===t+2){let E=e.push(\"tbody_open\",\"tbody\",1);E.map=v=[t+2,0]}let F=e.push(\"tr_open\",\"tr\",1);F.map=[o,o+1];for(let E=0;E<d;E++){let N=e.push(\"td_open\",\"td\",1);l[E]&&(N.attrs=[[\"style\",\"text-align:\"+l[E]]]);let O=e.push(\"inline\",\"\",0);O.content=c[E]?c[E].trim():\"\",O.children=[],e.push(\"td_close\",\"td\",-1)}e.push(\"tr_close\",\"tr\",-1)}return v&&(e.push(\"tbody_close\",\"tbody\",-1),v[1]=o),e.push(\"table_close\",\"table\",-1),m[1]=o,e.parentType=h,e.line=o,!0}function Yp(e,t,n){if(e.sCount[t]-e.blkIndent<4)return!1;let r=t+1,o=r;for(;r<n;){if(e.isEmpty(r)){r++;continue}if(e.sCount[r]-e.blkIndent>=4){r++,o=r;continue}break}e.line=o;let i=e.push(\"code_block\",\"code\",0);return i.content=e.getLines(t,o,4+e.blkIndent,!1)+`\n`,i.map=[t,e.line],!0}function Qp(e,t,n,r){let o=e.bMarks[t]+e.tShift[t],i=e.eMarks[t];if(e.sCount[t]-e.blkIndent>=4||o+3>i)return!1;let s=e.src.charCodeAt(o);if(s!==126&&s!==96)return!1;let u=o;o=e.skipChars(o,s);let a=o-u;if(a<3)return!1;let c=e.src.slice(u,o),l=e.src.slice(o,i);if(s===96&&l.indexOf(String.fromCharCode(s))>=0)return!1;if(r)return!0;let d=t,h=!1;for(;d++,!(d>=n||(o=u=e.bMarks[d]+e.tShift[d],i=e.eMarks[d],o<i&&e.sCount[d]<e.blkIndent));)if(e.src.charCodeAt(o)===s&&!(e.sCount[d]-e.blkIndent>=4)&&(o=e.skipChars(o,s),!(o-u<a)&&(o=e.skipSpaces(o),!(o<i)))){h=!0;break}a=e.sCount[t],e.line=d+(h?1:0);let f=e.push(\"fence\",\"code\",0);return f.info=l,f.content=e.getLines(t+1,d,a,!0),f.markup=c,f.map=[t,e.line],!0}function Kp(e,t,n,r){let o=e.bMarks[t]+e.tShift[t],i=e.eMarks[t],s=e.lineMax;if(e.sCount[t]-e.blkIndent>=4||e.src.charCodeAt(o)!==62)return!1;if(r)return!0;let u=[],a=[],c=[],l=[],d=e.md.block.ruler.getRules(\"blockquote\"),h=e.parentType;e.parentType=\"blockquote\";let f=!1,p;for(p=t;p<n;p++){let w=e.sCount[p]<e.blkIndent;if(o=e.bMarks[p]+e.tShift[p],i=e.eMarks[p],o>=i)break;if(e.src.charCodeAt(o++)===62&&!w){let F=e.sCount[p]+1,E,N;e.src.charCodeAt(o)===32?(o++,F++,N=!1,E=!0):e.src.charCodeAt(o)===9?(E=!0,(e.bsCount[p]+F)%4===3?(o++,F++,N=!1):N=!0):E=!1;let O=F;for(u.push(e.bMarks[p]),e.bMarks[p]=o;o<i;){let J=e.src.charCodeAt(o);if(H(J))J===9?O+=4-(O+e.bsCount[p]+(N?1:0))%4:O++;else break;o++}f=o>=i,a.push(e.bsCount[p]),e.bsCount[p]=e.sCount[p]+1+(E?1:0),c.push(e.sCount[p]),e.sCount[p]=O-F,l.push(e.tShift[p]),e.tShift[p]=o-e.bMarks[p];continue}if(f)break;let D=!1;for(let F=0,E=d.length;F<E;F++)if(d[F](e,p,n,!0)){D=!0;break}if(D){e.lineMax=p,e.blkIndent!==0&&(u.push(e.bMarks[p]),a.push(e.bsCount[p]),l.push(e.tShift[p]),c.push(e.sCount[p]),e.sCount[p]-=e.blkIndent);break}u.push(e.bMarks[p]),a.push(e.bsCount[p]),l.push(e.tShift[p]),c.push(e.sCount[p]),e.sCount[p]=-1}let m=e.blkIndent;e.blkIndent=0;let g=e.push(\"blockquote_open\",\"blockquote\",1);g.markup=\">\";let y=[t,0];g.map=y,e.md.block.tokenize(e,t,p);let v=e.push(\"blockquote_close\",\"blockquote\",-1);v.markup=\">\",e.lineMax=s,e.parentType=h,y[1]=e.line;for(let w=0;w<l.length;w++)e.bMarks[w+t]=u[w],e.tShift[w+t]=l[w],e.sCount[w+t]=c[w],e.bsCount[w+t]=a[w];return e.blkIndent=m,!0}function Jp(e,t,n,r){let o=e.eMarks[t];if(e.sCount[t]-e.blkIndent>=4)return!1;let i=e.bMarks[t]+e.tShift[t],s=e.src.charCodeAt(i++);if(s!==42&&s!==45&&s!==95)return!1;let u=1;for(;i<o;){let c=e.src.charCodeAt(i++);if(c!==s&&!H(c))return!1;c===s&&u++}if(u<3)return!1;if(r)return!0;e.line=t+1;let a=e.push(\"hr\",\"hr\",0);return a.map=[t,e.line],a.markup=Array(u+1).join(String.fromCharCode(s)),!0}function xv(e,t){let n=e.eMarks[t],r=e.bMarks[t]+e.tShift[t],o=e.src.charCodeAt(r++);if(o!==42&&o!==45&&o!==43)return-1;if(r<n){let i=e.src.charCodeAt(r);if(!H(i))return-1}return r}function Iv(e,t){let n=e.bMarks[t]+e.tShift[t],r=e.eMarks[t],o=n;if(o+1>=r)return-1;let i=e.src.charCodeAt(o++);if(i<48||i>57)return-1;for(;;){if(o>=r)return-1;if(i=e.src.charCodeAt(o++),i>=48&&i<=57){if(o-n>=10)return-1;continue}if(i===41||i===46)break;return-1}return o<r&&(i=e.src.charCodeAt(o),!H(i))?-1:o}function qS(e,t){let n=e.level+2;for(let r=t+2,o=e.tokens.length-2;r<o;r++)e.tokens[r].level===n&&e.tokens[r].type===\"paragraph_open\"&&(e.tokens[r+2].hidden=!0,e.tokens[r].hidden=!0,r+=2)}function Xp(e,t,n,r){let o,i,s,u,a=t,c=!0;if(e.sCount[a]-e.blkIndent>=4||e.listIndent>=0&&e.sCount[a]-e.listIndent>=4&&e.sCount[a]<e.blkIndent)return!1;let l=!1;r&&e.parentType===\"paragraph\"&&e.sCount[a]>=e.blkIndent&&(l=!0);let d,h,f;if((f=Iv(e,a))>=0){if(d=!0,s=e.bMarks[a]+e.tShift[a],h=Number(e.src.slice(s,f-1)),l&&h!==1)return!1}else if((f=xv(e,a))>=0)d=!1;else return!1;if(l&&e.skipSpaces(f)>=e.eMarks[a])return!1;if(r)return!0;let p=e.src.charCodeAt(f-1),m=e.tokens.length;d?(u=e.push(\"ordered_list_open\",\"ol\",1),h!==1&&(u.attrs=[[\"start\",h]])):u=e.push(\"bullet_list_open\",\"ul\",1);let g=[a,0];u.map=g,u.markup=String.fromCharCode(p);let y=!1,v=e.md.block.ruler.getRules(\"list\"),w=e.parentType;for(e.parentType=\"list\";a<n;){i=f,o=e.eMarks[a];let D=e.sCount[a]+f-(e.bMarks[a]+e.tShift[a]),F=D;for(;i<o;){let fr=e.src.charCodeAt(i);if(fr===9)F+=4-(F+e.bsCount[a])%4;else if(fr===32)F++;else break;i++}let E=i,N;E>=o?N=1:N=F-D,N>4&&(N=1);let O=D+N;u=e.push(\"list_item_open\",\"li\",1),u.markup=String.fromCharCode(p);let J=[a,0];u.map=J,d&&(u.info=e.src.slice(s,f-1));let ct=e.tight,yo=e.tShift[a],Pi=e.sCount[a],Xv=e.listIndent;if(e.listIndent=e.blkIndent,e.blkIndent=O,e.tight=!0,e.tShift[a]=E-e.bMarks[a],e.sCount[a]=F,E>=o&&e.isEmpty(a+1)?e.line=Math.min(e.line+2,n):e.md.block.tokenize(e,a,n,!0),(!e.tight||y)&&(c=!1),y=e.line-a>1&&e.isEmpty(e.line-1),e.blkIndent=e.listIndent,e.listIndent=Xv,e.tShift[a]=yo,e.sCount[a]=Pi,e.tight=ct,u=e.push(\"list_item_close\",\"li\",-1),u.markup=String.fromCharCode(p),a=e.line,J[1]=a,a>=n||e.sCount[a]<e.blkIndent||e.sCount[a]-e.blkIndent>=4)break;let Ah=!1;for(let fr=0,eD=v.length;fr<eD;fr++)if(v[fr](e,a,n,!0)){Ah=!0;break}if(Ah)break;if(d){if(f=Iv(e,a),f<0)break;s=e.bMarks[a]+e.tShift[a]}else if(f=xv(e,a),f<0)break;if(p!==e.src.charCodeAt(f-1))break}return d?u=e.push(\"ordered_list_close\",\"ol\",-1):u=e.push(\"bullet_list_close\",\"ul\",-1),u.markup=String.fromCharCode(p),g[1]=a,e.line=a,e.parentType=w,c&&qS(e,m),!0}function eh(e,t,n,r){let o=e.bMarks[t]+e.tShift[t],i=e.eMarks[t],s=t+1;if(e.sCount[t]-e.blkIndent>=4||e.src.charCodeAt(o)!==91)return!1;function u(v){let w=e.lineMax;if(v>=w||e.isEmpty(v))return null;let D=!1;if(e.sCount[v]-e.blkIndent>3&&(D=!0),e.sCount[v]<0&&(D=!0),!D){let N=e.md.block.ruler.getRules(\"reference\"),O=e.parentType;e.parentType=\"reference\";let J=!1;for(let ct=0,yo=N.length;ct<yo;ct++)if(N[ct](e,v,w,!0)){J=!0;break}if(e.parentType=O,J)return null}let F=e.bMarks[v]+e.tShift[v],E=e.eMarks[v];return e.src.slice(F,E+1)}let a=e.src.slice(o,i+1);i=a.length;let c=-1;for(o=1;o<i;o++){let v=a.charCodeAt(o);if(v===91)return!1;if(v===93){c=o;break}else if(v===10){let w=u(s);w!==null&&(a+=w,i=a.length,s++)}else if(v===92&&(o++,o<i&&a.charCodeAt(o)===10)){let w=u(s);w!==null&&(a+=w,i=a.length,s++)}}if(c<0||a.charCodeAt(c+1)!==58)return!1;for(o=c+2;o<i;o++){let v=a.charCodeAt(o);if(v===10){let w=u(s);w!==null&&(a+=w,i=a.length,s++)}else if(!H(v))break}let l=e.md.helpers.parseLinkDestination(a,o,i);if(!l.ok)return!1;let d=e.md.normalizeLink(l.str);if(!e.md.validateLink(d))return!1;o=l.pos;let h=o,f=s,p=o;for(;o<i;o++){let v=a.charCodeAt(o);if(v===10){let w=u(s);w!==null&&(a+=w,i=a.length,s++)}else if(!H(v))break}let m=e.md.helpers.parseLinkTitle(a,o,i);for(;m.can_continue;){let v=u(s);if(v===null)break;a+=v,o=i,i=a.length,s++,m=e.md.helpers.parseLinkTitle(a,o,i,m)}let g;for(o<i&&p!==o&&m.ok?(g=m.str,o=m.pos):(g=\"\",o=h,s=f);o<i;){let v=a.charCodeAt(o);if(!H(v))break;o++}if(o<i&&a.charCodeAt(o)!==10&&g)for(g=\"\",o=h,s=f;o<i;){let v=a.charCodeAt(o);if(!H(v))break;o++}if(o<i&&a.charCodeAt(o)!==10)return!1;let y=lr(a.slice(1,c));return y?(r||(typeof e.env.references>\"u\"&&(e.env.references={}),typeof e.env.references[y]>\"u\"&&(e.env.references[y]={title:g,href:d}),e.line=s),!0):!1}var Tv=[\"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\",\"search\",\"section\",\"summary\",\"table\",\"tbody\",\"td\",\"tfoot\",\"th\",\"thead\",\"title\",\"tr\",\"track\",\"ul\"];var GS=\"[a-zA-Z_:][a-zA-Z0-9:._-]*\",WS=\"[^\\\"'=<>`\\\\x00-\\\\x20]+\",ZS=\"'[^']*'\",YS='\"[^\"]*\"',QS=\"(?:\"+WS+\"|\"+ZS+\"|\"+YS+\")\",KS=\"(?:\\\\s+\"+GS+\"(?:\\\\s*=\\\\s*\"+QS+\")?)\",Sv=\"<[A-Za-z][A-Za-z0-9\\\\-]*\"+KS+\"*\\\\s*\\\\/?>\",Mv=\"<\\\\/[A-Za-z][A-Za-z0-9\\\\-]*\\\\s*>\",JS=\"<!---?>|<!--(?:[^-]|-[^-]|--[^>])*-->\",XS=\"<[?][\\\\s\\\\S]*?[?]>\",eM=\"<![A-Za-z][^>]*>\",tM=\"<!\\\\[CDATA\\\\[[\\\\s\\\\S]*?\\\\]\\\\]>\",Av=new RegExp(\"^(?:\"+Sv+\"|\"+Mv+\"|\"+JS+\"|\"+XS+\"|\"+eM+\"|\"+tM+\")\"),Nv=new RegExp(\"^(?:\"+Sv+\"|\"+Mv+\")\");var mo=[[/^<(script|pre|style|textarea)(?=(\\s|>|$))/i,/<\\/(script|pre|style|textarea)>/i,!0],[/^<!--/,/-->/,!0],[/^<\\?/,/\\?>/,!0],[/^<![A-Z]/,/>/,!0],[/^<!\\[CDATA\\[/,/\\]\\]>/,!0],[new RegExp(\"^</?(\"+Tv.join(\"|\")+\")(?=(\\\\s|/?>|$))\",\"i\"),/^$/,!0],[new RegExp(Nv.source+\"\\\\s*$\"),/^$/,!1]];function th(e,t,n,r){let o=e.bMarks[t]+e.tShift[t],i=e.eMarks[t];if(e.sCount[t]-e.blkIndent>=4||!e.md.options.html||e.src.charCodeAt(o)!==60)return!1;let s=e.src.slice(o,i),u=0;for(;u<mo.length&&!mo[u][0].test(s);u++);if(u===mo.length)return!1;if(r)return mo[u][2];let a=t+1;if(!mo[u][1].test(s)){for(;a<n&&!(e.sCount[a]<e.blkIndent);a++)if(o=e.bMarks[a]+e.tShift[a],i=e.eMarks[a],s=e.src.slice(o,i),mo[u][1].test(s)){s.length!==0&&a++;break}}e.line=a;let c=e.push(\"html_block\",\"\",0);return c.map=[t,a],c.content=e.getLines(t,a,e.blkIndent,!0),!0}function nh(e,t,n,r){let o=e.bMarks[t]+e.tShift[t],i=e.eMarks[t];if(e.sCount[t]-e.blkIndent>=4)return!1;let s=e.src.charCodeAt(o);if(s!==35||o>=i)return!1;let u=1;for(s=e.src.charCodeAt(++o);s===35&&o<i&&u<=6;)u++,s=e.src.charCodeAt(++o);if(u>6||o<i&&!H(s))return!1;if(r)return!0;i=e.skipSpacesBack(i,o);let a=e.skipCharsBack(i,35,o);a>o&&H(e.src.charCodeAt(a-1))&&(i=a),e.line=t+1;let c=e.push(\"heading_open\",\"h\"+String(u),1);c.markup=\"########\".slice(0,u),c.map=[t,e.line];let l=e.push(\"inline\",\"\",0);l.content=e.src.slice(o,i).trim(),l.map=[t,e.line],l.children=[];let d=e.push(\"heading_close\",\"h\"+String(u),-1);return d.markup=\"########\".slice(0,u),!0}function rh(e,t,n){let r=e.md.block.ruler.getRules(\"paragraph\");if(e.sCount[t]-e.blkIndent>=4)return!1;let o=e.parentType;e.parentType=\"paragraph\";let i=0,s,u=t+1;for(;u<n&&!e.isEmpty(u);u++){if(e.sCount[u]-e.blkIndent>3)continue;if(e.sCount[u]>=e.blkIndent){let f=e.bMarks[u]+e.tShift[u],p=e.eMarks[u];if(f<p&&(s=e.src.charCodeAt(f),(s===45||s===61)&&(f=e.skipChars(f,s),f=e.skipSpaces(f),f>=p))){i=s===61?1:2;break}}if(e.sCount[u]<0)continue;let h=!1;for(let f=0,p=r.length;f<p;f++)if(r[f](e,u,n,!0)){h=!0;break}if(h)break}if(!i)return!1;let a=e.getLines(t,u,e.blkIndent,!1).trim();e.line=u+1;let c=e.push(\"heading_open\",\"h\"+String(i),1);c.markup=String.fromCharCode(s),c.map=[t,e.line];let l=e.push(\"inline\",\"\",0);l.content=a,l.map=[t,e.line-1],l.children=[];let d=e.push(\"heading_close\",\"h\"+String(i),-1);return d.markup=String.fromCharCode(s),e.parentType=o,!0}function oh(e,t,n){let r=e.md.block.ruler.getRules(\"paragraph\"),o=e.parentType,i=t+1;for(e.parentType=\"paragraph\";i<n&&!e.isEmpty(i);i++){if(e.sCount[i]-e.blkIndent>3||e.sCount[i]<0)continue;let c=!1;for(let l=0,d=r.length;l<d;l++)if(r[l](e,i,n,!0)){c=!0;break}if(c)break}let s=e.getLines(t,i,e.blkIndent,!1).trim();e.line=i;let u=e.push(\"paragraph_open\",\"p\",1);u.map=[t,e.line];let a=e.push(\"inline\",\"\",0);return a.content=s,a.map=[t,e.line],a.children=[],e.push(\"paragraph_close\",\"p\",-1),e.parentType=o,!0}var La=[[\"table\",Zp,[\"paragraph\",\"reference\"]],[\"code\",Yp],[\"fence\",Qp,[\"paragraph\",\"reference\",\"blockquote\",\"list\"]],[\"blockquote\",Kp,[\"paragraph\",\"reference\",\"blockquote\",\"list\"]],[\"hr\",Jp,[\"paragraph\",\"reference\",\"blockquote\",\"list\"]],[\"list\",Xp,[\"paragraph\",\"reference\",\"blockquote\"]],[\"reference\",eh],[\"html_block\",th,[\"paragraph\",\"reference\",\"blockquote\"]],[\"heading\",nh,[\"paragraph\",\"reference\",\"blockquote\"]],[\"lheading\",rh],[\"paragraph\",oh]];function ja(){this.ruler=new dr;for(let e=0;e<La.length;e++)this.ruler.push(La[e][0],La[e][1],{alt:(La[e][2]||[]).slice()})}ja.prototype.tokenize=function(e,t,n){let r=this.ruler.getRules(\"\"),o=r.length,i=e.md.options.maxNesting,s=t,u=!1;for(;s<n&&(e.line=s=e.skipEmptyLines(s),!(s>=n||e.sCount[s]<e.blkIndent));){if(e.level>=i){e.line=n;break}let a=e.line,c=!1;for(let l=0;l<o;l++)if(c=r[l](e,s,n,!1),c){if(a>=e.line)throw new Error(\"block rule didn't increment state.line\");break}if(!c)throw new Error(\"none of the block rules matched\");e.tight=!u,e.isEmpty(e.line-1)&&(u=!0),s=e.line,s<n&&e.isEmpty(s)&&(u=!0,s++,e.line=s)}};ja.prototype.parse=function(e,t,n,r){if(!e)return;let o=new this.State(e,t,n,r);this.tokenize(o,o.line,o.lineMax)};ja.prototype.State=_v;var kv=ja;function Fi(e,t,n,r){this.src=e,this.env=n,this.md=t,this.tokens=r,this.tokens_meta=Array(r.length),this.pos=0,this.posMax=this.src.length,this.level=0,this.pending=\"\",this.pendingLevel=0,this.cache={},this.delimiters=[],this._prev_delimiters=[],this.backticks={},this.backticksScanned=!1,this.linkLevel=0}Fi.prototype.pushPending=function(){let e=new Zt(\"text\",\"\",0);return e.content=this.pending,e.level=this.pendingLevel,this.tokens.push(e),this.pending=\"\",e};Fi.prototype.push=function(e,t,n){this.pending&&this.pushPending();let r=new Zt(e,t,n),o=null;return n<0&&(this.level--,this.delimiters=this._prev_delimiters.pop()),r.level=this.level,n>0&&(this.level++,this._prev_delimiters.push(this.delimiters),this.delimiters=[],o={delimiters:this.delimiters}),this.pendingLevel=this.level,this.tokens.push(r),this.tokens_meta.push(o),r};Fi.prototype.scanDelims=function(e,t){let n=this.posMax,r=this.src.charCodeAt(e),o=e>0?this.src.charCodeAt(e-1):32,i=e;for(;i<n&&this.src.charCodeAt(i)===r;)i++;let s=i-e,u=i<n?this.src.charCodeAt(i):32,a=cr(o)||ar(String.fromCharCode(o)),c=cr(u)||ar(String.fromCharCode(u)),l=ur(o),d=ur(u),h=!d&&(!c||l||a),f=!l&&(!a||d||c);return{can_open:h&&(t||!f||a),can_close:f&&(t||!h||c),length:s}};Fi.prototype.Token=Zt;var Rv=Fi;function nM(e){switch(e){case 10:case 33:case 35:case 36:case 37:case 38:case 42:case 43:case 45:case 58:case 60:case 61:case 62:case 64:case 91:case 92:case 93:case 94:case 95:case 96:case 123:case 125:case 126:return!0;default:return!1}}function ih(e,t){let n=e.pos;for(;n<e.posMax&&!nM(e.src.charCodeAt(n));)n++;return n===e.pos?!1:(t||(e.pending+=e.src.slice(e.pos,n)),e.pos=n,!0)}var rM=/(?:^|[^a-z0-9.+-])([a-z][a-z0-9.+-]*)$/i;function sh(e,t){if(!e.md.options.linkify||e.linkLevel>0)return!1;let n=e.pos,r=e.posMax;if(n+3>r||e.src.charCodeAt(n)!==58||e.src.charCodeAt(n+1)!==47||e.src.charCodeAt(n+2)!==47)return!1;let o=e.pending.match(rM);if(!o)return!1;let i=o[1],s=e.md.linkify.matchAtStart(e.src.slice(n-i.length));if(!s)return!1;let u=s.url;if(u.length<=i.length)return!1;let a=u.length;for(;a>0&&u.charCodeAt(a-1)===42;)a--;a!==u.length&&(u=u.slice(0,a));let c=e.md.normalizeLink(u);if(!e.md.validateLink(c))return!1;if(!t){e.pending=e.pending.slice(0,-i.length);let l=e.push(\"link_open\",\"a\",1);l.attrs=[[\"href\",c]],l.markup=\"linkify\",l.info=\"auto\";let d=e.push(\"text\",\"\",0);d.content=e.md.normalizeLinkText(u);let h=e.push(\"link_close\",\"a\",-1);h.markup=\"linkify\",h.info=\"auto\"}return e.pos+=u.length-i.length,!0}function uh(e,t){let n=e.pos;if(e.src.charCodeAt(n)!==10)return!1;let r=e.pending.length-1,o=e.posMax;if(!t)if(r>=0&&e.pending.charCodeAt(r)===32)if(r>=1&&e.pending.charCodeAt(r-1)===32){let i=r-1;for(;i>=1&&e.pending.charCodeAt(i-1)===32;)i--;e.pending=e.pending.slice(0,i),e.push(\"hardbreak\",\"br\",0)}else e.pending=e.pending.slice(0,-1),e.push(\"softbreak\",\"br\",0);else e.push(\"softbreak\",\"br\",0);for(n++;n<o&&H(e.src.charCodeAt(n));)n++;return e.pos=n,!0}var ah=[];for(let e=0;e<256;e++)ah.push(0);\"\\\\!\\\"#$%&'()*+,./:;<=>?@[]^_`{|}~-\".split(\"\").forEach(function(e){ah[e.charCodeAt(0)]=1});function ch(e,t){let n=e.pos,r=e.posMax;if(e.src.charCodeAt(n)!==92||(n++,n>=r))return!1;let o=e.src.charCodeAt(n);if(o===10){for(t||e.push(\"hardbreak\",\"br\",0),n++;n<r&&(o=e.src.charCodeAt(n),!!H(o));)n++;return e.pos=n,!0}let i=e.src[n];if(o>=55296&&o<=56319&&n+1<r){let u=e.src.charCodeAt(n+1);u>=56320&&u<=57343&&(i+=e.src[n+1],n++)}let s=\"\\\\\"+i;if(!t){let u=e.push(\"text_special\",\"\",0);o<256&&ah[o]!==0?u.content=i:u.content=s,u.markup=s,u.info=\"escape\"}return e.pos=n+1,!0}function lh(e,t){let n=e.pos;if(e.src.charCodeAt(n)!==96)return!1;let o=n;n++;let i=e.posMax;for(;n<i&&e.src.charCodeAt(n)===96;)n++;let s=e.src.slice(o,n),u=s.length;if(e.backticksScanned&&(e.backticks[u]||0)<=o)return t||(e.pending+=s),e.pos+=u,!0;let a=n,c;for(;(c=e.src.indexOf(\"`\",a))!==-1;){for(a=c+1;a<i&&e.src.charCodeAt(a)===96;)a++;let l=a-c;if(l===u){if(!t){let d=e.push(\"code_inline\",\"code\",0);d.markup=s,d.content=e.src.slice(n,c).replace(/\\n/g,\" \").replace(/^ (.+) $/,\"$1\")}return e.pos=a,!0}e.backticks[l]=c}return e.backticksScanned=!0,t||(e.pending+=s),e.pos+=u,!0}function oM(e,t){let n=e.pos,r=e.src.charCodeAt(n);if(t||r!==126)return!1;let o=e.scanDelims(e.pos,!0),i=o.length,s=String.fromCharCode(r);if(i<2)return!1;let u;i%2&&(u=e.push(\"text\",\"\",0),u.content=s,i--);for(let a=0;a<i;a+=2)u=e.push(\"text\",\"\",0),u.content=s+s,e.delimiters.push({marker:r,length:0,token:e.tokens.length-1,end:-1,open:o.can_open,close:o.can_close});return e.pos+=o.length,!0}function Fv(e,t){let n,r=[],o=t.length;for(let i=0;i<o;i++){let s=t[i];if(s.marker!==126||s.end===-1)continue;let u=t[s.end];n=e.tokens[s.token],n.type=\"s_open\",n.tag=\"s\",n.nesting=1,n.markup=\"~~\",n.content=\"\",n=e.tokens[u.token],n.type=\"s_close\",n.tag=\"s\",n.nesting=-1,n.markup=\"~~\",n.content=\"\",e.tokens[u.token-1].type===\"text\"&&e.tokens[u.token-1].content===\"~\"&&r.push(u.token-1)}for(;r.length;){let i=r.pop(),s=i+1;for(;s<e.tokens.length&&e.tokens[s].type===\"s_close\";)s++;s--,i!==s&&(n=e.tokens[s],e.tokens[s]=e.tokens[i],e.tokens[i]=n)}}function iM(e){let t=e.tokens_meta,n=e.tokens_meta.length;Fv(e,e.delimiters);for(let r=0;r<n;r++)t[r]&&t[r].delimiters&&Fv(e,t[r].delimiters)}var dh={tokenize:oM,postProcess:iM};function sM(e,t){let n=e.pos,r=e.src.charCodeAt(n);if(t||r!==95&&r!==42)return!1;let o=e.scanDelims(e.pos,r===42);for(let i=0;i<o.length;i++){let s=e.push(\"text\",\"\",0);s.content=String.fromCharCode(r),e.delimiters.push({marker:r,length:o.length,token:e.tokens.length-1,end:-1,open:o.can_open,close:o.can_close})}return e.pos+=o.length,!0}function Ov(e,t){let n=t.length;for(let r=n-1;r>=0;r--){let o=t[r];if(o.marker!==95&&o.marker!==42||o.end===-1)continue;let i=t[o.end],s=r>0&&t[r-1].end===o.end+1&&t[r-1].marker===o.marker&&t[r-1].token===o.token-1&&t[o.end+1].token===i.token+1,u=String.fromCharCode(o.marker),a=e.tokens[o.token];a.type=s?\"strong_open\":\"em_open\",a.tag=s?\"strong\":\"em\",a.nesting=1,a.markup=s?u+u:u,a.content=\"\";let c=e.tokens[i.token];c.type=s?\"strong_close\":\"em_close\",c.tag=s?\"strong\":\"em\",c.nesting=-1,c.markup=s?u+u:u,c.content=\"\",s&&(e.tokens[t[r-1].token].content=\"\",e.tokens[t[o.end+1].token].content=\"\",r--)}}function uM(e){let t=e.tokens_meta,n=e.tokens_meta.length;Ov(e,e.delimiters);for(let r=0;r<n;r++)t[r]&&t[r].delimiters&&Ov(e,t[r].delimiters)}var fh={tokenize:sM,postProcess:uM};function ph(e,t){let n,r,o,i,s=\"\",u=\"\",a=e.pos,c=!0;if(e.src.charCodeAt(e.pos)!==91)return!1;let l=e.pos,d=e.posMax,h=e.pos+1,f=e.md.helpers.parseLinkLabel(e,e.pos,!0);if(f<0)return!1;let p=f+1;if(p<d&&e.src.charCodeAt(p)===40){for(c=!1,p++;p<d&&(n=e.src.charCodeAt(p),!(!H(n)&&n!==10));p++);if(p>=d)return!1;if(a=p,o=e.md.helpers.parseLinkDestination(e.src,p,e.posMax),o.ok){for(s=e.md.normalizeLink(o.str),e.md.validateLink(s)?p=o.pos:s=\"\",a=p;p<d&&(n=e.src.charCodeAt(p),!(!H(n)&&n!==10));p++);if(o=e.md.helpers.parseLinkTitle(e.src,p,e.posMax),p<d&&a!==p&&o.ok)for(u=o.str,p=o.pos;p<d&&(n=e.src.charCodeAt(p),!(!H(n)&&n!==10));p++);}(p>=d||e.src.charCodeAt(p)!==41)&&(c=!0),p++}if(c){if(typeof e.env.references>\"u\")return!1;if(p<d&&e.src.charCodeAt(p)===91?(a=p+1,p=e.md.helpers.parseLinkLabel(e,p),p>=0?r=e.src.slice(a,p++):p=f+1):p=f+1,r||(r=e.src.slice(h,f)),i=e.env.references[lr(r)],!i)return e.pos=l,!1;s=i.href,u=i.title}if(!t){e.pos=h,e.posMax=f;let m=e.push(\"link_open\",\"a\",1),g=[[\"href\",s]];m.attrs=g,u&&g.push([\"title\",u]),e.linkLevel++,e.md.inline.tokenize(e),e.linkLevel--,e.push(\"link_close\",\"a\",-1)}return e.pos=p,e.posMax=d,!0}function hh(e,t){let n,r,o,i,s,u,a,c,l=\"\",d=e.pos,h=e.posMax;if(e.src.charCodeAt(e.pos)!==33||e.src.charCodeAt(e.pos+1)!==91)return!1;let f=e.pos+2,p=e.md.helpers.parseLinkLabel(e,e.pos+1,!1);if(p<0)return!1;if(i=p+1,i<h&&e.src.charCodeAt(i)===40){for(i++;i<h&&(n=e.src.charCodeAt(i),!(!H(n)&&n!==10));i++);if(i>=h)return!1;for(c=i,u=e.md.helpers.parseLinkDestination(e.src,i,e.posMax),u.ok&&(l=e.md.normalizeLink(u.str),e.md.validateLink(l)?i=u.pos:l=\"\"),c=i;i<h&&(n=e.src.charCodeAt(i),!(!H(n)&&n!==10));i++);if(u=e.md.helpers.parseLinkTitle(e.src,i,e.posMax),i<h&&c!==i&&u.ok)for(a=u.str,i=u.pos;i<h&&(n=e.src.charCodeAt(i),!(!H(n)&&n!==10));i++);else a=\"\";if(i>=h||e.src.charCodeAt(i)!==41)return e.pos=d,!1;i++}else{if(typeof e.env.references>\"u\")return!1;if(i<h&&e.src.charCodeAt(i)===91?(c=i+1,i=e.md.helpers.parseLinkLabel(e,i),i>=0?o=e.src.slice(c,i++):i=p+1):i=p+1,o||(o=e.src.slice(f,p)),s=e.env.references[lr(o)],!s)return e.pos=d,!1;l=s.href,a=s.title}if(!t){r=e.src.slice(f,p);let m=[];e.md.inline.parse(r,e.md,e.env,m);let g=e.push(\"image\",\"img\",0),y=[[\"src\",l],[\"alt\",\"\"]];g.attrs=y,g.children=m,g.content=r,a&&y.push([\"title\",a])}return e.pos=i,e.posMax=h,!0}var aM=/^([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])?)*)$/,cM=/^([a-zA-Z][a-zA-Z0-9+.-]{1,31}):([^<>\\x00-\\x20]*)$/;function gh(e,t){let n=e.pos;if(e.src.charCodeAt(n)!==60)return!1;let r=e.pos,o=e.posMax;for(;;){if(++n>=o)return!1;let s=e.src.charCodeAt(n);if(s===60)return!1;if(s===62)break}let i=e.src.slice(r+1,n);if(cM.test(i)){let s=e.md.normalizeLink(i);if(!e.md.validateLink(s))return!1;if(!t){let u=e.push(\"link_open\",\"a\",1);u.attrs=[[\"href\",s]],u.markup=\"autolink\",u.info=\"auto\";let a=e.push(\"text\",\"\",0);a.content=e.md.normalizeLinkText(i);let c=e.push(\"link_close\",\"a\",-1);c.markup=\"autolink\",c.info=\"auto\"}return e.pos+=i.length+2,!0}if(aM.test(i)){let s=e.md.normalizeLink(\"mailto:\"+i);if(!e.md.validateLink(s))return!1;if(!t){let u=e.push(\"link_open\",\"a\",1);u.attrs=[[\"href\",s]],u.markup=\"autolink\",u.info=\"auto\";let a=e.push(\"text\",\"\",0);a.content=e.md.normalizeLinkText(i);let c=e.push(\"link_close\",\"a\",-1);c.markup=\"autolink\",c.info=\"auto\"}return e.pos+=i.length+2,!0}return!1}function lM(e){return/^<a[>\\s]/i.test(e)}function dM(e){return/^<\\/a\\s*>/i.test(e)}function fM(e){let t=e|32;return t>=97&&t<=122}function mh(e,t){if(!e.md.options.html)return!1;let n=e.posMax,r=e.pos;if(e.src.charCodeAt(r)!==60||r+2>=n)return!1;let o=e.src.charCodeAt(r+1);if(o!==33&&o!==63&&o!==47&&!fM(o))return!1;let i=e.src.slice(r).match(Av);if(!i)return!1;if(!t){let s=e.push(\"html_inline\",\"\",0);s.content=i[0],lM(s.content)&&e.linkLevel++,dM(s.content)&&e.linkLevel--}return e.pos+=i[0].length,!0}var pM=/^&#((?:x[a-f0-9]{1,6}|[0-9]{1,7}));/i,hM=/^&([a-z][a-z0-9]{1,31});/i;function yh(e,t){let n=e.pos,r=e.posMax;if(e.src.charCodeAt(n)!==38||n+1>=r)return!1;if(e.src.charCodeAt(n+1)===35){let i=e.src.slice(n).match(pM);if(i){if(!t){let s=i[1][0].toLowerCase()===\"x\"?parseInt(i[1].slice(1),16):parseInt(i[1],10),u=e.push(\"text_special\",\"\",0);u.content=Oa(s)?Ri(s):Ri(65533),u.markup=i[0],u.info=\"entity\"}return e.pos+=i[0].length,!0}}else{let i=e.src.slice(n).match(hM);if(i){let s=Cn(i[0]);if(s!==i[0]){if(!t){let u=e.push(\"text_special\",\"\",0);u.content=s,u.markup=i[0],u.info=\"entity\"}return e.pos+=i[0].length,!0}}}return!1}function Pv(e){let t={},n=e.length;if(!n)return;let r=0,o=-2,i=[];for(let s=0;s<n;s++){let u=e[s];if(i.push(0),(e[r].marker!==u.marker||o!==u.token-1)&&(r=s),o=u.token,u.length=u.length||0,!u.close)continue;t.hasOwnProperty(u.marker)||(t[u.marker]=[-1,-1,-1,-1,-1,-1]);let a=t[u.marker][(u.open?3:0)+u.length%3],c=r-i[r]-1,l=c;for(;c>a;c-=i[c]+1){let d=e[c];if(d.marker===u.marker&&d.open&&d.end<0){let h=!1;if((d.close||u.open)&&(d.length+u.length)%3===0&&(d.length%3!==0||u.length%3!==0)&&(h=!0),!h){let f=c>0&&!e[c-1].open?i[c-1]+1:0;i[s]=s-c+f,i[c]=f,u.open=!1,d.end=s,d.close=!1,l=-1,o=-2;break}}}l!==-1&&(t[u.marker][(u.open?3:0)+(u.length||0)%3]=l)}}function bh(e){let t=e.tokens_meta,n=e.tokens_meta.length;Pv(e.delimiters);for(let r=0;r<n;r++)t[r]&&t[r].delimiters&&Pv(t[r].delimiters)}function vh(e){let t,n,r=0,o=e.tokens,i=e.tokens.length;for(t=n=0;t<i;t++)o[t].nesting<0&&r--,o[t].level=r,o[t].nesting>0&&r++,o[t].type===\"text\"&&t+1<i&&o[t+1].type===\"text\"?o[t+1].content=o[t].content+o[t+1].content:(t!==n&&(o[n]=o[t]),n++);t!==n&&(o.length=n)}var Dh=[[\"text\",ih],[\"linkify\",sh],[\"newline\",uh],[\"escape\",ch],[\"backticks\",lh],[\"strikethrough\",dh.tokenize],[\"emphasis\",fh.tokenize],[\"link\",ph],[\"image\",hh],[\"autolink\",gh],[\"html_inline\",mh],[\"entity\",yh]],Eh=[[\"balance_pairs\",bh],[\"strikethrough\",dh.postProcess],[\"emphasis\",fh.postProcess],[\"fragments_join\",vh]];function Oi(){this.ruler=new dr;for(let e=0;e<Dh.length;e++)this.ruler.push(Dh[e][0],Dh[e][1]);this.ruler2=new dr;for(let e=0;e<Eh.length;e++)this.ruler2.push(Eh[e][0],Eh[e][1])}Oi.prototype.skipToken=function(e){let t=e.pos,n=this.ruler.getRules(\"\"),r=n.length,o=e.md.options.maxNesting,i=e.cache;if(typeof i[t]<\"u\"){e.pos=i[t];return}let s=!1;if(e.level<o){for(let u=0;u<r;u++)if(e.level++,s=n[u](e,!0),e.level--,s){if(t>=e.pos)throw new Error(\"inline rule didn't increment state.pos\");break}}else e.pos=e.posMax;s||e.pos++,i[t]=e.pos};Oi.prototype.tokenize=function(e){let t=this.ruler.getRules(\"\"),n=t.length,r=e.posMax,o=e.md.options.maxNesting;for(;e.pos<r;){let i=e.pos,s=!1;if(e.level<o){for(let u=0;u<n;u++)if(s=t[u](e,!1),s){if(i>=e.pos)throw new Error(\"inline rule didn't increment state.pos\");break}}if(s){if(e.pos>=r)break;continue}e.pending+=e.src[e.pos++]}e.pending&&e.pushPending()};Oi.prototype.parse=function(e,t,n,r){let o=new this.State(e,t,n,r);this.tokenize(o);let i=this.ruler2.getRules(\"\"),s=i.length;for(let u=0;u<s;u++)i[u](o)};Oi.prototype.State=Rv;var Lv=Oi;function jv(e){let t={};e=e||{},t.src_Any=Sa.source,t.src_Cc=Ma.source,t.src_Z=Na.source,t.src_P=fo.source,t.src_ZPCc=[t.src_Z,t.src_P,t.src_Cc].join(\"|\"),t.src_ZCc=[t.src_Z,t.src_Cc].join(\"|\");let n=\"[><\\uFF5C]\";return t.src_pseudo_letter=\"(?:(?!\"+n+\"|\"+t.src_ZPCc+\")\"+t.src_Any+\")\",t.src_ip4=\"(?:(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\",t.src_auth=\"(?:(?:(?!\"+t.src_ZCc+\"|[@/\\\\[\\\\]()]).)+@)?\",t.src_port=\"(?::(?:6(?:[0-4]\\\\d{3}|5(?:[0-4]\\\\d{2}|5(?:[0-2]\\\\d|3[0-5])))|[1-5]?\\\\d{1,4}))?\",t.src_host_terminator=\"(?=$|\"+n+\"|\"+t.src_ZPCc+\")(?!\"+(e[\"---\"]?\"-(?!--)|\":\"-|\")+\"_|:\\\\d|\\\\.-|\\\\.(?!$|\"+t.src_ZPCc+\"))\",t.src_path=\"(?:[/?#](?:(?!\"+t.src_ZCc+\"|\"+n+`|[()[\\\\]{}.,\"'?!\\\\-;]).|\\\\[(?:(?!`+t.src_ZCc+\"|\\\\]).)*\\\\]|\\\\((?:(?!\"+t.src_ZCc+\"|[)]).)*\\\\)|\\\\{(?:(?!\"+t.src_ZCc+'|[}]).)*\\\\}|\\\\\"(?:(?!'+t.src_ZCc+`|[\"]).)+\\\\\"|\\\\'(?:(?!`+t.src_ZCc+\"|[']).)+\\\\'|\\\\'(?=\"+t.src_pseudo_letter+\"|[-])|\\\\.{2,}[a-zA-Z0-9%/&]|\\\\.(?!\"+t.src_ZCc+\"|[.]|$)|\"+(e[\"---\"]?\"\\\\-(?!--(?:[^-]|$))(?:-*)|\":\"\\\\-+|\")+\",(?!\"+t.src_ZCc+\"|$)|;(?!\"+t.src_ZCc+\"|$)|\\\\!+(?!\"+t.src_ZCc+\"|[!]|$)|\\\\?(?!\"+t.src_ZCc+\"|[?]|$))+|\\\\/)?\",t.src_email_name='[\\\\-;:&=\\\\+\\\\$,\\\\.a-zA-Z0-9_][\\\\-;:&=\\\\+\\\\$,\\\\\"\\\\.a-zA-Z0-9_]*',t.src_xn=\"xn--[a-z0-9\\\\-]{1,59}\",t.src_domain_root=\"(?:\"+t.src_xn+\"|\"+t.src_pseudo_letter+\"{1,63})\",t.src_domain=\"(?:\"+t.src_xn+\"|(?:\"+t.src_pseudo_letter+\")|(?:\"+t.src_pseudo_letter+\"(?:-|\"+t.src_pseudo_letter+\"){0,61}\"+t.src_pseudo_letter+\"))\",t.src_host=\"(?:(?:(?:(?:\"+t.src_domain+\")\\\\.)*\"+t.src_domain+\"))\",t.tpl_host_fuzzy=\"(?:\"+t.src_ip4+\"|(?:(?:(?:\"+t.src_domain+\")\\\\.)+(?:%TLDS%)))\",t.tpl_host_no_ip_fuzzy=\"(?:(?:(?:\"+t.src_domain+\")\\\\.)+(?:%TLDS%))\",t.src_host_strict=t.src_host+t.src_host_terminator,t.tpl_host_fuzzy_strict=t.tpl_host_fuzzy+t.src_host_terminator,t.src_host_port_strict=t.src_host+t.src_port+t.src_host_terminator,t.tpl_host_port_fuzzy_strict=t.tpl_host_fuzzy+t.src_port+t.src_host_terminator,t.tpl_host_port_no_ip_fuzzy_strict=t.tpl_host_no_ip_fuzzy+t.src_port+t.src_host_terminator,t.tpl_host_fuzzy_test=\"localhost|www\\\\.|\\\\.\\\\d{1,3}\\\\.|(?:\\\\.(?:%TLDS%)(?:\"+t.src_ZPCc+\"|>|$))\",t.tpl_email_fuzzy=\"(^|\"+n+'|\"|\\\\(|'+t.src_ZCc+\")(\"+t.src_email_name+\"@\"+t.tpl_host_fuzzy_strict+\")\",t.tpl_link_fuzzy=\"(^|(?![.:/\\\\-_@])(?:[$+<=>^`|\\uFF5C]|\"+t.src_ZPCc+\"))((?![$+<=>^`|\\uFF5C])\"+t.tpl_host_port_fuzzy_strict+t.src_path+\")\",t.tpl_link_no_ip_fuzzy=\"(^|(?![.:/\\\\-_@])(?:[$+<=>^`|\\uFF5C]|\"+t.src_ZPCc+\"))((?![$+<=>^`|\\uFF5C])\"+t.tpl_host_port_no_ip_fuzzy_strict+t.src_path+\")\",t}function Ch(e){return Array.prototype.slice.call(arguments,1).forEach(function(n){n&&Object.keys(n).forEach(function(r){e[r]=n[r]})}),e}function Va(e){return Object.prototype.toString.call(e)}function gM(e){return Va(e)===\"[object String]\"}function mM(e){return Va(e)===\"[object Object]\"}function yM(e){return Va(e)===\"[object RegExp]\"}function Bv(e){return Va(e)===\"[object Function]\"}function bM(e){return e.replace(/[.?*+^$[\\]\\\\(){}|-]/g,\"\\\\$&\")}var Hv={fuzzyLink:!0,fuzzyEmail:!0,fuzzyIP:!1};function vM(e){return Object.keys(e||{}).reduce(function(t,n){return t||Hv.hasOwnProperty(n)},!1)}var DM={\"http:\":{validate:function(e,t,n){let r=e.slice(t);return n.re.http||(n.re.http=new RegExp(\"^\\\\/\\\\/\"+n.re.src_auth+n.re.src_host_port_strict+n.re.src_path,\"i\")),n.re.http.test(r)?r.match(n.re.http)[0].length:0}},\"https:\":\"http:\",\"ftp:\":\"http:\",\"//\":{validate:function(e,t,n){let r=e.slice(t);return n.re.no_http||(n.re.no_http=new RegExp(\"^\"+n.re.src_auth+\"(?:localhost|(?:(?:\"+n.re.src_domain+\")\\\\.)+\"+n.re.src_domain_root+\")\"+n.re.src_port+n.re.src_host_terminator+n.re.src_path,\"i\")),n.re.no_http.test(r)?t>=3&&e[t-3]===\":\"||t>=3&&e[t-3]===\"/\"?0:r.match(n.re.no_http)[0].length:0}},\"mailto:\":{validate:function(e,t,n){let r=e.slice(t);return n.re.mailto||(n.re.mailto=new RegExp(\"^\"+n.re.src_email_name+\"@\"+n.re.src_host_strict,\"i\")),n.re.mailto.test(r)?r.match(n.re.mailto)[0].length:0}}},EM=\"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]\",CM=\"biz|com|edu|gov|net|org|pro|web|xxx|aero|asia|coop|info|museum|name|shop|\\u0440\\u0444\".split(\"|\");function _M(e){e.__index__=-1,e.__text_cache__=\"\"}function wM(e){return function(t,n){let r=t.slice(n);return e.test(r)?r.match(e)[0].length:0}}function Vv(){return function(e,t){t.normalize(e)}}function Ba(e){let t=e.re=jv(e.__opts__),n=e.__tlds__.slice();e.onCompile(),e.__tlds_replaced__||n.push(EM),n.push(t.src_xn),t.src_tlds=n.join(\"|\");function r(u){return u.replace(\"%TLDS%\",t.src_tlds)}t.email_fuzzy=RegExp(r(t.tpl_email_fuzzy),\"i\"),t.link_fuzzy=RegExp(r(t.tpl_link_fuzzy),\"i\"),t.link_no_ip_fuzzy=RegExp(r(t.tpl_link_no_ip_fuzzy),\"i\"),t.host_fuzzy_test=RegExp(r(t.tpl_host_fuzzy_test),\"i\");let o=[];e.__compiled__={};function i(u,a){throw new Error('(LinkifyIt) Invalid schema \"'+u+'\": '+a)}Object.keys(e.__schemas__).forEach(function(u){let a=e.__schemas__[u];if(a===null)return;let c={validate:null,link:null};if(e.__compiled__[u]=c,mM(a)){yM(a.validate)?c.validate=wM(a.validate):Bv(a.validate)?c.validate=a.validate:i(u,a),Bv(a.normalize)?c.normalize=a.normalize:a.normalize?i(u,a):c.normalize=Vv();return}if(gM(a)){o.push(u);return}i(u,a)}),o.forEach(function(u){e.__compiled__[e.__schemas__[u]]&&(e.__compiled__[u].validate=e.__compiled__[e.__schemas__[u]].validate,e.__compiled__[u].normalize=e.__compiled__[e.__schemas__[u]].normalize)}),e.__compiled__[\"\"]={validate:null,normalize:Vv()};let s=Object.keys(e.__compiled__).filter(function(u){return u.length>0&&e.__compiled__[u]}).map(bM).join(\"|\");e.re.schema_test=RegExp(\"(^|(?!_)(?:[><\\uFF5C]|\"+t.src_ZPCc+\"))(\"+s+\")\",\"i\"),e.re.schema_search=RegExp(\"(^|(?!_)(?:[><\\uFF5C]|\"+t.src_ZPCc+\"))(\"+s+\")\",\"ig\"),e.re.schema_at_start=RegExp(\"^\"+e.re.schema_search.source,\"i\"),e.re.pretest=RegExp(\"(\"+e.re.schema_test.source+\")|(\"+e.re.host_fuzzy_test.source+\")|@\",\"i\"),_M(e)}function xM(e,t){let n=e.__index__,r=e.__last_index__,o=e.__text_cache__.slice(n,r);this.schema=e.__schema__.toLowerCase(),this.index=n+t,this.lastIndex=r+t,this.raw=o,this.text=o,this.url=o}function _h(e,t){let n=new xM(e,t);return e.__compiled__[n.schema].normalize(n,e),n}function je(e,t){if(!(this instanceof je))return new je(e,t);t||vM(e)&&(t=e,e={}),this.__opts__=Ch({},Hv,t),this.__index__=-1,this.__last_index__=-1,this.__schema__=\"\",this.__text_cache__=\"\",this.__schemas__=Ch({},DM,e),this.__compiled__={},this.__tlds__=CM,this.__tlds_replaced__=!1,this.re={},Ba(this)}je.prototype.add=function(t,n){return this.__schemas__[t]=n,Ba(this),this};je.prototype.set=function(t){return this.__opts__=Ch(this.__opts__,t),this};je.prototype.test=function(t){if(this.__text_cache__=t,this.__index__=-1,!t.length)return!1;let n,r,o,i,s,u,a,c,l;if(this.re.schema_test.test(t)){for(a=this.re.schema_search,a.lastIndex=0;(n=a.exec(t))!==null;)if(i=this.testSchemaAt(t,n[2],a.lastIndex),i){this.__schema__=n[2],this.__index__=n.index+n[1].length,this.__last_index__=n.index+n[0].length+i;break}}return this.__opts__.fuzzyLink&&this.__compiled__[\"http:\"]&&(c=t.search(this.re.host_fuzzy_test),c>=0&&(this.__index__<0||c<this.__index__)&&(r=t.match(this.__opts__.fuzzyIP?this.re.link_fuzzy:this.re.link_no_ip_fuzzy))!==null&&(s=r.index+r[1].length,(this.__index__<0||s<this.__index__)&&(this.__schema__=\"\",this.__index__=s,this.__last_index__=r.index+r[0].length))),this.__opts__.fuzzyEmail&&this.__compiled__[\"mailto:\"]&&(l=t.indexOf(\"@\"),l>=0&&(o=t.match(this.re.email_fuzzy))!==null&&(s=o.index+o[1].length,u=o.index+o[0].length,(this.__index__<0||s<this.__index__||s===this.__index__&&u>this.__last_index__)&&(this.__schema__=\"mailto:\",this.__index__=s,this.__last_index__=u))),this.__index__>=0};je.prototype.pretest=function(t){return this.re.pretest.test(t)};je.prototype.testSchemaAt=function(t,n,r){return this.__compiled__[n.toLowerCase()]?this.__compiled__[n.toLowerCase()].validate(t,r,this):0};je.prototype.match=function(t){let n=[],r=0;this.__index__>=0&&this.__text_cache__===t&&(n.push(_h(this,r)),r=this.__last_index__);let o=r?t.slice(r):t;for(;this.test(o);)n.push(_h(this,r)),o=o.slice(this.__last_index__),r+=this.__last_index__;return n.length?n:null};je.prototype.matchAtStart=function(t){if(this.__text_cache__=t,this.__index__=-1,!t.length)return null;let n=this.re.schema_at_start.exec(t);if(!n)return null;let r=this.testSchemaAt(t,n[2],n[0].length);return r?(this.__schema__=n[2],this.__index__=n.index+n[1].length,this.__last_index__=n.index+n[0].length+r,_h(this,0)):null};je.prototype.tlds=function(t,n){return t=Array.isArray(t)?t:[t],n?(this.__tlds__=this.__tlds__.concat(t).sort().filter(function(r,o,i){return r!==i[o-1]}).reverse(),Ba(this),this):(this.__tlds__=t.slice(),this.__tlds_replaced__=!0,Ba(this),this)};je.prototype.normalize=function(t){t.schema||(t.url=\"http://\"+t.url),t.schema===\"mailto:\"&&!/^mailto:/i.test(t.url)&&(t.url=\"mailto:\"+t.url)};je.prototype.onCompile=function(){};var $v=je;var IM=/^xn--/,TM=/[^\\0-\\x7F]/,SM=/[\\x2E\\u3002\\uFF0E\\uFF61]/g,MM={overflow:\"Overflow: input needs wider integers to process\",\"not-basic\":\"Illegal input >= 0x80 (not a basic code point)\",\"invalid-input\":\"Invalid input\"},wh=35,It=Math.floor,xh=String.fromCharCode;function _n(e){throw new RangeError(MM[e])}function AM(e,t){let n=[],r=e.length;for(;r--;)n[r]=t(e[r]);return n}function zv(e,t){let n=e.split(\"@\"),r=\"\";n.length>1&&(r=n[0]+\"@\",e=n[1]),e=e.replace(SM,\".\");let o=e.split(\".\"),i=AM(o,t).join(\".\");return r+i}function qv(e){let t=[],n=0,r=e.length;for(;n<r;){let o=e.charCodeAt(n++);if(o>=55296&&o<=56319&&n<r){let i=e.charCodeAt(n++);(i&64512)==56320?t.push(((o&1023)<<10)+(i&1023)+65536):(t.push(o),n--)}else t.push(o)}return t}var NM=e=>String.fromCodePoint(...e),kM=function(e){return e>=48&&e<58?26+(e-48):e>=65&&e<91?e-65:e>=97&&e<123?e-97:36},Uv=function(e,t){return e+22+75*(e<26)-((t!=0)<<5)},Gv=function(e,t,n){let r=0;for(e=n?It(e/700):e>>1,e+=It(e/t);e>wh*26>>1;r+=36)e=It(e/wh);return It(r+(wh+1)*e/(e+38))},Wv=function(e){let t=[],n=e.length,r=0,o=128,i=72,s=e.lastIndexOf(\"-\");s<0&&(s=0);for(let u=0;u<s;++u)e.charCodeAt(u)>=128&&_n(\"not-basic\"),t.push(e.charCodeAt(u));for(let u=s>0?s+1:0;u<n;){let a=r;for(let l=1,d=36;;d+=36){u>=n&&_n(\"invalid-input\");let h=kM(e.charCodeAt(u++));h>=36&&_n(\"invalid-input\"),h>It((2147483647-r)/l)&&_n(\"overflow\"),r+=h*l;let f=d<=i?1:d>=i+26?26:d-i;if(h<f)break;let p=36-f;l>It(2147483647/p)&&_n(\"overflow\"),l*=p}let c=t.length+1;i=Gv(r-a,c,a==0),It(r/c)>2147483647-o&&_n(\"overflow\"),o+=It(r/c),r%=c,t.splice(r++,0,o)}return String.fromCodePoint(...t)},Zv=function(e){let t=[];e=qv(e);let n=e.length,r=128,o=0,i=72;for(let a of e)a<128&&t.push(xh(a));let s=t.length,u=s;for(s&&t.push(\"-\");u<n;){let a=2147483647;for(let l of e)l>=r&&l<a&&(a=l);let c=u+1;a-r>It((2147483647-o)/c)&&_n(\"overflow\"),o+=(a-r)*c,r=a;for(let l of e)if(l<r&&++o>2147483647&&_n(\"overflow\"),l===r){let d=o;for(let h=36;;h+=36){let f=h<=i?1:h>=i+26?26:h-i;if(d<f)break;let p=d-f,m=36-f;t.push(xh(Uv(f+p%m,0))),d=It(p/m)}t.push(xh(Uv(d,0))),i=Gv(o,c,u===s),o=0,++u}++o,++r}return t.join(\"\")},RM=function(e){return zv(e,function(t){return IM.test(t)?Wv(t.slice(4).toLowerCase()):t})},FM=function(e){return zv(e,function(t){return TM.test(t)?\"xn--\"+Zv(t):t})},OM={version:\"2.3.1\",ucs2:{decode:qv,encode:NM},decode:Wv,encode:Zv,toASCII:FM,toUnicode:RM};var Ih=OM;var Yv={options:{html:!1,xhtmlOut:!1,breaks:!1,langPrefix:\"language-\",linkify:!1,typographer:!1,quotes:\"\\u201C\\u201D\\u2018\\u2019\",highlight:null,maxNesting:100},components:{core:{},block:{},inline:{}}};var Qv={options:{html:!1,xhtmlOut:!1,breaks:!1,langPrefix:\"language-\",linkify:!1,typographer:!1,quotes:\"\\u201C\\u201D\\u2018\\u2019\",highlight:null,maxNesting:20},components:{core:{rules:[\"normalize\",\"block\",\"inline\",\"text_join\"]},block:{rules:[\"paragraph\"]},inline:{rules:[\"text\"],rules2:[\"balance_pairs\",\"fragments_join\"]}}};var Kv={options:{html:!0,xhtmlOut:!0,breaks:!1,langPrefix:\"language-\",linkify:!1,typographer:!1,quotes:\"\\u201C\\u201D\\u2018\\u2019\",highlight:null,maxNesting:20},components:{core:{rules:[\"normalize\",\"block\",\"inline\",\"text_join\"]},block:{rules:[\"blockquote\",\"code\",\"fence\",\"heading\",\"hr\",\"html_block\",\"lheading\",\"list\",\"reference\",\"paragraph\"]},inline:{rules:[\"autolink\",\"backticks\",\"emphasis\",\"entity\",\"escape\",\"html_inline\",\"image\",\"link\",\"newline\",\"text\"],rules2:[\"balance_pairs\",\"emphasis\",\"fragments_join\"]}}};var PM={default:Yv,zero:Qv,commonmark:Kv},LM=/^(vbscript|javascript|file|data):/,jM=/^data:image\\/(gif|png|jpeg|webp);/;function BM(e){let t=e.trim().toLowerCase();return LM.test(t)?jM.test(t):!0}var Jv=[\"http:\",\"https:\",\"mailto:\"];function VM(e){let t=ki(e,!0);if(t.hostname&&(!t.protocol||Jv.indexOf(t.protocol)>=0))try{t.hostname=Ih.toASCII(t.hostname)}catch(n){}return xa(lo(t))}function HM(e){let t=ki(e,!0);if(t.hostname&&(!t.protocol||Jv.indexOf(t.protocol)>=0))try{t.hostname=Ih.toUnicode(t.hostname)}catch(n){}return Ni(lo(t),Ni.defaultChars+\"%\")}function Ge(e,t){if(!(this instanceof Ge))return new Ge(e,t);t||Fa(e)||(t=e||{},e=\"default\"),this.inline=new Lv,this.block=new kv,this.core=new Cv,this.renderer=new mv,this.linkify=new $v,this.validateLink=BM,this.normalizeLink=VM,this.normalizeLinkText=HM,this.utils=Rp,this.helpers=po({},Lp),this.options={},this.configure(e),t&&this.set(t)}Ge.prototype.set=function(e){return po(this.options,e),this};Ge.prototype.configure=function(e){let t=this;if(Fa(e)){let n=e;if(e=PM[n],!e)throw new Error('Wrong `markdown-it` preset \"'+n+'\", check name')}if(!e)throw new Error(\"Wrong `markdown-it` preset, can't be empty\");return e.options&&t.set(e.options),e.components&&Object.keys(e.components).forEach(function(n){e.components[n].rules&&t[n].ruler.enableOnly(e.components[n].rules),e.components[n].rules2&&t[n].ruler2.enableOnly(e.components[n].rules2)}),this};Ge.prototype.enable=function(e,t){let n=[];Array.isArray(e)||(e=[e]),[\"core\",\"block\",\"inline\"].forEach(function(o){n=n.concat(this[o].ruler.enable(e,!0))},this),n=n.concat(this.inline.ruler2.enable(e,!0));let r=e.filter(function(o){return n.indexOf(o)<0});if(r.length&&!t)throw new Error(\"MarkdownIt. Failed to enable unknown rule(s): \"+r);return this};Ge.prototype.disable=function(e,t){let n=[];Array.isArray(e)||(e=[e]),[\"core\",\"block\",\"inline\"].forEach(function(o){n=n.concat(this[o].ruler.disable(e,!0))},this),n=n.concat(this.inline.ruler2.disable(e,!0));let r=e.filter(function(o){return n.indexOf(o)<0});if(r.length&&!t)throw new Error(\"MarkdownIt. Failed to disable unknown rule(s): \"+r);return this};Ge.prototype.use=function(e){let t=[this].concat(Array.prototype.slice.call(arguments,1));return e.apply(e,t),this};Ge.prototype.parse=function(e,t){if(typeof e!=\"string\")throw new Error(\"Input data should be a String\");let n=new this.core.State(e,this,t);return this.core.process(n),n.tokens};Ge.prototype.render=function(e,t){return t=t||{},this.renderer.render(this.parse(e,t),this.options,t)};Ge.prototype.parseInline=function(e,t){let n=new this.core.State(e,this,t);return n.inlineMode=!0,this.core.process(n),n.tokens};Ge.prototype.renderInline=function(e,t){return t=t||{},this.renderer.render(this.parseInline(e,t),this.options,t)};var Th=Ge;function $M(e,t){if(e&1&&Xr(0,0),e&2){let n=t.$implicit,r=yi();Kr(\"surfaceId\",r.surfaceId())(\"component\",n)}}function UM(e,t){if(e&1&&Xr(0,0),e&2){let n=t.$implicit,r=yi();Kr(\"surfaceId\",r.surfaceId())(\"component\",n)}}function zM(e,t){if(e&1&&Xr(0,0),e&2){yi();let n=Wu(0),r=Wu(1);Kr(\"surfaceId\",n)(\"component\",r.componentTree)}}var qM=new x(\"Catalog\"),GM=(()=>{class e extends m1.A2uiMessageProcessor{events=new ce;setData(n,r,o,i){return super.setData(n,r,o,i??void 0)}dispatch(n){let r=new ce;return this.events.next({message:n,completion:r}),ac(r)}static \\u0275fac=(()=>{let n;return function(o){return(n||(n=tr(e)))(o||e)}})();static \\u0275prov=T({token:e,factory:e.\\u0275fac,providedIn:\"root\"})}return e})(),WM=new x(\"Theme\"),ZM=0,Sh=(()=>{class e{processor=b(GM);theme=b(WM);surfaceId=Ae.required();component=Ae.required();weight=Ae.required();sendAction(n){let r=this.component(),o=this.surfaceId()??void 0,i={};if(n.context){for(let u of n.context)if(u.value.literalBoolean)i[u.key]=u.value.literalBoolean;else if(u.value.literalNumber)i[u.key]=u.value.literalNumber;else if(u.value.literalString)i[u.key]=u.value.literalString;else if(u.value.path){let a=this.processor.resolvePath(u.value.path,r.dataContextPath),c=this.processor.getData(r,a,o);i[u.key]=c}}let s={userAction:{name:n.name,sourceComponentId:r.id,surfaceId:o,timestamp:new Date().toISOString(),context:i}};return this.processor.dispatch(s)}resolvePrimitive(n){let r=this.component(),o=this.surfaceId();return!n||typeof n!=\"object\"?null:n.literal!=null?n.literal:n.path?this.processor.getData(r,n.path,o??void 0):\"literalString\"in n?n.literalString:\"literalNumber\"in n?n.literalNumber:\"literalBoolean\"in n?n.literalBoolean:null}getUniqueId(n){return`${n}-${ZM++}`}static \\u0275fac=function(r){return new(r||e)};static \\u0275dir=st({type:e,hostVars:2,hostBindings:function(r,o){r&2&&zu(\"--weight\",o.weight())},inputs:{surfaceId:[1,\"surfaceId\"],component:[1,\"component\"],weight:[1,\"weight\"]}})}return e})(),Mh=(()=>{class e{viewContainerRef=b(it);catalog=b(qM);static hasInsertedStyles=!1;currentRef=null;isDestroyed=!1;surfaceId=Ae.required();component=Ae.required();constructor(){Yo(()=>{let o=this.surfaceId(),i=this.component();De(()=>this.render(o,i))});let n=b(nr),r=b(K);if(!e.hasInsertedStyles&&S1(n)){let o=r.createElement(\"style\");o.textContent=ro.structuralStyles,r.head.appendChild(o),e.hasInsertedStyles=!0}}ngOnDestroy(){this.isDestroyed=!0,this.clear()}render(n,r){return lt(this,null,function*(){let o=this.catalog[r.type],i=null,s=null;if(typeof o==\"function\"?i=yield o():typeof o==\"object\"&&(i=yield o.type(),s=o.bindings(r)),this.clear(),i&&!this.isDestroyed){let u=[U(\"surfaceId\",()=>n),U(\"component\",()=>r),U(\"weight\",()=>r.weight??\"initial\")];s&&u.push(...s),this.currentRef=this.viewContainerRef.createComponent(i,{bindings:u,injector:this.viewContainerRef.injector})}})}clear(){this.currentRef?.destroy(),this.currentRef=null}static \\u0275fac=function(r){return new(r||e)};static \\u0275dir=st({type:e,selectors:[[\"ng-container\",\"a2ui-renderer\",\"\"]],inputs:{surfaceId:[1,\"surfaceId\"],component:[1,\"component\"]}})}return e})();var YM=(()=>{class e extends Sh{alignment=Ae(\"stretch\");distribution=Ae(\"start\");classes=Se(()=>P(M({},this.theme.components.Row),{[`align-${this.alignment()}`]:!0,[`distribute-${this.distribution()}`]:!0}));static \\u0275fac=(()=>{let n;return function(o){return(n||(n=tr(e)))(o||e)}})();static \\u0275cmp=Zr({type:e,selectors:[[\"a2ui-row\"]],hostVars:2,hostBindings:function(r,o){r&2&&ju(\"alignment\",o.alignment())(\"distribution\",o.distribution())},inputs:{alignment:[1,\"alignment\"],distribution:[1,\"distribution\"]},features:[Yr],decls:3,vars:4,consts:[[\"a2ui-renderer\",\"\",3,\"surfaceId\",\"component\"]],template:function(r,o){r&1&&(Xn(0,\"section\"),Vu(1,$M,1,2,\"ng-container\",0,Bu),Jr()),r&2&&(eo(o.theme.additionalStyles==null?null:o.theme.additionalStyles.Row),bi(o.classes()),Wr(),Hu(o.component().properties.children))},dependencies:[Mh],styles:[\"[_nghost-%COMP%]{display:flex;flex:var(--weight)}section[_ngcontent-%COMP%]{display:flex;flex-direction:row;width:100%;min-height:100%;box-sizing:border-box}.align-start[_ngcontent-%COMP%]{align-items:start}.align-center[_ngcontent-%COMP%]{align-items:center}.align-end[_ngcontent-%COMP%]{align-items:end}.align-stretch[_ngcontent-%COMP%]{align-items:stretch}.distribute-start[_ngcontent-%COMP%]{justify-content:start}.distribute-center[_ngcontent-%COMP%]{justify-content:center}.distribute-end[_ngcontent-%COMP%]{justify-content:end}.distribute-spaceBetween[_ngcontent-%COMP%]{justify-content:space-between}.distribute-spaceAround[_ngcontent-%COMP%]{justify-content:space-around}.distribute-spaceEvenly[_ngcontent-%COMP%]{justify-content:space-evenly}\"]})}return e})(),QM=(()=>{class e extends Sh{alignment=Ae(\"stretch\");distribution=Ae(\"start\");classes=Se(()=>P(M({},this.theme.components.Column),{[`align-${this.alignment()}`]:!0,[`distribute-${this.distribution()}`]:!0}));static \\u0275fac=(()=>{let n;return function(o){return(n||(n=tr(e)))(o||e)}})();static \\u0275cmp=Zr({type:e,selectors:[[\"a2ui-column\"]],inputs:{alignment:[1,\"alignment\"],distribution:[1,\"distribution\"]},features:[Yr],decls:3,vars:4,consts:[[\"a2ui-renderer\",\"\",3,\"surfaceId\",\"component\"]],template:function(r,o){r&1&&(Xn(0,\"section\"),Vu(1,UM,1,2,\"ng-container\",0,Bu),Jr()),r&2&&(eo(o.theme.additionalStyles==null?null:o.theme.additionalStyles.Column),bi(o.classes()),Wr(),Hu(o.component().properties.children))},dependencies:[Mh],styles:[\"[_nghost-%COMP%]{display:flex;flex:var(--weight)}section[_ngcontent-%COMP%]{display:flex;flex-direction:column;min-width:100%;height:100%;box-sizing:border-box}.align-start[_ngcontent-%COMP%]{align-items:start}.align-center[_ngcontent-%COMP%]{align-items:center}.align-end[_ngcontent-%COMP%]{align-items:end}.align-stretch[_ngcontent-%COMP%]{align-items:stretch}.distribute-start[_ngcontent-%COMP%]{justify-content:start}.distribute-center[_ngcontent-%COMP%]{justify-content:center}.distribute-end[_ngcontent-%COMP%]{justify-content:end}.distribute-spaceBetween[_ngcontent-%COMP%]{justify-content:space-between}.distribute-spaceAround[_ngcontent-%COMP%]{justify-content:space-around}.distribute-spaceEvenly[_ngcontent-%COMP%]{justify-content:space-evenly}\"]})}return e})(),KM=(()=>{class e{originalClassMap=new Map;sanitizer=b(wp);markdownIt=Th({highlight:(n,r)=>{if(r===\"html\"){let o=document.createElement(\"iframe\");return o.classList.add(\"html-view\"),o.srcdoc=n,o.sandbox=\"\",o.innerHTML}return n}});render(n,r){r&&this.applyTagClassMap(r);let o=this.markdownIt.render(n);return this.unapplyTagClassMap(),this.sanitizer.sanitize(Pe.HTML,o)}applyTagClassMap(n){Object.entries(n).forEach(([r,o])=>{let i;switch(r){case\"p\":i=\"paragraph\";break;case\"h1\":case\"h2\":case\"h3\":case\"h4\":case\"h5\":case\"h6\":i=\"heading\";break;case\"ul\":i=\"bullet_list\";break;case\"ol\":i=\"ordered_list\";break;case\"li\":i=\"list_item\";break;case\"a\":i=\"link\";break;case\"strong\":i=\"strong\";break;case\"em\":i=\"em\";break}if(!i)return;let s=`${i}_open`,u=this.markdownIt.renderer.rules[s];this.originalClassMap.set(s,u),this.markdownIt.renderer.rules[s]=(a,c,l,d,h)=>{let f=a[c];for(let p of o)f.attrJoin(\"class\",p);return u?u.call(this,a,c,l,d,h):h.renderToken(a,c,l)}})}unapplyTagClassMap(){for(let[n,r]of this.originalClassMap)this.markdownIt.renderer.rules[n]=r;this.originalClassMap.clear()}static \\u0275fac=function(r){return new(r||e)};static \\u0275prov=T({token:e,factory:e.\\u0275fac,providedIn:\"root\"})}return e})(),JM=(()=>{class e extends Sh{markdownRenderer=b(KM);text=Ae.required();usageHint=Ae.required();resolvedText=Se(()=>{let n=this.usageHint(),r=super.resolvePrimitive(this.text());if(r==null)return\"(empty)\";switch(n){case\"h1\":r=`# ${r}`;break;case\"h2\":r=`## ${r}`;break;case\"h3\":r=`### ${r}`;break;case\"h4\":r=`#### ${r}`;break;case\"h5\":r=`##### ${r}`;break;case\"caption\":r=`*${r}*`;break;default:r=String(r);break}return this.markdownRenderer.render(r,ro.appendToAll(this.theme.markdown,[\"ol\",\"ul\",\"li\"],{}))});classes=Se(()=>{let n=this.usageHint();return ro.merge(this.theme.components.Text.all,n?this.theme.components.Text[n]:{})});additionalStyles=Se(()=>{let n=this.usageHint(),r=this.theme.additionalStyles?.Text;if(!r)return null;let o={};return this.areHintedStyles(r)?o=r[n??\"body\"]:o=r,o});areHintedStyles(n){return typeof n!=\"object\"||!n||Array.isArray(n)?!1:[\"h1\",\"h2\",\"h3\",\"h4\",\"h5\",\"h6\",\"caption\",\"body\"].every(o=>o in n)}static \\u0275fac=(()=>{let n;return function(o){return(n||(n=tr(e)))(o||e)}})();static \\u0275cmp=Zr({type:e,selectors:[[\"a2ui-text\"]],inputs:{text:[1,\"text\"],usageHint:[1,\"usageHint\"]},features:[Yr],decls:1,vars:5,consts:[[3,\"innerHTML\"]],template:function(r,o){r&1&&$u(0,\"section\",0),r&2&&(eo(o.additionalStyles()),bi(o.classes()),Uu(\"innerHTML\",o.resolvedText(),Ed))},styles:[`a2ui-text{display:block;flex:var(--weight)}a2ui-text h1,a2ui-text h2,a2ui-text h3,a2ui-text h4,a2ui-text h5{line-height:inherit;font:inherit}\n`],encapsulation:2})}return e})(),$q={Row:{type:()=>YM,bindings:e=>{let t=e.properties;return[U(\"alignment\",()=>t.alignment??\"stretch\"),U(\"distribution\",()=>t.distribution??\"start\")]}},Column:{type:()=>QM,bindings:e=>{let t=e.properties;return[U(\"alignment\",()=>t.alignment??\"stretch\"),U(\"distribution\",()=>t.distribution??\"start\")]}},List:{type:()=>import(\"./chunk-JOTH6MSK.js\").then(e=>e.List),bindings:e=>{let t=e.properties;return[U(\"direction\",()=>t.direction??\"vertical\")]}},Card:()=>import(\"./chunk-2FK4DXD6.js\").then(e=>e.Card),Image:{type:()=>import(\"./chunk-BWOBGCSA.js\").then(e=>e.Image),bindings:e=>{let t=e.properties;return[U(\"url\",()=>t.url),U(\"usageHint\",()=>t.usageHint)]}},Icon:{type:()=>import(\"./chunk-4ZK7FQPX.js\").then(e=>e.Icon),bindings:e=>{let t=e.properties;return[U(\"name\",()=>t.name)]}},Video:{type:()=>import(\"./chunk-POBF2O3Z.js\").then(e=>e.Video),bindings:e=>{let t=e.properties;return[U(\"url\",()=>t.url)]}},AudioPlayer:{type:()=>import(\"./chunk-QZL3KUOO.js\").then(e=>e.Audio),bindings:e=>{let t=e.properties;return[U(\"url\",()=>t.url)]}},Text:{type:()=>JM,bindings:e=>{let t=e.properties;return[U(\"text\",()=>t.text),U(\"usageHint\",()=>t.usageHint||null)]}},Button:{type:()=>import(\"./chunk-ABUNXR7C.js\").then(e=>e.Button),bindings:e=>{let t=e.properties;return[U(\"action\",()=>t.action)]}},Divider:()=>import(\"./chunk-C7MGZAFQ.js\").then(e=>e.Divider),MultipleChoice:{type:()=>import(\"./chunk-YQ6GIDJJ.js\").then(e=>e.MultipleChoice),bindings:e=>{let t=e.properties;return[U(\"options\",()=>t.options||[]),U(\"value\",()=>t.selections),U(\"description\",()=>\"Select an item\")]}},TextField:{type:()=>import(\"./chunk-KPALJACC.js\").then(e=>e.TextField),bindings:e=>{let t=e.properties;return[U(\"text\",()=>t.text??null),U(\"label\",()=>t.label),U(\"inputType\",()=>t.type)]}},DateTimeInput:{type:()=>import(\"./chunk-JFJZPIJV.js\").then(e=>e.DatetimeInput),bindings:e=>{let t=e.properties;return[U(\"enableDate\",()=>t.enableDate),U(\"enableTime\",()=>t.enableTime),U(\"value\",()=>t.value)]}},CheckBox:{type:()=>import(\"./chunk-QWN7CXIU.js\").then(e=>e.Checkbox),bindings:e=>{let t=e.properties;return[U(\"label\",()=>t.label),U(\"value\",()=>t.value)]}},Slider:{type:()=>import(\"./chunk-CZPJTTNC.js\").then(e=>e.Slider),bindings:e=>{let t=e.properties;return[U(\"value\",()=>t.value),U(\"minValue\",()=>t.minValue),U(\"maxValue\",()=>t.maxValue),U(\"label\",()=>\"\")]}},Tabs:{type:()=>import(\"./chunk-R2V2IE5A.js\").then(e=>e.Tabs),bindings:e=>{let t=e.properties;return[U(\"tabs\",()=>t.tabItems)]}},Modal:{type:()=>import(\"./chunk-P66EZ4FO.js\").then(e=>e.Modal),bindings:()=>[]}},Uq=(()=>{class e{surfaceId=Ae.required();surface=Ae.required();styles=Se(()=>{let n=this.surface(),r={};if(n?.styles)for(let[o,i]of Object.entries(n.styles))switch(o){case\"primaryColor\":{r[\"--p-100\"]=\"#ffffff\",r[\"--p-99\"]=`color-mix(in srgb, ${i} 2%, white 98%)`,r[\"--p-98\"]=`color-mix(in srgb, ${i} 4%, white 96%)`,r[\"--p-95\"]=`color-mix(in srgb, ${i} 10%, white 90%)`,r[\"--p-90\"]=`color-mix(in srgb, ${i} 20%, white 80%)`,r[\"--p-80\"]=`color-mix(in srgb, ${i} 40%, white 60%)`,r[\"--p-70\"]=`color-mix(in srgb, ${i} 60%, white 40%)`,r[\"--p-60\"]=`color-mix(in srgb, ${i} 80%, white 20%)`,r[\"--p-50\"]=i,r[\"--p-40\"]=`color-mix(in srgb, ${i} 80%, black 20%)`,r[\"--p-35\"]=`color-mix(in srgb, ${i} 70%, black 30%)`,r[\"--p-30\"]=`color-mix(in srgb, ${i} 60%, black 40%)`,r[\"--p-25\"]=`color-mix(in srgb, ${i} 50%, black 50%)`,r[\"--p-20\"]=`color-mix(in srgb, ${i} 40%, black 60%)`,r[\"--p-15\"]=`color-mix(in srgb, ${i} 30%, black 70%)`,r[\"--p-10\"]=`color-mix(in srgb, ${i} 20%, black 80%)`,r[\"--p-5\"]=`color-mix(in srgb, ${i} 10%, black 90%)`,r[\"--0\"]=\"#00000\";break}case\"font\":{r[\"--font-family\"]=i,r[\"--font-family-flex\"]=i;break}}return r});static \\u0275fac=function(r){return new(r||e)};static \\u0275cmp=Zr({type:e,selectors:[[\"a2ui-surface\"]],hostVars:2,hostBindings:function(r,o){r&2&&eo(o.styles())},inputs:{surfaceId:[1,\"surfaceId\"],surface:[1,\"surface\"]},decls:3,vars:3,consts:[[\"a2ui-renderer\",\"\",3,\"surfaceId\",\"component\"]],template:function(r,o){if(r&1&&(qu(0)(1),Jd(2,zM,1,2,\"ng-container\",0)),r&2){let i=Gu(o.surfaceId());Wr();let s=Gu(o.surface());Wr(),ef(i&&s?2:-1)}},dependencies:[Mh],styles:[\"[_nghost-%COMP%]{display:flex;min-height:0;max-height:100%;flex-direction:column;gap:16px}\"]})}return e})();export{X as a,Mn as b,dD as c,B as d,rc as e,ce as f,zi as g,Co as h,wo as i,yD as j,_r as k,bD as l,Mt as m,tk as n,To as o,pt as p,us as q,ID as r,TD as s,Nn as t,ac as u,Ce as v,OD as w,At as x,So as y,ls as z,LD as A,jD as B,cc as C,lc as D,qD as E,GD as F,rn as G,ZD as H,YD as I,dc as J,fc as K,p0 as L,pc as M,QD as N,g0 as O,ds as P,XD as Q,eE as R,y0 as S,fs as T,b0 as U,v0 as V,D0 as W,ps as X,tE as Y,nE as Z,E0 as _,rE as $,C as aa,mt as ba,_s as ca,T as da,yt as ea,uE as fa,x as ga,A as ha,b as ia,B0 as ja,we as ka,Nr as la,TE as ma,J0 as na,X0 as oa,lg as pa,dg as qa,fe as ra,K as sa,Fe as ta,Gn as ua,Nt as va,be as wa,Be as xa,Pt as ya,pn as za,Yo as Aa,mu as Ba,tr as Ca,jt as Da,tu as Ea,yu as Fa,nr as Ga,vC as Ha,vu as Ia,Nm as Ja,Pe as Ka,Ed as La,QC as Ma,KC as Na,JC as Oa,Wr as Pa,Ct as Qa,y_ as Ra,mn as Sa,Jn as Ta,pi as Ua,oe as Va,mw as Wa,it as Xa,bn as Ya,Hy as Za,$y as _a,Zr as $a,Ht as ab,st as bb,ax as cb,Yr as db,Wy as eb,Zy as fb,Yy as gb,Wd as hb,gi as ib,Dx as jb,Jy as kb,Qr as lb,tb as mb,ju as nb,Cx as ob,Jd as pb,Xd as qb,ef as rb,wx as sb,Bu as tb,Vu as ub,Hu as vb,Kr as wb,Xn as xb,Jr as yb,nb as zb,tf as Ab,nf as Bb,$u as Cb,rf as Db,of as Eb,Xr as Fb,Ax as Gb,Uu as Hb,ib as Ib,sb as Jb,yi as Kb,Rx as Lb,Fx as Mb,ab as Nb,cb as Ob,Px as Pb,Lx as Qb,lb as Rb,db as Sb,jx as Tb,Bx as Ub,zu as Vb,mb as Wb,eo as Xb,bi as Yb,aI as Zb,wb as _b,sf as $b,xb as ac,Ib as bc,Tb as cc,pI as dc,Sb as ec,qu as fc,Gu as gc,Wu as hc,hI as ic,bI as jc,vI as kc,DI as lc,EI as mc,CI as nc,wI as oc,xI as pc,II as qc,TI as rc,Yu as sc,De as tc,Se as uc,AI as vc,ff as wc,Vb as xc,gB as yc,mB as zc,Ae as Ac,yB as Bc,bB as Cc,vB as Dc,_f as Ec,wf as Fc,i2 as Gc,s2 as Hc,EB as Ic,CB as Jc,_B as Kc,ro as Lc,_t as Mc,H2 as Nc,so as Oc,E1 as Pc,C1 as Qc,q2 as Rc,G2 as Sc,W2 as Tc,T1 as Uc,Y2 as Vc,Q2 as Wc,K2 as Xc,tT as Yc,rT as Zc,up as _c,S1 as $c,QV as ad,mp as bd,yT as cd,wT as dd,Y1 as ed,GT as fd,p$ as gd,wp as hd,qM as id,GM as jd,WM as kd,Sh as ld,Mh as md,$q as nd,Uq as od};\n"
  },
  {
    "path": "cmd/launcher/web/webui/distr/chunk-ABUNXR7C.js",
    "content": "import{$a as r,Ac as h,Ca as o,Fb as u,Ib as p,Pa as a,Xb as m,Yb as f,db as c,ld as y,md as g,wb as s,xb as l,yb as d}from\"./chunk-7TJPJFPQ.js\";import\"./chunk-W7GRJBO5.js\";var _=(()=>{class n extends y{action=h.required();handleClick(){let t=this.action();t&&super.sendAction(t)}static \\u0275fac=(()=>{let t;return function(e){return(t||(t=o(n)))(e||n)}})();static \\u0275cmp=r({type:n,selectors:[[\"a2ui-button\"]],inputs:{action:[1,\"action\"]},features:[c],decls:2,vars:6,consts:[[3,\"click\"],[\"a2ui-renderer\",\"\",3,\"surfaceId\",\"component\"]],template:function(i,e){i&1&&(l(0,\"button\",0),p(\"click\",function(){return e.handleClick()}),u(1,1),d()),i&2&&(m(e.theme.additionalStyles==null?null:e.theme.additionalStyles.Button),f(e.theme.components.Button),a(),s(\"surfaceId\",e.surfaceId())(\"component\",e.component().properties.child))},dependencies:[g],styles:[\"[_nghost-%COMP%]{display:block;flex:var(--weight);min-height:0}\"]})}return n})();export{_ as Button};\n"
  },
  {
    "path": "cmd/launcher/web/webui/distr/chunk-BWOBGCSA.js",
    "content": "import{$a as m,Ab as g,Ac as r,Bb as p,Ca as a,Cb as v,Hb as h,Kb as f,Lc as D,Ma as l,Pa as o,Xb as y,Yb as x,db as d,fc as M,gc as b,hc as C,ld as I,pb as c,rb as u,uc as s}from\"./chunk-7TJPJFPQ.js\";import\"./chunk-W7GRJBO5.js\";function H(t,U){if(t&1&&(g(0,\"section\"),v(1,\"img\",1),p()),t&2){let e=f(),i=C(0);y(e.theme.additionalStyles==null?null:e.theme.additionalStyles.Image),x(e.classes()),o(),h(\"src\",i,l)}}var w=(()=>{class t extends I{url=r.required();usageHint=r.required();resolvedUrl=s(()=>this.resolvePrimitive(this.url()));classes=s(()=>{let e=this.usageHint();return D.merge(this.theme.components.Image.all,e?this.theme.components.Image[e]:{})});static \\u0275fac=(()=>{let e;return function(n){return(e||(e=a(t)))(n||t)}})();static \\u0275cmp=m({type:t,selectors:[[\"a2ui-image\"]],inputs:{url:[1,\"url\"],usageHint:[1,\"usageHint\"]},features:[d],decls:2,vars:2,consts:[[3,\"class\",\"style\"],[3,\"src\"]],template:function(i,n){if(i&1&&(M(0),c(1,H,2,5,\"section\",0)),i&2){let _=b(n.resolvedUrl());o(),u(_?1:-1)}},styles:[\"[_nghost-%COMP%]{display:block;flex:var(--weight);min-height:0;overflow:auto}img[_ngcontent-%COMP%]{display:block;width:100%;height:100%;box-sizing:border-box}\"]})}return t})();export{w as Image};\n"
  },
  {
    "path": "cmd/launcher/web/webui/distr/chunk-C7MGZAFQ.js",
    "content": "import{$a as r,Ca as o,Cb as d,Xb as l,Yb as s,db as a,ld as m}from\"./chunk-7TJPJFPQ.js\";import\"./chunk-W7GRJBO5.js\";var f=(()=>{class e extends m{static \\u0275fac=(()=>{let i;return function(t){return(i||(i=o(e)))(t||e)}})();static \\u0275cmp=r({type:e,selectors:[[\"a2ui-divider\"]],features:[a],decls:1,vars:4,template:function(n,t){n&1&&d(0,\"hr\"),n&2&&(l(t.theme.additionalStyles==null?null:t.theme.additionalStyles.Divider),s(t.theme.components.Divider))},styles:[\"[_nghost-%COMP%]{display:block;min-height:0;overflow:auto}hr[_ngcontent-%COMP%]{height:1px;background:#ccc;border:none}\"]})}return e})();export{f as Divider};\n"
  },
  {
    "path": "cmd/launcher/web/webui/distr/chunk-CZPJTTNC.js",
    "content": "import{$a as s,$b as f,Ab as r,Ac as n,Bb as u,Ca as m,Hb as d,Jb as c,Pa as l,Xb as v,Yb as o,Zb as g,db as p,ld as b,uc as h}from\"./chunk-7TJPJFPQ.js\";import\"./chunk-W7GRJBO5.js\";var M=[\"a2ui-slider\",\"\"],E=(()=>{class a extends b{value=n.required();label=n(\"\");minValue=n.required();maxValue=n.required();inputId=super.getUniqueId(\"a2ui-slider\");resolvedValue=h(()=>super.resolvePrimitive(this.value())??0);handleInput(t){let i=this.value()?.path;!(t.target instanceof HTMLInputElement)||!i||this.processor.setData(this.component(),i,t.target.valueAsNumber,this.surfaceId())}static \\u0275fac=(()=>{let t;return function(e){return(t||(t=m(a)))(e||a)}})();static \\u0275cmp=s({type:a,selectors:[[\"\",\"a2ui-slider\",\"\"]],inputs:{value:[1,\"value\"],label:[1,\"label\"],minValue:[1,\"minValue\"],maxValue:[1,\"maxValue\"]},features:[p],attrs:M,decls:4,vars:14,consts:[[3,\"for\"],[\"autocomplete\",\"off\",\"type\",\"range\",3,\"input\",\"value\",\"min\",\"max\",\"id\"]],template:function(i,e){i&1&&(r(0,\"section\")(1,\"label\",0),g(2),u(),r(3,\"input\",1),c(\"input\",function(y){return e.handleInput(y)}),u()()),i&2&&(o(e.theme.components.Slider.container),l(),o(e.theme.components.Slider.label),d(\"htmlFor\",e.inputId),l(),f(\" \",e.label(),\" \"),l(),v(e.theme.additionalStyles==null?null:e.theme.additionalStyles.Slider),o(e.theme.components.Slider.element),d(\"value\",e.resolvedValue())(\"min\",e.minValue())(\"max\",e.maxValue())(\"id\",e.inputId))},styles:[\"[_nghost-%COMP%]{display:block;flex:var(--weight)}input[_ngcontent-%COMP%]{display:block;width:100%;box-sizing:border-box}\"]})}return a})();export{E as Slider};\n"
  },
  {
    "path": "cmd/launcher/web/webui/distr/chunk-GLGRLUIJ.js",
    "content": "import\"./chunk-W7GRJBO5.js\";var O=function(l,i){if(!(l instanceof i))throw new TypeError(\"Cannot call a class as a function\")},R=(function(){function l(i,e){for(var t=0;t<e.length;t++){var r=e[t];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(i,r.key,r)}}return function(i,e,t){return e&&l(i.prototype,e),t&&l(i,t),i}})(),y=(function(){function l(i,e){var t=[],r=!0,n=!1,o=void 0;try{for(var c=i[Symbol.iterator](),a;!(r=(a=c.next()).done)&&(t.push(a.value),!(e&&t.length===e));r=!0);}catch(s){n=!0,o=s}finally{try{!r&&c.return&&c.return()}finally{if(n)throw o}}return t}return function(i,e){if(Array.isArray(i))return i;if(Symbol.iterator in Object(i))return l(i,e);throw new TypeError(\"Invalid attempt to destructure non-iterable instance\")}})();String.prototype.startsWith=String.prototype.startsWith||function(l){return this.indexOf(l)===0};String.prototype.padStart=String.prototype.padStart||function(l,i){for(var e=this;e.length<l;)e=i+e;return e};var N={cb:\"0f8ff\",tqw:\"aebd7\",q:\"-ffff\",qmrn:\"7fffd4\",zr:\"0ffff\",bg:\"5f5dc\",bsq:\"e4c4\",bck:\"---\",nch:\"ebcd\",b:\"--ff\",bvt:\"8a2be2\",brwn:\"a52a2a\",brw:\"deb887\",ctb:\"5f9ea0\",hrt:\"7fff-\",chcT:\"d2691e\",cr:\"7f50\",rnw:\"6495ed\",crns:\"8dc\",crms:\"dc143c\",cn:\"-ffff\",Db:\"--8b\",Dcn:\"-8b8b\",Dgnr:\"b8860b\",Dgr:\"a9a9a9\",Dgrn:\"-64-\",Dkhk:\"bdb76b\",Dmgn:\"8b-8b\",Dvgr:\"556b2f\",Drng:\"8c-\",Drch:\"9932cc\",Dr:\"8b--\",Dsmn:\"e9967a\",Dsgr:\"8fbc8f\",DsTb:\"483d8b\",DsTg:\"2f4f4f\",Dtrq:\"-ced1\",Dvt:\"94-d3\",ppnk:\"1493\",pskb:\"-bfff\",mgr:\"696969\",grb:\"1e90ff\",rbrc:\"b22222\",rwht:\"af0\",stg:\"228b22\",chs:\"-ff\",gnsb:\"dcdcdc\",st:\"8f8ff\",g:\"d7-\",gnr:\"daa520\",gr:\"808080\",grn:\"-8-0\",grnw:\"adff2f\",hnw:\"0fff0\",htpn:\"69b4\",nnr:\"cd5c5c\",ng:\"4b-82\",vr:\"0\",khk:\"0e68c\",vnr:\"e6e6fa\",nrb:\"0f5\",wngr:\"7cfc-\",mnch:\"acd\",Lb:\"add8e6\",Lcr:\"08080\",Lcn:\"e0ffff\",Lgnr:\"afad2\",Lgr:\"d3d3d3\",Lgrn:\"90ee90\",Lpnk:\"b6c1\",Lsmn:\"a07a\",Lsgr:\"20b2aa\",Lskb:\"87cefa\",LsTg:\"778899\",Lstb:\"b0c4de\",Lw:\"e0\",m:\"-ff-\",mgrn:\"32cd32\",nn:\"af0e6\",mgnt:\"-ff\",mrn:\"8--0\",mqm:\"66cdaa\",mmb:\"--cd\",mmrc:\"ba55d3\",mmpr:\"9370db\",msg:\"3cb371\",mmsT:\"7b68ee\",\"\":\"-fa9a\",mtr:\"48d1cc\",mmvt:\"c71585\",mnLb:\"191970\",ntc:\"5fffa\",mstr:\"e4e1\",mccs:\"e4b5\",vjw:\"dead\",nv:\"--80\",c:\"df5e6\",v:\"808-0\",vrb:\"6b8e23\",rng:\"a5-\",rngr:\"45-\",rch:\"da70d6\",pgnr:\"eee8aa\",pgrn:\"98fb98\",ptrq:\"afeeee\",pvtr:\"db7093\",ppwh:\"efd5\",pchp:\"dab9\",pr:\"cd853f\",pnk:\"c0cb\",pm:\"dda0dd\",pwrb:\"b0e0e6\",prp:\"8-080\",cc:\"663399\",r:\"--\",sbr:\"bc8f8f\",rb:\"4169e1\",sbrw:\"8b4513\",smn:\"a8072\",nbr:\"4a460\",sgrn:\"2e8b57\",ssh:\"5ee\",snn:\"a0522d\",svr:\"c0c0c0\",skb:\"87ceeb\",sTb:\"6a5acd\",sTgr:\"708090\",snw:\"afa\",n:\"-ff7f\",stb:\"4682b4\",tn:\"d2b48c\",t:\"-8080\",thst:\"d8bfd8\",tmT:\"6347\",trqs:\"40e0d0\",vt:\"ee82ee\",whT:\"5deb3\",wht:\"\",hts:\"5f5f5\",w:\"-\",wgrn:\"9acd32\"};function A(l){var i=arguments.length>1&&arguments[1]!==void 0?arguments[1]:1,e=i>0?l.toFixed(i).replace(/0+$/,\"\").replace(/\\.$/,\"\"):l.toString();return e||\"0\"}var z=(function(){function l(i,e,t,r){O(this,l);var n=this;function o(a){if(a.startsWith(\"hsl\")){var s=a.match(/([\\-\\d\\.e]+)/g).map(Number),p=y(s,4),u=p[0],f=p[1],d=p[2],b=p[3];b===void 0&&(b=1),u/=360,f/=100,d/=100,n.hsla=[u,f,d,b]}else if(a.startsWith(\"rgb\")){var m=a.match(/([\\-\\d\\.e]+)/g).map(Number),h=y(m,4),v=h[0],g=h[1],S=h[2],k=h[3];k===void 0&&(k=1),n.rgba=[v,g,S,k]}else a.startsWith(\"#\")?n.rgba=l.hexToRgb(a):n.rgba=l.nameToRgb(a)||l.hexToRgb(a)}if(i!==void 0)if(Array.isArray(i))this.rgba=i;else if(t===void 0){var c=i&&\"\"+i;c&&o(c.toLowerCase())}else this.rgba=[i,e,t,r===void 0?1:r]}return R(l,[{key:\"printRGB\",value:function(e){var t=e?this.rgba:this.rgba.slice(0,3),r=t.map(function(n,o){return A(n,o===3?3:0)});return e?\"rgba(\"+r+\")\":\"rgb(\"+r+\")\"}},{key:\"printHSL\",value:function(e){var t=[360,100,100,1],r=[\"\",\"%\",\"%\",\"\"],n=e?this.hsla:this.hsla.slice(0,3),o=n.map(function(c,a){return A(c*t[a],a===3?3:1)+r[a]});return e?\"hsla(\"+o+\")\":\"hsl(\"+o+\")\"}},{key:\"printHex\",value:function(e){var t=this.hex;return e?t:t.substring(0,7)}},{key:\"rgba\",get:function(){if(this._rgba)return this._rgba;if(!this._hsla)throw new Error(\"No color is set\");return this._rgba=l.hslToRgb(this._hsla)},set:function(e){e.length===3&&(e[3]=1),this._rgba=e,this._hsla=null}},{key:\"rgbString\",get:function(){return this.printRGB()}},{key:\"rgbaString\",get:function(){return this.printRGB(!0)}},{key:\"hsla\",get:function(){if(this._hsla)return this._hsla;if(!this._rgba)throw new Error(\"No color is set\");return this._hsla=l.rgbToHsl(this._rgba)},set:function(e){e.length===3&&(e[3]=1),this._hsla=e,this._rgba=null}},{key:\"hslString\",get:function(){return this.printHSL()}},{key:\"hslaString\",get:function(){return this.printHSL(!0)}},{key:\"hex\",get:function(){var e=this.rgba,t=e.map(function(r,n){return n<3?r.toString(16):Math.round(r*255).toString(16)});return\"#\"+t.map(function(r){return r.padStart(2,\"0\")}).join(\"\")},set:function(e){this.rgba=l.hexToRgb(e)}}],[{key:\"hexToRgb\",value:function(e){var t=(e.startsWith(\"#\")?e.slice(1):e).replace(/^(\\w{3})$/,\"$1F\").replace(/^(\\w)(\\w)(\\w)(\\w)$/,\"$1$1$2$2$3$3$4$4\").replace(/^(\\w{6})$/,\"$1FF\");if(!t.match(/^([0-9a-fA-F]{8})$/))throw new Error(\"Unknown hex color; \"+e);var r=t.match(/^(\\w\\w)(\\w\\w)(\\w\\w)(\\w\\w)$/).slice(1).map(function(n){return parseInt(n,16)});return r[3]=r[3]/255,r}},{key:\"nameToRgb\",value:function(e){var t=e.toLowerCase().replace(\"at\",\"T\").replace(/[aeiouyldf]/g,\"\").replace(\"ght\",\"L\").replace(\"rk\",\"D\").slice(-5,4),r=N[t];return r===void 0?r:l.hexToRgb(r.replace(/\\-/g,\"00\").padStart(6,\"f\"))}},{key:\"rgbToHsl\",value:function(e){var t=y(e,4),r=t[0],n=t[1],o=t[2],c=t[3];r/=255,n/=255,o/=255;var a=Math.max(r,n,o),s=Math.min(r,n,o),p=void 0,u=void 0,f=(a+s)/2;if(a===s)p=u=0;else{var d=a-s;switch(u=f>.5?d/(2-a-s):d/(a+s),a){case r:p=(n-o)/d+(n<o?6:0);break;case n:p=(o-r)/d+2;break;case o:p=(r-n)/d+4;break}p/=6}return[p,u,f,c]}},{key:\"hslToRgb\",value:function(e){var t=y(e,4),r=t[0],n=t[1],o=t[2],c=t[3],a=void 0,s=void 0,p=void 0;if(n===0)a=s=p=o;else{var u=function(h,v,g){return g<0&&(g+=1),g>1&&(g-=1),g<.16666666666666666?h+(v-h)*6*g:g<.5?v:g<.6666666666666666?h+(v-h)*(.6666666666666666-g)*6:h},f=o<.5?o*(1+n):o+n-o*n,d=2*o-f;a=u(d,f,r+1/3),s=u(d,f,r),p=u(d,f,r-1/3)}var b=[a*255,s*255,p*255].map(Math.round);return b[3]=c,b}}]),l})(),F=(function(){function l(){O(this,l),this._events=[]}return R(l,[{key:\"add\",value:function(e,t,r){e.addEventListener(t,r,!1),this._events.push({target:e,type:t,handler:r})}},{key:\"remove\",value:function(e,t,r){this._events=this._events.filter(function(n){var o=!0;return e&&e!==n.target&&(o=!1),t&&t!==n.type&&(o=!1),r&&r!==n.handler&&(o=!1),o&&l._doRemove(n.target,n.type,n.handler),!o})}},{key:\"destroy\",value:function(){this._events.forEach(function(e){return l._doRemove(e.target,e.type,e.handler)}),this._events=[]}}],[{key:\"_doRemove\",value:function(e,t,r){e.removeEventListener(t,r,!1)}}]),l})();function U(l){var i=document.createElement(\"div\");return i.innerHTML=l,i.firstElementChild}function T(l,i,e){var t=!1;function r(a,s,p){return Math.max(s,Math.min(a,p))}function n(a,s,p){if(p&&(t=!0),!!t){a.preventDefault();var u=i.getBoundingClientRect(),f=u.width,d=u.height,b=s.clientX,m=s.clientY,h=r(b-u.left,0,f),v=r(m-u.top,0,d);e(h/f,v/d)}}function o(a,s){var p=a.buttons===void 0?a.which:a.buttons;p===1?n(a,a,s):t=!1}function c(a,s){a.touches.length===1?n(a,a.touches[0],s):t=!1}l.add(i,\"mousedown\",function(a){o(a,!0)}),l.add(i,\"touchstart\",function(a){c(a,!0)}),l.add(window,\"mousemove\",o),l.add(i,\"touchmove\",c),l.add(window,\"mouseup\",function(a){t=!1}),l.add(i,\"touchend\",function(a){t=!1}),l.add(i,\"touchcancel\",function(a){t=!1})}var B=`linear-gradient(45deg, lightgrey 25%, transparent 25%, transparent 75%, lightgrey 75%) 0 0 / 2em 2em,\n                   linear-gradient(45deg, lightgrey 25%,       white 25%,       white 75%, lightgrey 75%) 1em 1em / 2em 2em`,G=360,P=\"keydown\",x=\"mousedown\",H=\"focusin\";function _(l,i){return(i||document).querySelector(l)}function M(l){l.preventDefault(),l.stopPropagation()}function D(l,i,e,t,r){l.add(i,P,function(n){e.indexOf(n.key)>=0&&(r&&M(n),t(n))})}var W=(function(){function l(i){O(this,l),this.settings={popup:\"right\",layout:\"default\",alpha:!0,editor:!0,editorFormat:\"hex\",cancelButton:!1,defaultColor:\"#0cf\"},this._events=new F,this.onChange=null,this.onDone=null,this.onOpen=null,this.onClose=null,this.setOptions(i)}return R(l,[{key:\"setOptions\",value:function(e){var t=this;if(!e)return;var r=this.settings;function n(s,p,u){for(var f in s)u&&u.indexOf(f)>=0||(p[f]=s[f])}if(e instanceof HTMLElement)r.parent=e;else{r.parent&&e.parent&&r.parent!==e.parent&&(this._events.remove(r.parent),this._popupInited=!1),n(e,r),e.onChange&&(this.onChange=e.onChange),e.onDone&&(this.onDone=e.onDone),e.onOpen&&(this.onOpen=e.onOpen),e.onClose&&(this.onClose=e.onClose);var o=e.color||e.colour;o&&this._setColor(o)}var c=r.parent;if(c&&r.popup&&!this._popupInited){var a=function(p){return t.openHandler(p)};this._events.add(c,\"click\",a),D(this._events,c,[\" \",\"Spacebar\",\"Enter\"],a),this._popupInited=!0}else e.parent&&!r.popup&&this.show()}},{key:\"openHandler\",value:function(e){if(this.show()){e&&e.preventDefault(),this.settings.parent.style.pointerEvents=\"none\";var t=e&&e.type===P?this._domEdit:this.domElement;setTimeout(function(){return t.focus()},100),this.onOpen&&this.onOpen(this.colour)}}},{key:\"closeHandler\",value:function(e){var t=e&&e.type,r=!1;if(!e)r=!0;else if(t===x||t===H){var n=(this.__containedEvent||0)+100;e.timeStamp>n&&(r=!0)}else M(e),r=!0;r&&this.hide()&&(this.settings.parent.style.pointerEvents=\"\",t!==x&&this.settings.parent.focus(),this.onClose&&this.onClose(this.colour))}},{key:\"movePopup\",value:function(e,t){this.closeHandler(),this.setOptions(e),t&&this.openHandler()}},{key:\"setColor\",value:function(e,t){this._setColor(e,{silent:t})}},{key:\"_setColor\",value:function(e,t){if(typeof e==\"string\"&&(e=e.trim()),!!e){t=t||{};var r=void 0;try{r=new z(e)}catch(o){if(t.failSilently)return;throw o}if(!this.settings.alpha){var n=r.hsla;n[3]=1,r.hsla=n}this.colour=this.color=r,this._setHSLA(null,null,null,null,t)}}},{key:\"setColour\",value:function(e,t){this.setColor(e,t)}},{key:\"show\",value:function(){var e=this.settings.parent;if(!e)return!1;if(this.domElement){var t=this._toggleDOM(!0);return this._setPosition(),t}var r=this.settings.template||'<div class=\"picker_wrapper\" tabindex=\"-1\"><div class=\"picker_arrow\"></div><div class=\"picker_hue picker_slider\"><div class=\"picker_selector\"></div></div><div class=\"picker_sl\"><div class=\"picker_selector\"></div></div><div class=\"picker_alpha picker_slider\"><div class=\"picker_selector\"></div></div><div class=\"picker_editor\"><input aria-label=\"Type a color name or hex value\"/></div><div class=\"picker_sample\"></div><div class=\"picker_done\"><button>Ok</button></div><div class=\"picker_cancel\"><button>Cancel</button></div></div>',n=U(r);return this.domElement=n,this._domH=_(\".picker_hue\",n),this._domSL=_(\".picker_sl\",n),this._domA=_(\".picker_alpha\",n),this._domEdit=_(\".picker_editor input\",n),this._domSample=_(\".picker_sample\",n),this._domOkay=_(\".picker_done button\",n),this._domCancel=_(\".picker_cancel button\",n),n.classList.add(\"layout_\"+this.settings.layout),this.settings.alpha||n.classList.add(\"no_alpha\"),this.settings.editor||n.classList.add(\"no_editor\"),this.settings.cancelButton||n.classList.add(\"no_cancel\"),this._ifPopup(function(){return n.classList.add(\"popup\")}),this._setPosition(),this.colour?this._updateUI():this._setColor(this.settings.defaultColor),this._bindEvents(),!0}},{key:\"hide\",value:function(){return this._toggleDOM(!1)}},{key:\"destroy\",value:function(){this._events.destroy(),this.domElement&&this.settings.parent.removeChild(this.domElement)}},{key:\"_bindEvents\",value:function(){var e=this,t=this,r=this.domElement,n=this._events;function o(s,p,u){n.add(s,p,u)}o(r,\"click\",function(s){return s.preventDefault()}),T(n,this._domH,function(s,p){return t._setHSLA(s)}),T(n,this._domSL,function(s,p){return t._setHSLA(null,s,1-p)}),this.settings.alpha&&T(n,this._domA,function(s,p){return t._setHSLA(null,null,null,1-p)});var c=this._domEdit;o(c,\"input\",function(s){t._setColor(this.value,{fromEditor:!0,failSilently:!0})}),o(c,\"focus\",function(s){var p=this;p.selectionStart===p.selectionEnd&&p.select()}),this._ifPopup(function(){var s=function(f){return e.closeHandler(f)};o(window,x,s),o(window,H,s),D(n,r,[\"Esc\",\"Escape\"],s);var p=function(f){e.__containedEvent=f.timeStamp};o(r,x,p),o(r,H,p),o(e._domCancel,\"click\",s)});var a=function(p){e._ifPopup(function(){return e.closeHandler(p)}),e.onDone&&e.onDone(e.colour)};o(this._domOkay,\"click\",a),D(n,r,[\"Enter\"],a)}},{key:\"_setPosition\",value:function(){var e=this.settings.parent,t=this.domElement;e!==t.parentNode&&e.appendChild(t),this._ifPopup(function(r){getComputedStyle(e).position===\"static\"&&(e.style.position=\"relative\");var n=r===!0?\"popup_right\":\"popup_\"+r;[\"popup_top\",\"popup_bottom\",\"popup_left\",\"popup_right\"].forEach(function(o){o===n?t.classList.add(o):t.classList.remove(o)}),t.classList.add(n)})}},{key:\"_setHSLA\",value:function(e,t,r,n,o){o=o||{};var c=this.colour,a=c.hsla;[e,t,r,n].forEach(function(s,p){(s||s===0)&&(a[p]=s)}),c.hsla=a,this._updateUI(o),this.onChange&&!o.silent&&this.onChange(c)}},{key:\"_updateUI\",value:function(e){if(!this.domElement)return;e=e||{};var t=this.colour,r=t.hsla,n=\"hsl(\"+r[0]*G+\", 100%, 50%)\",o=t.hslString,c=t.hslaString,a=this._domH,s=this._domSL,p=this._domA,u=_(\".picker_selector\",a),f=_(\".picker_selector\",s),d=_(\".picker_selector\",p);function b(I,C,L){C.style.left=L*100+\"%\"}function m(I,C,L){C.style.top=L*100+\"%\"}b(a,u,r[0]),this._domSL.style.backgroundColor=this._domH.style.color=n,b(s,f,r[1]),m(s,f,1-r[2]),s.style.color=o,m(p,d,1-r[3]);var h=o,v=h.replace(\"hsl\",\"hsla\").replace(\")\",\", 0)\"),g=\"linear-gradient(\"+[h,v]+\")\";if(this._domA.style.background=g+\", \"+B,!e.fromEditor){var S=this.settings.editorFormat,k=this.settings.alpha,w=void 0;switch(S){case\"rgb\":w=t.printRGB(k);break;case\"hsl\":w=t.printHSL(k);break;default:w=t.printHex(k)}this._domEdit.value=w}this._domSample.style.color=c}},{key:\"_ifPopup\",value:function(e,t){this.settings.parent&&this.settings.popup?e&&e(this.settings.popup):t&&t()}},{key:\"_toggleDOM\",value:function(e){var t=this.domElement;if(!t)return!1;var r=e?\"\":\"none\",n=t.style.display!==r;return n&&(t.style.display=r),n}}]),l})();E=document.createElement(\"style\"),E.textContent='.picker_wrapper.no_alpha .picker_alpha{display:none}.picker_wrapper.no_editor .picker_editor{position:absolute;z-index:-1;opacity:0}.picker_wrapper.no_cancel .picker_cancel{display:none}.layout_default.picker_wrapper{display:flex;flex-flow:row wrap;justify-content:space-between;align-items:stretch;font-size:10px;width:25em;padding:.5em}.layout_default.picker_wrapper input,.layout_default.picker_wrapper button{font-size:1rem}.layout_default.picker_wrapper>*{margin:.5em}.layout_default.picker_wrapper::before{content:\"\";display:block;width:100%;height:0;order:1}.layout_default .picker_slider,.layout_default .picker_selector{padding:1em}.layout_default .picker_hue{width:100%}.layout_default .picker_sl{flex:1 1 auto}.layout_default .picker_sl::before{content:\"\";display:block;padding-bottom:100%}.layout_default .picker_editor{order:1;width:6.5rem}.layout_default .picker_editor input{width:100%;height:100%}.layout_default .picker_sample{order:1;flex:1 1 auto}.layout_default .picker_done,.layout_default .picker_cancel{order:1}.picker_wrapper{box-sizing:border-box;background:#f2f2f2;box-shadow:0 0 0 1px silver;cursor:default;font-family:sans-serif;color:#444;pointer-events:auto}.picker_wrapper:focus{outline:none}.picker_wrapper button,.picker_wrapper input{box-sizing:border-box;border:none;box-shadow:0 0 0 1px silver;outline:none}.picker_wrapper button:focus,.picker_wrapper button:active,.picker_wrapper input:focus,.picker_wrapper input:active{box-shadow:0 0 2px 1px #1e90ff}.picker_wrapper button{padding:.4em .6em;cursor:pointer;background-color:#f5f5f5;background-image:linear-gradient(0deg, gainsboro, transparent)}.picker_wrapper button:active{background-image:linear-gradient(0deg, transparent, gainsboro)}.picker_wrapper button:hover{background-color:#fff}.picker_selector{position:absolute;z-index:1;display:block;-webkit-transform:translate(-50%, -50%);transform:translate(-50%, -50%);border:2px solid #fff;border-radius:100%;box-shadow:0 0 3px 1px #67b9ff;background:currentColor;cursor:pointer}.picker_slider .picker_selector{border-radius:2px}.picker_hue{position:relative;background-image:linear-gradient(90deg, red, yellow, lime, cyan, blue, magenta, red);box-shadow:0 0 0 1px silver}.picker_sl{position:relative;box-shadow:0 0 0 1px silver;background-image:linear-gradient(180deg, white, rgba(255, 255, 255, 0) 50%),linear-gradient(0deg, black, rgba(0, 0, 0, 0) 50%),linear-gradient(90deg, #808080, rgba(128, 128, 128, 0))}.picker_alpha,.picker_sample{position:relative;background:linear-gradient(45deg, lightgrey 25%, transparent 25%, transparent 75%, lightgrey 75%) 0 0/2em 2em,linear-gradient(45deg, lightgrey 25%, white 25%, white 75%, lightgrey 75%) 1em 1em/2em 2em;box-shadow:0 0 0 1px silver}.picker_alpha .picker_selector,.picker_sample .picker_selector{background:none}.picker_editor input{font-family:monospace;padding:.2em .4em}.picker_sample::before{content:\"\";position:absolute;display:block;width:100%;height:100%;background:currentColor}.picker_arrow{position:absolute;z-index:-1}.picker_wrapper.popup{position:absolute;z-index:2;margin:1.5em}.picker_wrapper.popup,.picker_wrapper.popup .picker_arrow::before,.picker_wrapper.popup .picker_arrow::after{background:#f2f2f2;box-shadow:0 0 10px 1px rgba(0,0,0,.4)}.picker_wrapper.popup .picker_arrow{width:3em;height:3em;margin:0}.picker_wrapper.popup .picker_arrow::before,.picker_wrapper.popup .picker_arrow::after{content:\"\";display:block;position:absolute;top:0;left:0;z-index:-99}.picker_wrapper.popup .picker_arrow::before{width:100%;height:100%;-webkit-transform:skew(45deg);transform:skew(45deg);-webkit-transform-origin:0 100%;transform-origin:0 100%}.picker_wrapper.popup .picker_arrow::after{width:150%;height:150%;box-shadow:none}.popup.popup_top{bottom:100%;left:0}.popup.popup_top .picker_arrow{bottom:0;left:0;-webkit-transform:rotate(-90deg);transform:rotate(-90deg)}.popup.popup_bottom{top:100%;left:0}.popup.popup_bottom .picker_arrow{top:0;left:0;-webkit-transform:rotate(90deg) scale(1, -1);transform:rotate(90deg) scale(1, -1)}.popup.popup_left{top:0;right:100%}.popup.popup_left .picker_arrow{top:0;right:0;-webkit-transform:scale(-1, 1);transform:scale(-1, 1)}.popup.popup_right{top:0;left:100%}.popup.popup_right .picker_arrow{top:0;left:0}',document.documentElement.firstElementChild.appendChild(E),W.StyleElement=E;var E;export{W as default};\n"
  },
  {
    "path": "cmd/launcher/web/webui/distr/chunk-JFJZPIJV.js",
    "content": "import{$a as f,Ab as s,Ac as l,Bb as m,Ca as g,Hb as d,Jb as y,Pa as u,Xb as T,Yb as r,Zb as I,_b as M,db as D,ld as N,nb as v,uc as o}from\"./chunk-7TJPJFPQ.js\";import\"./chunk-W7GRJBO5.js\";var S=(()=>{class i extends N{value=l.required();enableDate=l.required();enableTime=l.required();inputId=super.getUniqueId(\"a2ui-datetime-input\");inputType=o(()=>{let t=this.enableDate(),n=this.enableTime();return t&&n?\"datetime-local\":t?\"date\":n?\"time\":\"datetime-local\"});label=o(()=>{let t=this.inputType();return t===\"date\"?\"Date\":t===\"time\"?\"Time\":\"Date & Time\"});inputValue=o(()=>{let t=this.inputType(),n=super.resolvePrimitive(this.value())||\"\",e=n?new Date(n):null;if(!e||isNaN(e.getTime()))return\"\";let p=this.padNumber(e.getFullYear()),a=this.padNumber(e.getMonth()),c=this.padNumber(e.getDate()),b=this.padNumber(e.getHours()),h=this.padNumber(e.getMinutes());return t===\"date\"?`${p}-${a}-${c}`:t===\"time\"?`${b}:${h}`:`${p}-${a}-${c}T${b}:${h}`});handleInput(t){let n=this.value()?.path;!(t.target instanceof HTMLInputElement)||!n||this.processor.setData(this.component(),n,t.target.value,this.surfaceId())}padNumber(t){return t.toString().padStart(2,\"0\")}static \\u0275fac=(()=>{let t;return function(e){return(t||(t=g(i)))(e||i)}})();static \\u0275cmp=f({type:i,selectors:[[\"a2ui-datetime-input\"]],inputs:{value:[1,\"value\"],enableDate:[1,\"enableDate\"],enableTime:[1,\"enableTime\"]},features:[D],decls:4,vars:13,consts:[[3,\"for\"],[\"autocomplete\",\"off\",3,\"input\",\"id\",\"value\"]],template:function(n,e){n&1&&(s(0,\"section\")(1,\"label\",0),I(2),m(),s(3,\"input\",1),y(\"input\",function(a){return e.handleInput(a)}),m()()),n&2&&(r(e.theme.components.DateTimeInput.container),u(),r(e.theme.components.DateTimeInput.label),d(\"htmlFor\",e.inputId),u(),M(e.label()),u(),T(e.theme.additionalStyles==null?null:e.theme.additionalStyles.DateTimeInput),r(e.theme.components.DateTimeInput.element),d(\"id\",e.inputId)(\"value\",e.inputValue()),v(\"type\",e.inputType()))},styles:[\"[_nghost-%COMP%]{display:block;flex:var(--weight);min-height:0;overflow:auto}input[_ngcontent-%COMP%]{display:block;width:100%;box-sizing:border-box}\"]})}return i})();export{S as DatetimeInput};\n"
  },
  {
    "path": "cmd/launcher/web/webui/distr/chunk-JOTH6MSK.js",
    "content": "import{$a as s,Ac as _,Ca as o,Fb as u,Kb as g,Pa as r,Xb as y,Yb as C,db as c,ld as M,md as v,nb as a,tb as d,ub as l,vb as p,wb as m,xb as f,yb as h}from\"./chunk-7TJPJFPQ.js\";import\"./chunk-W7GRJBO5.js\";function O(e,x){if(e&1&&u(0,0),e&2){let n=x.$implicit,i=g();m(\"surfaceId\",i.surfaceId())(\"component\",n)}}var D=(()=>{class e extends M{direction=_(\"vertical\");static \\u0275fac=(()=>{let n;return function(t){return(n||(n=o(e)))(t||e)}})();static \\u0275cmp=s({type:e,selectors:[[\"a2ui-list\"]],hostVars:1,hostBindings:function(i,t){i&2&&a(\"direction\",t.direction())},inputs:{direction:[1,\"direction\"]},features:[c],decls:3,vars:4,consts:[[\"a2ui-renderer\",\"\",3,\"surfaceId\",\"component\"]],template:function(i,t){i&1&&(f(0,\"section\"),l(1,O,1,2,\"ng-container\",0,d),h()),i&2&&(y(t.theme.additionalStyles==null?null:t.theme.additionalStyles.List),C(t.theme.components.List),r(),p(t.component().properties.children))},dependencies:[v],styles:['[_nghost-%COMP%]{display:block;flex:var(--weight);min-height:0;overflow:auto}[direction=\"vertical\"][_nghost-%COMP%]   section[_ngcontent-%COMP%]{display:grid}[direction=\"horizontal\"][_nghost-%COMP%]   section[_ngcontent-%COMP%]{display:flex;max-width:100%;overflow-x:scroll;overflow-y:hidden;scrollbar-width:none}[direction=\"horizontal\"][_nghost-%COMP%]   section[_ngcontent-%COMP%] > [_ngcontent-%COMP%]::slotted(*){flex:1 0 fit-content;max-width:min(80%,400px)}']})}return e})();export{D as List};\n"
  },
  {
    "path": "cmd/launcher/web/webui/distr/chunk-KPALJACC.js",
    "content": "import{$a as c,Ab as l,Ac as r,Bb as d,Ca as m,Hb as p,Jb as g,Kb as h,Pa as o,Xb as x,Yb as a,Zb as y,_b as M,db as b,fc as T,gc as _,hc as C,ld as F,pb as v,rb as f,uc as s}from\"./chunk-7TJPJFPQ.js\";import\"./chunk-W7GRJBO5.js\";function P(n,D){if(n&1&&(l(0,\"label\",2),y(1),d()),n&2){let t=h(),i=C(0);a(t.theme.components.TextField.label),p(\"htmlFor\",t.inputId),o(),M(i)}}var S=(()=>{class n extends F{text=r.required();label=r.required();inputType=r.required();inputValue=s(()=>super.resolvePrimitive(this.text())||\"\");resolvedLabel=s(()=>super.resolvePrimitive(this.label()));inputId=super.getUniqueId(\"a2ui-input\");handleInput(t){let i=this.text()?.path;!(t.target instanceof HTMLInputElement)||!i||this.processor.setData(this.component(),i,t.target.value,this.surfaceId())}static \\u0275fac=(()=>{let t;return function(e){return(t||(t=m(n)))(e||n)}})();static \\u0275cmp=c({type:n,selectors:[[\"a2ui-text-field\"]],inputs:{text:[1,\"text\"],label:[1,\"label\"],inputType:[1,\"inputType\"]},features:[b],decls:4,vars:11,consts:[[3,\"for\",\"class\"],[\"autocomplete\",\"off\",\"placeholder\",\"Please enter a value\",3,\"input\",\"id\",\"value\",\"type\"],[3,\"for\"]],template:function(i,e){if(i&1&&(T(0),l(1,\"section\"),v(2,P,2,4,\"label\",0),l(3,\"input\",1),g(\"input\",function(I){return e.handleInput(I)}),d()()),i&2){let u=_(e.resolvedLabel());o(),a(e.theme.components.TextField.container),o(),f(u?2:-1),o(),x(e.theme.additionalStyles==null?null:e.theme.additionalStyles.TextField),a(e.theme.components.TextField.element),p(\"id\",e.inputId)(\"value\",e.inputValue())(\"type\",e.inputType()===\"number\"?\"number\":\"text\")}},styles:[\"[_nghost-%COMP%]{display:flex;flex:var(--weight)}section[_ngcontent-%COMP%], input[_ngcontent-%COMP%], label[_ngcontent-%COMP%]{box-sizing:border-box}input[_ngcontent-%COMP%]{display:block;width:100%}label[_ngcontent-%COMP%]{display:block;margin-bottom:4px}\"]})}return n})();export{S as TextField};\n"
  },
  {
    "path": "cmd/launcher/web/webui/distr/chunk-P66EZ4FO.js",
    "content": "import{$a as C,Aa as f,Bc as k,Fb as m,Gb as p,Ib as d,Kb as o,Pa as r,Sb as w,Tb as v,Xb as y,Yb as u,Zb as D,db as M,ld as b,md as P,na as a,oa as c,pb as x,rb as h,wb as g,xb as l,yb as s,za as _}from\"./chunk-7TJPJFPQ.js\";import\"./chunk-W7GRJBO5.js\";var V=[\"dialog\"];function S(t,E){if(t&1){let e=p();l(0,\"dialog\",2,0),d(\"click\",function(i){a(e);let O=o();return c(O.handleDialogClick(i))}),l(2,\"section\")(3,\"div\",3)(4,\"button\",2),d(\"click\",function(){a(e);let i=o();return c(i.closeDialog())}),l(5,\"span\",4),D(6,\"close\"),s()()(),m(7,5),s()()}if(t&2){let e=o();u(e.theme.components.Modal.backdrop),r(2),y(e.theme.additionalStyles==null?null:e.theme.additionalStyles.Modal),u(e.theme.components.Modal.element),r(5),g(\"surfaceId\",e.surfaceId())(\"component\",e.component().properties.contentChild)}}function T(t,E){if(t&1){let e=p();l(0,\"section\",2),d(\"click\",function(){a(e);let i=o();return c(i.showDialog.set(!0))}),m(1,5),s()}if(t&2){let e=o();r(),g(\"surfaceId\",e.surfaceId())(\"component\",e.component().properties.entryPointChild)}}var j=(()=>{class t extends b{showDialog=_(!1);dialog=k(\"dialog\");constructor(){super(),f(()=>{let e=this.dialog();e&&!e.nativeElement.open&&e.nativeElement.showModal()})}handleDialogClick(e){e.target instanceof HTMLDialogElement&&this.closeDialog()}closeDialog(){let e=this.dialog();e&&(e.nativeElement.open||e.nativeElement.close(),this.showDialog.set(!1))}static \\u0275fac=function(n){return new(n||t)};static \\u0275cmp=C({type:t,selectors:[[\"a2ui-modal\"]],viewQuery:function(n,i){n&1&&w(i.dialog,V,5),n&2&&v()},features:[M],decls:2,vars:1,consts:[[\"dialog\",\"\"],[3,\"class\"],[3,\"click\"],[1,\"controls\"],[1,\"g-icon\"],[\"a2ui-renderer\",\"\",3,\"surfaceId\",\"component\"]],template:function(n,i){n&1&&x(0,S,8,8,\"dialog\",1)(1,T,2,2,\"section\"),n&2&&h(i.showDialog()?0:1)},dependencies:[P],styles:[\"dialog[_ngcontent-%COMP%]{padding:0;border:none;background:none}dialog[_ngcontent-%COMP%]   section[_ngcontent-%COMP%]   .controls[_ngcontent-%COMP%]{display:flex;justify-content:end;margin-bottom:4px}dialog[_ngcontent-%COMP%]   section[_ngcontent-%COMP%]   .controls[_ngcontent-%COMP%]   button[_ngcontent-%COMP%]{padding:0;background:none;width:20px;height:20px;pointer:cursor;border:none;cursor:pointer}\"]})}return t})();export{j as Modal};\n"
  },
  {
    "path": "cmd/launcher/web/webui/distr/chunk-POBF2O3Z.js",
    "content": "import{$a as d,Ab as m,Ac as _,Bb as u,Ca as r,Cb as p,Hb as v,Kb as f,Ma as l,Pa as n,Xb as y,Yb as g,db as s,fc as h,gc as x,hc as C,ld as b,pb as a,rb as c,uc as M}from\"./chunk-7TJPJFPQ.js\";import\"./chunk-W7GRJBO5.js\";function U(e,V){if(e&1&&(m(0,\"section\"),p(1,\"video\",1),u()),e&2){let t=f(),i=C(0);y(t.theme.additionalStyles==null?null:t.theme.additionalStyles.Video),g(t.theme.components.Video),n(),v(\"src\",i,l)}}var L=(()=>{class e extends b{url=_.required();resolvedUrl=M(()=>this.resolvePrimitive(this.url()));static \\u0275fac=(()=>{let t;return function(o){return(t||(t=r(e)))(o||e)}})();static \\u0275cmp=d({type:e,selectors:[[\"a2ui-video\"]],inputs:{url:[1,\"url\"]},features:[s],decls:2,vars:2,consts:[[3,\"class\",\"style\"],[\"controls\",\"\",3,\"src\"]],template:function(i,o){if(i&1&&(h(0),a(1,U,2,5,\"section\",0)),i&2){let D=x(o.resolvedUrl());n(),c(D?1:-1)}},styles:[\"[_nghost-%COMP%]{display:block;flex:var(--weight);min-height:0;overflow:auto}video[_ngcontent-%COMP%]{display:block;width:100%;box-sizing:border-box}\"]})}return e})();export{L as Video};\n"
  },
  {
    "path": "cmd/launcher/web/webui/distr/chunk-QWN7CXIU.js",
    "content": "import{$a as p,Ab as l,Ac as c,Bb as r,Ca as m,Hb as d,Jb as h,Pa as o,Xb as v,Yb as a,Zb as g,_b as b,db as u,ld as f,uc as s}from\"./chunk-7TJPJFPQ.js\";import\"./chunk-W7GRJBO5.js\";var E=(()=>{class i extends f{value=c.required();label=c.required();inputChecked=s(()=>super.resolvePrimitive(this.value())??!1);resolvedLabel=s(()=>super.resolvePrimitive(this.label()));inputId=super.getUniqueId(\"a2ui-checkbox\");handleChange(t){let n=this.value()?.path;!(t.target instanceof HTMLInputElement)||!n||this.processor.setData(this.component(),n,t.target.checked,this.surfaceId())}static \\u0275fac=(()=>{let t;return function(e){return(t||(t=m(i)))(e||i)}})();static \\u0275cmp=p({type:i,selectors:[[\"a2ui-checkbox\"]],inputs:{value:[1,\"value\"],label:[1,\"label\"]},features:[u],decls:4,vars:12,consts:[[\"autocomplete\",\"off\",\"type\",\"checkbox\",3,\"change\",\"id\",\"checked\"],[3,\"htmlFor\"]],template:function(n,e){n&1&&(l(0,\"section\")(1,\"input\",0),h(\"change\",function(k){return e.handleChange(k)}),r(),l(2,\"label\",1),g(3),r()()),n&2&&(v(e.theme.additionalStyles==null?null:e.theme.additionalStyles.CheckBox),a(e.theme.components.CheckBox.container),o(),a(e.theme.components.CheckBox.element),d(\"id\",e.inputId)(\"checked\",e.inputChecked()),o(),a(e.theme.components.CheckBox.label),d(\"htmlFor\",e.inputId),o(),b(e.resolvedLabel()))},styles:[\"[_nghost-%COMP%]{display:block;flex:var(--weight);min-height:0;overflow:auto}input[_ngcontent-%COMP%]{display:block;width:100%}\"]})}return i})();export{E as Checkbox};\n"
  },
  {
    "path": "cmd/launcher/web/webui/distr/chunk-QZL3KUOO.js",
    "content": "import{$a as l,Ab as c,Ac as M,Bb as u,Ca as r,Cb as m,Hb as p,Kb as v,Pa as n,Xb as f,Yb as y,db as d,fc as g,gc as h,hc as x,ld as _,pb as a,rb as s,uc as C}from\"./chunk-7TJPJFPQ.js\";import\"./chunk-W7GRJBO5.js\";function D(e,P){if(e&1&&(c(0,\"section\"),m(1,\"audio\",1),u()),e&2){let t=v(),o=x(0);f(t.theme.additionalStyles==null?null:t.theme.additionalStyles.AudioPlayer),y(t.theme.components.AudioPlayer),n(),p(\"src\",o)}}var w=(()=>{class e extends _{url=M.required();resolvedUrl=C(()=>this.resolvePrimitive(this.url()));static \\u0275fac=(()=>{let t;return function(i){return(t||(t=r(e)))(i||e)}})();static \\u0275cmp=l({type:e,selectors:[[\"a2ui-audio\"]],inputs:{url:[1,\"url\"]},features:[d],decls:2,vars:2,consts:[[3,\"class\",\"style\"],[\"controls\",\"\",3,\"src\"]],template:function(o,i){if(o&1&&(g(0),a(1,D,2,5,\"section\",0)),o&2){let b=h(i.resolvedUrl());n(),s(b?1:-1)}},styles:[\"[_nghost-%COMP%]{display:block;flex:var(--weight);min-height:0;overflow:auto}audio[_ngcontent-%COMP%]{display:block;width:100%;box-sizing:border-box}\"]})}return e})();export{w as Audio};\n"
  },
  {
    "path": "cmd/launcher/web/webui/distr/chunk-R2V2IE5A.js",
    "content": "import{$a as f,$b as D,Ac as w,Ca as _,Fb as I,Gb as g,Ib as T,Kb as c,Lc as E,Pa as a,Xb as C,Yb as r,Zb as M,db as h,fc as F,gc as k,hc as S,ld as L,md as N,na as p,oa as u,tb as x,ub as v,uc as $,vb as y,wb as d,xb as l,yb as o,za as b}from\"./chunk-7TJPJFPQ.js\";import\"./chunk-W7GRJBO5.js\";function B(n,m){if(n&1){let t=g();l(0,\"button\",2),T(\"click\",function(){let e=p(t).$index,i=c();return u(i.selectedIndex.set(e))}),M(1),o()}if(n&2){let t=m.$implicit,s=m.$index,e=c(),i=S(0);r(e.buttonClasses()[i]),d(\"disabled\",i===s),a(),D(\" \",e.resolvePrimitive(t.title),\" \")}}var z=(()=>{class n extends L{selectedIndex=b(0);tabs=w.required();buttonClasses=$(()=>{let t=this.selectedIndex();return this.tabs().map((s,e)=>e===t?E.merge(this.theme.components.Tabs.controls.all,this.theme.components.Tabs.controls.selected):this.theme.components.Tabs.controls.all)});static \\u0275fac=(()=>{let t;return function(e){return(t||(t=_(n)))(e||n)}})();static \\u0275cmp=f({type:n,selectors:[[\"a2ui-tabs\"]],inputs:{tabs:[1,\"tabs\"]},features:[h],decls:6,vars:9,consts:[[3,\"disabled\",\"class\"],[\"a2ui-renderer\",\"\",3,\"surfaceId\",\"component\"],[3,\"click\",\"disabled\"]],template:function(s,e){if(s&1&&(F(0),l(1,\"section\")(2,\"div\"),v(3,B,2,4,\"button\",0,x),o(),I(5,1),o()),s&2){let i=e.tabs(),V=k(e.selectedIndex());a(),C(e.theme.additionalStyles==null?null:e.theme.additionalStyles.Tabs),r(e.theme.components.Tabs.container),a(),r(e.theme.components.Tabs.element),a(),y(i),a(2),d(\"surfaceId\",e.surfaceId())(\"component\",i[V].child)}},dependencies:[N],styles:[\"[_nghost-%COMP%]{display:block;flex:var(--weight)}\"]})}return n})();export{z as Tabs};\n"
  },
  {
    "path": "cmd/launcher/web/webui/distr/chunk-W7GRJBO5.js",
    "content": "var q=Object.create;var k=Object.defineProperty,r=Object.defineProperties,s=Object.getOwnPropertyDescriptor,t=Object.getOwnPropertyDescriptors,u=Object.getOwnPropertyNames,j=Object.getOwnPropertySymbols,v=Object.getPrototypeOf,n=Object.prototype.hasOwnProperty,p=Object.prototype.propertyIsEnumerable;var m=(b,a)=>(a=Symbol[b])?a:Symbol.for(\"Symbol.\"+b),w=b=>{throw TypeError(b)};var o=(b,a,c)=>a in b?k(b,a,{enumerable:!0,configurable:!0,writable:!0,value:c}):b[a]=c,z=(b,a)=>{for(var c in a||={})n.call(a,c)&&o(b,c,a[c]);if(j)for(var c of j(a))p.call(a,c)&&o(b,c,a[c]);return b},A=(b,a)=>r(b,t(a));var B=(b,a)=>{var c={};for(var d in b)n.call(b,d)&&a.indexOf(d)<0&&(c[d]=b[d]);if(b!=null&&j)for(var d of j(b))a.indexOf(d)<0&&p.call(b,d)&&(c[d]=b[d]);return c};var C=(b,a)=>()=>(a||b((a={exports:{}}).exports,a),a.exports),D=(b,a)=>{for(var c in a)k(b,c,{get:a[c],enumerable:!0})},x=(b,a,c,d)=>{if(a&&typeof a==\"object\"||typeof a==\"function\")for(let e of u(a))!n.call(b,e)&&e!==c&&k(b,e,{get:()=>a[e],enumerable:!(d=s(a,e))||d.enumerable});return b};var E=(b,a,c)=>(c=b!=null?q(v(b)):{},x(a||!b||!b.__esModule?k(c,\"default\",{value:b,enumerable:!0}):c,b));var F=(b,a,c)=>new Promise((d,e)=>{var f=g=>{try{i(c.next(g))}catch(l){e(l)}},h=g=>{try{i(c.throw(g))}catch(l){e(l)}},i=g=>g.done?d(g.value):Promise.resolve(g.value).then(f,h);i((c=c.apply(b,a)).next())}),y=function(b,a){this[0]=b,this[1]=a};var G=b=>{var a=b[m(\"asyncIterator\")],c=!1,d,e={};return a==null?(a=b[m(\"iterator\")](),d=f=>e[f]=h=>a[f](h)):(a=a.call(b),d=f=>e[f]=h=>{if(c){if(c=!1,f===\"throw\")throw h;return h}return c=!0,{done:!1,value:new y(new Promise(i=>{var g=a[f](h);g instanceof Object||w(\"Object expected\"),i(g)}),1)}}),e[m(\"iterator\")]=()=>e,d(\"next\"),\"throw\"in a?d(\"throw\"):e.throw=f=>{throw f},\"return\"in a&&d(\"return\"),e};export{z as a,A as b,B as c,C as d,D as e,E as f,F as g,G as h};\n"
  },
  {
    "path": "cmd/launcher/web/webui/distr/chunk-YQ6GIDJJ.js",
    "content": "import{$a as h,Ab as l,Ac as c,Bb as a,Ca as m,Hb as r,Jb as M,Kb as C,Pa as n,Xb as y,Yb as s,Zb as d,_b as u,db as v,ld as b,ub as g,uc as _,vb as f}from\"./chunk-7TJPJFPQ.js\";import\"./chunk-W7GRJBO5.js\";var D=(i,p)=>p.value;function P(i,p){if(i&1&&(l(0,\"option\",2),d(1),a()),i&2){let t=p.$implicit,o=C();r(\"value\",t.value),n(),u(o.resolvePrimitive(t.label))}}var x=(()=>{class i extends b{options=c.required();value=c.required();description=c.required();selectId=super.getUniqueId(\"a2ui-multiple-choice\");selectValue=_(()=>super.resolvePrimitive(this.value()));handleChange(t){let o=this.value()?.path;!(t.target instanceof HTMLSelectElement)||!t.target.value||!o||this.processor.setData(this.component(),this.processor.resolvePath(o,this.component().dataContextPath),t.target.value)}static \\u0275fac=(()=>{let t;return function(e){return(t||(t=m(i)))(e||i)}})();static \\u0275cmp=h({type:i,selectors:[[\"a2ui-multiple-choice\"]],inputs:{options:[1,\"options\"],value:[1,\"value\"],description:[1,\"description\"]},features:[v],decls:6,vars:12,consts:[[3,\"for\"],[3,\"change\",\"id\",\"value\"],[3,\"value\"]],template:function(o,e){o&1&&(l(0,\"section\")(1,\"label\",0),d(2),a(),l(3,\"select\",1),M(\"change\",function(E){return e.handleChange(E)}),g(4,P,2,2,\"option\",2,D),a()()),o&2&&(s(e.theme.components.MultipleChoice.container),n(),s(e.theme.components.MultipleChoice.label),r(\"htmlFor\",e.selectId),n(),u(e.description()),n(),y(e.theme.additionalStyles==null?null:e.theme.additionalStyles.MultipleChoice),s(e.theme.components.MultipleChoice.element),r(\"id\",e.selectId)(\"value\",e.selectValue()),n(),f(e.options()))},styles:[\"[_nghost-%COMP%]{display:block;flex:var(--weight);min-height:0;overflow:auto}select[_ngcontent-%COMP%]{width:100%;box-sizing:border-box}\"]})}return i})();export{x as MultipleChoice};\n"
  },
  {
    "path": "cmd/launcher/web/webui/distr/index.html",
    "content": "<!doctype html>\n<!--\n Copyright 2025 Google LLC\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n     http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n-->\n<html lang=\"en\" data-beasties-container>\n<head>\n  <meta charset=\"utf-8\">\n  <title>Agent Development Kit Dev UI</title>\n  <base href=\"./\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n  <link rel=\"icon\" type=\"image/x-icon\" href=\"adk_favicon.svg\">\n  <link rel=\"preconnect\" href=\"https://fonts.googleapis.com\">\n  <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin>\n  <style>@font-face{font-family:'Google Sans';font-style:italic;font-weight:400 700;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesans/v67/4UaXrENHsxJlGDuGo1OIlL3L2JB874GPhFI9_IqmuTCajshE7g.woff2) format('woff2');unicode-range:U+0308, U+0530-058F, U+2010, U+2024, U+25CC, U+FB13-FB17;}@font-face{font-family:'Google Sans';font-style:italic;font-weight:400 700;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesans/v67/4UaXrENHsxJlGDuGo1OIlL3L2JB874GPhFI9_IqmuTCYjshE7g.woff2) format('woff2');unicode-range:U+0951-0952, U+0964-0965, U+0980-09FE, U+1CD0, U+1CD2, U+1CD5-1CD6, U+1CD8, U+1CE1, U+1CEA, U+1CED, U+1CF2, U+1CF5-1CF7, U+200C-200D, U+20B9, U+25CC, U+A8F1;}@font-face{font-family:'Google Sans';font-style:italic;font-weight:400 700;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesans/v67/4UaXrENHsxJlGDuGo1OIlL3L2JB874GPhFI9_IqmuTCljshE7g.woff2) format('woff2');unicode-range:U+02C7, U+02D8-02D9, U+02DB, U+0307, U+1400-167F, U+18B0-18F5, U+25CC, U+11AB0-11ABF;}@font-face{font-family:'Google Sans';font-style:italic;font-weight:400 700;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesans/v67/4UaXrENHsxJlGDuGo1OIlL3L2JB874GPhFI9_IqmuTCHjshE7g.woff2) format('woff2');unicode-range:U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;}@font-face{font-family:'Google Sans';font-style:italic;font-weight:400 700;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesans/v67/4UaXrENHsxJlGDuGo1OIlL3L2JB874GPhFI9_IqmuTCOjshE7g.woff2) format('woff2');unicode-range:U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;}@font-face{font-family:'Google Sans';font-style:italic;font-weight:400 700;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesans/v67/4UaXrENHsxJlGDuGo1OIlL3L2JB874GPhFI9_IqmuTCLjshE7g.woff2) format('woff2');unicode-range:U+0900-097F, U+1CD0-1CF9, U+200C-200D, U+20A8, U+20B9, U+20F0, U+25CC, U+A830-A839, U+A8E0-A8FF, U+11B00-11B09;}@font-face{font-family:'Google Sans';font-style:italic;font-weight:400 700;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesans/v67/4UaXrENHsxJlGDuGo1OIlL3L2JB874GPhFI9_IqmuTCbjshE7g.woff2) format('woff2');unicode-range:U+030E, U+1200-1399, U+2D80-2DDE, U+AB01-AB2E, U+1E7E0-1E7E6, U+1E7E8-1E7EB, U+1E7ED-1E7EE, U+1E7F0-1E7FE;}@font-face{font-family:'Google Sans';font-style:italic;font-weight:400 700;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesans/v67/4UaXrENHsxJlGDuGo1OIlL3L2JB874GPhFI9_IqmuTCVjshE7g.woff2) format('woff2');unicode-range:U+0589, U+10A0-10FF, U+1C90-1CBA, U+1CBD-1CBF, U+205A, U+2D00-2D2F, U+2E31;}@font-face{font-family:'Google Sans';font-style:italic;font-weight:400 700;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesans/v67/4UaXrENHsxJlGDuGo1OIlL3L2JB874GPhFI9_IqmuTCGjshE7g.woff2) format('woff2');unicode-range:U+1F00-1FFF;}@font-face{font-family:'Google Sans';font-style:italic;font-weight:400 700;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesans/v67/4UaXrENHsxJlGDuGo1OIlL3L2JB874GPhFI9_IqmuTCJjshE7g.woff2) format('woff2');unicode-range:U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;}@font-face{font-family:'Google Sans';font-style:italic;font-weight:400 700;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesans/v67/4UaXrENHsxJlGDuGo1OIlL3L2JB874GPhFI9_IqmuTCRjshE7g.woff2) format('woff2');unicode-range:U+0951-0952, U+0964-0965, U+0A80-0AFF, U+200C-200D, U+20B9, U+25CC, U+A830-A839;}@font-face{font-family:'Google Sans';font-style:italic;font-weight:400 700;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesans/v67/4UaXrENHsxJlGDuGo1OIlL3L2JB874GPhFI9_IqmuTCpjshE7g.woff2) format('woff2');unicode-range:U+0951-0952, U+0964-0965, U+0A01-0A76, U+200C-200D, U+20B9, U+25CC, U+262C, U+A830-A839;}@font-face{font-family:'Google Sans';font-style:italic;font-weight:400 700;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesans/v67/4UaXrENHsxJlGDuGo1OIlL3L2JB874GPhFI9_IqmuTCIjshE7g.woff2) format('woff2');unicode-range:U+0307-0308, U+0590-05FF, U+200C-2010, U+20AA, U+25CC, U+FB1D-FB4F;}@font-face{font-family:'Google Sans';font-style:italic;font-weight:400 700;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesans/v67/4UaXrENHsxJlGDuGo1OIlL3L2JB874GPhFI9_IqmuTCBjshE7g.woff2) format('woff2');unicode-range:U+1780-17FF, U+19E0-19FF, U+200C-200D, U+25CC;}@font-face{font-family:'Google Sans';font-style:italic;font-weight:400 700;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesans/v67/4UaXrENHsxJlGDuGo1OIlL3L2JB874GPhFI9_IqmuTCDjshE7g.woff2) format('woff2');unicode-range:U+0E81-0EDF, U+200C-200D, U+25CC;}@font-face{font-family:'Google Sans';font-style:italic;font-weight:400 700;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesans/v67/4UaXrENHsxJlGDuGo1OIlL3L2JB874GPhFI9_IqmuTCSjshE7g.woff2) format('woff2');unicode-range:U+0307, U+0323, U+0951-0952, U+0964-0965, U+0D00-0D7F, U+1CDA, U+1CF2, U+200C-200D, U+20B9, U+25CC, U+A830-A832;}@font-face{font-family:'Google Sans';font-style:italic;font-weight:400 700;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesans/v67/4UaXrENHsxJlGDuGo1OIlL3L2JB874GPhFI9_IqmuTCTjshE7g.woff2) format('woff2');unicode-range:U+0951-0952, U+0964-0965, U+0B01-0B77, U+1CDA, U+1CF2, U+200C-200D, U+20B9, U+25CC;}@font-face{font-family:'Google Sans';font-style:italic;font-weight:400 700;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesans/v67/4UaXrENHsxJlGDuGo1OIlL3L2JB874GPhFI9_IqmuTCXjshE7g.woff2) format('woff2');unicode-range:U+0964-0965, U+0D81-0DF4, U+1CF2, U+200C-200D, U+25CC, U+111E1-111F4;}@font-face{font-family:'Google Sans';font-style:italic;font-weight:400 700;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesans/v67/4UaXrENHsxJlGDuGo1OIlL3L2JB874GPhFI9_IqmuTDkjshE7g.woff2) format('woff2');unicode-range:U+0001-000C, U+000E-001F, U+007F-009F, U+20DD-20E0, U+20E2-20E4, U+2150-218F, U+2190, U+2192, U+2194-2199, U+21AF, U+21E6-21F0, U+21F3, U+2218-2219, U+2299, U+22C4-22C6, U+2300-243F, U+2440-244A, U+2460-24FF, U+25A0-27BF, U+2800-28FF, U+2921-2922, U+2981, U+29BF, U+29EB, U+2B00-2BFF, U+4DC0-4DFF, U+FFF9-FFFB, U+10140-1018E, U+10190-1019C, U+101A0, U+101D0-101FD, U+102E0-102FB, U+10E60-10E7E, U+1D2C0-1D2D3, U+1D2E0-1D37F, U+1F000-1F0FF, U+1F100-1F1AD, U+1F1E6-1F1FF, U+1F30D-1F30F, U+1F315, U+1F31C, U+1F31E, U+1F320-1F32C, U+1F336, U+1F378, U+1F37D, U+1F382, U+1F393-1F39F, U+1F3A7-1F3A8, U+1F3AC-1F3AF, U+1F3C2, U+1F3C4-1F3C6, U+1F3CA-1F3CE, U+1F3D4-1F3E0, U+1F3ED, U+1F3F1-1F3F3, U+1F3F5-1F3F7, U+1F408, U+1F415, U+1F41F, U+1F426, U+1F43F, U+1F441-1F442, U+1F444, U+1F446-1F449, U+1F44C-1F44E, U+1F453, U+1F46A, U+1F47D, U+1F4A3, U+1F4B0, U+1F4B3, U+1F4B9, U+1F4BB, U+1F4BF, U+1F4C8-1F4CB, U+1F4D6, U+1F4DA, U+1F4DF, U+1F4E3-1F4E6, U+1F4EA-1F4ED, U+1F4F7, U+1F4F9-1F4FB, U+1F4FD-1F4FE, U+1F503, U+1F507-1F50B, U+1F50D, U+1F512-1F513, U+1F53E-1F54A, U+1F54F-1F5FA, U+1F610, U+1F650-1F67F, U+1F687, U+1F68D, U+1F691, U+1F694, U+1F698, U+1F6AD, U+1F6B2, U+1F6B9-1F6BA, U+1F6BC, U+1F6C6-1F6CF, U+1F6D3-1F6D7, U+1F6E0-1F6EA, U+1F6F0-1F6F3, U+1F6F7-1F6FC, U+1F700-1F7FF, U+1F800-1F80B, U+1F810-1F847, U+1F850-1F859, U+1F860-1F887, U+1F890-1F8AD, U+1F8B0-1F8BB, U+1F8C0-1F8C1, U+1F900-1F90B, U+1F93B, U+1F946, U+1F984, U+1F996, U+1F9E9, U+1FA00-1FA6F, U+1FA70-1FA7C, U+1FA80-1FA89, U+1FA8F-1FAC6, U+1FACE-1FADC, U+1FADF-1FAE9, U+1FAF0-1FAF8, U+1FB00-1FBFF;}@font-face{font-family:'Google Sans';font-style:italic;font-weight:400 700;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesans/v67/4UaXrENHsxJlGDuGo1OIlL3L2JB874GPhFI9_IqmuTCcjshE7g.woff2) format('woff2');unicode-range:U+0964-0965, U+0B82-0BFA, U+200C-200D, U+20B9, U+25CC;}@font-face{font-family:'Google Sans';font-style:italic;font-weight:400 700;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesans/v67/4UaXrENHsxJlGDuGo1OIlL3L2JB874GPhFI9_IqmuTCWjshE7g.woff2) format('woff2');unicode-range:U+0951-0952, U+0964-0965, U+0C00-0C7F, U+1CDA, U+1CF2, U+200C-200D, U+25CC;}@font-face{font-family:'Google Sans';font-style:italic;font-weight:400 700;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesans/v67/4UaXrENHsxJlGDuGo1OIlL3L2JB874GPhFI9_IqmuTCejshE7g.woff2) format('woff2');unicode-range:U+02D7, U+0303, U+0331, U+0E01-0E5B, U+200C-200D, U+25CC;}@font-face{font-family:'Google Sans';font-style:italic;font-weight:400 700;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesans/v67/4UaXrENHsxJlGDuGo1OIlL3L2JB874GPhFI9_IqmuTCFjshE7g.woff2) format('woff2');unicode-range:U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;}@font-face{font-family:'Google Sans';font-style:italic;font-weight:400 700;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesans/v67/4UaXrENHsxJlGDuGo1OIlL3L2JB874GPhFI9_IqmuTCEjshE7g.woff2) format('woff2');unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;}@font-face{font-family:'Google Sans';font-style:italic;font-weight:400 700;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesans/v67/4UaXrENHsxJlGDuGo1OIlL3L2JB874GPhFI9_IqmuTCKjsg.woff2) format('woff2');unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:400 700;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesans/v67/4UaRrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iq2rgCIlsw.woff2) format('woff2');unicode-range:U+0308, U+0530-058F, U+2010, U+2024, U+25CC, U+FB13-FB17;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:400 700;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesans/v67/4UaRrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iq2rACIlsw.woff2) format('woff2');unicode-range:U+0951-0952, U+0964-0965, U+0980-09FE, U+1CD0, U+1CD2, U+1CD5-1CD6, U+1CD8, U+1CE1, U+1CEA, U+1CED, U+1CF2, U+1CF5-1CF7, U+200C-200D, U+20B9, U+25CC, U+A8F1;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:400 700;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesans/v67/4UaRrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iq2kQCIlsw.woff2) format('woff2');unicode-range:U+02C7, U+02D8-02D9, U+02DB, U+0307, U+1400-167F, U+18B0-18F5, U+25CC, U+11AB0-11ABF;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:400 700;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesans/v67/4UaRrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iq2swCIlsw.woff2) format('woff2');unicode-range:U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:400 700;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesans/v67/4UaRrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iq2ugCIlsw.woff2) format('woff2');unicode-range:U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:400 700;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesans/v67/4UaRrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iq2vwCIlsw.woff2) format('woff2');unicode-range:U+0900-097F, U+1CD0-1CF9, U+200C-200D, U+20A8, U+20B9, U+20F0, U+25CC, U+A830-A839, U+A8E0-A8FF, U+11B00-11B09;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:400 700;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesans/v67/4UaRrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iq2rwCIlsw.woff2) format('woff2');unicode-range:U+030E, U+1200-1399, U+2D80-2DDE, U+AB01-AB2E, U+1E7E0-1E7E6, U+1E7E8-1E7EB, U+1E7ED-1E7EE, U+1E7F0-1E7FE;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:400 700;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesans/v67/4UaRrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iq2oQCIlsw.woff2) format('woff2');unicode-range:U+0589, U+10A0-10FF, U+1C90-1CBA, U+1CBD-1CBF, U+205A, U+2D00-2D2F, U+2E31;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:400 700;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesans/v67/4UaRrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iq2sgCIlsw.woff2) format('woff2');unicode-range:U+1F00-1FFF;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:400 700;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesans/v67/4UaRrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iq2vQCIlsw.woff2) format('woff2');unicode-range:U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:400 700;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesans/v67/4UaRrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iq2pQCIlsw.woff2) format('woff2');unicode-range:U+0951-0952, U+0964-0965, U+0A80-0AFF, U+200C-200D, U+20B9, U+25CC, U+A830-A839;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:400 700;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesans/v67/4UaRrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iq2nQCIlsw.woff2) format('woff2');unicode-range:U+0951-0952, U+0964-0965, U+0A01-0A76, U+200C-200D, U+20B9, U+25CC, U+262C, U+A830-A839;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:400 700;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesans/v67/4UaRrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iq2vACIlsw.woff2) format('woff2');unicode-range:U+0307-0308, U+0590-05FF, U+200C-2010, U+20AA, U+25CC, U+FB1D-FB4F;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:400 700;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesans/v67/4UaRrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iq2tQCIlsw.woff2) format('woff2');unicode-range:U+1780-17FF, U+19E0-19FF, U+200C-200D, U+25CC;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:400 700;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesans/v67/4UaRrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iq2twCIlsw.woff2) format('woff2');unicode-range:U+0E81-0EDF, U+200C-200D, U+25CC;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:400 700;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesans/v67/4UaRrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iq2pgCIlsw.woff2) format('woff2');unicode-range:U+0307, U+0323, U+0951-0952, U+0964-0965, U+0D00-0D7F, U+1CDA, U+1CF2, U+200C-200D, U+20B9, U+25CC, U+A830-A832;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:400 700;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesans/v67/4UaRrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iq2pwCIlsw.woff2) format('woff2');unicode-range:U+0951-0952, U+0964-0965, U+0B01-0B77, U+1CDA, U+1CF2, U+200C-200D, U+20B9, U+25CC;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:400 700;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesans/v67/4UaRrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iq2owCIlsw.woff2) format('woff2');unicode-range:U+0964-0965, U+0D81-0DF4, U+1CF2, U+200C-200D, U+25CC, U+111E1-111F4;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:400 700;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesans/v67/4UaRrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iq20ACIlsw.woff2) format('woff2');unicode-range:U+0001-000C, U+000E-001F, U+007F-009F, U+20DD-20E0, U+20E2-20E4, U+2150-218F, U+2190, U+2192, U+2194-2199, U+21AF, U+21E6-21F0, U+21F3, U+2218-2219, U+2299, U+22C4-22C6, U+2300-243F, U+2440-244A, U+2460-24FF, U+25A0-27BF, U+2800-28FF, U+2921-2922, U+2981, U+29BF, U+29EB, U+2B00-2BFF, U+4DC0-4DFF, U+FFF9-FFFB, U+10140-1018E, U+10190-1019C, U+101A0, U+101D0-101FD, U+102E0-102FB, U+10E60-10E7E, U+1D2C0-1D2D3, U+1D2E0-1D37F, U+1F000-1F0FF, U+1F100-1F1AD, U+1F1E6-1F1FF, U+1F30D-1F30F, U+1F315, U+1F31C, U+1F31E, U+1F320-1F32C, U+1F336, U+1F378, U+1F37D, U+1F382, U+1F393-1F39F, U+1F3A7-1F3A8, U+1F3AC-1F3AF, U+1F3C2, U+1F3C4-1F3C6, U+1F3CA-1F3CE, U+1F3D4-1F3E0, U+1F3ED, U+1F3F1-1F3F3, U+1F3F5-1F3F7, U+1F408, U+1F415, U+1F41F, U+1F426, U+1F43F, U+1F441-1F442, U+1F444, U+1F446-1F449, U+1F44C-1F44E, U+1F453, U+1F46A, U+1F47D, U+1F4A3, U+1F4B0, U+1F4B3, U+1F4B9, U+1F4BB, U+1F4BF, U+1F4C8-1F4CB, U+1F4D6, U+1F4DA, U+1F4DF, U+1F4E3-1F4E6, U+1F4EA-1F4ED, U+1F4F7, U+1F4F9-1F4FB, U+1F4FD-1F4FE, U+1F503, U+1F507-1F50B, U+1F50D, U+1F512-1F513, U+1F53E-1F54A, U+1F54F-1F5FA, U+1F610, U+1F650-1F67F, U+1F687, U+1F68D, U+1F691, U+1F694, U+1F698, U+1F6AD, U+1F6B2, U+1F6B9-1F6BA, U+1F6BC, U+1F6C6-1F6CF, U+1F6D3-1F6D7, U+1F6E0-1F6EA, U+1F6F0-1F6F3, U+1F6F7-1F6FC, U+1F700-1F7FF, U+1F800-1F80B, U+1F810-1F847, U+1F850-1F859, U+1F860-1F887, U+1F890-1F8AD, U+1F8B0-1F8BB, U+1F8C0-1F8C1, U+1F900-1F90B, U+1F93B, U+1F946, U+1F984, U+1F996, U+1F9E9, U+1FA00-1FA6F, U+1FA70-1FA7C, U+1FA80-1FA89, U+1FA8F-1FAC6, U+1FACE-1FADC, U+1FADF-1FAE9, U+1FAF0-1FAF8, U+1FB00-1FBFF;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:400 700;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesans/v67/4UaRrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iq2qACIlsw.woff2) format('woff2');unicode-range:U+0964-0965, U+0B82-0BFA, U+200C-200D, U+20B9, U+25CC;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:400 700;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesans/v67/4UaRrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iq2ogCIlsw.woff2) format('woff2');unicode-range:U+0951-0952, U+0964-0965, U+0C00-0C7F, U+1CDA, U+1CF2, U+200C-200D, U+25CC;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:400 700;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesans/v67/4UaRrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iq2qgCIlsw.woff2) format('woff2');unicode-range:U+02D7, U+0303, U+0331, U+0E01-0E5B, U+200C-200D, U+25CC;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:400 700;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesans/v67/4UaRrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iq2sQCIlsw.woff2) format('woff2');unicode-range:U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:400 700;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesans/v67/4UaRrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iq2sACIlsw.woff2) format('woff2');unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:400 700;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesans/v67/4UaRrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iq2vgCI.woff2) format('woff2');unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;}</style>\n  <style>@font-face{font-family:'Google Sans';font-style:italic;font-weight:400 700;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesans/v67/4UaXrENHsxJlGDuGo1OIlL3L2JB874GPhFI9_IqmuTCajshE7g.woff2) format('woff2');unicode-range:U+0308, U+0530-058F, U+2010, U+2024, U+25CC, U+FB13-FB17;}@font-face{font-family:'Google Sans';font-style:italic;font-weight:400 700;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesans/v67/4UaXrENHsxJlGDuGo1OIlL3L2JB874GPhFI9_IqmuTCYjshE7g.woff2) format('woff2');unicode-range:U+0951-0952, U+0964-0965, U+0980-09FE, U+1CD0, U+1CD2, U+1CD5-1CD6, U+1CD8, U+1CE1, U+1CEA, U+1CED, U+1CF2, U+1CF5-1CF7, U+200C-200D, U+20B9, U+25CC, U+A8F1;}@font-face{font-family:'Google Sans';font-style:italic;font-weight:400 700;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesans/v67/4UaXrENHsxJlGDuGo1OIlL3L2JB874GPhFI9_IqmuTCljshE7g.woff2) format('woff2');unicode-range:U+02C7, U+02D8-02D9, U+02DB, U+0307, U+1400-167F, U+18B0-18F5, U+25CC, U+11AB0-11ABF;}@font-face{font-family:'Google Sans';font-style:italic;font-weight:400 700;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesans/v67/4UaXrENHsxJlGDuGo1OIlL3L2JB874GPhFI9_IqmuTCHjshE7g.woff2) format('woff2');unicode-range:U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;}@font-face{font-family:'Google Sans';font-style:italic;font-weight:400 700;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesans/v67/4UaXrENHsxJlGDuGo1OIlL3L2JB874GPhFI9_IqmuTCOjshE7g.woff2) format('woff2');unicode-range:U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;}@font-face{font-family:'Google Sans';font-style:italic;font-weight:400 700;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesans/v67/4UaXrENHsxJlGDuGo1OIlL3L2JB874GPhFI9_IqmuTCLjshE7g.woff2) format('woff2');unicode-range:U+0900-097F, U+1CD0-1CF9, U+200C-200D, U+20A8, U+20B9, U+20F0, U+25CC, U+A830-A839, U+A8E0-A8FF, U+11B00-11B09;}@font-face{font-family:'Google Sans';font-style:italic;font-weight:400 700;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesans/v67/4UaXrENHsxJlGDuGo1OIlL3L2JB874GPhFI9_IqmuTCbjshE7g.woff2) format('woff2');unicode-range:U+030E, U+1200-1399, U+2D80-2DDE, U+AB01-AB2E, U+1E7E0-1E7E6, U+1E7E8-1E7EB, U+1E7ED-1E7EE, U+1E7F0-1E7FE;}@font-face{font-family:'Google Sans';font-style:italic;font-weight:400 700;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesans/v67/4UaXrENHsxJlGDuGo1OIlL3L2JB874GPhFI9_IqmuTCVjshE7g.woff2) format('woff2');unicode-range:U+0589, U+10A0-10FF, U+1C90-1CBA, U+1CBD-1CBF, U+205A, U+2D00-2D2F, U+2E31;}@font-face{font-family:'Google Sans';font-style:italic;font-weight:400 700;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesans/v67/4UaXrENHsxJlGDuGo1OIlL3L2JB874GPhFI9_IqmuTCGjshE7g.woff2) format('woff2');unicode-range:U+1F00-1FFF;}@font-face{font-family:'Google Sans';font-style:italic;font-weight:400 700;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesans/v67/4UaXrENHsxJlGDuGo1OIlL3L2JB874GPhFI9_IqmuTCJjshE7g.woff2) format('woff2');unicode-range:U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;}@font-face{font-family:'Google Sans';font-style:italic;font-weight:400 700;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesans/v67/4UaXrENHsxJlGDuGo1OIlL3L2JB874GPhFI9_IqmuTCRjshE7g.woff2) format('woff2');unicode-range:U+0951-0952, U+0964-0965, U+0A80-0AFF, U+200C-200D, U+20B9, U+25CC, U+A830-A839;}@font-face{font-family:'Google Sans';font-style:italic;font-weight:400 700;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesans/v67/4UaXrENHsxJlGDuGo1OIlL3L2JB874GPhFI9_IqmuTCpjshE7g.woff2) format('woff2');unicode-range:U+0951-0952, U+0964-0965, U+0A01-0A76, U+200C-200D, U+20B9, U+25CC, U+262C, U+A830-A839;}@font-face{font-family:'Google Sans';font-style:italic;font-weight:400 700;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesans/v67/4UaXrENHsxJlGDuGo1OIlL3L2JB874GPhFI9_IqmuTCIjshE7g.woff2) format('woff2');unicode-range:U+0307-0308, U+0590-05FF, U+200C-2010, U+20AA, U+25CC, U+FB1D-FB4F;}@font-face{font-family:'Google Sans';font-style:italic;font-weight:400 700;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesans/v67/4UaXrENHsxJlGDuGo1OIlL3L2JB874GPhFI9_IqmuTCBjshE7g.woff2) format('woff2');unicode-range:U+1780-17FF, U+19E0-19FF, U+200C-200D, U+25CC;}@font-face{font-family:'Google Sans';font-style:italic;font-weight:400 700;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesans/v67/4UaXrENHsxJlGDuGo1OIlL3L2JB874GPhFI9_IqmuTCDjshE7g.woff2) format('woff2');unicode-range:U+0E81-0EDF, U+200C-200D, U+25CC;}@font-face{font-family:'Google Sans';font-style:italic;font-weight:400 700;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesans/v67/4UaXrENHsxJlGDuGo1OIlL3L2JB874GPhFI9_IqmuTCSjshE7g.woff2) format('woff2');unicode-range:U+0307, U+0323, U+0951-0952, U+0964-0965, U+0D00-0D7F, U+1CDA, U+1CF2, U+200C-200D, U+20B9, U+25CC, U+A830-A832;}@font-face{font-family:'Google Sans';font-style:italic;font-weight:400 700;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesans/v67/4UaXrENHsxJlGDuGo1OIlL3L2JB874GPhFI9_IqmuTCTjshE7g.woff2) format('woff2');unicode-range:U+0951-0952, U+0964-0965, U+0B01-0B77, U+1CDA, U+1CF2, U+200C-200D, U+20B9, U+25CC;}@font-face{font-family:'Google Sans';font-style:italic;font-weight:400 700;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesans/v67/4UaXrENHsxJlGDuGo1OIlL3L2JB874GPhFI9_IqmuTCXjshE7g.woff2) format('woff2');unicode-range:U+0964-0965, U+0D81-0DF4, U+1CF2, U+200C-200D, U+25CC, U+111E1-111F4;}@font-face{font-family:'Google Sans';font-style:italic;font-weight:400 700;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesans/v67/4UaXrENHsxJlGDuGo1OIlL3L2JB874GPhFI9_IqmuTDkjshE7g.woff2) format('woff2');unicode-range:U+0001-000C, U+000E-001F, U+007F-009F, U+20DD-20E0, U+20E2-20E4, U+2150-218F, U+2190, U+2192, U+2194-2199, U+21AF, U+21E6-21F0, U+21F3, U+2218-2219, U+2299, U+22C4-22C6, U+2300-243F, U+2440-244A, U+2460-24FF, U+25A0-27BF, U+2800-28FF, U+2921-2922, U+2981, U+29BF, U+29EB, U+2B00-2BFF, U+4DC0-4DFF, U+FFF9-FFFB, U+10140-1018E, U+10190-1019C, U+101A0, U+101D0-101FD, U+102E0-102FB, U+10E60-10E7E, U+1D2C0-1D2D3, U+1D2E0-1D37F, U+1F000-1F0FF, U+1F100-1F1AD, U+1F1E6-1F1FF, U+1F30D-1F30F, U+1F315, U+1F31C, U+1F31E, U+1F320-1F32C, U+1F336, U+1F378, U+1F37D, U+1F382, U+1F393-1F39F, U+1F3A7-1F3A8, U+1F3AC-1F3AF, U+1F3C2, U+1F3C4-1F3C6, U+1F3CA-1F3CE, U+1F3D4-1F3E0, U+1F3ED, U+1F3F1-1F3F3, U+1F3F5-1F3F7, U+1F408, U+1F415, U+1F41F, U+1F426, U+1F43F, U+1F441-1F442, U+1F444, U+1F446-1F449, U+1F44C-1F44E, U+1F453, U+1F46A, U+1F47D, U+1F4A3, U+1F4B0, U+1F4B3, U+1F4B9, U+1F4BB, U+1F4BF, U+1F4C8-1F4CB, U+1F4D6, U+1F4DA, U+1F4DF, U+1F4E3-1F4E6, U+1F4EA-1F4ED, U+1F4F7, U+1F4F9-1F4FB, U+1F4FD-1F4FE, U+1F503, U+1F507-1F50B, U+1F50D, U+1F512-1F513, U+1F53E-1F54A, U+1F54F-1F5FA, U+1F610, U+1F650-1F67F, U+1F687, U+1F68D, U+1F691, U+1F694, U+1F698, U+1F6AD, U+1F6B2, U+1F6B9-1F6BA, U+1F6BC, U+1F6C6-1F6CF, U+1F6D3-1F6D7, U+1F6E0-1F6EA, U+1F6F0-1F6F3, U+1F6F7-1F6FC, U+1F700-1F7FF, U+1F800-1F80B, U+1F810-1F847, U+1F850-1F859, U+1F860-1F887, U+1F890-1F8AD, U+1F8B0-1F8BB, U+1F8C0-1F8C1, U+1F900-1F90B, U+1F93B, U+1F946, U+1F984, U+1F996, U+1F9E9, U+1FA00-1FA6F, U+1FA70-1FA7C, U+1FA80-1FA89, U+1FA8F-1FAC6, U+1FACE-1FADC, U+1FADF-1FAE9, U+1FAF0-1FAF8, U+1FB00-1FBFF;}@font-face{font-family:'Google Sans';font-style:italic;font-weight:400 700;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesans/v67/4UaXrENHsxJlGDuGo1OIlL3L2JB874GPhFI9_IqmuTCcjshE7g.woff2) format('woff2');unicode-range:U+0964-0965, U+0B82-0BFA, U+200C-200D, U+20B9, U+25CC;}@font-face{font-family:'Google Sans';font-style:italic;font-weight:400 700;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesans/v67/4UaXrENHsxJlGDuGo1OIlL3L2JB874GPhFI9_IqmuTCWjshE7g.woff2) format('woff2');unicode-range:U+0951-0952, U+0964-0965, U+0C00-0C7F, U+1CDA, U+1CF2, U+200C-200D, U+25CC;}@font-face{font-family:'Google Sans';font-style:italic;font-weight:400 700;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesans/v67/4UaXrENHsxJlGDuGo1OIlL3L2JB874GPhFI9_IqmuTCejshE7g.woff2) format('woff2');unicode-range:U+02D7, U+0303, U+0331, U+0E01-0E5B, U+200C-200D, U+25CC;}@font-face{font-family:'Google Sans';font-style:italic;font-weight:400 700;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesans/v67/4UaXrENHsxJlGDuGo1OIlL3L2JB874GPhFI9_IqmuTCFjshE7g.woff2) format('woff2');unicode-range:U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;}@font-face{font-family:'Google Sans';font-style:italic;font-weight:400 700;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesans/v67/4UaXrENHsxJlGDuGo1OIlL3L2JB874GPhFI9_IqmuTCEjshE7g.woff2) format('woff2');unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;}@font-face{font-family:'Google Sans';font-style:italic;font-weight:400 700;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesans/v67/4UaXrENHsxJlGDuGo1OIlL3L2JB874GPhFI9_IqmuTCKjsg.woff2) format('woff2');unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:400 700;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesans/v67/4UaRrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iq2rgCIlsw.woff2) format('woff2');unicode-range:U+0308, U+0530-058F, U+2010, U+2024, U+25CC, U+FB13-FB17;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:400 700;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesans/v67/4UaRrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iq2rACIlsw.woff2) format('woff2');unicode-range:U+0951-0952, U+0964-0965, U+0980-09FE, U+1CD0, U+1CD2, U+1CD5-1CD6, U+1CD8, U+1CE1, U+1CEA, U+1CED, U+1CF2, U+1CF5-1CF7, U+200C-200D, U+20B9, U+25CC, U+A8F1;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:400 700;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesans/v67/4UaRrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iq2kQCIlsw.woff2) format('woff2');unicode-range:U+02C7, U+02D8-02D9, U+02DB, U+0307, U+1400-167F, U+18B0-18F5, U+25CC, U+11AB0-11ABF;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:400 700;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesans/v67/4UaRrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iq2swCIlsw.woff2) format('woff2');unicode-range:U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:400 700;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesans/v67/4UaRrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iq2ugCIlsw.woff2) format('woff2');unicode-range:U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:400 700;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesans/v67/4UaRrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iq2vwCIlsw.woff2) format('woff2');unicode-range:U+0900-097F, U+1CD0-1CF9, U+200C-200D, U+20A8, U+20B9, U+20F0, U+25CC, U+A830-A839, U+A8E0-A8FF, U+11B00-11B09;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:400 700;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesans/v67/4UaRrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iq2rwCIlsw.woff2) format('woff2');unicode-range:U+030E, U+1200-1399, U+2D80-2DDE, U+AB01-AB2E, U+1E7E0-1E7E6, U+1E7E8-1E7EB, U+1E7ED-1E7EE, U+1E7F0-1E7FE;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:400 700;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesans/v67/4UaRrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iq2oQCIlsw.woff2) format('woff2');unicode-range:U+0589, U+10A0-10FF, U+1C90-1CBA, U+1CBD-1CBF, U+205A, U+2D00-2D2F, U+2E31;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:400 700;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesans/v67/4UaRrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iq2sgCIlsw.woff2) format('woff2');unicode-range:U+1F00-1FFF;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:400 700;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesans/v67/4UaRrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iq2vQCIlsw.woff2) format('woff2');unicode-range:U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:400 700;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesans/v67/4UaRrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iq2pQCIlsw.woff2) format('woff2');unicode-range:U+0951-0952, U+0964-0965, U+0A80-0AFF, U+200C-200D, U+20B9, U+25CC, U+A830-A839;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:400 700;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesans/v67/4UaRrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iq2nQCIlsw.woff2) format('woff2');unicode-range:U+0951-0952, U+0964-0965, U+0A01-0A76, U+200C-200D, U+20B9, U+25CC, U+262C, U+A830-A839;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:400 700;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesans/v67/4UaRrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iq2vACIlsw.woff2) format('woff2');unicode-range:U+0307-0308, U+0590-05FF, U+200C-2010, U+20AA, U+25CC, U+FB1D-FB4F;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:400 700;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesans/v67/4UaRrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iq2tQCIlsw.woff2) format('woff2');unicode-range:U+1780-17FF, U+19E0-19FF, U+200C-200D, U+25CC;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:400 700;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesans/v67/4UaRrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iq2twCIlsw.woff2) format('woff2');unicode-range:U+0E81-0EDF, U+200C-200D, U+25CC;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:400 700;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesans/v67/4UaRrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iq2pgCIlsw.woff2) format('woff2');unicode-range:U+0307, U+0323, U+0951-0952, U+0964-0965, U+0D00-0D7F, U+1CDA, U+1CF2, U+200C-200D, U+20B9, U+25CC, U+A830-A832;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:400 700;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesans/v67/4UaRrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iq2pwCIlsw.woff2) format('woff2');unicode-range:U+0951-0952, U+0964-0965, U+0B01-0B77, U+1CDA, U+1CF2, U+200C-200D, U+20B9, U+25CC;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:400 700;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesans/v67/4UaRrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iq2owCIlsw.woff2) format('woff2');unicode-range:U+0964-0965, U+0D81-0DF4, U+1CF2, U+200C-200D, U+25CC, U+111E1-111F4;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:400 700;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesans/v67/4UaRrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iq20ACIlsw.woff2) format('woff2');unicode-range:U+0001-000C, U+000E-001F, U+007F-009F, U+20DD-20E0, U+20E2-20E4, U+2150-218F, U+2190, U+2192, U+2194-2199, U+21AF, U+21E6-21F0, U+21F3, U+2218-2219, U+2299, U+22C4-22C6, U+2300-243F, U+2440-244A, U+2460-24FF, U+25A0-27BF, U+2800-28FF, U+2921-2922, U+2981, U+29BF, U+29EB, U+2B00-2BFF, U+4DC0-4DFF, U+FFF9-FFFB, U+10140-1018E, U+10190-1019C, U+101A0, U+101D0-101FD, U+102E0-102FB, U+10E60-10E7E, U+1D2C0-1D2D3, U+1D2E0-1D37F, U+1F000-1F0FF, U+1F100-1F1AD, U+1F1E6-1F1FF, U+1F30D-1F30F, U+1F315, U+1F31C, U+1F31E, U+1F320-1F32C, U+1F336, U+1F378, U+1F37D, U+1F382, U+1F393-1F39F, U+1F3A7-1F3A8, U+1F3AC-1F3AF, U+1F3C2, U+1F3C4-1F3C6, U+1F3CA-1F3CE, U+1F3D4-1F3E0, U+1F3ED, U+1F3F1-1F3F3, U+1F3F5-1F3F7, U+1F408, U+1F415, U+1F41F, U+1F426, U+1F43F, U+1F441-1F442, U+1F444, U+1F446-1F449, U+1F44C-1F44E, U+1F453, U+1F46A, U+1F47D, U+1F4A3, U+1F4B0, U+1F4B3, U+1F4B9, U+1F4BB, U+1F4BF, U+1F4C8-1F4CB, U+1F4D6, U+1F4DA, U+1F4DF, U+1F4E3-1F4E6, U+1F4EA-1F4ED, U+1F4F7, U+1F4F9-1F4FB, U+1F4FD-1F4FE, U+1F503, U+1F507-1F50B, U+1F50D, U+1F512-1F513, U+1F53E-1F54A, U+1F54F-1F5FA, U+1F610, U+1F650-1F67F, U+1F687, U+1F68D, U+1F691, U+1F694, U+1F698, U+1F6AD, U+1F6B2, U+1F6B9-1F6BA, U+1F6BC, U+1F6C6-1F6CF, U+1F6D3-1F6D7, U+1F6E0-1F6EA, U+1F6F0-1F6F3, U+1F6F7-1F6FC, U+1F700-1F7FF, U+1F800-1F80B, U+1F810-1F847, U+1F850-1F859, U+1F860-1F887, U+1F890-1F8AD, U+1F8B0-1F8BB, U+1F8C0-1F8C1, U+1F900-1F90B, U+1F93B, U+1F946, U+1F984, U+1F996, U+1F9E9, U+1FA00-1FA6F, U+1FA70-1FA7C, U+1FA80-1FA89, U+1FA8F-1FAC6, U+1FACE-1FADC, U+1FADF-1FAE9, U+1FAF0-1FAF8, U+1FB00-1FBFF;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:400 700;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesans/v67/4UaRrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iq2qACIlsw.woff2) format('woff2');unicode-range:U+0964-0965, U+0B82-0BFA, U+200C-200D, U+20B9, U+25CC;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:400 700;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesans/v67/4UaRrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iq2ogCIlsw.woff2) format('woff2');unicode-range:U+0951-0952, U+0964-0965, U+0C00-0C7F, U+1CDA, U+1CF2, U+200C-200D, U+25CC;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:400 700;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesans/v67/4UaRrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iq2qgCIlsw.woff2) format('woff2');unicode-range:U+02D7, U+0303, U+0331, U+0E01-0E5B, U+200C-200D, U+25CC;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:400 700;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesans/v67/4UaRrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iq2sQCIlsw.woff2) format('woff2');unicode-range:U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:400 700;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesans/v67/4UaRrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iq2sACIlsw.woff2) format('woff2');unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:400 700;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesans/v67/4UaRrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iq2vgCI.woff2) format('woff2');unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;}@font-face{font-family:'Google Sans Mono';font-style:italic;font-weight:1 1000;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesansmono/v28/P5sfzYWFYtnZ_Cg-t0Uq_rfivrdYNY1cbhrBZQI.woff2) format('woff2');unicode-range:U+0001-000C, U+000E-001F, U+007F-009F, U+20DD-20E0, U+20E2-20E4, U+2150-218F, U+2190, U+2192, U+2194-2199, U+21AF, U+21E6-21F0, U+21F3, U+2218-2219, U+2299, U+22C4-22C6, U+2300-243F, U+2440-244A, U+2460-24FF, U+25A0-27BF, U+2800-28FF, U+2921-2922, U+2981, U+29BF, U+29EB, U+2B00-2BFF, U+4DC0-4DFF, U+FFF9-FFFB, U+10140-1018E, U+10190-1019C, U+101A0, U+101D0-101FD, U+102E0-102FB, U+10E60-10E7E, U+1D2C0-1D2D3, U+1D2E0-1D37F, U+1F000-1F0FF, U+1F100-1F1AD, U+1F1E6-1F1FF, U+1F30D-1F30F, U+1F315, U+1F31C, U+1F31E, U+1F320-1F32C, U+1F336, U+1F378, U+1F37D, U+1F382, U+1F393-1F39F, U+1F3A7-1F3A8, U+1F3AC-1F3AF, U+1F3C2, U+1F3C4-1F3C6, U+1F3CA-1F3CE, U+1F3D4-1F3E0, U+1F3ED, U+1F3F1-1F3F3, U+1F3F5-1F3F7, U+1F408, U+1F415, U+1F41F, U+1F426, U+1F43F, U+1F441-1F442, U+1F444, U+1F446-1F449, U+1F44C-1F44E, U+1F453, U+1F46A, U+1F47D, U+1F4A3, U+1F4B0, U+1F4B3, U+1F4B9, U+1F4BB, U+1F4BF, U+1F4C8-1F4CB, U+1F4D6, U+1F4DA, U+1F4DF, U+1F4E3-1F4E6, U+1F4EA-1F4ED, U+1F4F7, U+1F4F9-1F4FB, U+1F4FD-1F4FE, U+1F503, U+1F507-1F50B, U+1F50D, U+1F512-1F513, U+1F53E-1F54A, U+1F54F-1F5FA, U+1F610, U+1F650-1F67F, U+1F687, U+1F68D, U+1F691, U+1F694, U+1F698, U+1F6AD, U+1F6B2, U+1F6B9-1F6BA, U+1F6BC, U+1F6C6-1F6CF, U+1F6D3-1F6D7, U+1F6E0-1F6EA, U+1F6F0-1F6F3, U+1F6F7-1F6FC, U+1F700-1F7FF, U+1F800-1F80B, U+1F810-1F847, U+1F850-1F859, U+1F860-1F887, U+1F890-1F8AD, U+1F8B0-1F8BB, U+1F8C0-1F8C1, U+1F900-1F90B, U+1F93B, U+1F946, U+1F984, U+1F996, U+1F9E9, U+1FA00-1FA6F, U+1FA70-1FA7C, U+1FA80-1FA89, U+1FA8F-1FAC6, U+1FACE-1FADC, U+1FADF-1FAE9, U+1FAF0-1FAF8, U+1FB00-1FBFF;}@font-face{font-family:'Google Sans Mono';font-style:italic;font-weight:1 1000;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesansmono/v28/P5sfzYWFYtnZ_Cg-t0Uq_rfivrdYNY1cDhrBZQI.woff2) format('woff2');unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;}@font-face{font-family:'Google Sans Mono';font-style:italic;font-weight:1 1000;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesansmono/v28/P5sfzYWFYtnZ_Cg-t0Uq_rfivrdYNY1cABrB.woff2) format('woff2');unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;}@font-face{font-family:'Google Sans Mono';font-style:normal;font-weight:1 1000;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesansmono/v28/P5sZzYWFYtnZ_Cg-t0Uq_rfivrdYNeZsAgLF.woff2) format('woff2');unicode-range:U+0001-000C, U+000E-001F, U+007F-009F, U+20DD-20E0, U+20E2-20E4, U+2150-218F, U+2190, U+2192, U+2194-2199, U+21AF, U+21E6-21F0, U+21F3, U+2218-2219, U+2299, U+22C4-22C6, U+2300-243F, U+2440-244A, U+2460-24FF, U+25A0-27BF, U+2800-28FF, U+2921-2922, U+2981, U+29BF, U+29EB, U+2B00-2BFF, U+4DC0-4DFF, U+FFF9-FFFB, U+10140-1018E, U+10190-1019C, U+101A0, U+101D0-101FD, U+102E0-102FB, U+10E60-10E7E, U+1D2C0-1D2D3, U+1D2E0-1D37F, U+1F000-1F0FF, U+1F100-1F1AD, U+1F1E6-1F1FF, U+1F30D-1F30F, U+1F315, U+1F31C, U+1F31E, U+1F320-1F32C, U+1F336, U+1F378, U+1F37D, U+1F382, U+1F393-1F39F, U+1F3A7-1F3A8, U+1F3AC-1F3AF, U+1F3C2, U+1F3C4-1F3C6, U+1F3CA-1F3CE, U+1F3D4-1F3E0, U+1F3ED, U+1F3F1-1F3F3, U+1F3F5-1F3F7, U+1F408, U+1F415, U+1F41F, U+1F426, U+1F43F, U+1F441-1F442, U+1F444, U+1F446-1F449, U+1F44C-1F44E, U+1F453, U+1F46A, U+1F47D, U+1F4A3, U+1F4B0, U+1F4B3, U+1F4B9, U+1F4BB, U+1F4BF, U+1F4C8-1F4CB, U+1F4D6, U+1F4DA, U+1F4DF, U+1F4E3-1F4E6, U+1F4EA-1F4ED, U+1F4F7, U+1F4F9-1F4FB, U+1F4FD-1F4FE, U+1F503, U+1F507-1F50B, U+1F50D, U+1F512-1F513, U+1F53E-1F54A, U+1F54F-1F5FA, U+1F610, U+1F650-1F67F, U+1F687, U+1F68D, U+1F691, U+1F694, U+1F698, U+1F6AD, U+1F6B2, U+1F6B9-1F6BA, U+1F6BC, U+1F6C6-1F6CF, U+1F6D3-1F6D7, U+1F6E0-1F6EA, U+1F6F0-1F6F3, U+1F6F7-1F6FC, U+1F700-1F7FF, U+1F800-1F80B, U+1F810-1F847, U+1F850-1F859, U+1F860-1F887, U+1F890-1F8AD, U+1F8B0-1F8BB, U+1F8C0-1F8C1, U+1F900-1F90B, U+1F93B, U+1F946, U+1F984, U+1F996, U+1F9E9, U+1FA00-1FA6F, U+1FA70-1FA7C, U+1FA80-1FA89, U+1FA8F-1FAC6, U+1FACE-1FADC, U+1FADF-1FAE9, U+1FAF0-1FAF8, U+1FB00-1FBFF;}@font-face{font-family:'Google Sans Mono';font-style:normal;font-weight:1 1000;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesansmono/v28/P5sZzYWFYtnZ_Cg-t0Uq_rfivrdYNYZsAgLF.woff2) format('woff2');unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;}@font-face{font-family:'Google Sans Mono';font-style:normal;font-weight:1 1000;font-display:swap;src:url(https://fonts.gstatic.com/s/googlesansmono/v28/P5sZzYWFYtnZ_Cg-t0Uq_rfivrdYNYhsAg.woff2) format('woff2');unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;}</style>\n  <style>@font-face{font-family:'Material Icons';font-style:normal;font-weight:400;src:url(https://fonts.gstatic.com/s/materialicons/v145/flUhRq6tzZclQEJ-Vdg-IuiaDsNc.woff2) format('woff2');}.material-icons{font-family:'Material Icons';font-weight:normal;font-style:normal;font-size:24px;line-height:1;letter-spacing:normal;text-transform:none;display:inline-block;white-space:nowrap;word-wrap:normal;direction:ltr;-webkit-font-feature-settings:'liga';-webkit-font-smoothing:antialiased;}</style>\n  <style>@font-face{font-family:'Material Symbols Outlined';font-style:normal;font-weight:400;src:url(https://fonts.gstatic.com/s/materialsymbolsoutlined/v321/kJF1BvYX7BgnkSrUwT8OhrdQw4oELdPIeeII9v6oDMzByHX9rA6RzaxHMPdY43zj-jCxv3fzvRNU22ZXGJpEpjC_1v-p_4MrImHCIJIZrDCvHOej.woff2) format('woff2');}.material-symbols-outlined{font-family:'Material Symbols Outlined';font-weight:normal;font-style:normal;font-size:24px;line-height:1;letter-spacing:normal;text-transform:none;display:inline-block;white-space:nowrap;word-wrap:normal;direction:ltr;-webkit-font-feature-settings:'liga';-webkit-font-smoothing:antialiased;}</style>\n<style>html{--mat-sys-corner-extra-large:28px;--mat-sys-corner-extra-large-top:28px 28px 0 0;--mat-sys-corner-extra-small:4px;--mat-sys-corner-extra-small-top:4px 4px 0 0;--mat-sys-corner-full:9999px;--mat-sys-corner-large:16px;--mat-sys-corner-large-end:0 16px 16px 0;--mat-sys-corner-large-start:16px 0 0 16px;--mat-sys-corner-large-top:16px 16px 0 0;--mat-sys-corner-medium:12px;--mat-sys-corner-none:0;--mat-sys-corner-small:8px;--mat-sys-dragged-state-layer-opacity:.16;--mat-sys-focus-state-layer-opacity:.12;--mat-sys-hover-state-layer-opacity:.08;--mat-sys-pressed-state-layer-opacity:.12}html{font-family:Google Sans,Helvetica Neue,sans-serif!important}body{height:100vh;margin:0}</style><link rel=\"stylesheet\" href=\"./styles-YY6V3TJU.css\" media=\"print\" onload=\"this.media='all'\"><noscript><link rel=\"stylesheet\" href=\"./styles-YY6V3TJU.css\"></noscript></head>\n<body>\n  <app-root></app-root>\n<link rel=\"modulepreload\" href=\"./chunk-7TJPJFPQ.js\"><link rel=\"modulepreload\" href=\"./chunk-W7GRJBO5.js\"><script src=\"./polyfills-5CFQRCPP.js\" type=\"module\"></script><script src=\"./main-ORIYWHAC.js\" type=\"module\"></script></body>\n</html>\n"
  },
  {
    "path": "cmd/launcher/web/webui/distr/main-ORIYWHAC.js",
    "content": "import{$ as xC,$a as kA,$b as Fe,$c as y0,A as fc,Aa as pa,Ab as ti,Ac as nt,B as cf,Ba as ei,Bb as Ii,Bc as Xo,C as mc,Ca as hi,Cb as Ni,Cc as wL,D as Cf,Da as ge,Db as ws,Dc as w0,E as Qi,Ea as Sg,Eb as ys,Ec as ft,F as iL,Fa as Bf,Fb as $i,Fc as kI,G as We,Ga as Qf,Gb as zA,Gc as he,H as nL,Ha as vI,Hb as Bo,Hc as Zi,I as yI,Ia as cL,Ib as $,Ic as yL,J as Ho,Ja as CL,Jb as pc,Jc as yf,K as qE,Ka as ul,Kb as y,Kc as vL,L as ps,La as xg,Lb as Yt,Lc as Ms,M as qn,Ma as Da,Mb as He,Mc as uv,N as VE,Na as RC,Nb as na,Nc as bL,O as hl,Oa as m0,Ob as ni,Oc as fv,P as If,Pa as p,Pb as Ce,Pc as ML,Q as po,Qa as Ef,Qb as Ie,Qc as wc,R as Bv,Ra as Nn,Rb as wf,Rc as kL,S as kC,Sa as Fn,Sb as Or,Sc as Rg,T as SC,Ta as Dr,Tb as rr,Tc as FC,U as Ds,Ua as ui,Ub as Wi,Uc as md,V as rg,Va as lt,Vb as En,Vc as yc,W as nn,Wa as hf,Wb as ae,Wc as vf,X as Ei,Xa as Ro,Xb as QL,Xc as Ng,Y as Bt,Ya as Ev,Yb as Qo,Yc as Pr,Z as oL,Za as IL,Zb as K,Zc as bf,_ as Wt,_a as uf,_b as qA,_c as oa,a as Rn,aa as wt,ab as Xe,ac as Dc,ad as mv,b as ZF,ba as aL,bb as OA,bc as EL,bd as SL,c as XF,ca as ar,cb as ff,cc as oo,cd as xL,d as Ti,da as TA,db as Ct,dc as Vn,dd as RL,e as $F,ea as Ze,eb as yt,ec as ao,ed as ks,f as $A,fa as rL,fb as mf,fc as wr,fd as NL,g as AL,ga as wA,gb as dL,gc as sg,gd as FL,h as Jt,ha as Do,hb as bI,hc as vs,hd as LC,i as El,ia as h,ib as pf,ic as MI,id as LL,j as Iv,ja as sL,jb as hv,jc as It,jd as _L,k as sf,ka as pr,kb as BL,kc as WE,kd as GL,l as Qd,la as Ya,lb as p0,lc as zr,m as xa,ma as gL,mb as Df,mc as fl,n as jE,na as rA,nb as ie,nc as oi,nd as KL,o as Ed,oa as sA,ob as ud,oc as li,od as UL,p as mr,pa as Qt,pb as V,pc as hL,q as oe,qa as Tr,qb as D0,qc as NC,r as gf,ra as ut,rb as W,rc as uL,s as hd,sa as Zt,sb as fd,sc as fL,t as eL,ta as Wa,tb as Ri,tc as Zo,u as tL,ua as lL,ub as Gt,uc as _e,v as fe,va as WA,vb as Kt,vc as mL,w as Va,wa as Oe,wb as X,wc as pL,x as uc,xa as df,xb as m,xc as bs,y as dv,ya as Qv,yb as D,yc as DL,z as lf,za as jA,zb as GA,zc as No}from\"./chunk-7TJPJFPQ.js\";import{a as BA,b as Ve,c as WF,d as Ql,f as rf,g as ct,h as le}from\"./chunk-W7GRJBO5.js\";var KY=Ql(F9=>{\"use strict\";var GY={b:\"\\b\",f:\"\\f\",n:`\n`,r:\"\\r\",t:\"\t\",'\"':'\"',\"/\":\"/\",\"\\\\\":\"\\\\\"},vCA=97;F9.parse=function(t,e,A){var i={},n=0,o=0,a=0,r=A&&A.bigint&&typeof BigInt<\"u\";return{data:s(\"\",!0),pointers:i};function s(Y,j){g();var AA;R(Y,\"value\");var z=Q();switch(z){case\"t\":B(\"rue\"),AA=!0;break;case\"f\":B(\"alse\"),AA=!1;break;case\"n\":B(\"ull\"),AA=null;break;case'\"':AA=l();break;case\"[\":AA=I(Y);break;case\"{\":AA=d(Y);break;default:E(),\"-0123456789\".indexOf(z)>=0?AA=C():F()}return R(Y,\"valueEnd\"),g(),j&&a<t.length&&F(),AA}function g(){A:for(;a<t.length;){switch(t[a]){case\" \":o++;break;case\"\t\":o+=4;break;case\"\\r\":o=0;break;case`\n`:o=0,n++;break;default:break A}a++}}function l(){for(var Y=\"\",j;j=Q(),j!='\"';)j==\"\\\\\"?(j=Q(),j in GY?Y+=GY[j]:j==\"u\"?Y+=f():G()):Y+=j;return Y}function C(){var Y=\"\",j=!0;t[a]==\"-\"&&(Y+=Q()),Y+=t[a]==\"0\"?Q():b(),t[a]==\".\"&&(Y+=Q()+b(),j=!1),(t[a]==\"e\"||t[a]==\"E\")&&(Y+=Q(),(t[a]==\"+\"||t[a]==\"-\")&&(Y+=Q()),Y+=b(),j=!1);var AA=+Y;return r&&j&&(AA>Number.MAX_SAFE_INTEGER||AA<Number.MIN_SAFE_INTEGER)?BigInt(Y):AA}function I(Y){g();var j=[],AA=0;if(Q()==\"]\")return j;for(E();;){var z=Y+\"/\"+AA;j.push(s(z)),g();var yA=Q();if(yA==\"]\")break;yA!=\",\"&&G(),g(),AA++}return j}function d(Y){g();var j={};if(Q()==\"}\")return j;for(E();;){var AA=v();Q()!='\"'&&G();var z=l(),yA=Y+\"/\"+N9(z);M(yA,\"key\",AA),R(yA,\"keyEnd\"),g(),Q()!=\":\"&&G(),g(),j[z]=s(yA),g();var P=Q();if(P==\"}\")break;P!=\",\"&&G(),g()}return j}function B(Y){for(var j=0;j<Y.length;j++)Q()!==Y[j]&&G()}function Q(){U();var Y=t[a];return a++,o++,Y}function E(){a--,o--}function f(){for(var Y=4,j=0;Y--;){j<<=4;var AA=Q().toLowerCase();AA>=\"a\"&&AA<=\"f\"?j+=AA.charCodeAt()-vCA+10:AA>=\"0\"&&AA<=\"9\"?j+=+AA:G()}return String.fromCharCode(j)}function b(){for(var Y=\"\";t[a]>=\"0\"&&t[a]<=\"9\";)Y+=Q();if(Y.length)return Y;U(),F()}function R(Y,j){M(Y,j,v())}function M(Y,j,AA){i[Y]=i[Y]||{},i[Y][j]=AA}function v(){return{line:n,column:o,pos:a}}function F(){throw new SyntaxError(\"Unexpected token \"+t[a]+\" in JSON at position \"+a)}function G(){E(),F()}function U(){if(a>=t.length)throw new SyntaxError(\"Unexpected end of JSON input\")}};F9.stringify=function(t,e,A){if(!w6(t))return;var i=0,n,o,a=typeof A==\"object\"?A.space:A;switch(typeof a){case\"number\":var r=a>10?10:a<0?0:Math.floor(a);a=r&&M(r,\" \"),n=r,o=r;break;case\"string\":a=a.slice(0,10),n=0,o=0;for(var s=0;s<a.length;s++){var g=a[s];switch(g){case\" \":o++;break;case\"\t\":o+=4;break;case\"\\r\":o=0;break;case`\n`:o=0,i++;break;default:throw new Error(\"whitespace characters not allowed in JSON\")}n++}break;default:a=void 0}var l=\"\",C={},I=0,d=0,B=0,Q=A&&A.es6&&typeof Map==\"function\";return E(t,0,\"\"),{json:l,pointers:C};function E(v,F,G){switch(R(G,\"value\"),typeof v){case\"number\":case\"bigint\":case\"boolean\":f(\"\"+v);break;case\"string\":f(y6(v));break;case\"object\":v===null?f(\"null\"):typeof v.toJSON==\"function\"?f(y6(v.toJSON())):Array.isArray(v)?U():Q?v.constructor.BYTES_PER_ELEMENT?U():v instanceof Map?j():v instanceof Set?j(!0):Y():Y()}R(G,\"valueEnd\");function U(){if(v.length){f(\"[\");for(var AA=F+1,z=0;z<v.length;z++){z&&f(\",\"),b(AA);var yA=w6(v[z])?v[z]:null,P=G+\"/\"+z;E(yA,AA,P)}b(F),f(\"]\")}else f(\"[]\")}function Y(){var AA=Object.keys(v);if(AA.length){f(\"{\");for(var z=F+1,yA=0;yA<AA.length;yA++){var P=AA[yA],nA=v[P];if(w6(nA)){yA&&f(\",\");var eA=G+\"/\"+N9(P);b(z),R(eA,\"key\"),f(y6(P)),R(eA,\"keyEnd\"),f(\":\"),a&&f(\" \"),E(nA,z,eA)}}b(F),f(\"}\")}else f(\"{}\")}function j(AA){if(v.size){f(\"{\");for(var z=F+1,yA=!0,P=v.entries(),nA=P.next();!nA.done;){var eA=nA.value,dA=eA[0],iA=AA?!0:eA[1];if(w6(iA)){yA||f(\",\"),yA=!1;var aA=G+\"/\"+N9(dA);b(z),R(aA,\"key\"),f(y6(dA)),R(aA,\"keyEnd\"),f(\":\"),a&&f(\" \"),E(iA,z,aA)}nA=P.next()}b(F),f(\"}\")}else f(\"{}\")}}function f(v){d+=v.length,B+=v.length,l+=v}function b(v){if(a){for(l+=`\n`+M(v,a),I++,d=0;v--;)i?(I+=i,d=o):d+=o,B+=n;B+=1}}function R(v,F){C[v]=C[v]||{},C[v][F]={line:I,column:d,pos:B}}function M(v,F){return Array(v+1).join(F)}};var bCA=[\"number\",\"bigint\",\"boolean\",\"string\",\"object\"];function w6(t){return bCA.indexOf(typeof t)>=0}var MCA=/\"|\\\\/g,kCA=/[\\b]/g,SCA=/\\f/g,xCA=/\\n/g,RCA=/\\r/g,NCA=/\\t/g;function y6(t){return t=t.replace(MCA,\"\\\\$&\").replace(SCA,\"\\\\f\").replace(kCA,\"\\\\b\").replace(xCA,\"\\\\n\").replace(RCA,\"\\\\r\").replace(NCA,\"\\\\t\"),'\"'+t+'\"'}var FCA=/~/g,LCA=/\\//g;function N9(t){return t.replace(FCA,\"~0\").replace(LCA,\"~1\")}});var az=Ql((c1e,oz)=>{\"use strict\";var nz=function(t,e){var A,i,n=1,o=0,a=0,r=String.alphabet;function s(g,l,C){if(C){for(A=l;C=s(g,A),C<76&&C>65;)++A;return+g.slice(l-1,A)}return C=r&&r.indexOf(g.charAt(l)),C>-1?C+76:(C=g.charCodeAt(l)||0,C<45||C>127?C:C<46?65:C<48?C-1:C<58?C+18:C<65?C-11:C<91?C+11:C<97?C-37:C<123?C+5:C-63)}if((t+=\"\")!=(e+=\"\")){for(;n;)if(i=s(t,o++),n=s(e,a++),i<76&&n<76&&i>66&&n>66&&(i=s(t,o,o),n=s(e,a,o=A),a=A),i!=n)return i<n?-1:1}return 0};try{oz.exports=nz}catch(t){String.naturalCompare=nz}});var sz=Ql(C8=>{\"use strict\";(function(t){\"use strict\";function e(J){return J!==null?Object.prototype.toString.call(J)===\"[object Array]\":!1}function A(J){return J!==null?Object.prototype.toString.call(J)===\"[object Object]\":!1}function i(J,O){if(J===O)return!0;var tA=Object.prototype.toString.call(J);if(tA!==Object.prototype.toString.call(O))return!1;if(e(J)===!0){if(J.length!==O.length)return!1;for(var oA=0;oA<J.length;oA++)if(i(J[oA],O[oA])===!1)return!1;return!0}if(A(J)===!0){var NA={};for(var de in J)if(hasOwnProperty.call(J,de)){if(i(J[de],O[de])===!1)return!1;NA[de]=!0}for(var Ee in O)if(hasOwnProperty.call(O,Ee)&&NA[Ee]!==!0)return!1;return!0}return!1}function n(J){if(J===\"\"||J===!1||J===null)return!0;if(e(J)&&J.length===0)return!0;if(A(J)){for(var O in J)if(J.hasOwnProperty(O))return!1;return!0}else return!1}function o(J){for(var O=Object.keys(J),tA=[],oA=0;oA<O.length;oA++)tA.push(J[O[oA]]);return tA}function a(J,O){var tA={};for(var oA in J)tA[oA]=J[oA];for(var NA in O)tA[NA]=O[NA];return tA}var r;typeof String.prototype.trimLeft==\"function\"?r=function(J){return J.trimLeft()}:r=function(J){return J.match(/^\\s*(.*)/)[1]};var s=0,g=1,l=2,C=3,I=4,d=5,B=6,Q=7,E=8,f=9,b={0:\"number\",1:\"any\",2:\"string\",3:\"array\",4:\"object\",5:\"boolean\",6:\"expression\",7:\"null\",8:\"Array<number>\",9:\"Array<string>\"},R=\"EOF\",M=\"UnquotedIdentifier\",v=\"QuotedIdentifier\",F=\"Rbracket\",G=\"Rparen\",U=\"Comma\",Y=\"Colon\",j=\"Rbrace\",AA=\"Number\",z=\"Current\",yA=\"Expref\",P=\"Pipe\",nA=\"Or\",eA=\"And\",dA=\"EQ\",iA=\"GT\",aA=\"LT\",hA=\"GTE\",JA=\"LTE\",ee=\"NE\",UA=\"Flatten\",mA=\"Star\",KA=\"Filter\",ze=\"Dot\",Ke=\"Not\",HA=\"Lbrace\",uA=\"Lbracket\",XA=\"Lparen\",EA=\"Literal\",ZA={\".\":ze,\"*\":mA,\",\":U,\":\":Y,\"{\":HA,\"}\":j,\"]\":F,\"(\":XA,\")\":G,\"@\":z},MA={\"<\":!0,\">\":!0,\"=\":!0,\"!\":!0},be={\" \":!0,\"\t\":!0,\"\\n\":!0};function _A(J){return J>=\"a\"&&J<=\"z\"||J>=\"A\"&&J<=\"Z\"||J===\"_\"}function pA(J){return J>=\"0\"&&J<=\"9\"||J===\"-\"}function Rt(J){return J>=\"a\"&&J<=\"z\"||J>=\"A\"&&J<=\"Z\"||J>=\"0\"&&J<=\"9\"||J===\"_\"}function Et(){}Et.prototype={tokenize:function(J){var O=[];this._current=0;for(var tA,oA,NA;this._current<J.length;)if(_A(J[this._current]))tA=this._current,oA=this._consumeUnquotedIdentifier(J),O.push({type:M,value:oA,start:tA});else if(ZA[J[this._current]]!==void 0)O.push({type:ZA[J[this._current]],value:J[this._current],start:this._current}),this._current++;else if(pA(J[this._current]))NA=this._consumeNumber(J),O.push(NA);else if(J[this._current]===\"[\")NA=this._consumeLBracket(J),O.push(NA);else if(J[this._current]==='\"')tA=this._current,oA=this._consumeQuotedIdentifier(J),O.push({type:v,value:oA,start:tA});else if(J[this._current]===\"'\")tA=this._current,oA=this._consumeRawStringLiteral(J),O.push({type:EA,value:oA,start:tA});else if(J[this._current]===\"`\"){tA=this._current;var de=this._consumeLiteral(J);O.push({type:EA,value:de,start:tA})}else if(MA[J[this._current]]!==void 0)O.push(this._consumeOperator(J));else if(be[J[this._current]]!==void 0)this._current++;else if(J[this._current]===\"&\")tA=this._current,this._current++,J[this._current]===\"&\"?(this._current++,O.push({type:eA,value:\"&&\",start:tA})):O.push({type:yA,value:\"&\",start:tA});else if(J[this._current]===\"|\")tA=this._current,this._current++,J[this._current]===\"|\"?(this._current++,O.push({type:nA,value:\"||\",start:tA})):O.push({type:P,value:\"|\",start:tA});else{var Ee=new Error(\"Unknown character:\"+J[this._current]);throw Ee.name=\"LexerError\",Ee}return O},_consumeUnquotedIdentifier:function(J){var O=this._current;for(this._current++;this._current<J.length&&Rt(J[this._current]);)this._current++;return J.slice(O,this._current)},_consumeQuotedIdentifier:function(J){var O=this._current;this._current++;for(var tA=J.length;J[this._current]!=='\"'&&this._current<tA;){var oA=this._current;J[oA]===\"\\\\\"&&(J[oA+1]===\"\\\\\"||J[oA+1]==='\"')?oA+=2:oA++,this._current=oA}return this._current++,JSON.parse(J.slice(O,this._current))},_consumeRawStringLiteral:function(J){var O=this._current;this._current++;for(var tA=J.length;J[this._current]!==\"'\"&&this._current<tA;){var oA=this._current;J[oA]===\"\\\\\"&&(J[oA+1]===\"\\\\\"||J[oA+1]===\"'\")?oA+=2:oA++,this._current=oA}this._current++;var NA=J.slice(O+1,this._current-1);return NA.replace(\"\\\\'\",\"'\")},_consumeNumber:function(J){var O=this._current;this._current++;for(var tA=J.length;pA(J[this._current])&&this._current<tA;)this._current++;var oA=parseInt(J.slice(O,this._current));return{type:AA,value:oA,start:O}},_consumeLBracket:function(J){var O=this._current;return this._current++,J[this._current]===\"?\"?(this._current++,{type:KA,value:\"[?\",start:O}):J[this._current]===\"]\"?(this._current++,{type:UA,value:\"[]\",start:O}):{type:uA,value:\"[\",start:O}},_consumeOperator:function(J){var O=this._current,tA=J[O];if(this._current++,tA===\"!\")return J[this._current]===\"=\"?(this._current++,{type:ee,value:\"!=\",start:O}):{type:Ke,value:\"!\",start:O};if(tA===\"<\")return J[this._current]===\"=\"?(this._current++,{type:JA,value:\"<=\",start:O}):{type:aA,value:\"<\",start:O};if(tA===\">\")return J[this._current]===\"=\"?(this._current++,{type:hA,value:\">=\",start:O}):{type:iA,value:\">\",start:O};if(tA===\"=\"&&J[this._current]===\"=\")return this._current++,{type:dA,value:\"==\",start:O}},_consumeLiteral:function(J){this._current++;for(var O=this._current,tA=J.length,oA;J[this._current]!==\"`\"&&this._current<tA;){var NA=this._current;J[NA]===\"\\\\\"&&(J[NA+1]===\"\\\\\"||J[NA+1]===\"`\")?NA+=2:NA++,this._current=NA}var de=r(J.slice(O,this._current));return de=de.replace(\"\\\\`\",\"`\"),this._looksLikeJSON(de)?oA=JSON.parse(de):oA=JSON.parse('\"'+de+'\"'),this._current++,oA},_looksLikeJSON:function(J){var O='[{\"',tA=[\"true\",\"false\",\"null\"],oA=\"-0123456789\";if(J===\"\")return!1;if(O.indexOf(J[0])>=0)return!0;if(tA.indexOf(J)>=0)return!0;if(oA.indexOf(J[0])>=0)try{return JSON.parse(J),!0}catch(NA){return!1}else return!1}};var Qe={};Qe[R]=0,Qe[M]=0,Qe[v]=0,Qe[F]=0,Qe[G]=0,Qe[U]=0,Qe[j]=0,Qe[AA]=0,Qe[z]=0,Qe[yA]=0,Qe[P]=1,Qe[nA]=2,Qe[eA]=3,Qe[dA]=5,Qe[iA]=5,Qe[aA]=5,Qe[hA]=5,Qe[JA]=5,Qe[ee]=5,Qe[UA]=9,Qe[mA]=20,Qe[KA]=21,Qe[ze]=40,Qe[Ke]=45,Qe[HA]=50,Qe[uA]=55,Qe[XA]=60;function _t(){}_t.prototype={parse:function(J){this._loadTokens(J),this.index=0;var O=this.expression(0);if(this._lookahead(0)!==R){var tA=this._lookaheadToken(0),oA=new Error(\"Unexpected token type: \"+tA.type+\", value: \"+tA.value);throw oA.name=\"ParserError\",oA}return O},_loadTokens:function(J){var O=new Et,tA=O.tokenize(J);tA.push({type:R,value:\"\",start:J.length}),this.tokens=tA},expression:function(J){var O=this._lookaheadToken(0);this._advance();for(var tA=this.nud(O),oA=this._lookahead(0);J<Qe[oA];)this._advance(),tA=this.led(oA,tA),oA=this._lookahead(0);return tA},_lookahead:function(J){return this.tokens[this.index+J].type},_lookaheadToken:function(J){return this.tokens[this.index+J]},_advance:function(){this.index++},nud:function(J){var O,tA,oA;switch(J.type){case EA:return{type:\"Literal\",value:J.value};case M:return{type:\"Field\",name:J.value};case v:var NA={type:\"Field\",name:J.value};if(this._lookahead(0)===XA)throw new Error(\"Quoted identifier not allowed for function names.\");return NA;case Ke:return tA=this.expression(Qe.Not),{type:\"NotExpression\",children:[tA]};case mA:return O={type:\"Identity\"},tA=null,this._lookahead(0)===F?tA={type:\"Identity\"}:tA=this._parseProjectionRHS(Qe.Star),{type:\"ValueProjection\",children:[O,tA]};case KA:return this.led(J.type,{type:\"Identity\"});case HA:return this._parseMultiselectHash();case UA:return O={type:UA,children:[{type:\"Identity\"}]},tA=this._parseProjectionRHS(Qe.Flatten),{type:\"Projection\",children:[O,tA]};case uA:return this._lookahead(0)===AA||this._lookahead(0)===Y?(tA=this._parseIndexExpression(),this._projectIfSlice({type:\"Identity\"},tA)):this._lookahead(0)===mA&&this._lookahead(1)===F?(this._advance(),this._advance(),tA=this._parseProjectionRHS(Qe.Star),{type:\"Projection\",children:[{type:\"Identity\"},tA]}):this._parseMultiselectList();case z:return{type:z};case yA:return oA=this.expression(Qe.Expref),{type:\"ExpressionReference\",children:[oA]};case XA:for(var de=[];this._lookahead(0)!==G;)this._lookahead(0)===z?(oA={type:z},this._advance()):oA=this.expression(0),de.push(oA);return this._match(G),de[0];default:this._errorToken(J)}},led:function(J,O){var tA;switch(J){case ze:var oA=Qe.Dot;return this._lookahead(0)!==mA?(tA=this._parseDotRHS(oA),{type:\"Subexpression\",children:[O,tA]}):(this._advance(),tA=this._parseProjectionRHS(oA),{type:\"ValueProjection\",children:[O,tA]});case P:return tA=this.expression(Qe.Pipe),{type:P,children:[O,tA]};case nA:return tA=this.expression(Qe.Or),{type:\"OrExpression\",children:[O,tA]};case eA:return tA=this.expression(Qe.And),{type:\"AndExpression\",children:[O,tA]};case XA:for(var NA=O.name,de=[],Ee,xA;this._lookahead(0)!==G;)this._lookahead(0)===z?(Ee={type:z},this._advance()):Ee=this.expression(0),this._lookahead(0)===U&&this._match(U),de.push(Ee);return this._match(G),xA={type:\"Function\",name:NA,children:de},xA;case KA:var LA=this.expression(0);return this._match(F),this._lookahead(0)===UA?tA={type:\"Identity\"}:tA=this._parseProjectionRHS(Qe.Filter),{type:\"FilterProjection\",children:[O,tA,LA]};case UA:var dt={type:UA,children:[O]},At=this._parseProjectionRHS(Qe.Flatten);return{type:\"Projection\",children:[dt,At]};case dA:case ee:case iA:case hA:case aA:case JA:return this._parseComparator(O,J);case uA:var Je=this._lookaheadToken(0);return Je.type===AA||Je.type===Y?(tA=this._parseIndexExpression(),this._projectIfSlice(O,tA)):(this._match(mA),this._match(F),tA=this._parseProjectionRHS(Qe.Star),{type:\"Projection\",children:[O,tA]});default:this._errorToken(this._lookaheadToken(0))}},_match:function(J){if(this._lookahead(0)===J)this._advance();else{var O=this._lookaheadToken(0),tA=new Error(\"Expected \"+J+\", got: \"+O.type);throw tA.name=\"ParserError\",tA}},_errorToken:function(J){var O=new Error(\"Invalid token (\"+J.type+'): \"'+J.value+'\"');throw O.name=\"ParserError\",O},_parseIndexExpression:function(){if(this._lookahead(0)===Y||this._lookahead(1)===Y)return this._parseSliceExpression();var J={type:\"Index\",value:this._lookaheadToken(0).value};return this._advance(),this._match(F),J},_projectIfSlice:function(J,O){var tA={type:\"IndexExpression\",children:[J,O]};return O.type===\"Slice\"?{type:\"Projection\",children:[tA,this._parseProjectionRHS(Qe.Star)]}:tA},_parseSliceExpression:function(){for(var J=[null,null,null],O=0,tA=this._lookahead(0);tA!==F&&O<3;){if(tA===Y)O++,this._advance();else if(tA===AA)J[O]=this._lookaheadToken(0).value,this._advance();else{var oA=this._lookahead(0),NA=new Error(\"Syntax error, unexpected token: \"+oA.value+\"(\"+oA.type+\")\");throw NA.name=\"Parsererror\",NA}tA=this._lookahead(0)}return this._match(F),{type:\"Slice\",children:J}},_parseComparator:function(J,O){var tA=this.expression(Qe[O]);return{type:\"Comparator\",name:O,children:[J,tA]}},_parseDotRHS:function(J){var O=this._lookahead(0),tA=[M,v,mA];if(tA.indexOf(O)>=0)return this.expression(J);if(O===uA)return this._match(uA),this._parseMultiselectList();if(O===HA)return this._match(HA),this._parseMultiselectHash()},_parseProjectionRHS:function(J){var O;if(Qe[this._lookahead(0)]<10)O={type:\"Identity\"};else if(this._lookahead(0)===uA)O=this.expression(J);else if(this._lookahead(0)===KA)O=this.expression(J);else if(this._lookahead(0)===ze)this._match(ze),O=this._parseDotRHS(J);else{var tA=this._lookaheadToken(0),oA=new Error(\"Sytanx error, unexpected token: \"+tA.value+\"(\"+tA.type+\")\");throw oA.name=\"ParserError\",oA}return O},_parseMultiselectList:function(){for(var J=[];this._lookahead(0)!==F;){var O=this.expression(0);if(J.push(O),this._lookahead(0)===U&&(this._match(U),this._lookahead(0)===F))throw new Error(\"Unexpected token Rbracket\")}return this._match(F),{type:\"MultiSelectList\",children:J}},_parseMultiselectHash:function(){for(var J=[],O=[M,v],tA,oA,NA,de;;){if(tA=this._lookaheadToken(0),O.indexOf(tA.type)<0)throw new Error(\"Expecting an identifier token, got: \"+tA.type);if(oA=tA.value,this._advance(),this._match(Y),NA=this.expression(0),de={type:\"KeyValuePair\",name:oA,value:NA},J.push(de),this._lookahead(0)===U)this._match(U);else if(this._lookahead(0)===j){this._match(j);break}}return{type:\"MultiSelectHash\",children:J}}};function Ue(J){this.runtime=J}Ue.prototype={search:function(J,O){return this.visit(J,O)},visit:function(J,O){var tA,oA,NA,de,Ee,xA,LA,dt,At,Je;switch(J.type){case\"Field\":return O!==null&&A(O)?(xA=O[J.name],xA===void 0?null:xA):null;case\"Subexpression\":for(NA=this.visit(J.children[0],O),Je=1;Je<J.children.length;Je++)if(NA=this.visit(J.children[1],NA),NA===null)return null;return NA;case\"IndexExpression\":return LA=this.visit(J.children[0],O),dt=this.visit(J.children[1],LA),dt;case\"Index\":if(!e(O))return null;var Ge=J.value;return Ge<0&&(Ge=O.length+Ge),NA=O[Ge],NA===void 0&&(NA=null),NA;case\"Slice\":if(!e(O))return null;var ri=J.children.slice(0),en=this.computeSliceParams(O.length,ri),rn=en[0],Le=en[1],ji=en[2];if(NA=[],ji>0)for(Je=rn;Je<Le;Je+=ji)NA.push(O[Je]);else for(Je=rn;Je>Le;Je+=ji)NA.push(O[Je]);return NA;case\"Projection\":var Bi=this.visit(J.children[0],O);if(!e(Bi))return null;for(At=[],Je=0;Je<Bi.length;Je++)oA=this.visit(J.children[1],Bi[Je]),oA!==null&&At.push(oA);return At;case\"ValueProjection\":if(Bi=this.visit(J.children[0],O),!A(Bi))return null;At=[];var vi=o(Bi);for(Je=0;Je<vi.length;Je++)oA=this.visit(J.children[1],vi[Je]),oA!==null&&At.push(oA);return At;case\"FilterProjection\":if(Bi=this.visit(J.children[0],O),!e(Bi))return null;var Ji=[],Dt=[];for(Je=0;Je<Bi.length;Je++)tA=this.visit(J.children[2],Bi[Je]),n(tA)||Ji.push(Bi[Je]);for(var qi=0;qi<Ji.length;qi++)oA=this.visit(J.children[1],Ji[qi]),oA!==null&&Dt.push(oA);return Dt;case\"Comparator\":switch(de=this.visit(J.children[0],O),Ee=this.visit(J.children[1],O),J.name){case dA:NA=i(de,Ee);break;case ee:NA=!i(de,Ee);break;case iA:NA=de>Ee;break;case hA:NA=de>=Ee;break;case aA:NA=de<Ee;break;case JA:NA=de<=Ee;break;default:throw new Error(\"Unknown comparator: \"+J.name)}return NA;case UA:var Nt=this.visit(J.children[0],O);if(!e(Nt))return null;var L=[];for(Je=0;Je<Nt.length;Je++)oA=Nt[Je],e(oA)?L.push.apply(L,oA):L.push(oA);return L;case\"Identity\":return O;case\"MultiSelectList\":if(O===null)return null;for(At=[],Je=0;Je<J.children.length;Je++)At.push(this.visit(J.children[Je],O));return At;case\"MultiSelectHash\":if(O===null)return null;At={};var gt;for(Je=0;Je<J.children.length;Je++)gt=J.children[Je],At[gt.name]=this.visit(gt.value,O);return At;case\"OrExpression\":return tA=this.visit(J.children[0],O),n(tA)&&(tA=this.visit(J.children[1],O)),tA;case\"AndExpression\":return de=this.visit(J.children[0],O),n(de)===!0?de:this.visit(J.children[1],O);case\"NotExpression\":return de=this.visit(J.children[0],O),n(de);case\"Literal\":return J.value;case P:return LA=this.visit(J.children[0],O),this.visit(J.children[1],LA);case z:return O;case\"Function\":var gi=[];for(Je=0;Je<J.children.length;Je++)gi.push(this.visit(J.children[Je],O));return this.runtime.callFunction(J.name,gi);case\"ExpressionReference\":var sn=J.children[0];return sn.jmespathType=yA,sn;default:throw new Error(\"Unknown node type: \"+J.type)}},computeSliceParams:function(J,O){var tA=O[0],oA=O[1],NA=O[2],de=[null,null,null];if(NA===null)NA=1;else if(NA===0){var Ee=new Error(\"Invalid slice, step cannot be 0\");throw Ee.name=\"RuntimeError\",Ee}var xA=NA<0;return tA===null?tA=xA?J-1:0:tA=this.capSliceRange(J,tA,NA),oA===null?oA=xA?-1:J:oA=this.capSliceRange(J,oA,NA),de[0]=tA,de[1]=oA,de[2]=NA,de},capSliceRange:function(J,O,tA){return O<0?(O+=J,O<0&&(O=tA<0?-1:0)):O>=J&&(O=tA<0?J-1:J),O}};function Te(J){this._interpreter=J,this.functionTable={abs:{_func:this._functionAbs,_signature:[{types:[s]}]},avg:{_func:this._functionAvg,_signature:[{types:[E]}]},ceil:{_func:this._functionCeil,_signature:[{types:[s]}]},contains:{_func:this._functionContains,_signature:[{types:[l,C]},{types:[g]}]},ends_with:{_func:this._functionEndsWith,_signature:[{types:[l]},{types:[l]}]},floor:{_func:this._functionFloor,_signature:[{types:[s]}]},length:{_func:this._functionLength,_signature:[{types:[l,C,I]}]},map:{_func:this._functionMap,_signature:[{types:[B]},{types:[C]}]},max:{_func:this._functionMax,_signature:[{types:[E,f]}]},merge:{_func:this._functionMerge,_signature:[{types:[I],variadic:!0}]},max_by:{_func:this._functionMaxBy,_signature:[{types:[C]},{types:[B]}]},sum:{_func:this._functionSum,_signature:[{types:[E]}]},starts_with:{_func:this._functionStartsWith,_signature:[{types:[l]},{types:[l]}]},min:{_func:this._functionMin,_signature:[{types:[E,f]}]},min_by:{_func:this._functionMinBy,_signature:[{types:[C]},{types:[B]}]},type:{_func:this._functionType,_signature:[{types:[g]}]},keys:{_func:this._functionKeys,_signature:[{types:[I]}]},values:{_func:this._functionValues,_signature:[{types:[I]}]},sort:{_func:this._functionSort,_signature:[{types:[f,E]}]},sort_by:{_func:this._functionSortBy,_signature:[{types:[C]},{types:[B]}]},join:{_func:this._functionJoin,_signature:[{types:[l]},{types:[f]}]},reverse:{_func:this._functionReverse,_signature:[{types:[l,C]}]},to_array:{_func:this._functionToArray,_signature:[{types:[g]}]},to_string:{_func:this._functionToString,_signature:[{types:[g]}]},to_number:{_func:this._functionToNumber,_signature:[{types:[g]}]},not_null:{_func:this._functionNotNull,_signature:[{types:[g],variadic:!0}]}}}Te.prototype={callFunction:function(J,O){var tA=this.functionTable[J];if(tA===void 0)throw new Error(\"Unknown function: \"+J+\"()\");return this._validateArgs(J,O,tA._signature),tA._func.call(this,O)},_validateArgs:function(J,O,tA){var oA;if(tA[tA.length-1].variadic){if(O.length<tA.length)throw oA=tA.length===1?\" argument\":\" arguments\",new Error(\"ArgumentError: \"+J+\"() takes at least\"+tA.length+oA+\" but received \"+O.length)}else if(O.length!==tA.length)throw oA=tA.length===1?\" argument\":\" arguments\",new Error(\"ArgumentError: \"+J+\"() takes \"+tA.length+oA+\" but received \"+O.length);for(var NA,de,Ee,xA=0;xA<tA.length;xA++){Ee=!1,NA=tA[xA].types,de=this._getTypeName(O[xA]);for(var LA=0;LA<NA.length;LA++)if(this._typeMatches(de,NA[LA],O[xA])){Ee=!0;break}if(!Ee){var dt=NA.map(function(At){return b[At]}).join(\",\");throw new Error(\"TypeError: \"+J+\"() expected argument \"+(xA+1)+\" to be type \"+dt+\" but received type \"+b[de]+\" instead.\")}}},_typeMatches:function(J,O,tA){if(O===g)return!0;if(O===f||O===E||O===C){if(O===C)return J===C;if(J===C){var oA;O===E?oA=s:O===f&&(oA=l);for(var NA=0;NA<tA.length;NA++)if(!this._typeMatches(this._getTypeName(tA[NA]),oA,tA[NA]))return!1;return!0}}else return J===O},_getTypeName:function(J){switch(Object.prototype.toString.call(J)){case\"[object String]\":return l;case\"[object Number]\":return s;case\"[object Array]\":return C;case\"[object Boolean]\":return d;case\"[object Null]\":return Q;case\"[object Object]\":return J.jmespathType===yA?B:I}},_functionStartsWith:function(J){return J[0].lastIndexOf(J[1])===0},_functionEndsWith:function(J){var O=J[0],tA=J[1];return O.indexOf(tA,O.length-tA.length)!==-1},_functionReverse:function(J){var O=this._getTypeName(J[0]);if(O===l){for(var tA=J[0],oA=\"\",NA=tA.length-1;NA>=0;NA--)oA+=tA[NA];return oA}else{var de=J[0].slice(0);return de.reverse(),de}},_functionAbs:function(J){return Math.abs(J[0])},_functionCeil:function(J){return Math.ceil(J[0])},_functionAvg:function(J){for(var O=0,tA=J[0],oA=0;oA<tA.length;oA++)O+=tA[oA];return O/tA.length},_functionContains:function(J){return J[0].indexOf(J[1])>=0},_functionFloor:function(J){return Math.floor(J[0])},_functionLength:function(J){return A(J[0])?Object.keys(J[0]).length:J[0].length},_functionMap:function(J){for(var O=[],tA=this._interpreter,oA=J[0],NA=J[1],de=0;de<NA.length;de++)O.push(tA.visit(oA,NA[de]));return O},_functionMerge:function(J){for(var O={},tA=0;tA<J.length;tA++){var oA=J[tA];for(var NA in oA)O[NA]=oA[NA]}return O},_functionMax:function(J){if(J[0].length>0){var O=this._getTypeName(J[0][0]);if(O===s)return Math.max.apply(Math,J[0]);for(var tA=J[0],oA=tA[0],NA=1;NA<tA.length;NA++)oA.localeCompare(tA[NA])<0&&(oA=tA[NA]);return oA}else return null},_functionMin:function(J){if(J[0].length>0){var O=this._getTypeName(J[0][0]);if(O===s)return Math.min.apply(Math,J[0]);for(var tA=J[0],oA=tA[0],NA=1;NA<tA.length;NA++)tA[NA].localeCompare(oA)<0&&(oA=tA[NA]);return oA}else return null},_functionSum:function(J){for(var O=0,tA=J[0],oA=0;oA<tA.length;oA++)O+=tA[oA];return O},_functionType:function(J){switch(this._getTypeName(J[0])){case s:return\"number\";case l:return\"string\";case C:return\"array\";case I:return\"object\";case d:return\"boolean\";case B:return\"expref\";case Q:return\"null\"}},_functionKeys:function(J){return Object.keys(J[0])},_functionValues:function(J){for(var O=J[0],tA=Object.keys(O),oA=[],NA=0;NA<tA.length;NA++)oA.push(O[tA[NA]]);return oA},_functionJoin:function(J){var O=J[0],tA=J[1];return tA.join(O)},_functionToArray:function(J){return this._getTypeName(J[0])===C?J[0]:[J[0]]},_functionToString:function(J){return this._getTypeName(J[0])===l?J[0]:JSON.stringify(J[0])},_functionToNumber:function(J){var O=this._getTypeName(J[0]),tA;return O===s?J[0]:O===l&&(tA=+J[0],!isNaN(tA))?tA:null},_functionNotNull:function(J){for(var O=0;O<J.length;O++)if(this._getTypeName(J[O])!==Q)return J[O];return null},_functionSort:function(J){var O=J[0].slice(0);return O.sort(),O},_functionSortBy:function(J){var O=J[0].slice(0);if(O.length===0)return O;var tA=this._interpreter,oA=J[1],NA=this._getTypeName(tA.visit(oA,O[0]));if([s,l].indexOf(NA)<0)throw new Error(\"TypeError\");for(var de=this,Ee=[],xA=0;xA<O.length;xA++)Ee.push([xA,O[xA]]);Ee.sort(function(dt,At){var Je=tA.visit(oA,dt[1]),Ge=tA.visit(oA,At[1]);if(de._getTypeName(Je)!==NA)throw new Error(\"TypeError: expected \"+NA+\", received \"+de._getTypeName(Je));if(de._getTypeName(Ge)!==NA)throw new Error(\"TypeError: expected \"+NA+\", received \"+de._getTypeName(Ge));return Je>Ge?1:Je<Ge?-1:dt[0]-At[0]});for(var LA=0;LA<Ee.length;LA++)O[LA]=Ee[LA][1];return O},_functionMaxBy:function(J){for(var O=J[1],tA=J[0],oA=this.createKeyFunction(O,[s,l]),NA=-1/0,de,Ee,xA=0;xA<tA.length;xA++)Ee=oA(tA[xA]),Ee>NA&&(NA=Ee,de=tA[xA]);return de},_functionMinBy:function(J){for(var O=J[1],tA=J[0],oA=this.createKeyFunction(O,[s,l]),NA=1/0,de,Ee,xA=0;xA<tA.length;xA++)Ee=oA(tA[xA]),Ee<NA&&(NA=Ee,de=tA[xA]);return de},createKeyFunction:function(J,O){var tA=this,oA=this._interpreter,NA=function(de){var Ee=oA.visit(J,de);if(O.indexOf(tA._getTypeName(Ee))<0){var xA=\"TypeError: expected one of \"+O+\", received \"+tA._getTypeName(Ee);throw new Error(xA)}return Ee};return NA}};function ht(J){var O=new _t,tA=O.parse(J);return tA}function Me(J){var O=new Et;return O.tokenize(J)}function Ai(J,O){var tA=new _t,oA=new Te,NA=new Ue(oA);oA._interpreter=NA;var de=tA.parse(O);return NA.search(de,J)}t.tokenize=Me,t.compile=ht,t.search=Ai,t.strictDeepEqual=i})(typeof C8>\"u\"?C8.jmespath={}:C8)});var liA=Ql((QMe,giA)=>{\"use strict\";giA.exports=[{value:\"#B0171F\",name:\"indian red\"},{value:\"#DC143C\",css:!0,name:\"crimson\"},{value:\"#FFB6C1\",css:!0,name:\"lightpink\"},{value:\"#FFAEB9\",name:\"lightpink 1\"},{value:\"#EEA2AD\",name:\"lightpink 2\"},{value:\"#CD8C95\",name:\"lightpink 3\"},{value:\"#8B5F65\",name:\"lightpink 4\"},{value:\"#FFC0CB\",css:!0,name:\"pink\"},{value:\"#FFB5C5\",name:\"pink 1\"},{value:\"#EEA9B8\",name:\"pink 2\"},{value:\"#CD919E\",name:\"pink 3\"},{value:\"#8B636C\",name:\"pink 4\"},{value:\"#DB7093\",css:!0,name:\"palevioletred\"},{value:\"#FF82AB\",name:\"palevioletred 1\"},{value:\"#EE799F\",name:\"palevioletred 2\"},{value:\"#CD6889\",name:\"palevioletred 3\"},{value:\"#8B475D\",name:\"palevioletred 4\"},{value:\"#FFF0F5\",name:\"lavenderblush 1\"},{value:\"#FFF0F5\",css:!0,name:\"lavenderblush\"},{value:\"#EEE0E5\",name:\"lavenderblush 2\"},{value:\"#CDC1C5\",name:\"lavenderblush 3\"},{value:\"#8B8386\",name:\"lavenderblush 4\"},{value:\"#FF3E96\",name:\"violetred 1\"},{value:\"#EE3A8C\",name:\"violetred 2\"},{value:\"#CD3278\",name:\"violetred 3\"},{value:\"#8B2252\",name:\"violetred 4\"},{value:\"#FF69B4\",css:!0,name:\"hotpink\"},{value:\"#FF6EB4\",name:\"hotpink 1\"},{value:\"#EE6AA7\",name:\"hotpink 2\"},{value:\"#CD6090\",name:\"hotpink 3\"},{value:\"#8B3A62\",name:\"hotpink 4\"},{value:\"#872657\",name:\"raspberry\"},{value:\"#FF1493\",name:\"deeppink 1\"},{value:\"#FF1493\",css:!0,name:\"deeppink\"},{value:\"#EE1289\",name:\"deeppink 2\"},{value:\"#CD1076\",name:\"deeppink 3\"},{value:\"#8B0A50\",name:\"deeppink 4\"},{value:\"#FF34B3\",name:\"maroon 1\"},{value:\"#EE30A7\",name:\"maroon 2\"},{value:\"#CD2990\",name:\"maroon 3\"},{value:\"#8B1C62\",name:\"maroon 4\"},{value:\"#C71585\",css:!0,name:\"mediumvioletred\"},{value:\"#D02090\",name:\"violetred\"},{value:\"#DA70D6\",css:!0,name:\"orchid\"},{value:\"#FF83FA\",name:\"orchid 1\"},{value:\"#EE7AE9\",name:\"orchid 2\"},{value:\"#CD69C9\",name:\"orchid 3\"},{value:\"#8B4789\",name:\"orchid 4\"},{value:\"#D8BFD8\",css:!0,name:\"thistle\"},{value:\"#FFE1FF\",name:\"thistle 1\"},{value:\"#EED2EE\",name:\"thistle 2\"},{value:\"#CDB5CD\",name:\"thistle 3\"},{value:\"#8B7B8B\",name:\"thistle 4\"},{value:\"#FFBBFF\",name:\"plum 1\"},{value:\"#EEAEEE\",name:\"plum 2\"},{value:\"#CD96CD\",name:\"plum 3\"},{value:\"#8B668B\",name:\"plum 4\"},{value:\"#DDA0DD\",css:!0,name:\"plum\"},{value:\"#EE82EE\",css:!0,name:\"violet\"},{value:\"#FF00FF\",vga:!0,name:\"magenta\"},{value:\"#FF00FF\",vga:!0,css:!0,name:\"fuchsia\"},{value:\"#EE00EE\",name:\"magenta 2\"},{value:\"#CD00CD\",name:\"magenta 3\"},{value:\"#8B008B\",name:\"magenta 4\"},{value:\"#8B008B\",css:!0,name:\"darkmagenta\"},{value:\"#800080\",vga:!0,css:!0,name:\"purple\"},{value:\"#BA55D3\",css:!0,name:\"mediumorchid\"},{value:\"#E066FF\",name:\"mediumorchid 1\"},{value:\"#D15FEE\",name:\"mediumorchid 2\"},{value:\"#B452CD\",name:\"mediumorchid 3\"},{value:\"#7A378B\",name:\"mediumorchid 4\"},{value:\"#9400D3\",css:!0,name:\"darkviolet\"},{value:\"#9932CC\",css:!0,name:\"darkorchid\"},{value:\"#BF3EFF\",name:\"darkorchid 1\"},{value:\"#B23AEE\",name:\"darkorchid 2\"},{value:\"#9A32CD\",name:\"darkorchid 3\"},{value:\"#68228B\",name:\"darkorchid 4\"},{value:\"#4B0082\",css:!0,name:\"indigo\"},{value:\"#8A2BE2\",css:!0,name:\"blueviolet\"},{value:\"#9B30FF\",name:\"purple 1\"},{value:\"#912CEE\",name:\"purple 2\"},{value:\"#7D26CD\",name:\"purple 3\"},{value:\"#551A8B\",name:\"purple 4\"},{value:\"#9370DB\",css:!0,name:\"mediumpurple\"},{value:\"#AB82FF\",name:\"mediumpurple 1\"},{value:\"#9F79EE\",name:\"mediumpurple 2\"},{value:\"#8968CD\",name:\"mediumpurple 3\"},{value:\"#5D478B\",name:\"mediumpurple 4\"},{value:\"#483D8B\",css:!0,name:\"darkslateblue\"},{value:\"#8470FF\",name:\"lightslateblue\"},{value:\"#7B68EE\",css:!0,name:\"mediumslateblue\"},{value:\"#6A5ACD\",css:!0,name:\"slateblue\"},{value:\"#836FFF\",name:\"slateblue 1\"},{value:\"#7A67EE\",name:\"slateblue 2\"},{value:\"#6959CD\",name:\"slateblue 3\"},{value:\"#473C8B\",name:\"slateblue 4\"},{value:\"#F8F8FF\",css:!0,name:\"ghostwhite\"},{value:\"#E6E6FA\",css:!0,name:\"lavender\"},{value:\"#0000FF\",vga:!0,css:!0,name:\"blue\"},{value:\"#0000EE\",name:\"blue 2\"},{value:\"#0000CD\",name:\"blue 3\"},{value:\"#0000CD\",css:!0,name:\"mediumblue\"},{value:\"#00008B\",name:\"blue 4\"},{value:\"#00008B\",css:!0,name:\"darkblue\"},{value:\"#000080\",vga:!0,css:!0,name:\"navy\"},{value:\"#191970\",css:!0,name:\"midnightblue\"},{value:\"#3D59AB\",name:\"cobalt\"},{value:\"#4169E1\",css:!0,name:\"royalblue\"},{value:\"#4876FF\",name:\"royalblue 1\"},{value:\"#436EEE\",name:\"royalblue 2\"},{value:\"#3A5FCD\",name:\"royalblue 3\"},{value:\"#27408B\",name:\"royalblue 4\"},{value:\"#6495ED\",css:!0,name:\"cornflowerblue\"},{value:\"#B0C4DE\",css:!0,name:\"lightsteelblue\"},{value:\"#CAE1FF\",name:\"lightsteelblue 1\"},{value:\"#BCD2EE\",name:\"lightsteelblue 2\"},{value:\"#A2B5CD\",name:\"lightsteelblue 3\"},{value:\"#6E7B8B\",name:\"lightsteelblue 4\"},{value:\"#778899\",css:!0,name:\"lightslategray\"},{value:\"#708090\",css:!0,name:\"slategray\"},{value:\"#C6E2FF\",name:\"slategray 1\"},{value:\"#B9D3EE\",name:\"slategray 2\"},{value:\"#9FB6CD\",name:\"slategray 3\"},{value:\"#6C7B8B\",name:\"slategray 4\"},{value:\"#1E90FF\",name:\"dodgerblue 1\"},{value:\"#1E90FF\",css:!0,name:\"dodgerblue\"},{value:\"#1C86EE\",name:\"dodgerblue 2\"},{value:\"#1874CD\",name:\"dodgerblue 3\"},{value:\"#104E8B\",name:\"dodgerblue 4\"},{value:\"#F0F8FF\",css:!0,name:\"aliceblue\"},{value:\"#4682B4\",css:!0,name:\"steelblue\"},{value:\"#63B8FF\",name:\"steelblue 1\"},{value:\"#5CACEE\",name:\"steelblue 2\"},{value:\"#4F94CD\",name:\"steelblue 3\"},{value:\"#36648B\",name:\"steelblue 4\"},{value:\"#87CEFA\",css:!0,name:\"lightskyblue\"},{value:\"#B0E2FF\",name:\"lightskyblue 1\"},{value:\"#A4D3EE\",name:\"lightskyblue 2\"},{value:\"#8DB6CD\",name:\"lightskyblue 3\"},{value:\"#607B8B\",name:\"lightskyblue 4\"},{value:\"#87CEFF\",name:\"skyblue 1\"},{value:\"#7EC0EE\",name:\"skyblue 2\"},{value:\"#6CA6CD\",name:\"skyblue 3\"},{value:\"#4A708B\",name:\"skyblue 4\"},{value:\"#87CEEB\",css:!0,name:\"skyblue\"},{value:\"#00BFFF\",name:\"deepskyblue 1\"},{value:\"#00BFFF\",css:!0,name:\"deepskyblue\"},{value:\"#00B2EE\",name:\"deepskyblue 2\"},{value:\"#009ACD\",name:\"deepskyblue 3\"},{value:\"#00688B\",name:\"deepskyblue 4\"},{value:\"#33A1C9\",name:\"peacock\"},{value:\"#ADD8E6\",css:!0,name:\"lightblue\"},{value:\"#BFEFFF\",name:\"lightblue 1\"},{value:\"#B2DFEE\",name:\"lightblue 2\"},{value:\"#9AC0CD\",name:\"lightblue 3\"},{value:\"#68838B\",name:\"lightblue 4\"},{value:\"#B0E0E6\",css:!0,name:\"powderblue\"},{value:\"#98F5FF\",name:\"cadetblue 1\"},{value:\"#8EE5EE\",name:\"cadetblue 2\"},{value:\"#7AC5CD\",name:\"cadetblue 3\"},{value:\"#53868B\",name:\"cadetblue 4\"},{value:\"#00F5FF\",name:\"turquoise 1\"},{value:\"#00E5EE\",name:\"turquoise 2\"},{value:\"#00C5CD\",name:\"turquoise 3\"},{value:\"#00868B\",name:\"turquoise 4\"},{value:\"#5F9EA0\",css:!0,name:\"cadetblue\"},{value:\"#00CED1\",css:!0,name:\"darkturquoise\"},{value:\"#F0FFFF\",name:\"azure 1\"},{value:\"#F0FFFF\",css:!0,name:\"azure\"},{value:\"#E0EEEE\",name:\"azure 2\"},{value:\"#C1CDCD\",name:\"azure 3\"},{value:\"#838B8B\",name:\"azure 4\"},{value:\"#E0FFFF\",name:\"lightcyan 1\"},{value:\"#E0FFFF\",css:!0,name:\"lightcyan\"},{value:\"#D1EEEE\",name:\"lightcyan 2\"},{value:\"#B4CDCD\",name:\"lightcyan 3\"},{value:\"#7A8B8B\",name:\"lightcyan 4\"},{value:\"#BBFFFF\",name:\"paleturquoise 1\"},{value:\"#AEEEEE\",name:\"paleturquoise 2\"},{value:\"#AEEEEE\",css:!0,name:\"paleturquoise\"},{value:\"#96CDCD\",name:\"paleturquoise 3\"},{value:\"#668B8B\",name:\"paleturquoise 4\"},{value:\"#2F4F4F\",css:!0,name:\"darkslategray\"},{value:\"#97FFFF\",name:\"darkslategray 1\"},{value:\"#8DEEEE\",name:\"darkslategray 2\"},{value:\"#79CDCD\",name:\"darkslategray 3\"},{value:\"#528B8B\",name:\"darkslategray 4\"},{value:\"#00FFFF\",name:\"cyan\"},{value:\"#00FFFF\",css:!0,name:\"aqua\"},{value:\"#00EEEE\",name:\"cyan 2\"},{value:\"#00CDCD\",name:\"cyan 3\"},{value:\"#008B8B\",name:\"cyan 4\"},{value:\"#008B8B\",css:!0,name:\"darkcyan\"},{value:\"#008080\",vga:!0,css:!0,name:\"teal\"},{value:\"#48D1CC\",css:!0,name:\"mediumturquoise\"},{value:\"#20B2AA\",css:!0,name:\"lightseagreen\"},{value:\"#03A89E\",name:\"manganeseblue\"},{value:\"#40E0D0\",css:!0,name:\"turquoise\"},{value:\"#808A87\",name:\"coldgrey\"},{value:\"#00C78C\",name:\"turquoiseblue\"},{value:\"#7FFFD4\",name:\"aquamarine 1\"},{value:\"#7FFFD4\",css:!0,name:\"aquamarine\"},{value:\"#76EEC6\",name:\"aquamarine 2\"},{value:\"#66CDAA\",name:\"aquamarine 3\"},{value:\"#66CDAA\",css:!0,name:\"mediumaquamarine\"},{value:\"#458B74\",name:\"aquamarine 4\"},{value:\"#00FA9A\",css:!0,name:\"mediumspringgreen\"},{value:\"#F5FFFA\",css:!0,name:\"mintcream\"},{value:\"#00FF7F\",css:!0,name:\"springgreen\"},{value:\"#00EE76\",name:\"springgreen 1\"},{value:\"#00CD66\",name:\"springgreen 2\"},{value:\"#008B45\",name:\"springgreen 3\"},{value:\"#3CB371\",css:!0,name:\"mediumseagreen\"},{value:\"#54FF9F\",name:\"seagreen 1\"},{value:\"#4EEE94\",name:\"seagreen 2\"},{value:\"#43CD80\",name:\"seagreen 3\"},{value:\"#2E8B57\",name:\"seagreen 4\"},{value:\"#2E8B57\",css:!0,name:\"seagreen\"},{value:\"#00C957\",name:\"emeraldgreen\"},{value:\"#BDFCC9\",name:\"mint\"},{value:\"#3D9140\",name:\"cobaltgreen\"},{value:\"#F0FFF0\",name:\"honeydew 1\"},{value:\"#F0FFF0\",css:!0,name:\"honeydew\"},{value:\"#E0EEE0\",name:\"honeydew 2\"},{value:\"#C1CDC1\",name:\"honeydew 3\"},{value:\"#838B83\",name:\"honeydew 4\"},{value:\"#8FBC8F\",css:!0,name:\"darkseagreen\"},{value:\"#C1FFC1\",name:\"darkseagreen 1\"},{value:\"#B4EEB4\",name:\"darkseagreen 2\"},{value:\"#9BCD9B\",name:\"darkseagreen 3\"},{value:\"#698B69\",name:\"darkseagreen 4\"},{value:\"#98FB98\",css:!0,name:\"palegreen\"},{value:\"#9AFF9A\",name:\"palegreen 1\"},{value:\"#90EE90\",name:\"palegreen 2\"},{value:\"#90EE90\",css:!0,name:\"lightgreen\"},{value:\"#7CCD7C\",name:\"palegreen 3\"},{value:\"#548B54\",name:\"palegreen 4\"},{value:\"#32CD32\",css:!0,name:\"limegreen\"},{value:\"#228B22\",css:!0,name:\"forestgreen\"},{value:\"#00FF00\",vga:!0,name:\"green 1\"},{value:\"#00FF00\",vga:!0,css:!0,name:\"lime\"},{value:\"#00EE00\",name:\"green 2\"},{value:\"#00CD00\",name:\"green 3\"},{value:\"#008B00\",name:\"green 4\"},{value:\"#008000\",vga:!0,css:!0,name:\"green\"},{value:\"#006400\",css:!0,name:\"darkgreen\"},{value:\"#308014\",name:\"sapgreen\"},{value:\"#7CFC00\",css:!0,name:\"lawngreen\"},{value:\"#7FFF00\",name:\"chartreuse 1\"},{value:\"#7FFF00\",css:!0,name:\"chartreuse\"},{value:\"#76EE00\",name:\"chartreuse 2\"},{value:\"#66CD00\",name:\"chartreuse 3\"},{value:\"#458B00\",name:\"chartreuse 4\"},{value:\"#ADFF2F\",css:!0,name:\"greenyellow\"},{value:\"#CAFF70\",name:\"darkolivegreen 1\"},{value:\"#BCEE68\",name:\"darkolivegreen 2\"},{value:\"#A2CD5A\",name:\"darkolivegreen 3\"},{value:\"#6E8B3D\",name:\"darkolivegreen 4\"},{value:\"#556B2F\",css:!0,name:\"darkolivegreen\"},{value:\"#6B8E23\",css:!0,name:\"olivedrab\"},{value:\"#C0FF3E\",name:\"olivedrab 1\"},{value:\"#B3EE3A\",name:\"olivedrab 2\"},{value:\"#9ACD32\",name:\"olivedrab 3\"},{value:\"#9ACD32\",css:!0,name:\"yellowgreen\"},{value:\"#698B22\",name:\"olivedrab 4\"},{value:\"#FFFFF0\",name:\"ivory 1\"},{value:\"#FFFFF0\",css:!0,name:\"ivory\"},{value:\"#EEEEE0\",name:\"ivory 2\"},{value:\"#CDCDC1\",name:\"ivory 3\"},{value:\"#8B8B83\",name:\"ivory 4\"},{value:\"#F5F5DC\",css:!0,name:\"beige\"},{value:\"#FFFFE0\",name:\"lightyellow 1\"},{value:\"#FFFFE0\",css:!0,name:\"lightyellow\"},{value:\"#EEEED1\",name:\"lightyellow 2\"},{value:\"#CDCDB4\",name:\"lightyellow 3\"},{value:\"#8B8B7A\",name:\"lightyellow 4\"},{value:\"#FAFAD2\",css:!0,name:\"lightgoldenrodyellow\"},{value:\"#FFFF00\",vga:!0,name:\"yellow 1\"},{value:\"#FFFF00\",vga:!0,css:!0,name:\"yellow\"},{value:\"#EEEE00\",name:\"yellow 2\"},{value:\"#CDCD00\",name:\"yellow 3\"},{value:\"#8B8B00\",name:\"yellow 4\"},{value:\"#808069\",name:\"warmgrey\"},{value:\"#808000\",vga:!0,css:!0,name:\"olive\"},{value:\"#BDB76B\",css:!0,name:\"darkkhaki\"},{value:\"#FFF68F\",name:\"khaki 1\"},{value:\"#EEE685\",name:\"khaki 2\"},{value:\"#CDC673\",name:\"khaki 3\"},{value:\"#8B864E\",name:\"khaki 4\"},{value:\"#F0E68C\",css:!0,name:\"khaki\"},{value:\"#EEE8AA\",css:!0,name:\"palegoldenrod\"},{value:\"#FFFACD\",name:\"lemonchiffon 1\"},{value:\"#FFFACD\",css:!0,name:\"lemonchiffon\"},{value:\"#EEE9BF\",name:\"lemonchiffon 2\"},{value:\"#CDC9A5\",name:\"lemonchiffon 3\"},{value:\"#8B8970\",name:\"lemonchiffon 4\"},{value:\"#FFEC8B\",name:\"lightgoldenrod 1\"},{value:\"#EEDC82\",name:\"lightgoldenrod 2\"},{value:\"#CDBE70\",name:\"lightgoldenrod 3\"},{value:\"#8B814C\",name:\"lightgoldenrod 4\"},{value:\"#E3CF57\",name:\"banana\"},{value:\"#FFD700\",name:\"gold 1\"},{value:\"#FFD700\",css:!0,name:\"gold\"},{value:\"#EEC900\",name:\"gold 2\"},{value:\"#CDAD00\",name:\"gold 3\"},{value:\"#8B7500\",name:\"gold 4\"},{value:\"#FFF8DC\",name:\"cornsilk 1\"},{value:\"#FFF8DC\",css:!0,name:\"cornsilk\"},{value:\"#EEE8CD\",name:\"cornsilk 2\"},{value:\"#CDC8B1\",name:\"cornsilk 3\"},{value:\"#8B8878\",name:\"cornsilk 4\"},{value:\"#DAA520\",css:!0,name:\"goldenrod\"},{value:\"#FFC125\",name:\"goldenrod 1\"},{value:\"#EEB422\",name:\"goldenrod 2\"},{value:\"#CD9B1D\",name:\"goldenrod 3\"},{value:\"#8B6914\",name:\"goldenrod 4\"},{value:\"#B8860B\",css:!0,name:\"darkgoldenrod\"},{value:\"#FFB90F\",name:\"darkgoldenrod 1\"},{value:\"#EEAD0E\",name:\"darkgoldenrod 2\"},{value:\"#CD950C\",name:\"darkgoldenrod 3\"},{value:\"#8B6508\",name:\"darkgoldenrod 4\"},{value:\"#FFA500\",name:\"orange 1\"},{value:\"#FF8000\",css:!0,name:\"orange\"},{value:\"#EE9A00\",name:\"orange 2\"},{value:\"#CD8500\",name:\"orange 3\"},{value:\"#8B5A00\",name:\"orange 4\"},{value:\"#FFFAF0\",css:!0,name:\"floralwhite\"},{value:\"#FDF5E6\",css:!0,name:\"oldlace\"},{value:\"#F5DEB3\",css:!0,name:\"wheat\"},{value:\"#FFE7BA\",name:\"wheat 1\"},{value:\"#EED8AE\",name:\"wheat 2\"},{value:\"#CDBA96\",name:\"wheat 3\"},{value:\"#8B7E66\",name:\"wheat 4\"},{value:\"#FFE4B5\",css:!0,name:\"moccasin\"},{value:\"#FFEFD5\",css:!0,name:\"papayawhip\"},{value:\"#FFEBCD\",css:!0,name:\"blanchedalmond\"},{value:\"#FFDEAD\",name:\"navajowhite 1\"},{value:\"#FFDEAD\",css:!0,name:\"navajowhite\"},{value:\"#EECFA1\",name:\"navajowhite 2\"},{value:\"#CDB38B\",name:\"navajowhite 3\"},{value:\"#8B795E\",name:\"navajowhite 4\"},{value:\"#FCE6C9\",name:\"eggshell\"},{value:\"#D2B48C\",css:!0,name:\"tan\"},{value:\"#9C661F\",name:\"brick\"},{value:\"#FF9912\",name:\"cadmiumyellow\"},{value:\"#FAEBD7\",css:!0,name:\"antiquewhite\"},{value:\"#FFEFDB\",name:\"antiquewhite 1\"},{value:\"#EEDFCC\",name:\"antiquewhite 2\"},{value:\"#CDC0B0\",name:\"antiquewhite 3\"},{value:\"#8B8378\",name:\"antiquewhite 4\"},{value:\"#DEB887\",css:!0,name:\"burlywood\"},{value:\"#FFD39B\",name:\"burlywood 1\"},{value:\"#EEC591\",name:\"burlywood 2\"},{value:\"#CDAA7D\",name:\"burlywood 3\"},{value:\"#8B7355\",name:\"burlywood 4\"},{value:\"#FFE4C4\",name:\"bisque 1\"},{value:\"#FFE4C4\",css:!0,name:\"bisque\"},{value:\"#EED5B7\",name:\"bisque 2\"},{value:\"#CDB79E\",name:\"bisque 3\"},{value:\"#8B7D6B\",name:\"bisque 4\"},{value:\"#E3A869\",name:\"melon\"},{value:\"#ED9121\",name:\"carrot\"},{value:\"#FF8C00\",css:!0,name:\"darkorange\"},{value:\"#FF7F00\",name:\"darkorange 1\"},{value:\"#EE7600\",name:\"darkorange 2\"},{value:\"#CD6600\",name:\"darkorange 3\"},{value:\"#8B4500\",name:\"darkorange 4\"},{value:\"#FFA54F\",name:\"tan 1\"},{value:\"#EE9A49\",name:\"tan 2\"},{value:\"#CD853F\",name:\"tan 3\"},{value:\"#CD853F\",css:!0,name:\"peru\"},{value:\"#8B5A2B\",name:\"tan 4\"},{value:\"#FAF0E6\",css:!0,name:\"linen\"},{value:\"#FFDAB9\",name:\"peachpuff 1\"},{value:\"#FFDAB9\",css:!0,name:\"peachpuff\"},{value:\"#EECBAD\",name:\"peachpuff 2\"},{value:\"#CDAF95\",name:\"peachpuff 3\"},{value:\"#8B7765\",name:\"peachpuff 4\"},{value:\"#FFF5EE\",name:\"seashell 1\"},{value:\"#FFF5EE\",css:!0,name:\"seashell\"},{value:\"#EEE5DE\",name:\"seashell 2\"},{value:\"#CDC5BF\",name:\"seashell 3\"},{value:\"#8B8682\",name:\"seashell 4\"},{value:\"#F4A460\",css:!0,name:\"sandybrown\"},{value:\"#C76114\",name:\"rawsienna\"},{value:\"#D2691E\",css:!0,name:\"chocolate\"},{value:\"#FF7F24\",name:\"chocolate 1\"},{value:\"#EE7621\",name:\"chocolate 2\"},{value:\"#CD661D\",name:\"chocolate 3\"},{value:\"#8B4513\",name:\"chocolate 4\"},{value:\"#8B4513\",css:!0,name:\"saddlebrown\"},{value:\"#292421\",name:\"ivoryblack\"},{value:\"#FF7D40\",name:\"flesh\"},{value:\"#FF6103\",name:\"cadmiumorange\"},{value:\"#8A360F\",name:\"burntsienna\"},{value:\"#A0522D\",css:!0,name:\"sienna\"},{value:\"#FF8247\",name:\"sienna 1\"},{value:\"#EE7942\",name:\"sienna 2\"},{value:\"#CD6839\",name:\"sienna 3\"},{value:\"#8B4726\",name:\"sienna 4\"},{value:\"#FFA07A\",name:\"lightsalmon 1\"},{value:\"#FFA07A\",css:!0,name:\"lightsalmon\"},{value:\"#EE9572\",name:\"lightsalmon 2\"},{value:\"#CD8162\",name:\"lightsalmon 3\"},{value:\"#8B5742\",name:\"lightsalmon 4\"},{value:\"#FF7F50\",css:!0,name:\"coral\"},{value:\"#FF4500\",name:\"orangered 1\"},{value:\"#FF4500\",css:!0,name:\"orangered\"},{value:\"#EE4000\",name:\"orangered 2\"},{value:\"#CD3700\",name:\"orangered 3\"},{value:\"#8B2500\",name:\"orangered 4\"},{value:\"#5E2612\",name:\"sepia\"},{value:\"#E9967A\",css:!0,name:\"darksalmon\"},{value:\"#FF8C69\",name:\"salmon 1\"},{value:\"#EE8262\",name:\"salmon 2\"},{value:\"#CD7054\",name:\"salmon 3\"},{value:\"#8B4C39\",name:\"salmon 4\"},{value:\"#FF7256\",name:\"coral 1\"},{value:\"#EE6A50\",name:\"coral 2\"},{value:\"#CD5B45\",name:\"coral 3\"},{value:\"#8B3E2F\",name:\"coral 4\"},{value:\"#8A3324\",name:\"burntumber\"},{value:\"#FF6347\",name:\"tomato 1\"},{value:\"#FF6347\",css:!0,name:\"tomato\"},{value:\"#EE5C42\",name:\"tomato 2\"},{value:\"#CD4F39\",name:\"tomato 3\"},{value:\"#8B3626\",name:\"tomato 4\"},{value:\"#FA8072\",css:!0,name:\"salmon\"},{value:\"#FFE4E1\",name:\"mistyrose 1\"},{value:\"#FFE4E1\",css:!0,name:\"mistyrose\"},{value:\"#EED5D2\",name:\"mistyrose 2\"},{value:\"#CDB7B5\",name:\"mistyrose 3\"},{value:\"#8B7D7B\",name:\"mistyrose 4\"},{value:\"#FFFAFA\",name:\"snow 1\"},{value:\"#FFFAFA\",css:!0,name:\"snow\"},{value:\"#EEE9E9\",name:\"snow 2\"},{value:\"#CDC9C9\",name:\"snow 3\"},{value:\"#8B8989\",name:\"snow 4\"},{value:\"#BC8F8F\",css:!0,name:\"rosybrown\"},{value:\"#FFC1C1\",name:\"rosybrown 1\"},{value:\"#EEB4B4\",name:\"rosybrown 2\"},{value:\"#CD9B9B\",name:\"rosybrown 3\"},{value:\"#8B6969\",name:\"rosybrown 4\"},{value:\"#F08080\",css:!0,name:\"lightcoral\"},{value:\"#CD5C5C\",css:!0,name:\"indianred\"},{value:\"#FF6A6A\",name:\"indianred 1\"},{value:\"#EE6363\",name:\"indianred 2\"},{value:\"#8B3A3A\",name:\"indianred 4\"},{value:\"#CD5555\",name:\"indianred 3\"},{value:\"#A52A2A\",css:!0,name:\"brown\"},{value:\"#FF4040\",name:\"brown 1\"},{value:\"#EE3B3B\",name:\"brown 2\"},{value:\"#CD3333\",name:\"brown 3\"},{value:\"#8B2323\",name:\"brown 4\"},{value:\"#B22222\",css:!0,name:\"firebrick\"},{value:\"#FF3030\",name:\"firebrick 1\"},{value:\"#EE2C2C\",name:\"firebrick 2\"},{value:\"#CD2626\",name:\"firebrick 3\"},{value:\"#8B1A1A\",name:\"firebrick 4\"},{value:\"#FF0000\",vga:!0,name:\"red 1\"},{value:\"#FF0000\",vga:!0,css:!0,name:\"red\"},{value:\"#EE0000\",name:\"red 2\"},{value:\"#CD0000\",name:\"red 3\"},{value:\"#8B0000\",name:\"red 4\"},{value:\"#8B0000\",css:!0,name:\"darkred\"},{value:\"#800000\",vga:!0,css:!0,name:\"maroon\"},{value:\"#8E388E\",name:\"sgi beet\"},{value:\"#7171C6\",name:\"sgi slateblue\"},{value:\"#7D9EC0\",name:\"sgi lightblue\"},{value:\"#388E8E\",name:\"sgi teal\"},{value:\"#71C671\",name:\"sgi chartreuse\"},{value:\"#8E8E38\",name:\"sgi olivedrab\"},{value:\"#C5C1AA\",name:\"sgi brightgray\"},{value:\"#C67171\",name:\"sgi salmon\"},{value:\"#555555\",name:\"sgi darkgray\"},{value:\"#1E1E1E\",name:\"sgi gray 12\"},{value:\"#282828\",name:\"sgi gray 16\"},{value:\"#515151\",name:\"sgi gray 32\"},{value:\"#5B5B5B\",name:\"sgi gray 36\"},{value:\"#848484\",name:\"sgi gray 52\"},{value:\"#8E8E8E\",name:\"sgi gray 56\"},{value:\"#AAAAAA\",name:\"sgi lightgray\"},{value:\"#B7B7B7\",name:\"sgi gray 72\"},{value:\"#C1C1C1\",name:\"sgi gray 76\"},{value:\"#EAEAEA\",name:\"sgi gray 92\"},{value:\"#F4F4F4\",name:\"sgi gray 96\"},{value:\"#FFFFFF\",vga:!0,css:!0,name:\"white\"},{value:\"#F5F5F5\",name:\"white smoke\"},{value:\"#F5F5F5\",name:\"gray 96\"},{value:\"#DCDCDC\",css:!0,name:\"gainsboro\"},{value:\"#D3D3D3\",css:!0,name:\"lightgrey\"},{value:\"#C0C0C0\",vga:!0,css:!0,name:\"silver\"},{value:\"#A9A9A9\",css:!0,name:\"darkgray\"},{value:\"#808080\",vga:!0,css:!0,name:\"gray\"},{value:\"#696969\",css:!0,name:\"dimgray\"},{value:\"#696969\",name:\"gray 42\"},{value:\"#000000\",vga:!0,css:!0,name:\"black\"},{value:\"#FCFCFC\",name:\"gray 99\"},{value:\"#FAFAFA\",name:\"gray 98\"},{value:\"#F7F7F7\",name:\"gray 97\"},{value:\"#F2F2F2\",name:\"gray 95\"},{value:\"#F0F0F0\",name:\"gray 94\"},{value:\"#EDEDED\",name:\"gray 93\"},{value:\"#EBEBEB\",name:\"gray 92\"},{value:\"#E8E8E8\",name:\"gray 91\"},{value:\"#E5E5E5\",name:\"gray 90\"},{value:\"#E3E3E3\",name:\"gray 89\"},{value:\"#E0E0E0\",name:\"gray 88\"},{value:\"#DEDEDE\",name:\"gray 87\"},{value:\"#DBDBDB\",name:\"gray 86\"},{value:\"#D9D9D9\",name:\"gray 85\"},{value:\"#D6D6D6\",name:\"gray 84\"},{value:\"#D4D4D4\",name:\"gray 83\"},{value:\"#D1D1D1\",name:\"gray 82\"},{value:\"#CFCFCF\",name:\"gray 81\"},{value:\"#CCCCCC\",name:\"gray 80\"},{value:\"#C9C9C9\",name:\"gray 79\"},{value:\"#C7C7C7\",name:\"gray 78\"},{value:\"#C4C4C4\",name:\"gray 77\"},{value:\"#C2C2C2\",name:\"gray 76\"},{value:\"#BFBFBF\",name:\"gray 75\"},{value:\"#BDBDBD\",name:\"gray 74\"},{value:\"#BABABA\",name:\"gray 73\"},{value:\"#B8B8B8\",name:\"gray 72\"},{value:\"#B5B5B5\",name:\"gray 71\"},{value:\"#B3B3B3\",name:\"gray 70\"},{value:\"#B0B0B0\",name:\"gray 69\"},{value:\"#ADADAD\",name:\"gray 68\"},{value:\"#ABABAB\",name:\"gray 67\"},{value:\"#A8A8A8\",name:\"gray 66\"},{value:\"#A6A6A6\",name:\"gray 65\"},{value:\"#A3A3A3\",name:\"gray 64\"},{value:\"#A1A1A1\",name:\"gray 63\"},{value:\"#9E9E9E\",name:\"gray 62\"},{value:\"#9C9C9C\",name:\"gray 61\"},{value:\"#999999\",name:\"gray 60\"},{value:\"#969696\",name:\"gray 59\"},{value:\"#949494\",name:\"gray 58\"},{value:\"#919191\",name:\"gray 57\"},{value:\"#8F8F8F\",name:\"gray 56\"},{value:\"#8C8C8C\",name:\"gray 55\"},{value:\"#8A8A8A\",name:\"gray 54\"},{value:\"#878787\",name:\"gray 53\"},{value:\"#858585\",name:\"gray 52\"},{value:\"#828282\",name:\"gray 51\"},{value:\"#7F7F7F\",name:\"gray 50\"},{value:\"#7D7D7D\",name:\"gray 49\"},{value:\"#7A7A7A\",name:\"gray 48\"},{value:\"#787878\",name:\"gray 47\"},{value:\"#757575\",name:\"gray 46\"},{value:\"#737373\",name:\"gray 45\"},{value:\"#707070\",name:\"gray 44\"},{value:\"#6E6E6E\",name:\"gray 43\"},{value:\"#666666\",name:\"gray 40\"},{value:\"#636363\",name:\"gray 39\"},{value:\"#616161\",name:\"gray 38\"},{value:\"#5E5E5E\",name:\"gray 37\"},{value:\"#5C5C5C\",name:\"gray 36\"},{value:\"#595959\",name:\"gray 35\"},{value:\"#575757\",name:\"gray 34\"},{value:\"#545454\",name:\"gray 33\"},{value:\"#525252\",name:\"gray 32\"},{value:\"#4F4F4F\",name:\"gray 31\"},{value:\"#4D4D4D\",name:\"gray 30\"},{value:\"#4A4A4A\",name:\"gray 29\"},{value:\"#474747\",name:\"gray 28\"},{value:\"#454545\",name:\"gray 27\"},{value:\"#424242\",name:\"gray 26\"},{value:\"#404040\",name:\"gray 25\"},{value:\"#3D3D3D\",name:\"gray 24\"},{value:\"#3B3B3B\",name:\"gray 23\"},{value:\"#383838\",name:\"gray 22\"},{value:\"#363636\",name:\"gray 21\"},{value:\"#333333\",name:\"gray 20\"},{value:\"#303030\",name:\"gray 19\"},{value:\"#2E2E2E\",name:\"gray 18\"},{value:\"#2B2B2B\",name:\"gray 17\"},{value:\"#292929\",name:\"gray 16\"},{value:\"#262626\",name:\"gray 15\"},{value:\"#242424\",name:\"gray 14\"},{value:\"#212121\",name:\"gray 13\"},{value:\"#1F1F1F\",name:\"gray 12\"},{value:\"#1C1C1C\",name:\"gray 11\"},{value:\"#1A1A1A\",name:\"gray 10\"},{value:\"#171717\",name:\"gray 9\"},{value:\"#141414\",name:\"gray 8\"},{value:\"#121212\",name:\"gray 7\"},{value:\"#0F0F0F\",name:\"gray 6\"},{value:\"#0D0D0D\",name:\"gray 5\"},{value:\"#0A0A0A\",name:\"gray 4\"},{value:\"#080808\",name:\"gray 3\"},{value:\"#050505\",name:\"gray 2\"},{value:\"#030303\",name:\"gray 1\"},{value:\"#F5F5F5\",css:!0,name:\"whitesmoke\"}]});var IiA=Ql((EMe,fI)=>{\"use strict\";var iv=liA(),ciA=iv.filter(function(t){return!!t.css}),CiA=iv.filter(function(t){return!!t.vga});fI.exports=function(t){var e=fI.exports.get(t);return e&&e.value};fI.exports.get=function(t){return t=t||\"\",t=t.trim().toLowerCase(),iv.filter(function(e){return e.name.toLowerCase()===t}).pop()};fI.exports.all=fI.exports.get.all=function(){return iv};fI.exports.get.css=function(t){return t?(t=t||\"\",t=t.trim().toLowerCase(),ciA.filter(function(e){return e.name.toLowerCase()===t}).pop()):ciA};fI.exports.get.vga=function(t){return t?(t=t||\"\",t=t.trim().toLowerCase(),CiA.filter(function(e){return e.name.toLowerCase()===t}).pop()):CiA}});var LiA=Ql((hMe,FiA)=>{\"use strict\";var mLA=1/0,pLA=\"[object Symbol]\",DLA=/[^\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\x7f]+/g,miA=\"\\\\ud800-\\\\udfff\",wLA=\"\\\\u0300-\\\\u036f\\\\ufe20-\\\\ufe23\",yLA=\"\\\\u20d0-\\\\u20f0\",piA=\"\\\\u2700-\\\\u27bf\",DiA=\"a-z\\\\xdf-\\\\xf6\\\\xf8-\\\\xff\",vLA=\"\\\\xac\\\\xb1\\\\xd7\\\\xf7\",bLA=\"\\\\x00-\\\\x2f\\\\x3a-\\\\x40\\\\x5b-\\\\x60\\\\x7b-\\\\xbf\",MLA=\"\\\\u2000-\\\\u206f\",kLA=\" \\\\t\\\\x0b\\\\f\\\\xa0\\\\ufeff\\\\n\\\\r\\\\u2028\\\\u2029\\\\u1680\\\\u180e\\\\u2000\\\\u2001\\\\u2002\\\\u2003\\\\u2004\\\\u2005\\\\u2006\\\\u2007\\\\u2008\\\\u2009\\\\u200a\\\\u202f\\\\u205f\\\\u3000\",wiA=\"A-Z\\\\xc0-\\\\xd6\\\\xd8-\\\\xde\",SLA=\"\\\\ufe0e\\\\ufe0f\",yiA=vLA+bLA+MLA+kLA,viA=\"['\\u2019]\",diA=\"[\"+yiA+\"]\",xLA=\"[\"+wLA+yLA+\"]\",biA=\"\\\\d+\",RLA=\"[\"+piA+\"]\",MiA=\"[\"+DiA+\"]\",kiA=\"[^\"+miA+yiA+biA+piA+DiA+wiA+\"]\",NLA=\"\\\\ud83c[\\\\udffb-\\\\udfff]\",FLA=\"(?:\"+xLA+\"|\"+NLA+\")\",LLA=\"[^\"+miA+\"]\",SiA=\"(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}\",xiA=\"[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]\",JE=\"[\"+wiA+\"]\",_LA=\"\\\\u200d\",BiA=\"(?:\"+MiA+\"|\"+kiA+\")\",GLA=\"(?:\"+JE+\"|\"+kiA+\")\",QiA=\"(?:\"+viA+\"(?:d|ll|m|re|s|t|ve))?\",EiA=\"(?:\"+viA+\"(?:D|LL|M|RE|S|T|VE))?\",RiA=FLA+\"?\",NiA=\"[\"+SLA+\"]?\",KLA=\"(?:\"+_LA+\"(?:\"+[LLA,SiA,xiA].join(\"|\")+\")\"+NiA+RiA+\")*\",ULA=NiA+RiA+KLA,JLA=\"(?:\"+[RLA,SiA,xiA].join(\"|\")+\")\"+ULA,YLA=RegExp([JE+\"?\"+MiA+\"+\"+QiA+\"(?=\"+[diA,JE,\"$\"].join(\"|\")+\")\",GLA+\"+\"+EiA+\"(?=\"+[diA,JE+BiA,\"$\"].join(\"|\")+\")\",JE+\"?\"+BiA+\"+\"+QiA,JE+\"+\"+EiA,biA,JLA].join(\"|\"),\"g\"),HLA=/[a-z][A-Z]|[A-Z]{2,}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,TLA=typeof global==\"object\"&&global&&global.Object===Object&&global,OLA=typeof self==\"object\"&&self&&self.Object===Object&&self,zLA=TLA||OLA||Function(\"return this\")();function PLA(t){return t.match(DLA)||[]}function jLA(t){return HLA.test(t)}function qLA(t){return t.match(YLA)||[]}var VLA=Object.prototype,WLA=VLA.toString,hiA=zLA.Symbol,uiA=hiA?hiA.prototype:void 0,fiA=uiA?uiA.toString:void 0;function ZLA(t){if(typeof t==\"string\")return t;if($LA(t))return fiA?fiA.call(t):\"\";var e=t+\"\";return e==\"0\"&&1/t==-mLA?\"-0\":e}function XLA(t){return!!t&&typeof t==\"object\"}function $LA(t){return typeof t==\"symbol\"||XLA(t)&&WLA.call(t)==pLA}function A_A(t){return t==null?\"\":ZLA(t)}function e_A(t,e,A){return t=A_A(t),e=A?void 0:e,e===void 0?jLA(t)?qLA(t):PLA(t):t.match(e)||[]}FiA.exports=e_A});var ZiA=Ql((uMe,WiA)=>{\"use strict\";var t_A=1/0,i_A=\"[object Symbol]\",n_A=/^\\s+/,GF=\"\\\\ud800-\\\\udfff\",JiA=\"\\\\u0300-\\\\u036f\\\\ufe20-\\\\ufe23\",YiA=\"\\\\u20d0-\\\\u20f0\",HiA=\"\\\\ufe0e\\\\ufe0f\",o_A=\"[\"+GF+\"]\",LF=\"[\"+JiA+YiA+\"]\",_F=\"\\\\ud83c[\\\\udffb-\\\\udfff]\",a_A=\"(?:\"+LF+\"|\"+_F+\")\",TiA=\"[^\"+GF+\"]\",OiA=\"(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}\",ziA=\"[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]\",PiA=\"\\\\u200d\",jiA=a_A+\"?\",qiA=\"[\"+HiA+\"]?\",r_A=\"(?:\"+PiA+\"(?:\"+[TiA,OiA,ziA].join(\"|\")+\")\"+qiA+jiA+\")*\",s_A=qiA+jiA+r_A,g_A=\"(?:\"+[TiA+LF+\"?\",LF,OiA,ziA,o_A].join(\"|\")+\")\",l_A=RegExp(_F+\"(?=\"+_F+\")|\"+g_A+s_A,\"g\"),c_A=RegExp(\"[\"+PiA+GF+JiA+YiA+HiA+\"]\"),C_A=typeof global==\"object\"&&global&&global.Object===Object&&global,I_A=typeof self==\"object\"&&self&&self.Object===Object&&self,d_A=C_A||I_A||Function(\"return this\")();function B_A(t){return t.split(\"\")}function Q_A(t,e,A,i){for(var n=t.length,o=A+(i?1:-1);i?o--:++o<n;)if(e(t[o],o,t))return o;return-1}function E_A(t,e,A){if(e!==e)return Q_A(t,h_A,A);for(var i=A-1,n=t.length;++i<n;)if(t[i]===e)return i;return-1}function h_A(t){return t!==t}function u_A(t,e){for(var A=-1,i=t.length;++A<i&&E_A(e,t[A],0)>-1;);return A}function f_A(t){return c_A.test(t)}function _iA(t){return f_A(t)?m_A(t):B_A(t)}function m_A(t){return t.match(l_A)||[]}var p_A=Object.prototype,D_A=p_A.toString,GiA=d_A.Symbol,KiA=GiA?GiA.prototype:void 0,UiA=KiA?KiA.toString:void 0;function w_A(t,e,A){var i=-1,n=t.length;e<0&&(e=-e>n?0:n+e),A=A>n?n:A,A<0&&(A+=n),n=e>A?0:A-e>>>0,e>>>=0;for(var o=Array(n);++i<n;)o[i]=t[i+e];return o}function ViA(t){if(typeof t==\"string\")return t;if(b_A(t))return UiA?UiA.call(t):\"\";var e=t+\"\";return e==\"0\"&&1/t==-t_A?\"-0\":e}function y_A(t,e,A){var i=t.length;return A=A===void 0?i:A,!e&&A>=i?t:w_A(t,e,A)}function v_A(t){return!!t&&typeof t==\"object\"}function b_A(t){return typeof t==\"symbol\"||v_A(t)&&D_A.call(t)==i_A}function M_A(t){return t==null?\"\":ViA(t)}function k_A(t,e,A){if(t=M_A(t),t&&(A||e===void 0))return t.replace(n_A,\"\");if(!t||!(e=ViA(e)))return t;var i=_iA(t),n=u_A(i,_iA(e));return y_A(i,n).join(\"\")}WiA.exports=k_A});var EnA=Ql((fMe,QnA)=>{\"use strict\";var KF=1/0,S_A=9007199254740991,x_A=17976931348623157e292,XiA=NaN,R_A=\"[object Symbol]\",N_A=/^\\s+|\\s+$/g,F_A=/^[-+]0x[0-9a-f]+$/i,L_A=/^0b[01]+$/i,__A=/^0o[0-7]+$/i,HF=\"\\\\ud800-\\\\udfff\",nnA=\"\\\\u0300-\\\\u036f\\\\ufe20-\\\\ufe23\",onA=\"\\\\u20d0-\\\\u20f0\",anA=\"\\\\ufe0e\\\\ufe0f\",G_A=\"[\"+HF+\"]\",UF=\"[\"+nnA+onA+\"]\",JF=\"\\\\ud83c[\\\\udffb-\\\\udfff]\",K_A=\"(?:\"+UF+\"|\"+JF+\")\",rnA=\"[^\"+HF+\"]\",snA=\"(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}\",gnA=\"[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]\",lnA=\"\\\\u200d\",cnA=K_A+\"?\",CnA=\"[\"+anA+\"]?\",U_A=\"(?:\"+lnA+\"(?:\"+[rnA,snA,gnA].join(\"|\")+\")\"+CnA+cnA+\")*\",J_A=CnA+cnA+U_A,Y_A=\"(?:\"+[rnA+UF+\"?\",UF,snA,gnA,G_A].join(\"|\")+\")\",YF=RegExp(JF+\"(?=\"+JF+\")|\"+Y_A+J_A,\"g\"),H_A=RegExp(\"[\"+lnA+HF+nnA+onA+anA+\"]\"),T_A=parseInt,O_A=typeof global==\"object\"&&global&&global.Object===Object&&global,z_A=typeof self==\"object\"&&self&&self.Object===Object&&self,P_A=O_A||z_A||Function(\"return this\")(),j_A=V_A(\"length\");function q_A(t){return t.split(\"\")}function V_A(t){return function(e){return e?.[t]}}function TF(t){return H_A.test(t)}function InA(t){return TF(t)?Z_A(t):j_A(t)}function W_A(t){return TF(t)?X_A(t):q_A(t)}function Z_A(t){for(var e=YF.lastIndex=0;YF.test(t);)e++;return e}function X_A(t){return t.match(YF)||[]}var $_A=Object.prototype,AGA=$_A.toString,$iA=P_A.Symbol,eGA=Math.ceil,tGA=Math.floor,AnA=$iA?$iA.prototype:void 0,enA=AnA?AnA.toString:void 0;function tnA(t,e){var A=\"\";if(!t||e<1||e>S_A)return A;do e%2&&(A+=t),e=tGA(e/2),e&&(t+=t);while(e);return A}function iGA(t,e,A){var i=-1,n=t.length;e<0&&(e=-e>n?0:n+e),A=A>n?n:A,A<0&&(A+=n),n=e>A?0:A-e>>>0,e>>>=0;for(var o=Array(n);++i<n;)o[i]=t[i+e];return o}function dnA(t){if(typeof t==\"string\")return t;if(BnA(t))return enA?enA.call(t):\"\";var e=t+\"\";return e==\"0\"&&1/t==-KF?\"-0\":e}function nGA(t,e,A){var i=t.length;return A=A===void 0?i:A,!e&&A>=i?t:iGA(t,e,A)}function oGA(t,e){e=e===void 0?\" \":dnA(e);var A=e.length;if(A<2)return A?tnA(e,t):e;var i=tnA(e,eGA(t/InA(e)));return TF(e)?nGA(W_A(i),0,t).join(\"\"):i.slice(0,t)}function inA(t){var e=typeof t;return!!t&&(e==\"object\"||e==\"function\")}function aGA(t){return!!t&&typeof t==\"object\"}function BnA(t){return typeof t==\"symbol\"||aGA(t)&&AGA.call(t)==R_A}function rGA(t){if(!t)return t===0?t:0;if(t=gGA(t),t===KF||t===-KF){var e=t<0?-1:1;return e*x_A}return t===t?t:0}function sGA(t){var e=rGA(t),A=e%1;return e===e?A?e-A:e:0}function gGA(t){if(typeof t==\"number\")return t;if(BnA(t))return XiA;if(inA(t)){var e=typeof t.valueOf==\"function\"?t.valueOf():t;t=inA(e)?e+\"\":e}if(typeof t!=\"string\")return t===0?t:+t;t=t.replace(N_A,\"\");var A=L_A.test(t);return A||__A.test(t)?T_A(t.slice(2),A?2:8):F_A.test(t)?XiA:+t}function lGA(t){return t==null?\"\":dnA(t)}function cGA(t,e,A){t=lGA(t),e=sGA(e);var i=e?InA(t):0;return e&&i<e?t+oGA(e-i,A):t}QnA.exports=cGA});var unA=Ql((mMe,hnA)=>{\"use strict\";hnA.exports=(t,e,A,i)=>{let n=(t+(i||\"\")).toString().includes(\"%\");if(typeof t==\"string\"?[t,e,A,i]=t.match(/(0?\\.?\\d{1,3})%?\\b/g).map(Number):i!==void 0&&(i=parseFloat(i)),typeof t!=\"number\"||typeof e!=\"number\"||typeof A!=\"number\"||t>255||e>255||A>255)throw new TypeError(\"Expected three numbers below 256\");if(typeof i==\"number\"){if(!n&&i>=0&&i<=1)i=Math.round(255*i);else if(n&&i>=0&&i<=100)i=Math.round(255*i/100);else throw new TypeError(`Expected alpha value (${i}) as a fraction or percentage`);i=(i|256).toString(16).slice(1)}else i=\"\";return(A|e<<8|t<<16|1<<24).toString(16).slice(1)+i}});var mnA=Ql((pMe,fnA)=>{\"use strict\";var nf=\"a-f\\\\d\",CGA=`#?[${nf}]{3}[${nf}]?`,IGA=`#?[${nf}]{6}([${nf}]{2})?`,dGA=new RegExp(`[^#${nf}]`,\"gi\"),BGA=new RegExp(`^${CGA}$|^${IGA}$`,\"i\");fnA.exports=(t,e={})=>{if(typeof t!=\"string\"||dGA.test(t)||!BGA.test(t))throw new TypeError(\"Expected a valid hex string\");t=t.replace(/^#/,\"\");let A=1;t.length===8&&(A=Number.parseInt(t.slice(6,8),16)/255,t=t.slice(0,6)),t.length===4&&(A=Number.parseInt(t.slice(3,4).repeat(2),16)/255,t=t.slice(0,3)),t.length===3&&(t=t[0]+t[0]+t[1]+t[1]+t[2]+t[2]);let i=Number.parseInt(t,16),n=i>>16,o=i>>8&255,a=i&255,r=typeof e.alpha==\"number\"?e.alpha:A;if(e.format===\"array\")return[n,o,a,r];if(e.format===\"css\"){let s=r===1?\"\":` / ${Number((r*100).toFixed(2))}%`;return`rgb(${n} ${o} ${a}${s})`}return{red:n,green:o,blue:a,alpha:r}}});var wnA=Ql((DMe,DnA)=>{\"use strict\";var QGA=IiA(),EGA=LiA(),hGA=ZiA(),uGA=EnA(),fGA=unA(),pnA=mnA(),OF=.75,zF=.25,PF=16777215,mGA=49979693;DnA.exports=function(t){return\"#\"+wGA(String(JSON.stringify(t)))};function pGA(t){var e=EGA(t),A=[];return e.forEach(function(i){var n=QGA(i);n&&A.push(pnA(hGA(n,\"#\"),{format:\"array\"}))}),A}function DGA(t){var e=[0,0,0];return t.forEach(function(A){for(var i=0;i<3;i++)e[i]+=A[i]}),[e[0]/t.length,e[1]/t.length,e[2]/t.length]}function wGA(t){var e,A=pGA(t);A.length>0&&(e=DGA(A));var i=1,n=0,o=1;if(t.length>0)for(var a=0;a<t.length;a++)t[a].charCodeAt(0)>n&&(n=t[a].charCodeAt(0)),o=parseInt(PF/n),i=(i+t[a].charCodeAt(0)*o*mGA)%PF;var r=(i*t.length%PF).toString(16);r=uGA(r,6,r);var s=pnA(r,{format:\"array\"});return e?fGA(zF*s[0]+OF*e[0],zF*s[1]+OF*e[1],zF*s[2]+OF*e[2]):r}});var jL=(()=>{class t{_renderer;_elementRef;onChange=A=>{};onTouched=()=>{};constructor(A,i){this._renderer=A,this._elementRef=i}setProperty(A,i){this._renderer.setProperty(this._elementRef.nativeElement,A,i)}registerOnTouched(A){this.onTouched=A}registerOnChange(A){this.onChange=A}setDisabledState(A){this.setProperty(\"disabled\",A)}static \\u0275fac=function(i){return new(i||t)(lt(ui),lt(ge))};static \\u0275dir=OA({type:t})}return t})(),qL=(()=>{class t extends jL{static \\u0275fac=(()=>{let A;return function(n){return(A||(A=hi(t)))(n||t)}})();static \\u0275dir=OA({type:t,features:[Ct]})}return t})(),gg=new wA(\"\");var xnA={provide:gg,useExisting:ar(()=>ro),multi:!0};function RnA(){let t=uv()?uv().getUserAgent():\"\";return/android (\\d+)/.test(t.toLowerCase())}var NnA=new wA(\"\"),ro=(()=>{class t extends jL{_compositionMode;_composing=!1;constructor(A,i,n){super(A,i),this._compositionMode=n,this._compositionMode==null&&(this._compositionMode=!RnA())}writeValue(A){let i=A??\"\";this.setProperty(\"value\",i)}_handleInput(A){(!this._compositionMode||this._compositionMode&&!this._composing)&&this.onChange(A)}_compositionStart(){this._composing=!0}_compositionEnd(A){this._composing=!1,this._compositionMode&&this.onChange(A)}static \\u0275fac=function(i){return new(i||t)(lt(ui),lt(ge),lt(NnA,8))};static \\u0275dir=OA({type:t,selectors:[[\"input\",\"formControlName\",\"\",3,\"type\",\"checkbox\"],[\"textarea\",\"formControlName\",\"\"],[\"input\",\"formControl\",\"\",3,\"type\",\"checkbox\"],[\"textarea\",\"formControl\",\"\"],[\"input\",\"ngModel\",\"\",3,\"type\",\"checkbox\"],[\"textarea\",\"ngModel\",\"\"],[\"\",\"ngDefaultControl\",\"\"]],hostBindings:function(i,n){i&1&&$(\"input\",function(a){return n._handleInput(a.target.value)})(\"blur\",function(){return n.onTouched()})(\"compositionstart\",function(){return n._compositionStart()})(\"compositionend\",function(a){return n._compositionEnd(a.target.value)})},standalone:!1,features:[It([xnA]),Ct]})}return t})();function yv(t){return t==null||vv(t)===0}function vv(t){return t==null?null:Array.isArray(t)||typeof t==\"string\"?t.length:t instanceof Set?t.size:null}var vc=new wA(\"\"),nh=new wA(\"\"),FnA=/^(?=.{1,254}$)(?=.{1,64}@)[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[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])?)*$/,Ss=class{static min(e){return VL(e)}static max(e){return LnA(e)}static required(e){return _nA(e)}static requiredTrue(e){return GnA(e)}static email(e){return KnA(e)}static minLength(e){return UnA(e)}static maxLength(e){return JnA(e)}static pattern(e){return YnA(e)}static nullValidator(e){return kf()}static compose(e){return e_(e)}static composeAsync(e){return t_(e)}};function VL(t){return e=>{if(e.value==null||t==null)return null;let A=parseFloat(e.value);return!isNaN(A)&&A<t?{min:{min:t,actual:e.value}}:null}}function LnA(t){return e=>{if(e.value==null||t==null)return null;let A=parseFloat(e.value);return!isNaN(A)&&A>t?{max:{max:t,actual:e.value}}:null}}function _nA(t){return yv(t.value)?{required:!0}:null}function GnA(t){return t.value===!0?null:{required:!0}}function KnA(t){return yv(t.value)||FnA.test(t.value)?null:{email:!0}}function UnA(t){return e=>{let A=e.value?.length??vv(e.value);return A===null||A===0?null:A<t?{minlength:{requiredLength:t,actualLength:A}}:null}}function JnA(t){return e=>{let A=e.value?.length??vv(e.value);return A!==null&&A>t?{maxlength:{requiredLength:t,actualLength:A}}:null}}function YnA(t){if(!t)return kf;let e,A;return typeof t==\"string\"?(A=\"\",t.charAt(0)!==\"^\"&&(A+=\"^\"),A+=t,t.charAt(t.length-1)!==\"$\"&&(A+=\"$\"),e=new RegExp(A)):(A=t.toString(),e=t),i=>{if(yv(i.value))return null;let n=i.value;return e.test(n)?null:{pattern:{requiredPattern:A,actualValue:n}}}}function kf(t){return null}function WL(t){return t!=null}function ZL(t){return pf(t)?mr(t):t}function XL(t){let e={};return t.forEach(A=>{e=A!=null?BA(BA({},e),A):e}),Object.keys(e).length===0?null:e}function $L(t,e){return e.map(A=>A(t))}function HnA(t){return!t.validate}function A_(t){return t.map(e=>HnA(e)?e:A=>e.validate(A))}function e_(t){if(!t)return null;let e=t.filter(WL);return e.length==0?null:function(A){return XL($L(A,e))}}function bv(t){return t!=null?e_(A_(t)):null}function t_(t){if(!t)return null;let e=t.filter(WL);return e.length==0?null:function(A){let i=$L(A,e).map(ZL);return cf(i).pipe(fe(XL))}}function Mv(t){return t!=null?t_(A_(t)):null}function JL(t,e){return t===null?[e]:Array.isArray(t)?[...t,e]:[t,e]}function i_(t){return t._rawValidators}function n_(t){return t._rawAsyncValidators}function pv(t){return t?Array.isArray(t)?t:[t]:[]}function Sf(t,e){return Array.isArray(t)?t.includes(e):t===e}function YL(t,e){let A=pv(e);return pv(t).forEach(n=>{Sf(A,n)||A.push(n)}),A}function HL(t,e){return pv(e).filter(A=>!Sf(t,A))}var xf=class{get value(){return this.control?this.control.value:null}get valid(){return this.control?this.control.valid:null}get invalid(){return this.control?this.control.invalid:null}get pending(){return this.control?this.control.pending:null}get disabled(){return this.control?this.control.disabled:null}get enabled(){return this.control?this.control.enabled:null}get errors(){return this.control?this.control.errors:null}get pristine(){return this.control?this.control.pristine:null}get dirty(){return this.control?this.control.dirty:null}get touched(){return this.control?this.control.touched:null}get status(){return this.control?this.control.status:null}get untouched(){return this.control?this.control.untouched:null}get statusChanges(){return this.control?this.control.statusChanges:null}get valueChanges(){return this.control?this.control.valueChanges:null}get path(){return null}_composedValidatorFn;_composedAsyncValidatorFn;_rawValidators=[];_rawAsyncValidators=[];_setValidators(e){this._rawValidators=e||[],this._composedValidatorFn=bv(this._rawValidators)}_setAsyncValidators(e){this._rawAsyncValidators=e||[],this._composedAsyncValidatorFn=Mv(this._rawAsyncValidators)}get validator(){return this._composedValidatorFn||null}get asyncValidator(){return this._composedAsyncValidatorFn||null}_onDestroyCallbacks=[];_registerOnDestroy(e){this._onDestroyCallbacks.push(e)}_invokeOnDestroyCallbacks(){this._onDestroyCallbacks.forEach(e=>e()),this._onDestroyCallbacks=[]}reset(e=void 0){this.control?.reset(e)}hasError(e,A){return this.control?this.control.hasError(e,A):!1}getError(e,A){return this.control?this.control.getError(e,A):null}},v0=class extends xf{name;get formDirective(){return null}get path(){return null}},xs=class extends xf{_parent=null;name=null;valueAccessor=null},Rf=class{_cd;constructor(e){this._cd=e}get isTouched(){return this._cd?.control?._touched?.(),!!this._cd?.control?.touched}get isUntouched(){return!!this._cd?.control?.untouched}get isPristine(){return this._cd?.control?._pristine?.(),!!this._cd?.control?.pristine}get isDirty(){return!!this._cd?.control?.dirty}get isValid(){return this._cd?.control?._status?.(),!!this._cd?.control?.valid}get isInvalid(){return!!this._cd?.control?.invalid}get isPending(){return!!this._cd?.control?.pending}get isSubmitted(){return this._cd?._submitted?.(),!!this._cd?.submitted}};var so=(()=>{class t extends Rf{constructor(A){super(A)}static \\u0275fac=function(i){return new(i||t)(lt(xs,2))};static \\u0275dir=OA({type:t,selectors:[[\"\",\"formControlName\",\"\"],[\"\",\"ngModel\",\"\"],[\"\",\"formControl\",\"\"]],hostVars:14,hostBindings:function(i,n){i&2&&ae(\"ng-untouched\",n.isUntouched)(\"ng-touched\",n.isTouched)(\"ng-pristine\",n.isPristine)(\"ng-dirty\",n.isDirty)(\"ng-valid\",n.isValid)(\"ng-invalid\",n.isInvalid)(\"ng-pending\",n.isPending)},standalone:!1,features:[Ct]})}return t})(),o_=(()=>{class t extends Rf{constructor(A){super(A)}static \\u0275fac=function(i){return new(i||t)(lt(v0,10))};static \\u0275dir=OA({type:t,selectors:[[\"\",\"formGroupName\",\"\"],[\"\",\"formArrayName\",\"\"],[\"\",\"ngModelGroup\",\"\"],[\"\",\"formGroup\",\"\"],[\"\",\"formArray\",\"\"],[\"form\",3,\"ngNoForm\",\"\"],[\"\",\"ngForm\",\"\"]],hostVars:16,hostBindings:function(i,n){i&2&&ae(\"ng-untouched\",n.isUntouched)(\"ng-touched\",n.isTouched)(\"ng-pristine\",n.isPristine)(\"ng-dirty\",n.isDirty)(\"ng-valid\",n.isValid)(\"ng-invalid\",n.isInvalid)(\"ng-pending\",n.isPending)(\"ng-submitted\",n.isSubmitted)},standalone:!1,features:[Ct]})}return t})();var ZE=\"VALID\",Mf=\"INVALID\",pd=\"PENDING\",XE=\"DISABLED\",_C=class{},Nf=class extends _C{value;source;constructor(e,A){super(),this.value=e,this.source=A}},Ah=class extends _C{pristine;source;constructor(e,A){super(),this.pristine=e,this.source=A}},eh=class extends _C{touched;source;constructor(e,A){super(),this.touched=e,this.source=A}},Dd=class extends _C{status;source;constructor(e,A){super(),this.status=e,this.source=A}},Ff=class extends _C{source;constructor(e){super(),this.source=e}},th=class extends _C{source;constructor(e){super(),this.source=e}};function kv(t){return(Kf(t)?t.validators:t)||null}function TnA(t){return Array.isArray(t)?bv(t):t||null}function Sv(t,e){return(Kf(e)?e.asyncValidators:t)||null}function OnA(t){return Array.isArray(t)?Mv(t):t||null}function Kf(t){return t!=null&&!Array.isArray(t)&&typeof t==\"object\"}function a_(t,e,A){let i=t.controls;if(!(e?Object.keys(i):i).length)throw new wt(1e3,\"\");if(!i[A])throw new wt(1001,\"\")}function r_(t,e,A){t._forEachChild((i,n)=>{if(A[n]===void 0)throw new wt(1002,\"\")})}var wd=class{_pendingDirty=!1;_hasOwnPendingAsyncValidator=null;_pendingTouched=!1;_onCollectionChange=()=>{};_updateOn;_parent=null;_asyncValidationSubscription;_composedValidatorFn;_composedAsyncValidatorFn;_rawValidators;_rawAsyncValidators;value;constructor(e,A){this._assignValidators(e),this._assignAsyncValidators(A)}get validator(){return this._composedValidatorFn}set validator(e){this._rawValidators=this._composedValidatorFn=e}get asyncValidator(){return this._composedAsyncValidatorFn}set asyncValidator(e){this._rawAsyncValidators=this._composedAsyncValidatorFn=e}get parent(){return this._parent}get status(){return Zo(this.statusReactive)}set status(e){Zo(()=>this.statusReactive.set(e))}_status=_e(()=>this.statusReactive());statusReactive=jA(void 0);get valid(){return this.status===ZE}get invalid(){return this.status===Mf}get pending(){return this.status==pd}get disabled(){return this.status===XE}get enabled(){return this.status!==XE}errors;get pristine(){return Zo(this.pristineReactive)}set pristine(e){Zo(()=>this.pristineReactive.set(e))}_pristine=_e(()=>this.pristineReactive());pristineReactive=jA(!0);get dirty(){return!this.pristine}get touched(){return Zo(this.touchedReactive)}set touched(e){Zo(()=>this.touchedReactive.set(e))}_touched=_e(()=>this.touchedReactive());touchedReactive=jA(!1);get untouched(){return!this.touched}_events=new $A;events=this._events.asObservable();valueChanges;statusChanges;get updateOn(){return this._updateOn?this._updateOn:this.parent?this.parent.updateOn:\"change\"}setValidators(e){this._assignValidators(e)}setAsyncValidators(e){this._assignAsyncValidators(e)}addValidators(e){this.setValidators(YL(e,this._rawValidators))}addAsyncValidators(e){this.setAsyncValidators(YL(e,this._rawAsyncValidators))}removeValidators(e){this.setValidators(HL(e,this._rawValidators))}removeAsyncValidators(e){this.setAsyncValidators(HL(e,this._rawAsyncValidators))}hasValidator(e){return Sf(this._rawValidators,e)}hasAsyncValidator(e){return Sf(this._rawAsyncValidators,e)}clearValidators(){this.validator=null}clearAsyncValidators(){this.asyncValidator=null}markAsTouched(e={}){let A=this.touched===!1;this.touched=!0;let i=e.sourceControl??this;e.onlySelf||this._parent?.markAsTouched(Ve(BA({},e),{sourceControl:i})),A&&e.emitEvent!==!1&&this._events.next(new eh(!0,i))}markAllAsDirty(e={}){this.markAsDirty({onlySelf:!0,emitEvent:e.emitEvent,sourceControl:this}),this._forEachChild(A=>A.markAllAsDirty(e))}markAllAsTouched(e={}){this.markAsTouched({onlySelf:!0,emitEvent:e.emitEvent,sourceControl:this}),this._forEachChild(A=>A.markAllAsTouched(e))}markAsUntouched(e={}){let A=this.touched===!0;this.touched=!1,this._pendingTouched=!1;let i=e.sourceControl??this;this._forEachChild(n=>{n.markAsUntouched({onlySelf:!0,emitEvent:e.emitEvent,sourceControl:i})}),e.onlySelf||this._parent?._updateTouched(e,i),A&&e.emitEvent!==!1&&this._events.next(new eh(!1,i))}markAsDirty(e={}){let A=this.pristine===!0;this.pristine=!1;let i=e.sourceControl??this;e.onlySelf||this._parent?.markAsDirty(Ve(BA({},e),{sourceControl:i})),A&&e.emitEvent!==!1&&this._events.next(new Ah(!1,i))}markAsPristine(e={}){let A=this.pristine===!1;this.pristine=!0,this._pendingDirty=!1;let i=e.sourceControl??this;this._forEachChild(n=>{n.markAsPristine({onlySelf:!0,emitEvent:e.emitEvent})}),e.onlySelf||this._parent?._updatePristine(e,i),A&&e.emitEvent!==!1&&this._events.next(new Ah(!0,i))}markAsPending(e={}){this.status=pd;let A=e.sourceControl??this;e.emitEvent!==!1&&(this._events.next(new Dd(this.status,A)),this.statusChanges.emit(this.status)),e.onlySelf||this._parent?.markAsPending(Ve(BA({},e),{sourceControl:A}))}disable(e={}){let A=this._parentMarkedDirty(e.onlySelf);this.status=XE,this.errors=null,this._forEachChild(n=>{n.disable(Ve(BA({},e),{onlySelf:!0}))}),this._updateValue();let i=e.sourceControl??this;e.emitEvent!==!1&&(this._events.next(new Nf(this.value,i)),this._events.next(new Dd(this.status,i)),this.valueChanges.emit(this.value),this.statusChanges.emit(this.status)),this._updateAncestors(Ve(BA({},e),{skipPristineCheck:A}),this),this._onDisabledChange.forEach(n=>n(!0))}enable(e={}){let A=this._parentMarkedDirty(e.onlySelf);this.status=ZE,this._forEachChild(i=>{i.enable(Ve(BA({},e),{onlySelf:!0}))}),this.updateValueAndValidity({onlySelf:!0,emitEvent:e.emitEvent}),this._updateAncestors(Ve(BA({},e),{skipPristineCheck:A}),this),this._onDisabledChange.forEach(i=>i(!1))}_updateAncestors(e,A){e.onlySelf||(this._parent?.updateValueAndValidity(e),e.skipPristineCheck||this._parent?._updatePristine({},A),this._parent?._updateTouched({},A))}setParent(e){this._parent=e}getRawValue(){return this.value}updateValueAndValidity(e={}){if(this._setInitialStatus(),this._updateValue(),this.enabled){let i=this._cancelExistingSubscription();this.errors=this._runValidator(),this.status=this._calculateStatus(),(this.status===ZE||this.status===pd)&&this._runAsyncValidator(i,e.emitEvent)}let A=e.sourceControl??this;e.emitEvent!==!1&&(this._events.next(new Nf(this.value,A)),this._events.next(new Dd(this.status,A)),this.valueChanges.emit(this.value),this.statusChanges.emit(this.status)),e.onlySelf||this._parent?.updateValueAndValidity(Ve(BA({},e),{sourceControl:A}))}_updateTreeValidity(e={emitEvent:!0}){this._forEachChild(A=>A._updateTreeValidity(e)),this.updateValueAndValidity({onlySelf:!0,emitEvent:e.emitEvent})}_setInitialStatus(){this.status=this._allControlsDisabled()?XE:ZE}_runValidator(){return this.validator?this.validator(this):null}_runAsyncValidator(e,A){if(this.asyncValidator){this.status=pd,this._hasOwnPendingAsyncValidator={emitEvent:A!==!1,shouldHaveEmitted:e!==!1};let i=ZL(this.asyncValidator(this));this._asyncValidationSubscription=i.subscribe(n=>{this._hasOwnPendingAsyncValidator=null,this.setErrors(n,{emitEvent:A,shouldHaveEmitted:e})})}}_cancelExistingSubscription(){if(this._asyncValidationSubscription){this._asyncValidationSubscription.unsubscribe();let e=(this._hasOwnPendingAsyncValidator?.emitEvent||this._hasOwnPendingAsyncValidator?.shouldHaveEmitted)??!1;return this._hasOwnPendingAsyncValidator=null,e}return!1}setErrors(e,A={}){this.errors=e,this._updateControlsErrors(A.emitEvent!==!1,this,A.shouldHaveEmitted)}get(e){let A=e;return A==null||(Array.isArray(A)||(A=A.split(\".\")),A.length===0)?null:A.reduce((i,n)=>i&&i._find(n),this)}getError(e,A){let i=A?this.get(A):this;return i?.errors?i.errors[e]:null}hasError(e,A){return!!this.getError(e,A)}get root(){let e=this;for(;e._parent;)e=e._parent;return e}_updateControlsErrors(e,A,i){this.status=this._calculateStatus(),e&&this.statusChanges.emit(this.status),(e||i)&&this._events.next(new Dd(this.status,A)),this._parent&&this._parent._updateControlsErrors(e,A,i)}_initObservables(){this.valueChanges=new WA,this.statusChanges=new WA}_calculateStatus(){return this._allControlsDisabled()?XE:this.errors?Mf:this._hasOwnPendingAsyncValidator||this._anyControlsHaveStatus(pd)?pd:this._anyControlsHaveStatus(Mf)?Mf:ZE}_anyControlsHaveStatus(e){return this._anyControls(A=>A.status===e)}_anyControlsDirty(){return this._anyControls(e=>e.dirty)}_anyControlsTouched(){return this._anyControls(e=>e.touched)}_updatePristine(e,A){let i=!this._anyControlsDirty(),n=this.pristine!==i;this.pristine=i,e.onlySelf||this._parent?._updatePristine(e,A),n&&this._events.next(new Ah(this.pristine,A))}_updateTouched(e={},A){this.touched=this._anyControlsTouched(),this._events.next(new eh(this.touched,A)),e.onlySelf||this._parent?._updateTouched(e,A)}_onDisabledChange=[];_registerOnCollectionChange(e){this._onCollectionChange=e}_setUpdateStrategy(e){Kf(e)&&e.updateOn!=null&&(this._updateOn=e.updateOn)}_parentMarkedDirty(e){return!e&&!!this._parent?.dirty&&!this._parent._anyControlsDirty()}_find(e){return null}_assignValidators(e){this._rawValidators=Array.isArray(e)?e.slice():e,this._composedValidatorFn=TnA(this._rawValidators)}_assignAsyncValidators(e){this._rawAsyncValidators=Array.isArray(e)?e.slice():e,this._composedAsyncValidatorFn=OnA(this._rawAsyncValidators)}},yd=class extends wd{constructor(e,A,i){super(kv(A),Sv(i,A)),this.controls=e,this._initObservables(),this._setUpdateStrategy(A),this._setUpControls(),this.updateValueAndValidity({onlySelf:!0,emitEvent:!!this.asyncValidator})}controls;registerControl(e,A){return this.controls[e]?this.controls[e]:(this.controls[e]=A,A.setParent(this),A._registerOnCollectionChange(this._onCollectionChange),A)}addControl(e,A,i={}){this.registerControl(e,A),this.updateValueAndValidity({emitEvent:i.emitEvent}),this._onCollectionChange()}removeControl(e,A={}){this.controls[e]&&this.controls[e]._registerOnCollectionChange(()=>{}),delete this.controls[e],this.updateValueAndValidity({emitEvent:A.emitEvent}),this._onCollectionChange()}setControl(e,A,i={}){this.controls[e]&&this.controls[e]._registerOnCollectionChange(()=>{}),delete this.controls[e],A&&this.registerControl(e,A),this.updateValueAndValidity({emitEvent:i.emitEvent}),this._onCollectionChange()}contains(e){return this.controls.hasOwnProperty(e)&&this.controls[e].enabled}setValue(e,A={}){r_(this,!0,e),Object.keys(e).forEach(i=>{a_(this,!0,i),this.controls[i].setValue(e[i],{onlySelf:!0,emitEvent:A.emitEvent})}),this.updateValueAndValidity(A)}patchValue(e,A={}){e!=null&&(Object.keys(e).forEach(i=>{let n=this.controls[i];n&&n.patchValue(e[i],{onlySelf:!0,emitEvent:A.emitEvent})}),this.updateValueAndValidity(A))}reset(e={},A={}){this._forEachChild((i,n)=>{i.reset(e?e[n]:null,Ve(BA({},A),{onlySelf:!0}))}),this._updatePristine(A,this),this._updateTouched(A,this),this.updateValueAndValidity(A),A?.emitEvent!==!1&&this._events.next(new th(this))}getRawValue(){return this._reduceChildren({},(e,A,i)=>(e[i]=A.getRawValue(),e))}_syncPendingControls(){let e=this._reduceChildren(!1,(A,i)=>i._syncPendingControls()?!0:A);return e&&this.updateValueAndValidity({onlySelf:!0}),e}_forEachChild(e){Object.keys(this.controls).forEach(A=>{let i=this.controls[A];i&&e(i,A)})}_setUpControls(){this._forEachChild(e=>{e.setParent(this),e._registerOnCollectionChange(this._onCollectionChange)})}_updateValue(){this.value=this._reduceValue()}_anyControls(e){for(let[A,i]of Object.entries(this.controls))if(this.contains(A)&&e(i))return!0;return!1}_reduceValue(){let e={};return this._reduceChildren(e,(A,i,n)=>((i.enabled||this.disabled)&&(A[n]=i.value),A))}_reduceChildren(e,A){let i=e;return this._forEachChild((n,o)=>{i=A(i,n,o)}),i}_allControlsDisabled(){for(let e of Object.keys(this.controls))if(this.controls[e].enabled)return!1;return Object.keys(this.controls).length>0||this.disabled}_find(e){return this.controls.hasOwnProperty(e)?this.controls[e]:null}};var Dv=class extends yd{};var vd=new wA(\"\",{factory:()=>Uf}),Uf=\"always\";function s_(t,e){return[...e.path,t]}function ih(t,e,A=Uf){xv(t,e),e.valueAccessor.writeValue(t.value),(t.disabled||A===\"always\")&&e.valueAccessor.setDisabledState?.(t.disabled),PnA(t,e),qnA(t,e),jnA(t,e),znA(t,e)}function Lf(t,e,A=!0){let i=()=>{};e?.valueAccessor?.registerOnChange(i),e?.valueAccessor?.registerOnTouched(i),Gf(t,e),t&&(e._invokeOnDestroyCallbacks(),t._registerOnCollectionChange(()=>{}))}function _f(t,e){t.forEach(A=>{A.registerOnValidatorChange&&A.registerOnValidatorChange(e)})}function znA(t,e){if(e.valueAccessor.setDisabledState){let A=i=>{e.valueAccessor.setDisabledState(i)};t.registerOnDisabledChange(A),e._registerOnDestroy(()=>{t._unregisterOnDisabledChange(A)})}}function xv(t,e){let A=i_(t);e.validator!==null?t.setValidators(JL(A,e.validator)):typeof A==\"function\"&&t.setValidators([A]);let i=n_(t);e.asyncValidator!==null?t.setAsyncValidators(JL(i,e.asyncValidator)):typeof i==\"function\"&&t.setAsyncValidators([i]);let n=()=>t.updateValueAndValidity();_f(e._rawValidators,n),_f(e._rawAsyncValidators,n)}function Gf(t,e){let A=!1;if(t!==null){if(e.validator!==null){let n=i_(t);if(Array.isArray(n)&&n.length>0){let o=n.filter(a=>a!==e.validator);o.length!==n.length&&(A=!0,t.setValidators(o))}}if(e.asyncValidator!==null){let n=n_(t);if(Array.isArray(n)&&n.length>0){let o=n.filter(a=>a!==e.asyncValidator);o.length!==n.length&&(A=!0,t.setAsyncValidators(o))}}}let i=()=>{};return _f(e._rawValidators,i),_f(e._rawAsyncValidators,i),A}function PnA(t,e){e.valueAccessor.registerOnChange(A=>{t._pendingValue=A,t._pendingChange=!0,t._pendingDirty=!0,t.updateOn===\"change\"&&g_(t,e)})}function jnA(t,e){e.valueAccessor.registerOnTouched(()=>{t._pendingTouched=!0,t.updateOn===\"blur\"&&t._pendingChange&&g_(t,e),t.updateOn!==\"submit\"&&t.markAsTouched()})}function g_(t,e){t._pendingDirty&&t.markAsDirty(),t.setValue(t._pendingValue,{emitModelToViewChange:!1}),e.viewToModelUpdate(t._pendingValue),t._pendingChange=!1}function qnA(t,e){let A=(i,n)=>{e.valueAccessor.writeValue(i),n&&e.viewToModelUpdate(i)};t.registerOnChange(A),e._registerOnDestroy(()=>{t._unregisterOnChange(A)})}function l_(t,e){t==null,xv(t,e)}function VnA(t,e){return Gf(t,e)}function Rv(t,e){if(!t.hasOwnProperty(\"model\"))return!1;let A=t.model;return A.isFirstChange()?!0:!Object.is(e,A.currentValue)}function WnA(t){return Object.getPrototypeOf(t.constructor)===qL}function c_(t,e){t._syncPendingControls(),e.forEach(A=>{let i=A.control;i.updateOn===\"submit\"&&i._pendingChange&&(A.viewToModelUpdate(i._pendingValue),i._pendingChange=!1)})}function Nv(t,e){if(!e)return null;Array.isArray(e);let A,i,n;return e.forEach(o=>{o.constructor===ro?A=o:WnA(o)?i=o:n=o}),n||i||A||null}function ZnA(t,e){let A=t.indexOf(e);A>-1&&t.splice(A,1)}var XnA={provide:v0,useExisting:ar(()=>bd)},$E=Promise.resolve(),bd=(()=>{class t extends v0{callSetDisabledState;get submitted(){return Zo(this.submittedReactive)}_submitted=_e(()=>this.submittedReactive());submittedReactive=jA(!1);_directives=new Set;form;ngSubmit=new WA;options;constructor(A,i,n){super(),this.callSetDisabledState=n,this.form=new yd({},bv(A),Mv(i))}ngAfterViewInit(){this._setUpdateStrategy()}get formDirective(){return this}get control(){return this.form}get path(){return[]}get controls(){return this.form.controls}addControl(A){$E.then(()=>{let i=this._findContainer(A.path);A.control=i.registerControl(A.name,A.control),ih(A.control,A,this.callSetDisabledState),A.control.updateValueAndValidity({emitEvent:!1}),this._directives.add(A)})}getControl(A){return this.form.get(A.path)}removeControl(A){$E.then(()=>{this._findContainer(A.path)?.removeControl(A.name),this._directives.delete(A)})}addFormGroup(A){$E.then(()=>{let i=this._findContainer(A.path),n=new yd({});l_(n,A),i.registerControl(A.name,n),n.updateValueAndValidity({emitEvent:!1})})}removeFormGroup(A){$E.then(()=>{this._findContainer(A.path)?.removeControl?.(A.name)})}getFormGroup(A){return this.form.get(A.path)}updateModel(A,i){$E.then(()=>{this.form.get(A.path).setValue(i)})}setValue(A){this.control.setValue(A)}onSubmit(A){return this.submittedReactive.set(!0),c_(this.form,this._directives),this.ngSubmit.emit(A),this.form._events.next(new Ff(this.control)),A?.target?.method===\"dialog\"}onReset(){this.resetForm()}resetForm(A=void 0){this.form.reset(A),this.submittedReactive.set(!1)}_setUpdateStrategy(){this.options&&this.options.updateOn!=null&&(this.form._updateOn=this.options.updateOn)}_findContainer(A){return A.pop(),A.length?this.form.get(A):this.form}static \\u0275fac=function(i){return new(i||t)(lt(vc,10),lt(nh,10),lt(vd,8))};static \\u0275dir=OA({type:t,selectors:[[\"form\",3,\"ngNoForm\",\"\",3,\"formGroup\",\"\",3,\"formArray\",\"\"],[\"ng-form\"],[\"\",\"ngForm\",\"\"]],hostBindings:function(i,n){i&1&&$(\"submit\",function(a){return n.onSubmit(a)})(\"reset\",function(){return n.onReset()})},inputs:{options:[0,\"ngFormOptions\",\"options\"]},outputs:{ngSubmit:\"ngSubmit\"},exportAs:[\"ngForm\"],standalone:!1,features:[It([XnA]),Ct]})}return t})();function TL(t,e){let A=t.indexOf(e);A>-1&&t.splice(A,1)}function OL(t){return typeof t==\"object\"&&t!==null&&Object.keys(t).length===2&&\"value\"in t&&\"disabled\"in t}var ss=class extends wd{defaultValue=null;_onChange=[];_pendingValue;_pendingChange=!1;constructor(e=null,A,i){super(kv(A),Sv(i,A)),this._applyFormState(e),this._setUpdateStrategy(A),this._initObservables(),this.updateValueAndValidity({onlySelf:!0,emitEvent:!!this.asyncValidator}),Kf(A)&&(A.nonNullable||A.initialValueIsDefault)&&(OL(e)?this.defaultValue=e.value:this.defaultValue=e)}setValue(e,A={}){this.value=this._pendingValue=e,this._onChange.length&&A.emitModelToViewChange!==!1&&this._onChange.forEach(i=>i(this.value,A.emitViewToModelChange!==!1)),this.updateValueAndValidity(A)}patchValue(e,A={}){this.setValue(e,A)}reset(e=this.defaultValue,A={}){this._applyFormState(e),this.markAsPristine(A),this.markAsUntouched(A),this.setValue(this.value,A),A.overwriteDefaultValue&&(this.defaultValue=this.value),this._pendingChange=!1,A?.emitEvent!==!1&&this._events.next(new th(this))}_updateValue(){}_anyControls(e){return!1}_allControlsDisabled(){return this.disabled}registerOnChange(e){this._onChange.push(e)}_unregisterOnChange(e){TL(this._onChange,e)}registerOnDisabledChange(e){this._onDisabledChange.push(e)}_unregisterOnDisabledChange(e){TL(this._onDisabledChange,e)}_forEachChild(e){}_syncPendingControls(){return this.updateOn===\"submit\"&&(this._pendingDirty&&this.markAsDirty(),this._pendingTouched&&this.markAsTouched(),this._pendingChange)?(this.setValue(this._pendingValue,{onlySelf:!0,emitModelToViewChange:!1}),!0):!1}_applyFormState(e){OL(e)?(this.value=this._pendingValue=e.value,e.disabled?this.disable({onlySelf:!0,emitEvent:!1}):this.enable({onlySelf:!0,emitEvent:!1})):this.value=this._pendingValue=e}};var $nA=t=>t instanceof ss;var AoA={provide:xs,useExisting:ar(()=>Ca)},zL=Promise.resolve(),Ca=(()=>{class t extends xs{_changeDetectorRef;callSetDisabledState;control=new ss;static ngAcceptInputType_isDisabled;_registered=!1;viewModel;name=\"\";isDisabled;model;options;update=new WA;constructor(A,i,n,o,a,r){super(),this._changeDetectorRef=a,this.callSetDisabledState=r,this._parent=A,this._setValidators(i),this._setAsyncValidators(n),this.valueAccessor=Nv(this,o)}ngOnChanges(A){if(this._checkForErrors(),!this._registered||\"name\"in A){if(this._registered&&(this._checkName(),this.formDirective)){let i=A.name.previousValue;this.formDirective.removeControl({name:i,path:this._getPath(i)})}this._setUpControl()}\"isDisabled\"in A&&this._updateDisabled(A),Rv(A,this.viewModel)&&(this._updateValue(this.model),this.viewModel=this.model)}ngOnDestroy(){this.formDirective?.removeControl(this)}get path(){return this._getPath(this.name)}get formDirective(){return this._parent?this._parent.formDirective:null}viewToModelUpdate(A){this.viewModel=A,this.update.emit(A)}_setUpControl(){this._setUpdateStrategy(),this._isStandalone()?this._setUpStandalone():this.formDirective.addControl(this),this._registered=!0}_setUpdateStrategy(){this.options&&this.options.updateOn!=null&&(this.control._updateOn=this.options.updateOn)}_isStandalone(){return!this._parent||!!(this.options&&this.options.standalone)}_setUpStandalone(){ih(this.control,this,this.callSetDisabledState),this.control.updateValueAndValidity({emitEvent:!1})}_checkForErrors(){this._checkName()}_checkName(){this.options&&this.options.name&&(this.name=this.options.name),!this._isStandalone()&&this.name}_updateValue(A){zL.then(()=>{this.control.setValue(A,{emitViewToModelChange:!1}),this._changeDetectorRef?.markForCheck()})}_updateDisabled(A){let i=A.isDisabled.currentValue,n=i!==0&&he(i);zL.then(()=>{n&&!this.control.disabled?this.control.disable():!n&&this.control.disabled&&this.control.enable(),this._changeDetectorRef?.markForCheck()})}_getPath(A){return this._parent?s_(A,this._parent):[A]}static \\u0275fac=function(i){return new(i||t)(lt(v0,9),lt(vc,10),lt(nh,10),lt(gg,10),lt(ft,8),lt(vd,8))};static \\u0275dir=OA({type:t,selectors:[[\"\",\"ngModel\",\"\",3,\"formControlName\",\"\",3,\"formControl\",\"\"]],inputs:{name:\"name\",isDisabled:[0,\"disabled\",\"isDisabled\"],model:[0,\"ngModel\",\"model\"],options:[0,\"ngModelOptions\",\"options\"]},outputs:{update:\"ngModelChange\"},exportAs:[\"ngModel\"],standalone:!1,features:[It([AoA]),Ct,ei]})}return t})();var C_=(()=>{class t{static \\u0275fac=function(i){return new(i||t)};static \\u0275dir=OA({type:t,selectors:[[\"form\",3,\"ngNoForm\",\"\",3,\"ngNativeValidate\",\"\"]],hostAttrs:[\"novalidate\",\"\"],standalone:!1})}return t})(),eoA={provide:gg,useExisting:ar(()=>Fv),multi:!0},Fv=(()=>{class t extends qL{writeValue(A){let i=A??\"\";this.setProperty(\"value\",i)}registerOnChange(A){this.onChange=i=>{A(i==\"\"?null:parseFloat(i))}}static \\u0275fac=(()=>{let A;return function(n){return(A||(A=hi(t)))(n||t)}})();static \\u0275dir=OA({type:t,selectors:[[\"input\",\"type\",\"number\",\"formControlName\",\"\"],[\"input\",\"type\",\"number\",\"formControl\",\"\"],[\"input\",\"type\",\"number\",\"ngModel\",\"\"]],hostBindings:function(i,n){i&1&&$(\"input\",function(a){return n.onChange(a.target.value)})(\"blur\",function(){return n.onTouched()})},standalone:!1,features:[It([eoA]),Ct]})}return t})();var wv=class extends wd{constructor(e,A,i){super(kv(A),Sv(i,A)),this.controls=e,this._initObservables(),this._setUpdateStrategy(A),this._setUpControls(),this.updateValueAndValidity({onlySelf:!0,emitEvent:!!this.asyncValidator})}controls;at(e){return this.controls[this._adjustIndex(e)]}push(e,A={}){Array.isArray(e)?e.forEach(i=>{this.controls.push(i),this._registerControl(i)}):(this.controls.push(e),this._registerControl(e)),this.updateValueAndValidity({emitEvent:A.emitEvent}),this._onCollectionChange()}insert(e,A,i={}){this.controls.splice(e,0,A),this._registerControl(A),this.updateValueAndValidity({emitEvent:i.emitEvent})}removeAt(e,A={}){let i=this._adjustIndex(e);i<0&&(i=0),this.controls[i]&&this.controls[i]._registerOnCollectionChange(()=>{}),this.controls.splice(i,1),this.updateValueAndValidity({emitEvent:A.emitEvent})}setControl(e,A,i={}){let n=this._adjustIndex(e);n<0&&(n=0),this.controls[n]&&this.controls[n]._registerOnCollectionChange(()=>{}),this.controls.splice(n,1),A&&(this.controls.splice(n,0,A),this._registerControl(A)),this.updateValueAndValidity({emitEvent:i.emitEvent}),this._onCollectionChange()}get length(){return this.controls.length}setValue(e,A={}){r_(this,!1,e),e.forEach((i,n)=>{a_(this,!1,n),this.at(n).setValue(i,{onlySelf:!0,emitEvent:A.emitEvent})}),this.updateValueAndValidity(A)}patchValue(e,A={}){e!=null&&(e.forEach((i,n)=>{this.at(n)&&this.at(n).patchValue(i,{onlySelf:!0,emitEvent:A.emitEvent})}),this.updateValueAndValidity(A))}reset(e=[],A={}){this._forEachChild((i,n)=>{i.reset(e[n],Ve(BA({},A),{onlySelf:!0}))}),this._updatePristine(A,this),this._updateTouched(A,this),this.updateValueAndValidity(A),A?.emitEvent!==!1&&this._events.next(new th(this))}getRawValue(){return this.controls.map(e=>e.getRawValue())}clear(e={}){this.controls.length<1||(this._forEachChild(A=>A._registerOnCollectionChange(()=>{})),this.controls.splice(0),this.updateValueAndValidity({emitEvent:e.emitEvent}))}_adjustIndex(e){return e<0?e+this.length:e}_syncPendingControls(){let e=this.controls.reduce((A,i)=>i._syncPendingControls()?!0:A,!1);return e&&this.updateValueAndValidity({onlySelf:!0}),e}_forEachChild(e){this.controls.forEach((A,i)=>{e(A,i)})}_updateValue(){this.value=this.controls.filter(e=>e.enabled||this.disabled).map(e=>e.value)}_anyControls(e){return this.controls.some(A=>A.enabled&&e(A))}_setUpControls(){this._forEachChild(e=>this._registerControl(e))}_allControlsDisabled(){for(let e of this.controls)if(e.enabled)return!1;return this.controls.length>0||this.disabled}_registerControl(e){e.setParent(this),e._registerOnCollectionChange(this._onCollectionChange)}_find(e){return this.at(e)??null}};var toA=(()=>{class t extends v0{callSetDisabledState;get submitted(){return Zo(this._submittedReactive)}set submitted(A){this._submittedReactive.set(A)}_submitted=_e(()=>this._submittedReactive());_submittedReactive=jA(!1);_oldForm;_onCollectionChange=()=>this._updateDomValue();directives=[];constructor(A,i,n){super(),this.callSetDisabledState=n,this._setValidators(A),this._setAsyncValidators(i)}ngOnChanges(A){this.onChanges(A)}ngOnDestroy(){this.onDestroy()}onChanges(A){this._checkFormPresent(),A.hasOwnProperty(\"form\")&&(this._updateValidators(),this._updateDomValue(),this._updateRegistrations(),this._oldForm=this.form)}onDestroy(){this.form&&(Gf(this.form,this),this.form._onCollectionChange===this._onCollectionChange&&this.form._registerOnCollectionChange(()=>{}))}get formDirective(){return this}get path(){return[]}addControl(A){let i=this.form.get(A.path);return ih(i,A,this.callSetDisabledState),i.updateValueAndValidity({emitEvent:!1}),this.directives.push(A),i}getControl(A){return this.form.get(A.path)}removeControl(A){Lf(A.control||null,A,!1),ZnA(this.directives,A)}addFormGroup(A){this._setUpFormContainer(A)}removeFormGroup(A){this._cleanUpFormContainer(A)}getFormGroup(A){return this.form.get(A.path)}getFormArray(A){return this.form.get(A.path)}addFormArray(A){this._setUpFormContainer(A)}removeFormArray(A){this._cleanUpFormContainer(A)}updateModel(A,i){this.form.get(A.path).setValue(i)}onReset(){this.resetForm()}resetForm(A=void 0,i={}){this.form.reset(A,i),this._submittedReactive.set(!1)}onSubmit(A){return this.submitted=!0,c_(this.form,this.directives),this.ngSubmit.emit(A),this.form._events.next(new Ff(this.control)),A?.target?.method===\"dialog\"}_updateDomValue(){this.directives.forEach(A=>{let i=A.control,n=this.form.get(A.path);i!==n&&(Lf(i||null,A),$nA(n)&&(ih(n,A,this.callSetDisabledState),A.control=n))}),this.form._updateTreeValidity({emitEvent:!1})}_setUpFormContainer(A){let i=this.form.get(A.path);l_(i,A),i.updateValueAndValidity({emitEvent:!1})}_cleanUpFormContainer(A){let i=this.form?.get(A.path);i&&VnA(i,A)&&i.updateValueAndValidity({emitEvent:!1})}_updateRegistrations(){this.form._registerOnCollectionChange(this._onCollectionChange),this._oldForm?._registerOnCollectionChange(()=>{})}_updateValidators(){xv(this.form,this),this._oldForm&&Gf(this._oldForm,this)}_checkFormPresent(){this.form}static \\u0275fac=function(i){return new(i||t)(lt(vc,10),lt(nh,10),lt(vd,8))};static \\u0275dir=OA({type:t,features:[Ct,ei]})}return t})();var Lv=new wA(\"\"),ioA={provide:xs,useExisting:ar(()=>SI)},SI=(()=>{class t extends xs{_ngModelWarningConfig;callSetDisabledState;viewModel;form;set isDisabled(A){}model;update=new WA;static _ngModelWarningSentOnce=!1;_ngModelWarningSent=!1;constructor(A,i,n,o,a){super(),this._ngModelWarningConfig=o,this.callSetDisabledState=a,this._setValidators(A),this._setAsyncValidators(i),this.valueAccessor=Nv(this,n)}ngOnChanges(A){if(this._isControlChanged(A)){let i=A.form.previousValue;i&&Lf(i,this,!1),ih(this.form,this,this.callSetDisabledState),this.form.updateValueAndValidity({emitEvent:!1})}Rv(A,this.viewModel)&&(this.form.setValue(this.model),this.viewModel=this.model)}ngOnDestroy(){this.form&&Lf(this.form,this,!1)}get path(){return[]}get control(){return this.form}viewToModelUpdate(A){this.viewModel=A,this.update.emit(A)}_isControlChanged(A){return A.hasOwnProperty(\"form\")}static \\u0275fac=function(i){return new(i||t)(lt(vc,10),lt(nh,10),lt(gg,10),lt(Lv,8),lt(vd,8))};static \\u0275dir=OA({type:t,selectors:[[\"\",\"formControl\",\"\"]],inputs:{form:[0,\"formControl\",\"form\"],isDisabled:[0,\"disabled\",\"isDisabled\"],model:[0,\"ngModel\",\"model\"]},outputs:{update:\"ngModelChange\"},exportAs:[\"ngForm\"],standalone:!1,features:[It([ioA]),Ct,ei]})}return t})();var noA={provide:xs,useExisting:ar(()=>_v)},_v=(()=>{class t extends xs{_ngModelWarningConfig;_added=!1;viewModel;control;name=null;set isDisabled(A){}model;update=new WA;static _ngModelWarningSentOnce=!1;_ngModelWarningSent=!1;constructor(A,i,n,o,a){super(),this._ngModelWarningConfig=a,this._parent=A,this._setValidators(i),this._setAsyncValidators(n),this.valueAccessor=Nv(this,o)}ngOnChanges(A){this._added||this._setUpControl(),Rv(A,this.viewModel)&&(this.viewModel=this.model,this.formDirective.updateModel(this,this.model))}ngOnDestroy(){this.formDirective?.removeControl(this)}viewToModelUpdate(A){this.viewModel=A,this.update.emit(A)}get path(){return s_(this.name==null?this.name:this.name.toString(),this._parent)}get formDirective(){return this._parent?this._parent.formDirective:null}_setUpControl(){this.control=this.formDirective.addControl(this),this._added=!0}static \\u0275fac=function(i){return new(i||t)(lt(v0,13),lt(vc,10),lt(nh,10),lt(gg,10),lt(Lv,8))};static \\u0275dir=OA({type:t,selectors:[[\"\",\"formControlName\",\"\"]],inputs:{name:[0,\"formControlName\",\"name\"],isDisabled:[0,\"disabled\",\"isDisabled\"],model:[0,\"ngModel\",\"model\"]},outputs:{update:\"ngModelChange\"},standalone:!1,features:[It([noA]),Ct,ei]})}return t})();var ooA={provide:v0,useExisting:ar(()=>GC)},GC=(()=>{class t extends toA{form=null;ngSubmit=new WA;get control(){return this.form}static \\u0275fac=(()=>{let A;return function(n){return(A||(A=hi(t)))(n||t)}})();static \\u0275dir=OA({type:t,selectors:[[\"\",\"formGroup\",\"\"]],hostBindings:function(i,n){i&1&&$(\"submit\",function(a){return n.onSubmit(a)})(\"reset\",function(){return n.onReset()})},inputs:{form:[0,\"formGroup\",\"form\"]},outputs:{ngSubmit:\"ngSubmit\"},exportAs:[\"ngForm\"],standalone:!1,features:[It([ooA]),Ct]})}return t})();function aoA(t){return typeof t==\"number\"?t:parseFloat(t)}var roA=(()=>{class t{_validator=kf;_onChange;_enabled;ngOnChanges(A){if(this.inputName in A){let i=this.normalizeInput(A[this.inputName].currentValue);this._enabled=this.enabled(i),this._validator=this._enabled?this.createValidator(i):kf,this._onChange?.()}}validate(A){return this._validator(A)}registerOnValidatorChange(A){this._onChange=A}enabled(A){return A!=null}static \\u0275fac=function(i){return new(i||t)};static \\u0275dir=OA({type:t,features:[ei]})}return t})();var soA={provide:vc,useExisting:ar(()=>Gv),multi:!0},Gv=(()=>{class t extends roA{min;inputName=\"min\";normalizeInput=A=>aoA(A);createValidator=A=>VL(A);static \\u0275fac=(()=>{let A;return function(n){return(A||(A=hi(t)))(n||t)}})();static \\u0275dir=OA({type:t,selectors:[[\"input\",\"type\",\"number\",\"min\",\"\",\"formControlName\",\"\"],[\"input\",\"type\",\"number\",\"min\",\"\",\"formControl\",\"\"],[\"input\",\"type\",\"number\",\"min\",\"\",\"ngModel\",\"\"]],hostVars:1,hostBindings:function(i,n){i&2&&ie(\"min\",n._enabled?n.min:null)},inputs:{min:\"min\"},standalone:!1,features:[It([soA]),Ct]})}return t})();var I_=(()=>{class t{static \\u0275fac=function(i){return new(i||t)};static \\u0275mod=Xe({type:t});static \\u0275inj=Ze({})}return t})();function PL(t){return!!t&&(t.asyncValidators!==void 0||t.validators!==void 0||t.updateOn!==void 0)}var d_=(()=>{class t{useNonNullable=!1;get nonNullable(){let A=new t;return A.useNonNullable=!0,A}group(A,i=null){let n=this._reduceControls(A),o={};return PL(i)?o=i:i!==null&&(o.validators=i.validator,o.asyncValidators=i.asyncValidator),new yd(n,o)}record(A,i=null){let n=this._reduceControls(A);return new Dv(n,i)}control(A,i,n){let o={};return this.useNonNullable?(PL(i)?o=i:(o.validators=i,o.asyncValidators=n),new ss(A,Ve(BA({},o),{nonNullable:!0}))):new ss(A,i,n)}array(A,i,n){let o=A.map(a=>this._createControl(a));return new wv(o,i,n)}_reduceControls(A){let i={};return Object.keys(A).forEach(n=>{i[n]=this._createControl(A[n])}),i}_createControl(A){if(A instanceof ss)return A;if(A instanceof wd)return A;if(Array.isArray(A)){let i=A[0],n=A.length>1?A[1]:null,o=A.length>2?A[2]:null;return this.control(i,n,o)}else return this.control(A)}static \\u0275fac=function(i){return new(i||t)};static \\u0275prov=TA({token:t,factory:t.\\u0275fac,providedIn:\"root\"})}return t})();var yn=(()=>{class t{static withConfig(A){return{ngModule:t,providers:[{provide:vd,useValue:A.callSetDisabledState??Uf}]}}static \\u0275fac=function(i){return new(i||t)};static \\u0275mod=Xe({type:t});static \\u0275inj=Ze({imports:[I_]})}return t})(),bc=(()=>{class t{static withConfig(A){return{ngModule:t,providers:[{provide:Lv,useValue:A.warnOnNgModelWithFormControl??\"always\"},{provide:vd,useValue:A.callSetDisabledState??Uf}]}}static \\u0275fac=function(i){return new(i||t)};static \\u0275mod=Xe({type:t});static \\u0275inj=Ze({imports:[I_]})}return t})();function xI(t){return t.buttons===0||t.detail===0}function RI(t){let e=t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0];return!!e&&e.identifier===-1&&(e.radiusX==null||e.radiusX===1)&&(e.radiusY==null||e.radiusY===1)}var Kv;function B_(){if(Kv==null){let t=typeof document<\"u\"?document.head:null;Kv=!!(t&&(t.createShadowRoot||t.attachShadow))}return Kv}function Uv(t){if(B_()){let e=t.getRootNode?t.getRootNode():null;if(typeof ShadowRoot<\"u\"&&ShadowRoot&&e instanceof ShadowRoot)return e}return null}function oh(){let t=typeof document<\"u\"&&document?document.activeElement:null;for(;t&&t.shadowRoot;){let e=t.shadowRoot.activeElement;if(e===t)break;t=e}return t}function yr(t){return t.composedPath?t.composedPath()[0]:t.target}var Jv;try{Jv=typeof Intl<\"u\"&&Intl.v8BreakIterator}catch(t){Jv=!1}var ci=(()=>{class t{_platformId=h(Qf);isBrowser=this._platformId?y0(this._platformId):typeof document==\"object\"&&!!document;EDGE=this.isBrowser&&/(edge)/i.test(navigator.userAgent);TRIDENT=this.isBrowser&&/(msie|trident)/i.test(navigator.userAgent);BLINK=this.isBrowser&&!!(window.chrome||Jv)&&typeof CSS<\"u\"&&!this.EDGE&&!this.TRIDENT;WEBKIT=this.isBrowser&&/AppleWebKit/i.test(navigator.userAgent)&&!this.BLINK&&!this.EDGE&&!this.TRIDENT;IOS=this.isBrowser&&/iPad|iPhone|iPod/.test(navigator.userAgent)&&!(\"MSStream\"in window);FIREFOX=this.isBrowser&&/(firefox|minefield)/i.test(navigator.userAgent);ANDROID=this.isBrowser&&/android/i.test(navigator.userAgent)&&!this.TRIDENT;SAFARI=this.isBrowser&&/safari/i.test(navigator.userAgent)&&this.WEBKIT;constructor(){}static \\u0275fac=function(i){return new(i||t)};static \\u0275prov=TA({token:t,factory:t.\\u0275fac,providedIn:\"root\"})}return t})();var ah;function Q_(){if(ah==null&&typeof window<\"u\")try{window.addEventListener(\"test\",null,Object.defineProperty({},\"passive\",{get:()=>ah=!0}))}finally{ah=ah||!1}return ah}function Md(t){return Q_()?t:!!t.capture}function Rs(t,e=0){return Jf(t)?Number(t):arguments.length===2?e:0}function Jf(t){return!isNaN(parseFloat(t))&&!isNaN(Number(t))}function ls(t){return t instanceof ge?t.nativeElement:t}var E_=new wA(\"cdk-input-modality-detector-options\"),h_={ignoreKeys:[18,17,224,91,16]},u_=650,Yv={passive:!0,capture:!0},f_=(()=>{class t{_platform=h(ci);_listenerCleanups;modalityDetected;modalityChanged;get mostRecentModality(){return this._modality.value}_mostRecentTarget=null;_modality=new Jt(null);_options;_lastTouchMs=0;_onKeydown=A=>{this._options?.ignoreKeys?.some(i=>i===A.keyCode)||(this._modality.next(\"keyboard\"),this._mostRecentTarget=yr(A))};_onMousedown=A=>{Date.now()-this._lastTouchMs<u_||(this._modality.next(xI(A)?\"keyboard\":\"mouse\"),this._mostRecentTarget=yr(A))};_onTouchstart=A=>{if(RI(A)){this._modality.next(\"keyboard\");return}this._lastTouchMs=Date.now(),this._modality.next(\"touch\"),this._mostRecentTarget=yr(A)};constructor(){let A=h(Oe),i=h(Zt),n=h(E_,{optional:!0});if(this._options=BA(BA({},h_),n),this.modalityDetected=this._modality.pipe(rg(1)),this.modalityChanged=this.modalityDetected.pipe(hl()),this._platform.isBrowser){let o=h(Dr).createRenderer(null,null);this._listenerCleanups=A.runOutsideAngular(()=>[o.listen(i,\"keydown\",this._onKeydown,Yv),o.listen(i,\"mousedown\",this._onMousedown,Yv),o.listen(i,\"touchstart\",this._onTouchstart,Yv)])}}ngOnDestroy(){this._modality.complete(),this._listenerCleanups?.forEach(A=>A())}static \\u0275fac=function(i){return new(i||t)};static \\u0275prov=TA({token:t,factory:t.\\u0275fac,providedIn:\"root\"})}return t})(),rh=(function(t){return t[t.IMMEDIATE=0]=\"IMMEDIATE\",t[t.EVENTUAL=1]=\"EVENTUAL\",t})(rh||{}),m_=new wA(\"cdk-focus-monitor-default-options\"),Yf=Md({passive:!0,capture:!0}),Ha=(()=>{class t{_ngZone=h(Oe);_platform=h(ci);_inputModalityDetector=h(f_);_origin=null;_lastFocusOrigin=null;_windowFocused=!1;_windowFocusTimeoutId;_originTimeoutId;_originFromTouchInteraction=!1;_elementInfo=new Map;_monitoredElementCount=0;_rootNodeFocusListenerCount=new Map;_detectionMode;_windowFocusListener=()=>{this._windowFocused=!0,this._windowFocusTimeoutId=setTimeout(()=>this._windowFocused=!1)};_document=h(Zt);_stopInputModalityDetector=new $A;constructor(){let A=h(m_,{optional:!0});this._detectionMode=A?.detectionMode||rh.IMMEDIATE}_rootNodeFocusAndBlurListener=A=>{let i=yr(A);for(let n=i;n;n=n.parentElement)A.type===\"focus\"?this._onFocus(A,n):this._onBlur(A,n)};monitor(A,i=!1){let n=ls(A);if(!this._platform.isBrowser||n.nodeType!==1)return oe();let o=Uv(n)||this._document,a=this._elementInfo.get(n);if(a)return i&&(a.checkChildren=!0),a.subject;let r={checkChildren:i,subject:new $A,rootNode:o};return this._elementInfo.set(n,r),this._registerGlobalListeners(r),r.subject}stopMonitoring(A){let i=ls(A),n=this._elementInfo.get(i);n&&(n.subject.complete(),this._setClasses(i),this._elementInfo.delete(i),this._removeGlobalListeners(n))}focusVia(A,i,n){let o=ls(A),a=this._document.activeElement;o===a?this._getClosestElementsInfo(o).forEach(([r,s])=>this._originChanged(r,i,s)):(this._setOrigin(i),typeof o.focus==\"function\"&&o.focus(n))}ngOnDestroy(){this._elementInfo.forEach((A,i)=>this.stopMonitoring(i))}_getWindow(){return this._document.defaultView||window}_getFocusOrigin(A){return this._origin?this._originFromTouchInteraction?this._shouldBeAttributedToTouch(A)?\"touch\":\"program\":this._origin:this._windowFocused&&this._lastFocusOrigin?this._lastFocusOrigin:A&&this._isLastInteractionFromInputLabel(A)?\"mouse\":\"program\"}_shouldBeAttributedToTouch(A){return this._detectionMode===rh.EVENTUAL||!!A?.contains(this._inputModalityDetector._mostRecentTarget)}_setClasses(A,i){A.classList.toggle(\"cdk-focused\",!!i),A.classList.toggle(\"cdk-touch-focused\",i===\"touch\"),A.classList.toggle(\"cdk-keyboard-focused\",i===\"keyboard\"),A.classList.toggle(\"cdk-mouse-focused\",i===\"mouse\"),A.classList.toggle(\"cdk-program-focused\",i===\"program\")}_setOrigin(A,i=!1){this._ngZone.runOutsideAngular(()=>{if(this._origin=A,this._originFromTouchInteraction=A===\"touch\"&&i,this._detectionMode===rh.IMMEDIATE){clearTimeout(this._originTimeoutId);let n=this._originFromTouchInteraction?u_:1;this._originTimeoutId=setTimeout(()=>this._origin=null,n)}})}_onFocus(A,i){let n=this._elementInfo.get(i),o=yr(A);!n||!n.checkChildren&&i!==o||this._originChanged(i,this._getFocusOrigin(o),n)}_onBlur(A,i){let n=this._elementInfo.get(i);!n||n.checkChildren&&A.relatedTarget instanceof Node&&i.contains(A.relatedTarget)||(this._setClasses(i),this._emitOrigin(n,null))}_emitOrigin(A,i){A.subject.observers.length&&this._ngZone.run(()=>A.subject.next(i))}_registerGlobalListeners(A){if(!this._platform.isBrowser)return;let i=A.rootNode,n=this._rootNodeFocusListenerCount.get(i)||0;n||this._ngZone.runOutsideAngular(()=>{i.addEventListener(\"focus\",this._rootNodeFocusAndBlurListener,Yf),i.addEventListener(\"blur\",this._rootNodeFocusAndBlurListener,Yf)}),this._rootNodeFocusListenerCount.set(i,n+1),++this._monitoredElementCount===1&&(this._ngZone.runOutsideAngular(()=>{this._getWindow().addEventListener(\"focus\",this._windowFocusListener)}),this._inputModalityDetector.modalityDetected.pipe(Bt(this._stopInputModalityDetector)).subscribe(o=>{this._setOrigin(o,!0)}))}_removeGlobalListeners(A){let i=A.rootNode;if(this._rootNodeFocusListenerCount.has(i)){let n=this._rootNodeFocusListenerCount.get(i);n>1?this._rootNodeFocusListenerCount.set(i,n-1):(i.removeEventListener(\"focus\",this._rootNodeFocusAndBlurListener,Yf),i.removeEventListener(\"blur\",this._rootNodeFocusAndBlurListener,Yf),this._rootNodeFocusListenerCount.delete(i))}--this._monitoredElementCount||(this._getWindow().removeEventListener(\"focus\",this._windowFocusListener),this._stopInputModalityDetector.next(),clearTimeout(this._windowFocusTimeoutId),clearTimeout(this._originTimeoutId))}_originChanged(A,i,n){this._setClasses(A,i),this._emitOrigin(n,i),this._lastFocusOrigin=i}_getClosestElementsInfo(A){let i=[];return this._elementInfo.forEach((n,o)=>{(o===A||n.checkChildren&&o.contains(A))&&i.push([o,n])}),i}_isLastInteractionFromInputLabel(A){let{_mostRecentTarget:i,mostRecentModality:n}=this._inputModalityDetector;if(n!==\"mouse\"||!i||i===A||A.nodeName!==\"INPUT\"&&A.nodeName!==\"TEXTAREA\"||A.disabled)return!1;let o=A.labels;if(o){for(let a=0;a<o.length;a++)if(o[a].contains(i))return!0}return!1}static \\u0275fac=function(i){return new(i||t)};static \\u0275prov=TA({token:t,factory:t.\\u0275fac,providedIn:\"root\"})}return t})(),Hv=(()=>{class t{_elementRef=h(ge);_focusMonitor=h(Ha);_monitorSubscription;_focusOrigin=null;cdkFocusChange=new WA;constructor(){}get focusOrigin(){return this._focusOrigin}ngAfterViewInit(){let A=this._elementRef.nativeElement;this._monitorSubscription=this._focusMonitor.monitor(A,A.nodeType===1&&A.hasAttribute(\"cdkMonitorSubtreeFocus\")).subscribe(i=>{this._focusOrigin=i,this.cdkFocusChange.emit(i)})}ngOnDestroy(){this._focusMonitor.stopMonitoring(this._elementRef),this._monitorSubscription?.unsubscribe()}static \\u0275fac=function(i){return new(i||t)};static \\u0275dir=OA({type:t,selectors:[[\"\",\"cdkMonitorElementFocus\",\"\"],[\"\",\"cdkMonitorSubtreeFocus\",\"\"]],outputs:{cdkFocusChange:\"cdkFocusChange\"},exportAs:[\"cdkMonitorFocus\"]})}return t})();var Hf=new WeakMap,Hn=(()=>{class t{_appRef;_injector=h(ut);_environmentInjector=h(pr);load(A){let i=this._appRef=this._appRef||this._injector.get(p0),n=Hf.get(i);n||(n={loaders:new Set,refs:[]},Hf.set(i,n),i.onDestroy(()=>{Hf.get(i)?.refs.forEach(o=>o.destroy()),Hf.delete(i)})),n.loaders.has(A)||(n.loaders.add(A),n.refs.push(yf(A,{environmentInjector:this._environmentInjector})))}static \\u0275fac=function(i){return new(i||t)};static \\u0275prov=TA({token:t,factory:t.\\u0275fac,providedIn:\"root\"})}return t})();var KC=(()=>{class t{static \\u0275fac=function(i){return new(i||t)};static \\u0275cmp=kA({type:t,selectors:[[\"ng-component\"]],exportAs:[\"cdkVisuallyHidden\"],decls:0,vars:0,template:function(i,n){},styles:[`.cdk-visually-hidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;white-space:nowrap;outline:0;-webkit-appearance:none;-moz-appearance:none;left:0}[dir=rtl] .cdk-visually-hidden{left:auto;right:0}\n`],encapsulation:2,changeDetection:0})}return t})(),Tf;function goA(){if(Tf===void 0&&(Tf=null,typeof window<\"u\")){let t=window;t.trustedTypes!==void 0&&(Tf=t.trustedTypes.createPolicy(\"angular#components\",{createHTML:e=>e}))}return Tf}function NI(t){return goA()?.createHTML(t)||t}function p_(t,e,A){let i=A.sanitize(ul.HTML,e);t.innerHTML=NI(i||\"\")}function kd(t){return Array.isArray(t)?t:[t]}var D_=new Set,FI,Sd=(()=>{class t{_platform=h(ci);_nonce=h(cL,{optional:!0});_matchMedia;constructor(){this._matchMedia=this._platform.isBrowser&&window.matchMedia?window.matchMedia.bind(window):coA}matchMedia(A){return(this._platform.WEBKIT||this._platform.BLINK)&&loA(A,this._nonce),this._matchMedia(A)}static \\u0275fac=function(i){return new(i||t)};static \\u0275prov=TA({token:t,factory:t.\\u0275fac,providedIn:\"root\"})}return t})();function loA(t,e){if(!D_.has(t))try{FI||(FI=document.createElement(\"style\"),e&&FI.setAttribute(\"nonce\",e),FI.setAttribute(\"type\",\"text/css\"),document.head.appendChild(FI)),FI.sheet&&(FI.sheet.insertRule(`@media ${t} {body{ }}`,0),D_.add(t))}catch(A){console.error(A)}}function coA(t){return{matches:t===\"all\"||t===\"\",media:t,addListener:()=>{},removeListener:()=>{}}}var sh=(()=>{class t{_mediaMatcher=h(Sd);_zone=h(Oe);_queries=new Map;_destroySubject=new $A;constructor(){}ngOnDestroy(){this._destroySubject.next(),this._destroySubject.complete()}isMatched(A){return w_(kd(A)).some(n=>this._registerQuery(n).mql.matches)}observe(A){let n=w_(kd(A)).map(a=>this._registerQuery(a).observable),o=Va(n);return o=lf(o.pipe(qn(1)),o.pipe(rg(1),ps(0))),o.pipe(fe(a=>{let r={matches:!1,breakpoints:{}};return a.forEach(({matches:s,query:g})=>{r.matches=r.matches||s,r.breakpoints[g]=s}),r}))}_registerQuery(A){if(this._queries.has(A))return this._queries.get(A);let i=this._mediaMatcher.matchMedia(A),o={observable:new Ti(a=>{let r=s=>this._zone.run(()=>a.next(s));return i.addListener(r),()=>{i.removeListener(r)}}).pipe(nn(i),fe(({matches:a})=>({query:A,matches:a})),Bt(this._destroySubject)),mql:i};return this._queries.set(A,o),o}static \\u0275fac=function(i){return new(i||t)};static \\u0275prov=TA({token:t,factory:t.\\u0275fac,providedIn:\"root\"})}return t})();function w_(t){return t.map(e=>e.split(\",\")).reduce((e,A)=>e.concat(A)).map(e=>e.trim())}function CoA(t){if(t.type===\"characterData\"&&t.target instanceof Comment)return!0;if(t.type===\"childList\"){for(let e=0;e<t.addedNodes.length;e++)if(!(t.addedNodes[e]instanceof Comment))return!1;for(let e=0;e<t.removedNodes.length;e++)if(!(t.removedNodes[e]instanceof Comment))return!1;return!0}return!1}var y_=(()=>{class t{create(A){return typeof MutationObserver>\"u\"?null:new MutationObserver(A)}static \\u0275fac=function(i){return new(i||t)};static \\u0275prov=TA({token:t,factory:t.\\u0275fac,providedIn:\"root\"})}return t})(),v_=(()=>{class t{_mutationObserverFactory=h(y_);_observedElements=new Map;_ngZone=h(Oe);constructor(){}ngOnDestroy(){this._observedElements.forEach((A,i)=>this._cleanupObserver(i))}observe(A){let i=ls(A);return new Ti(n=>{let a=this._observeElement(i).pipe(fe(r=>r.filter(s=>!CoA(s))),We(r=>!!r.length)).subscribe(r=>{this._ngZone.run(()=>{n.next(r)})});return()=>{a.unsubscribe(),this._unobserveElement(i)}})}_observeElement(A){return this._ngZone.runOutsideAngular(()=>{if(this._observedElements.has(A))this._observedElements.get(A).count++;else{let i=new $A,n=this._mutationObserverFactory.create(o=>i.next(o));n&&n.observe(A,{characterData:!0,childList:!0,subtree:!0}),this._observedElements.set(A,{observer:n,stream:i,count:1})}return this._observedElements.get(A).stream})}_unobserveElement(A){this._observedElements.has(A)&&(this._observedElements.get(A).count--,this._observedElements.get(A).count||this._cleanupObserver(A))}_cleanupObserver(A){if(this._observedElements.has(A)){let{observer:i,stream:n}=this._observedElements.get(A);i&&i.disconnect(),n.complete(),this._observedElements.delete(A)}}static \\u0275fac=function(i){return new(i||t)};static \\u0275prov=TA({token:t,factory:t.\\u0275fac,providedIn:\"root\"})}return t})(),b_=(()=>{class t{_contentObserver=h(v_);_elementRef=h(ge);event=new WA;get disabled(){return this._disabled}set disabled(A){this._disabled=A,this._disabled?this._unsubscribe():this._subscribe()}_disabled=!1;get debounce(){return this._debounce}set debounce(A){this._debounce=Rs(A),this._subscribe()}_debounce;_currentSubscription=null;constructor(){}ngAfterContentInit(){!this._currentSubscription&&!this.disabled&&this._subscribe()}ngOnDestroy(){this._unsubscribe()}_subscribe(){this._unsubscribe();let A=this._contentObserver.observe(this._elementRef);this._currentSubscription=(this.debounce?A.pipe(ps(this.debounce)):A).subscribe(this.event)}_unsubscribe(){this._currentSubscription?.unsubscribe()}static \\u0275fac=function(i){return new(i||t)};static \\u0275dir=OA({type:t,selectors:[[\"\",\"cdkObserveContent\",\"\"]],inputs:{disabled:[2,\"cdkObserveContentDisabled\",\"disabled\",he],debounce:\"debounce\"},outputs:{event:\"cdkObserveContent\"},exportAs:[\"cdkObserveContent\"]})}return t})(),Of=(()=>{class t{static \\u0275fac=function(i){return new(i||t)};static \\u0275mod=Xe({type:t});static \\u0275inj=Ze({providers:[y_]})}return t})();var xd=(()=>{class t{_platform=h(ci);constructor(){}isDisabled(A){return A.hasAttribute(\"disabled\")}isVisible(A){return doA(A)&&getComputedStyle(A).visibility===\"visible\"}isTabbable(A){if(!this._platform.isBrowser)return!1;let i=IoA(poA(A));if(i&&(M_(i)===-1||!this.isVisible(i)))return!1;let n=A.nodeName.toLowerCase(),o=M_(A);return A.hasAttribute(\"contenteditable\")?o!==-1:n===\"iframe\"||n===\"object\"||this._platform.WEBKIT&&this._platform.IOS&&!foA(A)?!1:n===\"audio\"?A.hasAttribute(\"controls\")?o!==-1:!1:n===\"video\"?o===-1?!1:o!==null?!0:this._platform.FIREFOX||A.hasAttribute(\"controls\"):A.tabIndex>=0}isFocusable(A,i){return moA(A)&&!this.isDisabled(A)&&(i?.ignoreVisibility||this.isVisible(A))}static \\u0275fac=function(i){return new(i||t)};static \\u0275prov=TA({token:t,factory:t.\\u0275fac,providedIn:\"root\"})}return t})();function IoA(t){try{return t.frameElement}catch(e){return null}}function doA(t){return!!(t.offsetWidth||t.offsetHeight||typeof t.getClientRects==\"function\"&&t.getClientRects().length)}function BoA(t){let e=t.nodeName.toLowerCase();return e===\"input\"||e===\"select\"||e===\"button\"||e===\"textarea\"}function QoA(t){return hoA(t)&&t.type==\"hidden\"}function EoA(t){return uoA(t)&&t.hasAttribute(\"href\")}function hoA(t){return t.nodeName.toLowerCase()==\"input\"}function uoA(t){return t.nodeName.toLowerCase()==\"a\"}function x_(t){if(!t.hasAttribute(\"tabindex\")||t.tabIndex===void 0)return!1;let e=t.getAttribute(\"tabindex\");return!!(e&&!isNaN(parseInt(e,10)))}function M_(t){if(!x_(t))return null;let e=parseInt(t.getAttribute(\"tabindex\")||\"\",10);return isNaN(e)?-1:e}function foA(t){let e=t.nodeName.toLowerCase(),A=e===\"input\"&&t.type;return A===\"text\"||A===\"password\"||e===\"select\"||e===\"textarea\"}function moA(t){return QoA(t)?!1:BoA(t)||EoA(t)||t.hasAttribute(\"contenteditable\")||x_(t)}function poA(t){return t.ownerDocument&&t.ownerDocument.defaultView||window}var zf=class{_element;_checker;_ngZone;_document;_injector;_startAnchor=null;_endAnchor=null;_hasAttached=!1;startAnchorListener=()=>this.focusLastTabbableElement();endAnchorListener=()=>this.focusFirstTabbableElement();get enabled(){return this._enabled}set enabled(e){this._enabled=e,this._startAnchor&&this._endAnchor&&(this._toggleAnchorTabIndex(e,this._startAnchor),this._toggleAnchorTabIndex(e,this._endAnchor))}_enabled=!0;constructor(e,A,i,n,o=!1,a){this._element=e,this._checker=A,this._ngZone=i,this._document=n,this._injector=a,o||this.attachAnchors()}destroy(){let e=this._startAnchor,A=this._endAnchor;e&&(e.removeEventListener(\"focus\",this.startAnchorListener),e.remove()),A&&(A.removeEventListener(\"focus\",this.endAnchorListener),A.remove()),this._startAnchor=this._endAnchor=null,this._hasAttached=!1}attachAnchors(){return this._hasAttached?!0:(this._ngZone.runOutsideAngular(()=>{this._startAnchor||(this._startAnchor=this._createAnchor(),this._startAnchor.addEventListener(\"focus\",this.startAnchorListener)),this._endAnchor||(this._endAnchor=this._createAnchor(),this._endAnchor.addEventListener(\"focus\",this.endAnchorListener))}),this._element.parentNode&&(this._element.parentNode.insertBefore(this._startAnchor,this._element),this._element.parentNode.insertBefore(this._endAnchor,this._element.nextSibling),this._hasAttached=!0),this._hasAttached)}focusInitialElementWhenReady(e){return new Promise(A=>{this._executeOnStable(()=>A(this.focusInitialElement(e)))})}focusFirstTabbableElementWhenReady(e){return new Promise(A=>{this._executeOnStable(()=>A(this.focusFirstTabbableElement(e)))})}focusLastTabbableElementWhenReady(e){return new Promise(A=>{this._executeOnStable(()=>A(this.focusLastTabbableElement(e)))})}_getRegionBoundary(e){let A=this._element.querySelectorAll(`[cdk-focus-region-${e}], [cdkFocusRegion${e}], [cdk-focus-${e}]`);return e==\"start\"?A.length?A[0]:this._getFirstTabbableElement(this._element):A.length?A[A.length-1]:this._getLastTabbableElement(this._element)}focusInitialElement(e){let A=this._element.querySelector(\"[cdk-focus-initial], [cdkFocusInitial]\");if(A){if(!this._checker.isFocusable(A)){let i=this._getFirstTabbableElement(A);return i?.focus(e),!!i}return A.focus(e),!0}return this.focusFirstTabbableElement(e)}focusFirstTabbableElement(e){let A=this._getRegionBoundary(\"start\");return A&&A.focus(e),!!A}focusLastTabbableElement(e){let A=this._getRegionBoundary(\"end\");return A&&A.focus(e),!!A}hasAttached(){return this._hasAttached}_getFirstTabbableElement(e){if(this._checker.isFocusable(e)&&this._checker.isTabbable(e))return e;let A=e.children;for(let i=0;i<A.length;i++){let n=A[i].nodeType===this._document.ELEMENT_NODE?this._getFirstTabbableElement(A[i]):null;if(n)return n}return null}_getLastTabbableElement(e){if(this._checker.isFocusable(e)&&this._checker.isTabbable(e))return e;let A=e.children;for(let i=A.length-1;i>=0;i--){let n=A[i].nodeType===this._document.ELEMENT_NODE?this._getLastTabbableElement(A[i]):null;if(n)return n}return null}_createAnchor(){let e=this._document.createElement(\"div\");return this._toggleAnchorTabIndex(this._enabled,e),e.classList.add(\"cdk-visually-hidden\"),e.classList.add(\"cdk-focus-trap-anchor\"),e.setAttribute(\"aria-hidden\",\"true\"),e}_toggleAnchorTabIndex(e,A){e?A.setAttribute(\"tabindex\",\"0\"):A.removeAttribute(\"tabindex\")}toggleAnchors(e){this._startAnchor&&this._endAnchor&&(this._toggleAnchorTabIndex(e,this._startAnchor),this._toggleAnchorTabIndex(e,this._endAnchor))}_executeOnStable(e){this._injector?Nn(e,{injector:this._injector}):setTimeout(e)}},gh=(()=>{class t{_checker=h(xd);_ngZone=h(Oe);_document=h(Zt);_injector=h(ut);constructor(){h(Hn).load(KC)}create(A,i=!1){return new zf(A,this._checker,this._ngZone,this._document,i,this._injector)}static \\u0275fac=function(i){return new(i||t)};static \\u0275prov=TA({token:t,factory:t.\\u0275fac,providedIn:\"root\"})}return t})();var R_=new wA(\"liveAnnouncerElement\",{providedIn:\"root\",factory:()=>null}),N_=new wA(\"LIVE_ANNOUNCER_DEFAULT_OPTIONS\"),DoA=0,lh=(()=>{class t{_ngZone=h(Oe);_defaultOptions=h(N_,{optional:!0});_liveElement;_document=h(Zt);_sanitizer=h(LC);_previousTimeout;_currentPromise;_currentResolve;constructor(){let A=h(R_,{optional:!0});this._liveElement=A||this._createLiveElement()}announce(A,...i){let n=this._defaultOptions,o,a;return i.length===1&&typeof i[0]==\"number\"?a=i[0]:[o,a]=i,this.clear(),clearTimeout(this._previousTimeout),o||(o=n&&n.politeness?n.politeness:\"polite\"),a==null&&n&&(a=n.duration),this._liveElement.setAttribute(\"aria-live\",o),this._liveElement.id&&this._exposeAnnouncerToModals(this._liveElement.id),this._ngZone.runOutsideAngular(()=>(this._currentPromise||(this._currentPromise=new Promise(r=>this._currentResolve=r)),clearTimeout(this._previousTimeout),this._previousTimeout=setTimeout(()=>{!A||typeof A==\"string\"?this._liveElement.textContent=A:p_(this._liveElement,A,this._sanitizer),typeof a==\"number\"&&(this._previousTimeout=setTimeout(()=>this.clear(),a)),this._currentResolve?.(),this._currentPromise=this._currentResolve=void 0},100),this._currentPromise))}clear(){this._liveElement&&(this._liveElement.textContent=\"\")}ngOnDestroy(){clearTimeout(this._previousTimeout),this._liveElement?.remove(),this._liveElement=null,this._currentResolve?.(),this._currentPromise=this._currentResolve=void 0}_createLiveElement(){let A=\"cdk-live-announcer-element\",i=this._document.getElementsByClassName(A),n=this._document.createElement(\"div\");for(let o=0;o<i.length;o++)i[o].remove();return n.classList.add(A),n.classList.add(\"cdk-visually-hidden\"),n.setAttribute(\"aria-atomic\",\"true\"),n.setAttribute(\"aria-live\",\"polite\"),n.id=`cdk-live-announcer-${DoA++}`,this._document.body.appendChild(n),n}_exposeAnnouncerToModals(A){let i=this._document.querySelectorAll('body > .cdk-overlay-container [aria-modal=\"true\"]');for(let n=0;n<i.length;n++){let o=i[n],a=o.getAttribute(\"aria-owns\");a?a.indexOf(A)===-1&&o.setAttribute(\"aria-owns\",a+\" \"+A):o.setAttribute(\"aria-owns\",A)}}static \\u0275fac=function(i){return new(i||t)};static \\u0275prov=TA({token:t,factory:t.\\u0275fac,providedIn:\"root\"})}return t})();var UC=(function(t){return t[t.NONE=0]=\"NONE\",t[t.BLACK_ON_WHITE=1]=\"BLACK_ON_WHITE\",t[t.WHITE_ON_BLACK=2]=\"WHITE_ON_BLACK\",t})(UC||{}),k_=\"cdk-high-contrast-black-on-white\",S_=\"cdk-high-contrast-white-on-black\",Tv=\"cdk-high-contrast-active\",F_=(()=>{class t{_platform=h(ci);_hasCheckedHighContrastMode=!1;_document=h(Zt);_breakpointSubscription;constructor(){this._breakpointSubscription=h(sh).observe(\"(forced-colors: active)\").subscribe(()=>{this._hasCheckedHighContrastMode&&(this._hasCheckedHighContrastMode=!1,this._applyBodyHighContrastModeCssClasses())})}getHighContrastMode(){if(!this._platform.isBrowser)return UC.NONE;let A=this._document.createElement(\"div\");A.style.backgroundColor=\"rgb(1,2,3)\",A.style.position=\"absolute\",this._document.body.appendChild(A);let i=this._document.defaultView||window,n=i&&i.getComputedStyle?i.getComputedStyle(A):null,o=(n&&n.backgroundColor||\"\").replace(/ /g,\"\");switch(A.remove(),o){case\"rgb(0,0,0)\":case\"rgb(45,50,54)\":case\"rgb(32,32,32)\":return UC.WHITE_ON_BLACK;case\"rgb(255,255,255)\":case\"rgb(255,250,239)\":return UC.BLACK_ON_WHITE}return UC.NONE}ngOnDestroy(){this._breakpointSubscription.unsubscribe()}_applyBodyHighContrastModeCssClasses(){if(!this._hasCheckedHighContrastMode&&this._platform.isBrowser&&this._document.body){let A=this._document.body.classList;A.remove(Tv,k_,S_),this._hasCheckedHighContrastMode=!0;let i=this.getHighContrastMode();i===UC.BLACK_ON_WHITE?A.add(Tv,k_):i===UC.WHITE_ON_BLACK&&A.add(Tv,S_)}}static \\u0275fac=function(i){return new(i||t)};static \\u0275prov=TA({token:t,factory:t.\\u0275fac,providedIn:\"root\"})}return t})(),ch=(()=>{class t{constructor(){h(F_)._applyBodyHighContrastModeCssClasses()}static \\u0275fac=function(i){return new(i||t)};static \\u0275mod=Xe({type:t});static \\u0275inj=Ze({imports:[Of]})}return t})();var Ov={},An=class t{_appId=h(Bf);static _infix=`a${Math.floor(Math.random()*1e5).toString()}`;getId(e,A=!1){return this._appId!==\"ng\"&&(e+=this._appId),Ov.hasOwnProperty(e)||(Ov[e]=0),`${e}${A?t._infix+\"-\":\"\"}${Ov[e]++}`}static \\u0275fac=function(A){return new(A||t)};static \\u0275prov=TA({token:t,factory:t.\\u0275fac,providedIn:\"root\"})};var woA=200,Pf=class{_letterKeyStream=new $A;_items=[];_selectedItemIndex=-1;_pressedLetters=[];_skipPredicateFn;_selectedItem=new $A;selectedItem=this._selectedItem;constructor(e,A){let i=typeof A?.debounceInterval==\"number\"?A.debounceInterval:woA;A?.skipPredicate&&(this._skipPredicateFn=A.skipPredicate),this.setItems(e),this._setupKeyHandler(i)}destroy(){this._pressedLetters=[],this._letterKeyStream.complete(),this._selectedItem.complete()}setCurrentSelectedItemIndex(e){this._selectedItemIndex=e}setItems(e){this._items=e}handleKey(e){let A=e.keyCode;e.key&&e.key.length===1?this._letterKeyStream.next(e.key.toLocaleUpperCase()):(A>=65&&A<=90||A>=48&&A<=57)&&this._letterKeyStream.next(String.fromCharCode(A))}isTyping(){return this._pressedLetters.length>0}reset(){this._pressedLetters=[]}_setupKeyHandler(e){this._letterKeyStream.pipe(Wt(A=>this._pressedLetters.push(A)),ps(e),We(()=>this._pressedLetters.length>0),fe(()=>this._pressedLetters.join(\"\").toLocaleUpperCase())).subscribe(A=>{for(let i=1;i<this._items.length+1;i++){let n=(this._selectedItemIndex+i)%this._items.length,o=this._items[n];if(!this._skipPredicateFn?.(o)&&o.getLabel?.().toLocaleUpperCase().trim().indexOf(A)===0){this._selectedItem.next(o);break}}this._pressedLetters=[]})}};function aa(t,...e){return e.length?e.some(A=>t[A]):t.altKey||t.shiftKey||t.ctrlKey||t.metaKey}var Rd=class{_items;_activeItemIndex=jA(-1);_activeItem=jA(null);_wrap=!1;_typeaheadSubscription=Rn.EMPTY;_itemChangesSubscription;_vertical=!0;_horizontal=null;_allowedModifierKeys=[];_homeAndEnd=!1;_pageUpAndDown={enabled:!1,delta:10};_effectRef;_typeahead;_skipPredicateFn=e=>e.disabled;constructor(e,A){this._items=e,e instanceof Sg?this._itemChangesSubscription=e.changes.subscribe(i=>this._itemsChanged(i.toArray())):bI(e)&&(this._effectRef=pa(()=>this._itemsChanged(e()),{injector:A}))}tabOut=new $A;change=new $A;skipPredicate(e){return this._skipPredicateFn=e,this}withWrap(e=!0){return this._wrap=e,this}withVerticalOrientation(e=!0){return this._vertical=e,this}withHorizontalOrientation(e){return this._horizontal=e,this}withAllowedModifierKeys(e){return this._allowedModifierKeys=e,this}withTypeAhead(e=200){this._typeaheadSubscription.unsubscribe();let A=this._getItemsArray();return this._typeahead=new Pf(A,{debounceInterval:typeof e==\"number\"?e:void 0,skipPredicate:i=>this._skipPredicateFn(i)}),this._typeaheadSubscription=this._typeahead.selectedItem.subscribe(i=>{this.setActiveItem(i)}),this}cancelTypeahead(){return this._typeahead?.reset(),this}withHomeAndEnd(e=!0){return this._homeAndEnd=e,this}withPageUpDown(e=!0,A=10){return this._pageUpAndDown={enabled:e,delta:A},this}setActiveItem(e){let A=this._activeItem();this.updateActiveItem(e),this._activeItem()!==A&&this.change.next(this._activeItemIndex())}onKeydown(e){let A=e.keyCode,n=[\"altKey\",\"ctrlKey\",\"metaKey\",\"shiftKey\"].every(o=>!e[o]||this._allowedModifierKeys.indexOf(o)>-1);switch(A){case 9:this.tabOut.next();return;case 40:if(this._vertical&&n){this.setNextItemActive();break}else return;case 38:if(this._vertical&&n){this.setPreviousItemActive();break}else return;case 39:if(this._horizontal&&n){this._horizontal===\"rtl\"?this.setPreviousItemActive():this.setNextItemActive();break}else return;case 37:if(this._horizontal&&n){this._horizontal===\"rtl\"?this.setNextItemActive():this.setPreviousItemActive();break}else return;case 36:if(this._homeAndEnd&&n){this.setFirstItemActive();break}else return;case 35:if(this._homeAndEnd&&n){this.setLastItemActive();break}else return;case 33:if(this._pageUpAndDown.enabled&&n){let o=this._activeItemIndex()-this._pageUpAndDown.delta;this._setActiveItemByIndex(o>0?o:0,1);break}else return;case 34:if(this._pageUpAndDown.enabled&&n){let o=this._activeItemIndex()+this._pageUpAndDown.delta,a=this._getItemsArray().length;this._setActiveItemByIndex(o<a?o:a-1,-1);break}else return;default:(n||aa(e,\"shiftKey\"))&&this._typeahead?.handleKey(e);return}this._typeahead?.reset(),e.preventDefault()}get activeItemIndex(){return this._activeItemIndex()}get activeItem(){return this._activeItem()}isTyping(){return!!this._typeahead&&this._typeahead.isTyping()}setFirstItemActive(){this._setActiveItemByIndex(0,1)}setLastItemActive(){this._setActiveItemByIndex(this._getItemsArray().length-1,-1)}setNextItemActive(){this._activeItemIndex()<0?this.setFirstItemActive():this._setActiveItemByDelta(1)}setPreviousItemActive(){this._activeItemIndex()<0&&this._wrap?this.setLastItemActive():this._setActiveItemByDelta(-1)}updateActiveItem(e){let A=this._getItemsArray(),i=typeof e==\"number\"?e:A.indexOf(e),n=A[i];this._activeItem.set(n??null),this._activeItemIndex.set(i),this._typeahead?.setCurrentSelectedItemIndex(i)}destroy(){this._typeaheadSubscription.unsubscribe(),this._itemChangesSubscription?.unsubscribe(),this._effectRef?.destroy(),this._typeahead?.destroy(),this.tabOut.complete(),this.change.complete()}_setActiveItemByDelta(e){this._wrap?this._setActiveInWrapMode(e):this._setActiveInDefaultMode(e)}_setActiveInWrapMode(e){let A=this._getItemsArray();for(let i=1;i<=A.length;i++){let n=(this._activeItemIndex()+e*i+A.length)%A.length,o=A[n];if(!this._skipPredicateFn(o)){this.setActiveItem(n);return}}}_setActiveInDefaultMode(e){this._setActiveItemByIndex(this._activeItemIndex()+e,e)}_setActiveItemByIndex(e,A){let i=this._getItemsArray();if(i[e]){for(;this._skipPredicateFn(i[e]);)if(e+=A,!i[e])return;this.setActiveItem(e)}}_getItemsArray(){return bI(this._items)?this._items():this._items instanceof Sg?this._items.toArray():this._items}_itemsChanged(e){this._typeahead?.setItems(e);let A=this._activeItem();if(A){let i=e.indexOf(A);i>-1&&i!==this._activeItemIndex()&&(this._activeItemIndex.set(i),this._typeahead?.setCurrentSelectedItemIndex(i))}}};var Qh=class extends Rd{setActiveItem(e){this.activeItem&&this.activeItem.setInactiveStyles(),super.setActiveItem(e),this.activeItem&&this.activeItem.setActiveStyles()}};var Mc=class extends Rd{_origin=\"program\";setFocusOrigin(e){return this._origin=e,this}setActiveItem(e){super.setActiveItem(e),this.activeItem&&this.activeItem.focus(this._origin)}};var G_=\" \";function jv(t,e,A){let i=qf(t,e);A=A.trim(),!i.some(n=>n.trim()===A)&&(i.push(A),t.setAttribute(e,i.join(G_)))}function Vf(t,e,A){let i=qf(t,e);A=A.trim();let n=i.filter(o=>o!==A);n.length?t.setAttribute(e,n.join(G_)):t.removeAttribute(e)}function qf(t,e){return t.getAttribute(e)?.match(/\\S+/g)??[]}var K_=\"cdk-describedby-message\",jf=\"cdk-describedby-host\",Pv=0,U_=(()=>{class t{_platform=h(ci);_document=h(Zt);_messageRegistry=new Map;_messagesContainer=null;_id=`${Pv++}`;constructor(){h(Hn).load(KC),this._id=h(Bf)+\"-\"+Pv++}describe(A,i,n){if(!this._canBeDescribed(A,i))return;let o=zv(i,n);typeof i!=\"string\"?(__(i,this._id),this._messageRegistry.set(o,{messageElement:i,referenceCount:0})):this._messageRegistry.has(o)||this._createMessageElement(i,n),this._isElementDescribedByMessage(A,o)||this._addMessageReference(A,o)}removeDescription(A,i,n){if(!i||!this._isElementNode(A))return;let o=zv(i,n);if(this._isElementDescribedByMessage(A,o)&&this._removeMessageReference(A,o),typeof i==\"string\"){let a=this._messageRegistry.get(o);a&&a.referenceCount===0&&this._deleteMessageElement(o)}this._messagesContainer?.childNodes.length===0&&(this._messagesContainer.remove(),this._messagesContainer=null)}ngOnDestroy(){let A=this._document.querySelectorAll(`[${jf}=\"${this._id}\"]`);for(let i=0;i<A.length;i++)this._removeCdkDescribedByReferenceIds(A[i]),A[i].removeAttribute(jf);this._messagesContainer?.remove(),this._messagesContainer=null,this._messageRegistry.clear()}_createMessageElement(A,i){let n=this._document.createElement(\"div\");__(n,this._id),n.textContent=A,i&&n.setAttribute(\"role\",i),this._createMessagesContainer(),this._messagesContainer.appendChild(n),this._messageRegistry.set(zv(A,i),{messageElement:n,referenceCount:0})}_deleteMessageElement(A){this._messageRegistry.get(A)?.messageElement?.remove(),this._messageRegistry.delete(A)}_createMessagesContainer(){if(this._messagesContainer)return;let A=\"cdk-describedby-message-container\",i=this._document.querySelectorAll(`.${A}[platform=\"server\"]`);for(let o=0;o<i.length;o++)i[o].remove();let n=this._document.createElement(\"div\");n.style.visibility=\"hidden\",n.classList.add(A),n.classList.add(\"cdk-visually-hidden\"),this._platform.isBrowser||n.setAttribute(\"platform\",\"server\"),this._document.body.appendChild(n),this._messagesContainer=n}_removeCdkDescribedByReferenceIds(A){let i=qf(A,\"aria-describedby\").filter(n=>n.indexOf(K_)!=0);A.setAttribute(\"aria-describedby\",i.join(\" \"))}_addMessageReference(A,i){let n=this._messageRegistry.get(i);jv(A,\"aria-describedby\",n.messageElement.id),A.setAttribute(jf,this._id),n.referenceCount++}_removeMessageReference(A,i){let n=this._messageRegistry.get(i);n.referenceCount--,Vf(A,\"aria-describedby\",n.messageElement.id),A.removeAttribute(jf)}_isElementDescribedByMessage(A,i){let n=qf(A,\"aria-describedby\"),o=this._messageRegistry.get(i),a=o&&o.messageElement.id;return!!a&&n.indexOf(a)!=-1}_canBeDescribed(A,i){if(!this._isElementNode(A))return!1;if(i&&typeof i==\"object\")return!0;let n=i==null?\"\":`${i}`.trim(),o=A.getAttribute(\"aria-label\");return n?!o||o.trim()!==n:!1}_isElementNode(A){return A.nodeType===this._document.ELEMENT_NODE}static \\u0275fac=function(i){return new(i||t)};static \\u0275prov=TA({token:t,factory:t.\\u0275fac,providedIn:\"root\"})}return t})();function zv(t,e){return typeof t==\"string\"?`${e||\"\"}/${t}`:t}function __(t,e){t.id||(t.id=`${K_}-${e}-${Pv++}`)}var ml=(function(t){return t[t.NORMAL=0]=\"NORMAL\",t[t.NEGATED=1]=\"NEGATED\",t[t.INVERTED=2]=\"INVERTED\",t})(ml||{}),Wf,LI;function Zf(){if(LI==null){if(typeof document!=\"object\"||!document||typeof Element!=\"function\"||!Element)return LI=!1,LI;if(document.documentElement?.style&&\"scrollBehavior\"in document.documentElement.style)LI=!0;else{let t=Element.prototype.scrollTo;t?LI=!/\\{\\s*\\[native code\\]\\s*\\}/.test(t.toString()):LI=!1}}return LI}function Nd(){if(typeof document!=\"object\"||!document)return ml.NORMAL;if(Wf==null){let t=document.createElement(\"div\"),e=t.style;t.dir=\"rtl\",e.width=\"1px\",e.overflow=\"auto\",e.visibility=\"hidden\",e.pointerEvents=\"none\",e.position=\"absolute\";let A=document.createElement(\"div\"),i=A.style;i.width=\"2px\",i.height=\"1px\",t.appendChild(A),document.body.appendChild(t),Wf=ml.NORMAL,t.scrollLeft===0&&(t.scrollLeft=1,Wf=t.scrollLeft===0?ml.NEGATED:ml.INVERTED),t.remove()}return Wf}function qv(){return typeof __karma__<\"u\"&&!!__karma__||typeof jasmine<\"u\"&&!!jasmine||typeof jest<\"u\"&&!!jest||typeof Mocha<\"u\"&&!!Mocha}var Fd,J_=[\"color\",\"button\",\"checkbox\",\"date\",\"datetime-local\",\"email\",\"file\",\"hidden\",\"image\",\"month\",\"number\",\"password\",\"radio\",\"range\",\"reset\",\"search\",\"submit\",\"tel\",\"text\",\"time\",\"url\",\"week\"];function Vv(){if(Fd)return Fd;if(typeof document!=\"object\"||!document)return Fd=new Set(J_),Fd;let t=document.createElement(\"input\");return Fd=new Set(J_.filter(e=>(t.setAttribute(\"type\",e),t.type===e))),Fd}var Y_={XSmall:\"(max-width: 599.98px)\",Small:\"(min-width: 600px) and (max-width: 959.98px)\",Medium:\"(min-width: 960px) and (max-width: 1279.98px)\",Large:\"(min-width: 1280px) and (max-width: 1919.98px)\",XLarge:\"(min-width: 1920px)\",Handset:\"(max-width: 599.98px) and (orientation: portrait), (max-width: 959.98px) and (orientation: landscape)\",Tablet:\"(min-width: 600px) and (max-width: 839.98px) and (orientation: portrait), (min-width: 960px) and (max-width: 1279.98px) and (orientation: landscape)\",Web:\"(min-width: 840px) and (orientation: portrait), (min-width: 1280px) and (orientation: landscape)\",HandsetPortrait:\"(max-width: 599.98px) and (orientation: portrait)\",TabletPortrait:\"(min-width: 600px) and (max-width: 839.98px) and (orientation: portrait)\",WebPortrait:\"(min-width: 840px) and (orientation: portrait)\",HandsetLandscape:\"(max-width: 959.98px) and (orientation: landscape)\",TabletLandscape:\"(min-width: 960px) and (max-width: 1279.98px) and (orientation: landscape)\",WebLandscape:\"(min-width: 1280px) and (orientation: landscape)\"};var voA=new wA(\"MATERIAL_ANIMATIONS\"),H_=null;function Eh(){return h(voA,{optional:!0})?.animationsDisabled||h(vI,{optional:!0})===\"NoopAnimations\"?\"di-disabled\":(H_??=h(Sd).matchMedia(\"(prefers-reduced-motion)\").matches,H_?\"reduced-motion\":\"enabled\")}function Oi(){return Eh()!==\"enabled\"}function Ra(t){return t==null?\"\":typeof t==\"string\"?t:`${t}px`}function sr(t){return t!=null&&`${t}`!=\"false\"}var cs=(function(t){return t[t.FADING_IN=0]=\"FADING_IN\",t[t.VISIBLE=1]=\"VISIBLE\",t[t.FADING_OUT=2]=\"FADING_OUT\",t[t.HIDDEN=3]=\"HIDDEN\",t})(cs||{}),Wv=class{_renderer;element;config;_animationForciblyDisabledThroughCss;state=cs.HIDDEN;constructor(e,A,i,n=!1){this._renderer=e,this.element=A,this.config=i,this._animationForciblyDisabledThroughCss=n}fadeOut(){this._renderer.fadeOutRipple(this)}},T_=Md({passive:!0,capture:!0}),Zv=class{_events=new Map;addHandler(e,A,i,n){let o=this._events.get(A);if(o){let a=o.get(i);a?a.add(n):o.set(i,new Set([n]))}else this._events.set(A,new Map([[i,new Set([n])]])),e.runOutsideAngular(()=>{document.addEventListener(A,this._delegateEventHandler,T_)})}removeHandler(e,A,i){let n=this._events.get(e);if(!n)return;let o=n.get(A);o&&(o.delete(i),o.size===0&&n.delete(A),n.size===0&&(this._events.delete(e),document.removeEventListener(e,this._delegateEventHandler,T_)))}_delegateEventHandler=e=>{let A=yr(e);A&&this._events.get(e.type)?.forEach((i,n)=>{(n===A||n.contains(A))&&i.forEach(o=>o.handleEvent(e))})}},hh={enterDuration:225,exitDuration:150},boA=800,O_=Md({passive:!0,capture:!0}),z_=[\"mousedown\",\"touchstart\"],P_=[\"mouseup\",\"mouseleave\",\"touchend\",\"touchcancel\"],MoA=(()=>{class t{static \\u0275fac=function(i){return new(i||t)};static \\u0275cmp=kA({type:t,selectors:[[\"ng-component\"]],hostAttrs:[\"mat-ripple-style-loader\",\"\"],decls:0,vars:0,template:function(i,n){},styles:[`.mat-ripple{overflow:hidden;position:relative}.mat-ripple:not(:empty){transform:translateZ(0)}.mat-ripple.mat-ripple-unbounded{overflow:visible}.mat-ripple-element{position:absolute;border-radius:50%;pointer-events:none;transition:opacity,transform 0ms cubic-bezier(0, 0, 0.2, 1);transform:scale3d(0, 0, 0);background-color:var(--mat-ripple-color, color-mix(in srgb, var(--mat-sys-on-surface) 10%, transparent))}@media(forced-colors: active){.mat-ripple-element{display:none}}.cdk-drag-preview .mat-ripple-element,.cdk-drag-placeholder .mat-ripple-element{display:none}\n`],encapsulation:2,changeDetection:0})}return t})(),uh=class t{_target;_ngZone;_platform;_containerElement;_triggerElement=null;_isPointerDown=!1;_activeRipples=new Map;_mostRecentTransientRipple=null;_lastTouchStartEvent;_pointerUpEventsRegistered=!1;_containerRect=null;static _eventManager=new Zv;constructor(e,A,i,n,o){this._target=e,this._ngZone=A,this._platform=n,n.isBrowser&&(this._containerElement=ls(i)),o&&o.get(Hn).load(MoA)}fadeInRipple(e,A,i={}){let n=this._containerRect=this._containerRect||this._containerElement.getBoundingClientRect(),o=BA(BA({},hh),i.animation);i.centered&&(e=n.left+n.width/2,A=n.top+n.height/2);let a=i.radius||koA(e,A,n),r=e-n.left,s=A-n.top,g=o.enterDuration,l=document.createElement(\"div\");l.classList.add(\"mat-ripple-element\"),l.style.left=`${r-a}px`,l.style.top=`${s-a}px`,l.style.height=`${a*2}px`,l.style.width=`${a*2}px`,i.color!=null&&(l.style.backgroundColor=i.color),l.style.transitionDuration=`${g}ms`,this._containerElement.appendChild(l);let C=window.getComputedStyle(l),I=C.transitionProperty,d=C.transitionDuration,B=I===\"none\"||d===\"0s\"||d===\"0s, 0s\"||n.width===0&&n.height===0,Q=new Wv(this,l,i,B);l.style.transform=\"scale3d(1, 1, 1)\",Q.state=cs.FADING_IN,i.persistent||(this._mostRecentTransientRipple=Q);let E=null;return!B&&(g||o.exitDuration)&&this._ngZone.runOutsideAngular(()=>{let f=()=>{E&&(E.fallbackTimer=null),clearTimeout(R),this._finishRippleTransition(Q)},b=()=>this._destroyRipple(Q),R=setTimeout(b,g+100);l.addEventListener(\"transitionend\",f),l.addEventListener(\"transitioncancel\",b),E={onTransitionEnd:f,onTransitionCancel:b,fallbackTimer:R}}),this._activeRipples.set(Q,E),(B||!g)&&this._finishRippleTransition(Q),Q}fadeOutRipple(e){if(e.state===cs.FADING_OUT||e.state===cs.HIDDEN)return;let A=e.element,i=BA(BA({},hh),e.config.animation);A.style.transitionDuration=`${i.exitDuration}ms`,A.style.opacity=\"0\",e.state=cs.FADING_OUT,(e._animationForciblyDisabledThroughCss||!i.exitDuration)&&this._finishRippleTransition(e)}fadeOutAll(){this._getActiveRipples().forEach(e=>e.fadeOut())}fadeOutAllNonPersistent(){this._getActiveRipples().forEach(e=>{e.config.persistent||e.fadeOut()})}setupTriggerEvents(e){let A=ls(e);!this._platform.isBrowser||!A||A===this._triggerElement||(this._removeTriggerEvents(),this._triggerElement=A,z_.forEach(i=>{t._eventManager.addHandler(this._ngZone,i,A,this)}))}handleEvent(e){e.type===\"mousedown\"?this._onMousedown(e):e.type===\"touchstart\"?this._onTouchStart(e):this._onPointerUp(),this._pointerUpEventsRegistered||(this._ngZone.runOutsideAngular(()=>{P_.forEach(A=>{this._triggerElement.addEventListener(A,this,O_)})}),this._pointerUpEventsRegistered=!0)}_finishRippleTransition(e){e.state===cs.FADING_IN?this._startFadeOutTransition(e):e.state===cs.FADING_OUT&&this._destroyRipple(e)}_startFadeOutTransition(e){let A=e===this._mostRecentTransientRipple,{persistent:i}=e.config;e.state=cs.VISIBLE,!i&&(!A||!this._isPointerDown)&&e.fadeOut()}_destroyRipple(e){let A=this._activeRipples.get(e)??null;this._activeRipples.delete(e),this._activeRipples.size||(this._containerRect=null),e===this._mostRecentTransientRipple&&(this._mostRecentTransientRipple=null),e.state=cs.HIDDEN,A!==null&&(e.element.removeEventListener(\"transitionend\",A.onTransitionEnd),e.element.removeEventListener(\"transitioncancel\",A.onTransitionCancel),A.fallbackTimer!==null&&clearTimeout(A.fallbackTimer)),e.element.remove()}_onMousedown(e){let A=xI(e),i=this._lastTouchStartEvent&&Date.now()<this._lastTouchStartEvent+boA;!this._target.rippleDisabled&&!A&&!i&&(this._isPointerDown=!0,this.fadeInRipple(e.clientX,e.clientY,this._target.rippleConfig))}_onTouchStart(e){if(!this._target.rippleDisabled&&!RI(e)){this._lastTouchStartEvent=Date.now(),this._isPointerDown=!0;let A=e.changedTouches;if(A)for(let i=0;i<A.length;i++)this.fadeInRipple(A[i].clientX,A[i].clientY,this._target.rippleConfig)}}_onPointerUp(){this._isPointerDown&&(this._isPointerDown=!1,this._getActiveRipples().forEach(e=>{let A=e.state===cs.VISIBLE||e.config.terminateOnPointerUp&&e.state===cs.FADING_IN;!e.config.persistent&&A&&e.fadeOut()}))}_getActiveRipples(){return Array.from(this._activeRipples.keys())}_removeTriggerEvents(){let e=this._triggerElement;e&&(z_.forEach(A=>t._eventManager.removeHandler(A,e,this)),this._pointerUpEventsRegistered&&(P_.forEach(A=>e.removeEventListener(A,this,O_)),this._pointerUpEventsRegistered=!1))}};function koA(t,e,A){let i=Math.max(Math.abs(t-A.left),Math.abs(t-A.right)),n=Math.max(Math.abs(e-A.top),Math.abs(e-A.bottom));return Math.sqrt(i*i+n*n)}var JC=new wA(\"mat-ripple-global-options\"),Ns=(()=>{class t{_elementRef=h(ge);_animationsDisabled=Oi();color;unbounded=!1;centered=!1;radius=0;animation;get disabled(){return this._disabled}set disabled(A){A&&this.fadeOutAllNonPersistent(),this._disabled=A,this._setupTriggerEventsIfEnabled()}_disabled=!1;get trigger(){return this._trigger||this._elementRef.nativeElement}set trigger(A){this._trigger=A,this._setupTriggerEventsIfEnabled()}_trigger;_rippleRenderer;_globalOptions;_isInitialized=!1;constructor(){let A=h(Oe),i=h(ci),n=h(JC,{optional:!0}),o=h(ut);this._globalOptions=n||{},this._rippleRenderer=new uh(this,A,this._elementRef,i,o)}ngOnInit(){this._isInitialized=!0,this._setupTriggerEventsIfEnabled()}ngOnDestroy(){this._rippleRenderer._removeTriggerEvents()}fadeOutAll(){this._rippleRenderer.fadeOutAll()}fadeOutAllNonPersistent(){this._rippleRenderer.fadeOutAllNonPersistent()}get rippleConfig(){return{centered:this.centered,radius:this.radius,color:this.color,animation:BA(BA(BA({},this._globalOptions.animation),this._animationsDisabled?{enterDuration:0,exitDuration:0}:{}),this.animation),terminateOnPointerUp:this._globalOptions.terminateOnPointerUp}}get rippleDisabled(){return this.disabled||!!this._globalOptions.disabled}_setupTriggerEventsIfEnabled(){!this.disabled&&this._isInitialized&&this._rippleRenderer.setupTriggerEvents(this.trigger)}launch(A,i=0,n){return typeof A==\"number\"?this._rippleRenderer.fadeInRipple(A,i,BA(BA({},this.rippleConfig),n)):this._rippleRenderer.fadeInRipple(0,0,BA(BA({},this.rippleConfig),A))}static \\u0275fac=function(i){return new(i||t)};static \\u0275dir=OA({type:t,selectors:[[\"\",\"mat-ripple\",\"\"],[\"\",\"matRipple\",\"\"]],hostAttrs:[1,\"mat-ripple\"],hostVars:2,hostBindings:function(i,n){i&2&&ae(\"mat-ripple-unbounded\",n.unbounded)},inputs:{color:[0,\"matRippleColor\",\"color\"],unbounded:[0,\"matRippleUnbounded\",\"unbounded\"],centered:[0,\"matRippleCentered\",\"centered\"],radius:[0,\"matRippleRadius\",\"radius\"],animation:[0,\"matRippleAnimation\",\"animation\"],disabled:[0,\"matRippleDisabled\",\"disabled\"],trigger:[0,\"matRippleTrigger\",\"trigger\"]},exportAs:[\"matRipple\"]})}return t})();var SoA={capture:!0},xoA=[\"focus\",\"mousedown\",\"mouseenter\",\"touchstart\"],Xv=\"mat-ripple-loader-uninitialized\",$v=\"mat-ripple-loader-class-name\",j_=\"mat-ripple-loader-centered\",Xf=\"mat-ripple-loader-disabled\",$f=(()=>{class t{_document=h(Zt);_animationsDisabled=Oi();_globalRippleOptions=h(JC,{optional:!0});_platform=h(ci);_ngZone=h(Oe);_injector=h(ut);_eventCleanups;_hosts=new Map;constructor(){let A=h(Dr).createRenderer(null,null);this._eventCleanups=this._ngZone.runOutsideAngular(()=>xoA.map(i=>A.listen(this._document,i,this._onInteraction,SoA)))}ngOnDestroy(){let A=this._hosts.keys();for(let i of A)this.destroyRipple(i);this._eventCleanups.forEach(i=>i())}configureRipple(A,i){A.setAttribute(Xv,this._globalRippleOptions?.namespace??\"\"),(i.className||!A.hasAttribute($v))&&A.setAttribute($v,i.className||\"\"),i.centered&&A.setAttribute(j_,\"\"),i.disabled&&A.setAttribute(Xf,\"\")}setDisabled(A,i){let n=this._hosts.get(A);n?(n.target.rippleDisabled=i,!i&&!n.hasSetUpEvents&&(n.hasSetUpEvents=!0,n.renderer.setupTriggerEvents(A))):i?A.setAttribute(Xf,\"\"):A.removeAttribute(Xf)}_onInteraction=A=>{let i=yr(A);if(i instanceof HTMLElement){let n=i.closest(`[${Xv}=\"${this._globalRippleOptions?.namespace??\"\"}\"]`);n&&this._createRipple(n)}};_createRipple(A){if(!this._document||this._hosts.has(A))return;A.querySelector(\".mat-ripple\")?.remove();let i=this._document.createElement(\"span\");i.classList.add(\"mat-ripple\",A.getAttribute($v)),A.append(i);let n=this._globalRippleOptions,o=this._animationsDisabled?0:n?.animation?.enterDuration??hh.enterDuration,a=this._animationsDisabled?0:n?.animation?.exitDuration??hh.exitDuration,r={rippleDisabled:this._animationsDisabled||n?.disabled||A.hasAttribute(Xf),rippleConfig:{centered:A.hasAttribute(j_),terminateOnPointerUp:n?.terminateOnPointerUp,animation:{enterDuration:o,exitDuration:a}}},s=new uh(r,this._ngZone,i,this._platform,this._injector),g=!r.rippleDisabled;g&&s.setupTriggerEvents(A),this._hosts.set(A,{target:r,renderer:s,hasSetUpEvents:g}),A.removeAttribute(Xv)}destroyRipple(A){let i=this._hosts.get(A);i&&(i.renderer._removeTriggerEvents(),this._hosts.delete(A))}static \\u0275fac=function(i){return new(i||t)};static \\u0275prov=TA({token:t,factory:t.\\u0275fac,providedIn:\"root\"})}return t})();var Za=(()=>{class t{static \\u0275fac=function(i){return new(i||t)};static \\u0275cmp=kA({type:t,selectors:[[\"structural-styles\"]],decls:0,vars:0,template:function(i,n){},styles:[`.mat-focus-indicator{position:relative}.mat-focus-indicator::before{top:0;left:0;right:0;bottom:0;position:absolute;box-sizing:border-box;pointer-events:none;display:var(--mat-focus-indicator-display, none);border-width:var(--mat-focus-indicator-border-width, 3px);border-style:var(--mat-focus-indicator-border-style, solid);border-color:var(--mat-focus-indicator-border-color, transparent);border-radius:var(--mat-focus-indicator-border-radius, 4px)}.mat-focus-indicator:focus-visible::before{content:\"\"}@media(forced-colors: active){html{--mat-focus-indicator-display: block}}\n`],encapsulation:2,changeDetection:0})}return t})();var RoA=[\"mat-icon-button\",\"\"],NoA=[\"*\"],FoA=new wA(\"MAT_BUTTON_CONFIG\");function q_(t){return t==null?void 0:Zi(t)}var Am=(()=>{class t{_elementRef=h(ge);_ngZone=h(Oe);_animationsDisabled=Oi();_config=h(FoA,{optional:!0});_focusMonitor=h(Ha);_cleanupClick;_renderer=h(ui);_rippleLoader=h($f);_isAnchor;_isFab=!1;color;get disableRipple(){return this._disableRipple}set disableRipple(A){this._disableRipple=A,this._updateRippleDisabled()}_disableRipple=!1;get disabled(){return this._disabled}set disabled(A){this._disabled=A,this._updateRippleDisabled()}_disabled=!1;ariaDisabled;disabledInteractive;tabIndex;set _tabindex(A){this.tabIndex=A}constructor(){h(Hn).load(Za);let A=this._elementRef.nativeElement;this._isAnchor=A.tagName===\"A\",this.disabledInteractive=this._config?.disabledInteractive??!1,this.color=this._config?.color??null,this._rippleLoader?.configureRipple(A,{className:\"mat-mdc-button-ripple\"})}ngAfterViewInit(){this._focusMonitor.monitor(this._elementRef,!0),this._isAnchor&&this._setupAsAnchor()}ngOnDestroy(){this._cleanupClick?.(),this._focusMonitor.stopMonitoring(this._elementRef),this._rippleLoader?.destroyRipple(this._elementRef.nativeElement)}focus(A=\"program\",i){A?this._focusMonitor.focusVia(this._elementRef.nativeElement,A,i):this._elementRef.nativeElement.focus(i)}_getAriaDisabled(){return this.ariaDisabled!=null?this.ariaDisabled:this._isAnchor?this.disabled||null:this.disabled&&this.disabledInteractive?!0:null}_getDisabledAttribute(){return this.disabledInteractive||!this.disabled?null:!0}_updateRippleDisabled(){this._rippleLoader?.setDisabled(this._elementRef.nativeElement,this.disableRipple||this.disabled)}_getTabIndex(){return this._isAnchor?this.disabled&&!this.disabledInteractive?-1:this.tabIndex:this.tabIndex}_setupAsAnchor(){this._cleanupClick=this._ngZone.runOutsideAngular(()=>this._renderer.listen(this._elementRef.nativeElement,\"click\",A=>{this.disabled&&(A.preventDefault(),A.stopImmediatePropagation())}))}static \\u0275fac=function(i){return new(i||t)};static \\u0275dir=OA({type:t,hostAttrs:[1,\"mat-mdc-button-base\"],hostVars:13,hostBindings:function(i,n){i&2&&(ie(\"disabled\",n._getDisabledAttribute())(\"aria-disabled\",n._getAriaDisabled())(\"tabindex\",n._getTabIndex()),Qo(n.color?\"mat-\"+n.color:\"\"),ae(\"mat-mdc-button-disabled\",n.disabled)(\"mat-mdc-button-disabled-interactive\",n.disabledInteractive)(\"mat-unthemed\",!n.color)(\"_mat-animation-noopable\",n._animationsDisabled))},inputs:{color:\"color\",disableRipple:[2,\"disableRipple\",\"disableRipple\",he],disabled:[2,\"disabled\",\"disabled\",he],ariaDisabled:[2,\"aria-disabled\",\"ariaDisabled\",he],disabledInteractive:[2,\"disabledInteractive\",\"disabledInteractive\",he],tabIndex:[2,\"tabIndex\",\"tabIndex\",q_],_tabindex:[2,\"tabindex\",\"_tabindex\",q_]}})}return t})(),Ia=(()=>{class t extends Am{constructor(){super(),this._rippleLoader.configureRipple(this._elementRef.nativeElement,{centered:!0})}static \\u0275fac=function(i){return new(i||t)};static \\u0275cmp=kA({type:t,selectors:[[\"button\",\"mat-icon-button\",\"\"],[\"a\",\"mat-icon-button\",\"\"],[\"button\",\"matIconButton\",\"\"],[\"a\",\"matIconButton\",\"\"]],hostAttrs:[1,\"mdc-icon-button\",\"mat-mdc-icon-button\"],exportAs:[\"matButton\",\"matAnchor\"],features:[Ct],attrs:RoA,ngContentSelectors:NoA,decls:4,vars:0,consts:[[1,\"mat-mdc-button-persistent-ripple\",\"mdc-icon-button__ripple\"],[1,\"mat-focus-indicator\"],[1,\"mat-mdc-button-touch-target\"]],template:function(i,n){i&1&&(Yt(),Ni(0,\"span\",0),He(1),Ni(2,\"span\",1)(3,\"span\",2))},styles:[`.mat-mdc-icon-button{-webkit-user-select:none;user-select:none;display:inline-block;position:relative;box-sizing:border-box;border:none;outline:none;background-color:rgba(0,0,0,0);fill:currentColor;text-decoration:none;cursor:pointer;z-index:0;overflow:visible;border-radius:var(--mat-icon-button-container-shape, var(--mat-sys-corner-full, 50%));flex-shrink:0;text-align:center;width:var(--mat-icon-button-state-layer-size, 40px);height:var(--mat-icon-button-state-layer-size, 40px);padding:calc(calc(var(--mat-icon-button-state-layer-size, 40px) - var(--mat-icon-button-icon-size, 24px)) / 2);font-size:var(--mat-icon-button-icon-size, 24px);color:var(--mat-icon-button-icon-color, var(--mat-sys-on-surface-variant));-webkit-tap-highlight-color:rgba(0,0,0,0)}.mat-mdc-icon-button .mat-mdc-button-ripple,.mat-mdc-icon-button .mat-mdc-button-persistent-ripple,.mat-mdc-icon-button .mat-mdc-button-persistent-ripple::before{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none;border-radius:inherit}.mat-mdc-icon-button .mat-mdc-button-ripple{overflow:hidden}.mat-mdc-icon-button .mat-mdc-button-persistent-ripple::before{content:\"\";opacity:0}.mat-mdc-icon-button .mdc-button__label,.mat-mdc-icon-button .mat-icon{z-index:1;position:relative}.mat-mdc-icon-button .mat-focus-indicator{top:0;left:0;right:0;bottom:0;position:absolute;border-radius:inherit}.mat-mdc-icon-button:focus-visible>.mat-focus-indicator::before{content:\"\";border-radius:inherit}.mat-mdc-icon-button .mat-ripple-element{background-color:var(--mat-icon-button-ripple-color, color-mix(in srgb, var(--mat-sys-on-surface-variant) calc(var(--mat-sys-pressed-state-layer-opacity) * 100%), transparent))}.mat-mdc-icon-button .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-icon-button-state-layer-color, var(--mat-sys-on-surface-variant))}.mat-mdc-icon-button.mat-mdc-button-disabled .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-icon-button-disabled-state-layer-color, var(--mat-sys-on-surface-variant))}.mat-mdc-icon-button:hover>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-icon-button-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-icon-button.cdk-program-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-icon-button.cdk-keyboard-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-icon-button.mat-mdc-button-disabled-interactive:focus>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-icon-button-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mat-mdc-icon-button:active>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-icon-button-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity))}.mat-mdc-icon-button .mat-mdc-button-touch-target{position:absolute;top:50%;height:var(--mat-icon-button-touch-target-size, 48px);display:var(--mat-icon-button-touch-target-display, block);left:50%;width:var(--mat-icon-button-touch-target-size, 48px);transform:translate(-50%, -50%)}.mat-mdc-icon-button._mat-animation-noopable{transition:none !important;animation:none !important}.mat-mdc-icon-button[disabled],.mat-mdc-icon-button.mat-mdc-button-disabled{cursor:default;pointer-events:none;color:var(--mat-icon-button-disabled-icon-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-mdc-icon-button.mat-mdc-button-disabled-interactive{pointer-events:auto}.mat-mdc-icon-button img,.mat-mdc-icon-button svg{width:var(--mat-icon-button-icon-size, 24px);height:var(--mat-icon-button-icon-size, 24px);vertical-align:baseline}.mat-mdc-icon-button .mat-mdc-button-persistent-ripple{border-radius:var(--mat-icon-button-container-shape, var(--mat-sys-corner-full, 50%))}.mat-mdc-icon-button[hidden]{display:none}.mat-mdc-icon-button.mat-unthemed:not(.mdc-ripple-upgraded):focus::before,.mat-mdc-icon-button.mat-primary:not(.mdc-ripple-upgraded):focus::before,.mat-mdc-icon-button.mat-accent:not(.mdc-ripple-upgraded):focus::before,.mat-mdc-icon-button.mat-warn:not(.mdc-ripple-upgraded):focus::before{background:rgba(0,0,0,0);opacity:1}\n`,`@media(forced-colors: active){.mat-mdc-button:not(.mdc-button--outlined),.mat-mdc-unelevated-button:not(.mdc-button--outlined),.mat-mdc-raised-button:not(.mdc-button--outlined),.mat-mdc-outlined-button:not(.mdc-button--outlined),.mat-mdc-button-base.mat-tonal-button,.mat-mdc-icon-button.mat-mdc-icon-button,.mat-mdc-outlined-button .mdc-button__ripple{outline:solid 1px}}\n`],encapsulation:2,changeDetection:0})}return t})();var LoA=new wA(\"cdk-dir-doc\",{providedIn:\"root\",factory:()=>h(Zt)}),_oA=/^(ar|ckb|dv|he|iw|fa|nqo|ps|sd|ug|ur|yi|.*[-_](Adlm|Arab|Hebr|Nkoo|Rohg|Thaa))(?!.*[-_](Latn|Cyrl)($|-|_))($|-|_)/i;function V_(t){let e=t?.toLowerCase()||\"\";return e===\"auto\"&&typeof navigator<\"u\"&&navigator?.language?_oA.test(navigator.language)?\"rtl\":\"ltr\":e===\"rtl\"?\"rtl\":\"ltr\"}var wo=(()=>{class t{get value(){return this.valueSignal()}valueSignal=jA(\"ltr\");change=new WA;constructor(){let A=h(LoA,{optional:!0});if(A){let i=A.body?A.body.dir:null,n=A.documentElement?A.documentElement.dir:null;this.valueSignal.set(V_(i||n||\"ltr\"))}}ngOnDestroy(){this.change.complete()}static \\u0275fac=function(i){return new(i||t)};static \\u0275prov=TA({token:t,factory:t.\\u0275fac,providedIn:\"root\"})}return t})();var Fi=(()=>{class t{static \\u0275fac=function(i){return new(i||t)};static \\u0275mod=Xe({type:t});static \\u0275inj=Ze({})}return t})();var YC=(()=>{class t{static \\u0275fac=function(i){return new(i||t)};static \\u0275mod=Xe({type:t});static \\u0275inj=Ze({imports:[Fi]})}return t})();var GoA=[\"matButton\",\"\"],Z_=[[[\"\",8,\"material-icons\",3,\"iconPositionEnd\",\"\"],[\"mat-icon\",3,\"iconPositionEnd\",\"\"],[\"\",\"matButtonIcon\",\"\",3,\"iconPositionEnd\",\"\"]],\"*\",[[\"\",\"iconPositionEnd\",\"\",8,\"material-icons\"],[\"mat-icon\",\"iconPositionEnd\",\"\"],[\"\",\"matButtonIcon\",\"\",\"iconPositionEnd\",\"\"]]],X_=[\".material-icons:not([iconPositionEnd]), mat-icon:not([iconPositionEnd]), [matButtonIcon]:not([iconPositionEnd])\",\"*\",\".material-icons[iconPositionEnd], mat-icon[iconPositionEnd], [matButtonIcon][iconPositionEnd]\"];var KoA=[\"mat-mini-fab\",\"\"],UoA=`.mat-mdc-fab-base{-webkit-user-select:none;user-select:none;position:relative;display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;width:56px;height:56px;padding:0;border:none;fill:currentColor;text-decoration:none;cursor:pointer;-moz-appearance:none;-webkit-appearance:none;overflow:visible;transition:box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1),opacity 15ms linear 30ms,transform 270ms 0ms cubic-bezier(0, 0, 0.2, 1);flex-shrink:0;-webkit-tap-highlight-color:rgba(0,0,0,0)}.mat-mdc-fab-base .mat-mdc-button-ripple,.mat-mdc-fab-base .mat-mdc-button-persistent-ripple,.mat-mdc-fab-base .mat-mdc-button-persistent-ripple::before{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none;border-radius:inherit}.mat-mdc-fab-base .mat-mdc-button-ripple{overflow:hidden}.mat-mdc-fab-base .mat-mdc-button-persistent-ripple::before{content:\"\";opacity:0}.mat-mdc-fab-base .mdc-button__label,.mat-mdc-fab-base .mat-icon{z-index:1;position:relative}.mat-mdc-fab-base .mat-focus-indicator{top:0;left:0;right:0;bottom:0;position:absolute}.mat-mdc-fab-base:focus-visible>.mat-focus-indicator::before{content:\"\"}.mat-mdc-fab-base._mat-animation-noopable{transition:none !important;animation:none !important}.mat-mdc-fab-base::before{position:absolute;box-sizing:border-box;width:100%;height:100%;top:0;left:0;border:1px solid rgba(0,0,0,0);border-radius:inherit;content:\"\";pointer-events:none}.mat-mdc-fab-base[hidden]{display:none}.mat-mdc-fab-base::-moz-focus-inner{padding:0;border:0}.mat-mdc-fab-base:active,.mat-mdc-fab-base:focus{outline:none}.mat-mdc-fab-base:hover{cursor:pointer}.mat-mdc-fab-base>svg{width:100%}.mat-mdc-fab-base .mat-icon,.mat-mdc-fab-base .material-icons{transition:transform 180ms 90ms cubic-bezier(0, 0, 0.2, 1);fill:currentColor;will-change:transform}.mat-mdc-fab-base .mat-focus-indicator::before{margin:calc(calc(var(--mat-focus-indicator-border-width, 3px) + 2px)*-1)}.mat-mdc-fab-base[disabled],.mat-mdc-fab-base.mat-mdc-button-disabled{cursor:default;pointer-events:none}.mat-mdc-fab-base[disabled],.mat-mdc-fab-base[disabled]:focus,.mat-mdc-fab-base.mat-mdc-button-disabled,.mat-mdc-fab-base.mat-mdc-button-disabled:focus{box-shadow:none}.mat-mdc-fab-base.mat-mdc-button-disabled-interactive{pointer-events:auto}.mat-mdc-fab{background-color:var(--mat-fab-container-color, var(--mat-sys-primary-container));border-radius:var(--mat-fab-container-shape, var(--mat-sys-corner-large));color:var(--mat-fab-foreground-color, var(--mat-sys-on-primary-container, inherit));box-shadow:var(--mat-fab-container-elevation-shadow, var(--mat-sys-level3))}@media(hover: hover){.mat-mdc-fab:hover{box-shadow:var(--mat-fab-hover-container-elevation-shadow, var(--mat-sys-level4))}}.mat-mdc-fab:focus{box-shadow:var(--mat-fab-focus-container-elevation-shadow, var(--mat-sys-level3))}.mat-mdc-fab:active,.mat-mdc-fab:focus:active{box-shadow:var(--mat-fab-pressed-container-elevation-shadow, var(--mat-sys-level3))}.mat-mdc-fab[disabled],.mat-mdc-fab.mat-mdc-button-disabled{cursor:default;pointer-events:none;color:var(--mat-fab-disabled-state-foreground-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent));background-color:var(--mat-fab-disabled-state-container-color, color-mix(in srgb, var(--mat-sys-on-surface) 12%, transparent))}.mat-mdc-fab.mat-mdc-button-disabled-interactive{pointer-events:auto}.mat-mdc-fab .mat-mdc-button-touch-target{position:absolute;top:50%;height:var(--mat-fab-touch-target-size, 48px);display:var(--mat-fab-touch-target-display, block);left:50%;width:var(--mat-fab-touch-target-size, 48px);transform:translate(-50%, -50%)}.mat-mdc-fab .mat-ripple-element{background-color:var(--mat-fab-ripple-color, color-mix(in srgb, var(--mat-sys-on-primary-container) calc(var(--mat-sys-pressed-state-layer-opacity) * 100%), transparent))}.mat-mdc-fab .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-fab-state-layer-color, var(--mat-sys-on-primary-container))}.mat-mdc-fab.mat-mdc-button-disabled .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-fab-disabled-state-layer-color)}.mat-mdc-fab:hover>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-fab-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-fab.cdk-program-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-fab.cdk-keyboard-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-fab.mat-mdc-button-disabled-interactive:focus>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-fab-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mat-mdc-fab:active>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-fab-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity))}.mat-mdc-mini-fab{width:40px;height:40px;background-color:var(--mat-fab-small-container-color, var(--mat-sys-primary-container));border-radius:var(--mat-fab-small-container-shape, var(--mat-sys-corner-medium));color:var(--mat-fab-small-foreground-color, var(--mat-sys-on-primary-container, inherit));box-shadow:var(--mat-fab-small-container-elevation-shadow, var(--mat-sys-level3))}@media(hover: hover){.mat-mdc-mini-fab:hover{box-shadow:var(--mat-fab-small-hover-container-elevation-shadow, var(--mat-sys-level4))}}.mat-mdc-mini-fab:focus{box-shadow:var(--mat-fab-small-focus-container-elevation-shadow, var(--mat-sys-level3))}.mat-mdc-mini-fab:active,.mat-mdc-mini-fab:focus:active{box-shadow:var(--mat-fab-small-pressed-container-elevation-shadow, var(--mat-sys-level3))}.mat-mdc-mini-fab[disabled],.mat-mdc-mini-fab.mat-mdc-button-disabled{cursor:default;pointer-events:none;color:var(--mat-fab-small-disabled-state-foreground-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent));background-color:var(--mat-fab-small-disabled-state-container-color, color-mix(in srgb, var(--mat-sys-on-surface) 12%, transparent))}.mat-mdc-mini-fab.mat-mdc-button-disabled-interactive{pointer-events:auto}.mat-mdc-mini-fab .mat-mdc-button-touch-target{position:absolute;top:50%;height:var(--mat-fab-small-touch-target-size, 48px);display:var(--mat-fab-small-touch-target-display);left:50%;width:var(--mat-fab-small-touch-target-size, 48px);transform:translate(-50%, -50%)}.mat-mdc-mini-fab .mat-ripple-element{background-color:var(--mat-fab-small-ripple-color, color-mix(in srgb, var(--mat-sys-on-primary-container) calc(var(--mat-sys-pressed-state-layer-opacity) * 100%), transparent))}.mat-mdc-mini-fab .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-fab-small-state-layer-color, var(--mat-sys-on-primary-container))}.mat-mdc-mini-fab.mat-mdc-button-disabled .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-fab-small-disabled-state-layer-color)}.mat-mdc-mini-fab:hover>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-fab-small-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-mini-fab.cdk-program-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-mini-fab.cdk-keyboard-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-mini-fab.mat-mdc-button-disabled-interactive:focus>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-fab-small-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mat-mdc-mini-fab:active>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-fab-small-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity))}.mat-mdc-extended-fab{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;padding-left:20px;padding-right:20px;width:auto;max-width:100%;line-height:normal;box-shadow:var(--mat-fab-extended-container-elevation-shadow, var(--mat-sys-level3));height:var(--mat-fab-extended-container-height, 56px);border-radius:var(--mat-fab-extended-container-shape, var(--mat-sys-corner-large));font-family:var(--mat-fab-extended-label-text-font, var(--mat-sys-label-large-font));font-size:var(--mat-fab-extended-label-text-size, var(--mat-sys-label-large-size));font-weight:var(--mat-fab-extended-label-text-weight, var(--mat-sys-label-large-weight));letter-spacing:var(--mat-fab-extended-label-text-tracking, var(--mat-sys-label-large-tracking))}@media(hover: hover){.mat-mdc-extended-fab:hover{box-shadow:var(--mat-fab-extended-hover-container-elevation-shadow, var(--mat-sys-level4))}}.mat-mdc-extended-fab:focus{box-shadow:var(--mat-fab-extended-focus-container-elevation-shadow, var(--mat-sys-level3))}.mat-mdc-extended-fab:active,.mat-mdc-extended-fab:focus:active{box-shadow:var(--mat-fab-extended-pressed-container-elevation-shadow, var(--mat-sys-level3))}.mat-mdc-extended-fab[disabled],.mat-mdc-extended-fab.mat-mdc-button-disabled{cursor:default;pointer-events:none}.mat-mdc-extended-fab[disabled],.mat-mdc-extended-fab[disabled]:focus,.mat-mdc-extended-fab.mat-mdc-button-disabled,.mat-mdc-extended-fab.mat-mdc-button-disabled:focus{box-shadow:none}.mat-mdc-extended-fab.mat-mdc-button-disabled-interactive{pointer-events:auto}[dir=rtl] .mat-mdc-extended-fab .mdc-button__label+.mat-icon,[dir=rtl] .mat-mdc-extended-fab .mdc-button__label+.material-icons,.mat-mdc-extended-fab>.mat-icon,.mat-mdc-extended-fab>.material-icons{margin-left:-8px;margin-right:12px}.mat-mdc-extended-fab .mdc-button__label+.mat-icon,.mat-mdc-extended-fab .mdc-button__label+.material-icons,[dir=rtl] .mat-mdc-extended-fab>.mat-icon,[dir=rtl] .mat-mdc-extended-fab>.material-icons{margin-left:12px;margin-right:-8px}.mat-mdc-extended-fab .mat-mdc-button-touch-target{width:100%}\n`,W_=new Map([[\"text\",[\"mat-mdc-button\"]],[\"filled\",[\"mdc-button--unelevated\",\"mat-mdc-unelevated-button\"]],[\"elevated\",[\"mdc-button--raised\",\"mat-mdc-raised-button\"]],[\"outlined\",[\"mdc-button--outlined\",\"mat-mdc-outlined-button\"]],[\"tonal\",[\"mat-tonal-button\"]]]),vn=(()=>{class t extends Am{get appearance(){return this._appearance}set appearance(A){this.setAppearance(A||this._config?.defaultAppearance||\"text\")}_appearance=null;constructor(){super();let A=JoA(this._elementRef.nativeElement);A&&this.setAppearance(A)}setAppearance(A){if(A===this._appearance)return;let i=this._elementRef.nativeElement.classList,n=this._appearance?W_.get(this._appearance):null,o=W_.get(A);n&&i.remove(...n),i.add(...o),this._appearance=A}static \\u0275fac=function(i){return new(i||t)};static \\u0275cmp=kA({type:t,selectors:[[\"button\",\"matButton\",\"\"],[\"a\",\"matButton\",\"\"],[\"button\",\"mat-button\",\"\"],[\"button\",\"mat-raised-button\",\"\"],[\"button\",\"mat-flat-button\",\"\"],[\"button\",\"mat-stroked-button\",\"\"],[\"a\",\"mat-button\",\"\"],[\"a\",\"mat-raised-button\",\"\"],[\"a\",\"mat-flat-button\",\"\"],[\"a\",\"mat-stroked-button\",\"\"]],hostAttrs:[1,\"mdc-button\"],inputs:{appearance:[0,\"matButton\",\"appearance\"]},exportAs:[\"matButton\",\"matAnchor\"],features:[Ct],attrs:GoA,ngContentSelectors:X_,decls:7,vars:4,consts:[[1,\"mat-mdc-button-persistent-ripple\"],[1,\"mdc-button__label\"],[1,\"mat-focus-indicator\"],[1,\"mat-mdc-button-touch-target\"]],template:function(i,n){i&1&&(Yt(Z_),Ni(0,\"span\",0),He(1),ti(2,\"span\",1),He(3,1),Ii(),He(4,2),Ni(5,\"span\",2)(6,\"span\",3)),i&2&&ae(\"mdc-button__ripple\",!n._isFab)(\"mdc-fab__ripple\",n._isFab)},styles:[`.mat-mdc-button-base{text-decoration:none}.mat-mdc-button-base .mat-icon{min-height:fit-content;flex-shrink:0}@media(hover: none){.mat-mdc-button-base:hover>span.mat-mdc-button-persistent-ripple::before{opacity:0}}.mdc-button{-webkit-user-select:none;user-select:none;position:relative;display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;min-width:64px;border:none;outline:none;line-height:inherit;-webkit-appearance:none;overflow:visible;vertical-align:middle;background:rgba(0,0,0,0);padding:0 8px}.mdc-button::-moz-focus-inner{padding:0;border:0}.mdc-button:active{outline:none}.mdc-button:hover{cursor:pointer}.mdc-button:disabled{cursor:default;pointer-events:none}.mdc-button[hidden]{display:none}.mdc-button .mdc-button__label{position:relative}.mat-mdc-button{padding:0 var(--mat-button-text-horizontal-padding, 12px);height:var(--mat-button-text-container-height, 40px);font-family:var(--mat-button-text-label-text-font, var(--mat-sys-label-large-font));font-size:var(--mat-button-text-label-text-size, var(--mat-sys-label-large-size));letter-spacing:var(--mat-button-text-label-text-tracking, var(--mat-sys-label-large-tracking));text-transform:var(--mat-button-text-label-text-transform);font-weight:var(--mat-button-text-label-text-weight, var(--mat-sys-label-large-weight))}.mat-mdc-button,.mat-mdc-button .mdc-button__ripple{border-radius:var(--mat-button-text-container-shape, var(--mat-sys-corner-full))}.mat-mdc-button:not(:disabled){color:var(--mat-button-text-label-text-color, var(--mat-sys-primary))}.mat-mdc-button[disabled],.mat-mdc-button.mat-mdc-button-disabled{cursor:default;pointer-events:none;color:var(--mat-button-text-disabled-label-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-mdc-button.mat-mdc-button-disabled-interactive{pointer-events:auto}.mat-mdc-button:has(.material-icons,mat-icon,[matButtonIcon]){padding:0 var(--mat-button-text-with-icon-horizontal-padding, 16px)}.mat-mdc-button>.mat-icon{margin-right:var(--mat-button-text-icon-spacing, 8px);margin-left:var(--mat-button-text-icon-offset, -4px)}[dir=rtl] .mat-mdc-button>.mat-icon{margin-right:var(--mat-button-text-icon-offset, -4px);margin-left:var(--mat-button-text-icon-spacing, 8px)}.mat-mdc-button .mdc-button__label+.mat-icon{margin-right:var(--mat-button-text-icon-offset, -4px);margin-left:var(--mat-button-text-icon-spacing, 8px)}[dir=rtl] .mat-mdc-button .mdc-button__label+.mat-icon{margin-right:var(--mat-button-text-icon-spacing, 8px);margin-left:var(--mat-button-text-icon-offset, -4px)}.mat-mdc-button .mat-ripple-element{background-color:var(--mat-button-text-ripple-color, color-mix(in srgb, var(--mat-sys-primary) calc(var(--mat-sys-pressed-state-layer-opacity) * 100%), transparent))}.mat-mdc-button .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-button-text-state-layer-color, var(--mat-sys-primary))}.mat-mdc-button.mat-mdc-button-disabled .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-button-text-disabled-state-layer-color, var(--mat-sys-on-surface-variant))}.mat-mdc-button:hover>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-button-text-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-button.cdk-program-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-button.cdk-keyboard-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-button.mat-mdc-button-disabled-interactive:focus>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-button-text-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mat-mdc-button:active>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-button-text-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity))}.mat-mdc-button .mat-mdc-button-touch-target{position:absolute;top:50%;height:var(--mat-button-text-touch-target-size, 48px);display:var(--mat-button-text-touch-target-display, block);left:0;right:0;transform:translateY(-50%)}.mat-mdc-unelevated-button{transition:box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1);height:var(--mat-button-filled-container-height, 40px);font-family:var(--mat-button-filled-label-text-font, var(--mat-sys-label-large-font));font-size:var(--mat-button-filled-label-text-size, var(--mat-sys-label-large-size));letter-spacing:var(--mat-button-filled-label-text-tracking, var(--mat-sys-label-large-tracking));text-transform:var(--mat-button-filled-label-text-transform);font-weight:var(--mat-button-filled-label-text-weight, var(--mat-sys-label-large-weight));padding:0 var(--mat-button-filled-horizontal-padding, 24px)}.mat-mdc-unelevated-button>.mat-icon{margin-right:var(--mat-button-filled-icon-spacing, 8px);margin-left:var(--mat-button-filled-icon-offset, -8px)}[dir=rtl] .mat-mdc-unelevated-button>.mat-icon{margin-right:var(--mat-button-filled-icon-offset, -8px);margin-left:var(--mat-button-filled-icon-spacing, 8px)}.mat-mdc-unelevated-button .mdc-button__label+.mat-icon{margin-right:var(--mat-button-filled-icon-offset, -8px);margin-left:var(--mat-button-filled-icon-spacing, 8px)}[dir=rtl] .mat-mdc-unelevated-button .mdc-button__label+.mat-icon{margin-right:var(--mat-button-filled-icon-spacing, 8px);margin-left:var(--mat-button-filled-icon-offset, -8px)}.mat-mdc-unelevated-button .mat-ripple-element{background-color:var(--mat-button-filled-ripple-color, color-mix(in srgb, var(--mat-sys-on-primary) calc(var(--mat-sys-pressed-state-layer-opacity) * 100%), transparent))}.mat-mdc-unelevated-button .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-button-filled-state-layer-color, var(--mat-sys-on-primary))}.mat-mdc-unelevated-button.mat-mdc-button-disabled .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-button-filled-disabled-state-layer-color, var(--mat-sys-on-surface-variant))}.mat-mdc-unelevated-button:hover>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-button-filled-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-unelevated-button.cdk-program-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-unelevated-button.cdk-keyboard-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-unelevated-button.mat-mdc-button-disabled-interactive:focus>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-button-filled-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mat-mdc-unelevated-button:active>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-button-filled-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity))}.mat-mdc-unelevated-button .mat-mdc-button-touch-target{position:absolute;top:50%;height:var(--mat-button-filled-touch-target-size, 48px);display:var(--mat-button-filled-touch-target-display, block);left:0;right:0;transform:translateY(-50%)}.mat-mdc-unelevated-button:not(:disabled){color:var(--mat-button-filled-label-text-color, var(--mat-sys-on-primary));background-color:var(--mat-button-filled-container-color, var(--mat-sys-primary))}.mat-mdc-unelevated-button,.mat-mdc-unelevated-button .mdc-button__ripple{border-radius:var(--mat-button-filled-container-shape, var(--mat-sys-corner-full))}.mat-mdc-unelevated-button[disabled],.mat-mdc-unelevated-button.mat-mdc-button-disabled{cursor:default;pointer-events:none;color:var(--mat-button-filled-disabled-label-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent));background-color:var(--mat-button-filled-disabled-container-color, color-mix(in srgb, var(--mat-sys-on-surface) 12%, transparent))}.mat-mdc-unelevated-button.mat-mdc-button-disabled-interactive{pointer-events:auto}.mat-mdc-raised-button{transition:box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1);box-shadow:var(--mat-button-protected-container-elevation-shadow, var(--mat-sys-level1));height:var(--mat-button-protected-container-height, 40px);font-family:var(--mat-button-protected-label-text-font, var(--mat-sys-label-large-font));font-size:var(--mat-button-protected-label-text-size, var(--mat-sys-label-large-size));letter-spacing:var(--mat-button-protected-label-text-tracking, var(--mat-sys-label-large-tracking));text-transform:var(--mat-button-protected-label-text-transform);font-weight:var(--mat-button-protected-label-text-weight, var(--mat-sys-label-large-weight));padding:0 var(--mat-button-protected-horizontal-padding, 24px)}.mat-mdc-raised-button>.mat-icon{margin-right:var(--mat-button-protected-icon-spacing, 8px);margin-left:var(--mat-button-protected-icon-offset, -8px)}[dir=rtl] .mat-mdc-raised-button>.mat-icon{margin-right:var(--mat-button-protected-icon-offset, -8px);margin-left:var(--mat-button-protected-icon-spacing, 8px)}.mat-mdc-raised-button .mdc-button__label+.mat-icon{margin-right:var(--mat-button-protected-icon-offset, -8px);margin-left:var(--mat-button-protected-icon-spacing, 8px)}[dir=rtl] .mat-mdc-raised-button .mdc-button__label+.mat-icon{margin-right:var(--mat-button-protected-icon-spacing, 8px);margin-left:var(--mat-button-protected-icon-offset, -8px)}.mat-mdc-raised-button .mat-ripple-element{background-color:var(--mat-button-protected-ripple-color, color-mix(in srgb, var(--mat-sys-primary) calc(var(--mat-sys-pressed-state-layer-opacity) * 100%), transparent))}.mat-mdc-raised-button .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-button-protected-state-layer-color, var(--mat-sys-primary))}.mat-mdc-raised-button.mat-mdc-button-disabled .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-button-protected-disabled-state-layer-color, var(--mat-sys-on-surface-variant))}.mat-mdc-raised-button:hover>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-button-protected-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-raised-button.cdk-program-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-raised-button.cdk-keyboard-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-raised-button.mat-mdc-button-disabled-interactive:focus>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-button-protected-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mat-mdc-raised-button:active>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-button-protected-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity))}.mat-mdc-raised-button .mat-mdc-button-touch-target{position:absolute;top:50%;height:var(--mat-button-protected-touch-target-size, 48px);display:var(--mat-button-protected-touch-target-display, block);left:0;right:0;transform:translateY(-50%)}.mat-mdc-raised-button:not(:disabled){color:var(--mat-button-protected-label-text-color, var(--mat-sys-primary));background-color:var(--mat-button-protected-container-color, var(--mat-sys-surface))}.mat-mdc-raised-button,.mat-mdc-raised-button .mdc-button__ripple{border-radius:var(--mat-button-protected-container-shape, var(--mat-sys-corner-full))}@media(hover: hover){.mat-mdc-raised-button:hover{box-shadow:var(--mat-button-protected-hover-container-elevation-shadow, var(--mat-sys-level2))}}.mat-mdc-raised-button:focus{box-shadow:var(--mat-button-protected-focus-container-elevation-shadow, var(--mat-sys-level1))}.mat-mdc-raised-button:active,.mat-mdc-raised-button:focus:active{box-shadow:var(--mat-button-protected-pressed-container-elevation-shadow, var(--mat-sys-level1))}.mat-mdc-raised-button[disabled],.mat-mdc-raised-button.mat-mdc-button-disabled{cursor:default;pointer-events:none;color:var(--mat-button-protected-disabled-label-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent));background-color:var(--mat-button-protected-disabled-container-color, color-mix(in srgb, var(--mat-sys-on-surface) 12%, transparent))}.mat-mdc-raised-button[disabled].mat-mdc-button-disabled,.mat-mdc-raised-button.mat-mdc-button-disabled.mat-mdc-button-disabled{box-shadow:var(--mat-button-protected-disabled-container-elevation-shadow, var(--mat-sys-level0))}.mat-mdc-raised-button.mat-mdc-button-disabled-interactive{pointer-events:auto}.mat-mdc-outlined-button{border-style:solid;transition:border 280ms cubic-bezier(0.4, 0, 0.2, 1);height:var(--mat-button-outlined-container-height, 40px);font-family:var(--mat-button-outlined-label-text-font, var(--mat-sys-label-large-font));font-size:var(--mat-button-outlined-label-text-size, var(--mat-sys-label-large-size));letter-spacing:var(--mat-button-outlined-label-text-tracking, var(--mat-sys-label-large-tracking));text-transform:var(--mat-button-outlined-label-text-transform);font-weight:var(--mat-button-outlined-label-text-weight, var(--mat-sys-label-large-weight));border-radius:var(--mat-button-outlined-container-shape, var(--mat-sys-corner-full));border-width:var(--mat-button-outlined-outline-width, 1px);padding:0 var(--mat-button-outlined-horizontal-padding, 24px)}.mat-mdc-outlined-button>.mat-icon{margin-right:var(--mat-button-outlined-icon-spacing, 8px);margin-left:var(--mat-button-outlined-icon-offset, -8px)}[dir=rtl] .mat-mdc-outlined-button>.mat-icon{margin-right:var(--mat-button-outlined-icon-offset, -8px);margin-left:var(--mat-button-outlined-icon-spacing, 8px)}.mat-mdc-outlined-button .mdc-button__label+.mat-icon{margin-right:var(--mat-button-outlined-icon-offset, -8px);margin-left:var(--mat-button-outlined-icon-spacing, 8px)}[dir=rtl] .mat-mdc-outlined-button .mdc-button__label+.mat-icon{margin-right:var(--mat-button-outlined-icon-spacing, 8px);margin-left:var(--mat-button-outlined-icon-offset, -8px)}.mat-mdc-outlined-button .mat-ripple-element{background-color:var(--mat-button-outlined-ripple-color, color-mix(in srgb, var(--mat-sys-primary) calc(var(--mat-sys-pressed-state-layer-opacity) * 100%), transparent))}.mat-mdc-outlined-button .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-button-outlined-state-layer-color, var(--mat-sys-primary))}.mat-mdc-outlined-button.mat-mdc-button-disabled .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-button-outlined-disabled-state-layer-color, var(--mat-sys-on-surface-variant))}.mat-mdc-outlined-button:hover>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-button-outlined-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-outlined-button.cdk-program-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-outlined-button.cdk-keyboard-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-outlined-button.mat-mdc-button-disabled-interactive:focus>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-button-outlined-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mat-mdc-outlined-button:active>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-button-outlined-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity))}.mat-mdc-outlined-button .mat-mdc-button-touch-target{position:absolute;top:50%;height:var(--mat-button-outlined-touch-target-size, 48px);display:var(--mat-button-outlined-touch-target-display, block);left:0;right:0;transform:translateY(-50%)}.mat-mdc-outlined-button:not(:disabled){color:var(--mat-button-outlined-label-text-color, var(--mat-sys-primary));border-color:var(--mat-button-outlined-outline-color, var(--mat-sys-outline))}.mat-mdc-outlined-button[disabled],.mat-mdc-outlined-button.mat-mdc-button-disabled{cursor:default;pointer-events:none;color:var(--mat-button-outlined-disabled-label-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent));border-color:var(--mat-button-outlined-disabled-outline-color, color-mix(in srgb, var(--mat-sys-on-surface) 12%, transparent))}.mat-mdc-outlined-button.mat-mdc-button-disabled-interactive{pointer-events:auto}.mat-tonal-button{transition:box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1);height:var(--mat-button-tonal-container-height, 40px);font-family:var(--mat-button-tonal-label-text-font, var(--mat-sys-label-large-font));font-size:var(--mat-button-tonal-label-text-size, var(--mat-sys-label-large-size));letter-spacing:var(--mat-button-tonal-label-text-tracking, var(--mat-sys-label-large-tracking));text-transform:var(--mat-button-tonal-label-text-transform);font-weight:var(--mat-button-tonal-label-text-weight, var(--mat-sys-label-large-weight));padding:0 var(--mat-button-tonal-horizontal-padding, 24px)}.mat-tonal-button:not(:disabled){color:var(--mat-button-tonal-label-text-color, var(--mat-sys-on-secondary-container));background-color:var(--mat-button-tonal-container-color, var(--mat-sys-secondary-container))}.mat-tonal-button,.mat-tonal-button .mdc-button__ripple{border-radius:var(--mat-button-tonal-container-shape, var(--mat-sys-corner-full))}.mat-tonal-button[disabled],.mat-tonal-button.mat-mdc-button-disabled{cursor:default;pointer-events:none;color:var(--mat-button-tonal-disabled-label-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent));background-color:var(--mat-button-tonal-disabled-container-color, color-mix(in srgb, var(--mat-sys-on-surface) 12%, transparent))}.mat-tonal-button.mat-mdc-button-disabled-interactive{pointer-events:auto}.mat-tonal-button>.mat-icon{margin-right:var(--mat-button-tonal-icon-spacing, 8px);margin-left:var(--mat-button-tonal-icon-offset, -8px)}[dir=rtl] .mat-tonal-button>.mat-icon{margin-right:var(--mat-button-tonal-icon-offset, -8px);margin-left:var(--mat-button-tonal-icon-spacing, 8px)}.mat-tonal-button .mdc-button__label+.mat-icon{margin-right:var(--mat-button-tonal-icon-offset, -8px);margin-left:var(--mat-button-tonal-icon-spacing, 8px)}[dir=rtl] .mat-tonal-button .mdc-button__label+.mat-icon{margin-right:var(--mat-button-tonal-icon-spacing, 8px);margin-left:var(--mat-button-tonal-icon-offset, -8px)}.mat-tonal-button .mat-ripple-element{background-color:var(--mat-button-tonal-ripple-color, color-mix(in srgb, var(--mat-sys-on-secondary-container) calc(var(--mat-sys-pressed-state-layer-opacity) * 100%), transparent))}.mat-tonal-button .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-button-tonal-state-layer-color, var(--mat-sys-on-secondary-container))}.mat-tonal-button.mat-mdc-button-disabled .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-button-tonal-disabled-state-layer-color, var(--mat-sys-on-surface-variant))}.mat-tonal-button:hover>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-button-tonal-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-tonal-button.cdk-program-focused>.mat-mdc-button-persistent-ripple::before,.mat-tonal-button.cdk-keyboard-focused>.mat-mdc-button-persistent-ripple::before,.mat-tonal-button.mat-mdc-button-disabled-interactive:focus>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-button-tonal-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mat-tonal-button:active>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-button-tonal-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity))}.mat-tonal-button .mat-mdc-button-touch-target{position:absolute;top:50%;height:var(--mat-button-tonal-touch-target-size, 48px);display:var(--mat-button-tonal-touch-target-display, block);left:0;right:0;transform:translateY(-50%)}.mat-mdc-button,.mat-mdc-unelevated-button,.mat-mdc-raised-button,.mat-mdc-outlined-button,.mat-tonal-button{-webkit-tap-highlight-color:rgba(0,0,0,0)}.mat-mdc-button .mat-mdc-button-ripple,.mat-mdc-button .mat-mdc-button-persistent-ripple,.mat-mdc-button .mat-mdc-button-persistent-ripple::before,.mat-mdc-unelevated-button .mat-mdc-button-ripple,.mat-mdc-unelevated-button .mat-mdc-button-persistent-ripple,.mat-mdc-unelevated-button .mat-mdc-button-persistent-ripple::before,.mat-mdc-raised-button .mat-mdc-button-ripple,.mat-mdc-raised-button .mat-mdc-button-persistent-ripple,.mat-mdc-raised-button .mat-mdc-button-persistent-ripple::before,.mat-mdc-outlined-button .mat-mdc-button-ripple,.mat-mdc-outlined-button .mat-mdc-button-persistent-ripple,.mat-mdc-outlined-button .mat-mdc-button-persistent-ripple::before,.mat-tonal-button .mat-mdc-button-ripple,.mat-tonal-button .mat-mdc-button-persistent-ripple,.mat-tonal-button .mat-mdc-button-persistent-ripple::before{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none;border-radius:inherit}.mat-mdc-button .mat-mdc-button-ripple,.mat-mdc-unelevated-button .mat-mdc-button-ripple,.mat-mdc-raised-button .mat-mdc-button-ripple,.mat-mdc-outlined-button .mat-mdc-button-ripple,.mat-tonal-button .mat-mdc-button-ripple{overflow:hidden}.mat-mdc-button .mat-mdc-button-persistent-ripple::before,.mat-mdc-unelevated-button .mat-mdc-button-persistent-ripple::before,.mat-mdc-raised-button .mat-mdc-button-persistent-ripple::before,.mat-mdc-outlined-button .mat-mdc-button-persistent-ripple::before,.mat-tonal-button .mat-mdc-button-persistent-ripple::before{content:\"\";opacity:0}.mat-mdc-button .mdc-button__label,.mat-mdc-button .mat-icon,.mat-mdc-unelevated-button .mdc-button__label,.mat-mdc-unelevated-button .mat-icon,.mat-mdc-raised-button .mdc-button__label,.mat-mdc-raised-button .mat-icon,.mat-mdc-outlined-button .mdc-button__label,.mat-mdc-outlined-button .mat-icon,.mat-tonal-button .mdc-button__label,.mat-tonal-button .mat-icon{z-index:1;position:relative}.mat-mdc-button .mat-focus-indicator,.mat-mdc-unelevated-button .mat-focus-indicator,.mat-mdc-raised-button .mat-focus-indicator,.mat-mdc-outlined-button .mat-focus-indicator,.mat-tonal-button .mat-focus-indicator{top:0;left:0;right:0;bottom:0;position:absolute;border-radius:inherit}.mat-mdc-button:focus-visible>.mat-focus-indicator::before,.mat-mdc-unelevated-button:focus-visible>.mat-focus-indicator::before,.mat-mdc-raised-button:focus-visible>.mat-focus-indicator::before,.mat-mdc-outlined-button:focus-visible>.mat-focus-indicator::before,.mat-tonal-button:focus-visible>.mat-focus-indicator::before{content:\"\";border-radius:inherit}.mat-mdc-button._mat-animation-noopable,.mat-mdc-unelevated-button._mat-animation-noopable,.mat-mdc-raised-button._mat-animation-noopable,.mat-mdc-outlined-button._mat-animation-noopable,.mat-tonal-button._mat-animation-noopable{transition:none !important;animation:none !important}.mat-mdc-button>.mat-icon,.mat-mdc-unelevated-button>.mat-icon,.mat-mdc-raised-button>.mat-icon,.mat-mdc-outlined-button>.mat-icon,.mat-tonal-button>.mat-icon{display:inline-block;position:relative;vertical-align:top;font-size:1.125rem;height:1.125rem;width:1.125rem}.mat-mdc-outlined-button .mat-mdc-button-ripple,.mat-mdc-outlined-button .mdc-button__ripple{top:-1px;left:-1px;bottom:-1px;right:-1px}.mat-mdc-unelevated-button .mat-focus-indicator::before,.mat-tonal-button .mat-focus-indicator::before,.mat-mdc-raised-button .mat-focus-indicator::before{margin:calc(calc(var(--mat-focus-indicator-border-width, 3px) + 2px)*-1)}.mat-mdc-outlined-button .mat-focus-indicator::before{margin:calc(calc(var(--mat-focus-indicator-border-width, 3px) + 3px)*-1)}\n`,`@media(forced-colors: active){.mat-mdc-button:not(.mdc-button--outlined),.mat-mdc-unelevated-button:not(.mdc-button--outlined),.mat-mdc-raised-button:not(.mdc-button--outlined),.mat-mdc-outlined-button:not(.mdc-button--outlined),.mat-mdc-button-base.mat-tonal-button,.mat-mdc-icon-button.mat-mdc-icon-button,.mat-mdc-outlined-button .mdc-button__ripple{outline:solid 1px}}\n`],encapsulation:2,changeDetection:0})}return t})();function JoA(t){return t.hasAttribute(\"mat-raised-button\")?\"elevated\":t.hasAttribute(\"mat-stroked-button\")?\"outlined\":t.hasAttribute(\"mat-flat-button\")?\"filled\":t.hasAttribute(\"mat-button\")?\"text\":null}var YoA=new wA(\"mat-mdc-fab-default-options\",{providedIn:\"root\",factory:()=>A7}),A7={color:\"accent\"};var em=(()=>{class t extends Am{_options=h(YoA,{optional:!0});_isFab=!0;constructor(){super(),this._options=this._options||A7,this.color=this._options.color||A7.color}static \\u0275fac=function(i){return new(i||t)};static \\u0275cmp=kA({type:t,selectors:[[\"button\",\"mat-mini-fab\",\"\"],[\"a\",\"mat-mini-fab\",\"\"],[\"button\",\"matMiniFab\",\"\"],[\"a\",\"matMiniFab\",\"\"]],hostAttrs:[1,\"mdc-fab\",\"mat-mdc-fab-base\",\"mdc-fab--mini\",\"mat-mdc-mini-fab\"],exportAs:[\"matButton\",\"matAnchor\"],features:[Ct],attrs:KoA,ngContentSelectors:X_,decls:7,vars:4,consts:[[1,\"mat-mdc-button-persistent-ripple\"],[1,\"mdc-button__label\"],[1,\"mat-focus-indicator\"],[1,\"mat-mdc-button-touch-target\"]],template:function(i,n){i&1&&(Yt(Z_),Ni(0,\"span\",0),He(1),ti(2,\"span\",1),He(3,1),Ii(),He(4,2),Ni(5,\"span\",2)(6,\"span\",3)),i&2&&ae(\"mdc-button__ripple\",!n._isFab)(\"mdc-fab__ripple\",n._isFab)},styles:[UoA],encapsulation:2,changeDetection:0})}return t})();var Cs=(()=>{class t{static \\u0275fac=function(i){return new(i||t)};static \\u0275mod=Xe({type:t});static \\u0275inj=Ze({imports:[YC,Fi]})}return t})();var e7=class{_box;_destroyed=new $A;_resizeSubject=new $A;_resizeObserver;_elementObservables=new Map;constructor(e){this._box=e,typeof ResizeObserver<\"u\"&&(this._resizeObserver=new ResizeObserver(A=>this._resizeSubject.next(A)))}observe(e){return this._elementObservables.has(e)||this._elementObservables.set(e,new Ti(A=>{let i=this._resizeSubject.subscribe(A);return this._resizeObserver?.observe(e,{box:this._box}),()=>{this._resizeObserver?.unobserve(e),i.unsubscribe(),this._elementObservables.delete(e)}}).pipe(We(A=>A.some(i=>i.target===e)),Ds({bufferSize:1,refCount:!0}),Bt(this._destroyed))),this._elementObservables.get(e)}destroy(){this._destroyed.next(),this._destroyed.complete(),this._resizeSubject.complete(),this._elementObservables.clear()}},tm=(()=>{class t{_cleanupErrorListener;_observers=new Map;_ngZone=h(Oe);constructor(){typeof ResizeObserver<\"u\"}ngOnDestroy(){for(let[,A]of this._observers)A.destroy();this._observers.clear(),this._cleanupErrorListener?.()}observe(A,i){let n=i?.box||\"content-box\";return this._observers.has(n)||this._observers.set(n,new e7(n)),this._observers.get(n).observe(A)}static \\u0275fac=function(i){return new(i||t)};static \\u0275prov=TA({token:t,factory:t.\\u0275fac,providedIn:\"root\"})}return t})();var HoA=[\"notch\"],ToA=[\"matFormFieldNotchedOutline\",\"\"],OoA=[\"*\"],$_=[\"iconPrefixContainer\"],AG=[\"textPrefixContainer\"],eG=[\"iconSuffixContainer\"],tG=[\"textSuffixContainer\"],zoA=[\"textField\"],PoA=[\"*\",[[\"mat-label\"]],[[\"\",\"matPrefix\",\"\"],[\"\",\"matIconPrefix\",\"\"]],[[\"\",\"matTextPrefix\",\"\"]],[[\"\",\"matTextSuffix\",\"\"]],[[\"\",\"matSuffix\",\"\"],[\"\",\"matIconSuffix\",\"\"]],[[\"mat-error\"],[\"\",\"matError\",\"\"]],[[\"mat-hint\",3,\"align\",\"end\"]],[[\"mat-hint\",\"align\",\"end\"]]],joA=[\"*\",\"mat-label\",\"[matPrefix], [matIconPrefix]\",\"[matTextPrefix]\",\"[matTextSuffix]\",\"[matSuffix], [matIconSuffix]\",\"mat-error, [matError]\",\"mat-hint:not([align='end'])\",\"mat-hint[align='end']\"];function qoA(t,e){t&1&&GA(0,\"span\",21)}function VoA(t,e){if(t&1&&(m(0,\"label\",20),He(1,1),V(2,qoA,1,0,\"span\",21),D()),t&2){let A=y(2);X(\"floating\",A._shouldLabelFloat())(\"monitorResize\",A._hasOutline())(\"id\",A._labelId),ie(\"for\",A._control.disableAutomaticLabeling?null:A._control.id),p(2),W(!A.hideRequiredMarker&&A._control.required?2:-1)}}function WoA(t,e){if(t&1&&V(0,VoA,3,5,\"label\",20),t&2){let A=y();W(A._hasFloatingLabel()?0:-1)}}function ZoA(t,e){t&1&&GA(0,\"div\",7)}function XoA(t,e){}function $oA(t,e){if(t&1&&yt(0,XoA,0,0,\"ng-template\",13),t&2){y(2);let A=Wi(1);X(\"ngTemplateOutlet\",A)}}function AaA(t,e){if(t&1&&(m(0,\"div\",9),V(1,$oA,1,1,null,13),D()),t&2){let A=y();X(\"matFormFieldNotchedOutlineOpen\",A._shouldLabelFloat()),p(),W(A._forceDisplayInfixLabel()?-1:1)}}function eaA(t,e){t&1&&(m(0,\"div\",10,2),He(2,2),D())}function taA(t,e){t&1&&(m(0,\"div\",11,3),He(2,3),D())}function iaA(t,e){}function naA(t,e){if(t&1&&yt(0,iaA,0,0,\"ng-template\",13),t&2){y();let A=Wi(1);X(\"ngTemplateOutlet\",A)}}function oaA(t,e){t&1&&(m(0,\"div\",14,4),He(2,4),D())}function aaA(t,e){t&1&&(m(0,\"div\",15,5),He(2,5),D())}function raA(t,e){t&1&&GA(0,\"div\",16)}function saA(t,e){t&1&&(m(0,\"div\",18),He(1,6),D())}function gaA(t,e){if(t&1&&(m(0,\"mat-hint\",22),K(1),D()),t&2){let A=y(2);X(\"id\",A._hintLabelId),p(),qA(A.hintLabel)}}function laA(t,e){if(t&1&&(m(0,\"div\",19),V(1,gaA,2,2,\"mat-hint\",22),He(2,7),GA(3,\"div\",23),He(4,8),D()),t&2){let A=y();p(),W(A.hintLabel?1:-1)}}var pl=(()=>{class t{static \\u0275fac=function(i){return new(i||t)};static \\u0275dir=OA({type:t,selectors:[[\"mat-label\"]]})}return t})(),gG=new wA(\"MatError\"),t7=(()=>{class t{id=h(An).getId(\"mat-mdc-error-\");constructor(){}static \\u0275fac=function(i){return new(i||t)};static \\u0275dir=OA({type:t,selectors:[[\"mat-error\"],[\"\",\"matError\",\"\"]],hostAttrs:[1,\"mat-mdc-form-field-error\",\"mat-mdc-form-field-bottom-align\"],hostVars:1,hostBindings:function(i,n){i&2&&Bo(\"id\",n.id)},inputs:{id:\"id\"},features:[It([{provide:gG,useExisting:t}])]})}return t})(),_I=(()=>{class t{align=\"start\";id=h(An).getId(\"mat-mdc-hint-\");static \\u0275fac=function(i){return new(i||t)};static \\u0275dir=OA({type:t,selectors:[[\"mat-hint\"]],hostAttrs:[1,\"mat-mdc-form-field-hint\",\"mat-mdc-form-field-bottom-align\"],hostVars:4,hostBindings:function(i,n){i&2&&(Bo(\"id\",n.id),ie(\"align\",null),ae(\"mat-mdc-form-field-hint-end\",n.align===\"end\"))},inputs:{align:\"align\",id:\"id\"}})}return t})(),lG=new wA(\"MatPrefix\"),i7=(()=>{class t{set _isTextSelector(A){this._isText=!0}_isText=!1;static \\u0275fac=function(i){return new(i||t)};static \\u0275dir=OA({type:t,selectors:[[\"\",\"matPrefix\",\"\"],[\"\",\"matIconPrefix\",\"\"],[\"\",\"matTextPrefix\",\"\"]],inputs:{_isTextSelector:[0,\"matTextPrefix\",\"_isTextSelector\"]},features:[It([{provide:lG,useExisting:t}])]})}return t})(),cG=new wA(\"MatSuffix\"),n7=(()=>{class t{set _isTextSelector(A){this._isText=!0}_isText=!1;static \\u0275fac=function(i){return new(i||t)};static \\u0275dir=OA({type:t,selectors:[[\"\",\"matSuffix\",\"\"],[\"\",\"matIconSuffix\",\"\"],[\"\",\"matTextSuffix\",\"\"]],inputs:{_isTextSelector:[0,\"matTextSuffix\",\"_isTextSelector\"]},features:[It([{provide:cG,useExisting:t}])]})}return t})(),CG=new wA(\"FloatingLabelParent\"),iG=(()=>{class t{_elementRef=h(ge);get floating(){return this._floating}set floating(A){this._floating=A,this.monitorResize&&this._handleResize()}_floating=!1;get monitorResize(){return this._monitorResize}set monitorResize(A){this._monitorResize=A,this._monitorResize?this._subscribeToResize():this._resizeSubscription.unsubscribe()}_monitorResize=!1;_resizeObserver=h(tm);_ngZone=h(Oe);_parent=h(CG);_resizeSubscription=new Rn;constructor(){}ngOnDestroy(){this._resizeSubscription.unsubscribe()}getWidth(){return caA(this._elementRef.nativeElement)}get element(){return this._elementRef.nativeElement}_handleResize(){setTimeout(()=>this._parent._handleLabelResized())}_subscribeToResize(){this._resizeSubscription.unsubscribe(),this._ngZone.runOutsideAngular(()=>{this._resizeSubscription=this._resizeObserver.observe(this._elementRef.nativeElement,{box:\"border-box\"}).subscribe(()=>this._handleResize())})}static \\u0275fac=function(i){return new(i||t)};static \\u0275dir=OA({type:t,selectors:[[\"label\",\"matFormFieldFloatingLabel\",\"\"]],hostAttrs:[1,\"mdc-floating-label\",\"mat-mdc-floating-label\"],hostVars:2,hostBindings:function(i,n){i&2&&ae(\"mdc-floating-label--float-above\",n.floating)},inputs:{floating:\"floating\",monitorResize:\"monitorResize\"}})}return t})();function caA(t){let e=t;if(e.offsetParent!==null)return e.scrollWidth;let A=e.cloneNode(!0);A.style.setProperty(\"position\",\"absolute\"),A.style.setProperty(\"transform\",\"translate(-9999px, -9999px)\"),document.documentElement.appendChild(A);let i=A.scrollWidth;return A.remove(),i}var nG=\"mdc-line-ripple--active\",im=\"mdc-line-ripple--deactivating\",oG=(()=>{class t{_elementRef=h(ge);_cleanupTransitionEnd;constructor(){let A=h(Oe),i=h(ui);A.runOutsideAngular(()=>{this._cleanupTransitionEnd=i.listen(this._elementRef.nativeElement,\"transitionend\",this._handleTransitionEnd)})}activate(){let A=this._elementRef.nativeElement.classList;A.remove(im),A.add(nG)}deactivate(){this._elementRef.nativeElement.classList.add(im)}_handleTransitionEnd=A=>{let i=this._elementRef.nativeElement.classList,n=i.contains(im);A.propertyName===\"opacity\"&&n&&i.remove(nG,im)};ngOnDestroy(){this._cleanupTransitionEnd()}static \\u0275fac=function(i){return new(i||t)};static \\u0275dir=OA({type:t,selectors:[[\"div\",\"matFormFieldLineRipple\",\"\"]],hostAttrs:[1,\"mdc-line-ripple\"]})}return t})(),aG=(()=>{class t{_elementRef=h(ge);_ngZone=h(Oe);open=!1;_notch;ngAfterViewInit(){let A=this._elementRef.nativeElement,i=A.querySelector(\".mdc-floating-label\");i?(A.classList.add(\"mdc-notched-outline--upgraded\"),typeof requestAnimationFrame==\"function\"&&(i.style.transitionDuration=\"0s\",this._ngZone.runOutsideAngular(()=>{requestAnimationFrame(()=>i.style.transitionDuration=\"\")}))):A.classList.add(\"mdc-notched-outline--no-label\")}_setNotchWidth(A){let i=this._notch.nativeElement;!this.open||!A?i.style.width=\"\":i.style.width=`calc(${A}px * var(--mat-mdc-form-field-floating-label-scale, 0.75) + 9px)`}_setMaxWidth(A){this._notch.nativeElement.style.setProperty(\"--mat-form-field-notch-max-width\",`calc(100% - ${A}px)`)}static \\u0275fac=function(i){return new(i||t)};static \\u0275cmp=kA({type:t,selectors:[[\"div\",\"matFormFieldNotchedOutline\",\"\"]],viewQuery:function(i,n){if(i&1&&ni(HoA,5),i&2){let o;Ce(o=Ie())&&(n._notch=o.first)}},hostAttrs:[1,\"mdc-notched-outline\"],hostVars:2,hostBindings:function(i,n){i&2&&ae(\"mdc-notched-outline--notched\",n.open)},inputs:{open:[0,\"matFormFieldNotchedOutlineOpen\",\"open\"]},attrs:ToA,ngContentSelectors:OoA,decls:5,vars:0,consts:[[\"notch\",\"\"],[1,\"mat-mdc-notch-piece\",\"mdc-notched-outline__leading\"],[1,\"mat-mdc-notch-piece\",\"mdc-notched-outline__notch\"],[1,\"mat-mdc-notch-piece\",\"mdc-notched-outline__trailing\"]],template:function(i,n){i&1&&(Yt(),Ni(0,\"div\",1),ti(1,\"div\",2,0),He(3),Ii(),Ni(4,\"div\",3))},encapsulation:2,changeDetection:0})}return t})(),fh=(()=>{class t{value=null;stateChanges;id;placeholder;ngControl=null;focused=!1;empty=!1;shouldLabelFloat=!1;required=!1;disabled=!1;errorState=!1;controlType;autofilled;userAriaDescribedBy;disableAutomaticLabeling;describedByIds;static \\u0275fac=function(i){return new(i||t)};static \\u0275dir=OA({type:t})}return t})();var mh=new wA(\"MatFormField\"),CaA=new wA(\"MAT_FORM_FIELD_DEFAULT_OPTIONS\"),rG=\"fill\",IaA=\"auto\",sG=\"fixed\",daA=\"translateY(-50%)\",To=(()=>{class t{_elementRef=h(ge);_changeDetectorRef=h(ft);_platform=h(ci);_idGenerator=h(An);_ngZone=h(Oe);_defaults=h(CaA,{optional:!0});_currentDirection;_textField;_iconPrefixContainer;_textPrefixContainer;_iconSuffixContainer;_textSuffixContainer;_floatingLabel;_notchedOutline;_lineRipple;_iconPrefixContainerSignal=Xo(\"iconPrefixContainer\");_textPrefixContainerSignal=Xo(\"textPrefixContainer\");_iconSuffixContainerSignal=Xo(\"iconSuffixContainer\");_textSuffixContainerSignal=Xo(\"textSuffixContainer\");_prefixSuffixContainers=_e(()=>[this._iconPrefixContainerSignal(),this._textPrefixContainerSignal(),this._iconSuffixContainerSignal(),this._textSuffixContainerSignal()].map(A=>A?.nativeElement).filter(A=>A!==void 0));_formFieldControl;_prefixChildren;_suffixChildren;_errorChildren;_hintChildren;_labelChild=w0(pl);get hideRequiredMarker(){return this._hideRequiredMarker}set hideRequiredMarker(A){this._hideRequiredMarker=sr(A)}_hideRequiredMarker=!1;color=\"primary\";get floatLabel(){return this._floatLabel||this._defaults?.floatLabel||IaA}set floatLabel(A){A!==this._floatLabel&&(this._floatLabel=A,this._changeDetectorRef.markForCheck())}_floatLabel;get appearance(){return this._appearanceSignal()}set appearance(A){let i=A||this._defaults?.appearance||rG;this._appearanceSignal.set(i)}_appearanceSignal=jA(rG);get subscriptSizing(){return this._subscriptSizing||this._defaults?.subscriptSizing||sG}set subscriptSizing(A){this._subscriptSizing=A||this._defaults?.subscriptSizing||sG}_subscriptSizing=null;get hintLabel(){return this._hintLabel}set hintLabel(A){this._hintLabel=A,this._processHints()}_hintLabel=\"\";_hasIconPrefix=!1;_hasTextPrefix=!1;_hasIconSuffix=!1;_hasTextSuffix=!1;_labelId=this._idGenerator.getId(\"mat-mdc-form-field-label-\");_hintLabelId=this._idGenerator.getId(\"mat-mdc-hint-\");_describedByIds;get _control(){return this._explicitFormFieldControl||this._formFieldControl}set _control(A){this._explicitFormFieldControl=A}_destroyed=new $A;_isFocused=null;_explicitFormFieldControl;_previousControl=null;_previousControlValidatorFn=null;_stateChanges;_valueChanges;_describedByChanges;_outlineLabelOffsetResizeObserver=null;_animationsDisabled=Oi();constructor(){let A=this._defaults,i=h(wo);A&&(A.appearance&&(this.appearance=A.appearance),this._hideRequiredMarker=!!A?.hideRequiredMarker,A.color&&(this.color=A.color)),pa(()=>this._currentDirection=i.valueSignal()),this._syncOutlineLabelOffset()}ngAfterViewInit(){this._updateFocusState(),this._animationsDisabled||this._ngZone.runOutsideAngular(()=>{setTimeout(()=>{this._elementRef.nativeElement.classList.add(\"mat-form-field-animations-enabled\")},300)}),this._changeDetectorRef.detectChanges()}ngAfterContentInit(){this._assertFormFieldControl(),this._initializeSubscript(),this._initializePrefixAndSuffix()}ngAfterContentChecked(){this._assertFormFieldControl(),this._control!==this._previousControl&&(this._initializeControl(this._previousControl),this._control.ngControl&&this._control.ngControl.control&&(this._previousControlValidatorFn=this._control.ngControl.control.validator),this._previousControl=this._control),this._control.ngControl&&this._control.ngControl.control&&this._control.ngControl.control.validator!==this._previousControlValidatorFn&&this._changeDetectorRef.markForCheck()}ngOnDestroy(){this._outlineLabelOffsetResizeObserver?.disconnect(),this._stateChanges?.unsubscribe(),this._valueChanges?.unsubscribe(),this._describedByChanges?.unsubscribe(),this._destroyed.next(),this._destroyed.complete()}getLabelId=_e(()=>this._hasFloatingLabel()?this._labelId:null);getConnectedOverlayOrigin(){return this._textField||this._elementRef}_animateAndLockLabel(){this._hasFloatingLabel()&&(this.floatLabel=\"always\")}_initializeControl(A){let i=this._control,n=\"mat-mdc-form-field-type-\";A&&this._elementRef.nativeElement.classList.remove(n+A.controlType),i.controlType&&this._elementRef.nativeElement.classList.add(n+i.controlType),this._stateChanges?.unsubscribe(),this._stateChanges=i.stateChanges.subscribe(()=>{this._updateFocusState(),this._changeDetectorRef.markForCheck()}),this._describedByChanges?.unsubscribe(),this._describedByChanges=i.stateChanges.pipe(nn([void 0,void 0]),fe(()=>[i.errorState,i.userAriaDescribedBy]),kC(),We(([[o,a],[r,s]])=>o!==r||a!==s)).subscribe(()=>this._syncDescribedByIds()),this._valueChanges?.unsubscribe(),i.ngControl&&i.ngControl.valueChanges&&(this._valueChanges=i.ngControl.valueChanges.pipe(Bt(this._destroyed)).subscribe(()=>this._changeDetectorRef.markForCheck()))}_checkPrefixAndSuffixTypes(){this._hasIconPrefix=!!this._prefixChildren.find(A=>!A._isText),this._hasTextPrefix=!!this._prefixChildren.find(A=>A._isText),this._hasIconSuffix=!!this._suffixChildren.find(A=>!A._isText),this._hasTextSuffix=!!this._suffixChildren.find(A=>A._isText)}_initializePrefixAndSuffix(){this._checkPrefixAndSuffixTypes(),Qi(this._prefixChildren.changes,this._suffixChildren.changes).subscribe(()=>{this._checkPrefixAndSuffixTypes(),this._changeDetectorRef.markForCheck()})}_initializeSubscript(){this._hintChildren.changes.subscribe(()=>{this._processHints(),this._changeDetectorRef.markForCheck()}),this._errorChildren.changes.subscribe(()=>{this._syncDescribedByIds(),this._changeDetectorRef.markForCheck()}),this._validateHints(),this._syncDescribedByIds()}_assertFormFieldControl(){this._control}_updateFocusState(){let A=this._control.focused;A&&!this._isFocused?(this._isFocused=!0,this._lineRipple?.activate()):!A&&(this._isFocused||this._isFocused===null)&&(this._isFocused=!1,this._lineRipple?.deactivate()),this._elementRef.nativeElement.classList.toggle(\"mat-focused\",A),this._textField?.nativeElement.classList.toggle(\"mdc-text-field--focused\",A)}_syncOutlineLabelOffset(){yL({earlyRead:()=>{if(this._appearanceSignal()!==\"outline\")return this._outlineLabelOffsetResizeObserver?.disconnect(),null;if(globalThis.ResizeObserver){this._outlineLabelOffsetResizeObserver||=new globalThis.ResizeObserver(()=>{this._writeOutlinedLabelStyles(this._getOutlinedLabelOffset())});for(let A of this._prefixSuffixContainers())this._outlineLabelOffsetResizeObserver.observe(A,{box:\"border-box\"})}return this._getOutlinedLabelOffset()},write:A=>this._writeOutlinedLabelStyles(A())})}_shouldAlwaysFloat(){return this.floatLabel===\"always\"}_hasOutline(){return this.appearance===\"outline\"}_forceDisplayInfixLabel(){return!this._platform.isBrowser&&this._prefixChildren.length&&!this._shouldLabelFloat()}_hasFloatingLabel=_e(()=>!!this._labelChild());_shouldLabelFloat(){return this._hasFloatingLabel()?this._control.shouldLabelFloat||this._shouldAlwaysFloat():!1}_shouldForward(A){let i=this._control?this._control.ngControl:null;return i&&i[A]}_getSubscriptMessageType(){return this._errorChildren&&this._errorChildren.length>0&&this._control.errorState?\"error\":\"hint\"}_handleLabelResized(){this._refreshOutlineNotchWidth()}_refreshOutlineNotchWidth(){!this._hasOutline()||!this._floatingLabel||!this._shouldLabelFloat()?this._notchedOutline?._setNotchWidth(0):this._notchedOutline?._setNotchWidth(this._floatingLabel.getWidth())}_processHints(){this._validateHints(),this._syncDescribedByIds()}_validateHints(){this._hintChildren}_syncDescribedByIds(){if(this._control){let A=[];if(this._control.userAriaDescribedBy&&typeof this._control.userAriaDescribedBy==\"string\"&&A.push(...this._control.userAriaDescribedBy.split(\" \")),this._getSubscriptMessageType()===\"hint\"){let o=this._hintChildren?this._hintChildren.find(r=>r.align===\"start\"):null,a=this._hintChildren?this._hintChildren.find(r=>r.align===\"end\"):null;o?A.push(o.id):this._hintLabel&&A.push(this._hintLabelId),a&&A.push(a.id)}else this._errorChildren&&A.push(...this._errorChildren.map(o=>o.id));let i=this._control.describedByIds,n;if(i){let o=this._describedByIds||A;n=A.concat(i.filter(a=>a&&!o.includes(a)))}else n=A;this._control.setDescribedByIds(n),this._describedByIds=A}}_getOutlinedLabelOffset(){if(!this._hasOutline()||!this._floatingLabel)return null;if(!this._iconPrefixContainer&&!this._textPrefixContainer)return[\"\",null];if(!this._isAttachedToDom())return null;let A=this._iconPrefixContainer?.nativeElement,i=this._textPrefixContainer?.nativeElement,n=this._iconSuffixContainer?.nativeElement,o=this._textSuffixContainer?.nativeElement,a=A?.getBoundingClientRect().width??0,r=i?.getBoundingClientRect().width??0,s=n?.getBoundingClientRect().width??0,g=o?.getBoundingClientRect().width??0,l=this._currentDirection===\"rtl\"?\"-1\":\"1\",C=`${a+r}px`,d=`calc(${l} * (${C} + var(--mat-mdc-form-field-label-offset-x, 0px)))`,B=`var(--mat-mdc-form-field-label-transform, ${daA} translateX(${d}))`,Q=a+r+s+g;return[B,Q]}_writeOutlinedLabelStyles(A){if(A!==null){let[i,n]=A;this._floatingLabel&&(this._floatingLabel.element.style.transform=i),n!==null&&this._notchedOutline?._setMaxWidth(n)}}_isAttachedToDom(){let A=this._elementRef.nativeElement;if(A.getRootNode){let i=A.getRootNode();return i&&i!==A}return document.documentElement.contains(A)}static \\u0275fac=function(i){return new(i||t)};static \\u0275cmp=kA({type:t,selectors:[[\"mat-form-field\"]],contentQueries:function(i,n,o){if(i&1&&(wf(o,n._labelChild,pl,5),na(o,fh,5)(o,lG,5)(o,cG,5)(o,gG,5)(o,_I,5)),i&2){rr();let a;Ce(a=Ie())&&(n._formFieldControl=a.first),Ce(a=Ie())&&(n._prefixChildren=a),Ce(a=Ie())&&(n._suffixChildren=a),Ce(a=Ie())&&(n._errorChildren=a),Ce(a=Ie())&&(n._hintChildren=a)}},viewQuery:function(i,n){if(i&1&&(Or(n._iconPrefixContainerSignal,$_,5)(n._textPrefixContainerSignal,AG,5)(n._iconSuffixContainerSignal,eG,5)(n._textSuffixContainerSignal,tG,5),ni(zoA,5)($_,5)(AG,5)(eG,5)(tG,5)(iG,5)(aG,5)(oG,5)),i&2){rr(4);let o;Ce(o=Ie())&&(n._textField=o.first),Ce(o=Ie())&&(n._iconPrefixContainer=o.first),Ce(o=Ie())&&(n._textPrefixContainer=o.first),Ce(o=Ie())&&(n._iconSuffixContainer=o.first),Ce(o=Ie())&&(n._textSuffixContainer=o.first),Ce(o=Ie())&&(n._floatingLabel=o.first),Ce(o=Ie())&&(n._notchedOutline=o.first),Ce(o=Ie())&&(n._lineRipple=o.first)}},hostAttrs:[1,\"mat-mdc-form-field\"],hostVars:38,hostBindings:function(i,n){i&2&&ae(\"mat-mdc-form-field-label-always-float\",n._shouldAlwaysFloat())(\"mat-mdc-form-field-has-icon-prefix\",n._hasIconPrefix)(\"mat-mdc-form-field-has-icon-suffix\",n._hasIconSuffix)(\"mat-form-field-invalid\",n._control.errorState)(\"mat-form-field-disabled\",n._control.disabled)(\"mat-form-field-autofilled\",n._control.autofilled)(\"mat-form-field-appearance-fill\",n.appearance==\"fill\")(\"mat-form-field-appearance-outline\",n.appearance==\"outline\")(\"mat-form-field-hide-placeholder\",n._hasFloatingLabel()&&!n._shouldLabelFloat())(\"mat-primary\",n.color!==\"accent\"&&n.color!==\"warn\")(\"mat-accent\",n.color===\"accent\")(\"mat-warn\",n.color===\"warn\")(\"ng-untouched\",n._shouldForward(\"untouched\"))(\"ng-touched\",n._shouldForward(\"touched\"))(\"ng-pristine\",n._shouldForward(\"pristine\"))(\"ng-dirty\",n._shouldForward(\"dirty\"))(\"ng-valid\",n._shouldForward(\"valid\"))(\"ng-invalid\",n._shouldForward(\"invalid\"))(\"ng-pending\",n._shouldForward(\"pending\"))},inputs:{hideRequiredMarker:\"hideRequiredMarker\",color:\"color\",floatLabel:\"floatLabel\",appearance:\"appearance\",subscriptSizing:\"subscriptSizing\",hintLabel:\"hintLabel\"},exportAs:[\"matFormField\"],features:[It([{provide:mh,useExisting:t},{provide:CG,useExisting:t}])],ngContentSelectors:joA,decls:18,vars:21,consts:[[\"labelTemplate\",\"\"],[\"textField\",\"\"],[\"iconPrefixContainer\",\"\"],[\"textPrefixContainer\",\"\"],[\"textSuffixContainer\",\"\"],[\"iconSuffixContainer\",\"\"],[1,\"mat-mdc-text-field-wrapper\",\"mdc-text-field\",3,\"click\"],[1,\"mat-mdc-form-field-focus-overlay\"],[1,\"mat-mdc-form-field-flex\"],[\"matFormFieldNotchedOutline\",\"\",3,\"matFormFieldNotchedOutlineOpen\"],[1,\"mat-mdc-form-field-icon-prefix\"],[1,\"mat-mdc-form-field-text-prefix\"],[1,\"mat-mdc-form-field-infix\"],[3,\"ngTemplateOutlet\"],[1,\"mat-mdc-form-field-text-suffix\"],[1,\"mat-mdc-form-field-icon-suffix\"],[\"matFormFieldLineRipple\",\"\"],[\"aria-atomic\",\"true\",\"aria-live\",\"polite\",1,\"mat-mdc-form-field-subscript-wrapper\",\"mat-mdc-form-field-bottom-align\"],[1,\"mat-mdc-form-field-error-wrapper\"],[1,\"mat-mdc-form-field-hint-wrapper\"],[\"matFormFieldFloatingLabel\",\"\",3,\"floating\",\"monitorResize\",\"id\"],[\"aria-hidden\",\"true\",1,\"mat-mdc-form-field-required-marker\",\"mdc-floating-label--required\"],[3,\"id\"],[1,\"mat-mdc-form-field-hint-spacer\"]],template:function(i,n){if(i&1&&(Yt(PoA),yt(0,WoA,1,1,\"ng-template\",null,0,NC),m(2,\"div\",6,1),$(\"click\",function(a){return n._control.onContainerClick(a)}),V(4,ZoA,1,0,\"div\",7),m(5,\"div\",8),V(6,AaA,2,2,\"div\",9),V(7,eaA,3,0,\"div\",10),V(8,taA,3,0,\"div\",11),m(9,\"div\",12),V(10,naA,1,1,null,13),He(11),D(),V(12,oaA,3,0,\"div\",14),V(13,aaA,3,0,\"div\",15),D(),V(14,raA,1,0,\"div\",16),D(),m(15,\"div\",17),V(16,saA,2,0,\"div\",18)(17,laA,5,1,\"div\",19),D()),i&2){let o;p(2),ae(\"mdc-text-field--filled\",!n._hasOutline())(\"mdc-text-field--outlined\",n._hasOutline())(\"mdc-text-field--no-label\",!n._hasFloatingLabel())(\"mdc-text-field--disabled\",n._control.disabled)(\"mdc-text-field--invalid\",n._control.errorState),p(2),W(!n._hasOutline()&&!n._control.disabled?4:-1),p(2),W(n._hasOutline()?6:-1),p(),W(n._hasIconPrefix?7:-1),p(),W(n._hasTextPrefix?8:-1),p(2),W(!n._hasOutline()||n._forceDisplayInfixLabel()?10:-1),p(2),W(n._hasTextSuffix?12:-1),p(),W(n._hasIconSuffix?13:-1),p(),W(n._hasOutline()?-1:14),p(),ae(\"mat-mdc-form-field-subscript-dynamic-size\",n.subscriptSizing===\"dynamic\");let a=n._getSubscriptMessageType();p(),W((o=a)===\"error\"?16:o===\"hint\"?17:-1)}},dependencies:[iG,aG,Ng,oG,_I],styles:[`.mdc-text-field{display:inline-flex;align-items:baseline;padding:0 16px;position:relative;box-sizing:border-box;overflow:hidden;will-change:opacity,transform,color;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.mdc-text-field__input{width:100%;min-width:0;border:none;border-radius:0;background:none;padding:0;-moz-appearance:none;-webkit-appearance:none;height:28px}.mdc-text-field__input::-webkit-calendar-picker-indicator,.mdc-text-field__input::-webkit-search-cancel-button{display:none}.mdc-text-field__input::-ms-clear{display:none}.mdc-text-field__input:focus{outline:none}.mdc-text-field__input:invalid{box-shadow:none}.mdc-text-field__input::placeholder{opacity:0}.mdc-text-field__input::-moz-placeholder{opacity:0}.mdc-text-field__input::-webkit-input-placeholder{opacity:0}.mdc-text-field__input:-ms-input-placeholder{opacity:0}.mdc-text-field--no-label .mdc-text-field__input::placeholder,.mdc-text-field--focused .mdc-text-field__input::placeholder{opacity:1}.mdc-text-field--no-label .mdc-text-field__input::-moz-placeholder,.mdc-text-field--focused .mdc-text-field__input::-moz-placeholder{opacity:1}.mdc-text-field--no-label .mdc-text-field__input::-webkit-input-placeholder,.mdc-text-field--focused .mdc-text-field__input::-webkit-input-placeholder{opacity:1}.mdc-text-field--no-label .mdc-text-field__input:-ms-input-placeholder,.mdc-text-field--focused .mdc-text-field__input:-ms-input-placeholder{opacity:1}.mdc-text-field--disabled:not(.mdc-text-field--no-label) .mdc-text-field__input.mat-mdc-input-disabled-interactive::placeholder{opacity:0}.mdc-text-field--disabled:not(.mdc-text-field--no-label) .mdc-text-field__input.mat-mdc-input-disabled-interactive::-moz-placeholder{opacity:0}.mdc-text-field--disabled:not(.mdc-text-field--no-label) .mdc-text-field__input.mat-mdc-input-disabled-interactive::-webkit-input-placeholder{opacity:0}.mdc-text-field--disabled:not(.mdc-text-field--no-label) .mdc-text-field__input.mat-mdc-input-disabled-interactive:-ms-input-placeholder{opacity:0}.mdc-text-field--outlined .mdc-text-field__input,.mdc-text-field--filled.mdc-text-field--no-label .mdc-text-field__input{height:100%}.mdc-text-field--outlined .mdc-text-field__input{display:flex;border:none !important;background-color:rgba(0,0,0,0)}.mdc-text-field--disabled .mdc-text-field__input{pointer-events:auto}.mdc-text-field--filled:not(.mdc-text-field--disabled) .mdc-text-field__input{color:var(--mat-form-field-filled-input-text-color, var(--mat-sys-on-surface));caret-color:var(--mat-form-field-filled-caret-color, var(--mat-sys-primary))}.mdc-text-field--filled:not(.mdc-text-field--disabled) .mdc-text-field__input::placeholder{color:var(--mat-form-field-filled-input-text-placeholder-color, var(--mat-sys-on-surface-variant))}.mdc-text-field--filled:not(.mdc-text-field--disabled) .mdc-text-field__input::-moz-placeholder{color:var(--mat-form-field-filled-input-text-placeholder-color, var(--mat-sys-on-surface-variant))}.mdc-text-field--filled:not(.mdc-text-field--disabled) .mdc-text-field__input::-webkit-input-placeholder{color:var(--mat-form-field-filled-input-text-placeholder-color, var(--mat-sys-on-surface-variant))}.mdc-text-field--filled:not(.mdc-text-field--disabled) .mdc-text-field__input:-ms-input-placeholder{color:var(--mat-form-field-filled-input-text-placeholder-color, var(--mat-sys-on-surface-variant))}.mdc-text-field--outlined:not(.mdc-text-field--disabled) .mdc-text-field__input{color:var(--mat-form-field-outlined-input-text-color, var(--mat-sys-on-surface));caret-color:var(--mat-form-field-outlined-caret-color, var(--mat-sys-primary))}.mdc-text-field--outlined:not(.mdc-text-field--disabled) .mdc-text-field__input::placeholder{color:var(--mat-form-field-outlined-input-text-placeholder-color, var(--mat-sys-on-surface-variant))}.mdc-text-field--outlined:not(.mdc-text-field--disabled) .mdc-text-field__input::-moz-placeholder{color:var(--mat-form-field-outlined-input-text-placeholder-color, var(--mat-sys-on-surface-variant))}.mdc-text-field--outlined:not(.mdc-text-field--disabled) .mdc-text-field__input::-webkit-input-placeholder{color:var(--mat-form-field-outlined-input-text-placeholder-color, var(--mat-sys-on-surface-variant))}.mdc-text-field--outlined:not(.mdc-text-field--disabled) .mdc-text-field__input:-ms-input-placeholder{color:var(--mat-form-field-outlined-input-text-placeholder-color, var(--mat-sys-on-surface-variant))}.mdc-text-field--filled.mdc-text-field--invalid:not(.mdc-text-field--disabled) .mdc-text-field__input{caret-color:var(--mat-form-field-filled-error-caret-color, var(--mat-sys-error))}.mdc-text-field--outlined.mdc-text-field--invalid:not(.mdc-text-field--disabled) .mdc-text-field__input{caret-color:var(--mat-form-field-outlined-error-caret-color, var(--mat-sys-error))}.mdc-text-field--filled.mdc-text-field--disabled .mdc-text-field__input{color:var(--mat-form-field-filled-disabled-input-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mdc-text-field--outlined.mdc-text-field--disabled .mdc-text-field__input{color:var(--mat-form-field-outlined-disabled-input-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}@media(forced-colors: active){.mdc-text-field--disabled .mdc-text-field__input{background-color:Window}}.mdc-text-field--filled{height:56px;border-bottom-right-radius:0;border-bottom-left-radius:0;border-top-left-radius:var(--mat-form-field-filled-container-shape, var(--mat-sys-corner-extra-small));border-top-right-radius:var(--mat-form-field-filled-container-shape, var(--mat-sys-corner-extra-small))}.mdc-text-field--filled:not(.mdc-text-field--disabled){background-color:var(--mat-form-field-filled-container-color, var(--mat-sys-surface-variant))}.mdc-text-field--filled.mdc-text-field--disabled{background-color:var(--mat-form-field-filled-disabled-container-color, color-mix(in srgb, var(--mat-sys-on-surface) 4%, transparent))}.mdc-text-field--outlined{height:56px;overflow:visible;padding-right:max(16px,var(--mat-form-field-outlined-container-shape, var(--mat-sys-corner-extra-small)));padding-left:max(16px,var(--mat-form-field-outlined-container-shape, var(--mat-sys-corner-extra-small)) + 4px)}[dir=rtl] .mdc-text-field--outlined{padding-right:max(16px,var(--mat-form-field-outlined-container-shape, var(--mat-sys-corner-extra-small)) + 4px);padding-left:max(16px,var(--mat-form-field-outlined-container-shape, var(--mat-sys-corner-extra-small)))}.mdc-floating-label{position:absolute;left:0;transform-origin:left top;line-height:1.15rem;text-align:left;text-overflow:ellipsis;white-space:nowrap;cursor:text;overflow:hidden;will-change:transform}[dir=rtl] .mdc-floating-label{right:0;left:auto;transform-origin:right top;text-align:right}.mdc-text-field .mdc-floating-label{top:50%;transform:translateY(-50%);pointer-events:none}.mdc-notched-outline .mdc-floating-label{display:inline-block;position:relative;max-width:100%}.mdc-text-field--outlined .mdc-floating-label{left:4px;right:auto}[dir=rtl] .mdc-text-field--outlined .mdc-floating-label{left:auto;right:4px}.mdc-text-field--filled .mdc-floating-label{left:16px;right:auto}[dir=rtl] .mdc-text-field--filled .mdc-floating-label{left:auto;right:16px}.mdc-text-field--disabled .mdc-floating-label{cursor:default}@media(forced-colors: active){.mdc-text-field--disabled .mdc-floating-label{z-index:1}}.mdc-text-field--filled.mdc-text-field--no-label .mdc-floating-label{display:none}.mdc-text-field--filled:not(.mdc-text-field--disabled) .mdc-floating-label{color:var(--mat-form-field-filled-label-text-color, var(--mat-sys-on-surface-variant))}.mdc-text-field--filled:not(.mdc-text-field--disabled).mdc-text-field--focused .mdc-floating-label{color:var(--mat-form-field-filled-focus-label-text-color, var(--mat-sys-primary))}.mdc-text-field--filled:not(.mdc-text-field--disabled):not(.mdc-text-field--focused):hover .mdc-floating-label{color:var(--mat-form-field-filled-hover-label-text-color, var(--mat-sys-on-surface-variant))}.mdc-text-field--filled.mdc-text-field--disabled .mdc-floating-label{color:var(--mat-form-field-filled-disabled-label-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mdc-text-field--filled:not(.mdc-text-field--disabled).mdc-text-field--invalid .mdc-floating-label{color:var(--mat-form-field-filled-error-label-text-color, var(--mat-sys-error))}.mdc-text-field--filled:not(.mdc-text-field--disabled).mdc-text-field--invalid.mdc-text-field--focused .mdc-floating-label{color:var(--mat-form-field-filled-error-focus-label-text-color, var(--mat-sys-error))}.mdc-text-field--filled:not(.mdc-text-field--disabled).mdc-text-field--invalid:not(.mdc-text-field--disabled):hover .mdc-floating-label{color:var(--mat-form-field-filled-error-hover-label-text-color, var(--mat-sys-on-error-container))}.mdc-text-field--filled .mdc-floating-label{font-family:var(--mat-form-field-filled-label-text-font, var(--mat-sys-body-large-font));font-size:var(--mat-form-field-filled-label-text-size, var(--mat-sys-body-large-size));font-weight:var(--mat-form-field-filled-label-text-weight, var(--mat-sys-body-large-weight));letter-spacing:var(--mat-form-field-filled-label-text-tracking, var(--mat-sys-body-large-tracking))}.mdc-text-field--outlined:not(.mdc-text-field--disabled) .mdc-floating-label{color:var(--mat-form-field-outlined-label-text-color, var(--mat-sys-on-surface-variant))}.mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--focused .mdc-floating-label{color:var(--mat-form-field-outlined-focus-label-text-color, var(--mat-sys-primary))}.mdc-text-field--outlined:not(.mdc-text-field--disabled):not(.mdc-text-field--focused):hover .mdc-floating-label{color:var(--mat-form-field-outlined-hover-label-text-color, var(--mat-sys-on-surface))}.mdc-text-field--outlined.mdc-text-field--disabled .mdc-floating-label{color:var(--mat-form-field-outlined-disabled-label-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--invalid .mdc-floating-label{color:var(--mat-form-field-outlined-error-label-text-color, var(--mat-sys-error))}.mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--invalid.mdc-text-field--focused .mdc-floating-label{color:var(--mat-form-field-outlined-error-focus-label-text-color, var(--mat-sys-error))}.mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--invalid:not(.mdc-text-field--disabled):hover .mdc-floating-label{color:var(--mat-form-field-outlined-error-hover-label-text-color, var(--mat-sys-on-error-container))}.mdc-text-field--outlined .mdc-floating-label{font-family:var(--mat-form-field-outlined-label-text-font, var(--mat-sys-body-large-font));font-size:var(--mat-form-field-outlined-label-text-size, var(--mat-sys-body-large-size));font-weight:var(--mat-form-field-outlined-label-text-weight, var(--mat-sys-body-large-weight));letter-spacing:var(--mat-form-field-outlined-label-text-tracking, var(--mat-sys-body-large-tracking))}.mdc-floating-label--float-above{cursor:auto;transform:translateY(-106%) scale(0.75)}.mdc-text-field--filled .mdc-floating-label--float-above{transform:translateY(-106%) scale(0.75)}.mdc-text-field--outlined .mdc-floating-label--float-above{transform:translateY(-37.25px) scale(1);font-size:.75rem}.mdc-notched-outline .mdc-floating-label--float-above{text-overflow:clip}.mdc-notched-outline--upgraded .mdc-floating-label--float-above{max-width:133.3333333333%}.mdc-text-field--outlined.mdc-notched-outline--upgraded .mdc-floating-label--float-above,.mdc-text-field--outlined .mdc-notched-outline--upgraded .mdc-floating-label--float-above{transform:translateY(-34.75px) scale(0.75)}.mdc-text-field--outlined.mdc-notched-outline--upgraded .mdc-floating-label--float-above,.mdc-text-field--outlined .mdc-notched-outline--upgraded .mdc-floating-label--float-above{font-size:1rem}.mdc-floating-label--required:not(.mdc-floating-label--hide-required-marker)::after{margin-left:1px;margin-right:0;content:\"*\"}[dir=rtl] .mdc-floating-label--required:not(.mdc-floating-label--hide-required-marker)::after{margin-left:0;margin-right:1px}.mdc-notched-outline{display:flex;position:absolute;top:0;right:0;left:0;box-sizing:border-box;width:100%;max-width:100%;height:100%;text-align:left;pointer-events:none}[dir=rtl] .mdc-notched-outline{text-align:right}.mdc-text-field--outlined .mdc-notched-outline{z-index:1}.mat-mdc-notch-piece{box-sizing:border-box;height:100%;pointer-events:none;border:none;border-top:1px solid;border-bottom:1px solid}.mdc-text-field--focused .mat-mdc-notch-piece{border-width:2px}.mdc-text-field--outlined:not(.mdc-text-field--disabled) .mat-mdc-notch-piece{border-color:var(--mat-form-field-outlined-outline-color, var(--mat-sys-outline));border-width:var(--mat-form-field-outlined-outline-width, 1px)}.mdc-text-field--outlined:not(.mdc-text-field--disabled):not(.mdc-text-field--focused):hover .mat-mdc-notch-piece{border-color:var(--mat-form-field-outlined-hover-outline-color, var(--mat-sys-on-surface))}.mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--focused .mat-mdc-notch-piece{border-color:var(--mat-form-field-outlined-focus-outline-color, var(--mat-sys-primary))}.mdc-text-field--outlined.mdc-text-field--disabled .mat-mdc-notch-piece{border-color:var(--mat-form-field-outlined-disabled-outline-color, color-mix(in srgb, var(--mat-sys-on-surface) 12%, transparent))}.mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--invalid .mat-mdc-notch-piece{border-color:var(--mat-form-field-outlined-error-outline-color, var(--mat-sys-error))}.mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--invalid:not(.mdc-text-field--focused):hover .mdc-notched-outline .mat-mdc-notch-piece{border-color:var(--mat-form-field-outlined-error-hover-outline-color, var(--mat-sys-on-error-container))}.mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--invalid.mdc-text-field--focused .mat-mdc-notch-piece{border-color:var(--mat-form-field-outlined-error-focus-outline-color, var(--mat-sys-error))}.mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--focused .mdc-notched-outline .mat-mdc-notch-piece{border-width:var(--mat-form-field-outlined-focus-outline-width, 2px)}.mdc-notched-outline__leading{border-left:1px solid;border-right:none;border-top-right-radius:0;border-bottom-right-radius:0;border-top-left-radius:var(--mat-form-field-outlined-container-shape, var(--mat-sys-corner-extra-small));border-bottom-left-radius:var(--mat-form-field-outlined-container-shape, var(--mat-sys-corner-extra-small))}.mdc-text-field--outlined .mdc-notched-outline .mdc-notched-outline__leading{width:max(12px,var(--mat-form-field-outlined-container-shape, var(--mat-sys-corner-extra-small)))}[dir=rtl] .mdc-notched-outline__leading{border-left:none;border-right:1px solid;border-bottom-left-radius:0;border-top-left-radius:0;border-top-right-radius:var(--mat-form-field-outlined-container-shape, var(--mat-sys-corner-extra-small));border-bottom-right-radius:var(--mat-form-field-outlined-container-shape, var(--mat-sys-corner-extra-small))}.mdc-notched-outline__trailing{flex-grow:1;border-left:none;border-right:1px solid;border-top-left-radius:0;border-bottom-left-radius:0;border-top-right-radius:var(--mat-form-field-outlined-container-shape, var(--mat-sys-corner-extra-small));border-bottom-right-radius:var(--mat-form-field-outlined-container-shape, var(--mat-sys-corner-extra-small))}[dir=rtl] .mdc-notched-outline__trailing{border-left:1px solid;border-right:none;border-top-right-radius:0;border-bottom-right-radius:0;border-top-left-radius:var(--mat-form-field-outlined-container-shape, var(--mat-sys-corner-extra-small));border-bottom-left-radius:var(--mat-form-field-outlined-container-shape, var(--mat-sys-corner-extra-small))}.mdc-notched-outline__notch{flex:0 0 auto;width:auto}.mdc-text-field--outlined .mdc-notched-outline .mdc-notched-outline__notch{max-width:min(var(--mat-form-field-notch-max-width, 100%),calc(100% - max(12px, var(--mat-form-field-outlined-container-shape, var(--mat-sys-corner-extra-small))) * 2))}.mdc-text-field--outlined .mdc-notched-outline--notched .mdc-notched-outline__notch{max-width:min(100%,calc(100% - max(12px, var(--mat-form-field-outlined-container-shape, var(--mat-sys-corner-extra-small))) * 2))}.mdc-text-field--outlined .mdc-notched-outline--notched .mdc-notched-outline__notch{padding-top:1px}.mdc-text-field--focused.mdc-text-field--outlined .mdc-notched-outline--notched .mdc-notched-outline__notch{padding-top:2px}.mdc-notched-outline--notched .mdc-notched-outline__notch{padding-left:0;padding-right:8px;border-top:none}[dir=rtl] .mdc-notched-outline--notched .mdc-notched-outline__notch{padding-left:8px;padding-right:0}.mdc-notched-outline--no-label .mdc-notched-outline__notch{display:none}.mdc-line-ripple::before,.mdc-line-ripple::after{position:absolute;bottom:0;left:0;width:100%;border-bottom-style:solid;content:\"\"}.mdc-line-ripple::before{z-index:1;border-bottom-width:var(--mat-form-field-filled-active-indicator-height, 1px)}.mdc-text-field--filled:not(.mdc-text-field--disabled) .mdc-line-ripple::before{border-bottom-color:var(--mat-form-field-filled-active-indicator-color, var(--mat-sys-on-surface-variant))}.mdc-text-field--filled:not(.mdc-text-field--disabled):not(.mdc-text-field--focused):hover .mdc-line-ripple::before{border-bottom-color:var(--mat-form-field-filled-hover-active-indicator-color, var(--mat-sys-on-surface))}.mdc-text-field--filled.mdc-text-field--disabled .mdc-line-ripple::before{border-bottom-color:var(--mat-form-field-filled-disabled-active-indicator-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mdc-text-field--filled:not(.mdc-text-field--disabled).mdc-text-field--invalid .mdc-line-ripple::before{border-bottom-color:var(--mat-form-field-filled-error-active-indicator-color, var(--mat-sys-error))}.mdc-text-field--filled:not(.mdc-text-field--disabled).mdc-text-field--invalid:not(.mdc-text-field--focused):hover .mdc-line-ripple::before{border-bottom-color:var(--mat-form-field-filled-error-hover-active-indicator-color, var(--mat-sys-on-error-container))}.mdc-line-ripple::after{transform:scaleX(0);opacity:0;z-index:2}.mdc-text-field--filled .mdc-line-ripple::after{border-bottom-width:var(--mat-form-field-filled-focus-active-indicator-height, 2px)}.mdc-text-field--filled:not(.mdc-text-field--disabled) .mdc-line-ripple::after{border-bottom-color:var(--mat-form-field-filled-focus-active-indicator-color, var(--mat-sys-primary))}.mdc-text-field--filled.mdc-text-field--invalid:not(.mdc-text-field--disabled) .mdc-line-ripple::after{border-bottom-color:var(--mat-form-field-filled-error-focus-active-indicator-color, var(--mat-sys-error))}.mdc-line-ripple--active::after{transform:scaleX(1);opacity:1}.mdc-line-ripple--deactivating::after{opacity:0}.mdc-text-field--disabled{pointer-events:none}.mat-mdc-form-field-textarea-control{vertical-align:middle;resize:vertical;box-sizing:border-box;height:auto;margin:0;padding:0;border:none;overflow:auto}.mat-mdc-form-field-input-control.mat-mdc-form-field-input-control{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font:inherit;letter-spacing:inherit;text-decoration:inherit;text-transform:inherit;border:none}.mat-mdc-form-field .mat-mdc-floating-label.mdc-floating-label{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;line-height:normal;pointer-events:all;will-change:auto}.mat-mdc-form-field:not(.mat-form-field-disabled) .mat-mdc-floating-label.mdc-floating-label{cursor:inherit}.mdc-text-field--no-label:not(.mdc-text-field--textarea) .mat-mdc-form-field-input-control.mdc-text-field__input,.mat-mdc-text-field-wrapper .mat-mdc-form-field-input-control{height:auto}.mat-mdc-text-field-wrapper .mat-mdc-form-field-input-control.mdc-text-field__input[type=color]{height:23px}.mat-mdc-text-field-wrapper{height:auto;flex:auto;will-change:auto}.mat-mdc-form-field-has-icon-prefix .mat-mdc-text-field-wrapper{padding-left:0;--mat-mdc-form-field-label-offset-x: -16px}.mat-mdc-form-field-has-icon-suffix .mat-mdc-text-field-wrapper{padding-right:0}[dir=rtl] .mat-mdc-text-field-wrapper{padding-left:16px;padding-right:16px}[dir=rtl] .mat-mdc-form-field-has-icon-suffix .mat-mdc-text-field-wrapper{padding-left:0}[dir=rtl] .mat-mdc-form-field-has-icon-prefix .mat-mdc-text-field-wrapper{padding-right:0}.mat-form-field-disabled .mdc-text-field__input::placeholder{color:var(--mat-form-field-disabled-input-text-placeholder-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-form-field-disabled .mdc-text-field__input::-moz-placeholder{color:var(--mat-form-field-disabled-input-text-placeholder-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-form-field-disabled .mdc-text-field__input::-webkit-input-placeholder{color:var(--mat-form-field-disabled-input-text-placeholder-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-form-field-disabled .mdc-text-field__input:-ms-input-placeholder{color:var(--mat-form-field-disabled-input-text-placeholder-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-mdc-form-field-label-always-float .mdc-text-field__input::placeholder{transition-delay:40ms;transition-duration:110ms;opacity:1}.mat-mdc-text-field-wrapper .mat-mdc-form-field-infix .mat-mdc-floating-label{left:auto;right:auto}.mat-mdc-text-field-wrapper.mdc-text-field--outlined .mdc-text-field__input{display:inline-block}.mat-mdc-form-field .mat-mdc-text-field-wrapper.mdc-text-field .mdc-notched-outline__notch{padding-top:0}.mat-mdc-form-field.mat-mdc-form-field.mat-mdc-form-field.mat-mdc-form-field.mat-mdc-form-field.mat-mdc-form-field .mdc-notched-outline__notch{border-left:1px solid rgba(0,0,0,0)}[dir=rtl] .mat-mdc-form-field.mat-mdc-form-field.mat-mdc-form-field.mat-mdc-form-field.mat-mdc-form-field.mat-mdc-form-field .mdc-notched-outline__notch{border-left:none;border-right:1px solid rgba(0,0,0,0)}.mat-mdc-form-field-infix{min-height:var(--mat-form-field-container-height, 56px);padding-top:var(--mat-form-field-filled-with-label-container-padding-top, 24px);padding-bottom:var(--mat-form-field-filled-with-label-container-padding-bottom, 8px)}.mdc-text-field--outlined .mat-mdc-form-field-infix,.mdc-text-field--no-label .mat-mdc-form-field-infix{padding-top:var(--mat-form-field-container-vertical-padding, 16px);padding-bottom:var(--mat-form-field-container-vertical-padding, 16px)}.mat-mdc-text-field-wrapper .mat-mdc-form-field-flex .mat-mdc-floating-label{top:calc(var(--mat-form-field-container-height, 56px)/2)}.mdc-text-field--filled .mat-mdc-floating-label{display:var(--mat-form-field-filled-label-display, block)}.mat-mdc-text-field-wrapper.mdc-text-field--outlined .mdc-notched-outline--upgraded .mdc-floating-label--float-above{--mat-mdc-form-field-label-transform: translateY(calc(calc(6.75px + var(--mat-form-field-container-height, 56px) / 2) * -1)) scale(var(--mat-mdc-form-field-floating-label-scale, 0.75));transform:var(--mat-mdc-form-field-label-transform)}@keyframes _mat-form-field-subscript-animation{from{opacity:0;transform:translateY(-5px)}to{opacity:1;transform:translateY(0)}}.mat-mdc-form-field-subscript-wrapper{box-sizing:border-box;width:100%;position:relative}.mat-mdc-form-field-hint-wrapper,.mat-mdc-form-field-error-wrapper{position:absolute;top:0;left:0;right:0;padding:0 16px;opacity:1;transform:translateY(0);animation:_mat-form-field-subscript-animation 0ms cubic-bezier(0.55, 0, 0.55, 0.2)}.mat-mdc-form-field-subscript-dynamic-size .mat-mdc-form-field-hint-wrapper,.mat-mdc-form-field-subscript-dynamic-size .mat-mdc-form-field-error-wrapper{position:static}.mat-mdc-form-field-bottom-align::before{content:\"\";display:inline-block;height:16px}.mat-mdc-form-field-bottom-align.mat-mdc-form-field-subscript-dynamic-size::before{content:unset}.mat-mdc-form-field-hint-end{order:1}.mat-mdc-form-field-hint-wrapper{display:flex}.mat-mdc-form-field-hint-spacer{flex:1 0 1em}.mat-mdc-form-field-error{display:block;color:var(--mat-form-field-error-text-color, var(--mat-sys-error))}.mat-mdc-form-field-subscript-wrapper,.mat-mdc-form-field-bottom-align::before{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:var(--mat-form-field-subscript-text-font, var(--mat-sys-body-small-font));line-height:var(--mat-form-field-subscript-text-line-height, var(--mat-sys-body-small-line-height));font-size:var(--mat-form-field-subscript-text-size, var(--mat-sys-body-small-size));letter-spacing:var(--mat-form-field-subscript-text-tracking, var(--mat-sys-body-small-tracking));font-weight:var(--mat-form-field-subscript-text-weight, var(--mat-sys-body-small-weight))}.mat-mdc-form-field-focus-overlay{top:0;left:0;right:0;bottom:0;position:absolute;opacity:0;pointer-events:none;background-color:var(--mat-form-field-state-layer-color, var(--mat-sys-on-surface))}.mat-mdc-text-field-wrapper:hover .mat-mdc-form-field-focus-overlay{opacity:var(--mat-form-field-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-form-field.mat-focused .mat-mdc-form-field-focus-overlay{opacity:var(--mat-form-field-focus-state-layer-opacity, 0)}select.mat-mdc-form-field-input-control{-moz-appearance:none;-webkit-appearance:none;background-color:rgba(0,0,0,0);display:inline-flex;box-sizing:border-box}select.mat-mdc-form-field-input-control:not(:disabled){cursor:pointer}select.mat-mdc-form-field-input-control:not(.mat-mdc-native-select-inline) option{color:var(--mat-form-field-select-option-text-color, var(--mat-sys-neutral10))}select.mat-mdc-form-field-input-control:not(.mat-mdc-native-select-inline) option:disabled{color:var(--mat-form-field-select-disabled-option-text-color, color-mix(in srgb, var(--mat-sys-neutral10) 38%, transparent))}.mat-mdc-form-field-type-mat-native-select .mat-mdc-form-field-infix::after{content:\"\";width:0;height:0;border-left:5px solid rgba(0,0,0,0);border-right:5px solid rgba(0,0,0,0);border-top:5px solid;position:absolute;right:0;top:50%;margin-top:-2.5px;pointer-events:none;color:var(--mat-form-field-enabled-select-arrow-color, var(--mat-sys-on-surface-variant))}[dir=rtl] .mat-mdc-form-field-type-mat-native-select .mat-mdc-form-field-infix::after{right:auto;left:0}.mat-mdc-form-field-type-mat-native-select.mat-focused .mat-mdc-form-field-infix::after{color:var(--mat-form-field-focus-select-arrow-color, var(--mat-sys-primary))}.mat-mdc-form-field-type-mat-native-select.mat-form-field-disabled .mat-mdc-form-field-infix::after{color:var(--mat-form-field-disabled-select-arrow-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-mdc-form-field-type-mat-native-select .mat-mdc-form-field-input-control{padding-right:15px}[dir=rtl] .mat-mdc-form-field-type-mat-native-select .mat-mdc-form-field-input-control{padding-right:0;padding-left:15px}@media(forced-colors: active){.mat-form-field-appearance-fill .mat-mdc-text-field-wrapper{outline:solid 1px}}@media(forced-colors: active){.mat-form-field-appearance-fill.mat-form-field-disabled .mat-mdc-text-field-wrapper{outline-color:GrayText}}@media(forced-colors: active){.mat-form-field-appearance-fill.mat-focused .mat-mdc-text-field-wrapper{outline:dashed 3px}}@media(forced-colors: active){.mat-mdc-form-field.mat-focused .mdc-notched-outline{border:dashed 3px}}.mat-mdc-form-field-input-control[type=date],.mat-mdc-form-field-input-control[type=datetime],.mat-mdc-form-field-input-control[type=datetime-local],.mat-mdc-form-field-input-control[type=month],.mat-mdc-form-field-input-control[type=week],.mat-mdc-form-field-input-control[type=time]{line-height:1}.mat-mdc-form-field-input-control::-webkit-datetime-edit{line-height:1;padding:0;margin-bottom:-2px}.mat-mdc-form-field{--mat-mdc-form-field-floating-label-scale: 0.75;display:inline-flex;flex-direction:column;min-width:0;text-align:left;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:var(--mat-form-field-container-text-font, var(--mat-sys-body-large-font));line-height:var(--mat-form-field-container-text-line-height, var(--mat-sys-body-large-line-height));font-size:var(--mat-form-field-container-text-size, var(--mat-sys-body-large-size));letter-spacing:var(--mat-form-field-container-text-tracking, var(--mat-sys-body-large-tracking));font-weight:var(--mat-form-field-container-text-weight, var(--mat-sys-body-large-weight))}.mat-mdc-form-field .mdc-text-field--outlined .mdc-floating-label--float-above{font-size:calc(var(--mat-form-field-outlined-label-text-populated-size)*var(--mat-mdc-form-field-floating-label-scale))}.mat-mdc-form-field .mdc-text-field--outlined .mdc-notched-outline--upgraded .mdc-floating-label--float-above{font-size:var(--mat-form-field-outlined-label-text-populated-size)}[dir=rtl] .mat-mdc-form-field{text-align:right}.mat-mdc-form-field-flex{display:inline-flex;align-items:baseline;box-sizing:border-box;width:100%}.mat-mdc-text-field-wrapper{width:100%;z-index:0}.mat-mdc-form-field-icon-prefix,.mat-mdc-form-field-icon-suffix{align-self:center;line-height:0;pointer-events:auto;position:relative;z-index:1}.mat-mdc-form-field-icon-prefix>.mat-icon,.mat-mdc-form-field-icon-suffix>.mat-icon{padding:0 12px;box-sizing:content-box}.mat-mdc-form-field-icon-prefix{color:var(--mat-form-field-leading-icon-color, var(--mat-sys-on-surface-variant))}.mat-form-field-disabled .mat-mdc-form-field-icon-prefix{color:var(--mat-form-field-disabled-leading-icon-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-mdc-form-field-icon-suffix{color:var(--mat-form-field-trailing-icon-color, var(--mat-sys-on-surface-variant))}.mat-form-field-disabled .mat-mdc-form-field-icon-suffix{color:var(--mat-form-field-disabled-trailing-icon-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-form-field-invalid .mat-mdc-form-field-icon-suffix{color:var(--mat-form-field-error-trailing-icon-color, var(--mat-sys-error))}.mat-form-field-invalid:not(.mat-focused):not(.mat-form-field-disabled) .mat-mdc-text-field-wrapper:hover .mat-mdc-form-field-icon-suffix{color:var(--mat-form-field-error-hover-trailing-icon-color, var(--mat-sys-on-error-container))}.mat-form-field-invalid.mat-focused .mat-mdc-text-field-wrapper .mat-mdc-form-field-icon-suffix{color:var(--mat-form-field-error-focus-trailing-icon-color, var(--mat-sys-error))}.mat-mdc-form-field-icon-prefix,[dir=rtl] .mat-mdc-form-field-icon-suffix{padding:0 4px 0 0}.mat-mdc-form-field-icon-suffix,[dir=rtl] .mat-mdc-form-field-icon-prefix{padding:0 0 0 4px}.mat-mdc-form-field-subscript-wrapper .mat-icon,.mat-mdc-form-field label .mat-icon{width:1em;height:1em;font-size:inherit}.mat-mdc-form-field-infix{flex:auto;min-width:0;width:180px;position:relative;box-sizing:border-box}.mat-mdc-form-field-infix:has(textarea[cols]){width:auto}.mat-mdc-form-field .mdc-notched-outline__notch{margin-left:-1px;-webkit-clip-path:inset(-9em -999em -9em 1px);clip-path:inset(-9em -999em -9em 1px)}[dir=rtl] .mat-mdc-form-field .mdc-notched-outline__notch{margin-left:0;margin-right:-1px;-webkit-clip-path:inset(-9em 1px -9em -999em);clip-path:inset(-9em 1px -9em -999em)}.mat-mdc-form-field.mat-form-field-animations-enabled .mdc-floating-label{transition:transform 150ms cubic-bezier(0.4, 0, 0.2, 1),color 150ms cubic-bezier(0.4, 0, 0.2, 1)}.mat-mdc-form-field.mat-form-field-animations-enabled .mdc-text-field__input{transition:opacity 150ms cubic-bezier(0.4, 0, 0.2, 1)}.mat-mdc-form-field.mat-form-field-animations-enabled .mdc-text-field__input::placeholder{transition:opacity 67ms cubic-bezier(0.4, 0, 0.2, 1)}.mat-mdc-form-field.mat-form-field-animations-enabled .mdc-text-field__input::-moz-placeholder{transition:opacity 67ms cubic-bezier(0.4, 0, 0.2, 1)}.mat-mdc-form-field.mat-form-field-animations-enabled .mdc-text-field__input::-webkit-input-placeholder{transition:opacity 67ms cubic-bezier(0.4, 0, 0.2, 1)}.mat-mdc-form-field.mat-form-field-animations-enabled .mdc-text-field__input:-ms-input-placeholder{transition:opacity 67ms cubic-bezier(0.4, 0, 0.2, 1)}.mat-mdc-form-field.mat-form-field-animations-enabled.mdc-text-field--no-label .mdc-text-field__input::placeholder,.mat-mdc-form-field.mat-form-field-animations-enabled.mdc-text-field--focused .mdc-text-field__input::placeholder{transition-delay:40ms;transition-duration:110ms}.mat-mdc-form-field.mat-form-field-animations-enabled.mdc-text-field--no-label .mdc-text-field__input::-moz-placeholder,.mat-mdc-form-field.mat-form-field-animations-enabled.mdc-text-field--focused .mdc-text-field__input::-moz-placeholder{transition-delay:40ms;transition-duration:110ms}.mat-mdc-form-field.mat-form-field-animations-enabled.mdc-text-field--no-label .mdc-text-field__input::-webkit-input-placeholder,.mat-mdc-form-field.mat-form-field-animations-enabled.mdc-text-field--focused .mdc-text-field__input::-webkit-input-placeholder{transition-delay:40ms;transition-duration:110ms}.mat-mdc-form-field.mat-form-field-animations-enabled.mdc-text-field--no-label .mdc-text-field__input:-ms-input-placeholder,.mat-mdc-form-field.mat-form-field-animations-enabled.mdc-text-field--focused .mdc-text-field__input:-ms-input-placeholder{transition-delay:40ms;transition-duration:110ms}.mat-mdc-form-field.mat-form-field-animations-enabled .mdc-text-field--filled:not(.mdc-ripple-upgraded):focus .mdc-text-field__ripple::before{transition-duration:75ms}.mat-mdc-form-field.mat-form-field-animations-enabled .mdc-line-ripple::after{transition:transform 180ms cubic-bezier(0.4, 0, 0.2, 1),opacity 180ms cubic-bezier(0.4, 0, 0.2, 1)}.mat-mdc-form-field.mat-form-field-animations-enabled .mat-mdc-form-field-hint-wrapper,.mat-mdc-form-field.mat-form-field-animations-enabled .mat-mdc-form-field-error-wrapper{animation-duration:300ms}.mdc-notched-outline .mdc-floating-label{max-width:calc(100% + 1px)}.mdc-notched-outline--upgraded .mdc-floating-label--float-above{max-width:calc(133.3333333333% + 1px)}\n`],encapsulation:2,changeDetection:0})}return t})();var vr=(()=>{class t{static \\u0275fac=function(i){return new(i||t)};static \\u0275mod=Xe({type:t});static \\u0275inj=Ze({imports:[Of,To,Fi]})}return t})();var IG=(()=>{class t{static \\u0275fac=function(i){return new(i||t)};static \\u0275cmp=kA({type:t,selectors:[[\"ng-component\"]],hostAttrs:[\"cdk-text-field-style-loader\",\"\"],decls:0,vars:0,template:function(i,n){},styles:[`textarea.cdk-textarea-autosize{resize:none}textarea.cdk-textarea-autosize-measuring{padding:2px 0 !important;box-sizing:content-box !important;height:auto !important;overflow:hidden !important}textarea.cdk-textarea-autosize-measuring-firefox{padding:2px 0 !important;box-sizing:content-box !important;height:0 !important}@keyframes cdk-text-field-autofill-start{/*!*/}@keyframes cdk-text-field-autofill-end{/*!*/}.cdk-text-field-autofill-monitored:-webkit-autofill{animation:cdk-text-field-autofill-start 0s 1ms}.cdk-text-field-autofill-monitored:not(:-webkit-autofill){animation:cdk-text-field-autofill-end 0s 1ms}\n`],encapsulation:2,changeDetection:0})}return t})(),BaA={passive:!0},dG=(()=>{class t{_platform=h(ci);_ngZone=h(Oe);_renderer=h(Dr).createRenderer(null,null);_styleLoader=h(Hn);_monitoredElements=new Map;constructor(){}monitor(A){if(!this._platform.isBrowser)return xa;this._styleLoader.load(IG);let i=ls(A),n=this._monitoredElements.get(i);if(n)return n.subject;let o=new $A,a=\"cdk-text-field-autofilled\",r=g=>{g.animationName===\"cdk-text-field-autofill-start\"&&!i.classList.contains(a)?(i.classList.add(a),this._ngZone.run(()=>o.next({target:g.target,isAutofilled:!0}))):g.animationName===\"cdk-text-field-autofill-end\"&&i.classList.contains(a)&&(i.classList.remove(a),this._ngZone.run(()=>o.next({target:g.target,isAutofilled:!1})))},s=this._ngZone.runOutsideAngular(()=>(i.classList.add(\"cdk-text-field-autofill-monitored\"),this._renderer.listen(i,\"animationstart\",r,BaA)));return this._monitoredElements.set(i,{subject:o,unlisten:s}),o}stopMonitoring(A){let i=ls(A),n=this._monitoredElements.get(i);n&&(n.unlisten(),n.subject.complete(),i.classList.remove(\"cdk-text-field-autofill-monitored\"),i.classList.remove(\"cdk-text-field-autofilled\"),this._monitoredElements.delete(i))}ngOnDestroy(){this._monitoredElements.forEach((A,i)=>this.stopMonitoring(i))}static \\u0275fac=function(i){return new(i||t)};static \\u0275prov=TA({token:t,factory:t.\\u0275fac,providedIn:\"root\"})}return t})();var nm=(()=>{class t{_elementRef=h(ge);_platform=h(ci);_ngZone=h(Oe);_renderer=h(ui);_resizeEvents=new $A;_previousValue;_initialHeight;_destroyed=new $A;_listenerCleanups;_minRows;_maxRows;_enabled=!0;_previousMinRows=-1;_textareaElement;get minRows(){return this._minRows}set minRows(A){this._minRows=Rs(A),this._setMinHeight()}get maxRows(){return this._maxRows}set maxRows(A){this._maxRows=Rs(A),this._setMaxHeight()}get enabled(){return this._enabled}set enabled(A){this._enabled!==A&&((this._enabled=A)?this.resizeToFitContent(!0):this.reset())}get placeholder(){return this._textareaElement.placeholder}set placeholder(A){this._cachedPlaceholderHeight=void 0,A?this._textareaElement.setAttribute(\"placeholder\",A):this._textareaElement.removeAttribute(\"placeholder\"),this._cacheTextareaPlaceholderHeight()}_cachedLineHeight;_cachedPlaceholderHeight;_document=h(Zt);_hasFocus=!1;_isViewInited=!1;constructor(){h(Hn).load(IG),this._textareaElement=this._elementRef.nativeElement}_setMinHeight(){let A=this.minRows&&this._cachedLineHeight?`${this.minRows*this._cachedLineHeight}px`:null;A&&(this._textareaElement.style.minHeight=A)}_setMaxHeight(){let A=this.maxRows&&this._cachedLineHeight?`${this.maxRows*this._cachedLineHeight}px`:null;A&&(this._textareaElement.style.maxHeight=A)}ngAfterViewInit(){this._platform.isBrowser&&(this._initialHeight=this._textareaElement.style.height,this.resizeToFitContent(),this._ngZone.runOutsideAngular(()=>{this._listenerCleanups=[this._renderer.listen(\"window\",\"resize\",()=>this._resizeEvents.next()),this._renderer.listen(this._textareaElement,\"focus\",this._handleFocusEvent),this._renderer.listen(this._textareaElement,\"blur\",this._handleFocusEvent)],this._resizeEvents.pipe(yI(16)).subscribe(()=>{this._cachedLineHeight=this._cachedPlaceholderHeight=void 0,this.resizeToFitContent(!0)})}),this._isViewInited=!0,this.resizeToFitContent(!0))}ngOnDestroy(){this._listenerCleanups?.forEach(A=>A()),this._resizeEvents.complete(),this._destroyed.next(),this._destroyed.complete()}_cacheTextareaLineHeight(){if(this._cachedLineHeight)return;let A=this._textareaElement.cloneNode(!1),i=A.style;A.rows=1,i.position=\"absolute\",i.visibility=\"hidden\",i.border=\"none\",i.padding=\"0\",i.height=\"\",i.minHeight=\"\",i.maxHeight=\"\",i.top=i.bottom=i.left=i.right=\"auto\",i.overflow=\"hidden\",this._textareaElement.parentNode.appendChild(A),this._cachedLineHeight=A.clientHeight,A.remove(),this._setMinHeight(),this._setMaxHeight()}_measureScrollHeight(){let A=this._textareaElement,i=A.style.marginBottom||\"\",n=this._platform.FIREFOX,o=this._hasFocus,a=n?\"cdk-textarea-autosize-measuring-firefox\":\"cdk-textarea-autosize-measuring\";o&&(A.style.marginBottom=`${A.clientHeight}px`),A.classList.add(a);let r=A.scrollHeight-4;return A.classList.remove(a),o&&(A.style.marginBottom=i),r}_cacheTextareaPlaceholderHeight(){if(!this._isViewInited||this._cachedPlaceholderHeight!=null)return;if(!this.placeholder){this._cachedPlaceholderHeight=0;return}let A=this._textareaElement.value;this._textareaElement.value=this._textareaElement.placeholder,this._cachedPlaceholderHeight=this._measureScrollHeight(),this._textareaElement.value=A}_handleFocusEvent=A=>{this._hasFocus=A.type===\"focus\"};ngDoCheck(){this._platform.isBrowser&&this.resizeToFitContent()}resizeToFitContent(A=!1){if(!this._enabled||(this._cacheTextareaLineHeight(),this._cacheTextareaPlaceholderHeight(),!this._cachedLineHeight))return;let i=this._elementRef.nativeElement,n=i.value;if(!A&&this._minRows===this._previousMinRows&&n===this._previousValue)return;let o=this._measureScrollHeight(),a=Math.max(o,this._cachedPlaceholderHeight||0);i.style.height=`${a}px`,this._ngZone.runOutsideAngular(()=>{typeof requestAnimationFrame<\"u\"?requestAnimationFrame(()=>this._scrollToCaretPosition(i)):setTimeout(()=>this._scrollToCaretPosition(i))}),this._previousValue=n,this._previousMinRows=this._minRows}reset(){this._initialHeight!==void 0&&(this._textareaElement.style.height=this._initialHeight)}_noopInputHandler(){}_scrollToCaretPosition(A){let{selectionStart:i,selectionEnd:n}=A;!this._destroyed.isStopped&&this._hasFocus&&A.setSelectionRange(i,n)}static \\u0275fac=function(i){return new(i||t)};static \\u0275dir=OA({type:t,selectors:[[\"textarea\",\"cdkTextareaAutosize\",\"\"]],hostAttrs:[\"rows\",\"1\",1,\"cdk-textarea-autosize\"],hostBindings:function(i,n){i&1&&$(\"input\",function(){return n._noopInputHandler()})},inputs:{minRows:[0,\"cdkAutosizeMinRows\",\"minRows\"],maxRows:[0,\"cdkAutosizeMaxRows\",\"maxRows\"],enabled:[2,\"cdkTextareaAutosize\",\"enabled\",he],placeholder:\"placeholder\"},exportAs:[\"cdkTextareaAutosize\"]})}return t})(),_d=(()=>{class t{static \\u0275fac=function(i){return new(i||t)};static \\u0275mod=Xe({type:t});static \\u0275inj=Ze({})}return t})();var QG=new wA(\"MAT_INPUT_VALUE_ACCESSOR\");var Gd=(()=>{class t{isErrorState(A,i){return!!(A&&A.invalid&&(A.touched||i&&i.submitted))}static \\u0275fac=function(i){return new(i||t)};static \\u0275prov=TA({token:t,factory:t.\\u0275fac,providedIn:\"root\"})}return t})();var Kd=class{_defaultMatcher;ngControl;_parentFormGroup;_parentForm;_stateChanges;errorState=!1;matcher;constructor(e,A,i,n,o){this._defaultMatcher=e,this.ngControl=A,this._parentFormGroup=i,this._parentForm=n,this._stateChanges=o}updateErrorState(){let e=this.errorState,A=this._parentFormGroup||this._parentForm,i=this.matcher||this._defaultMatcher,n=this.ngControl?this.ngControl.control:null,o=i?.isErrorState(n,A)??!1;o!==e&&(this.errorState=o,this._stateChanges.next())}};var QaA=[\"button\",\"checkbox\",\"file\",\"hidden\",\"image\",\"radio\",\"range\",\"reset\",\"submit\"],EaA=new wA(\"MAT_INPUT_CONFIG\"),wa=(()=>{class t{_elementRef=h(ge);_platform=h(ci);ngControl=h(xs,{optional:!0,self:!0});_autofillMonitor=h(dG);_ngZone=h(Oe);_formField=h(mh,{optional:!0});_renderer=h(ui);_uid=h(An).getId(\"mat-input-\");_previousNativeValue;_inputValueAccessor;_signalBasedValueAccessor;_previousPlaceholder=null;_errorStateTracker;_config=h(EaA,{optional:!0});_cleanupIosKeyup;_cleanupWebkitWheel;_isServer=!1;_isNativeSelect=!1;_isTextarea=!1;_isInFormField=!1;focused=!1;stateChanges=new $A;controlType=\"mat-input\";autofilled=!1;get disabled(){return this._disabled}set disabled(A){this._disabled=sr(A),this.focused&&(this.focused=!1,this.stateChanges.next())}_disabled=!1;get id(){return this._id}set id(A){this._id=A||this._uid}_id;placeholder;name;get required(){return this._required??this.ngControl?.control?.hasValidator(Ss.required)??!1}set required(A){this._required=sr(A)}_required;get type(){return this._type}set type(A){this._type=A||\"text\",this._validateType(),!this._isTextarea&&Vv().has(this._type)&&(this._elementRef.nativeElement.type=this._type)}_type=\"text\";get errorStateMatcher(){return this._errorStateTracker.matcher}set errorStateMatcher(A){this._errorStateTracker.matcher=A}userAriaDescribedBy;get value(){return this._signalBasedValueAccessor?this._signalBasedValueAccessor.value():this._inputValueAccessor.value}set value(A){A!==this.value&&(this._signalBasedValueAccessor?this._signalBasedValueAccessor.value.set(A):this._inputValueAccessor.value=A,this.stateChanges.next())}get readonly(){return this._readonly}set readonly(A){this._readonly=sr(A)}_readonly=!1;disabledInteractive;get errorState(){return this._errorStateTracker.errorState}set errorState(A){this._errorStateTracker.errorState=A}_neverEmptyInputTypes=[\"date\",\"datetime\",\"datetime-local\",\"month\",\"time\",\"week\"].filter(A=>Vv().has(A));constructor(){let A=h(bd,{optional:!0}),i=h(GC,{optional:!0}),n=h(Gd),o=h(QG,{optional:!0,self:!0}),a=this._elementRef.nativeElement,r=a.nodeName.toLowerCase();o?bI(o.value)?this._signalBasedValueAccessor=o:this._inputValueAccessor=o:this._inputValueAccessor=a,this._previousNativeValue=this.value,this.id=this.id,this._platform.IOS&&this._ngZone.runOutsideAngular(()=>{this._cleanupIosKeyup=this._renderer.listen(a,\"keyup\",this._iOSKeyupListener)}),this._errorStateTracker=new Kd(n,this.ngControl,i,A,this.stateChanges),this._isServer=!this._platform.isBrowser,this._isNativeSelect=r===\"select\",this._isTextarea=r===\"textarea\",this._isInFormField=!!this._formField,this.disabledInteractive=this._config?.disabledInteractive||!1,this._isNativeSelect&&(this.controlType=a.multiple?\"mat-native-select-multiple\":\"mat-native-select\"),this._signalBasedValueAccessor&&pa(()=>{this._signalBasedValueAccessor.value(),this.stateChanges.next()})}ngAfterViewInit(){this._platform.isBrowser&&this._autofillMonitor.monitor(this._elementRef.nativeElement).subscribe(A=>{this.autofilled=A.isAutofilled,this.stateChanges.next()})}ngOnChanges(){this.stateChanges.next()}ngOnDestroy(){this.stateChanges.complete(),this._platform.isBrowser&&this._autofillMonitor.stopMonitoring(this._elementRef.nativeElement),this._cleanupIosKeyup?.(),this._cleanupWebkitWheel?.()}ngDoCheck(){this.ngControl&&(this.updateErrorState(),this.ngControl.disabled!==null&&this.ngControl.disabled!==this.disabled&&(this.disabled=this.ngControl.disabled,this.stateChanges.next())),this._dirtyCheckNativeValue(),this._dirtyCheckPlaceholder()}focus(A){this._elementRef.nativeElement.focus(A)}updateErrorState(){this._errorStateTracker.updateErrorState()}_focusChanged(A){if(A!==this.focused){if(!this._isNativeSelect&&A&&this.disabled&&this.disabledInteractive){let i=this._elementRef.nativeElement;i.type===\"number\"?(i.type=\"text\",i.setSelectionRange(0,0),i.type=\"number\"):i.setSelectionRange(0,0)}this.focused=A,this.stateChanges.next()}}_onInput(){}_dirtyCheckNativeValue(){let A=this._elementRef.nativeElement.value;this._previousNativeValue!==A&&(this._previousNativeValue=A,this.stateChanges.next())}_dirtyCheckPlaceholder(){let A=this._getPlaceholder();if(A!==this._previousPlaceholder){let i=this._elementRef.nativeElement;this._previousPlaceholder=A,A?i.setAttribute(\"placeholder\",A):i.removeAttribute(\"placeholder\")}}_getPlaceholder(){return this.placeholder||null}_validateType(){QaA.indexOf(this._type)>-1}_isNeverEmpty(){return this._neverEmptyInputTypes.indexOf(this._type)>-1}_isBadInput(){let A=this._elementRef.nativeElement.validity;return A&&A.badInput}get empty(){return!this._isNeverEmpty()&&!this._elementRef.nativeElement.value&&!this._isBadInput()&&!this.autofilled}get shouldLabelFloat(){if(this._isNativeSelect){let A=this._elementRef.nativeElement,i=A.options[0];return this.focused||A.multiple||!this.empty||!!(A.selectedIndex>-1&&i&&i.label)}else return this.focused&&!this.disabled||!this.empty}get describedByIds(){return this._elementRef.nativeElement.getAttribute(\"aria-describedby\")?.split(\" \")||[]}setDescribedByIds(A){let i=this._elementRef.nativeElement;A.length?i.setAttribute(\"aria-describedby\",A.join(\" \")):i.removeAttribute(\"aria-describedby\")}onContainerClick(){this.focused||this.focus()}_isInlineSelect(){let A=this._elementRef.nativeElement;return this._isNativeSelect&&(A.multiple||A.size>1)}_iOSKeyupListener=A=>{let i=A.target;!i.value&&i.selectionStart===0&&i.selectionEnd===0&&(i.setSelectionRange(1,1),i.setSelectionRange(0,0))};_getReadonlyAttribute(){return this._isNativeSelect?null:this.readonly||this.disabled&&this.disabledInteractive?\"true\":null}static \\u0275fac=function(i){return new(i||t)};static \\u0275dir=OA({type:t,selectors:[[\"input\",\"matInput\",\"\"],[\"textarea\",\"matInput\",\"\"],[\"select\",\"matNativeControl\",\"\"],[\"input\",\"matNativeControl\",\"\"],[\"textarea\",\"matNativeControl\",\"\"]],hostAttrs:[1,\"mat-mdc-input-element\"],hostVars:21,hostBindings:function(i,n){i&1&&$(\"focus\",function(){return n._focusChanged(!0)})(\"blur\",function(){return n._focusChanged(!1)})(\"input\",function(){return n._onInput()}),i&2&&(Bo(\"id\",n.id)(\"disabled\",n.disabled&&!n.disabledInteractive)(\"required\",n.required),ie(\"name\",n.name||null)(\"readonly\",n._getReadonlyAttribute())(\"aria-disabled\",n.disabled&&n.disabledInteractive?\"true\":null)(\"aria-invalid\",n.empty&&n.required?null:n.errorState)(\"aria-required\",n.required)(\"id\",n.id),ae(\"mat-input-server\",n._isServer)(\"mat-mdc-form-field-textarea-control\",n._isInFormField&&n._isTextarea)(\"mat-mdc-form-field-input-control\",n._isInFormField)(\"mat-mdc-input-disabled-interactive\",n.disabledInteractive)(\"mdc-text-field__input\",n._isInFormField)(\"mat-mdc-native-select-inline\",n._isInlineSelect()))},inputs:{disabled:\"disabled\",id:\"id\",placeholder:\"placeholder\",name:\"name\",required:\"required\",type:\"type\",errorStateMatcher:\"errorStateMatcher\",userAriaDescribedBy:[0,\"aria-describedby\",\"userAriaDescribedBy\"],value:\"value\",readonly:\"readonly\",disabledInteractive:[2,\"disabledInteractive\",\"disabledInteractive\",he]},exportAs:[\"matInput\"],features:[It([{provide:fh,useExisting:t}]),ei]})}return t})(),Fg=(()=>{class t{static \\u0275fac=function(i){return new(i||t)};static \\u0275mod=Xe({type:t});static \\u0275inj=Ze({imports:[vr,vr,_d,Fi]})}return t})();var Xi=(function(t){return t[t.State=0]=\"State\",t[t.Transition=1]=\"Transition\",t[t.Sequence=2]=\"Sequence\",t[t.Group=3]=\"Group\",t[t.Animate=4]=\"Animate\",t[t.Keyframes=5]=\"Keyframes\",t[t.Style=6]=\"Style\",t[t.Trigger=7]=\"Trigger\",t[t.Reference=8]=\"Reference\",t[t.AnimateChild=9]=\"AnimateChild\",t[t.AnimateRef=10]=\"AnimateRef\",t[t.Query=11]=\"Query\",t[t.Stagger=12]=\"Stagger\",t})(Xi||{}),Dl=\"*\";function EG(t,e=null){return{type:Xi.Sequence,steps:t,options:e}}function o7(t){return{type:Xi.Style,styles:t,offset:null}}var b0=class{_onDoneFns=[];_onStartFns=[];_onDestroyFns=[];_originalOnDoneFns=[];_originalOnStartFns=[];_started=!1;_destroyed=!1;_finished=!1;_position=0;parentPlayer=null;totalTime;constructor(e=0,A=0){this.totalTime=e+A}_onFinish(){this._finished||(this._finished=!0,this._onDoneFns.forEach(e=>e()),this._onDoneFns=[])}onStart(e){this._originalOnStartFns.push(e),this._onStartFns.push(e)}onDone(e){this._originalOnDoneFns.push(e),this._onDoneFns.push(e)}onDestroy(e){this._onDestroyFns.push(e)}hasStarted(){return this._started}init(){}play(){this.hasStarted()||(this._onStart(),this.triggerMicrotask()),this._started=!0}triggerMicrotask(){queueMicrotask(()=>this._onFinish())}_onStart(){this._onStartFns.forEach(e=>e()),this._onStartFns=[]}pause(){}restart(){}finish(){this._onFinish()}destroy(){this._destroyed||(this._destroyed=!0,this.hasStarted()||this._onStart(),this.finish(),this._onDestroyFns.forEach(e=>e()),this._onDestroyFns=[])}reset(){this._started=!1,this._finished=!1,this._onStartFns=this._originalOnStartFns,this._onDoneFns=this._originalOnDoneFns}setPosition(e){this._position=this.totalTime?e*this.totalTime:1}getPosition(){return this.totalTime?this._position/this.totalTime:1}triggerCallback(e){let A=e==\"start\"?this._onStartFns:this._onDoneFns;A.forEach(i=>i()),A.length=0}},Ud=class{_onDoneFns=[];_onStartFns=[];_finished=!1;_started=!1;_destroyed=!1;_onDestroyFns=[];parentPlayer=null;totalTime=0;players;constructor(e){this.players=e;let A=0,i=0,n=0,o=this.players.length;o==0?queueMicrotask(()=>this._onFinish()):this.players.forEach(a=>{a.onDone(()=>{++A==o&&this._onFinish()}),a.onDestroy(()=>{++i==o&&this._onDestroy()}),a.onStart(()=>{++n==o&&this._onStart()})}),this.totalTime=this.players.reduce((a,r)=>Math.max(a,r.totalTime),0)}_onFinish(){this._finished||(this._finished=!0,this._onDoneFns.forEach(e=>e()),this._onDoneFns=[])}init(){this.players.forEach(e=>e.init())}onStart(e){this._onStartFns.push(e)}_onStart(){this.hasStarted()||(this._started=!0,this._onStartFns.forEach(e=>e()),this._onStartFns=[])}onDone(e){this._onDoneFns.push(e)}onDestroy(e){this._onDestroyFns.push(e)}hasStarted(){return this._started}play(){this.parentPlayer||this.init(),this._onStart(),this.players.forEach(e=>e.play())}pause(){this.players.forEach(e=>e.pause())}restart(){this.players.forEach(e=>e.restart())}finish(){this._onFinish(),this.players.forEach(e=>e.finish())}destroy(){this._onDestroy()}_onDestroy(){this._destroyed||(this._destroyed=!0,this._onFinish(),this.players.forEach(e=>e.destroy()),this._onDestroyFns.forEach(e=>e()),this._onDestroyFns=[])}reset(){this.players.forEach(e=>e.reset()),this._destroyed=!1,this._finished=!1,this._started=!1}setPosition(e){let A=e*this.totalTime;this.players.forEach(i=>{let n=i.totalTime?Math.min(1,A/i.totalTime):1;i.setPosition(n)})}getPosition(){let e=this.players.reduce((A,i)=>A===null||i.totalTime>A.totalTime?i:A,null);return e!=null?e.getPosition():0}beforeDestroy(){this.players.forEach(e=>{e.beforeDestroy&&e.beforeDestroy()})}triggerCallback(e){let A=e==\"start\"?this._onStartFns:this._onDoneFns;A.forEach(i=>i()),A.length=0}},wh=\"!\";function hG(t){return new wt(3e3,!1)}function haA(){return new wt(3100,!1)}function uaA(){return new wt(3101,!1)}function faA(t){return new wt(3001,!1)}function maA(t){return new wt(3003,!1)}function paA(t){return new wt(3004,!1)}function fG(t,e){return new wt(3005,!1)}function mG(){return new wt(3006,!1)}function pG(){return new wt(3007,!1)}function DG(t,e){return new wt(3008,!1)}function wG(t){return new wt(3002,!1)}function yG(t,e,A,i,n){return new wt(3010,!1)}function vG(){return new wt(3011,!1)}function bG(){return new wt(3012,!1)}function MG(){return new wt(3200,!1)}function kG(){return new wt(3202,!1)}function SG(){return new wt(3013,!1)}function xG(t){return new wt(3014,!1)}function RG(t){return new wt(3015,!1)}function NG(t){return new wt(3016,!1)}function FG(t,e){return new wt(3404,!1)}function DaA(t){return new wt(3502,!1)}function LG(t){return new wt(3503,!1)}function _G(){return new wt(3300,!1)}function GG(t){return new wt(3504,!1)}function KG(t){return new wt(3301,!1)}function UG(t,e){return new wt(3302,!1)}function JG(t){return new wt(3303,!1)}function YG(t,e){return new wt(3400,!1)}function HG(t){return new wt(3401,!1)}function TG(t){return new wt(3402,!1)}function OG(t,e){return new wt(3505,!1)}function M0(t){switch(t.length){case 0:return new b0;case 1:return t[0];default:return new Ud(t)}}function g7(t,e,A=new Map,i=new Map){let n=[],o=[],a=-1,r=null;if(e.forEach(s=>{let g=s.get(\"offset\"),l=g==a,C=l&&r||new Map;s.forEach((I,d)=>{let B=d,Q=I;if(d!==\"offset\")switch(B=t.normalizePropertyName(B,n),Q){case wh:Q=A.get(d);break;case Dl:Q=i.get(d);break;default:Q=t.normalizeStyleValue(d,B,Q,n);break}C.set(B,Q)}),l||o.push(C),r=C,a=g}),n.length)throw DaA(n);return o}function om(t,e,A,i){switch(e){case\"start\":t.onStart(()=>i(A&&a7(A,\"start\",t)));break;case\"done\":t.onDone(()=>i(A&&a7(A,\"done\",t)));break;case\"destroy\":t.onDestroy(()=>i(A&&a7(A,\"destroy\",t)));break}}function a7(t,e,A){let i=A.totalTime,n=!!A.disabled,o=am(t.element,t.triggerName,t.fromState,t.toState,e||t.phaseName,i??t.totalTime,n),a=t._data;return a!=null&&(o._data=a),o}function am(t,e,A,i,n=\"\",o=0,a){return{element:t,triggerName:e,fromState:A,toState:i,phaseName:n,totalTime:o,disabled:!!a}}function Fs(t,e,A){let i=t.get(e);return i||t.set(e,i=A),i}function l7(t){let e=t.indexOf(\":\"),A=t.substring(1,e),i=t.slice(e+1);return[A,i]}var waA=typeof document>\"u\"?null:document.documentElement;function rm(t){let e=t.parentNode||t.host||null;return e===waA?null:e}function yaA(t){return t.substring(1,6)==\"ebkit\"}var GI=null,uG=!1;function zG(t){GI||(GI=vaA()||{},uG=GI.style?\"WebkitAppearance\"in GI.style:!1);let e=!0;return GI.style&&!yaA(t)&&(e=t in GI.style,!e&&uG&&(e=\"Webkit\"+t.charAt(0).toUpperCase()+t.slice(1)in GI.style)),e}function vaA(){return typeof document<\"u\"?document.body:null}function c7(t,e){for(;e;){if(e===t)return!0;e=rm(e)}return!1}function C7(t,e,A){if(A)return Array.from(t.querySelectorAll(e));let i=t.querySelector(e);return i?[i]:[]}var baA=1e3,I7=\"{{\",MaA=\"}}\",d7=\"ng-enter\",sm=\"ng-leave\",yh=\"ng-trigger\",vh=\".ng-trigger\",B7=\"ng-animating\",gm=\".ng-animating\";function kc(t){if(typeof t==\"number\")return t;let e=t.match(/^(-?[\\.\\d]+)(m?s)/);return!e||e.length<2?0:r7(parseFloat(e[1]),e[2])}function r7(t,e){return e===\"s\"?t*baA:t}function bh(t,e,A){return t.hasOwnProperty(\"duration\")?t:SaA(t,e,A)}var kaA=/^(-?[\\.\\d]+)(m?s)(?:\\s+(-?[\\.\\d]+)(m?s))?(?:\\s+([-a-z]+(?:\\(.+?\\))?))?$/i;function SaA(t,e,A){let i,n=0,o=\"\";if(typeof t==\"string\"){let a=t.match(kaA);if(a===null)return e.push(hG(t)),{duration:0,delay:0,easing:\"\"};i=r7(parseFloat(a[1]),a[2]);let r=a[3];r!=null&&(n=r7(parseFloat(r),a[4]));let s=a[5];s&&(o=s)}else i=t;if(!A){let a=!1,r=e.length;i<0&&(e.push(haA()),a=!0),n<0&&(e.push(uaA()),a=!0),a&&e.splice(r,0,hG(t))}return{duration:i,delay:n,easing:o}}function PG(t){return t.length?t[0]instanceof Map?t:t.map(e=>new Map(Object.entries(e))):[]}function wl(t,e,A){e.forEach((i,n)=>{let o=lm(n);A&&!A.has(n)&&A.set(n,t.style[o]),t.style[o]=i})}function HC(t,e){e.forEach((A,i)=>{let n=lm(i);t.style[n]=\"\"})}function Jd(t){return Array.isArray(t)?t.length==1?t[0]:EG(t):t}function jG(t,e,A){let i=e.params||{},n=Q7(t);n.length&&n.forEach(o=>{i.hasOwnProperty(o)||A.push(faA(o))})}var s7=new RegExp(`${I7}\\\\s*(.+?)\\\\s*${MaA}`,\"g\");function Q7(t){let e=[];if(typeof t==\"string\"){let A;for(;A=s7.exec(t);)e.push(A[1]);s7.lastIndex=0}return e}function Yd(t,e,A){let i=`${t}`,n=i.replace(s7,(o,a)=>{let r=e[a];return r==null&&(A.push(maA(a)),r=\"\"),r.toString()});return n==i?t:n}var xaA=/-+([a-z0-9])/g;function lm(t){return t.replace(xaA,(...e)=>e[1].toUpperCase())}function qG(t,e){return t===0||e===0}function VG(t,e,A){if(A.size&&e.length){let i=e[0],n=[];if(A.forEach((o,a)=>{i.has(a)||n.push(a),i.set(a,o)}),n.length)for(let o=1;o<e.length;o++){let a=e[o];n.forEach(r=>a.set(r,cm(t,r)))}}return e}function Ls(t,e,A){switch(e.type){case Xi.Trigger:return t.visitTrigger(e,A);case Xi.State:return t.visitState(e,A);case Xi.Transition:return t.visitTransition(e,A);case Xi.Sequence:return t.visitSequence(e,A);case Xi.Group:return t.visitGroup(e,A);case Xi.Animate:return t.visitAnimate(e,A);case Xi.Keyframes:return t.visitKeyframes(e,A);case Xi.Style:return t.visitStyle(e,A);case Xi.Reference:return t.visitReference(e,A);case Xi.AnimateChild:return t.visitAnimateChild(e,A);case Xi.AnimateRef:return t.visitAnimateRef(e,A);case Xi.Query:return t.visitQuery(e,A);case Xi.Stagger:return t.visitStagger(e,A);default:throw paA(e.type)}}function cm(t,e){return window.getComputedStyle(t)[e]}var N7=(()=>{class t{validateStyleProperty(A){return zG(A)}containsElement(A,i){return c7(A,i)}getParentElement(A){return rm(A)}query(A,i,n){return C7(A,i,n)}computeStyle(A,i,n){return n||\"\"}animate(A,i,n,o,a,r=[],s){return new b0(n,o)}static \\u0275fac=function(i){return new(i||t)};static \\u0275prov=TA({token:t,factory:t.\\u0275fac})}return t})(),UI=class{static NOOP=new N7},JI=class{};var RaA=new Set([\"width\",\"height\",\"minWidth\",\"minHeight\",\"maxWidth\",\"maxHeight\",\"left\",\"top\",\"bottom\",\"right\",\"fontSize\",\"outlineWidth\",\"outlineOffset\",\"paddingTop\",\"paddingLeft\",\"paddingBottom\",\"paddingRight\",\"marginTop\",\"marginLeft\",\"marginBottom\",\"marginRight\",\"borderRadius\",\"borderWidth\",\"borderTopWidth\",\"borderLeftWidth\",\"borderRightWidth\",\"borderBottomWidth\",\"textIndent\",\"perspective\"]),Qm=class extends JI{normalizePropertyName(e,A){return lm(e)}normalizeStyleValue(e,A,i,n){let o=\"\",a=i.toString().trim();if(RaA.has(A)&&i!==0&&i!==\"0\")if(typeof i==\"number\")o=\"px\";else{let r=i.match(/^[+-]?[\\d\\.]+([a-z]*)$/);r&&r[1].length==0&&n.push(fG(e,i))}return a+o}};var Em=\"*\";function NaA(t,e){let A=[];return typeof t==\"string\"?t.split(/\\s*,\\s*/).forEach(i=>FaA(i,A,e)):A.push(t),A}function FaA(t,e,A){if(t[0]==\":\"){let s=LaA(t,A);if(typeof s==\"function\"){e.push(s);return}t=s}let i=t.match(/^(\\*|[-\\w]+)\\s*(<?[=-]>)\\s*(\\*|[-\\w]+)$/);if(i==null||i.length<4)return A.push(RG(t)),e;let n=i[1],o=i[2],a=i[3];e.push(WG(n,a));let r=n==Em&&a==Em;o[0]==\"<\"&&!r&&e.push(WG(a,n))}function LaA(t,e){switch(t){case\":enter\":return\"void => *\";case\":leave\":return\"* => void\";case\":increment\":return(A,i)=>parseFloat(i)>parseFloat(A);case\":decrement\":return(A,i)=>parseFloat(i)<parseFloat(A);default:return e.push(NG(t)),\"* => *\"}}var Cm=new Set([\"true\",\"1\"]),Im=new Set([\"false\",\"0\"]);function WG(t,e){let A=Cm.has(t)||Im.has(t),i=Cm.has(e)||Im.has(e);return(n,o)=>{let a=t==Em||t==n,r=e==Em||e==o;return!a&&A&&typeof n==\"boolean\"&&(a=n?Cm.has(t):Im.has(t)),!r&&i&&typeof o==\"boolean\"&&(r=o?Cm.has(e):Im.has(e)),a&&r}}var aK=\":self\",_aA=new RegExp(`s*${aK}s*,?`,\"g\");function rK(t,e,A,i){return new p7(t).build(e,A,i)}var ZG=\"\",p7=class{_driver;constructor(e){this._driver=e}build(e,A,i){let n=new D7(A);return this._resetContextStyleTimingState(n),Ls(this,Jd(e),n)}_resetContextStyleTimingState(e){e.currentQuerySelector=ZG,e.collectedStyles=new Map,e.collectedStyles.set(ZG,new Map),e.currentTime=0}visitTrigger(e,A){let i=A.queryCount=0,n=A.depCount=0,o=[],a=[];return e.name.charAt(0)==\"@\"&&A.errors.push(mG()),e.definitions.forEach(r=>{if(this._resetContextStyleTimingState(A),r.type==Xi.State){let s=r,g=s.name;g.toString().split(/\\s*,\\s*/).forEach(l=>{s.name=l,o.push(this.visitState(s,A))}),s.name=g}else if(r.type==Xi.Transition){let s=this.visitTransition(r,A);i+=s.queryCount,n+=s.depCount,a.push(s)}else A.errors.push(pG())}),{type:Xi.Trigger,name:e.name,states:o,transitions:a,queryCount:i,depCount:n,options:null}}visitState(e,A){let i=this.visitStyle(e.styles,A),n=e.options&&e.options.params||null;if(i.containsDynamicStyles){let o=new Set,a=n||{};i.styles.forEach(r=>{r instanceof Map&&r.forEach(s=>{Q7(s).forEach(g=>{a.hasOwnProperty(g)||o.add(g)})})}),o.size&&A.errors.push(DG(e.name,[...o.values()]))}return{type:Xi.State,name:e.name,style:i,options:n?{params:n}:null}}visitTransition(e,A){A.queryCount=0,A.depCount=0;let i=Ls(this,Jd(e.animation),A),n=NaA(e.expr,A.errors);return{type:Xi.Transition,matchers:n,animation:i,queryCount:A.queryCount,depCount:A.depCount,options:KI(e.options)}}visitSequence(e,A){return{type:Xi.Sequence,steps:e.steps.map(i=>Ls(this,i,A)),options:KI(e.options)}}visitGroup(e,A){let i=A.currentTime,n=0,o=e.steps.map(a=>{A.currentTime=i;let r=Ls(this,a,A);return n=Math.max(n,A.currentTime),r});return A.currentTime=n,{type:Xi.Group,steps:o,options:KI(e.options)}}visitAnimate(e,A){let i=JaA(e.timings,A.errors);A.currentAnimateTimings=i;let n,o=e.styles?e.styles:o7({});if(o.type==Xi.Keyframes)n=this.visitKeyframes(o,A);else{let a=e.styles,r=!1;if(!a){r=!0;let g={};i.easing&&(g.easing=i.easing),a=o7(g)}A.currentTime+=i.duration+i.delay;let s=this.visitStyle(a,A);s.isEmptyStep=r,n=s}return A.currentAnimateTimings=null,{type:Xi.Animate,timings:i,style:n,options:null}}visitStyle(e,A){let i=this._makeStyleAst(e,A);return this._validateStyleAst(i,A),i}_makeStyleAst(e,A){let i=[],n=Array.isArray(e.styles)?e.styles:[e.styles];for(let r of n)typeof r==\"string\"?r===Dl?i.push(r):A.errors.push(wG(r)):i.push(new Map(Object.entries(r)));let o=!1,a=null;return i.forEach(r=>{if(r instanceof Map&&(r.has(\"easing\")&&(a=r.get(\"easing\"),r.delete(\"easing\")),!o)){for(let s of r.values())if(s.toString().indexOf(I7)>=0){o=!0;break}}}),{type:Xi.Style,styles:i,easing:a,offset:e.offset,containsDynamicStyles:o,options:null}}_validateStyleAst(e,A){let i=A.currentAnimateTimings,n=A.currentTime,o=A.currentTime;i&&o>0&&(o-=i.duration+i.delay),e.styles.forEach(a=>{typeof a!=\"string\"&&a.forEach((r,s)=>{let g=A.collectedStyles.get(A.currentQuerySelector),l=g.get(s),C=!0;l&&(o!=n&&o>=l.startTime&&n<=l.endTime&&(A.errors.push(yG(s,l.startTime,l.endTime,o,n)),C=!1),o=l.startTime),C&&g.set(s,{startTime:o,endTime:n}),A.options&&jG(r,A.options,A.errors)})})}visitKeyframes(e,A){let i={type:Xi.Keyframes,styles:[],options:null};if(!A.currentAnimateTimings)return A.errors.push(vG()),i;let n=1,o=0,a=[],r=!1,s=!1,g=0,l=e.steps.map(f=>{let b=this._makeStyleAst(f,A),R=b.offset!=null?b.offset:UaA(b.styles),M=0;return R!=null&&(o++,M=b.offset=R),s=s||M<0||M>1,r=r||M<g,g=M,a.push(M),b});s&&A.errors.push(bG()),r&&A.errors.push(MG());let C=e.steps.length,I=0;o>0&&o<C?A.errors.push(kG()):o==0&&(I=n/(C-1));let d=C-1,B=A.currentTime,Q=A.currentAnimateTimings,E=Q.duration;return l.forEach((f,b)=>{let R=I>0?b==d?1:I*b:a[b],M=R*E;A.currentTime=B+Q.delay+M,Q.duration=M,this._validateStyleAst(f,A),f.offset=R,i.styles.push(f)}),i}visitReference(e,A){return{type:Xi.Reference,animation:Ls(this,Jd(e.animation),A),options:KI(e.options)}}visitAnimateChild(e,A){return A.depCount++,{type:Xi.AnimateChild,options:KI(e.options)}}visitAnimateRef(e,A){return{type:Xi.AnimateRef,animation:this.visitReference(e.animation,A),options:KI(e.options)}}visitQuery(e,A){let i=A.currentQuerySelector,n=e.options||{};A.queryCount++,A.currentQuery=e;let[o,a]=GaA(e.selector);A.currentQuerySelector=i.length?i+\" \"+o:o,Fs(A.collectedStyles,A.currentQuerySelector,new Map);let r=Ls(this,Jd(e.animation),A);return A.currentQuery=null,A.currentQuerySelector=i,{type:Xi.Query,selector:o,limit:n.limit||0,optional:!!n.optional,includeSelf:a,animation:r,originalSelector:e.selector,options:KI(e.options)}}visitStagger(e,A){A.currentQuery||A.errors.push(SG());let i=e.timings===\"full\"?{duration:0,delay:0,easing:\"full\"}:bh(e.timings,A.errors,!0);return{type:Xi.Stagger,animation:Ls(this,Jd(e.animation),A),timings:i,options:null}}};function GaA(t){let e=!!t.split(/\\s*,\\s*/).find(A=>A==aK);return e&&(t=t.replace(_aA,\"\")),t=t.replace(/@\\*/g,vh).replace(/@\\w+/g,A=>vh+\"-\"+A.slice(1)).replace(/:animating/g,gm),[t,e]}function KaA(t){return t?BA({},t):null}var D7=class{errors;queryCount=0;depCount=0;currentTransition=null;currentQuery=null;currentQuerySelector=null;currentAnimateTimings=null;currentTime=0;collectedStyles=new Map;options=null;unsupportedCSSPropertiesFound=new Set;constructor(e){this.errors=e}};function UaA(t){if(typeof t==\"string\")return null;let e=null;if(Array.isArray(t))t.forEach(A=>{if(A instanceof Map&&A.has(\"offset\")){let i=A;e=parseFloat(i.get(\"offset\")),i.delete(\"offset\")}});else if(t instanceof Map&&t.has(\"offset\")){let A=t;e=parseFloat(A.get(\"offset\")),A.delete(\"offset\")}return e}function JaA(t,e){if(t.hasOwnProperty(\"duration\"))return t;if(typeof t==\"number\"){let o=bh(t,e).duration;return E7(o,0,\"\")}let A=t;if(A.split(/\\s+/).some(o=>o.charAt(0)==\"{\"&&o.charAt(1)==\"{\")){let o=E7(0,0,\"\");return o.dynamic=!0,o.strValue=A,o}let n=bh(A,e);return E7(n.duration,n.delay,n.easing)}function KI(t){return t?(t=BA({},t),t.params&&(t.params=KaA(t.params))):t={},t}function E7(t,e,A){return{duration:t,delay:e,easing:A}}function F7(t,e,A,i,n,o,a=null,r=!1){return{type:1,element:t,keyframes:e,preStyleProps:A,postStyleProps:i,duration:n,delay:o,totalTime:n+o,easing:a,subTimeline:r}}var kh=class{_map=new Map;get(e){return this._map.get(e)||[]}append(e,A){let i=this._map.get(e);i||this._map.set(e,i=[]),i.push(...A)}has(e){return this._map.has(e)}clear(){this._map.clear()}},YaA=1,HaA=\":enter\",TaA=new RegExp(HaA,\"g\"),OaA=\":leave\",zaA=new RegExp(OaA,\"g\");function sK(t,e,A,i,n,o=new Map,a=new Map,r,s,g=[]){return new w7().buildKeyframes(t,e,A,i,n,o,a,r,s,g)}var w7=class{buildKeyframes(e,A,i,n,o,a,r,s,g,l=[]){g=g||new kh;let C=new y7(e,A,g,n,o,l,[]);C.options=s;let I=s.delay?kc(s.delay):0;C.currentTimeline.delayNextStep(I),C.currentTimeline.setStyles([a],null,C.errors,s),Ls(this,i,C);let d=C.timelines.filter(B=>B.containsAnimation());if(d.length&&r.size){let B;for(let Q=d.length-1;Q>=0;Q--){let E=d[Q];if(E.element===A){B=E;break}}B&&!B.allowOnlyTimelineStyles()&&B.setStyles([r],null,C.errors,s)}return d.length?d.map(B=>B.buildKeyframes()):[F7(A,[],[],[],0,I,\"\",!1)]}visitTrigger(e,A){}visitState(e,A){}visitTransition(e,A){}visitAnimateChild(e,A){let i=A.subInstructions.get(A.element);if(i){let n=A.createSubContext(e.options),o=A.currentTimeline.currentTime,a=this._visitSubInstructions(i,n,n.options);o!=a&&A.transformIntoNewTimeline(a)}A.previousNode=e}visitAnimateRef(e,A){let i=A.createSubContext(e.options);i.transformIntoNewTimeline(),this._applyAnimationRefDelays([e.options,e.animation.options],A,i),this.visitReference(e.animation,i),A.transformIntoNewTimeline(i.currentTimeline.currentTime),A.previousNode=e}_applyAnimationRefDelays(e,A,i){for(let n of e){let o=n?.delay;if(o){let a=typeof o==\"number\"?o:kc(Yd(o,n?.params??{},A.errors));i.delayNextStep(a)}}}_visitSubInstructions(e,A,i){let o=A.currentTimeline.currentTime,a=i.duration!=null?kc(i.duration):null,r=i.delay!=null?kc(i.delay):null;return a!==0&&e.forEach(s=>{let g=A.appendInstructionToTimeline(s,a,r);o=Math.max(o,g.duration+g.delay)}),o}visitReference(e,A){A.updateOptions(e.options,!0),Ls(this,e.animation,A),A.previousNode=e}visitSequence(e,A){let i=A.subContextCount,n=A,o=e.options;if(o&&(o.params||o.delay)&&(n=A.createSubContext(o),n.transformIntoNewTimeline(),o.delay!=null)){n.previousNode.type==Xi.Style&&(n.currentTimeline.snapshotCurrentStyles(),n.previousNode=hm);let a=kc(o.delay);n.delayNextStep(a)}e.steps.length&&(e.steps.forEach(a=>Ls(this,a,n)),n.currentTimeline.applyStylesToKeyframe(),n.subContextCount>i&&n.transformIntoNewTimeline()),A.previousNode=e}visitGroup(e,A){let i=[],n=A.currentTimeline.currentTime,o=e.options&&e.options.delay?kc(e.options.delay):0;e.steps.forEach(a=>{let r=A.createSubContext(e.options);o&&r.delayNextStep(o),Ls(this,a,r),n=Math.max(n,r.currentTimeline.currentTime),i.push(r.currentTimeline)}),i.forEach(a=>A.currentTimeline.mergeTimelineCollectedStyles(a)),A.transformIntoNewTimeline(n),A.previousNode=e}_visitTiming(e,A){if(e.dynamic){let i=e.strValue,n=A.params?Yd(i,A.params,A.errors):i;return bh(n,A.errors)}else return{duration:e.duration,delay:e.delay,easing:e.easing}}visitAnimate(e,A){let i=A.currentAnimateTimings=this._visitTiming(e.timings,A),n=A.currentTimeline;i.delay&&(A.incrementTime(i.delay),n.snapshotCurrentStyles());let o=e.style;o.type==Xi.Keyframes?this.visitKeyframes(o,A):(A.incrementTime(i.duration),this.visitStyle(o,A),n.applyStylesToKeyframe()),A.currentAnimateTimings=null,A.previousNode=e}visitStyle(e,A){let i=A.currentTimeline,n=A.currentAnimateTimings;!n&&i.hasCurrentStyleProperties()&&i.forwardFrame();let o=n&&n.easing||e.easing;e.isEmptyStep?i.applyEmptyStep(o):i.setStyles(e.styles,o,A.errors,A.options),A.previousNode=e}visitKeyframes(e,A){let i=A.currentAnimateTimings,n=A.currentTimeline.duration,o=i.duration,r=A.createSubContext().currentTimeline;r.easing=i.easing,e.styles.forEach(s=>{let g=s.offset||0;r.forwardTime(g*o),r.setStyles(s.styles,s.easing,A.errors,A.options),r.applyStylesToKeyframe()}),A.currentTimeline.mergeTimelineCollectedStyles(r),A.transformIntoNewTimeline(n+o),A.previousNode=e}visitQuery(e,A){let i=A.currentTimeline.currentTime,n=e.options||{},o=n.delay?kc(n.delay):0;o&&(A.previousNode.type===Xi.Style||i==0&&A.currentTimeline.hasCurrentStyleProperties())&&(A.currentTimeline.snapshotCurrentStyles(),A.previousNode=hm);let a=i,r=A.invokeQuery(e.selector,e.originalSelector,e.limit,e.includeSelf,!!n.optional,A.errors);A.currentQueryTotal=r.length;let s=null;r.forEach((g,l)=>{A.currentQueryIndex=l;let C=A.createSubContext(e.options,g);o&&C.delayNextStep(o),g===A.element&&(s=C.currentTimeline),Ls(this,e.animation,C),C.currentTimeline.applyStylesToKeyframe();let I=C.currentTimeline.currentTime;a=Math.max(a,I)}),A.currentQueryIndex=0,A.currentQueryTotal=0,A.transformIntoNewTimeline(a),s&&(A.currentTimeline.mergeTimelineCollectedStyles(s),A.currentTimeline.snapshotCurrentStyles()),A.previousNode=e}visitStagger(e,A){let i=A.parentContext,n=A.currentTimeline,o=e.timings,a=Math.abs(o.duration),r=a*(A.currentQueryTotal-1),s=a*A.currentQueryIndex;switch(o.duration<0?\"reverse\":o.easing){case\"reverse\":s=r-s;break;case\"full\":s=i.currentStaggerTime;break}let l=A.currentTimeline;s&&l.delayNextStep(s);let C=l.currentTime;Ls(this,e.animation,A),A.previousNode=e,i.currentStaggerTime=n.currentTime-C+(n.startTime-i.currentTimeline.startTime)}},hm={},y7=class t{_driver;element;subInstructions;_enterClassName;_leaveClassName;errors;timelines;parentContext=null;currentTimeline;currentAnimateTimings=null;previousNode=hm;subContextCount=0;options={};currentQueryIndex=0;currentQueryTotal=0;currentStaggerTime=0;constructor(e,A,i,n,o,a,r,s){this._driver=e,this.element=A,this.subInstructions=i,this._enterClassName=n,this._leaveClassName=o,this.errors=a,this.timelines=r,this.currentTimeline=s||new um(this._driver,A,0),r.push(this.currentTimeline)}get params(){return this.options.params}updateOptions(e,A){if(!e)return;let i=e,n=this.options;i.duration!=null&&(n.duration=kc(i.duration)),i.delay!=null&&(n.delay=kc(i.delay));let o=i.params;if(o){let a=n.params;a||(a=this.options.params={}),Object.keys(o).forEach(r=>{(!A||!a.hasOwnProperty(r))&&(a[r]=Yd(o[r],a,this.errors))})}}_copyOptions(){let e={};if(this.options){let A=this.options.params;if(A){let i=e.params={};Object.keys(A).forEach(n=>{i[n]=A[n]})}}return e}createSubContext(e=null,A,i){let n=A||this.element,o=new t(this._driver,n,this.subInstructions,this._enterClassName,this._leaveClassName,this.errors,this.timelines,this.currentTimeline.fork(n,i||0));return o.previousNode=this.previousNode,o.currentAnimateTimings=this.currentAnimateTimings,o.options=this._copyOptions(),o.updateOptions(e),o.currentQueryIndex=this.currentQueryIndex,o.currentQueryTotal=this.currentQueryTotal,o.parentContext=this,this.subContextCount++,o}transformIntoNewTimeline(e){return this.previousNode=hm,this.currentTimeline=this.currentTimeline.fork(this.element,e),this.timelines.push(this.currentTimeline),this.currentTimeline}appendInstructionToTimeline(e,A,i){let n={duration:A??e.duration,delay:this.currentTimeline.currentTime+(i??0)+e.delay,easing:\"\"},o=new v7(this._driver,e.element,e.keyframes,e.preStyleProps,e.postStyleProps,n,e.stretchStartingKeyframe);return this.timelines.push(o),n}incrementTime(e){this.currentTimeline.forwardTime(this.currentTimeline.duration+e)}delayNextStep(e){e>0&&this.currentTimeline.delayNextStep(e)}invokeQuery(e,A,i,n,o,a){let r=[];if(n&&r.push(this.element),e.length>0){e=e.replace(TaA,\".\"+this._enterClassName),e=e.replace(zaA,\".\"+this._leaveClassName);let s=i!=1,g=this._driver.query(this.element,e,s);i!==0&&(g=i<0?g.slice(g.length+i,g.length):g.slice(0,i)),r.push(...g)}return!o&&r.length==0&&a.push(xG(A)),r}},um=class t{_driver;element;startTime;_elementTimelineStylesLookup;duration=0;easing=null;_previousKeyframe=new Map;_currentKeyframe=new Map;_keyframes=new Map;_styleSummary=new Map;_localTimelineStyles=new Map;_globalTimelineStyles;_pendingStyles=new Map;_backFill=new Map;_currentEmptyStepKeyframe=null;constructor(e,A,i,n){this._driver=e,this.element=A,this.startTime=i,this._elementTimelineStylesLookup=n,this._elementTimelineStylesLookup||(this._elementTimelineStylesLookup=new Map),this._globalTimelineStyles=this._elementTimelineStylesLookup.get(A),this._globalTimelineStyles||(this._globalTimelineStyles=this._localTimelineStyles,this._elementTimelineStylesLookup.set(A,this._localTimelineStyles)),this._loadKeyframe()}containsAnimation(){switch(this._keyframes.size){case 0:return!1;case 1:return this.hasCurrentStyleProperties();default:return!0}}hasCurrentStyleProperties(){return this._currentKeyframe.size>0}get currentTime(){return this.startTime+this.duration}delayNextStep(e){let A=this._keyframes.size===1&&this._pendingStyles.size;this.duration||A?(this.forwardTime(this.currentTime+e),A&&this.snapshotCurrentStyles()):this.startTime+=e}fork(e,A){return this.applyStylesToKeyframe(),new t(this._driver,e,A||this.currentTime,this._elementTimelineStylesLookup)}_loadKeyframe(){this._currentKeyframe&&(this._previousKeyframe=this._currentKeyframe),this._currentKeyframe=this._keyframes.get(this.duration),this._currentKeyframe||(this._currentKeyframe=new Map,this._keyframes.set(this.duration,this._currentKeyframe))}forwardFrame(){this.duration+=YaA,this._loadKeyframe()}forwardTime(e){this.applyStylesToKeyframe(),this.duration=e,this._loadKeyframe()}_updateStyle(e,A){this._localTimelineStyles.set(e,A),this._globalTimelineStyles.set(e,A),this._styleSummary.set(e,{time:this.currentTime,value:A})}allowOnlyTimelineStyles(){return this._currentEmptyStepKeyframe!==this._currentKeyframe}applyEmptyStep(e){e&&this._previousKeyframe.set(\"easing\",e);for(let[A,i]of this._globalTimelineStyles)this._backFill.set(A,i||Dl),this._currentKeyframe.set(A,Dl);this._currentEmptyStepKeyframe=this._currentKeyframe}setStyles(e,A,i,n){A&&this._previousKeyframe.set(\"easing\",A);let o=n&&n.params||{},a=PaA(e,this._globalTimelineStyles);for(let[r,s]of a){let g=Yd(s,o,i);this._pendingStyles.set(r,g),this._localTimelineStyles.has(r)||this._backFill.set(r,this._globalTimelineStyles.get(r)??Dl),this._updateStyle(r,g)}}applyStylesToKeyframe(){this._pendingStyles.size!=0&&(this._pendingStyles.forEach((e,A)=>{this._currentKeyframe.set(A,e)}),this._pendingStyles.clear(),this._localTimelineStyles.forEach((e,A)=>{this._currentKeyframe.has(A)||this._currentKeyframe.set(A,e)}))}snapshotCurrentStyles(){for(let[e,A]of this._localTimelineStyles)this._pendingStyles.set(e,A),this._updateStyle(e,A)}getFinalKeyframe(){return this._keyframes.get(this.duration)}get properties(){let e=[];for(let A in this._currentKeyframe)e.push(A);return e}mergeTimelineCollectedStyles(e){e._styleSummary.forEach((A,i)=>{let n=this._styleSummary.get(i);(!n||A.time>n.time)&&this._updateStyle(i,A.value)})}buildKeyframes(){this.applyStylesToKeyframe();let e=new Set,A=new Set,i=this._keyframes.size===1&&this.duration===0,n=[];this._keyframes.forEach((r,s)=>{let g=new Map([...this._backFill,...r]);g.forEach((l,C)=>{l===wh?e.add(C):l===Dl&&A.add(C)}),i||g.set(\"offset\",s/this.duration),n.push(g)});let o=[...e.values()],a=[...A.values()];if(i){let r=n[0],s=new Map(r);r.set(\"offset\",0),s.set(\"offset\",1),n=[r,s]}return F7(this.element,n,o,a,this.duration,this.startTime,this.easing,!1)}},v7=class extends um{keyframes;preStyleProps;postStyleProps;_stretchStartingKeyframe;timings;constructor(e,A,i,n,o,a,r=!1){super(e,A,a.delay),this.keyframes=i,this.preStyleProps=n,this.postStyleProps=o,this._stretchStartingKeyframe=r,this.timings={duration:a.duration,delay:a.delay,easing:a.easing}}containsAnimation(){return this.keyframes.length>1}buildKeyframes(){let e=this.keyframes,{delay:A,duration:i,easing:n}=this.timings;if(this._stretchStartingKeyframe&&A){let o=[],a=i+A,r=A/a,s=new Map(e[0]);s.set(\"offset\",0),o.push(s);let g=new Map(e[0]);g.set(\"offset\",XG(r)),o.push(g);let l=e.length-1;for(let C=1;C<=l;C++){let I=new Map(e[C]),d=I.get(\"offset\"),B=A+d*i;I.set(\"offset\",XG(B/a)),o.push(I)}i=a,A=0,n=\"\",e=o}return F7(this.element,e,this.preStyleProps,this.postStyleProps,i,A,n,!0)}};function XG(t,e=3){let A=Math.pow(10,e-1);return Math.round(t*A)/A}function PaA(t,e){let A=new Map,i;return t.forEach(n=>{if(n===\"*\"){i??=e.keys();for(let o of i)A.set(o,Dl)}else for(let[o,a]of n)A.set(o,a)}),A}function $G(t,e,A,i,n,o,a,r,s,g,l,C,I){return{type:0,element:t,triggerName:e,isRemovalTransition:n,fromState:A,fromStyles:o,toState:i,toStyles:a,timelines:r,queriedElements:s,preStyleProps:g,postStyleProps:l,totalTime:C,errors:I}}var h7={},fm=class{_triggerName;ast;_stateStyles;constructor(e,A,i){this._triggerName=e,this.ast=A,this._stateStyles=i}match(e,A,i,n){return jaA(this.ast.matchers,e,A,i,n)}buildStyles(e,A,i){let n=this._stateStyles.get(\"*\");return e!==void 0&&(n=this._stateStyles.get(e?.toString())||n),n?n.buildStyles(A,i):new Map}build(e,A,i,n,o,a,r,s,g,l){let C=[],I=this.ast.options&&this.ast.options.params||h7,d=r&&r.params||h7,B=this.buildStyles(i,d,C),Q=s&&s.params||h7,E=this.buildStyles(n,Q,C),f=new Set,b=new Map,R=new Map,M=n===\"void\",v={params:gK(Q,I),delay:this.ast.options?.delay},F=l?[]:sK(e,A,this.ast.animation,o,a,B,E,v,g,C),G=0;return F.forEach(U=>{G=Math.max(U.duration+U.delay,G)}),C.length?$G(A,this._triggerName,i,n,M,B,E,[],[],b,R,G,C):(F.forEach(U=>{let Y=U.element,j=Fs(b,Y,new Set);U.preStyleProps.forEach(z=>j.add(z));let AA=Fs(R,Y,new Set);U.postStyleProps.forEach(z=>AA.add(z)),Y!==A&&f.add(Y)}),$G(A,this._triggerName,i,n,M,B,E,F,[...f.values()],b,R,G))}};function jaA(t,e,A,i,n){return t.some(o=>o(e,A,i,n))}function gK(t,e){let A=BA({},e);return Object.entries(t).forEach(([i,n])=>{n!=null&&(A[i]=n)}),A}var b7=class{styles;defaultParams;normalizer;constructor(e,A,i){this.styles=e,this.defaultParams=A,this.normalizer=i}buildStyles(e,A){let i=new Map,n=gK(e,this.defaultParams);return this.styles.styles.forEach(o=>{typeof o!=\"string\"&&o.forEach((a,r)=>{a&&(a=Yd(a,n,A));let s=this.normalizer.normalizePropertyName(r,A);a=this.normalizer.normalizeStyleValue(r,s,a,A),i.set(r,a)})}),i}};function qaA(t,e,A){return new M7(t,e,A)}var M7=class{name;ast;_normalizer;transitionFactories=[];fallbackTransition;states=new Map;constructor(e,A,i){this.name=e,this.ast=A,this._normalizer=i,A.states.forEach(n=>{let o=n.options&&n.options.params||{};this.states.set(n.name,new b7(n.style,o,i))}),AK(this.states,\"true\",\"1\"),AK(this.states,\"false\",\"0\"),A.transitions.forEach(n=>{this.transitionFactories.push(new fm(e,n,this.states))}),this.fallbackTransition=VaA(e,this.states)}get containsQueries(){return this.ast.queryCount>0}matchTransition(e,A,i,n){return this.transitionFactories.find(a=>a.match(e,A,i,n))||null}matchStyles(e,A,i){return this.fallbackTransition.buildStyles(e,A,i)}};function VaA(t,e,A){let i=[(a,r)=>!0],n={type:Xi.Sequence,steps:[],options:null},o={type:Xi.Transition,animation:n,matchers:i,options:null,queryCount:0,depCount:0};return new fm(t,o,e)}function AK(t,e,A){t.has(e)?t.has(A)||t.set(A,t.get(e)):t.has(A)&&t.set(e,t.get(A))}var WaA=new kh,k7=class{bodyNode;_driver;_normalizer;_animations=new Map;_playersById=new Map;players=[];constructor(e,A,i){this.bodyNode=e,this._driver=A,this._normalizer=i}register(e,A){let i=[],n=[],o=rK(this._driver,A,i,n);if(i.length)throw LG(i);this._animations.set(e,o)}_buildPlayer(e,A,i){let n=e.element,o=g7(this._normalizer,e.keyframes,A,i);return this._driver.animate(n,o,e.duration,e.delay,e.easing,[],!0)}create(e,A,i={}){let n=[],o=this._animations.get(e),a,r=new Map;if(o?(a=sK(this._driver,A,o,d7,sm,new Map,new Map,i,WaA,n),a.forEach(l=>{let C=Fs(r,l.element,new Map);l.postStyleProps.forEach(I=>C.set(I,null))})):(n.push(_G()),a=[]),n.length)throw GG(n);r.forEach((l,C)=>{l.forEach((I,d)=>{l.set(d,this._driver.computeStyle(C,d,Dl))})});let s=a.map(l=>{let C=r.get(l.element);return this._buildPlayer(l,new Map,C)}),g=M0(s);return this._playersById.set(e,g),g.onDestroy(()=>this.destroy(e)),this.players.push(g),g}destroy(e){let A=this._getPlayer(e);A.destroy(),this._playersById.delete(e);let i=this.players.indexOf(A);i>=0&&this.players.splice(i,1)}_getPlayer(e){let A=this._playersById.get(e);if(!A)throw KG(e);return A}listen(e,A,i,n){let o=am(A,\"\",\"\",\"\");return om(this._getPlayer(e),i,o,n),()=>{}}command(e,A,i,n){if(i==\"register\"){this.register(e,n[0]);return}if(i==\"create\"){let a=n[0]||{};this.create(e,A,a);return}let o=this._getPlayer(e);switch(i){case\"play\":o.play();break;case\"pause\":o.pause();break;case\"reset\":o.reset();break;case\"restart\":o.restart();break;case\"finish\":o.finish();break;case\"init\":o.init();break;case\"setPosition\":o.setPosition(parseFloat(n[0]));break;case\"destroy\":this.destroy(e);break}}},eK=\"ng-animate-queued\",ZaA=\".ng-animate-queued\",u7=\"ng-animate-disabled\",XaA=\".ng-animate-disabled\",$aA=\"ng-star-inserted\",ArA=\".ng-star-inserted\",erA=[],lK={namespaceId:\"\",setForRemoval:!1,setForMove:!1,hasAnimation:!1,removedBeforeQueried:!1},trA={namespaceId:\"\",setForMove:!1,setForRemoval:!1,hasAnimation:!1,removedBeforeQueried:!0},yl=\"__ng_removed\",Sh=class{namespaceId;value;options;get params(){return this.options.params}constructor(e,A=\"\"){this.namespaceId=A;let i=e&&e.hasOwnProperty(\"value\"),n=i?e.value:e;if(this.value=nrA(n),i){let o=e,{value:a}=o,r=WF(o,[\"value\"]);this.options=r}else this.options={};this.options.params||(this.options.params={})}absorbOptions(e){let A=e.params;if(A){let i=this.options.params;Object.keys(A).forEach(n=>{i[n]==null&&(i[n]=A[n])})}}},Mh=\"void\",f7=new Sh(Mh),S7=class{id;hostElement;_engine;players=[];_triggers=new Map;_queue=[];_elementListeners=new Map;_hostClassName;constructor(e,A,i){this.id=e,this.hostElement=A,this._engine=i,this._hostClassName=\"ng-tns-\"+e,Lg(A,this._hostClassName)}listen(e,A,i,n){if(!this._triggers.has(A))throw UG(i,A);if(i==null||i.length==0)throw JG(A);if(!orA(i))throw YG(i,A);let o=Fs(this._elementListeners,e,[]),a={name:A,phase:i,callback:n};o.push(a);let r=Fs(this._engine.statesByElement,e,new Map);return r.has(A)||(Lg(e,yh),Lg(e,yh+\"-\"+A),r.set(A,f7)),()=>{this._engine.afterFlush(()=>{let s=o.indexOf(a);s>=0&&o.splice(s,1),this._triggers.has(A)||r.delete(A)})}}register(e,A){return this._triggers.has(e)?!1:(this._triggers.set(e,A),!0)}_getTrigger(e){let A=this._triggers.get(e);if(!A)throw HG(e);return A}trigger(e,A,i,n=!0){let o=this._getTrigger(A),a=new xh(this.id,A,e),r=this._engine.statesByElement.get(e);r||(Lg(e,yh),Lg(e,yh+\"-\"+A),this._engine.statesByElement.set(e,r=new Map));let s=r.get(A),g=new Sh(i,this.id);if(!(i&&i.hasOwnProperty(\"value\"))&&s&&g.absorbOptions(s.options),r.set(A,g),s||(s=f7),!(g.value===Mh)&&s.value===g.value){if(!srA(s.params,g.params)){let Q=[],E=o.matchStyles(s.value,s.params,Q),f=o.matchStyles(g.value,g.params,Q);Q.length?this._engine.reportError(Q):this._engine.afterFlush(()=>{HC(e,E),wl(e,f)})}return}let I=Fs(this._engine.playersByElement,e,[]);I.forEach(Q=>{Q.namespaceId==this.id&&Q.triggerName==A&&Q.queued&&Q.destroy()});let d=o.matchTransition(s.value,g.value,e,g.params),B=!1;if(!d){if(!n)return;d=o.fallbackTransition,B=!0}return this._engine.totalQueuedPlayers++,this._queue.push({element:e,triggerName:A,transition:d,fromState:s,toState:g,player:a,isFallbackTransition:B}),B||(Lg(e,eK),a.onStart(()=>{Hd(e,eK)})),a.onDone(()=>{let Q=this.players.indexOf(a);Q>=0&&this.players.splice(Q,1);let E=this._engine.playersByElement.get(e);if(E){let f=E.indexOf(a);f>=0&&E.splice(f,1)}}),this.players.push(a),I.push(a),a}deregister(e){this._triggers.delete(e),this._engine.statesByElement.forEach(A=>A.delete(e)),this._elementListeners.forEach((A,i)=>{this._elementListeners.set(i,A.filter(n=>n.name!=e))})}clearElementCache(e){this._engine.statesByElement.delete(e),this._elementListeners.delete(e);let A=this._engine.playersByElement.get(e);A&&(A.forEach(i=>i.destroy()),this._engine.playersByElement.delete(e))}_signalRemovalForInnerTriggers(e,A){let i=this._engine.driver.query(e,vh,!0);i.forEach(n=>{if(n[yl])return;let o=this._engine.fetchNamespacesByElement(n);o.size?o.forEach(a=>a.triggerLeaveAnimation(n,A,!1,!0)):this.clearElementCache(n)}),this._engine.afterFlushAnimationsDone(()=>i.forEach(n=>this.clearElementCache(n)))}triggerLeaveAnimation(e,A,i,n){let o=this._engine.statesByElement.get(e),a=new Map;if(o){let r=[];if(o.forEach((s,g)=>{if(a.set(g,s.value),this._triggers.has(g)){let l=this.trigger(e,g,Mh,n);l&&r.push(l)}}),r.length)return this._engine.markElementAsRemoved(this.id,e,!0,A,a),i&&M0(r).onDone(()=>this._engine.processLeaveNode(e)),!0}return!1}prepareLeaveAnimationListeners(e){let A=this._elementListeners.get(e),i=this._engine.statesByElement.get(e);if(A&&i){let n=new Set;A.forEach(o=>{let a=o.name;if(n.has(a))return;n.add(a);let s=this._triggers.get(a).fallbackTransition,g=i.get(a)||f7,l=new Sh(Mh),C=new xh(this.id,a,e);this._engine.totalQueuedPlayers++,this._queue.push({element:e,triggerName:a,transition:s,fromState:g,toState:l,player:C,isFallbackTransition:!0})})}}removeNode(e,A){let i=this._engine;if(e.childElementCount&&this._signalRemovalForInnerTriggers(e,A),this.triggerLeaveAnimation(e,A,!0))return;let n=!1;if(i.totalAnimations){let o=i.players.length?i.playersByQueriedElement.get(e):[];if(o&&o.length)n=!0;else{let a=e;for(;a=a.parentNode;)if(i.statesByElement.get(a)){n=!0;break}}}if(this.prepareLeaveAnimationListeners(e),n)i.markElementAsRemoved(this.id,e,!1,A);else{let o=e[yl];(!o||o===lK)&&(i.afterFlush(()=>this.clearElementCache(e)),i.destroyInnerAnimations(e),i._onRemovalComplete(e,A))}}insertNode(e,A){Lg(e,this._hostClassName)}drainQueuedTransitions(e){let A=[];return this._queue.forEach(i=>{let n=i.player;if(n.destroyed)return;let o=i.element,a=this._elementListeners.get(o);a&&a.forEach(r=>{if(r.name==i.triggerName){let s=am(o,i.triggerName,i.fromState.value,i.toState.value);s._data=e,om(i.player,r.phase,s,r.callback)}}),n.markedForDestroy?this._engine.afterFlush(()=>{n.destroy()}):A.push(i)}),this._queue=[],A.sort((i,n)=>{let o=i.transition.ast.depCount,a=n.transition.ast.depCount;return o==0||a==0?o-a:this._engine.driver.containsElement(i.element,n.element)?1:-1})}destroy(e){this.players.forEach(A=>A.destroy()),this._signalRemovalForInnerTriggers(this.hostElement,e)}},x7=class{bodyNode;driver;_normalizer;players=[];newHostElements=new Map;playersByElement=new Map;playersByQueriedElement=new Map;statesByElement=new Map;disabledNodes=new Set;totalAnimations=0;totalQueuedPlayers=0;_namespaceLookup={};_namespaceList=[];_flushFns=[];_whenQuietFns=[];namespacesByHostElement=new Map;collectedEnterElements=[];collectedLeaveElements=[];onRemovalComplete=(e,A)=>{};_onRemovalComplete(e,A){this.onRemovalComplete(e,A)}constructor(e,A,i){this.bodyNode=e,this.driver=A,this._normalizer=i}get queuedPlayers(){let e=[];return this._namespaceList.forEach(A=>{A.players.forEach(i=>{i.queued&&e.push(i)})}),e}createNamespace(e,A){let i=new S7(e,A,this);return this.bodyNode&&this.driver.containsElement(this.bodyNode,A)?this._balanceNamespaceList(i,A):(this.newHostElements.set(A,i),this.collectEnterElement(A)),this._namespaceLookup[e]=i}_balanceNamespaceList(e,A){let i=this._namespaceList,n=this.namespacesByHostElement;if(i.length-1>=0){let a=!1,r=this.driver.getParentElement(A);for(;r;){let s=n.get(r);if(s){let g=i.indexOf(s);i.splice(g+1,0,e),a=!0;break}r=this.driver.getParentElement(r)}a||i.unshift(e)}else i.push(e);return n.set(A,e),e}register(e,A){let i=this._namespaceLookup[e];return i||(i=this.createNamespace(e,A)),i}registerTrigger(e,A,i){let n=this._namespaceLookup[e];n&&n.register(A,i)&&this.totalAnimations++}destroy(e,A){e&&(this.afterFlush(()=>{}),this.afterFlushAnimationsDone(()=>{let i=this._fetchNamespace(e);this.namespacesByHostElement.delete(i.hostElement);let n=this._namespaceList.indexOf(i);n>=0&&this._namespaceList.splice(n,1),i.destroy(A),delete this._namespaceLookup[e]}))}_fetchNamespace(e){return this._namespaceLookup[e]}fetchNamespacesByElement(e){let A=new Set,i=this.statesByElement.get(e);if(i){for(let n of i.values())if(n.namespaceId){let o=this._fetchNamespace(n.namespaceId);o&&A.add(o)}}return A}trigger(e,A,i,n){if(dm(A)){let o=this._fetchNamespace(e);if(o)return o.trigger(A,i,n),!0}return!1}insertNode(e,A,i,n){if(!dm(A))return;let o=A[yl];if(o&&o.setForRemoval){o.setForRemoval=!1,o.setForMove=!0;let a=this.collectedLeaveElements.indexOf(A);a>=0&&this.collectedLeaveElements.splice(a,1)}if(e){let a=this._fetchNamespace(e);a&&a.insertNode(A,i)}n&&this.collectEnterElement(A)}collectEnterElement(e){this.collectedEnterElements.push(e)}markElementAsDisabled(e,A){A?this.disabledNodes.has(e)||(this.disabledNodes.add(e),Lg(e,u7)):this.disabledNodes.has(e)&&(this.disabledNodes.delete(e),Hd(e,u7))}removeNode(e,A,i){if(dm(A)){let n=e?this._fetchNamespace(e):null;n?n.removeNode(A,i):this.markElementAsRemoved(e,A,!1,i);let o=this.namespacesByHostElement.get(A);o&&o.id!==e&&o.removeNode(A,i)}else this._onRemovalComplete(A,i)}markElementAsRemoved(e,A,i,n,o){this.collectedLeaveElements.push(A),A[yl]={namespaceId:e,setForRemoval:n,hasAnimation:i,removedBeforeQueried:!1,previousTriggersValues:o}}listen(e,A,i,n,o){return dm(A)?this._fetchNamespace(e).listen(A,i,n,o):()=>{}}_buildInstruction(e,A,i,n,o){return e.transition.build(this.driver,e.element,e.fromState.value,e.toState.value,i,n,e.fromState.options,e.toState.options,A,o)}destroyInnerAnimations(e){let A=this.driver.query(e,vh,!0);A.forEach(i=>this.destroyActiveAnimationsForElement(i)),this.playersByQueriedElement.size!=0&&(A=this.driver.query(e,gm,!0),A.forEach(i=>this.finishActiveQueriedAnimationOnElement(i)))}destroyActiveAnimationsForElement(e){let A=this.playersByElement.get(e);A&&A.forEach(i=>{i.queued?i.markedForDestroy=!0:i.destroy()})}finishActiveQueriedAnimationOnElement(e){let A=this.playersByQueriedElement.get(e);A&&A.forEach(i=>i.finish())}whenRenderingDone(){return new Promise(e=>{if(this.players.length)return M0(this.players).onDone(()=>e());e()})}processLeaveNode(e){let A=e[yl];if(A&&A.setForRemoval){if(e[yl]=lK,A.namespaceId){this.destroyInnerAnimations(e);let i=this._fetchNamespace(A.namespaceId);i&&i.clearElementCache(e)}this._onRemovalComplete(e,A.setForRemoval)}e.classList?.contains(u7)&&this.markElementAsDisabled(e,!1),this.driver.query(e,XaA,!0).forEach(i=>{this.markElementAsDisabled(i,!1)})}flush(e=-1){let A=[];if(this.newHostElements.size&&(this.newHostElements.forEach((i,n)=>this._balanceNamespaceList(i,n)),this.newHostElements.clear()),this.totalAnimations&&this.collectedEnterElements.length)for(let i=0;i<this.collectedEnterElements.length;i++){let n=this.collectedEnterElements[i];Lg(n,$aA)}if(this._namespaceList.length&&(this.totalQueuedPlayers||this.collectedLeaveElements.length)){let i=[];try{A=this._flushAnimations(i,e)}finally{for(let n=0;n<i.length;n++)i[n]()}}else for(let i=0;i<this.collectedLeaveElements.length;i++){let n=this.collectedLeaveElements[i];this.processLeaveNode(n)}if(this.totalQueuedPlayers=0,this.collectedEnterElements.length=0,this.collectedLeaveElements.length=0,this._flushFns.forEach(i=>i()),this._flushFns=[],this._whenQuietFns.length){let i=this._whenQuietFns;this._whenQuietFns=[],A.length?M0(A).onDone(()=>{i.forEach(n=>n())}):i.forEach(n=>n())}}reportError(e){throw TG(e)}_flushAnimations(e,A){let i=new kh,n=[],o=new Map,a=[],r=new Map,s=new Map,g=new Map,l=new Set;this.disabledNodes.forEach(eA=>{l.add(eA);let dA=this.driver.query(eA,ZaA,!0);for(let iA=0;iA<dA.length;iA++)l.add(dA[iA])});let C=this.bodyNode,I=Array.from(this.statesByElement.keys()),d=nK(I,this.collectedEnterElements),B=new Map,Q=0;d.forEach((eA,dA)=>{let iA=d7+Q++;B.set(dA,iA),eA.forEach(aA=>Lg(aA,iA))});let E=[],f=new Set,b=new Set;for(let eA=0;eA<this.collectedLeaveElements.length;eA++){let dA=this.collectedLeaveElements[eA],iA=dA[yl];iA&&iA.setForRemoval&&(E.push(dA),f.add(dA),iA.hasAnimation?this.driver.query(dA,ArA,!0).forEach(aA=>f.add(aA)):b.add(dA))}let R=new Map,M=nK(I,Array.from(f));M.forEach((eA,dA)=>{let iA=sm+Q++;R.set(dA,iA),eA.forEach(aA=>Lg(aA,iA))}),e.push(()=>{d.forEach((eA,dA)=>{let iA=B.get(dA);eA.forEach(aA=>Hd(aA,iA))}),M.forEach((eA,dA)=>{let iA=R.get(dA);eA.forEach(aA=>Hd(aA,iA))}),E.forEach(eA=>{this.processLeaveNode(eA)})});let v=[],F=[];for(let eA=this._namespaceList.length-1;eA>=0;eA--)this._namespaceList[eA].drainQueuedTransitions(A).forEach(iA=>{let aA=iA.player,hA=iA.element;if(v.push(aA),this.collectedEnterElements.length){let Ke=hA[yl];if(Ke&&Ke.setForMove){if(Ke.previousTriggersValues&&Ke.previousTriggersValues.has(iA.triggerName)){let HA=Ke.previousTriggersValues.get(iA.triggerName),uA=this.statesByElement.get(iA.element);if(uA&&uA.has(iA.triggerName)){let XA=uA.get(iA.triggerName);XA.value=HA,uA.set(iA.triggerName,XA)}}aA.destroy();return}}let JA=!C||!this.driver.containsElement(C,hA),ee=R.get(hA),UA=B.get(hA),mA=this._buildInstruction(iA,i,UA,ee,JA);if(mA.errors&&mA.errors.length){F.push(mA);return}if(JA){aA.onStart(()=>HC(hA,mA.fromStyles)),aA.onDestroy(()=>wl(hA,mA.toStyles)),n.push(aA);return}if(iA.isFallbackTransition){aA.onStart(()=>HC(hA,mA.fromStyles)),aA.onDestroy(()=>wl(hA,mA.toStyles)),n.push(aA);return}let KA=[];mA.timelines.forEach(Ke=>{Ke.stretchStartingKeyframe=!0,this.disabledNodes.has(Ke.element)||KA.push(Ke)}),mA.timelines=KA,i.append(hA,mA.timelines);let ze={instruction:mA,player:aA,element:hA};a.push(ze),mA.queriedElements.forEach(Ke=>Fs(r,Ke,[]).push(aA)),mA.preStyleProps.forEach((Ke,HA)=>{if(Ke.size){let uA=s.get(HA);uA||s.set(HA,uA=new Set),Ke.forEach((XA,EA)=>uA.add(EA))}}),mA.postStyleProps.forEach((Ke,HA)=>{let uA=g.get(HA);uA||g.set(HA,uA=new Set),Ke.forEach((XA,EA)=>uA.add(EA))})});if(F.length){let eA=[];F.forEach(dA=>{eA.push(OG(dA.triggerName,dA.errors))}),v.forEach(dA=>dA.destroy()),this.reportError(eA)}let G=new Map,U=new Map;a.forEach(eA=>{let dA=eA.element;i.has(dA)&&(U.set(dA,dA),this._beforeAnimationBuild(eA.player.namespaceId,eA.instruction,G))}),n.forEach(eA=>{let dA=eA.element;this._getPreviousPlayers(dA,!1,eA.namespaceId,eA.triggerName,null).forEach(aA=>{Fs(G,dA,[]).push(aA),aA.destroy()})});let Y=E.filter(eA=>oK(eA,s,g)),j=new Map;iK(j,this.driver,b,g,Dl).forEach(eA=>{oK(eA,s,g)&&Y.push(eA)});let z=new Map;d.forEach((eA,dA)=>{iK(z,this.driver,new Set(eA),s,wh)}),Y.forEach(eA=>{let dA=j.get(eA),iA=z.get(eA);j.set(eA,new Map([...dA?.entries()??[],...iA?.entries()??[]]))});let yA=[],P=[],nA={};a.forEach(eA=>{let{element:dA,player:iA,instruction:aA}=eA;if(i.has(dA)){if(l.has(dA)){iA.onDestroy(()=>wl(dA,aA.toStyles)),iA.disabled=!0,iA.overrideTotalTime(aA.totalTime),n.push(iA);return}let hA=nA;if(U.size>1){let ee=dA,UA=[];for(;ee=ee.parentNode;){let mA=U.get(ee);if(mA){hA=mA;break}UA.push(ee)}UA.forEach(mA=>U.set(mA,hA))}let JA=this._buildAnimation(iA.namespaceId,aA,G,o,z,j);if(iA.setRealPlayer(JA),hA===nA)yA.push(iA);else{let ee=this.playersByElement.get(hA);ee&&ee.length&&(iA.parentPlayer=M0(ee)),n.push(iA)}}else HC(dA,aA.fromStyles),iA.onDestroy(()=>wl(dA,aA.toStyles)),P.push(iA),l.has(dA)&&n.push(iA)}),P.forEach(eA=>{let dA=o.get(eA.element);if(dA&&dA.length){let iA=M0(dA);eA.setRealPlayer(iA)}}),n.forEach(eA=>{eA.parentPlayer?eA.syncPlayerEvents(eA.parentPlayer):eA.destroy()});for(let eA=0;eA<E.length;eA++){let dA=E[eA],iA=dA[yl];if(Hd(dA,sm),iA&&iA.hasAnimation)continue;let aA=[];if(r.size){let JA=r.get(dA);JA&&JA.length&&aA.push(...JA);let ee=this.driver.query(dA,gm,!0);for(let UA=0;UA<ee.length;UA++){let mA=r.get(ee[UA]);mA&&mA.length&&aA.push(...mA)}}let hA=aA.filter(JA=>!JA.destroyed);hA.length?arA(this,dA,hA):this.processLeaveNode(dA)}return E.length=0,yA.forEach(eA=>{this.players.push(eA),eA.onDone(()=>{eA.destroy();let dA=this.players.indexOf(eA);this.players.splice(dA,1)}),eA.play()}),yA}afterFlush(e){this._flushFns.push(e)}afterFlushAnimationsDone(e){this._whenQuietFns.push(e)}_getPreviousPlayers(e,A,i,n,o){let a=[];if(A){let r=this.playersByQueriedElement.get(e);r&&(a=r)}else{let r=this.playersByElement.get(e);if(r){let s=!o||o==Mh;r.forEach(g=>{g.queued||!s&&g.triggerName!=n||a.push(g)})}}return(i||n)&&(a=a.filter(r=>!(i&&i!=r.namespaceId||n&&n!=r.triggerName))),a}_beforeAnimationBuild(e,A,i){let n=A.triggerName,o=A.element,a=A.isRemovalTransition?void 0:e,r=A.isRemovalTransition?void 0:n;for(let s of A.timelines){let g=s.element,l=g!==o,C=Fs(i,g,[]);this._getPreviousPlayers(g,l,a,r,A.toState).forEach(d=>{let B=d.getRealPlayer();B.beforeDestroy&&B.beforeDestroy(),d.destroy(),C.push(d)})}HC(o,A.fromStyles)}_buildAnimation(e,A,i,n,o,a){let r=A.triggerName,s=A.element,g=[],l=new Set,C=new Set,I=A.timelines.map(B=>{let Q=B.element;l.add(Q);let E=Q[yl];if(E&&E.removedBeforeQueried)return new b0(B.duration,B.delay);let f=Q!==s,b=rrA((i.get(Q)||erA).map(G=>G.getRealPlayer())).filter(G=>{let U=G;return U.element?U.element===Q:!1}),R=o.get(Q),M=a.get(Q),v=g7(this._normalizer,B.keyframes,R,M),F=this._buildPlayer(B,v,b);if(B.subTimeline&&n&&C.add(Q),f){let G=new xh(e,r,Q);G.setRealPlayer(F),g.push(G)}return F});g.forEach(B=>{Fs(this.playersByQueriedElement,B.element,[]).push(B),B.onDone(()=>irA(this.playersByQueriedElement,B.element,B))}),l.forEach(B=>Lg(B,B7));let d=M0(I);return d.onDestroy(()=>{l.forEach(B=>Hd(B,B7)),wl(s,A.toStyles)}),C.forEach(B=>{Fs(n,B,[]).push(d)}),d}_buildPlayer(e,A,i){return A.length>0?this.driver.animate(e.element,A,e.duration,e.delay,e.easing,i):new b0(e.duration,e.delay)}},xh=class{namespaceId;triggerName;element;_player=new b0;_containsRealPlayer=!1;_queuedCallbacks=new Map;destroyed=!1;parentPlayer=null;markedForDestroy=!1;disabled=!1;queued=!0;totalTime=0;constructor(e,A,i){this.namespaceId=e,this.triggerName=A,this.element=i}setRealPlayer(e){this._containsRealPlayer||(this._player=e,this._queuedCallbacks.forEach((A,i)=>{A.forEach(n=>om(e,i,void 0,n))}),this._queuedCallbacks.clear(),this._containsRealPlayer=!0,this.overrideTotalTime(e.totalTime),this.queued=!1)}getRealPlayer(){return this._player}overrideTotalTime(e){this.totalTime=e}syncPlayerEvents(e){let A=this._player;A.triggerCallback&&e.onStart(()=>A.triggerCallback(\"start\")),e.onDone(()=>this.finish()),e.onDestroy(()=>this.destroy())}_queueEvent(e,A){Fs(this._queuedCallbacks,e,[]).push(A)}onDone(e){this.queued&&this._queueEvent(\"done\",e),this._player.onDone(e)}onStart(e){this.queued&&this._queueEvent(\"start\",e),this._player.onStart(e)}onDestroy(e){this.queued&&this._queueEvent(\"destroy\",e),this._player.onDestroy(e)}init(){this._player.init()}hasStarted(){return this.queued?!1:this._player.hasStarted()}play(){!this.queued&&this._player.play()}pause(){!this.queued&&this._player.pause()}restart(){!this.queued&&this._player.restart()}finish(){this._player.finish()}destroy(){this.destroyed=!0,this._player.destroy()}reset(){!this.queued&&this._player.reset()}setPosition(e){this.queued||this._player.setPosition(e)}getPosition(){return this.queued?0:this._player.getPosition()}triggerCallback(e){let A=this._player;A.triggerCallback&&A.triggerCallback(e)}};function irA(t,e,A){let i=t.get(e);if(i){if(i.length){let n=i.indexOf(A);i.splice(n,1)}i.length==0&&t.delete(e)}return i}function nrA(t){return t??null}function dm(t){return t&&t.nodeType===1}function orA(t){return t==\"start\"||t==\"done\"}function tK(t,e){let A=t.style.display;return t.style.display=e??\"none\",A}function iK(t,e,A,i,n){let o=[];A.forEach(s=>o.push(tK(s)));let a=[];i.forEach((s,g)=>{let l=new Map;s.forEach(C=>{let I=e.computeStyle(g,C,n);l.set(C,I),(!I||I.length==0)&&(g[yl]=trA,a.push(g))}),t.set(g,l)});let r=0;return A.forEach(s=>tK(s,o[r++])),a}function nK(t,e){let A=new Map;if(t.forEach(r=>A.set(r,[])),e.length==0)return A;let i=1,n=new Set(e),o=new Map;function a(r){if(!r)return i;let s=o.get(r);if(s)return s;let g=r.parentNode;return A.has(g)?s=g:n.has(g)?s=i:s=a(g),o.set(r,s),s}return e.forEach(r=>{let s=a(r);s!==i&&A.get(s).push(r)}),A}function Lg(t,e){t.classList?.add(e)}function Hd(t,e){t.classList?.remove(e)}function arA(t,e,A){M0(A).onDone(()=>t.processLeaveNode(e))}function rrA(t){let e=[];return cK(t,e),e}function cK(t,e){for(let A=0;A<t.length;A++){let i=t[A];i instanceof Ud?cK(i.players,e):e.push(i)}}function srA(t,e){let A=Object.keys(t),i=Object.keys(e);if(A.length!=i.length)return!1;for(let n=0;n<A.length;n++){let o=A[n];if(!e.hasOwnProperty(o)||t[o]!==e[o])return!1}return!0}function oK(t,e,A){let i=A.get(t);if(!i)return!1;let n=e.get(t);return n?i.forEach(o=>n.add(o)):e.set(t,i),A.delete(t),!0}var Td=class{_driver;_normalizer;_transitionEngine;_timelineEngine;_triggerCache={};onRemovalComplete=(e,A)=>{};constructor(e,A,i){this._driver=A,this._normalizer=i,this._transitionEngine=new x7(e.body,A,i),this._timelineEngine=new k7(e.body,A,i),this._transitionEngine.onRemovalComplete=(n,o)=>this.onRemovalComplete(n,o)}registerTrigger(e,A,i,n,o){let a=e+\"-\"+n,r=this._triggerCache[a];if(!r){let s=[],g=[],l=rK(this._driver,o,s,g);if(s.length)throw FG(n,s);r=qaA(n,l,this._normalizer),this._triggerCache[a]=r}this._transitionEngine.registerTrigger(A,n,r)}register(e,A){this._transitionEngine.register(e,A)}destroy(e,A){this._transitionEngine.destroy(e,A)}onInsert(e,A,i,n){this._transitionEngine.insertNode(e,A,i,n)}onRemove(e,A,i){this._transitionEngine.removeNode(e,A,i)}disableAnimations(e,A){this._transitionEngine.markElementAsDisabled(e,A)}process(e,A,i,n){if(i.charAt(0)==\"@\"){let[o,a]=l7(i),r=n;this._timelineEngine.command(o,A,a,r)}else this._transitionEngine.trigger(e,A,i,n)}listen(e,A,i,n,o){if(i.charAt(0)==\"@\"){let[a,r]=l7(i);return this._timelineEngine.listen(a,A,r,o)}return this._transitionEngine.listen(e,A,i,n,o)}flush(e=-1){this._transitionEngine.flush(e)}get players(){return[...this._transitionEngine.players,...this._timelineEngine.players]}whenRenderingDone(){return this._transitionEngine.whenRenderingDone()}afterFlushAnimationsDone(e){this._transitionEngine.afterFlushAnimationsDone(e)}};function grA(t,e){let A=null,i=null;return Array.isArray(e)&&e.length?(A=m7(e[0]),e.length>1&&(i=m7(e[e.length-1]))):e instanceof Map&&(A=m7(e)),A||i?new lrA(t,A,i):null}var lrA=(()=>{class t{_element;_startStyles;_endStyles;static initialStylesByElement=new WeakMap;_state=0;_initialStyles;constructor(A,i,n){this._element=A,this._startStyles=i,this._endStyles=n;let o=t.initialStylesByElement.get(A);o||t.initialStylesByElement.set(A,o=new Map),this._initialStyles=o}start(){this._state<1&&(this._startStyles&&wl(this._element,this._startStyles,this._initialStyles),this._state=1)}finish(){this.start(),this._state<2&&(wl(this._element,this._initialStyles),this._endStyles&&(wl(this._element,this._endStyles),this._endStyles=null),this._state=1)}destroy(){this.finish(),this._state<3&&(t.initialStylesByElement.delete(this._element),this._startStyles&&(HC(this._element,this._startStyles),this._endStyles=null),this._endStyles&&(HC(this._element,this._endStyles),this._endStyles=null),wl(this._element,this._initialStyles),this._state=3)}}return t})();function m7(t){let e=null;return t.forEach((A,i)=>{crA(i)&&(e=e||new Map,e.set(i,A))}),e}function crA(t){return t===\"display\"||t===\"position\"}var mm=class{element;keyframes;options;_specialStyles;_onDoneFns=[];_onStartFns=[];_onDestroyFns=[];_duration;_delay;_initialized=!1;_finished=!1;_started=!1;_destroyed=!1;_finalKeyframe;_originalOnDoneFns=[];_originalOnStartFns=[];domPlayer=null;time=0;parentPlayer=null;currentSnapshot=new Map;constructor(e,A,i,n){this.element=e,this.keyframes=A,this.options=i,this._specialStyles=n,this._duration=i.duration,this._delay=i.delay||0,this.time=this._duration+this._delay}_onFinish(){this._finished||(this._finished=!0,this._onDoneFns.forEach(e=>e()),this._onDoneFns=[])}init(){this._buildPlayer()&&this._preparePlayerBeforeStart()}_buildPlayer(){if(this._initialized)return this.domPlayer;this._initialized=!0;let e=this.keyframes,A=this._triggerWebAnimation(this.element,e,this.options);if(!A)return this._onFinish(),null;this.domPlayer=A,this._finalKeyframe=e.length?e[e.length-1]:new Map;let i=()=>this._onFinish();return A.addEventListener(\"finish\",i),this.onDestroy(()=>{A.removeEventListener(\"finish\",i)}),A}_preparePlayerBeforeStart(){this._delay?this._resetDomPlayerState():this.domPlayer?.pause()}_convertKeyframesToObject(e){let A=[];return e.forEach(i=>{A.push(Object.fromEntries(i))}),A}_triggerWebAnimation(e,A,i){let n=this._convertKeyframesToObject(A);try{return e.animate(n,i)}catch(o){return null}}onStart(e){this._originalOnStartFns.push(e),this._onStartFns.push(e)}onDone(e){this._originalOnDoneFns.push(e),this._onDoneFns.push(e)}onDestroy(e){this._onDestroyFns.push(e)}play(){let e=this._buildPlayer();e&&(this.hasStarted()||(this._onStartFns.forEach(A=>A()),this._onStartFns=[],this._started=!0,this._specialStyles&&this._specialStyles.start()),e.play())}pause(){this.init(),this.domPlayer?.pause()}finish(){this.init(),this.domPlayer&&(this._specialStyles&&this._specialStyles.finish(),this._onFinish(),this.domPlayer.finish())}reset(){this._resetDomPlayerState(),this._destroyed=!1,this._finished=!1,this._started=!1,this._onStartFns=this._originalOnStartFns,this._onDoneFns=this._originalOnDoneFns}_resetDomPlayerState(){this.domPlayer?.cancel()}restart(){this.reset(),this.play()}hasStarted(){return this._started}destroy(){this._destroyed||(this._destroyed=!0,this._resetDomPlayerState(),this._onFinish(),this._specialStyles&&this._specialStyles.destroy(),this._onDestroyFns.forEach(e=>e()),this._onDestroyFns=[])}setPosition(e){this.domPlayer||this.init(),this.domPlayer&&(this.domPlayer.currentTime=e*this.time)}getPosition(){return this.domPlayer?+(this.domPlayer.currentTime??0)/this.time:this._initialized?1:0}get totalTime(){return this._delay+this._duration}beforeDestroy(){let e=new Map;this.hasStarted()&&this._finalKeyframe.forEach((i,n)=>{n!==\"offset\"&&e.set(n,this._finished?i:cm(this.element,n))}),this.currentSnapshot=e}triggerCallback(e){let A=e===\"start\"?this._onStartFns:this._onDoneFns;A.forEach(i=>i()),A.length=0}},pm=class{validateStyleProperty(e){return!0}validateAnimatableStyleProperty(e){return!0}containsElement(e,A){return c7(e,A)}getParentElement(e){return rm(e)}query(e,A,i){return C7(e,A,i)}computeStyle(e,A,i){return cm(e,A)}animate(e,A,i,n,o,a=[]){let r=n==0?\"both\":\"forwards\",s={duration:i,delay:n,fill:r};o&&(s.easing=o);let g=new Map,l=a.filter(d=>d instanceof mm);qG(i,n)&&l.forEach(d=>{d.currentSnapshot.forEach((B,Q)=>g.set(Q,B))});let C=PG(A).map(d=>new Map(d));C=VG(e,C,g);let I=grA(e,C);return new mm(e,C,s,I)}};var Bm=\"@\",CK=\"@.disabled\",Dm=class{namespaceId;delegate;engine;_onDestroy;\\u0275type=0;constructor(e,A,i,n){this.namespaceId=e,this.delegate=A,this.engine=i,this._onDestroy=n}get data(){return this.delegate.data}destroyNode(e){this.delegate.destroyNode?.(e)}destroy(){this.engine.destroy(this.namespaceId,this.delegate),this.engine.afterFlushAnimationsDone(()=>{queueMicrotask(()=>{this.delegate.destroy()})}),this._onDestroy?.()}createElement(e,A){return this.delegate.createElement(e,A)}createComment(e){return this.delegate.createComment(e)}createText(e){return this.delegate.createText(e)}appendChild(e,A){this.delegate.appendChild(e,A),this.engine.onInsert(this.namespaceId,A,e,!1)}insertBefore(e,A,i,n=!0){this.delegate.insertBefore(e,A,i),this.engine.onInsert(this.namespaceId,A,e,n)}removeChild(e,A,i,n){if(n){this.delegate.removeChild(e,A,i,n);return}this.parentNode(A)&&this.engine.onRemove(this.namespaceId,A,this.delegate)}selectRootElement(e,A){return this.delegate.selectRootElement(e,A)}parentNode(e){return this.delegate.parentNode(e)}nextSibling(e){return this.delegate.nextSibling(e)}setAttribute(e,A,i,n){this.delegate.setAttribute(e,A,i,n)}removeAttribute(e,A,i){this.delegate.removeAttribute(e,A,i)}addClass(e,A){this.delegate.addClass(e,A)}removeClass(e,A){this.delegate.removeClass(e,A)}setStyle(e,A,i,n){this.delegate.setStyle(e,A,i,n)}removeStyle(e,A,i){this.delegate.removeStyle(e,A,i)}setProperty(e,A,i){A.charAt(0)==Bm&&A==CK?this.disableAnimations(e,!!i):this.delegate.setProperty(e,A,i)}setValue(e,A){this.delegate.setValue(e,A)}listen(e,A,i,n){return this.delegate.listen(e,A,i,n)}disableAnimations(e,A){this.engine.disableAnimations(e,A)}},R7=class extends Dm{factory;constructor(e,A,i,n,o){super(A,i,n,o),this.factory=e,this.namespaceId=A}setProperty(e,A,i){A.charAt(0)==Bm?A.charAt(1)==\".\"&&A==CK?(i=i===void 0?!0:!!i,this.disableAnimations(e,i)):this.engine.process(this.namespaceId,e,A.slice(1),i):this.delegate.setProperty(e,A,i)}listen(e,A,i,n){if(A.charAt(0)==Bm){let o=CrA(e),a=A.slice(1),r=\"\";return a.charAt(0)!=Bm&&([a,r]=IrA(a)),this.engine.listen(this.namespaceId,o,a,r,s=>{let g=s._data||-1;this.factory.scheduleListenerCallback(g,i,s)})}return this.delegate.listen(e,A,i,n)}};function CrA(t){switch(t){case\"body\":return document.body;case\"document\":return document;case\"window\":return window;default:return t}}function IrA(t){let e=t.indexOf(\".\"),A=t.substring(0,e),i=t.slice(e+1);return[A,i]}var wm=class{delegate;engine;_zone;_currentId=0;_microtaskId=1;_animationCallbacksBuffer=[];_rendererCache=new Map;_cdRecurDepth=0;constructor(e,A,i){this.delegate=e,this.engine=A,this._zone=i,A.onRemovalComplete=(n,o)=>{o?.removeChild(null,n)}}createRenderer(e,A){let n=this.delegate.createRenderer(e,A);if(!e||!A?.data?.animation){let g=this._rendererCache,l=g.get(n);if(!l){let C=()=>g.delete(n);l=new Dm(\"\",n,this.engine,C),g.set(n,l)}return l}let o=A.id,a=A.id+\"-\"+this._currentId;this._currentId++,this.engine.register(a,e);let r=g=>{Array.isArray(g)?g.forEach(r):this.engine.registerTrigger(o,a,e,g.name,g)};return A.data.animation.forEach(r),new R7(this,a,n,this.engine)}begin(){this._cdRecurDepth++,this.delegate.begin&&this.delegate.begin()}_scheduleCountTask(){queueMicrotask(()=>{this._microtaskId++})}scheduleListenerCallback(e,A,i){if(e>=0&&e<this._microtaskId){this._zone.run(()=>A(i));return}let n=this._animationCallbacksBuffer;n.length==0&&queueMicrotask(()=>{this._zone.run(()=>{n.forEach(o=>{let[a,r]=o;a(r)}),this._animationCallbacksBuffer=[]})}),n.push([A,i])}end(){this._cdRecurDepth--,this._cdRecurDepth==0&&this._zone.runOutsideAngular(()=>{this._scheduleCountTask(),this.engine.flush(this._microtaskId)}),this.delegate.end&&this.delegate.end()}whenRenderingDone(){return this.engine.whenRenderingDone()}componentReplaced(e){this.engine.flush(),this.delegate.componentReplaced?.(e)}};var BrA=(()=>{class t extends Td{constructor(A,i,n){super(A,i,n)}ngOnDestroy(){this.flush()}static \\u0275fac=function(i){return new(i||t)(Do(Zt),Do(UI),Do(JI))};static \\u0275prov=TA({token:t,factory:t.\\u0275fac})}return t})();function QrA(){return new Qm}function ErA(){return new wm(h(SL),h(Td),h(Oe))}var IK=[{provide:JI,useFactory:QrA},{provide:Td,useClass:BrA},{provide:Dr,useFactory:ErA}],DHA=[{provide:UI,useClass:N7},{provide:vI,useValue:\"NoopAnimations\"},...IK],hrA=[{provide:UI,useFactory:()=>new pm},{provide:vI,useFactory:()=>\"BrowserAnimations\"},...IK];function dK(){return Ef(\"NgEagerAnimations\"),[...hrA]}function br(t){t||(t=h(Wa));let e=new Ti(A=>{if(t.destroyed){A.next();return}return t.onDestroy(A.next.bind(A))});return A=>A.pipe(Bt(e))}var L7=class{source;destroyed=!1;destroyRef=h(Wa);constructor(e){this.source=e,this.destroyRef.onDestroy(()=>{this.destroyed=!0})}subscribe(e){if(this.destroyed)throw new wt(953,!1);let A=this.source.pipe(br(this.destroyRef)).subscribe({next:i=>e(i)});return{unsubscribe:()=>A.unsubscribe()}}};function hn(t,e){return new L7(t)}function Tn(t,e){let A=e?.injector??h(ut),i=new El(1),n=pa(()=>{let o;try{o=t()}catch(a){Zo(()=>i.error(a));return}Zo(()=>i.next(o))},{injector:A,manualCleanup:!0});return A.get(Wa).onDestroy(()=>{n.destroy(),i.complete()}),i.asObservable()}function Is(t,e){let i=!e?.manualCleanup?e?.injector?.get(Wa)??h(Wa):null,n=urA(e?.equal),o;e?.requireSync?o=jA({kind:0},{equal:n}):o=jA({kind:1,value:e?.initialValue},{equal:n});let a,r=t.subscribe({next:s=>o.set({kind:1,value:s}),error:s=>{o.set({kind:2,error:s}),a?.()},complete:()=>{a?.()}});if(e?.requireSync&&o().kind===0)throw new wt(601,!1);return a=i?.onDestroy(r.unsubscribe.bind(r)),_e(()=>{let s=o();switch(s.kind){case 1:return s.value;case 2:throw s.error;case 0:throw new wt(601,!1)}},{equal:e?.equal})}function urA(t=Object.is){return(e,A)=>e.kind===1&&A.kind===1&&t(e.value,A.value)}function ym(t){return mL(Ve(BA({},t),{loader:void 0,stream:e=>{let A,i=()=>A?.unsubscribe();e.abortSignal.addEventListener(\"abort\",i);let n=jA({value:void 0}),o,a=new Promise(g=>o=g);function r(g){n.set(g),o?.(n),o=void 0}let s=t.stream;if(s===void 0)throw new wt(990,!1);return A=s(e).subscribe({next:g=>r({value:g}),error:g=>{r({error:pL(g)}),e.abortSignal.removeEventListener(\"abort\",i)},complete:()=>{o&&r({error:new wt(991,!1)}),e.abortSignal.removeEventListener(\"abort\",i)}}),a}}))}function U7(){return{async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null}}var TI=U7();function mK(t){TI=t}var YI={exec:()=>null};function bn(t,e=\"\"){let A=typeof t==\"string\"?t:t.source,i={replace:(n,o)=>{let a=typeof o==\"string\"?o:o.source;return a=a.replace(ds.caret,\"$1\"),A=A.replace(n,a),i},getRegex:()=>new RegExp(A,e)};return i}var frA=(()=>{try{return!!new RegExp(\"(?<=1)(?<!1)\")}catch(t){return!1}})(),ds={codeRemoveIndent:/^(?: {1,4}| {0,3}\\t)/gm,outputLinkReplace:/\\\\([\\[\\]])/g,indentCodeCompensation:/^(\\s+)(?:```)/,beginningSpace:/^\\s+/,endingHash:/#$/,startingSpaceChar:/^ /,endingSpaceChar:/ $/,nonSpaceChar:/[^ ]/,newLineCharGlobal:/\\n/g,tabCharGlobal:/\\t/g,multipleSpaceGlobal:/\\s+/g,blankLine:/^[ \\t]*$/,doubleBlankLine:/\\n[ \\t]*\\n[ \\t]*$/,blockquoteStart:/^ {0,3}>/,blockquoteSetextReplace:/\\n {0,3}((?:=+|-+) *)(?=\\n|$)/g,blockquoteSetextReplace2:/^ {0,3}>[ \\t]?/gm,listReplaceNesting:/^ {1,4}(?=( {4})*[^ ])/g,listIsTask:/^\\[[ xX]\\] +\\S/,listReplaceTask:/^\\[[ xX]\\] +/,listTaskCheckbox:/\\[[ xX]\\]/,anyLine:/\\n.*\\n/,hrefBrackets:/^<(.*)>$/,tableDelimiter:/[:|]/,tableAlignChars:/^\\||\\| *$/g,tableRowBlankLine:/\\n[ \\t]*$/,tableAlignRight:/^ *-+: *$/,tableAlignCenter:/^ *:-+: *$/,tableAlignLeft:/^ *:-+ *$/,startATag:/^<a /i,endATag:/^<\\/a>/i,startPreScriptTag:/^<(pre|code|kbd|script)(\\s|>)/i,endPreScriptTag:/^<\\/(pre|code|kbd|script)(\\s|>)/i,startAngleBracket:/^</,endAngleBracket:/>$/,pedanticHrefTitle:/^([^'\"]*[^\\s])\\s+(['\"])(.*)\\2/,unicodeAlphaNumeric:/[\\p{L}\\p{N}]/u,escapeTest:/[&<>\"']/,escapeReplace:/[&<>\"']/g,escapeTestNoEncode:/[<>\"']|&(?!(#\\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\\w+);)/,escapeReplaceNoEncode:/[<>\"']|&(?!(#\\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\\w+);)/g,caret:/(^|[^\\[])\\^/g,percentDecode:/%25/g,findPipe:/\\|/g,splitPipe:/ \\|/,slashPipe:/\\\\\\|/g,carriageReturn:/\\r\\n|\\r/g,spaceLine:/^ +$/gm,notSpaceStart:/^\\S*/,endingNewline:/\\n$/,listItemRegex:t=>new RegExp(`^( {0,3}${t})((?:[\t ][^\\\\n]*)?(?:\\\\n|$))`),nextBulletRegex:t=>new RegExp(`^ {0,${Math.min(3,t-1)}}(?:[*+-]|\\\\d{1,9}[.)])((?:[ \t][^\\\\n]*)?(?:\\\\n|$))`),hrRegex:t=>new RegExp(`^ {0,${Math.min(3,t-1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\\\* *){3,})(?:\\\\n+|$)`),fencesBeginRegex:t=>new RegExp(`^ {0,${Math.min(3,t-1)}}(?:\\`\\`\\`|~~~)`),headingBeginRegex:t=>new RegExp(`^ {0,${Math.min(3,t-1)}}#`),htmlBeginRegex:t=>new RegExp(`^ {0,${Math.min(3,t-1)}}<(?:[a-z].*>|!--)`,\"i\"),blockquoteBeginRegex:t=>new RegExp(`^ {0,${Math.min(3,t-1)}}>`)},mrA=/^(?:[ \\t]*(?:\\n|$))+/,prA=/^((?: {4}| {0,3}\\t)[^\\n]+(?:\\n(?:[ \\t]*(?:\\n|$))*)?)+/,DrA=/^ {0,3}(`{3,}(?=[^`\\n]*(?:\\n|$))|~{3,})([^\\n]*)(?:\\n|$)(?:|([\\s\\S]*?)(?:\\n|$))(?: {0,3}\\1[~`]* *(?=\\n|$)|$)/,Lh=/^ {0,3}((?:-[\\t ]*){3,}|(?:_[ \\t]*){3,}|(?:\\*[ \\t]*){3,})(?:\\n+|$)/,wrA=/^ {0,3}(#{1,6})(?=\\s|$)(.*)(?:\\n+|$)/,J7=/ {0,3}(?:[*+-]|\\d{1,9}[.)])/,pK=/^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\\n(?!\\s*?\\n|bull |blockCode|fences|blockquote|heading|html|table))+?)\\n {0,3}(=+|-+) *(?:\\n+|$)/,DK=bn(pK).replace(/bull/g,J7).replace(/blockCode/g,/(?: {4}| {0,3}\\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\\n>]+>\\n/).replace(/\\|table/g,\"\").getRegex(),yrA=bn(pK).replace(/bull/g,J7).replace(/blockCode/g,/(?: {4}| {0,3}\\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\\n>]+>\\n/).replace(/table/g,/ {0,3}\\|?(?:[:\\- ]*\\|)+[\\:\\- ]*\\n/).getRegex(),Y7=/^([^\\n]+(?:\\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\\n)[^\\n]+)*)/,vrA=/^[^\\n]+/,H7=/(?!\\s*\\])(?:\\\\[\\s\\S]|[^\\[\\]\\\\])+/,brA=bn(/^ {0,3}\\[(label)\\]: *(?:\\n[ \\t]*)?([^<\\s][^\\s]*|<.*?>)(?:(?: +(?:\\n[ \\t]*)?| *\\n[ \\t]*)(title))? *(?:\\n+|$)/).replace(\"label\",H7).replace(\"title\",/(?:\"(?:\\\\\"?|[^\"\\\\])*\"|'[^'\\n]*(?:\\n[^'\\n]+)*\\n?'|\\([^()]*\\))/).getRegex(),MrA=bn(/^(bull)([ \\t][^\\n]+?)?(?:\\n|$)/).replace(/bull/g,J7).getRegex(),km=\"address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul\",T7=/<!--(?:-?>|[\\s\\S]*?(?:-->|$))/,krA=bn(\"^ {0,3}(?:<(script|pre|style|textarea)[\\\\s>][\\\\s\\\\S]*?(?:</\\\\1>[^\\\\n]*\\\\n+|$)|comment[^\\\\n]*(\\\\n+|$)|<\\\\?[\\\\s\\\\S]*?(?:\\\\?>\\\\n*|$)|<![A-Z][\\\\s\\\\S]*?(?:>\\\\n*|$)|<!\\\\[CDATA\\\\[[\\\\s\\\\S]*?(?:\\\\]\\\\]>\\\\n*|$)|</?(tag)(?: +|\\\\n|/?>)[\\\\s\\\\S]*?(?:(?:\\\\n[ \t]*)+\\\\n|$)|<(?!script|pre|style|textarea)([a-z][\\\\w-]*)(?:attribute)*? */?>(?=[ \\\\t]*(?:\\\\n|$))[\\\\s\\\\S]*?(?:(?:\\\\n[ \t]*)+\\\\n|$)|</(?!script|pre|style|textarea)[a-z][\\\\w-]*\\\\s*>(?=[ \\\\t]*(?:\\\\n|$))[\\\\s\\\\S]*?(?:(?:\\\\n[ \t]*)+\\\\n|$))\",\"i\").replace(\"comment\",T7).replace(\"tag\",km).replace(\"attribute\",/ +[a-zA-Z:_][\\w.:-]*(?: *= *\"[^\"\\n]*\"| *= *'[^'\\n]*'| *= *[^\\s\"'=<>`]+)?/).getRegex(),wK=bn(Y7).replace(\"hr\",Lh).replace(\"heading\",\" {0,3}#{1,6}(?:\\\\s|$)\").replace(\"|lheading\",\"\").replace(\"|table\",\"\").replace(\"blockquote\",\" {0,3}>\").replace(\"fences\",\" {0,3}(?:`{3,}(?=[^`\\\\n]*\\\\n)|~{3,})[^\\\\n]*\\\\n\").replace(\"list\",\" {0,3}(?:[*+-]|1[.)])[ \\\\t]\").replace(\"html\",\"</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)\").replace(\"tag\",km).getRegex(),SrA=bn(/^( {0,3}> ?(paragraph|[^\\n]*)(?:\\n|$))+/).replace(\"paragraph\",wK).getRegex(),O7={blockquote:SrA,code:prA,def:brA,fences:DrA,heading:wrA,hr:Lh,html:krA,lheading:DK,list:MrA,newline:mrA,paragraph:wK,table:YI,text:vrA},BK=bn(\"^ *([^\\\\n ].*)\\\\n {0,3}((?:\\\\| *)?:?-+:? *(?:\\\\| *:?-+:? *)*(?:\\\\| *)?)(?:\\\\n((?:(?! *\\\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\\\n|$))*)\\\\n*|$)\").replace(\"hr\",Lh).replace(\"heading\",\" {0,3}#{1,6}(?:\\\\s|$)\").replace(\"blockquote\",\" {0,3}>\").replace(\"code\",\"(?: {4}| {0,3}\t)[^\\\\n]\").replace(\"fences\",\" {0,3}(?:`{3,}(?=[^`\\\\n]*\\\\n)|~{3,})[^\\\\n]*\\\\n\").replace(\"list\",\" {0,3}(?:[*+-]|1[.)])[ \\\\t]\").replace(\"html\",\"</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)\").replace(\"tag\",km).getRegex(),xrA=Ve(BA({},O7),{lheading:yrA,table:BK,paragraph:bn(Y7).replace(\"hr\",Lh).replace(\"heading\",\" {0,3}#{1,6}(?:\\\\s|$)\").replace(\"|lheading\",\"\").replace(\"table\",BK).replace(\"blockquote\",\" {0,3}>\").replace(\"fences\",\" {0,3}(?:`{3,}(?=[^`\\\\n]*\\\\n)|~{3,})[^\\\\n]*\\\\n\").replace(\"list\",\" {0,3}(?:[*+-]|1[.)])[ \\\\t]\").replace(\"html\",\"</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)\").replace(\"tag\",km).getRegex()}),RrA=Ve(BA({},O7),{html:bn(`^ *(?:comment *(?:\\\\n|\\\\s*$)|<(tag)[\\\\s\\\\S]+?</\\\\1> *(?:\\\\n{2,}|\\\\s*$)|<tag(?:\"[^\"]*\"|'[^']*'|\\\\s[^'\"/>\\\\s]*)*?/?> *(?:\\\\n{2,}|\\\\s*$))`).replace(\"comment\",T7).replace(/tag/g,\"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\\\b)\\\\w+(?!:|[^\\\\w\\\\s@]*@)\\\\b\").getRegex(),def:/^ *\\[([^\\]]+)\\]: *<?([^\\s>]+)>?(?: +([\"(][^\\n]+[\")]))? *(?:\\n+|$)/,heading:/^(#{1,6})(.*)(?:\\n+|$)/,fences:YI,lheading:/^(.+?)\\n {0,3}(=+|-+) *(?:\\n+|$)/,paragraph:bn(Y7).replace(\"hr\",Lh).replace(\"heading\",` *#{1,6} *[^\n]`).replace(\"lheading\",DK).replace(\"|table\",\"\").replace(\"blockquote\",\" {0,3}>\").replace(\"|fences\",\"\").replace(\"|list\",\"\").replace(\"|html\",\"\").replace(\"|tag\",\"\").getRegex()}),NrA=/^\\\\([!\"#$%&'()*+,\\-./:;<=>?@\\[\\]\\\\^_`{|}~])/,FrA=/^(`+)([^`]|[^`][\\s\\S]*?[^`])\\1(?!`)/,yK=/^( {2,}|\\\\)\\n(?!\\s*$)/,LrA=/^(`+|[^`])(?:(?= {2,}\\n)|[\\s\\S]*?(?:(?=[\\\\<!\\[`*_]|\\b_|$)|[^ ](?= {2,}\\n)))/,Sm=/[\\p{P}\\p{S}]/u,z7=/[\\s\\p{P}\\p{S}]/u,vK=/[^\\s\\p{P}\\p{S}]/u,_rA=bn(/^((?![*_])punctSpace)/,\"u\").replace(/punctSpace/g,z7).getRegex(),bK=/(?!~)[\\p{P}\\p{S}]/u,GrA=/(?!~)[\\s\\p{P}\\p{S}]/u,KrA=/(?:[^\\s\\p{P}\\p{S}]|~)/u,MK=/(?![*_])[\\p{P}\\p{S}]/u,UrA=/(?![*_])[\\s\\p{P}\\p{S}]/u,JrA=/(?:[^\\s\\p{P}\\p{S}]|[*_])/u,YrA=bn(/link|precode-code|html/,\"g\").replace(\"link\",/\\[(?:[^\\[\\]`]|(?<a>`+)[^`]+\\k<a>(?!`))*?\\]\\((?:\\\\[\\s\\S]|[^\\\\\\(\\)]|\\((?:\\\\[\\s\\S]|[^\\\\\\(\\)])*\\))*\\)/).replace(\"precode-\",frA?\"(?<!`)()\":\"(^^|[^`])\").replace(\"code\",/(?<b>`+)[^`]+\\k<b>(?!`)/).replace(\"html\",/<(?! )[^<>]*?>/).getRegex(),kK=/^(?:\\*+(?:((?!\\*)punct)|[^\\s*]))|^_+(?:((?!_)punct)|([^\\s_]))/,HrA=bn(kK,\"u\").replace(/punct/g,Sm).getRegex(),TrA=bn(kK,\"u\").replace(/punct/g,bK).getRegex(),SK=\"^[^_*]*?__[^_*]*?\\\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\\\*)punct(\\\\*+)(?=[\\\\s]|$)|notPunctSpace(\\\\*+)(?!\\\\*)(?=punctSpace|$)|(?!\\\\*)punctSpace(\\\\*+)(?=notPunctSpace)|[\\\\s](\\\\*+)(?!\\\\*)(?=punct)|(?!\\\\*)punct(\\\\*+)(?!\\\\*)(?=punct)|notPunctSpace(\\\\*+)(?=notPunctSpace)\",OrA=bn(SK,\"gu\").replace(/notPunctSpace/g,vK).replace(/punctSpace/g,z7).replace(/punct/g,Sm).getRegex(),zrA=bn(SK,\"gu\").replace(/notPunctSpace/g,KrA).replace(/punctSpace/g,GrA).replace(/punct/g,bK).getRegex(),PrA=bn(\"^[^_*]*?\\\\*\\\\*[^_*]*?_[^_*]*?(?=\\\\*\\\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)\",\"gu\").replace(/notPunctSpace/g,vK).replace(/punctSpace/g,z7).replace(/punct/g,Sm).getRegex(),jrA=bn(/^~~?(?:((?!~)punct)|[^\\s~])/,\"u\").replace(/punct/g,MK).getRegex(),qrA=\"^[^~]+(?=[^~])|(?!~)punct(~~?)(?=[\\\\s]|$)|notPunctSpace(~~?)(?!~)(?=punctSpace|$)|(?!~)punctSpace(~~?)(?=notPunctSpace)|[\\\\s](~~?)(?!~)(?=punct)|(?!~)punct(~~?)(?!~)(?=punct)|notPunctSpace(~~?)(?=notPunctSpace)\",VrA=bn(qrA,\"gu\").replace(/notPunctSpace/g,JrA).replace(/punctSpace/g,UrA).replace(/punct/g,MK).getRegex(),WrA=bn(/\\\\(punct)/,\"gu\").replace(/punct/g,Sm).getRegex(),ZrA=bn(/^<(scheme:[^\\s\\x00-\\x1f<>]*|email)>/).replace(\"scheme\",/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace(\"email\",/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex(),XrA=bn(T7).replace(\"(?:-->|$)\",\"-->\").getRegex(),$rA=bn(\"^comment|^</[a-zA-Z][\\\\w:-]*\\\\s*>|^<[a-zA-Z][\\\\w-]*(?:attribute)*?\\\\s*/?>|^<\\\\?[\\\\s\\\\S]*?\\\\?>|^<![a-zA-Z]+\\\\s[\\\\s\\\\S]*?>|^<!\\\\[CDATA\\\\[[\\\\s\\\\S]*?\\\\]\\\\]>\").replace(\"comment\",XrA).replace(\"attribute\",/\\s+[a-zA-Z:_][\\w.:-]*(?:\\s*=\\s*\"[^\"]*\"|\\s*=\\s*'[^']*'|\\s*=\\s*[^\\s\"'=<>`]+)?/).getRegex(),bm=/(?:\\[(?:\\\\[\\s\\S]|[^\\[\\]\\\\])*\\]|\\\\[\\s\\S]|`+[^`]*?`+(?!`)|[^\\[\\]\\\\`])*?/,AsA=bn(/^!?\\[(label)\\]\\(\\s*(href)(?:(?:[ \\t]+(?:\\n[ \\t]*)?|\\n[ \\t]*)(title))?\\s*\\)/).replace(\"label\",bm).replace(\"href\",/<(?:\\\\.|[^\\n<>\\\\])+>|[^ \\t\\n\\x00-\\x1f]*/).replace(\"title\",/\"(?:\\\\\"?|[^\"\\\\])*\"|'(?:\\\\'?|[^'\\\\])*'|\\((?:\\\\\\)?|[^)\\\\])*\\)/).getRegex(),xK=bn(/^!?\\[(label)\\]\\[(ref)\\]/).replace(\"label\",bm).replace(\"ref\",H7).getRegex(),RK=bn(/^!?\\[(ref)\\](?:\\[\\])?/).replace(\"ref\",H7).getRegex(),esA=bn(\"reflink|nolink(?!\\\\()\",\"g\").replace(\"reflink\",xK).replace(\"nolink\",RK).getRegex(),QK=/[hH][tT][tT][pP][sS]?|[fF][tT][pP]/,P7={_backpedal:YI,anyPunctuation:WrA,autolink:ZrA,blockSkip:YrA,br:yK,code:FrA,del:YI,delLDelim:YI,delRDelim:YI,emStrongLDelim:HrA,emStrongRDelimAst:OrA,emStrongRDelimUnd:PrA,escape:NrA,link:AsA,nolink:RK,punctuation:_rA,reflink:xK,reflinkSearch:esA,tag:$rA,text:LrA,url:YI},tsA=Ve(BA({},P7),{link:bn(/^!?\\[(label)\\]\\((.*?)\\)/).replace(\"label\",bm).getRegex(),reflink:bn(/^!?\\[(label)\\]\\s*\\[([^\\]]*)\\]/).replace(\"label\",bm).getRegex()}),_7=Ve(BA({},P7),{emStrongRDelimAst:zrA,emStrongLDelim:TrA,delLDelim:jrA,delRDelim:VrA,url:bn(/^((?:protocol):\\/\\/|www\\.)(?:[a-zA-Z0-9\\-]+\\.?)+[^\\s<]*|^email/).replace(\"protocol\",QK).replace(\"email\",/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/).getRegex(),_backpedal:/(?:[^?!.,:;*_'\"~()&]+|\\([^)]*\\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'\"~)]+(?!$))+/,del:/^(~~?)(?=[^\\s~])((?:\\\\[\\s\\S]|[^\\\\])*?(?:\\\\[\\s\\S]|[^\\s~\\\\]))\\1(?=[^~]|$)/,text:bn(/^([`~]+|[^`~])(?:(?= {2,}\\n)|(?=[a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-]+@)|[\\s\\S]*?(?:(?=[\\\\<!\\[`*~_]|\\b_|protocol:\\/\\/|www\\.|$)|[^ ](?= {2,}\\n)|[^a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-](?=[a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-]+@)))/).replace(\"protocol\",QK).getRegex()}),isA=Ve(BA({},_7),{br:bn(yK).replace(\"{2,}\",\"*\").getRegex(),text:bn(_7.text).replace(\"\\\\b_\",\"\\\\b_| {2,}\\\\n\").replace(/\\{2,\\}/g,\"*\").getRegex()}),vm={normal:O7,gfm:xrA,pedantic:RrA},Rh={normal:P7,gfm:_7,breaks:isA,pedantic:tsA},nsA={\"&\":\"&amp;\",\"<\":\"&lt;\",\">\":\"&gt;\",'\"':\"&quot;\",\"'\":\"&#39;\"},EK=t=>nsA[t];function Sc(t,e){if(e){if(ds.escapeTest.test(t))return t.replace(ds.escapeReplace,EK)}else if(ds.escapeTestNoEncode.test(t))return t.replace(ds.escapeReplaceNoEncode,EK);return t}function hK(t){try{t=encodeURI(t).replace(ds.percentDecode,\"%\")}catch(e){return null}return t}function uK(t,e){let A=t.replace(ds.findPipe,(o,a,r)=>{let s=!1,g=a;for(;--g>=0&&r[g]===\"\\\\\";)s=!s;return s?\"|\":\" |\"}),i=A.split(ds.splitPipe),n=0;if(i[0].trim()||i.shift(),i.length>0&&!i.at(-1)?.trim()&&i.pop(),e)if(i.length>e)i.splice(e);else for(;i.length<e;)i.push(\"\");for(;n<i.length;n++)i[n]=i[n].trim().replace(ds.slashPipe,\"|\");return i}function Nh(t,e,A){let i=t.length;if(i===0)return\"\";let n=0;for(;n<i;){let o=t.charAt(i-n-1);if(o===e&&!A)n++;else if(o!==e&&A)n++;else break}return t.slice(0,i-n)}function osA(t,e){if(t.indexOf(e[1])===-1)return-1;let A=0;for(let i=0;i<t.length;i++)if(t[i]===\"\\\\\")i++;else if(t[i]===e[0])A++;else if(t[i]===e[1]&&(A--,A<0))return i;return A>0?-2:-1}function asA(t,e=0){let A=e,i=\"\";for(let n of t)if(n===\"\t\"){let o=4-A%4;i+=\" \".repeat(o),A+=o}else i+=n,A++;return i}function fK(t,e,A,i,n){let o=e.href,a=e.title||null,r=t[1].replace(n.other.outputLinkReplace,\"$1\");i.state.inLink=!0;let s={type:t[0].charAt(0)===\"!\"?\"image\":\"link\",raw:A,href:o,title:a,text:r,tokens:i.inlineTokens(r)};return i.state.inLink=!1,s}function rsA(t,e,A){let i=t.match(A.other.indentCodeCompensation);if(i===null)return e;let n=i[1];return e.split(`\n`).map(o=>{let a=o.match(A.other.beginningSpace);if(a===null)return o;let[r]=a;return r.length>=n.length?o.slice(n.length):o}).join(`\n`)}var Mm=class{options;rules;lexer;constructor(t){this.options=t||TI}space(t){let e=this.rules.block.newline.exec(t);if(e&&e[0].length>0)return{type:\"space\",raw:e[0]}}code(t){let e=this.rules.block.code.exec(t);if(e){let A=e[0].replace(this.rules.other.codeRemoveIndent,\"\");return{type:\"code\",raw:e[0],codeBlockStyle:\"indented\",text:this.options.pedantic?A:Nh(A,`\n`)}}}fences(t){let e=this.rules.block.fences.exec(t);if(e){let A=e[0],i=rsA(A,e[3]||\"\",this.rules);return{type:\"code\",raw:A,lang:e[2]?e[2].trim().replace(this.rules.inline.anyPunctuation,\"$1\"):e[2],text:i}}}heading(t){let e=this.rules.block.heading.exec(t);if(e){let A=e[2].trim();if(this.rules.other.endingHash.test(A)){let i=Nh(A,\"#\");(this.options.pedantic||!i||this.rules.other.endingSpaceChar.test(i))&&(A=i.trim())}return{type:\"heading\",raw:e[0],depth:e[1].length,text:A,tokens:this.lexer.inline(A)}}}hr(t){let e=this.rules.block.hr.exec(t);if(e)return{type:\"hr\",raw:Nh(e[0],`\n`)}}blockquote(t){let e=this.rules.block.blockquote.exec(t);if(e){let A=Nh(e[0],`\n`).split(`\n`),i=\"\",n=\"\",o=[];for(;A.length>0;){let a=!1,r=[],s;for(s=0;s<A.length;s++)if(this.rules.other.blockquoteStart.test(A[s]))r.push(A[s]),a=!0;else if(!a)r.push(A[s]);else break;A=A.slice(s);let g=r.join(`\n`),l=g.replace(this.rules.other.blockquoteSetextReplace,`\n    $1`).replace(this.rules.other.blockquoteSetextReplace2,\"\");i=i?`${i}\n${g}`:g,n=n?`${n}\n${l}`:l;let C=this.lexer.state.top;if(this.lexer.state.top=!0,this.lexer.blockTokens(l,o,!0),this.lexer.state.top=C,A.length===0)break;let I=o.at(-1);if(I?.type===\"code\")break;if(I?.type===\"blockquote\"){let d=I,B=d.raw+`\n`+A.join(`\n`),Q=this.blockquote(B);o[o.length-1]=Q,i=i.substring(0,i.length-d.raw.length)+Q.raw,n=n.substring(0,n.length-d.text.length)+Q.text;break}else if(I?.type===\"list\"){let d=I,B=d.raw+`\n`+A.join(`\n`),Q=this.list(B);o[o.length-1]=Q,i=i.substring(0,i.length-I.raw.length)+Q.raw,n=n.substring(0,n.length-d.raw.length)+Q.raw,A=B.substring(o.at(-1).raw.length).split(`\n`);continue}}return{type:\"blockquote\",raw:i,tokens:o,text:n}}}list(t){let e=this.rules.block.list.exec(t);if(e){let A=e[1].trim(),i=A.length>1,n={type:\"list\",raw:\"\",ordered:i,start:i?+A.slice(0,-1):\"\",loose:!1,items:[]};A=i?`\\\\d{1,9}\\\\${A.slice(-1)}`:`\\\\${A}`,this.options.pedantic&&(A=i?A:\"[*+-]\");let o=this.rules.other.listItemRegex(A),a=!1;for(;t;){let s=!1,g=\"\",l=\"\";if(!(e=o.exec(t))||this.rules.block.hr.test(t))break;g=e[0],t=t.substring(g.length);let C=asA(e[2].split(`\n`,1)[0],e[1].length),I=t.split(`\n`,1)[0],d=!C.trim(),B=0;if(this.options.pedantic?(B=2,l=C.trimStart()):d?B=e[1].length+1:(B=C.search(this.rules.other.nonSpaceChar),B=B>4?1:B,l=C.slice(B),B+=e[1].length),d&&this.rules.other.blankLine.test(I)&&(g+=I+`\n`,t=t.substring(I.length+1),s=!0),!s){let Q=this.rules.other.nextBulletRegex(B),E=this.rules.other.hrRegex(B),f=this.rules.other.fencesBeginRegex(B),b=this.rules.other.headingBeginRegex(B),R=this.rules.other.htmlBeginRegex(B),M=this.rules.other.blockquoteBeginRegex(B);for(;t;){let v=t.split(`\n`,1)[0],F;if(I=v,this.options.pedantic?(I=I.replace(this.rules.other.listReplaceNesting,\"  \"),F=I):F=I.replace(this.rules.other.tabCharGlobal,\"    \"),f.test(I)||b.test(I)||R.test(I)||M.test(I)||Q.test(I)||E.test(I))break;if(F.search(this.rules.other.nonSpaceChar)>=B||!I.trim())l+=`\n`+F.slice(B);else{if(d||C.replace(this.rules.other.tabCharGlobal,\"    \").search(this.rules.other.nonSpaceChar)>=4||f.test(C)||b.test(C)||E.test(C))break;l+=`\n`+I}d=!I.trim(),g+=v+`\n`,t=t.substring(v.length+1),C=F.slice(B)}}n.loose||(a?n.loose=!0:this.rules.other.doubleBlankLine.test(g)&&(a=!0)),n.items.push({type:\"list_item\",raw:g,task:!!this.options.gfm&&this.rules.other.listIsTask.test(l),loose:!1,text:l,tokens:[]}),n.raw+=g}let r=n.items.at(-1);if(r)r.raw=r.raw.trimEnd(),r.text=r.text.trimEnd();else return;n.raw=n.raw.trimEnd();for(let s of n.items){if(this.lexer.state.top=!1,s.tokens=this.lexer.blockTokens(s.text,[]),s.task){if(s.text=s.text.replace(this.rules.other.listReplaceTask,\"\"),s.tokens[0]?.type===\"text\"||s.tokens[0]?.type===\"paragraph\"){s.tokens[0].raw=s.tokens[0].raw.replace(this.rules.other.listReplaceTask,\"\"),s.tokens[0].text=s.tokens[0].text.replace(this.rules.other.listReplaceTask,\"\");for(let l=this.lexer.inlineQueue.length-1;l>=0;l--)if(this.rules.other.listIsTask.test(this.lexer.inlineQueue[l].src)){this.lexer.inlineQueue[l].src=this.lexer.inlineQueue[l].src.replace(this.rules.other.listReplaceTask,\"\");break}}let g=this.rules.other.listTaskCheckbox.exec(s.raw);if(g){let l={type:\"checkbox\",raw:g[0]+\" \",checked:g[0]!==\"[ ]\"};s.checked=l.checked,n.loose?s.tokens[0]&&[\"paragraph\",\"text\"].includes(s.tokens[0].type)&&\"tokens\"in s.tokens[0]&&s.tokens[0].tokens?(s.tokens[0].raw=l.raw+s.tokens[0].raw,s.tokens[0].text=l.raw+s.tokens[0].text,s.tokens[0].tokens.unshift(l)):s.tokens.unshift({type:\"paragraph\",raw:l.raw,text:l.raw,tokens:[l]}):s.tokens.unshift(l)}}if(!n.loose){let g=s.tokens.filter(C=>C.type===\"space\"),l=g.length>0&&g.some(C=>this.rules.other.anyLine.test(C.raw));n.loose=l}}if(n.loose)for(let s of n.items){s.loose=!0;for(let g of s.tokens)g.type===\"text\"&&(g.type=\"paragraph\")}return n}}html(t){let e=this.rules.block.html.exec(t);if(e)return{type:\"html\",block:!0,raw:e[0],pre:e[1]===\"pre\"||e[1]===\"script\"||e[1]===\"style\",text:e[0]}}def(t){let e=this.rules.block.def.exec(t);if(e){let A=e[1].toLowerCase().replace(this.rules.other.multipleSpaceGlobal,\" \"),i=e[2]?e[2].replace(this.rules.other.hrefBrackets,\"$1\").replace(this.rules.inline.anyPunctuation,\"$1\"):\"\",n=e[3]?e[3].substring(1,e[3].length-1).replace(this.rules.inline.anyPunctuation,\"$1\"):e[3];return{type:\"def\",tag:A,raw:e[0],href:i,title:n}}}table(t){let e=this.rules.block.table.exec(t);if(!e||!this.rules.other.tableDelimiter.test(e[2]))return;let A=uK(e[1]),i=e[2].replace(this.rules.other.tableAlignChars,\"\").split(\"|\"),n=e[3]?.trim()?e[3].replace(this.rules.other.tableRowBlankLine,\"\").split(`\n`):[],o={type:\"table\",raw:e[0],header:[],align:[],rows:[]};if(A.length===i.length){for(let a of i)this.rules.other.tableAlignRight.test(a)?o.align.push(\"right\"):this.rules.other.tableAlignCenter.test(a)?o.align.push(\"center\"):this.rules.other.tableAlignLeft.test(a)?o.align.push(\"left\"):o.align.push(null);for(let a=0;a<A.length;a++)o.header.push({text:A[a],tokens:this.lexer.inline(A[a]),header:!0,align:o.align[a]});for(let a of n)o.rows.push(uK(a,o.header.length).map((r,s)=>({text:r,tokens:this.lexer.inline(r),header:!1,align:o.align[s]})));return o}}lheading(t){let e=this.rules.block.lheading.exec(t);if(e)return{type:\"heading\",raw:e[0],depth:e[2].charAt(0)===\"=\"?1:2,text:e[1],tokens:this.lexer.inline(e[1])}}paragraph(t){let e=this.rules.block.paragraph.exec(t);if(e){let A=e[1].charAt(e[1].length-1)===`\n`?e[1].slice(0,-1):e[1];return{type:\"paragraph\",raw:e[0],text:A,tokens:this.lexer.inline(A)}}}text(t){let e=this.rules.block.text.exec(t);if(e)return{type:\"text\",raw:e[0],text:e[0],tokens:this.lexer.inline(e[0])}}escape(t){let e=this.rules.inline.escape.exec(t);if(e)return{type:\"escape\",raw:e[0],text:e[1]}}tag(t){let e=this.rules.inline.tag.exec(t);if(e)return!this.lexer.state.inLink&&this.rules.other.startATag.test(e[0])?this.lexer.state.inLink=!0:this.lexer.state.inLink&&this.rules.other.endATag.test(e[0])&&(this.lexer.state.inLink=!1),!this.lexer.state.inRawBlock&&this.rules.other.startPreScriptTag.test(e[0])?this.lexer.state.inRawBlock=!0:this.lexer.state.inRawBlock&&this.rules.other.endPreScriptTag.test(e[0])&&(this.lexer.state.inRawBlock=!1),{type:\"html\",raw:e[0],inLink:this.lexer.state.inLink,inRawBlock:this.lexer.state.inRawBlock,block:!1,text:e[0]}}link(t){let e=this.rules.inline.link.exec(t);if(e){let A=e[2].trim();if(!this.options.pedantic&&this.rules.other.startAngleBracket.test(A)){if(!this.rules.other.endAngleBracket.test(A))return;let o=Nh(A.slice(0,-1),\"\\\\\");if((A.length-o.length)%2===0)return}else{let o=osA(e[2],\"()\");if(o===-2)return;if(o>-1){let a=(e[0].indexOf(\"!\")===0?5:4)+e[1].length+o;e[2]=e[2].substring(0,o),e[0]=e[0].substring(0,a).trim(),e[3]=\"\"}}let i=e[2],n=\"\";if(this.options.pedantic){let o=this.rules.other.pedanticHrefTitle.exec(i);o&&(i=o[1],n=o[3])}else n=e[3]?e[3].slice(1,-1):\"\";return i=i.trim(),this.rules.other.startAngleBracket.test(i)&&(this.options.pedantic&&!this.rules.other.endAngleBracket.test(A)?i=i.slice(1):i=i.slice(1,-1)),fK(e,{href:i&&i.replace(this.rules.inline.anyPunctuation,\"$1\"),title:n&&n.replace(this.rules.inline.anyPunctuation,\"$1\")},e[0],this.lexer,this.rules)}}reflink(t,e){let A;if((A=this.rules.inline.reflink.exec(t))||(A=this.rules.inline.nolink.exec(t))){let i=(A[2]||A[1]).replace(this.rules.other.multipleSpaceGlobal,\" \"),n=e[i.toLowerCase()];if(!n){let o=A[0].charAt(0);return{type:\"text\",raw:o,text:o}}return fK(A,n,A[0],this.lexer,this.rules)}}emStrong(t,e,A=\"\"){let i=this.rules.inline.emStrongLDelim.exec(t);if(!(!i||i[3]&&A.match(this.rules.other.unicodeAlphaNumeric))&&(!(i[1]||i[2])||!A||this.rules.inline.punctuation.exec(A))){let n=[...i[0]].length-1,o,a,r=n,s=0,g=i[0][0]===\"*\"?this.rules.inline.emStrongRDelimAst:this.rules.inline.emStrongRDelimUnd;for(g.lastIndex=0,e=e.slice(-1*t.length+n);(i=g.exec(e))!=null;){if(o=i[1]||i[2]||i[3]||i[4]||i[5]||i[6],!o)continue;if(a=[...o].length,i[3]||i[4]){r+=a;continue}else if((i[5]||i[6])&&n%3&&!((n+a)%3)){s+=a;continue}if(r-=a,r>0)continue;a=Math.min(a,a+r+s);let l=[...i[0]][0].length,C=t.slice(0,n+i.index+l+a);if(Math.min(n,a)%2){let d=C.slice(1,-1);return{type:\"em\",raw:C,text:d,tokens:this.lexer.inlineTokens(d)}}let I=C.slice(2,-2);return{type:\"strong\",raw:C,text:I,tokens:this.lexer.inlineTokens(I)}}}}codespan(t){let e=this.rules.inline.code.exec(t);if(e){let A=e[2].replace(this.rules.other.newLineCharGlobal,\" \"),i=this.rules.other.nonSpaceChar.test(A),n=this.rules.other.startingSpaceChar.test(A)&&this.rules.other.endingSpaceChar.test(A);return i&&n&&(A=A.substring(1,A.length-1)),{type:\"codespan\",raw:e[0],text:A}}}br(t){let e=this.rules.inline.br.exec(t);if(e)return{type:\"br\",raw:e[0]}}del(t,e,A=\"\"){let i=this.rules.inline.delLDelim.exec(t);if(i&&(!i[1]||!A||this.rules.inline.punctuation.exec(A))){let n=[...i[0]].length-1,o,a,r=n,s=this.rules.inline.delRDelim;for(s.lastIndex=0,e=e.slice(-1*t.length+n);(i=s.exec(e))!=null;){if(o=i[1]||i[2]||i[3]||i[4]||i[5]||i[6],!o||(a=[...o].length,a!==n))continue;if(i[3]||i[4]){r+=a;continue}if(r-=a,r>0)continue;a=Math.min(a,a+r);let g=[...i[0]][0].length,l=t.slice(0,n+i.index+g+a),C=l.slice(n,-n);return{type:\"del\",raw:l,text:C,tokens:this.lexer.inlineTokens(C)}}}}autolink(t){let e=this.rules.inline.autolink.exec(t);if(e){let A,i;return e[2]===\"@\"?(A=e[1],i=\"mailto:\"+A):(A=e[1],i=A),{type:\"link\",raw:e[0],text:A,href:i,tokens:[{type:\"text\",raw:A,text:A}]}}}url(t){let e;if(e=this.rules.inline.url.exec(t)){let A,i;if(e[2]===\"@\")A=e[0],i=\"mailto:\"+A;else{let n;do n=e[0],e[0]=this.rules.inline._backpedal.exec(e[0])?.[0]??\"\";while(n!==e[0]);A=e[0],e[1]===\"www.\"?i=\"http://\"+e[0]:i=e[0]}return{type:\"link\",raw:e[0],text:A,href:i,tokens:[{type:\"text\",raw:A,text:A}]}}}inlineText(t){let e=this.rules.inline.text.exec(t);if(e){let A=this.lexer.state.inRawBlock;return{type:\"text\",raw:e[0],text:e[0],escaped:A}}}},vl=class G7{tokens;options;state;inlineQueue;tokenizer;constructor(e){this.tokens=[],this.tokens.links=Object.create(null),this.options=e||TI,this.options.tokenizer=this.options.tokenizer||new Mm,this.tokenizer=this.options.tokenizer,this.tokenizer.options=this.options,this.tokenizer.lexer=this,this.inlineQueue=[],this.state={inLink:!1,inRawBlock:!1,top:!0};let A={other:ds,block:vm.normal,inline:Rh.normal};this.options.pedantic?(A.block=vm.pedantic,A.inline=Rh.pedantic):this.options.gfm&&(A.block=vm.gfm,this.options.breaks?A.inline=Rh.breaks:A.inline=Rh.gfm),this.tokenizer.rules=A}static get rules(){return{block:vm,inline:Rh}}static lex(e,A){return new G7(A).lex(e)}static lexInline(e,A){return new G7(A).inlineTokens(e)}lex(e){e=e.replace(ds.carriageReturn,`\n`),this.blockTokens(e,this.tokens);for(let A=0;A<this.inlineQueue.length;A++){let i=this.inlineQueue[A];this.inlineTokens(i.src,i.tokens)}return this.inlineQueue=[],this.tokens}blockTokens(e,A=[],i=!1){for(this.options.pedantic&&(e=e.replace(ds.tabCharGlobal,\"    \").replace(ds.spaceLine,\"\"));e;){let n;if(this.options.extensions?.block?.some(a=>(n=a.call({lexer:this},e,A))?(e=e.substring(n.raw.length),A.push(n),!0):!1))continue;if(n=this.tokenizer.space(e)){e=e.substring(n.raw.length);let a=A.at(-1);n.raw.length===1&&a!==void 0?a.raw+=`\n`:A.push(n);continue}if(n=this.tokenizer.code(e)){e=e.substring(n.raw.length);let a=A.at(-1);a?.type===\"paragraph\"||a?.type===\"text\"?(a.raw+=(a.raw.endsWith(`\n`)?\"\":`\n`)+n.raw,a.text+=`\n`+n.text,this.inlineQueue.at(-1).src=a.text):A.push(n);continue}if(n=this.tokenizer.fences(e)){e=e.substring(n.raw.length),A.push(n);continue}if(n=this.tokenizer.heading(e)){e=e.substring(n.raw.length),A.push(n);continue}if(n=this.tokenizer.hr(e)){e=e.substring(n.raw.length),A.push(n);continue}if(n=this.tokenizer.blockquote(e)){e=e.substring(n.raw.length),A.push(n);continue}if(n=this.tokenizer.list(e)){e=e.substring(n.raw.length),A.push(n);continue}if(n=this.tokenizer.html(e)){e=e.substring(n.raw.length),A.push(n);continue}if(n=this.tokenizer.def(e)){e=e.substring(n.raw.length);let a=A.at(-1);a?.type===\"paragraph\"||a?.type===\"text\"?(a.raw+=(a.raw.endsWith(`\n`)?\"\":`\n`)+n.raw,a.text+=`\n`+n.raw,this.inlineQueue.at(-1).src=a.text):this.tokens.links[n.tag]||(this.tokens.links[n.tag]={href:n.href,title:n.title},A.push(n));continue}if(n=this.tokenizer.table(e)){e=e.substring(n.raw.length),A.push(n);continue}if(n=this.tokenizer.lheading(e)){e=e.substring(n.raw.length),A.push(n);continue}let o=e;if(this.options.extensions?.startBlock){let a=1/0,r=e.slice(1),s;this.options.extensions.startBlock.forEach(g=>{s=g.call({lexer:this},r),typeof s==\"number\"&&s>=0&&(a=Math.min(a,s))}),a<1/0&&a>=0&&(o=e.substring(0,a+1))}if(this.state.top&&(n=this.tokenizer.paragraph(o))){let a=A.at(-1);i&&a?.type===\"paragraph\"?(a.raw+=(a.raw.endsWith(`\n`)?\"\":`\n`)+n.raw,a.text+=`\n`+n.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=a.text):A.push(n),i=o.length!==e.length,e=e.substring(n.raw.length);continue}if(n=this.tokenizer.text(e)){e=e.substring(n.raw.length);let a=A.at(-1);a?.type===\"text\"?(a.raw+=(a.raw.endsWith(`\n`)?\"\":`\n`)+n.raw,a.text+=`\n`+n.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=a.text):A.push(n);continue}if(e){let a=\"Infinite loop on byte: \"+e.charCodeAt(0);if(this.options.silent){console.error(a);break}else throw new Error(a)}}return this.state.top=!0,A}inline(e,A=[]){return this.inlineQueue.push({src:e,tokens:A}),A}inlineTokens(e,A=[]){let i=e,n=null;if(this.tokens.links){let s=Object.keys(this.tokens.links);if(s.length>0)for(;(n=this.tokenizer.rules.inline.reflinkSearch.exec(i))!=null;)s.includes(n[0].slice(n[0].lastIndexOf(\"[\")+1,-1))&&(i=i.slice(0,n.index)+\"[\"+\"a\".repeat(n[0].length-2)+\"]\"+i.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex))}for(;(n=this.tokenizer.rules.inline.anyPunctuation.exec(i))!=null;)i=i.slice(0,n.index)+\"++\"+i.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex);let o;for(;(n=this.tokenizer.rules.inline.blockSkip.exec(i))!=null;)o=n[2]?n[2].length:0,i=i.slice(0,n.index+o)+\"[\"+\"a\".repeat(n[0].length-o-2)+\"]\"+i.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);i=this.options.hooks?.emStrongMask?.call({lexer:this},i)??i;let a=!1,r=\"\";for(;e;){a||(r=\"\"),a=!1;let s;if(this.options.extensions?.inline?.some(l=>(s=l.call({lexer:this},e,A))?(e=e.substring(s.raw.length),A.push(s),!0):!1))continue;if(s=this.tokenizer.escape(e)){e=e.substring(s.raw.length),A.push(s);continue}if(s=this.tokenizer.tag(e)){e=e.substring(s.raw.length),A.push(s);continue}if(s=this.tokenizer.link(e)){e=e.substring(s.raw.length),A.push(s);continue}if(s=this.tokenizer.reflink(e,this.tokens.links)){e=e.substring(s.raw.length);let l=A.at(-1);s.type===\"text\"&&l?.type===\"text\"?(l.raw+=s.raw,l.text+=s.text):A.push(s);continue}if(s=this.tokenizer.emStrong(e,i,r)){e=e.substring(s.raw.length),A.push(s);continue}if(s=this.tokenizer.codespan(e)){e=e.substring(s.raw.length),A.push(s);continue}if(s=this.tokenizer.br(e)){e=e.substring(s.raw.length),A.push(s);continue}if(s=this.tokenizer.del(e,i,r)){e=e.substring(s.raw.length),A.push(s);continue}if(s=this.tokenizer.autolink(e)){e=e.substring(s.raw.length),A.push(s);continue}if(!this.state.inLink&&(s=this.tokenizer.url(e))){e=e.substring(s.raw.length),A.push(s);continue}let g=e;if(this.options.extensions?.startInline){let l=1/0,C=e.slice(1),I;this.options.extensions.startInline.forEach(d=>{I=d.call({lexer:this},C),typeof I==\"number\"&&I>=0&&(l=Math.min(l,I))}),l<1/0&&l>=0&&(g=e.substring(0,l+1))}if(s=this.tokenizer.inlineText(g)){e=e.substring(s.raw.length),s.raw.slice(-1)!==\"_\"&&(r=s.raw.slice(-1)),a=!0;let l=A.at(-1);l?.type===\"text\"?(l.raw+=s.raw,l.text+=s.text):A.push(s);continue}if(e){let l=\"Infinite loop on byte: \"+e.charCodeAt(0);if(this.options.silent){console.error(l);break}else throw new Error(l)}}return A}},TC=class{options;parser;constructor(t){this.options=t||TI}space(t){return\"\"}code({text:t,lang:e,escaped:A}){let i=(e||\"\").match(ds.notSpaceStart)?.[0],n=t.replace(ds.endingNewline,\"\")+`\n`;return i?'<pre><code class=\"language-'+Sc(i)+'\">'+(A?n:Sc(n,!0))+`</code></pre>\n`:\"<pre><code>\"+(A?n:Sc(n,!0))+`</code></pre>\n`}blockquote({tokens:t}){return`<blockquote>\n${this.parser.parse(t)}</blockquote>\n`}html({text:t}){return t}def(t){return\"\"}heading({tokens:t,depth:e}){return`<h${e}>${this.parser.parseInline(t)}</h${e}>\n`}hr(t){return`<hr>\n`}list(t){let e=t.ordered,A=t.start,i=\"\";for(let a=0;a<t.items.length;a++){let r=t.items[a];i+=this.listitem(r)}let n=e?\"ol\":\"ul\",o=e&&A!==1?' start=\"'+A+'\"':\"\";return\"<\"+n+o+`>\n`+i+\"</\"+n+`>\n`}listitem(t){return`<li>${this.parser.parse(t.tokens)}</li>\n`}checkbox({checked:t}){return\"<input \"+(t?'checked=\"\" ':\"\")+'disabled=\"\" type=\"checkbox\"> '}paragraph({tokens:t}){return`<p>${this.parser.parseInline(t)}</p>\n`}table(t){let e=\"\",A=\"\";for(let n=0;n<t.header.length;n++)A+=this.tablecell(t.header[n]);e+=this.tablerow({text:A});let i=\"\";for(let n=0;n<t.rows.length;n++){let o=t.rows[n];A=\"\";for(let a=0;a<o.length;a++)A+=this.tablecell(o[a]);i+=this.tablerow({text:A})}return i&&(i=`<tbody>${i}</tbody>`),`<table>\n<thead>\n`+e+`</thead>\n`+i+`</table>\n`}tablerow({text:t}){return`<tr>\n${t}</tr>\n`}tablecell(t){let e=this.parser.parseInline(t.tokens),A=t.header?\"th\":\"td\";return(t.align?`<${A} align=\"${t.align}\">`:`<${A}>`)+e+`</${A}>\n`}strong({tokens:t}){return`<strong>${this.parser.parseInline(t)}</strong>`}em({tokens:t}){return`<em>${this.parser.parseInline(t)}</em>`}codespan({text:t}){return`<code>${Sc(t,!0)}</code>`}br(t){return\"<br>\"}del({tokens:t}){return`<del>${this.parser.parseInline(t)}</del>`}link({href:t,title:e,tokens:A}){let i=this.parser.parseInline(A),n=hK(t);if(n===null)return i;t=n;let o='<a href=\"'+t+'\"';return e&&(o+=' title=\"'+Sc(e)+'\"'),o+=\">\"+i+\"</a>\",o}image({href:t,title:e,text:A,tokens:i}){i&&(A=this.parser.parseInline(i,this.parser.textRenderer));let n=hK(t);if(n===null)return Sc(A);t=n;let o=`<img src=\"${t}\" alt=\"${Sc(A)}\"`;return e&&(o+=` title=\"${Sc(e)}\"`),o+=\">\",o}text(t){return\"tokens\"in t&&t.tokens?this.parser.parseInline(t.tokens):\"escaped\"in t&&t.escaped?t.text:Sc(t.text)}},j7=class{strong({text:t}){return t}em({text:t}){return t}codespan({text:t}){return t}del({text:t}){return t}html({text:t}){return t}text({text:t}){return t}link({text:t}){return\"\"+t}image({text:t}){return\"\"+t}br(){return\"\"}checkbox({raw:t}){return t}},bl=class K7{options;renderer;textRenderer;constructor(e){this.options=e||TI,this.options.renderer=this.options.renderer||new TC,this.renderer=this.options.renderer,this.renderer.options=this.options,this.renderer.parser=this,this.textRenderer=new j7}static parse(e,A){return new K7(A).parse(e)}static parseInline(e,A){return new K7(A).parseInline(e)}parse(e){let A=\"\";for(let i=0;i<e.length;i++){let n=e[i];if(this.options.extensions?.renderers?.[n.type]){let a=n,r=this.options.extensions.renderers[a.type].call({parser:this},a);if(r!==!1||![\"space\",\"hr\",\"heading\",\"code\",\"table\",\"blockquote\",\"list\",\"html\",\"def\",\"paragraph\",\"text\"].includes(a.type)){A+=r||\"\";continue}}let o=n;switch(o.type){case\"space\":{A+=this.renderer.space(o);break}case\"hr\":{A+=this.renderer.hr(o);break}case\"heading\":{A+=this.renderer.heading(o);break}case\"code\":{A+=this.renderer.code(o);break}case\"table\":{A+=this.renderer.table(o);break}case\"blockquote\":{A+=this.renderer.blockquote(o);break}case\"list\":{A+=this.renderer.list(o);break}case\"checkbox\":{A+=this.renderer.checkbox(o);break}case\"html\":{A+=this.renderer.html(o);break}case\"def\":{A+=this.renderer.def(o);break}case\"paragraph\":{A+=this.renderer.paragraph(o);break}case\"text\":{A+=this.renderer.text(o);break}default:{let a='Token with \"'+o.type+'\" type was not found.';if(this.options.silent)return console.error(a),\"\";throw new Error(a)}}}return A}parseInline(e,A=this.renderer){let i=\"\";for(let n=0;n<e.length;n++){let o=e[n];if(this.options.extensions?.renderers?.[o.type]){let r=this.options.extensions.renderers[o.type].call({parser:this},o);if(r!==!1||![\"escape\",\"html\",\"link\",\"image\",\"strong\",\"em\",\"codespan\",\"br\",\"del\",\"text\"].includes(o.type)){i+=r||\"\";continue}}let a=o;switch(a.type){case\"escape\":{i+=A.text(a);break}case\"html\":{i+=A.html(a);break}case\"link\":{i+=A.link(a);break}case\"image\":{i+=A.image(a);break}case\"checkbox\":{i+=A.checkbox(a);break}case\"strong\":{i+=A.strong(a);break}case\"em\":{i+=A.em(a);break}case\"codespan\":{i+=A.codespan(a);break}case\"br\":{i+=A.br(a);break}case\"del\":{i+=A.del(a);break}case\"text\":{i+=A.text(a);break}default:{let r='Token with \"'+a.type+'\" type was not found.';if(this.options.silent)return console.error(r),\"\";throw new Error(r)}}}return i}},Fh=class{options;block;constructor(t){this.options=t||TI}static passThroughHooks=new Set([\"preprocess\",\"postprocess\",\"processAllTokens\",\"emStrongMask\"]);static passThroughHooksRespectAsync=new Set([\"preprocess\",\"postprocess\",\"processAllTokens\"]);preprocess(t){return t}postprocess(t){return t}processAllTokens(t){return t}emStrongMask(t){return t}provideLexer(){return this.block?vl.lex:vl.lexInline}provideParser(){return this.block?bl.parse:bl.parseInline}},ssA=class{defaults=U7();options=this.setOptions;parse=this.parseMarkdown(!0);parseInline=this.parseMarkdown(!1);Parser=bl;Renderer=TC;TextRenderer=j7;Lexer=vl;Tokenizer=Mm;Hooks=Fh;constructor(...t){this.use(...t)}walkTokens(t,e){let A=[];for(let i of t)switch(A=A.concat(e.call(this,i)),i.type){case\"table\":{let n=i;for(let o of n.header)A=A.concat(this.walkTokens(o.tokens,e));for(let o of n.rows)for(let a of o)A=A.concat(this.walkTokens(a.tokens,e));break}case\"list\":{let n=i;A=A.concat(this.walkTokens(n.items,e));break}default:{let n=i;this.defaults.extensions?.childTokens?.[n.type]?this.defaults.extensions.childTokens[n.type].forEach(o=>{let a=n[o].flat(1/0);A=A.concat(this.walkTokens(a,e))}):n.tokens&&(A=A.concat(this.walkTokens(n.tokens,e)))}}return A}use(...t){let e=this.defaults.extensions||{renderers:{},childTokens:{}};return t.forEach(A=>{let i=BA({},A);if(i.async=this.defaults.async||i.async||!1,A.extensions&&(A.extensions.forEach(n=>{if(!n.name)throw new Error(\"extension name required\");if(\"renderer\"in n){let o=e.renderers[n.name];o?e.renderers[n.name]=function(...a){let r=n.renderer.apply(this,a);return r===!1&&(r=o.apply(this,a)),r}:e.renderers[n.name]=n.renderer}if(\"tokenizer\"in n){if(!n.level||n.level!==\"block\"&&n.level!==\"inline\")throw new Error(\"extension level must be 'block' or 'inline'\");let o=e[n.level];o?o.unshift(n.tokenizer):e[n.level]=[n.tokenizer],n.start&&(n.level===\"block\"?e.startBlock?e.startBlock.push(n.start):e.startBlock=[n.start]:n.level===\"inline\"&&(e.startInline?e.startInline.push(n.start):e.startInline=[n.start]))}\"childTokens\"in n&&n.childTokens&&(e.childTokens[n.name]=n.childTokens)}),i.extensions=e),A.renderer){let n=this.defaults.renderer||new TC(this.defaults);for(let o in A.renderer){if(!(o in n))throw new Error(`renderer '${o}' does not exist`);if([\"options\",\"parser\"].includes(o))continue;let a=o,r=A.renderer[a],s=n[a];n[a]=(...g)=>{let l=r.apply(n,g);return l===!1&&(l=s.apply(n,g)),l||\"\"}}i.renderer=n}if(A.tokenizer){let n=this.defaults.tokenizer||new Mm(this.defaults);for(let o in A.tokenizer){if(!(o in n))throw new Error(`tokenizer '${o}' does not exist`);if([\"options\",\"rules\",\"lexer\"].includes(o))continue;let a=o,r=A.tokenizer[a],s=n[a];n[a]=(...g)=>{let l=r.apply(n,g);return l===!1&&(l=s.apply(n,g)),l}}i.tokenizer=n}if(A.hooks){let n=this.defaults.hooks||new Fh;for(let o in A.hooks){if(!(o in n))throw new Error(`hook '${o}' does not exist`);if([\"options\",\"block\"].includes(o))continue;let a=o,r=A.hooks[a],s=n[a];Fh.passThroughHooks.has(o)?n[a]=g=>{if(this.defaults.async&&Fh.passThroughHooksRespectAsync.has(o))return ct(this,null,function*(){let C=yield r.call(n,g);return s.call(n,C)});let l=r.call(n,g);return s.call(n,l)}:n[a]=(...g)=>{if(this.defaults.async)return ct(this,null,function*(){let C=yield r.apply(n,g);return C===!1&&(C=yield s.apply(n,g)),C});let l=r.apply(n,g);return l===!1&&(l=s.apply(n,g)),l}}i.hooks=n}if(A.walkTokens){let n=this.defaults.walkTokens,o=A.walkTokens;i.walkTokens=function(a){let r=[];return r.push(o.call(this,a)),n&&(r=r.concat(n.call(this,a))),r}}this.defaults=BA(BA({},this.defaults),i)}),this}setOptions(t){return this.defaults=BA(BA({},this.defaults),t),this}lexer(t,e){return vl.lex(t,e??this.defaults)}parser(t,e){return bl.parse(t,e??this.defaults)}parseMarkdown(t){return(e,A)=>{let i=BA({},A),n=BA(BA({},this.defaults),i),o=this.onError(!!n.silent,!!n.async);if(this.defaults.async===!0&&i.async===!1)return o(new Error(\"marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise.\"));if(typeof e>\"u\"||e===null)return o(new Error(\"marked(): input parameter is undefined or null\"));if(typeof e!=\"string\")return o(new Error(\"marked(): input parameter is of type \"+Object.prototype.toString.call(e)+\", string expected\"));if(n.hooks&&(n.hooks.options=n,n.hooks.block=t),n.async)return ct(this,null,function*(){let a=n.hooks?yield n.hooks.preprocess(e):e,r=yield(n.hooks?yield n.hooks.provideLexer():t?vl.lex:vl.lexInline)(a,n),s=n.hooks?yield n.hooks.processAllTokens(r):r;n.walkTokens&&(yield Promise.all(this.walkTokens(s,n.walkTokens)));let g=yield(n.hooks?yield n.hooks.provideParser():t?bl.parse:bl.parseInline)(s,n);return n.hooks?yield n.hooks.postprocess(g):g}).catch(o);try{n.hooks&&(e=n.hooks.preprocess(e));let a=(n.hooks?n.hooks.provideLexer():t?vl.lex:vl.lexInline)(e,n);n.hooks&&(a=n.hooks.processAllTokens(a)),n.walkTokens&&this.walkTokens(a,n.walkTokens);let r=(n.hooks?n.hooks.provideParser():t?bl.parse:bl.parseInline)(a,n);return n.hooks&&(r=n.hooks.postprocess(r)),r}catch(a){return o(a)}}}onError(t,e){return A=>{if(A.message+=`\nPlease report this to https://github.com/markedjs/marked.`,t){let i=\"<p>An error occurred:</p><pre>\"+Sc(A.message+\"\",!0)+\"</pre>\";return e?Promise.resolve(i):i}if(e)return Promise.reject(A);throw A}}},HI=new ssA;function Ln(t,e){return HI.parse(t,e)}Ln.options=Ln.setOptions=function(t){return HI.setOptions(t),Ln.defaults=HI.defaults,mK(Ln.defaults),Ln};Ln.getDefaults=U7;Ln.defaults=TI;Ln.use=function(...t){return HI.use(...t),Ln.defaults=HI.defaults,mK(Ln.defaults),Ln};Ln.walkTokens=function(t,e){return HI.walkTokens(t,e)};Ln.parseInline=HI.parseInline;Ln.Parser=bl;Ln.parser=bl.parse;Ln.Renderer=TC;Ln.TextRenderer=j7;Ln.Lexer=vl;Ln.lexer=vl.lex;Ln.Tokenizer=Mm;Ln.Hooks=Fh;Ln.parse=Ln;var LHA=Ln.options,_HA=Ln.setOptions,GHA=Ln.use,KHA=Ln.walkTokens,UHA=Ln.parseInline;var JHA=bl.parse,YHA=vl.lex;var gsA=[\"*\"],lsA=\"Copy\",csA=\"Copied\",CsA=(()=>{class t{constructor(){this._buttonClick$=new $A,this.copied=Is(this._buttonClick$.pipe(Ei(()=>Qi(oe(!0),Cf(3e3).pipe(VE(!1)))),hl(),Ds(1))),this.copiedText=_e(()=>this.copied()?csA:lsA)}onCopyToClipboardClick(){this._buttonClick$.next()}static{this.\\u0275fac=function(i){return new(i||t)}}static{this.\\u0275cmp=kA({type:t,selectors:[[\"markdown-clipboard\"]],decls:2,vars:3,consts:[[1,\"markdown-clipboard-button\",3,\"click\"]],template:function(i,n){i&1&&(ti(0,\"button\",0),pc(\"click\",function(){return n.onCopyToClipboardClick()}),K(1),Ii()),i&2&&(ae(\"copied\",n.copied()),p(),qA(n.copiedText()))},encapsulation:2,changeDetection:0})}}return t})(),IsA=new wA(\"CLIPBOARD_OPTIONS\");var dsA=new wA(\"MARKED_EXTENSIONS\"),BsA=new wA(\"MARKED_OPTIONS\"),QsA=new wA(\"MERMAID_OPTIONS\"),EsA=new wA(\"SANITIZE\");function hsA(t){return typeof t==\"function\"}var usA=\"[ngx-markdown] When using the `emoji` attribute you *have to* include Emoji-Toolkit files to `angular.json` or use imports. See README for more information\",fsA=\"[ngx-markdown] When using the `katex` attribute you *have to* include KaTeX files to `angular.json` or use imports. See README for more information\",msA=\"[ngx-markdown] When using the `mermaid` attribute you *have to* include Mermaid files to `angular.json` or use imports. See README for more information\",psA=\"[ngx-markdown] When using the `clipboard` attribute you *have to* include Clipboard files to `angular.json` or use imports. See README for more information\",DsA=\"[ngx-markdown] When using the `clipboard` attribute you *have to* provide the `viewContainerRef` parameter to `MarkdownService.render()` function\",wsA=\"[ngx-markdown] When using the `src` attribute you *have to* pass the `HttpClient` as a parameter of the `forRoot` method. See README for more information\";var NK=(()=>{class t{get options(){return this._options}set options(A){this._options=BA(BA({},this.DEFAULT_MARKED_OPTIONS),A)}get renderer(){return this.options.renderer}set renderer(A){this.options.renderer=A}constructor(){this.clipboardOptions=h(IsA,{optional:!0}),this.extensions=h(dsA,{optional:!0}),this.http=h(ks,{optional:!0}),this.mermaidOptions=h(QsA,{optional:!0}),this.platform=h(Qf),this.sanitize=h(EsA,{optional:!0}),this.sanitizer=h(LC),this.DEFAULT_MARKED_OPTIONS={renderer:new TC},this.DEFAULT_KATEX_OPTIONS={delimiters:[{left:\"$$\",right:\"$$\",display:!0},{left:\"$\",right:\"$\",display:!1},{left:\"\\\\(\",right:\"\\\\)\",display:!1},{left:\"\\\\begin{equation}\",right:\"\\\\end{equation}\",display:!0},{left:\"\\\\begin{align}\",right:\"\\\\end{align}\",display:!0},{left:\"\\\\begin{alignat}\",right:\"\\\\end{alignat}\",display:!0},{left:\"\\\\begin{gather}\",right:\"\\\\end{gather}\",display:!0},{left:\"\\\\begin{CD}\",right:\"\\\\end{CD}\",display:!0},{left:\"\\\\[\",right:\"\\\\]\",display:!0}]},this.DEFAULT_MERMAID_OPTIONS={startOnLoad:!1},this.DEFAULT_CLIPBOARD_OPTIONS={buttonComponent:void 0},this.DEFAULT_PARSE_OPTIONS={decodeHtml:!1,inline:!1,emoji:!1,mermaid:!1,markedOptions:void 0,disableSanitizer:!1},this.DEFAULT_RENDER_OPTIONS={clipboard:!1,clipboardOptions:void 0,katex:!1,katexOptions:void 0,mermaid:!1,mermaidOptions:void 0},this.DEFAULT_SECURITY_CONTEXT=ul.HTML,this._options=null,this._reload$=new $A,this.reload$=this._reload$.asObservable(),this.options=h(BsA,{optional:!0})}parse(A,i=this.DEFAULT_PARSE_OPTIONS){let{decodeHtml:n,inline:o,emoji:a,mermaid:r,disableSanitizer:s}=i,g=BA(BA({},this.options),i.markedOptions),l=g.renderer||this.renderer||new TC;this.extensions&&(this.renderer=this.extendsRendererForExtensions(l)),r&&(this.renderer=this.extendsRendererForMermaid(l));let C=this.trimIndentation(A),I=n?this.decodeHtml(C):C,d=a?this.parseEmoji(I):I,B=this.parseMarked(d,g,o);return s?B:this.sanitizeHtml(B)}render(A,i=this.DEFAULT_RENDER_OPTIONS,n){let{clipboard:o,clipboardOptions:a,katex:r,katexOptions:s,mermaid:g,mermaidOptions:l}=i;r&&this.renderKatex(A,BA(BA({},this.DEFAULT_KATEX_OPTIONS),s)),g&&this.renderMermaid(A,BA(BA(BA({},this.DEFAULT_MERMAID_OPTIONS),this.mermaidOptions),l)),o&&this.renderClipboard(A,n,BA(BA(BA({},this.DEFAULT_CLIPBOARD_OPTIONS),this.clipboardOptions),a)),this.highlight(A)}reload(){this._reload$.next()}getSource(A){if(!this.http)throw new Error(wsA);return this.http.get(A,{responseType:\"text\"}).pipe(fe(i=>this.handleExtension(A,i)))}highlight(A){if(!y0(this.platform)||typeof Prism>\"u\"||typeof Prism.highlightAllUnder>\"u\")return;A||(A=document);let i=A.querySelectorAll('pre code:not([class*=\"language-\"])');Array.prototype.forEach.call(i,n=>n.classList.add(\"language-none\")),Prism.highlightAllUnder(A)}decodeHtml(A){if(!y0(this.platform))return A;let i=document.createElement(\"textarea\");return i.innerHTML=A,i.value}extendsRendererForExtensions(A){let i=A;return i.\\u0275NgxMarkdownRendererExtendedForExtensions===!0||(this.extensions&&this.extensions.length>0&&Ln.use(...this.extensions),i.\\u0275NgxMarkdownRendererExtendedForExtensions=!0),A}extendsRendererForMermaid(A){let i=A;if(i.\\u0275NgxMarkdownRendererExtendedForMermaid===!0)return A;let n=A.code;return A.code=o=>o.lang===\"mermaid\"?`<div class=\"mermaid\">${o.text}</div>`:n(o),i.\\u0275NgxMarkdownRendererExtendedForMermaid=!0,A}handleExtension(A,i){let n=A.lastIndexOf(\"://\"),o=n>-1?A.substring(n+4):A,a=o.lastIndexOf(\"/\"),r=a>-1?o.substring(a+1).split(\"?\")[0]:\"\",s=r.lastIndexOf(\".\"),g=s>-1?r.substring(s+1):\"\";return g&&g!==\"md\"?\"```\"+g+`\n`+i+\"\\n```\":i}parseMarked(A,i,n=!1){if(i.renderer){let o=BA({},i.renderer);delete o.\\u0275NgxMarkdownRendererExtendedForExtensions,delete o.\\u0275NgxMarkdownRendererExtendedForMermaid,delete i.renderer,Ln.use({renderer:o})}return n?Ln.parseInline(A,i):Ln.parse(A,i)}parseEmoji(A){if(!y0(this.platform))return A;if(typeof joypixels>\"u\"||typeof joypixels.shortnameToUnicode>\"u\")throw new Error(usA);return joypixels.shortnameToUnicode(A)}renderKatex(A,i){if(y0(this.platform)){if(typeof katex>\"u\"||typeof renderMathInElement>\"u\")throw new Error(fsA);renderMathInElement(A,i)}}renderClipboard(A,i,n){if(!y0(this.platform))return;if(typeof ClipboardJS>\"u\")throw new Error(psA);if(!i)throw new Error(DsA);let{buttonComponent:o,buttonTemplate:a}=n,r=A.querySelectorAll(\"pre\");for(let s=0;s<r.length;s++){let g=r.item(s),l=document.createElement(\"div\");l.style.position=\"relative\",g.parentNode.insertBefore(l,g),l.appendChild(g);let C=document.createElement(\"div\");C.classList.add(\"markdown-clipboard-toolbar\"),C.style.position=\"absolute\",C.style.top=\".5em\",C.style.right=\".5em\",C.style.zIndex=\"1\",l.insertAdjacentElement(\"beforeend\",C),l.onmouseenter=()=>C.classList.add(\"hover\"),l.onmouseleave=()=>C.classList.remove(\"hover\");let I;if(o){let B=i.createComponent(o);I=B.hostView,B.changeDetectorRef.markForCheck()}else if(a)I=i.createEmbeddedView(a);else{let B=i.createComponent(CsA);I=B.hostView,B.changeDetectorRef.markForCheck()}let d;I.rootNodes.forEach(B=>{C.appendChild(B),d=new ClipboardJS(B,{text:()=>g.innerText})}),I.onDestroy(()=>d.destroy())}}renderMermaid(A,i=this.DEFAULT_MERMAID_OPTIONS){if(!y0(this.platform))return;if(typeof mermaid>\"u\"||typeof mermaid.initialize>\"u\")throw new Error(msA);let n=A.querySelectorAll(\".mermaid\");n.length!==0&&(mermaid.initialize(i),mermaid.run({nodes:n}))}trimIndentation(A){if(!A)return\"\";let i;return A.split(`\n`).map(n=>{let o=i;return n.length>0&&(o=isNaN(o)?n.search(/\\S|$/):Math.min(n.search(/\\S|$/),o)),isNaN(i)&&(i=o),o?n.substring(o):n}).join(`\n`)}sanitizeHtml(A){return ct(this,null,function*(){return hsA(this.sanitize)?this.sanitize(yield A):this.sanitize!==ul.NONE?this.sanitizer.sanitize(this.sanitize??this.DEFAULT_SECURITY_CONTEXT,A)??\"\":A})}static{this.\\u0275fac=function(i){return new(i||t)}}static{this.\\u0275prov=TA({token:t,factory:t.\\u0275fac})}}return t})(),q7=(function(t){return t.CommandLine=\"command-line\",t.LineHighlight=\"line-highlight\",t.LineNumbers=\"line-numbers\",t})(q7||{}),FK=(()=>{class t{constructor(){this.element=h(ge),this.markdownService=h(NK),this.viewContainerRef=h(Ro),this.error=new WA,this.load=new WA,this.ready=new WA,this._clipboard=!1,this._commandLine=!1,this._disableSanitizer=!1,this._emoji=!1,this._inline=!1,this._katex=!1,this._lineHighlight=!1,this._lineNumbers=!1,this._mermaid=!1,this.destroyed$=new $A}get disableSanitizer(){return this._disableSanitizer}set disableSanitizer(A){this._disableSanitizer=this.coerceBooleanProperty(A)}get inline(){return this._inline}set inline(A){this._inline=this.coerceBooleanProperty(A)}get clipboard(){return this._clipboard}set clipboard(A){this._clipboard=this.coerceBooleanProperty(A)}get emoji(){return this._emoji}set emoji(A){this._emoji=this.coerceBooleanProperty(A)}get katex(){return this._katex}set katex(A){this._katex=this.coerceBooleanProperty(A)}get mermaid(){return this._mermaid}set mermaid(A){this._mermaid=this.coerceBooleanProperty(A)}get lineHighlight(){return this._lineHighlight}set lineHighlight(A){this._lineHighlight=this.coerceBooleanProperty(A)}get lineNumbers(){return this._lineNumbers}set lineNumbers(A){this._lineNumbers=this.coerceBooleanProperty(A)}get commandLine(){return this._commandLine}set commandLine(A){this._commandLine=this.coerceBooleanProperty(A)}ngOnChanges(){this.loadContent()}loadContent(){if(this.data!=null){this.handleData();return}if(this.src!=null){this.handleSrc();return}}ngAfterViewInit(){!this.data&&!this.src&&this.handleTransclusion(),this.markdownService.reload$.pipe(Bt(this.destroyed$)).subscribe(()=>this.loadContent())}ngOnDestroy(){this.destroyed$.next(),this.destroyed$.complete()}render(A,i=!1){return ct(this,null,function*(){let n={decodeHtml:i,inline:this.inline,emoji:this.emoji,mermaid:this.mermaid,disableSanitizer:this.disableSanitizer},o={clipboard:this.clipboard,clipboardOptions:this.getClipboardOptions(),katex:this.katex,katexOptions:this.katexOptions,mermaid:this.mermaid,mermaidOptions:this.mermaidOptions},a=yield this.markdownService.parse(A,n);this.element.nativeElement.innerHTML=a,this.handlePlugins(),this.markdownService.render(this.element.nativeElement,o,this.viewContainerRef),this.ready.emit()})}coerceBooleanProperty(A){return A!=null&&`${String(A)}`!=\"false\"}getClipboardOptions(){if(this.clipboardButtonComponent||this.clipboardButtonTemplate)return{buttonComponent:this.clipboardButtonComponent,buttonTemplate:this.clipboardButtonTemplate}}handleData(){this.render(this.data)}handleSrc(){this.markdownService.getSource(this.src).subscribe({next:A=>{this.render(A).then(()=>{this.load.emit(A)})},error:A=>this.error.emit(A)})}handleTransclusion(){this.render(this.element.nativeElement.innerHTML,!0)}handlePlugins(){this.commandLine&&(this.setPluginClass(this.element.nativeElement,q7.CommandLine),this.setPluginOptions(this.element.nativeElement,{dataFilterOutput:this.filterOutput,dataHost:this.host,dataPrompt:this.prompt,dataOutput:this.output,dataUser:this.user})),this.lineHighlight&&this.setPluginOptions(this.element.nativeElement,{dataLine:this.line,dataLineOffset:this.lineOffset}),this.lineNumbers&&(this.setPluginClass(this.element.nativeElement,q7.LineNumbers),this.setPluginOptions(this.element.nativeElement,{dataStart:this.start}))}setPluginClass(A,i){let n=A.querySelectorAll(\"pre\");for(let o=0;o<n.length;o++){let a=i instanceof Array?i:[i];n.item(o).classList.add(...a)}}setPluginOptions(A,i){let n=A.querySelectorAll(\"pre\");for(let o=0;o<n.length;o++)Object.keys(i).forEach(a=>{let r=i[a];if(r){let s=this.toLispCase(a);n.item(o).setAttribute(s,r.toString())}})}toLispCase(A){let i=A.match(/([A-Z])/g);if(!i)return A;let n=A.toString();for(let o=0,a=i.length;o<a;o++)n=n.replace(new RegExp(i[o]),\"-\"+i[o].toLowerCase());return n.slice(0,1)===\"-\"&&(n=n.slice(1)),n}static{this.\\u0275fac=function(i){return new(i||t)}}static{this.\\u0275cmp=kA({type:t,selectors:[[\"markdown\"],[\"\",\"markdown\",\"\"]],inputs:{data:\"data\",src:\"src\",disableSanitizer:\"disableSanitizer\",inline:\"inline\",clipboard:\"clipboard\",clipboardButtonComponent:\"clipboardButtonComponent\",clipboardButtonTemplate:\"clipboardButtonTemplate\",emoji:\"emoji\",katex:\"katex\",katexOptions:\"katexOptions\",mermaid:\"mermaid\",mermaidOptions:\"mermaidOptions\",lineHighlight:\"lineHighlight\",line:\"line\",lineOffset:\"lineOffset\",lineNumbers:\"lineNumbers\",start:\"start\",commandLine:\"commandLine\",filterOutput:\"filterOutput\",host:\"host\",prompt:\"prompt\",output:\"output\",user:\"user\"},outputs:{error:\"error\",load:\"load\",ready:\"ready\"},features:[ei],ngContentSelectors:gsA,decls:1,vars:0,template:function(i,n){i&1&&(Yt(),He(0))},encapsulation:2})}}return t})();function _h(t){return[NK,t?.loader??[],t?.clipboardOptions??[],t?.markedOptions??[],t?.mermaidOptions??[],t?.markedExtensions??[],t?.sanitize??[]]}var LK=(()=>{class t{static forRoot(A){return{ngModule:t,providers:[_h(A)]}}static forChild(){return{ngModule:t}}static{this.\\u0275fac=function(i){return new(i||t)}}static{this.\\u0275mod=Xe({type:t})}static{this.\\u0275inj=Ze({})}}return t})();var Di=\"primary\",qh=Symbol(\"RouteTitle\"),$7=class{params;constructor(e){this.params=e||{}}has(e){return Object.prototype.hasOwnProperty.call(this.params,e)}get(e){if(this.has(e)){let A=this.params[e];return Array.isArray(A)?A[0]:A}return null}getAll(e){if(this.has(e)){let A=this.params[e];return Array.isArray(A)?A:[A]}return[]}get keys(){return Object.keys(this.params)}};function zI(t){return new $7(t)}function V7(t,e,A){for(let i=0;i<t.length;i++){let n=t[i],o=e[i];if(n[0]===\":\")A[n.substring(1)]=o;else if(n!==o.path)return!1}return!0}function TK(t,e,A){let i=A.path.split(\"/\"),n=i.indexOf(\"**\");if(n===-1){if(i.length>t.length||A.pathMatch===\"full\"&&(e.hasChildren()||i.length<t.length))return null;let s={},g=t.slice(0,i.length);return V7(i,g,s)?{consumed:g,posParams:s}:null}if(n!==i.lastIndexOf(\"**\"))return null;let o=i.slice(0,n),a=i.slice(n+1);if(o.length+a.length>t.length||A.pathMatch===\"full\"&&e.hasChildren()&&A.path!==\"**\")return null;let r={};return!V7(o,t.slice(0,o.length),r)||!V7(a,t.slice(t.length-a.length),r)?null:{consumed:t,posParams:r}}function _m(t){return new Promise((e,A)=>{t.pipe(po()).subscribe({next:i=>e(i),error:i=>A(i)})})}function bsA(t,e){if(t.length!==e.length)return!1;for(let A=0;A<t.length;++A)if(!xc(t[A],e[A]))return!1;return!0}function xc(t,e){let A=t?Ab(t):void 0,i=e?Ab(e):void 0;if(!A||!i||A.length!=i.length)return!1;let n;for(let o=0;o<A.length;o++)if(n=A[o],!OK(t[n],e[n]))return!1;return!0}function Ab(t){return[...Object.keys(t),...Object.getOwnPropertySymbols(t)]}function OK(t,e){if(Array.isArray(t)&&Array.isArray(e)){if(t.length!==e.length)return!1;let A=[...t].sort(),i=[...e].sort();return A.every((n,o)=>i[o]===n)}else return t===e}function MsA(t){return t.length>0?t[t.length-1]:null}function jI(t){return hd(t)?t:pf(t)?mr(Promise.resolve(t)):oe(t)}function zK(t){return hd(t)?_m(t):Promise.resolve(t)}var ksA={exact:qK,subset:VK},PK={exact:SsA,subset:xsA,ignored:()=>!0},jK={paths:\"exact\",fragment:\"ignored\",matrixParams:\"ignored\",queryParams:\"exact\"},eb={paths:\"subset\",fragment:\"ignored\",matrixParams:\"ignored\",queryParams:\"subset\"};function _K(t,e,A){return ksA[A.paths](t.root,e.root,A.matrixParams)&&PK[A.queryParams](t.queryParams,e.queryParams)&&!(A.fragment===\"exact\"&&t.fragment!==e.fragment)}function SsA(t,e){return xc(t,e)}function qK(t,e,A){if(!OI(t.segments,e.segments)||!Nm(t.segments,e.segments,A)||t.numberOfChildren!==e.numberOfChildren)return!1;for(let i in e.children)if(!t.children[i]||!qK(t.children[i],e.children[i],A))return!1;return!0}function xsA(t,e){return Object.keys(e).length<=Object.keys(t).length&&Object.keys(e).every(A=>OK(t[A],e[A]))}function VK(t,e,A){return WK(t,e,e.segments,A)}function WK(t,e,A,i){if(t.segments.length>A.length){let n=t.segments.slice(0,A.length);return!(!OI(n,A)||e.hasChildren()||!Nm(n,A,i))}else if(t.segments.length===A.length){if(!OI(t.segments,A)||!Nm(t.segments,A,i))return!1;for(let n in e.children)if(!t.children[n]||!VK(t.children[n],e.children[n],i))return!1;return!0}else{let n=A.slice(0,t.segments.length),o=A.slice(t.segments.length);return!OI(t.segments,n)||!Nm(t.segments,n,i)||!t.children[Di]?!1:WK(t.children[Di],e,o,i)}}function Nm(t,e,A){return e.every((i,n)=>PK[A](t[n].parameters,i.parameters))}var Gg=class{root;queryParams;fragment;_queryParamMap;constructor(e=new Wn([],{}),A={},i=null){this.root=e,this.queryParams=A,this.fragment=i}get queryParamMap(){return this._queryParamMap??=zI(this.queryParams),this._queryParamMap}toString(){return FsA.serialize(this)}},Wn=class{segments;children;parent=null;constructor(e,A){this.segments=e,this.children=A,Object.values(A).forEach(i=>i.parent=this)}hasChildren(){return this.numberOfChildren>0}get numberOfChildren(){return Object.keys(this.children).length}toString(){return Fm(this)}},OC=class{path;parameters;_parameterMap;constructor(e,A){this.path=e,this.parameters=A}get parameterMap(){return this._parameterMap??=zI(this.parameters),this._parameterMap}toString(){return XK(this)}};function RsA(t,e){return OI(t,e)&&t.every((A,i)=>xc(A.parameters,e[i].parameters))}function OI(t,e){return t.length!==e.length?!1:t.every((A,i)=>A.path===e[i].path)}function NsA(t,e){let A=[];return Object.entries(t.children).forEach(([i,n])=>{i===Di&&(A=A.concat(e(n,i)))}),Object.entries(t.children).forEach(([i,n])=>{i!==Di&&(A=A.concat(e(n,i)))}),A}var qI=(()=>{class t{static \\u0275fac=function(i){return new(i||t)};static \\u0275prov=TA({token:t,factory:()=>new S0,providedIn:\"root\"})}return t})(),S0=class{parse(e){let A=new ib(e);return new Gg(A.parseRootSegment(),A.parseQueryParams(),A.parseFragment())}serialize(e){let A=`/${Gh(e.root,!0)}`,i=GsA(e.queryParams),n=typeof e.fragment==\"string\"?`#${LsA(e.fragment)}`:\"\";return`${A}${i}${n}`}},FsA=new S0;function Fm(t){return t.segments.map(e=>XK(e)).join(\"/\")}function Gh(t,e){if(!t.hasChildren())return Fm(t);if(e){let A=t.children[Di]?Gh(t.children[Di],!1):\"\",i=[];return Object.entries(t.children).forEach(([n,o])=>{n!==Di&&i.push(`${n}:${Gh(o,!1)}`)}),i.length>0?`${A}(${i.join(\"//\")})`:A}else{let A=NsA(t,(i,n)=>n===Di?[Gh(t.children[Di],!1)]:[`${n}:${Gh(i,!1)}`]);return Object.keys(t.children).length===1&&t.children[Di]!=null?`${Fm(t)}/${A[0]}`:`${Fm(t)}/(${A.join(\"//\")})`}}function ZK(t){return encodeURIComponent(t).replace(/%40/g,\"@\").replace(/%3A/gi,\":\").replace(/%24/g,\"$\").replace(/%2C/gi,\",\")}function xm(t){return ZK(t).replace(/%3B/gi,\";\")}function LsA(t){return encodeURI(t)}function tb(t){return ZK(t).replace(/\\(/g,\"%28\").replace(/\\)/g,\"%29\").replace(/%26/gi,\"&\")}function Lm(t){return decodeURIComponent(t)}function GK(t){return Lm(t.replace(/\\+/g,\"%20\"))}function XK(t){return`${tb(t.path)}${_sA(t.parameters)}`}function _sA(t){return Object.entries(t).map(([e,A])=>`;${tb(e)}=${tb(A)}`).join(\"\")}function GsA(t){let e=Object.entries(t).map(([A,i])=>Array.isArray(i)?i.map(n=>`${xm(A)}=${xm(n)}`).join(\"&\"):`${xm(A)}=${xm(i)}`).filter(A=>A);return e.length?`?${e.join(\"&\")}`:\"\"}var KsA=/^[^\\/()?;#]+/;function W7(t){let e=t.match(KsA);return e?e[0]:\"\"}var UsA=/^[^\\/()?;=#]+/;function JsA(t){let e=t.match(UsA);return e?e[0]:\"\"}var YsA=/^[^=?&#]+/;function HsA(t){let e=t.match(YsA);return e?e[0]:\"\"}var TsA=/^[^&#]+/;function OsA(t){let e=t.match(TsA);return e?e[0]:\"\"}var ib=class{url;remaining;constructor(e){this.url=e,this.remaining=e}parseRootSegment(){return this.consumeOptional(\"/\"),this.remaining===\"\"||this.peekStartsWith(\"?\")||this.peekStartsWith(\"#\")?new Wn([],{}):new Wn([],this.parseChildren())}parseQueryParams(){let e={};if(this.consumeOptional(\"?\"))do this.parseQueryParam(e);while(this.consumeOptional(\"&\"));return e}parseFragment(){return this.consumeOptional(\"#\")?decodeURIComponent(this.remaining):null}parseChildren(e=0){if(e>50)throw new wt(4010,!1);if(this.remaining===\"\")return{};this.consumeOptional(\"/\");let A=[];for(this.peekStartsWith(\"(\")||A.push(this.parseSegment());this.peekStartsWith(\"/\")&&!this.peekStartsWith(\"//\")&&!this.peekStartsWith(\"/(\");)this.capture(\"/\"),A.push(this.parseSegment());let i={};this.peekStartsWith(\"/(\")&&(this.capture(\"/\"),i=this.parseParens(!0,e));let n={};return this.peekStartsWith(\"(\")&&(n=this.parseParens(!1,e)),(A.length>0||Object.keys(i).length>0)&&(n[Di]=new Wn(A,i)),n}parseSegment(){let e=W7(this.remaining);if(e===\"\"&&this.peekStartsWith(\";\"))throw new wt(4009,!1);return this.capture(e),new OC(Lm(e),this.parseMatrixParams())}parseMatrixParams(){let e={};for(;this.consumeOptional(\";\");)this.parseParam(e);return e}parseParam(e){let A=JsA(this.remaining);if(!A)return;this.capture(A);let i=\"\";if(this.consumeOptional(\"=\")){let n=W7(this.remaining);n&&(i=n,this.capture(i))}e[Lm(A)]=Lm(i)}parseQueryParam(e){let A=HsA(this.remaining);if(!A)return;this.capture(A);let i=\"\";if(this.consumeOptional(\"=\")){let a=OsA(this.remaining);a&&(i=a,this.capture(i))}let n=GK(A),o=GK(i);if(e.hasOwnProperty(n)){let a=e[n];Array.isArray(a)||(a=[a],e[n]=a),a.push(o)}else e[n]=o}parseParens(e,A){let i={};for(this.capture(\"(\");!this.consumeOptional(\")\")&&this.remaining.length>0;){let n=W7(this.remaining),o=this.remaining[n.length];if(o!==\"/\"&&o!==\")\"&&o!==\";\")throw new wt(4010,!1);let a;n.indexOf(\":\")>-1?(a=n.slice(0,n.indexOf(\":\")),this.capture(a),this.capture(\":\")):e&&(a=Di);let r=this.parseChildren(A+1);i[a??Di]=Object.keys(r).length===1&&r[Di]?r[Di]:new Wn([],r),this.consumeOptional(\"//\")}return i}peekStartsWith(e){return this.remaining.startsWith(e)}consumeOptional(e){return this.peekStartsWith(e)?(this.remaining=this.remaining.substring(e.length),!0):!1}capture(e){if(!this.consumeOptional(e))throw new wt(4011,!1)}};function $K(t){return t.segments.length>0?new Wn([],{[Di]:t}):t}function AU(t){let e={};for(let[i,n]of Object.entries(t.children)){let o=AU(n);if(i===Di&&o.segments.length===0&&o.hasChildren())for(let[a,r]of Object.entries(o.children))e[a]=r;else(o.segments.length>0||o.hasChildren())&&(e[i]=o)}let A=new Wn(t.segments,e);return zsA(A)}function zsA(t){if(t.numberOfChildren===1&&t.children[Di]){let e=t.children[Di];return new Wn(t.segments.concat(e.segments),e.children)}return t}function qd(t){return t instanceof Gg}function eU(t,e,A=null,i=null,n=new S0){let o=tU(t);return iU(o,e,A,i,n)}function tU(t){let e;function A(o){let a={};for(let s of o.children){let g=A(s);a[s.outlet]=g}let r=new Wn(o.url,a);return o===t&&(e=r),r}let i=A(t.root),n=$K(i);return e??n}function iU(t,e,A,i,n){let o=t;for(;o.parent;)o=o.parent;if(e.length===0)return Z7(o,o,o,A,i,n);let a=PsA(e);if(a.toRoot())return Z7(o,o,new Wn([],{}),A,i,n);let r=jsA(a,o,t),s=r.processChildren?Uh(r.segmentGroup,r.index,a.commands):oU(r.segmentGroup,r.index,a.commands);return Z7(o,r.segmentGroup,s,A,i,n)}function Gm(t){return typeof t==\"object\"&&t!=null&&!t.outlets&&!t.segmentPath}function Yh(t){return typeof t==\"object\"&&t!=null&&t.outlets}function KK(t,e,A){t||=\"\\u0275\";let i=new Gg;return i.queryParams={[t]:e},A.parse(A.serialize(i)).queryParams[t]}function Z7(t,e,A,i,n,o){let a={};for(let[g,l]of Object.entries(i??{}))a[g]=Array.isArray(l)?l.map(C=>KK(g,C,o)):KK(g,l,o);let r;t===e?r=A:r=nU(t,e,A);let s=$K(AU(r));return new Gg(s,a,n)}function nU(t,e,A){let i={};return Object.entries(t.children).forEach(([n,o])=>{o===e?i[n]=A:i[n]=nU(o,e,A)}),new Wn(t.segments,i)}var Km=class{isAbsolute;numberOfDoubleDots;commands;constructor(e,A,i){if(this.isAbsolute=e,this.numberOfDoubleDots=A,this.commands=i,e&&i.length>0&&Gm(i[0]))throw new wt(4003,!1);let n=i.find(Yh);if(n&&n!==MsA(i))throw new wt(4004,!1)}toRoot(){return this.isAbsolute&&this.commands.length===1&&this.commands[0]==\"/\"}};function PsA(t){if(typeof t[0]==\"string\"&&t.length===1&&t[0]===\"/\")return new Km(!0,0,t);let e=0,A=!1,i=t.reduce((n,o,a)=>{if(typeof o==\"object\"&&o!=null){if(o.outlets){let r={};return Object.entries(o.outlets).forEach(([s,g])=>{r[s]=typeof g==\"string\"?g.split(\"/\"):g}),[...n,{outlets:r}]}if(o.segmentPath)return[...n,o.segmentPath]}return typeof o!=\"string\"?[...n,o]:a===0?(o.split(\"/\").forEach((r,s)=>{s==0&&r===\".\"||(s==0&&r===\"\"?A=!0:r===\"..\"?e++:r!=\"\"&&n.push(r))}),n):[...n,o]},[]);return new Km(A,e,i)}var zd=class{segmentGroup;processChildren;index;constructor(e,A,i){this.segmentGroup=e,this.processChildren=A,this.index=i}};function jsA(t,e,A){if(t.isAbsolute)return new zd(e,!0,0);if(!A)return new zd(e,!1,NaN);if(A.parent===null)return new zd(A,!0,0);let i=Gm(t.commands[0])?0:1,n=A.segments.length-1+i;return qsA(A,n,t.numberOfDoubleDots)}function qsA(t,e,A){let i=t,n=e,o=A;for(;o>n;){if(o-=n,i=i.parent,!i)throw new wt(4005,!1);n=i.segments.length}return new zd(i,!1,n-o)}function VsA(t){return Yh(t[0])?t[0].outlets:{[Di]:t}}function oU(t,e,A){if(t??=new Wn([],{}),t.segments.length===0&&t.hasChildren())return Uh(t,e,A);let i=WsA(t,e,A),n=A.slice(i.commandIndex);if(i.match&&i.pathIndex<t.segments.length){let o=new Wn(t.segments.slice(0,i.pathIndex),{});return o.children[Di]=new Wn(t.segments.slice(i.pathIndex),t.children),Uh(o,0,n)}else return i.match&&n.length===0?new Wn(t.segments,{}):i.match&&!t.hasChildren()?nb(t,e,A):i.match?Uh(t,0,n):nb(t,e,A)}function Uh(t,e,A){if(A.length===0)return new Wn(t.segments,{});{let i=VsA(A),n={};if(Object.keys(i).some(o=>o!==Di)&&t.children[Di]&&t.numberOfChildren===1&&t.children[Di].segments.length===0){let o=Uh(t.children[Di],e,A);return new Wn(t.segments,o.children)}return Object.entries(i).forEach(([o,a])=>{typeof a==\"string\"&&(a=[a]),a!==null&&(n[o]=oU(t.children[o],e,a))}),Object.entries(t.children).forEach(([o,a])=>{i[o]===void 0&&(n[o]=a)}),new Wn(t.segments,n)}}function WsA(t,e,A){let i=0,n=e,o={match:!1,pathIndex:0,commandIndex:0};for(;n<t.segments.length;){if(i>=A.length)return o;let a=t.segments[n],r=A[i];if(Yh(r))break;let s=`${r}`,g=i<A.length-1?A[i+1]:null;if(n>0&&s===void 0)break;if(s&&g&&typeof g==\"object\"&&g.outlets===void 0){if(!JK(s,g,a))return o;i+=2}else{if(!JK(s,{},a))return o;i++}n++}return{match:!0,pathIndex:n,commandIndex:i}}function nb(t,e,A){let i=t.segments.slice(0,e),n=0;for(;n<A.length;){let o=A[n];if(Yh(o)){let s=ZsA(o.outlets);return new Wn(i,s)}if(n===0&&Gm(A[0])){let s=t.segments[e];i.push(new OC(s.path,UK(A[0]))),n++;continue}let a=Yh(o)?o.outlets[Di]:`${o}`,r=n<A.length-1?A[n+1]:null;a&&r&&Gm(r)?(i.push(new OC(a,UK(r))),n+=2):(i.push(new OC(a,{})),n++)}return new Wn(i,{})}function ZsA(t){let e={};return Object.entries(t).forEach(([A,i])=>{typeof i==\"string\"&&(i=[i]),i!==null&&(e[A]=nb(new Wn([],{}),0,i))}),e}function UK(t){let e={};return Object.entries(t).forEach(([A,i])=>e[A]=`${i}`),e}function JK(t,e,A){return t==A.path&&xc(e,A.parameters)}var Pd=\"imperative\",Xa=(function(t){return t[t.NavigationStart=0]=\"NavigationStart\",t[t.NavigationEnd=1]=\"NavigationEnd\",t[t.NavigationCancel=2]=\"NavigationCancel\",t[t.NavigationError=3]=\"NavigationError\",t[t.RoutesRecognized=4]=\"RoutesRecognized\",t[t.ResolveStart=5]=\"ResolveStart\",t[t.ResolveEnd=6]=\"ResolveEnd\",t[t.GuardsCheckStart=7]=\"GuardsCheckStart\",t[t.GuardsCheckEnd=8]=\"GuardsCheckEnd\",t[t.RouteConfigLoadStart=9]=\"RouteConfigLoadStart\",t[t.RouteConfigLoadEnd=10]=\"RouteConfigLoadEnd\",t[t.ChildActivationStart=11]=\"ChildActivationStart\",t[t.ChildActivationEnd=12]=\"ChildActivationEnd\",t[t.ActivationStart=13]=\"ActivationStart\",t[t.ActivationEnd=14]=\"ActivationEnd\",t[t.Scroll=15]=\"Scroll\",t[t.NavigationSkipped=16]=\"NavigationSkipped\",t})(Xa||{}),cg=class{id;url;constructor(e,A){this.id=e,this.url=A}},zC=class extends cg{type=Xa.NavigationStart;navigationTrigger;restoredState;constructor(e,A,i=\"imperative\",n=null){super(e,A),this.navigationTrigger=i,this.restoredState=n}toString(){return`NavigationStart(id: ${this.id}, url: '${this.url}')`}},Ml=class extends cg{urlAfterRedirects;type=Xa.NavigationEnd;constructor(e,A,i){super(e,A),this.urlAfterRedirects=i}toString(){return`NavigationEnd(id: ${this.id}, url: '${this.url}', urlAfterRedirects: '${this.urlAfterRedirects}')`}},jr=(function(t){return t[t.Redirect=0]=\"Redirect\",t[t.SupersededByNewNavigation=1]=\"SupersededByNewNavigation\",t[t.NoDataFromResolver=2]=\"NoDataFromResolver\",t[t.GuardRejected=3]=\"GuardRejected\",t[t.Aborted=4]=\"Aborted\",t})(jr||{}),Vd=(function(t){return t[t.IgnoredSameUrlNavigation=0]=\"IgnoredSameUrlNavigation\",t[t.IgnoredByUrlHandlingStrategy=1]=\"IgnoredByUrlHandlingStrategy\",t})(Vd||{}),_g=class extends cg{reason;code;type=Xa.NavigationCancel;constructor(e,A,i,n){super(e,A),this.reason=i,this.code=n}toString(){return`NavigationCancel(id: ${this.id}, url: '${this.url}')`}};function aU(t){return t instanceof _g&&(t.code===jr.Redirect||t.code===jr.SupersededByNewNavigation)}var Nc=class extends cg{reason;code;type=Xa.NavigationSkipped;constructor(e,A,i,n){super(e,A),this.reason=i,this.code=n}},PI=class extends cg{error;target;type=Xa.NavigationError;constructor(e,A,i,n){super(e,A),this.error=i,this.target=n}toString(){return`NavigationError(id: ${this.id}, url: '${this.url}', error: ${this.error})`}},Hh=class extends cg{urlAfterRedirects;state;type=Xa.RoutesRecognized;constructor(e,A,i,n){super(e,A),this.urlAfterRedirects=i,this.state=n}toString(){return`RoutesRecognized(id: ${this.id}, url: '${this.url}', urlAfterRedirects: '${this.urlAfterRedirects}', state: ${this.state})`}},Um=class extends cg{urlAfterRedirects;state;type=Xa.GuardsCheckStart;constructor(e,A,i,n){super(e,A),this.urlAfterRedirects=i,this.state=n}toString(){return`GuardsCheckStart(id: ${this.id}, url: '${this.url}', urlAfterRedirects: '${this.urlAfterRedirects}', state: ${this.state})`}},Jm=class extends cg{urlAfterRedirects;state;shouldActivate;type=Xa.GuardsCheckEnd;constructor(e,A,i,n,o){super(e,A),this.urlAfterRedirects=i,this.state=n,this.shouldActivate=o}toString(){return`GuardsCheckEnd(id: ${this.id}, url: '${this.url}', urlAfterRedirects: '${this.urlAfterRedirects}', state: ${this.state}, shouldActivate: ${this.shouldActivate})`}},Ym=class extends cg{urlAfterRedirects;state;type=Xa.ResolveStart;constructor(e,A,i,n){super(e,A),this.urlAfterRedirects=i,this.state=n}toString(){return`ResolveStart(id: ${this.id}, url: '${this.url}', urlAfterRedirects: '${this.urlAfterRedirects}', state: ${this.state})`}},Hm=class extends cg{urlAfterRedirects;state;type=Xa.ResolveEnd;constructor(e,A,i,n){super(e,A),this.urlAfterRedirects=i,this.state=n}toString(){return`ResolveEnd(id: ${this.id}, url: '${this.url}', urlAfterRedirects: '${this.urlAfterRedirects}', state: ${this.state})`}},Tm=class{route;type=Xa.RouteConfigLoadStart;constructor(e){this.route=e}toString(){return`RouteConfigLoadStart(path: ${this.route.path})`}},Om=class{route;type=Xa.RouteConfigLoadEnd;constructor(e){this.route=e}toString(){return`RouteConfigLoadEnd(path: ${this.route.path})`}},zm=class{snapshot;type=Xa.ChildActivationStart;constructor(e){this.snapshot=e}toString(){return`ChildActivationStart(path: '${this.snapshot.routeConfig&&this.snapshot.routeConfig.path||\"\"}')`}},Pm=class{snapshot;type=Xa.ChildActivationEnd;constructor(e){this.snapshot=e}toString(){return`ChildActivationEnd(path: '${this.snapshot.routeConfig&&this.snapshot.routeConfig.path||\"\"}')`}},jm=class{snapshot;type=Xa.ActivationStart;constructor(e){this.snapshot=e}toString(){return`ActivationStart(path: '${this.snapshot.routeConfig&&this.snapshot.routeConfig.path||\"\"}')`}},qm=class{snapshot;type=Xa.ActivationEnd;constructor(e){this.snapshot=e}toString(){return`ActivationEnd(path: '${this.snapshot.routeConfig&&this.snapshot.routeConfig.path||\"\"}')`}},Wd=class{routerEvent;position;anchor;scrollBehavior;type=Xa.Scroll;constructor(e,A,i,n){this.routerEvent=e,this.position=A,this.anchor=i,this.scrollBehavior=n}toString(){let e=this.position?`${this.position[0]}, ${this.position[1]}`:null;return`Scroll(anchor: '${this.anchor}', position: '${e}')`}},Zd=class{},Th=class{},Xd=class{url;navigationBehaviorOptions;constructor(e,A){this.url=e,this.navigationBehaviorOptions=A}};function XsA(t){return!(t instanceof Zd)&&!(t instanceof Xd)&&!(t instanceof Th)}var Vm=class{rootInjector;outlet=null;route=null;children;attachRef=null;get injector(){return this.route?.snapshot._environmentInjector??this.rootInjector}constructor(e){this.rootInjector=e,this.children=new VI(this.rootInjector)}},VI=(()=>{class t{rootInjector;contexts=new Map;constructor(A){this.rootInjector=A}onChildOutletCreated(A,i){let n=this.getOrCreateContext(A);n.outlet=i,this.contexts.set(A,n)}onChildOutletDestroyed(A){let i=this.getContext(A);i&&(i.outlet=null,i.attachRef=null)}onOutletDeactivated(){let A=this.contexts;return this.contexts=new Map,A}onOutletReAttached(A){this.contexts=A}getOrCreateContext(A){let i=this.getContext(A);return i||(i=new Vm(this.rootInjector),this.contexts.set(A,i)),i}getContext(A){return this.contexts.get(A)||null}static \\u0275fac=function(i){return new(i||t)(Do(pr))};static \\u0275prov=TA({token:t,factory:t.\\u0275fac,providedIn:\"root\"})}return t})(),Wm=class{_root;constructor(e){this._root=e}get root(){return this._root.value}parent(e){let A=this.pathFromRoot(e);return A.length>1?A[A.length-2]:null}children(e){let A=ob(e,this._root);return A?A.children.map(i=>i.value):[]}firstChild(e){let A=ob(e,this._root);return A&&A.children.length>0?A.children[0].value:null}siblings(e){let A=ab(e,this._root);return A.length<2?[]:A[A.length-2].children.map(n=>n.value).filter(n=>n!==e)}pathFromRoot(e){return ab(e,this._root).map(A=>A.value)}};function ob(t,e){if(t===e.value)return e;for(let A of e.children){let i=ob(t,A);if(i)return i}return null}function ab(t,e){if(t===e.value)return[e];for(let A of e.children){let i=ab(t,A);if(i.length)return i.unshift(e),i}return[]}var lg=class{value;children;constructor(e,A){this.value=e,this.children=A}toString(){return`TreeNode(${this.value})`}};function Od(t){let e={};return t&&t.children.forEach(A=>e[A.value.outlet]=A),e}var Oh=class extends Wm{snapshot;constructor(e,A){super(e),this.snapshot=A,Bb(this,e)}toString(){return this.snapshot.toString()}};function rU(t,e){let A=$sA(t,e),i=new Jt([new OC(\"\",{})]),n=new Jt({}),o=new Jt({}),a=new Jt({}),r=new Jt(\"\"),s=new _s(i,n,a,r,o,Di,t,A.root);return s.snapshot=A.root,new Oh(new lg(s,[]),A)}function $sA(t,e){let A={},i={},n={},a=new $d([],A,n,\"\",i,Di,t,null,{},e);return new zh(\"\",new lg(a,[]))}var _s=class{urlSubject;paramsSubject;queryParamsSubject;fragmentSubject;dataSubject;outlet;component;snapshot;_futureSnapshot;_routerState;_paramMap;_queryParamMap;title;url;params;queryParams;fragment;data;constructor(e,A,i,n,o,a,r,s){this.urlSubject=e,this.paramsSubject=A,this.queryParamsSubject=i,this.fragmentSubject=n,this.dataSubject=o,this.outlet=a,this.component=r,this._futureSnapshot=s,this.title=this.dataSubject?.pipe(fe(g=>g[qh]))??oe(void 0),this.url=e,this.params=A,this.queryParams=i,this.fragment=n,this.data=o}get routeConfig(){return this._futureSnapshot.routeConfig}get root(){return this._routerState.root}get parent(){return this._routerState.parent(this)}get firstChild(){return this._routerState.firstChild(this)}get children(){return this._routerState.children(this)}get pathFromRoot(){return this._routerState.pathFromRoot(this)}get paramMap(){return this._paramMap??=this.params.pipe(fe(e=>zI(e))),this._paramMap}get queryParamMap(){return this._queryParamMap??=this.queryParams.pipe(fe(e=>zI(e))),this._queryParamMap}toString(){return this.snapshot?this.snapshot.toString():`Future(${this._futureSnapshot})`}};function db(t,e,A=\"emptyOnly\"){let i,{routeConfig:n}=t;return e!==null&&(A===\"always\"||n?.path===\"\"||!e.component&&!e.routeConfig?.loadComponent)?i={params:BA(BA({},e.params),t.params),data:BA(BA({},e.data),t.data),resolve:BA(BA(BA(BA({},t.data),e.data),n?.data),t._resolvedData)}:i={params:BA({},t.params),data:BA({},t.data),resolve:BA(BA({},t.data),t._resolvedData??{})},n&&gU(n)&&(i.resolve[qh]=n.title),i}var $d=class{url;params;queryParams;fragment;data;outlet;component;routeConfig;_resolve;_resolvedData;_routerState;_paramMap;_queryParamMap;_environmentInjector;get title(){return this.data?.[qh]}constructor(e,A,i,n,o,a,r,s,g,l){this.url=e,this.params=A,this.queryParams=i,this.fragment=n,this.data=o,this.outlet=a,this.component=r,this.routeConfig=s,this._resolve=g,this._environmentInjector=l}get root(){return this._routerState.root}get parent(){return this._routerState.parent(this)}get firstChild(){return this._routerState.firstChild(this)}get children(){return this._routerState.children(this)}get pathFromRoot(){return this._routerState.pathFromRoot(this)}get paramMap(){return this._paramMap??=zI(this.params),this._paramMap}get queryParamMap(){return this._queryParamMap??=zI(this.queryParams),this._queryParamMap}toString(){let e=this.url.map(i=>i.toString()).join(\"/\"),A=this.routeConfig?this.routeConfig.path:\"\";return`Route(url:'${e}', path:'${A}')`}},zh=class extends Wm{url;constructor(e,A){super(A),this.url=e,Bb(this,A)}toString(){return sU(this._root)}};function Bb(t,e){e.value._routerState=t,e.children.forEach(A=>Bb(t,A))}function sU(t){let e=t.children.length>0?` { ${t.children.map(sU).join(\", \")} } `:\"\";return`${t.value}${e}`}function X7(t){if(t.snapshot){let e=t.snapshot,A=t._futureSnapshot;t.snapshot=A,xc(e.queryParams,A.queryParams)||t.queryParamsSubject.next(A.queryParams),e.fragment!==A.fragment&&t.fragmentSubject.next(A.fragment),xc(e.params,A.params)||t.paramsSubject.next(A.params),bsA(e.url,A.url)||t.urlSubject.next(A.url),xc(e.data,A.data)||t.dataSubject.next(A.data)}else t.snapshot=t._futureSnapshot,t.dataSubject.next(t._futureSnapshot.data)}function rb(t,e){let A=xc(t.params,e.params)&&RsA(t.url,e.url),i=!t.parent!=!e.parent;return A&&!i&&(!t.parent||rb(t.parent,e.parent))}function gU(t){return typeof t.title==\"string\"||t.title===null}var lU=new wA(\"\"),Qb=(()=>{class t{activated=null;get activatedComponentRef(){return this.activated}_activatedRoute=null;name=Di;activateEvents=new WA;deactivateEvents=new WA;attachEvents=new WA;detachEvents=new WA;routerOutletData=nt();parentContexts=h(VI);location=h(Ro);changeDetector=h(ft);inputBinder=h(Vh,{optional:!0});supportsBindingToComponentInputs=!0;ngOnChanges(A){if(A.name){let{firstChange:i,previousValue:n}=A.name;if(i)return;this.isTrackedInParentContexts(n)&&(this.deactivate(),this.parentContexts.onChildOutletDestroyed(n)),this.initializeOutletWithName()}}ngOnDestroy(){this.isTrackedInParentContexts(this.name)&&this.parentContexts.onChildOutletDestroyed(this.name),this.inputBinder?.unsubscribeFromRouteData(this)}isTrackedInParentContexts(A){return this.parentContexts.getContext(A)?.outlet===this}ngOnInit(){this.initializeOutletWithName()}initializeOutletWithName(){if(this.parentContexts.onChildOutletCreated(this.name,this),this.activated)return;let A=this.parentContexts.getContext(this.name);A?.route&&(A.attachRef?this.attach(A.attachRef,A.route):this.activateWith(A.route,A.injector))}get isActivated(){return!!this.activated}get component(){if(!this.activated)throw new wt(4012,!1);return this.activated.instance}get activatedRoute(){if(!this.activated)throw new wt(4012,!1);return this._activatedRoute}get activatedRouteData(){return this._activatedRoute?this._activatedRoute.snapshot.data:{}}detach(){if(!this.activated)throw new wt(4012,!1);this.location.detach();let A=this.activated;return this.activated=null,this._activatedRoute=null,this.detachEvents.emit(A.instance),A}attach(A,i){this.activated=A,this._activatedRoute=i,this.location.insert(A.hostView),this.inputBinder?.bindActivatedRouteToOutletComponent(this),this.attachEvents.emit(A.instance)}deactivate(){if(this.activated){let A=this.component;this.activated.destroy(),this.activated=null,this._activatedRoute=null,this.deactivateEvents.emit(A)}}activateWith(A,i){if(this.isActivated)throw new wt(4013,!1);this._activatedRoute=A;let n=this.location,a=A.snapshot.component,r=this.parentContexts.getOrCreateContext(this.name).children,s=new sb(A,r,n.injector,this.routerOutletData);this.activated=n.createComponent(a,{index:n.length,injector:s,environmentInjector:i}),this.changeDetector.markForCheck(),this.inputBinder?.bindActivatedRouteToOutletComponent(this),this.activateEvents.emit(this.activated.instance)}static \\u0275fac=function(i){return new(i||t)};static \\u0275dir=OA({type:t,selectors:[[\"router-outlet\"]],inputs:{name:\"name\",routerOutletData:[1,\"routerOutletData\"]},outputs:{activateEvents:\"activate\",deactivateEvents:\"deactivate\",attachEvents:\"attach\",detachEvents:\"detach\"},exportAs:[\"outlet\"],features:[ei]})}return t})(),sb=class{route;childContexts;parent;outletData;constructor(e,A,i,n){this.route=e,this.childContexts=A,this.parent=i,this.outletData=n}get(e,A){return e===_s?this.route:e===VI?this.childContexts:e===lU?this.outletData:this.parent.get(e,A)}},Vh=new wA(\"\"),Eb=(()=>{class t{outletDataSubscriptions=new Map;bindActivatedRouteToOutletComponent(A){this.unsubscribeFromRouteData(A),this.subscribeToRouteData(A)}unsubscribeFromRouteData(A){this.outletDataSubscriptions.get(A)?.unsubscribe(),this.outletDataSubscriptions.delete(A)}subscribeToRouteData(A){let{activatedRoute:i}=A,n=Va([i.queryParams,i.params,i.data]).pipe(Ei(([o,a,r],s)=>(r=BA(BA(BA({},o),a),r),s===0?oe(r):Promise.resolve(r)))).subscribe(o=>{if(!A.isActivated||!A.activatedComponentRef||A.activatedRoute!==i||i.component===null){this.unsubscribeFromRouteData(A);return}let a=vL(i.component);if(!a){this.unsubscribeFromRouteData(A);return}for(let{templateName:r}of a.inputs)A.activatedComponentRef.setInput(r,o[r])});this.outletDataSubscriptions.set(A,n)}static \\u0275fac=function(i){return new(i||t)};static \\u0275prov=TA({token:t,factory:t.\\u0275fac})}return t})(),hb=(()=>{class t{static \\u0275fac=function(i){return new(i||t)};static \\u0275cmp=kA({type:t,selectors:[[\"ng-component\"]],exportAs:[\"emptyRouterOutlet\"],decls:1,vars:0,template:function(i,n){i&1&&GA(0,\"router-outlet\")},dependencies:[Qb],encapsulation:2})}return t})();function ub(t){let e=t.children&&t.children.map(ub),A=e?Ve(BA({},t),{children:e}):BA({},t);return!A.component&&!A.loadComponent&&(e||A.loadChildren)&&A.outlet&&A.outlet!==Di&&(A.component=hb),A}function AgA(t,e,A){let i=Ph(t,e._root,A?A._root:void 0);return new Oh(i,e)}function Ph(t,e,A){if(A&&t.shouldReuseRoute(e.value,A.value.snapshot)){let i=A.value;i._futureSnapshot=e.value;let n=egA(t,e,A);return new lg(i,n)}else{if(t.shouldAttach(e.value)){let o=t.retrieve(e.value);if(o!==null){let a=o.route;return a.value._futureSnapshot=e.value,a.children=e.children.map(r=>Ph(t,r)),a}}let i=tgA(e.value),n=e.children.map(o=>Ph(t,o));return new lg(i,n)}}function egA(t,e,A){return e.children.map(i=>{for(let n of A.children)if(t.shouldReuseRoute(i.value,n.value.snapshot))return Ph(t,i,n);return Ph(t,i)})}function tgA(t){return new _s(new Jt(t.url),new Jt(t.params),new Jt(t.queryParams),new Jt(t.fragment),new Jt(t.data),t.outlet,t.component,t)}var AB=class{redirectTo;navigationBehaviorOptions;constructor(e,A){this.redirectTo=e,this.navigationBehaviorOptions=A}},cU=\"ngNavigationCancelingError\";function Zm(t,e){let{redirectTo:A,navigationBehaviorOptions:i}=qd(e)?{redirectTo:e,navigationBehaviorOptions:void 0}:e,n=CU(!1,jr.Redirect);return n.url=A,n.navigationBehaviorOptions=i,n}function CU(t,e){let A=new Error(`NavigationCancelingError: ${t||\"\"}`);return A[cU]=!0,A.cancellationCode=e,A}function igA(t){return IU(t)&&qd(t.url)}function IU(t){return!!t&&t[cU]}var gb=class{routeReuseStrategy;futureState;currState;forwardEvent;inputBindingEnabled;constructor(e,A,i,n,o){this.routeReuseStrategy=e,this.futureState=A,this.currState=i,this.forwardEvent=n,this.inputBindingEnabled=o}activate(e){let A=this.futureState._root,i=this.currState?this.currState._root:null;this.deactivateChildRoutes(A,i,e),X7(this.futureState.root),this.activateChildRoutes(A,i,e)}deactivateChildRoutes(e,A,i){let n=Od(A);e.children.forEach(o=>{let a=o.value.outlet;this.deactivateRoutes(o,n[a],i),delete n[a]}),Object.values(n).forEach(o=>{this.deactivateRouteAndItsChildren(o,i)})}deactivateRoutes(e,A,i){let n=e.value,o=A?A.value:null;if(n===o)if(n.component){let a=i.getContext(n.outlet);a&&this.deactivateChildRoutes(e,A,a.children)}else this.deactivateChildRoutes(e,A,i);else o&&this.deactivateRouteAndItsChildren(A,i)}deactivateRouteAndItsChildren(e,A){e.value.component&&this.routeReuseStrategy.shouldDetach(e.value.snapshot)?this.detachAndStoreRouteSubtree(e,A):this.deactivateRouteAndOutlet(e,A)}detachAndStoreRouteSubtree(e,A){let i=A.getContext(e.value.outlet),n=i&&e.value.component?i.children:A,o=Od(e);for(let a of Object.values(o))this.deactivateRouteAndItsChildren(a,n);if(i&&i.outlet){let a=i.outlet.detach(),r=i.children.onOutletDeactivated();this.routeReuseStrategy.store(e.value.snapshot,{componentRef:a,route:e,contexts:r})}}deactivateRouteAndOutlet(e,A){let i=A.getContext(e.value.outlet),n=i&&e.value.component?i.children:A,o=Od(e);for(let a of Object.values(o))this.deactivateRouteAndItsChildren(a,n);i&&(i.outlet&&(i.outlet.deactivate(),i.children.onOutletDeactivated()),i.attachRef=null,i.route=null)}activateChildRoutes(e,A,i){let n=Od(A);e.children.forEach(o=>{this.activateRoutes(o,n[o.value.outlet],i),this.forwardEvent(new qm(o.value.snapshot))}),e.children.length&&this.forwardEvent(new Pm(e.value.snapshot))}activateRoutes(e,A,i){let n=e.value,o=A?A.value:null;if(X7(n),n===o)if(n.component){let a=i.getOrCreateContext(n.outlet);this.activateChildRoutes(e,A,a.children)}else this.activateChildRoutes(e,A,i);else if(n.component){let a=i.getOrCreateContext(n.outlet);if(this.routeReuseStrategy.shouldAttach(n.snapshot)){let r=this.routeReuseStrategy.retrieve(n.snapshot);this.routeReuseStrategy.store(n.snapshot,null),a.children.onOutletReAttached(r.contexts),a.attachRef=r.componentRef,a.route=r.route.value,a.outlet&&a.outlet.attach(r.componentRef,r.route.value),X7(r.route.value),this.activateChildRoutes(e,null,a.children)}else a.attachRef=null,a.route=n,a.outlet&&a.outlet.activateWith(n,a.injector),this.activateChildRoutes(e,null,a.children)}else this.activateChildRoutes(e,null,i)}},Xm=class{path;route;constructor(e){this.path=e,this.route=this.path[this.path.length-1]}},jd=class{component;route;constructor(e,A){this.component=e,this.route=A}};function ngA(t,e,A){let i=t._root,n=e?e._root:null;return Kh(i,n,A,[i.value])}function ogA(t){let e=t.routeConfig?t.routeConfig.canActivateChild:null;return!e||e.length===0?null:{node:t,guards:e}}function tB(t,e){let A=Symbol(),i=e.get(t,A);return i===A?typeof t==\"function\"&&!rL(t)?t:e.get(t):i}function Kh(t,e,A,i,n={canDeactivateChecks:[],canActivateChecks:[]}){let o=Od(e);return t.children.forEach(a=>{agA(a,o[a.value.outlet],A,i.concat([a.value]),n),delete o[a.value.outlet]}),Object.entries(o).forEach(([a,r])=>Jh(r,A.getContext(a),n)),n}function agA(t,e,A,i,n={canDeactivateChecks:[],canActivateChecks:[]}){let o=t.value,a=e?e.value:null,r=A?A.getContext(t.value.outlet):null;if(a&&o.routeConfig===a.routeConfig){let s=rgA(a,o,o.routeConfig.runGuardsAndResolvers);s?n.canActivateChecks.push(new Xm(i)):(o.data=a.data,o._resolvedData=a._resolvedData),o.component?Kh(t,e,r?r.children:null,i,n):Kh(t,e,A,i,n),s&&r&&r.outlet&&r.outlet.isActivated&&n.canDeactivateChecks.push(new jd(r.outlet.component,a))}else a&&Jh(e,r,n),n.canActivateChecks.push(new Xm(i)),o.component?Kh(t,null,r?r.children:null,i,n):Kh(t,null,A,i,n);return n}function rgA(t,e,A){if(typeof A==\"function\")return Ya(e._environmentInjector,()=>A(t,e));switch(A){case\"pathParamsChange\":return!OI(t.url,e.url);case\"pathParamsOrQueryParamsChange\":return!OI(t.url,e.url)||!xc(t.queryParams,e.queryParams);case\"always\":return!0;case\"paramsOrQueryParamsChange\":return!rb(t,e)||!xc(t.queryParams,e.queryParams);default:return!rb(t,e)}}function Jh(t,e,A){let i=Od(t),n=t.value;Object.entries(i).forEach(([o,a])=>{n.component?e?Jh(a,e.children.getContext(o),A):Jh(a,null,A):Jh(a,e,A)}),n.component?e&&e.outlet&&e.outlet.isActivated?A.canDeactivateChecks.push(new jd(e.outlet.component,n)):A.canDeactivateChecks.push(new jd(null,n)):A.canDeactivateChecks.push(new jd(null,n))}function Wh(t){return typeof t==\"function\"}function sgA(t){return typeof t==\"boolean\"}function ggA(t){return t&&Wh(t.canLoad)}function lgA(t){return t&&Wh(t.canActivate)}function cgA(t){return t&&Wh(t.canActivateChild)}function CgA(t){return t&&Wh(t.canDeactivate)}function IgA(t){return t&&Wh(t.canMatch)}function dU(t){return t instanceof eL||t?.name===\"EmptyError\"}var Rm=Symbol(\"INITIAL_VALUE\");function eB(){return Ei(t=>Va(t.map(e=>e.pipe(qn(1),nn(Rm)))).pipe(fe(e=>{for(let A of e)if(A!==!0){if(A===Rm)return Rm;if(A===!1||dgA(A))return A}return!0}),We(e=>e!==Rm),qn(1)))}function dgA(t){return qd(t)||t instanceof AB}function BU(t){return t.aborted?oe(void 0).pipe(qn(1)):new Ti(e=>{let A=()=>{e.next(),e.complete()};return t.addEventListener(\"abort\",A),()=>t.removeEventListener(\"abort\",A)})}function QU(t){return Bt(BU(t))}function BgA(t){return uc(e=>{let{targetSnapshot:A,currentSnapshot:i,guards:{canActivateChecks:n,canDeactivateChecks:o}}=e;return o.length===0&&n.length===0?oe(Ve(BA({},e),{guardsResult:!0})):QgA(o,A,i).pipe(uc(a=>a&&sgA(a)?EgA(A,n,t):oe(a)),fe(a=>Ve(BA({},e),{guardsResult:a})))})}function QgA(t,e,A){return mr(t).pipe(uc(i=>pgA(i.component,i.route,A,e)),po(i=>i!==!0,!0))}function EgA(t,e,A){return mr(e).pipe(qE(i=>lf(ugA(i.route.parent,A),hgA(i.route,A),mgA(t,i.path),fgA(t,i.route))),po(i=>i!==!0,!0))}function hgA(t,e){return t!==null&&e&&e(new jm(t)),oe(!0)}function ugA(t,e){return t!==null&&e&&e(new zm(t)),oe(!0)}function fgA(t,e){let A=e.routeConfig?e.routeConfig.canActivate:null;if(!A||A.length===0)return oe(!0);let i=A.map(n=>fc(()=>{let o=e._environmentInjector,a=tB(n,o),r=lgA(a)?a.canActivate(e,t):Ya(o,()=>a(e,t));return jI(r).pipe(po())}));return oe(i).pipe(eB())}function mgA(t,e){let A=e[e.length-1],n=e.slice(0,e.length-1).reverse().map(o=>ogA(o)).filter(o=>o!==null).map(o=>fc(()=>{let a=o.guards.map(r=>{let s=o.node._environmentInjector,g=tB(r,s),l=cgA(g)?g.canActivateChild(A,t):Ya(s,()=>g(A,t));return jI(l).pipe(po())});return oe(a).pipe(eB())}));return oe(n).pipe(eB())}function pgA(t,e,A,i){let n=e&&e.routeConfig?e.routeConfig.canDeactivate:null;if(!n||n.length===0)return oe(!0);let o=n.map(a=>{let r=e._environmentInjector,s=tB(a,r),g=CgA(s)?s.canDeactivate(t,e,A,i):Ya(r,()=>s(t,e,A,i));return jI(g).pipe(po())});return oe(o).pipe(eB())}function DgA(t,e,A,i,n){let o=e.canLoad;if(o===void 0||o.length===0)return oe(!0);let a=o.map(r=>{let s=tB(r,t),g=ggA(s)?s.canLoad(e,A):Ya(t,()=>s(e,A)),l=jI(g);return n?l.pipe(QU(n)):l});return oe(a).pipe(eB(),EU(i))}function EU(t){return XF(Wt(e=>{if(typeof e!=\"boolean\")throw Zm(t,e)}),fe(e=>e===!0))}function wgA(t,e,A,i,n,o){let a=e.canMatch;if(!a||a.length===0)return oe(!0);let r=a.map(s=>{let g=tB(s,t),l=IgA(g)?g.canMatch(e,A,n):Ya(t,()=>g(e,A,n));return jI(l).pipe(QU(o))});return oe(r).pipe(eB(),EU(i))}var k0=class t extends Error{segmentGroup;constructor(e){super(),this.segmentGroup=e||null,Object.setPrototypeOf(this,t.prototype)}},jh=class t extends Error{urlTree;constructor(e){super(),this.urlTree=e,Object.setPrototypeOf(this,t.prototype)}};function ygA(t){throw new wt(4e3,!1)}function vgA(t){throw CU(!1,jr.GuardRejected)}var lb=class{urlSerializer;urlTree;constructor(e,A){this.urlSerializer=e,this.urlTree=A}lineralizeSegments(e,A){return ct(this,null,function*(){let i=[],n=A.root;for(;;){if(i=i.concat(n.segments),n.numberOfChildren===0)return i;if(n.numberOfChildren>1||!n.children[Di])throw ygA(`${e.redirectTo}`);n=n.children[Di]}})}applyRedirectCommands(e,A,i,n,o){return ct(this,null,function*(){let a=yield bgA(A,n,o);if(a instanceof Gg)throw new jh(a);let r=this.applyRedirectCreateUrlTree(a,this.urlSerializer.parse(a),e,i);if(a[0]===\"/\")throw new jh(r);return r})}applyRedirectCreateUrlTree(e,A,i,n){let o=this.createSegmentGroup(e,A.root,i,n);return new Gg(o,this.createQueryParams(A.queryParams,this.urlTree.queryParams),A.fragment)}createQueryParams(e,A){let i={};return Object.entries(e).forEach(([n,o])=>{if(typeof o==\"string\"&&o[0]===\":\"){let r=o.substring(1);i[n]=A[r]}else i[n]=o}),i}createSegmentGroup(e,A,i,n){let o=this.createSegments(e,A.segments,i,n),a={};return Object.entries(A.children).forEach(([r,s])=>{a[r]=this.createSegmentGroup(e,s,i,n)}),new Wn(o,a)}createSegments(e,A,i,n){return A.map(o=>o.path[0]===\":\"?this.findPosParam(e,o,n):this.findOrReturn(o,i))}findPosParam(e,A,i){let n=i[A.path.substring(1)];if(!n)throw new wt(4001,!1);return n}findOrReturn(e,A){let i=0;for(let n of A){if(n.path===e.path)return A.splice(i),n;i++}return e}};function bgA(t,e,A){if(typeof t==\"string\")return Promise.resolve(t);let i=t;return _m(jI(Ya(A,()=>i(e))))}function MgA(t,e){return t.providers&&!t._injector&&(t._injector=uf(t.providers,e,`Route: ${t.path}`)),t._injector??e}function Rc(t){return t.outlet||Di}function kgA(t,e){let A=t.filter(i=>Rc(i)===e);return A.push(...t.filter(i=>Rc(i)!==e)),A}var cb={matched:!1,consumedSegments:[],remainingSegments:[],parameters:{},positionalParamSegments:{}};function hU(t){return{routeConfig:t.routeConfig,url:t.url,params:t.params,queryParams:t.queryParams,fragment:t.fragment,data:t.data,outlet:t.outlet,title:t.title,paramMap:t.paramMap,queryParamMap:t.queryParamMap}}function SgA(t,e,A,i,n,o,a){let r=uU(t,e,A);if(!r.matched)return oe(r);let s=hU(o(r));return i=MgA(e,i),wgA(i,e,A,n,s,a).pipe(fe(g=>g===!0?r:BA({},cb)))}function uU(t,e,A){if(e.path===\"\")return e.pathMatch===\"full\"&&(t.hasChildren()||A.length>0)?BA({},cb):{matched:!0,consumedSegments:[],remainingSegments:A,parameters:{},positionalParamSegments:{}};let n=(e.matcher||TK)(A,t,e);if(!n)return BA({},cb);let o={};Object.entries(n.posParams??{}).forEach(([r,s])=>{o[r]=s.path});let a=n.consumed.length>0?BA(BA({},o),n.consumed[n.consumed.length-1].parameters):o;return{matched:!0,consumedSegments:n.consumed,remainingSegments:A.slice(n.consumed.length),parameters:a,positionalParamSegments:n.posParams??{}}}function YK(t,e,A,i){return A.length>0&&NgA(t,A,i)?{segmentGroup:new Wn(e,RgA(i,new Wn(A,t.children))),slicedSegments:[]}:A.length===0&&FgA(t,A,i)?{segmentGroup:new Wn(t.segments,xgA(t,A,i,t.children)),slicedSegments:A}:{segmentGroup:new Wn(t.segments,t.children),slicedSegments:A}}function xgA(t,e,A,i){let n={};for(let o of A)if(Ap(t,e,o)&&!i[Rc(o)]){let a=new Wn([],{});n[Rc(o)]=a}return BA(BA({},i),n)}function RgA(t,e){let A={};A[Di]=e;for(let i of t)if(i.path===\"\"&&Rc(i)!==Di){let n=new Wn([],{});A[Rc(i)]=n}return A}function NgA(t,e,A){return A.some(i=>Ap(t,e,i)&&Rc(i)!==Di)}function FgA(t,e,A){return A.some(i=>Ap(t,e,i))}function Ap(t,e,A){return(t.hasChildren()||e.length>0)&&A.pathMatch===\"full\"?!1:A.path===\"\"}function LgA(t,e,A){return e.length===0&&!t.children[A]}var Cb=class{};function _gA(t,e,A,i,n,o,a=\"emptyOnly\",r){return ct(this,null,function*(){return new Ib(t,e,A,i,n,a,o,r).recognize()})}var GgA=31,Ib=class{injector;configLoader;rootComponentType;config;urlTree;paramsInheritanceStrategy;urlSerializer;abortSignal;applyRedirects;absoluteRedirectCount=0;allowRedirects=!0;constructor(e,A,i,n,o,a,r,s){this.injector=e,this.configLoader=A,this.rootComponentType=i,this.config=n,this.urlTree=o,this.paramsInheritanceStrategy=a,this.urlSerializer=r,this.abortSignal=s,this.applyRedirects=new lb(this.urlSerializer,this.urlTree)}noMatchError(e){return new wt(4002,`'${e.segmentGroup}'`)}recognize(){return ct(this,null,function*(){let e=YK(this.urlTree.root,[],[],this.config).segmentGroup,{children:A,rootSnapshot:i}=yield this.match(e),n=new lg(i,A),o=new zh(\"\",n),a=eU(i,[],this.urlTree.queryParams,this.urlTree.fragment);return a.queryParams=this.urlTree.queryParams,o.url=this.urlSerializer.serialize(a),{state:o,tree:a}})}match(e){return ct(this,null,function*(){let A=new $d([],Object.freeze({}),Object.freeze(BA({},this.urlTree.queryParams)),this.urlTree.fragment,Object.freeze({}),Di,this.rootComponentType,null,{},this.injector);try{return{children:yield this.processSegmentGroup(this.injector,this.config,e,Di,A),rootSnapshot:A}}catch(i){if(i instanceof jh)return this.urlTree=i.urlTree,this.match(i.urlTree.root);throw i instanceof k0?this.noMatchError(i):i}})}processSegmentGroup(e,A,i,n,o){return ct(this,null,function*(){if(i.segments.length===0&&i.hasChildren())return this.processChildren(e,A,i,o);let a=yield this.processSegment(e,A,i,i.segments,n,!0,o);return a instanceof lg?[a]:[]})}processChildren(e,A,i,n){return ct(this,null,function*(){let o=[];for(let s of Object.keys(i.children))s===\"primary\"?o.unshift(s):o.push(s);let a=[];for(let s of o){let g=i.children[s],l=kgA(A,s),C=yield this.processSegmentGroup(e,l,g,s,n);a.push(...C)}let r=fU(a);return KgA(r),r})}processSegment(e,A,i,n,o,a,r){return ct(this,null,function*(){for(let s of A)try{return yield this.processSegmentAgainstRoute(s._injector??e,A,s,i,n,o,a,r)}catch(g){if(g instanceof k0||dU(g))continue;throw g}if(LgA(i,n,o))return new Cb;throw new k0(i)})}processSegmentAgainstRoute(e,A,i,n,o,a,r,s){return ct(this,null,function*(){if(Rc(i)!==a&&(a===Di||!Ap(n,o,i)))throw new k0(n);if(i.redirectTo===void 0)return this.matchSegmentAgainstRoute(e,n,i,o,a,s);if(this.allowRedirects&&r)return this.expandSegmentAgainstRouteUsingRedirect(e,n,A,i,o,a,s);throw new k0(n)})}expandSegmentAgainstRouteUsingRedirect(e,A,i,n,o,a,r){return ct(this,null,function*(){let{matched:s,parameters:g,consumedSegments:l,positionalParamSegments:C,remainingSegments:I}=uU(A,n,o);if(!s)throw new k0(A);typeof n.redirectTo==\"string\"&&n.redirectTo[0]===\"/\"&&(this.absoluteRedirectCount++,this.absoluteRedirectCount>GgA&&(this.allowRedirects=!1));let d=this.createSnapshot(e,n,o,g,r);if(this.abortSignal.aborted)throw new Error(this.abortSignal.reason);let B=yield this.applyRedirects.applyRedirectCommands(l,n.redirectTo,C,hU(d),e),Q=yield this.applyRedirects.lineralizeSegments(n,B);return this.processSegment(e,i,A,Q.concat(I),a,!1,r)})}createSnapshot(e,A,i,n,o){let a=new $d(i,n,Object.freeze(BA({},this.urlTree.queryParams)),this.urlTree.fragment,JgA(A),Rc(A),A.component??A._loadedComponent??null,A,YgA(A),e),r=db(a,o,this.paramsInheritanceStrategy);return a.params=Object.freeze(r.params),a.data=Object.freeze(r.data),a}matchSegmentAgainstRoute(e,A,i,n,o,a){return ct(this,null,function*(){if(this.abortSignal.aborted)throw new Error(this.abortSignal.reason);let r=R=>this.createSnapshot(e,i,R.consumedSegments,R.parameters,a),s=yield _m(SgA(A,i,n,e,this.urlSerializer,r,this.abortSignal));if(i.path===\"**\"&&(A.children={}),!s?.matched)throw new k0(A);e=i._injector??e;let{routes:g}=yield this.getChildConfig(e,i,n),l=i._loadedInjector??e,{parameters:C,consumedSegments:I,remainingSegments:d}=s,B=this.createSnapshot(e,i,I,C,a),{segmentGroup:Q,slicedSegments:E}=YK(A,I,d,g);if(E.length===0&&Q.hasChildren()){let R=yield this.processChildren(l,g,Q,B);return new lg(B,R)}if(g.length===0&&E.length===0)return new lg(B,[]);let f=Rc(i)===o,b=yield this.processSegment(l,g,Q,E,f?Di:o,!0,B);return new lg(B,b instanceof lg?[b]:[])})}getChildConfig(e,A,i){return ct(this,null,function*(){if(A.children)return{routes:A.children,injector:e};if(A.loadChildren){if(A._loadedRoutes!==void 0){let o=A._loadedNgModuleFactory;return o&&!A._loadedInjector&&(A._loadedInjector=o.create(e).injector),{routes:A._loadedRoutes,injector:A._loadedInjector}}if(this.abortSignal.aborted)throw new Error(this.abortSignal.reason);if(yield _m(DgA(e,A,i,this.urlSerializer,this.abortSignal))){let o=yield this.configLoader.loadChildren(e,A);return A._loadedRoutes=o.routes,A._loadedInjector=o.injector,A._loadedNgModuleFactory=o.factory,o}throw vgA(A)}return{routes:[],injector:e}})}};function KgA(t){t.sort((e,A)=>e.value.outlet===Di?-1:A.value.outlet===Di?1:e.value.outlet.localeCompare(A.value.outlet))}function UgA(t){let e=t.value.routeConfig;return e&&e.path===\"\"}function fU(t){let e=[],A=new Set;for(let i of t){if(!UgA(i)){e.push(i);continue}let n=e.find(o=>i.value.routeConfig===o.value.routeConfig);n!==void 0?(n.children.push(...i.children),A.add(n)):e.push(i)}for(let i of A){let n=fU(i.children);e.push(new lg(i.value,n))}return e.filter(i=>!A.has(i))}function JgA(t){return t.data||{}}function YgA(t){return t.resolve||{}}function HgA(t,e,A,i,n,o,a){return uc(r=>ct(null,null,function*(){let{state:s,tree:g}=yield _gA(t,e,A,i,r.extractedUrl,n,o,a);return Ve(BA({},r),{targetSnapshot:s,urlAfterRedirects:g})}))}function TgA(t){return uc(e=>{let{targetSnapshot:A,guards:{canActivateChecks:i}}=e;if(!i.length)return oe(e);let n=new Set(i.map(r=>r.route)),o=new Set;for(let r of n)if(!o.has(r))for(let s of mU(r))o.add(s);let a=0;return mr(o).pipe(qE(r=>n.has(r)?OgA(r,A,t):(r.data=db(r,r.parent,t).resolve,oe(void 0))),Wt(()=>a++),Bv(1),uc(r=>a===o.size?oe(e):xa))})}function mU(t){let e=t.children.map(A=>mU(A)).flat();return[t,...e]}function OgA(t,e,A){let i=t.routeConfig,n=t._resolve;return i?.title!==void 0&&!gU(i)&&(n[qh]=i.title),fc(()=>(t.data=db(t,t.parent,A).resolve,zgA(n,t,e).pipe(fe(o=>(t._resolvedData=o,t.data=BA(BA({},t.data),o),null)))))}function zgA(t,e,A){let i=Ab(t);if(i.length===0)return oe({});let n={};return mr(i).pipe(uc(o=>PgA(t[o],e,A).pipe(po(),Wt(a=>{if(a instanceof AB)throw Zm(new S0,a);n[o]=a}))),Bv(1),fe(()=>n),Ho(o=>dU(o)?xa:gf(o)))}function PgA(t,e,A){let i=e._environmentInjector,n=tB(t,i),o=n.resolve?n.resolve(e,A):Ya(i,()=>n(e,A));return jI(o)}function HK(t){return Ei(e=>{let A=t(e);return A?mr(A).pipe(fe(()=>e)):oe(e)})}var fb=(()=>{class t{buildTitle(A){let i,n=A.root;for(;n!==void 0;)i=this.getResolvedTitleForRoute(n)??i,n=n.children.find(o=>o.outlet===Di);return i}getResolvedTitleForRoute(A){return A.data[qh]}static \\u0275fac=function(i){return new(i||t)};static \\u0275prov=TA({token:t,factory:()=>h(pU),providedIn:\"root\"})}return t})(),pU=(()=>{class t extends fb{title;constructor(A){super(),this.title=A}updateTitle(A){let i=this.buildTitle(A);i!==void 0&&this.title.setTitle(i)}static \\u0275fac=function(i){return new(i||t)(Do(FL))};static \\u0275prov=TA({token:t,factory:t.\\u0275fac,providedIn:\"root\"})}return t})(),WI=new wA(\"\",{factory:()=>({})}),iB=new wA(\"\"),ep=(()=>{class t{componentLoaders=new WeakMap;childrenLoaders=new WeakMap;onLoadStartListener;onLoadEndListener;compiler=h(uL);loadComponent(A,i){return ct(this,null,function*(){if(this.componentLoaders.get(i))return this.componentLoaders.get(i);if(i._loadedComponent)return Promise.resolve(i._loadedComponent);this.onLoadStartListener&&this.onLoadStartListener(i);let n=ct(this,null,function*(){try{let o=yield zK(Ya(A,()=>i.loadComponent())),a=yield yU(wU(o));return this.onLoadEndListener&&this.onLoadEndListener(i),i._loadedComponent=a,a}finally{this.componentLoaders.delete(i)}});return this.componentLoaders.set(i,n),n})}loadChildren(A,i){if(this.childrenLoaders.get(i))return this.childrenLoaders.get(i);if(i._loadedRoutes)return Promise.resolve({routes:i._loadedRoutes,injector:i._loadedInjector});this.onLoadStartListener&&this.onLoadStartListener(i);let n=ct(this,null,function*(){try{let o=yield DU(i,this.compiler,A,this.onLoadEndListener);return i._loadedRoutes=o.routes,i._loadedInjector=o.injector,i._loadedNgModuleFactory=o.factory,o}finally{this.childrenLoaders.delete(i)}});return this.childrenLoaders.set(i,n),n}static \\u0275fac=function(i){return new(i||t)};static \\u0275prov=TA({token:t,factory:t.\\u0275fac,providedIn:\"root\"})}return t})();function DU(t,e,A,i){return ct(this,null,function*(){let n=yield zK(Ya(A,()=>t.loadChildren())),o=yield yU(wU(n)),a;o instanceof IL||Array.isArray(o)?a=o:a=yield e.compileModuleAsync(o),i&&i(t);let r,s,g=!1,l;return Array.isArray(a)?(s=a,g=!0):(r=a.create(A).injector,l=a,s=r.get(iB,[],{optional:!0,self:!0}).flat()),{routes:s.map(ub),injector:r,factory:l}})}function jgA(t){return t&&typeof t==\"object\"&&\"default\"in t}function wU(t){return jgA(t)?t.default:t}function yU(t){return ct(this,null,function*(){return t})}var tp=(()=>{class t{static \\u0275fac=function(i){return new(i||t)};static \\u0275prov=TA({token:t,factory:()=>h(qgA),providedIn:\"root\"})}return t})(),qgA=(()=>{class t{shouldProcessUrl(A){return!0}extract(A){return A}merge(A,i){return A}static \\u0275fac=function(i){return new(i||t)};static \\u0275prov=TA({token:t,factory:t.\\u0275fac,providedIn:\"root\"})}return t})(),mb=new wA(\"\"),pb=new wA(\"\");function vU(t,e,A){let i=t.get(pb),n=t.get(Zt);if(!n.startViewTransition||i.skipNextTransition)return i.skipNextTransition=!1,new Promise(g=>setTimeout(g));let o,a=new Promise(g=>{o=g}),r=n.startViewTransition(()=>(o(),VgA(t)));r.updateCallbackDone.catch(g=>{}),r.ready.catch(g=>{}),r.finished.catch(g=>{});let{onViewTransitionCreated:s}=i;return s&&Ya(t,()=>s({transition:r,from:e,to:A})),a}function VgA(t){return new Promise(e=>{Nn({read:()=>setTimeout(e)},{injector:t})})}var WgA=()=>{},Db=new wA(\"\"),ip=(()=>{class t{currentNavigation=jA(null,{equal:()=>!1});currentTransition=null;lastSuccessfulNavigation=jA(null);events=new $A;transitionAbortWithErrorSubject=new $A;configLoader=h(ep);environmentInjector=h(pr);destroyRef=h(Wa);urlSerializer=h(qI);rootContexts=h(VI);location=h(wc);inputBindingEnabled=h(Vh,{optional:!0})!==null;titleStrategy=h(fb);options=h(WI,{optional:!0})||{};paramsInheritanceStrategy=this.options.paramsInheritanceStrategy||\"emptyOnly\";urlHandlingStrategy=h(tp);createViewTransition=h(mb,{optional:!0});navigationErrorHandler=h(Db,{optional:!0});navigationId=0;get hasRequestedNavigation(){return this.navigationId!==0}transitions;afterPreactivation=()=>oe(void 0);rootComponentType=null;destroyed=!1;constructor(){let A=n=>this.events.next(new Tm(n)),i=n=>this.events.next(new Om(n));this.configLoader.onLoadEndListener=i,this.configLoader.onLoadStartListener=A,this.destroyRef.onDestroy(()=>{this.destroyed=!0})}complete(){this.transitions?.complete()}handleNavigationRequest(A){let i=++this.navigationId;Zo(()=>{this.transitions?.next(Ve(BA({},A),{extractedUrl:this.urlHandlingStrategy.extract(A.rawUrl),targetSnapshot:null,targetRouterState:null,guards:{canActivateChecks:[],canDeactivateChecks:[]},guardsResult:null,id:i,routesRecognizeHandler:{},beforeActivateHandler:{}}))})}setupNavigations(A){return this.transitions=new Jt(null),this.transitions.pipe(We(i=>i!==null),Ei(i=>{let n=!1,o=new AbortController,a=()=>!n&&this.currentTransition?.id===i.id;return oe(i).pipe(Ei(r=>{if(this.navigationId>i.id)return this.cancelNavigationTransition(i,\"\",jr.SupersededByNewNavigation),xa;this.currentTransition=i;let s=this.lastSuccessfulNavigation();this.currentNavigation.set({id:r.id,initialUrl:r.rawUrl,extractedUrl:r.extractedUrl,targetBrowserUrl:typeof r.extras.browserUrl==\"string\"?this.urlSerializer.parse(r.extras.browserUrl):r.extras.browserUrl,trigger:r.source,extras:r.extras,previousNavigation:s?Ve(BA({},s),{previousNavigation:null}):null,abort:()=>o.abort(),routesRecognizeHandler:r.routesRecognizeHandler,beforeActivateHandler:r.beforeActivateHandler});let g=!A.navigated||this.isUpdatingInternalState()||this.isUpdatedBrowserUrl(),l=r.extras.onSameUrlNavigation??A.onSameUrlNavigation;if(!g&&l!==\"reload\")return this.events.next(new Nc(r.id,this.urlSerializer.serialize(r.rawUrl),\"\",Vd.IgnoredSameUrlNavigation)),r.resolve(!1),xa;if(this.urlHandlingStrategy.shouldProcessUrl(r.rawUrl))return oe(r).pipe(Ei(C=>(this.events.next(new zC(C.id,this.urlSerializer.serialize(C.extractedUrl),C.source,C.restoredState)),C.id!==this.navigationId?xa:Promise.resolve(C))),HgA(this.environmentInjector,this.configLoader,this.rootComponentType,A.config,this.urlSerializer,this.paramsInheritanceStrategy,o.signal),Wt(C=>{i.targetSnapshot=C.targetSnapshot,i.urlAfterRedirects=C.urlAfterRedirects,this.currentNavigation.update(I=>(I.finalUrl=C.urlAfterRedirects,I)),this.events.next(new Th)}),Ei(C=>mr(i.routesRecognizeHandler.deferredHandle??oe(void 0)).pipe(fe(()=>C))),Wt(()=>{let C=new Hh(r.id,this.urlSerializer.serialize(r.extractedUrl),this.urlSerializer.serialize(r.urlAfterRedirects),r.targetSnapshot);this.events.next(C)}));if(g&&this.urlHandlingStrategy.shouldProcessUrl(r.currentRawUrl)){let{id:C,extractedUrl:I,source:d,restoredState:B,extras:Q}=r,E=new zC(C,this.urlSerializer.serialize(I),d,B);this.events.next(E);let f=rU(this.rootComponentType,this.environmentInjector).snapshot;return this.currentTransition=i=Ve(BA({},r),{targetSnapshot:f,urlAfterRedirects:I,extras:Ve(BA({},Q),{skipLocationChange:!1,replaceUrl:!1})}),this.currentNavigation.update(b=>(b.finalUrl=I,b)),oe(i)}else return this.events.next(new Nc(r.id,this.urlSerializer.serialize(r.extractedUrl),\"\",Vd.IgnoredByUrlHandlingStrategy)),r.resolve(!1),xa}),fe(r=>{let s=new Um(r.id,this.urlSerializer.serialize(r.extractedUrl),this.urlSerializer.serialize(r.urlAfterRedirects),r.targetSnapshot);return this.events.next(s),this.currentTransition=i=Ve(BA({},r),{guards:ngA(r.targetSnapshot,r.currentSnapshot,this.rootContexts)}),i}),BgA(r=>this.events.next(r)),Ei(r=>{if(i.guardsResult=r.guardsResult,r.guardsResult&&typeof r.guardsResult!=\"boolean\")throw Zm(this.urlSerializer,r.guardsResult);let s=new Jm(r.id,this.urlSerializer.serialize(r.extractedUrl),this.urlSerializer.serialize(r.urlAfterRedirects),r.targetSnapshot,!!r.guardsResult);if(this.events.next(s),!a())return xa;if(!r.guardsResult)return this.cancelNavigationTransition(r,\"\",jr.GuardRejected),xa;if(r.guards.canActivateChecks.length===0)return oe(r);let g=new Ym(r.id,this.urlSerializer.serialize(r.extractedUrl),this.urlSerializer.serialize(r.urlAfterRedirects),r.targetSnapshot);if(this.events.next(g),!a())return xa;let l=!1;return oe(r).pipe(TgA(this.paramsInheritanceStrategy),Wt({next:()=>{l=!0;let C=new Hm(r.id,this.urlSerializer.serialize(r.extractedUrl),this.urlSerializer.serialize(r.urlAfterRedirects),r.targetSnapshot);this.events.next(C)},complete:()=>{l||this.cancelNavigationTransition(r,\"\",jr.NoDataFromResolver)}}))}),HK(r=>{let s=l=>{let C=[];if(l.routeConfig?._loadedComponent)l.component=l.routeConfig?._loadedComponent;else if(l.routeConfig?.loadComponent){let I=l._environmentInjector;C.push(this.configLoader.loadComponent(I,l.routeConfig).then(d=>{l.component=d}))}for(let I of l.children)C.push(...s(I));return C},g=s(r.targetSnapshot.root);return g.length===0?oe(r):mr(Promise.all(g).then(()=>r))}),HK(()=>this.afterPreactivation()),Ei(()=>{let{currentSnapshot:r,targetSnapshot:s}=i,g=this.createViewTransition?.(this.environmentInjector,r.root,s.root);return g?mr(g).pipe(fe(()=>i)):oe(i)}),qn(1),Ei(r=>{let s=AgA(A.routeReuseStrategy,r.targetSnapshot,r.currentRouterState);this.currentTransition=i=r=Ve(BA({},r),{targetRouterState:s}),this.currentNavigation.update(l=>(l.targetRouterState=s,l)),this.events.next(new Zd);let g=i.beforeActivateHandler.deferredHandle;return g?mr(g.then(()=>r)):oe(r)}),Wt(r=>{new gb(A.routeReuseStrategy,i.targetRouterState,i.currentRouterState,s=>this.events.next(s),this.inputBindingEnabled).activate(this.rootContexts),a()&&(n=!0,this.currentNavigation.update(s=>(s.abort=WgA,s)),this.lastSuccessfulNavigation.set(Zo(this.currentNavigation)),this.events.next(new Ml(r.id,this.urlSerializer.serialize(r.extractedUrl),this.urlSerializer.serialize(r.urlAfterRedirects))),this.titleStrategy?.updateTitle(r.targetRouterState.snapshot),r.resolve(!0))}),Bt(BU(o.signal).pipe(We(()=>!n&&!i.targetRouterState),Wt(()=>{this.cancelNavigationTransition(i,o.signal.reason+\"\",jr.Aborted)}))),Wt({complete:()=>{n=!0}}),Bt(this.transitionAbortWithErrorSubject.pipe(Wt(r=>{throw r}))),If(()=>{o.abort(),n||this.cancelNavigationTransition(i,\"\",jr.SupersededByNewNavigation),this.currentTransition?.id===i.id&&(this.currentNavigation.set(null),this.currentTransition=null)}),Ho(r=>{if(n=!0,this.destroyed)return i.resolve(!1),xa;if(IU(r))this.events.next(new _g(i.id,this.urlSerializer.serialize(i.extractedUrl),r.message,r.cancellationCode)),igA(r)?this.events.next(new Xd(r.url,r.navigationBehaviorOptions)):i.resolve(!1);else{let s=new PI(i.id,this.urlSerializer.serialize(i.extractedUrl),r,i.targetSnapshot??void 0);try{let g=Ya(this.environmentInjector,()=>this.navigationErrorHandler?.(s));if(g instanceof AB){let{message:l,cancellationCode:C}=Zm(this.urlSerializer,g);this.events.next(new _g(i.id,this.urlSerializer.serialize(i.extractedUrl),l,C)),this.events.next(new Xd(g.redirectTo,g.navigationBehaviorOptions))}else throw this.events.next(s),r}catch(g){this.options.resolveNavigationPromiseOnError?i.resolve(!1):i.reject(g)}}return xa}))}))}cancelNavigationTransition(A,i,n){let o=new _g(A.id,this.urlSerializer.serialize(A.extractedUrl),i,n);this.events.next(o),A.resolve(!1)}isUpdatingInternalState(){return this.currentTransition?.extractedUrl.toString()!==this.currentTransition?.currentUrlTree.toString()}isUpdatedBrowserUrl(){let A=this.urlHandlingStrategy.extract(this.urlSerializer.parse(this.location.path(!0))),i=Zo(this.currentNavigation),n=i?.targetBrowserUrl??i?.extractedUrl;return A.toString()!==n?.toString()&&!i?.extras.skipLocationChange}static \\u0275fac=function(i){return new(i||t)};static \\u0275prov=TA({token:t,factory:t.\\u0275fac,providedIn:\"root\"})}return t})();function ZgA(t){return t!==Pd}var bU=new wA(\"\");var MU=(()=>{class t{static \\u0275fac=function(i){return new(i||t)};static \\u0275prov=TA({token:t,factory:()=>h(XgA),providedIn:\"root\"})}return t})(),$m=class{shouldDetach(e){return!1}store(e,A){}shouldAttach(e){return!1}retrieve(e){return null}shouldReuseRoute(e,A){return e.routeConfig===A.routeConfig}shouldDestroyInjector(e){return!0}},XgA=(()=>{class t extends $m{static \\u0275fac=(()=>{let A;return function(n){return(A||(A=hi(t)))(n||t)}})();static \\u0275prov=TA({token:t,factory:t.\\u0275fac,providedIn:\"root\"})}return t})(),wb=(()=>{class t{urlSerializer=h(qI);options=h(WI,{optional:!0})||{};canceledNavigationResolution=this.options.canceledNavigationResolution||\"replace\";location=h(wc);urlHandlingStrategy=h(tp);urlUpdateStrategy=this.options.urlUpdateStrategy||\"deferred\";currentUrlTree=new Gg;getCurrentUrlTree(){return this.currentUrlTree}rawUrlTree=this.currentUrlTree;getRawUrlTree(){return this.rawUrlTree}createBrowserPath({finalUrl:A,initialUrl:i,targetBrowserUrl:n}){let o=A!==void 0?this.urlHandlingStrategy.merge(A,i):i,a=n??o;return a instanceof Gg?this.urlSerializer.serialize(a):a}commitTransition({targetRouterState:A,finalUrl:i,initialUrl:n}){i&&A?(this.currentUrlTree=i,this.rawUrlTree=this.urlHandlingStrategy.merge(i,n),this.routerState=A):this.rawUrlTree=n}routerState=rU(null,h(pr));getRouterState(){return this.routerState}_stateMemento=this.createStateMemento();get stateMemento(){return this._stateMemento}updateStateMemento(){this._stateMemento=this.createStateMemento()}createStateMemento(){return{rawUrlTree:this.rawUrlTree,currentUrlTree:this.currentUrlTree,routerState:this.routerState}}restoredState(){return this.location.getState()}static \\u0275fac=function(i){return new(i||t)};static \\u0275prov=TA({token:t,factory:()=>h($gA),providedIn:\"root\"})}return t})(),$gA=(()=>{class t extends wb{currentPageId=0;lastSuccessfulId=-1;get browserPageId(){return this.canceledNavigationResolution!==\"computed\"?this.currentPageId:this.restoredState()?.\\u0275routerPageId??this.currentPageId}registerNonRouterCurrentEntryChangeListener(A){return this.location.subscribe(i=>{i.type===\"popstate\"&&setTimeout(()=>{A(i.url,i.state,\"popstate\",{replaceUrl:!0})})})}handleRouterEvent(A,i){A instanceof zC?this.updateStateMemento():A instanceof Nc?this.commitTransition(i):A instanceof Hh?this.urlUpdateStrategy===\"eager\"&&(i.extras.skipLocationChange||this.setBrowserUrl(this.createBrowserPath(i),i)):A instanceof Zd?(this.commitTransition(i),this.urlUpdateStrategy===\"deferred\"&&!i.extras.skipLocationChange&&this.setBrowserUrl(this.createBrowserPath(i),i)):A instanceof _g&&!aU(A)?this.restoreHistory(i):A instanceof PI?this.restoreHistory(i,!0):A instanceof Ml&&(this.lastSuccessfulId=A.id,this.currentPageId=this.browserPageId)}setBrowserUrl(A,{extras:i,id:n}){let{replaceUrl:o,state:a}=i;if(this.location.isCurrentPathEqualTo(A)||o){let r=this.browserPageId,s=BA(BA({},a),this.generateNgRouterState(n,r));this.location.replaceState(A,\"\",s)}else{let r=BA(BA({},a),this.generateNgRouterState(n,this.browserPageId+1));this.location.go(A,\"\",r)}}restoreHistory(A,i=!1){if(this.canceledNavigationResolution===\"computed\"){let n=this.browserPageId,o=this.currentPageId-n;o!==0?this.location.historyGo(o):this.getCurrentUrlTree()===A.finalUrl&&o===0&&(this.resetInternalState(A),this.resetUrlToCurrentUrlTree())}else this.canceledNavigationResolution===\"replace\"&&(i&&this.resetInternalState(A),this.resetUrlToCurrentUrlTree())}resetInternalState({finalUrl:A}){this.routerState=this.stateMemento.routerState,this.currentUrlTree=this.stateMemento.currentUrlTree,this.rawUrlTree=this.urlHandlingStrategy.merge(this.currentUrlTree,A??this.rawUrlTree)}resetUrlToCurrentUrlTree(){this.location.replaceState(this.urlSerializer.serialize(this.getRawUrlTree()),\"\",this.generateNgRouterState(this.lastSuccessfulId,this.currentPageId))}generateNgRouterState(A,i){return this.canceledNavigationResolution===\"computed\"?{navigationId:A,\\u0275routerPageId:i}:{navigationId:A}}static \\u0275fac=(()=>{let A;return function(n){return(A||(A=hi(t)))(n||t)}})();static \\u0275prov=TA({token:t,factory:t.\\u0275fac,providedIn:\"root\"})}return t})();function np(t,e){t.events.pipe(We(A=>A instanceof Ml||A instanceof _g||A instanceof PI||A instanceof Nc),fe(A=>A instanceof Ml||A instanceof Nc?0:(A instanceof _g?A.code===jr.Redirect||A.code===jr.SupersededByNewNavigation:!1)?2:1),We(A=>A!==2),qn(1)).subscribe(()=>{e()})}var qr=(()=>{class t{get currentUrlTree(){return this.stateManager.getCurrentUrlTree()}get rawUrlTree(){return this.stateManager.getRawUrlTree()}disposed=!1;nonRouterCurrentEntryChangeSubscription;console=h(dL);stateManager=h(wb);options=h(WI,{optional:!0})||{};pendingTasks=h(lL);urlUpdateStrategy=this.options.urlUpdateStrategy||\"deferred\";navigationTransitions=h(ip);urlSerializer=h(qI);location=h(wc);urlHandlingStrategy=h(tp);injector=h(pr);_events=new $A;get events(){return this._events}get routerState(){return this.stateManager.getRouterState()}navigated=!1;routeReuseStrategy=h(MU);injectorCleanup=h(bU,{optional:!0});onSameUrlNavigation=this.options.onSameUrlNavigation||\"ignore\";config=h(iB,{optional:!0})?.flat()??[];componentInputBindingEnabled=!!h(Vh,{optional:!0});currentNavigation=this.navigationTransitions.currentNavigation.asReadonly();constructor(){this.resetConfig(this.config),this.navigationTransitions.setupNavigations(this).subscribe({error:A=>{}}),this.subscribeToNavigationEvents()}eventsSubscription=new Rn;subscribeToNavigationEvents(){let A=this.navigationTransitions.events.subscribe(i=>{try{let n=this.navigationTransitions.currentTransition,o=Zo(this.navigationTransitions.currentNavigation);if(n!==null&&o!==null){if(this.stateManager.handleRouterEvent(i,o),i instanceof _g&&i.code!==jr.Redirect&&i.code!==jr.SupersededByNewNavigation)this.navigated=!0;else if(i instanceof Ml)this.navigated=!0,this.injectorCleanup?.(this.routeReuseStrategy,this.routerState,this.config);else if(i instanceof Xd){let a=i.navigationBehaviorOptions,r=this.urlHandlingStrategy.merge(i.url,n.currentRawUrl),s=BA({scroll:n.extras.scroll,browserUrl:n.extras.browserUrl,info:n.extras.info,skipLocationChange:n.extras.skipLocationChange,replaceUrl:n.extras.replaceUrl||this.urlUpdateStrategy===\"eager\"||ZgA(n.source)},a);this.scheduleNavigation(r,Pd,null,s,{resolve:n.resolve,reject:n.reject,promise:n.promise})}}XsA(i)&&this._events.next(i)}catch(n){this.navigationTransitions.transitionAbortWithErrorSubject.next(n)}});this.eventsSubscription.add(A)}resetRootComponentType(A){this.routerState.root.component=A,this.navigationTransitions.rootComponentType=A}initialNavigation(){this.setUpLocationChangeListener(),this.navigationTransitions.hasRequestedNavigation||this.navigateToSyncWithBrowser(this.location.path(!0),Pd,this.stateManager.restoredState(),{replaceUrl:!0})}setUpLocationChangeListener(){this.nonRouterCurrentEntryChangeSubscription??=this.stateManager.registerNonRouterCurrentEntryChangeListener((A,i,n,o)=>{this.navigateToSyncWithBrowser(A,n,i,o)})}navigateToSyncWithBrowser(A,i,n,o){let a=n?.navigationId?n:null;if(n){let s=BA({},n);delete s.navigationId,delete s.\\u0275routerPageId,Object.keys(s).length!==0&&(o.state=s)}let r=this.parseUrl(A);this.scheduleNavigation(r,i,a,o).catch(s=>{this.disposed||this.injector.get(Qv)(s)})}get url(){return this.serializeUrl(this.currentUrlTree)}getCurrentNavigation(){return Zo(this.navigationTransitions.currentNavigation)}get lastSuccessfulNavigation(){return this.navigationTransitions.lastSuccessfulNavigation}resetConfig(A){this.config=A.map(ub),this.navigated=!1}ngOnDestroy(){this.dispose()}dispose(){this._events.unsubscribe(),this.navigationTransitions.complete(),this.nonRouterCurrentEntryChangeSubscription?.unsubscribe(),this.nonRouterCurrentEntryChangeSubscription=void 0,this.disposed=!0,this.eventsSubscription.unsubscribe()}createUrlTree(A,i={}){let{relativeTo:n,queryParams:o,fragment:a,queryParamsHandling:r,preserveFragment:s}=i,g=s?this.currentUrlTree.fragment:a,l=null;switch(r??this.options.defaultQueryParamsHandling){case\"merge\":l=BA(BA({},this.currentUrlTree.queryParams),o);break;case\"preserve\":l=this.currentUrlTree.queryParams;break;default:l=o||null}l!==null&&(l=this.removeEmptyProps(l));let C;try{let I=n?n.snapshot:this.routerState.snapshot.root;C=tU(I)}catch(I){(typeof A[0]!=\"string\"||A[0][0]!==\"/\")&&(A=[]),C=this.currentUrlTree.root}return iU(C,A,l,g??null,this.urlSerializer)}navigateByUrl(A,i={skipLocationChange:!1}){let n=qd(A)?A:this.parseUrl(A),o=this.urlHandlingStrategy.merge(n,this.rawUrlTree);return this.scheduleNavigation(o,Pd,null,i)}navigate(A,i={skipLocationChange:!1}){return AlA(A),this.navigateByUrl(this.createUrlTree(A,i),i)}serializeUrl(A){return this.urlSerializer.serialize(A)}parseUrl(A){try{return this.urlSerializer.parse(A)}catch(i){return this.console.warn(aL(4018,!1)),this.urlSerializer.parse(\"/\")}}isActive(A,i){let n;if(i===!0?n=BA({},jK):i===!1?n=BA({},eb):n=BA(BA({},eb),i),qd(A))return _K(this.currentUrlTree,A,n);let o=this.parseUrl(A);return _K(this.currentUrlTree,o,n)}removeEmptyProps(A){return Object.entries(A).reduce((i,[n,o])=>(o!=null&&(i[n]=o),i),{})}scheduleNavigation(A,i,n,o,a){if(this.disposed)return Promise.resolve(!1);let r,s,g;a?(r=a.resolve,s=a.reject,g=a.promise):g=new Promise((C,I)=>{r=C,s=I});let l=this.pendingTasks.add();return np(this,()=>{queueMicrotask(()=>this.pendingTasks.remove(l))}),this.navigationTransitions.handleNavigationRequest({source:i,restoredState:n,currentUrlTree:this.currentUrlTree,currentRawUrl:this.currentUrlTree,rawUrl:A,extras:o,resolve:r,reject:s,promise:g,currentSnapshot:this.routerState.snapshot,currentRouterState:this.routerState}),g.catch(Promise.reject.bind(Promise))}static \\u0275fac=function(i){return new(i||t)};static \\u0275prov=TA({token:t,factory:t.\\u0275fac,providedIn:\"root\"})}return t})();function AlA(t){for(let e=0;e<t.length;e++)if(t[e]==null)throw new wt(4008,!1)}var Zh=class{};var kU=(()=>{class t{router;injector;preloadingStrategy;loader;subscription;constructor(A,i,n,o){this.router=A,this.injector=i,this.preloadingStrategy=n,this.loader=o}setUpPreloading(){this.subscription=this.router.events.pipe(We(A=>A instanceof Ml),qE(()=>this.preload())).subscribe(()=>{})}preload(){return this.processRoutes(this.injector,this.router.config)}ngOnDestroy(){this.subscription?.unsubscribe()}processRoutes(A,i){let n=[];for(let o of i){o.providers&&!o._injector&&(o._injector=uf(o.providers,A,\"\"));let a=o._injector??A;o._loadedNgModuleFactory&&!o._loadedInjector&&(o._loadedInjector=o._loadedNgModuleFactory.create(a).injector);let r=o._loadedInjector??a;(o.loadChildren&&!o._loadedRoutes&&o.canLoad===void 0||o.loadComponent&&!o._loadedComponent)&&n.push(this.preloadConfig(a,o)),(o.children||o._loadedRoutes)&&n.push(this.processRoutes(r,o.children??o._loadedRoutes))}return mr(n).pipe(dv())}preloadConfig(A,i){return this.preloadingStrategy.preload(i,()=>{if(A.destroyed)return oe(null);let n;i.loadChildren&&i.canLoad===void 0?n=mr(this.loader.loadChildren(A,i)):n=oe(null);let o=n.pipe(uc(a=>a===null?oe(void 0):(i._loadedRoutes=a.routes,i._loadedInjector=a.injector,i._loadedNgModuleFactory=a.factory,this.processRoutes(a.injector??A,a.routes))));if(i.loadComponent&&!i._loadedComponent){let a=this.loader.loadComponent(A,i);return mr([o,a]).pipe(dv())}else return o})}static \\u0275fac=function(i){return new(i||t)(Do(qr),Do(pr),Do(Zh),Do(ep))};static \\u0275prov=TA({token:t,factory:t.\\u0275fac,providedIn:\"root\"})}return t})(),SU=new wA(\"\"),tlA=(()=>{class t{options;routerEventsSubscription;scrollEventsSubscription;lastId=0;lastSource=Pd;restoredId=0;store={};urlSerializer=h(qI);zone=h(Oe);viewportScroller=h(mv);transitions=h(ip);constructor(A){this.options=A,this.options.scrollPositionRestoration||=\"disabled\",this.options.anchorScrolling||=\"disabled\"}init(){this.options.scrollPositionRestoration!==\"disabled\"&&this.viewportScroller.setHistoryScrollRestoration(\"manual\"),this.routerEventsSubscription=this.createScrollEvents(),this.scrollEventsSubscription=this.consumeScrollEvents()}createScrollEvents(){return this.transitions.events.subscribe(A=>{A instanceof zC?(this.store[this.lastId]=this.viewportScroller.getScrollPosition(),this.lastSource=A.navigationTrigger,this.restoredId=A.restoredState?A.restoredState.navigationId:0):A instanceof Ml?(this.lastId=A.id,this.scheduleScrollEvent(A,this.urlSerializer.parse(A.urlAfterRedirects).fragment)):A instanceof Nc&&A.code===Vd.IgnoredSameUrlNavigation&&(this.lastSource=void 0,this.restoredId=0,this.scheduleScrollEvent(A,this.urlSerializer.parse(A.url).fragment))})}consumeScrollEvents(){return this.transitions.events.subscribe(A=>{if(!(A instanceof Wd)||A.scrollBehavior===\"manual\")return;let i={behavior:\"instant\"};A.position?this.options.scrollPositionRestoration===\"top\"?this.viewportScroller.scrollToPosition([0,0],i):this.options.scrollPositionRestoration===\"enabled\"&&this.viewportScroller.scrollToPosition(A.position,i):A.anchor&&this.options.anchorScrolling===\"enabled\"?this.viewportScroller.scrollToAnchor(A.anchor):this.options.scrollPositionRestoration!==\"disabled\"&&this.viewportScroller.scrollToPosition([0,0])})}scheduleScrollEvent(A,i){let n=Zo(this.transitions.currentNavigation)?.extras.scroll;this.zone.runOutsideAngular(()=>ct(this,null,function*(){yield new Promise(o=>{setTimeout(o),typeof requestAnimationFrame<\"u\"&&requestAnimationFrame(o)}),this.zone.run(()=>{this.transitions.events.next(new Wd(A,this.lastSource===\"popstate\"?this.store[this.restoredId]:null,i,n))})}))}ngOnDestroy(){this.routerEventsSubscription?.unsubscribe(),this.scrollEventsSubscription?.unsubscribe()}static \\u0275fac=function(i){hf()};static \\u0275prov=TA({token:t,factory:t.\\u0275fac})}return t})();function ilA(){return h(qr).routerState.root}function Xh(t,e){return{\\u0275kind:t,\\u0275providers:e}}function nlA(){let t=h(ut);return e=>{let A=t.get(p0);if(e!==A.components[0])return;let i=t.get(qr),n=t.get(xU);t.get(vb)===1&&i.initialNavigation(),t.get(FU,null,{optional:!0})?.setUpPreloading(),t.get(SU,null,{optional:!0})?.init(),i.resetRootComponentType(A.componentTypes[0]),n.closed||(n.next(),n.complete(),n.unsubscribe())}}var xU=new wA(\"\",{factory:()=>new $A}),vb=new wA(\"\",{factory:()=>1});function RU(){let t=[{provide:CL,useValue:!0},{provide:vb,useValue:0},hv(()=>{let e=h(ut);return e.get(bL,Promise.resolve()).then(()=>new Promise(i=>{let n=e.get(qr),o=e.get(xU);np(n,()=>{i(!0)}),e.get(ip).afterPreactivation=()=>(i(!0),o.closed?oe(void 0):o),n.initialNavigation()}))})];return Xh(2,t)}function NU(){let t=[hv(()=>{h(qr).setUpLocationChangeListener()}),{provide:vb,useValue:2}];return Xh(3,t)}var FU=new wA(\"\");function LU(t){return Xh(0,[{provide:FU,useExisting:kU},{provide:Zh,useExisting:t}])}function _U(){return Xh(8,[Eb,{provide:Vh,useExisting:Eb}])}function GU(t){Ef(\"NgRouterViewTransitions\");let e=[{provide:mb,useValue:vU},{provide:pb,useValue:BA({skipNextTransition:!!t?.skipInitialTransition},t)}];return Xh(9,e)}var KU=[wc,{provide:qI,useClass:S0},qr,VI,{provide:_s,useFactory:ilA},ep,[]],op=(()=>{class t{constructor(){}static forRoot(A,i){return{ngModule:t,providers:[KU,[],{provide:iB,multi:!0,useValue:A},[],i?.errorHandler?{provide:Db,useValue:i.errorHandler}:[],{provide:WI,useValue:i||{}},i?.useHash?alA():rlA(),olA(),i?.preloadingStrategy?LU(i.preloadingStrategy).\\u0275providers:[],i?.initialNavigation?slA(i):[],i?.bindToComponentInputs?_U().\\u0275providers:[],i?.enableViewTransitions?GU().\\u0275providers:[],glA()]}}static forChild(A){return{ngModule:t,providers:[{provide:iB,multi:!0,useValue:A}]}}static \\u0275fac=function(i){return new(i||t)};static \\u0275mod=Xe({type:t});static \\u0275inj=Ze({})}return t})();function olA(){return{provide:SU,useFactory:()=>{let t=h(mv),e=h(WI);return e.scrollOffset&&t.setOffset(e.scrollOffset),new tlA(e)}}}function alA(){return{provide:fv,useClass:kL}}function rlA(){return{provide:fv,useClass:ML}}function slA(t){return[t.initialNavigation===\"disabled\"?NU().\\u0275providers:[],t.initialNavigation===\"enabledBlocking\"?RU().\\u0275providers:[]]}var yb=new wA(\"\");function glA(){return[{provide:yb,useFactory:nlA},{provide:BL,multi:!0,useExisting:yb}]}var ClA=[\"*\"];var IlA=new wA(\"MAT_CARD_CONFIG\"),nB=(()=>{class t{appearance;constructor(){let A=h(IlA,{optional:!0});this.appearance=A?.appearance||\"raised\"}static \\u0275fac=function(i){return new(i||t)};static \\u0275cmp=kA({type:t,selectors:[[\"mat-card\"]],hostAttrs:[1,\"mat-mdc-card\",\"mdc-card\"],hostVars:8,hostBindings:function(i,n){i&2&&ae(\"mat-mdc-card-outlined\",n.appearance===\"outlined\")(\"mdc-card--outlined\",n.appearance===\"outlined\")(\"mat-mdc-card-filled\",n.appearance===\"filled\")(\"mdc-card--filled\",n.appearance===\"filled\")},inputs:{appearance:\"appearance\"},exportAs:[\"matCard\"],ngContentSelectors:ClA,decls:1,vars:0,template:function(i,n){i&1&&(Yt(),He(0))},styles:[`.mat-mdc-card{display:flex;flex-direction:column;box-sizing:border-box;position:relative;border-style:solid;border-width:0;background-color:var(--mat-card-elevated-container-color, var(--mat-sys-surface-container-low));border-color:var(--mat-card-elevated-container-color, var(--mat-sys-surface-container-low));border-radius:var(--mat-card-elevated-container-shape, var(--mat-sys-corner-medium));box-shadow:var(--mat-card-elevated-container-elevation, var(--mat-sys-level1))}.mat-mdc-card::after{position:absolute;top:0;left:0;width:100%;height:100%;border:solid 1px rgba(0,0,0,0);content:\"\";display:block;pointer-events:none;box-sizing:border-box;border-radius:var(--mat-card-elevated-container-shape, var(--mat-sys-corner-medium))}.mat-mdc-card-outlined{background-color:var(--mat-card-outlined-container-color, var(--mat-sys-surface));border-radius:var(--mat-card-outlined-container-shape, var(--mat-sys-corner-medium));border-width:var(--mat-card-outlined-outline-width, 1px);border-color:var(--mat-card-outlined-outline-color, var(--mat-sys-outline-variant));box-shadow:var(--mat-card-outlined-container-elevation, var(--mat-sys-level0))}.mat-mdc-card-outlined::after{border:none}.mat-mdc-card-filled{background-color:var(--mat-card-filled-container-color, var(--mat-sys-surface-container-highest));border-radius:var(--mat-card-filled-container-shape, var(--mat-sys-corner-medium));box-shadow:var(--mat-card-filled-container-elevation, var(--mat-sys-level0))}.mdc-card__media{position:relative;box-sizing:border-box;background-repeat:no-repeat;background-position:center;background-size:cover}.mdc-card__media::before{display:block;content:\"\"}.mdc-card__media:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.mdc-card__media:last-child{border-bottom-left-radius:inherit;border-bottom-right-radius:inherit}.mat-mdc-card-actions{display:flex;flex-direction:row;align-items:center;box-sizing:border-box;min-height:52px;padding:8px}.mat-mdc-card-title{font-family:var(--mat-card-title-text-font, var(--mat-sys-title-large-font));line-height:var(--mat-card-title-text-line-height, var(--mat-sys-title-large-line-height));font-size:var(--mat-card-title-text-size, var(--mat-sys-title-large-size));letter-spacing:var(--mat-card-title-text-tracking, var(--mat-sys-title-large-tracking));font-weight:var(--mat-card-title-text-weight, var(--mat-sys-title-large-weight))}.mat-mdc-card-subtitle{color:var(--mat-card-subtitle-text-color, var(--mat-sys-on-surface));font-family:var(--mat-card-subtitle-text-font, var(--mat-sys-title-medium-font));line-height:var(--mat-card-subtitle-text-line-height, var(--mat-sys-title-medium-line-height));font-size:var(--mat-card-subtitle-text-size, var(--mat-sys-title-medium-size));letter-spacing:var(--mat-card-subtitle-text-tracking, var(--mat-sys-title-medium-tracking));font-weight:var(--mat-card-subtitle-text-weight, var(--mat-sys-title-medium-weight))}.mat-mdc-card-title,.mat-mdc-card-subtitle{display:block;margin:0}.mat-mdc-card-avatar~.mat-mdc-card-header-text .mat-mdc-card-title,.mat-mdc-card-avatar~.mat-mdc-card-header-text .mat-mdc-card-subtitle{padding:16px 16px 0}.mat-mdc-card-header{display:flex;padding:16px 16px 0}.mat-mdc-card-content{display:block;padding:0 16px}.mat-mdc-card-content:first-child{padding-top:16px}.mat-mdc-card-content:last-child{padding-bottom:16px}.mat-mdc-card-title-group{display:flex;justify-content:space-between;width:100%}.mat-mdc-card-avatar{height:40px;width:40px;border-radius:50%;flex-shrink:0;margin-bottom:16px;object-fit:cover}.mat-mdc-card-avatar~.mat-mdc-card-header-text .mat-mdc-card-subtitle,.mat-mdc-card-avatar~.mat-mdc-card-header-text .mat-mdc-card-title{line-height:normal}.mat-mdc-card-sm-image{width:80px;height:80px}.mat-mdc-card-md-image{width:112px;height:112px}.mat-mdc-card-lg-image{width:152px;height:152px}.mat-mdc-card-xl-image{width:240px;height:240px}.mat-mdc-card-subtitle~.mat-mdc-card-title,.mat-mdc-card-title~.mat-mdc-card-subtitle,.mat-mdc-card-header .mat-mdc-card-header-text .mat-mdc-card-title,.mat-mdc-card-header .mat-mdc-card-header-text .mat-mdc-card-subtitle,.mat-mdc-card-title-group .mat-mdc-card-title,.mat-mdc-card-title-group .mat-mdc-card-subtitle{padding-top:0}.mat-mdc-card-content>:last-child:not(.mat-mdc-card-footer){margin-bottom:0}.mat-mdc-card-actions-align-end{justify-content:flex-end}\n`],encapsulation:2,changeDetection:0})}return t})();var UU=(()=>{class t{static \\u0275fac=function(i){return new(i||t)};static \\u0275mod=Xe({type:t});static \\u0275inj=Ze({imports:[Fi]})}return t})();var $h=class{};function A4(t){return t&&typeof t.connect==\"function\"&&!(t instanceof $F)}var kl=(function(t){return t[t.REPLACED=0]=\"REPLACED\",t[t.INSERTED=1]=\"INSERTED\",t[t.MOVED=2]=\"MOVED\",t[t.REMOVED=3]=\"REMOVED\",t})(kl||{}),ap=class{viewCacheSize=20;_viewCache=[];applyChanges(e,A,i,n,o){e.forEachOperation((a,r,s)=>{let g,l;if(a.previousIndex==null){let C=()=>i(a,r,s);g=this._insertView(C,s,A,n(a)),l=g?kl.INSERTED:kl.REPLACED}else s==null?(this._detachAndCacheView(r,A),l=kl.REMOVED):(g=this._moveView(r,s,A,n(a)),l=kl.MOVED);o&&o({context:g?.context,operation:l,record:a})})}detach(){for(let e of this._viewCache)e.destroy();this._viewCache=[]}_insertView(e,A,i,n){let o=this._insertViewFromCache(A,i);if(o){o.context.$implicit=n;return}let a=e();return i.createEmbeddedView(a.templateRef,a.context,a.index)}_detachAndCacheView(e,A){let i=A.detach(e);this._maybeCacheView(i,A)}_moveView(e,A,i,n){let o=i.get(e);return i.move(o,A),o.context.$implicit=n,o}_maybeCacheView(e,A){if(this._viewCache.length<this.viewCacheSize)this._viewCache.push(e);else{let i=A.indexOf(e);i===-1?e.destroy():A.remove(i)}}_insertViewFromCache(e,A){let i=this._viewCache.pop();return i&&A.insert(i,e),i||null}};var BlA=20,Lc=(()=>{class t{_ngZone=h(Oe);_platform=h(ci);_renderer=h(Dr).createRenderer(null,null);_cleanupGlobalListener;constructor(){}_scrolled=new $A;_scrolledCount=0;scrollContainers=new Map;register(A){this.scrollContainers.has(A)||this.scrollContainers.set(A,A.elementScrolled().subscribe(()=>this._scrolled.next(A)))}deregister(A){let i=this.scrollContainers.get(A);i&&(i.unsubscribe(),this.scrollContainers.delete(A))}scrolled(A=BlA){return this._platform.isBrowser?new Ti(i=>{this._cleanupGlobalListener||(this._cleanupGlobalListener=this._ngZone.runOutsideAngular(()=>this._renderer.listen(\"document\",\"scroll\",()=>this._scrolled.next())));let n=A>0?this._scrolled.pipe(yI(A)).subscribe(i):this._scrolled.subscribe(i);return this._scrolledCount++,()=>{n.unsubscribe(),this._scrolledCount--,this._scrolledCount||(this._cleanupGlobalListener?.(),this._cleanupGlobalListener=void 0)}}):oe()}ngOnDestroy(){this._cleanupGlobalListener?.(),this._cleanupGlobalListener=void 0,this.scrollContainers.forEach((A,i)=>this.deregister(i)),this._scrolled.complete()}ancestorScrolled(A,i){let n=this.getAncestorScrollContainers(A);return this.scrolled(i).pipe(We(o=>!o||n.indexOf(o)>-1))}getAncestorScrollContainers(A){let i=[];return this.scrollContainers.forEach((n,o)=>{this._scrollableContainsElement(o,A)&&i.push(o)}),i}_scrollableContainsElement(A,i){let n=ls(i),o=A.getElementRef().nativeElement;do if(n==o)return!0;while(n=n.parentElement);return!1}static \\u0275fac=function(i){return new(i||t)};static \\u0275prov=TA({token:t,factory:t.\\u0275fac,providedIn:\"root\"})}return t})(),x0=(()=>{class t{elementRef=h(ge);scrollDispatcher=h(Lc);ngZone=h(Oe);dir=h(wo,{optional:!0});_scrollElement=this.elementRef.nativeElement;_destroyed=new $A;_renderer=h(ui);_cleanupScroll;_elementScrolled=new $A;constructor(){}ngOnInit(){this._cleanupScroll=this.ngZone.runOutsideAngular(()=>this._renderer.listen(this._scrollElement,\"scroll\",A=>this._elementScrolled.next(A))),this.scrollDispatcher.register(this)}ngOnDestroy(){this._cleanupScroll?.(),this._elementScrolled.complete(),this.scrollDispatcher.deregister(this),this._destroyed.next(),this._destroyed.complete()}elementScrolled(){return this._elementScrolled}getElementRef(){return this.elementRef}scrollTo(A){let i=this.elementRef.nativeElement,n=this.dir&&this.dir.value==\"rtl\";A.left==null&&(A.left=n?A.end:A.start),A.right==null&&(A.right=n?A.start:A.end),A.bottom!=null&&(A.top=i.scrollHeight-i.clientHeight-A.bottom),n&&Nd()!=ml.NORMAL?(A.left!=null&&(A.right=i.scrollWidth-i.clientWidth-A.left),Nd()==ml.INVERTED?A.left=A.right:Nd()==ml.NEGATED&&(A.left=A.right?-A.right:A.right)):A.right!=null&&(A.left=i.scrollWidth-i.clientWidth-A.right),this._applyScrollToOptions(A)}_applyScrollToOptions(A){let i=this.elementRef.nativeElement;Zf()?i.scrollTo(A):(A.top!=null&&(i.scrollTop=A.top),A.left!=null&&(i.scrollLeft=A.left))}measureScrollOffset(A){let i=\"left\",n=\"right\",o=this.elementRef.nativeElement;if(A==\"top\")return o.scrollTop;if(A==\"bottom\")return o.scrollHeight-o.clientHeight-o.scrollTop;let a=this.dir&&this.dir.value==\"rtl\";return A==\"start\"?A=a?n:i:A==\"end\"&&(A=a?i:n),a&&Nd()==ml.INVERTED?A==i?o.scrollWidth-o.clientWidth-o.scrollLeft:o.scrollLeft:a&&Nd()==ml.NEGATED?A==i?o.scrollLeft+o.scrollWidth-o.clientWidth:-o.scrollLeft:A==i?o.scrollLeft:o.scrollWidth-o.clientWidth-o.scrollLeft}static \\u0275fac=function(i){return new(i||t)};static \\u0275dir=OA({type:t,selectors:[[\"\",\"cdk-scrollable\",\"\"],[\"\",\"cdkScrollable\",\"\"]]})}return t})(),QlA=20,Bs=(()=>{class t{_platform=h(ci);_listeners;_viewportSize=null;_change=new $A;_document=h(Zt);constructor(){let A=h(Oe),i=h(Dr).createRenderer(null,null);A.runOutsideAngular(()=>{if(this._platform.isBrowser){let n=o=>this._change.next(o);this._listeners=[i.listen(\"window\",\"resize\",n),i.listen(\"window\",\"orientationchange\",n)]}this.change().subscribe(()=>this._viewportSize=null)})}ngOnDestroy(){this._listeners?.forEach(A=>A()),this._change.complete()}getViewportSize(){this._viewportSize||this._updateViewportSize();let A={width:this._viewportSize.width,height:this._viewportSize.height};return this._platform.isBrowser||(this._viewportSize=null),A}getViewportRect(){let A=this.getViewportScrollPosition(),{width:i,height:n}=this.getViewportSize();return{top:A.top,left:A.left,bottom:A.top+n,right:A.left+i,height:n,width:i}}getViewportScrollPosition(){if(!this._platform.isBrowser)return{top:0,left:0};let A=this._document,i=this._getWindow(),n=A.documentElement,o=n.getBoundingClientRect(),a=-o.top||A.body?.scrollTop||i.scrollY||n.scrollTop||0,r=-o.left||A.body?.scrollLeft||i.scrollX||n.scrollLeft||0;return{top:a,left:r}}change(A=QlA){return A>0?this._change.pipe(yI(A)):this._change}_getWindow(){return this._document.defaultView||window}_updateViewportSize(){let A=this._getWindow();this._viewportSize=this._platform.isBrowser?{width:A.innerWidth,height:A.innerHeight}:{width:0,height:0}}static \\u0275fac=function(i){return new(i||t)};static \\u0275prov=TA({token:t,factory:t.\\u0275fac,providedIn:\"root\"})}return t})();var JU=new wA(\"CDK_VIRTUAL_SCROLL_VIEWPORT\");var Fc=(()=>{class t{static \\u0275fac=function(i){return new(i||t)};static \\u0275mod=Xe({type:t});static \\u0275inj=Ze({})}return t})(),rp=(()=>{class t{static \\u0275fac=function(i){return new(i||t)};static \\u0275mod=Xe({type:t});static \\u0275inj=Ze({imports:[Fi,Fc,Fi,Fc]})}return t})();var e4=class{_attachedHost=null;attach(e){return this._attachedHost=e,e.attach(this)}detach(){let e=this._attachedHost;e!=null&&(this._attachedHost=null,e.detach())}get isAttached(){return this._attachedHost!=null}setAttachedHost(e){this._attachedHost=e}},Cg=class extends e4{component;viewContainerRef;injector;projectableNodes;bindings;constructor(e,A,i,n,o){super(),this.component=e,this.viewContainerRef=A,this.injector=i,this.projectableNodes=n,this.bindings=o||null}},Vr=class extends e4{templateRef;viewContainerRef;context;injector;constructor(e,A,i,n){super(),this.templateRef=e,this.viewContainerRef=A,this.context=i,this.injector=n}get origin(){return this.templateRef.elementRef}attach(e,A=this.context){return this.context=A,super.attach(e)}detach(){return this.context=void 0,super.detach()}},bb=class extends e4{element;constructor(e){super(),this.element=e instanceof ge?e.nativeElement:e}},PC=class{_attachedPortal=null;_disposeFn=null;_isDisposed=!1;hasAttached(){return!!this._attachedPortal}attach(e){if(e instanceof Cg)return this._attachedPortal=e,this.attachComponentPortal(e);if(e instanceof Vr)return this._attachedPortal=e,this.attachTemplatePortal(e);if(this.attachDomPortal&&e instanceof bb)return this._attachedPortal=e,this.attachDomPortal(e)}attachDomPortal=null;detach(){this._attachedPortal&&(this._attachedPortal.setAttachedHost(null),this._attachedPortal=null),this._invokeDisposeFn()}dispose(){this.hasAttached()&&this.detach(),this._invokeDisposeFn(),this._isDisposed=!0}setDisposeFn(e){this._disposeFn=e}_invokeDisposeFn(){this._disposeFn&&(this._disposeFn(),this._disposeFn=null)}},t4=class extends PC{outletElement;_appRef;_defaultInjector;constructor(e,A,i){super(),this.outletElement=e,this._appRef=A,this._defaultInjector=i}attachComponentPortal(e){let A;if(e.viewContainerRef){let i=e.injector||e.viewContainerRef.injector,n=i.get(Ev,null,{optional:!0})||void 0;A=e.viewContainerRef.createComponent(e.component,{index:e.viewContainerRef.length,injector:i,ngModuleRef:n,projectableNodes:e.projectableNodes||void 0,bindings:e.bindings||void 0}),this.setDisposeFn(()=>A.destroy())}else{let i=this._appRef,n=e.injector||this._defaultInjector||ut.NULL,o=n.get(pr,i.injector);A=yf(e.component,{elementInjector:n,environmentInjector:o,projectableNodes:e.projectableNodes||void 0,bindings:e.bindings||void 0}),i.attachView(A.hostView),this.setDisposeFn(()=>{i.viewCount>0&&i.detachView(A.hostView),A.destroy()})}return this.outletElement.appendChild(this._getComponentRootNode(A)),this._attachedPortal=e,A}attachTemplatePortal(e){let A=e.viewContainerRef,i=A.createEmbeddedView(e.templateRef,e.context,{injector:e.injector});return i.rootNodes.forEach(n=>this.outletElement.appendChild(n)),i.detectChanges(),this.setDisposeFn(()=>{let n=A.indexOf(i);n!==-1&&A.remove(n)}),this._attachedPortal=e,i}attachDomPortal=e=>{let A=e.element;A.parentNode;let i=this.outletElement.ownerDocument.createComment(\"dom-portal\");A.parentNode.insertBefore(i,A),this.outletElement.appendChild(A),this._attachedPortal=e,super.setDisposeFn(()=>{i.parentNode&&i.parentNode.replaceChild(A,i)})};dispose(){super.dispose(),this.outletElement.remove()}_getComponentRootNode(e){return e.hostView.rootNodes[0]}},YU=(()=>{class t extends Vr{constructor(){let A=h(Fn),i=h(Ro);super(A,i)}static \\u0275fac=function(i){return new(i||t)};static \\u0275dir=OA({type:t,selectors:[[\"\",\"cdkPortal\",\"\"]],exportAs:[\"cdkPortal\"],features:[Ct]})}return t})(),Ig=(()=>{class t extends PC{_moduleRef=h(Ev,{optional:!0});_document=h(Zt);_viewContainerRef=h(Ro);_isInitialized=!1;_attachedRef=null;constructor(){super()}get portal(){return this._attachedPortal}set portal(A){this.hasAttached()&&!A&&!this._isInitialized||(this.hasAttached()&&super.detach(),A&&super.attach(A),this._attachedPortal=A||null)}attached=new WA;get attachedRef(){return this._attachedRef}ngOnInit(){this._isInitialized=!0}ngOnDestroy(){super.dispose(),this._attachedRef=this._attachedPortal=null}attachComponentPortal(A){A.setAttachedHost(this);let i=A.viewContainerRef!=null?A.viewContainerRef:this._viewContainerRef,n=i.createComponent(A.component,{index:i.length,injector:A.injector||i.injector,projectableNodes:A.projectableNodes||void 0,ngModuleRef:this._moduleRef||void 0,bindings:A.bindings||void 0});return i!==this._viewContainerRef&&this._getRootNode().appendChild(n.hostView.rootNodes[0]),super.setDisposeFn(()=>n.destroy()),this._attachedPortal=A,this._attachedRef=n,this.attached.emit(n),n}attachTemplatePortal(A){A.setAttachedHost(this);let i=this._viewContainerRef.createEmbeddedView(A.templateRef,A.context,{injector:A.injector});return super.setDisposeFn(()=>this._viewContainerRef.clear()),this._attachedPortal=A,this._attachedRef=i,this.attached.emit(i),i}attachDomPortal=A=>{let i=A.element;i.parentNode;let n=this._document.createComment(\"dom-portal\");A.setAttachedHost(this),i.parentNode.insertBefore(n,i),this._getRootNode().appendChild(i),this._attachedPortal=A,super.setDisposeFn(()=>{n.parentNode&&n.parentNode.replaceChild(i,n)})};_getRootNode(){let A=this._viewContainerRef.element.nativeElement;return A.nodeType===A.ELEMENT_NODE?A:A.parentNode}static \\u0275fac=function(i){return new(i||t)};static \\u0275dir=OA({type:t,selectors:[[\"\",\"cdkPortalOutlet\",\"\"]],inputs:{portal:[0,\"cdkPortalOutlet\",\"portal\"]},outputs:{attached:\"attached\"},exportAs:[\"cdkPortalOutlet\"],features:[Ct]})}return t})(),_c=(()=>{class t{static \\u0275fac=function(i){return new(i||t)};static \\u0275mod=Xe({type:t});static \\u0275inj=Ze({})}return t})();var HU=Zf();function rB(t){return new sp(t.get(Bs),t.get(Zt))}var sp=class{_viewportRuler;_previousHTMLStyles={top:\"\",left:\"\"};_previousScrollPosition;_isEnabled=!1;_document;constructor(e,A){this._viewportRuler=e,this._document=A}attach(){}enable(){if(this._canBeEnabled()){let e=this._document.documentElement;this._previousScrollPosition=this._viewportRuler.getViewportScrollPosition(),this._previousHTMLStyles.left=e.style.left||\"\",this._previousHTMLStyles.top=e.style.top||\"\",e.style.left=Ra(-this._previousScrollPosition.left),e.style.top=Ra(-this._previousScrollPosition.top),e.classList.add(\"cdk-global-scrollblock\"),this._isEnabled=!0}}disable(){if(this._isEnabled){let e=this._document.documentElement,A=this._document.body,i=e.style,n=A.style,o=i.scrollBehavior||\"\",a=n.scrollBehavior||\"\";this._isEnabled=!1,i.left=this._previousHTMLStyles.left,i.top=this._previousHTMLStyles.top,e.classList.remove(\"cdk-global-scrollblock\"),HU&&(i.scrollBehavior=n.scrollBehavior=\"auto\"),window.scroll(this._previousScrollPosition.left,this._previousScrollPosition.top),HU&&(i.scrollBehavior=o,n.scrollBehavior=a)}}_canBeEnabled(){if(this._document.documentElement.classList.contains(\"cdk-global-scrollblock\")||this._isEnabled)return!1;let A=this._document.documentElement,i=this._viewportRuler.getViewportSize();return A.scrollHeight>i.height||A.scrollWidth>i.width}};function VU(t,e){return new gp(t.get(Lc),t.get(Oe),t.get(Bs),e)}var gp=class{_scrollDispatcher;_ngZone;_viewportRuler;_config;_scrollSubscription=null;_overlayRef;_initialScrollPosition;constructor(e,A,i,n){this._scrollDispatcher=e,this._ngZone=A,this._viewportRuler=i,this._config=n}attach(e){this._overlayRef,this._overlayRef=e}enable(){if(this._scrollSubscription)return;let e=this._scrollDispatcher.scrolled(0).pipe(We(A=>!A||!this._overlayRef.overlayElement.contains(A.getElementRef().nativeElement)));this._config&&this._config.threshold&&this._config.threshold>1?(this._initialScrollPosition=this._viewportRuler.getViewportScrollPosition().top,this._scrollSubscription=e.subscribe(()=>{let A=this._viewportRuler.getViewportScrollPosition().top;Math.abs(A-this._initialScrollPosition)>this._config.threshold?this._detach():this._overlayRef.updatePosition()})):this._scrollSubscription=e.subscribe(this._detach)}disable(){this._scrollSubscription&&(this._scrollSubscription.unsubscribe(),this._scrollSubscription=null)}detach(){this.disable(),this._overlayRef=null}_detach=()=>{this.disable(),this._overlayRef.hasAttached()&&this._ngZone.run(()=>this._overlayRef.detach())}};var i4=class{enable(){}disable(){}attach(){}};function Mb(t,e){return e.some(A=>{let i=t.bottom<A.top,n=t.top>A.bottom,o=t.right<A.left,a=t.left>A.right;return i||n||o||a})}function TU(t,e){return e.some(A=>{let i=t.top<A.top,n=t.bottom>A.bottom,o=t.left<A.left,a=t.right>A.right;return i||n||o||a})}function R0(t,e){return new lp(t.get(Lc),t.get(Bs),t.get(Oe),e)}var lp=class{_scrollDispatcher;_viewportRuler;_ngZone;_config;_scrollSubscription=null;_overlayRef;constructor(e,A,i,n){this._scrollDispatcher=e,this._viewportRuler=A,this._ngZone=i,this._config=n}attach(e){this._overlayRef,this._overlayRef=e}enable(){if(!this._scrollSubscription){let e=this._config?this._config.scrollThrottle:0;this._scrollSubscription=this._scrollDispatcher.scrolled(e).subscribe(()=>{if(this._overlayRef.updatePosition(),this._config&&this._config.autoClose){let A=this._overlayRef.overlayElement.getBoundingClientRect(),{width:i,height:n}=this._viewportRuler.getViewportSize();Mb(A,[{width:i,height:n,bottom:n,right:i,top:0,left:0}])&&(this.disable(),this._ngZone.run(()=>this._overlayRef.detach()))}})}}disable(){this._scrollSubscription&&(this._scrollSubscription.unsubscribe(),this._scrollSubscription=null)}detach(){this.disable(),this._overlayRef=null}},WU=(()=>{class t{_injector=h(ut);constructor(){}noop=()=>new i4;close=A=>VU(this._injector,A);block=()=>rB(this._injector);reposition=A=>R0(this._injector,A);static \\u0275fac=function(i){return new(i||t)};static \\u0275prov=TA({token:t,factory:t.\\u0275fac,providedIn:\"root\"})}return t})(),Sl=class{positionStrategy;scrollStrategy=new i4;panelClass=\"\";hasBackdrop=!1;backdropClass=\"cdk-overlay-dark-backdrop\";disableAnimations;width;height;minWidth;minHeight;maxWidth;maxHeight;direction;disposeOnNavigation=!1;usePopover;eventPredicate;constructor(e){if(e){let A=Object.keys(e);for(let i of A)e[i]!==void 0&&(this[i]=e[i])}}};var cp=class{connectionPair;scrollableViewProperties;constructor(e,A){this.connectionPair=e,this.scrollableViewProperties=A}};var ZU=(()=>{class t{_attachedOverlays=[];_document=h(Zt);_isAttached=!1;constructor(){}ngOnDestroy(){this.detach()}add(A){this.remove(A),this._attachedOverlays.push(A)}remove(A){let i=this._attachedOverlays.indexOf(A);i>-1&&this._attachedOverlays.splice(i,1),this._attachedOverlays.length===0&&this.detach()}canReceiveEvent(A,i,n){return n.observers.length<1?!1:A.eventPredicate?A.eventPredicate(i):!0}static \\u0275fac=function(i){return new(i||t)};static \\u0275prov=TA({token:t,factory:t.\\u0275fac,providedIn:\"root\"})}return t})(),XU=(()=>{class t extends ZU{_ngZone=h(Oe);_renderer=h(Dr).createRenderer(null,null);_cleanupKeydown;add(A){super.add(A),this._isAttached||(this._ngZone.runOutsideAngular(()=>{this._cleanupKeydown=this._renderer.listen(\"body\",\"keydown\",this._keydownListener)}),this._isAttached=!0)}detach(){this._isAttached&&(this._cleanupKeydown?.(),this._isAttached=!1)}_keydownListener=A=>{let i=this._attachedOverlays;for(let n=i.length-1;n>-1;n--){let o=i[n];if(this.canReceiveEvent(o,A,o._keydownEvents)){this._ngZone.run(()=>o._keydownEvents.next(A));break}}};static \\u0275fac=(()=>{let A;return function(n){return(A||(A=hi(t)))(n||t)}})();static \\u0275prov=TA({token:t,factory:t.\\u0275fac,providedIn:\"root\"})}return t})(),$U=(()=>{class t extends ZU{_platform=h(ci);_ngZone=h(Oe);_renderer=h(Dr).createRenderer(null,null);_cursorOriginalValue;_cursorStyleIsSet=!1;_pointerDownEventTarget=null;_cleanups;add(A){if(super.add(A),!this._isAttached){let i=this._document.body,n={capture:!0},o=this._renderer;this._cleanups=this._ngZone.runOutsideAngular(()=>[o.listen(i,\"pointerdown\",this._pointerDownListener,n),o.listen(i,\"click\",this._clickListener,n),o.listen(i,\"auxclick\",this._clickListener,n),o.listen(i,\"contextmenu\",this._clickListener,n)]),this._platform.IOS&&!this._cursorStyleIsSet&&(this._cursorOriginalValue=i.style.cursor,i.style.cursor=\"pointer\",this._cursorStyleIsSet=!0),this._isAttached=!0}}detach(){this._isAttached&&(this._cleanups?.forEach(A=>A()),this._cleanups=void 0,this._platform.IOS&&this._cursorStyleIsSet&&(this._document.body.style.cursor=this._cursorOriginalValue,this._cursorStyleIsSet=!1),this._isAttached=!1)}_pointerDownListener=A=>{this._pointerDownEventTarget=yr(A)};_clickListener=A=>{let i=yr(A),n=A.type===\"click\"&&this._pointerDownEventTarget?this._pointerDownEventTarget:i;this._pointerDownEventTarget=null;let o=this._attachedOverlays.slice();for(let a=o.length-1;a>-1;a--){let r=o[a],s=r._outsidePointerEvents;if(!(!r.hasAttached()||!this.canReceiveEvent(r,A,s))){if(OU(r.overlayElement,i)||OU(r.overlayElement,n))break;this._ngZone?this._ngZone.run(()=>s.next(A)):s.next(A)}}};static \\u0275fac=(()=>{let A;return function(n){return(A||(A=hi(t)))(n||t)}})();static \\u0275prov=TA({token:t,factory:t.\\u0275fac,providedIn:\"root\"})}return t})();function OU(t,e){let A=typeof ShadowRoot<\"u\"&&ShadowRoot,i=e;for(;i;){if(i===t)return!0;i=A&&i instanceof ShadowRoot?i.host:i.parentNode}return!1}var AJ=(()=>{class t{static \\u0275fac=function(i){return new(i||t)};static \\u0275cmp=kA({type:t,selectors:[[\"ng-component\"]],hostAttrs:[\"cdk-overlay-style-loader\",\"\"],decls:0,vars:0,template:function(i,n){},styles:[`.cdk-overlay-container,.cdk-global-overlay-wrapper{pointer-events:none;top:0;left:0;height:100%;width:100%}.cdk-overlay-container{position:fixed}@layer cdk-overlay{.cdk-overlay-container{z-index:1000}}.cdk-overlay-container:empty{display:none}.cdk-global-overlay-wrapper{display:flex;position:absolute}@layer cdk-overlay{.cdk-global-overlay-wrapper{z-index:1000}}.cdk-overlay-pane{position:absolute;pointer-events:auto;box-sizing:border-box;display:flex;max-width:100%;max-height:100%}@layer cdk-overlay{.cdk-overlay-pane{z-index:1000}}.cdk-overlay-backdrop{position:absolute;top:0;bottom:0;left:0;right:0;pointer-events:auto;-webkit-tap-highlight-color:rgba(0,0,0,0);opacity:0;touch-action:manipulation}@layer cdk-overlay{.cdk-overlay-backdrop{z-index:1000;transition:opacity 400ms cubic-bezier(0.25, 0.8, 0.25, 1)}}@media(prefers-reduced-motion){.cdk-overlay-backdrop{transition-duration:1ms}}.cdk-overlay-backdrop-showing{opacity:1}@media(forced-colors: active){.cdk-overlay-backdrop-showing{opacity:.6}}@layer cdk-overlay{.cdk-overlay-dark-backdrop{background:rgba(0,0,0,.32)}}.cdk-overlay-transparent-backdrop{transition:visibility 1ms linear,opacity 1ms linear;visibility:hidden;opacity:1}.cdk-overlay-transparent-backdrop.cdk-overlay-backdrop-showing,.cdk-high-contrast-active .cdk-overlay-transparent-backdrop{opacity:0;visibility:visible}.cdk-overlay-backdrop-noop-animation{transition:none}.cdk-overlay-connected-position-bounding-box{position:absolute;display:flex;flex-direction:column;min-width:1px;min-height:1px}@layer cdk-overlay{.cdk-overlay-connected-position-bounding-box{z-index:1000}}.cdk-global-scrollblock{position:fixed;width:100%;overflow-y:scroll}.cdk-overlay-popover{background:none;border:none;padding:0;outline:0;overflow:visible;position:fixed;pointer-events:none;white-space:normal;color:inherit;text-decoration:none;width:100%;height:100%;inset:auto;top:0;left:0}.cdk-overlay-popover::backdrop{display:none}.cdk-overlay-popover .cdk-overlay-backdrop{position:fixed;z-index:auto}\n`],encapsulation:2,changeDetection:0})}return t})(),dp=(()=>{class t{_platform=h(ci);_containerElement;_document=h(Zt);_styleLoader=h(Hn);constructor(){}ngOnDestroy(){this._containerElement?.remove()}getContainerElement(){return this._loadStyles(),this._containerElement||this._createContainer(),this._containerElement}_createContainer(){let A=\"cdk-overlay-container\";if(this._platform.isBrowser||qv()){let n=this._document.querySelectorAll(`.${A}[platform=\"server\"], .${A}[platform=\"test\"]`);for(let o=0;o<n.length;o++)n[o].remove()}let i=this._document.createElement(\"div\");i.classList.add(A),qv()?i.setAttribute(\"platform\",\"test\"):this._platform.isBrowser||i.setAttribute(\"platform\",\"server\"),this._document.body.appendChild(i),this._containerElement=i}_loadStyles(){this._styleLoader.load(AJ)}static \\u0275fac=function(i){return new(i||t)};static \\u0275prov=TA({token:t,factory:t.\\u0275fac,providedIn:\"root\"})}return t})(),kb=class{_renderer;_ngZone;element;_cleanupClick;_cleanupTransitionEnd;_fallbackTimeout;constructor(e,A,i,n){this._renderer=A,this._ngZone=i,this.element=e.createElement(\"div\"),this.element.classList.add(\"cdk-overlay-backdrop\"),this._cleanupClick=A.listen(this.element,\"click\",n)}detach(){this._ngZone.runOutsideAngular(()=>{let e=this.element;clearTimeout(this._fallbackTimeout),this._cleanupTransitionEnd?.(),this._cleanupTransitionEnd=this._renderer.listen(e,\"transitionend\",this.dispose),this._fallbackTimeout=setTimeout(this.dispose,500),e.style.pointerEvents=\"none\",e.classList.remove(\"cdk-overlay-backdrop-showing\")})}dispose=()=>{clearTimeout(this._fallbackTimeout),this._cleanupClick?.(),this._cleanupTransitionEnd?.(),this._cleanupClick=this._cleanupTransitionEnd=this._fallbackTimeout=void 0,this.element.remove()}};function Sb(t){return t&&t.nodeType===1}var oB=class{_portalOutlet;_host;_pane;_config;_ngZone;_keyboardDispatcher;_document;_location;_outsideClickDispatcher;_animationsDisabled;_injector;_renderer;_backdropClick=new $A;_attachments=new $A;_detachments=new $A;_positionStrategy;_scrollStrategy;_locationChanges=Rn.EMPTY;_backdropRef=null;_detachContentMutationObserver;_detachContentAfterRenderRef;_disposed=!1;_previousHostParent;_keydownEvents=new $A;_outsidePointerEvents=new $A;_afterNextRenderRef;constructor(e,A,i,n,o,a,r,s,g,l=!1,C,I){this._portalOutlet=e,this._host=A,this._pane=i,this._config=n,this._ngZone=o,this._keyboardDispatcher=a,this._document=r,this._location=s,this._outsideClickDispatcher=g,this._animationsDisabled=l,this._injector=C,this._renderer=I,n.scrollStrategy&&(this._scrollStrategy=n.scrollStrategy,this._scrollStrategy.attach(this)),this._positionStrategy=n.positionStrategy}get overlayElement(){return this._pane}get backdropElement(){return this._backdropRef?.element||null}get hostElement(){return this._host}get eventPredicate(){return this._config?.eventPredicate||null}attach(e){if(this._disposed)return null;this._attachHost();let A=this._portalOutlet.attach(e);return this._positionStrategy?.attach(this),this._updateStackingOrder(),this._updateElementSize(),this._updateElementDirection(),this._scrollStrategy&&this._scrollStrategy.enable(),this._afterNextRenderRef?.destroy(),this._afterNextRenderRef=Nn(()=>{this.hasAttached()&&this.updatePosition()},{injector:this._injector}),this._togglePointerEvents(!0),this._config.hasBackdrop&&this._attachBackdrop(),this._config.panelClass&&this._toggleClasses(this._pane,this._config.panelClass,!0),this._attachments.next(),this._completeDetachContent(),this._keyboardDispatcher.add(this),this._config.disposeOnNavigation&&(this._locationChanges=this._location.subscribe(()=>this.dispose())),this._outsideClickDispatcher.add(this),typeof A?.onDestroy==\"function\"&&A.onDestroy(()=>{this.hasAttached()&&this._ngZone.runOutsideAngular(()=>Promise.resolve().then(()=>this.detach()))}),A}detach(){if(!this.hasAttached())return;this.detachBackdrop(),this._togglePointerEvents(!1),this._positionStrategy&&this._positionStrategy.detach&&this._positionStrategy.detach(),this._scrollStrategy&&this._scrollStrategy.disable();let e=this._portalOutlet.detach();return this._detachments.next(),this._completeDetachContent(),this._keyboardDispatcher.remove(this),this._detachContentWhenEmpty(),this._locationChanges.unsubscribe(),this._outsideClickDispatcher.remove(this),e}dispose(){if(this._disposed)return;let e=this.hasAttached();this._positionStrategy&&this._positionStrategy.dispose(),this._disposeScrollStrategy(),this._backdropRef?.dispose(),this._locationChanges.unsubscribe(),this._keyboardDispatcher.remove(this),this._portalOutlet.dispose(),this._attachments.complete(),this._backdropClick.complete(),this._keydownEvents.complete(),this._outsidePointerEvents.complete(),this._outsideClickDispatcher.remove(this),this._host?.remove(),this._afterNextRenderRef?.destroy(),this._previousHostParent=this._pane=this._host=this._backdropRef=null,e&&this._detachments.next(),this._detachments.complete(),this._completeDetachContent(),this._disposed=!0}hasAttached(){return this._portalOutlet.hasAttached()}backdropClick(){return this._backdropClick}attachments(){return this._attachments}detachments(){return this._detachments}keydownEvents(){return this._keydownEvents}outsidePointerEvents(){return this._outsidePointerEvents}getConfig(){return this._config}updatePosition(){this._positionStrategy&&this._positionStrategy.apply()}updatePositionStrategy(e){e!==this._positionStrategy&&(this._positionStrategy&&this._positionStrategy.dispose(),this._positionStrategy=e,this.hasAttached()&&(e.attach(this),this.updatePosition()))}updateSize(e){this._config=BA(BA({},this._config),e),this._updateElementSize()}setDirection(e){this._config=Ve(BA({},this._config),{direction:e}),this._updateElementDirection()}addPanelClass(e){this._pane&&this._toggleClasses(this._pane,e,!0)}removePanelClass(e){this._pane&&this._toggleClasses(this._pane,e,!1)}getDirection(){let e=this._config.direction;return e?typeof e==\"string\"?e:e.value:\"ltr\"}updateScrollStrategy(e){e!==this._scrollStrategy&&(this._disposeScrollStrategy(),this._scrollStrategy=e,this.hasAttached()&&(e.attach(this),e.enable()))}_updateElementDirection(){this._host.setAttribute(\"dir\",this.getDirection())}_updateElementSize(){if(!this._pane)return;let e=this._pane.style;e.width=Ra(this._config.width),e.height=Ra(this._config.height),e.minWidth=Ra(this._config.minWidth),e.minHeight=Ra(this._config.minHeight),e.maxWidth=Ra(this._config.maxWidth),e.maxHeight=Ra(this._config.maxHeight)}_togglePointerEvents(e){this._pane.style.pointerEvents=e?\"\":\"none\"}_attachHost(){if(!this._host.parentElement){let e=this._config.usePopover?this._positionStrategy?.getPopoverInsertionPoint?.():null;Sb(e)?e.after(this._host):e?.type===\"parent\"?e.element.appendChild(this._host):this._previousHostParent?.appendChild(this._host)}if(this._config.usePopover)try{this._host.showPopover()}catch(e){}}_attachBackdrop(){let e=\"cdk-overlay-backdrop-showing\";this._backdropRef?.dispose(),this._backdropRef=new kb(this._document,this._renderer,this._ngZone,A=>{this._backdropClick.next(A)}),this._animationsDisabled&&this._backdropRef.element.classList.add(\"cdk-overlay-backdrop-noop-animation\"),this._config.backdropClass&&this._toggleClasses(this._backdropRef.element,this._config.backdropClass,!0),this._config.usePopover?this._host.prepend(this._backdropRef.element):this._host.parentElement.insertBefore(this._backdropRef.element,this._host),!this._animationsDisabled&&typeof requestAnimationFrame<\"u\"?this._ngZone.runOutsideAngular(()=>{requestAnimationFrame(()=>this._backdropRef?.element.classList.add(e))}):this._backdropRef.element.classList.add(e)}_updateStackingOrder(){!this._config.usePopover&&this._host.nextSibling&&this._host.parentNode.appendChild(this._host)}detachBackdrop(){this._animationsDisabled?(this._backdropRef?.dispose(),this._backdropRef=null):this._backdropRef?.detach()}_toggleClasses(e,A,i){let n=kd(A||[]).filter(o=>!!o);n.length&&(i?e.classList.add(...n):e.classList.remove(...n))}_detachContentWhenEmpty(){let e=!1;try{this._detachContentAfterRenderRef=Nn(()=>{e=!0,this._detachContent()},{injector:this._injector})}catch(A){if(e)throw A;this._detachContent()}globalThis.MutationObserver&&this._pane&&(this._detachContentMutationObserver||=new globalThis.MutationObserver(()=>{this._detachContent()}),this._detachContentMutationObserver.observe(this._pane,{childList:!0}))}_detachContent(){(!this._pane||!this._host||this._pane.children.length===0)&&(this._pane&&this._config.panelClass&&this._toggleClasses(this._pane,this._config.panelClass,!1),this._host&&this._host.parentElement&&(this._previousHostParent=this._host.parentElement,this._host.remove()),this._completeDetachContent())}_completeDetachContent(){this._detachContentAfterRenderRef?.destroy(),this._detachContentAfterRenderRef=void 0,this._detachContentMutationObserver?.disconnect()}_disposeScrollStrategy(){let e=this._scrollStrategy;e?.disable(),e?.detach?.()}},zU=\"cdk-overlay-connected-position-bounding-box\",hlA=/([A-Za-z%]+)$/;function XI(t,e){return new Cp(e,t.get(Bs),t.get(Zt),t.get(ci),t.get(dp))}var Cp=class{_viewportRuler;_document;_platform;_overlayContainer;_overlayRef;_isInitialRender=!1;_lastBoundingBoxSize={width:0,height:0};_isPushed=!1;_canPush=!0;_growAfterOpen=!1;_hasFlexibleDimensions=!0;_positionLocked=!1;_originRect;_overlayRect;_viewportRect;_containerRect;_viewportMargin=0;_scrollables=[];_preferredPositions=[];_origin;_pane;_isDisposed=!1;_boundingBox=null;_lastPosition=null;_lastScrollVisibility=null;_positionChanges=new $A;_resizeSubscription=Rn.EMPTY;_offsetX=0;_offsetY=0;_transformOriginSelector;_appliedPanelClasses=[];_previousPushAmount=null;_popoverLocation=\"global\";positionChanges=this._positionChanges;get positions(){return this._preferredPositions}constructor(e,A,i,n,o){this._viewportRuler=A,this._document=i,this._platform=n,this._overlayContainer=o,this.setOrigin(e)}attach(e){this._overlayRef&&this._overlayRef,this._validatePositions(),e.hostElement.classList.add(zU),this._overlayRef=e,this._boundingBox=e.hostElement,this._pane=e.overlayElement,this._isDisposed=!1,this._isInitialRender=!0,this._lastPosition=null,this._resizeSubscription.unsubscribe(),this._resizeSubscription=this._viewportRuler.change().subscribe(()=>{this._isInitialRender=!0,this.apply()})}apply(){if(this._isDisposed||!this._platform.isBrowser)return;if(!this._isInitialRender&&this._positionLocked&&this._lastPosition){this.reapplyLastPosition();return}this._clearPanelClasses(),this._resetOverlayElementStyles(),this._resetBoundingBoxStyles(),this._viewportRect=this._getNarrowedViewportRect(),this._originRect=this._getOriginRect(),this._overlayRect=this._pane.getBoundingClientRect(),this._containerRect=this._getContainerRect();let e=this._originRect,A=this._overlayRect,i=this._viewportRect,n=this._containerRect,o=[],a;for(let r of this._preferredPositions){let s=this._getOriginPoint(e,n,r),g=this._getOverlayPoint(s,A,r),l=this._getOverlayFit(g,A,i,r);if(l.isCompletelyWithinViewport){this._isPushed=!1,this._applyPosition(r,s);return}if(this._canFitWithFlexibleDimensions(l,g,i)){o.push({position:r,origin:s,overlayRect:A,boundingBoxRect:this._calculateBoundingBoxRect(s,r)});continue}(!a||a.overlayFit.visibleArea<l.visibleArea)&&(a={overlayFit:l,overlayPoint:g,originPoint:s,position:r,overlayRect:A})}if(o.length){let r=null,s=-1;for(let g of o){let l=g.boundingBoxRect.width*g.boundingBoxRect.height*(g.position.weight||1);l>s&&(s=l,r=g)}this._isPushed=!1,this._applyPosition(r.position,r.origin);return}if(this._canPush){this._isPushed=!0,this._applyPosition(a.position,a.originPoint);return}this._applyPosition(a.position,a.originPoint)}detach(){this._clearPanelClasses(),this._lastPosition=null,this._previousPushAmount=null,this._resizeSubscription.unsubscribe()}dispose(){this._isDisposed||(this._boundingBox&&ZI(this._boundingBox.style,{top:\"\",left:\"\",right:\"\",bottom:\"\",height:\"\",width:\"\",alignItems:\"\",justifyContent:\"\"}),this._pane&&this._resetOverlayElementStyles(),this._overlayRef&&this._overlayRef.hostElement.classList.remove(zU),this.detach(),this._positionChanges.complete(),this._overlayRef=this._boundingBox=null,this._isDisposed=!0)}reapplyLastPosition(){if(this._isDisposed||!this._platform.isBrowser)return;let e=this._lastPosition;e?(this._originRect=this._getOriginRect(),this._overlayRect=this._pane.getBoundingClientRect(),this._viewportRect=this._getNarrowedViewportRect(),this._containerRect=this._getContainerRect(),this._applyPosition(e,this._getOriginPoint(this._originRect,this._containerRect,e))):this.apply()}withScrollableContainers(e){return this._scrollables=e,this}withPositions(e){return this._preferredPositions=e,e.indexOf(this._lastPosition)===-1&&(this._lastPosition=null),this._validatePositions(),this}withViewportMargin(e){return this._viewportMargin=e,this}withFlexibleDimensions(e=!0){return this._hasFlexibleDimensions=e,this}withGrowAfterOpen(e=!0){return this._growAfterOpen=e,this}withPush(e=!0){return this._canPush=e,this}withLockedPosition(e=!0){return this._positionLocked=e,this}setOrigin(e){return this._origin=e,this}withDefaultOffsetX(e){return this._offsetX=e,this}withDefaultOffsetY(e){return this._offsetY=e,this}withTransformOriginOn(e){return this._transformOriginSelector=e,this}withPopoverLocation(e){return this._popoverLocation=e,this}getPopoverInsertionPoint(){return this._popoverLocation===\"global\"?null:this._popoverLocation!==\"inline\"?this._popoverLocation:this._origin instanceof ge?this._origin.nativeElement:Sb(this._origin)?this._origin:null}_getOriginPoint(e,A,i){let n;if(i.originX==\"center\")n=e.left+e.width/2;else{let a=this._isRtl()?e.right:e.left,r=this._isRtl()?e.left:e.right;n=i.originX==\"start\"?a:r}A.left<0&&(n-=A.left);let o;return i.originY==\"center\"?o=e.top+e.height/2:o=i.originY==\"top\"?e.top:e.bottom,A.top<0&&(o-=A.top),{x:n,y:o}}_getOverlayPoint(e,A,i){let n;i.overlayX==\"center\"?n=-A.width/2:i.overlayX===\"start\"?n=this._isRtl()?-A.width:0:n=this._isRtl()?0:-A.width;let o;return i.overlayY==\"center\"?o=-A.height/2:o=i.overlayY==\"top\"?0:-A.height,{x:e.x+n,y:e.y+o}}_getOverlayFit(e,A,i,n){let o=jU(A),{x:a,y:r}=e,s=this._getOffset(n,\"x\"),g=this._getOffset(n,\"y\");s&&(a+=s),g&&(r+=g);let l=0-a,C=a+o.width-i.width,I=0-r,d=r+o.height-i.height,B=this._subtractOverflows(o.width,l,C),Q=this._subtractOverflows(o.height,I,d),E=B*Q;return{visibleArea:E,isCompletelyWithinViewport:o.width*o.height===E,fitsInViewportVertically:Q===o.height,fitsInViewportHorizontally:B==o.width}}_canFitWithFlexibleDimensions(e,A,i){if(this._hasFlexibleDimensions){let n=i.bottom-A.y,o=i.right-A.x,a=PU(this._overlayRef.getConfig().minHeight),r=PU(this._overlayRef.getConfig().minWidth),s=e.fitsInViewportVertically||a!=null&&a<=n,g=e.fitsInViewportHorizontally||r!=null&&r<=o;return s&&g}return!1}_pushOverlayOnScreen(e,A,i){if(this._previousPushAmount&&this._positionLocked)return{x:e.x+this._previousPushAmount.x,y:e.y+this._previousPushAmount.y};let n=jU(A),o=this._viewportRect,a=Math.max(e.x+n.width-o.width,0),r=Math.max(e.y+n.height-o.height,0),s=Math.max(o.top-i.top-e.y,0),g=Math.max(o.left-i.left-e.x,0),l=0,C=0;return n.width<=o.width?l=g||-a:l=e.x<this._getViewportMarginStart()?o.left-i.left-e.x:0,n.height<=o.height?C=s||-r:C=e.y<this._getViewportMarginTop()?o.top-i.top-e.y:0,this._previousPushAmount={x:l,y:C},{x:e.x+l,y:e.y+C}}_applyPosition(e,A){if(this._setTransformOrigin(e),this._setOverlayElementStyles(A,e),this._setBoundingBoxStyles(A,e),e.panelClass&&this._addPanelClasses(e.panelClass),this._positionChanges.observers.length){let i=this._getScrollVisibility();if(e!==this._lastPosition||!this._lastScrollVisibility||!ulA(this._lastScrollVisibility,i)){let n=new cp(e,i);this._positionChanges.next(n)}this._lastScrollVisibility=i}this._lastPosition=e,this._isInitialRender=!1}_setTransformOrigin(e){if(!this._transformOriginSelector)return;let A=this._boundingBox.querySelectorAll(this._transformOriginSelector),i,n=e.overlayY;e.overlayX===\"center\"?i=\"center\":this._isRtl()?i=e.overlayX===\"start\"?\"right\":\"left\":i=e.overlayX===\"start\"?\"left\":\"right\";for(let o=0;o<A.length;o++)A[o].style.transformOrigin=`${i} ${n}`}_calculateBoundingBoxRect(e,A){let i=this._viewportRect,n=this._isRtl(),o,a,r;if(A.overlayY===\"top\")a=e.y,o=i.height-a+this._getViewportMarginBottom();else if(A.overlayY===\"bottom\")r=i.height-e.y+this._getViewportMarginTop()+this._getViewportMarginBottom(),o=i.height-r+this._getViewportMarginTop();else{let d=Math.min(i.bottom-e.y+i.top,e.y),B=this._lastBoundingBoxSize.height;o=d*2,a=e.y-d,o>B&&!this._isInitialRender&&!this._growAfterOpen&&(a=e.y-B/2)}let s=A.overlayX===\"start\"&&!n||A.overlayX===\"end\"&&n,g=A.overlayX===\"end\"&&!n||A.overlayX===\"start\"&&n,l,C,I;if(g)I=i.width-e.x+this._getViewportMarginStart()+this._getViewportMarginEnd(),l=e.x-this._getViewportMarginStart();else if(s)C=e.x,l=i.right-e.x-this._getViewportMarginEnd();else{let d=Math.min(i.right-e.x+i.left,e.x),B=this._lastBoundingBoxSize.width;l=d*2,C=e.x-d,l>B&&!this._isInitialRender&&!this._growAfterOpen&&(C=e.x-B/2)}return{top:a,left:C,bottom:r,right:I,width:l,height:o}}_setBoundingBoxStyles(e,A){let i=this._calculateBoundingBoxRect(e,A);!this._isInitialRender&&!this._growAfterOpen&&(i.height=Math.min(i.height,this._lastBoundingBoxSize.height),i.width=Math.min(i.width,this._lastBoundingBoxSize.width));let n={};if(this._hasExactPosition())n.top=n.left=\"0\",n.bottom=n.right=\"auto\",n.maxHeight=n.maxWidth=\"\",n.width=n.height=\"100%\";else{let o=this._overlayRef.getConfig().maxHeight,a=this._overlayRef.getConfig().maxWidth;n.width=Ra(i.width),n.height=Ra(i.height),n.top=Ra(i.top)||\"auto\",n.bottom=Ra(i.bottom)||\"auto\",n.left=Ra(i.left)||\"auto\",n.right=Ra(i.right)||\"auto\",A.overlayX===\"center\"?n.alignItems=\"center\":n.alignItems=A.overlayX===\"end\"?\"flex-end\":\"flex-start\",A.overlayY===\"center\"?n.justifyContent=\"center\":n.justifyContent=A.overlayY===\"bottom\"?\"flex-end\":\"flex-start\",o&&(n.maxHeight=Ra(o)),a&&(n.maxWidth=Ra(a))}this._lastBoundingBoxSize=i,ZI(this._boundingBox.style,n)}_resetBoundingBoxStyles(){ZI(this._boundingBox.style,{top:\"0\",left:\"0\",right:\"0\",bottom:\"0\",height:\"\",width:\"\",alignItems:\"\",justifyContent:\"\"})}_resetOverlayElementStyles(){ZI(this._pane.style,{top:\"\",left:\"\",bottom:\"\",right:\"\",position:\"\",transform:\"\"})}_setOverlayElementStyles(e,A){let i={},n=this._hasExactPosition(),o=this._hasFlexibleDimensions,a=this._overlayRef.getConfig();if(n){let l=this._viewportRuler.getViewportScrollPosition();ZI(i,this._getExactOverlayY(A,e,l)),ZI(i,this._getExactOverlayX(A,e,l))}else i.position=\"static\";let r=\"\",s=this._getOffset(A,\"x\"),g=this._getOffset(A,\"y\");s&&(r+=`translateX(${s}px) `),g&&(r+=`translateY(${g}px)`),i.transform=r.trim(),a.maxHeight&&(n?i.maxHeight=Ra(a.maxHeight):o&&(i.maxHeight=\"\")),a.maxWidth&&(n?i.maxWidth=Ra(a.maxWidth):o&&(i.maxWidth=\"\")),ZI(this._pane.style,i)}_getExactOverlayY(e,A,i){let n={top:\"\",bottom:\"\"},o=this._getOverlayPoint(A,this._overlayRect,e);if(this._isPushed&&(o=this._pushOverlayOnScreen(o,this._overlayRect,i)),e.overlayY===\"bottom\"){let a=this._document.documentElement.clientHeight;n.bottom=`${a-(o.y+this._overlayRect.height)}px`}else n.top=Ra(o.y);return n}_getExactOverlayX(e,A,i){let n={left:\"\",right:\"\"},o=this._getOverlayPoint(A,this._overlayRect,e);this._isPushed&&(o=this._pushOverlayOnScreen(o,this._overlayRect,i));let a;if(this._isRtl()?a=e.overlayX===\"end\"?\"left\":\"right\":a=e.overlayX===\"end\"?\"right\":\"left\",a===\"right\"){let r=this._document.documentElement.clientWidth;n.right=`${r-(o.x+this._overlayRect.width)}px`}else n.left=Ra(o.x);return n}_getScrollVisibility(){let e=this._getOriginRect(),A=this._pane.getBoundingClientRect(),i=this._scrollables.map(n=>n.getElementRef().nativeElement.getBoundingClientRect());return{isOriginClipped:TU(e,i),isOriginOutsideView:Mb(e,i),isOverlayClipped:TU(A,i),isOverlayOutsideView:Mb(A,i)}}_subtractOverflows(e,...A){return A.reduce((i,n)=>i-Math.max(n,0),e)}_getNarrowedViewportRect(){let e=this._document.documentElement.clientWidth,A=this._document.documentElement.clientHeight,i=this._viewportRuler.getViewportScrollPosition();return{top:i.top+this._getViewportMarginTop(),left:i.left+this._getViewportMarginStart(),right:i.left+e-this._getViewportMarginEnd(),bottom:i.top+A-this._getViewportMarginBottom(),width:e-this._getViewportMarginStart()-this._getViewportMarginEnd(),height:A-this._getViewportMarginTop()-this._getViewportMarginBottom()}}_isRtl(){return this._overlayRef.getDirection()===\"rtl\"}_hasExactPosition(){return!this._hasFlexibleDimensions||this._isPushed}_getOffset(e,A){return A===\"x\"?e.offsetX==null?this._offsetX:e.offsetX:e.offsetY==null?this._offsetY:e.offsetY}_validatePositions(){}_addPanelClasses(e){this._pane&&kd(e).forEach(A=>{A!==\"\"&&this._appliedPanelClasses.indexOf(A)===-1&&(this._appliedPanelClasses.push(A),this._pane.classList.add(A))})}_clearPanelClasses(){this._pane&&(this._appliedPanelClasses.forEach(e=>{this._pane.classList.remove(e)}),this._appliedPanelClasses=[])}_getViewportMarginStart(){return typeof this._viewportMargin==\"number\"?this._viewportMargin:this._viewportMargin?.start??0}_getViewportMarginEnd(){return typeof this._viewportMargin==\"number\"?this._viewportMargin:this._viewportMargin?.end??0}_getViewportMarginTop(){return typeof this._viewportMargin==\"number\"?this._viewportMargin:this._viewportMargin?.top??0}_getViewportMarginBottom(){return typeof this._viewportMargin==\"number\"?this._viewportMargin:this._viewportMargin?.bottom??0}_getOriginRect(){let e=this._origin;if(e instanceof ge)return e.nativeElement.getBoundingClientRect();if(e instanceof Element)return e.getBoundingClientRect();let A=e.width||0,i=e.height||0;return{top:e.y,bottom:e.y+i,left:e.x,right:e.x+A,height:i,width:A}}_getContainerRect(){let e=this._overlayRef.getConfig().usePopover&&this._popoverLocation!==\"global\",A=this._overlayContainer.getContainerElement();e&&(A.style.display=\"block\");let i=A.getBoundingClientRect();return e&&(A.style.display=\"\"),i}};function ZI(t,e){for(let A in e)e.hasOwnProperty(A)&&(t[A]=e[A]);return t}function PU(t){if(typeof t!=\"number\"&&t!=null){let[e,A]=t.split(hlA);return!A||A===\"px\"?parseFloat(e):null}return t||null}function jU(t){return{top:Math.floor(t.top),right:Math.floor(t.right),bottom:Math.floor(t.bottom),left:Math.floor(t.left),width:Math.floor(t.width),height:Math.floor(t.height)}}function ulA(t,e){return t===e?!0:t.isOriginClipped===e.isOriginClipped&&t.isOriginOutsideView===e.isOriginOutsideView&&t.isOverlayClipped===e.isOverlayClipped&&t.isOverlayOutsideView===e.isOverlayOutsideView}var qU=\"cdk-global-overlay-wrapper\";function jC(t){return new Ip}var Ip=class{_overlayRef;_cssPosition=\"static\";_topOffset=\"\";_bottomOffset=\"\";_alignItems=\"\";_xPosition=\"\";_xOffset=\"\";_width=\"\";_height=\"\";_isDisposed=!1;attach(e){let A=e.getConfig();this._overlayRef=e,this._width&&!A.width&&e.updateSize({width:this._width}),this._height&&!A.height&&e.updateSize({height:this._height}),e.hostElement.classList.add(qU),this._isDisposed=!1}top(e=\"\"){return this._bottomOffset=\"\",this._topOffset=e,this._alignItems=\"flex-start\",this}left(e=\"\"){return this._xOffset=e,this._xPosition=\"left\",this}bottom(e=\"\"){return this._topOffset=\"\",this._bottomOffset=e,this._alignItems=\"flex-end\",this}right(e=\"\"){return this._xOffset=e,this._xPosition=\"right\",this}start(e=\"\"){return this._xOffset=e,this._xPosition=\"start\",this}end(e=\"\"){return this._xOffset=e,this._xPosition=\"end\",this}width(e=\"\"){return this._overlayRef?this._overlayRef.updateSize({width:e}):this._width=e,this}height(e=\"\"){return this._overlayRef?this._overlayRef.updateSize({height:e}):this._height=e,this}centerHorizontally(e=\"\"){return this.left(e),this._xPosition=\"center\",this}centerVertically(e=\"\"){return this.top(e),this._alignItems=\"center\",this}apply(){if(!this._overlayRef||!this._overlayRef.hasAttached())return;let e=this._overlayRef.overlayElement.style,A=this._overlayRef.hostElement.style,i=this._overlayRef.getConfig(),{width:n,height:o,maxWidth:a,maxHeight:r}=i,s=(n===\"100%\"||n===\"100vw\")&&(!a||a===\"100%\"||a===\"100vw\"),g=(o===\"100%\"||o===\"100vh\")&&(!r||r===\"100%\"||r===\"100vh\"),l=this._xPosition,C=this._xOffset,I=this._overlayRef.getConfig().direction===\"rtl\",d=\"\",B=\"\",Q=\"\";s?Q=\"flex-start\":l===\"center\"?(Q=\"center\",I?B=C:d=C):I?l===\"left\"||l===\"end\"?(Q=\"flex-end\",d=C):(l===\"right\"||l===\"start\")&&(Q=\"flex-start\",B=C):l===\"left\"||l===\"start\"?(Q=\"flex-start\",d=C):(l===\"right\"||l===\"end\")&&(Q=\"flex-end\",B=C),e.position=this._cssPosition,e.marginLeft=s?\"0\":d,e.marginTop=g?\"0\":this._topOffset,e.marginBottom=this._bottomOffset,e.marginRight=s?\"0\":B,A.justifyContent=Q,A.alignItems=g?\"flex-start\":this._alignItems}dispose(){if(this._isDisposed||!this._overlayRef)return;let e=this._overlayRef.overlayElement.style,A=this._overlayRef.hostElement,i=A.style;A.classList.remove(qU),i.justifyContent=i.alignItems=e.marginTop=e.marginBottom=e.marginLeft=e.marginRight=e.position=\"\",this._overlayRef=null,this._isDisposed=!0}},eJ=(()=>{class t{_injector=h(ut);constructor(){}global(){return jC()}flexibleConnectedTo(A){return XI(this._injector,A)}static \\u0275fac=function(i){return new(i||t)};static \\u0275prov=TA({token:t,factory:t.\\u0275fac,providedIn:\"root\"})}return t})(),n4=new wA(\"OVERLAY_DEFAULT_CONFIG\");function Rl(t,e){t.get(Hn).load(AJ);let A=t.get(dp),i=t.get(Zt),n=t.get(An),o=t.get(p0),a=t.get(wo),r=t.get(ui,null,{optional:!0})||t.get(Dr).createRenderer(null,null),s=new Sl(e),g=t.get(n4,null,{optional:!0})?.usePopover??!0;s.direction=s.direction||a.value,\"showPopover\"in i.body?s.usePopover=e?.usePopover??g:s.usePopover=!1;let l=i.createElement(\"div\"),C=i.createElement(\"div\");l.id=n.getId(\"cdk-overlay-\"),l.classList.add(\"cdk-overlay-pane\"),C.appendChild(l),s.usePopover&&(C.setAttribute(\"popover\",\"manual\"),C.classList.add(\"cdk-overlay-popover\"));let I=s.usePopover?s.positionStrategy?.getPopoverInsertionPoint?.():null;return Sb(I)?I.after(C):I?.type===\"parent\"?I.element.appendChild(C):A.getContainerElement().appendChild(C),new oB(new t4(l,o,t),C,l,s,t.get(Oe),t.get(XU),i,t.get(wc),t.get($U),e?.disableAnimations??t.get(vI,null,{optional:!0})===\"NoopAnimations\",t.get(pr),r)}var Bp=(()=>{class t{scrollStrategies=h(WU);_positionBuilder=h(eJ);_injector=h(ut);constructor(){}create(A){return Rl(this._injector,A)}position(){return this._positionBuilder}static \\u0275fac=function(i){return new(i||t)};static \\u0275prov=TA({token:t,factory:t.\\u0275fac,providedIn:\"root\"})}return t})(),flA=[{originX:\"start\",originY:\"bottom\",overlayX:\"start\",overlayY:\"top\"},{originX:\"start\",originY:\"top\",overlayX:\"start\",overlayY:\"bottom\"},{originX:\"end\",originY:\"top\",overlayX:\"end\",overlayY:\"bottom\"},{originX:\"end\",originY:\"bottom\",overlayX:\"end\",overlayY:\"top\"}],mlA=new wA(\"cdk-connected-overlay-scroll-strategy\",{providedIn:\"root\",factory:()=>{let t=h(ut);return()=>R0(t)}}),aB=(()=>{class t{elementRef=h(ge);constructor(){}static \\u0275fac=function(i){return new(i||t)};static \\u0275dir=OA({type:t,selectors:[[\"\",\"cdk-overlay-origin\",\"\"],[\"\",\"overlay-origin\",\"\"],[\"\",\"cdkOverlayOrigin\",\"\"]],exportAs:[\"cdkOverlayOrigin\"]})}return t})(),tJ=new wA(\"cdk-connected-overlay-default-config\"),Qp=(()=>{class t{_dir=h(wo,{optional:!0});_injector=h(ut);_overlayRef;_templatePortal;_backdropSubscription=Rn.EMPTY;_attachSubscription=Rn.EMPTY;_detachSubscription=Rn.EMPTY;_positionSubscription=Rn.EMPTY;_offsetX;_offsetY;_position;_scrollStrategyFactory=h(mlA);_ngZone=h(Oe);origin;positions;positionStrategy;get offsetX(){return this._offsetX}set offsetX(A){this._offsetX=A,this._position&&this._updatePositionStrategy(this._position)}get offsetY(){return this._offsetY}set offsetY(A){this._offsetY=A,this._position&&this._updatePositionStrategy(this._position)}width;height;minWidth;minHeight;backdropClass;panelClass;viewportMargin=0;scrollStrategy;open=!1;disableClose=!1;transformOriginSelector;hasBackdrop=!1;lockPosition=!1;flexibleDimensions=!1;growAfterOpen=!1;push=!1;disposeOnNavigation=!1;usePopover;matchWidth=!1;set _config(A){typeof A!=\"string\"&&this._assignConfig(A)}backdropClick=new WA;positionChange=new WA;attach=new WA;detach=new WA;overlayKeydown=new WA;overlayOutsideClick=new WA;constructor(){let A=h(Fn),i=h(Ro),n=h(tJ,{optional:!0}),o=h(n4,{optional:!0});this.usePopover=o?.usePopover===!1?null:\"global\",this._templatePortal=new Vr(A,i),this.scrollStrategy=this._scrollStrategyFactory(),n&&this._assignConfig(n)}get overlayRef(){return this._overlayRef}get dir(){return this._dir?this._dir.value:\"ltr\"}ngOnDestroy(){this._attachSubscription.unsubscribe(),this._detachSubscription.unsubscribe(),this._backdropSubscription.unsubscribe(),this._positionSubscription.unsubscribe(),this._overlayRef?.dispose()}ngOnChanges(A){this._position&&(this._updatePositionStrategy(this._position),this._overlayRef?.updateSize({width:this._getWidth(),minWidth:this.minWidth,height:this.height,minHeight:this.minHeight}),A.origin&&this.open&&this._position.apply()),A.open&&(this.open?this.attachOverlay():this.detachOverlay())}_createOverlay(){(!this.positions||!this.positions.length)&&(this.positions=flA);let A=this._overlayRef=Rl(this._injector,this._buildConfig());this._attachSubscription=A.attachments().subscribe(()=>this.attach.emit()),this._detachSubscription=A.detachments().subscribe(()=>this.detach.emit()),A.keydownEvents().subscribe(i=>{this.overlayKeydown.next(i),i.keyCode===27&&!this.disableClose&&!aa(i)&&(i.preventDefault(),this.detachOverlay())}),this._overlayRef.outsidePointerEvents().subscribe(i=>{let n=this._getOriginElement(),o=yr(i);(!n||n!==o&&!n.contains(o))&&this.overlayOutsideClick.next(i)})}_buildConfig(){let A=this._position=this.positionStrategy||this._createPositionStrategy(),i=new Sl({direction:this._dir||\"ltr\",positionStrategy:A,scrollStrategy:this.scrollStrategy,hasBackdrop:this.hasBackdrop,disposeOnNavigation:this.disposeOnNavigation,usePopover:!!this.usePopover});return(this.height||this.height===0)&&(i.height=this.height),(this.minWidth||this.minWidth===0)&&(i.minWidth=this.minWidth),(this.minHeight||this.minHeight===0)&&(i.minHeight=this.minHeight),this.backdropClass&&(i.backdropClass=this.backdropClass),this.panelClass&&(i.panelClass=this.panelClass),i}_updatePositionStrategy(A){let i=this.positions.map(n=>({originX:n.originX,originY:n.originY,overlayX:n.overlayX,overlayY:n.overlayY,offsetX:n.offsetX||this.offsetX,offsetY:n.offsetY||this.offsetY,panelClass:n.panelClass||void 0}));return A.setOrigin(this._getOrigin()).withPositions(i).withFlexibleDimensions(this.flexibleDimensions).withPush(this.push).withGrowAfterOpen(this.growAfterOpen).withViewportMargin(this.viewportMargin).withLockedPosition(this.lockPosition).withTransformOriginOn(this.transformOriginSelector).withPopoverLocation(this.usePopover===null?\"global\":this.usePopover)}_createPositionStrategy(){let A=XI(this._injector,this._getOrigin());return this._updatePositionStrategy(A),A}_getOrigin(){return this.origin instanceof aB?this.origin.elementRef:this.origin}_getOriginElement(){return this.origin instanceof aB?this.origin.elementRef.nativeElement:this.origin instanceof ge?this.origin.nativeElement:typeof Element<\"u\"&&this.origin instanceof Element?this.origin:null}_getWidth(){return this.width?this.width:this.matchWidth?this._getOriginElement()?.getBoundingClientRect?.().width:void 0}attachOverlay(){this._overlayRef||this._createOverlay();let A=this._overlayRef;A.getConfig().hasBackdrop=this.hasBackdrop,A.updateSize({width:this._getWidth()}),A.hasAttached()||A.attach(this._templatePortal),this.hasBackdrop?this._backdropSubscription=A.backdropClick().subscribe(i=>this.backdropClick.emit(i)):this._backdropSubscription.unsubscribe(),this._positionSubscription.unsubscribe(),this.positionChange.observers.length>0&&(this._positionSubscription=this._position.positionChanges.pipe(oL(()=>this.positionChange.observers.length>0)).subscribe(i=>{this._ngZone.run(()=>this.positionChange.emit(i)),this.positionChange.observers.length===0&&this._positionSubscription.unsubscribe()})),this.open=!0}detachOverlay(){this._overlayRef?.detach(),this._backdropSubscription.unsubscribe(),this._positionSubscription.unsubscribe(),this.open=!1}_assignConfig(A){this.origin=A.origin??this.origin,this.positions=A.positions??this.positions,this.positionStrategy=A.positionStrategy??this.positionStrategy,this.offsetX=A.offsetX??this.offsetX,this.offsetY=A.offsetY??this.offsetY,this.width=A.width??this.width,this.height=A.height??this.height,this.minWidth=A.minWidth??this.minWidth,this.minHeight=A.minHeight??this.minHeight,this.backdropClass=A.backdropClass??this.backdropClass,this.panelClass=A.panelClass??this.panelClass,this.viewportMargin=A.viewportMargin??this.viewportMargin,this.scrollStrategy=A.scrollStrategy??this.scrollStrategy,this.disableClose=A.disableClose??this.disableClose,this.transformOriginSelector=A.transformOriginSelector??this.transformOriginSelector,this.hasBackdrop=A.hasBackdrop??this.hasBackdrop,this.lockPosition=A.lockPosition??this.lockPosition,this.flexibleDimensions=A.flexibleDimensions??this.flexibleDimensions,this.growAfterOpen=A.growAfterOpen??this.growAfterOpen,this.push=A.push??this.push,this.disposeOnNavigation=A.disposeOnNavigation??this.disposeOnNavigation,this.usePopover=A.usePopover??this.usePopover,this.matchWidth=A.matchWidth??this.matchWidth}static \\u0275fac=function(i){return new(i||t)};static \\u0275dir=OA({type:t,selectors:[[\"\",\"cdk-connected-overlay\",\"\"],[\"\",\"connected-overlay\",\"\"],[\"\",\"cdkConnectedOverlay\",\"\"]],inputs:{origin:[0,\"cdkConnectedOverlayOrigin\",\"origin\"],positions:[0,\"cdkConnectedOverlayPositions\",\"positions\"],positionStrategy:[0,\"cdkConnectedOverlayPositionStrategy\",\"positionStrategy\"],offsetX:[0,\"cdkConnectedOverlayOffsetX\",\"offsetX\"],offsetY:[0,\"cdkConnectedOverlayOffsetY\",\"offsetY\"],width:[0,\"cdkConnectedOverlayWidth\",\"width\"],height:[0,\"cdkConnectedOverlayHeight\",\"height\"],minWidth:[0,\"cdkConnectedOverlayMinWidth\",\"minWidth\"],minHeight:[0,\"cdkConnectedOverlayMinHeight\",\"minHeight\"],backdropClass:[0,\"cdkConnectedOverlayBackdropClass\",\"backdropClass\"],panelClass:[0,\"cdkConnectedOverlayPanelClass\",\"panelClass\"],viewportMargin:[0,\"cdkConnectedOverlayViewportMargin\",\"viewportMargin\"],scrollStrategy:[0,\"cdkConnectedOverlayScrollStrategy\",\"scrollStrategy\"],open:[0,\"cdkConnectedOverlayOpen\",\"open\"],disableClose:[0,\"cdkConnectedOverlayDisableClose\",\"disableClose\"],transformOriginSelector:[0,\"cdkConnectedOverlayTransformOriginOn\",\"transformOriginSelector\"],hasBackdrop:[2,\"cdkConnectedOverlayHasBackdrop\",\"hasBackdrop\",he],lockPosition:[2,\"cdkConnectedOverlayLockPosition\",\"lockPosition\",he],flexibleDimensions:[2,\"cdkConnectedOverlayFlexibleDimensions\",\"flexibleDimensions\",he],growAfterOpen:[2,\"cdkConnectedOverlayGrowAfterOpen\",\"growAfterOpen\",he],push:[2,\"cdkConnectedOverlayPush\",\"push\",he],disposeOnNavigation:[2,\"cdkConnectedOverlayDisposeOnNavigation\",\"disposeOnNavigation\",he],usePopover:[0,\"cdkConnectedOverlayUsePopover\",\"usePopover\"],matchWidth:[2,\"cdkConnectedOverlayMatchWidth\",\"matchWidth\",he],_config:[0,\"cdkConnectedOverlay\",\"_config\"]},outputs:{backdropClick:\"backdropClick\",positionChange:\"positionChange\",attach:\"attach\",detach:\"detach\",overlayKeydown:\"overlayKeydown\",overlayOutsideClick:\"overlayOutsideClick\"},exportAs:[\"cdkConnectedOverlay\"],features:[ei]})}return t})(),Kg=(()=>{class t{static \\u0275fac=function(i){return new(i||t)};static \\u0275mod=Xe({type:t});static \\u0275inj=Ze({providers:[Bp],imports:[Fi,_c,rp,rp]})}return t})();function plA(t,e){}var qC=class{viewContainerRef;injector;id;role=\"dialog\";panelClass=\"\";hasBackdrop=!0;backdropClass=\"\";disableClose=!1;closePredicate;width=\"\";height=\"\";minWidth;minHeight;maxWidth;maxHeight;positionStrategy;data=null;direction;ariaDescribedBy=null;ariaLabelledBy=null;ariaLabel=null;ariaModal=!1;autoFocus=\"first-tabbable\";restoreFocus=!0;scrollStrategy;closeOnNavigation=!0;closeOnDestroy=!0;closeOnOverlayDetachments=!0;disableAnimations=!1;providers;container;templateContext};var Rb=(()=>{class t extends PC{_elementRef=h(ge);_focusTrapFactory=h(gh);_config;_interactivityChecker=h(xd);_ngZone=h(Oe);_focusMonitor=h(Ha);_renderer=h(ui);_changeDetectorRef=h(ft);_injector=h(ut);_platform=h(ci);_document=h(Zt);_portalOutlet;_focusTrapped=new $A;_focusTrap=null;_elementFocusedBeforeDialogWasOpened=null;_closeInteractionType=null;_ariaLabelledByQueue=[];_isDestroyed=!1;constructor(){super(),this._config=h(qC,{optional:!0})||new qC,this._config.ariaLabelledBy&&this._ariaLabelledByQueue.push(this._config.ariaLabelledBy)}_addAriaLabelledBy(A){this._ariaLabelledByQueue.push(A),this._changeDetectorRef.markForCheck()}_removeAriaLabelledBy(A){let i=this._ariaLabelledByQueue.indexOf(A);i>-1&&(this._ariaLabelledByQueue.splice(i,1),this._changeDetectorRef.markForCheck())}_contentAttached(){this._initializeFocusTrap(),this._captureInitialFocus()}_captureInitialFocus(){this._trapFocus()}ngOnDestroy(){this._focusTrapped.complete(),this._isDestroyed=!0,this._restoreFocus()}attachComponentPortal(A){this._portalOutlet.hasAttached();let i=this._portalOutlet.attachComponentPortal(A);return this._contentAttached(),i}attachTemplatePortal(A){this._portalOutlet.hasAttached();let i=this._portalOutlet.attachTemplatePortal(A);return this._contentAttached(),i}attachDomPortal=A=>{this._portalOutlet.hasAttached();let i=this._portalOutlet.attachDomPortal(A);return this._contentAttached(),i};_recaptureFocus(){this._containsFocus()||this._trapFocus()}_forceFocus(A,i){this._interactivityChecker.isFocusable(A)||(A.tabIndex=-1,this._ngZone.runOutsideAngular(()=>{let n=()=>{o(),a(),A.removeAttribute(\"tabindex\")},o=this._renderer.listen(A,\"blur\",n),a=this._renderer.listen(A,\"mousedown\",n)})),A.focus(i)}_focusByCssSelector(A,i){let n=this._elementRef.nativeElement.querySelector(A);n&&this._forceFocus(n,i)}_trapFocus(A){this._isDestroyed||Nn(()=>{let i=this._elementRef.nativeElement;switch(this._config.autoFocus){case!1:case\"dialog\":this._containsFocus()||i.focus(A);break;case!0:case\"first-tabbable\":this._focusTrap?.focusInitialElement(A)||this._focusDialogContainer(A);break;case\"first-heading\":this._focusByCssSelector('h1, h2, h3, h4, h5, h6, [role=\"heading\"]',A);break;default:this._focusByCssSelector(this._config.autoFocus,A);break}this._focusTrapped.next()},{injector:this._injector})}_restoreFocus(){let A=this._config.restoreFocus,i=null;if(typeof A==\"string\"?i=this._document.querySelector(A):typeof A==\"boolean\"?i=A?this._elementFocusedBeforeDialogWasOpened:null:A&&(i=A),this._config.restoreFocus&&i&&typeof i.focus==\"function\"){let n=oh(),o=this._elementRef.nativeElement;(!n||n===this._document.body||n===o||o.contains(n))&&(this._focusMonitor?(this._focusMonitor.focusVia(i,this._closeInteractionType),this._closeInteractionType=null):i.focus())}this._focusTrap&&this._focusTrap.destroy()}_focusDialogContainer(A){this._elementRef.nativeElement.focus?.(A)}_containsFocus(){let A=this._elementRef.nativeElement,i=oh();return A===i||A.contains(i)}_initializeFocusTrap(){this._platform.isBrowser&&(this._focusTrap=this._focusTrapFactory.create(this._elementRef.nativeElement),this._document&&(this._elementFocusedBeforeDialogWasOpened=oh()))}static \\u0275fac=function(i){return new(i||t)};static \\u0275cmp=kA({type:t,selectors:[[\"cdk-dialog-container\"]],viewQuery:function(i,n){if(i&1&&ni(Ig,7),i&2){let o;Ce(o=Ie())&&(n._portalOutlet=o.first)}},hostAttrs:[\"tabindex\",\"-1\",1,\"cdk-dialog-container\"],hostVars:6,hostBindings:function(i,n){i&2&&ie(\"id\",n._config.id||null)(\"role\",n._config.role)(\"aria-modal\",n._config.ariaModal)(\"aria-labelledby\",n._config.ariaLabel?null:n._ariaLabelledByQueue[0])(\"aria-label\",n._config.ariaLabel)(\"aria-describedby\",n._config.ariaDescribedBy||null)},features:[Ct],decls:1,vars:0,consts:[[\"cdkPortalOutlet\",\"\"]],template:function(i,n){i&1&&yt(0,plA,0,0,\"ng-template\",0)},dependencies:[Ig],styles:[`.cdk-dialog-container{display:block;width:100%;height:100%;min-height:inherit;max-height:inherit}\n`],encapsulation:2})}return t})(),o4=class{overlayRef;config;componentInstance=null;componentRef=null;containerInstance;disableClose;closed=new $A;backdropClick;keydownEvents;outsidePointerEvents;id;_detachSubscription;constructor(e,A){this.overlayRef=e,this.config=A,this.disableClose=A.disableClose,this.backdropClick=e.backdropClick(),this.keydownEvents=e.keydownEvents(),this.outsidePointerEvents=e.outsidePointerEvents(),this.id=A.id,this.keydownEvents.subscribe(i=>{i.keyCode===27&&!this.disableClose&&!aa(i)&&(i.preventDefault(),this.close(void 0,{focusOrigin:\"keyboard\"}))}),this.backdropClick.subscribe(()=>{!this.disableClose&&this._canClose()?this.close(void 0,{focusOrigin:\"mouse\"}):this.containerInstance._recaptureFocus?.()}),this._detachSubscription=e.detachments().subscribe(()=>{A.closeOnOverlayDetachments!==!1&&this.close()})}close(e,A){if(this._canClose(e)){let i=this.closed;this.containerInstance._closeInteractionType=A?.focusOrigin||\"program\",this._detachSubscription.unsubscribe(),this.overlayRef.dispose(),i.next(e),i.complete(),this.componentInstance=this.containerInstance=null}}updatePosition(){return this.overlayRef.updatePosition(),this}updateSize(e=\"\",A=\"\"){return this.overlayRef.updateSize({width:e,height:A}),this}addPanelClass(e){return this.overlayRef.addPanelClass(e),this}removePanelClass(e){return this.overlayRef.removePanelClass(e),this}_canClose(e){let A=this.config;return!!this.containerInstance&&(!A.closePredicate||A.closePredicate(e,A,this.componentInstance))}},DlA=new wA(\"DialogScrollStrategy\",{providedIn:\"root\",factory:()=>{let t=h(ut);return()=>rB(t)}}),wlA=new wA(\"DialogData\"),ylA=new wA(\"DefaultDialogConfig\");function vlA(t){let e=jA(t),A=new WA;return{valueSignal:e,get value(){return e()},change:A,ngOnDestroy(){A.complete()}}}var Nb=(()=>{class t{_injector=h(ut);_defaultOptions=h(ylA,{optional:!0});_parentDialog=h(t,{optional:!0,skipSelf:!0});_overlayContainer=h(dp);_idGenerator=h(An);_openDialogsAtThisLevel=[];_afterAllClosedAtThisLevel=new $A;_afterOpenedAtThisLevel=new $A;_ariaHiddenElements=new Map;_scrollStrategy=h(DlA);get openDialogs(){return this._parentDialog?this._parentDialog.openDialogs:this._openDialogsAtThisLevel}get afterOpened(){return this._parentDialog?this._parentDialog.afterOpened:this._afterOpenedAtThisLevel}afterAllClosed=fc(()=>this.openDialogs.length?this._getAfterAllClosed():this._getAfterAllClosed().pipe(nn(void 0)));constructor(){}open(A,i){let n=this._defaultOptions||new qC;i=BA(BA({},n),i),i.id=i.id||this._idGenerator.getId(\"cdk-dialog-\"),i.id&&this.getDialogById(i.id);let o=this._getOverlayConfig(i),a=Rl(this._injector,o),r=new o4(a,i),s=this._attachContainer(a,r,i);if(r.containerInstance=s,!this.openDialogs.length){let g=this._overlayContainer.getContainerElement();s._focusTrapped?s._focusTrapped.pipe(qn(1)).subscribe(()=>{this._hideNonDialogContentFromAssistiveTechnology(g)}):this._hideNonDialogContentFromAssistiveTechnology(g)}return this._attachDialogContent(A,r,s,i),this.openDialogs.push(r),r.closed.subscribe(()=>this._removeOpenDialog(r,!0)),this.afterOpened.next(r),r}closeAll(){xb(this.openDialogs,A=>A.close())}getDialogById(A){return this.openDialogs.find(i=>i.id===A)}ngOnDestroy(){xb(this._openDialogsAtThisLevel,A=>{A.config.closeOnDestroy===!1&&this._removeOpenDialog(A,!1)}),xb(this._openDialogsAtThisLevel,A=>A.close()),this._afterAllClosedAtThisLevel.complete(),this._afterOpenedAtThisLevel.complete(),this._openDialogsAtThisLevel=[]}_getOverlayConfig(A){let i=new Sl({positionStrategy:A.positionStrategy||jC().centerHorizontally().centerVertically(),scrollStrategy:A.scrollStrategy||this._scrollStrategy(),panelClass:A.panelClass,hasBackdrop:A.hasBackdrop,direction:A.direction,minWidth:A.minWidth,minHeight:A.minHeight,maxWidth:A.maxWidth,maxHeight:A.maxHeight,width:A.width,height:A.height,disposeOnNavigation:A.closeOnNavigation,disableAnimations:A.disableAnimations});return A.backdropClass&&(i.backdropClass=A.backdropClass),i}_attachContainer(A,i,n){let o=n.injector||n.viewContainerRef?.injector,a=[{provide:qC,useValue:n},{provide:o4,useValue:i},{provide:oB,useValue:A}],r;n.container?typeof n.container==\"function\"?r=n.container:(r=n.container.type,a.push(...n.container.providers(n))):r=Rb;let s=new Cg(r,n.viewContainerRef,ut.create({parent:o||this._injector,providers:a}));return A.attach(s).instance}_attachDialogContent(A,i,n,o){if(A instanceof Fn){let a=this._createInjector(o,i,n,void 0),r={$implicit:o.data,dialogRef:i};o.templateContext&&(r=BA(BA({},r),typeof o.templateContext==\"function\"?o.templateContext():o.templateContext)),n.attachTemplatePortal(new Vr(A,null,r,a))}else{let a=this._createInjector(o,i,n,this._injector),r=n.attachComponentPortal(new Cg(A,o.viewContainerRef,a));i.componentRef=r,i.componentInstance=r.instance}}_createInjector(A,i,n,o){let a=A.injector||A.viewContainerRef?.injector,r=[{provide:wlA,useValue:A.data},{provide:o4,useValue:i}];return A.providers&&(typeof A.providers==\"function\"?r.push(...A.providers(i,A,n)):r.push(...A.providers)),A.direction&&(!a||!a.get(wo,null,{optional:!0}))&&r.push({provide:wo,useValue:vlA(A.direction)}),ut.create({parent:a||o,providers:r})}_removeOpenDialog(A,i){let n=this.openDialogs.indexOf(A);n>-1&&(this.openDialogs.splice(n,1),this.openDialogs.length||(this._ariaHiddenElements.forEach((o,a)=>{o?a.setAttribute(\"aria-hidden\",o):a.removeAttribute(\"aria-hidden\")}),this._ariaHiddenElements.clear(),i&&this._getAfterAllClosed().next()))}_hideNonDialogContentFromAssistiveTechnology(A){if(A.parentElement){let i=A.parentElement.children;for(let n=i.length-1;n>-1;n--){let o=i[n];o!==A&&o.nodeName!==\"SCRIPT\"&&o.nodeName!==\"STYLE\"&&!o.hasAttribute(\"aria-live\")&&!o.hasAttribute(\"popover\")&&(this._ariaHiddenElements.set(o,o.getAttribute(\"aria-hidden\")),o.setAttribute(\"aria-hidden\",\"true\"))}}}_getAfterAllClosed(){let A=this._parentDialog;return A?A._getAfterAllClosed():this._afterAllClosedAtThisLevel}static \\u0275fac=function(i){return new(i||t)};static \\u0275prov=TA({token:t,factory:t.\\u0275fac,providedIn:\"root\"})}return t})();function xb(t,e){let A=t.length;for(;A--;)e(t[A])}var iJ=(()=>{class t{static \\u0275fac=function(i){return new(i||t)};static \\u0275mod=Xe({type:t});static \\u0275inj=Ze({providers:[Nb],imports:[Kg,_c,ch,_c]})}return t})();function blA(t,e){}var hp=class{viewContainerRef;injector;id;role=\"dialog\";panelClass=\"\";hasBackdrop=!0;backdropClass=\"\";disableClose=!1;closePredicate;width=\"\";height=\"\";minWidth;minHeight;maxWidth;maxHeight;position;data=null;direction;ariaDescribedBy=null;ariaLabelledBy=null;ariaLabel=null;ariaModal=!1;autoFocus=\"first-tabbable\";restoreFocus=!0;delayFocusTrap=!0;scrollStrategy;closeOnNavigation=!0;enterAnimationDuration;exitAnimationDuration},Fb=\"mdc-dialog--open\",nJ=\"mdc-dialog--opening\",oJ=\"mdc-dialog--closing\",MlA=150,klA=75,SlA=(()=>{class t extends Rb{_animationStateChanged=new WA;_animationsEnabled=!Oi();_actionSectionCount=0;_hostElement=this._elementRef.nativeElement;_enterAnimationDuration=this._animationsEnabled?rJ(this._config.enterAnimationDuration)??MlA:0;_exitAnimationDuration=this._animationsEnabled?rJ(this._config.exitAnimationDuration)??klA:0;_animationTimer=null;_contentAttached(){super._contentAttached(),this._startOpenAnimation()}_startOpenAnimation(){this._animationStateChanged.emit({state:\"opening\",totalTime:this._enterAnimationDuration}),this._animationsEnabled?(this._hostElement.style.setProperty(aJ,`${this._enterAnimationDuration}ms`),this._requestAnimationFrame(()=>this._hostElement.classList.add(nJ,Fb)),this._waitForAnimationToComplete(this._enterAnimationDuration,this._finishDialogOpen)):(this._hostElement.classList.add(Fb),Promise.resolve().then(()=>this._finishDialogOpen()))}_startExitAnimation(){this._animationStateChanged.emit({state:\"closing\",totalTime:this._exitAnimationDuration}),this._hostElement.classList.remove(Fb),this._animationsEnabled?(this._hostElement.style.setProperty(aJ,`${this._exitAnimationDuration}ms`),this._requestAnimationFrame(()=>this._hostElement.classList.add(oJ)),this._waitForAnimationToComplete(this._exitAnimationDuration,this._finishDialogClose)):Promise.resolve().then(()=>this._finishDialogClose())}_updateActionSectionCount(A){this._actionSectionCount+=A,this._changeDetectorRef.markForCheck()}_finishDialogOpen=()=>{this._clearAnimationClasses(),this._openAnimationDone(this._enterAnimationDuration)};_finishDialogClose=()=>{this._clearAnimationClasses(),this._animationStateChanged.emit({state:\"closed\",totalTime:this._exitAnimationDuration})};_clearAnimationClasses(){this._hostElement.classList.remove(nJ,oJ)}_waitForAnimationToComplete(A,i){this._animationTimer!==null&&clearTimeout(this._animationTimer),this._animationTimer=setTimeout(i,A)}_requestAnimationFrame(A){this._ngZone.runOutsideAngular(()=>{typeof requestAnimationFrame==\"function\"?requestAnimationFrame(A):A()})}_captureInitialFocus(){this._config.delayFocusTrap||this._trapFocus()}_openAnimationDone(A){this._config.delayFocusTrap&&this._trapFocus(),this._animationStateChanged.next({state:\"opened\",totalTime:A})}ngOnDestroy(){super.ngOnDestroy(),this._animationTimer!==null&&clearTimeout(this._animationTimer)}attachComponentPortal(A){let i=super.attachComponentPortal(A);return i.location.nativeElement.classList.add(\"mat-mdc-dialog-component-host\"),i}static \\u0275fac=(()=>{let A;return function(n){return(A||(A=hi(t)))(n||t)}})();static \\u0275cmp=kA({type:t,selectors:[[\"mat-dialog-container\"]],hostAttrs:[\"tabindex\",\"-1\",1,\"mat-mdc-dialog-container\",\"mdc-dialog\"],hostVars:10,hostBindings:function(i,n){i&2&&(Bo(\"id\",n._config.id),ie(\"aria-modal\",n._config.ariaModal)(\"role\",n._config.role)(\"aria-labelledby\",n._config.ariaLabel?null:n._ariaLabelledByQueue[0])(\"aria-label\",n._config.ariaLabel)(\"aria-describedby\",n._config.ariaDescribedBy||null),ae(\"_mat-animation-noopable\",!n._animationsEnabled)(\"mat-mdc-dialog-container-with-actions\",n._actionSectionCount>0))},features:[Ct],decls:3,vars:0,consts:[[1,\"mat-mdc-dialog-inner-container\",\"mdc-dialog__container\"],[1,\"mat-mdc-dialog-surface\",\"mdc-dialog__surface\"],[\"cdkPortalOutlet\",\"\"]],template:function(i,n){i&1&&(m(0,\"div\",0)(1,\"div\",1),yt(2,blA,0,0,\"ng-template\",2),D()())},dependencies:[Ig],styles:[`.mat-mdc-dialog-container{width:100%;height:100%;display:block;box-sizing:border-box;max-height:inherit;min-height:inherit;min-width:inherit;max-width:inherit;outline:0}.cdk-overlay-pane.mat-mdc-dialog-panel{max-width:var(--mat-dialog-container-max-width, 560px);min-width:var(--mat-dialog-container-min-width, 280px)}@media(max-width: 599px){.cdk-overlay-pane.mat-mdc-dialog-panel{max-width:var(--mat-dialog-container-small-max-width, calc(100vw - 32px))}}.mat-mdc-dialog-inner-container{display:flex;flex-direction:row;align-items:center;justify-content:space-around;box-sizing:border-box;height:100%;opacity:0;transition:opacity linear var(--mat-dialog-transition-duration, 0ms);max-height:inherit;min-height:inherit;min-width:inherit;max-width:inherit}.mdc-dialog--closing .mat-mdc-dialog-inner-container{transition:opacity 75ms linear;transform:none}.mdc-dialog--open .mat-mdc-dialog-inner-container{opacity:1}._mat-animation-noopable .mat-mdc-dialog-inner-container{transition:none}.mat-mdc-dialog-surface{display:flex;flex-direction:column;flex-grow:0;flex-shrink:0;box-sizing:border-box;width:100%;height:100%;position:relative;overflow-y:auto;outline:0;transform:scale(0.8);transition:transform var(--mat-dialog-transition-duration, 0ms) cubic-bezier(0, 0, 0.2, 1);max-height:inherit;min-height:inherit;min-width:inherit;max-width:inherit;box-shadow:var(--mat-dialog-container-elevation-shadow, none);border-radius:var(--mat-dialog-container-shape, var(--mat-sys-corner-extra-large, 4px));background-color:var(--mat-dialog-container-color, var(--mat-sys-surface, white))}[dir=rtl] .mat-mdc-dialog-surface{text-align:right}.mdc-dialog--open .mat-mdc-dialog-surface,.mdc-dialog--closing .mat-mdc-dialog-surface{transform:none}._mat-animation-noopable .mat-mdc-dialog-surface{transition:none}.mat-mdc-dialog-surface::before{position:absolute;box-sizing:border-box;width:100%;height:100%;top:0;left:0;border:2px solid rgba(0,0,0,0);border-radius:inherit;content:\"\";pointer-events:none}.mat-mdc-dialog-title{display:block;position:relative;flex-shrink:0;box-sizing:border-box;margin:0 0 1px;padding:var(--mat-dialog-headline-padding, 6px 24px 13px)}.mat-mdc-dialog-title::before{display:inline-block;width:0;height:40px;content:\"\";vertical-align:0}[dir=rtl] .mat-mdc-dialog-title{text-align:right}.mat-mdc-dialog-container .mat-mdc-dialog-title{color:var(--mat-dialog-subhead-color, var(--mat-sys-on-surface, rgba(0, 0, 0, 0.87)));font-family:var(--mat-dialog-subhead-font, var(--mat-sys-headline-small-font, inherit));line-height:var(--mat-dialog-subhead-line-height, var(--mat-sys-headline-small-line-height, 1.5rem));font-size:var(--mat-dialog-subhead-size, var(--mat-sys-headline-small-size, 1rem));font-weight:var(--mat-dialog-subhead-weight, var(--mat-sys-headline-small-weight, 400));letter-spacing:var(--mat-dialog-subhead-tracking, var(--mat-sys-headline-small-tracking, 0.03125em))}.mat-mdc-dialog-content{display:block;flex-grow:1;box-sizing:border-box;margin:0;overflow:auto;max-height:65vh}.mat-mdc-dialog-content>:first-child{margin-top:0}.mat-mdc-dialog-content>:last-child{margin-bottom:0}.mat-mdc-dialog-container .mat-mdc-dialog-content{color:var(--mat-dialog-supporting-text-color, var(--mat-sys-on-surface-variant, rgba(0, 0, 0, 0.6)));font-family:var(--mat-dialog-supporting-text-font, var(--mat-sys-body-medium-font, inherit));line-height:var(--mat-dialog-supporting-text-line-height, var(--mat-sys-body-medium-line-height, 1.5rem));font-size:var(--mat-dialog-supporting-text-size, var(--mat-sys-body-medium-size, 1rem));font-weight:var(--mat-dialog-supporting-text-weight, var(--mat-sys-body-medium-weight, 400));letter-spacing:var(--mat-dialog-supporting-text-tracking, var(--mat-sys-body-medium-tracking, 0.03125em))}.mat-mdc-dialog-container .mat-mdc-dialog-content{padding:var(--mat-dialog-content-padding, 20px 24px)}.mat-mdc-dialog-container-with-actions .mat-mdc-dialog-content{padding:var(--mat-dialog-with-actions-content-padding, 20px 24px 0)}.mat-mdc-dialog-container .mat-mdc-dialog-title+.mat-mdc-dialog-content{padding-top:0}.mat-mdc-dialog-actions{display:flex;position:relative;flex-shrink:0;flex-wrap:wrap;align-items:center;box-sizing:border-box;min-height:52px;margin:0;border-top:1px solid rgba(0,0,0,0);padding:var(--mat-dialog-actions-padding, 16px 24px);justify-content:var(--mat-dialog-actions-alignment, flex-end)}@media(forced-colors: active){.mat-mdc-dialog-actions{border-top-color:CanvasText}}.mat-mdc-dialog-actions.mat-mdc-dialog-actions-align-start,.mat-mdc-dialog-actions[align=start]{justify-content:start}.mat-mdc-dialog-actions.mat-mdc-dialog-actions-align-center,.mat-mdc-dialog-actions[align=center]{justify-content:center}.mat-mdc-dialog-actions.mat-mdc-dialog-actions-align-end,.mat-mdc-dialog-actions[align=end]{justify-content:flex-end}.mat-mdc-dialog-actions .mat-button-base+.mat-button-base,.mat-mdc-dialog-actions .mat-mdc-button-base+.mat-mdc-button-base{margin-left:8px}[dir=rtl] .mat-mdc-dialog-actions .mat-button-base+.mat-button-base,[dir=rtl] .mat-mdc-dialog-actions .mat-mdc-button-base+.mat-mdc-button-base{margin-left:0;margin-right:8px}.mat-mdc-dialog-component-host{display:contents}\n`],encapsulation:2})}return t})(),aJ=\"--mat-dialog-transition-duration\";function rJ(t){return t==null?null:typeof t==\"number\"?t:t.endsWith(\"ms\")?Rs(t.substring(0,t.length-2)):t.endsWith(\"s\")?Rs(t.substring(0,t.length-1))*1e3:t===\"0\"?0:null}var Ep=(function(t){return t[t.OPEN=0]=\"OPEN\",t[t.CLOSING=1]=\"CLOSING\",t[t.CLOSED=2]=\"CLOSED\",t})(Ep||{}),Fo=class{_ref;_config;_containerInstance;componentInstance;componentRef=null;disableClose;id;_afterOpened=new El(1);_beforeClosed=new El(1);_result;_closeFallbackTimeout;_state=Ep.OPEN;_closeInteractionType;constructor(e,A,i){this._ref=e,this._config=A,this._containerInstance=i,this.disableClose=A.disableClose,this.id=e.id,e.addPanelClass(\"mat-mdc-dialog-panel\"),i._animationStateChanged.pipe(We(n=>n.state===\"opened\"),qn(1)).subscribe(()=>{this._afterOpened.next(),this._afterOpened.complete()}),i._animationStateChanged.pipe(We(n=>n.state===\"closed\"),qn(1)).subscribe(()=>{clearTimeout(this._closeFallbackTimeout),this._finishDialogClose()}),e.overlayRef.detachments().subscribe(()=>{this._beforeClosed.next(this._result),this._beforeClosed.complete(),this._finishDialogClose()}),Qi(this.backdropClick(),this.keydownEvents().pipe(We(n=>n.keyCode===27&&!this.disableClose&&!aa(n)))).subscribe(n=>{this.disableClose||(n.preventDefault(),sJ(this,n.type===\"keydown\"?\"keyboard\":\"mouse\"))})}close(e){let A=this._config.closePredicate;A&&!A(e,this._config,this.componentInstance)||(this._result=e,this._containerInstance._animationStateChanged.pipe(We(i=>i.state===\"closing\"),qn(1)).subscribe(i=>{this._beforeClosed.next(e),this._beforeClosed.complete(),this._ref.overlayRef.detachBackdrop(),this._closeFallbackTimeout=setTimeout(()=>this._finishDialogClose(),i.totalTime+100)}),this._state=Ep.CLOSING,this._containerInstance._startExitAnimation())}afterOpened(){return this._afterOpened}afterClosed(){return this._ref.closed}beforeClosed(){return this._beforeClosed}backdropClick(){return this._ref.backdropClick}keydownEvents(){return this._ref.keydownEvents}updatePosition(e){let A=this._ref.config.positionStrategy;return e&&(e.left||e.right)?e.left?A.left(e.left):A.right(e.right):A.centerHorizontally(),e&&(e.top||e.bottom)?e.top?A.top(e.top):A.bottom(e.bottom):A.centerVertically(),this._ref.updatePosition(),this}updateSize(e=\"\",A=\"\"){return this._ref.updateSize(e,A),this}addPanelClass(e){return this._ref.addPanelClass(e),this}removePanelClass(e){return this._ref.removePanelClass(e),this}getState(){return this._state}_finishDialogClose(){this._state=Ep.CLOSED,this._ref.close(this._result,{focusOrigin:this._closeInteractionType}),this.componentInstance=null}};function sJ(t,e,A){return t._closeInteractionType=e,t.close(A)}var da=new wA(\"MatMdcDialogData\"),xlA=new wA(\"mat-mdc-dialog-default-options\"),RlA=new wA(\"mat-mdc-dialog-scroll-strategy\",{providedIn:\"root\",factory:()=>{let t=h(ut);return()=>rB(t)}}),Qs=(()=>{class t{_defaultOptions=h(xlA,{optional:!0});_scrollStrategy=h(RlA);_parentDialog=h(t,{optional:!0,skipSelf:!0});_idGenerator=h(An);_injector=h(ut);_dialog=h(Nb);_animationsDisabled=Oi();_openDialogsAtThisLevel=[];_afterAllClosedAtThisLevel=new $A;_afterOpenedAtThisLevel=new $A;dialogConfigClass=hp;_dialogRefConstructor;_dialogContainerType;_dialogDataToken;get openDialogs(){return this._parentDialog?this._parentDialog.openDialogs:this._openDialogsAtThisLevel}get afterOpened(){return this._parentDialog?this._parentDialog.afterOpened:this._afterOpenedAtThisLevel}_getAfterAllClosed(){let A=this._parentDialog;return A?A._getAfterAllClosed():this._afterAllClosedAtThisLevel}afterAllClosed=fc(()=>this.openDialogs.length?this._getAfterAllClosed():this._getAfterAllClosed().pipe(nn(void 0)));constructor(){this._dialogRefConstructor=Fo,this._dialogContainerType=SlA,this._dialogDataToken=da}open(A,i){let n;i=BA(BA({},this._defaultOptions||new hp),i),i.id=i.id||this._idGenerator.getId(\"mat-mdc-dialog-\"),i.scrollStrategy=i.scrollStrategy||this._scrollStrategy();let o=this._dialog.open(A,Ve(BA({},i),{positionStrategy:jC(this._injector).centerHorizontally().centerVertically(),disableClose:!0,closePredicate:void 0,closeOnDestroy:!1,closeOnOverlayDetachments:!1,disableAnimations:this._animationsDisabled||i.enterAnimationDuration?.toLocaleString()===\"0\"||i.exitAnimationDuration?.toString()===\"0\",container:{type:this._dialogContainerType,providers:()=>[{provide:this.dialogConfigClass,useValue:i},{provide:qC,useValue:i}]},templateContext:()=>({dialogRef:n}),providers:(a,r,s)=>(n=new this._dialogRefConstructor(a,i,s),n.updatePosition(i?.position),[{provide:this._dialogContainerType,useValue:s},{provide:this._dialogDataToken,useValue:r.data},{provide:this._dialogRefConstructor,useValue:n}])}));return n.componentRef=o.componentRef,n.componentInstance=o.componentInstance,this.openDialogs.push(n),this.afterOpened.next(n),n.afterClosed().subscribe(()=>{let a=this.openDialogs.indexOf(n);a>-1&&(this.openDialogs.splice(a,1),this.openDialogs.length||this._getAfterAllClosed().next())}),n}closeAll(){this._closeDialogs(this.openDialogs)}getDialogById(A){return this.openDialogs.find(i=>i.id===A)}ngOnDestroy(){this._closeDialogs(this._openDialogsAtThisLevel),this._afterAllClosedAtThisLevel.complete(),this._afterOpenedAtThisLevel.complete()}_closeDialogs(A){let i=A.length;for(;i--;)A[i].close()}static \\u0275fac=function(i){return new(i||t)};static \\u0275prov=TA({token:t,factory:t.\\u0275fac,providedIn:\"root\"})}return t})(),VC=(()=>{class t{dialogRef=h(Fo,{optional:!0});_elementRef=h(ge);_dialog=h(Qs);ariaLabel;type=\"button\";dialogResult;_matDialogClose;constructor(){}ngOnInit(){this.dialogRef||(this.dialogRef=lJ(this._elementRef,this._dialog.openDialogs))}ngOnChanges(A){let i=A._matDialogClose||A._matDialogCloseResult;i&&(this.dialogResult=i.currentValue)}_onButtonClick(A){sJ(this.dialogRef,A.screenX===0&&A.screenY===0?\"keyboard\":\"mouse\",this.dialogResult)}static \\u0275fac=function(i){return new(i||t)};static \\u0275dir=OA({type:t,selectors:[[\"\",\"mat-dialog-close\",\"\"],[\"\",\"matDialogClose\",\"\"]],hostVars:2,hostBindings:function(i,n){i&1&&$(\"click\",function(a){return n._onButtonClick(a)}),i&2&&ie(\"aria-label\",n.ariaLabel||null)(\"type\",n.type)},inputs:{ariaLabel:[0,\"aria-label\",\"ariaLabel\"],type:\"type\",dialogResult:[0,\"mat-dialog-close\",\"dialogResult\"],_matDialogClose:[0,\"matDialogClose\",\"_matDialogClose\"]},exportAs:[\"matDialogClose\"],features:[ei]})}return t})(),gJ=(()=>{class t{_dialogRef=h(Fo,{optional:!0});_elementRef=h(ge);_dialog=h(Qs);constructor(){}ngOnInit(){this._dialogRef||(this._dialogRef=lJ(this._elementRef,this._dialog.openDialogs)),this._dialogRef&&Promise.resolve().then(()=>{this._onAdd()})}ngOnDestroy(){this._dialogRef?._containerInstance&&Promise.resolve().then(()=>{this._onRemove()})}static \\u0275fac=function(i){return new(i||t)};static \\u0275dir=OA({type:t})}return t})(),ya=(()=>{class t extends gJ{id=h(An).getId(\"mat-mdc-dialog-title-\");_onAdd(){this._dialogRef._containerInstance?._addAriaLabelledBy?.(this.id)}_onRemove(){this._dialogRef?._containerInstance?._removeAriaLabelledBy?.(this.id)}static \\u0275fac=(()=>{let A;return function(n){return(A||(A=hi(t)))(n||t)}})();static \\u0275dir=OA({type:t,selectors:[[\"\",\"mat-dialog-title\",\"\"],[\"\",\"matDialogTitle\",\"\"]],hostAttrs:[1,\"mat-mdc-dialog-title\",\"mdc-dialog__title\"],hostVars:1,hostBindings:function(i,n){i&2&&Bo(\"id\",n.id)},inputs:{id:\"id\"},exportAs:[\"matDialogTitle\"],features:[Ct]})}return t})(),gr=(()=>{class t{static \\u0275fac=function(i){return new(i||t)};static \\u0275dir=OA({type:t,selectors:[[\"\",\"mat-dialog-content\",\"\"],[\"mat-dialog-content\"],[\"\",\"matDialogContent\",\"\"]],hostAttrs:[1,\"mat-mdc-dialog-content\",\"mdc-dialog__content\"],features:[ff([x0])]})}return t})(),Ta=(()=>{class t extends gJ{align;_onAdd(){this._dialogRef._containerInstance?._updateActionSectionCount?.(1)}_onRemove(){this._dialogRef._containerInstance?._updateActionSectionCount?.(-1)}static \\u0275fac=(()=>{let A;return function(n){return(A||(A=hi(t)))(n||t)}})();static \\u0275dir=OA({type:t,selectors:[[\"\",\"mat-dialog-actions\",\"\"],[\"mat-dialog-actions\"],[\"\",\"matDialogActions\",\"\"]],hostAttrs:[1,\"mat-mdc-dialog-actions\",\"mdc-dialog__actions\"],hostVars:6,hostBindings:function(i,n){i&2&&ae(\"mat-mdc-dialog-actions-align-start\",n.align===\"start\")(\"mat-mdc-dialog-actions-align-center\",n.align===\"center\")(\"mat-mdc-dialog-actions-align-end\",n.align===\"end\")},inputs:{align:\"align\"},features:[Ct]})}return t})();function lJ(t,e){let A=t.nativeElement.parentElement;for(;A&&!A.classList.contains(\"mat-mdc-dialog-container\");)A=A.parentElement;return A?e.find(i=>i.id===A.id):null}var cJ=(()=>{class t{static \\u0275fac=function(i){return new(i||t)};static \\u0275mod=Xe({type:t});static \\u0275inj=Ze({providers:[Qs],imports:[iJ,Kg,_c,Fi]})}return t})();var up=(()=>{class t{get vertical(){return this._vertical}set vertical(A){this._vertical=sr(A)}_vertical=!1;get inset(){return this._inset}set inset(A){this._inset=sr(A)}_inset=!1;static \\u0275fac=function(i){return new(i||t)};static \\u0275cmp=kA({type:t,selectors:[[\"mat-divider\"]],hostAttrs:[\"role\",\"separator\",1,\"mat-divider\"],hostVars:7,hostBindings:function(i,n){i&2&&(ie(\"aria-orientation\",n.vertical?\"vertical\":\"horizontal\"),ae(\"mat-divider-vertical\",n.vertical)(\"mat-divider-horizontal\",!n.vertical)(\"mat-divider-inset\",n.inset))},inputs:{vertical:\"vertical\",inset:\"inset\"},decls:0,vars:0,template:function(i,n){},styles:[`.mat-divider{display:block;margin:0;border-top-style:solid;border-top-color:var(--mat-divider-color, var(--mat-sys-outline-variant));border-top-width:var(--mat-divider-width, 1px)}.mat-divider.mat-divider-vertical{border-top:0;border-right-style:solid;border-right-color:var(--mat-divider-color, var(--mat-sys-outline-variant));border-right-width:var(--mat-divider-width, 1px)}.mat-divider.mat-divider-inset{margin-left:80px}[dir=rtl] .mat-divider.mat-divider-inset{margin-left:auto;margin-right:80px}\n`],encapsulation:2,changeDetection:0})}return t})(),CJ=(()=>{class t{static \\u0275fac=function(i){return new(i||t)};static \\u0275mod=Xe({type:t});static \\u0275inj=Ze({imports:[Fi]})}return t})();function IJ(t){return Error(`Unable to find icon with the name \"${t}\"`)}function FlA(){return Error(\"Could not find HttpClient for use with Angular Material icons. Please add provideHttpClient() to your providers.\")}function dJ(t){return Error(`The URL provided to MatIconRegistry was not trusted as a resource URL via Angular's DomSanitizer. Attempted URL was \"${t}\".`)}function BJ(t){return Error(`The literal provided to MatIconRegistry was not trusted as safe HTML by Angular's DomSanitizer. Attempted literal was \"${t}\".`)}var F0=class{url;svgText;options;svgElement=null;constructor(e,A,i){this.url=e,this.svgText=A,this.options=i}},EJ=(()=>{class t{_httpClient;_sanitizer;_errorHandler;_document;_svgIconConfigs=new Map;_iconSetConfigs=new Map;_cachedIconsByUrl=new Map;_inProgressUrlFetches=new Map;_fontCssClassesByAlias=new Map;_resolvers=[];_defaultFontSetClass=[\"material-icons\",\"mat-ligature-font\"];constructor(A,i,n,o){this._httpClient=A,this._sanitizer=i,this._errorHandler=o,this._document=n}addSvgIcon(A,i,n){return this.addSvgIconInNamespace(\"\",A,i,n)}addSvgIconLiteral(A,i,n){return this.addSvgIconLiteralInNamespace(\"\",A,i,n)}addSvgIconInNamespace(A,i,n,o){return this._addSvgIconConfig(A,i,new F0(n,null,o))}addSvgIconResolver(A){return this._resolvers.push(A),this}addSvgIconLiteralInNamespace(A,i,n,o){let a=this._sanitizer.sanitize(ul.HTML,n);if(!a)throw BJ(n);let r=NI(a);return this._addSvgIconConfig(A,i,new F0(\"\",r,o))}addSvgIconSet(A,i){return this.addSvgIconSetInNamespace(\"\",A,i)}addSvgIconSetLiteral(A,i){return this.addSvgIconSetLiteralInNamespace(\"\",A,i)}addSvgIconSetInNamespace(A,i,n){return this._addSvgIconSetConfig(A,new F0(i,null,n))}addSvgIconSetLiteralInNamespace(A,i,n){let o=this._sanitizer.sanitize(ul.HTML,i);if(!o)throw BJ(i);let a=NI(o);return this._addSvgIconSetConfig(A,new F0(\"\",a,n))}registerFontClassAlias(A,i=A){return this._fontCssClassesByAlias.set(A,i),this}classNameForFontAlias(A){return this._fontCssClassesByAlias.get(A)||A}setDefaultFontSetClass(...A){return this._defaultFontSetClass=A,this}getDefaultFontSetClass(){return this._defaultFontSetClass}getSvgIconFromUrl(A){let i=this._sanitizer.sanitize(ul.RESOURCE_URL,A);if(!i)throw dJ(A);let n=this._cachedIconsByUrl.get(i);return n?oe(fp(n)):this._loadSvgIconFromConfig(new F0(A,null)).pipe(Wt(o=>this._cachedIconsByUrl.set(i,o)),fe(o=>fp(o)))}getNamedSvgIcon(A,i=\"\"){let n=QJ(i,A),o=this._svgIconConfigs.get(n);if(o)return this._getSvgFromConfig(o);if(o=this._getIconConfigFromResolvers(i,A),o)return this._svgIconConfigs.set(n,o),this._getSvgFromConfig(o);let a=this._iconSetConfigs.get(i);return a?this._getSvgFromIconSetConfigs(A,a):gf(IJ(n))}ngOnDestroy(){this._resolvers=[],this._svgIconConfigs.clear(),this._iconSetConfigs.clear(),this._cachedIconsByUrl.clear()}_getSvgFromConfig(A){return A.svgText?oe(fp(this._svgElementFromConfig(A))):this._loadSvgIconFromConfig(A).pipe(fe(i=>fp(i)))}_getSvgFromIconSetConfigs(A,i){let n=this._extractIconWithNameFromAnySet(A,i);if(n)return oe(n);let o=i.filter(a=>!a.svgText).map(a=>this._loadSvgIconSetFromConfig(a).pipe(Ho(r=>{let g=`Loading icon set URL: ${this._sanitizer.sanitize(ul.RESOURCE_URL,a.url)} failed: ${r.message}`;return this._errorHandler.handleError(new Error(g)),oe(null)})));return cf(o).pipe(fe(()=>{let a=this._extractIconWithNameFromAnySet(A,i);if(!a)throw IJ(A);return a}))}_extractIconWithNameFromAnySet(A,i){for(let n=i.length-1;n>=0;n--){let o=i[n];if(o.svgText&&o.svgText.toString().indexOf(A)>-1){let a=this._svgElementFromConfig(o),r=this._extractSvgIconFromSet(a,A,o.options);if(r)return r}}return null}_loadSvgIconFromConfig(A){return this._fetchIcon(A).pipe(Wt(i=>A.svgText=i),fe(()=>this._svgElementFromConfig(A)))}_loadSvgIconSetFromConfig(A){return A.svgText?oe(null):this._fetchIcon(A).pipe(Wt(i=>A.svgText=i))}_extractSvgIconFromSet(A,i,n){let o=A.querySelector(`[id=\"${i}\"]`);if(!o)return null;let a=o.cloneNode(!0);if(a.removeAttribute(\"id\"),a.nodeName.toLowerCase()===\"svg\")return this._setSvgAttributes(a,n);if(a.nodeName.toLowerCase()===\"symbol\")return this._setSvgAttributes(this._toSvgElement(a),n);let r=this._svgElementFromString(NI(\"<svg></svg>\"));return r.appendChild(a),this._setSvgAttributes(r,n)}_svgElementFromString(A){let i=this._document.createElement(\"DIV\");i.innerHTML=A;let n=i.querySelector(\"svg\");if(!n)throw Error(\"<svg> tag not found\");return n}_toSvgElement(A){let i=this._svgElementFromString(NI(\"<svg></svg>\")),n=A.attributes;for(let o=0;o<n.length;o++){let{name:a,value:r}=n[o];a!==\"id\"&&i.setAttribute(a,r)}for(let o=0;o<A.childNodes.length;o++)A.childNodes[o].nodeType===this._document.ELEMENT_NODE&&i.appendChild(A.childNodes[o].cloneNode(!0));return i}_setSvgAttributes(A,i){return A.setAttribute(\"fit\",\"\"),A.setAttribute(\"height\",\"100%\"),A.setAttribute(\"width\",\"100%\"),A.setAttribute(\"preserveAspectRatio\",\"xMidYMid meet\"),A.setAttribute(\"focusable\",\"false\"),i&&i.viewBox&&A.setAttribute(\"viewBox\",i.viewBox),A}_fetchIcon(A){let{url:i,options:n}=A,o=n?.withCredentials??!1;if(!this._httpClient)throw FlA();if(i==null)throw Error(`Cannot fetch icon from URL \"${i}\".`);let a=this._sanitizer.sanitize(ul.RESOURCE_URL,i);if(!a)throw dJ(i);let r=this._inProgressUrlFetches.get(a);if(r)return r;let s=this._httpClient.get(a,{responseType:\"text\",withCredentials:o}).pipe(fe(g=>NI(g)),If(()=>this._inProgressUrlFetches.delete(a)),SC());return this._inProgressUrlFetches.set(a,s),s}_addSvgIconConfig(A,i,n){return this._svgIconConfigs.set(QJ(A,i),n),this}_addSvgIconSetConfig(A,i){let n=this._iconSetConfigs.get(A);return n?n.push(i):this._iconSetConfigs.set(A,[i]),this}_svgElementFromConfig(A){if(!A.svgElement){let i=this._svgElementFromString(A.svgText);this._setSvgAttributes(i,A.options),A.svgElement=i}return A.svgElement}_getIconConfigFromResolvers(A,i){for(let n=0;n<this._resolvers.length;n++){let o=this._resolvers[n](i,A);if(o)return LlA(o)?new F0(o.url,null,o.options):new F0(o,null)}}static \\u0275fac=function(i){return new(i||t)(Do(ks,8),Do(LC),Do(Zt,8),Do(df))};static \\u0275prov=TA({token:t,factory:t.\\u0275fac,providedIn:\"root\"})}return t})();function fp(t){return t.cloneNode(!0)}function QJ(t,e){return t+\":\"+e}function LlA(t){return!!(t.url&&t.options)}var _lA=[\"*\"],GlA=new wA(\"MAT_ICON_DEFAULT_OPTIONS\"),KlA=new wA(\"mat-icon-location\",{providedIn:\"root\",factory:()=>{let t=h(Zt),e=t?t.location:null;return{getPathname:()=>e?e.pathname+e.search:\"\"}}}),hJ=[\"clip-path\",\"color-profile\",\"src\",\"cursor\",\"fill\",\"filter\",\"marker\",\"marker-start\",\"marker-mid\",\"marker-end\",\"mask\",\"stroke\"],UlA=hJ.map(t=>`[${t}]`).join(\", \"),JlA=/^url\\(['\"]?#(.*?)['\"]?\\)$/,In=(()=>{class t{_elementRef=h(ge);_iconRegistry=h(EJ);_location=h(KlA);_errorHandler=h(df);_defaultColor;get color(){return this._color||this._defaultColor}set color(A){this._color=A}_color;inline=!1;get svgIcon(){return this._svgIcon}set svgIcon(A){A!==this._svgIcon&&(A?this._updateSvgIcon(A):this._svgIcon&&this._clearSvgElement(),this._svgIcon=A)}_svgIcon;get fontSet(){return this._fontSet}set fontSet(A){let i=this._cleanupFontValue(A);i!==this._fontSet&&(this._fontSet=i,this._updateFontIconClasses())}_fontSet;get fontIcon(){return this._fontIcon}set fontIcon(A){let i=this._cleanupFontValue(A);i!==this._fontIcon&&(this._fontIcon=i,this._updateFontIconClasses())}_fontIcon;_previousFontSetClass=[];_previousFontIconClass;_svgName=null;_svgNamespace=null;_previousPath;_elementsWithExternalReferences;_currentIconFetch=Rn.EMPTY;constructor(){let A=h(new bs(\"aria-hidden\"),{optional:!0}),i=h(GlA,{optional:!0});i&&(i.color&&(this.color=this._defaultColor=i.color),i.fontSet&&(this.fontSet=i.fontSet)),A||this._elementRef.nativeElement.setAttribute(\"aria-hidden\",\"true\")}_splitIconName(A){if(!A)return[\"\",\"\"];let i=A.split(\":\");switch(i.length){case 1:return[\"\",i[0]];case 2:return i;default:throw Error(`Invalid icon name: \"${A}\"`)}}ngOnInit(){this._updateFontIconClasses()}ngAfterViewChecked(){let A=this._elementsWithExternalReferences;if(A&&A.size){let i=this._location.getPathname();i!==this._previousPath&&(this._previousPath=i,this._prependPathToReferences(i))}}ngOnDestroy(){this._currentIconFetch.unsubscribe(),this._elementsWithExternalReferences&&this._elementsWithExternalReferences.clear()}_usingFontIcon(){return!this.svgIcon}_setSvgElement(A){this._clearSvgElement();let i=this._location.getPathname();this._previousPath=i,this._cacheChildrenWithExternalReferences(A),this._prependPathToReferences(i),this._elementRef.nativeElement.appendChild(A)}_clearSvgElement(){let A=this._elementRef.nativeElement,i=A.childNodes.length;for(this._elementsWithExternalReferences&&this._elementsWithExternalReferences.clear();i--;){let n=A.childNodes[i];(n.nodeType!==1||n.nodeName.toLowerCase()===\"svg\")&&n.remove()}}_updateFontIconClasses(){if(!this._usingFontIcon())return;let A=this._elementRef.nativeElement,i=(this.fontSet?this._iconRegistry.classNameForFontAlias(this.fontSet).split(/ +/):this._iconRegistry.getDefaultFontSetClass()).filter(n=>n.length>0);this._previousFontSetClass.forEach(n=>A.classList.remove(n)),i.forEach(n=>A.classList.add(n)),this._previousFontSetClass=i,this.fontIcon!==this._previousFontIconClass&&!i.includes(\"mat-ligature-font\")&&(this._previousFontIconClass&&A.classList.remove(this._previousFontIconClass),this.fontIcon&&A.classList.add(this.fontIcon),this._previousFontIconClass=this.fontIcon)}_cleanupFontValue(A){return typeof A==\"string\"?A.trim().split(\" \")[0]:A}_prependPathToReferences(A){let i=this._elementsWithExternalReferences;i&&i.forEach((n,o)=>{n.forEach(a=>{o.setAttribute(a.name,`url('${A}#${a.value}')`)})})}_cacheChildrenWithExternalReferences(A){let i=A.querySelectorAll(UlA),n=this._elementsWithExternalReferences=this._elementsWithExternalReferences||new Map;for(let o=0;o<i.length;o++)hJ.forEach(a=>{let r=i[o],s=r.getAttribute(a),g=s?s.match(JlA):null;if(g){let l=n.get(r);l||(l=[],n.set(r,l)),l.push({name:a,value:g[1]})}})}_updateSvgIcon(A){if(this._svgNamespace=null,this._svgName=null,this._currentIconFetch.unsubscribe(),A){let[i,n]=this._splitIconName(A);i&&(this._svgNamespace=i),n&&(this._svgName=n),this._currentIconFetch=this._iconRegistry.getNamedSvgIcon(n,i).pipe(qn(1)).subscribe(o=>this._setSvgElement(o),o=>{let a=`Error retrieving icon ${i}:${n}! ${o.message}`;this._errorHandler.handleError(new Error(a))})}}static \\u0275fac=function(i){return new(i||t)};static \\u0275cmp=kA({type:t,selectors:[[\"mat-icon\"]],hostAttrs:[\"role\",\"img\",1,\"mat-icon\",\"notranslate\"],hostVars:10,hostBindings:function(i,n){i&2&&(ie(\"data-mat-icon-type\",n._usingFontIcon()?\"font\":\"svg\")(\"data-mat-icon-name\",n._svgName||n.fontIcon)(\"data-mat-icon-namespace\",n._svgNamespace||n.fontSet)(\"fontIcon\",n._usingFontIcon()?n.fontIcon:null),Qo(n.color?\"mat-\"+n.color:\"\"),ae(\"mat-icon-inline\",n.inline)(\"mat-icon-no-color\",n.color!==\"primary\"&&n.color!==\"accent\"&&n.color!==\"warn\"))},inputs:{color:\"color\",inline:[2,\"inline\",\"inline\",he],svgIcon:\"svgIcon\",fontSet:\"fontSet\",fontIcon:\"fontIcon\"},exportAs:[\"matIcon\"],ngContentSelectors:_lA,decls:1,vars:0,template:function(i,n){i&1&&(Yt(),He(0))},styles:[`mat-icon,mat-icon.mat-primary,mat-icon.mat-accent,mat-icon.mat-warn{color:var(--mat-icon-color, inherit)}.mat-icon{-webkit-user-select:none;user-select:none;background-repeat:no-repeat;display:inline-block;fill:currentColor;height:24px;width:24px;overflow:hidden}.mat-icon.mat-icon-inline{font-size:inherit;height:inherit;line-height:inherit;width:inherit}.mat-icon.mat-ligature-font[fontIcon]::before{content:attr(fontIcon)}[dir=rtl] .mat-icon-rtl-mirror{transform:scale(-1, 1)}.mat-form-field:not(.mat-form-field-appearance-legacy) .mat-form-field-prefix .mat-icon,.mat-form-field:not(.mat-form-field-appearance-legacy) .mat-form-field-suffix .mat-icon{display:block}.mat-form-field:not(.mat-form-field-appearance-legacy) .mat-form-field-prefix .mat-icon-button .mat-icon,.mat-form-field:not(.mat-form-field-appearance-legacy) .mat-form-field-suffix .mat-icon-button .mat-icon{margin:auto}\n`],encapsulation:2,changeDetection:0})}return t})(),Ug=(()=>{class t{static \\u0275fac=function(i){return new(i||t)};static \\u0275mod=Xe({type:t});static \\u0275inj=Ze({imports:[Fi]})}return t})();var uJ=(()=>{class t{_animationsDisabled=Oi();state=\"unchecked\";disabled=!1;appearance=\"full\";constructor(){}static \\u0275fac=function(i){return new(i||t)};static \\u0275cmp=kA({type:t,selectors:[[\"mat-pseudo-checkbox\"]],hostAttrs:[1,\"mat-pseudo-checkbox\"],hostVars:12,hostBindings:function(i,n){i&2&&ae(\"mat-pseudo-checkbox-indeterminate\",n.state===\"indeterminate\")(\"mat-pseudo-checkbox-checked\",n.state===\"checked\")(\"mat-pseudo-checkbox-disabled\",n.disabled)(\"mat-pseudo-checkbox-minimal\",n.appearance===\"minimal\")(\"mat-pseudo-checkbox-full\",n.appearance===\"full\")(\"_mat-animation-noopable\",n._animationsDisabled)},inputs:{state:\"state\",disabled:\"disabled\",appearance:\"appearance\"},decls:0,vars:0,template:function(i,n){},styles:[`.mat-pseudo-checkbox{border-radius:2px;cursor:pointer;display:inline-block;vertical-align:middle;box-sizing:border-box;position:relative;flex-shrink:0;transition:border-color 90ms cubic-bezier(0, 0, 0.2, 0.1),background-color 90ms cubic-bezier(0, 0, 0.2, 0.1)}.mat-pseudo-checkbox::after{position:absolute;opacity:0;content:\"\";border-bottom:2px solid currentColor;transition:opacity 90ms cubic-bezier(0, 0, 0.2, 0.1)}.mat-pseudo-checkbox._mat-animation-noopable{transition:none !important;animation:none !important}.mat-pseudo-checkbox._mat-animation-noopable::after{transition:none}.mat-pseudo-checkbox-disabled{cursor:default}.mat-pseudo-checkbox-indeterminate::after{left:1px;opacity:1;border-radius:2px}.mat-pseudo-checkbox-checked::after{left:1px;border-left:2px solid currentColor;transform:rotate(-45deg);opacity:1;box-sizing:content-box}.mat-pseudo-checkbox-minimal.mat-pseudo-checkbox-checked::after,.mat-pseudo-checkbox-minimal.mat-pseudo-checkbox-indeterminate::after{color:var(--mat-pseudo-checkbox-minimal-selected-checkmark-color, var(--mat-sys-primary))}.mat-pseudo-checkbox-minimal.mat-pseudo-checkbox-checked.mat-pseudo-checkbox-disabled::after,.mat-pseudo-checkbox-minimal.mat-pseudo-checkbox-indeterminate.mat-pseudo-checkbox-disabled::after{color:var(--mat-pseudo-checkbox-minimal-disabled-selected-checkmark-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-pseudo-checkbox-full{border-color:var(--mat-pseudo-checkbox-full-unselected-icon-color, var(--mat-sys-on-surface-variant));border-width:2px;border-style:solid}.mat-pseudo-checkbox-full.mat-pseudo-checkbox-disabled{border-color:var(--mat-pseudo-checkbox-full-disabled-unselected-icon-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-pseudo-checkbox-full.mat-pseudo-checkbox-checked,.mat-pseudo-checkbox-full.mat-pseudo-checkbox-indeterminate{background-color:var(--mat-pseudo-checkbox-full-selected-icon-color, var(--mat-sys-primary));border-color:rgba(0,0,0,0)}.mat-pseudo-checkbox-full.mat-pseudo-checkbox-checked::after,.mat-pseudo-checkbox-full.mat-pseudo-checkbox-indeterminate::after{color:var(--mat-pseudo-checkbox-full-selected-checkmark-color, var(--mat-sys-on-primary))}.mat-pseudo-checkbox-full.mat-pseudo-checkbox-checked.mat-pseudo-checkbox-disabled,.mat-pseudo-checkbox-full.mat-pseudo-checkbox-indeterminate.mat-pseudo-checkbox-disabled{background-color:var(--mat-pseudo-checkbox-full-disabled-selected-icon-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-pseudo-checkbox-full.mat-pseudo-checkbox-checked.mat-pseudo-checkbox-disabled::after,.mat-pseudo-checkbox-full.mat-pseudo-checkbox-indeterminate.mat-pseudo-checkbox-disabled::after{color:var(--mat-pseudo-checkbox-full-disabled-selected-checkmark-color, var(--mat-sys-surface))}.mat-pseudo-checkbox{width:18px;height:18px}.mat-pseudo-checkbox-minimal.mat-pseudo-checkbox-checked::after{width:14px;height:6px;transform-origin:center;top:-4.2426406871px;left:0;bottom:0;right:0;margin:auto}.mat-pseudo-checkbox-minimal.mat-pseudo-checkbox-indeterminate::after{top:8px;width:16px}.mat-pseudo-checkbox-full.mat-pseudo-checkbox-checked::after{width:10px;height:4px;transform-origin:center;top:-2.8284271247px;left:0;bottom:0;right:0;margin:auto}.mat-pseudo-checkbox-full.mat-pseudo-checkbox-indeterminate::after{top:6px;width:12px}\n`],encapsulation:2,changeDetection:0})}return t})();var YlA=[\"text\"],HlA=[[[\"mat-icon\"]],\"*\"],TlA=[\"mat-icon\",\"*\"];function OlA(t,e){if(t&1&&GA(0,\"mat-pseudo-checkbox\",1),t&2){let A=y();X(\"disabled\",A.disabled)(\"state\",A.selected?\"checked\":\"unchecked\")}}function zlA(t,e){if(t&1&&GA(0,\"mat-pseudo-checkbox\",3),t&2){let A=y();X(\"disabled\",A.disabled)}}function PlA(t,e){if(t&1&&(m(0,\"span\",4),K(1),D()),t&2){let A=y();p(),Fe(\"(\",A.group.label,\")\")}}var Dp=new wA(\"MAT_OPTION_PARENT_COMPONENT\"),wp=new wA(\"MatOptgroup\");var pp=class{source;isUserInput;constructor(e,A=!1){this.source=e,this.isUserInput=A}},Mr=(()=>{class t{_element=h(ge);_changeDetectorRef=h(ft);_parent=h(Dp,{optional:!0});group=h(wp,{optional:!0});_signalDisableRipple=!1;_selected=!1;_active=!1;_mostRecentViewValue=\"\";get multiple(){return this._parent&&this._parent.multiple}get selected(){return this._selected}value;id=h(An).getId(\"mat-option-\");get disabled(){return this.group&&this.group.disabled||this._disabled()}set disabled(A){this._disabled.set(A)}_disabled=jA(!1);get disableRipple(){return this._signalDisableRipple?this._parent.disableRipple():!!this._parent?.disableRipple}get hideSingleSelectionIndicator(){return!!(this._parent&&this._parent.hideSingleSelectionIndicator)}onSelectionChange=new WA;_text;_stateChanges=new $A;constructor(){let A=h(Hn);A.load(Za),A.load(KC),this._signalDisableRipple=!!this._parent&&bI(this._parent.disableRipple)}get active(){return this._active}get viewValue(){return(this._text?.nativeElement.textContent||\"\").trim()}select(A=!0){this._selected||(this._selected=!0,this._changeDetectorRef.markForCheck(),A&&this._emitSelectionChangeEvent())}deselect(A=!0){this._selected&&(this._selected=!1,this._changeDetectorRef.markForCheck(),A&&this._emitSelectionChangeEvent())}focus(A,i){let n=this._getHostElement();typeof n.focus==\"function\"&&n.focus(i)}setActiveStyles(){this._active||(this._active=!0,this._changeDetectorRef.markForCheck())}setInactiveStyles(){this._active&&(this._active=!1,this._changeDetectorRef.markForCheck())}getLabel(){return this.viewValue}_handleKeydown(A){(A.keyCode===13||A.keyCode===32)&&!aa(A)&&(this._selectViaInteraction(),A.preventDefault())}_selectViaInteraction(){this.disabled||(this._selected=this.multiple?!this._selected:!0,this._changeDetectorRef.markForCheck(),this._emitSelectionChangeEvent(!0))}_getTabIndex(){return this.disabled?\"-1\":\"0\"}_getHostElement(){return this._element.nativeElement}ngAfterViewChecked(){if(this._selected){let A=this.viewValue;A!==this._mostRecentViewValue&&(this._mostRecentViewValue&&this._stateChanges.next(),this._mostRecentViewValue=A)}}ngOnDestroy(){this._stateChanges.complete()}_emitSelectionChangeEvent(A=!1){this.onSelectionChange.emit(new pp(this,A))}static \\u0275fac=function(i){return new(i||t)};static \\u0275cmp=kA({type:t,selectors:[[\"mat-option\"]],viewQuery:function(i,n){if(i&1&&ni(YlA,7),i&2){let o;Ce(o=Ie())&&(n._text=o.first)}},hostAttrs:[\"role\",\"option\",1,\"mat-mdc-option\",\"mdc-list-item\"],hostVars:11,hostBindings:function(i,n){i&1&&$(\"click\",function(){return n._selectViaInteraction()})(\"keydown\",function(a){return n._handleKeydown(a)}),i&2&&(Bo(\"id\",n.id),ie(\"aria-selected\",n.selected)(\"aria-disabled\",n.disabled.toString()),ae(\"mdc-list-item--selected\",n.selected)(\"mat-mdc-option-multiple\",n.multiple)(\"mat-mdc-option-active\",n.active)(\"mdc-list-item--disabled\",n.disabled))},inputs:{value:\"value\",id:\"id\",disabled:[2,\"disabled\",\"disabled\",he]},outputs:{onSelectionChange:\"onSelectionChange\"},exportAs:[\"matOption\"],ngContentSelectors:TlA,decls:8,vars:5,consts:[[\"text\",\"\"],[\"aria-hidden\",\"true\",1,\"mat-mdc-option-pseudo-checkbox\",3,\"disabled\",\"state\"],[1,\"mdc-list-item__primary-text\"],[\"state\",\"checked\",\"aria-hidden\",\"true\",\"appearance\",\"minimal\",1,\"mat-mdc-option-pseudo-checkbox\",3,\"disabled\"],[1,\"cdk-visually-hidden\"],[\"aria-hidden\",\"true\",\"mat-ripple\",\"\",1,\"mat-mdc-option-ripple\",\"mat-focus-indicator\",3,\"matRippleTrigger\",\"matRippleDisabled\"]],template:function(i,n){i&1&&(Yt(HlA),V(0,OlA,1,2,\"mat-pseudo-checkbox\",1),He(1),m(2,\"span\",2,0),He(4,1),D(),V(5,zlA,1,1,\"mat-pseudo-checkbox\",3),V(6,PlA,2,1,\"span\",4),GA(7,\"div\",5)),i&2&&(W(n.multiple?0:-1),p(5),W(!n.multiple&&n.selected&&!n.hideSingleSelectionIndicator?5:-1),p(),W(n.group&&n.group._inert?6:-1),p(),X(\"matRippleTrigger\",n._getHostElement())(\"matRippleDisabled\",n.disabled||n.disableRipple))},dependencies:[uJ,Ns],styles:[`.mat-mdc-option{-webkit-user-select:none;user-select:none;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:flex;position:relative;align-items:center;justify-content:flex-start;overflow:hidden;min-height:48px;padding:0 16px;cursor:pointer;-webkit-tap-highlight-color:rgba(0,0,0,0);color:var(--mat-option-label-text-color, var(--mat-sys-on-surface));font-family:var(--mat-option-label-text-font, var(--mat-sys-label-large-font));line-height:var(--mat-option-label-text-line-height, var(--mat-sys-label-large-line-height));font-size:var(--mat-option-label-text-size, var(--mat-sys-body-large-size));letter-spacing:var(--mat-option-label-text-tracking, var(--mat-sys-label-large-tracking));font-weight:var(--mat-option-label-text-weight, var(--mat-sys-body-large-weight))}.mat-mdc-option:hover:not(.mdc-list-item--disabled){background-color:var(--mat-option-hover-state-layer-color, color-mix(in srgb, var(--mat-sys-on-surface) calc(var(--mat-sys-hover-state-layer-opacity) * 100%), transparent))}.mat-mdc-option:focus.mdc-list-item,.mat-mdc-option.mat-mdc-option-active.mdc-list-item{background-color:var(--mat-option-focus-state-layer-color, color-mix(in srgb, var(--mat-sys-on-surface) calc(var(--mat-sys-focus-state-layer-opacity) * 100%), transparent));outline:0}.mat-mdc-option.mdc-list-item--selected:not(.mdc-list-item--disabled):not(.mat-mdc-option-active,.mat-mdc-option-multiple,:focus,:hover){background-color:var(--mat-option-selected-state-layer-color, var(--mat-sys-secondary-container))}.mat-mdc-option.mdc-list-item--selected:not(.mdc-list-item--disabled):not(.mat-mdc-option-active,.mat-mdc-option-multiple,:focus,:hover) .mdc-list-item__primary-text{color:var(--mat-option-selected-state-label-text-color, var(--mat-sys-on-secondary-container))}.mat-mdc-option .mat-pseudo-checkbox{--mat-pseudo-checkbox-minimal-selected-checkmark-color: var(--mat-option-selected-state-label-text-color, var(--mat-sys-on-secondary-container))}.mat-mdc-option.mdc-list-item{align-items:center;background:rgba(0,0,0,0)}.mat-mdc-option.mdc-list-item--disabled{cursor:default;pointer-events:none}.mat-mdc-option.mdc-list-item--disabled .mat-mdc-option-pseudo-checkbox,.mat-mdc-option.mdc-list-item--disabled .mdc-list-item__primary-text,.mat-mdc-option.mdc-list-item--disabled>mat-icon{opacity:.38}.mat-mdc-optgroup .mat-mdc-option:not(.mat-mdc-option-multiple){padding-left:32px}[dir=rtl] .mat-mdc-optgroup .mat-mdc-option:not(.mat-mdc-option-multiple){padding-left:16px;padding-right:32px}.mat-mdc-option .mat-icon,.mat-mdc-option .mat-pseudo-checkbox-full{margin-right:16px;flex-shrink:0}[dir=rtl] .mat-mdc-option .mat-icon,[dir=rtl] .mat-mdc-option .mat-pseudo-checkbox-full{margin-right:0;margin-left:16px}.mat-mdc-option .mat-pseudo-checkbox-minimal{margin-left:16px;flex-shrink:0}[dir=rtl] .mat-mdc-option .mat-pseudo-checkbox-minimal{margin-right:16px;margin-left:0}.mat-mdc-option .mat-mdc-option-ripple{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none}.mat-mdc-option .mdc-list-item__primary-text{white-space:normal;font-size:inherit;font-weight:inherit;letter-spacing:inherit;line-height:inherit;font-family:inherit;text-decoration:inherit;text-transform:inherit;margin-right:auto}[dir=rtl] .mat-mdc-option .mdc-list-item__primary-text{margin-right:0;margin-left:auto}@media(forced-colors: active){.mat-mdc-option.mdc-list-item--selected:not(:has(.mat-mdc-option-pseudo-checkbox))::after{content:\"\";position:absolute;top:50%;right:16px;transform:translateY(-50%);width:10px;height:0;border-bottom:solid 10px;border-radius:10px}[dir=rtl] .mat-mdc-option.mdc-list-item--selected:not(:has(.mat-mdc-option-pseudo-checkbox))::after{right:auto;left:16px}}.mat-mdc-option-multiple{--mat-list-list-item-selected-container-color: var(--mat-list-list-item-container-color, transparent)}.mat-mdc-option-active .mat-focus-indicator::before{content:\"\"}\n`],encapsulation:2,changeDetection:0})}return t})();function Lb(t,e,A){if(A.length){let i=e.toArray(),n=A.toArray(),o=0;for(let a=0;a<t+1;a++)i[a].group&&i[a].group===n[o]&&o++;return o}return 0}function _b(t,e,A,i){return t<A?t:t+e>A+i?Math.max(0,t-i+e):A}var r4=(()=>{class t{_listeners=[];notify(A,i){for(let n of this._listeners)n(A,i)}listen(A){return this._listeners.push(A),()=>{this._listeners=this._listeners.filter(i=>A!==i)}}ngOnDestroy(){this._listeners=[]}static \\u0275fac=function(i){return new(i||t)};static \\u0275prov=TA({token:t,factory:t.\\u0275fac,providedIn:\"root\"})}return t})();var yp=class{applyChanges(e,A,i,n,o){e.forEachOperation((a,r,s)=>{let g,l;if(a.previousIndex==null){let C=i(a,r,s);g=A.createEmbeddedView(C.templateRef,C.context,C.index),l=kl.INSERTED}else s==null?(A.remove(r),l=kl.REMOVED):(g=A.get(r),A.move(g,s),l=kl.MOVED);o&&o({context:g?.context,operation:l,record:a})})}detach(){}};var $I=class{_multiple;_emitChanges;compareWith;_selection=new Set;_deselectedToEmit=[];_selectedToEmit=[];_selected=null;get selected(){return this._selected||(this._selected=Array.from(this._selection.values())),this._selected}changed=new $A;constructor(e=!1,A,i=!0,n){this._multiple=e,this._emitChanges=i,this.compareWith=n,A&&A.length&&(e?A.forEach(o=>this._markSelected(o)):this._markSelected(A[0]),this._selectedToEmit.length=0)}select(...e){this._verifyValueAssignment(e),e.forEach(i=>this._markSelected(i));let A=this._hasQueuedChanges();return this._emitChangeEvent(),A}deselect(...e){this._verifyValueAssignment(e),e.forEach(i=>this._unmarkSelected(i));let A=this._hasQueuedChanges();return this._emitChangeEvent(),A}setSelection(...e){this._verifyValueAssignment(e);let A=this.selected,i=new Set(e.map(o=>this._getConcreteValue(o)));e.forEach(o=>this._markSelected(o)),A.filter(o=>!i.has(this._getConcreteValue(o,i))).forEach(o=>this._unmarkSelected(o));let n=this._hasQueuedChanges();return this._emitChangeEvent(),n}toggle(e){return this.isSelected(e)?this.deselect(e):this.select(e)}clear(e=!0){this._unmarkAll();let A=this._hasQueuedChanges();return e&&this._emitChangeEvent(),A}isSelected(e){return this._selection.has(this._getConcreteValue(e))}isEmpty(){return this._selection.size===0}hasValue(){return!this.isEmpty()}sort(e){this._multiple&&this.selected&&this._selected.sort(e)}isMultipleSelection(){return this._multiple}_emitChangeEvent(){this._selected=null,(this._selectedToEmit.length||this._deselectedToEmit.length)&&(this.changed.next({source:this,added:this._selectedToEmit,removed:this._deselectedToEmit}),this._deselectedToEmit=[],this._selectedToEmit=[])}_markSelected(e){e=this._getConcreteValue(e),this.isSelected(e)||(this._multiple||this._unmarkAll(),this.isSelected(e)||this._selection.add(e),this._emitChanges&&this._selectedToEmit.push(e))}_unmarkSelected(e){e=this._getConcreteValue(e),this.isSelected(e)&&(this._selection.delete(e),this._emitChanges&&this._deselectedToEmit.push(e))}_unmarkAll(){this.isEmpty()||this._selection.forEach(e=>this._unmarkSelected(e))}_verifyValueAssignment(e){e.length>1&&this._multiple}_hasQueuedChanges(){return!!(this._deselectedToEmit.length||this._selectedToEmit.length)}_getConcreteValue(e,A){if(this.compareWith){A=A??this._selection;for(let i of A)if(this.compareWith(e,i))return i;return e}else return e}};var fJ=(()=>{class t{static \\u0275fac=function(i){return new(i||t)};static \\u0275mod=Xe({type:t});static \\u0275inj=Ze({imports:[Fi]})}return t})();var Gb=(()=>{class t{static \\u0275fac=function(i){return new(i||t)};static \\u0275mod=Xe({type:t});static \\u0275inj=Ze({imports:[YC,fJ,Mr,Fi]})}return t})();var jlA=[\"trigger\"],qlA=[\"panel\"],VlA=[[[\"mat-select-trigger\"]],\"*\"],WlA=[\"mat-select-trigger\",\"*\"];function ZlA(t,e){if(t&1&&(m(0,\"span\",4),K(1),D()),t&2){let A=y();p(),qA(A.placeholder)}}function XlA(t,e){t&1&&He(0)}function $lA(t,e){if(t&1&&(m(0,\"span\",11),K(1),D()),t&2){let A=y(2);p(),qA(A.triggerValue)}}function AcA(t,e){if(t&1&&(m(0,\"span\",5),V(1,XlA,1,0)(2,$lA,2,1,\"span\",11),D()),t&2){let A=y();p(),W(A.customTrigger?1:2)}}function ecA(t,e){if(t&1){let A=zA();m(0,\"div\",12,1),$(\"keydown\",function(n){rA(A);let o=y();return sA(o._handleKeydown(n))}),He(2,1),D()}if(t&2){let A=y();Qo(A.panelClass),ae(\"mat-select-panel-animations-enabled\",!A._animationsDisabled)(\"mat-primary\",(A._parentFormField==null?null:A._parentFormField.color)===\"primary\")(\"mat-accent\",(A._parentFormField==null?null:A._parentFormField.color)===\"accent\")(\"mat-warn\",(A._parentFormField==null?null:A._parentFormField.color)===\"warn\")(\"mat-undefined\",!(A._parentFormField!=null&&A._parentFormField.color)),ie(\"id\",A.id+\"-panel\")(\"aria-multiselectable\",A.multiple)(\"aria-label\",A.ariaLabel||null)(\"aria-labelledby\",A._getPanelAriaLabelledby())}}var tcA=new wA(\"mat-select-scroll-strategy\",{providedIn:\"root\",factory:()=>{let t=h(ut);return()=>R0(t)}}),icA=new wA(\"MAT_SELECT_CONFIG\"),ncA=new wA(\"MatSelectTrigger\"),Kb=class{source;value;constructor(e,A){this.source=e,this.value=A}},Yg=(()=>{class t{_viewportRuler=h(Bs);_changeDetectorRef=h(ft);_elementRef=h(ge);_dir=h(wo,{optional:!0});_idGenerator=h(An);_renderer=h(ui);_parentFormField=h(mh,{optional:!0});ngControl=h(xs,{self:!0,optional:!0});_liveAnnouncer=h(lh);_defaultOptions=h(icA,{optional:!0});_animationsDisabled=Oi();_popoverLocation;_initialized=new $A;_cleanupDetach;options;optionGroups;customTrigger;_positions=[{originX:\"start\",originY:\"bottom\",overlayX:\"start\",overlayY:\"top\"},{originX:\"end\",originY:\"bottom\",overlayX:\"end\",overlayY:\"top\"},{originX:\"start\",originY:\"top\",overlayX:\"start\",overlayY:\"bottom\",panelClass:\"mat-mdc-select-panel-above\"},{originX:\"end\",originY:\"top\",overlayX:\"end\",overlayY:\"bottom\",panelClass:\"mat-mdc-select-panel-above\"}];_scrollOptionIntoView(A){let i=this.options.toArray()[A];if(i){let n=this.panel.nativeElement,o=Lb(A,this.options,this.optionGroups),a=i._getHostElement();A===0&&o===1?n.scrollTop=0:n.scrollTop=_b(a.offsetTop,a.offsetHeight,n.scrollTop,n.offsetHeight)}}_positioningSettled(){this._scrollOptionIntoView(this._keyManager.activeItemIndex||0)}_getChangeEvent(A){return new Kb(this,A)}_scrollStrategyFactory=h(tcA);_panelOpen=!1;_compareWith=(A,i)=>A===i;_uid=this._idGenerator.getId(\"mat-select-\");_triggerAriaLabelledBy=null;_previousControl;_destroy=new $A;_errorStateTracker;stateChanges=new $A;disableAutomaticLabeling=!0;userAriaDescribedBy;_selectionModel;_keyManager;_preferredOverlayOrigin;_overlayWidth;_onChange=()=>{};_onTouched=()=>{};_valueId=this._idGenerator.getId(\"mat-select-value-\");_scrollStrategy;_overlayPanelClass=this._defaultOptions?.overlayPanelClass||\"\";get focused(){return this._focused||this._panelOpen}_focused=!1;controlType=\"mat-select\";trigger;panel;_overlayDir;panelClass;disabled=!1;get disableRipple(){return this._disableRipple()}set disableRipple(A){this._disableRipple.set(A)}_disableRipple=jA(!1);tabIndex=0;get hideSingleSelectionIndicator(){return this._hideSingleSelectionIndicator}set hideSingleSelectionIndicator(A){this._hideSingleSelectionIndicator=A,this._syncParentProperties()}_hideSingleSelectionIndicator=this._defaultOptions?.hideSingleSelectionIndicator??!1;get placeholder(){return this._placeholder}set placeholder(A){this._placeholder=A,this.stateChanges.next()}_placeholder;get required(){return this._required??this.ngControl?.control?.hasValidator(Ss.required)??!1}set required(A){this._required=A,this.stateChanges.next()}_required;get multiple(){return this._multiple}set multiple(A){this._selectionModel,this._multiple=A}_multiple=!1;disableOptionCentering=this._defaultOptions?.disableOptionCentering??!1;get compareWith(){return this._compareWith}set compareWith(A){this._compareWith=A,this._selectionModel&&this._initializeSelection()}get value(){return this._value}set value(A){this._assignValue(A)&&this._onChange(A)}_value;ariaLabel=\"\";ariaLabelledby;get errorStateMatcher(){return this._errorStateTracker.matcher}set errorStateMatcher(A){this._errorStateTracker.matcher=A}typeaheadDebounceInterval;sortComparator;get id(){return this._id}set id(A){this._id=A||this._uid,this.stateChanges.next()}_id;get errorState(){return this._errorStateTracker.errorState}set errorState(A){this._errorStateTracker.errorState=A}panelWidth=this._defaultOptions&&typeof this._defaultOptions.panelWidth<\"u\"?this._defaultOptions.panelWidth:\"auto\";canSelectNullableOptions=this._defaultOptions?.canSelectNullableOptions??!1;optionSelectionChanges=fc(()=>{let A=this.options;return A?A.changes.pipe(nn(A),Ei(()=>Qi(...A.map(i=>i.onSelectionChange)))):this._initialized.pipe(Ei(()=>this.optionSelectionChanges))});openedChange=new WA;_openedStream=this.openedChange.pipe(We(A=>A),fe(()=>{}));_closedStream=this.openedChange.pipe(We(A=>!A),fe(()=>{}));selectionChange=new WA;valueChange=new WA;constructor(){let A=h(Gd),i=h(bd,{optional:!0}),n=h(GC,{optional:!0}),o=h(new bs(\"tabindex\"),{optional:!0}),a=h(n4,{optional:!0});this.ngControl&&(this.ngControl.valueAccessor=this),this._defaultOptions?.typeaheadDebounceInterval!=null&&(this.typeaheadDebounceInterval=this._defaultOptions.typeaheadDebounceInterval),this._errorStateTracker=new Kd(A,this.ngControl,n,i,this.stateChanges),this._scrollStrategy=this._scrollStrategyFactory(),this.tabIndex=o==null?0:parseInt(o)||0,this._popoverLocation=a?.usePopover===!1?null:\"inline\",this.id=this.id}ngOnInit(){this._selectionModel=new $I(this.multiple),this.stateChanges.next(),this._viewportRuler.change().pipe(Bt(this._destroy)).subscribe(()=>{this.panelOpen&&(this._overlayWidth=this._getOverlayWidth(this._preferredOverlayOrigin),this._changeDetectorRef.detectChanges())})}ngAfterContentInit(){this._initialized.next(),this._initialized.complete(),this._initKeyManager(),this._selectionModel.changed.pipe(Bt(this._destroy)).subscribe(A=>{A.added.forEach(i=>i.select()),A.removed.forEach(i=>i.deselect())}),this.options.changes.pipe(nn(null),Bt(this._destroy)).subscribe(()=>{this._resetOptions(),this._initializeSelection()})}ngDoCheck(){let A=this._getTriggerAriaLabelledby(),i=this.ngControl;if(A!==this._triggerAriaLabelledBy){let n=this._elementRef.nativeElement;this._triggerAriaLabelledBy=A,A?n.setAttribute(\"aria-labelledby\",A):n.removeAttribute(\"aria-labelledby\")}i&&(this._previousControl!==i.control&&(this._previousControl!==void 0&&i.disabled!==null&&i.disabled!==this.disabled&&(this.disabled=i.disabled),this._previousControl=i.control),this.updateErrorState())}ngOnChanges(A){(A.disabled||A.userAriaDescribedBy)&&this.stateChanges.next(),A.typeaheadDebounceInterval&&this._keyManager&&this._keyManager.withTypeAhead(this.typeaheadDebounceInterval),A.panelClass&&this.panelClass instanceof Set&&(this.panelClass=Array.from(this.panelClass))}ngOnDestroy(){this._cleanupDetach?.(),this._keyManager?.destroy(),this._destroy.next(),this._destroy.complete(),this.stateChanges.complete(),this._clearFromModal()}toggle(){this.panelOpen?this.close():this.open()}open(){this._canOpen()&&(this._parentFormField&&(this._preferredOverlayOrigin=this._parentFormField.getConnectedOverlayOrigin()),this._cleanupDetach?.(),this._overlayWidth=this._getOverlayWidth(this._preferredOverlayOrigin),this._applyModalPanelOwnership(),this._panelOpen=!0,this._overlayDir.positionChange.pipe(qn(1)).subscribe(()=>{this._changeDetectorRef.detectChanges(),this._positioningSettled()}),this._overlayDir.attachOverlay(),this._keyManager.withHorizontalOrientation(null),this._highlightCorrectOption(),this._changeDetectorRef.markForCheck(),this.stateChanges.next(),Promise.resolve().then(()=>this.openedChange.emit(!0)))}_trackedModal=null;_applyModalPanelOwnership(){let A=this._elementRef.nativeElement.closest('body > .cdk-overlay-container [aria-modal=\"true\"]');if(!A)return;let i=`${this.id}-panel`;this._trackedModal&&Vf(this._trackedModal,\"aria-owns\",i),jv(A,\"aria-owns\",i),this._trackedModal=A}_clearFromModal(){if(!this._trackedModal)return;let A=`${this.id}-panel`;Vf(this._trackedModal,\"aria-owns\",A),this._trackedModal=null}close(){this._panelOpen&&(this._panelOpen=!1,this._exitAndDetach(),this._keyManager.withHorizontalOrientation(this._isRtl()?\"rtl\":\"ltr\"),this._changeDetectorRef.markForCheck(),this._onTouched(),this.stateChanges.next(),Promise.resolve().then(()=>this.openedChange.emit(!1)))}_exitAndDetach(){if(this._animationsDisabled||!this.panel){this._detachOverlay();return}this._cleanupDetach?.(),this._cleanupDetach=()=>{i(),clearTimeout(n),this._cleanupDetach=void 0};let A=this.panel.nativeElement,i=this._renderer.listen(A,\"animationend\",o=>{o.animationName===\"_mat-select-exit\"&&(this._cleanupDetach?.(),this._detachOverlay())}),n=setTimeout(()=>{this._cleanupDetach?.(),this._detachOverlay()},200);A.classList.add(\"mat-select-panel-exit\")}_detachOverlay(){this._overlayDir.detachOverlay(),this._changeDetectorRef.markForCheck()}writeValue(A){this._assignValue(A)}registerOnChange(A){this._onChange=A}registerOnTouched(A){this._onTouched=A}setDisabledState(A){this.disabled=A,this._changeDetectorRef.markForCheck(),this.stateChanges.next()}get panelOpen(){return this._panelOpen}get selected(){return this.multiple?this._selectionModel?.selected||[]:this._selectionModel?.selected[0]}get triggerValue(){if(this.empty)return\"\";if(this._multiple){let A=this._selectionModel.selected.map(i=>i.viewValue);return this._isRtl()&&A.reverse(),A.join(\", \")}return this._selectionModel.selected[0].viewValue}updateErrorState(){this._errorStateTracker.updateErrorState()}_isRtl(){return this._dir?this._dir.value===\"rtl\":!1}_handleKeydown(A){this.disabled||(this.panelOpen?this._handleOpenKeydown(A):this._handleClosedKeydown(A))}_handleClosedKeydown(A){let i=A.keyCode,n=i===40||i===38||i===37||i===39,o=i===13||i===32,a=this._keyManager;if(!a.isTyping()&&o&&!aa(A)||(this.multiple||A.altKey)&&n)A.preventDefault(),this.open();else if(!this.multiple){let r=this.selected;a.onKeydown(A);let s=this.selected;s&&r!==s&&this._liveAnnouncer.announce(s.viewValue,1e4)}}_handleOpenKeydown(A){let i=this._keyManager,n=A.keyCode,o=n===40||n===38,a=i.isTyping();if(o&&A.altKey)A.preventDefault(),this.close();else if(!a&&(n===13||n===32)&&i.activeItem&&!aa(A))A.preventDefault(),i.activeItem._selectViaInteraction();else if(!a&&this._multiple&&n===65&&A.ctrlKey){A.preventDefault();let r=this.options.some(s=>!s.disabled&&!s.selected);this.options.forEach(s=>{s.disabled||(r?s.select():s.deselect())})}else{let r=i.activeItemIndex;i.onKeydown(A),this._multiple&&o&&A.shiftKey&&i.activeItem&&i.activeItemIndex!==r&&i.activeItem._selectViaInteraction()}}_handleOverlayKeydown(A){A.keyCode===27&&!aa(A)&&(A.preventDefault(),this.close())}_onFocus(){this.disabled||(this._focused=!0,this.stateChanges.next())}_onBlur(){this._focused=!1,this._keyManager?.cancelTypeahead(),!this.disabled&&!this.panelOpen&&(this._onTouched(),this._changeDetectorRef.markForCheck(),this.stateChanges.next())}get empty(){return!this._selectionModel||this._selectionModel.isEmpty()}_initializeSelection(){Promise.resolve().then(()=>{this.ngControl&&(this._value=this.ngControl.value),this._setSelectionByValue(this._value),this.stateChanges.next()})}_setSelectionByValue(A){if(this.options.forEach(i=>i.setInactiveStyles()),this._selectionModel.clear(),this.multiple&&A)Array.isArray(A),A.forEach(i=>this._selectOptionByValue(i)),this._sortValues();else{let i=this._selectOptionByValue(A);i?this._keyManager.updateActiveItem(i):this.panelOpen||this._keyManager.updateActiveItem(-1)}this._changeDetectorRef.markForCheck()}_selectOptionByValue(A){let i=this.options.find(n=>{if(this._selectionModel.isSelected(n))return!1;try{return(n.value!=null||this.canSelectNullableOptions)&&this._compareWith(n.value,A)}catch(o){return!1}});return i&&this._selectionModel.select(i),i}_assignValue(A){return A!==this._value||this._multiple&&Array.isArray(A)?(this.options&&this._setSelectionByValue(A),this._value=A,!0):!1}_skipPredicate=A=>this.panelOpen?!1:A.disabled;_getOverlayWidth(A){return this.panelWidth===\"auto\"?(A instanceof aB?A.elementRef:A||this._elementRef).nativeElement.getBoundingClientRect().width:this.panelWidth===null?\"\":this.panelWidth}_syncParentProperties(){if(this.options)for(let A of this.options)A._changeDetectorRef.markForCheck()}_initKeyManager(){this._keyManager=new Qh(this.options).withTypeAhead(this.typeaheadDebounceInterval).withVerticalOrientation().withHorizontalOrientation(this._isRtl()?\"rtl\":\"ltr\").withHomeAndEnd().withPageUpDown().withAllowedModifierKeys([\"shiftKey\"]).skipPredicate(this._skipPredicate),this._keyManager.tabOut.subscribe(()=>{this.panelOpen&&(!this.multiple&&this._keyManager.activeItem&&this._keyManager.activeItem._selectViaInteraction(),this.focus(),this.close())}),this._keyManager.change.subscribe(()=>{this._panelOpen&&this.panel?this._scrollOptionIntoView(this._keyManager.activeItemIndex||0):!this._panelOpen&&!this.multiple&&this._keyManager.activeItem&&this._keyManager.activeItem._selectViaInteraction()})}_resetOptions(){let A=Qi(this.options.changes,this._destroy);this.optionSelectionChanges.pipe(Bt(A)).subscribe(i=>{this._onSelect(i.source,i.isUserInput),i.isUserInput&&!this.multiple&&this._panelOpen&&(this.close(),this.focus())}),Qi(...this.options.map(i=>i._stateChanges)).pipe(Bt(A)).subscribe(()=>{this._changeDetectorRef.detectChanges(),this.stateChanges.next()})}_onSelect(A,i){let n=this._selectionModel.isSelected(A);!this.canSelectNullableOptions&&A.value==null&&!this._multiple?(A.deselect(),this._selectionModel.clear(),this.value!=null&&this._propagateChanges(A.value)):(n!==A.selected&&(A.selected?this._selectionModel.select(A):this._selectionModel.deselect(A)),i&&this._keyManager.setActiveItem(A),this.multiple&&(this._sortValues(),i&&this.focus())),n!==this._selectionModel.isSelected(A)&&this._propagateChanges(),this.stateChanges.next()}_sortValues(){if(this.multiple){let A=this.options.toArray();this._selectionModel.sort((i,n)=>this.sortComparator?this.sortComparator(i,n,A):A.indexOf(i)-A.indexOf(n)),this.stateChanges.next()}}_propagateChanges(A){let i;this.multiple?i=this.selected.map(n=>n.value):i=this.selected?this.selected.value:A,this._value=i,this.valueChange.emit(i),this._onChange(i),this.selectionChange.emit(this._getChangeEvent(i)),this._changeDetectorRef.markForCheck()}_highlightCorrectOption(){if(this._keyManager)if(this.empty){let A=-1;for(let i=0;i<this.options.length;i++)if(!this.options.get(i).disabled){A=i;break}this._keyManager.setActiveItem(A)}else this._keyManager.setActiveItem(this._selectionModel.selected[0])}_canOpen(){return!this._panelOpen&&!this.disabled&&this.options?.length>0&&!!this._overlayDir}focus(A){this._elementRef.nativeElement.focus(A)}_getPanelAriaLabelledby(){if(this.ariaLabel)return null;let A=this._parentFormField?.getLabelId()||null,i=A?A+\" \":\"\";return this.ariaLabelledby?i+this.ariaLabelledby:A}_getAriaActiveDescendant(){return this.panelOpen&&this._keyManager&&this._keyManager.activeItem?this._keyManager.activeItem.id:null}_getTriggerAriaLabelledby(){if(this.ariaLabel)return null;let A=this._parentFormField?.getLabelId()||\"\";return this.ariaLabelledby&&(A+=\" \"+this.ariaLabelledby),A||(A=this._valueId),A}get describedByIds(){return this._elementRef.nativeElement.getAttribute(\"aria-describedby\")?.split(\" \")||[]}setDescribedByIds(A){let i=this._elementRef.nativeElement;A.length?i.setAttribute(\"aria-describedby\",A.join(\" \")):i.removeAttribute(\"aria-describedby\")}onContainerClick(A){let i=yr(A);i&&(i.tagName===\"MAT-OPTION\"||i.classList.contains(\"cdk-overlay-backdrop\")||i.closest(\".mat-mdc-select-panel\"))||(this.focus(),this.open())}get shouldLabelFloat(){return this.panelOpen||!this.empty||this.focused&&!!this.placeholder}static \\u0275fac=function(i){return new(i||t)};static \\u0275cmp=kA({type:t,selectors:[[\"mat-select\"]],contentQueries:function(i,n,o){if(i&1&&na(o,ncA,5)(o,Mr,5)(o,wp,5),i&2){let a;Ce(a=Ie())&&(n.customTrigger=a.first),Ce(a=Ie())&&(n.options=a),Ce(a=Ie())&&(n.optionGroups=a)}},viewQuery:function(i,n){if(i&1&&ni(jlA,5)(qlA,5)(Qp,5),i&2){let o;Ce(o=Ie())&&(n.trigger=o.first),Ce(o=Ie())&&(n.panel=o.first),Ce(o=Ie())&&(n._overlayDir=o.first)}},hostAttrs:[\"role\",\"combobox\",\"aria-haspopup\",\"listbox\",1,\"mat-mdc-select\"],hostVars:21,hostBindings:function(i,n){i&1&&$(\"keydown\",function(a){return n._handleKeydown(a)})(\"focus\",function(){return n._onFocus()})(\"blur\",function(){return n._onBlur()}),i&2&&(ie(\"id\",n.id)(\"tabindex\",n.disabled?-1:n.tabIndex)(\"aria-controls\",n.panelOpen?n.id+\"-panel\":null)(\"aria-expanded\",n.panelOpen)(\"aria-label\",n.ariaLabel||null)(\"aria-required\",n.required.toString())(\"aria-disabled\",n.disabled.toString())(\"aria-invalid\",n.errorState)(\"aria-activedescendant\",n._getAriaActiveDescendant()),ae(\"mat-mdc-select-disabled\",n.disabled)(\"mat-mdc-select-invalid\",n.errorState)(\"mat-mdc-select-required\",n.required)(\"mat-mdc-select-empty\",n.empty)(\"mat-mdc-select-multiple\",n.multiple)(\"mat-select-open\",n.panelOpen))},inputs:{userAriaDescribedBy:[0,\"aria-describedby\",\"userAriaDescribedBy\"],panelClass:\"panelClass\",disabled:[2,\"disabled\",\"disabled\",he],disableRipple:[2,\"disableRipple\",\"disableRipple\",he],tabIndex:[2,\"tabIndex\",\"tabIndex\",A=>A==null?0:Zi(A)],hideSingleSelectionIndicator:[2,\"hideSingleSelectionIndicator\",\"hideSingleSelectionIndicator\",he],placeholder:\"placeholder\",required:[2,\"required\",\"required\",he],multiple:[2,\"multiple\",\"multiple\",he],disableOptionCentering:[2,\"disableOptionCentering\",\"disableOptionCentering\",he],compareWith:\"compareWith\",value:\"value\",ariaLabel:[0,\"aria-label\",\"ariaLabel\"],ariaLabelledby:[0,\"aria-labelledby\",\"ariaLabelledby\"],errorStateMatcher:\"errorStateMatcher\",typeaheadDebounceInterval:[2,\"typeaheadDebounceInterval\",\"typeaheadDebounceInterval\",Zi],sortComparator:\"sortComparator\",id:\"id\",panelWidth:\"panelWidth\",canSelectNullableOptions:[2,\"canSelectNullableOptions\",\"canSelectNullableOptions\",he]},outputs:{openedChange:\"openedChange\",_openedStream:\"opened\",_closedStream:\"closed\",selectionChange:\"selectionChange\",valueChange:\"valueChange\"},exportAs:[\"matSelect\"],features:[It([{provide:fh,useExisting:t},{provide:Dp,useExisting:t}]),ei],ngContentSelectors:WlA,decls:11,vars:10,consts:[[\"fallbackOverlayOrigin\",\"cdkOverlayOrigin\",\"trigger\",\"\"],[\"panel\",\"\"],[\"cdk-overlay-origin\",\"\",1,\"mat-mdc-select-trigger\",3,\"click\"],[1,\"mat-mdc-select-value\"],[1,\"mat-mdc-select-placeholder\",\"mat-mdc-select-min-line\"],[1,\"mat-mdc-select-value-text\"],[1,\"mat-mdc-select-arrow-wrapper\"],[1,\"mat-mdc-select-arrow\"],[\"viewBox\",\"0 0 24 24\",\"width\",\"24px\",\"height\",\"24px\",\"focusable\",\"false\",\"aria-hidden\",\"true\"],[\"d\",\"M7 10l5 5 5-5z\"],[\"cdk-connected-overlay\",\"\",\"cdkConnectedOverlayHasBackdrop\",\"\",\"cdkConnectedOverlayBackdropClass\",\"cdk-overlay-transparent-backdrop\",3,\"detach\",\"backdropClick\",\"overlayKeydown\",\"cdkConnectedOverlayDisableClose\",\"cdkConnectedOverlayPanelClass\",\"cdkConnectedOverlayScrollStrategy\",\"cdkConnectedOverlayOrigin\",\"cdkConnectedOverlayPositions\",\"cdkConnectedOverlayWidth\",\"cdkConnectedOverlayFlexibleDimensions\",\"cdkConnectedOverlayUsePopover\"],[1,\"mat-mdc-select-min-line\"],[\"role\",\"listbox\",\"tabindex\",\"-1\",1,\"mat-mdc-select-panel\",\"mdc-menu-surface\",\"mdc-menu-surface--open\",3,\"keydown\"]],template:function(i,n){if(i&1&&(Yt(VlA),m(0,\"div\",2,0),$(\"click\",function(){return n.open()}),m(3,\"div\",3),V(4,ZlA,2,1,\"span\",4)(5,AcA,3,1,\"span\",5),D(),m(6,\"div\",6)(7,\"div\",7),Qt(),m(8,\"svg\",8),GA(9,\"path\",9),D()()()(),yt(10,ecA,3,16,\"ng-template\",10),$(\"detach\",function(){return n.close()})(\"backdropClick\",function(){return n.close()})(\"overlayKeydown\",function(a){return n._handleOverlayKeydown(a)})),i&2){let o=Wi(1);p(3),ie(\"id\",n._valueId),p(),W(n.empty?4:5),p(6),X(\"cdkConnectedOverlayDisableClose\",!0)(\"cdkConnectedOverlayPanelClass\",n._overlayPanelClass)(\"cdkConnectedOverlayScrollStrategy\",n._scrollStrategy)(\"cdkConnectedOverlayOrigin\",n._preferredOverlayOrigin||o)(\"cdkConnectedOverlayPositions\",n._positions)(\"cdkConnectedOverlayWidth\",n._overlayWidth)(\"cdkConnectedOverlayFlexibleDimensions\",!0)(\"cdkConnectedOverlayUsePopover\",n._popoverLocation)}},dependencies:[aB,Qp],styles:[`@keyframes _mat-select-enter{from{opacity:0;transform:scaleY(0.8)}to{opacity:1;transform:none}}@keyframes _mat-select-exit{from{opacity:1}to{opacity:0}}.mat-mdc-select{display:inline-block;width:100%;outline:none;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;color:var(--mat-select-enabled-trigger-text-color, var(--mat-sys-on-surface));font-family:var(--mat-select-trigger-text-font, var(--mat-sys-body-large-font));line-height:var(--mat-select-trigger-text-line-height, var(--mat-sys-body-large-line-height));font-size:var(--mat-select-trigger-text-size, var(--mat-sys-body-large-size));font-weight:var(--mat-select-trigger-text-weight, var(--mat-sys-body-large-weight));letter-spacing:var(--mat-select-trigger-text-tracking, var(--mat-sys-body-large-tracking))}div.mat-mdc-select-panel{box-shadow:var(--mat-select-container-elevation-shadow, 0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12))}.mat-mdc-select-disabled{color:var(--mat-select-disabled-trigger-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-mdc-select-disabled .mat-mdc-select-placeholder{color:var(--mat-select-disabled-trigger-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-mdc-select-trigger{display:inline-flex;align-items:center;cursor:pointer;position:relative;box-sizing:border-box;width:100%}.mat-mdc-select-disabled .mat-mdc-select-trigger{-webkit-user-select:none;user-select:none;cursor:default}.mat-mdc-select-value{width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.mat-mdc-select-value-text{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.mat-mdc-select-arrow-wrapper{height:24px;flex-shrink:0;display:inline-flex;align-items:center}.mat-form-field-appearance-fill .mdc-text-field--no-label .mat-mdc-select-arrow-wrapper{transform:none}.mat-mdc-form-field .mat-mdc-select.mat-mdc-select-invalid .mat-mdc-select-arrow,.mat-form-field-invalid:not(.mat-form-field-disabled) .mat-mdc-form-field-infix::after{color:var(--mat-select-invalid-arrow-color, var(--mat-sys-error))}.mat-mdc-select-arrow{width:10px;height:5px;position:relative;color:var(--mat-select-enabled-arrow-color, var(--mat-sys-on-surface-variant))}.mat-mdc-form-field.mat-focused .mat-mdc-select-arrow{color:var(--mat-select-focused-arrow-color, var(--mat-sys-primary))}.mat-mdc-form-field .mat-mdc-select.mat-mdc-select-disabled .mat-mdc-select-arrow{color:var(--mat-select-disabled-arrow-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-select-open .mat-mdc-select-arrow{transform:rotate(180deg)}.mat-form-field-animations-enabled .mat-mdc-select-arrow{transition:transform 80ms linear}.mat-mdc-select-arrow svg{fill:currentColor;position:absolute;top:50%;left:50%;transform:translate(-50%, -50%)}@media(forced-colors: active){.mat-mdc-select-arrow svg{fill:CanvasText}.mat-mdc-select-disabled .mat-mdc-select-arrow svg{fill:GrayText}}div.mat-mdc-select-panel{width:100%;max-height:275px;outline:0;overflow:auto;padding:8px 0;border-radius:4px;box-sizing:border-box;position:relative;background-color:var(--mat-select-panel-background-color, var(--mat-sys-surface-container))}@media(forced-colors: active){div.mat-mdc-select-panel{outline:solid 1px}}.cdk-overlay-pane:not(.mat-mdc-select-panel-above) div.mat-mdc-select-panel{border-top-left-radius:0;border-top-right-radius:0;transform-origin:top center}.mat-mdc-select-panel-above div.mat-mdc-select-panel{border-bottom-left-radius:0;border-bottom-right-radius:0;transform-origin:bottom center}.mat-select-panel-animations-enabled{animation:_mat-select-enter 120ms cubic-bezier(0, 0, 0.2, 1)}.mat-select-panel-animations-enabled.mat-select-panel-exit{animation:_mat-select-exit 100ms linear}.mat-mdc-select-placeholder{transition:color 400ms 133.3333333333ms cubic-bezier(0.25, 0.8, 0.25, 1);color:var(--mat-select-placeholder-text-color, var(--mat-sys-on-surface-variant))}.mat-mdc-form-field:not(.mat-form-field-animations-enabled) .mat-mdc-select-placeholder,._mat-animation-noopable .mat-mdc-select-placeholder{transition:none}.mat-form-field-hide-placeholder .mat-mdc-select-placeholder{color:rgba(0,0,0,0);-webkit-text-fill-color:rgba(0,0,0,0);transition:none;display:block}.mat-mdc-form-field-type-mat-select:not(.mat-form-field-disabled) .mat-mdc-text-field-wrapper{cursor:pointer}.mat-mdc-form-field-type-mat-select.mat-form-field-appearance-fill .mat-mdc-floating-label{max-width:calc(100% - 18px)}.mat-mdc-form-field-type-mat-select.mat-form-field-appearance-fill .mdc-floating-label--float-above{max-width:calc(100%/0.75 - 24px)}.mat-mdc-form-field-type-mat-select.mat-form-field-appearance-outline .mdc-notched-outline__notch{max-width:calc(100% - 60px)}.mat-mdc-form-field-type-mat-select.mat-form-field-appearance-outline .mdc-text-field--label-floating .mdc-notched-outline__notch{max-width:calc(100% - 24px)}.mat-mdc-select-min-line:empty::before{content:\" \";white-space:pre;width:1px;display:inline-block;visibility:hidden}.mat-form-field-appearance-fill .mat-mdc-select-arrow-wrapper{transform:var(--mat-select-arrow-transform, translateY(-8px))}\n`],encapsulation:2,changeDetection:0})}return t})();var Ub=(()=>{class t{static \\u0275fac=function(i){return new(i||t)};static \\u0275mod=Xe({type:t});static \\u0275inj=Ze({imports:[Kg,Gb,Fi,Fc,vr,Gb]})}return t})();var acA=[\"tooltip\"],rcA=20;var scA=new wA(\"mat-tooltip-scroll-strategy\",{providedIn:\"root\",factory:()=>{let t=h(ut);return()=>R0(t,{scrollThrottle:rcA})}}),gcA=new wA(\"mat-tooltip-default-options\",{providedIn:\"root\",factory:()=>({showDelay:0,hideDelay:0,touchendHideDelay:1500})});var mJ=\"tooltip-panel\",lcA={passive:!0},ccA=8,CcA=8,IcA=24,dcA=200,Ba=(()=>{class t{_elementRef=h(ge);_ngZone=h(Oe);_platform=h(ci);_ariaDescriber=h(U_);_focusMonitor=h(Ha);_dir=h(wo);_injector=h(ut);_viewContainerRef=h(Ro);_mediaMatcher=h(Sd);_document=h(Zt);_renderer=h(ui);_animationsDisabled=Oi();_defaultOptions=h(gcA,{optional:!0});_overlayRef=null;_tooltipInstance=null;_overlayPanelClass;_portal;_position=\"below\";_positionAtOrigin=!1;_disabled=!1;_tooltipClass;_viewInitialized=!1;_pointerExitEventsInitialized=!1;_tooltipComponent=pJ;_viewportMargin=8;_currentPosition;_cssClassPrefix=\"mat-mdc\";_ariaDescriptionPending=!1;_dirSubscribed=!1;get position(){return this._position}set position(A){A!==this._position&&(this._position=A,this._overlayRef&&(this._updatePosition(this._overlayRef),this._tooltipInstance?.show(0),this._overlayRef.updatePosition()))}get positionAtOrigin(){return this._positionAtOrigin}set positionAtOrigin(A){this._positionAtOrigin=sr(A),this._detach(),this._overlayRef=null}get disabled(){return this._disabled}set disabled(A){let i=sr(A);this._disabled!==i&&(this._disabled=i,i?this.hide(0):this._setupPointerEnterEventsIfNeeded(),this._syncAriaDescription(this.message))}get showDelay(){return this._showDelay}set showDelay(A){this._showDelay=Rs(A)}_showDelay;get hideDelay(){return this._hideDelay}set hideDelay(A){this._hideDelay=Rs(A),this._tooltipInstance&&(this._tooltipInstance._mouseLeaveHideDelay=this._hideDelay)}_hideDelay;touchGestures=\"auto\";get message(){return this._message}set message(A){let i=this._message;this._message=A!=null?String(A).trim():\"\",!this._message&&this._isTooltipVisible()?this.hide(0):(this._setupPointerEnterEventsIfNeeded(),this._updateTooltipMessage()),this._syncAriaDescription(i)}_message=\"\";get tooltipClass(){return this._tooltipClass}set tooltipClass(A){this._tooltipClass=A,this._tooltipInstance&&this._setTooltipClass(this._tooltipClass)}_eventCleanups=[];_touchstartTimeout=null;_destroyed=new $A;_isDestroyed=!1;constructor(){let A=this._defaultOptions;A&&(this._showDelay=A.showDelay,this._hideDelay=A.hideDelay,A.position&&(this.position=A.position),A.positionAtOrigin&&(this.positionAtOrigin=A.positionAtOrigin),A.touchGestures&&(this.touchGestures=A.touchGestures),A.tooltipClass&&(this.tooltipClass=A.tooltipClass)),this._viewportMargin=ccA}ngAfterViewInit(){this._viewInitialized=!0,this._setupPointerEnterEventsIfNeeded(),this._focusMonitor.monitor(this._elementRef).pipe(Bt(this._destroyed)).subscribe(A=>{A?A===\"keyboard\"&&this._ngZone.run(()=>this.show()):this._ngZone.run(()=>this.hide(0))})}ngOnDestroy(){let A=this._elementRef.nativeElement;this._touchstartTimeout&&clearTimeout(this._touchstartTimeout),this._overlayRef&&(this._overlayRef.dispose(),this._tooltipInstance=null),this._eventCleanups.forEach(i=>i()),this._eventCleanups.length=0,this._destroyed.next(),this._destroyed.complete(),this._isDestroyed=!0,this._ariaDescriber.removeDescription(A,this.message,\"tooltip\"),this._focusMonitor.stopMonitoring(A)}show(A=this.showDelay,i){if(this.disabled||!this.message||this._isTooltipVisible()){this._tooltipInstance?._cancelPendingAnimations();return}let n=this._createOverlay(i);this._detach(),this._portal=this._portal||new Cg(this._tooltipComponent,this._viewContainerRef);let o=this._tooltipInstance=n.attach(this._portal).instance;o._triggerElement=this._elementRef.nativeElement,o._mouseLeaveHideDelay=this._hideDelay,o.afterHidden().pipe(Bt(this._destroyed)).subscribe(()=>this._detach()),this._setTooltipClass(this._tooltipClass),this._updateTooltipMessage(),o.show(A)}hide(A=this.hideDelay){let i=this._tooltipInstance;i&&(i.isVisible()?i.hide(A):(i._cancelPendingAnimations(),this._detach()))}toggle(A){this._isTooltipVisible()?this.hide():this.show(void 0,A)}_isTooltipVisible(){return!!this._tooltipInstance&&this._tooltipInstance.isVisible()}_createOverlay(A){if(this._overlayRef){let a=this._overlayRef.getConfig().positionStrategy;if((!this.positionAtOrigin||!A)&&a._origin instanceof ge)return this._overlayRef;this._detach()}let i=this._injector.get(Lc).getAncestorScrollContainers(this._elementRef),n=`${this._cssClassPrefix}-${mJ}`,o=XI(this._injector,this.positionAtOrigin?A||this._elementRef:this._elementRef).withTransformOriginOn(`.${this._cssClassPrefix}-tooltip`).withFlexibleDimensions(!1).withViewportMargin(this._viewportMargin).withScrollableContainers(i).withPopoverLocation(\"global\");return o.positionChanges.pipe(Bt(this._destroyed)).subscribe(a=>{this._updateCurrentPositionClass(a.connectionPair),this._tooltipInstance&&a.scrollableViewProperties.isOverlayClipped&&this._tooltipInstance.isVisible()&&this._ngZone.run(()=>this.hide(0))}),this._overlayRef=Rl(this._injector,{direction:this._dir,positionStrategy:o,panelClass:this._overlayPanelClass?[...this._overlayPanelClass,n]:n,scrollStrategy:this._injector.get(scA)(),disableAnimations:this._animationsDisabled,eventPredicate:this._overlayEventPredicate}),this._updatePosition(this._overlayRef),this._overlayRef.detachments().pipe(Bt(this._destroyed)).subscribe(()=>this._detach()),this._overlayRef.outsidePointerEvents().pipe(Bt(this._destroyed)).subscribe(()=>this._tooltipInstance?._handleBodyInteraction()),this._overlayRef.keydownEvents().pipe(Bt(this._destroyed)).subscribe(a=>{a.preventDefault(),a.stopPropagation(),this._ngZone.run(()=>this.hide(0))}),this._defaultOptions?.disableTooltipInteractivity&&this._overlayRef.addPanelClass(`${this._cssClassPrefix}-tooltip-panel-non-interactive`),this._dirSubscribed||(this._dirSubscribed=!0,this._dir.change.pipe(Bt(this._destroyed)).subscribe(()=>{this._overlayRef&&this._updatePosition(this._overlayRef)})),this._overlayRef}_detach(){this._overlayRef&&this._overlayRef.hasAttached()&&this._overlayRef.detach(),this._tooltipInstance=null}_updatePosition(A){let i=A.getConfig().positionStrategy,n=this._getOrigin(),o=this._getOverlayPosition();i.withPositions([this._addOffset(BA(BA({},n.main),o.main)),this._addOffset(BA(BA({},n.fallback),o.fallback))])}_addOffset(A){let i=CcA,n=!this._dir||this._dir.value==\"ltr\";return A.originY===\"top\"?A.offsetY=-i:A.originY===\"bottom\"?A.offsetY=i:A.originX===\"start\"?A.offsetX=n?-i:i:A.originX===\"end\"&&(A.offsetX=n?i:-i),A}_getOrigin(){let A=!this._dir||this._dir.value==\"ltr\",i=this.position,n;i==\"above\"||i==\"below\"?n={originX:\"center\",originY:i==\"above\"?\"top\":\"bottom\"}:i==\"before\"||i==\"left\"&&A||i==\"right\"&&!A?n={originX:\"start\",originY:\"center\"}:(i==\"after\"||i==\"right\"&&A||i==\"left\"&&!A)&&(n={originX:\"end\",originY:\"center\"});let{x:o,y:a}=this._invertPosition(n.originX,n.originY);return{main:n,fallback:{originX:o,originY:a}}}_getOverlayPosition(){let A=!this._dir||this._dir.value==\"ltr\",i=this.position,n;i==\"above\"?n={overlayX:\"center\",overlayY:\"bottom\"}:i==\"below\"?n={overlayX:\"center\",overlayY:\"top\"}:i==\"before\"||i==\"left\"&&A||i==\"right\"&&!A?n={overlayX:\"end\",overlayY:\"center\"}:(i==\"after\"||i==\"right\"&&A||i==\"left\"&&!A)&&(n={overlayX:\"start\",overlayY:\"center\"});let{x:o,y:a}=this._invertPosition(n.overlayX,n.overlayY);return{main:n,fallback:{overlayX:o,overlayY:a}}}_updateTooltipMessage(){this._tooltipInstance&&(this._tooltipInstance.message=this.message,this._tooltipInstance._markForCheck(),Nn(()=>{this._tooltipInstance&&this._overlayRef.updatePosition()},{injector:this._injector}))}_setTooltipClass(A){this._tooltipInstance&&(this._tooltipInstance.tooltipClass=A instanceof Set?Array.from(A):A,this._tooltipInstance._markForCheck())}_invertPosition(A,i){return this.position===\"above\"||this.position===\"below\"?i===\"top\"?i=\"bottom\":i===\"bottom\"&&(i=\"top\"):A===\"end\"?A=\"start\":A===\"start\"&&(A=\"end\"),{x:A,y:i}}_updateCurrentPositionClass(A){let{overlayY:i,originX:n,originY:o}=A,a;if(i===\"center\"?this._dir&&this._dir.value===\"rtl\"?a=n===\"end\"?\"left\":\"right\":a=n===\"start\"?\"left\":\"right\":a=i===\"bottom\"&&o===\"top\"?\"above\":\"below\",a!==this._currentPosition){let r=this._overlayRef;if(r){let s=`${this._cssClassPrefix}-${mJ}-`;r.removePanelClass(s+this._currentPosition),r.addPanelClass(s+a)}this._currentPosition=a}}_setupPointerEnterEventsIfNeeded(){this._disabled||!this.message||!this._viewInitialized||this._eventCleanups.length||(this._isTouchPlatform()?this.touchGestures!==\"off\"&&(this._disableNativeGesturesIfNecessary(),this._addListener(\"touchstart\",A=>{let i=A.targetTouches?.[0],n=i?{x:i.clientX,y:i.clientY}:void 0;this._setupPointerExitEventsIfNeeded(),this._touchstartTimeout&&clearTimeout(this._touchstartTimeout);let o=500;this._touchstartTimeout=setTimeout(()=>{this._touchstartTimeout=null,this.show(void 0,n)},this._defaultOptions?.touchLongPressShowDelay??o)})):this._addListener(\"mouseenter\",A=>{this._setupPointerExitEventsIfNeeded();let i;A.x!==void 0&&A.y!==void 0&&(i=A),this.show(void 0,i)}))}_setupPointerExitEventsIfNeeded(){if(!this._pointerExitEventsInitialized){if(this._pointerExitEventsInitialized=!0,!this._isTouchPlatform())this._addListener(\"mouseleave\",A=>{let i=A.relatedTarget;(!i||!this._overlayRef?.overlayElement.contains(i))&&this.hide()}),this._addListener(\"wheel\",A=>{if(this._isTooltipVisible()){let i=this._document.elementFromPoint(A.clientX,A.clientY),n=this._elementRef.nativeElement;i!==n&&!n.contains(i)&&this.hide()}});else if(this.touchGestures!==\"off\"){this._disableNativeGesturesIfNecessary();let A=()=>{this._touchstartTimeout&&clearTimeout(this._touchstartTimeout),this.hide(this._defaultOptions?.touchendHideDelay)};this._addListener(\"touchend\",A),this._addListener(\"touchcancel\",A)}}}_addListener(A,i){this._eventCleanups.push(this._renderer.listen(this._elementRef.nativeElement,A,i,lcA))}_isTouchPlatform(){return this._platform.IOS||this._platform.ANDROID?!0:this._platform.isBrowser?!!this._defaultOptions?.detectHoverCapability&&this._mediaMatcher.matchMedia(\"(any-hover: none)\").matches:!1}_disableNativeGesturesIfNecessary(){let A=this.touchGestures;if(A!==\"off\"){let i=this._elementRef.nativeElement,n=i.style;(A===\"on\"||i.nodeName!==\"INPUT\"&&i.nodeName!==\"TEXTAREA\")&&(n.userSelect=n.msUserSelect=n.webkitUserSelect=n.MozUserSelect=\"none\"),(A===\"on\"||!i.draggable)&&(n.webkitUserDrag=\"none\"),n.touchAction=\"none\",n.webkitTapHighlightColor=\"transparent\"}}_syncAriaDescription(A){this._ariaDescriptionPending||(this._ariaDescriptionPending=!0,this._ariaDescriber.removeDescription(this._elementRef.nativeElement,A,\"tooltip\"),this._isDestroyed||Nn({write:()=>{this._ariaDescriptionPending=!1,this.message&&!this.disabled&&this._ariaDescriber.describe(this._elementRef.nativeElement,this.message,\"tooltip\")}},{injector:this._injector}))}_overlayEventPredicate=A=>A.type===\"keydown\"?this._isTooltipVisible()&&A.keyCode===27&&!aa(A):!0;static \\u0275fac=function(i){return new(i||t)};static \\u0275dir=OA({type:t,selectors:[[\"\",\"matTooltip\",\"\"]],hostAttrs:[1,\"mat-mdc-tooltip-trigger\"],hostVars:2,hostBindings:function(i,n){i&2&&ae(\"mat-mdc-tooltip-disabled\",n.disabled)},inputs:{position:[0,\"matTooltipPosition\",\"position\"],positionAtOrigin:[0,\"matTooltipPositionAtOrigin\",\"positionAtOrigin\"],disabled:[0,\"matTooltipDisabled\",\"disabled\"],showDelay:[0,\"matTooltipShowDelay\",\"showDelay\"],hideDelay:[0,\"matTooltipHideDelay\",\"hideDelay\"],touchGestures:[0,\"matTooltipTouchGestures\",\"touchGestures\"],message:[0,\"matTooltip\",\"message\"],tooltipClass:[0,\"matTooltipClass\",\"tooltipClass\"]},exportAs:[\"matTooltip\"]})}return t})(),pJ=(()=>{class t{_changeDetectorRef=h(ft);_elementRef=h(ge);_isMultiline=!1;message;tooltipClass;_showTimeoutId;_hideTimeoutId;_triggerElement;_mouseLeaveHideDelay;_animationsDisabled=Oi();_tooltip;_closeOnInteraction=!1;_isVisible=!1;_onHide=new $A;_showAnimation=\"mat-mdc-tooltip-show\";_hideAnimation=\"mat-mdc-tooltip-hide\";constructor(){}show(A){this._hideTimeoutId!=null&&clearTimeout(this._hideTimeoutId),this._showTimeoutId=setTimeout(()=>{this._toggleVisibility(!0),this._showTimeoutId=void 0},A)}hide(A){this._showTimeoutId!=null&&clearTimeout(this._showTimeoutId),this._hideTimeoutId=setTimeout(()=>{this._toggleVisibility(!1),this._hideTimeoutId=void 0},A)}afterHidden(){return this._onHide}isVisible(){return this._isVisible}ngOnDestroy(){this._cancelPendingAnimations(),this._onHide.complete(),this._triggerElement=null}_handleBodyInteraction(){this._closeOnInteraction&&this.hide(0)}_markForCheck(){this._changeDetectorRef.markForCheck()}_handleMouseLeave({relatedTarget:A}){(!A||!this._triggerElement.contains(A))&&(this.isVisible()?this.hide(this._mouseLeaveHideDelay):this._finalizeAnimation(!1))}_onShow(){this._isMultiline=this._isTooltipMultiline(),this._markForCheck()}_isTooltipMultiline(){let A=this._elementRef.nativeElement.getBoundingClientRect();return A.height>IcA&&A.width>=dcA}_handleAnimationEnd({animationName:A}){(A===this._showAnimation||A===this._hideAnimation)&&this._finalizeAnimation(A===this._showAnimation)}_cancelPendingAnimations(){this._showTimeoutId!=null&&clearTimeout(this._showTimeoutId),this._hideTimeoutId!=null&&clearTimeout(this._hideTimeoutId),this._showTimeoutId=this._hideTimeoutId=void 0}_finalizeAnimation(A){A?this._closeOnInteraction=!0:this.isVisible()||this._onHide.next()}_toggleVisibility(A){let i=this._tooltip.nativeElement,n=this._showAnimation,o=this._hideAnimation;if(i.classList.remove(A?o:n),i.classList.add(A?n:o),this._isVisible!==A&&(this._isVisible=A,this._changeDetectorRef.markForCheck()),A&&!this._animationsDisabled&&typeof getComputedStyle==\"function\"){let a=getComputedStyle(i);(a.getPropertyValue(\"animation-duration\")===\"0s\"||a.getPropertyValue(\"animation-name\")===\"none\")&&(this._animationsDisabled=!0)}A&&this._onShow(),this._animationsDisabled&&(i.classList.add(\"_mat-animation-noopable\"),this._finalizeAnimation(A))}static \\u0275fac=function(i){return new(i||t)};static \\u0275cmp=kA({type:t,selectors:[[\"mat-tooltip-component\"]],viewQuery:function(i,n){if(i&1&&ni(acA,7),i&2){let o;Ce(o=Ie())&&(n._tooltip=o.first)}},hostAttrs:[\"aria-hidden\",\"true\"],hostBindings:function(i,n){i&1&&$(\"mouseleave\",function(a){return n._handleMouseLeave(a)})},decls:4,vars:5,consts:[[\"tooltip\",\"\"],[1,\"mdc-tooltip\",\"mat-mdc-tooltip\",3,\"animationend\"],[1,\"mat-mdc-tooltip-surface\",\"mdc-tooltip__surface\"]],template:function(i,n){i&1&&(ti(0,\"div\",1,0),pc(\"animationend\",function(a){return n._handleAnimationEnd(a)}),ti(2,\"div\",2),K(3),Ii()()),i&2&&(Qo(n.tooltipClass),ae(\"mdc-tooltip--multiline\",n._isMultiline),p(3),qA(n.message))},styles:[`.mat-mdc-tooltip{position:relative;transform:scale(0);display:inline-flex}.mat-mdc-tooltip::before{content:\"\";top:0;right:0;bottom:0;left:0;z-index:-1;position:absolute}.mat-mdc-tooltip-panel-below .mat-mdc-tooltip::before{top:-8px}.mat-mdc-tooltip-panel-above .mat-mdc-tooltip::before{bottom:-8px}.mat-mdc-tooltip-panel-right .mat-mdc-tooltip::before{left:-8px}.mat-mdc-tooltip-panel-left .mat-mdc-tooltip::before{right:-8px}.mat-mdc-tooltip._mat-animation-noopable{animation:none;transform:scale(1)}.mat-mdc-tooltip-surface{word-break:normal;overflow-wrap:anywhere;padding:4px 8px;min-width:40px;max-width:200px;min-height:24px;max-height:40vh;box-sizing:border-box;overflow:hidden;text-align:center;will-change:transform,opacity;background-color:var(--mat-tooltip-container-color, var(--mat-sys-inverse-surface));color:var(--mat-tooltip-supporting-text-color, var(--mat-sys-inverse-on-surface));border-radius:var(--mat-tooltip-container-shape, var(--mat-sys-corner-extra-small));font-family:var(--mat-tooltip-supporting-text-font, var(--mat-sys-body-small-font));font-size:var(--mat-tooltip-supporting-text-size, var(--mat-sys-body-small-size));font-weight:var(--mat-tooltip-supporting-text-weight, var(--mat-sys-body-small-weight));line-height:var(--mat-tooltip-supporting-text-line-height, var(--mat-sys-body-small-line-height));letter-spacing:var(--mat-tooltip-supporting-text-tracking, var(--mat-sys-body-small-tracking))}.mat-mdc-tooltip-surface::before{position:absolute;box-sizing:border-box;width:100%;height:100%;top:0;left:0;border:1px solid rgba(0,0,0,0);border-radius:inherit;content:\"\";pointer-events:none}.mdc-tooltip--multiline .mat-mdc-tooltip-surface{text-align:left}[dir=rtl] .mdc-tooltip--multiline .mat-mdc-tooltip-surface{text-align:right}.mat-mdc-tooltip-panel{line-height:normal}.mat-mdc-tooltip-panel.mat-mdc-tooltip-panel-non-interactive{pointer-events:none}@keyframes mat-mdc-tooltip-show{0%{opacity:0;transform:scale(0.8)}100%{opacity:1;transform:scale(1)}}@keyframes mat-mdc-tooltip-hide{0%{opacity:1;transform:scale(1)}100%{opacity:0;transform:scale(0.8)}}.mat-mdc-tooltip-show{animation:mat-mdc-tooltip-show 150ms cubic-bezier(0, 0, 0.2, 1) forwards}.mat-mdc-tooltip-hide{animation:mat-mdc-tooltip-hide 75ms cubic-bezier(0.4, 0, 1, 1) forwards}\n`],encapsulation:2,changeDetection:0})}return t})();var WC=(()=>{class t{static \\u0275fac=function(i){return new(i||t)};static \\u0275mod=Xe({type:t});static \\u0275inj=Ze({imports:[ch,Kg,Fi,Fc]})}return t})();function BcA(t,e){if(t&1&&(m(0,\"mat-option\",17),K(1),D()),t&2){let A=e.$implicit;X(\"value\",A),p(),Fe(\" \",A,\" \")}}function QcA(t,e){if(t&1){let A=zA();m(0,\"mat-form-field\",14)(1,\"mat-select\",16,0),$(\"selectionChange\",function(n){rA(A);let o=y(2);return sA(o._changePageSize(n.value))}),Gt(3,BcA,2,2,\"mat-option\",17,Ri),D(),m(5,\"div\",18),$(\"click\",function(){rA(A);let n=Wi(2);return sA(n.open())}),D()()}if(t&2){let A=y(2);X(\"appearance\",A._formFieldAppearance)(\"color\",A.color),p(),X(\"value\",A.pageSize)(\"disabled\",A.disabled),Df(\"aria-labelledby\",A._pageSizeLabelId),X(\"panelClass\",A.selectConfig.panelClass||\"\")(\"disableOptionCentering\",A.selectConfig.disableOptionCentering),p(2),Kt(A._displayedPageSizeOptions)}}function EcA(t,e){if(t&1&&(m(0,\"div\",15),K(1),D()),t&2){let A=y(2);p(),qA(A.pageSize)}}function hcA(t,e){if(t&1&&(m(0,\"div\",3)(1,\"div\",13),K(2),D(),V(3,QcA,6,7,\"mat-form-field\",14),V(4,EcA,2,1,\"div\",15),D()),t&2){let A=y();p(),ie(\"id\",A._pageSizeLabelId),p(),Fe(\" \",A._intl.itemsPerPageLabel,\" \"),p(),W(A._displayedPageSizeOptions.length>1?3:-1),p(),W(A._displayedPageSizeOptions.length<=1?4:-1)}}function ucA(t,e){if(t&1){let A=zA();m(0,\"button\",19),$(\"click\",function(){rA(A);let n=y();return sA(n._buttonClicked(0,n._previousButtonsDisabled()))}),Qt(),m(1,\"svg\",8),GA(2,\"path\",20),D()()}if(t&2){let A=y();X(\"matTooltip\",A._intl.firstPageLabel)(\"matTooltipDisabled\",A._previousButtonsDisabled())(\"disabled\",A._previousButtonsDisabled())(\"tabindex\",A._previousButtonsDisabled()?-1:null),ie(\"aria-label\",A._intl.firstPageLabel)}}function fcA(t,e){if(t&1){let A=zA();m(0,\"button\",21),$(\"click\",function(){rA(A);let n=y();return sA(n._buttonClicked(n.getNumberOfPages()-1,n._nextButtonsDisabled()))}),Qt(),m(1,\"svg\",8),GA(2,\"path\",22),D()()}if(t&2){let A=y();X(\"matTooltip\",A._intl.lastPageLabel)(\"matTooltipDisabled\",A._nextButtonsDisabled())(\"disabled\",A._nextButtonsDisabled())(\"tabindex\",A._nextButtonsDisabled()?-1:null),ie(\"aria-label\",A._intl.lastPageLabel)}}var bp=(()=>{class t{changes=new $A;itemsPerPageLabel=\"Items per page:\";nextPageLabel=\"Next page\";previousPageLabel=\"Previous page\";firstPageLabel=\"First page\";lastPageLabel=\"Last page\";getRangeLabel=(A,i,n)=>{if(n==0||i==0)return`0 of ${n}`;n=Math.max(n,0);let o=A*i,a=o<n?Math.min(o+i,n):o+i;return`${o+1} \\u2013 ${a} of ${n}`};static \\u0275fac=function(i){return new(i||t)};static \\u0275prov=TA({token:t,factory:t.\\u0275fac,providedIn:\"root\"})}return t})(),mcA=50;var pcA=new wA(\"MAT_PAGINATOR_DEFAULT_OPTIONS\"),DJ=(()=>{class t{_intl=h(bp);_changeDetectorRef=h(ft);_formFieldAppearance;_pageSizeLabelId=h(An).getId(\"mat-paginator-page-size-label-\");_intlChanges;_isInitialized=!1;_initializedStream=new El(1);color;get pageIndex(){return this._pageIndex}set pageIndex(A){this._pageIndex=Math.max(A||0,0),this._changeDetectorRef.markForCheck()}_pageIndex=0;get length(){return this._length}set length(A){this._length=A||0,this._changeDetectorRef.markForCheck()}_length=0;get pageSize(){return this._pageSize}set pageSize(A){this._pageSize=Math.max(A||0,0),this._updateDisplayedPageSizeOptions()}_pageSize;get pageSizeOptions(){return this._pageSizeOptions}set pageSizeOptions(A){this._pageSizeOptions=(A||[]).map(i=>Zi(i,0)),this._updateDisplayedPageSizeOptions()}_pageSizeOptions=[];hidePageSize=!1;showFirstLastButtons=!1;selectConfig={};disabled=!1;page=new WA;_displayedPageSizeOptions;initialized=this._initializedStream;constructor(){let A=this._intl,i=h(pcA,{optional:!0});if(this._intlChanges=A.changes.subscribe(()=>this._changeDetectorRef.markForCheck()),i){let{pageSize:n,pageSizeOptions:o,hidePageSize:a,showFirstLastButtons:r}=i;n!=null&&(this._pageSize=n),o!=null&&(this._pageSizeOptions=o),a!=null&&(this.hidePageSize=a),r!=null&&(this.showFirstLastButtons=r)}this._formFieldAppearance=i?.formFieldAppearance||\"outline\"}ngOnInit(){this._isInitialized=!0,this._updateDisplayedPageSizeOptions(),this._initializedStream.next()}ngOnDestroy(){this._initializedStream.complete(),this._intlChanges.unsubscribe()}nextPage(){this.hasNextPage()&&this._navigate(this.pageIndex+1)}previousPage(){this.hasPreviousPage()&&this._navigate(this.pageIndex-1)}firstPage(){this.hasPreviousPage()&&this._navigate(0)}lastPage(){this.hasNextPage()&&this._navigate(this.getNumberOfPages()-1)}hasPreviousPage(){return this.pageIndex>=1&&this.pageSize!=0}hasNextPage(){let A=this.getNumberOfPages()-1;return this.pageIndex<A&&this.pageSize!=0}getNumberOfPages(){return this.pageSize?Math.ceil(this.length/this.pageSize):0}_changePageSize(A){let i=this.pageIndex*this.pageSize,n=this.pageIndex;this.pageIndex=Math.floor(i/A)||0,this.pageSize=A,this._emitPageEvent(n)}_nextButtonsDisabled(){return this.disabled||!this.hasNextPage()}_previousButtonsDisabled(){return this.disabled||!this.hasPreviousPage()}_updateDisplayedPageSizeOptions(){this._isInitialized&&(this.pageSize||(this._pageSize=this.pageSizeOptions.length!=0?this.pageSizeOptions[0]:mcA),this._displayedPageSizeOptions=this.pageSizeOptions.slice(),this._displayedPageSizeOptions.indexOf(this.pageSize)===-1&&this._displayedPageSizeOptions.push(this.pageSize),this._displayedPageSizeOptions.sort((A,i)=>A-i),this._changeDetectorRef.markForCheck())}_emitPageEvent(A){this.page.emit({previousPageIndex:A,pageIndex:this.pageIndex,pageSize:this.pageSize,length:this.length})}_navigate(A){let i=this.pageIndex;A!==i&&(this.pageIndex=A,this._emitPageEvent(i))}_buttonClicked(A,i){i||this._navigate(A)}static \\u0275fac=function(i){return new(i||t)};static \\u0275cmp=kA({type:t,selectors:[[\"mat-paginator\"]],hostAttrs:[\"role\",\"group\",1,\"mat-mdc-paginator\"],inputs:{color:\"color\",pageIndex:[2,\"pageIndex\",\"pageIndex\",Zi],length:[2,\"length\",\"length\",Zi],pageSize:[2,\"pageSize\",\"pageSize\",Zi],pageSizeOptions:\"pageSizeOptions\",hidePageSize:[2,\"hidePageSize\",\"hidePageSize\",he],showFirstLastButtons:[2,\"showFirstLastButtons\",\"showFirstLastButtons\",he],selectConfig:\"selectConfig\",disabled:[2,\"disabled\",\"disabled\",he]},outputs:{page:\"page\"},exportAs:[\"matPaginator\"],decls:14,vars:14,consts:[[\"selectRef\",\"\"],[1,\"mat-mdc-paginator-outer-container\"],[1,\"mat-mdc-paginator-container\"],[1,\"mat-mdc-paginator-page-size\"],[1,\"mat-mdc-paginator-range-actions\"],[\"aria-atomic\",\"true\",\"aria-live\",\"polite\",\"role\",\"status\",1,\"mat-mdc-paginator-range-label\"],[\"matIconButton\",\"\",\"type\",\"button\",\"matTooltipPosition\",\"above\",\"disabledInteractive\",\"\",1,\"mat-mdc-paginator-navigation-first\",3,\"matTooltip\",\"matTooltipDisabled\",\"disabled\",\"tabindex\"],[\"matIconButton\",\"\",\"type\",\"button\",\"matTooltipPosition\",\"above\",\"disabledInteractive\",\"\",1,\"mat-mdc-paginator-navigation-previous\",3,\"click\",\"matTooltip\",\"matTooltipDisabled\",\"disabled\",\"tabindex\"],[\"viewBox\",\"0 0 24 24\",\"focusable\",\"false\",\"aria-hidden\",\"true\",1,\"mat-mdc-paginator-icon\"],[\"d\",\"M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z\"],[\"matIconButton\",\"\",\"type\",\"button\",\"matTooltipPosition\",\"above\",\"disabledInteractive\",\"\",1,\"mat-mdc-paginator-navigation-next\",3,\"click\",\"matTooltip\",\"matTooltipDisabled\",\"disabled\",\"tabindex\"],[\"d\",\"M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z\"],[\"matIconButton\",\"\",\"type\",\"button\",\"matTooltipPosition\",\"above\",\"disabledInteractive\",\"\",1,\"mat-mdc-paginator-navigation-last\",3,\"matTooltip\",\"matTooltipDisabled\",\"disabled\",\"tabindex\"],[\"aria-hidden\",\"true\",1,\"mat-mdc-paginator-page-size-label\"],[1,\"mat-mdc-paginator-page-size-select\",3,\"appearance\",\"color\"],[1,\"mat-mdc-paginator-page-size-value\"],[\"hideSingleSelectionIndicator\",\"\",3,\"selectionChange\",\"value\",\"disabled\",\"aria-labelledby\",\"panelClass\",\"disableOptionCentering\"],[3,\"value\"],[1,\"mat-mdc-paginator-touch-target\",3,\"click\"],[\"matIconButton\",\"\",\"type\",\"button\",\"matTooltipPosition\",\"above\",\"disabledInteractive\",\"\",1,\"mat-mdc-paginator-navigation-first\",3,\"click\",\"matTooltip\",\"matTooltipDisabled\",\"disabled\",\"tabindex\"],[\"d\",\"M18.41 16.59L13.82 12l4.59-4.59L17 6l-6 6 6 6zM6 6h2v12H6z\"],[\"matIconButton\",\"\",\"type\",\"button\",\"matTooltipPosition\",\"above\",\"disabledInteractive\",\"\",1,\"mat-mdc-paginator-navigation-last\",3,\"click\",\"matTooltip\",\"matTooltipDisabled\",\"disabled\",\"tabindex\"],[\"d\",\"M5.59 7.41L10.18 12l-4.59 4.59L7 18l6-6-6-6zM16 6h2v12h-2z\"]],template:function(i,n){i&1&&(m(0,\"div\",1)(1,\"div\",2),V(2,hcA,5,4,\"div\",3),m(3,\"div\",4)(4,\"div\",5),K(5),D(),V(6,ucA,3,5,\"button\",6),m(7,\"button\",7),$(\"click\",function(){return n._buttonClicked(n.pageIndex-1,n._previousButtonsDisabled())}),Qt(),m(8,\"svg\",8),GA(9,\"path\",9),D()(),Tr(),m(10,\"button\",10),$(\"click\",function(){return n._buttonClicked(n.pageIndex+1,n._nextButtonsDisabled())}),Qt(),m(11,\"svg\",8),GA(12,\"path\",11),D()(),V(13,fcA,3,5,\"button\",12),D()()()),i&2&&(p(2),W(n.hidePageSize?-1:2),p(3),Fe(\" \",n._intl.getRangeLabel(n.pageIndex,n.pageSize,n.length),\" \"),p(),W(n.showFirstLastButtons?6:-1),p(),X(\"matTooltip\",n._intl.previousPageLabel)(\"matTooltipDisabled\",n._previousButtonsDisabled())(\"disabled\",n._previousButtonsDisabled())(\"tabindex\",n._previousButtonsDisabled()?-1:null),ie(\"aria-label\",n._intl.previousPageLabel),p(3),X(\"matTooltip\",n._intl.nextPageLabel)(\"matTooltipDisabled\",n._nextButtonsDisabled())(\"disabled\",n._nextButtonsDisabled())(\"tabindex\",n._nextButtonsDisabled()?-1:null),ie(\"aria-label\",n._intl.nextPageLabel),p(3),W(n.showFirstLastButtons?13:-1))},dependencies:[To,Yg,Mr,Ia,Ba],styles:[`.mat-mdc-paginator{display:block;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;color:var(--mat-paginator-container-text-color, var(--mat-sys-on-surface));background-color:var(--mat-paginator-container-background-color, var(--mat-sys-surface));font-family:var(--mat-paginator-container-text-font, var(--mat-sys-body-small-font));line-height:var(--mat-paginator-container-text-line-height, var(--mat-sys-body-small-line-height));font-size:var(--mat-paginator-container-text-size, var(--mat-sys-body-small-size));font-weight:var(--mat-paginator-container-text-weight, var(--mat-sys-body-small-weight));letter-spacing:var(--mat-paginator-container-text-tracking, var(--mat-sys-body-small-tracking));--mat-form-field-container-height: var(--mat-paginator-form-field-container-height, 40px);--mat-form-field-container-vertical-padding: var(--mat-paginator-form-field-container-vertical-padding, 8px)}.mat-mdc-paginator .mat-mdc-select-value{font-size:var(--mat-paginator-select-trigger-text-size, var(--mat-sys-body-small-size))}.mat-mdc-paginator .mat-mdc-form-field-subscript-wrapper{display:none}.mat-mdc-paginator .mat-mdc-select{line-height:1.5}.mat-mdc-paginator-outer-container{display:flex}.mat-mdc-paginator-container{display:flex;align-items:center;justify-content:flex-end;padding:0 8px;flex-wrap:wrap;width:100%;min-height:var(--mat-paginator-container-size, 56px)}.mat-mdc-paginator-page-size{display:flex;align-items:baseline;margin-right:8px}[dir=rtl] .mat-mdc-paginator-page-size{margin-right:0;margin-left:8px}.mat-mdc-paginator-page-size-label{margin:0 4px}.mat-mdc-paginator-page-size-select{margin:0 4px;width:var(--mat-paginator-page-size-select-width, 84px)}.mat-mdc-paginator-range-label{margin:0 32px 0 24px}.mat-mdc-paginator-range-actions{display:flex;align-items:center}.mat-mdc-paginator-icon{display:inline-block;width:28px;fill:var(--mat-paginator-enabled-icon-color, var(--mat-sys-on-surface-variant))}.mat-mdc-icon-button[aria-disabled] .mat-mdc-paginator-icon{fill:var(--mat-paginator-disabled-icon-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}[dir=rtl] .mat-mdc-paginator-icon{transform:rotate(180deg)}@media(forced-colors: active){.mat-mdc-icon-button[aria-disabled] .mat-mdc-paginator-icon,.mat-mdc-paginator-icon{fill:currentColor}.mat-mdc-paginator-range-actions .mat-mdc-icon-button{outline:solid 1px}.mat-mdc-paginator-range-actions .mat-mdc-icon-button[aria-disabled]{color:GrayText}}.mat-mdc-paginator-touch-target{display:var(--mat-paginator-touch-target-display, block);position:absolute;top:50%;left:50%;width:var(--mat-paginator-page-size-select-width, 84px);height:var(--mat-paginator-page-size-select-touch-target-height, 48px);background-color:rgba(0,0,0,0);transform:translate(-50%, -50%);cursor:pointer}\n`],encapsulation:2,changeDetection:0})}return t})();var wJ=[\"*\"],DcA=[\"content\"],wcA=[[[\"mat-drawer\"]],[[\"mat-drawer-content\"]],\"*\"],ycA=[\"mat-drawer\",\"mat-drawer-content\",\"*\"];function vcA(t,e){if(t&1){let A=zA();m(0,\"div\",1),$(\"click\",function(){rA(A);let n=y();return sA(n._onBackdropClicked())}),D()}if(t&2){let A=y();ae(\"mat-drawer-shown\",A._isShowingBackdrop())}}function bcA(t,e){t&1&&(m(0,\"mat-drawer-content\"),He(1,2),D())}var McA=new wA(\"MAT_DRAWER_DEFAULT_AUTOSIZE\",{providedIn:\"root\",factory:()=>!1}),yJ=new wA(\"MAT_DRAWER_CONTAINER\"),Jb=(()=>{class t extends x0{_platform=h(ci);_changeDetectorRef=h(ft);_container=h(Hb);constructor(){let A=h(ge),i=h(Lc),n=h(Oe);super(A,i,n)}ngAfterContentInit(){this._container._contentMarginChanges.subscribe(()=>{this._changeDetectorRef.markForCheck()})}_shouldBeHidden(){if(this._platform.isBrowser)return!1;let{start:A,end:i}=this._container;return A!=null&&A.mode!==\"over\"&&A.opened||i!=null&&i.mode!==\"over\"&&i.opened}static \\u0275fac=function(i){return new(i||t)};static \\u0275cmp=kA({type:t,selectors:[[\"mat-drawer-content\"]],hostAttrs:[1,\"mat-drawer-content\"],hostVars:6,hostBindings:function(i,n){i&2&&(En(\"margin-left\",n._container._contentMargins.left,\"px\")(\"margin-right\",n._container._contentMargins.right,\"px\"),ae(\"mat-drawer-content-hidden\",n._shouldBeHidden()))},features:[It([{provide:x0,useExisting:t}]),Ct],ngContentSelectors:wJ,decls:1,vars:0,template:function(i,n){i&1&&(Yt(),He(0))},encapsulation:2,changeDetection:0})}return t})(),Yb=(()=>{class t{_elementRef=h(ge);_focusTrapFactory=h(gh);_focusMonitor=h(Ha);_platform=h(ci);_ngZone=h(Oe);_renderer=h(ui);_interactivityChecker=h(xd);_doc=h(Zt);_container=h(yJ,{optional:!0});_focusTrap=null;_elementFocusedBeforeDrawerWasOpened=null;_eventCleanups;_isAttached=!1;_anchor=null;get position(){return this._position}set position(A){A=A===\"end\"?\"end\":\"start\",A!==this._position&&(this._isAttached&&this._updatePositionInParent(A),this._position=A,this.onPositionChanged.emit())}_position=\"start\";get mode(){return this._mode}set mode(A){this._mode=A,this._updateFocusTrapState(),this._modeChanged.next()}_mode=\"over\";get disableClose(){return this._disableClose}set disableClose(A){this._disableClose=sr(A)}_disableClose=!1;get autoFocus(){let A=this._autoFocus;return A??(this.mode===\"side\"?\"dialog\":\"first-tabbable\")}set autoFocus(A){(A===\"true\"||A===\"false\"||A==null)&&(A=sr(A)),this._autoFocus=A}_autoFocus;get opened(){return this._opened()}set opened(A){this.toggle(sr(A))}_opened=jA(!1);_openedVia=null;_animationStarted=new $A;_animationEnd=new $A;openedChange=new WA(!0);_openedStream=this.openedChange.pipe(We(A=>A),fe(()=>{}));openedStart=this._animationStarted.pipe(We(()=>this.opened),VE(void 0));_closedStream=this.openedChange.pipe(We(A=>!A),fe(()=>{}));closedStart=this._animationStarted.pipe(We(()=>!this.opened),VE(void 0));_destroyed=new $A;onPositionChanged=new WA;_content;_modeChanged=new $A;_injector=h(ut);_changeDetectorRef=h(ft);constructor(){this.openedChange.pipe(Bt(this._destroyed)).subscribe(A=>{A?(this._elementFocusedBeforeDrawerWasOpened=this._doc.activeElement,this._takeFocus()):this._isFocusWithinDrawer()&&this._restoreFocus(this._openedVia||\"program\")}),this._eventCleanups=this._ngZone.runOutsideAngular(()=>{let A=this._renderer,i=this._elementRef.nativeElement;return[A.listen(i,\"keydown\",n=>{n.keyCode===27&&!this.disableClose&&!aa(n)&&this._ngZone.run(()=>{this.close(),n.stopPropagation(),n.preventDefault()})}),A.listen(i,\"transitionrun\",this._handleTransitionEvent),A.listen(i,\"transitionend\",this._handleTransitionEvent),A.listen(i,\"transitioncancel\",this._handleTransitionEvent)]}),this._animationEnd.subscribe(()=>{this.openedChange.emit(this.opened)})}_forceFocus(A,i){this._interactivityChecker.isFocusable(A)||(A.tabIndex=-1,this._ngZone.runOutsideAngular(()=>{let n=()=>{o(),a(),A.removeAttribute(\"tabindex\")},o=this._renderer.listen(A,\"blur\",n),a=this._renderer.listen(A,\"mousedown\",n)})),A.focus(i)}_focusByCssSelector(A,i){let n=this._elementRef.nativeElement.querySelector(A);n&&this._forceFocus(n,i)}_takeFocus(){if(!this._focusTrap)return;let A=this._elementRef.nativeElement;switch(this.autoFocus){case!1:case\"dialog\":return;case!0:case\"first-tabbable\":Nn(()=>{!this._focusTrap.focusInitialElement()&&typeof A.focus==\"function\"&&A.focus()},{injector:this._injector});break;case\"first-heading\":this._focusByCssSelector('h1, h2, h3, h4, h5, h6, [role=\"heading\"]');break;default:this._focusByCssSelector(this.autoFocus);break}}_restoreFocus(A){this.autoFocus!==\"dialog\"&&(this._elementFocusedBeforeDrawerWasOpened?this._focusMonitor.focusVia(this._elementFocusedBeforeDrawerWasOpened,A):this._elementRef.nativeElement.blur(),this._elementFocusedBeforeDrawerWasOpened=null)}_isFocusWithinDrawer(){let A=this._doc.activeElement;return!!A&&this._elementRef.nativeElement.contains(A)}ngAfterViewInit(){this._isAttached=!0,this._position===\"end\"&&this._updatePositionInParent(\"end\"),this._platform.isBrowser&&(this._focusTrap=this._focusTrapFactory.create(this._elementRef.nativeElement),this._updateFocusTrapState())}ngOnDestroy(){this._eventCleanups.forEach(A=>A()),this._focusTrap?.destroy(),this._anchor?.remove(),this._anchor=null,this._animationStarted.complete(),this._animationEnd.complete(),this._modeChanged.complete(),this._destroyed.next(),this._destroyed.complete()}open(A){return this.toggle(!0,A)}close(){return this.toggle(!1)}_closeViaBackdropClick(){return this._setOpen(!1,!0,\"mouse\")}toggle(A=!this.opened,i){A&&i&&(this._openedVia=i);let n=this._setOpen(A,!A&&this._isFocusWithinDrawer(),this._openedVia||\"program\");return A||(this._openedVia=null),n}_setOpen(A,i,n){return A===this.opened?Promise.resolve(A?\"open\":\"close\"):(this._opened.set(A),this._container?._transitionsEnabled?this._setIsAnimating(!0):setTimeout(()=>{this._animationStarted.next(),this._animationEnd.next()}),this._elementRef.nativeElement.classList.toggle(\"mat-drawer-opened\",A),!A&&i&&this._restoreFocus(n),this._changeDetectorRef.markForCheck(),this._updateFocusTrapState(),new Promise(o=>{this.openedChange.pipe(qn(1)).subscribe(a=>o(a?\"open\":\"close\"))}))}_setIsAnimating(A){this._elementRef.nativeElement.classList.toggle(\"mat-drawer-animating\",A)}_getWidth(){return this._elementRef.nativeElement.offsetWidth||0}_updateFocusTrapState(){this._focusTrap&&(this._focusTrap.enabled=this.opened&&!!this._container?._isShowingBackdrop())}_updatePositionInParent(A){if(!this._platform.isBrowser)return;let i=this._elementRef.nativeElement,n=i.parentNode;A===\"end\"?(this._anchor||(this._anchor=this._doc.createComment(\"mat-drawer-anchor\"),n.insertBefore(this._anchor,i)),n.appendChild(i)):this._anchor&&this._anchor.parentNode.insertBefore(i,this._anchor)}_handleTransitionEvent=A=>{let i=this._elementRef.nativeElement;A.target===i&&this._ngZone.run(()=>{A.type===\"transitionrun\"?this._animationStarted.next(A):(A.type===\"transitionend\"&&this._setIsAnimating(!1),this._animationEnd.next(A))})};static \\u0275fac=function(i){return new(i||t)};static \\u0275cmp=kA({type:t,selectors:[[\"mat-drawer\"]],viewQuery:function(i,n){if(i&1&&ni(DcA,5),i&2){let o;Ce(o=Ie())&&(n._content=o.first)}},hostAttrs:[1,\"mat-drawer\"],hostVars:12,hostBindings:function(i,n){i&2&&(ie(\"align\",null)(\"tabIndex\",n.mode!==\"side\"?\"-1\":null),En(\"visibility\",!n._container&&!n.opened?\"hidden\":null),ae(\"mat-drawer-end\",n.position===\"end\")(\"mat-drawer-over\",n.mode===\"over\")(\"mat-drawer-push\",n.mode===\"push\")(\"mat-drawer-side\",n.mode===\"side\"))},inputs:{position:\"position\",mode:\"mode\",disableClose:\"disableClose\",autoFocus:\"autoFocus\",opened:\"opened\"},outputs:{openedChange:\"openedChange\",_openedStream:\"opened\",openedStart:\"openedStart\",_closedStream:\"closed\",closedStart:\"closedStart\",onPositionChanged:\"positionChanged\"},exportAs:[\"matDrawer\"],ngContentSelectors:wJ,decls:3,vars:0,consts:[[\"content\",\"\"],[\"cdkScrollable\",\"\",1,\"mat-drawer-inner-container\"]],template:function(i,n){i&1&&(Yt(),m(0,\"div\",1,0),He(2),D())},dependencies:[x0],encapsulation:2,changeDetection:0})}return t})(),Hb=(()=>{class t{_dir=h(wo,{optional:!0});_element=h(ge);_ngZone=h(Oe);_changeDetectorRef=h(ft);_animationDisabled=Oi();_transitionsEnabled=!1;_allDrawers;_drawers=new Sg;_content;_userContent;get start(){return this._start}get end(){return this._end}get autosize(){return this._autosize}set autosize(A){this._autosize=sr(A)}_autosize=h(McA);get hasBackdrop(){return this._drawerHasBackdrop(this._start)||this._drawerHasBackdrop(this._end)}set hasBackdrop(A){this._backdropOverride=A==null?null:sr(A)}_backdropOverride=null;backdropClick=new WA;_start=null;_end=null;_left=null;_right=null;_destroyed=new $A;_doCheckSubject=new $A;_contentMargins={left:null,right:null};_contentMarginChanges=new $A;get scrollable(){return this._userContent||this._content}_injector=h(ut);constructor(){let A=h(ci),i=h(Bs);this._dir?.change.pipe(Bt(this._destroyed)).subscribe(()=>{this._validateDrawers(),this.updateContentMargins()}),i.change().pipe(Bt(this._destroyed)).subscribe(()=>this.updateContentMargins()),!this._animationDisabled&&A.isBrowser&&this._ngZone.runOutsideAngular(()=>{setTimeout(()=>{this._element.nativeElement.classList.add(\"mat-drawer-transition\"),this._transitionsEnabled=!0},200)})}ngAfterContentInit(){this._allDrawers.changes.pipe(nn(this._allDrawers),Bt(this._destroyed)).subscribe(A=>{this._drawers.reset(A.filter(i=>!i._container||i._container===this)),this._drawers.notifyOnChanges()}),this._drawers.changes.pipe(nn(null)).subscribe(()=>{this._validateDrawers(),this._drawers.forEach(A=>{this._watchDrawerToggle(A),this._watchDrawerPosition(A),this._watchDrawerMode(A)}),(!this._drawers.length||this._isDrawerOpen(this._start)||this._isDrawerOpen(this._end))&&this.updateContentMargins(),this._changeDetectorRef.markForCheck()}),this._ngZone.runOutsideAngular(()=>{this._doCheckSubject.pipe(ps(10),Bt(this._destroyed)).subscribe(()=>this.updateContentMargins())})}ngOnDestroy(){this._contentMarginChanges.complete(),this._doCheckSubject.complete(),this._drawers.destroy(),this._destroyed.next(),this._destroyed.complete()}open(){this._drawers.forEach(A=>A.open())}close(){this._drawers.forEach(A=>A.close())}updateContentMargins(){let A=0,i=0;if(this._left&&this._left.opened){if(this._left.mode==\"side\")A+=this._left._getWidth();else if(this._left.mode==\"push\"){let n=this._left._getWidth();A+=n,i-=n}}if(this._right&&this._right.opened){if(this._right.mode==\"side\")i+=this._right._getWidth();else if(this._right.mode==\"push\"){let n=this._right._getWidth();i+=n,A-=n}}A=A||null,i=i||null,(A!==this._contentMargins.left||i!==this._contentMargins.right)&&(this._contentMargins={left:A,right:i},this._ngZone.run(()=>this._contentMarginChanges.next(this._contentMargins)))}ngDoCheck(){this._autosize&&this._isPushed()&&this._ngZone.runOutsideAngular(()=>this._doCheckSubject.next())}_watchDrawerToggle(A){A._animationStarted.pipe(Bt(this._drawers.changes)).subscribe(()=>{this.updateContentMargins(),this._changeDetectorRef.markForCheck()}),A.mode!==\"side\"&&A.openedChange.pipe(Bt(this._drawers.changes)).subscribe(()=>this._setContainerClass(A.opened))}_watchDrawerPosition(A){A.onPositionChanged.pipe(Bt(this._drawers.changes)).subscribe(()=>{Nn({read:()=>this._validateDrawers()},{injector:this._injector})})}_watchDrawerMode(A){A._modeChanged.pipe(Bt(Qi(this._drawers.changes,this._destroyed))).subscribe(()=>{this.updateContentMargins(),this._changeDetectorRef.markForCheck()})}_setContainerClass(A){let i=this._element.nativeElement.classList,n=\"mat-drawer-container-has-open\";A?i.add(n):i.remove(n)}_validateDrawers(){this._start=this._end=null,this._drawers.forEach(A=>{A.position==\"end\"?(this._end!=null,this._end=A):(this._start!=null,this._start=A)}),this._right=this._left=null,this._dir&&this._dir.value===\"rtl\"?(this._left=this._end,this._right=this._start):(this._left=this._start,this._right=this._end)}_isPushed(){return this._isDrawerOpen(this._start)&&this._start.mode!=\"over\"||this._isDrawerOpen(this._end)&&this._end.mode!=\"over\"}_onBackdropClicked(){this.backdropClick.emit(),this._closeModalDrawersViaBackdrop()}_closeModalDrawersViaBackdrop(){[this._start,this._end].filter(A=>A&&!A.disableClose&&this._drawerHasBackdrop(A)).forEach(A=>A._closeViaBackdropClick())}_isShowingBackdrop(){return this._isDrawerOpen(this._start)&&this._drawerHasBackdrop(this._start)||this._isDrawerOpen(this._end)&&this._drawerHasBackdrop(this._end)}_isDrawerOpen(A){return A!=null&&A.opened}_drawerHasBackdrop(A){return this._backdropOverride==null?!!A&&A.mode!==\"side\":this._backdropOverride}static \\u0275fac=function(i){return new(i||t)};static \\u0275cmp=kA({type:t,selectors:[[\"mat-drawer-container\"]],contentQueries:function(i,n,o){if(i&1&&na(o,Jb,5)(o,Yb,5),i&2){let a;Ce(a=Ie())&&(n._content=a.first),Ce(a=Ie())&&(n._allDrawers=a)}},viewQuery:function(i,n){if(i&1&&ni(Jb,5),i&2){let o;Ce(o=Ie())&&(n._userContent=o.first)}},hostAttrs:[1,\"mat-drawer-container\"],hostVars:2,hostBindings:function(i,n){i&2&&ae(\"mat-drawer-container-explicit-backdrop\",n._backdropOverride)},inputs:{autosize:\"autosize\",hasBackdrop:\"hasBackdrop\"},outputs:{backdropClick:\"backdropClick\"},exportAs:[\"matDrawerContainer\"],features:[It([{provide:yJ,useExisting:t}])],ngContentSelectors:ycA,decls:4,vars:2,consts:[[1,\"mat-drawer-backdrop\",3,\"mat-drawer-shown\"],[1,\"mat-drawer-backdrop\",3,\"click\"]],template:function(i,n){i&1&&(Yt(wcA),V(0,vcA,1,2,\"div\",0),He(1),He(2,1),V(3,bcA,2,0,\"mat-drawer-content\")),i&2&&(W(n.hasBackdrop?0:-1),p(3),W(n._content?-1:3))},dependencies:[Jb],styles:[`.mat-drawer-container{position:relative;z-index:1;color:var(--mat-sidenav-content-text-color, var(--mat-sys-on-background));background-color:var(--mat-sidenav-content-background-color, var(--mat-sys-background));box-sizing:border-box;display:block;overflow:hidden}.mat-drawer-container[fullscreen]{top:0;left:0;right:0;bottom:0;position:absolute}.mat-drawer-container[fullscreen].mat-drawer-container-has-open{overflow:hidden}.mat-drawer-container.mat-drawer-container-explicit-backdrop .mat-drawer-side{z-index:3}.mat-drawer-container.ng-animate-disabled .mat-drawer-backdrop,.mat-drawer-container.ng-animate-disabled .mat-drawer-content,.ng-animate-disabled .mat-drawer-container .mat-drawer-backdrop,.ng-animate-disabled .mat-drawer-container .mat-drawer-content{transition:none}.mat-drawer-backdrop{top:0;left:0;right:0;bottom:0;position:absolute;display:block;z-index:3;visibility:hidden}.mat-drawer-backdrop.mat-drawer-shown{visibility:visible;background-color:var(--mat-sidenav-scrim-color, color-mix(in srgb, var(--mat-sys-neutral-variant20) 40%, transparent))}.mat-drawer-transition .mat-drawer-backdrop{transition-duration:400ms;transition-timing-function:cubic-bezier(0.25, 0.8, 0.25, 1);transition-property:background-color,visibility}@media(forced-colors: active){.mat-drawer-backdrop{opacity:.5}}.mat-drawer-content{position:relative;z-index:1;display:block;height:100%;overflow:auto}.mat-drawer-content.mat-drawer-content-hidden{opacity:0}.mat-drawer-transition .mat-drawer-content{transition-duration:400ms;transition-timing-function:cubic-bezier(0.25, 0.8, 0.25, 1);transition-property:transform,margin-left,margin-right}.mat-drawer{position:relative;z-index:4;color:var(--mat-sidenav-container-text-color, var(--mat-sys-on-surface-variant));box-shadow:var(--mat-sidenav-container-elevation-shadow, none);background-color:var(--mat-sidenav-container-background-color, var(--mat-sys-surface));border-top-right-radius:var(--mat-sidenav-container-shape, var(--mat-sys-corner-large));border-bottom-right-radius:var(--mat-sidenav-container-shape, var(--mat-sys-corner-large));width:var(--mat-sidenav-container-width, 360px);display:block;position:absolute;top:0;bottom:0;z-index:3;outline:0;box-sizing:border-box;overflow-y:auto;transform:translate3d(-100%, 0, 0)}@media(forced-colors: active){.mat-drawer,[dir=rtl] .mat-drawer.mat-drawer-end{border-right:solid 1px currentColor}}@media(forced-colors: active){[dir=rtl] .mat-drawer,.mat-drawer.mat-drawer-end{border-left:solid 1px currentColor;border-right:none}}.mat-drawer.mat-drawer-side{z-index:2}.mat-drawer.mat-drawer-end{right:0;transform:translate3d(100%, 0, 0);border-top-left-radius:var(--mat-sidenav-container-shape, var(--mat-sys-corner-large));border-bottom-left-radius:var(--mat-sidenav-container-shape, var(--mat-sys-corner-large));border-top-right-radius:0;border-bottom-right-radius:0}[dir=rtl] .mat-drawer{border-top-left-radius:var(--mat-sidenav-container-shape, var(--mat-sys-corner-large));border-bottom-left-radius:var(--mat-sidenav-container-shape, var(--mat-sys-corner-large));border-top-right-radius:0;border-bottom-right-radius:0;transform:translate3d(100%, 0, 0)}[dir=rtl] .mat-drawer.mat-drawer-end{border-top-right-radius:var(--mat-sidenav-container-shape, var(--mat-sys-corner-large));border-bottom-right-radius:var(--mat-sidenav-container-shape, var(--mat-sys-corner-large));border-top-left-radius:0;border-bottom-left-radius:0;left:0;right:auto;transform:translate3d(-100%, 0, 0)}.mat-drawer-transition .mat-drawer{transition:transform 400ms cubic-bezier(0.25, 0.8, 0.25, 1)}.mat-drawer:not(.mat-drawer-opened):not(.mat-drawer-animating){visibility:hidden;box-shadow:none}.mat-drawer:not(.mat-drawer-opened):not(.mat-drawer-animating) .mat-drawer-inner-container{display:none}.mat-drawer.mat-drawer-opened.mat-drawer-opened{transform:none}.mat-drawer-side{box-shadow:none;border-right-color:var(--mat-sidenav-container-divider-color, transparent);border-right-width:1px;border-right-style:solid}.mat-drawer-side.mat-drawer-end{border-left-color:var(--mat-sidenav-container-divider-color, transparent);border-left-width:1px;border-left-style:solid;border-right:none}[dir=rtl] .mat-drawer-side{border-left-color:var(--mat-sidenav-container-divider-color, transparent);border-left-width:1px;border-left-style:solid;border-right:none}[dir=rtl] .mat-drawer-side.mat-drawer-end{border-right-color:var(--mat-sidenav-container-divider-color, transparent);border-right-width:1px;border-right-style:solid;border-left:none}.mat-drawer-inner-container{width:100%;height:100%;overflow:auto}.mat-sidenav-fixed{position:fixed}\n`],encapsulation:2,changeDetection:0})}return t})();var kcA=[\"mat-internal-form-field\",\"\"],ScA=[\"*\"],Mp=(()=>{class t{labelPosition=\"after\";static \\u0275fac=function(i){return new(i||t)};static \\u0275cmp=kA({type:t,selectors:[[\"div\",\"mat-internal-form-field\",\"\"]],hostAttrs:[1,\"mdc-form-field\",\"mat-internal-form-field\"],hostVars:2,hostBindings:function(i,n){i&2&&ae(\"mdc-form-field--align-end\",n.labelPosition===\"before\")},inputs:{labelPosition:\"labelPosition\"},attrs:kcA,ngContentSelectors:ScA,decls:1,vars:0,template:function(i,n){i&1&&(Yt(),He(0))},styles:[`.mat-internal-form-field{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-flex;align-items:center;vertical-align:middle}.mat-internal-form-field>label{margin-left:0;margin-right:auto;padding-left:4px;padding-right:0;order:0}[dir=rtl] .mat-internal-form-field>label{margin-left:auto;margin-right:0;padding-left:0;padding-right:4px}.mdc-form-field--align-end>label{margin-left:auto;margin-right:0;padding-left:0;padding-right:4px;order:-1}[dir=rtl] .mdc-form-field--align-end .mdc-form-field--align-end label{margin-left:0;margin-right:auto;padding-left:4px;padding-right:0}\n`],encapsulation:2,changeDetection:0})}return t})();var xcA=[\"switch\"],RcA=[\"*\"];function NcA(t,e){t&1&&(m(0,\"span\",11),Qt(),m(1,\"svg\",13),GA(2,\"path\",14),D(),m(3,\"svg\",15),GA(4,\"path\",16),D()())}var FcA=new wA(\"mat-slide-toggle-default-options\",{providedIn:\"root\",factory:()=>({disableToggleValue:!1,hideIcon:!1,disabledInteractive:!1})}),kp=class{source;checked;constructor(e,A){this.source=e,this.checked=A}},vJ=(()=>{class t{_elementRef=h(ge);_focusMonitor=h(Ha);_changeDetectorRef=h(ft);defaults=h(FcA);_onChange=A=>{};_onTouched=()=>{};_validatorOnChange=()=>{};_uniqueId;_checked=!1;_createChangeEvent(A){return new kp(this,A)}_labelId;get buttonId(){return`${this.id||this._uniqueId}-button`}_switchElement;focus(){this._switchElement.nativeElement.focus()}_noopAnimations=Oi();_focused=!1;name=null;id;labelPosition=\"after\";ariaLabel=null;ariaLabelledby=null;ariaDescribedby;required=!1;color;disabled=!1;disableRipple=!1;tabIndex=0;get checked(){return this._checked}set checked(A){this._checked=A,this._changeDetectorRef.markForCheck()}hideIcon;disabledInteractive;change=new WA;toggleChange=new WA;get inputId(){return`${this.id||this._uniqueId}-input`}constructor(){h(Hn).load(Za);let A=h(new bs(\"tabindex\"),{optional:!0}),i=this.defaults;this.tabIndex=A==null?0:parseInt(A)||0,this.color=i.color||\"accent\",this.id=this._uniqueId=h(An).getId(\"mat-mdc-slide-toggle-\"),this.hideIcon=i.hideIcon??!1,this.disabledInteractive=i.disabledInteractive??!1,this._labelId=this._uniqueId+\"-label\"}ngAfterContentInit(){this._focusMonitor.monitor(this._elementRef,!0).subscribe(A=>{A===\"keyboard\"||A===\"program\"?(this._focused=!0,this._changeDetectorRef.markForCheck()):A||Promise.resolve().then(()=>{this._focused=!1,this._onTouched(),this._changeDetectorRef.markForCheck()})})}ngOnChanges(A){A.required&&this._validatorOnChange()}ngOnDestroy(){this._focusMonitor.stopMonitoring(this._elementRef)}writeValue(A){this.checked=!!A}registerOnChange(A){this._onChange=A}registerOnTouched(A){this._onTouched=A}validate(A){return this.required&&A.value!==!0?{required:!0}:null}registerOnValidatorChange(A){this._validatorOnChange=A}setDisabledState(A){this.disabled=A,this._changeDetectorRef.markForCheck()}toggle(){this.checked=!this.checked,this._onChange(this.checked)}_emitChangeEvent(){this._onChange(this.checked),this.change.emit(this._createChangeEvent(this.checked))}_handleClick(){this.disabled||(this.toggleChange.emit(),this.defaults.disableToggleValue||(this.checked=!this.checked,this._onChange(this.checked),this.change.emit(new kp(this,this.checked))))}_getAriaLabelledBy(){return this.ariaLabelledby?this.ariaLabelledby:this.ariaLabel?null:this._labelId}static \\u0275fac=function(i){return new(i||t)};static \\u0275cmp=kA({type:t,selectors:[[\"mat-slide-toggle\"]],viewQuery:function(i,n){if(i&1&&ni(xcA,5),i&2){let o;Ce(o=Ie())&&(n._switchElement=o.first)}},hostAttrs:[1,\"mat-mdc-slide-toggle\"],hostVars:13,hostBindings:function(i,n){i&2&&(Bo(\"id\",n.id),ie(\"tabindex\",null)(\"aria-label\",null)(\"name\",null)(\"aria-labelledby\",null),Qo(n.color?\"mat-\"+n.color:\"\"),ae(\"mat-mdc-slide-toggle-focused\",n._focused)(\"mat-mdc-slide-toggle-checked\",n.checked)(\"_mat-animation-noopable\",n._noopAnimations))},inputs:{name:\"name\",id:\"id\",labelPosition:\"labelPosition\",ariaLabel:[0,\"aria-label\",\"ariaLabel\"],ariaLabelledby:[0,\"aria-labelledby\",\"ariaLabelledby\"],ariaDescribedby:[0,\"aria-describedby\",\"ariaDescribedby\"],required:[2,\"required\",\"required\",he],color:\"color\",disabled:[2,\"disabled\",\"disabled\",he],disableRipple:[2,\"disableRipple\",\"disableRipple\",he],tabIndex:[2,\"tabIndex\",\"tabIndex\",A=>A==null?0:Zi(A)],checked:[2,\"checked\",\"checked\",he],hideIcon:[2,\"hideIcon\",\"hideIcon\",he],disabledInteractive:[2,\"disabledInteractive\",\"disabledInteractive\",he]},outputs:{change:\"change\",toggleChange:\"toggleChange\"},exportAs:[\"matSlideToggle\"],features:[It([{provide:gg,useExisting:ar(()=>t),multi:!0},{provide:vc,useExisting:t,multi:!0}]),ei],ngContentSelectors:RcA,decls:14,vars:27,consts:[[\"switch\",\"\"],[\"mat-internal-form-field\",\"\",3,\"labelPosition\"],[\"role\",\"switch\",\"type\",\"button\",1,\"mdc-switch\",3,\"click\",\"tabIndex\",\"disabled\"],[1,\"mat-mdc-slide-toggle-touch-target\"],[1,\"mdc-switch__track\"],[1,\"mdc-switch__handle-track\"],[1,\"mdc-switch__handle\"],[1,\"mdc-switch__shadow\"],[1,\"mdc-elevation-overlay\"],[1,\"mdc-switch__ripple\"],[\"mat-ripple\",\"\",1,\"mat-mdc-slide-toggle-ripple\",\"mat-focus-indicator\",3,\"matRippleTrigger\",\"matRippleDisabled\",\"matRippleCentered\"],[1,\"mdc-switch__icons\"],[1,\"mdc-label\",3,\"click\",\"for\"],[\"viewBox\",\"0 0 24 24\",\"aria-hidden\",\"true\",1,\"mdc-switch__icon\",\"mdc-switch__icon--on\"],[\"d\",\"M19.69,5.23L8.96,15.96l-4.23-4.23L2.96,13.5l6,6L21.46,7L19.69,5.23z\"],[\"viewBox\",\"0 0 24 24\",\"aria-hidden\",\"true\",1,\"mdc-switch__icon\",\"mdc-switch__icon--off\"],[\"d\",\"M20 13H4v-2h16v2z\"]],template:function(i,n){if(i&1&&(Yt(),m(0,\"div\",1)(1,\"button\",2,0),$(\"click\",function(){return n._handleClick()}),GA(3,\"div\",3)(4,\"span\",4),m(5,\"span\",5)(6,\"span\",6)(7,\"span\",7),GA(8,\"span\",8),D(),m(9,\"span\",9),GA(10,\"span\",10),D(),V(11,NcA,5,0,\"span\",11),D()()(),m(12,\"label\",12),$(\"click\",function(a){return a.stopPropagation()}),He(13),D()()),i&2){let o=Wi(2);X(\"labelPosition\",n.labelPosition),p(),ae(\"mdc-switch--selected\",n.checked)(\"mdc-switch--unselected\",!n.checked)(\"mdc-switch--checked\",n.checked)(\"mdc-switch--disabled\",n.disabled)(\"mat-mdc-slide-toggle-disabled-interactive\",n.disabledInteractive),X(\"tabIndex\",n.disabled&&!n.disabledInteractive?-1:n.tabIndex)(\"disabled\",n.disabled&&!n.disabledInteractive),ie(\"id\",n.buttonId)(\"name\",n.name)(\"aria-label\",n.ariaLabel)(\"aria-labelledby\",n._getAriaLabelledBy())(\"aria-describedby\",n.ariaDescribedby)(\"aria-required\",n.required||null)(\"aria-checked\",n.checked)(\"aria-disabled\",n.disabled&&n.disabledInteractive?\"true\":null),p(9),X(\"matRippleTrigger\",o)(\"matRippleDisabled\",n.disableRipple||n.disabled)(\"matRippleCentered\",!0),p(),W(n.hideIcon?-1:11),p(),X(\"for\",n.buttonId),ie(\"id\",n._labelId)}},dependencies:[Ns,Mp],styles:[`.mdc-switch{align-items:center;background:none;border:none;cursor:pointer;display:inline-flex;flex-shrink:0;margin:0;outline:none;overflow:visible;padding:0;position:relative;width:var(--mat-slide-toggle-track-width, 52px)}.mdc-switch.mdc-switch--disabled{cursor:default;pointer-events:none}.mdc-switch.mat-mdc-slide-toggle-disabled-interactive{pointer-events:auto}.mdc-switch__track{overflow:hidden;position:relative;width:100%;height:var(--mat-slide-toggle-track-height, 32px);border-radius:var(--mat-slide-toggle-track-shape, var(--mat-sys-corner-full))}.mdc-switch--disabled.mdc-switch .mdc-switch__track{opacity:var(--mat-slide-toggle-disabled-track-opacity, 0.12)}.mdc-switch__track::before,.mdc-switch__track::after{border:1px solid rgba(0,0,0,0);border-radius:inherit;box-sizing:border-box;content:\"\";height:100%;left:0;position:absolute;width:100%;border-width:var(--mat-slide-toggle-track-outline-width, 2px);border-color:var(--mat-slide-toggle-track-outline-color, var(--mat-sys-outline))}.mdc-switch--selected .mdc-switch__track::before,.mdc-switch--selected .mdc-switch__track::after{border-width:var(--mat-slide-toggle-selected-track-outline-width, 2px);border-color:var(--mat-slide-toggle-selected-track-outline-color, transparent)}.mdc-switch--disabled .mdc-switch__track::before,.mdc-switch--disabled .mdc-switch__track::after{border-width:var(--mat-slide-toggle-disabled-unselected-track-outline-width, 2px);border-color:var(--mat-slide-toggle-disabled-unselected-track-outline-color, var(--mat-sys-on-surface))}@media(forced-colors: active){.mdc-switch__track{border-color:currentColor}}.mdc-switch__track::before{transition:transform 75ms 0ms cubic-bezier(0, 0, 0.2, 1);transform:translateX(0);background:var(--mat-slide-toggle-unselected-track-color, var(--mat-sys-surface-variant))}.mdc-switch--selected .mdc-switch__track::before{transition:transform 75ms 0ms cubic-bezier(0.4, 0, 0.6, 1);transform:translateX(100%)}[dir=rtl] .mdc-switch--selected .mdc-switch--selected .mdc-switch__track::before{transform:translateX(-100%)}.mdc-switch--selected .mdc-switch__track::before{opacity:var(--mat-slide-toggle-hidden-track-opacity, 0);transition:var(--mat-slide-toggle-hidden-track-transition, opacity 75ms)}.mdc-switch--unselected .mdc-switch__track::before{opacity:var(--mat-slide-toggle-visible-track-opacity, 1);transition:var(--mat-slide-toggle-visible-track-transition, opacity 75ms)}.mdc-switch:enabled:hover:not(:focus):not(:active) .mdc-switch__track::before{background:var(--mat-slide-toggle-unselected-hover-track-color, var(--mat-sys-surface-variant))}.mdc-switch:enabled:focus:not(:active) .mdc-switch__track::before{background:var(--mat-slide-toggle-unselected-focus-track-color, var(--mat-sys-surface-variant))}.mdc-switch:enabled:active .mdc-switch__track::before{background:var(--mat-slide-toggle-unselected-pressed-track-color, var(--mat-sys-surface-variant))}.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled:hover:not(:focus):not(:active) .mdc-switch__track::before,.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled:focus:not(:active) .mdc-switch__track::before,.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled:active .mdc-switch__track::before,.mdc-switch.mdc-switch--disabled .mdc-switch__track::before{background:var(--mat-slide-toggle-disabled-unselected-track-color, var(--mat-sys-surface-variant))}.mdc-switch__track::after{transform:translateX(-100%);background:var(--mat-slide-toggle-selected-track-color, var(--mat-sys-primary))}[dir=rtl] .mdc-switch__track::after{transform:translateX(100%)}.mdc-switch--selected .mdc-switch__track::after{transform:translateX(0)}.mdc-switch--selected .mdc-switch__track::after{opacity:var(--mat-slide-toggle-visible-track-opacity, 1);transition:var(--mat-slide-toggle-visible-track-transition, opacity 75ms)}.mdc-switch--unselected .mdc-switch__track::after{opacity:var(--mat-slide-toggle-hidden-track-opacity, 0);transition:var(--mat-slide-toggle-hidden-track-transition, opacity 75ms)}.mdc-switch:enabled:hover:not(:focus):not(:active) .mdc-switch__track::after{background:var(--mat-slide-toggle-selected-hover-track-color, var(--mat-sys-primary))}.mdc-switch:enabled:focus:not(:active) .mdc-switch__track::after{background:var(--mat-slide-toggle-selected-focus-track-color, var(--mat-sys-primary))}.mdc-switch:enabled:active .mdc-switch__track::after{background:var(--mat-slide-toggle-selected-pressed-track-color, var(--mat-sys-primary))}.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled:hover:not(:focus):not(:active) .mdc-switch__track::after,.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled:focus:not(:active) .mdc-switch__track::after,.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled:active .mdc-switch__track::after,.mdc-switch.mdc-switch--disabled .mdc-switch__track::after{background:var(--mat-slide-toggle-disabled-selected-track-color, var(--mat-sys-on-surface))}.mdc-switch__handle-track{height:100%;pointer-events:none;position:absolute;top:0;transition:transform 75ms 0ms cubic-bezier(0.4, 0, 0.2, 1);left:0;right:auto;transform:translateX(0);width:calc(100% - var(--mat-slide-toggle-handle-width))}[dir=rtl] .mdc-switch__handle-track{left:auto;right:0}.mdc-switch--selected .mdc-switch__handle-track{transform:translateX(100%)}[dir=rtl] .mdc-switch--selected .mdc-switch__handle-track{transform:translateX(-100%)}.mdc-switch__handle{display:flex;pointer-events:auto;position:absolute;top:50%;transform:translateY(-50%);left:0;right:auto;transition:width 75ms cubic-bezier(0.4, 0, 0.2, 1),height 75ms cubic-bezier(0.4, 0, 0.2, 1),margin 75ms cubic-bezier(0.4, 0, 0.2, 1);width:var(--mat-slide-toggle-handle-width);height:var(--mat-slide-toggle-handle-height);border-radius:var(--mat-slide-toggle-handle-shape, var(--mat-sys-corner-full))}[dir=rtl] .mdc-switch__handle{left:auto;right:0}.mat-mdc-slide-toggle .mdc-switch--unselected .mdc-switch__handle{width:var(--mat-slide-toggle-unselected-handle-size, 16px);height:var(--mat-slide-toggle-unselected-handle-size, 16px);margin:var(--mat-slide-toggle-unselected-handle-horizontal-margin, 0 8px)}.mat-mdc-slide-toggle .mdc-switch--unselected .mdc-switch__handle:has(.mdc-switch__icons){margin:var(--mat-slide-toggle-unselected-with-icon-handle-horizontal-margin, 0 4px)}.mat-mdc-slide-toggle .mdc-switch--selected .mdc-switch__handle{width:var(--mat-slide-toggle-selected-handle-size, 24px);height:var(--mat-slide-toggle-selected-handle-size, 24px);margin:var(--mat-slide-toggle-selected-handle-horizontal-margin, 0 24px)}.mat-mdc-slide-toggle .mdc-switch--selected .mdc-switch__handle:has(.mdc-switch__icons){margin:var(--mat-slide-toggle-selected-with-icon-handle-horizontal-margin, 0 24px)}.mat-mdc-slide-toggle .mdc-switch__handle:has(.mdc-switch__icons){width:var(--mat-slide-toggle-with-icon-handle-size, 24px);height:var(--mat-slide-toggle-with-icon-handle-size, 24px)}.mat-mdc-slide-toggle .mdc-switch:active:not(.mdc-switch--disabled) .mdc-switch__handle{width:var(--mat-slide-toggle-pressed-handle-size, 28px);height:var(--mat-slide-toggle-pressed-handle-size, 28px)}.mat-mdc-slide-toggle .mdc-switch--selected:active:not(.mdc-switch--disabled) .mdc-switch__handle{margin:var(--mat-slide-toggle-selected-pressed-handle-horizontal-margin, 0 22px)}.mat-mdc-slide-toggle .mdc-switch--unselected:active:not(.mdc-switch--disabled) .mdc-switch__handle{margin:var(--mat-slide-toggle-unselected-pressed-handle-horizontal-margin, 0 2px)}.mdc-switch--disabled.mdc-switch--selected .mdc-switch__handle::after{opacity:var(--mat-slide-toggle-disabled-selected-handle-opacity, 1)}.mdc-switch--disabled.mdc-switch--unselected .mdc-switch__handle::after{opacity:var(--mat-slide-toggle-disabled-unselected-handle-opacity, 0.38)}.mdc-switch__handle::before,.mdc-switch__handle::after{border:1px solid rgba(0,0,0,0);border-radius:inherit;box-sizing:border-box;content:\"\";width:100%;height:100%;left:0;position:absolute;top:0;transition:background-color 75ms 0ms cubic-bezier(0.4, 0, 0.2, 1),border-color 75ms 0ms cubic-bezier(0.4, 0, 0.2, 1);z-index:-1}@media(forced-colors: active){.mdc-switch__handle::before,.mdc-switch__handle::after{border-color:currentColor}}.mdc-switch--selected:enabled .mdc-switch__handle::after{background:var(--mat-slide-toggle-selected-handle-color, var(--mat-sys-on-primary))}.mdc-switch--selected:enabled:hover:not(:focus):not(:active) .mdc-switch__handle::after{background:var(--mat-slide-toggle-selected-hover-handle-color, var(--mat-sys-primary-container))}.mdc-switch--selected:enabled:focus:not(:active) .mdc-switch__handle::after{background:var(--mat-slide-toggle-selected-focus-handle-color, var(--mat-sys-primary-container))}.mdc-switch--selected:enabled:active .mdc-switch__handle::after{background:var(--mat-slide-toggle-selected-pressed-handle-color, var(--mat-sys-primary-container))}.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled.mdc-switch--selected:hover:not(:focus):not(:active) .mdc-switch__handle::after,.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled.mdc-switch--selected:focus:not(:active) .mdc-switch__handle::after,.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled.mdc-switch--selected:active .mdc-switch__handle::after,.mdc-switch--selected.mdc-switch--disabled .mdc-switch__handle::after{background:var(--mat-slide-toggle-disabled-selected-handle-color, var(--mat-sys-surface))}.mdc-switch--unselected:enabled .mdc-switch__handle::after{background:var(--mat-slide-toggle-unselected-handle-color, var(--mat-sys-outline))}.mdc-switch--unselected:enabled:hover:not(:focus):not(:active) .mdc-switch__handle::after{background:var(--mat-slide-toggle-unselected-hover-handle-color, var(--mat-sys-on-surface-variant))}.mdc-switch--unselected:enabled:focus:not(:active) .mdc-switch__handle::after{background:var(--mat-slide-toggle-unselected-focus-handle-color, var(--mat-sys-on-surface-variant))}.mdc-switch--unselected:enabled:active .mdc-switch__handle::after{background:var(--mat-slide-toggle-unselected-pressed-handle-color, var(--mat-sys-on-surface-variant))}.mdc-switch--unselected.mdc-switch--disabled .mdc-switch__handle::after{background:var(--mat-slide-toggle-disabled-unselected-handle-color, var(--mat-sys-on-surface))}.mdc-switch__handle::before{background:var(--mat-slide-toggle-handle-surface-color)}.mdc-switch__shadow{border-radius:inherit;bottom:0;left:0;position:absolute;right:0;top:0}.mdc-switch:enabled .mdc-switch__shadow{box-shadow:var(--mat-slide-toggle-handle-elevation-shadow)}.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled:hover:not(:focus):not(:active) .mdc-switch__shadow,.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled:focus:not(:active) .mdc-switch__shadow,.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled:active .mdc-switch__shadow,.mdc-switch.mdc-switch--disabled .mdc-switch__shadow{box-shadow:var(--mat-slide-toggle-disabled-handle-elevation-shadow)}.mdc-switch__ripple{left:50%;position:absolute;top:50%;transform:translate(-50%, -50%);z-index:-1;width:var(--mat-slide-toggle-state-layer-size, 40px);height:var(--mat-slide-toggle-state-layer-size, 40px)}.mdc-switch__ripple::after{content:\"\";opacity:0}.mdc-switch--disabled .mdc-switch__ripple::after{display:none}.mat-mdc-slide-toggle-disabled-interactive .mdc-switch__ripple::after{display:block}.mdc-switch:hover .mdc-switch__ripple::after{transition:75ms opacity cubic-bezier(0, 0, 0.2, 1)}.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled:enabled:focus .mdc-switch__ripple::after,.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled:enabled:active .mdc-switch__ripple::after,.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled:enabled:hover:not(:focus) .mdc-switch__ripple::after,.mdc-switch--unselected:enabled:hover:not(:focus) .mdc-switch__ripple::after{background:var(--mat-slide-toggle-unselected-hover-state-layer-color, var(--mat-sys-on-surface));opacity:var(--mat-slide-toggle-unselected-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mdc-switch--unselected:enabled:focus .mdc-switch__ripple::after{background:var(--mat-slide-toggle-unselected-focus-state-layer-color, var(--mat-sys-on-surface));opacity:var(--mat-slide-toggle-unselected-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mdc-switch--unselected:enabled:active .mdc-switch__ripple::after{background:var(--mat-slide-toggle-unselected-pressed-state-layer-color, var(--mat-sys-on-surface));opacity:var(--mat-slide-toggle-unselected-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity));transition:opacity 75ms linear}.mdc-switch--selected:enabled:hover:not(:focus) .mdc-switch__ripple::after{background:var(--mat-slide-toggle-selected-hover-state-layer-color, var(--mat-sys-primary));opacity:var(--mat-slide-toggle-selected-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mdc-switch--selected:enabled:focus .mdc-switch__ripple::after{background:var(--mat-slide-toggle-selected-focus-state-layer-color, var(--mat-sys-primary));opacity:var(--mat-slide-toggle-selected-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mdc-switch--selected:enabled:active .mdc-switch__ripple::after{background:var(--mat-slide-toggle-selected-pressed-state-layer-color, var(--mat-sys-primary));opacity:var(--mat-slide-toggle-selected-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity));transition:opacity 75ms linear}.mdc-switch__icons{position:relative;height:100%;width:100%;z-index:1;transform:translateZ(0)}.mdc-switch--disabled.mdc-switch--unselected .mdc-switch__icons{opacity:var(--mat-slide-toggle-disabled-unselected-icon-opacity, 0.38)}.mdc-switch--disabled.mdc-switch--selected .mdc-switch__icons{opacity:var(--mat-slide-toggle-disabled-selected-icon-opacity, 0.38)}.mdc-switch__icon{bottom:0;left:0;margin:auto;position:absolute;right:0;top:0;opacity:0;transition:opacity 30ms 0ms cubic-bezier(0.4, 0, 1, 1)}.mdc-switch--unselected .mdc-switch__icon{width:var(--mat-slide-toggle-unselected-icon-size, 16px);height:var(--mat-slide-toggle-unselected-icon-size, 16px);fill:var(--mat-slide-toggle-unselected-icon-color, var(--mat-sys-surface-variant))}.mdc-switch--unselected.mdc-switch--disabled .mdc-switch__icon{fill:var(--mat-slide-toggle-disabled-unselected-icon-color, var(--mat-sys-surface-variant))}.mdc-switch--selected .mdc-switch__icon{width:var(--mat-slide-toggle-selected-icon-size, 16px);height:var(--mat-slide-toggle-selected-icon-size, 16px);fill:var(--mat-slide-toggle-selected-icon-color, var(--mat-sys-on-primary-container))}.mdc-switch--selected.mdc-switch--disabled .mdc-switch__icon{fill:var(--mat-slide-toggle-disabled-selected-icon-color, var(--mat-sys-on-surface))}.mdc-switch--selected .mdc-switch__icon--on,.mdc-switch--unselected .mdc-switch__icon--off{opacity:1;transition:opacity 45ms 30ms cubic-bezier(0, 0, 0.2, 1)}.mat-mdc-slide-toggle{-webkit-user-select:none;user-select:none;display:inline-block;-webkit-tap-highlight-color:rgba(0,0,0,0);outline:0}.mat-mdc-slide-toggle .mat-mdc-slide-toggle-ripple,.mat-mdc-slide-toggle .mdc-switch__ripple::after{top:0;left:0;right:0;bottom:0;position:absolute;border-radius:50%;pointer-events:none}.mat-mdc-slide-toggle .mat-mdc-slide-toggle-ripple:not(:empty),.mat-mdc-slide-toggle .mdc-switch__ripple::after:not(:empty){transform:translateZ(0)}.mat-mdc-slide-toggle.mat-mdc-slide-toggle-focused .mat-focus-indicator::before{content:\"\"}.mat-mdc-slide-toggle .mat-internal-form-field{color:var(--mat-slide-toggle-label-text-color, var(--mat-sys-on-surface));font-family:var(--mat-slide-toggle-label-text-font, var(--mat-sys-body-medium-font));line-height:var(--mat-slide-toggle-label-text-line-height, var(--mat-sys-body-medium-line-height));font-size:var(--mat-slide-toggle-label-text-size, var(--mat-sys-body-medium-size));letter-spacing:var(--mat-slide-toggle-label-text-tracking, var(--mat-sys-body-medium-tracking));font-weight:var(--mat-slide-toggle-label-text-weight, var(--mat-sys-body-medium-weight))}.mat-mdc-slide-toggle .mat-ripple-element{opacity:.12}.mat-mdc-slide-toggle .mat-focus-indicator::before{border-radius:50%}.mat-mdc-slide-toggle._mat-animation-noopable .mdc-switch__handle-track,.mat-mdc-slide-toggle._mat-animation-noopable .mdc-switch__icon,.mat-mdc-slide-toggle._mat-animation-noopable .mdc-switch__handle::before,.mat-mdc-slide-toggle._mat-animation-noopable .mdc-switch__handle::after,.mat-mdc-slide-toggle._mat-animation-noopable .mdc-switch__track::before,.mat-mdc-slide-toggle._mat-animation-noopable .mdc-switch__track::after{transition:none}.mat-mdc-slide-toggle .mdc-switch:enabled+.mdc-label{cursor:pointer}.mat-mdc-slide-toggle .mdc-switch--disabled+label{color:var(--mat-slide-toggle-disabled-label-text-color, var(--mat-sys-on-surface))}.mat-mdc-slide-toggle label:empty{display:none}.mat-mdc-slide-toggle-touch-target{position:absolute;top:50%;left:50%;height:var(--mat-slide-toggle-touch-target-size, 48px);width:100%;transform:translate(-50%, -50%);display:var(--mat-slide-toggle-touch-target-display, block)}[dir=rtl] .mat-mdc-slide-toggle-touch-target{left:auto;right:50%;transform:translate(50%, -50%)}\n`],encapsulation:2,changeDetection:0})}return t})();function LcA(t,e){if(t&1){let A=zA();m(0,\"div\",1)(1,\"button\",2),$(\"click\",function(){rA(A);let n=y();return sA(n.action())}),K(2),D()()}if(t&2){let A=y();p(2),Fe(\" \",A.data.action,\" \")}}var _cA=[\"label\"];function GcA(t,e){}var KcA=Math.pow(2,31)-1,s4=class{_overlayRef;instance;containerInstance;_afterDismissed=new $A;_afterOpened=new $A;_onAction=new $A;_durationTimeoutId;_dismissedByAction=!1;constructor(e,A){this._overlayRef=A,this.containerInstance=e,e._onExit.subscribe(()=>this._finishDismiss())}dismiss(){this._afterDismissed.closed||this.containerInstance.exit(),clearTimeout(this._durationTimeoutId)}dismissWithAction(){this._onAction.closed||(this._dismissedByAction=!0,this._onAction.next(),this._onAction.complete(),this.dismiss()),clearTimeout(this._durationTimeoutId)}closeWithAction(){this.dismissWithAction()}_dismissAfter(e){this._durationTimeoutId=setTimeout(()=>this.dismiss(),Math.min(e,KcA))}_open(){this._afterOpened.closed||(this._afterOpened.next(),this._afterOpened.complete())}_finishDismiss(){this._overlayRef.dispose(),this._onAction.closed||this._onAction.complete(),this._afterDismissed.next({dismissedByAction:this._dismissedByAction}),this._afterDismissed.complete(),this._dismissedByAction=!1}afterDismissed(){return this._afterDismissed}afterOpened(){return this.containerInstance._onEnter}onAction(){return this._onAction}},bJ=new wA(\"MatSnackBarData\"),sB=class{politeness=\"polite\";announcementMessage=\"\";viewContainerRef;duration=0;panelClass;direction;data=null;horizontalPosition=\"center\";verticalPosition=\"bottom\"},UcA=(()=>{class t{static \\u0275fac=function(i){return new(i||t)};static \\u0275dir=OA({type:t,selectors:[[\"\",\"matSnackBarLabel\",\"\"]],hostAttrs:[1,\"mat-mdc-snack-bar-label\",\"mdc-snackbar__label\"]})}return t})(),JcA=(()=>{class t{static \\u0275fac=function(i){return new(i||t)};static \\u0275dir=OA({type:t,selectors:[[\"\",\"matSnackBarActions\",\"\"]],hostAttrs:[1,\"mat-mdc-snack-bar-actions\",\"mdc-snackbar__actions\"]})}return t})(),YcA=(()=>{class t{static \\u0275fac=function(i){return new(i||t)};static \\u0275dir=OA({type:t,selectors:[[\"\",\"matSnackBarAction\",\"\"]],hostAttrs:[1,\"mat-mdc-snack-bar-action\",\"mdc-snackbar__action\"]})}return t})(),HcA=(()=>{class t{snackBarRef=h(s4);data=h(bJ);constructor(){}action(){this.snackBarRef.dismissWithAction()}get hasAction(){return!!this.data.action}static \\u0275fac=function(i){return new(i||t)};static \\u0275cmp=kA({type:t,selectors:[[\"simple-snack-bar\"]],hostAttrs:[1,\"mat-mdc-simple-snack-bar\"],exportAs:[\"matSnackBar\"],decls:3,vars:2,consts:[[\"matSnackBarLabel\",\"\"],[\"matSnackBarActions\",\"\"],[\"matButton\",\"\",\"matSnackBarAction\",\"\",3,\"click\"]],template:function(i,n){i&1&&(m(0,\"div\",0),K(1),D(),V(2,LcA,3,1,\"div\",1)),i&2&&(p(),Fe(\" \",n.data.message,`\n`),p(),W(n.hasAction?2:-1))},dependencies:[vn,UcA,JcA,YcA],styles:[`.mat-mdc-simple-snack-bar{display:flex}.mat-mdc-simple-snack-bar .mat-mdc-snack-bar-label{max-height:50vh;overflow:auto}\n`],encapsulation:2,changeDetection:0})}return t})(),Tb=\"_mat-snack-bar-enter\",Ob=\"_mat-snack-bar-exit\",TcA=(()=>{class t extends PC{_ngZone=h(Oe);_elementRef=h(ge);_changeDetectorRef=h(ft);_platform=h(ci);_animationsDisabled=Oi();snackBarConfig=h(sB);_document=h(Zt);_trackedModals=new Set;_enterFallback;_exitFallback;_injector=h(ut);_announceDelay=150;_announceTimeoutId;_destroyed=!1;_portalOutlet;_onAnnounce=new $A;_onExit=new $A;_onEnter=new $A;_animationState=\"void\";_live;_label;_role;_liveElementId=h(An).getId(\"mat-snack-bar-container-live-\");constructor(){super();let A=this.snackBarConfig;A.politeness===\"assertive\"&&!A.announcementMessage?this._live=\"assertive\":A.politeness===\"off\"?this._live=\"off\":this._live=\"polite\",this._platform.FIREFOX&&(this._live===\"polite\"&&(this._role=\"status\"),this._live===\"assertive\"&&(this._role=\"alert\"))}attachComponentPortal(A){this._assertNotAttached();let i=this._portalOutlet.attachComponentPortal(A);return this._afterPortalAttached(),i}attachTemplatePortal(A){this._assertNotAttached();let i=this._portalOutlet.attachTemplatePortal(A);return this._afterPortalAttached(),i}attachDomPortal=A=>{this._assertNotAttached();let i=this._portalOutlet.attachDomPortal(A);return this._afterPortalAttached(),i};onAnimationEnd(A){A===Ob?this._completeExit():A===Tb&&(clearTimeout(this._enterFallback),this._ngZone.run(()=>{this._onEnter.next(),this._onEnter.complete()}))}enter(){this._destroyed||(this._animationState=\"visible\",this._changeDetectorRef.markForCheck(),this._changeDetectorRef.detectChanges(),this._screenReaderAnnounce(),this._animationsDisabled?Nn(()=>{this._ngZone.run(()=>queueMicrotask(()=>this.onAnimationEnd(Tb)))},{injector:this._injector}):(clearTimeout(this._enterFallback),this._enterFallback=setTimeout(()=>{this._elementRef.nativeElement.classList.add(\"mat-snack-bar-fallback-visible\"),this.onAnimationEnd(Tb)},200)))}exit(){return this._destroyed?oe(void 0):(this._ngZone.run(()=>{this._animationState=\"hidden\",this._changeDetectorRef.markForCheck(),this._elementRef.nativeElement.setAttribute(\"mat-exit\",\"\"),clearTimeout(this._announceTimeoutId),this._animationsDisabled?Nn(()=>{this._ngZone.run(()=>queueMicrotask(()=>this.onAnimationEnd(Ob)))},{injector:this._injector}):(clearTimeout(this._exitFallback),this._exitFallback=setTimeout(()=>this.onAnimationEnd(Ob),200))}),this._onExit)}ngOnDestroy(){this._destroyed=!0,this._clearFromModals(),this._completeExit()}_completeExit(){clearTimeout(this._exitFallback),queueMicrotask(()=>{this._onExit.next(),this._onExit.complete()})}_afterPortalAttached(){let A=this._elementRef.nativeElement,i=this.snackBarConfig.panelClass;i&&(Array.isArray(i)?i.forEach(a=>A.classList.add(a)):A.classList.add(i)),this._exposeToModals();let n=this._label.nativeElement,o=\"mdc-snackbar__label\";n.classList.toggle(o,!n.querySelector(`.${o}`))}_exposeToModals(){let A=this._liveElementId,i=this._document.querySelectorAll('body > .cdk-overlay-container [aria-modal=\"true\"]');for(let n=0;n<i.length;n++){let o=i[n],a=o.getAttribute(\"aria-owns\");this._trackedModals.add(o),a?a.indexOf(A)===-1&&o.setAttribute(\"aria-owns\",a+\" \"+A):o.setAttribute(\"aria-owns\",A)}}_clearFromModals(){this._trackedModals.forEach(A=>{let i=A.getAttribute(\"aria-owns\");if(i){let n=i.replace(this._liveElementId,\"\").trim();n.length>0?A.setAttribute(\"aria-owns\",n):A.removeAttribute(\"aria-owns\")}}),this._trackedModals.clear()}_assertNotAttached(){this._portalOutlet.hasAttached()}_screenReaderAnnounce(){this._announceTimeoutId||this._ngZone.runOutsideAngular(()=>{this._announceTimeoutId=setTimeout(()=>{if(this._destroyed)return;let A=this._elementRef.nativeElement,i=A.querySelector(\"[aria-hidden]\"),n=A.querySelector(\"[aria-live]\");if(i&&n){let o=null;this._platform.isBrowser&&document.activeElement instanceof HTMLElement&&i.contains(document.activeElement)&&(o=document.activeElement),i.removeAttribute(\"aria-hidden\"),n.appendChild(i),o?.focus(),this._onAnnounce.next(),this._onAnnounce.complete()}},this._announceDelay)})}static \\u0275fac=function(i){return new(i||t)};static \\u0275cmp=kA({type:t,selectors:[[\"mat-snack-bar-container\"]],viewQuery:function(i,n){if(i&1&&ni(Ig,7)(_cA,7),i&2){let o;Ce(o=Ie())&&(n._portalOutlet=o.first),Ce(o=Ie())&&(n._label=o.first)}},hostAttrs:[1,\"mdc-snackbar\",\"mat-mdc-snack-bar-container\"],hostVars:6,hostBindings:function(i,n){i&1&&$(\"animationend\",function(a){return n.onAnimationEnd(a.animationName)})(\"animationcancel\",function(a){return n.onAnimationEnd(a.animationName)}),i&2&&ae(\"mat-snack-bar-container-enter\",n._animationState===\"visible\")(\"mat-snack-bar-container-exit\",n._animationState===\"hidden\")(\"mat-snack-bar-container-animations-enabled\",!n._animationsDisabled)},features:[Ct],decls:6,vars:3,consts:[[\"label\",\"\"],[1,\"mdc-snackbar__surface\",\"mat-mdc-snackbar-surface\"],[1,\"mat-mdc-snack-bar-label\"],[\"aria-hidden\",\"true\"],[\"cdkPortalOutlet\",\"\"]],template:function(i,n){i&1&&(m(0,\"div\",1)(1,\"div\",2,0)(3,\"div\",3),yt(4,GcA,0,0,\"ng-template\",4),D(),GA(5,\"div\"),D()()),i&2&&(p(5),ie(\"aria-live\",n._live)(\"role\",n._role)(\"id\",n._liveElementId))},dependencies:[Ig],styles:[`@keyframes _mat-snack-bar-enter{from{transform:scale(0.8);opacity:0}to{transform:scale(1);opacity:1}}@keyframes _mat-snack-bar-exit{from{opacity:1}to{opacity:0}}.mat-mdc-snack-bar-container{display:flex;align-items:center;justify-content:center;box-sizing:border-box;-webkit-tap-highlight-color:rgba(0,0,0,0);margin:8px}.mat-mdc-snack-bar-handset .mat-mdc-snack-bar-container{width:100vw}.mat-snack-bar-container-animations-enabled{opacity:0}.mat-snack-bar-container-animations-enabled.mat-snack-bar-fallback-visible{opacity:1}.mat-snack-bar-container-animations-enabled.mat-snack-bar-container-enter{animation:_mat-snack-bar-enter 150ms cubic-bezier(0, 0, 0.2, 1) forwards}.mat-snack-bar-container-animations-enabled.mat-snack-bar-container-exit{animation:_mat-snack-bar-exit 75ms cubic-bezier(0.4, 0, 1, 1) forwards}.mat-mdc-snackbar-surface{box-shadow:0px 3px 5px -1px rgba(0, 0, 0, 0.2), 0px 6px 10px 0px rgba(0, 0, 0, 0.14), 0px 1px 18px 0px rgba(0, 0, 0, 0.12);display:flex;align-items:center;justify-content:flex-start;box-sizing:border-box;padding-left:0;padding-right:8px}[dir=rtl] .mat-mdc-snackbar-surface{padding-right:0;padding-left:8px}.mat-mdc-snack-bar-container .mat-mdc-snackbar-surface{min-width:344px;max-width:672px}.mat-mdc-snack-bar-handset .mat-mdc-snackbar-surface{width:100%;min-width:0}@media(forced-colors: active){.mat-mdc-snackbar-surface{outline:solid 1px}}.mat-mdc-snack-bar-container .mat-mdc-snackbar-surface{color:var(--mat-snack-bar-supporting-text-color, var(--mat-sys-inverse-on-surface));border-radius:var(--mat-snack-bar-container-shape, var(--mat-sys-corner-extra-small));background-color:var(--mat-snack-bar-container-color, var(--mat-sys-inverse-surface))}.mdc-snackbar__label{width:100%;flex-grow:1;box-sizing:border-box;margin:0;padding:14px 8px 14px 16px}[dir=rtl] .mdc-snackbar__label{padding-left:8px;padding-right:16px}.mat-mdc-snack-bar-container .mdc-snackbar__label{font-family:var(--mat-snack-bar-supporting-text-font, var(--mat-sys-body-medium-font));font-size:var(--mat-snack-bar-supporting-text-size, var(--mat-sys-body-medium-size));font-weight:var(--mat-snack-bar-supporting-text-weight, var(--mat-sys-body-medium-weight));line-height:var(--mat-snack-bar-supporting-text-line-height, var(--mat-sys-body-medium-line-height))}.mat-mdc-snack-bar-actions{display:flex;flex-shrink:0;align-items:center;box-sizing:border-box}.mat-mdc-snack-bar-handset,.mat-mdc-snack-bar-container,.mat-mdc-snack-bar-label{flex:1 1 auto}.mat-mdc-snack-bar-container .mat-mdc-button.mat-mdc-snack-bar-action:not(:disabled).mat-unthemed{color:var(--mat-snack-bar-button-color, var(--mat-sys-inverse-primary))}.mat-mdc-snack-bar-container .mat-mdc-button.mat-mdc-snack-bar-action:not(:disabled){--mat-button-text-state-layer-color: currentColor;--mat-button-text-ripple-color: currentColor}.mat-mdc-snack-bar-container .mat-mdc-button.mat-mdc-snack-bar-action:not(:disabled) .mat-ripple-element{opacity:.1}\n`],encapsulation:2})}return t})(),OcA=new wA(\"mat-snack-bar-default-options\",{providedIn:\"root\",factory:()=>new sB}),ZC=(()=>{class t{_live=h(lh);_injector=h(ut);_breakpointObserver=h(sh);_parentSnackBar=h(t,{optional:!0,skipSelf:!0});_defaultConfig=h(OcA);_animationsDisabled=Oi();_snackBarRefAtThisLevel=null;simpleSnackBarComponent=HcA;snackBarContainerComponent=TcA;handsetCssClass=\"mat-mdc-snack-bar-handset\";get _openedSnackBarRef(){let A=this._parentSnackBar;return A?A._openedSnackBarRef:this._snackBarRefAtThisLevel}set _openedSnackBarRef(A){this._parentSnackBar?this._parentSnackBar._openedSnackBarRef=A:this._snackBarRefAtThisLevel=A}constructor(){}openFromComponent(A,i){return this._attach(A,i)}openFromTemplate(A,i){return this._attach(A,i)}open(A,i=\"\",n){let o=BA(BA({},this._defaultConfig),n);return o.data={message:A,action:i},o.announcementMessage===A&&(o.announcementMessage=void 0),this.openFromComponent(this.simpleSnackBarComponent,o)}dismiss(){this._openedSnackBarRef&&this._openedSnackBarRef.dismiss()}ngOnDestroy(){this._snackBarRefAtThisLevel&&this._snackBarRefAtThisLevel.dismiss()}_attachSnackBarContainer(A,i){let n=i&&i.viewContainerRef&&i.viewContainerRef.injector,o=ut.create({parent:n||this._injector,providers:[{provide:sB,useValue:i}]}),a=new Cg(this.snackBarContainerComponent,i.viewContainerRef,o),r=A.attach(a);return r.instance.snackBarConfig=i,r.instance}_attach(A,i){let n=BA(BA(BA({},new sB),this._defaultConfig),i),o=this._createOverlay(n),a=this._attachSnackBarContainer(o,n),r=new s4(a,o);if(A instanceof Fn){let s=new Vr(A,null,{$implicit:n.data,snackBarRef:r});r.instance=a.attachTemplatePortal(s)}else{let s=this._createInjector(n,r),g=new Cg(A,void 0,s),l=a.attachComponentPortal(g);r.instance=l.instance}return this._breakpointObserver.observe(Y_.HandsetPortrait).pipe(Bt(o.detachments())).subscribe(s=>{o.overlayElement.classList.toggle(this.handsetCssClass,s.matches)}),n.announcementMessage&&a._onAnnounce.subscribe(()=>{this._live.announce(n.announcementMessage,n.politeness)}),this._animateSnackBar(r,n),this._openedSnackBarRef=r,this._openedSnackBarRef}_animateSnackBar(A,i){A.afterDismissed().subscribe(()=>{this._openedSnackBarRef==A&&(this._openedSnackBarRef=null),i.announcementMessage&&this._live.clear()}),i.duration&&i.duration>0&&A.afterOpened().subscribe(()=>A._dismissAfter(i.duration)),this._openedSnackBarRef?(this._openedSnackBarRef.afterDismissed().subscribe(()=>{A.containerInstance.enter()}),this._openedSnackBarRef.dismiss()):A.containerInstance.enter()}_createOverlay(A){let i=new Sl;i.direction=A.direction;let n=jC(this._injector),o=A.direction===\"rtl\",a=A.horizontalPosition===\"left\"||A.horizontalPosition===\"start\"&&!o||A.horizontalPosition===\"end\"&&o,r=!a&&A.horizontalPosition!==\"center\";return a?n.left(\"0\"):r?n.right(\"0\"):n.centerHorizontally(),A.verticalPosition===\"top\"?n.top(\"0\"):n.bottom(\"0\"),i.positionStrategy=n,i.disableAnimations=this._animationsDisabled,Rl(this._injector,i)}_createInjector(A,i){let n=A&&A.viewContainerRef&&A.viewContainerRef.injector;return ut.create({parent:n||this._injector,providers:[{provide:s4,useValue:i},{provide:bJ,useValue:A.data}]})}static \\u0275fac=function(i){return new(i||t)};static \\u0275prov=TA({token:t,factory:t.\\u0275fac,providedIn:\"root\"})}return t})();var zcA=t=>[\"segment\",t],PcA=(t,e)=>({\"segment-main\":!0,expandable:t,expanded:e});function jcA(t,e){t&1&&GA(0,\"div\",9)}function qcA(t,e){if(t&1&&(m(0,\"span\",10),K(1),D()),t&2){let A=y().$implicit;p(),qA(A.description)}}function VcA(t,e){if(t&1&&(m(0,\"section\",11),GA(1,\"ngx-json-viewer\",12),D()),t&2){let A=y().$implicit,i=y();p(),X(\"json\",A.value)(\"expanded\",i.expanded)(\"depth\",i.depth)(\"_currentDepth\",i._currentDepth+1)}}function WcA(t,e){if(t&1){let A=zA();m(0,\"section\",2)(1,\"section\",3),$(\"click\",function(){let n=rA(A).$implicit,o=y();return sA(o.toggle(n))}),yt(2,jcA,1,0,\"div\",4),m(3,\"span\",5),K(4),D(),m(5,\"span\",6),K(6,\": \"),D(),yt(7,qcA,2,1,\"span\",7),D(),yt(8,VcA,2,4,\"section\",8),D()}if(t&2){let A=e.$implicit,i=y();X(\"ngClass\",zr(6,zcA,\"segment-type-\"+A.type)),p(),X(\"ngClass\",fl(8,PcA,i.isExpandable(A),A.expanded)),p(),X(\"ngIf\",i.isExpandable(A)),p(2),qA(A.key),p(3),X(\"ngIf\",!A.expanded||!i.isExpandable(A)),p(),X(\"ngIf\",A.expanded&&i.isExpandable(A))}}var XC=(()=>{class t{constructor(){this.expanded=!0,this.depth=-1,this._currentDepth=0,this.segments=[]}ngOnChanges(){this.segments=[],this.json=this.decycle(this.json),typeof this.json==\"object\"?Object.keys(this.json).forEach(A=>{this.segments.push(this.parseKeyValue(A,this.json[A]))}):this.segments.push(this.parseKeyValue(`(${typeof this.json})`,this.json))}isExpandable(A){return A.type===\"object\"||A.type===\"array\"}toggle(A){this.isExpandable(A)&&(A.expanded=!A.expanded)}parseKeyValue(A,i){let n={key:A,value:i,type:void 0,description:\"\"+i,expanded:this.isExpanded()};switch(typeof n.value){case\"number\":{n.type=\"number\";break}case\"boolean\":{n.type=\"boolean\";break}case\"function\":{n.type=\"function\";break}case\"string\":{n.type=\"string\",n.description='\"'+n.value+'\"';break}case\"undefined\":{n.type=\"undefined\",n.description=\"undefined\";break}case\"object\":{n.value===null?(n.type=\"null\",n.description=\"null\"):Array.isArray(n.value)?(n.type=\"array\",n.description=\"Array[\"+n.value.length+\"] \"+JSON.stringify(n.value)):n.value instanceof Date?n.type=\"date\":(n.type=\"object\",n.description=\"Object \"+JSON.stringify(n.value));break}}return n}isExpanded(){return this.expanded&&!(this.depth>-1&&this._currentDepth>=this.depth)}decycle(A){let i=new WeakMap;return(function n(o,a){let r,s;return typeof o==\"object\"&&o!==null&&!(o instanceof Boolean)&&!(o instanceof Date)&&!(o instanceof Number)&&!(o instanceof RegExp)&&!(o instanceof String)?(r=i.get(o),r!==void 0?{$ref:r}:(i.set(o,a),Array.isArray(o)?(s=[],o.forEach(function(g,l){s[l]=n(g,a+\"[\"+l+\"]\")})):(s={},Object.keys(o).forEach(function(g){s[g]=n(o[g],a+\"[\"+JSON.stringify(g)+\"]\")})),s)):o})(A,\"$\")}}return t.\\u0275fac=function(A){return new(A||t)},t.\\u0275cmp=kA({type:t,selectors:[[\"ngx-json-viewer\"]],inputs:{json:\"json\",expanded:\"expanded\",depth:\"depth\",_currentDepth:\"_currentDepth\"},standalone:!1,features:[ei],decls:2,vars:1,consts:[[1,\"ngx-json-viewer\"],[3,\"ngClass\",4,\"ngFor\",\"ngForOf\"],[3,\"ngClass\"],[3,\"click\",\"ngClass\"],[\"class\",\"toggler\",4,\"ngIf\"],[1,\"segment-key\"],[1,\"segment-separator\"],[\"class\",\"segment-value\",4,\"ngIf\"],[\"class\",\"children\",4,\"ngIf\"],[1,\"toggler\"],[1,\"segment-value\"],[1,\"children\"],[3,\"json\",\"expanded\",\"depth\",\"_currentDepth\"]],template:function(A,i){A&1&&(m(0,\"section\",0),yt(1,WcA,9,11,\"section\",1),D()),A&2&&(p(),X(\"ngForOf\",i.segments))},dependencies:[Rg,md,yc,t],styles:['@charset \"UTF-8\";.ngx-json-viewer[_ngcontent-%COMP%]{font-family:var(--ngx-json-font-family, monospace);font-size:var(--ngx-json-font-size, 1em);width:100%;height:100%;overflow:hidden;position:relative}.ngx-json-viewer[_ngcontent-%COMP%]   .segment[_ngcontent-%COMP%]{padding:2px;margin:1px 1px 1px 12px}.ngx-json-viewer[_ngcontent-%COMP%]   .segment[_ngcontent-%COMP%]   .segment-main[_ngcontent-%COMP%]{word-wrap:break-word}.ngx-json-viewer[_ngcontent-%COMP%]   .segment[_ngcontent-%COMP%]   .segment-main[_ngcontent-%COMP%]   .toggler[_ngcontent-%COMP%]{position:absolute;margin-left:-14px;margin-top:3px;font-size:.8em;line-height:1.2em;vertical-align:middle;color:var(--ngx-json-toggler, #787878)}.ngx-json-viewer[_ngcontent-%COMP%]   .segment[_ngcontent-%COMP%]   .segment-main[_ngcontent-%COMP%]   .toggler[_ngcontent-%COMP%]:after{display:inline-block;content:\"\\\\25ba\";transition:transform .1s ease-in}.ngx-json-viewer[_ngcontent-%COMP%]   .segment[_ngcontent-%COMP%]   .segment-main[_ngcontent-%COMP%]   .segment-key[_ngcontent-%COMP%]{color:var(--ngx-json-key, #4E187C)}.ngx-json-viewer[_ngcontent-%COMP%]   .segment[_ngcontent-%COMP%]   .segment-main[_ngcontent-%COMP%]   .segment-separator[_ngcontent-%COMP%]{color:var(--ngx-json-separator, #999)}.ngx-json-viewer[_ngcontent-%COMP%]   .segment[_ngcontent-%COMP%]   .segment-main[_ngcontent-%COMP%]   .segment-value[_ngcontent-%COMP%]{color:var(--ngx-json-value, #000)}.ngx-json-viewer[_ngcontent-%COMP%]   .segment[_ngcontent-%COMP%]   .children[_ngcontent-%COMP%]{margin-left:12px}.ngx-json-viewer[_ngcontent-%COMP%]   .segment-type-string[_ngcontent-%COMP%] > .segment-main[_ngcontent-%COMP%] > .segment-value[_ngcontent-%COMP%]{color:var(--ngx-json-string, #FF6B6B)}.ngx-json-viewer[_ngcontent-%COMP%]   .segment-type-number[_ngcontent-%COMP%] > .segment-main[_ngcontent-%COMP%] > .segment-value[_ngcontent-%COMP%]{color:var(--ngx-json-number, #009688)}.ngx-json-viewer[_ngcontent-%COMP%]   .segment-type-boolean[_ngcontent-%COMP%] > .segment-main[_ngcontent-%COMP%] > .segment-value[_ngcontent-%COMP%]{color:var(--ngx-json-boolean, #B938A4)}.ngx-json-viewer[_ngcontent-%COMP%]   .segment-type-date[_ngcontent-%COMP%] > .segment-main[_ngcontent-%COMP%] > .segment-value[_ngcontent-%COMP%]{color:var(--ngx-json-date, #05668D)}.ngx-json-viewer[_ngcontent-%COMP%]   .segment-type-array[_ngcontent-%COMP%] > .segment-main[_ngcontent-%COMP%] > .segment-value[_ngcontent-%COMP%]{color:var(--ngx-json-array, #999)}.ngx-json-viewer[_ngcontent-%COMP%]   .segment-type-object[_ngcontent-%COMP%] > .segment-main[_ngcontent-%COMP%] > .segment-value[_ngcontent-%COMP%]{color:var(--ngx-json-object, #999)}.ngx-json-viewer[_ngcontent-%COMP%]   .segment-type-function[_ngcontent-%COMP%] > .segment-main[_ngcontent-%COMP%] > .segment-value[_ngcontent-%COMP%]{color:var(--ngx-json-function, #999)}.ngx-json-viewer[_ngcontent-%COMP%]   .segment-type-null[_ngcontent-%COMP%] > .segment-main[_ngcontent-%COMP%] > .segment-value[_ngcontent-%COMP%]{color:var(--ngx-json-null, #fff)}.ngx-json-viewer[_ngcontent-%COMP%]   .segment-type-undefined[_ngcontent-%COMP%] > .segment-main[_ngcontent-%COMP%] > .segment-value[_ngcontent-%COMP%]{color:var(--ngx-json-undefined, #fff)}.ngx-json-viewer[_ngcontent-%COMP%]   .segment-type-null[_ngcontent-%COMP%] > .segment-main[_ngcontent-%COMP%] > .segment-value[_ngcontent-%COMP%]{background-color:var(--ngx-json-null-bg, red)}.ngx-json-viewer[_ngcontent-%COMP%]   .segment-type-undefined[_ngcontent-%COMP%] > .segment-main[_ngcontent-%COMP%] > .segment-key[_ngcontent-%COMP%]{color:var(--ngx-json-undefined-key, #999)}.ngx-json-viewer[_ngcontent-%COMP%]   .segment-type-undefined[_ngcontent-%COMP%] > .segment-main[_ngcontent-%COMP%] > .segment-value[_ngcontent-%COMP%]{background-color:var(--ngx-json-undefined-key, #999)}.ngx-json-viewer[_ngcontent-%COMP%]   .segment-type-object[_ngcontent-%COMP%] > .segment-main[_ngcontent-%COMP%], .ngx-json-viewer[_ngcontent-%COMP%]   .segment-type-array[_ngcontent-%COMP%] > .segment-main[_ngcontent-%COMP%]{white-space:nowrap}.ngx-json-viewer[_ngcontent-%COMP%]   .expanded[_ngcontent-%COMP%] > .toggler[_ngcontent-%COMP%]:after{transform:rotate(90deg)}.ngx-json-viewer[_ngcontent-%COMP%]   .expandable[_ngcontent-%COMP%], .ngx-json-viewer[_ngcontent-%COMP%]   .expandable[_ngcontent-%COMP%] > .toggler[_ngcontent-%COMP%]{cursor:pointer}']}),t})(),Gc=(()=>{class t{}return t.\\u0275fac=function(A){return new(A||t)},t.\\u0275mod=Xe({type:t}),t.\\u0275inj=Ze({imports:[oa]}),t})();var kr=class t{static getBaseUrlWithoutPath(){let e=window.location.href;return new URL(e).origin+\"/dev-ui/\"}static getApiServerBaseUrl(){return window.runtimeConfig?.backendUrl||\"\"}static getWSServerUrl(){let e=t.getApiServerBaseUrl();return!e||e==\"\"?window.location.host:e.startsWith(\"http://\")?e.slice(7):e.startsWith(\"https://\")?e.slice(8):e}};var Ks=new wA(\"AgentService\");var Kc=new wA(\"AgentBuilderService\");var xp=new wA(\"ArtifactService\");var gB=new wA(\"DownloadService\");var Uc=new wA(\"EvalService\");var lB=new wA(\"EventService\");var MJ=\"import_session\",kJ=\"edit_function_args\";var SJ=\"a2a_card\",lr=new wA(\"FeatureFlagService\");var cB=new wA(\"GraphService\");var Rp=new wA(\"LocalFileService\");var Wr=new wA(\"SafeValuesService\"),Np=class{openBase64InNewTab(e,A){try{if(!e)return;let i=e;if(e.startsWith(\"data:\")&&e.includes(\";base64,\")&&(i=i.substring(i.indexOf(\";base64,\")+8)),!A||!i)return;let n=atob(i),o=new Array(n.length);for(let g=0;g<n.length;g++)o[g]=n.charCodeAt(g);let a=new Uint8Array(o),r=new Blob([a],{type:A}),s=this.openBlobUrl(r);s?s.focus():alert(\"Pop-up blocked! Please allow pop-ups for this site to open the data in a new tab.\")}catch(i){alert(\"Could not open the data. It might be invalid or too large. Check the browser console for errors.\")}}};var Hg=new wA(\"SessionService\");var Fp=new wA(\"StreamChatService\");var CB=new wA(\"StringToColorService\");var $C=new wA(\"TraceService\");var Tg=new wA(\"UiStateService\");var Lp=new wA(\"Location\");var _p=class t{constructor(e,A){this.el=e;this.renderer=A;this.bottomMaxHeight=window.innerHeight}bottomMinHeight=310;bottomMaxHeight;resizeHandle=null;resizingEvent={isResizing:!1,startingCursorY:0,startingHeight:0};ngAfterViewInit(){this.resizeHandle=document.getElementsByClassName(\"bottom-resize-handler\")[0],this.renderer.listen(this.resizeHandle,\"mousedown\",e=>this.onResizeHandleMouseDown(e)),document.documentElement.style.setProperty(\"--bottom-panel-height\",\"310px\"),this.renderer.setStyle(this.el.nativeElement,\"height\",\"var(--bottom-panel-height)\")}onResizeHandleMouseDown(e){this.resizingEvent={isResizing:!0,startingCursorY:e.clientY,startingHeight:this.bottomPanelHeight},e.preventDefault()}onMouseMove(e){if(!this.resizingEvent.isResizing)return;let A=this.resizingEvent.startingCursorY-e.clientY,i=this.resizingEvent.startingHeight+A;this.bottomPanelHeight=i,this.renderer.addClass(document.body,\"resizing\")}onMouseUp(){this.resizingEvent.isResizing=!1,this.renderer.removeClass(document.body,\"resizing\")}onResize(){this.bottomMaxHeight=window.innerHeight/2,this.bottomPanelHeight=this.bottomPanelHeight}set bottomPanelHeight(e){let A=Math.min(Math.max(e,this.bottomMinHeight),this.bottomMaxHeight);document.body.style.setProperty(\"--bottom-panel-height\",`${A}px`)}get bottomPanelHeight(){let e=getComputedStyle(document.body).getPropertyValue(\"--bottom-panel-height\"),A=parseInt(e,10);return isNaN(A)?500:A}static \\u0275fac=function(A){return new(A||t)(lt(ge),lt(ui))};static \\u0275dir=OA({type:t,selectors:[[\"\",\"appResizableBottomPanel\",\"\"]],hostBindings:function(A,i){A&1&&$(\"mousemove\",function(o){return i.onMouseMove(o)},m0)(\"mouseup\",function(){return i.onMouseUp()},m0)(\"resize\",function(){return i.onResize()},RC)}})};var Gp=class t{constructor(e,A){this.el=e;this.renderer=A}sideDrawerMinWidth=310;sideDrawerMaxWidth=window.innerWidth/2;resizeHandle=null;resizingEvent={isResizing:!1,startingCursorX:0,startingWidth:0};ngAfterViewInit(){this.sideDrawerMaxWidth=window.innerWidth/2,this.resizeHandle=document.getElementsByClassName(\"resize-handler\")[0],this.resizeHandle&&this.renderer.listen(this.resizeHandle,\"mousedown\",e=>this.onResizeHandleMouseDown(e)),document.documentElement.style.setProperty(\"--side-drawer-width\",\"570px\"),this.renderer.setStyle(this.el.nativeElement,\"width\",\"var(--side-drawer-width)\")}onResizeHandleMouseDown(e){this.resizingEvent={isResizing:!0,startingCursorX:e.clientX,startingWidth:this.sideDrawerWidth},e.preventDefault()}onMouseMove(e){if(!this.resizingEvent.isResizing)return;let A=e.clientX-this.resizingEvent.startingCursorX,i=this.resizingEvent.startingWidth+A;this.sideDrawerWidth=i,this.renderer.addClass(document.body,\"resizing\")}onMouseUp(){this.resizingEvent.isResizing=!1,this.renderer.removeClass(document.body,\"resizing\")}onResize(){this.sideDrawerMaxWidth=window.innerWidth/2,this.sideDrawerWidth=this.sideDrawerWidth}set sideDrawerWidth(e){let A=Math.min(Math.max(e,this.sideDrawerMinWidth),this.sideDrawerMaxWidth);document.documentElement.style.setProperty(\"--side-drawer-width\",`${A}px`)}get sideDrawerWidth(){let e=getComputedStyle(document.documentElement).getPropertyValue(\"--side-drawer-width\"),A=parseFloat(e);return isNaN(A)?500:A}static \\u0275fac=function(A){return new(A||t)(lt(ge),lt(ui))};static \\u0275dir=OA({type:t,selectors:[[\"\",\"appResizableDrawer\",\"\"]],hostBindings:function(A,i){A&1&&$(\"mousemove\",function(o){return i.onMouseMove(o)},m0)(\"mouseup\",function(){return i.onMouseUp()},m0)(\"resize\",function(){return i.onResize()},RC)}})};var Kp=Symbol.for(\"yaml.alias\"),Up=Symbol.for(\"yaml.document\"),Nl=Symbol.for(\"yaml.map\"),zb=Symbol.for(\"yaml.pair\"),dg=Symbol.for(\"yaml.scalar\"),_0=Symbol.for(\"yaml.seq\"),Es=Symbol.for(\"yaml.node.type\"),Og=t=>!!t&&typeof t==\"object\"&&t[Es]===Kp,Fl=t=>!!t&&typeof t==\"object\"&&t[Es]===Up,Ll=t=>!!t&&typeof t==\"object\"&&t[Es]===Nl,dn=t=>!!t&&typeof t==\"object\"&&t[Es]===zb,Ki=t=>!!t&&typeof t==\"object\"&&t[Es]===dg,_l=t=>!!t&&typeof t==\"object\"&&t[Es]===_0;function Zn(t){if(t&&typeof t==\"object\")switch(t[Es]){case Nl:case _0:return!0}return!1}function un(t){if(t&&typeof t==\"object\")switch(t[Es]){case Kp:case Nl:case dg:case _0:return!0}return!1}var Jp=t=>(Ki(t)||Zn(t))&&!!t.anchor;var Us=Symbol(\"break visit\"),xJ=Symbol(\"skip children\"),Jc=Symbol(\"remove node\");function Yc(t,e){let A=RJ(e);Fl(t)?IB(null,t.contents,A,Object.freeze([t]))===Jc&&(t.contents=null):IB(null,t,A,Object.freeze([]))}Yc.BREAK=Us;Yc.SKIP=xJ;Yc.REMOVE=Jc;function IB(t,e,A,i){let n=NJ(t,e,A,i);if(un(n)||dn(n))return FJ(t,i,n),IB(t,n,A,i);if(typeof n!=\"symbol\"){if(Zn(e)){i=Object.freeze(i.concat(e));for(let o=0;o<e.items.length;++o){let a=IB(o,e.items[o],A,i);if(typeof a==\"number\")o=a-1;else{if(a===Us)return Us;a===Jc&&(e.items.splice(o,1),o-=1)}}}else if(dn(e)){i=Object.freeze(i.concat(e));let o=IB(\"key\",e.key,A,i);if(o===Us)return Us;o===Jc&&(e.key=null);let a=IB(\"value\",e.value,A,i);if(a===Us)return Us;a===Jc&&(e.value=null)}}return n}function Yp(t,e){return ct(this,null,function*(){let A=RJ(e);Fl(t)?(yield dB(null,t.contents,A,Object.freeze([t])))===Jc&&(t.contents=null):yield dB(null,t,A,Object.freeze([]))})}Yp.BREAK=Us;Yp.SKIP=xJ;Yp.REMOVE=Jc;function dB(t,e,A,i){return ct(this,null,function*(){let n=yield NJ(t,e,A,i);if(un(n)||dn(n))return FJ(t,i,n),dB(t,n,A,i);if(typeof n!=\"symbol\"){if(Zn(e)){i=Object.freeze(i.concat(e));for(let o=0;o<e.items.length;++o){let a=yield dB(o,e.items[o],A,i);if(typeof a==\"number\")o=a-1;else{if(a===Us)return Us;a===Jc&&(e.items.splice(o,1),o-=1)}}}else if(dn(e)){i=Object.freeze(i.concat(e));let o=yield dB(\"key\",e.key,A,i);if(o===Us)return Us;o===Jc&&(e.key=null);let a=yield dB(\"value\",e.value,A,i);if(a===Us)return Us;a===Jc&&(e.value=null)}}return n})}function RJ(t){return typeof t==\"object\"&&(t.Collection||t.Node||t.Value)?Object.assign({Alias:t.Node,Map:t.Node,Scalar:t.Node,Seq:t.Node},t.Value&&{Map:t.Value,Scalar:t.Value,Seq:t.Value},t.Collection&&{Map:t.Collection,Seq:t.Collection},t):t}function NJ(t,e,A,i){if(typeof A==\"function\")return A(t,e,i);if(Ll(e))return A.Map?.(t,e,i);if(_l(e))return A.Seq?.(t,e,i);if(dn(e))return A.Pair?.(t,e,i);if(Ki(e))return A.Scalar?.(t,e,i);if(Og(e))return A.Alias?.(t,e,i)}function FJ(t,e,A){let i=e[e.length-1];if(Zn(i))i.items[t]=A;else if(dn(i))t===\"key\"?i.key=A:i.value=A;else if(Fl(i))i.contents=A;else{let n=Og(i)?\"alias\":\"scalar\";throw new Error(`Cannot replace node with ${n} parent`)}}var ZcA={\"!\":\"%21\",\",\":\"%2C\",\"[\":\"%5B\",\"]\":\"%5D\",\"{\":\"%7B\",\"}\":\"%7D\"},XcA=t=>t.replace(/[!,[\\]{}]/g,e=>ZcA[e]),BB=(()=>{class t{constructor(A,i){this.docStart=null,this.docEnd=!1,this.yaml=Object.assign({},t.defaultYaml,A),this.tags=Object.assign({},t.defaultTags,i)}clone(){let A=new t(this.yaml,this.tags);return A.docStart=this.docStart,A}atDocument(){let A=new t(this.yaml,this.tags);switch(this.yaml.version){case\"1.1\":this.atNextDocument=!0;break;case\"1.2\":this.atNextDocument=!1,this.yaml={explicit:t.defaultYaml.explicit,version:\"1.2\"},this.tags=Object.assign({},t.defaultTags);break}return A}add(A,i){this.atNextDocument&&(this.yaml={explicit:t.defaultYaml.explicit,version:\"1.1\"},this.tags=Object.assign({},t.defaultTags),this.atNextDocument=!1);let n=A.trim().split(/[ \\t]+/),o=n.shift();switch(o){case\"%TAG\":{if(n.length!==2&&(i(0,\"%TAG directive should contain exactly two parts\"),n.length<2))return!1;let[a,r]=n;return this.tags[a]=r,!0}case\"%YAML\":{if(this.yaml.explicit=!0,n.length!==1)return i(0,\"%YAML directive should contain exactly one part\"),!1;let[a]=n;if(a===\"1.1\"||a===\"1.2\")return this.yaml.version=a,!0;{let r=/^\\d+\\.\\d+$/.test(a);return i(6,`Unsupported YAML version ${a}`,r),!1}}default:return i(0,`Unknown directive ${o}`,!0),!1}}tagName(A,i){if(A===\"!\")return\"!\";if(A[0]!==\"!\")return i(`Not a valid tag: ${A}`),null;if(A[1]===\"<\"){let r=A.slice(2,-1);return r===\"!\"||r===\"!!\"?(i(`Verbatim tags aren't resolved, so ${A} is invalid.`),null):(A[A.length-1]!==\">\"&&i(\"Verbatim tags must end with a >\"),r)}let[,n,o]=A.match(/^(.*!)([^!]*)$/s);o||i(`The ${A} tag has no suffix`);let a=this.tags[n];if(a)try{return a+decodeURIComponent(o)}catch(r){return i(String(r)),null}return n===\"!\"?A:(i(`Could not resolve tag: ${A}`),null)}tagString(A){for(let[i,n]of Object.entries(this.tags))if(A.startsWith(n))return i+XcA(A.substring(n.length));return A[0]===\"!\"?A:`!<${A}>`}toString(A){let i=this.yaml.explicit?[`%YAML ${this.yaml.version||\"1.2\"}`]:[],n=Object.entries(this.tags),o;if(A&&n.length>0&&un(A.contents)){let a={};Yc(A.contents,(r,s)=>{un(s)&&s.tag&&(a[s.tag]=!0)}),o=Object.keys(a)}else o=[];for(let[a,r]of n)a===\"!!\"&&r===\"tag:yaml.org,2002:\"||(!A||o.some(s=>s.startsWith(r)))&&i.push(`%TAG ${a} ${r}`);return i.join(`\n`)}}return t.defaultYaml={explicit:!1,version:\"1.2\"},t.defaultTags={\"!!\":\"tag:yaml.org,2002:\"},t})();function Hp(t){if(/[\\x00-\\x19\\s,[\\]{}]/.test(t)){let A=`Anchor must not contain whitespace or control characters: ${JSON.stringify(t)}`;throw new Error(A)}return!0}function Pb(t){let e=new Set;return Yc(t,{Value(A,i){i.anchor&&e.add(i.anchor)}}),e}function jb(t,e){for(let A=1;;++A){let i=`${t}${A}`;if(!e.has(i))return i}}function LJ(t,e){let A=[],i=new Map,n=null;return{onAnchor:o=>{A.push(o),n??(n=Pb(t));let a=jb(e,n);return n.add(a),a},setAnchors:()=>{for(let o of A){let a=i.get(o);if(typeof a==\"object\"&&a.anchor&&(Ki(a.node)||Zn(a.node)))a.node.anchor=a.anchor;else{let r=new Error(\"Failed to resolve repeated object (this should not happen)\");throw r.source=o,r}}},sourceObjects:i}}function A2(t,e,A,i){if(i&&typeof i==\"object\")if(Array.isArray(i))for(let n=0,o=i.length;n<o;++n){let a=i[n],r=A2(t,i,String(n),a);r===void 0?delete i[n]:r!==a&&(i[n]=r)}else if(i instanceof Map)for(let n of Array.from(i.keys())){let o=i.get(n),a=A2(t,i,n,o);a===void 0?i.delete(n):a!==o&&i.set(n,a)}else if(i instanceof Set)for(let n of Array.from(i)){let o=A2(t,i,n,n);o===void 0?i.delete(n):o!==n&&(i.delete(n),i.add(o))}else for(let[n,o]of Object.entries(i)){let a=A2(t,i,n,o);a===void 0?delete i[n]:a!==o&&(i[n]=a)}return t.call(e,A,i)}function $a(t,e,A){if(Array.isArray(t))return t.map((i,n)=>$a(i,String(n),A));if(t&&typeof t.toJSON==\"function\"){if(!A||!Jp(t))return t.toJSON(e,A);let i={aliasCount:0,count:1,res:void 0};A.anchors.set(t,i),A.onCreate=o=>{i.res=o,delete A.onCreate};let n=t.toJSON(e,A);return A.onCreate&&A.onCreate(n),n}return typeof t==\"bigint\"&&!A?.keep?Number(t):t}var e2=class{constructor(e){Object.defineProperty(this,Es,{value:e})}clone(){let e=Object.create(Object.getPrototypeOf(this),Object.getOwnPropertyDescriptors(this));return this.range&&(e.range=this.range.slice()),e}toJS(e,{mapAsMap:A,maxAliasCount:i,onAnchor:n,reviver:o}={}){if(!Fl(e))throw new TypeError(\"A document argument is required\");let a={anchors:new Map,doc:e,keep:!0,mapAsMap:A===!0,mapKeyWarned:!1,maxAliasCount:typeof i==\"number\"?i:100},r=$a(this,\"\",a);if(typeof n==\"function\")for(let{count:s,res:g}of a.anchors.values())n(g,s);return typeof o==\"function\"?A2(o,{\"\":r},\"\",r):r}};var G0=class extends e2{constructor(e){super(Kp),this.source=e,Object.defineProperty(this,\"tag\",{set(){throw new Error(\"Alias nodes cannot have tags\")}})}resolve(e,A){let i;A?.aliasResolveCache?i=A.aliasResolveCache:(i=[],Yc(e,{Node:(o,a)=>{(Og(a)||Jp(a))&&i.push(a)}}),A&&(A.aliasResolveCache=i));let n;for(let o of i){if(o===this)break;o.anchor===this.source&&(n=o)}return n}toJSON(e,A){if(!A)return{source:this.source};let{anchors:i,doc:n,maxAliasCount:o}=A,a=this.resolve(n,A);if(!a){let s=`Unresolved alias (the anchor must be set before the alias): ${this.source}`;throw new ReferenceError(s)}let r=i.get(a);if(r||($a(a,null,A),r=i.get(a)),r?.res===void 0){let s=\"This should not happen: Alias anchor was not resolved?\";throw new ReferenceError(s)}if(o>=0&&(r.count+=1,r.aliasCount===0&&(r.aliasCount=Tp(n,a,i)),r.count*r.aliasCount>o)){let s=\"Excessive alias count indicates a resource exhaustion attack\";throw new ReferenceError(s)}return r.res}toString(e,A,i){let n=`*${this.source}`;if(e){if(Hp(this.source),e.options.verifyAliasOrder&&!e.anchors.has(this.source)){let o=`Unresolved alias (the anchor must be set before the alias): ${this.source}`;throw new Error(o)}if(e.implicitKey)return`${n} `}return n}};function Tp(t,e,A){if(Og(e)){let i=e.resolve(t),n=A&&i&&A.get(i);return n?n.count*n.aliasCount:0}else if(Zn(e)){let i=0;for(let n of e.items){let o=Tp(t,n,A);o>i&&(i=o)}return i}else if(dn(e)){let i=Tp(t,e.key,A),n=Tp(t,e.value,A);return Math.max(i,n)}return 1}var Op=t=>!t||typeof t!=\"function\"&&typeof t!=\"object\",Ht=(()=>{class t extends e2{constructor(A){super(dg),this.value=A}toJSON(A,i){return i?.keep?this.value:$a(this.value,A,i)}toString(){return String(this.value)}}return t.BLOCK_FOLDED=\"BLOCK_FOLDED\",t.BLOCK_LITERAL=\"BLOCK_LITERAL\",t.PLAIN=\"PLAIN\",t.QUOTE_DOUBLE=\"QUOTE_DOUBLE\",t.QUOTE_SINGLE=\"QUOTE_SINGLE\",t})();var $cA=\"tag:yaml.org,2002:\";function A0A(t,e,A){if(e){let i=A.filter(o=>o.tag===e),n=i.find(o=>!o.format)??i[0];if(!n)throw new Error(`Tag ${e} not found`);return n}return A.find(i=>i.identify?.(t)&&!i.format)}function K0(t,e,A){if(Fl(t)&&(t=t.contents),un(t))return t;if(dn(t)){let C=A.schema[Nl].createNode?.(A.schema,null,A);return C.items.push(t),C}(t instanceof String||t instanceof Number||t instanceof Boolean||typeof BigInt<\"u\"&&t instanceof BigInt)&&(t=t.valueOf());let{aliasDuplicateObjects:i,onAnchor:n,onTagObj:o,schema:a,sourceObjects:r}=A,s;if(i&&t&&typeof t==\"object\"){if(s=r.get(t),s)return s.anchor??(s.anchor=n(t)),new G0(s.anchor);s={anchor:null,node:null},r.set(t,s)}e?.startsWith(\"!!\")&&(e=$cA+e.slice(2));let g=A0A(t,e,a.tags);if(!g){if(t&&typeof t.toJSON==\"function\"&&(t=t.toJSON()),!t||typeof t!=\"object\"){let C=new Ht(t);return s&&(s.node=C),C}g=t instanceof Map?a[Nl]:Symbol.iterator in Object(t)?a[_0]:a[Nl]}o&&(o(g),delete A.onTagObj);let l=g?.createNode?g.createNode(A.schema,t,A):typeof g?.nodeClass?.from==\"function\"?g.nodeClass.from(A.schema,t,A):new Ht(t);return e?l.tag=e:g.default||(l.tag=g.tag),s&&(s.node=l),l}function g4(t,e,A){let i=A;for(let n=e.length-1;n>=0;--n){let o=e[n];if(typeof o==\"number\"&&Number.isInteger(o)&&o>=0){let a=[];a[o]=i,i=a}else i=new Map([[o,i]])}return K0(i,void 0,{aliasDuplicateObjects:!1,keepUndefined:!1,onAnchor:()=>{throw new Error(\"This should not happen, please report a bug.\")},schema:t,sourceObjects:new Map})}var EB=t=>t==null||typeof t==\"object\"&&!!t[Symbol.iterator]().next().done,QB=class extends e2{constructor(e,A){super(e),Object.defineProperty(this,\"schema\",{value:A,configurable:!0,enumerable:!1,writable:!0})}clone(e){let A=Object.create(Object.getPrototypeOf(this),Object.getOwnPropertyDescriptors(this));return e&&(A.schema=e),A.items=A.items.map(i=>un(i)||dn(i)?i.clone(e):i),this.range&&(A.range=this.range.slice()),A}addIn(e,A){if(EB(e))this.add(A);else{let[i,...n]=e,o=this.get(i,!0);if(Zn(o))o.addIn(n,A);else if(o===void 0&&this.schema)this.set(i,g4(this.schema,n,A));else throw new Error(`Expected YAML collection at ${i}. Remaining path: ${n}`)}}deleteIn(e){let[A,...i]=e;if(i.length===0)return this.delete(A);let n=this.get(A,!0);if(Zn(n))return n.deleteIn(i);throw new Error(`Expected YAML collection at ${A}. Remaining path: ${i}`)}getIn(e,A){let[i,...n]=e,o=this.get(i,!0);return n.length===0?!A&&Ki(o)?o.value:o:Zn(o)?o.getIn(n,A):void 0}hasAllNullValues(e){return this.items.every(A=>{if(!dn(A))return!1;let i=A.value;return i==null||e&&Ki(i)&&i.value==null&&!i.commentBefore&&!i.comment&&!i.tag})}hasIn(e){let[A,...i]=e;if(i.length===0)return this.has(A);let n=this.get(A,!0);return Zn(n)?n.hasIn(i):!1}setIn(e,A){let[i,...n]=e;if(n.length===0)this.set(i,A);else{let o=this.get(i,!0);if(Zn(o))o.setIn(n,A);else if(o===void 0&&this.schema)this.set(i,g4(this.schema,n,A));else throw new Error(`Expected YAML collection at ${i}. Remaining path: ${n}`)}}};var _J=t=>t.replace(/^(?!$)(?: $)?/gm,\"#\");function zg(t,e){return/^\\n+$/.test(t)?t.substring(1):e?t.replace(/^(?! *$)/gm,e):t}var Hc=(t,e,A)=>t.endsWith(`\n`)?zg(A,e):A.includes(`\n`)?`\n`+zg(A,e):(t.endsWith(\" \")?\"\":\" \")+A;var qb=\"flow\",zp=\"block\",l4=\"quoted\";function c4(t,e,A=\"flow\",{indentAtStart:i,lineWidth:n=80,minContentWidth:o=20,onFold:a,onOverflow:r}={}){if(!n||n<0)return t;n<o&&(o=0);let s=Math.max(1+o,1+n-e.length);if(t.length<=s)return t;let g=[],l={},C=n-e.length;typeof i==\"number\"&&(i>n-Math.max(2,o)?g.push(0):C=n-i);let I,d,B=!1,Q=-1,E=-1,f=-1;A===zp&&(Q=GJ(t,Q,e.length),Q!==-1&&(C=Q+s));for(let R;R=t[Q+=1];){if(A===l4&&R===\"\\\\\"){switch(E=Q,t[Q+1]){case\"x\":Q+=3;break;case\"u\":Q+=5;break;case\"U\":Q+=9;break;default:Q+=1}f=Q}if(R===`\n`)A===zp&&(Q=GJ(t,Q,e.length)),C=Q+e.length+s,I=void 0;else{if(R===\" \"&&d&&d!==\" \"&&d!==`\n`&&d!==\"\t\"){let M=t[Q+1];M&&M!==\" \"&&M!==`\n`&&M!==\"\t\"&&(I=Q)}if(Q>=C)if(I)g.push(I),C=I+s,I=void 0;else if(A===l4){for(;d===\" \"||d===\"\t\";)d=R,R=t[Q+=1],B=!0;let M=Q>f+1?Q-2:E-1;if(l[M])return t;g.push(M),l[M]=!0,C=M+s,I=void 0}else B=!0}d=R}if(B&&r&&r(),g.length===0)return t;a&&a();let b=t.slice(0,g[0]);for(let R=0;R<g.length;++R){let M=g[R],v=g[R+1]||t.length;M===0?b=`\n${e}${t.slice(0,v)}`:(A===l4&&l[M]&&(b+=`${t[M]}\\\\`),b+=`\n${e}${t.slice(M+1,v)}`)}return b}function GJ(t,e,A){let i=e,n=e+1,o=t[n];for(;o===\" \"||o===\"\t\";)if(e<n+A)o=t[++e];else{do o=t[++e];while(o&&o!==`\n`);i=e,n=e+1,o=t[n]}return i}var jp=(t,e)=>({indentAtStart:e?t.indent.length:t.indentAtStart,lineWidth:t.options.lineWidth,minContentWidth:t.options.minContentWidth}),qp=t=>/^(%|---|\\.\\.\\.)/m.test(t);function e0A(t,e,A){if(!e||e<0)return!1;let i=e-A,n=t.length;if(n<=i)return!1;for(let o=0,a=0;o<n;++o)if(t[o]===`\n`){if(o-a>i)return!0;if(a=o+1,n-a<=i)return!1}return!0}function C4(t,e){let A=JSON.stringify(t);if(e.options.doubleQuotedAsJSON)return A;let{implicitKey:i}=e,n=e.options.doubleQuotedMinMultiLineLength,o=e.indent||(qp(t)?\"  \":\"\"),a=\"\",r=0;for(let s=0,g=A[s];g;g=A[++s])if(g===\" \"&&A[s+1]===\"\\\\\"&&A[s+2]===\"n\"&&(a+=A.slice(r,s)+\"\\\\ \",s+=1,r=s,g=\"\\\\\"),g===\"\\\\\")switch(A[s+1]){case\"u\":{a+=A.slice(r,s);let l=A.substr(s+2,4);switch(l){case\"0000\":a+=\"\\\\0\";break;case\"0007\":a+=\"\\\\a\";break;case\"000b\":a+=\"\\\\v\";break;case\"001b\":a+=\"\\\\e\";break;case\"0085\":a+=\"\\\\N\";break;case\"00a0\":a+=\"\\\\_\";break;case\"2028\":a+=\"\\\\L\";break;case\"2029\":a+=\"\\\\P\";break;default:l.substr(0,2)===\"00\"?a+=\"\\\\x\"+l.substr(2):a+=A.substr(s,6)}s+=5,r=s+1}break;case\"n\":if(i||A[s+2]==='\"'||A.length<n)s+=1;else{for(a+=A.slice(r,s)+`\n\n`;A[s+2]===\"\\\\\"&&A[s+3]===\"n\"&&A[s+4]!=='\"';)a+=`\n`,s+=2;a+=o,A[s+2]===\" \"&&(a+=\"\\\\\"),s+=1,r=s+1}break;default:s+=1}return a=r?a+A.slice(r):A,i?a:c4(a,o,l4,jp(e,!1))}function Vb(t,e){if(e.options.singleQuote===!1||e.implicitKey&&t.includes(`\n`)||/[ \\t]\\n|\\n[ \\t]/.test(t))return C4(t,e);let A=e.indent||(qp(t)?\"  \":\"\"),i=\"'\"+t.replace(/'/g,\"''\").replace(/\\n+/g,`$&\n${A}`)+\"'\";return e.implicitKey?i:c4(i,A,qb,jp(e,!1))}function hB(t,e){let{singleQuote:A}=e.options,i;if(A===!1)i=C4;else{let n=t.includes('\"'),o=t.includes(\"'\");n&&!o?i=Vb:o&&!n?i=C4:i=A?Vb:C4}return i(t,e)}var Wb;try{Wb=new RegExp(`(^|(?<!\n))\n+(?!\n|$)`,\"g\")}catch(t){Wb=/\\n+(?!\\n|$)/g}function Pp({comment:t,type:e,value:A},i,n,o){let{blockQuote:a,commentString:r,lineWidth:s}=i.options;if(!a||/\\n[\\t ]+$/.test(A))return hB(A,i);let g=i.indent||(i.forceBlockIndent||qp(A)?\"  \":\"\"),l=a===\"literal\"?!0:a===\"folded\"||e===Ht.BLOCK_FOLDED?!1:e===Ht.BLOCK_LITERAL?!0:!e0A(A,s,g.length);if(!A)return l?`|\n`:`>\n`;let C,I;for(I=A.length;I>0;--I){let v=A[I-1];if(v!==`\n`&&v!==\"\t\"&&v!==\" \")break}let d=A.substring(I),B=d.indexOf(`\n`);B===-1?C=\"-\":A===d||B!==d.length-1?(C=\"+\",o&&o()):C=\"\",d&&(A=A.slice(0,-d.length),d[d.length-1]===`\n`&&(d=d.slice(0,-1)),d=d.replace(Wb,`$&${g}`));let Q=!1,E,f=-1;for(E=0;E<A.length;++E){let v=A[E];if(v===\" \")Q=!0;else if(v===`\n`)f=E;else break}let b=A.substring(0,f<E?f+1:E);b&&(A=A.substring(b.length),b=b.replace(/\\n+/g,`$&${g}`));let M=(Q?g?\"2\":\"1\":\"\")+C;if(t&&(M+=\" \"+r(t.replace(/ ?[\\r\\n]+/g,\" \")),n&&n()),!l){let v=A.replace(/\\n+/g,`\n$&`).replace(/(?:^|\\n)([\\t ].*)(?:([\\n\\t ]*)\\n(?![\\n\\t ]))?/g,\"$1$2\").replace(/\\n+/g,`$&${g}`),F=!1,G=jp(i,!0);a!==\"folded\"&&e!==Ht.BLOCK_FOLDED&&(G.onOverflow=()=>{F=!0});let U=c4(`${b}${v}${d}`,g,zp,G);if(!F)return`>${M}\n${g}${U}`}return A=A.replace(/\\n+/g,`$&${g}`),`|${M}\n${g}${b}${A}${d}`}function t0A(t,e,A,i){let{type:n,value:o}=t,{actualString:a,implicitKey:r,indent:s,indentStep:g,inFlow:l}=e;if(r&&o.includes(`\n`)||l&&/[[\\]{},]/.test(o))return hB(o,e);if(/^[\\n\\t ,[\\]{}#&*!|>'\"%@`]|^[?-]$|^[?-][ \\t]|[\\n:][ \\t]|[ \\t]\\n|[\\n\\t ]#|[\\n\\t :]$/.test(o))return r||l||!o.includes(`\n`)?hB(o,e):Pp(t,e,A,i);if(!r&&!l&&n!==Ht.PLAIN&&o.includes(`\n`))return Pp(t,e,A,i);if(qp(o)){if(s===\"\")return e.forceBlockIndent=!0,Pp(t,e,A,i);if(r&&s===g)return hB(o,e)}let C=o.replace(/\\n+/g,`$&\n${s}`);if(a){let I=Q=>Q.default&&Q.tag!==\"tag:yaml.org,2002:str\"&&Q.test?.test(C),{compat:d,tags:B}=e.doc.schema;if(B.some(I)||d?.some(I))return hB(o,e)}return r?C:c4(C,s,qb,jp(e,!1))}function A1(t,e,A,i){let{implicitKey:n,inFlow:o}=e,a=typeof t.value==\"string\"?t:Object.assign({},t,{value:String(t.value)}),{type:r}=t;r!==Ht.QUOTE_DOUBLE&&/[\\x00-\\x08\\x0b-\\x1f\\x7f-\\x9f\\u{D800}-\\u{DFFF}]/u.test(a.value)&&(r=Ht.QUOTE_DOUBLE);let s=l=>{switch(l){case Ht.BLOCK_FOLDED:case Ht.BLOCK_LITERAL:return n||o?hB(a.value,e):Pp(a,e,A,i);case Ht.QUOTE_DOUBLE:return C4(a.value,e);case Ht.QUOTE_SINGLE:return Vb(a.value,e);case Ht.PLAIN:return t0A(a,e,A,i);default:return null}},g=s(r);if(g===null){let{defaultKeyType:l,defaultStringType:C}=e.options,I=n&&l||C;if(g=s(I),g===null)throw new Error(`Unsupported default string type ${I}`)}return g}function Vp(t,e){let A=Object.assign({blockQuote:!0,commentString:_J,defaultKeyType:null,defaultStringType:\"PLAIN\",directives:null,doubleQuotedAsJSON:!1,doubleQuotedMinMultiLineLength:40,falseStr:\"false\",flowCollectionPadding:!0,indentSeq:!0,lineWidth:80,minContentWidth:20,nullStr:\"null\",simpleKeys:!1,singleQuote:null,trueStr:\"true\",verifyAliasOrder:!0},t.schema.toStringOptions,e),i;switch(A.collectionStyle){case\"block\":i=!1;break;case\"flow\":i=!0;break;default:i=null}return{anchors:new Set,doc:t,flowCollectionPadding:A.flowCollectionPadding?\" \":\"\",indent:\"\",indentStep:typeof A.indent==\"number\"?\" \".repeat(A.indent):\"  \",inFlow:i,options:A}}function i0A(t,e){if(e.tag){let n=t.filter(o=>o.tag===e.tag);if(n.length>0)return n.find(o=>o.format===e.format)??n[0]}let A,i;if(Ki(e)){i=e.value;let n=t.filter(o=>o.identify?.(i));if(n.length>1){let o=n.filter(a=>a.test);o.length>0&&(n=o)}A=n.find(o=>o.format===e.format)??n.find(o=>!o.format)}else i=e,A=t.find(n=>n.nodeClass&&i instanceof n.nodeClass);if(!A){let n=i?.constructor?.name??(i===null?\"null\":typeof i);throw new Error(`Tag not resolved for ${n} value`)}return A}function n0A(t,e,{anchors:A,doc:i}){if(!i.directives)return\"\";let n=[],o=(Ki(t)||Zn(t))&&t.anchor;o&&Hp(o)&&(A.add(o),n.push(`&${o}`));let a=t.tag??(e.default?null:e.tag);return a&&n.push(i.directives.tagString(a)),n.join(\" \")}function U0(t,e,A,i){if(dn(t))return t.toString(e,A,i);if(Og(t)){if(e.doc.directives)return t.toString(e);if(e.resolvedAliases?.has(t))throw new TypeError(\"Cannot stringify circular structure without alias nodes\");e.resolvedAliases?e.resolvedAliases.add(t):e.resolvedAliases=new Set([t]),t=t.resolve(e.doc)}let n,o=un(t)?t:e.doc.createNode(t,{onTagObj:s=>n=s});n??(n=i0A(e.doc.schema.tags,o));let a=n0A(o,n,e);a.length>0&&(e.indentAtStart=(e.indentAtStart??0)+a.length+1);let r=typeof n.stringify==\"function\"?n.stringify(o,e,A,i):Ki(o)?A1(o,e,A,i):o.toString(e,A,i);return a?Ki(o)||r[0]===\"{\"||r[0]===\"[\"?`${a} ${r}`:`${a}\n${e.indent}${r}`:r}function KJ({key:t,value:e},A,i,n){let{allNullValues:o,doc:a,indent:r,indentStep:s,options:{commentString:g,indentSeq:l,simpleKeys:C}}=A,I=un(t)&&t.comment||null;if(C){if(I)throw new Error(\"With simple keys, key nodes cannot have comments\");if(Zn(t)||!un(t)&&typeof t==\"object\"){let G=\"With simple keys, collection cannot be used as a key value\";throw new Error(G)}}let d=!C&&(!t||I&&e==null&&!A.inFlow||Zn(t)||(Ki(t)?t.type===Ht.BLOCK_FOLDED||t.type===Ht.BLOCK_LITERAL:typeof t==\"object\"));A=Object.assign({},A,{allNullValues:!1,implicitKey:!d&&(C||!o),indent:r+s});let B=!1,Q=!1,E=U0(t,A,()=>B=!0,()=>Q=!0);if(!d&&!A.inFlow&&E.length>1024){if(C)throw new Error(\"With simple keys, single line scalar must not span more than 1024 characters\");d=!0}if(A.inFlow){if(o||e==null)return B&&i&&i(),E===\"\"?\"?\":d?`? ${E}`:E}else if(o&&!C||e==null&&d)return E=`? ${E}`,I&&!B?E+=Hc(E,A.indent,g(I)):Q&&n&&n(),E;B&&(I=null),d?(I&&(E+=Hc(E,A.indent,g(I))),E=`? ${E}\n${r}:`):(E=`${E}:`,I&&(E+=Hc(E,A.indent,g(I))));let f,b,R;un(e)?(f=!!e.spaceBefore,b=e.commentBefore,R=e.comment):(f=!1,b=null,R=null,e&&typeof e==\"object\"&&(e=a.createNode(e))),A.implicitKey=!1,!d&&!I&&Ki(e)&&(A.indentAtStart=E.length+1),Q=!1,!l&&s.length>=2&&!A.inFlow&&!d&&_l(e)&&!e.flow&&!e.tag&&!e.anchor&&(A.indent=A.indent.substring(2));let M=!1,v=U0(e,A,()=>M=!0,()=>Q=!0),F=\" \";if(I||f||b){if(F=f?`\n`:\"\",b){let G=g(b);F+=`\n${zg(G,A.indent)}`}v===\"\"&&!A.inFlow?F===`\n`&&R&&(F=`\n\n`):F+=`\n${A.indent}`}else if(!d&&Zn(e)){let G=v[0],U=v.indexOf(`\n`),Y=U!==-1,j=A.inFlow??e.flow??e.items.length===0;if(Y||!j){let AA=!1;if(Y&&(G===\"&\"||G===\"!\")){let z=v.indexOf(\" \");G===\"&\"&&z!==-1&&z<U&&v[z+1]===\"!\"&&(z=v.indexOf(\" \",z+1)),(z===-1||U<z)&&(AA=!0)}AA||(F=`\n${A.indent}`)}}else(v===\"\"||v[0]===`\n`)&&(F=\"\");return E+=F+v,A.inFlow?M&&i&&i():R&&!M?E+=Hc(E,A.indent,g(R)):Q&&n&&n(),E}function Wp(t,e){(t===\"debug\"||t===\"warn\")&&console.warn(e)}var Zp=\"<<\",Gl={identify:t=>t===Zp||typeof t==\"symbol\"&&t.description===Zp,default:\"key\",tag:\"tag:yaml.org,2002:merge\",test:/^<<$/,resolve:()=>Object.assign(new Ht(Symbol(Zp)),{addToJSMap:Xb}),stringify:()=>Zp},UJ=(t,e)=>(Gl.identify(e)||Ki(e)&&(!e.type||e.type===Ht.PLAIN)&&Gl.identify(e.value))&&t?.doc.schema.tags.some(A=>A.tag===Gl.tag&&A.default);function Xb(t,e,A){if(A=t&&Og(A)?A.resolve(t.doc):A,_l(A))for(let i of A.items)Zb(t,e,i);else if(Array.isArray(A))for(let i of A)Zb(t,e,i);else Zb(t,e,A)}function Zb(t,e,A){let i=t&&Og(A)?A.resolve(t.doc):A;if(!Ll(i))throw new Error(\"Merge sources must be maps or map aliases\");let n=i.toJSON(null,t,Map);for(let[o,a]of n)e instanceof Map?e.has(o)||e.set(o,a):e instanceof Set?e.add(o):Object.prototype.hasOwnProperty.call(e,o)||Object.defineProperty(e,o,{value:a,writable:!0,enumerable:!0,configurable:!0});return e}function Xp(t,e,{key:A,value:i}){if(un(A)&&A.addToJSMap)A.addToJSMap(t,e,i);else if(UJ(t,A))Xb(t,e,i);else{let n=$a(A,\"\",t);if(e instanceof Map)e.set(n,$a(i,n,t));else if(e instanceof Set)e.add(n);else{let o=o0A(A,n,t),a=$a(i,o,t);o in e?Object.defineProperty(e,o,{value:a,writable:!0,enumerable:!0,configurable:!0}):e[o]=a}}return e}function o0A(t,e,A){if(e===null)return\"\";if(typeof e!=\"object\")return String(e);if(un(t)&&A?.doc){let i=Vp(A.doc,{});i.anchors=new Set;for(let o of A.anchors.keys())i.anchors.add(o.anchor);i.inFlow=!0,i.inStringifyKey=!0;let n=t.toString(i);if(!A.mapKeyWarned){let o=JSON.stringify(n);o.length>40&&(o=o.substring(0,36)+'...\"'),Wp(A.doc.options.logLevel,`Keys with collection values will be stringified due to JS Object restrictions: ${o}. Set mapAsMap: true to use object keys.`),A.mapKeyWarned=!0}return n}return JSON.stringify(e)}function uB(t,e,A){let i=K0(t,void 0,A),n=K0(e,void 0,A);return new va(i,n)}var va=class t{constructor(e,A=null){Object.defineProperty(this,Es,{value:zb}),this.key=e,this.value=A}clone(e){let{key:A,value:i}=this;return un(A)&&(A=A.clone(e)),un(i)&&(i=i.clone(e)),new t(A,i)}toJSON(e,A){let i=A?.mapAsMap?new Map:{};return Xp(A,i,this)}toString(e,A,i){return e?.doc?KJ(this,e,A,i):JSON.stringify(this)}};function A6(t,e,A){return(e.inFlow??t.flow?r0A:a0A)(t,e,A)}function a0A({comment:t,items:e},A,{blockItemPrefix:i,flowChars:n,itemIndent:o,onChompKeep:a,onComment:r}){let{indent:s,options:{commentString:g}}=A,l=Object.assign({},A,{indent:o,type:null}),C=!1,I=[];for(let B=0;B<e.length;++B){let Q=e[B],E=null;if(un(Q))!C&&Q.spaceBefore&&I.push(\"\"),$p(A,I,Q.commentBefore,C),Q.comment&&(E=Q.comment);else if(dn(Q)){let b=un(Q.key)?Q.key:null;b&&(!C&&b.spaceBefore&&I.push(\"\"),$p(A,I,b.commentBefore,C))}C=!1;let f=U0(Q,l,()=>E=null,()=>C=!0);E&&(f+=Hc(f,o,g(E))),C&&E&&(C=!1),I.push(i+f)}let d;if(I.length===0)d=n.start+n.end;else{d=I[0];for(let B=1;B<I.length;++B){let Q=I[B];d+=Q?`\n${s}${Q}`:`\n`}}return t?(d+=`\n`+zg(g(t),s),r&&r()):C&&a&&a(),d}function r0A({items:t},e,{flowChars:A,itemIndent:i}){let{indent:n,indentStep:o,flowCollectionPadding:a,options:{commentString:r}}=e;i+=o;let s=Object.assign({},e,{indent:i,inFlow:!0,type:null}),g=!1,l=0,C=[];for(let B=0;B<t.length;++B){let Q=t[B],E=null;if(un(Q))Q.spaceBefore&&C.push(\"\"),$p(e,C,Q.commentBefore,!1),Q.comment&&(E=Q.comment);else if(dn(Q)){let b=un(Q.key)?Q.key:null;b&&(b.spaceBefore&&C.push(\"\"),$p(e,C,b.commentBefore,!1),b.comment&&(g=!0));let R=un(Q.value)?Q.value:null;R?(R.comment&&(E=R.comment),R.commentBefore&&(g=!0)):Q.value==null&&b?.comment&&(E=b.comment)}E&&(g=!0);let f=U0(Q,s,()=>E=null);B<t.length-1&&(f+=\",\"),E&&(f+=Hc(f,i,r(E))),!g&&(C.length>l||f.includes(`\n`))&&(g=!0),C.push(f),l=C.length}let{start:I,end:d}=A;if(C.length===0)return I+d;if(!g){let B=C.reduce((Q,E)=>Q+E.length+2,2);g=e.options.lineWidth>0&&B>e.options.lineWidth}if(g){let B=I;for(let Q of C)B+=Q?`\n${o}${n}${Q}`:`\n`;return`${B}\n${n}${d}`}else return`${I}${a}${C.join(\" \")}${a}${d}`}function $p({indent:t,options:{commentString:e}},A,i,n){if(i&&n&&(i=i.replace(/^\\n+/,\"\")),i){let o=zg(e(i),t);A.push(o.trimStart())}}function t2(t,e){let A=Ki(e)?e.value:e;for(let i of t)if(dn(i)&&(i.key===e||i.key===A||Ki(i.key)&&i.key.value===A))return i}var Na=class extends QB{static get tagName(){return\"tag:yaml.org,2002:map\"}constructor(e){super(Nl,e),this.items=[]}static from(e,A,i){let{keepUndefined:n,replacer:o}=i,a=new this(e),r=(s,g)=>{if(typeof o==\"function\")g=o.call(A,s,g);else if(Array.isArray(o)&&!o.includes(s))return;(g!==void 0||n)&&a.items.push(uB(s,g,i))};if(A instanceof Map)for(let[s,g]of A)r(s,g);else if(A&&typeof A==\"object\")for(let s of Object.keys(A))r(s,A[s]);return typeof e.sortMapEntries==\"function\"&&a.items.sort(e.sortMapEntries),a}add(e,A){let i;dn(e)?i=e:!e||typeof e!=\"object\"||!(\"key\"in e)?i=new va(e,e?.value):i=new va(e.key,e.value);let n=t2(this.items,i.key),o=this.schema?.sortMapEntries;if(n){if(!A)throw new Error(`Key ${i.key} already set`);Ki(n.value)&&Op(i.value)?n.value.value=i.value:n.value=i.value}else if(o){let a=this.items.findIndex(r=>o(i,r)<0);a===-1?this.items.push(i):this.items.splice(a,0,i)}else this.items.push(i)}delete(e){let A=t2(this.items,e);return A?this.items.splice(this.items.indexOf(A),1).length>0:!1}get(e,A){let n=t2(this.items,e)?.value;return(!A&&Ki(n)?n.value:n)??void 0}has(e){return!!t2(this.items,e)}set(e,A){this.add(new va(e,A),!0)}toJSON(e,A,i){let n=i?new i:A?.mapAsMap?new Map:{};A?.onCreate&&A.onCreate(n);for(let o of this.items)Xp(A,n,o);return n}toString(e,A,i){if(!e)return JSON.stringify(this);for(let n of this.items)if(!dn(n))throw new Error(`Map items must all be pairs; found ${JSON.stringify(n)} instead`);return!e.allNullValues&&this.hasAllNullValues(!1)&&(e=Object.assign({},e,{allNullValues:!0})),A6(this,e,{blockItemPrefix:\"\",flowChars:{start:\"{\",end:\"}\"},itemIndent:e.indent||\"\",onChompKeep:i,onComment:A})}};var Kl={collection:\"map\",default:!0,nodeClass:Na,tag:\"tag:yaml.org,2002:map\",resolve(t,e){return Ll(t)||e(\"Expected a mapping for this tag\"),t},createNode:(t,e,A)=>Na.from(t,e,A)};var Zr=class extends QB{static get tagName(){return\"tag:yaml.org,2002:seq\"}constructor(e){super(_0,e),this.items=[]}add(e){this.items.push(e)}delete(e){let A=e6(e);return typeof A!=\"number\"?!1:this.items.splice(A,1).length>0}get(e,A){let i=e6(e);if(typeof i!=\"number\")return;let n=this.items[i];return!A&&Ki(n)?n.value:n}has(e){let A=e6(e);return typeof A==\"number\"&&A<this.items.length}set(e,A){let i=e6(e);if(typeof i!=\"number\")throw new Error(`Expected a valid index, not ${e}.`);let n=this.items[i];Ki(n)&&Op(A)?n.value=A:this.items[i]=A}toJSON(e,A){let i=[];A?.onCreate&&A.onCreate(i);let n=0;for(let o of this.items)i.push($a(o,String(n++),A));return i}toString(e,A,i){return e?A6(this,e,{blockItemPrefix:\"- \",flowChars:{start:\"[\",end:\"]\"},itemIndent:(e.indent||\"\")+\"  \",onChompKeep:i,onComment:A}):JSON.stringify(this)}static from(e,A,i){let{replacer:n}=i,o=new this(e);if(A&&Symbol.iterator in Object(A)){let a=0;for(let r of A){if(typeof n==\"function\"){let s=A instanceof Set?r:String(a++);r=n.call(A,s,r)}o.items.push(K0(r,void 0,i))}}return o}};function e6(t){let e=Ki(t)?t.value:t;return e&&typeof e==\"string\"&&(e=Number(e)),typeof e==\"number\"&&Number.isInteger(e)&&e>=0?e:null}var Ul={collection:\"seq\",default:!0,nodeClass:Zr,tag:\"tag:yaml.org,2002:seq\",resolve(t,e){return _l(t)||e(\"Expected a sequence for this tag\"),t},createNode:(t,e,A)=>Zr.from(t,e,A)};var i2={identify:t=>typeof t==\"string\",default:!0,tag:\"tag:yaml.org,2002:str\",resolve:t=>t,stringify(t,e,A,i){return e=Object.assign({actualString:!0},e),A1(t,e,A,i)}};var e1={identify:t=>t==null,createNode:()=>new Ht(null),default:!0,tag:\"tag:yaml.org,2002:null\",test:/^(?:~|[Nn]ull|NULL)?$/,resolve:()=>new Ht(null),stringify:({source:t},e)=>typeof t==\"string\"&&e1.test.test(t)?t:e.options.nullStr};var I4={identify:t=>typeof t==\"boolean\",default:!0,tag:\"tag:yaml.org,2002:bool\",test:/^(?:[Tt]rue|TRUE|[Ff]alse|FALSE)$/,resolve:t=>new Ht(t[0]===\"t\"||t[0]===\"T\"),stringify({source:t,value:e},A){if(t&&I4.test.test(t)){let i=t[0]===\"t\"||t[0]===\"T\";if(e===i)return t}return e?A.options.trueStr:A.options.falseStr}};function Xr({format:t,minFractionDigits:e,tag:A,value:i}){if(typeof i==\"bigint\")return String(i);let n=typeof i==\"number\"?i:Number(i);if(!isFinite(n))return isNaN(n)?\".nan\":n<0?\"-.inf\":\".inf\";let o=Object.is(i,-0)?\"-0\":JSON.stringify(i);if(!t&&e&&(!A||A===\"tag:yaml.org,2002:float\")&&/^\\d/.test(o)){let a=o.indexOf(\".\");a<0&&(a=o.length,o+=\".\");let r=e-(o.length-a-1);for(;r-- >0;)o+=\"0\"}return o}var t6={identify:t=>typeof t==\"number\",default:!0,tag:\"tag:yaml.org,2002:float\",test:/^(?:[-+]?\\.(?:inf|Inf|INF)|\\.nan|\\.NaN|\\.NAN)$/,resolve:t=>t.slice(-3).toLowerCase()===\"nan\"?NaN:t[0]===\"-\"?Number.NEGATIVE_INFINITY:Number.POSITIVE_INFINITY,stringify:Xr},i6={identify:t=>typeof t==\"number\",default:!0,tag:\"tag:yaml.org,2002:float\",format:\"EXP\",test:/^[-+]?(?:\\.[0-9]+|[0-9]+(?:\\.[0-9]*)?)[eE][-+]?[0-9]+$/,resolve:t=>parseFloat(t),stringify(t){let e=Number(t.value);return isFinite(e)?e.toExponential():Xr(t)}},n6={identify:t=>typeof t==\"number\",default:!0,tag:\"tag:yaml.org,2002:float\",test:/^[-+]?(?:\\.[0-9]+|[0-9]+\\.[0-9]*)$/,resolve(t){let e=new Ht(parseFloat(t)),A=t.indexOf(\".\");return A!==-1&&t[t.length-1]===\"0\"&&(e.minFractionDigits=t.length-A-1),e},stringify:Xr};var o6=t=>typeof t==\"bigint\"||Number.isInteger(t),$b=(t,e,A,{intAsBigInt:i})=>i?BigInt(t):parseInt(t.substring(e),A);function JJ(t,e,A){let{value:i}=t;return o6(i)&&i>=0?A+i.toString(e):Xr(t)}var a6={identify:t=>o6(t)&&t>=0,default:!0,tag:\"tag:yaml.org,2002:int\",format:\"OCT\",test:/^0o[0-7]+$/,resolve:(t,e,A)=>$b(t,2,8,A),stringify:t=>JJ(t,8,\"0o\")},r6={identify:o6,default:!0,tag:\"tag:yaml.org,2002:int\",test:/^[-+]?[0-9]+$/,resolve:(t,e,A)=>$b(t,0,10,A),stringify:Xr},s6={identify:t=>o6(t)&&t>=0,default:!0,tag:\"tag:yaml.org,2002:int\",format:\"HEX\",test:/^0x[0-9a-fA-F]+$/,resolve:(t,e,A)=>$b(t,2,16,A),stringify:t=>JJ(t,16,\"0x\")};var YJ=[Kl,Ul,i2,e1,I4,a6,r6,s6,t6,i6,n6];function HJ(t){return typeof t==\"bigint\"||Number.isInteger(t)}var g6=({value:t})=>JSON.stringify(t),s0A=[{identify:t=>typeof t==\"string\",default:!0,tag:\"tag:yaml.org,2002:str\",resolve:t=>t,stringify:g6},{identify:t=>t==null,createNode:()=>new Ht(null),default:!0,tag:\"tag:yaml.org,2002:null\",test:/^null$/,resolve:()=>null,stringify:g6},{identify:t=>typeof t==\"boolean\",default:!0,tag:\"tag:yaml.org,2002:bool\",test:/^true$|^false$/,resolve:t=>t===\"true\",stringify:g6},{identify:HJ,default:!0,tag:\"tag:yaml.org,2002:int\",test:/^-?(?:0|[1-9][0-9]*)$/,resolve:(t,e,{intAsBigInt:A})=>A?BigInt(t):parseInt(t,10),stringify:({value:t})=>HJ(t)?t.toString():JSON.stringify(t)},{identify:t=>typeof t==\"number\",default:!0,tag:\"tag:yaml.org,2002:float\",test:/^-?(?:0|[1-9][0-9]*)(?:\\.[0-9]*)?(?:[eE][-+]?[0-9]+)?$/,resolve:t=>parseFloat(t),stringify:g6}],g0A={default:!0,tag:\"\",test:/^/,resolve(t,e){return e(`Unresolved plain scalar ${JSON.stringify(t)}`),t}},TJ=[Kl,Ul].concat(s0A,g0A);var d4={identify:t=>t instanceof Uint8Array,default:!1,tag:\"tag:yaml.org,2002:binary\",resolve(t,e){if(typeof atob==\"function\"){let A=atob(t.replace(/[\\n\\r]/g,\"\")),i=new Uint8Array(A.length);for(let n=0;n<A.length;++n)i[n]=A.charCodeAt(n);return i}else return e(\"This environment does not support reading binary tags; either Buffer or atob is required\"),t},stringify({comment:t,type:e,value:A},i,n,o){if(!A)return\"\";let a=A,r;if(typeof btoa==\"function\"){let s=\"\";for(let g=0;g<a.length;++g)s+=String.fromCharCode(a[g]);r=btoa(s)}else throw new Error(\"This environment does not support writing binary tags; either Buffer or btoa is required\");if(e??(e=Ht.BLOCK_LITERAL),e!==Ht.QUOTE_DOUBLE){let s=Math.max(i.options.lineWidth-i.indent.length,i.options.minContentWidth),g=Math.ceil(r.length/s),l=new Array(g);for(let C=0,I=0;C<g;++C,I+=s)l[C]=r.substr(I,s);r=l.join(e===Ht.BLOCK_LITERAL?`\n`:\" \")}return A1({comment:t,type:e,value:r},i,n,o)}};function A9(t,e){if(_l(t))for(let A=0;A<t.items.length;++A){let i=t.items[A];if(!dn(i)){if(Ll(i)){i.items.length>1&&e(\"Each pair must have its own sequence indicator\");let n=i.items[0]||new va(new Ht(null));if(i.commentBefore&&(n.key.commentBefore=n.key.commentBefore?`${i.commentBefore}\n${n.key.commentBefore}`:i.commentBefore),i.comment){let o=n.value??n.key;o.comment=o.comment?`${i.comment}\n${o.comment}`:i.comment}i=n}t.items[A]=dn(i)?i:new va(i)}}else e(\"Expected a sequence for this tag\");return t}function e9(t,e,A){let{replacer:i}=A,n=new Zr(t);n.tag=\"tag:yaml.org,2002:pairs\";let o=0;if(e&&Symbol.iterator in Object(e))for(let a of e){typeof i==\"function\"&&(a=i.call(e,String(o++),a));let r,s;if(Array.isArray(a))if(a.length===2)r=a[0],s=a[1];else throw new TypeError(`Expected [key, value] tuple: ${a}`);else if(a&&a instanceof Object){let g=Object.keys(a);if(g.length===1)r=g[0],s=a[r];else throw new TypeError(`Expected tuple with one key, not ${g.length} keys`)}else r=a;n.items.push(uB(r,s,A))}return n}var B4={collection:\"seq\",default:!1,tag:\"tag:yaml.org,2002:pairs\",resolve:A9,createNode:e9};var t9=(()=>{class t extends Zr{constructor(){super(),this.add=Na.prototype.add.bind(this),this.delete=Na.prototype.delete.bind(this),this.get=Na.prototype.get.bind(this),this.has=Na.prototype.has.bind(this),this.set=Na.prototype.set.bind(this),this.tag=t.tag}toJSON(A,i){if(!i)return super.toJSON(A);let n=new Map;i?.onCreate&&i.onCreate(n);for(let o of this.items){let a,r;if(dn(o)?(a=$a(o.key,\"\",i),r=$a(o.value,a,i)):a=$a(o,\"\",i),n.has(a))throw new Error(\"Ordered maps must not include duplicate keys\");n.set(a,r)}return n}static from(A,i,n){let o=e9(A,i,n),a=new this;return a.items=o.items,a}}return t.tag=\"tag:yaml.org,2002:omap\",t})(),Q4={collection:\"seq\",identify:t=>t instanceof Map,nodeClass:t9,default:!1,tag:\"tag:yaml.org,2002:omap\",resolve(t,e){let A=A9(t,e),i=[];for(let{key:n}of A.items)Ki(n)&&(i.includes(n.value)?e(`Ordered maps must not include duplicate keys: ${n.value}`):i.push(n.value));return Object.assign(new t9,A)},createNode:(t,e,A)=>t9.from(t,e,A)};function OJ({value:t,source:e},A){return e&&(t?i9:n9).test.test(e)?e:t?A.options.trueStr:A.options.falseStr}var i9={identify:t=>t===!0,default:!0,tag:\"tag:yaml.org,2002:bool\",test:/^(?:Y|y|[Yy]es|YES|[Tt]rue|TRUE|[Oo]n|ON)$/,resolve:()=>new Ht(!0),stringify:OJ},n9={identify:t=>t===!1,default:!0,tag:\"tag:yaml.org,2002:bool\",test:/^(?:N|n|[Nn]o|NO|[Ff]alse|FALSE|[Oo]ff|OFF)$/,resolve:()=>new Ht(!1),stringify:OJ};var zJ={identify:t=>typeof t==\"number\",default:!0,tag:\"tag:yaml.org,2002:float\",test:/^(?:[-+]?\\.(?:inf|Inf|INF)|\\.nan|\\.NaN|\\.NAN)$/,resolve:t=>t.slice(-3).toLowerCase()===\"nan\"?NaN:t[0]===\"-\"?Number.NEGATIVE_INFINITY:Number.POSITIVE_INFINITY,stringify:Xr},PJ={identify:t=>typeof t==\"number\",default:!0,tag:\"tag:yaml.org,2002:float\",format:\"EXP\",test:/^[-+]?(?:[0-9][0-9_]*)?(?:\\.[0-9_]*)?[eE][-+]?[0-9]+$/,resolve:t=>parseFloat(t.replace(/_/g,\"\")),stringify(t){let e=Number(t.value);return isFinite(e)?e.toExponential():Xr(t)}},jJ={identify:t=>typeof t==\"number\",default:!0,tag:\"tag:yaml.org,2002:float\",test:/^[-+]?(?:[0-9][0-9_]*)?\\.[0-9_]*$/,resolve(t){let e=new Ht(parseFloat(t.replace(/_/g,\"\"))),A=t.indexOf(\".\");if(A!==-1){let i=t.substring(A+1).replace(/_/g,\"\");i[i.length-1]===\"0\"&&(e.minFractionDigits=i.length)}return e},stringify:Xr};var E4=t=>typeof t==\"bigint\"||Number.isInteger(t);function l6(t,e,A,{intAsBigInt:i}){let n=t[0];if((n===\"-\"||n===\"+\")&&(e+=1),t=t.substring(e).replace(/_/g,\"\"),i){switch(A){case 2:t=`0b${t}`;break;case 8:t=`0o${t}`;break;case 16:t=`0x${t}`;break}let a=BigInt(t);return n===\"-\"?BigInt(-1)*a:a}let o=parseInt(t,A);return n===\"-\"?-1*o:o}function o9(t,e,A){let{value:i}=t;if(E4(i)){let n=i.toString(e);return i<0?\"-\"+A+n.substr(1):A+n}return Xr(t)}var qJ={identify:E4,default:!0,tag:\"tag:yaml.org,2002:int\",format:\"BIN\",test:/^[-+]?0b[0-1_]+$/,resolve:(t,e,A)=>l6(t,2,2,A),stringify:t=>o9(t,2,\"0b\")},VJ={identify:E4,default:!0,tag:\"tag:yaml.org,2002:int\",format:\"OCT\",test:/^[-+]?0[0-7_]+$/,resolve:(t,e,A)=>l6(t,1,8,A),stringify:t=>o9(t,8,\"0\")},WJ={identify:E4,default:!0,tag:\"tag:yaml.org,2002:int\",test:/^[-+]?[0-9][0-9_]*$/,resolve:(t,e,A)=>l6(t,0,10,A),stringify:Xr},ZJ={identify:E4,default:!0,tag:\"tag:yaml.org,2002:int\",format:\"HEX\",test:/^[-+]?0x[0-9a-fA-F_]+$/,resolve:(t,e,A)=>l6(t,2,16,A),stringify:t=>o9(t,16,\"0x\")};var a9=(()=>{class t extends Na{constructor(A){super(A),this.tag=t.tag}add(A){let i;dn(A)?i=A:A&&typeof A==\"object\"&&\"key\"in A&&\"value\"in A&&A.value===null?i=new va(A.key,null):i=new va(A,null),t2(this.items,i.key)||this.items.push(i)}get(A,i){let n=t2(this.items,A);return!i&&dn(n)?Ki(n.key)?n.key.value:n.key:n}set(A,i){if(typeof i!=\"boolean\")throw new Error(`Expected boolean value for set(key, value) in a YAML set, not ${typeof i}`);let n=t2(this.items,A);n&&!i?this.items.splice(this.items.indexOf(n),1):!n&&i&&this.items.push(new va(A))}toJSON(A,i){return super.toJSON(A,i,Set)}toString(A,i,n){if(!A)return JSON.stringify(this);if(this.hasAllNullValues(!0))return super.toString(Object.assign({},A,{allNullValues:!0}),i,n);throw new Error(\"Set items must all have null values\")}static from(A,i,n){let{replacer:o}=n,a=new this(A);if(i&&Symbol.iterator in Object(i))for(let r of i)typeof o==\"function\"&&(r=o.call(i,r,r)),a.items.push(uB(r,null,n));return a}}return t.tag=\"tag:yaml.org,2002:set\",t})(),h4={collection:\"map\",identify:t=>t instanceof Set,nodeClass:a9,default:!1,tag:\"tag:yaml.org,2002:set\",createNode:(t,e,A)=>a9.from(t,e,A),resolve(t,e){if(Ll(t)){if(t.hasAllNullValues(!0))return Object.assign(new a9,t);e(\"Set items must all have null values\")}else e(\"Expected a mapping for this tag\");return t}};function r9(t,e){let A=t[0],i=A===\"-\"||A===\"+\"?t.substring(1):t,n=a=>e?BigInt(a):Number(a),o=i.replace(/_/g,\"\").split(\":\").reduce((a,r)=>a*n(60)+n(r),n(0));return A===\"-\"?n(-1)*o:o}function XJ(t){let{value:e}=t,A=a=>a;if(typeof e==\"bigint\")A=a=>BigInt(a);else if(isNaN(e)||!isFinite(e))return Xr(t);let i=\"\";e<0&&(i=\"-\",e*=A(-1));let n=A(60),o=[e%n];return e<60?o.unshift(0):(e=(e-o[0])/n,o.unshift(e%n),e>=60&&(e=(e-o[0])/n,o.unshift(e))),i+o.map(a=>String(a).padStart(2,\"0\")).join(\":\").replace(/000000\\d*$/,\"\")}var c6={identify:t=>typeof t==\"bigint\"||Number.isInteger(t),default:!0,tag:\"tag:yaml.org,2002:int\",format:\"TIME\",test:/^[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+$/,resolve:(t,e,{intAsBigInt:A})=>r9(t,A),stringify:XJ},C6={identify:t=>typeof t==\"number\",default:!0,tag:\"tag:yaml.org,2002:float\",format:\"TIME\",test:/^[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\\.[0-9_]*$/,resolve:t=>r9(t,!1),stringify:XJ},fB={identify:t=>t instanceof Date,default:!0,tag:\"tag:yaml.org,2002:timestamp\",test:RegExp(\"^([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})(?:(?:t|T|[ \\\\t]+)([0-9]{1,2}):([0-9]{1,2}):([0-9]{1,2}(\\\\.[0-9]+)?)(?:[ \\\\t]*(Z|[-+][012]?[0-9](?::[0-9]{2})?))?)?$\"),resolve(t){let e=t.match(fB.test);if(!e)throw new Error(\"!!timestamp expects a date, starting with yyyy-mm-dd\");let[,A,i,n,o,a,r]=e.map(Number),s=e[7]?Number((e[7]+\"00\").substr(1,3)):0,g=Date.UTC(A,i-1,n,o||0,a||0,r||0,s),l=e[8];if(l&&l!==\"Z\"){let C=r9(l,!1);Math.abs(C)<30&&(C*=60),g-=6e4*C}return new Date(g)},stringify:({value:t})=>t?.toISOString().replace(/(T00:00:00)?\\.000Z$/,\"\")??\"\"};var s9=[Kl,Ul,i2,e1,i9,n9,qJ,VJ,WJ,ZJ,zJ,PJ,jJ,d4,Gl,Q4,B4,h4,c6,C6,fB];var $J=new Map([[\"core\",YJ],[\"failsafe\",[Kl,Ul,i2]],[\"json\",TJ],[\"yaml11\",s9],[\"yaml-1.1\",s9]]),AY={binary:d4,bool:I4,float:n6,floatExp:i6,floatNaN:t6,floatTime:C6,int:r6,intHex:s6,intOct:a6,intTime:c6,map:Kl,merge:Gl,null:e1,omap:Q4,pairs:B4,seq:Ul,set:h4,timestamp:fB},eY={\"tag:yaml.org,2002:binary\":d4,\"tag:yaml.org,2002:merge\":Gl,\"tag:yaml.org,2002:omap\":Q4,\"tag:yaml.org,2002:pairs\":B4,\"tag:yaml.org,2002:set\":h4,\"tag:yaml.org,2002:timestamp\":fB};function I6(t,e,A){let i=$J.get(e);if(i&&!t)return A&&!i.includes(Gl)?i.concat(Gl):i.slice();let n=i;if(!n)if(Array.isArray(t))n=[];else{let o=Array.from($J.keys()).filter(a=>a!==\"yaml11\").map(a=>JSON.stringify(a)).join(\", \");throw new Error(`Unknown schema \"${e}\"; use one of ${o} or define customTags array`)}if(Array.isArray(t))for(let o of t)n=n.concat(o);else typeof t==\"function\"&&(n=t(n.slice()));return A&&(n=n.concat(Gl)),n.reduce((o,a)=>{let r=typeof a==\"string\"?AY[a]:a;if(!r){let s=JSON.stringify(a),g=Object.keys(AY).map(l=>JSON.stringify(l)).join(\", \");throw new Error(`Unknown custom tag ${s}; use one of ${g}`)}return o.includes(r)||o.push(r),o},[])}var l0A=(t,e)=>t.key<e.key?-1:t.key>e.key?1:0,u4=class t{constructor({compat:e,customTags:A,merge:i,resolveKnownTags:n,schema:o,sortMapEntries:a,toStringDefaults:r}){this.compat=Array.isArray(e)?I6(e,\"compat\"):e?I6(null,e):null,this.name=typeof o==\"string\"&&o||\"core\",this.knownTags=n?eY:{},this.tags=I6(A,this.name,i),this.toStringOptions=r??null,Object.defineProperty(this,Nl,{value:Kl}),Object.defineProperty(this,dg,{value:i2}),Object.defineProperty(this,_0,{value:Ul}),this.sortMapEntries=typeof a==\"function\"?a:a===!0?l0A:null}clone(){let e=Object.create(t.prototype,Object.getOwnPropertyDescriptors(this));return e.tags=this.tags.slice(),e}};function tY(t,e){let A=[],i=e.directives===!0;if(e.directives!==!1&&t.directives){let s=t.directives.toString(t);s?(A.push(s),i=!0):t.directives.docStart&&(i=!0)}i&&A.push(\"---\");let n=Vp(t,e),{commentString:o}=n.options;if(t.commentBefore){A.length!==1&&A.unshift(\"\");let s=o(t.commentBefore);A.unshift(zg(s,\"\"))}let a=!1,r=null;if(t.contents){if(un(t.contents)){if(t.contents.spaceBefore&&i&&A.push(\"\"),t.contents.commentBefore){let l=o(t.contents.commentBefore);A.push(zg(l,\"\"))}n.forceBlockIndent=!!t.comment,r=t.contents.comment}let s=r?void 0:()=>a=!0,g=U0(t.contents,n,()=>r=null,s);r&&(g+=Hc(g,\"\",o(r))),(g[0]===\"|\"||g[0]===\">\")&&A[A.length-1]===\"---\"?A[A.length-1]=`--- ${g}`:A.push(g)}else A.push(U0(t.contents,n));if(t.directives?.docEnd)if(t.comment){let s=o(t.comment);s.includes(`\n`)?(A.push(\"...\"),A.push(zg(s,\"\"))):A.push(`... ${s}`)}else A.push(\"...\");else{let s=t.comment;s&&a&&(s=s.replace(/^\\n+/,\"\")),s&&((!a||r)&&A[A.length-1]!==\"\"&&A.push(\"\"),A.push(zg(o(s),\"\")))}return A.join(`\n`)+`\n`}var J0=class t{constructor(e,A,i){this.commentBefore=null,this.comment=null,this.errors=[],this.warnings=[],Object.defineProperty(this,Es,{value:Up});let n=null;typeof A==\"function\"||Array.isArray(A)?n=A:i===void 0&&A&&(i=A,A=void 0);let o=Object.assign({intAsBigInt:!1,keepSourceTokens:!1,logLevel:\"warn\",prettyErrors:!0,strict:!0,stringKeys:!1,uniqueKeys:!0,version:\"1.2\"},i);this.options=o;let{version:a}=o;i?._directives?(this.directives=i._directives.atDocument(),this.directives.yaml.explicit&&(a=this.directives.yaml.version)):this.directives=new BB({version:a}),this.setSchema(a,i),this.contents=e===void 0?null:this.createNode(e,n,i)}clone(){let e=Object.create(t.prototype,{[Es]:{value:Up}});return e.commentBefore=this.commentBefore,e.comment=this.comment,e.errors=this.errors.slice(),e.warnings=this.warnings.slice(),e.options=Object.assign({},this.options),this.directives&&(e.directives=this.directives.clone()),e.schema=this.schema.clone(),e.contents=un(this.contents)?this.contents.clone(e.schema):this.contents,this.range&&(e.range=this.range.slice()),e}add(e){mB(this.contents)&&this.contents.add(e)}addIn(e,A){mB(this.contents)&&this.contents.addIn(e,A)}createAlias(e,A){if(!e.anchor){let i=Pb(this);e.anchor=!A||i.has(A)?jb(A||\"a\",i):A}return new G0(e.anchor)}createNode(e,A,i){let n;if(typeof A==\"function\")e=A.call({\"\":e},\"\",e),n=A;else if(Array.isArray(A)){let E=b=>typeof b==\"number\"||b instanceof String||b instanceof Number,f=A.filter(E).map(String);f.length>0&&(A=A.concat(f)),n=A}else i===void 0&&A&&(i=A,A=void 0);let{aliasDuplicateObjects:o,anchorPrefix:a,flow:r,keepUndefined:s,onTagObj:g,tag:l}=i??{},{onAnchor:C,setAnchors:I,sourceObjects:d}=LJ(this,a||\"a\"),B={aliasDuplicateObjects:o??!0,keepUndefined:s??!1,onAnchor:C,onTagObj:g,replacer:n,schema:this.schema,sourceObjects:d},Q=K0(e,l,B);return r&&Zn(Q)&&(Q.flow=!0),I(),Q}createPair(e,A,i={}){let n=this.createNode(e,null,i),o=this.createNode(A,null,i);return new va(n,o)}delete(e){return mB(this.contents)?this.contents.delete(e):!1}deleteIn(e){return EB(e)?this.contents==null?!1:(this.contents=null,!0):mB(this.contents)?this.contents.deleteIn(e):!1}get(e,A){return Zn(this.contents)?this.contents.get(e,A):void 0}getIn(e,A){return EB(e)?!A&&Ki(this.contents)?this.contents.value:this.contents:Zn(this.contents)?this.contents.getIn(e,A):void 0}has(e){return Zn(this.contents)?this.contents.has(e):!1}hasIn(e){return EB(e)?this.contents!==void 0:Zn(this.contents)?this.contents.hasIn(e):!1}set(e,A){this.contents==null?this.contents=g4(this.schema,[e],A):mB(this.contents)&&this.contents.set(e,A)}setIn(e,A){EB(e)?this.contents=A:this.contents==null?this.contents=g4(this.schema,Array.from(e),A):mB(this.contents)&&this.contents.setIn(e,A)}setSchema(e,A={}){typeof e==\"number\"&&(e=String(e));let i;switch(e){case\"1.1\":this.directives?this.directives.yaml.version=\"1.1\":this.directives=new BB({version:\"1.1\"}),i={resolveKnownTags:!1,schema:\"yaml-1.1\"};break;case\"1.2\":case\"next\":this.directives?this.directives.yaml.version=e:this.directives=new BB({version:e}),i={resolveKnownTags:!0,schema:\"core\"};break;case null:this.directives&&delete this.directives,i=null;break;default:{let n=JSON.stringify(e);throw new Error(`Expected '1.1', '1.2' or null as first argument, but found: ${n}`)}}if(A.schema instanceof Object)this.schema=A.schema;else if(i)this.schema=new u4(Object.assign(i,A));else throw new Error(\"With a null YAML version, the { schema: Schema } option is required\")}toJS({json:e,jsonArg:A,mapAsMap:i,maxAliasCount:n,onAnchor:o,reviver:a}={}){let r={anchors:new Map,doc:this,keep:!e,mapAsMap:i===!0,mapKeyWarned:!1,maxAliasCount:typeof n==\"number\"?n:100},s=$a(this.contents,A??\"\",r);if(typeof o==\"function\")for(let{count:g,res:l}of r.anchors.values())o(l,g);return typeof a==\"function\"?A2(a,{\"\":s},\"\",s):s}toJSON(e,A){return this.toJS({json:!0,jsonArg:e,mapAsMap:!1,onAnchor:A})}toString(e={}){if(this.errors.length>0)throw new Error(\"Document with errors cannot be stringified\");if(\"indent\"in e&&(!Number.isInteger(e.indent)||Number(e.indent)<=0)){let A=JSON.stringify(e.indent);throw new Error(`\"indent\" option must be a positive integer, not ${A}`)}return tY(this,e)}};function mB(t){if(Zn(t))return!0;throw new Error(\"Expected a YAML collection as document contents\")}var f4=class extends Error{constructor(e,A,i,n){super(),this.name=e,this.code=i,this.message=n,this.pos=A}},Jl=class extends f4{constructor(e,A,i){super(\"YAMLParseError\",e,A,i)}},m4=class extends f4{constructor(e,A,i){super(\"YAMLWarning\",e,A,i)}},g9=(t,e)=>A=>{if(A.pos[0]===-1)return;A.linePos=A.pos.map(r=>e.linePos(r));let{line:i,col:n}=A.linePos[0];A.message+=` at line ${i}, column ${n}`;let o=n-1,a=t.substring(e.lineStarts[i-1],e.lineStarts[i]).replace(/[\\n\\r]+$/,\"\");if(o>=60&&a.length>80){let r=Math.min(o-39,a.length-79);a=\"\\u2026\"+a.substring(r),o-=r-1}if(a.length>80&&(a=a.substring(0,79)+\"\\u2026\"),i>1&&/^ *$/.test(a.substring(0,o))){let r=t.substring(e.lineStarts[i-2],e.lineStarts[i-1]);r.length>80&&(r=r.substring(0,79)+`\\u2026\n`),a=r+a}if(/[^ ]/.test(a)){let r=1,s=A.linePos[1];s?.line===i&&s.col>n&&(r=Math.max(1,Math.min(s.col-n,80-o)));let g=\" \".repeat(o)+\"^\".repeat(r);A.message+=`:\n\n${a}\n${g}\n`}};function Tc(t,{flow:e,indicator:A,next:i,offset:n,onError:o,parentIndent:a,startOnNewline:r}){let s=!1,g=r,l=r,C=\"\",I=\"\",d=!1,B=!1,Q=null,E=null,f=null,b=null,R=null,M=null,v=null;for(let U of t)switch(B&&(U.type!==\"space\"&&U.type!==\"newline\"&&U.type!==\"comma\"&&o(U.offset,\"MISSING_CHAR\",\"Tags and anchors must be separated from the next token by white space\"),B=!1),Q&&(g&&U.type!==\"comment\"&&U.type!==\"newline\"&&o(Q,\"TAB_AS_INDENT\",\"Tabs are not allowed as indentation\"),Q=null),U.type){case\"space\":!e&&(A!==\"doc-start\"||i?.type!==\"flow-collection\")&&U.source.includes(\"\t\")&&(Q=U),l=!0;break;case\"comment\":{l||o(U,\"MISSING_CHAR\",\"Comments must be separated from other tokens by white space characters\");let Y=U.source.substring(1)||\" \";C?C+=I+Y:C=Y,I=\"\",g=!1;break}case\"newline\":g?C?C+=U.source:(!M||A!==\"seq-item-ind\")&&(s=!0):I+=U.source,g=!0,d=!0,(E||f)&&(b=U),l=!0;break;case\"anchor\":E&&o(U,\"MULTIPLE_ANCHORS\",\"A node can have at most one anchor\"),U.source.endsWith(\":\")&&o(U.offset+U.source.length-1,\"BAD_ALIAS\",\"Anchor ending in : is ambiguous\",!0),E=U,v??(v=U.offset),g=!1,l=!1,B=!0;break;case\"tag\":{f&&o(U,\"MULTIPLE_TAGS\",\"A node can have at most one tag\"),f=U,v??(v=U.offset),g=!1,l=!1,B=!0;break}case A:(E||f)&&o(U,\"BAD_PROP_ORDER\",`Anchors and tags must be after the ${U.source} indicator`),M&&o(U,\"UNEXPECTED_TOKEN\",`Unexpected ${U.source} in ${e??\"collection\"}`),M=U,g=A===\"seq-item-ind\"||A===\"explicit-key-ind\",l=!1;break;case\"comma\":if(e){R&&o(U,\"UNEXPECTED_TOKEN\",`Unexpected , in ${e}`),R=U,g=!1,l=!1;break}default:o(U,\"UNEXPECTED_TOKEN\",`Unexpected ${U.type} token`),g=!1,l=!1}let F=t[t.length-1],G=F?F.offset+F.source.length:n;return B&&i&&i.type!==\"space\"&&i.type!==\"newline\"&&i.type!==\"comma\"&&(i.type!==\"scalar\"||i.source!==\"\")&&o(i.offset,\"MISSING_CHAR\",\"Tags and anchors must be separated from the next token by white space\"),Q&&(g&&Q.indent<=a||i?.type===\"block-map\"||i?.type===\"block-seq\")&&o(Q,\"TAB_AS_INDENT\",\"Tabs are not allowed as indentation\"),{comma:R,found:M,spaceBefore:s,comment:C,hasNewline:d,anchor:E,tag:f,newlineAfterProp:b,end:G,start:v??G}}function n2(t){if(!t)return null;switch(t.type){case\"alias\":case\"scalar\":case\"double-quoted-scalar\":case\"single-quoted-scalar\":if(t.source.includes(`\n`))return!0;if(t.end){for(let e of t.end)if(e.type===\"newline\")return!0}return!1;case\"flow-collection\":for(let e of t.items){for(let A of e.start)if(A.type===\"newline\")return!0;if(e.sep){for(let A of e.sep)if(A.type===\"newline\")return!0}if(n2(e.key)||n2(e.value))return!0}return!1;default:return!0}}function p4(t,e,A){if(e?.type===\"flow-collection\"){let i=e.end[0];i.indent===t&&(i.source===\"]\"||i.source===\"}\")&&n2(e)&&A(i,\"BAD_INDENT\",\"Flow end indicator should be more indented than parent\",!0)}}function d6(t,e,A){let{uniqueKeys:i}=t.options;if(i===!1)return!1;let n=typeof i==\"function\"?i:(o,a)=>o===a||Ki(o)&&Ki(a)&&o.value===a.value;return e.some(o=>n(o.key,A))}var iY=\"All mapping items must start at the same column\";function nY({composeNode:t,composeEmptyNode:e},A,i,n,o){let a=o?.nodeClass??Na,r=new a(A.schema);A.atRoot&&(A.atRoot=!1);let s=i.offset,g=null;for(let l of i.items){let{start:C,key:I,sep:d,value:B}=l,Q=Tc(C,{indicator:\"explicit-key-ind\",next:I??d?.[0],offset:s,onError:n,parentIndent:i.indent,startOnNewline:!0}),E=!Q.found;if(E){if(I&&(I.type===\"block-seq\"?n(s,\"BLOCK_AS_IMPLICIT_KEY\",\"A block sequence may not be used as an implicit map key\"):\"indent\"in I&&I.indent!==i.indent&&n(s,\"BAD_INDENT\",iY)),!Q.anchor&&!Q.tag&&!d){g=Q.end,Q.comment&&(r.comment?r.comment+=`\n`+Q.comment:r.comment=Q.comment);continue}(Q.newlineAfterProp||n2(I))&&n(I??C[C.length-1],\"MULTILINE_IMPLICIT_KEY\",\"Implicit keys need to be on a single line\")}else Q.found?.indent!==i.indent&&n(s,\"BAD_INDENT\",iY);A.atKey=!0;let f=Q.end,b=I?t(A,I,Q,n):e(A,f,C,null,Q,n);A.schema.compat&&p4(i.indent,I,n),A.atKey=!1,d6(A,r.items,b)&&n(f,\"DUPLICATE_KEY\",\"Map keys must be unique\");let R=Tc(d??[],{indicator:\"map-value-ind\",next:B,offset:b.range[2],onError:n,parentIndent:i.indent,startOnNewline:!I||I.type===\"block-scalar\"});if(s=R.end,R.found){E&&(B?.type===\"block-map\"&&!R.hasNewline&&n(s,\"BLOCK_AS_IMPLICIT_KEY\",\"Nested mappings are not allowed in compact mappings\"),A.options.strict&&Q.start<R.found.offset-1024&&n(b.range,\"KEY_OVER_1024_CHARS\",\"The : indicator must be at most 1024 chars after the start of an implicit block mapping key\"));let M=B?t(A,B,R,n):e(A,s,d,null,R,n);A.schema.compat&&p4(i.indent,B,n),s=M.range[2];let v=new va(b,M);A.options.keepSourceTokens&&(v.srcToken=l),r.items.push(v)}else{E&&n(b.range,\"MISSING_CHAR\",\"Implicit map keys need to be followed by map values\"),R.comment&&(b.comment?b.comment+=`\n`+R.comment:b.comment=R.comment);let M=new va(b);A.options.keepSourceTokens&&(M.srcToken=l),r.items.push(M)}}return g&&g<s&&n(g,\"IMPOSSIBLE\",\"Map comment with trailing content\"),r.range=[i.offset,s,g??s],r}function oY({composeNode:t,composeEmptyNode:e},A,i,n,o){let a=o?.nodeClass??Zr,r=new a(A.schema);A.atRoot&&(A.atRoot=!1),A.atKey&&(A.atKey=!1);let s=i.offset,g=null;for(let{start:l,value:C}of i.items){let I=Tc(l,{indicator:\"seq-item-ind\",next:C,offset:s,onError:n,parentIndent:i.indent,startOnNewline:!0});if(!I.found)if(I.anchor||I.tag||C)C?.type===\"block-seq\"?n(I.end,\"BAD_INDENT\",\"All sequence items must start at the same column\"):n(s,\"MISSING_CHAR\",\"Sequence item without - indicator\");else{g=I.end,I.comment&&(r.comment=I.comment);continue}let d=C?t(A,C,I,n):e(A,I.end,l,null,I,n);A.schema.compat&&p4(i.indent,C,n),s=d.range[2],r.items.push(d)}return r.range=[i.offset,s,g??s],r}function Oc(t,e,A,i){let n=\"\";if(t){let o=!1,a=\"\";for(let r of t){let{source:s,type:g}=r;switch(g){case\"space\":o=!0;break;case\"comment\":{A&&!o&&i(r,\"MISSING_CHAR\",\"Comments must be separated from other tokens by white space characters\");let l=s.substring(1)||\" \";n?n+=a+l:n=l,a=\"\";break}case\"newline\":n&&(a+=s),o=!0;break;default:i(r,\"UNEXPECTED_TOKEN\",`Unexpected ${g} at node end`)}e+=s.length}}return{comment:n,offset:e}}var l9=\"Block collections are not allowed within flow collections\",c9=t=>t&&(t.type===\"block-map\"||t.type===\"block-seq\");function aY({composeNode:t,composeEmptyNode:e},A,i,n,o){let a=i.start.source===\"{\",r=a?\"flow map\":\"flow sequence\",s=o?.nodeClass??(a?Na:Zr),g=new s(A.schema);g.flow=!0;let l=A.atRoot;l&&(A.atRoot=!1),A.atKey&&(A.atKey=!1);let C=i.offset+i.start.source.length;for(let E=0;E<i.items.length;++E){let f=i.items[E],{start:b,key:R,sep:M,value:v}=f,F=Tc(b,{flow:r,indicator:\"explicit-key-ind\",next:R??M?.[0],offset:C,onError:n,parentIndent:i.indent,startOnNewline:!1});if(!F.found){if(!F.anchor&&!F.tag&&!M&&!v){E===0&&F.comma?n(F.comma,\"UNEXPECTED_TOKEN\",`Unexpected , in ${r}`):E<i.items.length-1&&n(F.start,\"UNEXPECTED_TOKEN\",`Unexpected empty item in ${r}`),F.comment&&(g.comment?g.comment+=`\n`+F.comment:g.comment=F.comment),C=F.end;continue}!a&&A.options.strict&&n2(R)&&n(R,\"MULTILINE_IMPLICIT_KEY\",\"Implicit keys of flow sequence pairs need to be on a single line\")}if(E===0)F.comma&&n(F.comma,\"UNEXPECTED_TOKEN\",`Unexpected , in ${r}`);else if(F.comma||n(F.start,\"MISSING_CHAR\",`Missing , between ${r} items`),F.comment){let G=\"\";A:for(let U of b)switch(U.type){case\"comma\":case\"space\":break;case\"comment\":G=U.source.substring(1);break A;default:break A}if(G){let U=g.items[g.items.length-1];dn(U)&&(U=U.value??U.key),U.comment?U.comment+=`\n`+G:U.comment=G,F.comment=F.comment.substring(G.length+1)}}if(!a&&!M&&!F.found){let G=v?t(A,v,F,n):e(A,F.end,M,null,F,n);g.items.push(G),C=G.range[2],c9(v)&&n(G.range,\"BLOCK_IN_FLOW\",l9)}else{A.atKey=!0;let G=F.end,U=R?t(A,R,F,n):e(A,G,b,null,F,n);c9(R)&&n(U.range,\"BLOCK_IN_FLOW\",l9),A.atKey=!1;let Y=Tc(M??[],{flow:r,indicator:\"map-value-ind\",next:v,offset:U.range[2],onError:n,parentIndent:i.indent,startOnNewline:!1});if(Y.found){if(!a&&!F.found&&A.options.strict){if(M)for(let z of M){if(z===Y.found)break;if(z.type===\"newline\"){n(z,\"MULTILINE_IMPLICIT_KEY\",\"Implicit keys of flow sequence pairs need to be on a single line\");break}}F.start<Y.found.offset-1024&&n(Y.found,\"KEY_OVER_1024_CHARS\",\"The : indicator must be at most 1024 chars after the start of an implicit flow sequence key\")}}else v&&(\"source\"in v&&v.source?.[0]===\":\"?n(v,\"MISSING_CHAR\",`Missing space after : in ${r}`):n(Y.start,\"MISSING_CHAR\",`Missing , or : between ${r} items`));let j=v?t(A,v,Y,n):Y.found?e(A,Y.end,M,null,Y,n):null;j?c9(v)&&n(j.range,\"BLOCK_IN_FLOW\",l9):Y.comment&&(U.comment?U.comment+=`\n`+Y.comment:U.comment=Y.comment);let AA=new va(U,j);if(A.options.keepSourceTokens&&(AA.srcToken=f),a){let z=g;d6(A,z.items,U)&&n(G,\"DUPLICATE_KEY\",\"Map keys must be unique\"),z.items.push(AA)}else{let z=new Na(A.schema);z.flow=!0,z.items.push(AA);let yA=(j??U).range;z.range=[U.range[0],yA[1],yA[2]],g.items.push(z)}C=j?j.range[2]:Y.end}}let I=a?\"}\":\"]\",[d,...B]=i.end,Q=C;if(d?.source===I)Q=d.offset+d.source.length;else{let E=r[0].toUpperCase()+r.substring(1),f=l?`${E} must end with a ${I}`:`${E} in block collection must be sufficiently indented and end with a ${I}`;n(C,l?\"MISSING_CHAR\":\"BAD_INDENT\",f),d&&d.source.length!==1&&B.unshift(d)}if(B.length>0){let E=Oc(B,Q,A.options.strict,n);E.comment&&(g.comment?g.comment+=`\n`+E.comment:g.comment=E.comment),g.range=[i.offset,Q,E.offset]}else g.range=[i.offset,Q,Q];return g}function C9(t,e,A,i,n,o){let a=A.type===\"block-map\"?nY(t,e,A,i,o):A.type===\"block-seq\"?oY(t,e,A,i,o):aY(t,e,A,i,o),r=a.constructor;return n===\"!\"||n===r.tagName?(a.tag=r.tagName,a):(n&&(a.tag=n),a)}function rY(t,e,A,i,n){let o=i.tag,a=o?e.directives.tagName(o.source,I=>n(o,\"TAG_RESOLVE_FAILED\",I)):null;if(A.type===\"block-seq\"){let{anchor:I,newlineAfterProp:d}=i,B=I&&o?I.offset>o.offset?I:o:I??o;B&&(!d||d.offset<B.offset)&&n(B,\"MISSING_CHAR\",\"Missing newline after block sequence props\")}let r=A.type===\"block-map\"?\"map\":A.type===\"block-seq\"?\"seq\":A.start.source===\"{\"?\"map\":\"seq\";if(!o||!a||a===\"!\"||a===Na.tagName&&r===\"map\"||a===Zr.tagName&&r===\"seq\")return C9(t,e,A,n,a);let s=e.schema.tags.find(I=>I.tag===a&&I.collection===r);if(!s){let I=e.schema.knownTags[a];if(I?.collection===r)e.schema.tags.push(Object.assign({},I,{default:!1})),s=I;else return I?n(o,\"BAD_COLLECTION_TYPE\",`${I.tag} used for ${r} collection, but expects ${I.collection??\"scalar\"}`,!0):n(o,\"TAG_RESOLVE_FAILED\",`Unresolved tag: ${a}`,!0),C9(t,e,A,n,a)}let g=C9(t,e,A,n,a,s),l=s.resolve?.(g,I=>n(o,\"TAG_RESOLVE_FAILED\",I),e.options)??g,C=un(l)?l:new Ht(l);return C.range=g.range,C.tag=a,s?.format&&(C.format=s.format),C}function I9(t,e,A){let i=e.offset,n=c0A(e,t.options.strict,A);if(!n)return{value:\"\",type:null,comment:\"\",range:[i,i,i]};let o=n.mode===\">\"?Ht.BLOCK_FOLDED:Ht.BLOCK_LITERAL,a=e.source?C0A(e.source):[],r=a.length;for(let Q=a.length-1;Q>=0;--Q){let E=a[Q][1];if(E===\"\"||E===\"\\r\")r=Q;else break}if(r===0){let Q=n.chomp===\"+\"&&a.length>0?`\n`.repeat(Math.max(1,a.length-1)):\"\",E=i+n.length;return e.source&&(E+=e.source.length),{value:Q,type:o,comment:n.comment,range:[i,E,E]}}let s=e.indent+n.indent,g=e.offset+n.length,l=0;for(let Q=0;Q<r;++Q){let[E,f]=a[Q];if(f===\"\"||f===\"\\r\")n.indent===0&&E.length>s&&(s=E.length);else{E.length<s&&A(g+E.length,\"MISSING_CHAR\",\"Block scalars with more-indented leading empty lines must use an explicit indentation indicator\"),n.indent===0&&(s=E.length),l=Q,s===0&&!t.atRoot&&A(g,\"BAD_INDENT\",\"Block scalar values in collections must be indented\");break}g+=E.length+f.length+1}for(let Q=a.length-1;Q>=r;--Q)a[Q][0].length>s&&(r=Q+1);let C=\"\",I=\"\",d=!1;for(let Q=0;Q<l;++Q)C+=a[Q][0].slice(s)+`\n`;for(let Q=l;Q<r;++Q){let[E,f]=a[Q];g+=E.length+f.length+1;let b=f[f.length-1]===\"\\r\";if(b&&(f=f.slice(0,-1)),f&&E.length<s){let M=`Block scalar lines must not be less indented than their ${n.indent?\"explicit indentation indicator\":\"first line\"}`;A(g-f.length-(b?2:1),\"BAD_INDENT\",M),E=\"\"}o===Ht.BLOCK_LITERAL?(C+=I+E.slice(s)+f,I=`\n`):E.length>s||f[0]===\"\t\"?(I===\" \"?I=`\n`:!d&&I===`\n`&&(I=`\n\n`),C+=I+E.slice(s)+f,I=`\n`,d=!0):f===\"\"?I===`\n`?C+=`\n`:I=`\n`:(C+=I+f,I=\" \",d=!1)}switch(n.chomp){case\"-\":break;case\"+\":for(let Q=r;Q<a.length;++Q)C+=`\n`+a[Q][0].slice(s);C[C.length-1]!==`\n`&&(C+=`\n`);break;default:C+=`\n`}let B=i+n.length+e.source.length;return{value:C,type:o,comment:n.comment,range:[i,B,B]}}function c0A({offset:t,props:e},A,i){if(e[0].type!==\"block-scalar-header\")return i(e[0],\"IMPOSSIBLE\",\"Block scalar header not found\"),null;let{source:n}=e[0],o=n[0],a=0,r=\"\",s=-1;for(let I=1;I<n.length;++I){let d=n[I];if(!r&&(d===\"-\"||d===\"+\"))r=d;else{let B=Number(d);!a&&B?a=B:s===-1&&(s=t+I)}}s!==-1&&i(s,\"UNEXPECTED_TOKEN\",`Block scalar header includes extra characters: ${n}`);let g=!1,l=\"\",C=n.length;for(let I=1;I<e.length;++I){let d=e[I];switch(d.type){case\"space\":g=!0;case\"newline\":C+=d.source.length;break;case\"comment\":A&&!g&&i(d,\"MISSING_CHAR\",\"Comments must be separated from other tokens by white space characters\"),C+=d.source.length,l=d.source.substring(1);break;case\"error\":i(d,\"UNEXPECTED_TOKEN\",d.message),C+=d.source.length;break;default:{let B=`Unexpected token in block scalar header: ${d.type}`;i(d,\"UNEXPECTED_TOKEN\",B);let Q=d.source;Q&&typeof Q==\"string\"&&(C+=Q.length)}}}return{mode:o,indent:a,chomp:r,comment:l,length:C}}function C0A(t){let e=t.split(/\\n( *)/),A=e[0],i=A.match(/^( *)/),o=[i?.[1]?[i[1],A.slice(i[1].length)]:[\"\",A]];for(let a=1;a<e.length;a+=2)o.push([e[a],e[a+1]]);return o}function d9(t,e,A){let{offset:i,type:n,source:o,end:a}=t,r,s,g=(I,d,B)=>A(i+I,d,B);switch(n){case\"scalar\":r=Ht.PLAIN,s=I0A(o,g);break;case\"single-quoted-scalar\":r=Ht.QUOTE_SINGLE,s=d0A(o,g);break;case\"double-quoted-scalar\":r=Ht.QUOTE_DOUBLE,s=B0A(o,g);break;default:return A(t,\"UNEXPECTED_TOKEN\",`Expected a flow scalar value, but found: ${n}`),{value:\"\",type:null,comment:\"\",range:[i,i+o.length,i+o.length]}}let l=i+o.length,C=Oc(a,l,e,A);return{value:s,type:r,comment:C.comment,range:[i,l,C.offset]}}function I0A(t,e){let A=\"\";switch(t[0]){case\"\t\":A=\"a tab character\";break;case\",\":A=\"flow indicator character ,\";break;case\"%\":A=\"directive indicator character %\";break;case\"|\":case\">\":{A=`block scalar indicator ${t[0]}`;break}case\"@\":case\"`\":{A=`reserved character ${t[0]}`;break}}return A&&e(0,\"BAD_SCALAR_START\",`Plain value cannot start with ${A}`),sY(t)}function d0A(t,e){return(t[t.length-1]!==\"'\"||t.length===1)&&e(t.length,\"MISSING_CHAR\",\"Missing closing 'quote\"),sY(t.slice(1,-1)).replace(/''/g,\"'\")}function sY(t){let e,A;try{e=new RegExp(`(.*?)(?<![ \t])[ \t]*\\r?\n`,\"sy\"),A=new RegExp(`[ \t]*(.*?)(?:(?<![ \t])[ \t]*)?\\r?\n`,\"sy\")}catch(s){e=/(.*?)[ \\t]*\\r?\\n/sy,A=/[ \\t]*(.*?)[ \\t]*\\r?\\n/sy}let i=e.exec(t);if(!i)return t;let n=i[1],o=\" \",a=e.lastIndex;for(A.lastIndex=a;i=A.exec(t);)i[1]===\"\"?o===`\n`?n+=o:o=`\n`:(n+=o+i[1],o=\" \"),a=A.lastIndex;let r=/[ \\t]*(.*)/sy;return r.lastIndex=a,i=r.exec(t),n+o+(i?.[1]??\"\")}function B0A(t,e){let A=\"\";for(let i=1;i<t.length-1;++i){let n=t[i];if(!(n===\"\\r\"&&t[i+1]===`\n`))if(n===`\n`){let{fold:o,offset:a}=Q0A(t,i);A+=o,i=a}else if(n===\"\\\\\"){let o=t[++i],a=E0A[o];if(a)A+=a;else if(o===`\n`)for(o=t[i+1];o===\" \"||o===\"\t\";)o=t[++i+1];else if(o===\"\\r\"&&t[i+1]===`\n`)for(o=t[++i+1];o===\" \"||o===\"\t\";)o=t[++i+1];else if(o===\"x\"||o===\"u\"||o===\"U\"){let r={x:2,u:4,U:8}[o];A+=h0A(t,i+1,r,e),i+=r}else{let r=t.substr(i-1,2);e(i-1,\"BAD_DQ_ESCAPE\",`Invalid escape sequence ${r}`),A+=r}}else if(n===\" \"||n===\"\t\"){let o=i,a=t[i+1];for(;a===\" \"||a===\"\t\";)a=t[++i+1];a!==`\n`&&!(a===\"\\r\"&&t[i+2]===`\n`)&&(A+=i>o?t.slice(o,i+1):n)}else A+=n}return(t[t.length-1]!=='\"'||t.length===1)&&e(t.length,\"MISSING_CHAR\",'Missing closing \"quote'),A}function Q0A(t,e){let A=\"\",i=t[e+1];for(;(i===\" \"||i===\"\t\"||i===`\n`||i===\"\\r\")&&!(i===\"\\r\"&&t[e+2]!==`\n`);)i===`\n`&&(A+=`\n`),e+=1,i=t[e+1];return A||(A=\" \"),{fold:A,offset:e}}var E0A={0:\"\\0\",a:\"\\x07\",b:\"\\b\",e:\"\\x1B\",f:\"\\f\",n:`\n`,r:\"\\r\",t:\"\t\",v:\"\\v\",N:\"\\x85\",_:\"\\xA0\",L:\"\\u2028\",P:\"\\u2029\",\" \":\" \",'\"':'\"',\"/\":\"/\",\"\\\\\":\"\\\\\",\"\t\":\"\t\"};function h0A(t,e,A,i){let n=t.substr(e,A),a=n.length===A&&/^[0-9a-fA-F]+$/.test(n)?parseInt(n,16):NaN;if(isNaN(a)){let r=t.substr(e-2,A+2);return i(e-2,\"BAD_DQ_ESCAPE\",`Invalid escape sequence ${r}`),r}return String.fromCodePoint(a)}function B9(t,e,A,i){let{value:n,type:o,comment:a,range:r}=e.type===\"block-scalar\"?I9(t,e,i):d9(e,t.options.strict,i),s=A?t.directives.tagName(A.source,C=>i(A,\"TAG_RESOLVE_FAILED\",C)):null,g;t.options.stringKeys&&t.atKey?g=t.schema[dg]:s?g=u0A(t.schema,n,s,A,i):e.type===\"scalar\"?g=f0A(t,n,e,i):g=t.schema[dg];let l;try{let C=g.resolve(n,I=>i(A??e,\"TAG_RESOLVE_FAILED\",I),t.options);l=Ki(C)?C:new Ht(C)}catch(C){let I=C instanceof Error?C.message:String(C);i(A??e,\"TAG_RESOLVE_FAILED\",I),l=new Ht(n)}return l.range=r,l.source=n,o&&(l.type=o),s&&(l.tag=s),g.format&&(l.format=g.format),a&&(l.comment=a),l}function u0A(t,e,A,i,n){if(A===\"!\")return t[dg];let o=[];for(let r of t.tags)if(!r.collection&&r.tag===A)if(r.default&&r.test)o.push(r);else return r;for(let r of o)if(r.test?.test(e))return r;let a=t.knownTags[A];return a&&!a.collection?(t.tags.push(Object.assign({},a,{default:!1,test:void 0})),a):(n(i,\"TAG_RESOLVE_FAILED\",`Unresolved tag: ${A}`,A!==\"tag:yaml.org,2002:str\"),t[dg])}function f0A({atKey:t,directives:e,schema:A},i,n,o){let a=A.tags.find(r=>(r.default===!0||t&&r.default===\"key\")&&r.test?.test(i))||A[dg];if(A.compat){let r=A.compat.find(s=>s.default&&s.test?.test(i))??A[dg];if(a.tag!==r.tag){let s=e.tagString(a.tag),g=e.tagString(r.tag),l=`Value may be parsed as either ${s} or ${g}`;o(n,\"TAG_RESOLVE_FAILED\",l,!0)}}return a}function gY(t,e,A){if(e){A??(A=e.length);for(let i=A-1;i>=0;--i){let n=e[i];switch(n.type){case\"space\":case\"comment\":case\"newline\":t-=n.source.length;continue}for(n=e[++i];n?.type===\"space\";)t+=n.source.length,n=e[++i];break}}return t}var m0A={composeNode:Q9,composeEmptyNode:B6};function Q9(t,e,A,i){let n=t.atKey,{spaceBefore:o,comment:a,anchor:r,tag:s}=A,g,l=!0;switch(e.type){case\"alias\":g=p0A(t,e,i),(r||s)&&i(e,\"ALIAS_PROPS\",\"An alias node must not specify any properties\");break;case\"scalar\":case\"single-quoted-scalar\":case\"double-quoted-scalar\":case\"block-scalar\":g=B9(t,e,s,i),r&&(g.anchor=r.source.substring(1));break;case\"block-map\":case\"block-seq\":case\"flow-collection\":g=rY(m0A,t,e,A,i),r&&(g.anchor=r.source.substring(1));break;default:{let C=e.type===\"error\"?e.message:`Unsupported token (type: ${e.type})`;i(e,\"UNEXPECTED_TOKEN\",C),g=B6(t,e.offset,void 0,null,A,i),l=!1}}return r&&g.anchor===\"\"&&i(r,\"BAD_ALIAS\",\"Anchor cannot be an empty string\"),n&&t.options.stringKeys&&(!Ki(g)||typeof g.value!=\"string\"||g.tag&&g.tag!==\"tag:yaml.org,2002:str\")&&i(s??e,\"NON_STRING_KEY\",\"With stringKeys, all keys must be strings\"),o&&(g.spaceBefore=!0),a&&(e.type===\"scalar\"&&e.source===\"\"?g.comment=a:g.commentBefore=a),t.options.keepSourceTokens&&l&&(g.srcToken=e),g}function B6(t,e,A,i,{spaceBefore:n,comment:o,anchor:a,tag:r,end:s},g){let l={type:\"scalar\",offset:gY(e,A,i),indent:-1,source:\"\"},C=B9(t,l,r,g);return a&&(C.anchor=a.source.substring(1),C.anchor===\"\"&&g(a,\"BAD_ALIAS\",\"Anchor cannot be an empty string\")),n&&(C.spaceBefore=!0),o&&(C.comment=o,C.range[2]=s),C}function p0A({options:t},{offset:e,source:A,end:i},n){let o=new G0(A.substring(1));o.source===\"\"&&n(e,\"BAD_ALIAS\",\"Alias cannot be an empty string\"),o.source.endsWith(\":\")&&n(e+A.length-1,\"BAD_ALIAS\",\"Alias ending in : is ambiguous\",!0);let a=e+A.length,r=Oc(i,a,t.strict,n);return o.range=[e,a,r.offset],r.comment&&(o.comment=r.comment),o}function lY(t,e,{offset:A,start:i,value:n,end:o},a){let r=Object.assign({_directives:e},t),s=new J0(void 0,r),g={atKey:!1,atRoot:!0,directives:s.directives,options:s.options,schema:s.schema},l=Tc(i,{indicator:\"doc-start\",next:n??o?.[0],offset:A,onError:a,parentIndent:0,startOnNewline:!0});l.found&&(s.directives.docStart=!0,n&&(n.type===\"block-map\"||n.type===\"block-seq\")&&!l.hasNewline&&a(l.end,\"MISSING_CHAR\",\"Block collection cannot start on same line with directives-end marker\")),s.contents=n?Q9(g,n,l,a):B6(g,l.end,i,null,l,a);let C=s.contents.range[2],I=Oc(o,C,!1,a);return I.comment&&(s.comment=I.comment),s.range=[A,C,I.offset],s}function D4(t){if(typeof t==\"number\")return[t,t+1];if(Array.isArray(t))return t.length===2?t:[t[0],t[1]];let{offset:e,source:A}=t;return[e,e+(typeof A==\"string\"?A.length:1)]}function cY(t){let e=\"\",A=!1,i=!1;for(let n=0;n<t.length;++n){let o=t[n];switch(o[0]){case\"#\":e+=(e===\"\"?\"\":i?`\n\n`:`\n`)+(o.substring(1)||\" \"),A=!0,i=!1;break;case\"%\":t[n+1]?.[0]!==\"#\"&&(n+=1),A=!1;break;default:A||(i=!0),A=!1}}return{comment:e,afterEmptyLine:i}}var w4=class{constructor(e={}){this.doc=null,this.atDirectives=!1,this.prelude=[],this.errors=[],this.warnings=[],this.onError=(A,i,n,o)=>{let a=D4(A);o?this.warnings.push(new m4(a,i,n)):this.errors.push(new Jl(a,i,n))},this.directives=new BB({version:e.version||\"1.2\"}),this.options=e}decorate(e,A){let{comment:i,afterEmptyLine:n}=cY(this.prelude);if(i){let o=e.contents;if(A)e.comment=e.comment?`${e.comment}\n${i}`:i;else if(n||e.directives.docStart||!o)e.commentBefore=i;else if(Zn(o)&&!o.flow&&o.items.length>0){let a=o.items[0];dn(a)&&(a=a.key);let r=a.commentBefore;a.commentBefore=r?`${i}\n${r}`:i}else{let a=o.commentBefore;o.commentBefore=a?`${i}\n${a}`:i}}A?(Array.prototype.push.apply(e.errors,this.errors),Array.prototype.push.apply(e.warnings,this.warnings)):(e.errors=this.errors,e.warnings=this.warnings),this.prelude=[],this.errors=[],this.warnings=[]}streamInfo(){return{comment:cY(this.prelude).comment,directives:this.directives,errors:this.errors,warnings:this.warnings}}*compose(e,A=!1,i=-1){for(let n of e)yield*le(this.next(n));yield*le(this.end(A,i))}*next(e){switch(e.type){case\"directive\":this.directives.add(e.source,(A,i,n)=>{let o=D4(e);o[0]+=A,this.onError(o,\"BAD_DIRECTIVE\",i,n)}),this.prelude.push(e.source),this.atDirectives=!0;break;case\"document\":{let A=lY(this.options,this.directives,e,this.onError);this.atDirectives&&!A.directives.docStart&&this.onError(e,\"MISSING_CHAR\",\"Missing directives-end/doc-start indicator line\"),this.decorate(A,!1),this.doc&&(yield this.doc),this.doc=A,this.atDirectives=!1;break}case\"byte-order-mark\":case\"space\":break;case\"comment\":case\"newline\":this.prelude.push(e.source);break;case\"error\":{let A=e.source?`${e.message}: ${JSON.stringify(e.source)}`:e.message,i=new Jl(D4(e),\"UNEXPECTED_TOKEN\",A);this.atDirectives||!this.doc?this.errors.push(i):this.doc.errors.push(i);break}case\"doc-end\":{if(!this.doc){let i=\"Unexpected doc-end without preceding document\";this.errors.push(new Jl(D4(e),\"UNEXPECTED_TOKEN\",i));break}this.doc.directives.docEnd=!0;let A=Oc(e.end,e.offset+e.source.length,this.doc.options.strict,this.onError);if(this.decorate(this.doc,!0),A.comment){let i=this.doc.comment;this.doc.comment=i?`${i}\n${A.comment}`:A.comment}this.doc.range[2]=A.offset;break}default:this.errors.push(new Jl(D4(e),\"UNEXPECTED_TOKEN\",`Unsupported token ${e.type}`))}}*end(e=!1,A=-1){if(this.doc)this.decorate(this.doc,!0),yield this.doc,this.doc=null;else if(e){let i=Object.assign({_directives:this.directives},this.options),n=new J0(void 0,i);this.atDirectives&&this.onError(A,\"MISSING_CHAR\",\"Missing directives-end indicator line\"),n.range=[0,A,A],this.decorate(n,!1),yield n}}};var E9=Symbol(\"break visit\"),D0A=Symbol(\"skip children\"),CY=Symbol(\"remove item\");function t1(t,e){\"type\"in t&&t.type===\"document\"&&(t={start:t.start,value:t.value}),IY(Object.freeze([]),t,e)}t1.BREAK=E9;t1.SKIP=D0A;t1.REMOVE=CY;t1.itemAtPath=(t,e)=>{let A=t;for(let[i,n]of e){let o=A?.[i];if(o&&\"items\"in o)A=o.items[n];else return}return A};t1.parentCollection=(t,e)=>{let A=t1.itemAtPath(t,e.slice(0,-1)),i=e[e.length-1][0],n=A?.[i];if(n&&\"items\"in n)return n;throw new Error(\"Parent collection not found\")};function IY(t,e,A){let i=A(e,t);if(typeof i==\"symbol\")return i;for(let n of[\"key\",\"value\"]){let o=e[n];if(o&&\"items\"in o){for(let a=0;a<o.items.length;++a){let r=IY(Object.freeze(t.concat([[n,a]])),o.items[a],A);if(typeof r==\"number\")a=r-1;else{if(r===E9)return E9;r===CY&&(o.items.splice(a,1),a-=1)}}typeof i==\"function\"&&n===\"key\"&&(i=i(e,t))}}return typeof i==\"function\"?i(e,t):i}var h9=\"\\uFEFF\",u9=\"\u0002\",f9=\"\u0018\",Q6=\"\u001f\";function dY(t){switch(t){case h9:return\"byte-order-mark\";case u9:return\"doc-mode\";case f9:return\"flow-error-end\";case Q6:return\"scalar\";case\"---\":return\"doc-start\";case\"...\":return\"doc-end\";case\"\":case`\n`:case`\\r\n`:return\"newline\";case\"-\":return\"seq-item-ind\";case\"?\":return\"explicit-key-ind\";case\":\":return\"map-value-ind\";case\"{\":return\"flow-map-start\";case\"}\":return\"flow-map-end\";case\"[\":return\"flow-seq-start\";case\"]\":return\"flow-seq-end\";case\",\":return\"comma\"}switch(t[0]){case\" \":case\"\t\":return\"space\";case\"#\":return\"comment\";case\"%\":return\"directive-line\";case\"*\":return\"alias\";case\"&\":return\"anchor\";case\"!\":return\"tag\";case\"'\":return\"single-quoted-scalar\";case'\"':return\"double-quoted-scalar\";case\"|\":case\">\":return\"block-scalar-header\"}return null}function Yl(t){switch(t){case void 0:case\" \":case`\n`:case\"\\r\":case\"\t\":return!0;default:return!1}}var BY=new Set(\"0123456789ABCDEFabcdef\"),y0A=new Set(\"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-#;/?:@&=+$_.!~*'()\"),E6=new Set(\",[]{}\"),v0A=new Set(` ,[]{}\n\\r\t`),m9=t=>!t||v0A.has(t),y4=class{constructor(){this.atEnd=!1,this.blockScalarIndent=-1,this.blockScalarKeep=!1,this.buffer=\"\",this.flowKey=!1,this.flowLevel=0,this.indentNext=0,this.indentValue=0,this.lineEndPos=null,this.next=null,this.pos=0}*lex(e,A=!1){if(e){if(typeof e!=\"string\")throw TypeError(\"source is not a string\");this.buffer=this.buffer?this.buffer+e:e,this.lineEndPos=null}this.atEnd=!A;let i=this.next??\"stream\";for(;i&&(A||this.hasChars(1));)i=yield*le(this.parseNext(i))}atLineEnd(){let e=this.pos,A=this.buffer[e];for(;A===\" \"||A===\"\t\";)A=this.buffer[++e];return!A||A===\"#\"||A===`\n`?!0:A===\"\\r\"?this.buffer[e+1]===`\n`:!1}charAt(e){return this.buffer[this.pos+e]}continueScalar(e){let A=this.buffer[e];if(this.indentNext>0){let i=0;for(;A===\" \";)A=this.buffer[++i+e];if(A===\"\\r\"){let n=this.buffer[i+e+1];if(n===`\n`||!n&&!this.atEnd)return e+i+1}return A===`\n`||i>=this.indentNext||!A&&!this.atEnd?e+i:-1}if(A===\"-\"||A===\".\"){let i=this.buffer.substr(e,3);if((i===\"---\"||i===\"...\")&&Yl(this.buffer[e+3]))return-1}return e}getLine(){let e=this.lineEndPos;return(typeof e!=\"number\"||e!==-1&&e<this.pos)&&(e=this.buffer.indexOf(`\n`,this.pos),this.lineEndPos=e),e===-1?this.atEnd?this.buffer.substring(this.pos):null:(this.buffer[e-1]===\"\\r\"&&(e-=1),this.buffer.substring(this.pos,e))}hasChars(e){return this.pos+e<=this.buffer.length}setNext(e){return this.buffer=this.buffer.substring(this.pos),this.pos=0,this.lineEndPos=null,this.next=e,null}peek(e){return this.buffer.substr(this.pos,e)}*parseNext(e){switch(e){case\"stream\":return yield*le(this.parseStream());case\"line-start\":return yield*le(this.parseLineStart());case\"block-start\":return yield*le(this.parseBlockStart());case\"doc\":return yield*le(this.parseDocument());case\"flow\":return yield*le(this.parseFlowCollection());case\"quoted-scalar\":return yield*le(this.parseQuotedScalar());case\"block-scalar\":return yield*le(this.parseBlockScalar());case\"plain-scalar\":return yield*le(this.parsePlainScalar())}}*parseStream(){let e=this.getLine();if(e===null)return this.setNext(\"stream\");if(e[0]===h9&&(yield*le(this.pushCount(1)),e=e.substring(1)),e[0]===\"%\"){let A=e.length,i=e.indexOf(\"#\");for(;i!==-1;){let o=e[i-1];if(o===\" \"||o===\"\t\"){A=i-1;break}else i=e.indexOf(\"#\",i+1)}for(;;){let o=e[A-1];if(o===\" \"||o===\"\t\")A-=1;else break}let n=(yield*le(this.pushCount(A)))+(yield*le(this.pushSpaces(!0)));return yield*le(this.pushCount(e.length-n)),this.pushNewline(),\"stream\"}if(this.atLineEnd()){let A=yield*le(this.pushSpaces(!0));return yield*le(this.pushCount(e.length-A)),yield*le(this.pushNewline()),\"stream\"}return yield u9,yield*le(this.parseLineStart())}*parseLineStart(){let e=this.charAt(0);if(!e&&!this.atEnd)return this.setNext(\"line-start\");if(e===\"-\"||e===\".\"){if(!this.atEnd&&!this.hasChars(4))return this.setNext(\"line-start\");let A=this.peek(3);if((A===\"---\"||A===\"...\")&&Yl(this.charAt(3)))return yield*le(this.pushCount(3)),this.indentValue=0,this.indentNext=0,A===\"---\"?\"doc\":\"stream\"}return this.indentValue=yield*le(this.pushSpaces(!1)),this.indentNext>this.indentValue&&!Yl(this.charAt(1))&&(this.indentNext=this.indentValue),yield*le(this.parseBlockStart())}*parseBlockStart(){let[e,A]=this.peek(2);if(!A&&!this.atEnd)return this.setNext(\"block-start\");if((e===\"-\"||e===\"?\"||e===\":\")&&Yl(A)){let i=(yield*le(this.pushCount(1)))+(yield*le(this.pushSpaces(!0)));return this.indentNext=this.indentValue+1,this.indentValue+=i,yield*le(this.parseBlockStart())}return\"doc\"}*parseDocument(){yield*le(this.pushSpaces(!0));let e=this.getLine();if(e===null)return this.setNext(\"doc\");let A=yield*le(this.pushIndicators());switch(e[A]){case\"#\":yield*le(this.pushCount(e.length-A));case void 0:return yield*le(this.pushNewline()),yield*le(this.parseLineStart());case\"{\":case\"[\":return yield*le(this.pushCount(1)),this.flowKey=!1,this.flowLevel=1,\"flow\";case\"}\":case\"]\":return yield*le(this.pushCount(1)),\"doc\";case\"*\":return yield*le(this.pushUntil(m9)),\"doc\";case'\"':case\"'\":return yield*le(this.parseQuotedScalar());case\"|\":case\">\":return A+=yield*le(this.parseBlockScalarHeader()),A+=yield*le(this.pushSpaces(!0)),yield*le(this.pushCount(e.length-A)),yield*le(this.pushNewline()),yield*le(this.parseBlockScalar());default:return yield*le(this.parsePlainScalar())}}*parseFlowCollection(){let e,A,i=-1;do e=yield*le(this.pushNewline()),e>0?(A=yield*le(this.pushSpaces(!1)),this.indentValue=i=A):A=0,A+=yield*le(this.pushSpaces(!0));while(e+A>0);let n=this.getLine();if(n===null)return this.setNext(\"flow\");if((i!==-1&&i<this.indentNext&&n[0]!==\"#\"||i===0&&(n.startsWith(\"---\")||n.startsWith(\"...\"))&&Yl(n[3]))&&!(i===this.indentNext-1&&this.flowLevel===1&&(n[0]===\"]\"||n[0]===\"}\")))return this.flowLevel=0,yield f9,yield*le(this.parseLineStart());let o=0;for(;n[o]===\",\";)o+=yield*le(this.pushCount(1)),o+=yield*le(this.pushSpaces(!0)),this.flowKey=!1;switch(o+=yield*le(this.pushIndicators()),n[o]){case void 0:return\"flow\";case\"#\":return yield*le(this.pushCount(n.length-o)),\"flow\";case\"{\":case\"[\":return yield*le(this.pushCount(1)),this.flowKey=!1,this.flowLevel+=1,\"flow\";case\"}\":case\"]\":return yield*le(this.pushCount(1)),this.flowKey=!0,this.flowLevel-=1,this.flowLevel?\"flow\":\"doc\";case\"*\":return yield*le(this.pushUntil(m9)),\"flow\";case'\"':case\"'\":return this.flowKey=!0,yield*le(this.parseQuotedScalar());case\":\":{let a=this.charAt(1);if(this.flowKey||Yl(a)||a===\",\")return this.flowKey=!1,yield*le(this.pushCount(1)),yield*le(this.pushSpaces(!0)),\"flow\"}default:return this.flowKey=!1,yield*le(this.parsePlainScalar())}}*parseQuotedScalar(){let e=this.charAt(0),A=this.buffer.indexOf(e,this.pos+1);if(e===\"'\")for(;A!==-1&&this.buffer[A+1]===\"'\";)A=this.buffer.indexOf(\"'\",A+2);else for(;A!==-1;){let o=0;for(;this.buffer[A-1-o]===\"\\\\\";)o+=1;if(o%2===0)break;A=this.buffer.indexOf('\"',A+1)}let i=this.buffer.substring(0,A),n=i.indexOf(`\n`,this.pos);if(n!==-1){for(;n!==-1;){let o=this.continueScalar(n+1);if(o===-1)break;n=i.indexOf(`\n`,o)}n!==-1&&(A=n-(i[n-1]===\"\\r\"?2:1))}if(A===-1){if(!this.atEnd)return this.setNext(\"quoted-scalar\");A=this.buffer.length}return yield*le(this.pushToIndex(A+1,!1)),this.flowLevel?\"flow\":\"doc\"}*parseBlockScalarHeader(){this.blockScalarIndent=-1,this.blockScalarKeep=!1;let e=this.pos;for(;;){let A=this.buffer[++e];if(A===\"+\")this.blockScalarKeep=!0;else if(A>\"0\"&&A<=\"9\")this.blockScalarIndent=Number(A)-1;else if(A!==\"-\")break}return yield*le(this.pushUntil(A=>Yl(A)||A===\"#\"))}*parseBlockScalar(){let e=this.pos-1,A=0,i;A:for(let o=this.pos;i=this.buffer[o];++o)switch(i){case\" \":A+=1;break;case`\n`:e=o,A=0;break;case\"\\r\":{let a=this.buffer[o+1];if(!a&&!this.atEnd)return this.setNext(\"block-scalar\");if(a===`\n`)break}default:break A}if(!i&&!this.atEnd)return this.setNext(\"block-scalar\");if(A>=this.indentNext){this.blockScalarIndent===-1?this.indentNext=A:this.indentNext=this.blockScalarIndent+(this.indentNext===0?1:this.indentNext);do{let o=this.continueScalar(e+1);if(o===-1)break;e=this.buffer.indexOf(`\n`,o)}while(e!==-1);if(e===-1){if(!this.atEnd)return this.setNext(\"block-scalar\");e=this.buffer.length}}let n=e+1;for(i=this.buffer[n];i===\" \";)i=this.buffer[++n];if(i===\"\t\"){for(;i===\"\t\"||i===\" \"||i===\"\\r\"||i===`\n`;)i=this.buffer[++n];e=n-1}else if(!this.blockScalarKeep)do{let o=e-1,a=this.buffer[o];a===\"\\r\"&&(a=this.buffer[--o]);let r=o;for(;a===\" \";)a=this.buffer[--o];if(a===`\n`&&o>=this.pos&&o+1+A>r)e=o;else break}while(!0);return yield Q6,yield*le(this.pushToIndex(e+1,!0)),yield*le(this.parseLineStart())}*parsePlainScalar(){let e=this.flowLevel>0,A=this.pos-1,i=this.pos-1,n;for(;n=this.buffer[++i];)if(n===\":\"){let o=this.buffer[i+1];if(Yl(o)||e&&E6.has(o))break;A=i}else if(Yl(n)){let o=this.buffer[i+1];if(n===\"\\r\"&&(o===`\n`?(i+=1,n=`\n`,o=this.buffer[i+1]):A=i),o===\"#\"||e&&E6.has(o))break;if(n===`\n`){let a=this.continueScalar(i+1);if(a===-1)break;i=Math.max(i,a-2)}}else{if(e&&E6.has(n))break;A=i}return!n&&!this.atEnd?this.setNext(\"plain-scalar\"):(yield Q6,yield*le(this.pushToIndex(A+1,!0)),e?\"flow\":\"doc\")}*pushCount(e){return e>0?(yield this.buffer.substr(this.pos,e),this.pos+=e,e):0}*pushToIndex(e,A){let i=this.buffer.slice(this.pos,e);return i?(yield i,this.pos+=i.length,i.length):(A&&(yield\"\"),0)}*pushIndicators(){switch(this.charAt(0)){case\"!\":return(yield*le(this.pushTag()))+(yield*le(this.pushSpaces(!0)))+(yield*le(this.pushIndicators()));case\"&\":return(yield*le(this.pushUntil(m9)))+(yield*le(this.pushSpaces(!0)))+(yield*le(this.pushIndicators()));case\"-\":case\"?\":case\":\":{let e=this.flowLevel>0,A=this.charAt(1);if(Yl(A)||e&&E6.has(A))return e?this.flowKey&&(this.flowKey=!1):this.indentNext=this.indentValue+1,(yield*le(this.pushCount(1)))+(yield*le(this.pushSpaces(!0)))+(yield*le(this.pushIndicators()))}}return 0}*pushTag(){if(this.charAt(1)===\"<\"){let e=this.pos+2,A=this.buffer[e];for(;!Yl(A)&&A!==\">\";)A=this.buffer[++e];return yield*le(this.pushToIndex(A===\">\"?e+1:e,!1))}else{let e=this.pos+1,A=this.buffer[e];for(;A;)if(y0A.has(A))A=this.buffer[++e];else if(A===\"%\"&&BY.has(this.buffer[e+1])&&BY.has(this.buffer[e+2]))A=this.buffer[e+=3];else break;return yield*le(this.pushToIndex(e,!1))}}*pushNewline(){let e=this.buffer[this.pos];return e===`\n`?yield*le(this.pushCount(1)):e===\"\\r\"&&this.charAt(1)===`\n`?yield*le(this.pushCount(2)):0}*pushSpaces(e){let A=this.pos-1,i;do i=this.buffer[++A];while(i===\" \"||e&&i===\"\t\");let n=A-this.pos;return n>0&&(yield this.buffer.substr(this.pos,n),this.pos=A),n}*pushUntil(e){let A=this.pos,i=this.buffer[A];for(;!e(i);)i=this.buffer[++A];return yield*le(this.pushToIndex(A,!1))}};var v4=class{constructor(){this.lineStarts=[],this.addNewLine=e=>this.lineStarts.push(e),this.linePos=e=>{let A=0,i=this.lineStarts.length;for(;A<i;){let o=A+i>>1;this.lineStarts[o]<e?A=o+1:i=o}if(this.lineStarts[A]===e)return{line:A+1,col:1};if(A===0)return{line:0,col:e};let n=this.lineStarts[A-1];return{line:A,col:e-n+1}}}};function o2(t,e){for(let A=0;A<t.length;++A)if(t[A].type===e)return!0;return!1}function QY(t){for(let e=0;e<t.length;++e)switch(t[e].type){case\"space\":case\"comment\":case\"newline\":break;default:return e}return-1}function hY(t){switch(t?.type){case\"alias\":case\"scalar\":case\"single-quoted-scalar\":case\"double-quoted-scalar\":case\"flow-collection\":return!0;default:return!1}}function h6(t){switch(t.type){case\"document\":return t.start;case\"block-map\":{let e=t.items[t.items.length-1];return e.sep??e.start}case\"block-seq\":return t.items[t.items.length-1].start;default:return[]}}function pB(t){if(t.length===0)return[];let e=t.length;A:for(;--e>=0;)switch(t[e].type){case\"doc-start\":case\"explicit-key-ind\":case\"map-value-ind\":case\"seq-item-ind\":case\"newline\":break A}for(;t[++e]?.type===\"space\";);return t.splice(e,t.length)}function EY(t){if(t.start.type===\"flow-seq-start\")for(let e of t.items)e.sep&&!e.value&&!o2(e.start,\"explicit-key-ind\")&&!o2(e.sep,\"map-value-ind\")&&(e.key&&(e.value=e.key),delete e.key,hY(e.value)?e.value.end?Array.prototype.push.apply(e.value.end,e.sep):e.value.end=e.sep:Array.prototype.push.apply(e.start,e.sep),delete e.sep)}var b4=class{constructor(e){this.atNewLine=!0,this.atScalar=!1,this.indent=0,this.offset=0,this.onKeyLine=!1,this.stack=[],this.source=\"\",this.type=\"\",this.lexer=new y4,this.onNewLine=e}*parse(e,A=!1){this.onNewLine&&this.offset===0&&this.onNewLine(0);for(let i of this.lexer.lex(e,A))yield*le(this.next(i));A||(yield*le(this.end()))}*next(e){if(this.source=e,this.atScalar){this.atScalar=!1,yield*le(this.step()),this.offset+=e.length;return}let A=dY(e);if(A)if(A===\"scalar\")this.atNewLine=!1,this.atScalar=!0,this.type=\"scalar\";else{switch(this.type=A,yield*le(this.step()),A){case\"newline\":this.atNewLine=!0,this.indent=0,this.onNewLine&&this.onNewLine(this.offset+e.length);break;case\"space\":this.atNewLine&&e[0]===\" \"&&(this.indent+=e.length);break;case\"explicit-key-ind\":case\"map-value-ind\":case\"seq-item-ind\":this.atNewLine&&(this.indent+=e.length);break;case\"doc-mode\":case\"flow-error-end\":return;default:this.atNewLine=!1}this.offset+=e.length}else{let i=`Not a YAML token: ${e}`;yield*le(this.pop({type:\"error\",offset:this.offset,message:i,source:e})),this.offset+=e.length}}*end(){for(;this.stack.length>0;)yield*le(this.pop())}get sourceToken(){return{type:this.type,offset:this.offset,indent:this.indent,source:this.source}}*step(){let e=this.peek(1);if(this.type===\"doc-end\"&&e?.type!==\"doc-end\"){for(;this.stack.length>0;)yield*le(this.pop());this.stack.push({type:\"doc-end\",offset:this.offset,source:this.source});return}if(!e)return yield*le(this.stream());switch(e.type){case\"document\":return yield*le(this.document(e));case\"alias\":case\"scalar\":case\"single-quoted-scalar\":case\"double-quoted-scalar\":return yield*le(this.scalar(e));case\"block-scalar\":return yield*le(this.blockScalar(e));case\"block-map\":return yield*le(this.blockMap(e));case\"block-seq\":return yield*le(this.blockSequence(e));case\"flow-collection\":return yield*le(this.flowCollection(e));case\"doc-end\":return yield*le(this.documentEnd(e))}yield*le(this.pop())}peek(e){return this.stack[this.stack.length-e]}*pop(e){let A=e??this.stack.pop();if(!A)yield{type:\"error\",offset:this.offset,source:\"\",message:\"Tried to pop an empty stack\"};else if(this.stack.length===0)yield A;else{let i=this.peek(1);switch(A.type===\"block-scalar\"?A.indent=\"indent\"in i?i.indent:0:A.type===\"flow-collection\"&&i.type===\"document\"&&(A.indent=0),A.type===\"flow-collection\"&&EY(A),i.type){case\"document\":i.value=A;break;case\"block-scalar\":i.props.push(A);break;case\"block-map\":{let n=i.items[i.items.length-1];if(n.value){i.items.push({start:[],key:A,sep:[]}),this.onKeyLine=!0;return}else if(n.sep)n.value=A;else{Object.assign(n,{key:A,sep:[]}),this.onKeyLine=!n.explicitKey;return}break}case\"block-seq\":{let n=i.items[i.items.length-1];n.value?i.items.push({start:[],value:A}):n.value=A;break}case\"flow-collection\":{let n=i.items[i.items.length-1];!n||n.value?i.items.push({start:[],key:A,sep:[]}):n.sep?n.value=A:Object.assign(n,{key:A,sep:[]});return}default:yield*le(this.pop()),yield*le(this.pop(A))}if((i.type===\"document\"||i.type===\"block-map\"||i.type===\"block-seq\")&&(A.type===\"block-map\"||A.type===\"block-seq\")){let n=A.items[A.items.length-1];n&&!n.sep&&!n.value&&n.start.length>0&&QY(n.start)===-1&&(A.indent===0||n.start.every(o=>o.type!==\"comment\"||o.indent<A.indent))&&(i.type===\"document\"?i.end=n.start:i.items.push({start:n.start}),A.items.splice(-1,1))}}}*stream(){switch(this.type){case\"directive-line\":yield{type:\"directive\",offset:this.offset,source:this.source};return;case\"byte-order-mark\":case\"space\":case\"comment\":case\"newline\":yield this.sourceToken;return;case\"doc-mode\":case\"doc-start\":{let e={type:\"document\",offset:this.offset,start:[]};this.type===\"doc-start\"&&e.start.push(this.sourceToken),this.stack.push(e);return}}yield{type:\"error\",offset:this.offset,message:`Unexpected ${this.type} token in YAML stream`,source:this.source}}*document(e){if(e.value)return yield*le(this.lineEnd(e));switch(this.type){case\"doc-start\":{QY(e.start)!==-1?(yield*le(this.pop()),yield*le(this.step())):e.start.push(this.sourceToken);return}case\"anchor\":case\"tag\":case\"space\":case\"comment\":case\"newline\":e.start.push(this.sourceToken);return}let A=this.startBlockValue(e);A?this.stack.push(A):yield{type:\"error\",offset:this.offset,message:`Unexpected ${this.type} token in YAML document`,source:this.source}}*scalar(e){if(this.type===\"map-value-ind\"){let A=h6(this.peek(2)),i=pB(A),n;e.end?(n=e.end,n.push(this.sourceToken),delete e.end):n=[this.sourceToken];let o={type:\"block-map\",offset:e.offset,indent:e.indent,items:[{start:i,key:e,sep:n}]};this.onKeyLine=!0,this.stack[this.stack.length-1]=o}else yield*le(this.lineEnd(e))}*blockScalar(e){switch(this.type){case\"space\":case\"comment\":case\"newline\":e.props.push(this.sourceToken);return;case\"scalar\":if(e.source=this.source,this.atNewLine=!0,this.indent=0,this.onNewLine){let A=this.source.indexOf(`\n`)+1;for(;A!==0;)this.onNewLine(this.offset+A),A=this.source.indexOf(`\n`,A)+1}yield*le(this.pop());break;default:yield*le(this.pop()),yield*le(this.step())}}*blockMap(e){let A=e.items[e.items.length-1];switch(this.type){case\"newline\":if(this.onKeyLine=!1,A.value){let i=\"end\"in A.value?A.value.end:void 0;(Array.isArray(i)?i[i.length-1]:void 0)?.type===\"comment\"?i?.push(this.sourceToken):e.items.push({start:[this.sourceToken]})}else A.sep?A.sep.push(this.sourceToken):A.start.push(this.sourceToken);return;case\"space\":case\"comment\":if(A.value)e.items.push({start:[this.sourceToken]});else if(A.sep)A.sep.push(this.sourceToken);else{if(this.atIndentedComment(A.start,e.indent)){let n=e.items[e.items.length-2]?.value?.end;if(Array.isArray(n)){Array.prototype.push.apply(n,A.start),n.push(this.sourceToken),e.items.pop();return}}A.start.push(this.sourceToken)}return}if(this.indent>=e.indent){let i=!this.onKeyLine&&this.indent===e.indent,n=i&&(A.sep||A.explicitKey)&&this.type!==\"seq-item-ind\",o=[];if(n&&A.sep&&!A.value){let a=[];for(let r=0;r<A.sep.length;++r){let s=A.sep[r];switch(s.type){case\"newline\":a.push(r);break;case\"space\":break;case\"comment\":s.indent>e.indent&&(a.length=0);break;default:a.length=0}}a.length>=2&&(o=A.sep.splice(a[1]))}switch(this.type){case\"anchor\":case\"tag\":n||A.value?(o.push(this.sourceToken),e.items.push({start:o}),this.onKeyLine=!0):A.sep?A.sep.push(this.sourceToken):A.start.push(this.sourceToken);return;case\"explicit-key-ind\":!A.sep&&!A.explicitKey?(A.start.push(this.sourceToken),A.explicitKey=!0):n||A.value?(o.push(this.sourceToken),e.items.push({start:o,explicitKey:!0})):this.stack.push({type:\"block-map\",offset:this.offset,indent:this.indent,items:[{start:[this.sourceToken],explicitKey:!0}]}),this.onKeyLine=!0;return;case\"map-value-ind\":if(A.explicitKey)if(A.sep)if(A.value)e.items.push({start:[],key:null,sep:[this.sourceToken]});else if(o2(A.sep,\"map-value-ind\"))this.stack.push({type:\"block-map\",offset:this.offset,indent:this.indent,items:[{start:o,key:null,sep:[this.sourceToken]}]});else if(hY(A.key)&&!o2(A.sep,\"newline\")){let a=pB(A.start),r=A.key,s=A.sep;s.push(this.sourceToken),delete A.key,delete A.sep,this.stack.push({type:\"block-map\",offset:this.offset,indent:this.indent,items:[{start:a,key:r,sep:s}]})}else o.length>0?A.sep=A.sep.concat(o,this.sourceToken):A.sep.push(this.sourceToken);else if(o2(A.start,\"newline\"))Object.assign(A,{key:null,sep:[this.sourceToken]});else{let a=pB(A.start);this.stack.push({type:\"block-map\",offset:this.offset,indent:this.indent,items:[{start:a,key:null,sep:[this.sourceToken]}]})}else A.sep?A.value||n?e.items.push({start:o,key:null,sep:[this.sourceToken]}):o2(A.sep,\"map-value-ind\")?this.stack.push({type:\"block-map\",offset:this.offset,indent:this.indent,items:[{start:[],key:null,sep:[this.sourceToken]}]}):A.sep.push(this.sourceToken):Object.assign(A,{key:null,sep:[this.sourceToken]});this.onKeyLine=!0;return;case\"alias\":case\"scalar\":case\"single-quoted-scalar\":case\"double-quoted-scalar\":{let a=this.flowScalar(this.type);n||A.value?(e.items.push({start:o,key:a,sep:[]}),this.onKeyLine=!0):A.sep?this.stack.push(a):(Object.assign(A,{key:a,sep:[]}),this.onKeyLine=!0);return}default:{let a=this.startBlockValue(e);if(a){if(a.type===\"block-seq\"){if(!A.explicitKey&&A.sep&&!o2(A.sep,\"newline\")){yield*le(this.pop({type:\"error\",offset:this.offset,message:\"Unexpected block-seq-ind on same line with key\",source:this.source}));return}}else i&&e.items.push({start:o});this.stack.push(a);return}}}}yield*le(this.pop()),yield*le(this.step())}*blockSequence(e){let A=e.items[e.items.length-1];switch(this.type){case\"newline\":if(A.value){let i=\"end\"in A.value?A.value.end:void 0;(Array.isArray(i)?i[i.length-1]:void 0)?.type===\"comment\"?i?.push(this.sourceToken):e.items.push({start:[this.sourceToken]})}else A.start.push(this.sourceToken);return;case\"space\":case\"comment\":if(A.value)e.items.push({start:[this.sourceToken]});else{if(this.atIndentedComment(A.start,e.indent)){let n=e.items[e.items.length-2]?.value?.end;if(Array.isArray(n)){Array.prototype.push.apply(n,A.start),n.push(this.sourceToken),e.items.pop();return}}A.start.push(this.sourceToken)}return;case\"anchor\":case\"tag\":if(A.value||this.indent<=e.indent)break;A.start.push(this.sourceToken);return;case\"seq-item-ind\":if(this.indent!==e.indent)break;A.value||o2(A.start,\"seq-item-ind\")?e.items.push({start:[this.sourceToken]}):A.start.push(this.sourceToken);return}if(this.indent>e.indent){let i=this.startBlockValue(e);if(i){this.stack.push(i);return}}yield*le(this.pop()),yield*le(this.step())}*flowCollection(e){let A=e.items[e.items.length-1];if(this.type===\"flow-error-end\"){let i;do yield*le(this.pop()),i=this.peek(1);while(i?.type===\"flow-collection\")}else if(e.end.length===0){switch(this.type){case\"comma\":case\"explicit-key-ind\":!A||A.sep?e.items.push({start:[this.sourceToken]}):A.start.push(this.sourceToken);return;case\"map-value-ind\":!A||A.value?e.items.push({start:[],key:null,sep:[this.sourceToken]}):A.sep?A.sep.push(this.sourceToken):Object.assign(A,{key:null,sep:[this.sourceToken]});return;case\"space\":case\"comment\":case\"newline\":case\"anchor\":case\"tag\":!A||A.value?e.items.push({start:[this.sourceToken]}):A.sep?A.sep.push(this.sourceToken):A.start.push(this.sourceToken);return;case\"alias\":case\"scalar\":case\"single-quoted-scalar\":case\"double-quoted-scalar\":{let n=this.flowScalar(this.type);!A||A.value?e.items.push({start:[],key:n,sep:[]}):A.sep?this.stack.push(n):Object.assign(A,{key:n,sep:[]});return}case\"flow-map-end\":case\"flow-seq-end\":e.end.push(this.sourceToken);return}let i=this.startBlockValue(e);i?this.stack.push(i):(yield*le(this.pop()),yield*le(this.step()))}else{let i=this.peek(2);if(i.type===\"block-map\"&&(this.type===\"map-value-ind\"&&i.indent===e.indent||this.type===\"newline\"&&!i.items[i.items.length-1].sep))yield*le(this.pop()),yield*le(this.step());else if(this.type===\"map-value-ind\"&&i.type!==\"flow-collection\"){let n=h6(i),o=pB(n);EY(e);let a=e.end.splice(1,e.end.length);a.push(this.sourceToken);let r={type:\"block-map\",offset:e.offset,indent:e.indent,items:[{start:o,key:e,sep:a}]};this.onKeyLine=!0,this.stack[this.stack.length-1]=r}else yield*le(this.lineEnd(e))}}flowScalar(e){if(this.onNewLine){let A=this.source.indexOf(`\n`)+1;for(;A!==0;)this.onNewLine(this.offset+A),A=this.source.indexOf(`\n`,A)+1}return{type:e,offset:this.offset,indent:this.indent,source:this.source}}startBlockValue(e){switch(this.type){case\"alias\":case\"scalar\":case\"single-quoted-scalar\":case\"double-quoted-scalar\":return this.flowScalar(this.type);case\"block-scalar-header\":return{type:\"block-scalar\",offset:this.offset,indent:this.indent,props:[this.sourceToken],source:\"\"};case\"flow-map-start\":case\"flow-seq-start\":return{type:\"flow-collection\",offset:this.offset,indent:this.indent,start:this.sourceToken,items:[],end:[]};case\"seq-item-ind\":return{type:\"block-seq\",offset:this.offset,indent:this.indent,items:[{start:[this.sourceToken]}]};case\"explicit-key-ind\":{this.onKeyLine=!0;let A=h6(e),i=pB(A);return i.push(this.sourceToken),{type:\"block-map\",offset:this.offset,indent:this.indent,items:[{start:i,explicitKey:!0}]}}case\"map-value-ind\":{this.onKeyLine=!0;let A=h6(e),i=pB(A);return{type:\"block-map\",offset:this.offset,indent:this.indent,items:[{start:i,key:null,sep:[this.sourceToken]}]}}}return null}atIndentedComment(e,A){return this.type!==\"comment\"||this.indent<=A?!1:e.every(i=>i.type===\"newline\"||i.type===\"space\")}*documentEnd(e){this.type!==\"doc-mode\"&&(e.end?e.end.push(this.sourceToken):e.end=[this.sourceToken],this.type===\"newline\"&&(yield*le(this.pop())))}*lineEnd(e){switch(this.type){case\"comma\":case\"doc-start\":case\"doc-end\":case\"flow-seq-end\":case\"flow-map-end\":case\"map-value-ind\":yield*le(this.pop()),yield*le(this.step());break;case\"newline\":this.onKeyLine=!1;default:e.end?e.end.push(this.sourceToken):e.end=[this.sourceToken],this.type===\"newline\"&&(yield*le(this.pop()))}}};function b0A(t){let e=t.prettyErrors!==!1;return{lineCounter:t.lineCounter||e&&new v4||null,prettyErrors:e}}function uY(t,e={}){let{lineCounter:A,prettyErrors:i}=b0A(e),n=new b4(A?.addNewLine),o=new w4(e),a=null;for(let r of o.compose(n.parse(t),!0,t.length))if(!a)a=r;else if(a.options.logLevel!==\"silent\"){a.errors.push(new Jl(r.range.slice(0,2),\"MULTIPLE_DOCS\",\"Source contains multiple documents; please use YAML.parseAllDocuments()\"));break}return i&&A&&(a.errors.forEach(g9(t,A)),a.warnings.forEach(g9(t,A))),a}function DB(t,e,A){let i;typeof e==\"function\"?i=e:A===void 0&&e&&typeof e==\"object\"&&(A=e);let n=uY(t,A);if(!n)return null;if(n.warnings.forEach(o=>Wp(n.options.logLevel,o)),n.errors.length>0){if(n.options.logLevel!==\"silent\")throw n.errors[0];n.errors=[]}return n.toJS(Object.assign({reviver:i},A))}function p9(t,e,A){let i=null;if(typeof e==\"function\"||Array.isArray(e)?i=e:A===void 0&&e&&(A=e),typeof A==\"string\"&&(A=A.length),typeof A==\"number\"){let n=Math.round(A);A=n<1?void 0:n>8?{indent:8}:{indent:n}}if(t===void 0){let{keepUndefined:n}=A??e??{};if(!n)return}return Fl(t)&&!i?t.toString(A):new J0(t,i,A).toString(A)}var zc=class t{static generateYamlFile(e,A,i,n,o=new Set){if(o.has(e.name))return;o.add(e.name);let a=e.isRoot?\"root_agent.yaml\":`${e.name}.yaml`,r=`${i}/${a}`,s=e.sub_agents?e.sub_agents.map(B=>({config_path:`./${B.name}.yaml`})):[],g={name:e.name,model:e.model,agent_class:e.agent_class,description:e.description||\"\",instruction:e.instruction,sub_agents:s,tools:t.buildToolsConfig(e.tools,n)};(!e.description||e.description.trim()===\"\")&&delete g.description,e.agent_class!=\"LlmAgent\"&&(delete g.model,delete g.instruction,delete g.tools),e.agent_class===\"LoopAgent\"&&e.max_iterations&&(g.max_iterations=e.max_iterations);let l=t.buildCallbacksConfig(e.callbacks);Object.keys(l).length>0&&Object.assign(g,l);let C=p9(g),I=new Blob([C],{type:\"application/x-yaml\"}),d=new File([I],r,{type:\"application/x-yaml\"});A.append(\"files\",d);for(let B of e.sub_agents??[])t.generateYamlFile(B,A,i,n,o);if(e.tools){for(let B of e.tools)if(B.toolType===\"Agent Tool\"){let Q=B.toolAgentName||B.name;if(!Q||Q===\"undefined\"||Q.trim()===\"\")continue;let E=n.get(Q);E&&t.generateYamlFile(E,A,i,n,o)}}}static buildToolsConfig(e,A){return!e||e.length===0?[]:e.map(i=>{let n={name:i.name};if(i.toolType===\"Agent Tool\"){n.name=\"AgentTool\";let o=i.toolAgentName||i.name;if(!o||o===\"undefined\"||o.trim()===\"\")return null;let a=A.get(o);return n.args={agent:{config_path:`./${o}.yaml`},skip_summarization:a?.skip_summarization||!1},n}return i.args&&Object.keys(i.args).some(a=>{let r=i.args[a];return r!=null&&r!==\"\"})&&(n.args=i.args),n}).filter(i=>i!==null)}static buildCallbacksConfig(e){if(!e||e.length===0)return{};let A={};return e.forEach(i=>{let n=`${i.type}_callbacks`;A[n]||(A[n]=[]),A[n].push({name:i.name})}),A}};function k0A(t,e){t&1&&(m(0,\"mat-hint\",3),K(1,\" Start with a letter or underscore, and contain only letters, digits, and underscores. \"),D())}var u6=class t{constructor(e,A){this.data=e;this.dialogRef=A}newAppName=\"\";agentService=h(Ks);_snackBar=h(ZC);router=h(qr);isNameValid(){let e=this.newAppName.trim();return!(!e||!/^[a-zA-Z_]/.test(e)||!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(e))}createNewApp(){let e=this.newAppName.trim();if(!this.isNameValid()){this._snackBar.open(\"App name must start with a letter or underscore and can only contain letters, digits, and underscores.\",\"OK\");return}if(this.data.existingAppNames.includes(e)){this._snackBar.open(\"App name already exists. Please choose a different name.\",\"OK\");return}let A={agent_class:\"LlmAgent\",instruction:\"You are the root agent that coordinates other agents.\",isRoot:!0,model:\"gemini-2.5-flash\",name:e,sub_agents:[],tools:[]},i=new FormData,n=new Map;zc.generateYamlFile(A,i,e,n),this.agentService.agentBuildTmp(i).subscribe(o=>{o?(this.router.navigate([\"/\"],{queryParams:{app:e,mode:\"builder\"}}).then(()=>{window.location.reload()}),this.dialogRef.close(!0)):this._snackBar.open(\"Something went wrong, please try again\",\"OK\")})}static \\u0275fac=function(A){return new(A||t)(lt(da),lt(Fo))};static \\u0275cmp=kA({type:t,selectors:[[\"app-add-item-dialog\"]],decls:10,vars:3,consts:[[\"mat-dialog-title\",\"\",1,\"new-app-title\"],[2,\"padding-left\",\"20px\",\"padding-right\",\"24px\"],[\"matInput\",\"\",3,\"ngModelChange\",\"keydown.enter\",\"ngModel\"],[1,\"validation-hint\"],[\"align\",\"end\"],[\"mat-button\",\"\",\"mat-dialog-close\",\"\"],[\"mat-button\",\"\",\"cdkFocusInitial\",\"\",3,\"click\",\"disabled\"]],template:function(A,i){A&1&&(m(0,\"h2\",0),K(1,\"Create a new app\"),D(),m(2,\"mat-form-field\",1)(3,\"input\",2),ao(\"ngModelChange\",function(o){return Vn(i.newAppName,o)||(i.newAppName=o),o}),$(\"keydown.enter\",function(){return i.createNewApp()}),D(),V(4,k0A,2,0,\"mat-hint\",3),D(),m(5,\"mat-dialog-actions\",4)(6,\"button\",5),K(7,\"Cancel\"),D(),m(8,\"button\",6),$(\"click\",function(){return i.createNewApp()}),K(9,\" Create \"),D()()),A&2&&(p(3),oo(\"ngModel\",i.newAppName),p(),W(i.isNameValid()?-1:4),p(4),X(\"disabled\",!i.isNameValid()))},dependencies:[ya,To,wa,yn,ro,so,Ca,Ta,vn,VC,_I],styles:[\".new-app-title[_ngcontent-%COMP%]{color:var(--mdc-dialog-subhead-color)!important;font-family:Google Sans;font-size:24px}.validation-hint[_ngcontent-%COMP%]{font-size:12px;color:var(--mdc-dialog-supporting-text-color)}\"]})};var S0A=[\"audioPlayer\"],wB=class t{base64data=nt(\"\");audioPlayerRef=Xo(\"audioPlayer\");audioSrc=\"\";constructor(){}ngOnChanges(e){e.base64data&&this.base64data()&&this.setAudioSource(this.base64data())}setAudioSource(e){e.startsWith(\"data:\")?this.audioSrc=e:this.audioSrc=`data:audio/mpeg;base64,${e}`,this.audioPlayerRef()&&this.audioPlayerRef().nativeElement&&this.audioPlayerRef().nativeElement.load()}play(){this.audioPlayerRef()&&this.audioPlayerRef().nativeElement&&this.audioPlayerRef().nativeElement.play()}pause(){this.audioPlayerRef()&&this.audioPlayerRef().nativeElement&&this.audioPlayerRef().nativeElement.pause()}stop(){this.audioPlayerRef()&&this.audioPlayerRef().nativeElement&&(this.audioPlayerRef().nativeElement.pause(),this.audioPlayerRef().nativeElement.currentTime=0)}static \\u0275fac=function(A){return new(A||t)};static \\u0275cmp=kA({type:t,selectors:[[\"app-audio-player\"]],viewQuery:function(A,i){A&1&&Or(i.audioPlayerRef,S0A,5),A&2&&rr()},inputs:{base64data:[1,\"base64data\"]},features:[ei],decls:3,vars:1,consts:[[\"audioPlayer\",\"\"],[\"controls\",\"\",3,\"src\"]],template:function(A,i){A&1&&(ti(0,\"div\"),Ni(1,\"audio\",1,0),Ii()),A&2&&(p(),Bo(\"src\",i.audioSrc))},styles:[\".audio-player-container[_ngcontent-%COMP%]{display:flex;justify-content:center;align-items:center;padding:15px;background-color:var(--audio-player-container-background-color);border-radius:8px;box-shadow:0 2px 5px var(--audio-player-container-box-shadow-color);margin:20px auto;max-width:350px}audio[_ngcontent-%COMP%]{outline:none;border-radius:5px;width:350px}.custom-controls[_ngcontent-%COMP%]{margin-top:10px;display:flex;gap:10px}.custom-controls[_ngcontent-%COMP%]   button[_ngcontent-%COMP%]{padding:8px 15px;border:none;border-radius:5px;background-color:var(--audio-player-custom-controls-button-background-color);color:var(--audio-player-custom-controls-button-color);cursor:pointer;font-size:14px;transition:background-color .2s ease}.custom-controls[_ngcontent-%COMP%]   button[_ngcontent-%COMP%]:hover{background-color:var(--audio-player-custom-controls-button-hover-background-color)}\"]})};function x0A(t,e){if(t&1&&Ni(0,\"img\",5),t&2){let A=y(2);Bo(\"src\",A.displayContent,Da)}}function R0A(t,e){t&1&&(ti(0,\"div\",6),K(1,\" No image data provided. \"),Ii())}function N0A(t,e){if(t&1&&(ti(0,\"div\",3),V(1,x0A,1,1,\"img\",5),V(2,R0A,2,0,\"div\",6),Ii()),t&2){let A=y();p(),W(A.displayContent?1:-1),p(),W(A.displayContent?-1:2)}}function F0A(t,e){if(t&1&&Ni(0,\"div\",4),t&2){let A=y();Bo(\"innerHTML\",A.displayContent,xg)}}var a2=class t{displayContent=null;isSvgContent=!1;dialogRef=h(Fo);data=h(da);safeValuesService=h(Wr);ngOnInit(){this.processImageData()}processImageData(){let e=this.data.imageData;if(!e){this.displayContent=null,this.isSvgContent=!1;return}if(e.trim().includes(\"<svg\"))this.isSvgContent=!0,this.displayContent=this.safeValuesService.bypassSecurityTrustHtml(e);else{let A=e.startsWith(\"data:image/\")?\"\":\"data:image/png;base64,\";this.isSvgContent=!1,this.displayContent=this.safeValuesService.bypassSecurityTrustUrl(A+e)}}close(){this.dialogRef.close()}static \\u0275fac=function(A){return new(A||t)};static \\u0275cmp=kA({type:t,selectors:[[\"app-view-image-dialog\"]],decls:6,vars:2,consts:[[1,\"close-button\",3,\"click\"],[\"xmlns\",\"[http://www.w3.org/2000/svg](http://www.w3.org/2000/svg)\",\"viewBox\",\"0 0 24 24\",\"fill\",\"currentColor\",\"width\",\"24px\",\"height\",\"24px\"],[\"d\",\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\"],[1,\"image-wrapper\"],[3,\"innerHTML\"],[\"alt\",\"Viewed Image\",3,\"src\"],[1,\"no-image-placeholder\"]],template:function(A,i){A&1&&(ti(0,\"div\")(1,\"button\",0),pc(\"click\",function(){return i.close()}),Qt(),ti(2,\"svg\",1),Ni(3,\"path\",2),Ii()(),V(4,N0A,3,2,\"div\",3),V(5,F0A,1,1,\"div\",4),Ii()),A&2&&(p(4),W(i.isSvgContent?-1:4),p(),W(i.isSvgContent?5:-1))},styles:[\"[_nghost-%COMP%]{display:block;background-color:var(--mdc-dialog-container-color);padding:16px}.close-button[_ngcontent-%COMP%]{position:absolute;top:5px;right:10px;background:none;border:none;cursor:pointer;padding:8px;border-radius:50%;transition:background-color .2s ease;color:var(--mdc-dialog-supporting-text-color);display:flex;align-items:center;justify-content:center;z-index:10;margin-bottom:15px}.close-button[_ngcontent-%COMP%]:hover{background-color:var(--builder-tool-item-hover-background-color)}.close-button[_ngcontent-%COMP%]   svg[_ngcontent-%COMP%]{width:24px;height:24px;fill:currentColor}.image-wrapper[_ngcontent-%COMP%]{flex-grow:1;display:flex;justify-content:center;align-items:center;overflow:auto}.image-wrapper[_ngcontent-%COMP%]   img[_ngcontent-%COMP%], .image-wrapper[_ngcontent-%COMP%]   .svg-container[_ngcontent-%COMP%]{max-width:90vw;max-height:90vh;object-fit:contain;border-radius:8px}.no-image-placeholder[_ngcontent-%COMP%]{color:var(--trace-chart-trace-duration-color);font-style:italic;text-align:center;padding:20px}@media(max-width:1768px){.close-button[_ngcontent-%COMP%]{top:5px;right:5px;padding:5px}}\"]})};function L0A(t,e){t&1&&GA(0,\"hr\",2)}function _0A(t,e){if(t&1&&(m(0,\"mat-option\",7),K(1),D()),t&2){let A=e.$implicit;X(\"value\",A),p(),qA(A.versionId)}}function G0A(t,e){if(t&1){let A=zA();m(0,\"div\")(1,\"img\",9),$(\"click\",function(){rA(A);let n=y().$index,o=y();return sA(o.openViewImageDialog(o.selectedArtifacts[n].data))}),D()()}if(t&2){let A=y().$index,i=y();p(),X(\"src\",i.selectedArtifacts[A].data??\"\",Da)}}function K0A(t,e){if(t&1&&(m(0,\"div\"),GA(1,\"app-audio-player\",10),D()),t&2){let A=y().$index,i=y();p(),X(\"base64data\",i.selectedArtifacts[A].data)}}function U0A(t,e){if(t&1){let A=zA();m(0,\"div\",1),V(1,L0A,1,0,\"hr\",2),m(2,\"div\",3)(3,\"button\",4),$(\"click\",function(){let n=rA(A).$index,o=y();return sA(o.openArtifact(o.selectedArtifacts[n].data,o.selectedArtifacts[n].mimeType))}),K(4),D()(),m(5,\"div\",3)(6,\"span\"),K(7,\" Version: \"),D(),m(8,\"div\",5)(9,\"mat-select\",6),ao(\"ngModelChange\",function(n){let o=rA(A).$index,a=y();return Vn(a.selectedArtifacts[o],n)||(a.selectedArtifacts[o]=n),sA(n)}),$(\"selectionChange\",function(n){let o=rA(A).$index,a=y();return sA(a.onArtifactVersionChange(n,o))}),Gt(10,_0A,2,2,\"mat-option\",7,Ri),D()(),m(12,\"button\",8),$(\"click\",function(){let n=rA(A).$index,o=y();return sA(o.downloadArtifact(o.selectedArtifacts[n]))}),m(13,\"mat-icon\"),K(14,\"file_download\"),D(),K(15,\" Download \"),D()(),m(16,\"div\"),V(17,G0A,2,1,\"div\")(18,K0A,2,1,\"div\"),D()()}if(t&2){let A,i=e.$implicit,n=e.$index,o=y();p(),W(n>0?1:-1),p(3),Fe(\" \",o.getArtifactName(i),\" \"),p(5),oo(\"ngModel\",o.selectedArtifacts[n]),p(),Kt(o.getSortedArtifactsFromId(i)),p(7),W((A=o.selectedArtifacts[n].mediaType)===o.MediaType.IMAGE?17:A===o.MediaType.AUDIO?18:-1)}}var J0A=\"default_artifact_name\",i1=(n=>(n.IMAGE=\"image\",n.AUDIO=\"audio\",n.TEXT=\"text\",n.UNSPECIFIED=\"unspecified\",n))(i1||{});function M4(t){let e=t.toLowerCase();for(let A of Object.values(i1))if(A!==\"unspecified\"&&e.startsWith(A+\"/\"))return A;return\"unspecified\"}function Y0A(t){return t?t.startsWith(\"image/\"):!1}function H0A(t){return t?t.startsWith(\"audio/\"):!1}var f6=class t{artifacts=nt([]);selectedArtifacts=[];isArtifactAudio=H0A;isArtifactImage=Y0A;MediaType=i1;downloadService=h(gB);dialog=h(Qs);safeValuesService=h(Wr);ngOnChanges(e){if(e.artifacts){this.selectedArtifacts=[];for(let A of this.getDistinctArtifactIds())this.selectedArtifacts.push(this.getSortedArtifactsFromId(A)[0])}}downloadArtifact(e){this.downloadService.downloadBase64Data(e.data,e.mimeType,e.id)}getArtifactName(e){return e??J0A}getDistinctArtifactIds(){return[...new Set(this.artifacts().map(e=>e.id))]}getSortedArtifactsFromId(e){return this.artifacts().filter(A=>A.id===e).sort((A,i)=>i.versionId-A.versionId)}onArtifactVersionChange(e,A){this.selectedArtifacts[A]=e.value}openViewImageDialog(e){if(!e||!e.startsWith(\"data:\")||e.indexOf(\";base64,\")===-1)return;let A=this.dialog.open(a2,{maxWidth:\"90vw\",maxHeight:\"90vh\",data:{imageData:e}})}openArtifact(e,A){if(this.isArtifactImage(A)){this.openViewImageDialog(e);return}this.openBase64InNewTab(e,A)}openBase64InNewTab(e,A){}static \\u0275fac=function(A){return new(A||t)};static \\u0275cmp=kA({type:t,selectors:[[\"app-artifact-tab\"]],inputs:{artifacts:[1,\"artifacts\"]},features:[ei],decls:3,vars:0,consts:[[1,\"artifact-container\"],[1,\"artifact-box\"],[1,\"white-separator\"],[1,\"artifact-metadata\"],[1,\"link-style-button\",3,\"click\"],[1,\"version-select-container\"],[3,\"ngModelChange\",\"selectionChange\",\"ngModel\"],[3,\"value\"],[\"mat-flat-button\",\"\",1,\"download-button\",3,\"click\"],[\"alt\",\"artifact.id\",1,\"generated-image\",3,\"click\",\"src\"],[3,\"base64data\"]],template:function(A,i){A&1&&(m(0,\"div\",0),Gt(1,U0A,19,4,\"div\",1,Ri),D()),A&2&&(p(),Kt(i.getDistinctArtifactIds()))},dependencies:[Yg,yn,so,Ca,Mr,vn,In,wB],styles:[\".artifact-container[_ngcontent-%COMP%]{display:flex;flex-wrap:wrap}.artifact-box[_ngcontent-%COMP%]{padding:10px;max-width:100%;margin-left:26px;display:flex;flex-direction:column}.artifact-metadata[_ngcontent-%COMP%]{display:flex;align-items:center;margin-bottom:15px;flex-wrap:wrap;gap:5px}.download-button[_ngcontent-%COMP%]{background-color:var(--artifact-tab-download-button-background-color)!important;margin-left:35px;width:130px;height:28px;font-size:14px}.generated-image[_ngcontent-%COMP%]{max-width:60%;border-radius:8px;cursor:pointer}hr.white-separator[_ngcontent-%COMP%]{border:none;border-top:1px solid var(--artifact-tab-white-separator-border-top-color);margin-bottom:1.2em;margin-right:15px}.version-select-container[_ngcontent-%COMP%]{background-color:var(--artifact-tab-version-select-container-background-color);width:80px;margin-left:15px}.link-style-button[_ngcontent-%COMP%]{background:none;border:none;padding:0;font:inherit;color:var(--artifact-tab-link-style-button-color)!important;text-decoration:underline;cursor:pointer;outline:none}.link-style-button[_ngcontent-%COMP%]:hover{color:var(--artifact-tab-link-style-button-hover-color);text-decoration:underline}.link-style-button[_ngcontent-%COMP%]:focus{outline:1px dotted var(--artifact-tab-link-style-button-focus-outline-color)}.link-style-button[_ngcontent-%COMP%]:active{color:var(--artifact-tab-link-style-button-active-color)}.link-style-button[_ngcontent-%COMP%]:disabled{color:var(--artifact-tab-link-style-button-disabled-color);text-decoration:none;cursor:not-allowed}\"]})};var T0A=[\"input\"],O0A=[\"label\"],z0A=[\"*\"],D9={color:\"accent\",clickAction:\"check-indeterminate\",disabledInteractive:!1},P0A=new wA(\"mat-checkbox-default-options\",{providedIn:\"root\",factory:()=>D9}),$r=(function(t){return t[t.Init=0]=\"Init\",t[t.Checked=1]=\"Checked\",t[t.Unchecked=2]=\"Unchecked\",t[t.Indeterminate=3]=\"Indeterminate\",t})($r||{}),w9=class{source;checked},yB=(()=>{class t{_elementRef=h(ge);_changeDetectorRef=h(ft);_ngZone=h(Oe);_animationsDisabled=Oi();_options=h(P0A,{optional:!0});focus(){this._inputElement.nativeElement.focus()}_createChangeEvent(A){let i=new w9;return i.source=this,i.checked=A,i}_getAnimationTargetElement(){return this._inputElement?.nativeElement}_animationClasses={uncheckedToChecked:\"mdc-checkbox--anim-unchecked-checked\",uncheckedToIndeterminate:\"mdc-checkbox--anim-unchecked-indeterminate\",checkedToUnchecked:\"mdc-checkbox--anim-checked-unchecked\",checkedToIndeterminate:\"mdc-checkbox--anim-checked-indeterminate\",indeterminateToChecked:\"mdc-checkbox--anim-indeterminate-checked\",indeterminateToUnchecked:\"mdc-checkbox--anim-indeterminate-unchecked\"};ariaLabel=\"\";ariaLabelledby=null;ariaDescribedby;ariaExpanded;ariaControls;ariaOwns;_uniqueId;id;get inputId(){return`${this.id||this._uniqueId}-input`}required=!1;labelPosition=\"after\";name=null;change=new WA;indeterminateChange=new WA;value;disableRipple=!1;_inputElement;_labelElement;tabIndex;color;disabledInteractive;_onTouched=()=>{};_currentAnimationClass=\"\";_currentCheckState=$r.Init;_controlValueAccessorChangeFn=()=>{};_validatorChangeFn=()=>{};constructor(){h(Hn).load(Za);let A=h(new bs(\"tabindex\"),{optional:!0});this._options=this._options||D9,this.color=this._options.color||D9.color,this.tabIndex=A==null?0:parseInt(A)||0,this.id=this._uniqueId=h(An).getId(\"mat-mdc-checkbox-\"),this.disabledInteractive=this._options?.disabledInteractive??!1}ngOnChanges(A){A.required&&this._validatorChangeFn()}ngAfterViewInit(){this._syncIndeterminate(this.indeterminate)}get checked(){return this._checked}set checked(A){A!=this.checked&&(this._checked=A,this._changeDetectorRef.markForCheck())}_checked=!1;get disabled(){return this._disabled}set disabled(A){A!==this.disabled&&(this._disabled=A,this._changeDetectorRef.markForCheck())}_disabled=!1;get indeterminate(){return this._indeterminate()}set indeterminate(A){let i=A!=this._indeterminate();this._indeterminate.set(A),i&&(A?this._transitionCheckState($r.Indeterminate):this._transitionCheckState(this.checked?$r.Checked:$r.Unchecked),this.indeterminateChange.emit(A)),this._syncIndeterminate(A)}_indeterminate=jA(!1);_isRippleDisabled(){return this.disableRipple||this.disabled}_onLabelTextChange(){this._changeDetectorRef.detectChanges()}writeValue(A){this.checked=!!A}registerOnChange(A){this._controlValueAccessorChangeFn=A}registerOnTouched(A){this._onTouched=A}setDisabledState(A){this.disabled=A}validate(A){return this.required&&A.value!==!0?{required:!0}:null}registerOnValidatorChange(A){this._validatorChangeFn=A}_transitionCheckState(A){let i=this._currentCheckState,n=this._getAnimationTargetElement();if(!(i===A||!n)&&(this._currentAnimationClass&&n.classList.remove(this._currentAnimationClass),this._currentAnimationClass=this._getAnimationClassForCheckStateTransition(i,A),this._currentCheckState=A,this._currentAnimationClass.length>0)){n.classList.add(this._currentAnimationClass);let o=this._currentAnimationClass;this._ngZone.runOutsideAngular(()=>{setTimeout(()=>{n.classList.remove(o)},1e3)})}}_emitChangeEvent(){this._controlValueAccessorChangeFn(this.checked),this.change.emit(this._createChangeEvent(this.checked)),this._inputElement&&(this._inputElement.nativeElement.checked=this.checked)}toggle(){this.checked=!this.checked,this._controlValueAccessorChangeFn(this.checked)}_handleInputClick(){let A=this._options?.clickAction;!this.disabled&&A!==\"noop\"?(this.indeterminate&&A!==\"check\"&&Promise.resolve().then(()=>{this._indeterminate.set(!1),this.indeterminateChange.emit(!1)}),this._checked=!this._checked,this._transitionCheckState(this._checked?$r.Checked:$r.Unchecked),this._emitChangeEvent()):(this.disabled&&this.disabledInteractive||!this.disabled&&A===\"noop\")&&(this._inputElement.nativeElement.checked=this.checked,this._inputElement.nativeElement.indeterminate=this.indeterminate)}_onInteractionEvent(A){A.stopPropagation()}_onBlur(){Promise.resolve().then(()=>{this._onTouched(),this._changeDetectorRef.markForCheck()})}_getAnimationClassForCheckStateTransition(A,i){if(this._animationsDisabled)return\"\";switch(A){case $r.Init:if(i===$r.Checked)return this._animationClasses.uncheckedToChecked;if(i==$r.Indeterminate)return this._checked?this._animationClasses.checkedToIndeterminate:this._animationClasses.uncheckedToIndeterminate;break;case $r.Unchecked:return i===$r.Checked?this._animationClasses.uncheckedToChecked:this._animationClasses.uncheckedToIndeterminate;case $r.Checked:return i===$r.Unchecked?this._animationClasses.checkedToUnchecked:this._animationClasses.checkedToIndeterminate;case $r.Indeterminate:return i===$r.Checked?this._animationClasses.indeterminateToChecked:this._animationClasses.indeterminateToUnchecked}return\"\"}_syncIndeterminate(A){let i=this._inputElement;i&&(i.nativeElement.indeterminate=A)}_onInputClick(){this._handleInputClick()}_onTouchTargetClick(){this._handleInputClick(),this.disabled||this._inputElement.nativeElement.focus()}_preventBubblingFromLabel(A){A.target&&this._labelElement.nativeElement.contains(A.target)&&A.stopPropagation()}static \\u0275fac=function(i){return new(i||t)};static \\u0275cmp=kA({type:t,selectors:[[\"mat-checkbox\"]],viewQuery:function(i,n){if(i&1&&ni(T0A,5)(O0A,5),i&2){let o;Ce(o=Ie())&&(n._inputElement=o.first),Ce(o=Ie())&&(n._labelElement=o.first)}},hostAttrs:[1,\"mat-mdc-checkbox\"],hostVars:16,hostBindings:function(i,n){i&2&&(Bo(\"id\",n.id),ie(\"tabindex\",null)(\"aria-label\",null)(\"aria-labelledby\",null),Qo(n.color?\"mat-\"+n.color:\"mat-accent\"),ae(\"_mat-animation-noopable\",n._animationsDisabled)(\"mdc-checkbox--disabled\",n.disabled)(\"mat-mdc-checkbox-disabled\",n.disabled)(\"mat-mdc-checkbox-checked\",n.checked)(\"mat-mdc-checkbox-disabled-interactive\",n.disabledInteractive))},inputs:{ariaLabel:[0,\"aria-label\",\"ariaLabel\"],ariaLabelledby:[0,\"aria-labelledby\",\"ariaLabelledby\"],ariaDescribedby:[0,\"aria-describedby\",\"ariaDescribedby\"],ariaExpanded:[2,\"aria-expanded\",\"ariaExpanded\",he],ariaControls:[0,\"aria-controls\",\"ariaControls\"],ariaOwns:[0,\"aria-owns\",\"ariaOwns\"],id:\"id\",required:[2,\"required\",\"required\",he],labelPosition:\"labelPosition\",name:\"name\",value:\"value\",disableRipple:[2,\"disableRipple\",\"disableRipple\",he],tabIndex:[2,\"tabIndex\",\"tabIndex\",A=>A==null?void 0:Zi(A)],color:\"color\",disabledInteractive:[2,\"disabledInteractive\",\"disabledInteractive\",he],checked:[2,\"checked\",\"checked\",he],disabled:[2,\"disabled\",\"disabled\",he],indeterminate:[2,\"indeterminate\",\"indeterminate\",he]},outputs:{change:\"change\",indeterminateChange:\"indeterminateChange\"},exportAs:[\"matCheckbox\"],features:[It([{provide:gg,useExisting:ar(()=>t),multi:!0},{provide:vc,useExisting:t,multi:!0}]),ei],ngContentSelectors:z0A,decls:15,vars:23,consts:[[\"checkbox\",\"\"],[\"input\",\"\"],[\"label\",\"\"],[\"mat-internal-form-field\",\"\",3,\"click\",\"labelPosition\"],[1,\"mdc-checkbox\"],[\"aria-hidden\",\"true\",1,\"mat-mdc-checkbox-touch-target\",3,\"click\"],[\"type\",\"checkbox\",1,\"mdc-checkbox__native-control\",3,\"blur\",\"click\",\"change\",\"checked\",\"indeterminate\",\"disabled\",\"id\",\"required\",\"tabIndex\"],[\"aria-hidden\",\"true\",1,\"mdc-checkbox__ripple\"],[\"aria-hidden\",\"true\",1,\"mdc-checkbox__background\"],[\"focusable\",\"false\",\"viewBox\",\"0 0 24 24\",1,\"mdc-checkbox__checkmark\"],[\"fill\",\"none\",\"d\",\"M1.73,12.91 8.1,19.28 22.79,4.59\",1,\"mdc-checkbox__checkmark-path\"],[1,\"mdc-checkbox__mixedmark\"],[\"mat-ripple\",\"\",\"aria-hidden\",\"true\",1,\"mat-mdc-checkbox-ripple\",\"mat-focus-indicator\",3,\"matRippleTrigger\",\"matRippleDisabled\",\"matRippleCentered\"],[1,\"mdc-label\",3,\"for\"]],template:function(i,n){if(i&1&&(Yt(),m(0,\"div\",3),$(\"click\",function(a){return n._preventBubblingFromLabel(a)}),m(1,\"div\",4,0)(3,\"div\",5),$(\"click\",function(){return n._onTouchTargetClick()}),D(),m(4,\"input\",6,1),$(\"blur\",function(){return n._onBlur()})(\"click\",function(){return n._onInputClick()})(\"change\",function(a){return n._onInteractionEvent(a)}),D(),GA(6,\"div\",7),m(7,\"div\",8),Qt(),m(8,\"svg\",9),GA(9,\"path\",10),D(),Tr(),GA(10,\"div\",11),D(),GA(11,\"div\",12),D(),m(12,\"label\",13,2),He(14),D()()),i&2){let o=Wi(2);X(\"labelPosition\",n.labelPosition),p(4),ae(\"mdc-checkbox--selected\",n.checked),X(\"checked\",n.checked)(\"indeterminate\",n.indeterminate)(\"disabled\",n.disabled&&!n.disabledInteractive)(\"id\",n.inputId)(\"required\",n.required)(\"tabIndex\",n.disabled&&!n.disabledInteractive?-1:n.tabIndex),ie(\"aria-label\",n.ariaLabel||null)(\"aria-labelledby\",n.ariaLabelledby)(\"aria-describedby\",n.ariaDescribedby)(\"aria-checked\",n.indeterminate?\"mixed\":null)(\"aria-controls\",n.ariaControls)(\"aria-disabled\",n.disabled&&n.disabledInteractive?!0:null)(\"aria-expanded\",n.ariaExpanded)(\"aria-owns\",n.ariaOwns)(\"name\",n.name)(\"value\",n.value),p(7),X(\"matRippleTrigger\",o)(\"matRippleDisabled\",n.disableRipple||n.disabled)(\"matRippleCentered\",!0),p(),X(\"for\",n.inputId)}},dependencies:[Ns,Mp],styles:[`.mdc-checkbox{display:inline-block;position:relative;flex:0 0 18px;box-sizing:content-box;width:18px;height:18px;line-height:0;white-space:nowrap;cursor:pointer;vertical-align:bottom;padding:calc((var(--mat-checkbox-state-layer-size, 40px) - 18px)/2);margin:calc((var(--mat-checkbox-state-layer-size, 40px) - var(--mat-checkbox-state-layer-size, 40px))/2)}.mdc-checkbox:hover>.mdc-checkbox__ripple{opacity:var(--mat-checkbox-unselected-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity));background-color:var(--mat-checkbox-unselected-hover-state-layer-color, var(--mat-sys-on-surface))}.mdc-checkbox:hover>.mat-mdc-checkbox-ripple>.mat-ripple-element{background-color:var(--mat-checkbox-unselected-hover-state-layer-color, var(--mat-sys-on-surface))}.mdc-checkbox .mdc-checkbox__native-control:focus+.mdc-checkbox__ripple{opacity:var(--mat-checkbox-unselected-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity));background-color:var(--mat-checkbox-unselected-focus-state-layer-color, var(--mat-sys-on-surface))}.mdc-checkbox .mdc-checkbox__native-control:focus~.mat-mdc-checkbox-ripple .mat-ripple-element{background-color:var(--mat-checkbox-unselected-focus-state-layer-color, var(--mat-sys-on-surface))}.mdc-checkbox:active>.mdc-checkbox__native-control+.mdc-checkbox__ripple{opacity:var(--mat-checkbox-unselected-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity));background-color:var(--mat-checkbox-unselected-pressed-state-layer-color, var(--mat-sys-primary))}.mdc-checkbox:active>.mdc-checkbox__native-control~.mat-mdc-checkbox-ripple .mat-ripple-element{background-color:var(--mat-checkbox-unselected-pressed-state-layer-color, var(--mat-sys-primary))}.mdc-checkbox:hover>.mdc-checkbox__native-control:checked+.mdc-checkbox__ripple{opacity:var(--mat-checkbox-selected-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity));background-color:var(--mat-checkbox-selected-hover-state-layer-color, var(--mat-sys-primary))}.mdc-checkbox:hover>.mdc-checkbox__native-control:checked~.mat-mdc-checkbox-ripple .mat-ripple-element{background-color:var(--mat-checkbox-selected-hover-state-layer-color, var(--mat-sys-primary))}.mdc-checkbox .mdc-checkbox__native-control:focus:checked+.mdc-checkbox__ripple{opacity:var(--mat-checkbox-selected-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity));background-color:var(--mat-checkbox-selected-focus-state-layer-color, var(--mat-sys-primary))}.mdc-checkbox .mdc-checkbox__native-control:focus:checked~.mat-mdc-checkbox-ripple .mat-ripple-element{background-color:var(--mat-checkbox-selected-focus-state-layer-color, var(--mat-sys-primary))}.mdc-checkbox:active>.mdc-checkbox__native-control:checked+.mdc-checkbox__ripple{opacity:var(--mat-checkbox-selected-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity));background-color:var(--mat-checkbox-selected-pressed-state-layer-color, var(--mat-sys-on-surface))}.mdc-checkbox:active>.mdc-checkbox__native-control:checked~.mat-mdc-checkbox-ripple .mat-ripple-element{background-color:var(--mat-checkbox-selected-pressed-state-layer-color, var(--mat-sys-on-surface))}.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox .mdc-checkbox__native-control~.mat-mdc-checkbox-ripple .mat-ripple-element,.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox .mdc-checkbox__native-control+.mdc-checkbox__ripple{background-color:var(--mat-checkbox-unselected-hover-state-layer-color, var(--mat-sys-on-surface))}.mdc-checkbox .mdc-checkbox__native-control{position:absolute;margin:0;padding:0;opacity:0;cursor:inherit;z-index:1;width:var(--mat-checkbox-state-layer-size, 40px);height:var(--mat-checkbox-state-layer-size, 40px);top:calc((var(--mat-checkbox-state-layer-size, 40px) - var(--mat-checkbox-state-layer-size, 40px))/2);right:calc((var(--mat-checkbox-state-layer-size, 40px) - var(--mat-checkbox-state-layer-size, 40px))/2);left:calc((var(--mat-checkbox-state-layer-size, 40px) - var(--mat-checkbox-state-layer-size, 40px))/2)}.mdc-checkbox--disabled{cursor:default;pointer-events:none}.mdc-checkbox__background{display:inline-flex;position:absolute;align-items:center;justify-content:center;box-sizing:border-box;width:18px;height:18px;border:2px solid currentColor;border-radius:2px;background-color:rgba(0,0,0,0);pointer-events:none;will-change:background-color,border-color;transition:background-color 90ms cubic-bezier(0.4, 0, 0.6, 1),border-color 90ms cubic-bezier(0.4, 0, 0.6, 1);-webkit-print-color-adjust:exact;color-adjust:exact;border-color:var(--mat-checkbox-unselected-icon-color, var(--mat-sys-on-surface-variant));top:calc((var(--mat-checkbox-state-layer-size, 40px) - 18px)/2);left:calc((var(--mat-checkbox-state-layer-size, 40px) - 18px)/2)}.mdc-checkbox__native-control:enabled:checked~.mdc-checkbox__background,.mdc-checkbox__native-control:enabled:indeterminate~.mdc-checkbox__background{border-color:var(--mat-checkbox-selected-icon-color, var(--mat-sys-primary));background-color:var(--mat-checkbox-selected-icon-color, var(--mat-sys-primary))}.mdc-checkbox--disabled .mdc-checkbox__background{border-color:var(--mat-checkbox-disabled-unselected-icon-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}@media(forced-colors: active){.mdc-checkbox--disabled .mdc-checkbox__background{border-color:GrayText}}.mdc-checkbox__native-control:disabled:checked~.mdc-checkbox__background,.mdc-checkbox__native-control:disabled:indeterminate~.mdc-checkbox__background{background-color:var(--mat-checkbox-disabled-selected-icon-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent));border-color:rgba(0,0,0,0)}@media(forced-colors: active){.mdc-checkbox__native-control:disabled:checked~.mdc-checkbox__background,.mdc-checkbox__native-control:disabled:indeterminate~.mdc-checkbox__background{border-color:GrayText}}.mdc-checkbox:hover>.mdc-checkbox__native-control:not(:checked)~.mdc-checkbox__background,.mdc-checkbox:hover>.mdc-checkbox__native-control:not(:indeterminate)~.mdc-checkbox__background{border-color:var(--mat-checkbox-unselected-hover-icon-color, var(--mat-sys-on-surface));background-color:rgba(0,0,0,0)}.mdc-checkbox:hover>.mdc-checkbox__native-control:checked~.mdc-checkbox__background,.mdc-checkbox:hover>.mdc-checkbox__native-control:indeterminate~.mdc-checkbox__background{border-color:var(--mat-checkbox-selected-hover-icon-color, var(--mat-sys-primary));background-color:var(--mat-checkbox-selected-hover-icon-color, var(--mat-sys-primary))}.mdc-checkbox__native-control:focus:focus:not(:checked)~.mdc-checkbox__background,.mdc-checkbox__native-control:focus:focus:not(:indeterminate)~.mdc-checkbox__background{border-color:var(--mat-checkbox-unselected-focus-icon-color, var(--mat-sys-on-surface))}.mdc-checkbox__native-control:focus:focus:checked~.mdc-checkbox__background,.mdc-checkbox__native-control:focus:focus:indeterminate~.mdc-checkbox__background{border-color:var(--mat-checkbox-selected-focus-icon-color, var(--mat-sys-primary));background-color:var(--mat-checkbox-selected-focus-icon-color, var(--mat-sys-primary))}.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox:hover>.mdc-checkbox__native-control~.mdc-checkbox__background,.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox .mdc-checkbox__native-control:focus~.mdc-checkbox__background,.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox__background{border-color:var(--mat-checkbox-disabled-unselected-icon-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}@media(forced-colors: active){.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox:hover>.mdc-checkbox__native-control~.mdc-checkbox__background,.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox .mdc-checkbox__native-control:focus~.mdc-checkbox__background,.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox__background{border-color:GrayText}}.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox__native-control:checked~.mdc-checkbox__background,.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox__native-control:indeterminate~.mdc-checkbox__background{background-color:var(--mat-checkbox-disabled-selected-icon-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent));border-color:rgba(0,0,0,0)}.mdc-checkbox__checkmark{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;opacity:0;transition:opacity 180ms cubic-bezier(0.4, 0, 0.6, 1);color:var(--mat-checkbox-selected-checkmark-color, var(--mat-sys-on-primary))}@media(forced-colors: active){.mdc-checkbox__checkmark{color:CanvasText}}.mdc-checkbox--disabled .mdc-checkbox__checkmark,.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox__checkmark{color:var(--mat-checkbox-disabled-selected-checkmark-color, var(--mat-sys-surface))}@media(forced-colors: active){.mdc-checkbox--disabled .mdc-checkbox__checkmark,.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox__checkmark{color:GrayText}}.mdc-checkbox__checkmark-path{transition:stroke-dashoffset 180ms cubic-bezier(0.4, 0, 0.6, 1);stroke:currentColor;stroke-width:3.12px;stroke-dashoffset:29.7833385;stroke-dasharray:29.7833385}.mdc-checkbox__mixedmark{width:100%;height:0;transform:scaleX(0) rotate(0deg);border-width:1px;border-style:solid;opacity:0;transition:opacity 90ms cubic-bezier(0.4, 0, 0.6, 1),transform 90ms cubic-bezier(0.4, 0, 0.6, 1);border-color:var(--mat-checkbox-selected-checkmark-color, var(--mat-sys-on-primary))}@media(forced-colors: active){.mdc-checkbox__mixedmark{margin:0 1px}}.mdc-checkbox--disabled .mdc-checkbox__mixedmark,.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox__mixedmark{border-color:var(--mat-checkbox-disabled-selected-checkmark-color, var(--mat-sys-surface))}@media(forced-colors: active){.mdc-checkbox--disabled .mdc-checkbox__mixedmark,.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox__mixedmark{border-color:GrayText}}.mdc-checkbox--anim-unchecked-checked .mdc-checkbox__background,.mdc-checkbox--anim-unchecked-indeterminate .mdc-checkbox__background,.mdc-checkbox--anim-checked-unchecked .mdc-checkbox__background,.mdc-checkbox--anim-indeterminate-unchecked .mdc-checkbox__background{animation-duration:180ms;animation-timing-function:linear}.mdc-checkbox--anim-unchecked-checked .mdc-checkbox__checkmark-path{animation:mdc-checkbox-unchecked-checked-checkmark-path 180ms linear;transition:none}.mdc-checkbox--anim-unchecked-indeterminate .mdc-checkbox__mixedmark{animation:mdc-checkbox-unchecked-indeterminate-mixedmark 90ms linear;transition:none}.mdc-checkbox--anim-checked-unchecked .mdc-checkbox__checkmark-path{animation:mdc-checkbox-checked-unchecked-checkmark-path 90ms linear;transition:none}.mdc-checkbox--anim-checked-indeterminate .mdc-checkbox__checkmark{animation:mdc-checkbox-checked-indeterminate-checkmark 90ms linear;transition:none}.mdc-checkbox--anim-checked-indeterminate .mdc-checkbox__mixedmark{animation:mdc-checkbox-checked-indeterminate-mixedmark 90ms linear;transition:none}.mdc-checkbox--anim-indeterminate-checked .mdc-checkbox__checkmark{animation:mdc-checkbox-indeterminate-checked-checkmark 500ms linear;transition:none}.mdc-checkbox--anim-indeterminate-checked .mdc-checkbox__mixedmark{animation:mdc-checkbox-indeterminate-checked-mixedmark 500ms linear;transition:none}.mdc-checkbox--anim-indeterminate-unchecked .mdc-checkbox__mixedmark{animation:mdc-checkbox-indeterminate-unchecked-mixedmark 300ms linear;transition:none}.mdc-checkbox__native-control:checked~.mdc-checkbox__background,.mdc-checkbox__native-control:indeterminate~.mdc-checkbox__background{transition:border-color 90ms cubic-bezier(0, 0, 0.2, 1),background-color 90ms cubic-bezier(0, 0, 0.2, 1)}.mdc-checkbox__native-control:checked~.mdc-checkbox__background>.mdc-checkbox__checkmark>.mdc-checkbox__checkmark-path,.mdc-checkbox__native-control:indeterminate~.mdc-checkbox__background>.mdc-checkbox__checkmark>.mdc-checkbox__checkmark-path{stroke-dashoffset:0}.mdc-checkbox__native-control:checked~.mdc-checkbox__background>.mdc-checkbox__checkmark{transition:opacity 180ms cubic-bezier(0, 0, 0.2, 1),transform 180ms cubic-bezier(0, 0, 0.2, 1);opacity:1}.mdc-checkbox__native-control:checked~.mdc-checkbox__background>.mdc-checkbox__mixedmark{transform:scaleX(1) rotate(-45deg)}.mdc-checkbox__native-control:indeterminate~.mdc-checkbox__background>.mdc-checkbox__checkmark{transform:rotate(45deg);opacity:0;transition:opacity 90ms cubic-bezier(0.4, 0, 0.6, 1),transform 90ms cubic-bezier(0.4, 0, 0.6, 1)}.mdc-checkbox__native-control:indeterminate~.mdc-checkbox__background>.mdc-checkbox__mixedmark{transform:scaleX(1) rotate(0deg);opacity:1}@keyframes mdc-checkbox-unchecked-checked-checkmark-path{0%,50%{stroke-dashoffset:29.7833385}50%{animation-timing-function:cubic-bezier(0, 0, 0.2, 1)}100%{stroke-dashoffset:0}}@keyframes mdc-checkbox-unchecked-indeterminate-mixedmark{0%,68.2%{transform:scaleX(0)}68.2%{animation-timing-function:cubic-bezier(0, 0, 0, 1)}100%{transform:scaleX(1)}}@keyframes mdc-checkbox-checked-unchecked-checkmark-path{from{animation-timing-function:cubic-bezier(0.4, 0, 1, 1);opacity:1;stroke-dashoffset:0}to{opacity:0;stroke-dashoffset:-29.7833385}}@keyframes mdc-checkbox-checked-indeterminate-checkmark{from{animation-timing-function:cubic-bezier(0, 0, 0.2, 1);transform:rotate(0deg);opacity:1}to{transform:rotate(45deg);opacity:0}}@keyframes mdc-checkbox-indeterminate-checked-checkmark{from{animation-timing-function:cubic-bezier(0.14, 0, 0, 1);transform:rotate(45deg);opacity:0}to{transform:rotate(360deg);opacity:1}}@keyframes mdc-checkbox-checked-indeterminate-mixedmark{from{animation-timing-function:cubic-bezier(0, 0, 0.2, 1);transform:rotate(-45deg);opacity:0}to{transform:rotate(0deg);opacity:1}}@keyframes mdc-checkbox-indeterminate-checked-mixedmark{from{animation-timing-function:cubic-bezier(0.14, 0, 0, 1);transform:rotate(0deg);opacity:1}to{transform:rotate(315deg);opacity:0}}@keyframes mdc-checkbox-indeterminate-unchecked-mixedmark{0%{animation-timing-function:linear;transform:scaleX(1);opacity:1}32.8%,100%{transform:scaleX(0);opacity:0}}.mat-mdc-checkbox{display:inline-block;position:relative;-webkit-tap-highlight-color:rgba(0,0,0,0)}.mat-mdc-checkbox._mat-animation-noopable>.mat-internal-form-field>.mdc-checkbox>.mat-mdc-checkbox-touch-target,.mat-mdc-checkbox._mat-animation-noopable>.mat-internal-form-field>.mdc-checkbox>.mdc-checkbox__native-control,.mat-mdc-checkbox._mat-animation-noopable>.mat-internal-form-field>.mdc-checkbox>.mdc-checkbox__ripple,.mat-mdc-checkbox._mat-animation-noopable>.mat-internal-form-field>.mdc-checkbox>.mat-mdc-checkbox-ripple::before,.mat-mdc-checkbox._mat-animation-noopable>.mat-internal-form-field>.mdc-checkbox>.mdc-checkbox__background,.mat-mdc-checkbox._mat-animation-noopable>.mat-internal-form-field>.mdc-checkbox>.mdc-checkbox__background>.mdc-checkbox__checkmark,.mat-mdc-checkbox._mat-animation-noopable>.mat-internal-form-field>.mdc-checkbox>.mdc-checkbox__background>.mdc-checkbox__checkmark>.mdc-checkbox__checkmark-path,.mat-mdc-checkbox._mat-animation-noopable>.mat-internal-form-field>.mdc-checkbox>.mdc-checkbox__background>.mdc-checkbox__mixedmark{transition:none !important;animation:none !important}.mat-mdc-checkbox label{cursor:pointer}.mat-mdc-checkbox .mat-internal-form-field{color:var(--mat-checkbox-label-text-color, var(--mat-sys-on-surface));font-family:var(--mat-checkbox-label-text-font, var(--mat-sys-body-medium-font));line-height:var(--mat-checkbox-label-text-line-height, var(--mat-sys-body-medium-line-height));font-size:var(--mat-checkbox-label-text-size, var(--mat-sys-body-medium-size));letter-spacing:var(--mat-checkbox-label-text-tracking, var(--mat-sys-body-medium-tracking));font-weight:var(--mat-checkbox-label-text-weight, var(--mat-sys-body-medium-weight))}.mat-mdc-checkbox.mat-mdc-checkbox-disabled.mat-mdc-checkbox-disabled-interactive{pointer-events:auto}.mat-mdc-checkbox.mat-mdc-checkbox-disabled.mat-mdc-checkbox-disabled-interactive input{cursor:default}.mat-mdc-checkbox.mat-mdc-checkbox-disabled label{cursor:default;color:var(--mat-checkbox-disabled-label-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}@media(forced-colors: active){.mat-mdc-checkbox.mat-mdc-checkbox-disabled label{color:GrayText}}.mat-mdc-checkbox label:empty{display:none}.mat-mdc-checkbox .mdc-checkbox__ripple{opacity:0}.mat-mdc-checkbox .mat-mdc-checkbox-ripple,.mdc-checkbox__ripple{top:0;left:0;right:0;bottom:0;position:absolute;border-radius:50%;pointer-events:none}.mat-mdc-checkbox .mat-mdc-checkbox-ripple:not(:empty),.mdc-checkbox__ripple:not(:empty){transform:translateZ(0)}.mat-mdc-checkbox-ripple .mat-ripple-element{opacity:.1}.mat-mdc-checkbox-touch-target{position:absolute;top:50%;left:50%;height:var(--mat-checkbox-touch-target-size, 48px);width:var(--mat-checkbox-touch-target-size, 48px);transform:translate(-50%, -50%);display:var(--mat-checkbox-touch-target-display, block)}.mat-mdc-checkbox .mat-mdc-checkbox-ripple::before{border-radius:50%}.mdc-checkbox__native-control:focus-visible~.mat-focus-indicator::before{content:\"\"}\n`],encapsulation:2,changeDetection:0})}return t})();var mY=new wA(\"CdkAccordion\");var pY=(()=>{class t{accordion=h(mY,{optional:!0,skipSelf:!0});_changeDetectorRef=h(ft);_expansionDispatcher=h(r4);_openCloseAllSubscription=Rn.EMPTY;closed=new WA;opened=new WA;destroyed=new WA;expandedChange=new WA;id=h(An).getId(\"cdk-accordion-child-\");get expanded(){return this._expanded}set expanded(A){if(this._expanded!==A){if(this._expanded=A,this.expandedChange.emit(A),A){this.opened.emit();let i=this.accordion?this.accordion.id:this.id;this._expansionDispatcher.notify(this.id,i)}else this.closed.emit();this._changeDetectorRef.markForCheck()}}_expanded=!1;get disabled(){return this._disabled()}set disabled(A){this._disabled.set(A)}_disabled=jA(!1);_removeUniqueSelectionListener=()=>{};constructor(){}ngOnInit(){this._removeUniqueSelectionListener=this._expansionDispatcher.listen((A,i)=>{this.accordion&&!this.accordion.multi&&this.accordion.id===i&&this.id!==A&&(this.expanded=!1)}),this.accordion&&(this._openCloseAllSubscription=this._subscribeToOpenCloseAllActions())}ngOnDestroy(){this.opened.complete(),this.closed.complete(),this.destroyed.emit(),this.destroyed.complete(),this._removeUniqueSelectionListener(),this._openCloseAllSubscription.unsubscribe()}toggle(){this.disabled||(this.expanded=!this.expanded)}close(){this.disabled||(this.expanded=!1)}open(){this.disabled||(this.expanded=!0)}_subscribeToOpenCloseAllActions(){return this.accordion._openCloseAllActions.subscribe(A=>{this.disabled||(this.expanded=A)})}static \\u0275fac=function(i){return new(i||t)};static \\u0275dir=OA({type:t,selectors:[[\"cdk-accordion-item\"],[\"\",\"cdkAccordionItem\",\"\"]],inputs:{expanded:[2,\"expanded\",\"expanded\",he],disabled:[2,\"disabled\",\"disabled\",he]},outputs:{closed:\"closed\",opened:\"opened\",destroyed:\"destroyed\",expandedChange:\"expandedChange\"},exportAs:[\"cdkAccordionItem\"],features:[It([{provide:mY,useValue:void 0}])]})}return t})(),DY=(()=>{class t{static \\u0275fac=function(i){return new(i||t)};static \\u0275mod=Xe({type:t});static \\u0275inj=Ze({})}return t})();var j0A=[\"body\"],q0A=[\"bodyWrapper\"],V0A=[[[\"mat-expansion-panel-header\"]],\"*\",[[\"mat-action-row\"]]],W0A=[\"mat-expansion-panel-header\",\"*\",\"mat-action-row\"];function Z0A(t,e){}var X0A=[[[\"mat-panel-title\"]],[[\"mat-panel-description\"]],\"*\"],$0A=[\"mat-panel-title\",\"mat-panel-description\",\"*\"];function ACA(t,e){t&1&&(ti(0,\"span\",1),Qt(),ti(1,\"svg\",2),Ni(2,\"path\",3),Ii()())}var wY=new wA(\"MAT_ACCORDION\"),yY=new wA(\"MAT_EXPANSION_PANEL\"),eCA=(()=>{class t{_template=h(Fn);_expansionPanel=h(yY,{optional:!0});constructor(){}static \\u0275fac=function(i){return new(i||t)};static \\u0275dir=OA({type:t,selectors:[[\"ng-template\",\"matExpansionPanelContent\",\"\"]]})}return t})(),vY=new wA(\"MAT_EXPANSION_PANEL_DEFAULT_OPTIONS\"),y9=(()=>{class t extends pY{_viewContainerRef=h(Ro);_animationsDisabled=Oi();_document=h(Zt);_ngZone=h(Oe);_elementRef=h(ge);_renderer=h(ui);_cleanupTransitionEnd;get hideToggle(){return this._hideToggle||this.accordion&&this.accordion.hideToggle}set hideToggle(A){this._hideToggle=A}_hideToggle=!1;get togglePosition(){return this._togglePosition||this.accordion&&this.accordion.togglePosition}set togglePosition(A){this._togglePosition=A}_togglePosition;afterExpand=new WA;afterCollapse=new WA;_inputChanges=new $A;accordion=h(wY,{optional:!0,skipSelf:!0});_lazyContent;_body;_bodyWrapper;_portal;_headerId=h(An).getId(\"mat-expansion-panel-header-\");constructor(){super();let A=h(vY,{optional:!0});this._expansionDispatcher=h(r4),A&&(this.hideToggle=A.hideToggle)}_hasSpacing(){return this.accordion?this.expanded&&this.accordion.displayMode===\"default\":!1}_getExpandedState(){return this.expanded?\"expanded\":\"collapsed\"}toggle(){this.expanded=!this.expanded}close(){this.expanded=!1}open(){this.expanded=!0}ngAfterContentInit(){this._lazyContent&&this._lazyContent._expansionPanel===this&&this.opened.pipe(nn(null),We(()=>this.expanded&&!this._portal),qn(1)).subscribe(()=>{this._portal=new Vr(this._lazyContent._template,this._viewContainerRef)}),this._setupAnimationEvents()}ngOnChanges(A){this._inputChanges.next(A)}ngOnDestroy(){super.ngOnDestroy(),this._cleanupTransitionEnd?.(),this._inputChanges.complete()}_containsFocus(){if(this._body){let A=this._document.activeElement,i=this._body.nativeElement;return A===i||i.contains(A)}return!1}_transitionEndListener=({target:A,propertyName:i})=>{A===this._bodyWrapper?.nativeElement&&i===\"grid-template-rows\"&&this._ngZone.run(()=>{this.expanded?this.afterExpand.emit():this.afterCollapse.emit()})};_setupAnimationEvents(){this._ngZone.runOutsideAngular(()=>{this._animationsDisabled?(this.opened.subscribe(()=>this._ngZone.run(()=>this.afterExpand.emit())),this.closed.subscribe(()=>this._ngZone.run(()=>this.afterCollapse.emit()))):setTimeout(()=>{let A=this._elementRef.nativeElement;this._cleanupTransitionEnd=this._renderer.listen(A,\"transitionend\",this._transitionEndListener),A.classList.add(\"mat-expansion-panel-animations-enabled\")},200)})}static \\u0275fac=function(i){return new(i||t)};static \\u0275cmp=kA({type:t,selectors:[[\"mat-expansion-panel\"]],contentQueries:function(i,n,o){if(i&1&&na(o,eCA,5),i&2){let a;Ce(a=Ie())&&(n._lazyContent=a.first)}},viewQuery:function(i,n){if(i&1&&ni(j0A,5)(q0A,5),i&2){let o;Ce(o=Ie())&&(n._body=o.first),Ce(o=Ie())&&(n._bodyWrapper=o.first)}},hostAttrs:[1,\"mat-expansion-panel\"],hostVars:4,hostBindings:function(i,n){i&2&&ae(\"mat-expanded\",n.expanded)(\"mat-expansion-panel-spacing\",n._hasSpacing())},inputs:{hideToggle:[2,\"hideToggle\",\"hideToggle\",he],togglePosition:\"togglePosition\"},outputs:{afterExpand:\"afterExpand\",afterCollapse:\"afterCollapse\"},exportAs:[\"matExpansionPanel\"],features:[It([{provide:wY,useValue:void 0},{provide:yY,useExisting:t}]),Ct,ei],ngContentSelectors:W0A,decls:9,vars:4,consts:[[\"bodyWrapper\",\"\"],[\"body\",\"\"],[1,\"mat-expansion-panel-content-wrapper\"],[\"role\",\"region\",1,\"mat-expansion-panel-content\",3,\"id\"],[1,\"mat-expansion-panel-body\"],[3,\"cdkPortalOutlet\"]],template:function(i,n){i&1&&(Yt(V0A),He(0),m(1,\"div\",2,0)(3,\"div\",3,1)(5,\"div\",4),He(6,1),yt(7,Z0A,0,0,\"ng-template\",5),D(),He(8,2),D()()),i&2&&(p(),ie(\"inert\",n.expanded?null:\"\"),p(2),X(\"id\",n.id),ie(\"aria-labelledby\",n._headerId),p(4),X(\"cdkPortalOutlet\",n._portal))},dependencies:[Ig],styles:[`.mat-expansion-panel{box-sizing:content-box;display:block;margin:0;overflow:hidden}.mat-expansion-panel.mat-expansion-panel-animations-enabled{transition:margin 225ms cubic-bezier(0.4, 0, 0.2, 1),box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1)}.mat-expansion-panel{position:relative;background:var(--mat-expansion-container-background-color, var(--mat-sys-surface));color:var(--mat-expansion-container-text-color, var(--mat-sys-on-surface));border-radius:var(--mat-expansion-container-shape, 12px)}.mat-expansion-panel:not([class*=mat-elevation-z]){box-shadow:var(--mat-expansion-container-elevation-shadow, 0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12))}.mat-accordion .mat-expansion-panel:not(.mat-expanded),.mat-accordion .mat-expansion-panel:not(.mat-expansion-panel-spacing){border-radius:0}.mat-accordion .mat-expansion-panel:first-of-type{border-top-right-radius:var(--mat-expansion-container-shape, 12px);border-top-left-radius:var(--mat-expansion-container-shape, 12px)}.mat-accordion .mat-expansion-panel:last-of-type{border-bottom-right-radius:var(--mat-expansion-container-shape, 12px);border-bottom-left-radius:var(--mat-expansion-container-shape, 12px)}@media(forced-colors: active){.mat-expansion-panel{outline:solid 1px}}.mat-expansion-panel-content-wrapper{display:grid;grid-template-rows:0fr;grid-template-columns:100%}.mat-expansion-panel-animations-enabled .mat-expansion-panel-content-wrapper{transition:grid-template-rows 225ms cubic-bezier(0.4, 0, 0.2, 1)}.mat-expansion-panel.mat-expanded>.mat-expansion-panel-content-wrapper{grid-template-rows:1fr}@supports not (grid-template-rows: 0fr){.mat-expansion-panel-content-wrapper{height:0}.mat-expansion-panel.mat-expanded>.mat-expansion-panel-content-wrapper{height:auto}}@media print{.mat-expansion-panel-content-wrapper{height:0}.mat-expansion-panel.mat-expanded>.mat-expansion-panel-content-wrapper{height:auto}}.mat-expansion-panel-content{display:flex;flex-direction:column;overflow:visible;min-height:0;visibility:hidden}.mat-expansion-panel-animations-enabled .mat-expansion-panel-content{transition:visibility 190ms linear}.mat-expansion-panel.mat-expanded>.mat-expansion-panel-content-wrapper>.mat-expansion-panel-content{visibility:visible}.mat-expansion-panel-content{font-family:var(--mat-expansion-container-text-font, var(--mat-sys-body-large-font));font-size:var(--mat-expansion-container-text-size, var(--mat-sys-body-large-size));font-weight:var(--mat-expansion-container-text-weight, var(--mat-sys-body-large-weight));line-height:var(--mat-expansion-container-text-line-height, var(--mat-sys-body-large-line-height));letter-spacing:var(--mat-expansion-container-text-tracking, var(--mat-sys-body-large-tracking))}.mat-expansion-panel-body{padding:0 24px 16px}.mat-expansion-panel-spacing{margin:16px 0}.mat-accordion>.mat-expansion-panel-spacing:first-child,.mat-accordion>*:first-child:not(.mat-expansion-panel) .mat-expansion-panel-spacing{margin-top:0}.mat-accordion>.mat-expansion-panel-spacing:last-child,.mat-accordion>*:last-child:not(.mat-expansion-panel) .mat-expansion-panel-spacing{margin-bottom:0}.mat-action-row{border-top-style:solid;border-top-width:1px;display:flex;flex-direction:row;justify-content:flex-end;padding:16px 8px 16px 24px;border-top-color:var(--mat-expansion-actions-divider-color, var(--mat-sys-outline))}.mat-action-row .mat-button-base,.mat-action-row .mat-mdc-button-base{margin-left:8px}[dir=rtl] .mat-action-row .mat-button-base,[dir=rtl] .mat-action-row .mat-mdc-button-base{margin-left:0;margin-right:8px}\n`],encapsulation:2,changeDetection:0})}return t})();var bY=(()=>{class t{panel=h(y9,{host:!0});_element=h(ge);_focusMonitor=h(Ha);_changeDetectorRef=h(ft);_parentChangeSubscription=Rn.EMPTY;constructor(){h(Hn).load(Za);let A=this.panel,i=h(vY,{optional:!0}),n=h(new bs(\"tabindex\"),{optional:!0}),o=A.accordion?A.accordion._stateChanges.pipe(We(a=>!!(a.hideToggle||a.togglePosition))):xa;this.tabIndex=parseInt(n||\"\")||0,this._parentChangeSubscription=Qi(A.opened,A.closed,o,A._inputChanges.pipe(We(a=>!!(a.hideToggle||a.disabled||a.togglePosition)))).subscribe(()=>this._changeDetectorRef.markForCheck()),A.closed.pipe(We(()=>A._containsFocus())).subscribe(()=>this._focusMonitor.focusVia(this._element,\"program\")),i&&(this.expandedHeight=i.expandedHeight,this.collapsedHeight=i.collapsedHeight)}expandedHeight;collapsedHeight;tabIndex=0;get disabled(){return this.panel.disabled}_toggle(){this.disabled||this.panel.toggle()}_isExpanded(){return this.panel.expanded}_getExpandedState(){return this.panel._getExpandedState()}_getPanelId(){return this.panel.id}_getTogglePosition(){return this.panel.togglePosition}_showToggle(){return!this.panel.hideToggle&&!this.panel.disabled}_getHeaderHeight(){let A=this._isExpanded();return A&&this.expandedHeight?this.expandedHeight:!A&&this.collapsedHeight?this.collapsedHeight:null}_keydown(A){switch(A.keyCode){case 32:case 13:aa(A)||(A.preventDefault(),this._toggle());break;default:this.panel.accordion&&this.panel.accordion._handleHeaderKeydown(A);return}}focus(A,i){A?this._focusMonitor.focusVia(this._element,A,i):this._element.nativeElement.focus(i)}ngAfterViewInit(){this._focusMonitor.monitor(this._element).subscribe(A=>{A&&this.panel.accordion&&this.panel.accordion._handleHeaderFocus(this)})}ngOnDestroy(){this._parentChangeSubscription.unsubscribe(),this._focusMonitor.stopMonitoring(this._element)}static \\u0275fac=function(i){return new(i||t)};static \\u0275cmp=kA({type:t,selectors:[[\"mat-expansion-panel-header\"]],hostAttrs:[\"role\",\"button\",1,\"mat-expansion-panel-header\",\"mat-focus-indicator\"],hostVars:13,hostBindings:function(i,n){i&1&&$(\"click\",function(){return n._toggle()})(\"keydown\",function(a){return n._keydown(a)}),i&2&&(ie(\"id\",n.panel._headerId)(\"tabindex\",n.disabled?-1:n.tabIndex)(\"aria-controls\",n._getPanelId())(\"aria-expanded\",n._isExpanded())(\"aria-disabled\",n.panel.disabled),En(\"height\",n._getHeaderHeight()),ae(\"mat-expanded\",n._isExpanded())(\"mat-expansion-toggle-indicator-after\",n._getTogglePosition()===\"after\")(\"mat-expansion-toggle-indicator-before\",n._getTogglePosition()===\"before\"))},inputs:{expandedHeight:\"expandedHeight\",collapsedHeight:\"collapsedHeight\",tabIndex:[2,\"tabIndex\",\"tabIndex\",A=>A==null?0:Zi(A)]},ngContentSelectors:$0A,decls:5,vars:3,consts:[[1,\"mat-content\"],[1,\"mat-expansion-indicator\"],[\"xmlns\",\"http://www.w3.org/2000/svg\",\"viewBox\",\"0 -960 960 960\",\"aria-hidden\",\"true\",\"focusable\",\"false\"],[\"d\",\"M480-345 240-585l56-56 184 184 184-184 56 56-240 240Z\"]],template:function(i,n){i&1&&(Yt(X0A),ti(0,\"span\",0),He(1),He(2,1),He(3,2),Ii(),V(4,ACA,3,0,\"span\",1)),i&2&&(ae(\"mat-content-hide-toggle\",!n._showToggle()),p(4),W(n._showToggle()?4:-1))},styles:[`.mat-expansion-panel-header{display:flex;flex-direction:row;align-items:center;padding:0 24px;border-radius:inherit}.mat-expansion-panel-animations-enabled .mat-expansion-panel-header{transition:height 225ms cubic-bezier(0.4, 0, 0.2, 1)}.mat-expansion-panel-header::before{border-radius:inherit}.mat-expansion-panel-header{height:var(--mat-expansion-header-collapsed-state-height, 48px);font-family:var(--mat-expansion-header-text-font, var(--mat-sys-title-medium-font));font-size:var(--mat-expansion-header-text-size, var(--mat-sys-title-medium-size));font-weight:var(--mat-expansion-header-text-weight, var(--mat-sys-title-medium-weight));line-height:var(--mat-expansion-header-text-line-height, var(--mat-sys-title-medium-line-height));letter-spacing:var(--mat-expansion-header-text-tracking, var(--mat-sys-title-medium-tracking))}.mat-expansion-panel-header.mat-expanded{height:var(--mat-expansion-header-expanded-state-height, 64px)}.mat-expansion-panel-header[aria-disabled=true]{color:var(--mat-expansion-header-disabled-state-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-expansion-panel-header:not([aria-disabled=true]){cursor:pointer}.mat-expansion-panel:not(.mat-expanded) .mat-expansion-panel-header:not([aria-disabled=true]):hover{background:var(--mat-expansion-header-hover-state-layer-color, color-mix(in srgb, var(--mat-sys-on-surface) calc(var(--mat-sys-hover-state-layer-opacity) * 100%), transparent))}@media(hover: none){.mat-expansion-panel:not(.mat-expanded) .mat-expansion-panel-header:not([aria-disabled=true]):hover{background:var(--mat-expansion-container-background-color, var(--mat-sys-surface))}}.mat-expansion-panel .mat-expansion-panel-header:not([aria-disabled=true]).cdk-keyboard-focused,.mat-expansion-panel .mat-expansion-panel-header:not([aria-disabled=true]).cdk-program-focused{background:var(--mat-expansion-header-focus-state-layer-color, color-mix(in srgb, var(--mat-sys-on-surface) calc(var(--mat-sys-focus-state-layer-opacity) * 100%), transparent))}.mat-expansion-panel-header._mat-animation-noopable{transition:none}.mat-expansion-panel-header:focus,.mat-expansion-panel-header:hover{outline:none}.mat-expansion-panel-header.mat-expanded:focus,.mat-expansion-panel-header.mat-expanded:hover{background:inherit}.mat-expansion-panel-header.mat-expansion-toggle-indicator-before{flex-direction:row-reverse}.mat-expansion-panel-header.mat-expansion-toggle-indicator-before .mat-expansion-indicator{margin:0 16px 0 0}[dir=rtl] .mat-expansion-panel-header.mat-expansion-toggle-indicator-before .mat-expansion-indicator{margin:0 0 0 16px}.mat-content{display:flex;flex:1;flex-direction:row;overflow:hidden}.mat-content.mat-content-hide-toggle{margin-right:8px}[dir=rtl] .mat-content.mat-content-hide-toggle{margin-right:0;margin-left:8px}.mat-expansion-toggle-indicator-before .mat-content.mat-content-hide-toggle{margin-left:24px;margin-right:0}[dir=rtl] .mat-expansion-toggle-indicator-before .mat-content.mat-content-hide-toggle{margin-right:24px;margin-left:0}.mat-expansion-panel-header-title{color:var(--mat-expansion-header-text-color, var(--mat-sys-on-surface))}.mat-expansion-panel-header-title,.mat-expansion-panel-header-description{display:flex;flex-grow:1;flex-basis:0;margin-right:16px;align-items:center}[dir=rtl] .mat-expansion-panel-header-title,[dir=rtl] .mat-expansion-panel-header-description{margin-right:0;margin-left:16px}.mat-expansion-panel-header[aria-disabled=true] .mat-expansion-panel-header-title,.mat-expansion-panel-header[aria-disabled=true] .mat-expansion-panel-header-description{color:inherit}.mat-expansion-panel-header-description{flex-grow:2;color:var(--mat-expansion-header-description-color, var(--mat-sys-on-surface-variant))}.mat-expansion-panel-animations-enabled .mat-expansion-indicator{transition:transform 225ms cubic-bezier(0.4, 0, 0.2, 1)}.mat-expansion-panel-header.mat-expanded .mat-expansion-indicator{transform:rotate(180deg)}.mat-expansion-indicator::after{border-style:solid;border-width:0 2px 2px 0;content:\"\";padding:3px;transform:rotate(45deg);vertical-align:middle;color:var(--mat-expansion-header-indicator-color, var(--mat-sys-on-surface-variant));display:var(--mat-expansion-legacy-header-indicator-display, none)}.mat-expansion-indicator svg{width:24px;height:24px;margin:0 -8px;vertical-align:middle;fill:var(--mat-expansion-header-indicator-color, var(--mat-sys-on-surface-variant));display:var(--mat-expansion-header-indicator-display, inline-block)}@media(forced-colors: active){.mat-expansion-panel-content{border-top:1px solid;border-top-left-radius:0;border-top-right-radius:0}}\n`],encapsulation:2,changeDetection:0})}return t})();var MY=(()=>{class t{static \\u0275fac=function(i){return new(i||t)};static \\u0275dir=OA({type:t,selectors:[[\"mat-panel-title\"]],hostAttrs:[1,\"mat-expansion-panel-header-title\"]})}return t})();var kY=(()=>{class t{static \\u0275fac=function(i){return new(i||t)};static \\u0275mod=Xe({type:t});static \\u0275inj=Ze({imports:[DY,_c,Fi]})}return t})();var tCA={google_search:\"search\",EnterpriseWebSearchTool:\"web\",VertexAiSearchTool:\"search\",FilesRetrieval:\"find_in_page\",load_memory:\"memory\",preload_memory:\"memory\",url_context:\"link\",VertexAiRagRetrieval:\"find_in_page\",exit_loop:\"sync\",get_user_choice:\"how_to_reg\",load_artifacts:\"image\",LongRunningFunctionTool:\"data_object\"};function vB(t,e){return e===\"Agent Tool\"?\"smart_toy\":e===\"Built-in tool\"?tCA[t]||\"build\":e===\"Function tool\"?\"data_object\":\"build\"}var Hl=class t{static toolMenuTooltips=new Map([[\"Function tool\",\"Build custom tools for your specific ADK agent needs.\"],[\"Built-in tool\",\"Ready-to-use functionality such as Google Search or code executors that provide agents with common capabilities. \"],[\"Agent tool\",\"A sub-agent that can be invoked as a tool by another agent.\"]]);static toolDetailedInfo=new Map([[\"Function tool\",{shortDescription:\"Build custom tools for your specific ADK agent needs.\",detailedDescription:\"The ADK framework automatically inspects your Python function's signature\\u2014including its name, docstring, parameters, type hints, and default values\\u2014to generate a schema. This schema is what the LLM uses to understand the tool's purpose, when to use it, and what arguments it requires.\",docLink:\"https://google.github.io/adk-docs/tools/function-tools/\"}],[\"Agent tool\",{shortDescription:\"Wraps a sub-agent as a callable tool, enabling modular and hierarchical agent architectures.\",detailedDescription:\"Agent tools allow you to use one agent as a tool within another agent, creating powerful multi-agent workflows.\",docLink:\"https://google.github.io/adk-docs/agents/multi-agents/#c-explicit-invocation-agenttool\"}]]);static callbackMenuTooltips=new Map([[\"before_agent\",\"Called immediately before the agent's _run_async_impl (or _run_live_impl) method is executed.\"],[\"after_agent\",\"Called immediately after the agent's _run_async_impl (or _run_live_impl) method successfully completes.\"],[\"before_model\",\"Called just before the generate_content_async (or equivalent) request is sent to the LLM within an LlmAgent's flow.\"],[\"after_model\",\"Called just after a response (LlmResponse) is received from the LLM, before it's processed further by the invoking agent.\"],[\"before_tool\",\"Called just before a specific tool's run_async method is invoked, after the LLM has generated a function call for it.\"],[\"after_tool\",\"Called just after the tool's run_async method completes successfully.\"]]);static callbackDialogTooltips=new Map([[\"before_agent\",\"Called immediately before the agent's _run_async_impl (or _run_live_impl) method is executed.\"],[\"after_agent\",\"Called immediately after the agent's _run_async_impl (or _run_live_impl) method successfully completes.\"],[\"before_model\",\"Called just before the generate_content_async (or equivalent) request is sent to the LLM within an LlmAgent's flow.\"],[\"after_model\",\"Called just after a response (LlmResponse) is received from the LLM, before it's processed further by the invoking agent.\"],[\"before_tool\",\"Called just before a specific tool's run_async method is invoked, after the LLM has generated a function call for it.\"],[\"after_tool\",\"Called just after the tool's run_async method completes successfully.\"]]);static callbackDetailedInfo=new Map([[\"before_agent\",{shortDescription:\"Called immediately before the agent's _run_async_impl (or _run_live_impl) method is executed.  It runs after the agent's InvocationContext is created but before its core logic begins.\",detailedDescription:\" Ideal for setting up resources or state needed only for this specific agent's run, performing validation checks on the session state (callback_context.state) before execution starts, logging the entry point of the agent's activity, or potentially modifying the invocation context before the core logic uses it.\",docLink:\"https://google.github.io/adk-docs/callbacks/types-of-callbacks/#before-agent-callback\"}],[\"after_agent\",{shortDescription:\"Called immediately after the agent's _run_async_impl (or _run_live_impl) method successfully completes.\",detailedDescription:\"Useful for cleanup tasks, post-execution validation, logging the completion of an agent's activity, modifying final state, or augmenting/replacing the agent's final output.\",docLink:\"https://google.github.io/adk-docs/callbacks/types-of-callbacks/#after-agent-callback\"}],[\"before_model\",{shortDescription:\"Called just before the generate_content_async (or equivalent) request is sent to the LLM within an LlmAgent's flow.\",detailedDescription:\"Allows inspection and modification of the request going to the LLM. Use cases include adding dynamic instructions, injecting few-shot examples based on state, modifying model config, implementing guardrails (like profanity filters), or implementing request-level caching.\",docLink:\"https://google.github.io/adk-docs/callbacks/types-of-callbacks/#before-model-callback\"}],[\"after_model\",{shortDescription:\"Called just after a response (LlmResponse) is received from the LLM, before it's processed further by the invoking agent.\",detailedDescription:\"Allows inspection or modification of the raw LLM response.\",docLink:\"https://google.github.io/adk-docs/callbacks/types-of-callbacks/#after-model-callback\"}],[\"before_tool\",{shortDescription:\"Called just before a specific tool's run_async method is invoked, after the LLM has generated a function call for it.\",detailedDescription:\"Allows inspection and modification of tool arguments, performing authorization checks before execution, logging tool usage attempts, or implementing tool-level caching.\",docLink:\"https://google.github.io/adk-docs/callbacks/types-of-callbacks/#before-tool-callback\"}],[\"after_tool\",{shortDescription:\"Called just after the tool's run_async method completes successfully.\",detailedDescription:\"Allows inspection and modification of the tool's result before it's sent back to the LLM (potentially after summarization). Useful for logging tool results, post-processing or formatting results, or saving specific parts of the result to the session state.\",docLink:\"https://google.github.io/adk-docs/callbacks/types-of-callbacks/#after-tool-callback\"}]]);static getToolMenuTooltips(e){return t.toolMenuTooltips.get(e)}static getToolDetailedInfo(e){return t.toolDetailedInfo.get(e)}static getCallbackMenuTooltips(e){return t.callbackMenuTooltips.get(e)}static getCallbackDialogTooltips(e){return t.callbackDialogTooltips.get(e)}static getCallbackDetailedInfo(e){return t.callbackDetailedInfo.get(e)}};var iCA=[\"callbackNameInput\"];function nCA(t,e){if(t&1){let A=zA();ws(0),m(1,\"div\",8)(2,\"div\",9),$(\"click\",function(){rA(A);let n=y();return sA(n.toggleCallbackInfo())}),m(3,\"mat-icon\",10),K(4,\"info\"),D(),m(5,\"div\",11)(6,\"span\"),K(7,\"Callback Information\"),D()(),m(8,\"button\",12)(9,\"mat-icon\"),K(10),D()()(),m(11,\"div\",13)(12,\"div\",14)(13,\"div\",15),K(14),D(),m(15,\"div\",16),K(16),D()(),m(17,\"div\",17)(18,\"a\",18)(19,\"mat-icon\"),K(20,\"open_in_new\"),D(),m(21,\"span\"),K(22,\"View Official Documentation\"),D()()()()(),ys()}if(t&2){let A,i,n,o=y();p(10),qA(o.isCallbackInfoExpanded?\"expand_less\":\"expand_more\"),p(),ae(\"expanded\",o.isCallbackInfoExpanded),p(3),qA((A=o.getCallbackInfo())==null?null:A.shortDescription),p(2),qA((i=o.getCallbackInfo())==null?null:i.detailedDescription),p(2),X(\"href\",(n=o.getCallbackInfo())==null?null:n.docLink,Da)}}function oCA(t,e){if(t&1&&(m(0,\"mat-option\",21),K(1),D()),t&2){let A=e.$implicit;X(\"value\",A),p(),qA(A)}}function aCA(t,e){if(t&1){let A=zA();ws(0),m(1,\"mat-form-field\",3)(2,\"mat-label\"),K(3,\"Callback Type\"),D(),m(4,\"mat-select\",19),ao(\"ngModelChange\",function(n){rA(A);let o=y();return Vn(o.callbackType,n)||(o.callbackType=n),sA(n)}),yt(5,oCA,2,2,\"mat-option\",20),D()(),ys()}if(t&2){let A=y();p(4),oo(\"ngModel\",A.callbackType),p(),X(\"ngForOf\",A.availableCallbackTypes)}}function rCA(t,e){t&1&&(m(0,\"mat-error\"),K(1,\"Same callback name has been used\"),D())}function sCA(t,e){t&1&&(m(0,\"mat-error\"),K(1,\"Cannot have callback consist of two words\"),D())}function gCA(t,e){t&1&&(m(0,\"mat-error\"),K(1,\"Callback function names cannot have spaces\"),D())}var v9=class{isErrorState(e){return!!(e&&e.invalid)}},k4=class t{constructor(e,A){this.dialogRef=e;this.data=A;this.callbackType=A?.callbackType??\"\",this.existingCallbackNames=A?.existingCallbackNames??[],this.isEditMode=!!A?.isEditMode,this.availableCallbackTypes=A?.availableCallbackTypes??[],this.isEditMode&&A?.callback&&(this.callbackName=A.callback.name,this.callbackType=A.callback.type,this.originalCallbackName=A.callback.name,this.existingCallbackNames=this.existingCallbackNames.filter(i=>i!==this.originalCallbackName))}callbackNameInput;callbackName=\"\";callbackType=\"\";existingCallbackNames=[];matcher=new v9;isEditMode=!1;availableCallbackTypes=[];originalCallbackName=\"\";isCallbackInfoExpanded=!1;addCallback(){if(!this.callbackName.trim()||this.hasSpaces()||this.isDuplicateName())return;let e={name:this.callbackName.trim(),type:this.callbackType,isEditMode:this.isEditMode,originalName:this.originalCallbackName||this.callbackName.trim()};this.dialogRef.close(e)}cancel(){this.dialogRef.close()}isDuplicateName(){if(!Array.isArray(this.existingCallbackNames))return!1;let e=(this.callbackName||\"\").trim();return this.existingCallbackNames.includes(e)}hasSpaces(){return/\\s/.test(this.callbackName||\"\")}createDisabled(){return!this.callbackName.trim()||this.isDuplicateName()||this.hasSpaces()}validate(){this.hasSpaces()?this.callbackNameInput.control.setErrors({hasSpaces:!0}):this.isDuplicateName()?this.callbackNameInput.control.setErrors({duplicateName:!0}):this.callbackNameInput.control.setErrors(null)}getCallbackInfo(){return Hl.getCallbackDetailedInfo(this.callbackType)}toggleCallbackInfo(){this.isCallbackInfoExpanded=!this.isCallbackInfoExpanded}static \\u0275fac=function(A){return new(A||t)(lt(Fo),lt(da))};static \\u0275cmp=kA({type:t,selectors:[[\"app-add-callback-dialog\"]],viewQuery:function(A,i){if(A&1&&ni(iCA,5),A&2){let n;Ce(n=Ie())&&(i.callbackNameInput=n.first)}},decls:18,vars:10,consts:[[\"callbackNameInput\",\"ngModel\"],[\"mat-dialog-title\",\"\"],[4,\"ngIf\"],[2,\"width\",\"100%\"],[\"matInput\",\"\",3,\"ngModelChange\",\"keydown.enter\",\"ngModel\",\"errorStateMatcher\"],[\"align\",\"end\"],[\"mat-button\",\"\",3,\"click\"],[\"mat-raised-button\",\"\",\"color\",\"secondary\",3,\"click\",\"disabled\"],[1,\"callback-info-container\"],[1,\"callback-info-header\",3,\"click\"],[1,\"callback-info-icon\"],[1,\"callback-info-title\"],[\"mat-icon-button\",\"\",\"type\",\"button\",\"aria-label\",\"Toggle callback information\",1,\"callback-info-toggle\"],[1,\"callback-info-body\"],[1,\"callback-info-content\"],[1,\"callback-info-short\"],[1,\"callback-info-detailed\"],[1,\"callback-info-link-container\"],[\"target\",\"_blank\",\"rel\",\"noopener noreferrer\",1,\"callback-info-link\",3,\"href\"],[3,\"ngModelChange\",\"ngModel\"],[3,\"value\",4,\"ngFor\",\"ngForOf\"],[3,\"value\"]],template:function(A,i){if(A&1){let n=zA();m(0,\"h2\",1),K(1),D(),m(2,\"mat-dialog-content\"),yt(3,nCA,23,6,\"ng-container\",2)(4,aCA,6,2,\"ng-container\",2),m(5,\"mat-form-field\",3)(6,\"mat-label\"),K(7,\"Callback Name\"),D(),m(8,\"input\",4,0),ao(\"ngModelChange\",function(a){return rA(n),Vn(i.callbackName,a)||(i.callbackName=a),sA(a)}),$(\"ngModelChange\",function(){return i.validate()})(\"keydown.enter\",function(){return i.addCallback()}),D(),yt(10,rCA,2,0,\"mat-error\",2)(11,sCA,2,0,\"mat-error\",2)(12,gCA,2,0,\"mat-error\",2),D()(),m(13,\"mat-dialog-actions\",5)(14,\"button\",6),$(\"click\",function(){return i.cancel()}),K(15,\"Cancel\"),D(),m(16,\"button\",7),$(\"click\",function(){return i.addCallback()}),K(17),D()()}if(A&2){let n=Wi(9);p(),qA(i.isEditMode?\"Edit Callback\":\"Add \"+i.callbackType+\" Callback\"),p(2),X(\"ngIf\",i.getCallbackInfo()),p(),X(\"ngIf\",i.isEditMode),p(4),oo(\"ngModel\",i.callbackName),X(\"errorStateMatcher\",i.matcher),p(2),X(\"ngIf\",n.hasError(\"duplicateName\")),p(),X(\"ngIf\",n.hasError(\"hasSpaces\")),p(),X(\"ngIf\",n.hasError(\"hasSpaces\")),p(4),X(\"disabled\",i.createDisabled()),p(),Fe(\" \",i.isEditMode?\"Save\":\"Add\",\" \")}},dependencies:[oa,md,yc,yn,ro,so,Ca,cJ,ya,Ta,gr,Cs,vn,Ia,vr,To,pl,t7,Fg,wa,Ub,Yg,Mr,Ug,In],styles:[\".callback-form[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:16px;min-width:400px;max-width:600px}.full-width[_ngcontent-%COMP%]{width:100%}mat-dialog-content[_ngcontent-%COMP%]{padding:20px 24px;display:flex;flex-direction:column;gap:16px}mat-dialog-actions[_ngcontent-%COMP%]{padding:16px 24px;margin:0}mat-form-field[_ngcontent-%COMP%]{margin-top:8px!important}.mat-mdc-raised-button.mat-secondary[_ngcontent-%COMP%]:not([disabled]){background-color:#8ab4f8}.callback-info-container[_ngcontent-%COMP%]{background-color:#8ab4f814;border:1px solid rgba(138,180,248,.2);border-radius:8px;padding:16px;margin-bottom:16px}.callback-info-header[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;cursor:pointer;-webkit-user-select:none;user-select:none;padding:4px 0}.callback-info-header[_ngcontent-%COMP%]:hover   .callback-info-title[_ngcontent-%COMP%]{color:#a7c8ff}.callback-info-icon[_ngcontent-%COMP%]{color:#8ab4f8;font-size:20px;width:20px;height:20px;flex-shrink:0}.callback-info-title[_ngcontent-%COMP%]{flex:1;font-weight:500;color:#8ab4f8;font-size:14px;transition:color .2s ease}.callback-info-toggle[_ngcontent-%COMP%]{color:#8ab4f8;margin:-8px}.callback-info-toggle[_ngcontent-%COMP%]   mat-icon[_ngcontent-%COMP%]{transition:transform .2s ease}.callback-info-body[_ngcontent-%COMP%]{max-height:0;overflow:hidden;opacity:0;transition:max-height .3s ease,opacity .2s ease,margin-top .3s ease}.callback-info-body.expanded[_ngcontent-%COMP%]{max-height:500px;opacity:1;margin-top:12px}.callback-info-content[_ngcontent-%COMP%]{flex:1}.callback-info-short[_ngcontent-%COMP%]{font-weight:500;color:var(--mat-dialog-content-text-color);margin-bottom:8px;line-height:1.4}.callback-info-detailed[_ngcontent-%COMP%]{color:var(--mat-dialog-content-text-color);font-size:14px;line-height:1.5;opacity:.8}.callback-info-link-container[_ngcontent-%COMP%]{margin-top:12px}.callback-info-link[_ngcontent-%COMP%]{color:#8ab4f8;text-decoration:none;font-size:14px;display:inline-flex;align-items:center;gap:4px;transition:color .2s ease}.callback-info-link[_ngcontent-%COMP%]:hover{color:#a7c8ff}.callback-info-link[_ngcontent-%COMP%]   mat-icon[_ngcontent-%COMP%]{font-size:16px;width:16px;height:16px}\"]})};function lCA(t,e){if(t&1){let A=zA();ws(0),m(1,\"div\",6)(2,\"div\",7),$(\"click\",function(){rA(A);let n=y();return sA(n.toggleToolInfo())}),m(3,\"mat-icon\",8),K(4,\"info\"),D(),m(5,\"div\",9)(6,\"span\"),K(7,\"Tool Information\"),D()(),m(8,\"button\",10)(9,\"mat-icon\"),K(10),D()()(),m(11,\"div\",11)(12,\"div\",12)(13,\"div\",13),K(14),D(),m(15,\"div\",14),K(16),D()(),m(17,\"div\",15)(18,\"a\",16)(19,\"mat-icon\"),K(20,\"open_in_new\"),D(),m(21,\"span\"),K(22,\"View Official Documentation\"),D()()()()(),ys()}if(t&2){let A,i,n,o=y();p(10),qA(o.isToolInfoExpanded?\"expand_less\":\"expand_more\"),p(),ae(\"expanded\",o.isToolInfoExpanded),p(3),qA((A=o.getToolInfo())==null?null:A.shortDescription),p(2),qA((i=o.getToolInfo())==null?null:i.detailedDescription),p(2),X(\"href\",(n=o.getToolInfo())==null?null:n.docLink,Da)}}function cCA(t,e){if(t&1){let A=zA();m(0,\"mat-form-field\",2)(1,\"input\",17),ao(\"ngModelChange\",function(n){rA(A);let o=y();return Vn(o.toolName,n)||(o.toolName=n),sA(n)}),$(\"keydown.enter\",function(){rA(A);let n=y();return sA(n.addTool())}),D()()}if(t&2){let A=y();p(),oo(\"ngModel\",A.toolName)}}function CCA(t,e){if(t&1&&(m(0,\"mat-option\",20),K(1),D()),t&2){let A=e.$implicit;X(\"value\",A),p(),Fe(\" \",A,\" \")}}function ICA(t,e){if(t&1){let A=zA();m(0,\"mat-form-field\",2)(1,\"mat-select\",18),ao(\"ngModelChange\",function(n){rA(A);let o=y();return Vn(o.selectedBuiltInTool,n)||(o.selectedBuiltInTool=n),sA(n)}),yt(2,CCA,2,2,\"mat-option\",19),D()()}if(t&2){let A=y();p(),oo(\"ngModel\",A.selectedBuiltInTool),p(),X(\"ngForOf\",A.builtInTools)}}var r2=class t{constructor(e,A){this.data=e;this.dialogRef=A}toolName=\"\";toolType=\"Function tool\";selectedBuiltInTool=\"google_search\";builtInTools=[\"EnterpriseWebSearchTool\",\"exit_loop\",\"FilesRetrieval\",\"get_user_choice\",\"google_search\",\"load_artifacts\",\"load_memory\",\"LongRunningFunctionTool\",\"preload_memory\",\"url_context\",\"VertexAiRagRetrieval\",\"VertexAiSearchTool\"];isEditMode=!1;isToolInfoExpanded=!1;ngOnInit(){this.toolType=this.data.toolType,this.isEditMode=this.data.isEditMode||!1,this.isEditMode&&this.data.toolName&&(this.toolType===\"Function tool\"?this.toolName=this.data.toolName:this.toolType===\"Built-in tool\"&&(this.selectedBuiltInTool=this.data.toolName))}addTool(){if(this.toolType===\"Function tool\"&&!this.toolName.trim())return;let e={toolType:this.toolType,isEditMode:this.isEditMode};this.toolType===\"Function tool\"?e.name=this.toolName.trim():this.toolType===\"Built-in tool\"&&(e.name=this.selectedBuiltInTool),this.dialogRef.close(e)}cancel(){this.dialogRef.close()}createDisabled(){return this.toolType===\"Function tool\"&&!this.toolName.trim()}getToolInfo(){return Hl.getToolDetailedInfo(this.toolType)}toggleToolInfo(){this.isToolInfoExpanded=!this.isToolInfoExpanded}static \\u0275fac=function(A){return new(A||t)(lt(da),lt(Fo))};static \\u0275cmp=kA({type:t,selectors:[[\"app-add-tool-dialog\"]],decls:11,vars:6,consts:[[\"mat-dialog-title\",\"\",1,\"dialog-title\"],[4,\"ngIf\"],[2,\"width\",\"100%\"],[\"align\",\"end\"],[\"mat-button\",\"\",3,\"click\"],[\"mat-button\",\"\",\"cdkFocusInitial\",\"\",3,\"click\",\"disabled\"],[1,\"tool-info-container\"],[1,\"tool-info-header\",3,\"click\"],[1,\"tool-info-icon\"],[1,\"tool-info-title\"],[\"mat-icon-button\",\"\",\"type\",\"button\",\"aria-label\",\"Toggle tool information\",1,\"tool-info-toggle\"],[1,\"tool-info-body\"],[1,\"tool-info-content\"],[1,\"tool-info-short\"],[1,\"tool-info-detailed\"],[1,\"tool-info-link-container\"],[\"target\",\"_blank\",\"rel\",\"noopener noreferrer\",1,\"tool-info-link\",3,\"href\"],[\"matInput\",\"\",\"placeholder\",\"Enter full function name\",3,\"ngModelChange\",\"keydown.enter\",\"ngModel\"],[\"placeholder\",\"Select built-in tool\",3,\"ngModelChange\",\"ngModel\"],[3,\"value\",4,\"ngFor\",\"ngForOf\"],[3,\"value\"]],template:function(A,i){A&1&&(m(0,\"h2\",0),K(1),D(),m(2,\"mat-dialog-content\"),yt(3,lCA,23,6,\"ng-container\",1),V(4,cCA,2,1,\"mat-form-field\",2),V(5,ICA,3,2,\"mat-form-field\",2),D(),m(6,\"mat-dialog-actions\",3)(7,\"button\",4),$(\"click\",function(){return i.cancel()}),K(8,\"Cancel\"),D(),m(9,\"button\",5),$(\"click\",function(){return i.addTool()}),K(10),D()()),A&2&&(p(),qA(i.isEditMode?\"Editing Tool\":\"Add New Tool\"),p(2),X(\"ngIf\",i.getToolInfo()),p(),W(i.toolType===\"Function tool\"?4:-1),p(),W(i.toolType===\"Built-in tool\"?5:-1),p(4),X(\"disabled\",i.createDisabled()),p(),Fe(\" \",i.isEditMode?\"Save\":\"Create\",\" \"))},dependencies:[oa,md,yc,yn,ro,so,Ca,ya,gr,To,wa,Yg,Mr,Ta,vn,Ia,In],styles:[\".dialog-title[_ngcontent-%COMP%]{color:var(--mdc-dialog-supporting-text-color)!important;font-family:Google Sans;font-size:24px}mat-dialog-content[_ngcontent-%COMP%]{padding:20px 24px;display:flex;flex-direction:column;gap:16px}.tool-info-container[_ngcontent-%COMP%]{background-color:#8ab4f814;border:1px solid rgba(138,180,248,.2);border-radius:8px;padding:16px;margin-bottom:16px}.tool-info-header[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;cursor:pointer;-webkit-user-select:none;user-select:none;padding:4px 0}.tool-info-header[_ngcontent-%COMP%]:hover   .tool-info-title[_ngcontent-%COMP%]{color:#a7c8ff}.tool-info-icon[_ngcontent-%COMP%]{color:#8ab4f8;font-size:20px;width:20px;height:20px;flex-shrink:0}.tool-info-title[_ngcontent-%COMP%]{flex:1;font-weight:500;color:#8ab4f8;font-size:14px;transition:color .2s ease}.tool-info-toggle[_ngcontent-%COMP%]{color:#8ab4f8;margin:-8px}.tool-info-toggle[_ngcontent-%COMP%]   mat-icon[_ngcontent-%COMP%]{transition:transform .2s ease}.tool-info-body[_ngcontent-%COMP%]{max-height:0;overflow:hidden;opacity:0;transition:max-height .3s ease,opacity .2s ease,margin-top .3s ease}.tool-info-body.expanded[_ngcontent-%COMP%]{max-height:500px;opacity:1;margin-top:12px}.tool-info-content[_ngcontent-%COMP%]{flex:1}.tool-info-short[_ngcontent-%COMP%]{font-weight:500;color:#e3e3e3;margin-bottom:8px;line-height:1.4}.tool-info-detailed[_ngcontent-%COMP%]{color:#c4c7ca;font-size:14px;line-height:1.5}.tool-info-link-container[_ngcontent-%COMP%]{margin-top:12px}.tool-info-link[_ngcontent-%COMP%]{color:#8ab4f8;text-decoration:none;font-size:14px;display:inline-flex;align-items:center;gap:4px;transition:color .2s ease}.tool-info-link[_ngcontent-%COMP%]:hover{color:#a7c8ff}.tool-info-link[_ngcontent-%COMP%]   mat-icon[_ngcontent-%COMP%]{font-size:16px;width:16px;height:16px}\"]})};function Lo(t){return Array.isArray(t)}function Oo(t){return t!==null&&typeof t==\"object\"&&(t.constructor===void 0||t.constructor.name===\"Object\")}function b9(t){return t&&typeof t==\"object\"?t.op===\"add\":!1}function M9(t){return t&&typeof t==\"object\"?t.op===\"remove\":!1}function m6(t){return t&&typeof t==\"object\"?t.op===\"replace\":!1}function p6(t){return t&&typeof t==\"object\"?t.op===\"copy\":!1}function s2(t){return t&&typeof t==\"object\"?t.op===\"move\":!1}function SY(t,e){return JSON.stringify(t)===JSON.stringify(e)}function dCA(t,e){return t===e}function k9(t){return t.slice(0,t.length-1)}function xY(t){return t[t.length-1]}function RY(t,e){let A=arguments.length>2&&arguments[2]!==void 0?arguments[2]:dCA;if(t.length<e.length)return!1;for(let i=0;i<e.length;i++)if(!A(t[i],e[i]))return!1;return!0}function S9(t){return typeof t==\"object\"&&t!==null}function x9(t){if(Lo(t)){let e=t.slice();return Object.getOwnPropertySymbols(t).forEach(A=>{e[A]=t[A]}),e}if(Oo(t)){let e=BA({},t);return Object.getOwnPropertySymbols(t).forEach(A=>{e[A]=t[A]}),e}return t}function R9(t,e,A){if(t[e]===A)return t;let i=x9(t);return i[e]=A,i}function Pe(t,e){let A=t,i=0;for(;i<e.length;)Oo(A)?A=A[e[i]]:Lo(A)?A=A[Number.parseInt(e[i])]:A=void 0,i++;return A}function Sr(t,e,A){let i=arguments.length>3&&arguments[3]!==void 0?arguments[3]:!1;if(e.length===0)return A;let n=e[0],o=Sr(t?t[n]:void 0,e.slice(1),A,i);if(Oo(t)||Lo(t))return R9(t,n,o);if(i){let a=BCA.test(n)?[]:{};return a[n]=o,a}throw new Error(\"Path does not exist\")}var BCA=/^\\d+$/;function S4(t,e,A){if(e.length===0)return A(t);if(!S9(t))throw new Error(\"Path doesn't exist\");let i=e[0],n=S4(t[i],e.slice(1),A);return R9(t,i,n)}function n1(t,e){if(e.length===0)return t;if(!S9(t))throw new Error(\"Path does not exist\");if(e.length===1){let n=e[0];if(!(n in t))return t;let o=x9(t);return Lo(o)&&o.splice(Number.parseInt(n),1),Oo(o)&&delete o[n],o}let A=e[0],i=n1(t[A],e.slice(1));return R9(t,A,i)}function x4(t,e,A){let i=e.slice(0,e.length-1),n=e[e.length-1];return S4(t,i,o=>{if(!Array.isArray(o))throw new TypeError(`Array expected at path ${JSON.stringify(i)}`);let a=x9(o);return a.splice(Number.parseInt(n),0,A),a})}function cr(t,e){return t===void 0?!1:e.length===0?!0:t===null?!1:cr(t[e[0]],e.slice(1))}function As(t){let e=t.split(\"/\");return e.shift(),e.map(A=>A.replace(/~1/g,\"/\").replace(/~0/g,\"~\"))}function pt(t){return t.map(NY).join(\"\")}function NY(t){return`/${String(t).replace(/~/g,\"~0\").replace(/\\//g,\"~1\")}`}function R4(t,e){return t+NY(e)}function Js(t,e,A){let i=t;for(let n=0;n<e.length;n++){DCA(e[n]);let o=e[n];if(A?.before){let s=A.before(i,o);if(s!==void 0){if(s.document!==void 0&&(i=s.document),s.json!==void 0)throw new Error('Deprecation warning: returned object property \".json\" has been renamed to \".document\"');s.operation!==void 0&&(o=s.operation)}}let a=i,r=Ys(i,o.path);if(o.op===\"add\")i=hCA(i,r,o.value);else if(o.op===\"remove\")i=ECA(i,r);else if(o.op===\"replace\")i=QCA(i,r,o.value);else if(o.op===\"copy\")i=uCA(i,r,N4(o.from));else if(o.op===\"move\")i=fCA(i,r,N4(o.from));else if(o.op===\"test\")mCA(i,r,o.value);else throw new Error(`Unknown JSONPatch operation ${JSON.stringify(o)}`);if(A?.after){let s=A.after(i,o,a);s!==void 0&&(i=s)}}return i}function QCA(t,e,A){return cr(t,e)?Sr(t,e,A):t}function ECA(t,e){return n1(t,e)}function hCA(t,e,A){return bB(t,e)?x4(t,e,A):Sr(t,e,A)}function uCA(t,e,A){let i=Pe(t,A);return bB(t,e)?x4(t,e,i):Sr(t,e,i)}function fCA(t,e,A){let i=Pe(t,A),n=n1(t,A);return bB(n,e)?x4(n,e,i):Sr(n,e,i)}function mCA(t,e,A){if(A===void 0)throw new Error(`Test failed: no value provided (path: \"${pt(e)}\")`);if(!cr(t,e))throw new Error(`Test failed: path not found (path: \"${pt(e)}\")`);let i=Pe(t,e);if(!SY(i,A))throw new Error(`Test failed, value differs (path: \"${pt(e)}\")`)}function bB(t,e){if(e.length===0)return!1;let A=Pe(t,k9(e));return Array.isArray(A)}function pCA(t,e){if(xY(e)!==\"-\")return e;let A=k9(e),i=Pe(t,A);return A.concat(i.length)}function DCA(t){if(![\"add\",\"remove\",\"replace\",\"copy\",\"move\",\"test\"].includes(t.op))throw new Error(`Unknown JSONPatch op ${JSON.stringify(t.op)}`);if(typeof t.path!=\"string\")throw new Error(`Required property \"path\" missing or not a string in operation ${JSON.stringify(t)}`);if((t.op===\"copy\"||t.op===\"move\")&&typeof t.from!=\"string\")throw new Error(`Required property \"from\" missing or not a string in operation ${JSON.stringify(t)}`)}function Ys(t,e){return pCA(t,As(e))}function N4(t){return As(t)}function D6(t,e,A){let i=[];return Js(t,e,{before:(o,a)=>{let r,s=Ys(o,a.path);if(a.op===\"add\")r=_Y(o,s);else if(a.op===\"remove\")r=LY(o,s);else if(a.op===\"replace\")r=FY(o,s);else if(a.op===\"copy\")r=wCA(o,s);else if(a.op===\"move\")r=yCA(o,s,N4(a.from));else if(a.op===\"test\")r=[];else throw new Error(`Unknown JSONPatch operation ${JSON.stringify(a)}`);let g;if(A?.before){let l=A.before(o,a,r);if(l?.revertOperations&&(r=l.revertOperations),l?.document&&(g=l.document),l?.json)throw new Error('Deprecation warning: returned object property \".json\" has been renamed to \".document\"')}if(i=r.concat(i),g!==void 0)return{document:g}}}),i}function FY(t,e){return cr(t,e)?[{op:\"replace\",path:pt(e),value:Pe(t,e)}]:[]}function LY(t,e){return[{op:\"add\",path:pt(e),value:Pe(t,e)}]}function _Y(t,e){return bB(t,e)||!cr(t,e)?[{op:\"remove\",path:pt(e)}]:FY(t,e)}function wCA(t,e){return _Y(t,e)}function yCA(t,e,A){if(e.length<A.length&&RY(A,e))return[{op:\"replace\",path:pt(e),value:t}];let i={op:\"move\",from:pt(e),path:pt(A)};return!bB(t,e)&&cr(t,e)?[i,...LY(t,e)]:[i]}var _R=rf(KY(),1);var Y0=class extends Error{constructor(e,A){super(`${e} at position ${A}`),this.position=A}};function UY(t){return/^[0-9A-Fa-f]$/.test(t)}function l2(t){return t>=\"0\"&&t<=\"9\"}function JY(t){return t>=\" \"}function F4(t){return`,:[]/{}()\n+`.includes(t)}function L9(t){return t>=\"a\"&&t<=\"z\"||t>=\"A\"&&t<=\"Z\"||t===\"_\"||t===\"$\"}function _9(t){return t>=\"a\"&&t<=\"z\"||t>=\"A\"&&t<=\"Z\"||t===\"_\"||t===\"$\"||t>=\"0\"&&t<=\"9\"}var G9=/^(http|https|ftp|mailto|file|data|irc):\\/\\/$/,K9=/^[A-Za-z0-9-._~:/?#@!$&'()*+;=]$/;function U9(t){return`,[]/{}\n+`.includes(t)}function J9(t){return L4(t)||_CA.test(t)}var _CA=/^[[{\\w-]$/;function YY(t){return t===`\n`||t===\"\\r\"||t===\"\t\"||t===\"\\b\"||t===\"\\f\"}function g2(t,e){let A=t.charCodeAt(e);return A===32||A===10||A===9||A===13}function HY(t,e){let A=t.charCodeAt(e);return A===32||A===9||A===13}function TY(t,e){let A=t.charCodeAt(e);return A===160||A===6158||A>=8192&&A<=8203||A===8239||A===8287||A===12288||A===65279}function L4(t){return Y9(t)||v6(t)}function Y9(t){return t==='\"'||t===\"\\u201C\"||t===\"\\u201D\"}function H9(t){return t==='\"'}function v6(t){return t===\"'\"||t===\"\\u2018\"||t===\"\\u2019\"||t===\"`\"||t===\"\\xB4\"}function T9(t){return t===\"'\"}function MB(t,e){let A=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!1,i=t.lastIndexOf(e);return i!==-1?t.substring(0,i)+(A?\"\":t.substring(i+1)):t}function Pg(t,e){let A=t.length;if(!g2(t,A-1))return t+e;for(;g2(t,A-1);)A--;return t.substring(0,A)+e+t.substring(A)}function OY(t,e,A){return t.substring(0,e)+t.substring(e+A)}function zY(t){return/[,\\n][ \\t\\r]*$/.test(t)}var GCA={\"\\b\":\"\\\\b\",\"\\f\":\"\\\\f\",\"\\n\":\"\\\\n\",\"\\r\":\"\\\\r\",\"\t\":\"\\\\t\"},KCA={'\"':'\"',\"\\\\\":\"\\\\\",\"/\":\"/\",b:\"\\b\",f:\"\\f\",n:`\n`,r:\"\\r\",t:\"\t\"};function jg(t){let e=0,A=\"\";g([\"```\",\"[```\",\"{```\"]),o()||P(),g([\"```\",\"```]\",\"```}\"]);let n=C(\",\");for(n&&a(),J9(t[e])&&zY(A)?(n||(A=Pg(A,\",\")),f()):n&&(A=MB(A,\",\"));t[e]===\"}\"||t[e]===\"]\";)e++,a();if(e>=t.length)return A;yA();function o(){a();let iA=Q()||E()||b()||M()||v()||G(!1)||U();return a(),iA}function a(){let iA=arguments.length>0&&arguments[0]!==void 0?arguments[0]:!0,aA=e,hA=r(iA);do hA=s(),hA&&(hA=r(iA));while(hA);return e>aA}function r(iA){let aA=iA?g2:HY,hA=\"\";for(;;)if(aA(t,e))hA+=t[e],e++;else if(TY(t,e))hA+=\" \",e++;else break;return hA.length>0?(A+=hA,!0):!1}function s(){if(t[e]===\"/\"&&t[e+1]===\"*\"){for(;e<t.length&&!UCA(t,e);)e++;return e+=2,!0}if(t[e]===\"/\"&&t[e+1]===\"/\"){for(;e<t.length&&t[e]!==`\n`;)e++;return!0}return!1}function g(iA){if(l(iA)){if(L9(t[e]))for(;e<t.length&&_9(t[e]);)e++;return a(),!0}return!1}function l(iA){r(!0);for(let aA of iA){let hA=e+aA.length;if(t.slice(e,hA)===aA)return e=hA,!0}return!1}function C(iA){return t[e]===iA?(A+=t[e],e++,!0):!1}function I(iA){return t[e]===iA?(e++,!0):!1}function d(){return I(\"\\\\\")}function B(){return a(),t[e]===\".\"&&t[e+1]===\".\"&&t[e+2]===\".\"?(e+=3,a(),I(\",\"),!0):!1}function Q(){if(t[e]===\"{\"){A+=\"{\",e++,a(),I(\",\")&&a();let iA=!0;for(;e<t.length&&t[e]!==\"}\";){let aA;if(iA?(aA=!0,iA=!1):(aA=C(\",\"),aA||(A=Pg(A,\",\")),a()),B(),!(b()||G(!0))){t[e]===\"}\"||t[e]===\"{\"||t[e]===\"]\"||t[e]===\"[\"||t[e]===void 0?A=MB(A,\",\"):nA();break}a();let JA=C(\":\"),ee=e>=t.length;JA||(J9(t[e])||ee?A=Pg(A,\":\"):eA()),o()||(JA||ee?A+=\"null\":eA())}return t[e]===\"}\"?(A+=\"}\",e++):A=Pg(A,\"}\"),!0}return!1}function E(){if(t[e]===\"[\"){A+=\"[\",e++,a(),I(\",\")&&a();let iA=!0;for(;e<t.length&&t[e]!==\"]\";)if(iA?iA=!1:C(\",\")||(A=Pg(A,\",\")),B(),!o()){A=MB(A,\",\");break}return t[e]===\"]\"?(A+=\"]\",e++):A=Pg(A,\"]\"),!0}return!1}function f(){let iA=!0,aA=!0;for(;aA;)iA?iA=!1:C(\",\")||(A=Pg(A,\",\")),aA=o();aA||(A=MB(A,\",\")),A=`[\n${A}\n]`}function b(){let iA=arguments.length>0&&arguments[0]!==void 0?arguments[0]:!1,aA=arguments.length>1&&arguments[1]!==void 0?arguments[1]:-1,hA=t[e]===\"\\\\\";if(hA&&(e++,hA=!0),L4(t[e])){let JA=H9(t[e])?H9:T9(t[e])?T9:v6(t[e])?v6:Y9,ee=e,UA=A.length,mA='\"';for(e++;;){if(e>=t.length){let KA=Y(e-1);return!iA&&F4(t.charAt(KA))?(e=ee,A=A.substring(0,UA),b(!0)):(mA=Pg(mA,'\"'),A+=mA,!0)}if(e===aA)return mA=Pg(mA,'\"'),A+=mA,!0;if(JA(t[e])){let KA=e,ze=mA.length;if(mA+='\"',e++,A+=mA,a(!1),iA||e>=t.length||F4(t[e])||L4(t[e])||l2(t[e]))return R(),!0;let Ke=Y(KA-1),HA=t.charAt(Ke);if(HA===\",\")return e=ee,A=A.substring(0,UA),b(!1,Ke);if(F4(HA))return e=ee,A=A.substring(0,UA),b(!0);A=A.substring(0,UA),e=KA+1,mA=`${mA.substring(0,ze)}\\\\${mA.substring(ze)}`}else if(iA&&U9(t[e])){if(t[e-1]===\":\"&&G9.test(t.substring(ee+1,e+2)))for(;e<t.length&&K9.test(t[e]);)mA+=t[e],e++;return mA=Pg(mA,'\"'),A+=mA,R(),!0}else if(t[e]===\"\\\\\"){let KA=t.charAt(e+1);if(KCA[KA]!==void 0)mA+=t.slice(e,e+2),e+=2;else if(KA===\"u\"){let Ke=2;for(;Ke<6&&UY(t[e+Ke]);)Ke++;Ke===6?(mA+=t.slice(e,e+6),e+=6):e+Ke>=t.length?e=t.length:dA()}else mA+=KA,e+=2}else{let KA=t.charAt(e);KA==='\"'&&t[e-1]!==\"\\\\\"?(mA+=`\\\\${KA}`,e++):YY(KA)?(mA+=GCA[KA],e++):(JY(KA)||z(KA),mA+=KA,e++)}hA&&d()}}return!1}function R(){let iA=!1;for(a();t[e]===\"+\";){iA=!0,e++,a(),A=MB(A,'\"',!0);let aA=A.length;b()?A=OY(A,aA,1):A=Pg(A,'\"')}return iA}function M(){let iA=e;if(t[e]===\"-\"){if(e++,j())return AA(iA),!0;if(!l2(t[e]))return e=iA,!1}for(;l2(t[e]);)e++;if(t[e]===\".\"){if(e++,j())return AA(iA),!0;if(!l2(t[e]))return e=iA,!1;for(;l2(t[e]);)e++}if(t[e]===\"e\"||t[e]===\"E\"){if(e++,(t[e]===\"-\"||t[e]===\"+\")&&e++,j())return AA(iA),!0;if(!l2(t[e]))return e=iA,!1;for(;l2(t[e]);)e++}if(!j())return e=iA,!1;if(e>iA){let aA=t.slice(iA,e),hA=/^0\\d/.test(aA);return A+=hA?`\"${aA}\"`:aA,!0}return!1}function v(){return F(\"true\",\"true\")||F(\"false\",\"false\")||F(\"null\",\"null\")||F(\"True\",\"true\")||F(\"False\",\"false\")||F(\"None\",\"null\")}function F(iA,aA){return t.slice(e,e+iA.length)===iA?(A+=aA,e+=iA.length,!0):!1}function G(iA){let aA=e;if(L9(t[e])){for(;e<t.length&&_9(t[e]);)e++;let hA=e;for(;g2(t,hA);)hA++;if(t[hA]===\"(\")return e=hA+1,o(),t[e]===\")\"&&(e++,t[e]===\";\"&&e++),!0}for(;e<t.length&&!U9(t[e])&&!L4(t[e])&&(!iA||t[e]!==\":\");)e++;if(t[e-1]===\":\"&&G9.test(t.substring(aA,e+2)))for(;e<t.length&&K9.test(t[e]);)e++;if(e>aA){for(;g2(t,e-1)&&e>0;)e--;let hA=t.slice(aA,e);return A+=hA===\"undefined\"?\"null\":JSON.stringify(hA),t[e]==='\"'&&e++,!0}}function U(){if(t[e]===\"/\"){let iA=e;for(e++;e<t.length&&(t[e]!==\"/\"||t[e-1]===\"\\\\\");)e++;return e++,A+=JSON.stringify(t.substring(iA,e)),!0}}function Y(iA){let aA=iA;for(;aA>0&&g2(t,aA);)aA--;return aA}function j(){return e>=t.length||F4(t[e])||g2(t,e)}function AA(iA){A+=`${t.slice(iA,e)}0`}function z(iA){throw new Y0(`Invalid character ${JSON.stringify(iA)}`,e)}function yA(){throw new Y0(`Unexpected character ${JSON.stringify(t[e])}`,e)}function P(){throw new Y0(\"Unexpected end of json string\",t.length)}function nA(){throw new Y0(\"Object key expected\",e)}function eA(){throw new Y0(\"Colon expected\",e)}function dA(){let iA=t.slice(e,e+6);throw new Y0(`Invalid unicode character \"${iA}\"`,e)}}function UCA(t,e){return t[e]===\"*\"&&t[e+1]===\"/\"}var JCA=typeof global==\"object\"&&global&&global.Object===Object&&global,b6=JCA;var YCA=typeof self==\"object\"&&self&&self.Object===Object&&self,HCA=b6||YCA||Function(\"return this\")(),ba=HCA;var TCA=ba.Symbol,Cr=TCA;var PY=Object.prototype,OCA=PY.hasOwnProperty,zCA=PY.toString,_4=Cr?Cr.toStringTag:void 0;function PCA(t){var e=OCA.call(t,_4),A=t[_4];try{t[_4]=void 0;var i=!0}catch(o){}var n=zCA.call(t);return i&&(e?t[_4]=A:delete t[_4]),n}var jY=PCA;var jCA=Object.prototype,qCA=jCA.toString;function VCA(t){return qCA.call(t)}var qY=VCA;var WCA=\"[object Null]\",ZCA=\"[object Undefined]\",VY=Cr?Cr.toStringTag:void 0;function XCA(t){return t==null?t===void 0?ZCA:WCA:VY&&VY in Object(t)?jY(t):qY(t)}var Tl=XCA;function $CA(t){return t!=null&&typeof t==\"object\"}var hs=$CA;var A2A=\"[object Symbol]\";function e2A(t){return typeof t==\"symbol\"||hs(t)&&Tl(t)==A2A}var Bg=e2A;function t2A(t,e){for(var A=-1,i=t==null?0:t.length,n=Array(i);++A<i;)n[A]=e(t[A],A,t);return n}var c2=t2A;var i2A=Array.isArray,Xn=i2A;var n2A=1/0,WY=Cr?Cr.prototype:void 0,ZY=WY?WY.toString:void 0;function XY(t){if(typeof t==\"string\")return t;if(Xn(t))return c2(t,XY)+\"\";if(Bg(t))return ZY?ZY.call(t):\"\";var e=t+\"\";return e==\"0\"&&1/t==-n2A?\"-0\":e}var $Y=XY;var o2A=/\\s/;function a2A(t){for(var e=t.length;e--&&o2A.test(t.charAt(e)););return e}var AH=a2A;var r2A=/^\\s+/;function s2A(t){return t&&t.slice(0,AH(t)+1).replace(r2A,\"\")}var eH=s2A;function g2A(t){var e=typeof t;return t!=null&&(e==\"object\"||e==\"function\")}var Ar=g2A;var tH=NaN,l2A=/^[-+]0x[0-9a-f]+$/i,c2A=/^0b[01]+$/i,C2A=/^0o[0-7]+$/i,I2A=parseInt;function d2A(t){if(typeof t==\"number\")return t;if(Bg(t))return tH;if(Ar(t)){var e=typeof t.valueOf==\"function\"?t.valueOf():t;t=Ar(e)?e+\"\":e}if(typeof t!=\"string\")return t===0?t:+t;t=eH(t);var A=c2A.test(t);return A||C2A.test(t)?I2A(t.slice(2),A?2:8):l2A.test(t)?tH:+t}var G4=d2A;var iH=1/0,B2A=17976931348623157e292;function Q2A(t){if(!t)return t===0?t:0;if(t=G4(t),t===iH||t===-iH){var e=t<0?-1:1;return e*B2A}return t===t?t:0}var kB=Q2A;function E2A(t){var e=kB(t),A=e%1;return e===e?A?e-A:e:0}var nH=E2A;function h2A(t){return t}var Pc=h2A;var u2A=\"[object AsyncFunction]\",f2A=\"[object Function]\",m2A=\"[object GeneratorFunction]\",p2A=\"[object Proxy]\";function D2A(t){if(!Ar(t))return!1;var e=Tl(t);return e==f2A||e==m2A||e==u2A||e==p2A}var M6=D2A;var w2A=ba[\"__core-js_shared__\"],k6=w2A;var oH=(function(){var t=/[^.]+$/.exec(k6&&k6.keys&&k6.keys.IE_PROTO||\"\");return t?\"Symbol(src)_1.\"+t:\"\"})();function y2A(t){return!!oH&&oH in t}var aH=y2A;var v2A=Function.prototype,b2A=v2A.toString;function M2A(t){if(t!=null){try{return b2A.call(t)}catch(e){}try{return t+\"\"}catch(e){}}return\"\"}var H0=M2A;var k2A=/[\\\\^$.*+?()[\\]{}|]/g,S2A=/^\\[object .+?Constructor\\]$/,x2A=Function.prototype,R2A=Object.prototype,N2A=x2A.toString,F2A=R2A.hasOwnProperty,L2A=RegExp(\"^\"+N2A.call(F2A).replace(k2A,\"\\\\$&\").replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g,\"$1.*?\")+\"$\");function _2A(t){if(!Ar(t)||aH(t))return!1;var e=M6(t)?L2A:S2A;return e.test(H0(t))}var rH=_2A;function G2A(t,e){return t?.[e]}var sH=G2A;function K2A(t,e){var A=sH(t,e);return rH(A)?A:void 0}var Hs=K2A;var U2A=Hs(ba,\"WeakMap\"),S6=U2A;var gH=Object.create,J2A=(function(){function t(){}return function(e){if(!Ar(e))return{};if(gH)return gH(e);t.prototype=e;var A=new t;return t.prototype=void 0,A}})(),lH=J2A;function Y2A(t,e,A){switch(A.length){case 0:return t.call(e);case 1:return t.call(e,A[0]);case 2:return t.call(e,A[0],A[1]);case 3:return t.call(e,A[0],A[1],A[2])}return t.apply(e,A)}var cH=Y2A;function H2A(){}var ra=H2A;function T2A(t,e){var A=-1,i=t.length;for(e||(e=Array(i));++A<i;)e[A]=t[A];return e}var CH=T2A;var O2A=800,z2A=16,P2A=Date.now;function j2A(t){var e=0,A=0;return function(){var i=P2A(),n=z2A-(i-A);if(A=i,n>0){if(++e>=O2A)return arguments[0]}else e=0;return t.apply(void 0,arguments)}}var IH=j2A;function q2A(t){return function(){return t}}var dH=q2A;var V2A=(function(){try{var t=Hs(Object,\"defineProperty\");return t({},\"\",{}),t}catch(e){}})(),SB=V2A;var W2A=SB?function(t,e){return SB(t,\"toString\",{configurable:!0,enumerable:!1,value:dH(e),writable:!0})}:Pc,BH=W2A;var Z2A=IH(BH),QH=Z2A;function X2A(t,e){for(var A=-1,i=t==null?0:t.length;++A<i&&e(t[A],A,t)!==!1;);return t}var EH=X2A;var $2A=9007199254740991,AIA=/^(?:0|[1-9]\\d*)$/;function eIA(t,e){var A=typeof t;return e=e??$2A,!!e&&(A==\"number\"||A!=\"symbol\"&&AIA.test(t))&&t>-1&&t%1==0&&t<e}var xB=eIA;function tIA(t,e,A){e==\"__proto__\"&&SB?SB(t,e,{configurable:!0,enumerable:!0,value:A,writable:!0}):t[e]=A}var C2=tIA;function iIA(t,e){return t===e||t!==t&&e!==e}var I2=iIA;var nIA=Object.prototype,oIA=nIA.hasOwnProperty;function aIA(t,e,A){var i=t[e];(!(oIA.call(t,e)&&I2(i,A))||A===void 0&&!(e in t))&&C2(t,e,A)}var x6=aIA;function rIA(t,e,A,i){var n=!A;A||(A={});for(var o=-1,a=e.length;++o<a;){var r=e[o],s=i?i(A[r],t[r],r,A,t):void 0;s===void 0&&(s=t[r]),n?C2(A,r,s):x6(A,r,s)}return A}var d2=rIA;var hH=Math.max;function sIA(t,e,A){return e=hH(e===void 0?t.length-1:e,0),function(){for(var i=arguments,n=-1,o=hH(i.length-e,0),a=Array(o);++n<o;)a[n]=i[e+n];n=-1;for(var r=Array(e+1);++n<e;)r[n]=i[n];return r[e]=A(a),cH(t,this,r)}}var uH=sIA;function gIA(t,e){return QH(uH(t,e,Pc),t+\"\")}var fH=gIA;var lIA=9007199254740991;function cIA(t){return typeof t==\"number\"&&t>-1&&t%1==0&&t<=lIA}var RB=cIA;function CIA(t){return t!=null&&RB(t.length)&&!M6(t)}var qg=CIA;function IIA(t,e,A){if(!Ar(A))return!1;var i=typeof e;return(i==\"number\"?qg(A)&&xB(e,A.length):i==\"string\"&&e in A)?I2(A[e],t):!1}var K4=IIA;var dIA=Object.prototype;function BIA(t){var e=t&&t.constructor,A=typeof e==\"function\"&&e.prototype||dIA;return t===A}var B2=BIA;function QIA(t,e){for(var A=-1,i=Array(t);++A<t;)i[A]=e(A);return i}var R6=QIA;var EIA=\"[object Arguments]\";function hIA(t){return hs(t)&&Tl(t)==EIA}var O9=hIA;var mH=Object.prototype,uIA=mH.hasOwnProperty,fIA=mH.propertyIsEnumerable,mIA=O9((function(){return arguments})())?O9:function(t){return hs(t)&&uIA.call(t,\"callee\")&&!fIA.call(t,\"callee\")},Q2=mIA;function pIA(){return!1}var pH=pIA;var yH=typeof exports==\"object\"&&exports&&!exports.nodeType&&exports,DH=yH&&typeof module==\"object\"&&module&&!module.nodeType&&module,DIA=DH&&DH.exports===yH,wH=DIA?ba.Buffer:void 0,wIA=wH?wH.isBuffer:void 0,yIA=wIA||pH,T0=yIA;var vIA=\"[object Arguments]\",bIA=\"[object Array]\",MIA=\"[object Boolean]\",kIA=\"[object Date]\",SIA=\"[object Error]\",xIA=\"[object Function]\",RIA=\"[object Map]\",NIA=\"[object Number]\",FIA=\"[object Object]\",LIA=\"[object RegExp]\",_IA=\"[object Set]\",GIA=\"[object String]\",KIA=\"[object WeakMap]\",UIA=\"[object ArrayBuffer]\",JIA=\"[object DataView]\",YIA=\"[object Float32Array]\",HIA=\"[object Float64Array]\",TIA=\"[object Int8Array]\",OIA=\"[object Int16Array]\",zIA=\"[object Int32Array]\",PIA=\"[object Uint8Array]\",jIA=\"[object Uint8ClampedArray]\",qIA=\"[object Uint16Array]\",VIA=\"[object Uint32Array]\",$o={};$o[YIA]=$o[HIA]=$o[TIA]=$o[OIA]=$o[zIA]=$o[PIA]=$o[jIA]=$o[qIA]=$o[VIA]=!0;$o[vIA]=$o[bIA]=$o[UIA]=$o[MIA]=$o[JIA]=$o[kIA]=$o[SIA]=$o[xIA]=$o[RIA]=$o[NIA]=$o[FIA]=$o[LIA]=$o[_IA]=$o[GIA]=$o[KIA]=!1;function WIA(t){return hs(t)&&RB(t.length)&&!!$o[Tl(t)]}var vH=WIA;function ZIA(t){return function(e){return t(e)}}var E2=ZIA;var bH=typeof exports==\"object\"&&exports&&!exports.nodeType&&exports,U4=bH&&typeof module==\"object\"&&module&&!module.nodeType&&module,XIA=U4&&U4.exports===bH,z9=XIA&&b6.process,$IA=(function(){try{var t=U4&&U4.require&&U4.require(\"util\").types;return t||z9&&z9.binding&&z9.binding(\"util\")}catch(e){}})(),O0=$IA;var MH=O0&&O0.isTypedArray,A1A=MH?E2(MH):vH,NB=A1A;var e1A=Object.prototype,t1A=e1A.hasOwnProperty;function i1A(t,e){var A=Xn(t),i=!A&&Q2(t),n=!A&&!i&&T0(t),o=!A&&!i&&!n&&NB(t),a=A||i||n||o,r=a?R6(t.length,String):[],s=r.length;for(var g in t)(e||t1A.call(t,g))&&!(a&&(g==\"length\"||n&&(g==\"offset\"||g==\"parent\")||o&&(g==\"buffer\"||g==\"byteLength\"||g==\"byteOffset\")||xB(g,s)))&&r.push(g);return r}var N6=i1A;function n1A(t,e){return function(A){return t(e(A))}}var F6=n1A;var o1A=F6(Object.keys,Object),kH=o1A;var a1A=Object.prototype,r1A=a1A.hasOwnProperty;function s1A(t){if(!B2(t))return kH(t);var e=[];for(var A in Object(t))r1A.call(t,A)&&A!=\"constructor\"&&e.push(A);return e}var L6=s1A;function g1A(t){return qg(t)?N6(t):L6(t)}var Vg=g1A;function l1A(t){var e=[];if(t!=null)for(var A in Object(t))e.push(A);return e}var SH=l1A;var c1A=Object.prototype,C1A=c1A.hasOwnProperty;function I1A(t){if(!Ar(t))return SH(t);var e=B2(t),A=[];for(var i in t)i==\"constructor\"&&(e||!C1A.call(t,i))||A.push(i);return A}var xH=I1A;function d1A(t){return qg(t)?N6(t,!0):xH(t)}var FB=d1A;var B1A=/\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,Q1A=/^\\w*$/;function E1A(t,e){if(Xn(t))return!1;var A=typeof t;return A==\"number\"||A==\"symbol\"||A==\"boolean\"||t==null||Bg(t)?!0:Q1A.test(t)||!B1A.test(t)||e!=null&&t in Object(e)}var LB=E1A;var h1A=Hs(Object,\"create\"),z0=h1A;function u1A(){this.__data__=z0?z0(null):{},this.size=0}var RH=u1A;function f1A(t){var e=this.has(t)&&delete this.__data__[t];return this.size-=e?1:0,e}var NH=f1A;var m1A=\"__lodash_hash_undefined__\",p1A=Object.prototype,D1A=p1A.hasOwnProperty;function w1A(t){var e=this.__data__;if(z0){var A=e[t];return A===m1A?void 0:A}return D1A.call(e,t)?e[t]:void 0}var FH=w1A;var y1A=Object.prototype,v1A=y1A.hasOwnProperty;function b1A(t){var e=this.__data__;return z0?e[t]!==void 0:v1A.call(e,t)}var LH=b1A;var M1A=\"__lodash_hash_undefined__\";function k1A(t,e){var A=this.__data__;return this.size+=this.has(t)?0:1,A[t]=z0&&e===void 0?M1A:e,this}var _H=k1A;function _B(t){var e=-1,A=t==null?0:t.length;for(this.clear();++e<A;){var i=t[e];this.set(i[0],i[1])}}_B.prototype.clear=RH;_B.prototype.delete=NH;_B.prototype.get=FH;_B.prototype.has=LH;_B.prototype.set=_H;var P9=_B;function S1A(){this.__data__=[],this.size=0}var GH=S1A;function x1A(t,e){for(var A=t.length;A--;)if(I2(t[A][0],e))return A;return-1}var h2=x1A;var R1A=Array.prototype,N1A=R1A.splice;function F1A(t){var e=this.__data__,A=h2(e,t);if(A<0)return!1;var i=e.length-1;return A==i?e.pop():N1A.call(e,A,1),--this.size,!0}var KH=F1A;function L1A(t){var e=this.__data__,A=h2(e,t);return A<0?void 0:e[A][1]}var UH=L1A;function _1A(t){return h2(this.__data__,t)>-1}var JH=_1A;function G1A(t,e){var A=this.__data__,i=h2(A,t);return i<0?(++this.size,A.push([t,e])):A[i][1]=e,this}var YH=G1A;function GB(t){var e=-1,A=t==null?0:t.length;for(this.clear();++e<A;){var i=t[e];this.set(i[0],i[1])}}GB.prototype.clear=GH;GB.prototype.delete=KH;GB.prototype.get=UH;GB.prototype.has=JH;GB.prototype.set=YH;var u2=GB;var K1A=Hs(ba,\"Map\"),f2=K1A;function U1A(){this.size=0,this.__data__={hash:new P9,map:new(f2||u2),string:new P9}}var HH=U1A;function J1A(t){var e=typeof t;return e==\"string\"||e==\"number\"||e==\"symbol\"||e==\"boolean\"?t!==\"__proto__\":t===null}var TH=J1A;function Y1A(t,e){var A=t.__data__;return TH(e)?A[typeof e==\"string\"?\"string\":\"hash\"]:A.map}var m2=Y1A;function H1A(t){var e=m2(this,t).delete(t);return this.size-=e?1:0,e}var OH=H1A;function T1A(t){return m2(this,t).get(t)}var zH=T1A;function O1A(t){return m2(this,t).has(t)}var PH=O1A;function z1A(t,e){var A=m2(this,t),i=A.size;return A.set(t,e),this.size+=A.size==i?0:1,this}var jH=z1A;function KB(t){var e=-1,A=t==null?0:t.length;for(this.clear();++e<A;){var i=t[e];this.set(i[0],i[1])}}KB.prototype.clear=HH;KB.prototype.delete=OH;KB.prototype.get=zH;KB.prototype.has=PH;KB.prototype.set=jH;var o1=KB;var P1A=\"Expected a function\";function j9(t,e){if(typeof t!=\"function\"||e!=null&&typeof e!=\"function\")throw new TypeError(P1A);var A=function(){var i=arguments,n=e?e.apply(this,i):i[0],o=A.cache;if(o.has(n))return o.get(n);var a=t.apply(this,i);return A.cache=o.set(n,a)||o,a};return A.cache=new(j9.Cache||o1),A}j9.Cache=o1;var qH=j9;var j1A=500;function q1A(t){var e=qH(t,function(i){return A.size===j1A&&A.clear(),i}),A=e.cache;return e}var VH=q1A;var V1A=/[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g,W1A=/\\\\(\\\\)?/g,Z1A=VH(function(t){var e=[];return t.charCodeAt(0)===46&&e.push(\"\"),t.replace(V1A,function(A,i,n,o){e.push(n?o.replace(W1A,\"$1\"):i||A)}),e}),WH=Z1A;function X1A(t){return t==null?\"\":$Y(t)}var _6=X1A;function $1A(t,e){return Xn(t)?t:LB(t,e)?[t]:WH(_6(t))}var G6=$1A;var AdA=1/0;function edA(t){if(typeof t==\"string\"||Bg(t))return t;var e=t+\"\";return e==\"0\"&&1/t==-AdA?\"-0\":e}var p2=edA;function tdA(t,e){e=G6(e,t);for(var A=0,i=e.length;t!=null&&A<i;)t=t[p2(e[A++])];return A&&A==i?t:void 0}var UB=tdA;function idA(t,e,A){var i=t==null?void 0:UB(t,e);return i===void 0?A:i}var ZH=idA;function ndA(t,e){for(var A=-1,i=e.length,n=t.length;++A<i;)t[n+A]=e[A];return t}var JB=ndA;var XH=Cr?Cr.isConcatSpreadable:void 0;function odA(t){return Xn(t)||Q2(t)||!!(XH&&t&&t[XH])}var $H=odA;function AT(t,e,A,i,n){var o=-1,a=t.length;for(A||(A=$H),n||(n=[]);++o<a;){var r=t[o];e>0&&A(r)?e>1?AT(r,e-1,A,i,n):JB(n,r):i||(n[n.length]=r)}return n}var eT=AT;var adA=F6(Object.getPrototypeOf,Object),K6=adA;function rdA(t,e,A){var i=-1,n=t.length;e<0&&(e=-e>n?0:n+e),A=A>n?n:A,A<0&&(A+=n),n=e>A?0:A-e>>>0,e>>>=0;for(var o=Array(n);++i<n;)o[i]=t[i+e];return o}var tT=rdA;function sdA(){this.__data__=new u2,this.size=0}var iT=sdA;function gdA(t){var e=this.__data__,A=e.delete(t);return this.size=e.size,A}var nT=gdA;function ldA(t){return this.__data__.get(t)}var oT=ldA;function cdA(t){return this.__data__.has(t)}var aT=cdA;var CdA=200;function IdA(t,e){var A=this.__data__;if(A instanceof u2){var i=A.__data__;if(!f2||i.length<CdA-1)return i.push([t,e]),this.size=++A.size,this;A=this.__data__=new o1(i)}return A.set(t,e),this.size=A.size,this}var rT=IdA;function YB(t){var e=this.__data__=new u2(t);this.size=e.size}YB.prototype.clear=iT;YB.prototype.delete=nT;YB.prototype.get=oT;YB.prototype.has=aT;YB.prototype.set=rT;var D2=YB;function ddA(t,e){return t&&d2(e,Vg(e),t)}var sT=ddA;function BdA(t,e){return t&&d2(e,FB(e),t)}var gT=BdA;var IT=typeof exports==\"object\"&&exports&&!exports.nodeType&&exports,lT=IT&&typeof module==\"object\"&&module&&!module.nodeType&&module,QdA=lT&&lT.exports===IT,cT=QdA?ba.Buffer:void 0,CT=cT?cT.allocUnsafe:void 0;function EdA(t,e){if(e)return t.slice();var A=t.length,i=CT?CT(A):new t.constructor(A);return t.copy(i),i}var dT=EdA;function hdA(t,e){for(var A=-1,i=t==null?0:t.length,n=0,o=[];++A<i;){var a=t[A];e(a,A,t)&&(o[n++]=a)}return o}var BT=hdA;function udA(){return[]}var U6=udA;var fdA=Object.prototype,mdA=fdA.propertyIsEnumerable,QT=Object.getOwnPropertySymbols,pdA=QT?function(t){return t==null?[]:(t=Object(t),BT(QT(t),function(e){return mdA.call(t,e)}))}:U6,HB=pdA;function DdA(t,e){return d2(t,HB(t),e)}var ET=DdA;var wdA=Object.getOwnPropertySymbols,ydA=wdA?function(t){for(var e=[];t;)JB(e,HB(t)),t=K6(t);return e}:U6,J6=ydA;function vdA(t,e){return d2(t,J6(t),e)}var hT=vdA;function bdA(t,e,A){var i=e(t);return Xn(t)?i:JB(i,A(t))}var Y6=bdA;function MdA(t){return Y6(t,Vg,HB)}var J4=MdA;function kdA(t){return Y6(t,FB,J6)}var uT=kdA;var SdA=Hs(ba,\"DataView\"),H6=SdA;var xdA=Hs(ba,\"Promise\"),T6=xdA;var RdA=Hs(ba,\"Set\"),O6=RdA;var fT=\"[object Map]\",NdA=\"[object Object]\",mT=\"[object Promise]\",pT=\"[object Set]\",DT=\"[object WeakMap]\",wT=\"[object DataView]\",FdA=H0(H6),LdA=H0(f2),_dA=H0(T6),GdA=H0(O6),KdA=H0(S6),a1=Tl;(H6&&a1(new H6(new ArrayBuffer(1)))!=wT||f2&&a1(new f2)!=fT||T6&&a1(T6.resolve())!=mT||O6&&a1(new O6)!=pT||S6&&a1(new S6)!=DT)&&(a1=function(t){var e=Tl(t),A=e==NdA?t.constructor:void 0,i=A?H0(A):\"\";if(i)switch(i){case FdA:return wT;case LdA:return fT;case _dA:return mT;case GdA:return pT;case KdA:return DT}return e});var Ol=a1;var UdA=Object.prototype,JdA=UdA.hasOwnProperty;function YdA(t){var e=t.length,A=new t.constructor(e);return e&&typeof t[0]==\"string\"&&JdA.call(t,\"index\")&&(A.index=t.index,A.input=t.input),A}var yT=YdA;var HdA=ba.Uint8Array,TB=HdA;function TdA(t){var e=new t.constructor(t.byteLength);return new TB(e).set(new TB(t)),e}var OB=TdA;function OdA(t,e){var A=e?OB(t.buffer):t.buffer;return new t.constructor(A,t.byteOffset,t.byteLength)}var vT=OdA;var zdA=/\\w*$/;function PdA(t){var e=new t.constructor(t.source,zdA.exec(t));return e.lastIndex=t.lastIndex,e}var bT=PdA;var MT=Cr?Cr.prototype:void 0,kT=MT?MT.valueOf:void 0;function jdA(t){return kT?Object(kT.call(t)):{}}var ST=jdA;function qdA(t,e){var A=e?OB(t.buffer):t.buffer;return new t.constructor(A,t.byteOffset,t.length)}var xT=qdA;var VdA=\"[object Boolean]\",WdA=\"[object Date]\",ZdA=\"[object Map]\",XdA=\"[object Number]\",$dA=\"[object RegExp]\",ABA=\"[object Set]\",eBA=\"[object String]\",tBA=\"[object Symbol]\",iBA=\"[object ArrayBuffer]\",nBA=\"[object DataView]\",oBA=\"[object Float32Array]\",aBA=\"[object Float64Array]\",rBA=\"[object Int8Array]\",sBA=\"[object Int16Array]\",gBA=\"[object Int32Array]\",lBA=\"[object Uint8Array]\",cBA=\"[object Uint8ClampedArray]\",CBA=\"[object Uint16Array]\",IBA=\"[object Uint32Array]\";function dBA(t,e,A){var i=t.constructor;switch(e){case iBA:return OB(t);case VdA:case WdA:return new i(+t);case nBA:return vT(t,A);case oBA:case aBA:case rBA:case sBA:case gBA:case lBA:case cBA:case CBA:case IBA:return xT(t,A);case ZdA:return new i;case XdA:case eBA:return new i(t);case $dA:return bT(t);case ABA:return new i;case tBA:return ST(t)}}var RT=dBA;function BBA(t){return typeof t.constructor==\"function\"&&!B2(t)?lH(K6(t)):{}}var NT=BBA;var QBA=\"[object Map]\";function EBA(t){return hs(t)&&Ol(t)==QBA}var FT=EBA;var LT=O0&&O0.isMap,hBA=LT?E2(LT):FT,_T=hBA;var uBA=\"[object Set]\";function fBA(t){return hs(t)&&Ol(t)==uBA}var GT=fBA;var KT=O0&&O0.isSet,mBA=KT?E2(KT):GT,UT=mBA;var pBA=1,DBA=2,wBA=4,JT=\"[object Arguments]\",yBA=\"[object Array]\",vBA=\"[object Boolean]\",bBA=\"[object Date]\",MBA=\"[object Error]\",YT=\"[object Function]\",kBA=\"[object GeneratorFunction]\",SBA=\"[object Map]\",xBA=\"[object Number]\",HT=\"[object Object]\",RBA=\"[object RegExp]\",NBA=\"[object Set]\",FBA=\"[object String]\",LBA=\"[object Symbol]\",_BA=\"[object WeakMap]\",GBA=\"[object ArrayBuffer]\",KBA=\"[object DataView]\",UBA=\"[object Float32Array]\",JBA=\"[object Float64Array]\",YBA=\"[object Int8Array]\",HBA=\"[object Int16Array]\",TBA=\"[object Int32Array]\",OBA=\"[object Uint8Array]\",zBA=\"[object Uint8ClampedArray]\",PBA=\"[object Uint16Array]\",jBA=\"[object Uint32Array]\",zo={};zo[JT]=zo[yBA]=zo[GBA]=zo[KBA]=zo[vBA]=zo[bBA]=zo[UBA]=zo[JBA]=zo[YBA]=zo[HBA]=zo[TBA]=zo[SBA]=zo[xBA]=zo[HT]=zo[RBA]=zo[NBA]=zo[FBA]=zo[LBA]=zo[OBA]=zo[zBA]=zo[PBA]=zo[jBA]=!0;zo[MBA]=zo[YT]=zo[_BA]=!1;function z6(t,e,A,i,n,o){var a,r=e&pBA,s=e&DBA,g=e&wBA;if(A&&(a=n?A(t,i,n,o):A(t)),a!==void 0)return a;if(!Ar(t))return t;var l=Xn(t);if(l){if(a=yT(t),!r)return CH(t,a)}else{var C=Ol(t),I=C==YT||C==kBA;if(T0(t))return dT(t,r);if(C==HT||C==JT||I&&!n){if(a=s||I?{}:NT(t),!r)return s?hT(t,gT(a,t)):ET(t,sT(a,t))}else{if(!zo[C])return n?t:{};a=RT(t,C,r)}}o||(o=new D2);var d=o.get(t);if(d)return d;o.set(t,a),UT(t)?t.forEach(function(E){a.add(z6(E,e,A,E,t,o))}):_T(t)&&t.forEach(function(E,f){a.set(f,z6(E,e,A,f,t,o))});var B=g?s?uT:J4:s?FB:Vg,Q=l?void 0:B(t);return EH(Q||t,function(E,f){Q&&(f=E,E=t[f]),x6(a,f,z6(E,e,A,f,t,o))}),a}var P6=z6;var qBA=1,VBA=4;function WBA(t){return P6(t,qBA|VBA)}var Y4=WBA;var ZBA=1,XBA=4;function $BA(t,e){return e=typeof e==\"function\"?e:void 0,P6(t,ZBA|XBA,e)}var q9=$BA;var AQA=\"__lodash_hash_undefined__\";function eQA(t){return this.__data__.set(t,AQA),this}var TT=eQA;function tQA(t){return this.__data__.has(t)}var OT=tQA;function j6(t){var e=-1,A=t==null?0:t.length;for(this.__data__=new o1;++e<A;)this.add(t[e])}j6.prototype.add=j6.prototype.push=TT;j6.prototype.has=OT;var zT=j6;function iQA(t,e){for(var A=-1,i=t==null?0:t.length;++A<i;)if(e(t[A],A,t))return!0;return!1}var PT=iQA;function nQA(t,e){return t.has(e)}var jT=nQA;var oQA=1,aQA=2;function rQA(t,e,A,i,n,o){var a=A&oQA,r=t.length,s=e.length;if(r!=s&&!(a&&s>r))return!1;var g=o.get(t),l=o.get(e);if(g&&l)return g==e&&l==t;var C=-1,I=!0,d=A&aQA?new zT:void 0;for(o.set(t,e),o.set(e,t);++C<r;){var B=t[C],Q=e[C];if(i)var E=a?i(Q,B,C,e,t,o):i(B,Q,C,t,e,o);if(E!==void 0){if(E)continue;I=!1;break}if(d){if(!PT(e,function(f,b){if(!jT(d,b)&&(B===f||n(B,f,A,i,o)))return d.push(b)})){I=!1;break}}else if(!(B===Q||n(B,Q,A,i,o))){I=!1;break}}return o.delete(t),o.delete(e),I}var q6=rQA;function sQA(t){var e=-1,A=Array(t.size);return t.forEach(function(i,n){A[++e]=[n,i]}),A}var qT=sQA;function gQA(t){var e=-1,A=Array(t.size);return t.forEach(function(i){A[++e]=i}),A}var VT=gQA;var lQA=1,cQA=2,CQA=\"[object Boolean]\",IQA=\"[object Date]\",dQA=\"[object Error]\",BQA=\"[object Map]\",QQA=\"[object Number]\",EQA=\"[object RegExp]\",hQA=\"[object Set]\",uQA=\"[object String]\",fQA=\"[object Symbol]\",mQA=\"[object ArrayBuffer]\",pQA=\"[object DataView]\",WT=Cr?Cr.prototype:void 0,V9=WT?WT.valueOf:void 0;function DQA(t,e,A,i,n,o,a){switch(A){case pQA:if(t.byteLength!=e.byteLength||t.byteOffset!=e.byteOffset)return!1;t=t.buffer,e=e.buffer;case mQA:return!(t.byteLength!=e.byteLength||!o(new TB(t),new TB(e)));case CQA:case IQA:case QQA:return I2(+t,+e);case dQA:return t.name==e.name&&t.message==e.message;case EQA:case uQA:return t==e+\"\";case BQA:var r=qT;case hQA:var s=i&lQA;if(r||(r=VT),t.size!=e.size&&!s)return!1;var g=a.get(t);if(g)return g==e;i|=cQA,a.set(t,e);var l=q6(r(t),r(e),i,n,o,a);return a.delete(t),l;case fQA:if(V9)return V9.call(t)==V9.call(e)}return!1}var ZT=DQA;var wQA=1,yQA=Object.prototype,vQA=yQA.hasOwnProperty;function bQA(t,e,A,i,n,o){var a=A&wQA,r=J4(t),s=r.length,g=J4(e),l=g.length;if(s!=l&&!a)return!1;for(var C=s;C--;){var I=r[C];if(!(a?I in e:vQA.call(e,I)))return!1}var d=o.get(t),B=o.get(e);if(d&&B)return d==e&&B==t;var Q=!0;o.set(t,e),o.set(e,t);for(var E=a;++C<s;){I=r[C];var f=t[I],b=e[I];if(i)var R=a?i(b,f,I,e,t,o):i(f,b,I,t,e,o);if(!(R===void 0?f===b||n(f,b,A,i,o):R)){Q=!1;break}E||(E=I==\"constructor\")}if(Q&&!E){var M=t.constructor,v=e.constructor;M!=v&&\"constructor\"in t&&\"constructor\"in e&&!(typeof M==\"function\"&&M instanceof M&&typeof v==\"function\"&&v instanceof v)&&(Q=!1)}return o.delete(t),o.delete(e),Q}var XT=bQA;var MQA=1,$T=\"[object Arguments]\",AO=\"[object Array]\",V6=\"[object Object]\",kQA=Object.prototype,eO=kQA.hasOwnProperty;function SQA(t,e,A,i,n,o){var a=Xn(t),r=Xn(e),s=a?AO:Ol(t),g=r?AO:Ol(e);s=s==$T?V6:s,g=g==$T?V6:g;var l=s==V6,C=g==V6,I=s==g;if(I&&T0(t)){if(!T0(e))return!1;a=!0,l=!1}if(I&&!l)return o||(o=new D2),a||NB(t)?q6(t,e,A,i,n,o):ZT(t,e,s,A,i,n,o);if(!(A&MQA)){var d=l&&eO.call(t,\"__wrapped__\"),B=C&&eO.call(e,\"__wrapped__\");if(d||B){var Q=d?t.value():t,E=B?e.value():e;return o||(o=new D2),n(Q,E,A,i,o)}}return I?(o||(o=new D2),XT(t,e,A,i,n,o)):!1}var tO=SQA;function iO(t,e,A,i,n){return t===e?!0:t==null||e==null||!hs(t)&&!hs(e)?t!==t&&e!==e:tO(t,e,A,i,iO,n)}var zB=iO;var xQA=1,RQA=2;function NQA(t,e,A,i){var n=A.length,o=n,a=!i;if(t==null)return!o;for(t=Object(t);n--;){var r=A[n];if(a&&r[2]?r[1]!==t[r[0]]:!(r[0]in t))return!1}for(;++n<o;){r=A[n];var s=r[0],g=t[s],l=r[1];if(a&&r[2]){if(g===void 0&&!(s in t))return!1}else{var C=new D2;if(i)var I=i(g,l,s,t,e,C);if(!(I===void 0?zB(l,g,xQA|RQA,i,C):I))return!1}}return!0}var nO=NQA;function FQA(t){return t===t&&!Ar(t)}var W6=FQA;function LQA(t){for(var e=Vg(t),A=e.length;A--;){var i=e[A],n=t[i];e[A]=[i,n,W6(n)]}return e}var oO=LQA;function _QA(t,e){return function(A){return A==null?!1:A[t]===e&&(e!==void 0||t in Object(A))}}var Z6=_QA;function GQA(t){var e=oO(t);return e.length==1&&e[0][2]?Z6(e[0][0],e[0][1]):function(A){return A===t||nO(A,t,e)}}var aO=GQA;function KQA(t,e){return t!=null&&e in Object(t)}var rO=KQA;function UQA(t,e,A){e=G6(e,t);for(var i=-1,n=e.length,o=!1;++i<n;){var a=p2(e[i]);if(!(o=t!=null&&A(t,a)))break;t=t[a]}return o||++i!=n?o:(n=t==null?0:t.length,!!n&&RB(n)&&xB(a,n)&&(Xn(t)||Q2(t)))}var sO=UQA;function JQA(t,e){return t!=null&&sO(t,e,rO)}var gO=JQA;var YQA=1,HQA=2;function TQA(t,e){return LB(t)&&W6(e)?Z6(p2(t),e):function(A){var i=ZH(A,t);return i===void 0&&i===e?gO(A,t):zB(e,i,YQA|HQA)}}var lO=TQA;function OQA(t){return function(e){return e?.[t]}}var cO=OQA;function zQA(t){return function(e){return UB(e,t)}}var CO=zQA;function PQA(t){return LB(t)?cO(p2(t)):CO(t)}var IO=PQA;function jQA(t){return typeof t==\"function\"?t:t==null?Pc:typeof t==\"object\"?Xn(t)?lO(t[0],t[1]):aO(t):IO(t)}var jc=jQA;function qQA(t,e,A,i){for(var n=-1,o=t==null?0:t.length;++n<o;){var a=t[n];e(i,a,A(a),t)}return i}var dO=qQA;function VQA(t){return function(e,A,i){for(var n=-1,o=Object(e),a=i(e),r=a.length;r--;){var s=a[t?r:++n];if(A(o[s],s,o)===!1)break}return e}}var X6=VQA;var WQA=X6(),BO=WQA;function ZQA(t,e){return t&&BO(t,e,Vg)}var $6=ZQA;function XQA(t,e){return function(A,i){if(A==null)return A;if(!qg(A))return t(A,i);for(var n=A.length,o=e?n:-1,a=Object(A);(e?o--:++o<n)&&i(a[o],o,a)!==!1;);return A}}var A8=XQA;var $QA=A8($6),e8=$QA;function AEA(t,e,A,i){return e8(t,function(n,o,a){e(i,n,A(n),a)}),i}var QO=AEA;function eEA(t,e){return function(A,i){var n=Xn(A)?dO:QO,o=e?e():{};return n(A,t,jc(i,2),o)}}var t8=eEA;var tEA=function(){return ba.Date.now()},i8=tEA;var iEA=\"Expected a function\",nEA=Math.max,oEA=Math.min;function aEA(t,e,A){var i,n,o,a,r,s,g=0,l=!1,C=!1,I=!0;if(typeof t!=\"function\")throw new TypeError(iEA);e=G4(e)||0,Ar(A)&&(l=!!A.leading,C=\"maxWait\"in A,o=C?nEA(G4(A.maxWait)||0,e):o,I=\"trailing\"in A?!!A.trailing:I);function d(F){var G=i,U=n;return i=n=void 0,g=F,a=t.apply(U,G),a}function B(F){return g=F,r=setTimeout(f,e),l?d(F):a}function Q(F){var G=F-s,U=F-g,Y=e-G;return C?oEA(Y,o-U):Y}function E(F){var G=F-s,U=F-g;return s===void 0||G>=e||G<0||C&&U>=o}function f(){var F=i8();if(E(F))return b(F);r=setTimeout(f,Q(F))}function b(F){return r=void 0,I&&i?d(F):(i=n=void 0,a)}function R(){r!==void 0&&clearTimeout(r),g=0,i=s=n=r=void 0}function M(){return r===void 0?a:b(i8())}function v(){var F=i8(),G=E(F);if(i=arguments,n=this,s=F,G){if(r===void 0)return B(s);if(C)return clearTimeout(r),r=setTimeout(f,e),d(s)}return r===void 0&&(r=setTimeout(f,e)),a}return v.cancel=R,v.flush=M,v}var PB=aEA;function rEA(t){var e=t==null?0:t.length;return e?t[e-1]:void 0}var fi=rEA;function sEA(t){return typeof t==\"function\"?t:Pc}var n8=sEA;function gEA(t,e){for(var A=t==null?0:t.length;A--&&e(t[A],A,t)!==!1;);return t}var EO=gEA;var lEA=X6(!0),hO=lEA;function cEA(t,e){return t&&hO(t,e,Vg)}var uO=cEA;var CEA=A8(uO,!0),fO=CEA;function IEA(t,e){var A=Xn(t)?EO:fO;return A(t,n8(e))}var W9=IEA;function dEA(t){return t&&t.length?t[0]:void 0}var Wg=dEA;function BEA(t,e){var A=-1,i=qg(t)?Array(t.length):[];return e8(t,function(n,o,a){i[++A]=e(n,o,a)}),i}var o8=BEA;function QEA(t,e){var A=Xn(t)?c2:o8;return A(t,jc(e,3))}var Z9=QEA;var EEA=Object.prototype,hEA=EEA.hasOwnProperty,uEA=t8(function(t,e,A){hEA.call(t,A)?t[A].push(e):C2(t,A,[e])}),X9=uEA;function fEA(t){var e=t==null?0:t.length;return e?tT(t,0,-1):[]}var Li=fEA;var mEA=\"[object Map]\",pEA=\"[object Set]\",DEA=Object.prototype,wEA=DEA.hasOwnProperty;function yEA(t){if(t==null)return!0;if(qg(t)&&(Xn(t)||typeof t==\"string\"||typeof t.splice==\"function\"||T0(t)||NB(t)||Q2(t)))return!t.length;var e=Ol(t);if(e==mEA||e==pEA)return!t.size;if(B2(t))return!L6(t).length;for(var A in t)if(wEA.call(t,A))return!1;return!0}var zi=yEA;function vEA(t,e){return zB(t,e)}var di=vEA;function bEA(t,e){return t<e}var mO=bEA;function MEA(t,e){var A={};return e=jc(e,3),$6(t,function(i,n,o){C2(A,n,e(i,n,o))}),A}var $9=MEA;function kEA(t,e,A){for(var i=-1,n=t.length;++i<n;){var o=t[i],a=e(o);if(a!=null&&(r===void 0?a===a&&!Bg(a):A(a,r)))var r=a,s=o}return s}var pO=kEA;function SEA(t,e){return t&&t.length?pO(t,jc(e,2),mO):void 0}var jB=SEA;function xEA(t,e){var A=t.length;for(t.sort(e);A--;)t[A]=t[A].value;return t}var DO=xEA;function REA(t,e){if(t!==e){var A=t!==void 0,i=t===null,n=t===t,o=Bg(t),a=e!==void 0,r=e===null,s=e===e,g=Bg(e);if(!r&&!g&&!o&&t>e||o&&a&&s&&!r&&!g||i&&a&&s||!A&&s||!n)return 1;if(!i&&!o&&!g&&t<e||g&&A&&n&&!i&&!o||r&&A&&n||!a&&n||!s)return-1}return 0}var wO=REA;function NEA(t,e,A){for(var i=-1,n=t.criteria,o=e.criteria,a=n.length,r=A.length;++i<a;){var s=wO(n[i],o[i]);if(s){if(i>=r)return s;var g=A[i];return s*(g==\"desc\"?-1:1)}}return t.index-e.index}var yO=NEA;function FEA(t,e,A){e.length?e=c2(e,function(o){return Xn(o)?function(a){return UB(a,o.length===1?o[0]:o)}:o}):e=[Pc];var i=-1;e=c2(e,E2(jc));var n=o8(t,function(o,a,r){var s=c2(e,function(g){return g(o)});return{criteria:s,index:++i,value:o}});return DO(n,function(o,a){return yO(o,a,A)})}var vO=FEA;var LEA=t8(function(t,e,A){t[A?0:1].push(e)},function(){return[[],[]]}),AM=LEA;var _EA=Math.ceil,GEA=Math.max;function KEA(t,e,A,i){for(var n=-1,o=GEA(_EA((e-t)/(A||1)),0),a=Array(o);o--;)a[i?o:++n]=t,t+=A;return a}var bO=KEA;function UEA(t){return function(e,A,i){return i&&typeof i!=\"number\"&&K4(e,A,i)&&(A=i=void 0),e=kB(e),A===void 0?(A=e,e=0):A=kB(A),i=i===void 0?e<A?1:-1:kB(i),bO(e,A,i,t)}}var MO=UEA;var JEA=MO(),a8=JEA;var YEA=fH(function(t,e){if(t==null)return[];var A=e.length;return A>1&&K4(t,e[0],e[1])?e=[]:A>2&&K4(e[0],e[1],e[2])&&(e=[e[0]]),vO(t,eT(e,1),[])}),eM=YEA;var HEA=9007199254740991,tM=4294967295,TEA=Math.min;function OEA(t,e){if(t=nH(t),t<1||t>HEA)return[];var A=tM,i=TEA(t,tM);e=n8(e),t-=tM;for(var n=R6(i,e);++A<t;)e(A);return n}var iM=OEA;var zEA=0;function PEA(t){var e=++zEA;return _6(t)+e}var w2=PEA;var y2=t=>Array.isArray(t),jEA=t=>t!==null&&typeof t==\"object\"&&!y2(t),qEA=t=>typeof t==\"string\",r1=(t,e)=>t===e?!0:t!==null&&e!==null&&typeof t==\"object\"&&typeof e==\"object\"&&Object.keys(t).length===Object.keys(e).length&&Object.entries(t).every(([A,i])=>r1(i,e[A])),kO=(t,e)=>{let A=t?.[e];if(A!==void 0){if(!Object.hasOwn(t,e)||Array.isArray(t)&&!/^\\d+$/.test(e)||typeof t!=\"object\")throw new TypeError(`Unsupported property \"${e}\"`);return A}};function Fa(t){return(...e)=>{let A=e.map(o=>La(o)),i=A[0],n=A[1];return A.length===1?o=>t(i(o)):A.length===2?o=>t(i(o),n(o)):o=>t(...A.map(a=>a(o)))}}var O4={boolean:0,number:1,string:2},SO=3,NO=(t,e)=>typeof t==typeof e&&typeof t in O4?t>e:!1,VEA=(t,e)=>r1(t,e)||NO(t,e),FO=(t,e)=>typeof t==typeof e&&typeof t in O4?t<e:!1,WEA=(t,e)=>r1(t,e)||FO(t,e),T4={pipe:(...t)=>{let e=t.map(A=>La(A));return A=>e.reduce((i,n)=>n(i),A)},object:t=>{let e=Object.keys(t).map(A=>[A,La(t[A])]);return A=>{let i={};for(let[n,o]of e)i[n]=o(A);return i}},array:(...t)=>{let e=t.map(A=>La(A));return A=>e.map(i=>i(A))},get:(...t)=>{if(t.length===0)return e=>e??null;if(t.length===1){let e=t[0];return A=>kO(A,e)??null}return e=>{let A=e;for(let i of t)A=kO(A,i);return A??null}},map:t=>{let e=La(t);return A=>A.map(e)},mapObject:t=>{let e=La(t);return A=>{let i={};for(let n of Object.keys(A)){let o=e({key:n,value:A[n]});i[o.key]=o.value}return i}},mapKeys:t=>{let e=La(t);return A=>{let i={};for(let n of Object.keys(A)){let o=e(n);i[o]=A[n]}return i}},mapValues:t=>{let e=La(t);return A=>{let i={};for(let n of Object.keys(A))i[n]=e(A[n]);return i}},filter:t=>{let e=La(t);return A=>A.filter(i=>xO(e(i)))},sort:(t=[\"get\"],e)=>{let A=La(t),i=e===\"desc\"?-1:1;function n(o,a){let r=A(o),s=A(a);if(typeof r!=typeof s){let g=O4[typeof r]??SO,l=O4[typeof s]??SO;return g>l?i:g<l?-i:0}return typeof r in O4?r>s?i:r<s?-i:0:0}return o=>o.slice().sort(n)},reverse:()=>t=>t.toReversed(),pick:(...t)=>{let e=t.map(([i,...n])=>[n[n.length-1],T4.get(...n)]),A=(i,n)=>{let o={};for(let[a,r]of n)o[a]=r(i);return o};return i=>y2(i)?i.map(n=>A(n,e)):A(i,e)},groupBy:t=>{let e=La(t);return A=>{let i={};for(let n of A){let o=e(n);i[o]?i[o].push(n):i[o]=[n]}return i}},keyBy:t=>{let e=La(t);return A=>{let i={};for(let n of A){let o=e(n);o in i||(i[o]=n)}return i}},flatten:()=>t=>t.flat(),join:(t=\"\")=>e=>e.join(t),split:Fa((t,e)=>e!==void 0?t.split(e):t.trim().split(/\\s+/)),substring:Fa((t,e,A)=>t.slice(Math.max(e,0),A)),uniq:()=>t=>{let e=[];for(let A of t)e.findIndex(i=>r1(i,A))===-1&&e.push(A);return e},uniqBy:t=>e=>Object.values(T4.keyBy(t)(e)),limit:t=>e=>e.slice(0,Math.max(t,0)),size:()=>t=>t.length,keys:()=>Object.keys,values:()=>Object.values,prod:()=>t=>H4(t,(e,A)=>e*A),sum:()=>t=>y2(t)?t.reduce((e,A)=>e+A,0):nM(),average:()=>t=>y2(t)?t.length>0?t.reduce((e,A)=>e+A)/t.length:null:nM(),min:()=>t=>H4(t,(e,A)=>Math.min(e,A)),max:()=>t=>H4(t,(e,A)=>Math.max(e,A)),and:Fa((...t)=>H4(t,(e,A)=>!!(e&&A))),or:Fa((...t)=>H4(t,(e,A)=>!!(e||A))),not:Fa(t=>!t),exists:t=>{let e=t.slice(1),A=e.pop(),i=T4.get(...e);return n=>{let o=i(n);return!!o&&Object.hasOwnProperty.call(o,A)}},if:(t,e,A)=>{let i=La(t),n=La(e),o=La(A);return a=>xO(i(a))?n(a):o(a)},in:(t,e)=>{let A=La(t),i=La(e);return n=>{let o=A(n);return i(n).findIndex(a=>r1(a,o))!==-1}},\"not in\":(t,e)=>{let A=T4.in(t,e);return i=>!A(i)},regex:(t,e,A)=>{let i=new RegExp(e,A),n=La(t);return o=>i.test(n(o))},match:(t,e,A)=>{let i=new RegExp(e,A),n=La(t);return o=>{let a=n(o).match(i);return a?RO(a):null}},matchAll:(t,e,A)=>{let i=new RegExp(e,`${A??\"\"}g`),n=La(t);return o=>Array.from(n(o).matchAll(i)).map(RO)},eq:Fa(r1),gt:Fa(NO),gte:Fa(VEA),lt:Fa(FO),lte:Fa(WEA),ne:Fa((t,e)=>!r1(t,e)),add:Fa((t,e)=>t+e),subtract:Fa((t,e)=>t-e),multiply:Fa((t,e)=>t*e),divide:Fa((t,e)=>t/e),mod:Fa((t,e)=>t%e),pow:Fa((t,e)=>t**e),abs:Fa(Math.abs),round:Fa((t,e=0)=>+`${Math.round(+`${t}e${e}`)}e${-e}`),number:Fa(t=>{let e=Number(t);return Number.isNaN(Number(t))?null:e}),string:Fa(String)},xO=t=>t!==null&&t!==0&&t!==!1,H4=(t,e)=>(y2(t)||nM(),t.length===0?null:t.reduce(e)),RO=t=>{let[e,...A]=t,i=t.groups;return A.length?i?{value:e,groups:A,namedGroups:i}:{value:e,groups:A}:{value:e}},nM=()=>{oM(\"Array expected\")},oM=t=>{throw new TypeError(t)},r8=[];function La(t,e){r8.unshift(BA(BA(BA({},T4),r8[0]),e?.functions));try{let A=y2(t)?ZEA(t,r8[0]):jEA(t)?oM(`Function notation [\"object\", {...}] expected but got ${JSON.stringify(t)}`):()=>t;return i=>{try{return A(i)}catch(n){throw n.jsonquery=[{data:i,query:t},...n.jsonquery??[]],n}}}finally{r8.shift()}}function ZEA(t,e){let[A,...i]=t,n=e[A];return n||oM(`Unknown function '${A}'`),n(...i)}var LO=[{pow:\"^\"},{multiply:\"*\",divide:\"/\",mod:\"%\"},{add:\"+\",subtract:\"-\"},{gt:\">\",gte:\">=\",lt:\"<\",lte:\"<=\",in:\"in\",\"not in\":\"not in\"},{eq:\"==\",ne:\"!=\"},{and:\"and\"},{or:\"or\"},{pipe:\"|\"}],XEA=[\"|\",\"and\",\"or\"],_O=[\"|\",\"and\",\"or\",\"*\",\"/\",\"%\",\"+\",\"-\"];function GO(t,e){if(!y2(e))throw new Error(\"Invalid custom operators\");return e.reduce($EA,t)}function $EA(t,{name:e,op:A,at:i,after:n,before:o}){if(i)return t.map(s=>Object.values(s).includes(i)?Ve(BA({},s),{[e]:A}):s);let a=n??o,r=t.findIndex(s=>Object.values(s).includes(a));if(r!==-1)return t.toSpliced(r+(n?1:0),0,{[e]:A});throw new Error(\"Invalid custom operator\")}var AhA=/^[a-zA-Z_$][a-zA-Z\\d_$]*$/,ehA=/^[a-zA-Z_$][a-zA-Z\\d_$]*/,thA=/^\"(?:[^\"\\\\]|\\\\.)*\"/,ihA=/^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?/,nhA=/^(0|[1-9][0-9]*)/,ohA=/^(true|false|null)/,ahA=/^[ \\n\\t\\r]+/;function aM(t,e){let A=e?.operators??[],i=GO(LO,A),n=Object.assign({},...i),o=XEA.concat(A.filter(j=>j.vararg).map(j=>j.op)),a=_O.concat(A.filter(j=>j.leftAssociative).map(j=>j.op)),r=(j=i.length-1)=>{let AA=i[j];if(!AA)return g();let z=t[U]===\"(\",yA=r(j-1);for(;;){if(v(),t[U]===\".\"&&\"pipe\"in AA){let aA=l();yA=yA[0]===\"pipe\"?[...yA,aA]:[\"pipe\",yA,aA];continue}let P=U,nA=s(AA);if(!nA)break;let eA=r(j-1),dA=yA[0],iA=nA===dA&&!z;if(iA&&!a.includes(n[nA])){U=P;break}yA=iA&&o.includes(n[nA])?[...yA,eA]:[nA,yA,eA]}return yA},s=j=>{let AA=Object.keys(j).sort((z,yA)=>yA.length-z.length);for(let z of AA){let yA=j[z];if(t.substring(U,U+yA.length)===yA)return U+=yA.length,v(),z}},g=()=>{if(v(),t[U]===\"(\"){U++;let j=r();return F(\")\"),j}return l()},l=()=>{if(t[U]===\".\"){let j=[];for(;t[U]===\".\";)U++,j.push(B()??Q()??f()??G(\"Property expected\")),v();return[\"get\",...j]}return C()},C=()=>{let j=U,AA=Q();if(v(),!AA||t[U]!==\"(\")return U=j,I();U++,v();let z=t[U]!==\")\"?[r()]:[];for(;U<t.length&&t[U]!==\")\";)v(),F(\",\"),z.push(r());return F(\")\"),[AA,...z]},I=()=>{if(t[U]===\"{\"){U++,v();let j={},AA=!0;for(;U<t.length&&t[U]!==\"}\";){AA?AA=!1:(F(\",\"),v());let z=B()??Q()??f()??G(\"Key expected\");v(),F(\":\"),j[z]=r()}return F(\"}\"),[\"object\",j]}return d()},d=()=>{if(t[U]===\"[\"){U++,v();let j=[],AA=!0;for(;U<t.length&&t[U]!==\"]\";)AA?AA=!1:(F(\",\"),v()),j.push(r());return F(\"]\"),[\"array\",...j]}return B()??E()??b()},B=()=>M(thA,JSON.parse),Q=()=>M(ehA,j=>j),E=()=>M(ihA,JSON.parse),f=()=>M(nhA,JSON.parse),b=()=>{let j=M(ohA,JSON.parse);if(j!==void 0)return j;G(\"Value expected\")},R=()=>{v(),U<t.length&&G(`Unexpected part '${t.substring(U)}'`)},M=(j,AA)=>{let z=t.substring(U).match(j);if(z)return U+=z[0].length,AA(z[0])},v=()=>M(ahA,j=>j),F=j=>{t[U]!==j&&G(`Character '${j}' expected`),U++},G=(j,AA=U)=>{throw new SyntaxError(`${j} (pos: ${AA})`)},U=0,Y=r();return R(),Y}var rhA=40,shA=\"  \",KO=(t,e)=>{let A=e?.indentation??shA,i=e?.operators??[],n=GO(LO,i),o=Object.assign({},...n),a=_O.concat(i.filter(d=>d.leftAssociative).map(d=>d.op)),r=(d,B,Q=!1)=>y2(d)?s(d,B,Q):JSON.stringify(d),s=(d,B,Q)=>{let[E,...f]=d;if(E===\"get\"&&f.length>0)return l(f);if(E===\"object\")return g(f[0],B);if(E===\"array\"){let v=f.map(F=>r(F,B));return I(v,[\"[\",\", \",\"]\"],[`[\n${B+A}`,`,\n${B+A}`,`\n${B}]`])}let b=o[E];if(b){let v=Q?\"(\":\"\",F=Q?\")\":\"\",G=f.map((U,Y)=>{let j=U?.[0],AA=n.findIndex(P=>E in P),z=n.findIndex(P=>j in P),yA=AA<z||AA===z&&Y>0||E===j&&!a.includes(b);return r(U,B+A,yA)});return I(G,[v,` ${b} `,F],[v,`\n${B+A}${b} `,F])}let R=f.length===1?B:B+A,M=f.map(v=>r(v,R));return I(M,[`${E}(`,\", \",\")\"],f.length===1?[`${E}(`,`,\n${B}`,\")\"]:[`${E}(\n${R}`,`,\n${R}`,`\n${B})`])},g=(d,B)=>{let Q=B+A,E=Object.entries(d).map(([f,b])=>`${C(f)}: ${r(b,Q)}`);return I(E,[\"{ \",\", \",\" }\"],[`{\n${Q}`,`,\n${Q}`,`\n${B}}`])},l=d=>d.map(B=>`.${C(B)}`).join(\"\"),C=d=>AhA.test(d)?d:JSON.stringify(d),I=(d,[B,Q,E],[f,b,R])=>B.length+d.reduce((M,v)=>M+v.length+Q.length,0)-Q.length+E.length<=(e?.maxLineLength??rhA)?B+d.join(Q)+E:f+d.join(b)+R;return r(t,\"\")};function UO(t,e,A){return La(qEA(e)?aM(e,A):e,A)(t)}var JO={prefix:\"far\",iconName:\"clock\",icon:[512,512,[128339,\"clock-four\"],\"f017\",\"M464 256a208 208 0 1 1 -416 0 208 208 0 1 1 416 0zM0 256a256 256 0 1 0 512 0 256 256 0 1 0 -512 0zM232 120l0 136c0 8 4 15.5 10.7 20l96 64c11 7.4 25.9 4.4 33.3-6.7s4.4-25.9-6.7-33.3L280 243.2 280 120c0-13.3-10.7-24-24-24s-24 10.7-24 24z\"]};var ghA={prefix:\"far\",iconName:\"square-check\",icon:[448,512,[9745,9989,61510,\"check-square\"],\"f14a\",\"M384 32c35.3 0 64 28.7 64 64l0 320c0 35.3-28.7 64-64 64L64 480c-35.3 0-64-28.7-64-64L0 96C0 60.7 28.7 32 64 32l320 0zM64 80c-8.8 0-16 7.2-16 16l0 320c0 8.8 7.2 16 16 16l320 0c8.8 0 16-7.2 16-16l0-320c0-8.8-7.2-16-16-16L64 80zm230.7 89.9c7.8-10.7 22.8-13.1 33.5-5.3 10.7 7.8 13.1 22.8 5.3 33.5L211.4 366.1c-4.1 5.7-10.5 9.3-17.5 9.8-7 .5-13.9-2-18.8-6.9l-55.9-55.9c-9.4-9.4-9.4-24.6 0-33.9s24.6-9.4 33.9 0l36 36 105.6-145.2z\"]},rM=ghA;var YO={prefix:\"far\",iconName:\"lightbulb\",icon:[384,512,[128161],\"f0eb\",\"M296.5 291.1C321 265.2 336 230.4 336 192 336 112.5 271.5 48 192 48S48 112.5 48 192c0 38.4 15 73.2 39.5 99.1 21.3 22.4 44.9 54 53.3 92.9l102.4 0c8.4-39 32-70.5 53.3-92.9zm34.8 33C307.7 349 288 379.4 288 413.7l0 18.3c0 44.2-35.8 80-80 80l-32 0c-44.2 0-80-35.8-80-80l0-18.3C96 379.4 76.3 349 52.7 324.1 20 289.7 0 243.2 0 192 0 86 86 0 192 0S384 86 384 192c0 51.2-20 97.7-52.7 132.1zM144 184c0 13.3-10.7 24-24 24s-24-10.7-24-24c0-48.6 39.4-88 88-88 13.3 0 24 10.7 24 24s-10.7 24-24 24c-22.1 0-40 17.9-40 40z\"]};var sM={prefix:\"far\",iconName:\"square\",icon:[448,512,[9632,9723,9724,61590],\"f0c8\",\"M384 80c8.8 0 16 7.2 16 16l0 320c0 8.8-7.2 16-16 16L64 432c-8.8 0-16-7.2-16-16L48 96c0-8.8 7.2-16 16-16l320 0zM64 32C28.7 32 0 60.7 0 96L0 416c0 35.3 28.7 64 64 64l320 0c35.3 0 64-28.7 64-64l0-320c0-35.3-28.7-64-64-64L64 32z\"]};var HO={prefix:\"fas\",iconName:\"rotate\",icon:[512,512,[128260,\"sync-alt\"],\"f2f1\",\"M480.1 192l7.9 0c13.3 0 24-10.7 24-24l0-144c0-9.7-5.8-18.5-14.8-22.2S477.9 .2 471 7L419.3 58.8C375 22.1 318 0 256 0 127 0 20.3 95.4 2.6 219.5 .1 237 12.2 253.2 29.7 255.7s33.7-9.7 36.2-27.1C79.2 135.5 159.3 64 256 64 300.4 64 341.2 79 373.7 104.3L327 151c-6.9 6.9-8.9 17.2-5.2 26.2S334.3 192 344 192l136.1 0zm29.4 100.5c2.5-17.5-9.7-33.7-27.1-36.2s-33.7 9.7-36.2 27.1c-13.3 93-93.4 164.5-190.1 164.5-44.4 0-85.2-15-117.7-40.3L185 361c6.9-6.9 8.9-17.2 5.2-26.2S177.7 320 168 320L24 320c-13.3 0-24 10.7-24 24L0 488c0 9.7 5.8 18.5 14.8 22.2S34.1 511.8 41 505l51.8-51.8C137 489.9 194 512 256 512 385 512 491.7 416.6 509.4 292.5z\"]};var gM={prefix:\"fas\",iconName:\"paste\",icon:[512,512,[\"file-clipboard\"],\"f0ea\",\"M64 0C28.7 0 0 28.7 0 64L0 384c0 35.3 28.7 64 64 64l112 0 0-224c0-61.9 50.1-112 112-112l64 0 0-48c0-35.3-28.7-64-64-64L64 0zM248 112l-144 0c-13.3 0-24-10.7-24-24s10.7-24 24-24l144 0c13.3 0 24 10.7 24 24s-10.7 24-24 24zm40 48c-35.3 0-64 28.7-64 64l0 224c0 35.3 28.7 64 64 64l160 0c35.3 0 64-28.7 64-64l0-165.5c0-17-6.7-33.3-18.7-45.3l-58.5-58.5c-12-12-28.3-18.7-45.3-18.7L288 160z\"]};var lhA={prefix:\"fas\",iconName:\"crop-simple\",icon:[512,512,[\"crop-alt\"],\"f565\",\"M128 32c0-17.7-14.3-32-32-32S64 14.3 64 32l0 32-32 0C14.3 64 0 78.3 0 96s14.3 32 32 32l32 0 0 256c0 35.3 28.7 64 64 64l208 0 0-64-208 0 0-352zM384 480c0 17.7 14.3 32 32 32s32-14.3 32-32l0-32 32 0c17.7 0 32-14.3 32-32s-14.3-32-32-32l-32 0 0-256c0-35.3-28.7-64-64-64l-208 0 0 64 208 0 0 352z\"]},TO=lhA;var z4={prefix:\"fas\",iconName:\"filter\",icon:[512,512,[],\"f0b0\",\"M32 64C19.1 64 7.4 71.8 2.4 83.8S.2 109.5 9.4 118.6L192 301.3 192 416c0 8.5 3.4 16.6 9.4 22.6l64 64c9.2 9.2 22.9 11.9 34.9 6.9S320 492.9 320 480l0-178.7 182.6-182.6c9.2-9.2 11.9-22.9 6.9-34.9S492.9 64 480 64L32 64z\"]};var chA={prefix:\"fas\",iconName:\"square-caret-down\",icon:[448,512,[\"caret-square-down\"],\"f150\",\"M384 480c35.3 0 64-28.7 64-64l0-320c0-35.3-28.7-64-64-64L64 32C28.7 32 0 60.7 0 96L0 416c0 35.3 28.7 64 64 64l320 0zM224 352c-6.7 0-13-2.8-17.6-7.7l-104-112c-6.5-7-8.2-17.2-4.4-25.9S110.5 192 120 192l208 0c9.5 0 18.2 5.7 22 14.4s2.1 18.9-4.4 25.9l-104 112c-4.5 4.9-10.9 7.7-17.6 7.7z\"]},OO=chA;var qB={prefix:\"fas\",iconName:\"caret-right\",icon:[256,512,[],\"f0da\",\"M249.3 235.8c10.2 12.6 9.5 31.1-2.2 42.8l-128 128c-9.2 9.2-22.9 11.9-34.9 6.9S64.5 396.9 64.5 384l0-256c0-12.9 7.8-24.6 19.8-29.6s25.7-2.2 34.9 6.9l128 128 2.2 2.4z\"]};var ChA={prefix:\"fas\",iconName:\"magnifying-glass\",icon:[512,512,[128269,\"search\"],\"f002\",\"M416 208c0 45.9-14.9 88.3-40 122.7L502.6 457.4c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0L330.7 376C296.3 401.1 253.9 416 208 416 93.1 416 0 322.9 0 208S93.1 0 208 0 416 93.1 416 208zM208 352a144 144 0 1 0 0-288 144 144 0 1 0 0 288z\"]},P4=ChA;var zO={prefix:\"fas\",iconName:\"eye\",icon:[576,512,[128065],\"f06e\",\"M288 32c-80.8 0-145.5 36.8-192.6 80.6-46.8 43.5-78.1 95.4-93 131.1-3.3 7.9-3.3 16.7 0 24.6 14.9 35.7 46.2 87.7 93 131.1 47.1 43.7 111.8 80.6 192.6 80.6s145.5-36.8 192.6-80.6c46.8-43.5 78.1-95.4 93-131.1 3.3-7.9 3.3-16.7 0-24.6-14.9-35.7-46.2-87.7-93-131.1-47.1-43.7-111.8-80.6-192.6-80.6zM144 256a144 144 0 1 1 288 0 144 144 0 1 1 -288 0zm144-64c0 35.3-28.7 64-64 64-11.5 0-22.3-3-31.7-8.4-1 10.9-.1 22.1 2.9 33.2 13.7 51.2 66.4 81.6 117.6 67.9s81.6-66.4 67.9-117.6c-12.2-45.7-55.5-74.8-101.1-70.8 5.3 9.3 8.4 20.1 8.4 31.7z\"]},PO={prefix:\"fas\",iconName:\"caret-left\",icon:[256,512,[],\"f0d9\",\"M7.7 235.8c-10.3 12.6-9.5 31.1 2.2 42.8l128 128c9.2 9.2 22.9 11.9 34.9 6.9s19.8-16.6 19.8-29.6l0-256c0-12.9-7.8-24.6-19.8-29.6s-25.7-2.2-34.9 6.9l-128 128-2.2 2.4z\"]};var jO={prefix:\"fas\",iconName:\"chevron-up\",icon:[448,512,[],\"f077\",\"M201.4 105.4c12.5-12.5 32.8-12.5 45.3 0l192 192c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0L224 173.3 54.6 342.6c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3l192-192z\"]};var qO={prefix:\"fas\",iconName:\"circle-notch\",icon:[512,512,[],\"f1ce\",\"M222.7 32.1c5 16.9-4.6 34.8-21.5 39.8-79.3 23.6-137.1 97.1-137.1 184.1 0 106 86 192 192 192s192-86 192-192c0-86.9-57.8-160.4-137.1-184.1-16.9-5-26.6-22.9-21.5-39.8s22.9-26.6 39.8-21.5C434.9 42.1 512 140 512 256 512 397.4 397.4 512 256 512S0 397.4 0 256c0-116 77.1-213.9 182.9-245.4 16.9-5 34.8 4.6 39.8 21.5z\"]};var IhA={prefix:\"fas\",iconName:\"ellipsis-vertical\",icon:[128,512,[\"ellipsis-v\"],\"f142\",\"M64 144a56 56 0 1 1 0-112 56 56 0 1 1 0 112zm0 224c30.9 0 56 25.1 56 56s-25.1 56-56 56-56-25.1-56-56 25.1-56 56-56zm56-112c0 30.9-25.1 56-56 56s-56-25.1-56-56 25.1-56 56-56 56 25.1 56 56z\"]},lM=IhA;var dhA={prefix:\"fas\",iconName:\"pen-to-square\",icon:[512,512,[\"edit\"],\"f044\",\"M471.6 21.7c-21.9-21.9-57.3-21.9-79.2 0L368 46.1 465.9 144 490.3 119.6c21.9-21.9 21.9-57.3 0-79.2L471.6 21.7zm-299.2 220c-6.1 6.1-10.8 13.6-13.5 21.9l-29.6 88.8c-2.9 8.6-.6 18.1 5.8 24.6s15.9 8.7 24.6 5.8l88.8-29.6c8.2-2.7 15.7-7.4 21.9-13.5L432 177.9 334.1 80 172.4 241.7zM96 64C43 64 0 107 0 160L0 416c0 53 43 96 96 96l256 0c53 0 96-43 96-96l0-96c0-17.7-14.3-32-32-32s-32 14.3-32 32l0 96c0 17.7-14.3 32-32 32L96 448c-17.7 0-32-14.3-32-32l0-256c0-17.7 14.3-32 32-32l96 0c17.7 0 32-14.3 32-32s-14.3-32-32-32L96 64z\"]},VO=dhA;var cM={prefix:\"fas\",iconName:\"clone\",icon:[512,512,[],\"f24d\",\"M288 448l-224 0 0-224 48 0 0-64-48 0c-35.3 0-64 28.7-64 64L0 448c0 35.3 28.7 64 64 64l224 0c35.3 0 64-28.7 64-64l0-48-64 0 0 48zm-64-96l224 0c35.3 0 64-28.7 64-64l0-224c0-35.3-28.7-64-64-64L224 0c-35.3 0-64 28.7-64 64l0 224c0 35.3 28.7 64 64 64z\"]};var BhA={prefix:\"fas\",iconName:\"square-check\",icon:[448,512,[9745,9989,61510,\"check-square\"],\"f14a\",\"M384 32c35.3 0 64 28.7 64 64l0 320c0 35.3-28.7 64-64 64L64 480c-35.3 0-64-28.7-64-64L0 96C0 60.7 28.7 32 64 32l320 0zM342 145.7c-10.7-7.8-25.7-5.4-33.5 5.3L189.1 315.2 137 263.1c-9.4-9.4-24.6-9.4-33.9 0s-9.4 24.6 0 33.9l72 72c5 5 11.9 7.5 18.8 7s13.4-4.1 17.5-9.8L347.3 179.2c7.8-10.7 5.4-25.7-5.3-33.5z\"]},CM=BhA;var QhA={prefix:\"fas\",iconName:\"square-caret-up\",icon:[448,512,[\"caret-square-up\"],\"f151\",\"M64 32C28.7 32 0 60.7 0 96L0 416c0 35.3 28.7 64 64 64l320 0c35.3 0 64-28.7 64-64l0-320c0-35.3-28.7-64-64-64L64 32zM224 160c6.7 0 13 2.8 17.6 7.7l104 112c6.5 7 8.2 17.2 4.4 25.9S337.5 320 328 320l-208 0c-9.5 0-18.2-5.7-22-14.4s-2.1-18.9 4.4-25.9l104-112c4.5-4.9 10.9-7.7 17.6-7.7z\"]},WO=QhA;var j4={prefix:\"fas\",iconName:\"code\",icon:[576,512,[],\"f121\",\"M360.8 1.2c-17-4.9-34.7 5-39.6 22l-128 448c-4.9 17 5 34.7 22 39.6s34.7-5 39.6-22l128-448c4.9-17-5-34.7-22-39.6zm64.6 136.1c-12.5 12.5-12.5 32.8 0 45.3l73.4 73.4-73.4 73.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0l96-96c12.5-12.5 12.5-32.8 0-45.3l-96-96c-12.5-12.5-32.8-12.5-45.3 0zm-274.7 0c-12.5-12.5-32.8-12.5-45.3 0l-96 96c-12.5 12.5-12.5 32.8 0 45.3l96 96c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L77.3 256 150.6 182.6c12.5-12.5 12.5-32.8 0-45.3z\"]};var IM={prefix:\"fas\",iconName:\"angle-right\",icon:[256,512,[8250],\"f105\",\"M247.1 233.4c12.5 12.5 12.5 32.8 0 45.3l-160 160c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L179.2 256 41.9 118.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l160 160z\"]};var EhA={prefix:\"fas\",iconName:\"gear\",icon:[512,512,[9881,\"cog\"],\"f013\",\"M195.1 9.5C198.1-5.3 211.2-16 226.4-16l59.8 0c15.2 0 28.3 10.7 31.3 25.5L332 79.5c14.1 6 27.3 13.7 39.3 22.8l67.8-22.5c14.4-4.8 30.2 1.2 37.8 14.4l29.9 51.8c7.6 13.2 4.9 29.8-6.5 39.9L447 233.3c.9 7.4 1.3 15 1.3 22.7s-.5 15.3-1.3 22.7l53.4 47.5c11.4 10.1 14 26.8 6.5 39.9l-29.9 51.8c-7.6 13.1-23.4 19.2-37.8 14.4l-67.8-22.5c-12.1 9.1-25.3 16.7-39.3 22.8l-14.4 69.9c-3.1 14.9-16.2 25.5-31.3 25.5l-59.8 0c-15.2 0-28.3-10.7-31.3-25.5l-14.4-69.9c-14.1-6-27.2-13.7-39.3-22.8L73.5 432.3c-14.4 4.8-30.2-1.2-37.8-14.4L5.8 366.1c-7.6-13.2-4.9-29.8 6.5-39.9l53.4-47.5c-.9-7.4-1.3-15-1.3-22.7s.5-15.3 1.3-22.7L12.3 185.8c-11.4-10.1-14-26.8-6.5-39.9L35.7 94.1c7.6-13.2 23.4-19.2 37.8-14.4l67.8 22.5c12.1-9.1 25.3-16.7 39.3-22.8L195.1 9.5zM256.3 336a80 80 0 1 0 -.6-160 80 80 0 1 0 .6 160z\"]},ZO=EhA;var XO={prefix:\"fas\",iconName:\"up-right-and-down-left-from-center\",icon:[512,512,[\"expand-alt\"],\"f424\",\"M344 0L488 0c13.3 0 24 10.7 24 24l0 144c0 9.7-5.8 18.5-14.8 22.2s-19.3 1.7-26.2-5.2l-39-39-87 87c-9.4 9.4-24.6 9.4-33.9 0l-32-32c-9.4-9.4-9.4-24.6 0-33.9l87-87-39-39c-6.9-6.9-8.9-17.2-5.2-26.2S334.3 0 344 0zM168 512L24 512c-13.3 0-24-10.7-24-24L0 344c0-9.7 5.8-18.5 14.8-22.2S34.1 320.2 41 327l39 39 87-87c9.4-9.4 24.6-9.4 33.9 0l32 32c9.4 9.4 9.4 24.6 0 33.9l-87 87 39 39c6.9 6.9 8.9 17.2 5.2 26.2S177.7 512 168 512z\"]};var P0={prefix:\"fas\",iconName:\"wrench\",icon:[576,512,[128295],\"f0ad\",\"M509.4 98.6c7.6-7.6 20.3-5.7 24.1 4.3 6.8 17.7 10.5 37 10.5 57.1 0 88.4-71.6 160-160 160-17.5 0-34.4-2.8-50.2-8L146.9 498.9c-28.1 28.1-73.7 28.1-101.8 0s-28.1-73.7 0-101.8L232 210.2c-5.2-15.8-8-32.6-8-50.2 0-88.4 71.6-160 160-160 20.1 0 39.4 3.7 57.1 10.5 10 3.8 11.8 16.5 4.3 24.1l-88.7 88.7c-3 3-4.7 7.1-4.7 11.3l0 41.4c0 8.8 7.2 16 16 16l41.4 0c4.2 0 8.3-1.7 11.3-4.7l88.7-88.7z\"]},s8={prefix:\"fas\",iconName:\"trash-can\",icon:[448,512,[61460,\"trash-alt\"],\"f2ed\",\"M136.7 5.9C141.1-7.2 153.3-16 167.1-16l113.9 0c13.8 0 26 8.8 30.4 21.9L320 32 416 32c17.7 0 32 14.3 32 32s-14.3 32-32 32L32 96C14.3 96 0 81.7 0 64S14.3 32 32 32l96 0 8.7-26.1zM32 144l384 0 0 304c0 35.3-28.7 64-64 64L96 512c-35.3 0-64-28.7-64-64l0-304zm88 64c-13.3 0-24 10.7-24 24l0 192c0 13.3 10.7 24 24 24s24-10.7 24-24l0-192c0-13.3-10.7-24-24-24zm104 0c-13.3 0-24 10.7-24 24l0 192c0 13.3 10.7 24 24 24s24-10.7 24-24l0-192c0-13.3-10.7-24-24-24zm104 0c-13.3 0-24 10.7-24 24l0 192c0 13.3 10.7 24 24 24s24-10.7 24-24l0-192c0-13.3-10.7-24-24-24z\"]};var g8={prefix:\"fas\",iconName:\"check\",icon:[448,512,[10003,10004],\"f00c\",\"M434.8 70.1c14.3 10.4 17.5 30.4 7.1 44.7l-256 352c-5.5 7.6-14 12.3-23.4 13.1s-18.5-2.7-25.1-9.3l-128-128c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l101.5 101.5 234-321.7c10.4-14.3 30.4-17.5 44.7-7.1z\"]};var $O={prefix:\"fas\",iconName:\"xmark\",icon:[384,512,[128473,10005,10006,10060,215,\"close\",\"multiply\",\"remove\",\"times\"],\"f00d\",\"M55.1 73.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3L147.2 256 9.9 393.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0L192.5 301.3 329.9 438.6c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L237.8 256 375.1 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L192.5 210.7 55.1 73.4z\"]},Az=$O;var q4=$O;var s1={prefix:\"fas\",iconName:\"pen\",icon:[512,512,[128394],\"f304\",\"M352.9 21.2L308 66.1 445.9 204 490.8 159.1C504.4 145.6 512 127.2 512 108s-7.6-37.6-21.2-51.1L455.1 21.2C441.6 7.6 423.2 0 404 0s-37.6 7.6-51.1 21.2zM274.1 100L58.9 315.1c-10.7 10.7-18.5 24.1-22.6 38.7L.9 481.6c-2.3 8.3 0 17.3 6.2 23.4s15.1 8.5 23.4 6.2l127.8-35.5c14.6-4.1 27.9-11.8 38.7-22.6L412 237.9 274.1 100z\"]};var ez={prefix:\"fas\",iconName:\"chevron-down\",icon:[448,512,[],\"f078\",\"M201.4 406.6c12.5 12.5 32.8 12.5 45.3 0l192-192c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L224 338.7 54.6 169.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3l192 192z\"]};var tz={prefix:\"fas\",iconName:\"angle-down\",icon:[384,512,[8964],\"f107\",\"M169.4 374.6c12.5 12.5 32.8 12.5 45.3 0l160-160c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L192 306.7 54.6 169.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3l160 160z\"]};var hhA={prefix:\"fas\",iconName:\"arrow-down-short-wide\",icon:[576,512,[\"sort-amount-desc\",\"sort-amount-down-alt\"],\"f884\",\"M246.6 374.6l-96 96c-12.5 12.5-32.8 12.5-45.3 0l-96-96c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0L96 370.7 96 64c0-17.7 14.3-32 32-32s32 14.3 32 32l0 306.7 41.4-41.4c12.5-12.5 32.8-12.5 45.3 0s12.5 32.8 0 45.3zM320 32l32 0c17.7 0 32 14.3 32 32s-14.3 32-32 32l-32 0c-17.7 0-32-14.3-32-32s14.3-32 32-32zm0 128l96 0c17.7 0 32 14.3 32 32s-14.3 32-32 32l-96 0c-17.7 0-32-14.3-32-32s14.3-32 32-32zm0 128l160 0c17.7 0 32 14.3 32 32s-14.3 32-32 32l-160 0c-17.7 0-32-14.3-32-32s14.3-32 32-32zm0 128l224 0c17.7 0 32 14.3 32 32s-14.3 32-32 32l-224 0c-17.7 0-32-14.3-32-32s14.3-32 32-32z\"]};var V4=hhA;var uhA={prefix:\"fas\",iconName:\"triangle-exclamation\",icon:[512,512,[9888,\"exclamation-triangle\",\"warning\"],\"f071\",\"M256 0c14.7 0 28.2 8.1 35.2 21l216 400c6.7 12.4 6.4 27.4-.8 39.5S486.1 480 472 480L40 480c-14.1 0-27.2-7.4-34.4-19.5s-7.5-27.1-.8-39.5l216-400c7-12.9 20.5-21 35.2-21zm0 352a32 32 0 1 0 0 64 32 32 0 1 0 0-64zm0-192c-18.2 0-32.7 15.5-31.4 33.7l7.4 104c.9 12.5 11.4 22.3 23.9 22.3 12.6 0 23-9.7 23.9-22.3l7.4-104c1.3-18.2-13.1-33.7-31.4-33.7z\"]},v2=uhA;var fhA={prefix:\"fas\",iconName:\"scissors\",icon:[512,512,[9984,9986,9988,\"cut\"],\"f0c4\",\"M192 256l-39.5 39.5c-12.6-4.9-26.2-7.5-40.5-7.5-61.9 0-112 50.1-112 112s50.1 112 112 112 112-50.1 112-112c0-14.3-2.7-27.9-7.5-40.5L499.2 76.8c7.1-7.1 7.1-18.5 0-25.6-28.3-28.3-74.1-28.3-102.4 0L256 192 216.5 152.5c4.9-12.6 7.5-26.2 7.5-40.5 0-61.9-50.1-112-112-112S0 50.1 0 112 50.1 224 112 224c14.3 0 27.9-2.7 40.5-7.5L192 256zm97.9 97.9L396.8 460.8c28.3 28.3 74.1 28.3 102.4 0 7.1-7.1 7.1-18.5 0-25.6l-145.3-145.3-64 64zM64 112a48 48 0 1 1 96 0 48 48 0 1 1 -96 0zm48 240a48 48 0 1 1 0 96 48 48 0 1 1 0-96z\"]},g1=fhA;var W4={prefix:\"fas\",iconName:\"arrow-right-arrow-left\",icon:[512,512,[8644,\"exchange\"],\"f0ec\",\"M502.6 150.6l-96 96c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L402.7 160 32 160c-17.7 0-32-14.3-32-32S14.3 96 32 96l370.7 0-41.4-41.4c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l96 96c12.5 12.5 12.5 32.8 0 45.3zm-397.3 352l-96-96c-12.5-12.5-12.5-32.8 0-45.3l96-96c12.5-12.5 32.8-12.5 45.3 0s12.5 32.8 0 45.3L109.3 352 480 352c17.7 0 32 14.3 32 32s-14.3 32-32 32l-370.7 0 41.4 41.4c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0z\"]};var dM={prefix:\"fas\",iconName:\"caret-up\",icon:[320,512,[],\"f0d8\",\"M140.3 135.2c12.6-10.3 31.1-9.5 42.8 2.2l128 128c9.2 9.2 11.9 22.9 6.9 34.9S301.4 320 288.5 320l-256 0c-12.9 0-24.6-7.8-29.6-19.8S.7 274.5 9.9 265.4l128-128 2.4-2.2z\"]};var iz={prefix:\"fas\",iconName:\"down-left-and-up-right-to-center\",icon:[512,512,[\"compress-alt\"],\"f422\",\"M439.5 7c9.4-9.4 24.6-9.4 33.9 0l32 32c9.4 9.4 9.4 24.6 0 33.9l-87 87 39 39c6.9 6.9 8.9 17.2 5.2 26.2S450.2 240 440.5 240l-144 0c-13.3 0-24-10.7-24-24l0-144c0-9.7 5.8-18.5 14.8-22.2s19.3-1.7 26.2 5.2l39 39 87-87zM72.5 272l144 0c13.3 0 24 10.7 24 24l0 144c0 9.7-5.8 18.5-14.8 22.2s-19.3 1.7-26.2-5.2l-39-39-87 87c-9.4 9.4-24.6 9.4-33.9 0l-32-32c-9.4-9.4-9.4-24.6 0-33.9l87-87-39-39c-6.9-6.9-8.9-17.2-5.2-26.2S62.8 272 72.5 272z\"]};var l1={prefix:\"fas\",iconName:\"plus\",icon:[448,512,[10133,61543,\"add\"],\"2b\",\"M256 64c0-17.7-14.3-32-32-32s-32 14.3-32 32l0 160-160 0c-17.7 0-32 14.3-32 32s14.3 32 32 32l160 0 0 160c0 17.7 14.3 32 32 32s32-14.3 32-32l0-160 160 0c17.7 0 32-14.3 32-32s-14.3-32-32-32l-160 0 0-160z\"]};var j0={prefix:\"fas\",iconName:\"copy\",icon:[448,512,[],\"f0c5\",\"M192 0c-35.3 0-64 28.7-64 64l0 256c0 35.3 28.7 64 64 64l192 0c35.3 0 64-28.7 64-64l0-200.6c0-17.4-7.1-34.1-19.7-46.2L370.6 17.8C358.7 6.4 342.8 0 326.3 0L192 0zM64 128c-35.3 0-64 28.7-64 64L0 448c0 35.3 28.7 64 64 64l192 0c35.3 0 64-28.7 64-64l0-16-64 0 0 16-192 0 0-256 16 0 0-64-16 0z\"]};var mhA={prefix:\"fas\",iconName:\"arrow-rotate-right\",icon:[512,512,[8635,\"arrow-right-rotate\",\"arrow-rotate-forward\",\"redo\"],\"f01e\",\"M436.7 74.7L448 85.4 448 32c0-17.7 14.3-32 32-32s32 14.3 32 32l0 128c0 17.7-14.3 32-32 32l-128 0c-17.7 0-32-14.3-32-32s14.3-32 32-32l47.9 0-7.6-7.2c-.2-.2-.4-.4-.6-.6-75-75-196.5-75-271.5 0s-75 196.5 0 271.5 196.5 75 271.5 0c8.2-8.2 15.5-16.9 21.9-26.1 10.1-14.5 30.1-18 44.6-7.9s18 30.1 7.9 44.6c-8.5 12.2-18.2 23.8-29.1 34.7-100 100-262.1 100-362 0S-25 175 75 75c99.9-99.9 261.7-100 361.7-.3z\"]};var l8=mhA;var qc={prefix:\"fas\",iconName:\"caret-down\",icon:[320,512,[],\"f0d7\",\"M140.3 376.8c12.6 10.2 31.1 9.5 42.8-2.2l128-128c9.2-9.2 11.9-22.9 6.9-34.9S301.4 192 288.5 192l-256 0c-12.9 0-24.6 7.8-29.6 19.8S.7 237.5 9.9 246.6l128 128 2.4 2.2z\"]};var phA={prefix:\"fas\",iconName:\"arrow-rotate-left\",icon:[512,512,[8634,\"arrow-left-rotate\",\"arrow-rotate-back\",\"arrow-rotate-backward\",\"undo\"],\"f0e2\",\"M256 64c-56.8 0-107.9 24.7-143.1 64l47.1 0c17.7 0 32 14.3 32 32s-14.3 32-32 32L32 192c-17.7 0-32-14.3-32-32L0 32C0 14.3 14.3 0 32 0S64 14.3 64 32l0 54.7C110.9 33.6 179.5 0 256 0 397.4 0 512 114.6 512 256S397.4 512 256 512c-87 0-163.9-43.4-210.1-109.7-10.1-14.5-6.6-34.4 7.9-44.6s34.4-6.6 44.6 7.9c34.8 49.8 92.4 82.3 157.6 82.3 106 0 192-86 192-192S362 64 256 64z\"]};var c8=phA;var BM={prefix:\"fas\",iconName:\"square\",icon:[448,512,[9632,9723,9724,61590],\"f0c8\",\"M64 32l320 0c35.3 0 64 28.7 64 64l0 320c0 35.3-28.7 64-64 64L64 480c-35.3 0-64-28.7-64-64L0 96C0 60.7 28.7 32 64 32z\"]};var QM={prefix:\"fas\",iconName:\"arrow-down\",icon:[384,512,[8595],\"f063\",\"M169.4 502.6c12.5 12.5 32.8 12.5 45.3 0l160-160c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L224 402.7 224 32c0-17.7-14.3-32-32-32s-32 14.3-32 32l0 370.7-105.4-105.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3l160 160z\"]};var QZ=rf(az(),1);var rz=Number.isNaN||function(e){return typeof e==\"number\"&&e!==e};function DhA(t,e){return!!(t===e||rz(t)&&rz(e))}function whA(t,e){if(t.length!==e.length)return!1;for(var A=0;A<t.length;A++)if(!DhA(t[A],e[A]))return!1;return!0}function VB(t,e){e===void 0&&(e=whA);var A=null;function i(){for(var n=[],o=0;o<arguments.length;o++)n[o]=arguments[o];if(A&&A.lastThis===this&&e(n,A.lastArgs))return A.lastResult;var a=t.apply(this,n);return A={lastResult:a,lastArgs:n,lastThis:this},a}return i.clear=function(){A=null},i}var cpA=rf(sz(),1);var hM=class{add(e,A,i){if(typeof arguments[0]!=\"string\")for(let n in arguments[0])this.add(n,arguments[0][n],arguments[1]);else(Array.isArray(e)?e:[e]).forEach(function(n){this[n]=this[n]||[],A&&this[n][i?\"unshift\":\"push\"](A)},this)}run(e,A){this[e]=this[e]||[],this[e].forEach(function(i){i.call(A&&A.context?A.context:A,A)})}},uM=class{constructor(e){this.jsep=e,this.registered={}}register(){for(var e=arguments.length,A=new Array(e),i=0;i<e;i++)A[i]=arguments[i];A.forEach(n=>{if(typeof n!=\"object\"||!n.name||!n.init)throw new Error(\"Invalid JSEP plugin format\");this.registered[n.name]||(n.init(this.jsep),this.registered[n.name]=n)})}},Ts=class t{static get version(){return\"1.4.0\"}static toString(){return\"JavaScript Expression Parser (JSEP) v\"+t.version}static addUnaryOp(e){return t.max_unop_len=Math.max(e.length,t.max_unop_len),t.unary_ops[e]=1,t}static addBinaryOp(e,A,i){return t.max_binop_len=Math.max(e.length,t.max_binop_len),t.binary_ops[e]=A,i?t.right_associative.add(e):t.right_associative.delete(e),t}static addIdentifierChar(e){return t.additional_identifier_chars.add(e),t}static addLiteral(e,A){return t.literals[e]=A,t}static removeUnaryOp(e){return delete t.unary_ops[e],e.length===t.max_unop_len&&(t.max_unop_len=t.getMaxKeyLen(t.unary_ops)),t}static removeAllUnaryOps(){return t.unary_ops={},t.max_unop_len=0,t}static removeIdentifierChar(e){return t.additional_identifier_chars.delete(e),t}static removeBinaryOp(e){return delete t.binary_ops[e],e.length===t.max_binop_len&&(t.max_binop_len=t.getMaxKeyLen(t.binary_ops)),t.right_associative.delete(e),t}static removeAllBinaryOps(){return t.binary_ops={},t.max_binop_len=0,t}static removeLiteral(e){return delete t.literals[e],t}static removeAllLiterals(){return t.literals={},t}get char(){return this.expr.charAt(this.index)}get code(){return this.expr.charCodeAt(this.index)}constructor(e){this.expr=e,this.index=0}static parse(e){return new t(e).parse()}static getMaxKeyLen(e){return Math.max(0,...Object.keys(e).map(A=>A.length))}static isDecimalDigit(e){return e>=48&&e<=57}static binaryPrecedence(e){return t.binary_ops[e]||0}static isIdentifierStart(e){return e>=65&&e<=90||e>=97&&e<=122||e>=128&&!t.binary_ops[String.fromCharCode(e)]||t.additional_identifier_chars.has(String.fromCharCode(e))}static isIdentifierPart(e){return t.isIdentifierStart(e)||t.isDecimalDigit(e)}throwError(e){let A=new Error(e+\" at character \"+this.index);throw A.index=this.index,A.description=e,A}runHook(e,A){if(t.hooks[e]){let i={context:this,node:A};return t.hooks.run(e,i),i.node}return A}searchHook(e){if(t.hooks[e]){let A={context:this};return t.hooks[e].find(function(i){return i.call(A.context,A),A.node}),A.node}}gobbleSpaces(){let e=this.code;for(;e===t.SPACE_CODE||e===t.TAB_CODE||e===t.LF_CODE||e===t.CR_CODE;)e=this.expr.charCodeAt(++this.index);this.runHook(\"gobble-spaces\")}parse(){this.runHook(\"before-all\");let e=this.gobbleExpressions(),A=e.length===1?e[0]:{type:t.COMPOUND,body:e};return this.runHook(\"after-all\",A)}gobbleExpressions(e){let A=[],i,n;for(;this.index<this.expr.length;)if(i=this.code,i===t.SEMCOL_CODE||i===t.COMMA_CODE)this.index++;else if(n=this.gobbleExpression())A.push(n);else if(this.index<this.expr.length){if(i===e)break;this.throwError('Unexpected \"'+this.char+'\"')}return A}gobbleExpression(){let e=this.searchHook(\"gobble-expression\")||this.gobbleBinaryExpression();return this.gobbleSpaces(),this.runHook(\"after-expression\",e)}gobbleBinaryOp(){this.gobbleSpaces();let e=this.expr.substr(this.index,t.max_binop_len),A=e.length;for(;A>0;){if(t.binary_ops.hasOwnProperty(e)&&(!t.isIdentifierStart(this.code)||this.index+e.length<this.expr.length&&!t.isIdentifierPart(this.expr.charCodeAt(this.index+e.length))))return this.index+=A,e;e=e.substr(0,--A)}return!1}gobbleBinaryExpression(){let e,A,i,n,o,a,r,s,g;if(a=this.gobbleToken(),!a||(A=this.gobbleBinaryOp(),!A))return a;for(o={value:A,prec:t.binaryPrecedence(A),right_a:t.right_associative.has(A)},r=this.gobbleToken(),r||this.throwError(\"Expected expression after \"+A),n=[a,o,r];A=this.gobbleBinaryOp();){if(i=t.binaryPrecedence(A),i===0){this.index-=A.length;break}o={value:A,prec:i,right_a:t.right_associative.has(A)},g=A;let l=C=>o.right_a&&C.right_a?i>C.prec:i<=C.prec;for(;n.length>2&&l(n[n.length-2]);)r=n.pop(),A=n.pop().value,a=n.pop(),e={type:t.BINARY_EXP,operator:A,left:a,right:r},n.push(e);e=this.gobbleToken(),e||this.throwError(\"Expected expression after \"+g),n.push(o,e)}for(s=n.length-1,e=n[s];s>1;)e={type:t.BINARY_EXP,operator:n[s-1].value,left:n[s-2],right:e},s-=2;return e}gobbleToken(){let e,A,i,n;if(this.gobbleSpaces(),n=this.searchHook(\"gobble-token\"),n)return this.runHook(\"after-token\",n);if(e=this.code,t.isDecimalDigit(e)||e===t.PERIOD_CODE)return this.gobbleNumericLiteral();if(e===t.SQUOTE_CODE||e===t.DQUOTE_CODE)n=this.gobbleStringLiteral();else if(e===t.OBRACK_CODE)n=this.gobbleArray();else{for(A=this.expr.substr(this.index,t.max_unop_len),i=A.length;i>0;){if(t.unary_ops.hasOwnProperty(A)&&(!t.isIdentifierStart(this.code)||this.index+A.length<this.expr.length&&!t.isIdentifierPart(this.expr.charCodeAt(this.index+A.length)))){this.index+=i;let o=this.gobbleToken();return o||this.throwError(\"missing unaryOp argument\"),this.runHook(\"after-token\",{type:t.UNARY_EXP,operator:A,argument:o,prefix:!0})}A=A.substr(0,--i)}t.isIdentifierStart(e)?(n=this.gobbleIdentifier(),t.literals.hasOwnProperty(n.name)?n={type:t.LITERAL,value:t.literals[n.name],raw:n.name}:n.name===t.this_str&&(n={type:t.THIS_EXP})):e===t.OPAREN_CODE&&(n=this.gobbleGroup())}return n?(n=this.gobbleTokenProperty(n),this.runHook(\"after-token\",n)):this.runHook(\"after-token\",!1)}gobbleTokenProperty(e){this.gobbleSpaces();let A=this.code;for(;A===t.PERIOD_CODE||A===t.OBRACK_CODE||A===t.OPAREN_CODE||A===t.QUMARK_CODE;){let i;if(A===t.QUMARK_CODE){if(this.expr.charCodeAt(this.index+1)!==t.PERIOD_CODE)break;i=!0,this.index+=2,this.gobbleSpaces(),A=this.code}this.index++,A===t.OBRACK_CODE?(e={type:t.MEMBER_EXP,computed:!0,object:e,property:this.gobbleExpression()},e.property||this.throwError('Unexpected \"'+this.char+'\"'),this.gobbleSpaces(),A=this.code,A!==t.CBRACK_CODE&&this.throwError(\"Unclosed [\"),this.index++):A===t.OPAREN_CODE?e={type:t.CALL_EXP,arguments:this.gobbleArguments(t.CPAREN_CODE),callee:e}:(A===t.PERIOD_CODE||i)&&(i&&this.index--,this.gobbleSpaces(),e={type:t.MEMBER_EXP,computed:!1,object:e,property:this.gobbleIdentifier()}),i&&(e.optional=!0),this.gobbleSpaces(),A=this.code}return e}gobbleNumericLiteral(){let e=\"\",A,i;for(;t.isDecimalDigit(this.code);)e+=this.expr.charAt(this.index++);if(this.code===t.PERIOD_CODE)for(e+=this.expr.charAt(this.index++);t.isDecimalDigit(this.code);)e+=this.expr.charAt(this.index++);if(A=this.char,A===\"e\"||A===\"E\"){for(e+=this.expr.charAt(this.index++),A=this.char,(A===\"+\"||A===\"-\")&&(e+=this.expr.charAt(this.index++));t.isDecimalDigit(this.code);)e+=this.expr.charAt(this.index++);t.isDecimalDigit(this.expr.charCodeAt(this.index-1))||this.throwError(\"Expected exponent (\"+e+this.char+\")\")}return i=this.code,t.isIdentifierStart(i)?this.throwError(\"Variable names cannot start with a number (\"+e+this.char+\")\"):(i===t.PERIOD_CODE||e.length===1&&e.charCodeAt(0)===t.PERIOD_CODE)&&this.throwError(\"Unexpected period\"),{type:t.LITERAL,value:parseFloat(e),raw:e}}gobbleStringLiteral(){let e=\"\",A=this.index,i=this.expr.charAt(this.index++),n=!1;for(;this.index<this.expr.length;){let o=this.expr.charAt(this.index++);if(o===i){n=!0;break}else if(o===\"\\\\\")switch(o=this.expr.charAt(this.index++),o){case\"n\":e+=`\n`;break;case\"r\":e+=\"\\r\";break;case\"t\":e+=\"\t\";break;case\"b\":e+=\"\\b\";break;case\"f\":e+=\"\\f\";break;case\"v\":e+=\"\\v\";break;default:e+=o}else e+=o}return n||this.throwError('Unclosed quote after \"'+e+'\"'),{type:t.LITERAL,value:e,raw:this.expr.substring(A,this.index)}}gobbleIdentifier(){let e=this.code,A=this.index;for(t.isIdentifierStart(e)?this.index++:this.throwError(\"Unexpected \"+this.char);this.index<this.expr.length&&(e=this.code,t.isIdentifierPart(e));)this.index++;return{type:t.IDENTIFIER,name:this.expr.slice(A,this.index)}}gobbleArguments(e){let A=[],i=!1,n=0;for(;this.index<this.expr.length;){this.gobbleSpaces();let o=this.code;if(o===e){i=!0,this.index++,e===t.CPAREN_CODE&&n&&n>=A.length&&this.throwError(\"Unexpected token \"+String.fromCharCode(e));break}else if(o===t.COMMA_CODE){if(this.index++,n++,n!==A.length){if(e===t.CPAREN_CODE)this.throwError(\"Unexpected token ,\");else if(e===t.CBRACK_CODE)for(let a=A.length;a<n;a++)A.push(null)}}else if(A.length!==n&&n!==0)this.throwError(\"Expected comma\");else{let a=this.gobbleExpression();(!a||a.type===t.COMPOUND)&&this.throwError(\"Expected comma\"),A.push(a)}}return i||this.throwError(\"Expected \"+String.fromCharCode(e)),A}gobbleGroup(){this.index++;let e=this.gobbleExpressions(t.CPAREN_CODE);if(this.code===t.CPAREN_CODE)return this.index++,e.length===1?e[0]:e.length?{type:t.SEQUENCE_EXP,expressions:e}:!1;this.throwError(\"Unclosed (\")}gobbleArray(){return this.index++,{type:t.ARRAY_EXP,elements:this.gobbleArguments(t.CBRACK_CODE)}}},yhA=new hM;Object.assign(Ts,{hooks:yhA,plugins:new uM(Ts),COMPOUND:\"Compound\",SEQUENCE_EXP:\"SequenceExpression\",IDENTIFIER:\"Identifier\",MEMBER_EXP:\"MemberExpression\",LITERAL:\"Literal\",THIS_EXP:\"ThisExpression\",CALL_EXP:\"CallExpression\",UNARY_EXP:\"UnaryExpression\",BINARY_EXP:\"BinaryExpression\",ARRAY_EXP:\"ArrayExpression\",TAB_CODE:9,LF_CODE:10,CR_CODE:13,SPACE_CODE:32,PERIOD_CODE:46,COMMA_CODE:44,SQUOTE_CODE:39,DQUOTE_CODE:34,OPAREN_CODE:40,CPAREN_CODE:41,OBRACK_CODE:91,CBRACK_CODE:93,QUMARK_CODE:63,SEMCOL_CODE:59,COLON_CODE:58,unary_ops:{\"-\":1,\"!\":1,\"~\":1,\"+\":1},binary_ops:{\"||\":1,\"??\":1,\"&&\":2,\"|\":3,\"^\":4,\"&\":5,\"==\":6,\"!=\":6,\"===\":6,\"!==\":6,\"<\":7,\">\":7,\"<=\":7,\">=\":7,\"<<\":8,\">>\":8,\">>>\":8,\"+\":9,\"-\":9,\"*\":10,\"/\":10,\"%\":10,\"**\":11},right_associative:new Set([\"**\"]),additional_identifier_chars:new Set([\"$\",\"_\"]),literals:{true:!0,false:!1,null:null},this_str:\"this\"});Ts.max_unop_len=Ts.getMaxKeyLen(Ts.unary_ops);Ts.max_binop_len=Ts.getMaxKeyLen(Ts.binary_ops);var Vc=t=>new Ts(t).parse(),vhA=Object.getOwnPropertyNames(class{});Object.getOwnPropertyNames(Ts).filter(t=>!vhA.includes(t)&&Vc[t]===void 0).forEach(t=>{Vc[t]=Ts[t]});Vc.Jsep=Ts;var bhA=\"ConditionalExpression\",MhA={name:\"ternary\",init(t){t.hooks.add(\"after-expression\",function(A){if(A.node&&this.code===t.QUMARK_CODE){this.index++;let i=A.node,n=this.gobbleExpression();if(n||this.throwError(\"Expected expression\"),this.gobbleSpaces(),this.code===t.COLON_CODE){this.index++;let o=this.gobbleExpression();if(o||this.throwError(\"Expected expression\"),A.node={type:bhA,test:i,consequent:n,alternate:o},i.operator&&t.binary_ops[i.operator]<=.9){let a=i;for(;a.right.operator&&t.binary_ops[a.right.operator]<=.9;)a=a.right;A.node.test=a.right,a.right=A.node,A.node=i}}else this.throwError(\"Expected :\")}})}};Vc.plugins.register(MhA);var gz=47,khA=92,ShA={name:\"regex\",init(t){t.hooks.add(\"gobble-token\",function(A){if(this.code===gz){let i=++this.index,n=!1;for(;this.index<this.expr.length;){if(this.code===gz&&!n){let o=this.expr.slice(i,this.index),a=\"\";for(;++this.index<this.expr.length;){let s=this.code;if(s>=97&&s<=122||s>=65&&s<=90||s>=48&&s<=57)a+=this.char;else break}let r;try{r=new RegExp(o,a)}catch(s){this.throwError(s.message)}return A.node={type:t.LITERAL,value:r,raw:this.expr.slice(i-1,this.index)},A.node=this.gobbleTokenProperty(A.node),A.node}this.code===t.OBRACK_CODE?n=!0:n&&this.code===t.CBRACK_CODE&&(n=!1),this.index+=this.code===khA?2:1}this.throwError(\"Unclosed Regex\")}})}},EM=43,xhA=45,WB={name:\"assignment\",assignmentOperators:new Set([\"=\",\"*=\",\"**=\",\"/=\",\"%=\",\"+=\",\"-=\",\"<<=\",\">>=\",\">>>=\",\"&=\",\"^=\",\"|=\",\"||=\",\"&&=\",\"??=\"]),updateOperators:[EM,xhA],assignmentPrecedence:.9,init(t){let e=[t.IDENTIFIER,t.MEMBER_EXP];WB.assignmentOperators.forEach(i=>t.addBinaryOp(i,WB.assignmentPrecedence,!0)),t.hooks.add(\"gobble-token\",function(n){let o=this.code;WB.updateOperators.some(a=>a===o&&a===this.expr.charCodeAt(this.index+1))&&(this.index+=2,n.node={type:\"UpdateExpression\",operator:o===EM?\"++\":\"--\",argument:this.gobbleTokenProperty(this.gobbleIdentifier()),prefix:!0},(!n.node.argument||!e.includes(n.node.argument.type))&&this.throwError(`Unexpected ${n.node.operator}`))}),t.hooks.add(\"after-token\",function(n){if(n.node){let o=this.code;WB.updateOperators.some(a=>a===o&&a===this.expr.charCodeAt(this.index+1))&&(e.includes(n.node.type)||this.throwError(`Unexpected ${n.node.operator}`),this.index+=2,n.node={type:\"UpdateExpression\",operator:o===EM?\"++\":\"--\",argument:n.node,prefix:!1})}}),t.hooks.add(\"after-expression\",function(n){n.node&&A(n.node)});function A(i){WB.assignmentOperators.has(i.operator)?(i.type=\"AssignmentExpression\",A(i.left),A(i.right)):i.operator||Object.values(i).forEach(n=>{n&&typeof n==\"object\"&&A(n)})}}};Vc.plugins.register(ShA,WB);Vc.addUnaryOp(\"typeof\");Vc.addUnaryOp(\"void\");Vc.addLiteral(\"null\",null);Vc.addLiteral(\"undefined\",void 0);var RhA=new Set([\"constructor\",\"__proto__\",\"__defineGetter__\",\"__defineSetter__\",\"__lookupGetter__\",\"__lookupSetter__\"]),Eo={evalAst(t,e){switch(t.type){case\"BinaryExpression\":case\"LogicalExpression\":return Eo.evalBinaryExpression(t,e);case\"Compound\":return Eo.evalCompound(t,e);case\"ConditionalExpression\":return Eo.evalConditionalExpression(t,e);case\"Identifier\":return Eo.evalIdentifier(t,e);case\"Literal\":return Eo.evalLiteral(t,e);case\"MemberExpression\":return Eo.evalMemberExpression(t,e);case\"UnaryExpression\":return Eo.evalUnaryExpression(t,e);case\"ArrayExpression\":return Eo.evalArrayExpression(t,e);case\"CallExpression\":return Eo.evalCallExpression(t,e);case\"AssignmentExpression\":return Eo.evalAssignmentExpression(t,e);default:throw SyntaxError(\"Unexpected expression\",t)}},evalBinaryExpression(t,e){return{\"||\":(i,n)=>i||n(),\"&&\":(i,n)=>i&&n(),\"|\":(i,n)=>i|n(),\"^\":(i,n)=>i^n(),\"&\":(i,n)=>i&n(),\"==\":(i,n)=>i==n(),\"!=\":(i,n)=>i!=n(),\"===\":(i,n)=>i===n(),\"!==\":(i,n)=>i!==n(),\"<\":(i,n)=>i<n(),\">\":(i,n)=>i>n(),\"<=\":(i,n)=>i<=n(),\">=\":(i,n)=>i>=n(),\"<<\":(i,n)=>i<<n(),\">>\":(i,n)=>i>>n(),\">>>\":(i,n)=>i>>>n(),\"+\":(i,n)=>i+n(),\"-\":(i,n)=>i-n(),\"*\":(i,n)=>i*n(),\"/\":(i,n)=>i/n(),\"%\":(i,n)=>i%n()}[t.operator](Eo.evalAst(t.left,e),()=>Eo.evalAst(t.right,e))},evalCompound(t,e){let A;for(let i=0;i<t.body.length;i++){t.body[i].type===\"Identifier\"&&[\"var\",\"let\",\"const\"].includes(t.body[i].name)&&t.body[i+1]&&t.body[i+1].type===\"AssignmentExpression\"&&(i+=1);let n=t.body[i];A=Eo.evalAst(n,e)}return A},evalConditionalExpression(t,e){return Eo.evalAst(t.test,e)?Eo.evalAst(t.consequent,e):Eo.evalAst(t.alternate,e)},evalIdentifier(t,e){if(Object.hasOwn(e,t.name))return e[t.name];throw ReferenceError(`${t.name} is not defined`)},evalLiteral(t){return t.value},evalMemberExpression(t,e){let A=String(t.computed?Eo.evalAst(t.property):t.property.name),i=Eo.evalAst(t.object,e);if(i==null)throw TypeError(`Cannot read properties of ${i} (reading '${A}')`);if(!Object.hasOwn(i,A)&&RhA.has(A))throw TypeError(`Cannot read properties of ${i} (reading '${A}')`);let n=i[A];return typeof n==\"function\"?n.bind(i):n},evalUnaryExpression(t,e){return{\"-\":i=>-Eo.evalAst(i,e),\"!\":i=>!Eo.evalAst(i,e),\"~\":i=>~Eo.evalAst(i,e),\"+\":i=>+Eo.evalAst(i,e),typeof:i=>typeof Eo.evalAst(i,e),void:i=>{Eo.evalAst(i,e)}}[t.operator](t.argument)},evalArrayExpression(t,e){return t.elements.map(A=>Eo.evalAst(A,e))},evalCallExpression(t,e){let A=t.arguments.map(n=>Eo.evalAst(n,e)),i=Eo.evalAst(t.callee,e);if(i===Function)throw new Error(\"Function constructor is disabled\");return i(...A)},evalAssignmentExpression(t,e){if(t.left.type!==\"Identifier\")throw SyntaxError(\"Invalid left-hand side in assignment\");let A=t.left.name,i=Eo.evalAst(t.right,e);return e[A]=i,e[A]}},fM=class{constructor(e){this.code=e,this.ast=Vc(this.code)}runInNewContext(e){let A=Object.assign(Object.create(null),e);return Eo.evalAst(this.ast,A)}};function b2(t,e){return t=t.slice(),t.push(e),t}function mM(t,e){return e=e.slice(),e.unshift(t),e}var pM=class extends Error{constructor(e){super('JSONPath should not be called with \"new\" (it prevents return of (unwrapped) scalar values)'),this.avoidNew=!0,this.value=e,this.name=\"NewError\"}};function On(t,e,A,i,n){if(!(this instanceof On))try{return new On(t,e,A,i,n)}catch(a){if(!a.avoidNew)throw a;return a.value}typeof t==\"string\"&&(n=i,i=A,A=e,e=t,t=null);let o=t&&typeof t==\"object\";if(t=t||{},this.json=t.json||A,this.path=t.path||e,this.resultType=t.resultType||\"value\",this.flatten=t.flatten||!1,this.wrap=Object.hasOwn(t,\"wrap\")?t.wrap:!0,this.sandbox=t.sandbox||{},this.eval=t.eval===void 0?\"safe\":t.eval,this.ignoreEvalErrors=typeof t.ignoreEvalErrors>\"u\"?!1:t.ignoreEvalErrors,this.parent=t.parent||null,this.parentProperty=t.parentProperty||null,this.callback=t.callback||i||null,this.otherTypeCallback=t.otherTypeCallback||n||function(){throw new TypeError(\"You must supply an otherTypeCallback callback option with the @other() operator.\")},t.autostart!==!1){let a={path:o?t.path:e};o?\"json\"in t&&(a.json=t.json):a.json=A;let r=this.evaluate(a);if(!r||typeof r!=\"object\")throw new pM(r);return r}}On.prototype.evaluate=function(t,e,A,i){let n=this.parent,o=this.parentProperty,{flatten:a,wrap:r}=this;if(this.currResultType=this.resultType,this.currEval=this.eval,this.currSandbox=this.sandbox,A=A||this.callback,this.currOtherTypeCallback=i||this.otherTypeCallback,e=e||this.json,t=t||this.path,t&&typeof t==\"object\"&&!Array.isArray(t)){if(!t.path&&t.path!==\"\")throw new TypeError('You must supply a \"path\" property when providing an object argument to JSONPath.evaluate().');if(!Object.hasOwn(t,\"json\"))throw new TypeError('You must supply a \"json\" property when providing an object argument to JSONPath.evaluate().');({json:e}=t),a=Object.hasOwn(t,\"flatten\")?t.flatten:a,this.currResultType=Object.hasOwn(t,\"resultType\")?t.resultType:this.currResultType,this.currSandbox=Object.hasOwn(t,\"sandbox\")?t.sandbox:this.currSandbox,r=Object.hasOwn(t,\"wrap\")?t.wrap:r,this.currEval=Object.hasOwn(t,\"eval\")?t.eval:this.currEval,A=Object.hasOwn(t,\"callback\")?t.callback:A,this.currOtherTypeCallback=Object.hasOwn(t,\"otherTypeCallback\")?t.otherTypeCallback:this.currOtherTypeCallback,n=Object.hasOwn(t,\"parent\")?t.parent:n,o=Object.hasOwn(t,\"parentProperty\")?t.parentProperty:o,t=t.path}if(n=n||null,o=o||null,Array.isArray(t)&&(t=On.toPathString(t)),!t&&t!==\"\"||!e)return;let s=On.toPathArray(t);s[0]===\"$\"&&s.length>1&&s.shift(),this._hasParentSelector=null;let g=this._trace(s,e,[\"$\"],n,o,A).filter(function(l){return l&&!l.isParentSelector});return g.length?!r&&g.length===1&&!g[0].hasArrExpr?this._getPreferredOutput(g[0]):g.reduce((l,C)=>{let I=this._getPreferredOutput(C);return a&&Array.isArray(I)?l=l.concat(I):l.push(I),l},[]):r?[]:void 0};On.prototype._getPreferredOutput=function(t){let e=this.currResultType;switch(e){case\"all\":{let A=Array.isArray(t.path)?t.path:On.toPathArray(t.path);return t.pointer=On.toPointer(A),t.path=typeof t.path==\"string\"?t.path:On.toPathString(t.path),t}case\"value\":case\"parent\":case\"parentProperty\":return t[e];case\"path\":return On.toPathString(t[e]);case\"pointer\":return On.toPointer(t.path);default:throw new TypeError(\"Unknown result type\")}};On.prototype._handleCallback=function(t,e,A){if(e){let i=this._getPreferredOutput(t);t.path=typeof t.path==\"string\"?t.path:On.toPathString(t.path),e(i,A,t)}};On.prototype._trace=function(t,e,A,i,n,o,a,r){let s;if(!t.length)return s={path:A,value:e,parent:i,parentProperty:n,hasArrExpr:a},this._handleCallback(s,o,\"value\"),s;let g=t[0],l=t.slice(1),C=[];function I(d){Array.isArray(d)?d.forEach(B=>{C.push(B)}):C.push(d)}if((typeof g!=\"string\"||r)&&e&&Object.hasOwn(e,g))I(this._trace(l,e[g],b2(A,g),e,g,o,a));else if(g===\"*\")this._walk(e,d=>{I(this._trace(l,e[d],b2(A,d),e,d,o,!0,!0))});else if(g===\"..\")I(this._trace(l,e,A,i,n,o,a)),this._walk(e,d=>{typeof e[d]==\"object\"&&I(this._trace(t.slice(),e[d],b2(A,d),e,d,o,!0))});else{if(g===\"^\")return this._hasParentSelector=!0,{path:A.slice(0,-1),expr:l,isParentSelector:!0};if(g===\"~\")return s={path:b2(A,g),value:n,parent:i,parentProperty:null},this._handleCallback(s,o,\"property\"),s;if(g===\"$\")I(this._trace(l,e,A,null,null,o,a));else if(/^(-?\\d*):(-?\\d*):?(\\d*)$/u.test(g))I(this._slice(g,l,e,A,i,n,o));else if(g.indexOf(\"?(\")===0){if(this.currEval===!1)throw new Error(\"Eval [?(expr)] prevented in JSONPath expression.\");let d=g.replace(/^\\?\\((.*?)\\)$/u,\"$1\"),B=/@.?([^?]*)[['](\\??\\(.*?\\))(?!.\\)\\])[\\]']/gu.exec(d);B?this._walk(e,Q=>{let E=[B[2]],f=B[1]?e[Q][B[1]]:e[Q];this._trace(E,f,A,i,n,o,!0).length>0&&I(this._trace(l,e[Q],b2(A,Q),e,Q,o,!0))}):this._walk(e,Q=>{this._eval(d,e[Q],Q,A,i,n)&&I(this._trace(l,e[Q],b2(A,Q),e,Q,o,!0))})}else if(g[0]===\"(\"){if(this.currEval===!1)throw new Error(\"Eval [(expr)] prevented in JSONPath expression.\");I(this._trace(mM(this._eval(g,e,A.at(-1),A.slice(0,-1),i,n),l),e,A,i,n,o,a))}else if(g[0]===\"@\"){let d=!1,B=g.slice(1,-2);switch(B){case\"scalar\":(!e||![\"object\",\"function\"].includes(typeof e))&&(d=!0);break;case\"boolean\":case\"string\":case\"undefined\":case\"function\":typeof e===B&&(d=!0);break;case\"integer\":Number.isFinite(e)&&!(e%1)&&(d=!0);break;case\"number\":Number.isFinite(e)&&(d=!0);break;case\"nonFinite\":typeof e==\"number\"&&!Number.isFinite(e)&&(d=!0);break;case\"object\":e&&typeof e===B&&(d=!0);break;case\"array\":Array.isArray(e)&&(d=!0);break;case\"other\":d=this.currOtherTypeCallback(e,A,i,n);break;case\"null\":e===null&&(d=!0);break;default:throw new TypeError(\"Unknown value type \"+B)}if(d)return s={path:A,value:e,parent:i,parentProperty:n},this._handleCallback(s,o,\"value\"),s}else if(g[0]===\"`\"&&e&&Object.hasOwn(e,g.slice(1))){let d=g.slice(1);I(this._trace(l,e[d],b2(A,d),e,d,o,a,!0))}else if(g.includes(\",\")){let d=g.split(\",\");for(let B of d)I(this._trace(mM(B,l),e,A,i,n,o,!0))}else!r&&e&&Object.hasOwn(e,g)&&I(this._trace(l,e[g],b2(A,g),e,g,o,a,!0))}if(this._hasParentSelector)for(let d=0;d<C.length;d++){let B=C[d];if(B&&B.isParentSelector){let Q=this._trace(B.expr,e,B.path,i,n,o,a);if(Array.isArray(Q)){C[d]=Q[0];let E=Q.length;for(let f=1;f<E;f++)d++,C.splice(d,0,Q[f])}else C[d]=Q}}return C};On.prototype._walk=function(t,e){if(Array.isArray(t)){let A=t.length;for(let i=0;i<A;i++)e(i)}else t&&typeof t==\"object\"&&Object.keys(t).forEach(A=>{e(A)})};On.prototype._slice=function(t,e,A,i,n,o,a){if(!Array.isArray(A))return;let r=A.length,s=t.split(\":\"),g=s[2]&&Number.parseInt(s[2])||1,l=s[0]&&Number.parseInt(s[0])||0,C=s[1]&&Number.parseInt(s[1])||r;l=l<0?Math.max(0,l+r):Math.min(r,l),C=C<0?Math.max(0,C+r):Math.min(r,C);let I=[];for(let d=l;d<C;d+=g)this._trace(mM(d,e),A,i,n,o,a,!0).forEach(Q=>{I.push(Q)});return I};On.prototype._eval=function(t,e,A,i,n,o){this.currSandbox._$_parentProperty=o,this.currSandbox._$_parent=n,this.currSandbox._$_property=A,this.currSandbox._$_root=this.json,this.currSandbox._$_v=e;let a=t.includes(\"@path\");a&&(this.currSandbox._$_path=On.toPathString(i.concat([A])));let r=this.currEval+\"Script:\"+t;if(!On.cache[r]){let s=t.replaceAll(\"@parentProperty\",\"_$_parentProperty\").replaceAll(\"@parent\",\"_$_parent\").replaceAll(\"@property\",\"_$_property\").replaceAll(\"@root\",\"_$_root\").replaceAll(/@([.\\s)[])/gu,\"_$_v$1\");if(a&&(s=s.replaceAll(\"@path\",\"_$_path\")),this.currEval===\"safe\"||this.currEval===!0||this.currEval===void 0)On.cache[r]=new this.safeVm.Script(s);else if(this.currEval===\"native\")On.cache[r]=new this.vm.Script(s);else if(typeof this.currEval==\"function\"&&this.currEval.prototype&&Object.hasOwn(this.currEval.prototype,\"runInNewContext\")){let g=this.currEval;On.cache[r]=new g(s)}else if(typeof this.currEval==\"function\")On.cache[r]={runInNewContext:g=>this.currEval(s,g)};else throw new TypeError(`Unknown \"eval\" property \"${this.currEval}\"`)}try{return On.cache[r].runInNewContext(this.currSandbox)}catch(s){if(this.ignoreEvalErrors)return!1;throw new Error(\"jsonPath: \"+s.message+\": \"+t)}};On.cache={};On.toPathString=function(t){let e=t,A=e.length,i=\"$\";for(let n=1;n<A;n++)/^(~|\\^|@.*?\\(\\))$/u.test(e[n])||(i+=/^[0-9*]+$/u.test(e[n])?\"[\"+e[n]+\"]\":\"['\"+e[n]+\"']\");return i};On.toPointer=function(t){let e=t,A=e.length,i=\"\";for(let n=1;n<A;n++)/^(~|\\^|@.*?\\(\\))$/u.test(e[n])||(i+=\"/\"+e[n].toString().replaceAll(\"~\",\"~0\").replaceAll(\"/\",\"~1\"));return i};On.toPathArray=function(t){let{cache:e}=On;if(e[t])return e[t].concat();let A=[],n=t.replaceAll(/@(?:null|boolean|number|string|integer|undefined|nonFinite|scalar|array|object|function|other)\\(\\)/gu,\";$&;\").replaceAll(/[['](\\??\\(.*?\\))[\\]'](?!.\\])/gu,function(o,a){return\"[#\"+(A.push(a)-1)+\"]\"}).replaceAll(/\\[['\"]([^'\\]]*)['\"]\\]/gu,function(o,a){return\"['\"+a.replaceAll(\".\",\"%@%\").replaceAll(\"~\",\"%%@@%%\")+\"']\"}).replaceAll(\"~\",\";~;\").replaceAll(/['\"]?\\.['\"]?(?![^[]*\\])|\\[['\"]?/gu,\";\").replaceAll(\"%@%\",\".\").replaceAll(\"%%@@%%\",\"~\").replaceAll(/(?:;)?(\\^+)(?:;)?/gu,function(o,a){return\";\"+a.split(\"\").join(\";\")+\";\"}).replaceAll(/;;;|;;/gu,\";..;\").replaceAll(/;$|'?\\]|'$/gu,\"\").split(\";\").map(function(o){let a=o.match(/#(\\d+)/u);return!a||!a[1]?o:A[a[1]]});return e[t]=n,e[t].concat()};On.prototype.safeVm={Script:fM};var NhA=function(t,e,A){let i=t.length;for(let n=0;n<i;n++){let o=t[n];A(o)&&e.push(t.splice(n--,1)[0])}},DM=class{constructor(e){this.code=e}runInNewContext(e){let A=this.code,i=Object.keys(e),n=[];NhA(i,n,g=>typeof e[g]==\"function\");let o=i.map(g=>e[g]);A=n.reduce((g,l)=>{let C=e[l].toString();return/function/u.test(C)||(C=\"function \"+C),\"var \"+l+\"=\"+C+\";\"+g},\"\")+A,!/(['\"])use strict\\1/u.test(A)&&!i.includes(\"arguments\")&&(A=\"var arguments = undefined;\"+A),A=A.replace(/;\\s*$/u,\"\");let r=A.lastIndexOf(\";\"),s=r!==-1?A.slice(0,r+1)+\" return \"+A.slice(r+1):\" return \"+A;return new Function(...i,s)(...o)}};On.prototype.vm={Script:DM};var yM=[],Iz=[];(()=>{let t=\"lc,34,7n,7,7b,19,,,,2,,2,,,20,b,1c,l,g,,2t,7,2,6,2,2,,4,z,,u,r,2j,b,1m,9,9,,o,4,,9,,3,,5,17,3,3b,f,,w,1j,,,,4,8,4,,3,7,a,2,t,,1m,,,,2,4,8,,9,,a,2,q,,2,2,1l,,4,2,4,2,2,3,3,,u,2,3,,b,2,1l,,4,5,,2,4,,k,2,m,6,,,1m,,,2,,4,8,,7,3,a,2,u,,1n,,,,c,,9,,14,,3,,1l,3,5,3,,4,7,2,b,2,t,,1m,,2,,2,,3,,5,2,7,2,b,2,s,2,1l,2,,,2,4,8,,9,,a,2,t,,20,,4,,2,3,,,8,,29,,2,7,c,8,2q,,2,9,b,6,22,2,r,,,,,,1j,e,,5,,2,5,b,,10,9,,2u,4,,6,,2,2,2,p,2,4,3,g,4,d,,2,2,6,,f,,jj,3,qa,3,t,3,t,2,u,2,1s,2,,7,8,,2,b,9,,19,3,3b,2,y,,3a,3,4,2,9,,6,3,63,2,2,,1m,,,7,,,,,2,8,6,a,2,,1c,h,1r,4,1c,7,,,5,,14,9,c,2,w,4,2,2,,3,1k,,,2,3,,,3,1m,8,2,2,48,3,,d,,7,4,,6,,3,2,5i,1m,,5,ek,,5f,x,2da,3,3x,,2o,w,fe,6,2x,2,n9w,4,,a,w,2,28,2,7k,,3,,4,,p,2,5,,47,2,q,i,d,,12,8,p,b,1a,3,1c,,2,4,2,2,13,,1v,6,2,2,2,2,c,,8,,1b,,1f,,,3,2,2,5,2,,,16,2,8,,6m,,2,,4,,fn4,,kh,g,g,g,a6,2,gt,,6a,,45,5,1ae,3,,2,5,4,14,3,4,,4l,2,fx,4,ar,2,49,b,4w,,1i,f,1k,3,1d,4,2,2,1x,3,10,5,,8,1q,,c,2,1g,9,a,4,2,,2n,3,2,,,2,6,,4g,,3,8,l,2,1l,2,,,,,m,,e,7,3,5,5f,8,2,3,,,n,,29,,2,6,,,2,,,2,,2,6j,,2,4,6,2,,2,r,2,2d,8,2,,,2,2y,,,,2,6,,,2t,3,2,4,,5,77,9,,2,6t,,a,2,,,4,,40,4,2,2,4,,w,a,14,6,2,4,8,,9,6,2,3,1a,d,,2,ba,7,,6,,,2a,m,2,7,,2,,2,3e,6,3,,,2,,7,,,20,2,3,,,,9n,2,f0b,5,1n,7,t4,,1r,4,29,,f5k,2,43q,,,3,4,5,8,8,2,7,u,4,44,3,1iz,1j,4,1e,8,,e,,m,5,,f,11s,7,,h,2,7,,2,,5,79,7,c5,4,15s,7,31,7,240,5,gx7k,2o,3k,6o\".split(\",\").map(e=>e?parseInt(e,36):1);for(let e=0,A=0;e<t.length;e++)(e%2?Iz:yM).push(A=A+t[e])})();function FhA(t){if(t<768)return!1;for(let e=0,A=yM.length;;){let i=e+A>>1;if(t<yM[i])A=i;else if(t>=Iz[i])e=i+1;else return!0;if(e==A)return!1}}function lz(t){return t>=127462&&t<=127487}var cz=8205;function dz(t,e,A=!0,i=!0){return(A?Bz:LhA)(t,e,i)}function Bz(t,e,A){if(e==t.length)return e;e&&Qz(t.charCodeAt(e))&&Ez(t.charCodeAt(e-1))&&e--;let i=wM(t,e);for(e+=Cz(i);e<t.length;){let n=wM(t,e);if(i==cz||n==cz||A&&FhA(n))e+=Cz(n),i=n;else if(lz(n)){let o=0,a=e-2;for(;a>=0&&lz(wM(t,a));)o++,a-=2;if(o%2==0)break;e+=2}else break}return e}function LhA(t,e,A){for(;e>0;){let i=Bz(t,e-2,A);if(i<e)return i;e--}return 0}function wM(t,e){let A=t.charCodeAt(e);if(!Ez(A)||e+1==t.length)return A;let i=t.charCodeAt(e+1);return Qz(i)?(A-55296<<10)+(i-56320)+65536:A}function Qz(t){return t>=56320&&t<57344}function Ez(t){return t>=55296&&t<56320}function Cz(t){return t<65536?1:2}var Bn=class t{lineAt(e){if(e<0||e>this.length)throw new RangeError(`Invalid position ${e} in document of length ${this.length}`);return this.lineInner(e,!1,1,0)}line(e){if(e<1||e>this.lines)throw new RangeError(`Invalid line number ${e} in ${this.lines}-line document`);return this.lineInner(e,!0,1,0)}replace(e,A,i){[e,A]=eQ(this,e,A);let n=[];return this.decompose(0,e,n,2),i.length&&i.decompose(0,i.length,n,3),this.decompose(A,this.length,n,1),XB.from(n,this.length-(A-e)+i.length)}append(e){return this.replace(this.length,this.length,e)}slice(e,A=this.length){[e,A]=eQ(this,e,A);let i=[];return this.decompose(e,A,i,0),XB.from(i,A-e)}eq(e){if(e==this)return!0;if(e.length!=this.length||e.lines!=this.lines)return!1;let A=this.scanIdentical(e,1),i=this.length-this.scanIdentical(e,-1),n=new I1(this),o=new I1(e);for(let a=A,r=A;;){if(n.next(a),o.next(a),a=0,n.lineBreak!=o.lineBreak||n.done!=o.done||n.value!=o.value)return!1;if(r+=n.value.length,n.done||r>=i)return!0}}iter(e=1){return new I1(this,e)}iterRange(e,A=this.length){return new E8(this,e,A)}iterLines(e,A){let i;if(e==null)i=this.iter();else{A==null&&(A=this.lines+1);let n=this.line(e).from;i=this.iterRange(n,Math.max(n,A==this.lines+1?this.length:A<=1?0:this.line(A-1).to))}return new h8(i)}toString(){return this.sliceString(0)}toJSON(){let e=[];return this.flatten(e),e}constructor(){}static of(e){if(e.length==0)throw new RangeError(\"A document must have at least one line\");return e.length==1&&!e[0]?t.empty:e.length<=32?new Qg(e):XB.from(Qg.split(e,[]))}},Qg=class t extends Bn{constructor(e,A=_hA(e)){super(),this.text=e,this.length=A}get lines(){return this.text.length}get children(){return null}lineInner(e,A,i,n){for(let o=0;;o++){let a=this.text[o],r=n+a.length;if((A?i:r)>=e)return new MM(n,r,i,a);n=r+1,i++}}decompose(e,A,i,n){let o=e<=0&&A>=this.length?this:new t(hz(this.text,e,A),Math.min(A,this.length)-Math.max(0,e));if(n&1){let a=i.pop(),r=Q8(o.text,a.text.slice(),0,o.length);if(r.length<=32)i.push(new t(r,a.length+o.length));else{let s=r.length>>1;i.push(new t(r.slice(0,s)),new t(r.slice(s)))}}else i.push(o)}replace(e,A,i){if(!(i instanceof t))return super.replace(e,A,i);[e,A]=eQ(this,e,A);let n=Q8(this.text,Q8(i.text,hz(this.text,0,e)),A),o=this.length+i.length-(A-e);return n.length<=32?new t(n,o):XB.from(t.split(n,[]),o)}sliceString(e,A=this.length,i=`\n`){[e,A]=eQ(this,e,A);let n=\"\";for(let o=0,a=0;o<=A&&a<this.text.length;a++){let r=this.text[a],s=o+r.length;o>e&&a&&(n+=i),e<s&&A>o&&(n+=r.slice(Math.max(0,e-o),A-o)),o=s+1}return n}flatten(e){for(let A of this.text)e.push(A)}scanIdentical(){return 0}static split(e,A){let i=[],n=-1;for(let o of e)i.push(o),n+=o.length+1,i.length==32&&(A.push(new t(i,n)),i=[],n=-1);return n>-1&&A.push(new t(i,n)),A}},XB=class t extends Bn{constructor(e,A){super(),this.children=e,this.length=A,this.lines=0;for(let i of e)this.lines+=i.lines}lineInner(e,A,i,n){for(let o=0;;o++){let a=this.children[o],r=n+a.length,s=i+a.lines-1;if((A?s:r)>=e)return a.lineInner(e,A,i,n);n=r+1,i=s+1}}decompose(e,A,i,n){for(let o=0,a=0;a<=A&&o<this.children.length;o++){let r=this.children[o],s=a+r.length;if(e<=s&&A>=a){let g=n&((a<=e?1:0)|(s>=A?2:0));a>=e&&s<=A&&!g?i.push(r):r.decompose(e-a,A-a,i,g)}a=s+1}}replace(e,A,i){if([e,A]=eQ(this,e,A),i.lines<this.lines)for(let n=0,o=0;n<this.children.length;n++){let a=this.children[n],r=o+a.length;if(e>=o&&A<=r){let s=a.replace(e-o,A-o,i),g=this.lines-a.lines+s.lines;if(s.lines<g>>4&&s.lines>g>>6){let l=this.children.slice();return l[n]=s,new t(l,this.length-(A-e)+i.length)}return super.replace(o,r,s)}o=r+1}return super.replace(e,A,i)}sliceString(e,A=this.length,i=`\n`){[e,A]=eQ(this,e,A);let n=\"\";for(let o=0,a=0;o<this.children.length&&a<=A;o++){let r=this.children[o],s=a+r.length;a>e&&o&&(n+=i),e<s&&A>a&&(n+=r.sliceString(e-a,A-a,i)),a=s+1}return n}flatten(e){for(let A of this.children)A.flatten(e)}scanIdentical(e,A){if(!(e instanceof t))return 0;let i=0,[n,o,a,r]=A>0?[0,0,this.children.length,e.children.length]:[this.children.length-1,e.children.length-1,-1,-1];for(;;n+=A,o+=A){if(n==a||o==r)return i;let s=this.children[n],g=e.children[o];if(s!=g)return i+s.scanIdentical(g,A);i+=s.length+1}}static from(e,A=e.reduce((i,n)=>i+n.length+1,-1)){let i=0;for(let d of e)i+=d.lines;if(i<32){let d=[];for(let B of e)B.flatten(d);return new Qg(d,A)}let n=Math.max(32,i>>5),o=n<<1,a=n>>1,r=[],s=0,g=-1,l=[];function C(d){let B;if(d.lines>o&&d instanceof t)for(let Q of d.children)C(Q);else d.lines>a&&(s>a||!s)?(I(),r.push(d)):d instanceof Qg&&s&&(B=l[l.length-1])instanceof Qg&&d.lines+B.lines<=32?(s+=d.lines,g+=d.length+1,l[l.length-1]=new Qg(B.text.concat(d.text),B.length+1+d.length)):(s+d.lines>n&&I(),s+=d.lines,g+=d.length+1,l.push(d))}function I(){s!=0&&(r.push(l.length==1?l[0]:t.from(l,g)),g=-1,s=l.length=0)}for(let d of e)C(d);return I(),r.length==1?r[0]:new t(r,A)}};Bn.empty=new Qg([\"\"],0);function _hA(t){let e=-1;for(let A of t)e+=A.length+1;return e}function Q8(t,e,A=0,i=1e9){for(let n=0,o=0,a=!0;o<t.length&&n<=i;o++){let r=t[o],s=n+r.length;s>=A&&(s>i&&(r=r.slice(0,i-n)),n<A&&(r=r.slice(A-n)),a?(e[e.length-1]+=r,a=!1):e.push(r)),n=s+1}return e}function hz(t,e,A){return Q8(t,[\"\"],e,A)}var I1=class{constructor(e,A=1){this.dir=A,this.done=!1,this.lineBreak=!1,this.value=\"\",this.nodes=[e],this.offsets=[A>0?1:(e instanceof Qg?e.text.length:e.children.length)<<1]}nextInner(e,A){for(this.done=this.lineBreak=!1;;){let i=this.nodes.length-1,n=this.nodes[i],o=this.offsets[i],a=o>>1,r=n instanceof Qg?n.text.length:n.children.length;if(a==(A>0?r:0)){if(i==0)return this.done=!0,this.value=\"\",this;A>0&&this.offsets[i-1]++,this.nodes.pop(),this.offsets.pop()}else if((o&1)==(A>0?0:1)){if(this.offsets[i]+=A,e==0)return this.lineBreak=!0,this.value=`\n`,this;e--}else if(n instanceof Qg){let s=n.text[a+(A<0?-1:0)];if(this.offsets[i]+=A,s.length>Math.max(0,e))return this.value=e==0?s:A>0?s.slice(e):s.slice(0,s.length-e),this;e-=s.length}else{let s=n.children[a+(A<0?-1:0)];e>s.length?(e-=s.length,this.offsets[i]+=A):(A<0&&this.offsets[i]--,this.nodes.push(s),this.offsets.push(A>0?1:(s instanceof Qg?s.text.length:s.children.length)<<1))}}}next(e=0){return e<0&&(this.nextInner(-e,-this.dir),e=this.value.length),this.nextInner(e,this.dir)}},E8=class{constructor(e,A,i){this.value=\"\",this.done=!1,this.cursor=new I1(e,A>i?-1:1),this.pos=A>i?e.length:0,this.from=Math.min(A,i),this.to=Math.max(A,i)}nextInner(e,A){if(A<0?this.pos<=this.from:this.pos>=this.to)return this.value=\"\",this.done=!0,this;e+=Math.max(0,A<0?this.pos-this.to:this.from-this.pos);let i=A<0?this.pos-this.from:this.to-this.pos;e>i&&(e=i),i-=e;let{value:n}=this.cursor.next(e);return this.pos+=(n.length+e)*A,this.value=n.length<=i?n:A<0?n.slice(n.length-i):n.slice(0,i),this.done=!this.value,this}next(e=0){return e<0?e=Math.max(e,this.from-this.pos):e>0&&(e=Math.min(e,this.to-this.pos)),this.nextInner(e,this.cursor.dir)}get lineBreak(){return this.cursor.lineBreak&&this.value!=\"\"}},h8=class{constructor(e){this.inner=e,this.afterBreak=!0,this.value=\"\",this.done=!1}next(e=0){let{done:A,lineBreak:i,value:n}=this.inner.next(e);return A&&this.afterBreak?(this.value=\"\",this.afterBreak=!1):A?(this.done=!0,this.value=\"\"):i?this.afterBreak?this.value=\"\":(this.afterBreak=!0,this.next()):(this.value=n,this.afterBreak=!1),this}get lineBreak(){return!1}};typeof Symbol<\"u\"&&(Bn.prototype[Symbol.iterator]=function(){return this.iter()},I1.prototype[Symbol.iterator]=E8.prototype[Symbol.iterator]=h8.prototype[Symbol.iterator]=function(){return this});var MM=class{constructor(e,A,i,n){this.from=e,this.to=A,this.number=i,this.text=n}get length(){return this.to-this.from}};function eQ(t,e,A){return e=Math.max(0,Math.min(t.length,e)),[e,Math.max(e,Math.min(t.length,A))]}function _a(t,e,A=!0,i=!0){return dz(t,e,A,i)}function GhA(t){return t>=56320&&t<57344}function KhA(t){return t>=55296&&t<56320}function Fr(t,e){let A=t.charCodeAt(e);if(!KhA(A)||e+1==t.length)return A;let i=t.charCodeAt(e+1);return GhA(i)?(A-55296<<10)+(i-56320)+65536:A}function t3(t){return t<=65535?String.fromCharCode(t):(t-=65536,String.fromCharCode((t>>10)+55296,(t&1023)+56320))}function Eg(t){return t<65536?1:2}var kM=/\\r\\n?|\\n/,xr=(function(t){return t[t.Simple=0]=\"Simple\",t[t.TrackDel=1]=\"TrackDel\",t[t.TrackBefore=2]=\"TrackBefore\",t[t.TrackAfter=3]=\"TrackAfter\",t})(xr||(xr={})),k2=class t{constructor(e){this.sections=e}get length(){let e=0;for(let A=0;A<this.sections.length;A+=2)e+=this.sections[A];return e}get newLength(){let e=0;for(let A=0;A<this.sections.length;A+=2){let i=this.sections[A+1];e+=i<0?this.sections[A]:i}return e}get empty(){return this.sections.length==0||this.sections.length==2&&this.sections[1]<0}iterGaps(e){for(let A=0,i=0,n=0;A<this.sections.length;){let o=this.sections[A++],a=this.sections[A++];a<0?(e(i,n,o),n+=o):n+=a,i+=o}}iterChangedRanges(e,A=!1){SM(this,e,A)}get invertedDesc(){let e=[];for(let A=0;A<this.sections.length;){let i=this.sections[A++],n=this.sections[A++];n<0?e.push(i,n):e.push(n,i)}return new t(e)}composeDesc(e){return this.empty?e:e.empty?this:yz(this,e)}mapDesc(e,A=!1){return e.empty?this:xM(this,e,A)}mapPos(e,A=-1,i=xr.Simple){let n=0,o=0;for(let a=0;a<this.sections.length;){let r=this.sections[a++],s=this.sections[a++],g=n+r;if(s<0){if(g>e)return o+(e-n);o+=r}else{if(i!=xr.Simple&&g>=e&&(i==xr.TrackDel&&n<e&&g>e||i==xr.TrackBefore&&n<e||i==xr.TrackAfter&&g>e))return null;if(g>e||g==e&&A<0&&!r)return e==n||A<0?o:o+s;o+=s}n=g}if(e>n)throw new RangeError(`Position ${e} is out of range for changeset of length ${n}`);return o}touchesRange(e,A=e){for(let i=0,n=0;i<this.sections.length&&n<=A;){let o=this.sections[i++],a=this.sections[i++],r=n+o;if(a>=0&&n<=A&&r>=e)return n<e&&r>A?\"cover\":!0;n=r}return!1}toString(){let e=\"\";for(let A=0;A<this.sections.length;){let i=this.sections[A++],n=this.sections[A++];e+=(e?\" \":\"\")+i+(n>=0?\":\"+n:\"\")}return e}toJSON(){return this.sections}static fromJSON(e){if(!Array.isArray(e)||e.length%2||e.some(A=>typeof A!=\"number\"))throw new RangeError(\"Invalid JSON representation of ChangeDesc\");return new t(e)}static create(e){return new t(e)}},Rr=class t extends k2{constructor(e,A){super(e),this.inserted=A}apply(e){if(this.length!=e.length)throw new RangeError(\"Applying change set to a document with the wrong length\");return SM(this,(A,i,n,o,a)=>e=e.replace(n,n+(i-A),a),!1),e}mapDesc(e,A=!1){return xM(this,e,A,!0)}invert(e){let A=this.sections.slice(),i=[];for(let n=0,o=0;n<A.length;n+=2){let a=A[n],r=A[n+1];if(r>=0){A[n]=r,A[n+1]=a;let s=n>>1;for(;i.length<s;)i.push(Bn.empty);i.push(a?e.slice(o,o+a):Bn.empty)}o+=a}return new t(A,i)}compose(e){return this.empty?e:e.empty?this:yz(this,e,!0)}map(e,A=!1){return e.empty?this:xM(this,e,A,!0)}iterChanges(e,A=!1){SM(this,e,A)}get desc(){return k2.create(this.sections)}filter(e){let A=[],i=[],n=[],o=new d1(this);A:for(let a=0,r=0;;){let s=a==e.length?1e9:e[a++];for(;r<s||r==s&&o.len==0;){if(o.done)break A;let l=Math.min(o.len,s-r);es(n,l,-1);let C=o.ins==-1?-1:o.off==0?o.ins:0;es(A,l,C),C>0&&M2(i,A,o.text),o.forward(l),r+=l}let g=e[a++];for(;r<g;){if(o.done)break A;let l=Math.min(o.len,g-r);es(A,l,-1),es(n,l,o.ins==-1?-1:o.off==0?o.ins:0),o.forward(l),r+=l}}return{changes:new t(A,i),filtered:k2.create(n)}}toJSON(){let e=[];for(let A=0;A<this.sections.length;A+=2){let i=this.sections[A],n=this.sections[A+1];n<0?e.push(i):n==0?e.push([i]):e.push([i].concat(this.inserted[A>>1].toJSON()))}return e}static of(e,A,i){let n=[],o=[],a=0,r=null;function s(l=!1){if(!l&&!n.length)return;a<A&&es(n,A-a,-1);let C=new t(n,o);r=r?r.compose(C.map(r)):C,n=[],o=[],a=0}function g(l){if(Array.isArray(l))for(let C of l)g(C);else if(l instanceof t){if(l.length!=A)throw new RangeError(`Mismatched change set length (got ${l.length}, expected ${A})`);s(),r=r?r.compose(l.map(r)):l}else{let{from:C,to:I=C,insert:d}=l;if(C>I||C<0||I>A)throw new RangeError(`Invalid change range ${C} to ${I} (in doc of length ${A})`);let B=d?typeof d==\"string\"?Bn.of(d.split(i||kM)):d:Bn.empty,Q=B.length;if(C==I&&Q==0)return;C<a&&s(),C>a&&es(n,C-a,-1),es(n,I-C,Q),M2(o,n,B),a=I}}return g(e),s(!r),r}static empty(e){return new t(e?[e,-1]:[],[])}static fromJSON(e){if(!Array.isArray(e))throw new RangeError(\"Invalid JSON representation of ChangeSet\");let A=[],i=[];for(let n=0;n<e.length;n++){let o=e[n];if(typeof o==\"number\")A.push(o,-1);else{if(!Array.isArray(o)||typeof o[0]!=\"number\"||o.some((a,r)=>r&&typeof a!=\"string\"))throw new RangeError(\"Invalid JSON representation of ChangeSet\");if(o.length==1)A.push(o[0],0);else{for(;i.length<n;)i.push(Bn.empty);i[n]=Bn.of(o.slice(1)),A.push(o[0],i[n].length)}}}return new t(A,i)}static createSet(e,A){return new t(e,A)}};function es(t,e,A,i=!1){if(e==0&&A<=0)return;let n=t.length-2;n>=0&&A<=0&&A==t[n+1]?t[n]+=e:n>=0&&e==0&&t[n]==0?t[n+1]+=A:i?(t[n]+=e,t[n+1]+=A):t.push(e,A)}function M2(t,e,A){if(A.length==0)return;let i=e.length-2>>1;if(i<t.length)t[t.length-1]=t[t.length-1].append(A);else{for(;t.length<i;)t.push(Bn.empty);t.push(A)}}function SM(t,e,A){let i=t.inserted;for(let n=0,o=0,a=0;a<t.sections.length;){let r=t.sections[a++],s=t.sections[a++];if(s<0)n+=r,o+=r;else{let g=n,l=o,C=Bn.empty;for(;g+=r,l+=s,s&&i&&(C=C.append(i[a-2>>1])),!(A||a==t.sections.length||t.sections[a+1]<0);)r=t.sections[a++],s=t.sections[a++];e(n,g,o,l,C),n=g,o=l}}}function xM(t,e,A,i=!1){let n=[],o=i?[]:null,a=new d1(t),r=new d1(e);for(let s=-1;;){if(a.done&&r.len||r.done&&a.len)throw new Error(\"Mismatched change set lengths\");if(a.ins==-1&&r.ins==-1){let g=Math.min(a.len,r.len);es(n,g,-1),a.forward(g),r.forward(g)}else if(r.ins>=0&&(a.ins<0||s==a.i||a.off==0&&(r.len<a.len||r.len==a.len&&!A))){let g=r.len;for(es(n,r.ins,-1);g;){let l=Math.min(a.len,g);a.ins>=0&&s<a.i&&a.len<=l&&(es(n,0,a.ins),o&&M2(o,n,a.text),s=a.i),a.forward(l),g-=l}r.next()}else if(a.ins>=0){let g=0,l=a.len;for(;l;)if(r.ins==-1){let C=Math.min(l,r.len);g+=C,l-=C,r.forward(C)}else if(r.ins==0&&r.len<l)l-=r.len,r.next();else break;es(n,g,s<a.i?a.ins:0),o&&s<a.i&&M2(o,n,a.text),s=a.i,a.forward(a.len-l)}else{if(a.done&&r.done)return o?Rr.createSet(n,o):k2.create(n);throw new Error(\"Mismatched change set lengths\")}}}function yz(t,e,A=!1){let i=[],n=A?[]:null,o=new d1(t),a=new d1(e);for(let r=!1;;){if(o.done&&a.done)return n?Rr.createSet(i,n):k2.create(i);if(o.ins==0)es(i,o.len,0,r),o.next();else if(a.len==0&&!a.done)es(i,0,a.ins,r),n&&M2(n,i,a.text),a.next();else{if(o.done||a.done)throw new Error(\"Mismatched change set lengths\");{let s=Math.min(o.len2,a.len),g=i.length;if(o.ins==-1){let l=a.ins==-1?-1:a.off?0:a.ins;es(i,s,l,r),n&&l&&M2(n,i,a.text)}else a.ins==-1?(es(i,o.off?0:o.len,s,r),n&&M2(n,i,o.textBit(s))):(es(i,o.off?0:o.len,a.off?0:a.ins,r),n&&!a.off&&M2(n,i,a.text));r=(o.ins>s||a.ins>=0&&a.len>s)&&(r||i.length>g),o.forward2(s),a.forward(s)}}}}var d1=class{constructor(e){this.set=e,this.i=0,this.next()}next(){let{sections:e}=this.set;this.i<e.length?(this.len=e[this.i++],this.ins=e[this.i++]):(this.len=0,this.ins=-2),this.off=0}get done(){return this.ins==-2}get len2(){return this.ins<0?this.len:this.ins}get text(){let{inserted:e}=this.set,A=this.i-2>>1;return A>=e.length?Bn.empty:e[A]}textBit(e){let{inserted:A}=this.set,i=this.i-2>>1;return i>=A.length&&!e?Bn.empty:A[i].slice(this.off,e==null?void 0:this.off+e)}forward(e){e==this.len?this.next():(this.len-=e,this.off+=e)}forward2(e){this.ins==-1?this.forward(e):e==this.ins?this.next():(this.ins-=e,this.off+=e)}},ZB=class t{constructor(e,A,i){this.from=e,this.to=A,this.flags=i}get anchor(){return this.flags&32?this.to:this.from}get head(){return this.flags&32?this.from:this.to}get empty(){return this.from==this.to}get assoc(){return this.flags&8?-1:this.flags&16?1:0}get bidiLevel(){let e=this.flags&7;return e==7?null:e}get goalColumn(){let e=this.flags>>6;return e==16777215?void 0:e}map(e,A=-1){let i,n;return this.empty?i=n=e.mapPos(this.from,A):(i=e.mapPos(this.from,1),n=e.mapPos(this.to,-1)),i==this.from&&n==this.to?this:new t(i,n,this.flags)}extend(e,A=e,i=0){if(e<=this.anchor&&A>=this.anchor)return ce.range(e,A,void 0,void 0,i);let n=Math.abs(e-this.anchor)>Math.abs(A-this.anchor)?e:A;return ce.range(this.anchor,n,void 0,void 0,i)}eq(e,A=!1){return this.anchor==e.anchor&&this.head==e.head&&this.goalColumn==e.goalColumn&&(!A||!this.empty||this.assoc==e.assoc)}toJSON(){return{anchor:this.anchor,head:this.head}}static fromJSON(e){if(!e||typeof e.anchor!=\"number\"||typeof e.head!=\"number\")throw new RangeError(\"Invalid JSON representation for SelectionRange\");return ce.range(e.anchor,e.head)}static create(e,A,i){return new t(e,A,i)}},ce=class t{constructor(e,A){this.ranges=e,this.mainIndex=A}map(e,A=-1){return e.empty?this:t.create(this.ranges.map(i=>i.map(e,A)),this.mainIndex)}eq(e,A=!1){if(this.ranges.length!=e.ranges.length||this.mainIndex!=e.mainIndex)return!1;for(let i=0;i<this.ranges.length;i++)if(!this.ranges[i].eq(e.ranges[i],A))return!1;return!0}get main(){return this.ranges[this.mainIndex]}asSingle(){return this.ranges.length==1?this:new t([this.main],0)}addRange(e,A=!0){return t.create([e].concat(this.ranges),A?0:this.mainIndex+1)}replaceRange(e,A=this.mainIndex){let i=this.ranges.slice();return i[A]=e,t.create(i,this.mainIndex)}toJSON(){return{ranges:this.ranges.map(e=>e.toJSON()),main:this.mainIndex}}static fromJSON(e){if(!e||!Array.isArray(e.ranges)||typeof e.main!=\"number\"||e.main>=e.ranges.length)throw new RangeError(\"Invalid JSON representation for EditorSelection\");return new t(e.ranges.map(A=>ZB.fromJSON(A)),e.main)}static single(e,A=e){return new t([t.range(e,A)],0)}static create(e,A=0){if(e.length==0)throw new RangeError(\"A selection needs at least one range\");for(let i=0,n=0;n<e.length;n++){let o=e[n];if(o.empty?o.from<=i:o.from<i)return t.normalized(e.slice(),A);i=o.to}return new t(e,A)}static cursor(e,A=0,i,n){return ZB.create(e,e,(A==0?0:A<0?8:16)|(i==null?7:Math.min(6,i))|(n??16777215)<<6)}static range(e,A,i,n,o){let a=(i??16777215)<<6|(n==null?7:Math.min(6,n));return!o&&e!=A&&(o=A<e?1:-1),A<e?ZB.create(A,e,48|a):ZB.create(e,A,(o?o<0?8:16:0)|a)}static normalized(e,A=0){let i=e[A];e.sort((n,o)=>n.from-o.from),A=e.indexOf(i);for(let n=1;n<e.length;n++){let o=e[n],a=e[n-1];if(o.empty?o.from<=a.to:o.from<a.to){let r=a.from,s=Math.max(o.to,a.to);n<=A&&A--,e.splice(--n,2,o.anchor>o.head?t.range(s,r):t.range(r,s))}}return new t(e,A)}};function vz(t,e){for(let A of t.ranges)if(A.to>e)throw new RangeError(\"Selection points outside of document\")}var JM=0,qe=class t{constructor(e,A,i,n,o){this.combine=e,this.compareInput=A,this.compare=i,this.isStatic=n,this.id=JM++,this.default=e([]),this.extensions=typeof o==\"function\"?o(this):o}get reader(){return this}static define(e={}){return new t(e.combine||(A=>A),e.compareInput||((A,i)=>A===i),e.compare||(e.combine?(A,i)=>A===i:YM),!!e.static,e.enables)}of(e){return new $B([],this,0,e)}compute(e,A){if(this.isStatic)throw new Error(\"Can't compute a static facet\");return new $B(e,this,1,A)}computeN(e,A){if(this.isStatic)throw new Error(\"Can't compute a static facet\");return new $B(e,this,2,A)}from(e,A){return A||(A=i=>i),this.compute([e],i=>A(i.field(e)))}};function YM(t,e){return t==e||t.length==e.length&&t.every((A,i)=>A===e[i])}var $B=class{constructor(e,A,i,n){this.dependencies=e,this.facet=A,this.type=i,this.value=n,this.id=JM++}dynamicSlot(e){var A;let i=this.value,n=this.facet.compareInput,o=this.id,a=e[o]>>1,r=this.type==2,s=!1,g=!1,l=[];for(let C of this.dependencies)C==\"doc\"?s=!0:C==\"selection\"?g=!0:(((A=e[C.id])!==null&&A!==void 0?A:1)&1)==0&&l.push(e[C.id]);return{create(C){return C.values[a]=i(C),1},update(C,I){if(s&&I.docChanged||g&&(I.docChanged||I.selection)||RM(C,l)){let d=i(C);if(r?!uz(d,C.values[a],n):!n(d,C.values[a]))return C.values[a]=d,1}return 0},reconfigure:(C,I)=>{let d,B=I.config.address[o];if(B!=null){let Q=m8(I,B);if(this.dependencies.every(E=>E instanceof qe?I.facet(E)===C.facet(E):E instanceof Qa?I.field(E,!1)==C.field(E,!1):!0)||(r?uz(d=i(C),Q,n):n(d=i(C),Q)))return C.values[a]=Q,0}else d=i(C);return C.values[a]=d,1}}}};function uz(t,e,A){if(t.length!=e.length)return!1;for(let i=0;i<t.length;i++)if(!A(t[i],e[i]))return!1;return!0}function RM(t,e){let A=!1;for(let i of e)X4(t,i)&1&&(A=!0);return A}function UhA(t,e,A){let i=A.map(s=>t[s.id]),n=A.map(s=>s.type),o=i.filter(s=>!(s&1)),a=t[e.id]>>1;function r(s){let g=[];for(let l=0;l<i.length;l++){let C=m8(s,i[l]);if(n[l]==2)for(let I of C)g.push(I);else g.push(C)}return e.combine(g)}return{create(s){for(let g of i)X4(s,g);return s.values[a]=r(s),1},update(s,g){if(!RM(s,o))return 0;let l=r(s);return e.compare(l,s.values[a])?0:(s.values[a]=l,1)},reconfigure(s,g){let l=RM(s,i),C=g.config.facets[e.id],I=g.facet(e);if(C&&!l&&YM(A,C))return s.values[a]=I,0;let d=r(s);return e.compare(d,I)?(s.values[a]=I,0):(s.values[a]=d,1)}}}var I8=qe.define({static:!0}),Qa=class t{constructor(e,A,i,n,o){this.id=e,this.createF=A,this.updateF=i,this.compareF=n,this.spec=o,this.provides=void 0}static define(e){let A=new t(JM++,e.create,e.update,e.compare||((i,n)=>i===n),e);return e.provide&&(A.provides=e.provide(A)),A}create(e){let A=e.facet(I8).find(i=>i.field==this);return(A?.create||this.createF)(e)}slot(e){let A=e[this.id]>>1;return{create:i=>(i.values[A]=this.create(i),1),update:(i,n)=>{let o=i.values[A],a=this.updateF(o,n);return this.compareF(o,a)?0:(i.values[A]=a,1)},reconfigure:(i,n)=>{let o=i.facet(I8),a=n.facet(I8),r;return(r=o.find(s=>s.field==this))&&r!=a.find(s=>s.field==this)?(i.values[A]=r.create(i),1):n.config.address[this.id]!=null?(i.values[A]=n.field(this),0):(i.values[A]=this.create(i),1)}}}init(e){return[this,I8.of({field:this,create:e})]}get extension(){return this}},c1={lowest:4,low:3,default:2,high:1,highest:0};function Z4(t){return e=>new u8(e,t)}var zl={highest:Z4(c1.highest),high:Z4(c1.high),default:Z4(c1.default),low:Z4(c1.low),lowest:Z4(c1.lowest)},u8=class{constructor(e,A){this.inner=e,this.prec=A}},Zc=class t{of(e){return new $4(this,e)}reconfigure(e){return t.reconfigure.of({compartment:this,extension:e})}get(e){return e.config.compartments.get(this)}},$4=class{constructor(e,A){this.compartment=e,this.inner=A}},f8=class t{constructor(e,A,i,n,o,a){for(this.base=e,this.compartments=A,this.dynamicSlots=i,this.address=n,this.staticValues=o,this.facets=a,this.statusTemplate=[];this.statusTemplate.length<i.length;)this.statusTemplate.push(0)}staticFacet(e){let A=this.address[e.id];return A==null?e.default:this.staticValues[A>>1]}static resolve(e,A,i){let n=[],o=Object.create(null),a=new Map;for(let I of JhA(e,A,a))I instanceof Qa?n.push(I):(o[I.facet.id]||(o[I.facet.id]=[])).push(I);let r=Object.create(null),s=[],g=[];for(let I of n)r[I.id]=g.length<<1,g.push(d=>I.slot(d));let l=i?.config.facets;for(let I in o){let d=o[I],B=d[0].facet,Q=l&&l[I]||[];if(d.every(E=>E.type==0))if(r[B.id]=s.length<<1|1,YM(Q,d))s.push(i.facet(B));else{let E=B.combine(d.map(f=>f.value));s.push(i&&B.compare(E,i.facet(B))?i.facet(B):E)}else{for(let E of d)E.type==0?(r[E.id]=s.length<<1|1,s.push(E.value)):(r[E.id]=g.length<<1,g.push(f=>E.dynamicSlot(f)));r[B.id]=g.length<<1,g.push(E=>UhA(E,B,d))}}let C=g.map(I=>I(r));return new t(e,a,C,r,s,o)}};function JhA(t,e,A){let i=[[],[],[],[],[]],n=new Map;function o(a,r){let s=n.get(a);if(s!=null){if(s<=r)return;let g=i[s].indexOf(a);g>-1&&i[s].splice(g,1),a instanceof $4&&A.delete(a.compartment)}if(n.set(a,r),Array.isArray(a))for(let g of a)o(g,r);else if(a instanceof $4){if(A.has(a.compartment))throw new RangeError(\"Duplicate use of compartment in extensions\");let g=e.get(a.compartment)||a.inner;A.set(a.compartment,g),o(g,r)}else if(a instanceof u8)o(a.inner,a.prec);else if(a instanceof Qa)i[r].push(a),a.provides&&o(a.provides,r);else if(a instanceof $B)i[r].push(a),a.facet.extensions&&o(a.facet.extensions,c1.default);else{let g=a.extension;if(!g)throw new Error(`Unrecognized extension value in extension set (${a}). This sometimes happens because multiple instances of @codemirror/state are loaded, breaking instanceof checks.`);o(g,r)}}return o(t,c1.default),i.reduce((a,r)=>a.concat(r))}function X4(t,e){if(e&1)return 2;let A=e>>1,i=t.status[A];if(i==4)throw new Error(\"Cyclic dependency between fields and/or facets\");if(i&2)return i;t.status[A]=4;let n=t.computeSlot(t,t.config.dynamicSlots[A]);return t.status[A]=2|n}function m8(t,e){return e&1?t.config.staticValues[e>>1]:t.values[e>>1]}var fz=qe.define(),vM=qe.define({combine:t=>t.some(e=>e),static:!0}),bz=qe.define({combine:t=>t.length?t[0]:void 0,static:!0}),Mz=qe.define(),kz=qe.define(),Sz=qe.define(),mz=qe.define({combine:t=>t.length?t[0]:!1}),Os=class{constructor(e,A){this.type=e,this.value=A}static define(){return new NM}},NM=class{of(e){return new Os(this,e)}},FM=class{constructor(e){this.map=e}of(e){return new Ui(this,e)}},Ui=(()=>{class t{constructor(A,i){this.type=A,this.value=i}map(A){let i=this.type.map(this.value,A);return i===void 0?void 0:i==this.value?this:new t(this.type,i)}is(A){return this.type==A}static define(A={}){return new FM(A.map||(i=>i))}static mapEffects(A,i){if(!A.length)return A;let n=[];for(let o of A){let a=o.map(i);a&&n.push(a)}return n}}return t.reconfigure=t.define(),t.appendConfig=t.define(),t})(),Wc=(()=>{class t{constructor(A,i,n,o,a,r){this.startState=A,this.changes=i,this.selection=n,this.effects=o,this.annotations=a,this.scrollIntoView=r,this._doc=null,this._state=null,n&&vz(n,i.newLength),a.some(s=>s.type==t.time)||(this.annotations=a.concat(t.time.of(Date.now())))}static create(A,i,n,o,a,r){return new t(A,i,n,o,a,r)}get newDoc(){return this._doc||(this._doc=this.changes.apply(this.startState.doc))}get newSelection(){return this.selection||this.startState.selection.map(this.changes)}get state(){return this._state||this.startState.applyTransaction(this),this._state}annotation(A){for(let i of this.annotations)if(i.type==A)return i.value}get docChanged(){return!this.changes.empty}get reconfigured(){return this.startState.config!=this.state.config}isUserEvent(A){let i=this.annotation(t.userEvent);return!!(i&&(i==A||i.length>A.length&&i.slice(0,A.length)==A&&i[A.length]==\".\"))}}return t.time=Os.define(),t.userEvent=Os.define(),t.addToHistory=Os.define(),t.remote=Os.define(),t})();function YhA(t,e){let A=[];for(let i=0,n=0;;){let o,a;if(i<t.length&&(n==e.length||e[n]>=t[i]))o=t[i++],a=t[i++];else if(n<e.length)o=e[n++],a=e[n++];else return A;!A.length||A[A.length-1]<o?A.push(o,a):A[A.length-1]<a&&(A[A.length-1]=a)}}function xz(t,e,A){var i;let n,o,a;return A?(n=e.changes,o=Rr.empty(e.changes.length),a=t.changes.compose(e.changes)):(n=e.changes.map(t.changes),o=t.changes.mapDesc(e.changes,!0),a=t.changes.compose(n)),{changes:a,selection:e.selection?e.selection.map(o):(i=t.selection)===null||i===void 0?void 0:i.map(n),effects:Ui.mapEffects(t.effects,n).concat(Ui.mapEffects(e.effects,o)),annotations:t.annotations.length?t.annotations.concat(e.annotations):e.annotations,scrollIntoView:t.scrollIntoView||e.scrollIntoView}}function LM(t,e,A){let i=e.selection,n=AQ(e.annotations);return e.userEvent&&(n=n.concat(Wc.userEvent.of(e.userEvent))),{changes:e.changes instanceof Rr?e.changes:Rr.of(e.changes||[],A,t.facet(bz)),selection:i&&(i instanceof ce?i:ce.single(i.anchor,i.head)),effects:AQ(e.effects),annotations:n,scrollIntoView:!!e.scrollIntoView}}function Rz(t,e,A){let i=LM(t,e.length?e[0]:{},t.doc.length);e.length&&e[0].filter===!1&&(A=!1);for(let o=1;o<e.length;o++){e[o].filter===!1&&(A=!1);let a=!!e[o].sequential;i=xz(i,LM(t,e[o],a?i.changes.newLength:t.doc.length),a)}let n=Wc.create(t,i.changes,i.selection,i.effects,i.annotations,i.scrollIntoView);return ThA(A?HhA(n):n)}function HhA(t){let e=t.startState,A=!0;for(let n of e.facet(Mz)){let o=n(t);if(o===!1){A=!1;break}Array.isArray(o)&&(A=A===!0?o:YhA(A,o))}if(A!==!0){let n,o;if(A===!1)o=t.changes.invertedDesc,n=Rr.empty(e.doc.length);else{let a=t.changes.filter(A);n=a.changes,o=a.filtered.mapDesc(a.changes).invertedDesc}t=Wc.create(e,n,t.selection&&t.selection.map(o),Ui.mapEffects(t.effects,o),t.annotations,t.scrollIntoView)}let i=e.facet(kz);for(let n=i.length-1;n>=0;n--){let o=i[n](t);o instanceof Wc?t=o:Array.isArray(o)&&o.length==1&&o[0]instanceof Wc?t=o[0]:t=Rz(e,AQ(o),!1)}return t}function ThA(t){let e=t.startState,A=e.facet(Sz),i=t;for(let n=A.length-1;n>=0;n--){let o=A[n](t);o&&Object.keys(o).length&&(i=xz(i,LM(e,o,t.changes.newLength),!0))}return i==t?t:Wc.create(e,t.changes,t.selection,i.effects,i.annotations,i.scrollIntoView)}var OhA=[];function AQ(t){return t==null?OhA:Array.isArray(t)?t:[t]}var yo=(function(t){return t[t.Word=0]=\"Word\",t[t.Space=1]=\"Space\",t[t.Other=2]=\"Other\",t})(yo||(yo={})),zhA=/[\\u00df\\u0587\\u0590-\\u05f4\\u0600-\\u06ff\\u3040-\\u309f\\u30a0-\\u30ff\\u3400-\\u4db5\\u4e00-\\u9fcc\\uac00-\\ud7af]/,_M;try{_M=new RegExp(\"[\\\\p{Alphabetic}\\\\p{Number}_]\",\"u\")}catch(t){}function PhA(t){if(_M)return _M.test(t);for(let e=0;e<t.length;e++){let A=t[e];if(/\\w/.test(A)||A>\"\\x80\"&&(A.toUpperCase()!=A.toLowerCase()||zhA.test(A)))return!0}return!1}function jhA(t){return e=>{if(!/\\S/.test(e))return yo.Space;if(PhA(e))return yo.Word;for(let A=0;A<t.length;A++)if(e.indexOf(t[A])>-1)return yo.Word;return yo.Other}}var Ga=(()=>{class t{constructor(A,i,n,o,a,r){this.config=A,this.doc=i,this.selection=n,this.values=o,this.status=A.statusTemplate.slice(),this.computeSlot=a,r&&(r._state=this);for(let s=0;s<this.config.dynamicSlots.length;s++)X4(this,s<<1);this.computeSlot=null}field(A,i=!0){let n=this.config.address[A.id];if(n==null){if(i)throw new RangeError(\"Field is not present in this state\");return}return X4(this,n),m8(this,n)}update(...A){return Rz(this,A,!0)}applyTransaction(A){let i=this.config,{base:n,compartments:o}=i;for(let s of A.effects)s.is(Zc.reconfigure)?(i&&(o=new Map,i.compartments.forEach((g,l)=>o.set(l,g)),i=null),o.set(s.value.compartment,s.value.extension)):s.is(Ui.reconfigure)?(i=null,n=s.value):s.is(Ui.appendConfig)&&(i=null,n=AQ(n).concat(s.value));let a;i?a=A.startState.values.slice():(i=f8.resolve(n,o,this),a=new t(i,this.doc,this.selection,i.dynamicSlots.map(()=>null),(g,l)=>l.reconfigure(g,this),null).values);let r=A.startState.facet(vM)?A.newSelection:A.newSelection.asSingle();new t(i,A.newDoc,r,a,(s,g)=>g.update(s,A),A)}replaceSelection(A){return typeof A==\"string\"&&(A=this.toText(A)),this.changeByRange(i=>({changes:{from:i.from,to:i.to,insert:A},range:ce.cursor(i.from+A.length)}))}changeByRange(A){let i=this.selection,n=A(i.ranges[0]),o=this.changes(n.changes),a=[n.range],r=AQ(n.effects);for(let s=1;s<i.ranges.length;s++){let g=A(i.ranges[s]),l=this.changes(g.changes),C=l.map(o);for(let d=0;d<s;d++)a[d]=a[d].map(C);let I=o.mapDesc(l,!0);a.push(g.range.map(I)),o=o.compose(C),r=Ui.mapEffects(r,C).concat(Ui.mapEffects(AQ(g.effects),I))}return{changes:o,selection:ce.create(a,i.mainIndex),effects:r}}changes(A=[]){return A instanceof Rr?A:Rr.of(A,this.doc.length,this.facet(t.lineSeparator))}toText(A){return Bn.of(A.split(this.facet(t.lineSeparator)||kM))}sliceDoc(A=0,i=this.doc.length){return this.doc.sliceString(A,i,this.lineBreak)}facet(A){let i=this.config.address[A.id];return i==null?A.default:(X4(this,i),m8(this,i))}toJSON(A){let i={doc:this.sliceDoc(),selection:this.selection.toJSON()};if(A)for(let n in A){let o=A[n];o instanceof Qa&&this.config.address[o.id]!=null&&(i[n]=o.spec.toJSON(this.field(A[n]),this))}return i}static fromJSON(A,i={},n){if(!A||typeof A.doc!=\"string\")throw new RangeError(\"Invalid JSON representation for EditorState\");let o=[];if(n){for(let a in n)if(Object.prototype.hasOwnProperty.call(A,a)){let r=n[a],s=A[a];o.push(r.init(g=>r.spec.fromJSON(s,g)))}}return t.create({doc:A.doc,selection:ce.fromJSON(A.selection),extensions:i.extensions?o.concat([i.extensions]):o})}static create(A={}){let i=f8.resolve(A.extensions||[],new Map),n=A.doc instanceof Bn?A.doc:Bn.of((A.doc||\"\").split(i.staticFacet(t.lineSeparator)||kM)),o=A.selection?A.selection instanceof ce?A.selection:ce.single(A.selection.anchor,A.selection.head):ce.single(0);return vz(o,n.length),i.staticFacet(vM)||(o=o.asSingle()),new t(i,n,o,i.dynamicSlots.map(()=>null),(a,r)=>r.create(a),null)}get tabSize(){return this.facet(t.tabSize)}get lineBreak(){return this.facet(t.lineSeparator)||`\n`}get readOnly(){return this.facet(mz)}phrase(A,...i){for(let n of this.facet(t.phrases))if(Object.prototype.hasOwnProperty.call(n,A)){A=n[A];break}return i.length&&(A=A.replace(/\\$(\\$|\\d*)/g,(n,o)=>{if(o==\"$\")return\"$\";let a=+(o||1);return!a||a>i.length?n:i[a-1]})),A}languageDataAt(A,i,n=-1){let o=[];for(let a of this.facet(fz))for(let r of a(this,i,n))Object.prototype.hasOwnProperty.call(r,A)&&o.push(r[A]);return o}charCategorizer(A){let i=this.languageDataAt(\"wordChars\",A);return jhA(i.length?i[0]:\"\")}wordAt(A){let{text:i,from:n,length:o}=this.doc.lineAt(A),a=this.charCategorizer(A),r=A-n,s=A-n;for(;r>0;){let g=_a(i,r,!1);if(a(i.slice(g,r))!=yo.Word)break;r=g}for(;s<o;){let g=_a(i,s);if(a(i.slice(s,g))!=yo.Word)break;s=g}return r==s?null:ce.range(r+n,s+n)}}return t.allowMultipleSelections=vM,t.tabSize=qe.define({combine:e=>e.length?e[0]:4}),t.lineSeparator=bz,t.readOnly=mz,t.phrases=qe.define({compare(e,A){let i=Object.keys(e),n=Object.keys(A);return i.length==n.length&&i.every(o=>e[o]==A[o])}}),t.languageData=fz,t.changeFilter=Mz,t.transactionFilter=kz,t.transactionExtender=Sz,t})();Zc.reconfigure=Ui.define();function Ir(t,e,A={}){let i={};for(let n of t)for(let o of Object.keys(n)){let a=n[o],r=i[o];if(r===void 0)i[o]=a;else if(!(r===a||a===void 0))if(Object.hasOwnProperty.call(A,o))i[o]=A[o](r,a);else throw new Error(\"Config merge conflict for field \"+o)}for(let n in e)i[n]===void 0&&(i[n]=e[n]);return i}var Zg=class{eq(e){return this==e}range(e,A=e){return A3.create(e,A,this)}};Zg.prototype.startSide=Zg.prototype.endSide=0;Zg.prototype.point=!1;Zg.prototype.mapMode=xr.TrackDel;function HM(t,e){return t==e||t.constructor==e.constructor&&t.eq(e)}var A3=class t{constructor(e,A,i){this.from=e,this.to=A,this.value=i}static create(e,A,i){return new t(e,A,i)}};function GM(t,e){return t.from-e.from||t.value.startSide-e.value.startSide}var KM=class t{constructor(e,A,i,n){this.from=e,this.to=A,this.value=i,this.maxPoint=n}get length(){return this.to[this.to.length-1]}findIndex(e,A,i,n=0){let o=i?this.to:this.from;for(let a=n,r=o.length;;){if(a==r)return a;let s=a+r>>1,g=o[s]-e||(i?this.value[s].endSide:this.value[s].startSide)-A;if(s==a)return g>=0?a:r;g>=0?r=s:a=s+1}}between(e,A,i,n){for(let o=this.findIndex(A,-1e9,!0),a=this.findIndex(i,1e9,!1,o);o<a;o++)if(n(this.from[o]+e,this.to[o]+e,this.value[o])===!1)return!1}map(e,A){let i=[],n=[],o=[],a=-1,r=-1;for(let s=0;s<this.value.length;s++){let g=this.value[s],l=this.from[s]+e,C=this.to[s]+e,I,d;if(l==C){let B=A.mapPos(l,g.startSide,g.mapMode);if(B==null||(I=d=B,g.startSide!=g.endSide&&(d=A.mapPos(l,g.endSide),d<I)))continue}else if(I=A.mapPos(l,g.startSide),d=A.mapPos(C,g.endSide),I>d||I==d&&g.startSide>0&&g.endSide<=0)continue;(d-I||g.endSide-g.startSide)<0||(a<0&&(a=I),g.point&&(r=Math.max(r,d-I)),i.push(g),n.push(I-a),o.push(d-a))}return{mapped:i.length?new t(n,o,i,r):null,pos:a}}},zn=(()=>{class t{constructor(A,i,n,o){this.chunkPos=A,this.chunk=i,this.nextLayer=n,this.maxPoint=o}static create(A,i,n,o){return new t(A,i,n,o)}get length(){let A=this.chunk.length-1;return A<0?0:Math.max(this.chunkEnd(A),this.nextLayer.length)}get size(){if(this.isEmpty)return 0;let A=this.nextLayer.size;for(let i of this.chunk)A+=i.value.length;return A}chunkEnd(A){return this.chunkPos[A]+this.chunk[A].length}update(A){let{add:i=[],sort:n=!1,filterFrom:o=0,filterTo:a=this.length}=A,r=A.filter;if(i.length==0&&!r)return this;if(n&&(i=i.slice().sort(GM)),this.isEmpty)return i.length?t.of(i):this;let s=new p8(this,null,-1).goto(0),g=0,l=[],C=new Nr;for(;s.value||g<i.length;)if(g<i.length&&(s.from-i[g].from||s.startSide-i[g].value.startSide)>=0){let I=i[g++];C.addInner(I.from,I.to,I.value)||l.push(I)}else s.rangeIndex==1&&s.chunkIndex<this.chunk.length&&(g==i.length||this.chunkEnd(s.chunkIndex)<i[g].from)&&(!r||o>this.chunkEnd(s.chunkIndex)||a<this.chunkPos[s.chunkIndex])&&C.addChunk(this.chunkPos[s.chunkIndex],this.chunk[s.chunkIndex])?s.nextChunk():((!r||o>s.to||a<s.from||r(s.from,s.to,s.value))&&(C.addInner(s.from,s.to,s.value)||l.push(A3.create(s.from,s.to,s.value))),s.next());return C.finishInner(this.nextLayer.isEmpty&&!l.length?t.empty:this.nextLayer.update({add:l,filter:r,filterFrom:o,filterTo:a}))}map(A){if(A.empty||this.isEmpty)return this;let i=[],n=[],o=-1;for(let r=0;r<this.chunk.length;r++){let s=this.chunkPos[r],g=this.chunk[r],l=A.touchesRange(s,s+g.length);if(l===!1)o=Math.max(o,g.maxPoint),i.push(g),n.push(A.mapPos(s));else if(l===!0){let{mapped:C,pos:I}=g.map(s,A);C&&(o=Math.max(o,C.maxPoint),i.push(C),n.push(I))}}let a=this.nextLayer.map(A);return i.length==0?a:new t(n,i,a||t.empty,o)}between(A,i,n){if(!this.isEmpty){for(let o=0;o<this.chunk.length;o++){let a=this.chunkPos[o],r=this.chunk[o];if(i>=a&&A<=a+r.length&&r.between(a,A-a,i-a,n)===!1)return}this.nextLayer.between(A,i,n)}}iter(A=0){return e3.from([this]).goto(A)}get isEmpty(){return this.nextLayer==this}static iter(A,i=0){return e3.from(A).goto(i)}static compare(A,i,n,o,a=-1){let r=A.filter(I=>I.maxPoint>0||!I.isEmpty&&I.maxPoint>=a),s=i.filter(I=>I.maxPoint>0||!I.isEmpty&&I.maxPoint>=a),g=pz(r,s,n),l=new C1(r,g,a),C=new C1(s,g,a);n.iterGaps((I,d,B)=>Dz(l,I,C,d,B,o)),n.empty&&n.length==0&&Dz(l,0,C,0,0,o)}static eq(A,i,n=0,o){o==null&&(o=999999999);let a=A.filter(C=>!C.isEmpty&&i.indexOf(C)<0),r=i.filter(C=>!C.isEmpty&&A.indexOf(C)<0);if(a.length!=r.length)return!1;if(!a.length)return!0;let s=pz(a,r),g=new C1(a,s,0).goto(n),l=new C1(r,s,0).goto(n);for(;;){if(g.to!=l.to||!UM(g.active,l.active)||g.point&&(!l.point||!HM(g.point,l.point)))return!1;if(g.to>o)return!0;g.next(),l.next()}}static spans(A,i,n,o,a=-1){let r=new C1(A,null,a).goto(i),s=i,g=r.openStart;for(;;){let l=Math.min(r.to,n);if(r.point){let C=r.activeForPoint(r.to),I=r.pointFrom<i?C.length+1:r.point.startSide<0?C.length:Math.min(C.length,g);o.point(s,l,r.point,C,I,r.pointRank),g=Math.min(r.openEnd(l),C.length)}else l>s&&(o.span(s,l,r.active,g),g=r.openEnd(l));if(r.to>n)return g+(r.point&&r.to>n?1:0);s=r.to,r.next()}}static of(A,i=!1){let n=new Nr;for(let o of A instanceof A3?[A]:i?qhA(A):A)n.add(o.from,o.to,o.value);return n.finish()}static join(A){if(!A.length)return t.empty;let i=A[A.length-1];for(let n=A.length-2;n>=0;n--)for(let o=A[n];o!=t.empty;o=o.nextLayer)i=new t(o.chunkPos,o.chunk,i,Math.max(o.maxPoint,i.maxPoint));return i}}return t.empty=new t([],[],null,-1),t})();function qhA(t){if(t.length>1)for(let e=t[0],A=1;A<t.length;A++){let i=t[A];if(GM(e,i)>0)return t.slice().sort(GM);e=i}return t}zn.empty.nextLayer=zn.empty;var Nr=class t{finishChunk(e){this.chunks.push(new KM(this.from,this.to,this.value,this.maxPoint)),this.chunkPos.push(this.chunkStart),this.chunkStart=-1,this.setMaxPoint=Math.max(this.setMaxPoint,this.maxPoint),this.maxPoint=-1,e&&(this.from=[],this.to=[],this.value=[])}constructor(){this.chunks=[],this.chunkPos=[],this.chunkStart=-1,this.last=null,this.lastFrom=-1e9,this.lastTo=-1e9,this.from=[],this.to=[],this.value=[],this.maxPoint=-1,this.setMaxPoint=-1,this.nextLayer=null}add(e,A,i){this.addInner(e,A,i)||(this.nextLayer||(this.nextLayer=new t)).add(e,A,i)}addInner(e,A,i){let n=e-this.lastTo||i.startSide-this.last.endSide;if(n<=0&&(e-this.lastFrom||i.startSide-this.last.startSide)<0)throw new Error(\"Ranges must be added sorted by `from` position and `startSide`\");return n<0?!1:(this.from.length==250&&this.finishChunk(!0),this.chunkStart<0&&(this.chunkStart=e),this.from.push(e-this.chunkStart),this.to.push(A-this.chunkStart),this.last=i,this.lastFrom=e,this.lastTo=A,this.value.push(i),i.point&&(this.maxPoint=Math.max(this.maxPoint,A-e)),!0)}addChunk(e,A){if((e-this.lastTo||A.value[0].startSide-this.last.endSide)<0)return!1;this.from.length&&this.finishChunk(!0),this.setMaxPoint=Math.max(this.setMaxPoint,A.maxPoint),this.chunks.push(A),this.chunkPos.push(e);let i=A.value.length-1;return this.last=A.value[i],this.lastFrom=A.from[i]+e,this.lastTo=A.to[i]+e,!0}finish(){return this.finishInner(zn.empty)}finishInner(e){if(this.from.length&&this.finishChunk(!1),this.chunks.length==0)return e;let A=zn.create(this.chunkPos,this.chunks,this.nextLayer?this.nextLayer.finishInner(e):e,this.setMaxPoint);return this.from=null,A}};function pz(t,e,A){let i=new Map;for(let o of t)for(let a=0;a<o.chunk.length;a++)o.chunk[a].maxPoint<=0&&i.set(o.chunk[a],o.chunkPos[a]);let n=new Set;for(let o of e)for(let a=0;a<o.chunk.length;a++){let r=i.get(o.chunk[a]);r!=null&&(A?A.mapPos(r):r)==o.chunkPos[a]&&!A?.touchesRange(r,r+o.chunk[a].length)&&n.add(o.chunk[a])}return n}var p8=class{constructor(e,A,i,n=0){this.layer=e,this.skip=A,this.minPoint=i,this.rank=n}get startSide(){return this.value?this.value.startSide:0}get endSide(){return this.value?this.value.endSide:0}goto(e,A=-1e9){return this.chunkIndex=this.rangeIndex=0,this.gotoInner(e,A,!1),this}gotoInner(e,A,i){for(;this.chunkIndex<this.layer.chunk.length;){let n=this.layer.chunk[this.chunkIndex];if(!(this.skip&&this.skip.has(n)||this.layer.chunkEnd(this.chunkIndex)<e||n.maxPoint<this.minPoint))break;this.chunkIndex++,i=!1}if(this.chunkIndex<this.layer.chunk.length){let n=this.layer.chunk[this.chunkIndex].findIndex(e-this.layer.chunkPos[this.chunkIndex],A,!0);(!i||this.rangeIndex<n)&&this.setRangeIndex(n)}this.next()}forward(e,A){(this.to-e||this.endSide-A)<0&&this.gotoInner(e,A,!0)}next(){for(;;)if(this.chunkIndex==this.layer.chunk.length){this.from=this.to=1e9,this.value=null;break}else{let e=this.layer.chunkPos[this.chunkIndex],A=this.layer.chunk[this.chunkIndex],i=e+A.from[this.rangeIndex];if(this.from=i,this.to=e+A.to[this.rangeIndex],this.value=A.value[this.rangeIndex],this.setRangeIndex(this.rangeIndex+1),this.minPoint<0||this.value.point&&this.to-this.from>=this.minPoint)break}}setRangeIndex(e){if(e==this.layer.chunk[this.chunkIndex].value.length){if(this.chunkIndex++,this.skip)for(;this.chunkIndex<this.layer.chunk.length&&this.skip.has(this.layer.chunk[this.chunkIndex]);)this.chunkIndex++;this.rangeIndex=0}else this.rangeIndex=e}nextChunk(){this.chunkIndex++,this.rangeIndex=0,this.next()}compare(e){return this.from-e.from||this.startSide-e.startSide||this.rank-e.rank||this.to-e.to||this.endSide-e.endSide}},e3=class t{constructor(e){this.heap=e}static from(e,A=null,i=-1){let n=[];for(let o=0;o<e.length;o++)for(let a=e[o];!a.isEmpty;a=a.nextLayer)a.maxPoint>=i&&n.push(new p8(a,A,i,o));return n.length==1?n[0]:new t(n)}get startSide(){return this.value?this.value.startSide:0}goto(e,A=-1e9){for(let i of this.heap)i.goto(e,A);for(let i=this.heap.length>>1;i>=0;i--)bM(this.heap,i);return this.next(),this}forward(e,A){for(let i of this.heap)i.forward(e,A);for(let i=this.heap.length>>1;i>=0;i--)bM(this.heap,i);(this.to-e||this.value.endSide-A)<0&&this.next()}next(){if(this.heap.length==0)this.from=this.to=1e9,this.value=null,this.rank=-1;else{let e=this.heap[0];this.from=e.from,this.to=e.to,this.value=e.value,this.rank=e.rank,e.value&&e.next(),bM(this.heap,0)}}};function bM(t,e){for(let A=t[e];;){let i=(e<<1)+1;if(i>=t.length)break;let n=t[i];if(i+1<t.length&&n.compare(t[i+1])>=0&&(n=t[i+1],i++),A.compare(n)<0)break;t[i]=A,t[e]=n,e=i}}var C1=class{constructor(e,A,i){this.minPoint=i,this.active=[],this.activeTo=[],this.activeRank=[],this.minActive=-1,this.point=null,this.pointFrom=0,this.pointRank=0,this.to=-1e9,this.endSide=0,this.openStart=-1,this.cursor=e3.from(e,A,i)}goto(e,A=-1e9){return this.cursor.goto(e,A),this.active.length=this.activeTo.length=this.activeRank.length=0,this.minActive=-1,this.to=e,this.endSide=A,this.openStart=-1,this.next(),this}forward(e,A){for(;this.minActive>-1&&(this.activeTo[this.minActive]-e||this.active[this.minActive].endSide-A)<0;)this.removeActive(this.minActive);this.cursor.forward(e,A)}removeActive(e){d8(this.active,e),d8(this.activeTo,e),d8(this.activeRank,e),this.minActive=wz(this.active,this.activeTo)}addActive(e){let A=0,{value:i,to:n,rank:o}=this.cursor;for(;A<this.activeRank.length&&(o-this.activeRank[A]||n-this.activeTo[A])>0;)A++;B8(this.active,A,i),B8(this.activeTo,A,n),B8(this.activeRank,A,o),e&&B8(e,A,this.cursor.from),this.minActive=wz(this.active,this.activeTo)}next(){let e=this.to,A=this.point;this.point=null;let i=this.openStart<0?[]:null;for(;;){let n=this.minActive;if(n>-1&&(this.activeTo[n]-this.cursor.from||this.active[n].endSide-this.cursor.startSide)<0){if(this.activeTo[n]>e){this.to=this.activeTo[n],this.endSide=this.active[n].endSide;break}this.removeActive(n),i&&d8(i,n)}else if(this.cursor.value)if(this.cursor.from>e){this.to=this.cursor.from,this.endSide=this.cursor.startSide;break}else{let o=this.cursor.value;if(!o.point)this.addActive(i),this.cursor.next();else if(A&&this.cursor.to==this.to&&this.cursor.from<this.cursor.to)this.cursor.next();else{this.point=o,this.pointFrom=this.cursor.from,this.pointRank=this.cursor.rank,this.to=this.cursor.to,this.endSide=o.endSide,this.cursor.next(),this.forward(this.to,this.endSide);break}}else{this.to=this.endSide=1e9;break}}if(i){this.openStart=0;for(let n=i.length-1;n>=0&&i[n]<e;n--)this.openStart++}}activeForPoint(e){if(!this.active.length)return this.active;let A=[];for(let i=this.active.length-1;i>=0&&!(this.activeRank[i]<this.pointRank);i--)(this.activeTo[i]>e||this.activeTo[i]==e&&this.active[i].endSide>=this.point.endSide)&&A.push(this.active[i]);return A.reverse()}openEnd(e){let A=0;for(let i=this.activeTo.length-1;i>=0&&this.activeTo[i]>e;i--)A++;return A}};function Dz(t,e,A,i,n,o){t.goto(e),A.goto(i);let a=i+n,r=i,s=i-e,g=!!o.boundChange;for(let l=!1;;){let C=t.to+s-A.to,I=C||t.endSide-A.endSide,d=I<0?t.to+s:A.to,B=Math.min(d,a);if(t.point||A.point?(t.point&&A.point&&HM(t.point,A.point)&&UM(t.activeForPoint(t.to),A.activeForPoint(A.to))||o.comparePoint(r,B,t.point,A.point),l=!1):(l&&o.boundChange(r),B>r&&!UM(t.active,A.active)&&o.compareRange(r,B,t.active,A.active),g&&B<a&&(C||t.openEnd(d)!=A.openEnd(d))&&(l=!0)),d>a)break;r=d,I<=0&&t.next(),I>=0&&A.next()}}function UM(t,e){if(t.length!=e.length)return!1;for(let A=0;A<t.length;A++)if(t[A]!=e[A]&&!HM(t[A],e[A]))return!1;return!0}function d8(t,e){for(let A=e,i=t.length-1;A<i;A++)t[A]=t[A+1];t.pop()}function B8(t,e,A){for(let i=t.length-1;i>=e;i--)t[i+1]=t[i];t[e]=A}function wz(t,e){let A=-1,i=1e9;for(let n=0;n<e.length;n++)(e[n]-i||t[n].endSide-t[A].endSide)<0&&(A=n,i=e[n]);return A}function q0(t,e,A=t.length){let i=0;for(let n=0;n<A&&n<t.length;)t.charCodeAt(n)==9?(i+=e-i%e,n++):(i++,n=_a(t,n));return i}function D8(t,e,A,i){for(let n=0,o=0;;){if(o>=e)return n;if(n==t.length)break;o+=t.charCodeAt(n)==9?A-o%A:1,n=_a(t,n)}return i===!0?-1:t.length}var Nz=typeof Symbol>\"u\"?\"__\\u037C\":Symbol.for(\"\\u037C\"),TM=typeof Symbol>\"u\"?\"__styleSet\"+Math.floor(Math.random()*1e8):Symbol(\"styleSet\"),Fz=typeof globalThis<\"u\"?globalThis:typeof window<\"u\"?window:{},Xg=class{constructor(e,A){this.rules=[];let{finish:i}=A||{};function n(a){return/^@/.test(a)?[a]:a.split(/,\\s*/)}function o(a,r,s,g){let l=[],C=/^@(\\w+)\\b/.exec(a[0]),I=C&&C[1]==\"keyframes\";if(C&&r==null)return s.push(a[0]+\";\");for(let d in r){let B=r[d];if(/&/.test(d))o(d.split(/,\\s*/).map(Q=>a.map(E=>Q.replace(/&/,E))).reduce((Q,E)=>Q.concat(E)),B,s);else if(B&&typeof B==\"object\"){if(!C)throw new RangeError(\"The value of a property (\"+d+\") should be a primitive value.\");o(n(d),B,l,I)}else B!=null&&l.push(d.replace(/_.*/,\"\").replace(/[A-Z]/g,Q=>\"-\"+Q.toLowerCase())+\": \"+B+\";\")}(l.length||I)&&s.push((i&&!C&&!g?a.map(i):a).join(\", \")+\" {\"+l.join(\" \")+\"}\")}for(let a in e)o(n(a),e[a],this.rules)}getRules(){return this.rules.join(`\n`)}static newName(){let e=Fz[Nz]||1;return Fz[Nz]=e+1,\"\\u037C\"+e.toString(36)}static mount(e,A,i){let n=e[TM],o=i&&i.nonce;n?o&&n.setNonce(o):n=new OM(e,o),n.mount(Array.isArray(A)?A:[A],e)}},Lz=new Map,OM=class{constructor(e,A){let i=e.ownerDocument||e,n=i.defaultView;if(!e.head&&e.adoptedStyleSheets&&n.CSSStyleSheet){let o=Lz.get(i);if(o)return e[TM]=o;this.sheet=new n.CSSStyleSheet,Lz.set(i,this)}else this.styleTag=i.createElement(\"style\"),A&&this.styleTag.setAttribute(\"nonce\",A);this.modules=[],e[TM]=this}mount(e,A){let i=this.sheet,n=0,o=0;for(let a=0;a<e.length;a++){let r=e[a],s=this.modules.indexOf(r);if(s<o&&s>-1&&(this.modules.splice(s,1),o--,s=-1),s==-1){if(this.modules.splice(o++,0,r),i)for(let g=0;g<r.rules.length;g++)i.insertRule(r.rules[g],n++)}else{for(;o<s;)n+=this.modules[o++].rules.length;n+=r.rules.length,o++}}if(i)A.adoptedStyleSheets.indexOf(this.sheet)<0&&(A.adoptedStyleSheets=[this.sheet,...A.adoptedStyleSheets]);else{let a=\"\";for(let s=0;s<this.modules.length;s++)a+=this.modules[s].getRules()+`\n`;this.styleTag.textContent=a;let r=A.head||A;this.styleTag.parentNode!=r&&r.insertBefore(this.styleTag,r.firstChild)}}setNonce(e){this.styleTag&&this.styleTag.getAttribute(\"nonce\")!=e&&this.styleTag.setAttribute(\"nonce\",e)}};var V0={8:\"Backspace\",9:\"Tab\",10:\"Enter\",12:\"NumLock\",13:\"Enter\",16:\"Shift\",17:\"Control\",18:\"Alt\",20:\"CapsLock\",27:\"Escape\",32:\" \",33:\"PageUp\",34:\"PageDown\",35:\"End\",36:\"Home\",37:\"ArrowLeft\",38:\"ArrowUp\",39:\"ArrowRight\",40:\"ArrowDown\",44:\"PrintScreen\",45:\"Insert\",46:\"Delete\",59:\";\",61:\"=\",91:\"Meta\",92:\"Meta\",106:\"*\",107:\"+\",108:\",\",109:\"-\",110:\".\",111:\"/\",144:\"NumLock\",145:\"ScrollLock\",160:\"Shift\",161:\"Shift\",162:\"Control\",163:\"Control\",164:\"Alt\",165:\"Alt\",173:\"-\",186:\";\",187:\"=\",188:\",\",189:\"-\",190:\".\",191:\"/\",192:\"`\",219:\"[\",220:\"\\\\\",221:\"]\",222:\"'\"},tQ={48:\")\",49:\"!\",50:\"@\",51:\"#\",52:\"$\",53:\"%\",54:\"^\",55:\"&\",56:\"*\",57:\"(\",59:\":\",61:\"+\",173:\"_\",186:\":\",187:\"+\",188:\"<\",189:\"_\",190:\">\",191:\"?\",192:\"~\",219:\"{\",220:\"|\",221:\"}\",222:'\"'},VhA=typeof navigator<\"u\"&&/Mac/.test(navigator.platform),WhA=typeof navigator<\"u\"&&/MSIE \\d|Trident\\/(?:[7-9]|\\d{2,})\\..*rv:(\\d+)/.exec(navigator.userAgent);for(Oa=0;Oa<10;Oa++)V0[48+Oa]=V0[96+Oa]=String(Oa);var Oa;for(Oa=1;Oa<=24;Oa++)V0[Oa+111]=\"F\"+Oa;var Oa;for(Oa=65;Oa<=90;Oa++)V0[Oa]=String.fromCharCode(Oa+32),tQ[Oa]=String.fromCharCode(Oa);var Oa;for(w8 in V0)tQ.hasOwnProperty(w8)||(tQ[w8]=V0[w8]);var w8;function _z(t){var e=VhA&&t.metaKey&&t.shiftKey&&!t.ctrlKey&&!t.altKey||WhA&&t.shiftKey&&t.key&&t.key.length==1||t.key==\"Unidentified\",A=!e&&t.key||(t.shiftKey?tQ:V0)[t.keyCode]||t.key||\"Unidentified\";return A==\"Esc\"&&(A=\"Escape\"),A==\"Del\"&&(A=\"Delete\"),A==\"Left\"&&(A=\"ArrowLeft\"),A==\"Up\"&&(A=\"ArrowUp\"),A==\"Right\"&&(A=\"ArrowRight\"),A==\"Down\"&&(A=\"ArrowDown\"),A}function Pn(){var t=arguments[0];typeof t==\"string\"&&(t=document.createElement(t));var e=1,A=arguments[1];if(A&&typeof A==\"object\"&&A.nodeType==null&&!Array.isArray(A)){for(var i in A)if(Object.prototype.hasOwnProperty.call(A,i)){var n=A[i];typeof n==\"string\"?t.setAttribute(i,n):n!=null&&(t[i]=n)}e++}for(;e<arguments.length;e++)Gz(t,arguments[e]);return t}function Gz(t,e){if(typeof e==\"string\")t.appendChild(document.createTextNode(e));else if(e!=null)if(e.nodeType!=null)t.appendChild(e);else if(Array.isArray(e))for(var A=0;A<e.length;A++)Gz(t,e[A]);else throw new RangeError(\"Unsupported child node: \"+e)}var us=typeof navigator<\"u\"?navigator:{userAgent:\"\",vendor:\"\",platform:\"\"},tk=typeof document<\"u\"?document:{documentElement:{style:{}}},ik=/Edge\\/(\\d+)/.exec(us.userAgent),yP=/MSIE \\d/.test(us.userAgent),nk=/Trident\\/(?:[7-9]|\\d{2,})\\..*rv:(\\d+)/.exec(us.userAgent),i5=!!(yP||nk||ik),Kz=!i5&&/gecko\\/(\\d+)/i.test(us.userAgent),zM=!i5&&/Chrome\\/(\\d+)/.exec(us.userAgent),Uz=\"webkitFontSmoothing\"in tk.documentElement.style,ok=!i5&&/Apple Computer/.test(us.vendor),Jz=ok&&(/Mobile\\/\\w+/.test(us.userAgent)||us.maxTouchPoints>2),ot={mac:Jz||/Mac/.test(us.platform),windows:/Win/.test(us.platform),linux:/Linux|X11/.test(us.platform),ie:i5,ie_version:yP?tk.documentMode||6:nk?+nk[1]:ik?+ik[1]:0,gecko:Kz,gecko_version:Kz?+(/Firefox\\/(\\d+)/.exec(us.userAgent)||[0,0])[1]:0,chrome:!!zM,chrome_version:zM?+zM[1]:0,ios:Jz,android:/Android\\b/.test(us.userAgent),webkit:Uz,webkit_version:Uz?+(/\\bAppleWebKit\\/(\\d+)/.exec(us.userAgent)||[0,0])[1]:0,safari:ok,safari_version:ok?+(/\\bVersion\\/(\\d+(\\.\\d+)?)/.exec(us.userAgent)||[0,0])[1]:0,tabSize:tk.documentElement.style.tabSize!=null?\"tab-size\":\"-moz-tab-size\"};function Wk(t,e){for(let A in t)A==\"class\"&&e.class?e.class+=\" \"+t.class:A==\"style\"&&e.style?e.style+=\";\"+t.style:e[A]=t[A];return e}var U8=Object.create(null);function Zk(t,e,A){if(t==e)return!0;t||(t=U8),e||(e=U8);let i=Object.keys(t),n=Object.keys(e);if(i.length-(A&&i.indexOf(A)>-1?1:0)!=n.length-(A&&n.indexOf(A)>-1?1:0))return!1;for(let o of i)if(o!=A&&(n.indexOf(o)==-1||t[o]!==e[o]))return!1;return!0}function ZhA(t,e){for(let A=t.attributes.length-1;A>=0;A--){let i=t.attributes[A].name;e[i]==null&&t.removeAttribute(i)}for(let A in e){let i=e[A];A==\"style\"?t.style.cssText=i:t.getAttribute(A)!=i&&t.setAttribute(A,i)}}function Yz(t,e,A){let i=!1;if(e)for(let n in e)A&&n in A||(i=!0,n==\"style\"?t.style.cssText=\"\":t.removeAttribute(n));if(A)for(let n in A)e&&e[n]==A[n]||(i=!0,n==\"style\"?t.style.cssText=A[n]:t.setAttribute(n,A[n]));return i}function XhA(t){let e=Object.create(null);for(let A=0;A<t.attributes.length;A++){let i=t.attributes[A];e[i.name]=i.value}return e}var Ps=class{eq(e){return!1}updateDOM(e,A,i){return!1}compare(e){return this==e||this.constructor==e.constructor&&this.eq(e)}get estimatedHeight(){return-1}get lineBreaks(){return 0}ignoreEvent(e){return!0}coordsAt(e,A,i){return null}get isHidden(){return!1}get editable(){return!1}destroy(e){}},Lr=(function(t){return t[t.Text=0]=\"Text\",t[t.WidgetBefore=1]=\"WidgetBefore\",t[t.WidgetAfter=2]=\"WidgetAfter\",t[t.WidgetRange=3]=\"WidgetRange\",t})(Lr||(Lr={})),vt=class extends Zg{constructor(e,A,i,n){super(),this.startSide=e,this.endSide=A,this.widget=i,this.spec=n}get heightRelevant(){return!1}static mark(e){return new B3(e)}static widget(e){let A=Math.max(-1e4,Math.min(1e4,e.side||0)),i=!!e.block;return A+=i&&!e.inlineOrder?A>0?3e8:-4e8:A>0?1e8:-1e8,new h1(e,A,A,i,e.widget||null,!1)}static replace(e){let A=!!e.block,i,n;if(e.isBlockGap)i=-5e8,n=4e8;else{let{start:o,end:a}=vP(e,A);i=(o?A?-3e8:-1:5e8)-1,n=(a?A?2e8:1:-6e8)+1}return new h1(e,i,n,A,e.widget||null,!0)}static line(e){return new Q3(e)}static set(e,A=!1){return zn.of(e,A)}hasHeight(){return this.widget?this.widget.estimatedHeight>-1:!1}};vt.none=zn.empty;var B3=class t extends vt{constructor(e){let{start:A,end:i}=vP(e);super(A?-1:5e8,i?1:-6e8,null,e),this.tagName=e.tagName||\"span\",this.attrs=e.class&&e.attributes?Wk(e.attributes,{class:e.class}):e.class?{class:e.class}:e.attributes||U8}eq(e){return this==e||e instanceof t&&this.tagName==e.tagName&&Zk(this.attrs,e.attrs)}range(e,A=e){if(e>=A)throw new RangeError(\"Mark decorations may not be empty\");return super.range(e,A)}};B3.prototype.point=!1;var Q3=class t extends vt{constructor(e){super(-2e8,-2e8,null,e)}eq(e){return e instanceof t&&this.spec.class==e.spec.class&&Zk(this.spec.attributes,e.spec.attributes)}range(e,A=e){if(A!=e)throw new RangeError(\"Line decoration ranges must be zero-length\");return super.range(e,A)}};Q3.prototype.mapMode=xr.TrackBefore;Q3.prototype.point=!0;var h1=class t extends vt{constructor(e,A,i,n,o,a){super(A,i,o,e),this.block=n,this.isReplace=a,this.mapMode=n?A<=0?xr.TrackBefore:xr.TrackAfter:xr.TrackDel}get type(){return this.startSide!=this.endSide?Lr.WidgetRange:this.startSide<=0?Lr.WidgetBefore:Lr.WidgetAfter}get heightRelevant(){return this.block||!!this.widget&&(this.widget.estimatedHeight>=5||this.widget.lineBreaks>0)}eq(e){return e instanceof t&&$hA(this.widget,e.widget)&&this.block==e.block&&this.startSide==e.startSide&&this.endSide==e.endSide}range(e,A=e){if(this.isReplace&&(e>A||e==A&&this.startSide>0&&this.endSide<=0))throw new RangeError(\"Invalid range for replacement decoration\");if(!this.isReplace&&A!=e)throw new RangeError(\"Widget decorations can only have zero-length ranges\");return super.range(e,A)}};h1.prototype.point=!0;function vP(t,e=!1){let{inclusiveStart:A,inclusiveEnd:i}=t;return A==null&&(A=t.inclusive),i==null&&(i=t.inclusive),{start:A??e,end:i??e}}function $hA(t,e){return t==e||!!(t&&e&&t.compare(e))}function sQ(t,e,A,i=0){let n=A.length-1;n>=0&&A[n]+i>=t?A[n]=Math.max(A[n],e):A.push(t,e)}var J8=class t extends Zg{constructor(e,A){super(),this.tagName=e,this.attributes=A}eq(e){return e==this||e instanceof t&&this.tagName==e.tagName&&Zk(this.attributes,e.attributes)}static create(e){return new t(e.tagName,e.attributes||U8)}static set(e,A=!1){return zn.of(e,A)}};J8.prototype.startSide=J8.prototype.endSide=-1;function E3(t){let e;return t.nodeType==11?e=t.getSelection?t:t.ownerDocument:e=t,e.getSelection()}function ak(t,e){return e?t==e||t.contains(e.nodeType!=1?e.parentNode:e):!1}function a3(t,e){if(!e.anchorNode)return!1;try{return ak(t,e.anchorNode)}catch(A){return!1}}function F8(t){return t.nodeType==3?h3(t,0,t.nodeValue.length).getClientRects():t.nodeType==1?t.getClientRects():[]}function r3(t,e,A,i){return A?Hz(t,e,A,i,-1)||Hz(t,e,A,i,1):!1}function R2(t){for(var e=0;;e++)if(t=t.previousSibling,!t)return e}function Y8(t){return t.nodeType==1&&/^(DIV|P|LI|UL|OL|BLOCKQUOTE|DD|DT|H\\d|SECTION|PRE)$/.test(t.nodeName)}function Hz(t,e,A,i,n){for(;;){if(t==A&&e==i)return!0;if(e==(n<0?0:X0(t))){if(t.nodeName==\"DIV\")return!1;let o=t.parentNode;if(!o||o.nodeType!=1)return!1;e=R2(t)+(n<0?0:1),t=o}else if(t.nodeType==1){if(t=t.childNodes[e+(n<0?-1:0)],t.nodeType==1&&t.contentEditable==\"false\")return!1;e=n<0?X0(t):0}else return!1}}function X0(t){return t.nodeType==3?t.nodeValue.length:t.childNodes.length}function H8(t,e){let A=e?t.left:t.right;return{left:A,right:A,top:t.top,bottom:t.bottom}}function A4A(t){let e=t.visualViewport;return e?{left:0,right:e.width,top:0,bottom:e.height}:{left:0,right:t.innerWidth,top:0,bottom:t.innerHeight}}function bP(t,e){let A=e.width/t.offsetWidth,i=e.height/t.offsetHeight;return(A>.995&&A<1.005||!isFinite(A)||Math.abs(e.width-t.offsetWidth)<1)&&(A=1),(i>.995&&i<1.005||!isFinite(i)||Math.abs(e.height-t.offsetHeight)<1)&&(i=1),{scaleX:A,scaleY:i}}function e4A(t,e,A,i,n,o,a,r){let s=t.ownerDocument,g=s.defaultView||window;for(let l=t,C=!1;l&&!C;)if(l.nodeType==1){let I,d=l==s.body,B=1,Q=1;if(d)I=A4A(g);else{if(/^(fixed|sticky)$/.test(getComputedStyle(l).position)&&(C=!0),l.scrollHeight<=l.clientHeight&&l.scrollWidth<=l.clientWidth){l=l.assignedSlot||l.parentNode;continue}let b=l.getBoundingClientRect();({scaleX:B,scaleY:Q}=bP(l,b)),I={left:b.left,right:b.left+l.clientWidth*B,top:b.top,bottom:b.top+l.clientHeight*Q}}let E=0,f=0;if(n==\"nearest\")e.top<I.top?(f=e.top-(I.top+a),A>0&&e.bottom>I.bottom+f&&(f=e.bottom-I.bottom+a)):e.bottom>I.bottom&&(f=e.bottom-I.bottom+a,A<0&&e.top-f<I.top&&(f=e.top-(I.top+a)));else{let b=e.bottom-e.top,R=I.bottom-I.top;f=(n==\"center\"&&b<=R?e.top+b/2-R/2:n==\"start\"||n==\"center\"&&A<0?e.top-a:e.bottom-R+a)-I.top}if(i==\"nearest\"?e.left<I.left?(E=e.left-(I.left+o),A>0&&e.right>I.right+E&&(E=e.right-I.right+o)):e.right>I.right&&(E=e.right-I.right+o,A<0&&e.left<I.left+E&&(E=e.left-(I.left+o))):E=(i==\"center\"?e.left+(e.right-e.left)/2-(I.right-I.left)/2:i==\"start\"==r?e.left-o:e.right-(I.right-I.left)+o)-I.left,E||f)if(d)g.scrollBy(E,f);else{let b=0,R=0;if(f){let M=l.scrollTop;l.scrollTop+=f/Q,R=(l.scrollTop-M)*Q}if(E){let M=l.scrollLeft;l.scrollLeft+=E/B,b=(l.scrollLeft-M)*B}e={left:e.left-b,top:e.top-R,right:e.right-b,bottom:e.bottom-R},b&&Math.abs(b-E)<1&&(i=\"nearest\"),R&&Math.abs(R-f)<1&&(n=\"nearest\")}if(d)break;(e.top<I.top||e.bottom>I.bottom||e.left<I.left||e.right>I.right)&&(e={left:Math.max(e.left,I.left),right:Math.min(e.right,I.right),top:Math.max(e.top,I.top),bottom:Math.min(e.bottom,I.bottom)}),l=l.assignedSlot||l.parentNode}else if(l.nodeType==11)l=l.host;else break}function MP(t,e=!0){let A=t.ownerDocument,i=null,n=null;for(let o=t.parentNode;o&&!(o==A.body||(!e||i)&&n);)if(o.nodeType==1)!n&&o.scrollHeight>o.clientHeight&&(n=o),e&&!i&&o.scrollWidth>o.clientWidth&&(i=o),o=o.assignedSlot||o.parentNode;else if(o.nodeType==11)o=o.host;else break;return{x:i,y:n}}var rk=class{constructor(){this.anchorNode=null,this.anchorOffset=0,this.focusNode=null,this.focusOffset=0}eq(e){return this.anchorNode==e.anchorNode&&this.anchorOffset==e.anchorOffset&&this.focusNode==e.focusNode&&this.focusOffset==e.focusOffset}setRange(e){let{anchorNode:A,focusNode:i}=e;this.set(A,Math.min(e.anchorOffset,A?X0(A):0),i,Math.min(e.focusOffset,i?X0(i):0))}set(e,A,i,n){this.anchorNode=e,this.anchorOffset=A,this.focusNode=i,this.focusOffset=n}},B1=null;ot.safari&&ot.safari_version>=26&&(B1=!1);function kP(t){if(t.setActive)return t.setActive();if(B1)return t.focus(B1);let e=[];for(let A=t;A&&(e.push(A,A.scrollTop,A.scrollLeft),A!=A.ownerDocument);A=A.parentNode);if(t.focus(B1==null?{get preventScroll(){return B1={preventScroll:!0},!0}}:void 0),!B1){B1=!1;for(let A=0;A<e.length;){let i=e[A++],n=e[A++],o=e[A++];i.scrollTop!=n&&(i.scrollTop=n),i.scrollLeft!=o&&(i.scrollLeft=o)}}}var Tz;function h3(t,e,A=e){let i=Tz||(Tz=document.createRange());return i.setEnd(t,A),i.setStart(t,e),i}function gQ(t,e,A,i){let n={key:e,code:e,keyCode:A,which:A,cancelable:!0};i&&({altKey:n.altKey,ctrlKey:n.ctrlKey,shiftKey:n.shiftKey,metaKey:n.metaKey}=i);let o=new KeyboardEvent(\"keydown\",n);o.synthetic=!0,t.dispatchEvent(o);let a=new KeyboardEvent(\"keyup\",n);return a.synthetic=!0,t.dispatchEvent(a),o.defaultPrevented||a.defaultPrevented}function t4A(t){for(;t;){if(t&&(t.nodeType==9||t.nodeType==11&&t.host))return t;t=t.assignedSlot||t.parentNode}return null}function i4A(t,e){let A=e.focusNode,i=e.focusOffset;if(!A||e.anchorNode!=A||e.anchorOffset!=i)return!1;for(i=Math.min(i,X0(A));;)if(i){if(A.nodeType!=1)return!1;let n=A.childNodes[i-1];n.contentEditable==\"false\"?i--:(A=n,i=X0(A))}else{if(A==t)return!0;i=R2(A),A=A.parentNode}}function SP(t){return t instanceof Window?t.pageYOffset>Math.max(0,t.document.documentElement.scrollHeight-t.innerHeight-4):t.scrollTop>Math.max(1,t.scrollHeight-t.clientHeight-4)}function xP(t,e){for(let A=t,i=e;;){if(A.nodeType==3&&i>0)return{node:A,offset:i};if(A.nodeType==1&&i>0){if(A.contentEditable==\"false\")return null;A=A.childNodes[i-1],i=X0(A)}else if(A.parentNode&&!Y8(A))i=R2(A),A=A.parentNode;else return null}}function RP(t,e){for(let A=t,i=e;;){if(A.nodeType==3&&i<A.nodeValue.length)return{node:A,offset:i};if(A.nodeType==1&&i<A.childNodes.length){if(A.contentEditable==\"false\")return null;A=A.childNodes[i],i=0}else if(A.parentNode&&!Y8(A))i=R2(A)+1,A=A.parentNode;else return null}}var $c=class t{constructor(e,A,i=!0){this.node=e,this.offset=A,this.precise=i}static before(e,A){return new t(e.parentNode,R2(e),A)}static after(e,A){return new t(e.parentNode,R2(e)+1,A)}},go=(function(t){return t[t.LTR=0]=\"LTR\",t[t.RTL=1]=\"RTL\",t})(go||(go={})),u1=go.LTR,Xk=go.RTL;function NP(t){let e=[];for(let A=0;A<t.length;A++)e.push(1<<+t[A]);return e}var n4A=NP(\"88888888888888888888888888888888888666888888787833333333337888888000000000000000000000000008888880000000000000000000000000088888888888888888888888888888888888887866668888088888663380888308888800000000000000000000000800000000000000000000000000000008\"),o4A=NP(\"4444448826627288999999999992222222222222222222222222222222222222222222222229999999999999999999994444444444644222822222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222999999949999999229989999223333333333\"),sk=Object.create(null),Xc=[];for(let t of[\"()\",\"[]\",\"{}\"]){let e=t.charCodeAt(0),A=t.charCodeAt(1);sk[e]=A,sk[A]=-e}function FP(t){return t<=247?n4A[t]:1424<=t&&t<=1524?2:1536<=t&&t<=1785?o4A[t-1536]:1774<=t&&t<=2220?4:8192<=t&&t<=8204?256:64336<=t&&t<=65023?4:1}var a4A=/[\\u0590-\\u05f4\\u0600-\\u06ff\\u0700-\\u08ac\\ufb50-\\ufdff]/,el=class{get dir(){return this.level%2?Xk:u1}constructor(e,A,i){this.from=e,this.to=A,this.level=i}side(e,A){return this.dir==A==e?this.to:this.from}forward(e,A){return e==(this.dir==A)}static find(e,A,i,n){let o=-1;for(let a=0;a<e.length;a++){let r=e[a];if(r.from<=A&&r.to>=A){if(r.level==i)return a;(o<0||(n!=0?n<0?r.from<A:r.to>A:e[o].level>r.level))&&(o=a)}}if(o<0)throw new RangeError(\"Index out of range\");return o}};function LP(t,e){if(t.length!=e.length)return!1;for(let A=0;A<t.length;A++){let i=t[A],n=e[A];if(i.from!=n.from||i.to!=n.to||i.direction!=n.direction||!LP(i.inner,n.inner))return!1}return!0}var _o=[];function r4A(t,e,A,i,n){for(let o=0;o<=i.length;o++){let a=o?i[o-1].to:e,r=o<i.length?i[o].from:A,s=o?256:n;for(let g=a,l=s,C=s;g<r;g++){let I=FP(t.charCodeAt(g));I==512?I=l:I==8&&C==4&&(I=16),_o[g]=I==4?2:I,I&7&&(C=I),l=I}for(let g=a,l=s,C=s;g<r;g++){let I=_o[g];if(I==128)g<r-1&&l==_o[g+1]&&l&24?I=_o[g]=l:_o[g]=256;else if(I==64){let d=g+1;for(;d<r&&_o[d]==64;)d++;let B=g&&l==8||d<A&&_o[d]==8?C==1?1:8:256;for(let Q=g;Q<d;Q++)_o[Q]=B;g=d-1}else I==8&&C==1&&(_o[g]=1);l=I,I&7&&(C=I)}}}function s4A(t,e,A,i,n){let o=n==1?2:1;for(let a=0,r=0,s=0;a<=i.length;a++){let g=a?i[a-1].to:e,l=a<i.length?i[a].from:A;for(let C=g,I,d,B;C<l;C++)if(d=sk[I=t.charCodeAt(C)])if(d<0){for(let Q=r-3;Q>=0;Q-=3)if(Xc[Q+1]==-d){let E=Xc[Q+2],f=E&2?n:E&4?E&1?o:n:0;f&&(_o[C]=_o[Xc[Q]]=f),r=Q;break}}else{if(Xc.length==189)break;Xc[r++]=C,Xc[r++]=I,Xc[r++]=s}else if((B=_o[C])==2||B==1){let Q=B==n;s=Q?0:1;for(let E=r-3;E>=0;E-=3){let f=Xc[E+2];if(f&2)break;if(Q)Xc[E+2]|=2;else{if(f&4)break;Xc[E+2]|=4}}}}}function g4A(t,e,A,i){for(let n=0,o=i;n<=A.length;n++){let a=n?A[n-1].to:t,r=n<A.length?A[n].from:e;for(let s=a;s<r;){let g=_o[s];if(g==256){let l=s+1;for(;;)if(l==r){if(n==A.length)break;l=A[n++].to,r=n<A.length?A[n].from:e}else if(_o[l]==256)l++;else break;let C=o==1,I=(l<e?_o[l]:i)==1,d=C==I?C?1:2:i;for(let B=l,Q=n,E=Q?A[Q-1].to:t;B>s;)B==E&&(B=A[--Q].from,E=Q?A[Q-1].to:t),_o[--B]=d;s=l}else o=g,s++}}}function gk(t,e,A,i,n,o,a){let r=i%2?2:1;if(i%2==n%2)for(let s=e,g=0;s<A;){let l=!0,C=!1;if(g==o.length||s<o[g].from){let Q=_o[s];Q!=r&&(l=!1,C=Q==16)}let I=!l&&r==1?[]:null,d=l?i:i+1,B=s;A:for(;;)if(g<o.length&&B==o[g].from){if(C)break A;let Q=o[g];if(!l)for(let E=Q.to,f=g+1;;){if(E==A)break A;if(f<o.length&&o[f].from==E)E=o[f++].to;else{if(_o[E]==r)break A;break}}if(g++,I)I.push(Q);else{Q.from>s&&a.push(new el(s,Q.from,d));let E=Q.direction==u1!=!(d%2);lk(t,E?i+1:i,n,Q.inner,Q.from,Q.to,a),s=Q.to}B=Q.to}else{if(B==A||(l?_o[B]!=r:_o[B]==r))break;B++}I?gk(t,s,B,i+1,n,I,a):s<B&&a.push(new el(s,B,d)),s=B}else for(let s=A,g=o.length;s>e;){let l=!0,C=!1;if(!g||s>o[g-1].to){let Q=_o[s-1];Q!=r&&(l=!1,C=Q==16)}let I=!l&&r==1?[]:null,d=l?i:i+1,B=s;A:for(;;)if(g&&B==o[g-1].to){if(C)break A;let Q=o[--g];if(!l)for(let E=Q.from,f=g;;){if(E==e)break A;if(f&&o[f-1].to==E)E=o[--f].from;else{if(_o[E-1]==r)break A;break}}if(I)I.push(Q);else{Q.to<s&&a.push(new el(Q.to,s,d));let E=Q.direction==u1!=!(d%2);lk(t,E?i+1:i,n,Q.inner,Q.from,Q.to,a),s=Q.from}B=Q.from}else{if(B==e||(l?_o[B-1]!=r:_o[B-1]==r))break;B--}I?gk(t,B,s,i+1,n,I,a):B<s&&a.push(new el(B,s,d)),s=B}}function lk(t,e,A,i,n,o,a){let r=e%2?2:1;r4A(t,n,o,i,r),s4A(t,n,o,i,r),g4A(n,o,i,r),gk(t,n,o,e,A,i,a)}function l4A(t,e,A){if(!t)return[new el(0,0,e==Xk?1:0)];if(e==u1&&!A.length&&!a4A.test(t))return _P(t.length);if(A.length)for(;t.length>_o.length;)_o[_o.length]=256;let i=[],n=e==u1?0:1;return lk(t,n,n,A,0,t.length,i),i}function _P(t){return[new el(0,t,0)]}var GP=\"\";function c4A(t,e,A,i,n){var o;let a=i.head-t.from,r=el.find(e,a,(o=i.bidiLevel)!==null&&o!==void 0?o:-1,i.assoc),s=e[r],g=s.side(n,A);if(a==g){let I=r+=n?1:-1;if(I<0||I>=e.length)return null;s=e[r=I],a=s.side(!n,A),g=s.side(n,A)}let l=_a(t.text,a,s.forward(n,A));(l<s.from||l>s.to)&&(l=g),GP=t.text.slice(Math.min(a,l),Math.max(a,l));let C=r==(n?e.length-1:0)?null:e[r+(n?1:-1)];return C&&l==g&&C.level+(n?0:1)<s.level?ce.cursor(C.side(!n,A)+t.from,C.forward(n,A)?1:-1,C.level):ce.cursor(l+t.from,s.forward(n,A)?-1:1,s.level)}function C4A(t,e,A){for(let i=e;i<A;i++){let n=FP(t.charCodeAt(i));if(n==1)return u1;if(n==2||n==4)return Xk}return u1}var KP=qe.define(),UP=qe.define(),JP=qe.define(),YP=qe.define(),PM=qe.define(),HP=qe.define(),TP=qe.define(),$k=qe.define(),AS=qe.define(),Oz=qe.define({combine:t=>t.some(e=>e)}),OP=qe.define({combine:t=>t.some(e=>e)}),zP=qe.define(),s3=class t{constructor(e,A=\"nearest\",i=\"nearest\",n=5,o=5,a=!1){this.range=e,this.y=A,this.x=i,this.yMargin=n,this.xMargin=o,this.isSnapshot=a}map(e){return e.empty?this:new t(this.range.map(e),this.y,this.x,this.yMargin,this.xMargin,this.isSnapshot)}clip(e){return this.range.to<=e.doc.length?this:new t(ce.cursor(e.doc.length),this.y,this.x,this.yMargin,this.xMargin,this.isSnapshot)}},y8=Ui.define({map:(t,e)=>t.map(e)}),PP=Ui.define();function dr(t,e,A){let i=t.facet(YP);i.length?i[0](e):window.onerror&&window.onerror(String(e),A,void 0,void 0,e)||(A?console.error(A+\":\",e):console.error(e))}var W0=qe.define({combine:t=>t.length?t[0]:!0}),I4A=0,nQ=qe.define({combine(t){return t.filter((e,A)=>{for(let i=0;i<A;i++)if(t[i].plugin==e.plugin)return!1;return!0})}}),ho=class t{constructor(e,A,i,n,o){this.id=e,this.create=A,this.domEventHandlers=i,this.domEventObservers=n,this.baseExtensions=o(this),this.extension=this.baseExtensions.concat(nQ.of({plugin:this,arg:void 0}))}of(e){return this.baseExtensions.concat(nQ.of({plugin:this,arg:e}))}static define(e,A){let{eventHandlers:i,eventObservers:n,provide:o,decorations:a}=A||{};return new t(I4A++,e,i,n,r=>{let s=[];return a&&s.push(n5.of(g=>{let l=g.plugin(r);return l?a(l):vt.none})),o&&s.push(o(r)),s})}static fromClass(e,A){return t.define((i,n)=>new e(i,n),A)}},g3=class{constructor(e){this.spec=e,this.mustUpdate=null,this.value=null}get plugin(){return this.spec&&this.spec.plugin}update(e){if(this.value){if(this.mustUpdate){let A=this.mustUpdate;if(this.mustUpdate=null,this.value.update)try{this.value.update(A)}catch(i){if(dr(A.state,i,\"CodeMirror plugin crashed\"),this.value.destroy)try{this.value.destroy()}catch(n){}this.deactivate()}}}else if(this.spec)try{this.value=this.spec.plugin.create(e,this.spec.arg)}catch(A){dr(e.state,A,\"CodeMirror plugin crashed\"),this.deactivate()}return this}destroy(e){var A;if(!((A=this.value)===null||A===void 0)&&A.destroy)try{this.value.destroy()}catch(i){dr(e.state,i,\"CodeMirror plugin crashed\")}}deactivate(){this.spec=this.value=null}},zz=qe.define(),ck=qe.define(),n5=qe.define(),jP=qe.define(),eS=qe.define(),u3=qe.define(),qP=qe.define();function Pz(t,e){let A=t.state.facet(qP);if(!A.length)return A;let i=A.map(o=>o instanceof Function?o(t):o),n=[];return zn.spans(i,e.from,e.to,{point(){},span(o,a,r,s){let g=o-e.from,l=a-e.from,C=n;for(let I=r.length-1;I>=0;I--,s--){let d=r[I].spec.bidiIsolate,B;if(d==null&&(d=C4A(e.text,g,l)),s>0&&C.length&&(B=C[C.length-1]).to==g&&B.direction==d)B.to=l,C=B.inner;else{let Q={from:g,to:l,direction:d,inner:[]};C.push(Q),C=Q.inner}}}}),n}var VP=qe.define();function tS(t){let e=0,A=0,i=0,n=0;for(let o of t.state.facet(VP)){let a=o(t);a&&(a.left!=null&&(e=Math.max(e,a.left)),a.right!=null&&(A=Math.max(A,a.right)),a.top!=null&&(i=Math.max(i,a.top)),a.bottom!=null&&(n=Math.max(n,a.bottom)))}return{left:e,right:A,top:i,bottom:n}}var i3=qe.define(),jl=class t{constructor(e,A,i,n){this.fromA=e,this.toA=A,this.fromB=i,this.toB=n}join(e){return new t(Math.min(this.fromA,e.fromA),Math.max(this.toA,e.toA),Math.min(this.fromB,e.fromB),Math.max(this.toB,e.toB))}addToSet(e){let A=e.length,i=this;for(;A>0;A--){let n=e[A-1];if(!(n.fromA>i.toA)){if(n.toA<i.fromA)break;i=i.join(n),e.splice(A-1,1)}}return e.splice(A,0,i),e}static extendWithRanges(e,A){if(A.length==0)return e;let i=[];for(let n=0,o=0,a=0;;){let r=n<e.length?e[n].fromB:1e9,s=o<A.length?A[o]:1e9,g=Math.min(r,s);if(g==1e9)break;let l=g+a,C=g,I=l;for(;;)if(o<A.length&&A[o]<=C){let d=A[o+1];o+=2,C=Math.max(C,d);for(let B=n;B<e.length&&e[B].fromB<=C;B++)a=e[B].toA-e[B].toB;I=Math.max(I,d+a)}else if(n<e.length&&e[n].fromB<=C){let d=e[n++];C=Math.max(C,d.toB),I=Math.max(I,d.toA),a=d.toA-d.toB}else break;i.push(new t(l,I,g,C))}return i}},T8=class t{constructor(e,A,i){this.view=e,this.state=A,this.transactions=i,this.flags=0,this.startState=e.state,this.changes=Rr.empty(this.startState.doc.length);for(let o of i)this.changes=this.changes.compose(o.changes);let n=[];this.changes.iterChangedRanges((o,a,r,s)=>n.push(new jl(o,a,r,s))),this.changedRanges=n}static create(e,A,i){return new t(e,A,i)}get viewportChanged(){return(this.flags&4)>0}get viewportMoved(){return(this.flags&8)>0}get heightChanged(){return(this.flags&2)>0}get geometryChanged(){return this.docChanged||(this.flags&18)>0}get focusChanged(){return(this.flags&1)>0}get docChanged(){return!this.changes.empty}get selectionSet(){return this.transactions.some(e=>e.selection)}get empty(){return this.flags==0&&this.transactions.length==0}},d4A=[],sa=class{constructor(e,A,i=0){this.dom=e,this.length=A,this.flags=i,this.parent=null,e.cmTile=this}get breakAfter(){return this.flags&1}get children(){return d4A}isWidget(){return!1}get isHidden(){return!1}isComposite(){return!1}isLine(){return!1}isText(){return!1}isBlock(){return!1}get domAttrs(){return null}sync(e){if(this.flags|=2,this.flags&4){this.flags&=-5;let A=this.domAttrs;A&&ZhA(this.dom,A)}}toString(){return this.constructor.name+(this.children.length?`(${this.children})`:\"\")+(this.breakAfter?\"#\":\"\")}destroy(){this.parent=null}setDOM(e){this.dom=e,e.cmTile=this}get posAtStart(){return this.parent?this.parent.posBefore(this):0}get posAtEnd(){return this.posAtStart+this.length}posBefore(e,A=this.posAtStart){let i=A;for(let n of this.children){if(n==e)return i;i+=n.length+n.breakAfter}throw new RangeError(\"Invalid child in posBefore\")}posAfter(e){return this.posBefore(e)+e.length}covers(e){return!0}coordsIn(e,A){return null}domPosFor(e,A){let i=R2(this.dom),n=this.length?e>0:A>0;return new $c(this.parent.dom,i+(n?1:0),e==0||e==this.length)}markDirty(e){this.flags&=-3,e&&(this.flags|=4),this.parent&&this.parent.flags&2&&this.parent.markDirty(!1)}get overrideDOMText(){return null}get root(){for(let e=this;e;e=e.parent)if(e instanceof cQ)return e;return null}static get(e){return e.cmTile}},lQ=class extends sa{constructor(e){super(e,0),this._children=[]}isComposite(){return!0}get children(){return this._children}get lastChild(){return this.children.length?this.children[this.children.length-1]:null}append(e){this.children.push(e),e.parent=this}sync(e){if(this.flags&2)return;super.sync(e);let A=this.dom,i=null,n,o=e?.node==A?e:null,a=0;for(let r of this.children){if(r.sync(e),a+=r.length+r.breakAfter,n=i?i.nextSibling:A.firstChild,o&&n!=r.dom&&(o.written=!0),r.dom.parentNode==A)for(;n&&n!=r.dom;)n=jz(n);else A.insertBefore(r.dom,n);i=r.dom}for(n=i?i.nextSibling:A.firstChild,o&&n&&(o.written=!0);n;)n=jz(n);this.length=a}};function jz(t){let e=t.nextSibling;return t.parentNode.removeChild(t),e}var cQ=class extends lQ{constructor(e,A){super(A),this.view=e}owns(e){for(;e;e=e.parent)if(e==this)return!0;return!1}isBlock(){return!0}nearest(e){for(;;){if(!e)return null;let A=sa.get(e);if(A&&this.owns(A))return A;e=e.parentNode}}blockTiles(e){for(let A=[],i=this,n=0,o=0;;)if(n==i.children.length){if(!A.length)return;i=i.parent,i.breakAfter&&o++,n=A.pop()}else{let a=i.children[n++];if(a instanceof Z0)A.push(n),i=a,n=0;else{let r=o+a.length,s=e(a,o);if(s!==void 0)return s;o=r+a.breakAfter}}}resolveBlock(e,A){let i,n=-1,o,a=-1;if(this.blockTiles((r,s)=>{let g=s+r.length;if(e>=s&&e<=g){if(r.isWidget()&&A>=-1&&A<=1){if(r.flags&32)return!0;r.flags&16&&(i=void 0)}(s<e||e==g&&(A<-1?r.length:r.covers(1)))&&(!i||!r.isWidget()&&i.isWidget())&&(i=r,n=e-s),(g>e||e==s&&(A>1?r.length:r.covers(-1)))&&(!o||!r.isWidget()&&o.isWidget())&&(o=r,a=e-s)}}),!i&&!o)throw new Error(\"No tile at position \"+e);return i&&A<0||!o?{tile:i,offset:n}:{tile:o,offset:a}}},Z0=class t extends lQ{constructor(e,A){super(e),this.wrapper=A}isBlock(){return!0}covers(e){return this.children.length?e<0?this.children[0].covers(-1):this.lastChild.covers(1):!1}get domAttrs(){return this.wrapper.attributes}static of(e,A){let i=new t(A||document.createElement(e.tagName),e);return A||(i.flags|=4),i}},CQ=class t extends lQ{constructor(e,A){super(e),this.attrs=A}isLine(){return!0}static start(e,A,i){let n=new t(A||document.createElement(\"div\"),e);return(!A||!i)&&(n.flags|=4),n}get domAttrs(){return this.attrs}resolveInline(e,A,i){let n=null,o=-1,a=null,r=-1;function s(l,C){for(let I=0,d=0;I<l.children.length&&d<=C;I++){let B=l.children[I],Q=d+B.length;Q>=C&&(B.isComposite()?s(B,C-d):(!a||a.isHidden&&(A>0||i&&Q4A(a,B)))&&(Q>C||B.flags&32)?(a=B,r=C-d):(d<C||B.flags&16&&!B.isHidden)&&(n=B,o=C-d)),d=Q}}s(this,e);let g=(A<0?n:a)||n||a;return g?{tile:g,offset:g==n?o:r}:null}coordsIn(e,A){let i=this.resolveInline(e,A,!0);return i?i.tile.coordsIn(Math.max(0,i.offset),A):B4A(this)}domIn(e,A){let i=this.resolveInline(e,A);if(i){let{tile:n,offset:o}=i;if(this.dom.contains(n.dom))return n.isText()?new $c(n.dom,Math.min(n.dom.nodeValue.length,o)):n.domPosFor(o,n.flags&16?1:n.flags&32?-1:A);let a=i.tile.parent,r=!1;for(let s of a.children){if(r)return new $c(s.dom,0);s==i.tile&&(r=!0)}}return new $c(this.dom,0)}};function B4A(t){let e=t.dom.lastChild;if(!e)return t.dom.getBoundingClientRect();let A=F8(e);return A[A.length-1]||null}function Q4A(t,e){let A=t.coordsIn(0,1),i=e.coordsIn(0,1);return A&&i&&i.top<A.bottom}var zs=class t extends lQ{constructor(e,A){super(e),this.mark=A}get domAttrs(){return this.mark.attrs}static of(e,A){let i=new t(A||document.createElement(e.tagName),e);return A||(i.flags|=4),i}},Q1=class t extends sa{constructor(e,A){super(e,A.length),this.text=A}sync(e){this.flags&2||(super.sync(e),this.dom.nodeValue!=this.text&&(e&&e.node==this.dom&&(e.written=!0),this.dom.nodeValue=this.text))}isText(){return!0}toString(){return JSON.stringify(this.text)}coordsIn(e,A){let i=this.dom.nodeValue.length;e>i&&(e=i);let n=e,o=e,a=0;e==0&&A<0||e==i&&A>=0?ot.chrome||ot.gecko||(e?(n--,a=1):o<i&&(o++,a=-1)):A<0?n--:o<i&&o++;let r=h3(this.dom,n,o).getClientRects();if(!r.length)return null;let s=r[(a?a<0:A>=0)?0:r.length-1];return ot.safari&&!a&&s.width==0&&(s=Array.prototype.find.call(r,g=>g.width)||s),a?H8(s,a<0):s||null}static of(e,A){let i=new t(A||document.createTextNode(e),e);return A||(i.flags|=2),i}},f1=class t extends sa{constructor(e,A,i,n){super(e,A,n),this.widget=i}isWidget(){return!0}get isHidden(){return this.widget.isHidden}covers(e){return this.flags&48?!1:(this.flags&(e<0?64:128))>0}coordsIn(e,A){return this.coordsInWidget(e,A,!1)}coordsInWidget(e,A,i){let n=this.widget.coordsAt(this.dom,e,A);if(n)return n;if(i)return H8(this.dom.getBoundingClientRect(),this.length?e==0:A<=0);{let o=this.dom.getClientRects(),a=null;if(!o.length)return null;let r=this.flags&16?!0:this.flags&32?!1:e>0;for(let s=r?o.length-1:0;a=o[s],!(e>0?s==0:s==o.length-1||a.top<a.bottom);s+=r?-1:1);return H8(a,!r)}}get overrideDOMText(){if(!this.length)return Bn.empty;let{root:e}=this;if(!e)return Bn.empty;let A=this.posAtStart;return e.view.state.doc.slice(A,A+this.length)}destroy(){super.destroy(),this.widget.destroy(this.dom)}static of(e,A,i,n,o){return o||(o=e.toDOM(A),e.editable||(o.contentEditable=\"false\")),new t(o,i,e,n)}},IQ=class extends sa{constructor(e){let A=document.createElement(\"img\");A.className=\"cm-widgetBuffer\",A.setAttribute(\"aria-hidden\",\"true\"),super(A,0,e)}get isHidden(){return!0}get overrideDOMText(){return Bn.empty}coordsIn(e){return this.dom.getBoundingClientRect()}},Ck=class{constructor(e){this.index=0,this.beforeBreak=!1,this.parents=[],this.tile=e}advance(e,A,i){let{tile:n,index:o,beforeBreak:a,parents:r}=this;for(;e||A>0;)if(n.isComposite())if(a){if(!e)break;i&&i.break(),e--,a=!1}else if(o==n.children.length){if(!e&&!r.length)break;i&&i.leave(n),a=!!n.breakAfter,{tile:n,index:o}=r.pop(),o++}else{let s=n.children[o],g=s.breakAfter;(A>0?s.length<=e:s.length<e)&&(!i||i.skip(s,0,s.length)!==!1||!s.isComposite)?(a=!!g,o++,e-=s.length):(r.push({tile:n,index:o}),n=s,o=0,i&&s.isComposite()&&i.enter(s))}else if(o==n.length)a=!!n.breakAfter,{tile:n,index:o}=r.pop(),o++;else if(e){let s=Math.min(e,n.length-o);i&&i.skip(n,o,o+s),e-=s,o+=s}else break;return this.tile=n,this.index=o,this.beforeBreak=a,this}get root(){return this.parents.length?this.parents[0].tile:this.tile}},Ik=class{constructor(e,A,i,n){this.from=e,this.to=A,this.wrapper=i,this.rank=n}},dk=class{constructor(e,A,i){this.cache=e,this.root=A,this.blockWrappers=i,this.curLine=null,this.lastBlock=null,this.afterWidget=null,this.pos=0,this.wrappers=[],this.wrapperPos=0}addText(e,A,i,n){var o;this.flushBuffer();let a=this.ensureMarks(A,i),r=a.lastChild;if(r&&r.isText()&&!(r.flags&8)&&r.length+e.length<512){this.cache.reused.set(r,2);let s=a.children[a.children.length-1]=new Q1(r.dom,r.text+e);s.parent=a}else a.append(n||Q1.of(e,(o=this.cache.find(Q1))===null||o===void 0?void 0:o.dom));this.pos+=e.length,this.afterWidget=null}addComposition(e,A){let i=this.curLine;i.dom!=A.line.dom&&(i.setDOM(this.cache.reused.has(A.line)?jM(A.line.dom):A.line.dom),this.cache.reused.set(A.line,2));let n=i;for(let r=A.marks.length-1;r>=0;r--){let s=A.marks[r],g=n.lastChild;if(g instanceof zs&&g.mark.eq(s.mark))g.dom!=s.dom&&g.setDOM(jM(s.dom)),n=g;else{if(this.cache.reused.get(s)){let C=sa.get(s.dom);C&&C.setDOM(jM(s.dom))}let l=zs.of(s.mark,s.dom);n.append(l),n=l}this.cache.reused.set(s,2)}let o=sa.get(e.text);o&&this.cache.reused.set(o,2);let a=new Q1(e.text,e.text.nodeValue);a.flags|=8,n.append(a)}addInlineWidget(e,A,i){let n=this.afterWidget&&e.flags&48&&(this.afterWidget.flags&48)==(e.flags&48);n||this.flushBuffer();let o=this.ensureMarks(A,i);!n&&!(e.flags&16)&&o.append(this.getBuffer(1)),o.append(e),this.pos+=e.length,this.afterWidget=e}addMark(e,A,i){this.flushBuffer(),this.ensureMarks(A,i).append(e),this.pos+=e.length,this.afterWidget=null}addBlockWidget(e){this.getBlockPos().append(e),this.pos+=e.length,this.lastBlock=e,this.endLine()}continueWidget(e){let A=this.afterWidget||this.lastBlock;A.length+=e,this.pos+=e}addLineStart(e,A){var i;e||(e=WP);let n=CQ.start(e,A||((i=this.cache.find(CQ))===null||i===void 0?void 0:i.dom),!!A);this.getBlockPos().append(this.lastBlock=this.curLine=n)}addLine(e){this.getBlockPos().append(e),this.pos+=e.length,this.lastBlock=e,this.endLine()}addBreak(){this.lastBlock.flags|=1,this.endLine(),this.pos++}addLineStartIfNotCovered(e){this.blockPosCovered()||this.addLineStart(e)}ensureLine(e){this.curLine||this.addLineStart(e)}ensureMarks(e,A){var i;let n=this.curLine;for(let o=e.length-1;o>=0;o--){let a=e[o],r;if(A>0&&(r=n.lastChild)&&r instanceof zs&&r.mark.eq(a))n=r,A--;else{let s=zs.of(a,(i=this.cache.find(zs,g=>g.mark.eq(a)))===null||i===void 0?void 0:i.dom);n.append(s),n=s,A=0}}return n}endLine(){if(this.curLine){this.flushBuffer();let e=this.curLine.lastChild;(!e||!qz(this.curLine,!1)||e.dom.nodeName!=\"BR\"&&e.isWidget()&&!(ot.ios&&qz(this.curLine,!0)))&&this.curLine.append(this.cache.findWidget(qM,0,32)||new f1(qM.toDOM(),0,qM,32)),this.curLine=this.afterWidget=null}}updateBlockWrappers(){this.wrapperPos>this.pos+1e4&&(this.blockWrappers.goto(this.pos),this.wrappers.length=0);for(let e=this.wrappers.length-1;e>=0;e--)this.wrappers[e].to<this.pos&&this.wrappers.splice(e,1);for(let e=this.blockWrappers;e.value&&e.from<=this.pos;e.next())if(e.to>=this.pos){let A=new Ik(e.from,e.to,e.value,e.rank),i=this.wrappers.length;for(;i>0&&(this.wrappers[i-1].rank-A.rank||this.wrappers[i-1].to-A.to)<0;)i--;this.wrappers.splice(i,0,A)}this.wrapperPos=this.pos}getBlockPos(){var e;this.updateBlockWrappers();let A=this.root;for(let i of this.wrappers){let n=A.lastChild;if(i.from<this.pos&&n instanceof Z0&&n.wrapper.eq(i.wrapper))A=n;else{let o=Z0.of(i.wrapper,(e=this.cache.find(Z0,a=>a.wrapper.eq(i.wrapper)))===null||e===void 0?void 0:e.dom);A.append(o),A=o}}return A}blockPosCovered(){let e=this.lastBlock;return e!=null&&!e.breakAfter&&(!e.isWidget()||(e.flags&160)>0)}getBuffer(e){let A=2|(e<0?16:32),i=this.cache.find(IQ,void 0,1);return i&&(i.flags=A),i||new IQ(A)}flushBuffer(){this.afterWidget&&!(this.afterWidget.flags&32)&&(this.afterWidget.parent.append(this.getBuffer(-1)),this.afterWidget=null)}},Bk=class{constructor(e){this.skipCount=0,this.text=\"\",this.textOff=0,this.cursor=e.iter()}skip(e){this.textOff+e<=this.text.length?this.textOff+=e:(this.skipCount+=e-(this.text.length-this.textOff),this.text=\"\",this.textOff=0)}next(e){if(this.textOff==this.text.length){let{value:n,lineBreak:o,done:a}=this.cursor.next(this.skipCount);if(this.skipCount=0,a)throw new Error(\"Ran out of text content when drawing inline views\");this.text=n;let r=this.textOff=Math.min(e,n.length);return o?null:n.slice(0,r)}let A=Math.min(this.text.length,this.textOff+e),i=this.text.slice(this.textOff,A);return this.textOff=A,i}},O8=[f1,CQ,Q1,zs,IQ,Z0,cQ];for(let t=0;t<O8.length;t++)O8[t].bucket=t;var Qk=class{constructor(e){this.view=e,this.buckets=O8.map(()=>[]),this.index=O8.map(()=>0),this.reused=new Map}add(e){let A=e.constructor.bucket,i=this.buckets[A];i.length<6?i.push(e):i[this.index[A]=(this.index[A]+1)%6]=e}find(e,A,i=2){let n=e.bucket,o=this.buckets[n],a=this.index[n];for(let r=o.length-1;r>=0;r--){let s=(r+a)%o.length,g=o[s];if((!A||A(g))&&!this.reused.has(g))return o.splice(s,1),s<a&&this.index[n]--,this.reused.set(g,i),g}return null}findWidget(e,A,i){let n=this.buckets[0];if(n.length)for(let o=0,a=0;;o++){if(o==n.length){if(a)return null;a=1,o=0}let r=n[o];if(!this.reused.has(r)&&(a==0?r.widget.compare(e):r.widget.constructor==e.constructor&&e.updateDOM(r.dom,this.view,r.widget)))return n.splice(o,1),o<this.index[0]&&this.index[0]--,r.widget==e&&r.length==A&&(r.flags&497)==i?(this.reused.set(r,1),r):(this.reused.set(r,2),new f1(r.dom,A,e,r.flags&-498|i))}}reuse(e){return this.reused.set(e,1),e}maybeReuse(e,A=2){if(!this.reused.has(e))return this.reused.set(e,A),e.dom}clear(){for(let e=0;e<this.buckets.length;e++)this.buckets[e].length=this.index[e]=0}},Ek=class{constructor(e,A,i,n,o){this.view=e,this.decorations=n,this.disallowBlockEffectsFor=o,this.openWidget=!1,this.openMarks=0,this.cache=new Qk(e),this.text=new Bk(e.state.doc),this.builder=new dk(this.cache,new cQ(e,e.contentDOM),zn.iter(i)),this.cache.reused.set(A,2),this.old=new Ck(A),this.reuseWalker={skip:(a,r,s)=>{if(this.cache.add(a),a.isComposite())return!1},enter:a=>this.cache.add(a),leave:()=>{},break:()=>{}}}run(e,A){let i=A&&this.getCompositionContext(A.text);for(let n=0,o=0,a=0;;){let r=a<e.length?e[a++]:null,s=r?r.fromA:this.old.root.length;if(s>n){let g=s-n;this.preserve(g,!a,!r),n=s,o+=g}if(!r)break;A&&r.fromA<=A.range.fromA&&r.toA>=A.range.toA?(this.forward(r.fromA,A.range.fromA,A.range.fromA<A.range.toA?1:-1),this.emit(o,A.range.fromB),this.cache.clear(),this.builder.addComposition(A,i),this.text.skip(A.range.toB-A.range.fromB),this.forward(A.range.fromA,r.toA),this.emit(A.range.toB,r.toB)):(this.forward(r.fromA,r.toA),this.emit(o,r.toB)),o=r.toB,n=r.toA}return this.builder.curLine&&this.builder.endLine(),this.builder.root}preserve(e,A,i){let n=u4A(this.old),o=this.openMarks;this.old.advance(e,i?1:-1,{skip:(a,r,s)=>{if(a.isWidget())if(this.openWidget)this.builder.continueWidget(s-r);else{let g=s>0||r<a.length?f1.of(a.widget,this.view,s-r,a.flags&496,this.cache.maybeReuse(a)):this.cache.reuse(a);g.flags&256?(g.flags&=-2,this.builder.addBlockWidget(g)):(this.builder.ensureLine(null),this.builder.addInlineWidget(g,n,o),o=n.length)}else if(a.isText())this.builder.ensureLine(null),!r&&s==a.length&&!this.cache.reused.has(a)?this.builder.addText(a.text,n,o,this.cache.reuse(a)):(this.cache.add(a),this.builder.addText(a.text.slice(r,s),n,o)),o=n.length;else if(a.isLine())a.flags&=-2,this.cache.reused.set(a,1),this.builder.addLine(a);else if(a instanceof IQ)this.cache.add(a);else if(a instanceof zs)this.builder.ensureLine(null),this.builder.addMark(a,n,o),this.cache.reused.set(a,1),o=n.length;else return!1;this.openWidget=!1},enter:a=>{a.isLine()?this.builder.addLineStart(a.attrs,this.cache.maybeReuse(a)):(this.cache.add(a),a instanceof zs&&n.unshift(a.mark)),this.openWidget=!1},leave:a=>{a.isLine()?n.length&&(n.length=o=0):a instanceof zs&&(n.shift(),o=Math.min(o,n.length))},break:()=>{this.builder.addBreak(),this.openWidget=!1}}),this.text.skip(e)}emit(e,A){let i=null,n=this.builder,o=0,a=zn.spans(this.decorations,e,A,{point:(r,s,g,l,C,I)=>{if(g instanceof h1){if(this.disallowBlockEffectsFor[I]){if(g.block)throw new RangeError(\"Block decorations may not be specified via plugins\");if(s>this.view.state.doc.lineAt(r).to)throw new RangeError(\"Decorations that replace line breaks may not be specified via plugins\")}if(o=l.length,C>l.length)n.continueWidget(s-r);else{let d=g.widget||(g.block?Vz.block:Vz.inline),B=E4A(g),Q=this.cache.findWidget(d,s-r,B)||f1.of(d,this.view,s-r,B);g.block?(g.startSide>0&&n.addLineStartIfNotCovered(i),n.addBlockWidget(Q)):(n.ensureLine(i),n.addInlineWidget(Q,l,C))}i=null}else i=h4A(i,g);s>r&&this.text.skip(s-r)},span:(r,s,g,l)=>{for(let C=r;C<s;){let I=this.text.next(Math.min(512,s-C));I==null?(n.addLineStartIfNotCovered(i),n.addBreak(),C++):(n.ensureLine(i),n.addText(I,g,C==r?l:g.length),C+=I.length),i=null}}});n.addLineStartIfNotCovered(i),this.openWidget=a>o,this.openMarks=a}forward(e,A,i=1){A-e<=10?this.old.advance(A-e,i,this.reuseWalker):(this.old.advance(5,-1,this.reuseWalker),this.old.advance(A-e-10,-1),this.old.advance(5,i,this.reuseWalker))}getCompositionContext(e){let A=[],i=null;for(let n=e.parentNode;;n=n.parentNode){let o=sa.get(n);if(n==this.view.contentDOM)break;o instanceof zs?A.push(o):o?.isLine()?i=o:o instanceof Z0||(n.nodeName==\"DIV\"&&!i&&n!=this.view.contentDOM?i=new CQ(n,WP):i||A.push(zs.of(new B3({tagName:n.nodeName.toLowerCase(),attributes:XhA(n)}),n)))}return{line:i,marks:A}}};function qz(t,e){let A=i=>{for(let n of i.children)if((e?n.isText():n.length)||A(n))return!0;return!1};return A(t)}function E4A(t){let e=t.isReplace?(t.startSide<0?64:0)|(t.endSide>0?128:0):t.startSide>0?32:16;return t.block&&(e|=256),e}var WP={class:\"cm-line\"};function h4A(t,e){let A=e.spec.attributes,i=e.spec.class;return!A&&!i||(t||(t={class:\"cm-line\"}),A&&Wk(A,t),i&&(t.class+=\" \"+i)),t}function u4A(t){let e=[];for(let A=t.parents.length;A>1;A--){let i=A==t.parents.length?t.tile:t.parents[A].tile;i instanceof zs&&e.push(i.mark)}return e}function jM(t){let e=sa.get(t);return e&&e.setDOM(t.cloneNode()),t}var Vz=(()=>{class t extends Ps{constructor(A){super(),this.tag=A}eq(A){return A.tag==this.tag}toDOM(){return document.createElement(this.tag)}updateDOM(A){return A.nodeName.toLowerCase()==this.tag}get isHidden(){return!0}}return t.inline=new t(\"span\"),t.block=new t(\"div\"),t})(),qM=new class extends Ps{toDOM(){return document.createElement(\"br\")}get isHidden(){return!0}get editable(){return!0}},z8=class{constructor(e){this.view=e,this.decorations=[],this.blockWrappers=[],this.dynamicDecorationMap=[!1],this.domChanged=null,this.hasComposition=null,this.editContextFormatting=vt.none,this.lastCompositionAfterCursor=!1,this.minWidth=0,this.minWidthFrom=0,this.minWidthTo=0,this.impreciseAnchor=null,this.impreciseHead=null,this.forceSelection=!1,this.lastUpdate=Date.now(),this.updateDeco(),this.tile=new cQ(e,e.contentDOM),this.updateInner([new jl(0,0,0,e.state.doc.length)],null)}update(e){var A;let i=e.changedRanges;this.minWidth>0&&i.length&&(i.every(({fromA:l,toA:C})=>C<this.minWidthFrom||l>this.minWidthTo)?(this.minWidthFrom=e.changes.mapPos(this.minWidthFrom,1),this.minWidthTo=e.changes.mapPos(this.minWidthTo,1)):this.minWidth=this.minWidthFrom=this.minWidthTo=0),this.updateEditContextFormatting(e);let n=-1;this.view.inputState.composing>=0&&!this.view.observer.editContext&&(!((A=this.domChanged)===null||A===void 0)&&A.newSel?n=this.domChanged.newSel.head:!b4A(e.changes,this.hasComposition)&&!e.selectionSet&&(n=e.state.selection.main.head));let o=n>-1?m4A(this.view,e.changes,n):null;if(this.domChanged=null,this.hasComposition){let{from:l,to:C}=this.hasComposition;i=new jl(l,C,e.changes.mapPos(l,-1),e.changes.mapPos(C,1)).addToSet(i.slice())}this.hasComposition=o?{from:o.range.fromB,to:o.range.toB}:null,(ot.ie||ot.chrome)&&!o&&e&&e.state.doc.lines!=e.startState.doc.lines&&(this.forceSelection=!0);let a=this.decorations,r=this.blockWrappers;this.updateDeco();let s=w4A(a,this.decorations,e.changes);s.length&&(i=jl.extendWithRanges(i,s));let g=y4A(r,this.blockWrappers,e.changes);return g.length&&(i=jl.extendWithRanges(i,g)),o&&!i.some(l=>l.fromA<=o.range.fromA&&l.toA>=o.range.toA)&&(i=o.range.addToSet(i.slice())),this.tile.flags&2&&i.length==0?!1:(this.updateInner(i,o),e.transactions.length&&(this.lastUpdate=Date.now()),!0)}updateInner(e,A){this.view.viewState.mustMeasureContent=!0;let{observer:i}=this.view;i.ignore(()=>{if(A||e.length){let a=this.tile,r=new Ek(this.view,a,this.blockWrappers,this.decorations,this.dynamicDecorationMap);A&&sa.get(A.text)&&r.cache.reused.set(sa.get(A.text),2),this.tile=r.run(e,A),hk(a,r.cache.reused)}this.tile.dom.style.height=this.view.viewState.contentHeight/this.view.scaleY+\"px\",this.tile.dom.style.flexBasis=this.minWidth?this.minWidth+\"px\":\"\";let o=ot.chrome||ot.ios?{node:i.selectionRange.focusNode,written:!1}:void 0;this.tile.sync(o),o&&(o.written||i.selectionRange.focusNode!=o.node||!this.tile.dom.contains(o.node))&&(this.forceSelection=!0),this.tile.dom.style.height=\"\"});let n=[];if(this.view.viewport.from||this.view.viewport.to<this.view.state.doc.length)for(let o of this.tile.children)o.isWidget()&&o.widget instanceof l3&&n.push(o.dom);i.updateGaps(n)}updateEditContextFormatting(e){this.editContextFormatting=this.editContextFormatting.map(e.changes);for(let A of e.transactions)for(let i of A.effects)i.is(PP)&&(this.editContextFormatting=i.value)}updateSelection(e=!1,A=!1){(e||!this.view.observer.selectionRange.focusNode)&&this.view.observer.readSelectionRange();let{dom:i}=this.tile,n=this.view.root.activeElement,o=n==i,a=!o&&!(this.view.state.facet(W0)||i.tabIndex>-1)&&a3(i,this.view.observer.selectionRange)&&!(n&&i.contains(n));if(!(o||A||a))return;let r=this.forceSelection;this.forceSelection=!1;let s=this.view.state.selection.main,g,l;if(s.empty?l=g=this.inlineDOMNearPos(s.anchor,s.assoc||1):(l=this.inlineDOMNearPos(s.head,s.head==s.from?1:-1),g=this.inlineDOMNearPos(s.anchor,s.anchor==s.from?1:-1)),ot.gecko&&s.empty&&!this.hasComposition&&f4A(g)){let I=document.createTextNode(\"\");this.view.observer.ignore(()=>g.node.insertBefore(I,g.node.childNodes[g.offset]||null)),g=l=new $c(I,0),r=!0}let C=this.view.observer.selectionRange;(r||!C.focusNode||(!r3(g.node,g.offset,C.anchorNode,C.anchorOffset)||!r3(l.node,l.offset,C.focusNode,C.focusOffset))&&!this.suppressWidgetCursorChange(C,s))&&(this.view.observer.ignore(()=>{ot.android&&ot.chrome&&i.contains(C.focusNode)&&v4A(C.focusNode,i)&&(i.blur(),i.focus({preventScroll:!0}));let I=E3(this.view.root);if(I)if(s.empty){if(ot.gecko){let d=p4A(g.node,g.offset);if(d&&d!=3){let B=(d==1?xP:RP)(g.node,g.offset);B&&(g=new $c(B.node,B.offset))}}I.collapse(g.node,g.offset),s.bidiLevel!=null&&I.caretBidiLevel!==void 0&&(I.caretBidiLevel=s.bidiLevel)}else if(I.extend){I.collapse(g.node,g.offset);try{I.extend(l.node,l.offset)}catch(d){}}else{let d=document.createRange();s.anchor>s.head&&([g,l]=[l,g]),d.setEnd(l.node,l.offset),d.setStart(g.node,g.offset),I.removeAllRanges(),I.addRange(d)}a&&this.view.root.activeElement==i&&(i.blur(),n&&n.focus())}),this.view.observer.setSelectionRange(g,l)),this.impreciseAnchor=g.precise?null:new $c(C.anchorNode,C.anchorOffset),this.impreciseHead=l.precise?null:new $c(C.focusNode,C.focusOffset)}suppressWidgetCursorChange(e,A){return this.hasComposition&&A.empty&&r3(e.focusNode,e.focusOffset,e.anchorNode,e.anchorOffset)&&this.posFromDOM(e.focusNode,e.focusOffset)==A.head}enforceCursorAssoc(){if(this.hasComposition)return;let{view:e}=this,A=e.state.selection.main,i=E3(e.root),{anchorNode:n,anchorOffset:o}=e.observer.selectionRange;if(!i||!A.empty||!A.assoc||!i.modify)return;let a=this.lineAt(A.head,A.assoc);if(!a)return;let r=a.posAtStart;if(A.head==r||A.head==r+a.length)return;let s=this.coordsAt(A.head,-1),g=this.coordsAt(A.head,1);if(!s||!g||s.bottom>g.top)return;let l=this.domAtPos(A.head+A.assoc,A.assoc);i.collapse(l.node,l.offset),i.modify(\"move\",A.assoc<0?\"forward\":\"backward\",\"lineboundary\"),e.observer.readSelectionRange();let C=e.observer.selectionRange;e.docView.posFromDOM(C.anchorNode,C.anchorOffset)!=A.from&&i.collapse(n,o)}posFromDOM(e,A){let i=this.tile.nearest(e);if(!i)return this.tile.dom.compareDocumentPosition(e)&2?0:this.view.state.doc.length;let n=i.posAtStart;if(i.isComposite()){let o;if(e==i.dom)o=i.dom.childNodes[A];else{let a=X0(e)==0?0:A==0?-1:1;for(;;){let r=e.parentNode;if(r==i.dom)break;a==0&&r.firstChild!=r.lastChild&&(e==r.firstChild?a=-1:a=1),e=r}a<0?o=e:o=e.nextSibling}if(o==i.dom.firstChild)return n;for(;o&&!sa.get(o);)o=o.nextSibling;if(!o)return n+i.length;for(let a=0,r=n;;a++){let s=i.children[a];if(s.dom==o)return r;r+=s.length+s.breakAfter}}else return i.isText()?e==i.dom?n+A:n+(A?i.length:0):n}domAtPos(e,A){let{tile:i,offset:n}=this.tile.resolveBlock(e,A);return i.isWidget()?i.domPosFor(e,A):i.domIn(n,A)}inlineDOMNearPos(e,A){let i,n=-1,o=!1,a,r=-1,s=!1;return this.tile.blockTiles((g,l)=>{if(g.isWidget()){if(g.flags&32&&l>=e)return!0;g.flags&16&&(o=!0)}else{let C=l+g.length;if(l<=e&&(i=g,n=e-l,o=C<e),C>=e&&!a&&(a=g,r=e-l,s=l>e),l>e&&a)return!0}}),!i&&!a?this.domAtPos(e,A):(o&&a?i=null:s&&i&&(a=null),i&&A<0||!a?i.domIn(n,A):a.domIn(r,A))}coordsAt(e,A){let{tile:i,offset:n}=this.tile.resolveBlock(e,A);return i.isWidget()?i.widget instanceof l3?null:i.coordsInWidget(n,A,!0):i.coordsIn(n,A)}lineAt(e,A){let{tile:i}=this.tile.resolveBlock(e,A);return i.isLine()?i:null}coordsForChar(e){let{tile:A,offset:i}=this.tile.resolveBlock(e,1);if(!A.isLine())return null;function n(o,a){if(o.isComposite())for(let r of o.children){if(r.length>=a){let s=n(r,a);if(s)return s}if(a-=r.length,a<0)break}else if(o.isText()&&a<o.length){let r=_a(o.text,a);if(r==a)return null;let s=h3(o.dom,a,r).getClientRects();for(let g=0;g<s.length;g++){let l=s[g];if(g==s.length-1||l.top<l.bottom&&l.left<l.right)return l}}return null}return n(A,i)}measureVisibleLineHeights(e){let A=[],{from:i,to:n}=e,o=this.view.contentDOM.clientWidth,a=o>Math.max(this.view.scrollDOM.clientWidth,this.minWidth)+1,r=-1,s=this.view.textDirection==go.LTR,g=0,l=(C,I,d)=>{for(let B=0;B<C.children.length&&!(I>n);B++){let Q=C.children[B],E=I+Q.length,f=Q.dom.getBoundingClientRect(),{height:b}=f;if(d&&!B&&(g+=f.top-d.top),Q instanceof Z0)E>i&&l(Q,I,f);else if(I>=i&&(g>0&&A.push(-g),A.push(b+g),g=0,a)){let R=Q.dom.lastChild,M=R?F8(R):[];if(M.length){let v=M[M.length-1],F=s?v.right-f.left:f.right-v.left;F>r&&(r=F,this.minWidth=o,this.minWidthFrom=I,this.minWidthTo=E)}}d&&B==C.children.length-1&&(g+=d.bottom-f.bottom),I=E+Q.breakAfter}};return l(this.tile,0,null),A}textDirectionAt(e){let{tile:A}=this.tile.resolveBlock(e,1);return getComputedStyle(A.dom).direction==\"rtl\"?go.RTL:go.LTR}measureTextSize(){let e=this.tile.blockTiles(a=>{if(a.isLine()&&a.children.length&&a.length<=20){let r=0,s;for(let g of a.children){if(!g.isText()||/[^ -~]/.test(g.text))return;let l=F8(g.dom);if(l.length!=1)return;r+=l[0].width,s=l[0].height}if(r)return{lineHeight:a.dom.getBoundingClientRect().height,charWidth:r/a.length,textHeight:s}}});if(e)return e;let A=document.createElement(\"div\"),i,n,o;return A.className=\"cm-line\",A.style.width=\"99999px\",A.style.position=\"absolute\",A.textContent=\"abc def ghi jkl mno pqr stu\",this.view.observer.ignore(()=>{this.tile.dom.appendChild(A);let a=F8(A.firstChild)[0];i=A.getBoundingClientRect().height,n=a&&a.width?a.width/27:7,o=a&&a.height?a.height:i,A.remove()}),{lineHeight:i,charWidth:n,textHeight:o}}computeBlockGapDeco(){let e=[],A=this.view.viewState;for(let i=0,n=0;;n++){let o=n==A.viewports.length?null:A.viewports[n],a=o?o.from-1:this.view.state.doc.length;if(a>i){let r=(A.lineBlockAt(a).bottom-A.lineBlockAt(i).top)/this.view.scaleY;e.push(vt.replace({widget:new l3(r),block:!0,inclusive:!0,isBlockGap:!0}).range(i,a))}if(!o)break;i=o.to+1}return vt.set(e)}updateDeco(){let e=1,A=this.view.state.facet(n5).map(o=>(this.dynamicDecorationMap[e++]=typeof o==\"function\")?o(this.view):o),i=!1,n=this.view.state.facet(eS).map((o,a)=>{let r=typeof o==\"function\";return r&&(i=!0),r?o(this.view):o});for(n.length&&(this.dynamicDecorationMap[e++]=i,A.push(zn.join(n))),this.decorations=[this.editContextFormatting,...A,this.computeBlockGapDeco(),this.view.viewState.lineGapDeco];e<this.decorations.length;)this.dynamicDecorationMap[e++]=!1;this.blockWrappers=this.view.state.facet(jP).map(o=>typeof o==\"function\"?o(this.view):o)}scrollIntoView(e){var A;if(e.isSnapshot){let l=this.view.viewState.lineBlockAt(e.range.head);this.view.scrollDOM.scrollTop=l.top-e.yMargin,this.view.scrollDOM.scrollLeft=e.xMargin;return}for(let l of this.view.state.facet(zP))try{if(l(this.view,e.range,e))return!0}catch(C){dr(this.view.state,C,\"scroll handler\")}let{range:i}=e,n=this.coordsAt(i.head,(A=i.assoc)!==null&&A!==void 0?A:i.empty?0:i.head>i.anchor?-1:1),o;if(!n)return;!i.empty&&(o=this.coordsAt(i.anchor,i.anchor>i.head?-1:1))&&(n={left:Math.min(n.left,o.left),top:Math.min(n.top,o.top),right:Math.max(n.right,o.right),bottom:Math.max(n.bottom,o.bottom)});let a=tS(this.view),r={left:n.left-a.left,top:n.top-a.top,right:n.right+a.right,bottom:n.bottom+a.bottom},{offsetWidth:s,offsetHeight:g}=this.view.scrollDOM;if(e4A(this.view.scrollDOM,r,i.head<i.anchor?-1:1,e.x,e.y,Math.max(Math.min(e.xMargin,s),-s),Math.max(Math.min(e.yMargin,g),-g),this.view.textDirection==go.LTR),window.visualViewport&&window.innerHeight-window.visualViewport.height>1&&(n.top>window.pageYOffset+window.visualViewport.offsetTop+window.visualViewport.height||n.bottom<window.pageYOffset+window.visualViewport.offsetTop)){let l=this.view.docView.lineAt(i.head,1);l&&l.dom.scrollIntoView({block:\"nearest\"})}}lineHasWidget(e){let A=i=>i.isWidget()||i.children.some(A);return A(this.tile.resolveBlock(e,1).tile)}destroy(){hk(this.tile)}};function hk(t,e){let A=e?.get(t);if(A!=1){A==null&&t.destroy();for(let i of t.children)hk(i,e)}}function f4A(t){return t.node.nodeType==1&&t.node.firstChild&&(t.offset==0||t.node.childNodes[t.offset-1].contentEditable==\"false\")&&(t.offset==t.node.childNodes.length||t.node.childNodes[t.offset].contentEditable==\"false\")}function ZP(t,e){let A=t.observer.selectionRange;if(!A.focusNode)return null;let i=xP(A.focusNode,A.focusOffset),n=RP(A.focusNode,A.focusOffset),o=i||n;if(n&&i&&n.node!=i.node){let r=sa.get(n.node);if(!r||r.isText()&&r.text!=n.node.nodeValue)o=n;else if(t.docView.lastCompositionAfterCursor){let s=sa.get(i.node);!s||s.isText()&&s.text!=i.node.nodeValue||(o=n)}}if(t.docView.lastCompositionAfterCursor=o!=i,!o)return null;let a=e-o.offset;return{from:a,to:a+o.node.nodeValue.length,node:o.node}}function m4A(t,e,A){let i=ZP(t,A);if(!i)return null;let{node:n,from:o,to:a}=i,r=n.nodeValue;if(/[\\n\\r]/.test(r)||t.state.doc.sliceString(i.from,i.to)!=r)return null;let s=e.invertedDesc;return{range:new jl(s.mapPos(o),s.mapPos(a),o,a),text:n}}function p4A(t,e){return t.nodeType!=1?0:(e&&t.childNodes[e-1].contentEditable==\"false\"?1:0)|(e<t.childNodes.length&&t.childNodes[e].contentEditable==\"false\"?2:0)}var D4A=class{constructor(){this.changes=[]}compareRange(e,A){sQ(e,A,this.changes)}comparePoint(e,A){sQ(e,A,this.changes)}boundChange(e){sQ(e,e,this.changes)}};function w4A(t,e,A){let i=new D4A;return zn.compare(t,e,A,i),i.changes}var uk=class{constructor(){this.changes=[]}compareRange(e,A){sQ(e,A,this.changes)}comparePoint(){}boundChange(e){sQ(e,e,this.changes)}};function y4A(t,e,A){let i=new uk;return zn.compare(t,e,A,i),i.changes}function v4A(t,e){for(let A=t;A&&A!=e;A=A.assignedSlot||A.parentNode)if(A.nodeType==1&&A.contentEditable==\"false\")return!0;return!1}function b4A(t,e){let A=!1;return e&&t.iterChangedRanges((i,n)=>{i<e.to&&n>e.from&&(A=!0)}),A}var l3=class extends Ps{constructor(e){super(),this.height=e}toDOM(){let e=document.createElement(\"div\");return e.className=\"cm-gap\",this.updateDOM(e),e}eq(e){return e.height==this.height}updateDOM(e){return e.style.height=this.height+\"px\",!0}get editable(){return!0}get estimatedHeight(){return this.height}ignoreEvent(){return!1}};function M4A(t,e,A=1){let i=t.charCategorizer(e),n=t.doc.lineAt(e),o=e-n.from;if(n.length==0)return ce.cursor(e);o==0?A=1:o==n.length&&(A=-1);let a=o,r=o;A<0?a=_a(n.text,o,!1):r=_a(n.text,o);let s=i(n.text.slice(a,r));for(;a>0;){let g=_a(n.text,a,!1);if(i(n.text.slice(g,a))!=s)break;a=g}for(;r<n.length;){let g=_a(n.text,r);if(i(n.text.slice(r,g))!=s)break;r=g}return ce.range(a+n.from,r+n.from)}function k4A(t,e,A,i,n){let o=Math.round((i-e.left)*t.defaultCharacterWidth);if(t.lineWrapping&&A.height>t.defaultLineHeight*1.5){let r=t.viewState.heightOracle.textHeight,s=Math.floor((n-A.top-(t.defaultLineHeight-r)*.5)/r);o+=s*t.viewState.heightOracle.lineLength}let a=t.state.sliceDoc(A.from,A.to);return A.from+D8(a,o,t.state.tabSize)}function fk(t,e,A){let i=t.lineBlockAt(e);if(Array.isArray(i.type)){let n;for(let o of i.type){if(o.from>e)break;if(!(o.to<e)){if(o.from<e&&o.to>e)return o;(!n||o.type==Lr.Text&&(n.type!=o.type||(A<0?o.from<e:o.to>e)))&&(n=o)}}return n||i}return i}function S4A(t,e,A,i){let n=fk(t,e.head,e.assoc||-1),o=!i||n.type!=Lr.Text||!(t.lineWrapping||n.widgetLineBreaks)?null:t.coordsAtPos(e.assoc<0&&e.head>n.from?e.head-1:e.head);if(o){let a=t.dom.getBoundingClientRect(),r=t.textDirectionAt(n.from),s=t.posAtCoords({x:A==(r==go.LTR)?a.right-1:a.left+1,y:(o.top+o.bottom)/2});if(s!=null)return ce.cursor(s,A?-1:1)}return ce.cursor(A?n.to:n.from,A?-1:1)}function Wz(t,e,A,i){let n=t.state.doc.lineAt(e.head),o=t.bidiSpans(n),a=t.textDirectionAt(n.from);for(let r=e,s=null;;){let g=c4A(n,o,a,r,A),l=GP;if(!g){if(n.number==(A?t.state.doc.lines:1))return r;l=`\n`,n=t.state.doc.line(n.number+(A?1:-1)),o=t.bidiSpans(n),g=t.visualLineSide(n,!A)}if(s){if(!s(l))return r}else{if(!i)return g;s=i(l)}r=g}}function x4A(t,e,A){let i=t.state.charCategorizer(e),n=i(A);return o=>{let a=i(o);return n==yo.Space&&(n=a),n==a}}function R4A(t,e,A,i){let n=e.head,o=A?1:-1;if(n==(A?t.state.doc.length:0))return ce.cursor(n,e.assoc);let a=e.goalColumn,r,s=t.contentDOM.getBoundingClientRect(),g=t.coordsAtPos(n,e.assoc||((e.empty?A:e.head==e.from)?1:-1)),l=t.documentTop;if(g)a==null&&(a=g.left-s.left),r=o<0?g.top:g.bottom;else{let B=t.viewState.lineBlockAt(n);a==null&&(a=Math.min(s.right-s.left,t.defaultCharacterWidth*(n-B.from))),r=(o<0?B.top:B.bottom)+l}let C=s.left+a,I=t.viewState.heightOracle.textHeight>>1,d=i??I;for(let B=0;;B+=I){let Q=r+(d+B)*o,E=mk(t,{x:C,y:Q},!1,o);if(A?Q>s.bottom:Q<s.top)return ce.cursor(E.pos,E.assoc);let f=t.coordsAtPos(E.pos,E.assoc),b=f?(f.top+f.bottom)/2:0;if(!f||(A?b>r:b<r))return ce.cursor(E.pos,E.assoc,void 0,a)}}function c3(t,e,A){for(;;){let i=0;for(let n of t)n.between(e-1,e+1,(o,a,r)=>{if(e>o&&e<a){let s=i||A||(e-o<a-e?-1:1);e=s<0?o:a,i=s}});if(!i)return e}}function XP(t,e){let A=null;for(let i=0;i<e.ranges.length;i++){let n=e.ranges[i],o=null;if(n.empty){let a=c3(t,n.from,0);a!=n.from&&(o=ce.cursor(a,-1))}else{let a=c3(t,n.from,-1),r=c3(t,n.to,1);(a!=n.from||r!=n.to)&&(o=ce.range(n.from==n.anchor?a:r,n.from==n.head?a:r))}o&&(A||(A=e.ranges.slice()),A[i]=o)}return A?ce.create(A,e.mainIndex):e}function VM(t,e,A){let i=c3(t.state.facet(u3).map(n=>n(t)),A.from,e.head>A.from?-1:1);return i==A.from?A:ce.cursor(i,i<A.from?1:-1)}var Al=class{constructor(e,A){this.pos=e,this.assoc=A}};function mk(t,e,A,i){let n=t.contentDOM.getBoundingClientRect(),o=n.top+t.viewState.paddingTop,{x:a,y:r}=e,s=r-o,g;for(;;){if(s<0)return new Al(0,1);if(s>t.viewState.docHeight)return new Al(t.state.doc.length,-1);if(g=t.elementAtHeight(s),i==null)break;if(g.type==Lr.Text){if(i<0?g.to<t.viewport.from:g.from>t.viewport.to)break;let I=t.docView.coordsAt(i<0?g.from:g.to,i>0?-1:1);if(I&&(i<0?I.top<=s+o:I.bottom>=s+o))break}let C=t.viewState.heightOracle.textHeight/2;s=i>0?g.bottom+C:g.top-C}if(t.viewport.from>=g.to||t.viewport.to<=g.from){if(A)return null;if(g.type==Lr.Text){let C=k4A(t,n,g,a,r);return new Al(C,C==g.from?1:-1)}}if(g.type!=Lr.Text)return s<(g.top+g.bottom)/2?new Al(g.from,1):new Al(g.to,-1);let l=t.docView.lineAt(g.from,2);return(!l||l.length!=g.length)&&(l=t.docView.lineAt(g.from,-2)),new pk(t,a,r,t.textDirectionAt(g.from)).scanTile(l,g.from)}var pk=class{constructor(e,A,i,n){this.view=e,this.x=A,this.y=i,this.baseDir=n,this.line=null,this.spans=null}bidiSpansAt(e){return(!this.line||this.line.from>e||this.line.to<e)&&(this.line=this.view.state.doc.lineAt(e),this.spans=this.view.bidiSpans(this.line)),this}baseDirAt(e,A){let{line:i,spans:n}=this.bidiSpansAt(e);return n[el.find(n,e-i.from,-1,A)].level==this.baseDir}dirAt(e,A){let{line:i,spans:n}=this.bidiSpansAt(e);return n[el.find(n,e-i.from,-1,A)].dir}bidiIn(e,A){let{spans:i,line:n}=this.bidiSpansAt(e);return i.length>1||i.length&&(i[0].level!=this.baseDir||i[0].to+n.from<A)}scan(e,A){let i=0,n=e.length-1,o=new Set,a=this.bidiIn(e[0],e[n]),r,s,g=-1,l=1e9,C;A:for(;i<n;){let d=n-i,B=i+n>>1;e:if(o.has(B)){let E=i+Math.floor(Math.random()*d);for(let f=0;f<d;f++){if(!o.has(E)){B=E;break e}E++,E==n&&(E=i)}break A}o.add(B);let Q=A(B);if(Q)for(let E=0;E<Q.length;E++){let f=Q[E],b=0;if(!(f.width==0&&Q.length>1)){if(f.bottom<this.y)(!r||r.bottom<f.bottom)&&(r=f),b=1;else if(f.top>this.y)(!s||s.top>f.top)&&(s=f),b=-1;else{let R=f.left>this.x?this.x-f.left:f.right<this.x?this.x-f.right:0,M=Math.abs(R);M<l&&(g=B,l=M,C=f),R&&(b=R<0==(this.baseDir==go.LTR)?-1:1)}b==-1&&(!a||this.baseDirAt(e[B],1))?n=B:b==1&&(!a||this.baseDirAt(e[B+1],-1))&&(i=B+1)}}}if(!C){let d=r&&(!s||this.y-r.bottom<s.top-this.y)?r:s;return this.y=(d.top+d.bottom)/2,this.scan(e,A)}let I=(a?this.dirAt(e[g],1):this.baseDir)==go.LTR;return{i:g,after:this.x>(C.left+C.right)/2==I}}scanText(e,A){let i=[];for(let o=0;o<e.length;o=_a(e.text,o))i.push(A+o);i.push(A+e.length);let n=this.scan(i,o=>{let a=i[o]-A,r=i[o+1]-A;return h3(e.dom,a,r).getClientRects()});return n.after?new Al(i[n.i+1],-1):new Al(i[n.i],1)}scanTile(e,A){if(!e.length)return new Al(A,1);if(e.children.length==1){let r=e.children[0];if(r.isText())return this.scanText(r,A);if(r.isComposite())return this.scanTile(r,A)}let i=[A];for(let r=0,s=A;r<e.children.length;r++)i.push(s+=e.children[r].length);let n=this.scan(i,r=>{let s=e.children[r];return s.flags&48?null:(s.dom.nodeType==1?s.dom:h3(s.dom,0,s.length)).getClientRects()}),o=e.children[n.i],a=i[n.i];return o.isText()?this.scanText(o,a):o.isComposite()?this.scanTile(o,a):n.after?new Al(i[n.i+1],-1):new Al(a,1)}},iQ=\"\\uFFFF\",Dk=class{constructor(e,A){this.points=e,this.view=A,this.text=\"\",this.lineSeparator=A.state.facet(Ga.lineSeparator)}append(e){this.text+=e}lineBreak(){this.text+=iQ}readRange(e,A){if(!e)return this;let i=e.parentNode;for(let n=e;;){this.findPointBefore(i,n);let o=this.text.length;this.readNode(n);let a=sa.get(n),r=n.nextSibling;if(r==A){a?.breakAfter&&!r&&i!=this.view.contentDOM&&this.lineBreak();break}let s=sa.get(r);(a&&s?a.breakAfter:(a?a.breakAfter:Y8(n))||Y8(r)&&(n.nodeName!=\"BR\"||a?.isWidget())&&this.text.length>o)&&!F4A(r,A)&&this.lineBreak(),n=r}return this.findPointBefore(i,A),this}readTextNode(e){let A=e.nodeValue;for(let i of this.points)i.node==e&&(i.pos=this.text.length+Math.min(i.offset,A.length));for(let i=0,n=this.lineSeparator?null:/\\r\\n?|\\n/g;;){let o=-1,a=1,r;if(this.lineSeparator?(o=A.indexOf(this.lineSeparator,i),a=this.lineSeparator.length):(r=n.exec(A))&&(o=r.index,a=r[0].length),this.append(A.slice(i,o<0?A.length:o)),o<0)break;if(this.lineBreak(),a>1)for(let s of this.points)s.node==e&&s.pos>this.text.length&&(s.pos-=a-1);i=o+a}}readNode(e){let A=sa.get(e),i=A&&A.overrideDOMText;if(i!=null){this.findPointInside(e,i.length);for(let n=i.iter();!n.next().done;)n.lineBreak?this.lineBreak():this.append(n.value)}else e.nodeType==3?this.readTextNode(e):e.nodeName==\"BR\"?e.nextSibling&&this.lineBreak():e.nodeType==1&&this.readRange(e.firstChild,null)}findPointBefore(e,A){for(let i of this.points)i.node==e&&e.childNodes[i.offset]==A&&(i.pos=this.text.length)}findPointInside(e,A){for(let i of this.points)(e.nodeType==3?i.node==e:e.contains(i.node))&&(i.pos=this.text.length+(N4A(e,i.node,i.offset)?A:0))}};function N4A(t,e,A){for(;;){if(!e||A<X0(e))return!1;if(e==t)return!0;A=R2(e)+1,e=e.parentNode}}function F4A(t,e){let A;for(;!(t==e||!t);t=t.nextSibling){let i=sa.get(t);if(!i?.isWidget())return!1;i&&(A||(A=[])).push(i)}if(A)for(let i of A){let n=i.overrideDOMText;if(n?.length)return!1}return!0}var P8=class{constructor(e,A){this.node=e,this.offset=A,this.pos=-1}},wk=class{constructor(e,A,i,n){this.typeOver=n,this.bounds=null,this.text=\"\",this.domChanged=A>-1;let{impreciseHead:o,impreciseAnchor:a}=e.docView,r=e.state.selection;if(e.state.readOnly&&A>-1)this.newSel=null;else if(A>-1&&(this.bounds=$P(e.docView.tile,A,i,0))){let s=o||a?[]:_4A(e),g=new Dk(s,e);g.readRange(this.bounds.startDOM,this.bounds.endDOM),this.text=g.text,this.newSel=G4A(s,this.bounds.from)}else{let s=e.observer.selectionRange,g=o&&o.node==s.focusNode&&o.offset==s.focusOffset||!ak(e.contentDOM,s.focusNode)?r.main.head:e.docView.posFromDOM(s.focusNode,s.focusOffset),l=a&&a.node==s.anchorNode&&a.offset==s.anchorOffset||!ak(e.contentDOM,s.anchorNode)?r.main.anchor:e.docView.posFromDOM(s.anchorNode,s.anchorOffset),C=e.viewport;if((ot.ios||ot.chrome)&&r.main.empty&&g!=l&&(C.from>0||C.to<e.state.doc.length)){let I=Math.min(g,l),d=Math.max(g,l),B=C.from-I,Q=C.to-d;(B==0||B==1||I==0)&&(Q==0||Q==-1||d==e.state.doc.length)&&(g=0,l=e.state.doc.length)}if(e.inputState.composing>-1&&r.ranges.length>1)this.newSel=r.replaceRange(ce.range(l,g));else if(e.lineWrapping&&l==g&&!(r.main.empty&&r.main.head==g)&&e.inputState.lastTouchTime>Date.now()-100){let I=e.coordsAtPos(g,-1),d=0;I&&(d=e.inputState.lastTouchY<=I.bottom?-1:1),this.newSel=ce.create([ce.cursor(g,d)])}else this.newSel=ce.single(l,g)}}};function $P(t,e,A,i){if(t.isComposite()){let n=-1,o=-1,a=-1,r=-1;for(let s=0,g=i,l=i;s<t.children.length;s++){let C=t.children[s],I=g+C.length;if(g<e&&I>A)return $P(C,e,A,g);if(I>=e&&n==-1&&(n=s,o=g),g>A&&C.dom.parentNode==t.dom){a=s,r=l;break}l=I,g=I+C.breakAfter}return{from:o,to:r<0?i+t.length:r,startDOM:(n?t.children[n-1].dom.nextSibling:null)||t.dom.firstChild,endDOM:a<t.children.length&&a>=0?t.children[a].dom:null}}else return t.isText()?{from:i,to:i+t.length,startDOM:t.dom,endDOM:t.dom.nextSibling}:null}function Aj(t,e){let A,{newSel:i}=e,{state:n}=t,o=n.selection.main,a=t.inputState.lastKeyTime>Date.now()-100?t.inputState.lastKeyCode:-1;if(e.bounds){let{from:r,to:s}=e.bounds,g=o.from,l=null;(a===8||ot.android&&e.text.length<s-r)&&(g=o.to,l=\"end\");let C=n.doc.sliceString(r,s,iQ),I,d;!o.empty&&o.from>=r&&o.to<=s&&(e.typeOver||C!=e.text)&&C.slice(0,o.from-r)==e.text.slice(0,o.from-r)&&C.slice(o.to-r)==e.text.slice(I=e.text.length-(C.length-(o.to-r)))?A={from:o.from,to:o.to,insert:Bn.of(e.text.slice(o.from-r,I).split(iQ))}:(d=ej(C,e.text,g-r,l))&&(ot.chrome&&a==13&&d.toB==d.from+2&&e.text.slice(d.from,d.toB)==iQ+iQ&&d.toB--,A={from:r+d.from,to:r+d.toA,insert:Bn.of(e.text.slice(d.from,d.toB).split(iQ))})}else i&&(!t.hasFocus&&n.facet(W0)||j8(i,o))&&(i=null);if(!A&&!i)return!1;if((ot.mac||ot.android)&&A&&A.from==A.to&&A.from==o.head-1&&/^\\. ?$/.test(A.insert.toString())&&t.contentDOM.getAttribute(\"autocorrect\")==\"off\"?(i&&A.insert.length==2&&(i=ce.single(i.main.anchor-1,i.main.head-1)),A={from:A.from,to:A.to,insert:Bn.of([A.insert.toString().replace(\".\",\" \")])}):n.doc.lineAt(o.from).to<o.to&&t.docView.lineHasWidget(o.to)&&t.inputState.insertingTextAt>Date.now()-50?A={from:o.from,to:o.to,insert:n.toText(t.inputState.insertingText)}:ot.chrome&&A&&A.from==A.to&&A.from==o.head&&A.insert.toString()==`\n `&&t.lineWrapping&&(i&&(i=ce.single(i.main.anchor-1,i.main.head-1)),A={from:o.from,to:o.to,insert:Bn.of([\" \"])}),A)return iS(t,A,i,a);if(i&&!j8(i,o)){let r=!1,s=\"select\";return t.inputState.lastSelectionTime>Date.now()-50&&(t.inputState.lastSelectionOrigin==\"select\"&&(r=!0),s=t.inputState.lastSelectionOrigin,s==\"select.pointer\"&&(i=XP(n.facet(u3).map(g=>g(t)),i))),t.dispatch({selection:i,scrollIntoView:r,userEvent:s}),!0}else return!1}function iS(t,e,A,i=-1){if(ot.ios&&t.inputState.flushIOSKey(e))return!0;let n=t.state.selection.main;if(ot.android&&(e.to==n.to&&(e.from==n.from||e.from==n.from-1&&t.state.sliceDoc(e.from,n.from)==\" \")&&e.insert.length==1&&e.insert.lines==2&&gQ(t.contentDOM,\"Enter\",13)||(e.from==n.from-1&&e.to==n.to&&e.insert.length==0||i==8&&e.insert.length<e.to-e.from&&e.to>n.head)&&gQ(t.contentDOM,\"Backspace\",8)||e.from==n.from&&e.to==n.to+1&&e.insert.length==0&&gQ(t.contentDOM,\"Delete\",46)))return!0;let o=e.insert.toString();t.inputState.composing>=0&&t.inputState.composing++;let a,r=()=>a||(a=L4A(t,e,A));return t.state.facet(HP).some(s=>s(t,e.from,e.to,o,r))||t.dispatch(r()),!0}function L4A(t,e,A){let i,n=t.state,o=n.selection.main,a=-1;if(e.from==e.to&&e.from<o.from||e.from>o.to){let s=e.from<o.from?-1:1,g=s<0?o.from:o.to,l=c3(n.facet(u3).map(C=>C(t)),g,s);e.from==l&&(a=l)}if(a>-1)i={changes:e,selection:ce.cursor(e.from+e.insert.length,-1)};else if(e.from>=o.from&&e.to<=o.to&&e.to-e.from>=(o.to-o.from)/3&&(!A||A.main.empty&&A.main.from==e.from+e.insert.length)&&t.inputState.composing<0){let s=o.from<e.from?n.sliceDoc(o.from,e.from):\"\",g=o.to>e.to?n.sliceDoc(e.to,o.to):\"\";i=n.replaceSelection(t.state.toText(s+e.insert.sliceString(0,void 0,t.state.lineBreak)+g))}else{let s=n.changes(e),g=A&&A.main.to<=s.newLength?A.main:void 0;if(n.selection.ranges.length>1&&(t.inputState.composing>=0||t.inputState.compositionPendingChange)&&e.to<=o.to+10&&e.to>=o.to-10){let l=t.state.sliceDoc(e.from,e.to),C,I=A&&ZP(t,A.main.head);if(I){let B=e.insert.length-(e.to-e.from);C={from:I.from,to:I.to-B}}else C=t.state.doc.lineAt(o.head);let d=o.to-e.to;i=n.changeByRange(B=>{if(B.from==o.from&&B.to==o.to)return{changes:s,range:g||B.map(s)};let Q=B.to-d,E=Q-l.length;if(t.state.sliceDoc(E,Q)!=l||Q>=C.from&&E<=C.to)return{range:B};let f=n.changes({from:E,to:Q,insert:e.insert}),b=B.to-o.to;return{changes:f,range:g?ce.range(Math.max(0,g.anchor+b),Math.max(0,g.head+b)):B.map(f)}})}else i={changes:s,selection:g&&n.selection.replaceRange(g)}}let r=\"input.type\";return(t.composing||t.inputState.compositionPendingChange&&t.inputState.compositionEndedAt>Date.now()-50)&&(t.inputState.compositionPendingChange=!1,r+=\".compose\",t.inputState.compositionFirstChange&&(r+=\".start\",t.inputState.compositionFirstChange=!1)),n.update(i,{userEvent:r,scrollIntoView:!0})}function ej(t,e,A,i){let n=Math.min(t.length,e.length),o=0;for(;o<n&&t.charCodeAt(o)==e.charCodeAt(o);)o++;if(o==n&&t.length==e.length)return null;let a=t.length,r=e.length;for(;a>0&&r>0&&t.charCodeAt(a-1)==e.charCodeAt(r-1);)a--,r--;if(i==\"end\"){let s=Math.max(0,o-Math.min(a,r));A-=a+s-o}if(a<o&&t.length<e.length){let s=A<=o&&A>=a?o-A:0;o-=s,r=o+(r-a),a=o}else if(r<o){let s=A<=o&&A>=r?o-A:0;o-=s,a=o+(a-r),r=o}return{from:o,toA:a,toB:r}}function _4A(t){let e=[];if(t.root.activeElement!=t.contentDOM)return e;let{anchorNode:A,anchorOffset:i,focusNode:n,focusOffset:o}=t.observer.selectionRange;return A&&(e.push(new P8(A,i)),(n!=A||o!=i)&&e.push(new P8(n,o))),e}function G4A(t,e){if(t.length==0)return null;let A=t[0].pos,i=t.length==2?t[1].pos:A;return A>-1&&i>-1?ce.single(A+e,i+e):null}function j8(t,e){return e.head==t.main.head&&e.anchor==t.main.anchor}var yk=class{setSelectionOrigin(e){this.lastSelectionOrigin=e,this.lastSelectionTime=Date.now()}constructor(e){this.view=e,this.lastKeyCode=0,this.lastKeyTime=0,this.lastTouchTime=0,this.lastTouchX=0,this.lastTouchY=0,this.lastFocusTime=0,this.lastScrollTop=0,this.lastScrollLeft=0,this.lastWheelEvent=0,this.pendingIOSKey=void 0,this.tabFocusMode=-1,this.lastSelectionOrigin=null,this.lastSelectionTime=0,this.lastContextMenu=0,this.scrollHandlers=[],this.handlers=Object.create(null),this.composing=-1,this.compositionFirstChange=null,this.compositionEndedAt=0,this.compositionPendingKey=!1,this.compositionPendingChange=!1,this.insertingText=\"\",this.insertingTextAt=0,this.mouseSelection=null,this.draggedContent=null,this.handleEvent=this.handleEvent.bind(this),this.notifiedFocused=e.hasFocus,ot.safari&&e.contentDOM.addEventListener(\"input\",()=>null),ot.gecko&&Z4A(e.contentDOM.ownerDocument)}handleEvent(e){!O4A(this.view,e)||this.ignoreDuringComposition(e)||e.type==\"keydown\"&&this.keydown(e)||(this.view.updateState!=0?Promise.resolve().then(()=>this.runHandlers(e.type,e)):this.runHandlers(e.type,e))}runHandlers(e,A){let i=this.handlers[e];if(i){for(let n of i.observers)n(this.view,A);for(let n of i.handlers){if(A.defaultPrevented)break;if(n(this.view,A)){A.preventDefault();break}}}}ensureHandlers(e){let A=K4A(e),i=this.handlers,n=this.view.contentDOM;for(let o in A)if(o!=\"scroll\"){let a=!A[o].handlers.length,r=i[o];r&&a!=!r.handlers.length&&(n.removeEventListener(o,this.handleEvent),r=null),r||n.addEventListener(o,this.handleEvent,{passive:a})}for(let o in i)o!=\"scroll\"&&!A[o]&&n.removeEventListener(o,this.handleEvent);this.handlers=A}keydown(e){if(this.lastKeyCode=e.keyCode,this.lastKeyTime=Date.now(),e.keyCode==9&&this.tabFocusMode>-1&&(!this.tabFocusMode||Date.now()<=this.tabFocusMode))return!0;if(this.tabFocusMode>0&&e.keyCode!=27&&ij.indexOf(e.keyCode)<0&&(this.tabFocusMode=-1),ot.android&&ot.chrome&&!e.synthetic&&(e.keyCode==13||e.keyCode==8))return this.view.observer.delayAndroidKey(e.key,e.keyCode),!0;let A;return ot.ios&&!e.synthetic&&!e.altKey&&!e.metaKey&&!e.shiftKey&&((A=tj.find(i=>i.keyCode==e.keyCode))&&!e.ctrlKey||U4A.indexOf(e.key)>-1&&e.ctrlKey)?(this.pendingIOSKey=A||e,setTimeout(()=>this.flushIOSKey(),250),!0):(e.keyCode!=229&&this.view.observer.forceFlush(),!1)}flushIOSKey(e){let A=this.pendingIOSKey;return!A||A.key==\"Enter\"&&e&&e.from<e.to&&/^\\S+$/.test(e.insert.toString())?!1:(this.pendingIOSKey=void 0,gQ(this.view.contentDOM,A.key,A.keyCode,A instanceof KeyboardEvent?A:void 0))}ignoreDuringComposition(e){return!/^key/.test(e.type)||e.synthetic?!1:this.composing>0?!0:ot.safari&&!ot.ios&&this.compositionPendingKey&&Date.now()-this.compositionEndedAt<100?(this.compositionPendingKey=!1,!0):!1}startMouseSelection(e){this.mouseSelection&&this.mouseSelection.destroy(),this.mouseSelection=e}update(e){this.view.observer.update(e),this.mouseSelection&&this.mouseSelection.update(e),this.draggedContent&&e.docChanged&&(this.draggedContent=this.draggedContent.map(e.changes)),e.transactions.length&&(this.lastKeyCode=this.lastSelectionTime=0)}destroy(){this.mouseSelection&&this.mouseSelection.destroy()}};function Zz(t,e){return(A,i)=>{try{return e.call(t,i,A)}catch(n){dr(A.state,n)}}}function K4A(t){let e=Object.create(null);function A(i){return e[i]||(e[i]={observers:[],handlers:[]})}for(let i of t){let n=i.spec,o=n&&n.plugin.domEventHandlers,a=n&&n.plugin.domEventObservers;if(o)for(let r in o){let s=o[r];s&&A(r).handlers.push(Zz(i.value,s))}if(a)for(let r in a){let s=a[r];s&&A(r).observers.push(Zz(i.value,s))}}for(let i in ql)A(i).handlers.push(ql[i]);for(let i in js)A(i).observers.push(js[i]);return e}var tj=[{key:\"Backspace\",keyCode:8,inputType:\"deleteContentBackward\"},{key:\"Enter\",keyCode:13,inputType:\"insertParagraph\"},{key:\"Enter\",keyCode:13,inputType:\"insertLineBreak\"},{key:\"Delete\",keyCode:46,inputType:\"deleteContentForward\"}],U4A=\"dthko\",ij=[16,17,18,20,91,92,224,225],v8=6;function b8(t){return Math.max(0,t)*.7+8}function J4A(t,e){return Math.max(Math.abs(t.clientX-e.clientX),Math.abs(t.clientY-e.clientY))}var vk=class{constructor(e,A,i,n){this.view=e,this.startEvent=A,this.style=i,this.mustSelect=n,this.scrollSpeed={x:0,y:0},this.scrolling=-1,this.lastEvent=A,this.scrollParents=MP(e.contentDOM),this.atoms=e.state.facet(u3).map(a=>a(e));let o=e.contentDOM.ownerDocument;o.addEventListener(\"mousemove\",this.move=this.move.bind(this)),o.addEventListener(\"mouseup\",this.up=this.up.bind(this)),this.extend=A.shiftKey,this.multiple=e.state.facet(Ga.allowMultipleSelections)&&Y4A(e,A),this.dragging=T4A(e,A)&&aj(A)==1?null:!1}start(e){this.dragging===!1&&this.select(e)}move(e){if(e.buttons==0)return this.destroy();if(this.dragging||this.dragging==null&&J4A(this.startEvent,e)<10)return;this.select(this.lastEvent=e);let A=0,i=0,n=0,o=0,a=this.view.win.innerWidth,r=this.view.win.innerHeight;this.scrollParents.x&&({left:n,right:a}=this.scrollParents.x.getBoundingClientRect()),this.scrollParents.y&&({top:o,bottom:r}=this.scrollParents.y.getBoundingClientRect());let s=tS(this.view);e.clientX-s.left<=n+v8?A=-b8(n-e.clientX):e.clientX+s.right>=a-v8&&(A=b8(e.clientX-a)),e.clientY-s.top<=o+v8?i=-b8(o-e.clientY):e.clientY+s.bottom>=r-v8&&(i=b8(e.clientY-r)),this.setScrollSpeed(A,i)}up(e){this.dragging==null&&this.select(this.lastEvent),this.dragging||e.preventDefault(),this.destroy()}destroy(){this.setScrollSpeed(0,0);let e=this.view.contentDOM.ownerDocument;e.removeEventListener(\"mousemove\",this.move),e.removeEventListener(\"mouseup\",this.up),this.view.inputState.mouseSelection=this.view.inputState.draggedContent=null}setScrollSpeed(e,A){this.scrollSpeed={x:e,y:A},e||A?this.scrolling<0&&(this.scrolling=setInterval(()=>this.scroll(),50)):this.scrolling>-1&&(clearInterval(this.scrolling),this.scrolling=-1)}scroll(){let{x:e,y:A}=this.scrollSpeed;e&&this.scrollParents.x&&(this.scrollParents.x.scrollLeft+=e,e=0),A&&this.scrollParents.y&&(this.scrollParents.y.scrollTop+=A,A=0),(e||A)&&this.view.win.scrollBy(e,A),this.dragging===!1&&this.select(this.lastEvent)}select(e){let{view:A}=this,i=XP(this.atoms,this.style.get(e,this.extend,this.multiple));(this.mustSelect||!i.eq(A.state.selection,this.dragging===!1))&&this.view.dispatch({selection:i,userEvent:\"select.pointer\"}),this.mustSelect=!1}update(e){e.transactions.some(A=>A.isUserEvent(\"input.type\"))?this.destroy():this.style.update(e)&&setTimeout(()=>this.select(this.lastEvent),20)}};function Y4A(t,e){let A=t.state.facet(KP);return A.length?A[0](e):ot.mac?e.metaKey:e.ctrlKey}function H4A(t,e){let A=t.state.facet(UP);return A.length?A[0](e):ot.mac?!e.altKey:!e.ctrlKey}function T4A(t,e){let{main:A}=t.state.selection;if(A.empty)return!1;let i=E3(t.root);if(!i||i.rangeCount==0)return!0;let n=i.getRangeAt(0).getClientRects();for(let o=0;o<n.length;o++){let a=n[o];if(a.left<=e.clientX&&a.right>=e.clientX&&a.top<=e.clientY&&a.bottom>=e.clientY)return!0}return!1}function O4A(t,e){if(!e.bubbles)return!0;if(e.defaultPrevented)return!1;for(let A=e.target,i;A!=t.contentDOM;A=A.parentNode)if(!A||A.nodeType==11||(i=sa.get(A))&&i.isWidget()&&!i.isHidden&&i.widget.ignoreEvent(e))return!1;return!0}var ql=Object.create(null),js=Object.create(null),nj=ot.ie&&ot.ie_version<15||ot.ios&&ot.webkit_version<604;function z4A(t){let e=t.dom.parentNode;if(!e)return;let A=e.appendChild(document.createElement(\"textarea\"));A.style.cssText=\"position: fixed; left: -10000px; top: 10px\",A.focus(),setTimeout(()=>{t.focus(),A.remove(),oj(t,A.value)},50)}function o5(t,e,A){for(let i of t.facet(e))A=i(A,t);return A}function oj(t,e){e=o5(t.state,$k,e);let{state:A}=t,i,n=1,o=A.toText(e),a=o.lines==A.selection.ranges.length;if(bk!=null&&A.selection.ranges.every(s=>s.empty)&&bk==o.toString()){let s=-1;i=A.changeByRange(g=>{let l=A.doc.lineAt(g.from);if(l.from==s)return{range:g};s=l.from;let C=A.toText((a?o.line(n++).text:e)+A.lineBreak);return{changes:{from:l.from,insert:C},range:ce.cursor(g.from+C.length)}})}else a?i=A.changeByRange(s=>{let g=o.line(n++);return{changes:{from:s.from,to:s.to,insert:g.text},range:ce.cursor(s.from+g.length)}}):i=A.replaceSelection(o);t.dispatch(i,{userEvent:\"input.paste\",scrollIntoView:!0})}js.scroll=t=>{t.inputState.lastScrollTop=t.scrollDOM.scrollTop,t.inputState.lastScrollLeft=t.scrollDOM.scrollLeft};js.wheel=js.mousewheel=t=>{t.inputState.lastWheelEvent=Date.now()};ql.keydown=(t,e)=>(t.inputState.setSelectionOrigin(\"select\"),e.keyCode==27&&t.inputState.tabFocusMode!=0&&(t.inputState.tabFocusMode=Date.now()+2e3),!1);js.touchstart=(t,e)=>{let A=t.inputState,i=e.targetTouches[0];A.lastTouchTime=Date.now(),i&&(A.lastTouchX=i.clientX,A.lastTouchY=i.clientY),A.setSelectionOrigin(\"select.pointer\")};js.touchmove=t=>{t.inputState.setSelectionOrigin(\"select.pointer\")};ql.mousedown=(t,e)=>{if(t.observer.flush(),t.inputState.lastTouchTime>Date.now()-2e3)return!1;let A=null;for(let i of t.state.facet(JP))if(A=i(t,e),A)break;if(!A&&e.button==0&&(A=j4A(t,e)),A){let i=!t.hasFocus;t.inputState.startMouseSelection(new vk(t,e,A,i)),i&&t.observer.ignore(()=>{kP(t.contentDOM);let o=t.root.activeElement;o&&!o.contains(t.contentDOM)&&o.blur()});let n=t.inputState.mouseSelection;if(n)return n.start(e),n.dragging===!1}else t.inputState.setSelectionOrigin(\"select.pointer\");return!1};function Xz(t,e,A,i){if(i==1)return ce.cursor(e,A);if(i==2)return M4A(t.state,e,A);{let n=t.docView.lineAt(e,A),o=t.state.doc.lineAt(n?n.posAtEnd:e),a=n?n.posAtStart:o.from,r=n?n.posAtEnd:o.to;return r<t.state.doc.length&&r==o.to&&r++,ce.range(a,r)}}var P4A=ot.ie&&ot.ie_version<=11,$z=null,AP=0,eP=0;function aj(t){if(!P4A)return t.detail;let e=$z,A=eP;return $z=t,eP=Date.now(),AP=!e||A>Date.now()-400&&Math.abs(e.clientX-t.clientX)<2&&Math.abs(e.clientY-t.clientY)<2?(AP+1)%3:1}function j4A(t,e){let A=t.posAndSideAtCoords({x:e.clientX,y:e.clientY},!1),i=aj(e),n=t.state.selection;return{update(o){o.docChanged&&(A.pos=o.changes.mapPos(A.pos),n=n.map(o.changes))},get(o,a,r){let s=t.posAndSideAtCoords({x:o.clientX,y:o.clientY},!1),g,l=Xz(t,s.pos,s.assoc,i);if(A.pos!=s.pos&&!a){let C=Xz(t,A.pos,A.assoc,i),I=Math.min(C.from,l.from),d=Math.max(C.to,l.to);l=I<l.from?ce.range(I,d,l.assoc):ce.range(d,I,l.assoc)}return a?n.replaceRange(n.main.extend(l.from,l.to,l.assoc)):r&&i==1&&n.ranges.length>1&&(g=q4A(n,s.pos))?g:r?n.addRange(l):ce.create([l])}}}function q4A(t,e){for(let A=0;A<t.ranges.length;A++){let{from:i,to:n}=t.ranges[A];if(i<=e&&n>=e)return ce.create(t.ranges.slice(0,A).concat(t.ranges.slice(A+1)),t.mainIndex==A?0:t.mainIndex-(t.mainIndex>A?1:0))}return null}ql.dragstart=(t,e)=>{let{selection:{main:A}}=t.state;if(e.target.draggable){let n=t.docView.tile.nearest(e.target);if(n&&n.isWidget()){let o=n.posAtStart,a=o+n.length;(o>=A.to||a<=A.from)&&(A=ce.range(o,a))}}let{inputState:i}=t;return i.mouseSelection&&(i.mouseSelection.dragging=!0),i.draggedContent=A,e.dataTransfer&&(e.dataTransfer.setData(\"Text\",o5(t.state,AS,t.state.sliceDoc(A.from,A.to))),e.dataTransfer.effectAllowed=\"copyMove\"),!1};ql.dragend=t=>(t.inputState.draggedContent=null,!1);function tP(t,e,A,i){if(A=o5(t.state,$k,A),!A)return;let n=t.posAtCoords({x:e.clientX,y:e.clientY},!1),{draggedContent:o}=t.inputState,a=i&&o&&H4A(t,e)?{from:o.from,to:o.to}:null,r={from:n,insert:A},s=t.state.changes(a?[a,r]:r);t.focus(),t.dispatch({changes:s,selection:{anchor:s.mapPos(n,-1),head:s.mapPos(n,1)},userEvent:a?\"move.drop\":\"input.drop\"}),t.inputState.draggedContent=null}ql.drop=(t,e)=>{if(!e.dataTransfer)return!1;if(t.state.readOnly)return!0;let A=e.dataTransfer.files;if(A&&A.length){let i=Array(A.length),n=0,o=()=>{++n==A.length&&tP(t,e,i.filter(a=>a!=null).join(t.state.lineBreak),!1)};for(let a=0;a<A.length;a++){let r=new FileReader;r.onerror=o,r.onload=()=>{/[\\x00-\\x08\\x0e-\\x1f]{2}/.test(r.result)||(i[a]=r.result),o()},r.readAsText(A[a])}return!0}else{let i=e.dataTransfer.getData(\"Text\");if(i)return tP(t,e,i,!0),!0}return!1};ql.paste=(t,e)=>{if(t.state.readOnly)return!0;t.observer.flush();let A=nj?null:e.clipboardData;return A?(oj(t,A.getData(\"text/plain\")||A.getData(\"text/uri-list\")),!0):(z4A(t),!1)};function V4A(t,e){let A=t.dom.parentNode;if(!A)return;let i=A.appendChild(document.createElement(\"textarea\"));i.style.cssText=\"position: fixed; left: -10000px; top: 10px\",i.value=e,i.focus(),i.selectionEnd=e.length,i.selectionStart=0,setTimeout(()=>{i.remove(),t.focus()},50)}function W4A(t){let e=[],A=[],i=!1;for(let n of t.selection.ranges)n.empty||(e.push(t.sliceDoc(n.from,n.to)),A.push(n));if(!e.length){let n=-1;for(let{from:o}of t.selection.ranges){let a=t.doc.lineAt(o);a.number>n&&(e.push(a.text),A.push({from:a.from,to:Math.min(t.doc.length,a.to+1)})),n=a.number}i=!0}return{text:o5(t,AS,e.join(t.lineBreak)),ranges:A,linewise:i}}var bk=null;ql.copy=ql.cut=(t,e)=>{if(!a3(t.contentDOM,t.observer.selectionRange))return!1;let{text:A,ranges:i,linewise:n}=W4A(t.state);if(!A&&!n)return!1;bk=n?A:null,e.type==\"cut\"&&!t.state.readOnly&&t.dispatch({changes:i,scrollIntoView:!0,userEvent:\"delete.cut\"});let o=nj?null:e.clipboardData;return o?(o.clearData(),o.setData(\"text/plain\",A),!0):(V4A(t,A),!1)};var rj=Os.define();function sj(t,e){let A=[];for(let i of t.facet(TP)){let n=i(t,e);n&&A.push(n)}return A.length?t.update({effects:A,annotations:rj.of(!0)}):null}function gj(t){setTimeout(()=>{let e=t.hasFocus;if(e!=t.inputState.notifiedFocused){let A=sj(t.state,e);A?t.dispatch(A):t.update([])}},10)}js.focus=t=>{t.inputState.lastFocusTime=Date.now(),!t.scrollDOM.scrollTop&&(t.inputState.lastScrollTop||t.inputState.lastScrollLeft)&&(t.scrollDOM.scrollTop=t.inputState.lastScrollTop,t.scrollDOM.scrollLeft=t.inputState.lastScrollLeft),gj(t)};js.blur=t=>{t.observer.clearSelectionRange(),gj(t)};js.compositionstart=js.compositionupdate=t=>{t.observer.editContext||(t.inputState.compositionFirstChange==null&&(t.inputState.compositionFirstChange=!0),t.inputState.composing<0&&(t.inputState.composing=0))};js.compositionend=t=>{t.observer.editContext||(t.inputState.composing=-1,t.inputState.compositionEndedAt=Date.now(),t.inputState.compositionPendingKey=!0,t.inputState.compositionPendingChange=t.observer.pendingRecords().length>0,t.inputState.compositionFirstChange=null,ot.chrome&&ot.android?t.observer.flushSoon():t.inputState.compositionPendingChange?Promise.resolve().then(()=>t.observer.flush()):setTimeout(()=>{t.inputState.composing<0&&t.docView.hasComposition&&t.update([])},50))};js.contextmenu=t=>{t.inputState.lastContextMenu=Date.now()};ql.beforeinput=(t,e)=>{var A,i;if((e.inputType==\"insertText\"||e.inputType==\"insertCompositionText\")&&(t.inputState.insertingText=e.data,t.inputState.insertingTextAt=Date.now()),e.inputType==\"insertReplacementText\"&&t.observer.editContext){let o=(A=e.dataTransfer)===null||A===void 0?void 0:A.getData(\"text/plain\"),a=e.getTargetRanges();if(o&&a.length){let r=a[0],s=t.posAtDOM(r.startContainer,r.startOffset),g=t.posAtDOM(r.endContainer,r.endOffset);return iS(t,{from:s,to:g,insert:t.state.toText(o)},null),!0}}let n;if(ot.chrome&&ot.android&&(n=tj.find(o=>o.inputType==e.inputType))&&(t.observer.delayAndroidKey(n.key,n.keyCode),n.key==\"Backspace\"||n.key==\"Delete\")){let o=((i=window.visualViewport)===null||i===void 0?void 0:i.height)||0;setTimeout(()=>{var a;(((a=window.visualViewport)===null||a===void 0?void 0:a.height)||0)>o+10&&t.hasFocus&&(t.contentDOM.blur(),t.focus())},100)}return ot.ios&&e.inputType==\"deleteContentForward\"&&t.observer.flushSoon(),ot.safari&&e.inputType==\"insertText\"&&t.inputState.composing>=0&&setTimeout(()=>js.compositionend(t,e),20),!1};var iP=new Set;function Z4A(t){iP.has(t)||(iP.add(t),t.addEventListener(\"copy\",()=>{}),t.addEventListener(\"cut\",()=>{}))}var nP=[\"pre-wrap\",\"normal\",\"pre-line\",\"break-spaces\"],dQ=!1;function oP(){dQ=!1}var Mk=class{constructor(e){this.lineWrapping=e,this.doc=Bn.empty,this.heightSamples={},this.lineHeight=14,this.charWidth=7,this.textHeight=14,this.lineLength=30}heightForGap(e,A){let i=this.doc.lineAt(A).number-this.doc.lineAt(e).number+1;return this.lineWrapping&&(i+=Math.max(0,Math.ceil((A-e-i*this.lineLength*.5)/this.lineLength))),this.lineHeight*i}heightForLine(e){return this.lineWrapping?(1+Math.max(0,Math.ceil((e-this.lineLength)/Math.max(1,this.lineLength-5))))*this.lineHeight:this.lineHeight}setDoc(e){return this.doc=e,this}mustRefreshForWrapping(e){return nP.indexOf(e)>-1!=this.lineWrapping}mustRefreshForHeights(e){let A=!1;for(let i=0;i<e.length;i++){let n=e[i];n<0?i++:this.heightSamples[Math.floor(n*10)]||(A=!0,this.heightSamples[Math.floor(n*10)]=!0)}return A}refresh(e,A,i,n,o,a){let r=nP.indexOf(e)>-1,s=Math.abs(A-this.lineHeight)>.3||this.lineWrapping!=r||Math.abs(i-this.charWidth)>.1;if(this.lineWrapping=r,this.lineHeight=A,this.charWidth=i,this.textHeight=n,this.lineLength=o,s){this.heightSamples={};for(let g=0;g<a.length;g++){let l=a[g];l<0?g++:this.heightSamples[Math.floor(l*10)]=!0}}return s}},kk=class{constructor(e,A){this.from=e,this.heights=A,this.index=0}get more(){return this.index<this.heights.length}},Pl=class t{constructor(e,A,i,n,o){this.from=e,this.length=A,this.top=i,this.height=n,this._content=o}get type(){return typeof this._content==\"number\"?Lr.Text:Array.isArray(this._content)?this._content:this._content.type}get to(){return this.from+this.length}get bottom(){return this.top+this.height}get widget(){return this._content instanceof h1?this._content.widget:null}get widgetLineBreaks(){return typeof this._content==\"number\"?this._content:0}join(e){let A=(Array.isArray(this._content)?this._content:[this]).concat(Array.isArray(e._content)?e._content:[e]);return new t(this.from,this.length+e.length,this.top,this.height+e.height,A)}},Po=(function(t){return t[t.ByPos=0]=\"ByPos\",t[t.ByHeight=1]=\"ByHeight\",t[t.ByPosNoHeight=2]=\"ByPosNoHeight\",t})(Po||(Po={})),L8=.001,hg=class t{constructor(e,A,i=2){this.length=e,this.height=A,this.flags=i}get outdated(){return(this.flags&2)>0}set outdated(e){this.flags=(e?2:0)|this.flags&-3}setHeight(e){this.height!=e&&(Math.abs(this.height-e)>L8&&(dQ=!0),this.height=e)}replace(e,A,i){return t.of(i)}decomposeLeft(e,A){A.push(this)}decomposeRight(e,A){A.push(this)}applyChanges(e,A,i,n){let o=this,a=i.doc;for(let r=n.length-1;r>=0;r--){let{fromA:s,toA:g,fromB:l,toB:C}=n[r],I=o.lineAt(s,Po.ByPosNoHeight,i.setDoc(A),0,0),d=I.to>=g?I:o.lineAt(g,Po.ByPosNoHeight,i,0,0);for(C+=d.to-g,g=d.to;r>0&&I.from<=n[r-1].toA;)s=n[r-1].fromA,l=n[r-1].fromB,r--,s<I.from&&(I=o.lineAt(s,Po.ByPosNoHeight,i,0,0));l+=I.from-s,s=I.from;let B=xk.build(i.setDoc(a),e,l,C);o=q8(o,o.replace(s,g,B))}return o.updateHeight(i,0)}static empty(){return new $g(0,0,0)}static of(e){if(e.length==1)return e[0];let A=0,i=e.length,n=0,o=0;for(;;)if(A==i)if(n>o*2){let r=e[A-1];r.break?e.splice(--A,1,r.left,null,r.right):e.splice(--A,1,r.left,r.right),i+=1+r.break,n-=r.size}else if(o>n*2){let r=e[i];r.break?e.splice(i,1,r.left,null,r.right):e.splice(i,1,r.left,r.right),i+=2+r.break,o-=r.size}else break;else if(n<o){let r=e[A++];r&&(n+=r.size)}else{let r=e[--i];r&&(o+=r.size)}let a=0;return e[A-1]==null?(a=1,A--):e[A]==null&&(a=1,i++),new Sk(t.of(e.slice(0,A)),a,t.of(e.slice(i)))}};function q8(t,e){return t==e?t:(t.constructor!=e.constructor&&(dQ=!0),e)}hg.prototype.size=1;var X4A=vt.replace({}),V8=class extends hg{constructor(e,A,i){super(e,A),this.deco=i,this.spaceAbove=0}mainBlock(e,A){return new Pl(A,this.length,e+this.spaceAbove,this.height-this.spaceAbove,this.deco||0)}blockAt(e,A,i,n){return this.spaceAbove&&e<i+this.spaceAbove?new Pl(n,0,i,this.spaceAbove,X4A):this.mainBlock(i,n)}lineAt(e,A,i,n,o){let a=this.mainBlock(n,o);return this.spaceAbove?this.blockAt(0,i,n,o).join(a):a}forEachLine(e,A,i,n,o,a){e<=o+this.length&&A>=o&&a(this.lineAt(0,Po.ByPos,i,n,o))}setMeasuredHeight(e){let A=e.heights[e.index++];A<0?(this.spaceAbove=-A,A=e.heights[e.index++]):this.spaceAbove=0,this.setHeight(A)}updateHeight(e,A=0,i=!1,n){return n&&n.from<=A&&n.more&&this.setMeasuredHeight(n),this.outdated=!1,this}toString(){return`block(${this.length})`}},$g=class t extends V8{constructor(e,A,i){super(e,A,null),this.collapsed=0,this.widgetHeight=0,this.breaks=0,this.spaceAbove=i}mainBlock(e,A){return new Pl(A,this.length,e+this.spaceAbove,this.height-this.spaceAbove,this.breaks)}replace(e,A,i){let n=i[0];return i.length==1&&(n instanceof t||n instanceof x2&&n.flags&4)&&Math.abs(this.length-n.length)<10?(n instanceof x2?n=new t(n.length,this.height,this.spaceAbove):n.height=this.height,this.outdated||(n.outdated=!1),n):hg.of(i)}updateHeight(e,A=0,i=!1,n){return n&&n.from<=A&&n.more?this.setMeasuredHeight(n):(i||this.outdated)&&(this.spaceAbove=0,this.setHeight(Math.max(this.widgetHeight,e.heightForLine(this.length-this.collapsed))+this.breaks*e.lineHeight)),this.outdated=!1,this}toString(){return`line(${this.length}${this.collapsed?-this.collapsed:\"\"}${this.widgetHeight?\":\"+this.widgetHeight:\"\"})`}},x2=class t extends hg{constructor(e){super(e,0)}heightMetrics(e,A){let i=e.doc.lineAt(A).number,n=e.doc.lineAt(A+this.length).number,o=n-i+1,a,r=0;if(e.lineWrapping){let s=Math.min(this.height,e.lineHeight*o);a=s/o,this.length>o+1&&(r=(this.height-s)/(this.length-o-1))}else a=this.height/o;return{firstLine:i,lastLine:n,perLine:a,perChar:r}}blockAt(e,A,i,n){let{firstLine:o,lastLine:a,perLine:r,perChar:s}=this.heightMetrics(A,n);if(A.lineWrapping){let g=n+(e<A.lineHeight?0:Math.round(Math.max(0,Math.min(1,(e-i)/this.height))*this.length)),l=A.doc.lineAt(g),C=r+l.length*s,I=Math.max(i,e-C/2);return new Pl(l.from,l.length,I,C,0)}else{let g=Math.max(0,Math.min(a-o,Math.floor((e-i)/r))),{from:l,length:C}=A.doc.line(o+g);return new Pl(l,C,i+r*g,r,0)}}lineAt(e,A,i,n,o){if(A==Po.ByHeight)return this.blockAt(e,i,n,o);if(A==Po.ByPosNoHeight){let{from:d,to:B}=i.doc.lineAt(e);return new Pl(d,B-d,0,0,0)}let{firstLine:a,perLine:r,perChar:s}=this.heightMetrics(i,o),g=i.doc.lineAt(e),l=r+g.length*s,C=g.number-a,I=n+r*C+s*(g.from-o-C);return new Pl(g.from,g.length,Math.max(n,Math.min(I,n+this.height-l)),l,0)}forEachLine(e,A,i,n,o,a){e=Math.max(e,o),A=Math.min(A,o+this.length);let{firstLine:r,perLine:s,perChar:g}=this.heightMetrics(i,o);for(let l=e,C=n;l<=A;){let I=i.doc.lineAt(l);if(l==e){let B=I.number-r;C+=s*B+g*(e-o-B)}let d=s+g*I.length;a(new Pl(I.from,I.length,C,d,0)),C+=d,l=I.to+1}}replace(e,A,i){let n=this.length-A;if(n>0){let o=i[i.length-1];o instanceof t?i[i.length-1]=new t(o.length+n):i.push(null,new t(n-1))}if(e>0){let o=i[0];o instanceof t?i[0]=new t(e+o.length):i.unshift(new t(e-1),null)}return hg.of(i)}decomposeLeft(e,A){A.push(new t(e-1),null)}decomposeRight(e,A){A.push(null,new t(this.length-e-1))}updateHeight(e,A=0,i=!1,n){let o=A+this.length;if(n&&n.from<=A+this.length&&n.more){let a=[],r=Math.max(A,n.from),s=-1;for(n.from>A&&a.push(new t(n.from-A-1).updateHeight(e,A));r<=o&&n.more;){let l=e.doc.lineAt(r).length;a.length&&a.push(null);let C=n.heights[n.index++],I=0;C<0&&(I=-C,C=n.heights[n.index++]),s==-1?s=C:Math.abs(C-s)>=L8&&(s=-2);let d=new $g(l,C,I);d.outdated=!1,a.push(d),r+=l+1}r<=o&&a.push(null,new t(o-r).updateHeight(e,r));let g=hg.of(a);return(s<0||Math.abs(g.height-this.height)>=L8||Math.abs(s-this.heightMetrics(e,A).perLine)>=L8)&&(dQ=!0),q8(this,g)}else(i||this.outdated)&&(this.setHeight(e.heightForGap(A,A+this.length)),this.outdated=!1);return this}toString(){return`gap(${this.length})`}},Sk=class extends hg{constructor(e,A,i){super(e.length+A+i.length,e.height+i.height,A|(e.outdated||i.outdated?2:0)),this.left=e,this.right=i,this.size=e.size+i.size}get break(){return this.flags&1}blockAt(e,A,i,n){let o=i+this.left.height;return e<o?this.left.blockAt(e,A,i,n):this.right.blockAt(e,A,o,n+this.left.length+this.break)}lineAt(e,A,i,n,o){let a=n+this.left.height,r=o+this.left.length+this.break,s=A==Po.ByHeight?e<a:e<r,g=s?this.left.lineAt(e,A,i,n,o):this.right.lineAt(e,A,i,a,r);if(this.break||(s?g.to<r:g.from>r))return g;let l=A==Po.ByPosNoHeight?Po.ByPosNoHeight:Po.ByPos;return s?g.join(this.right.lineAt(r,l,i,a,r)):this.left.lineAt(r,l,i,n,o).join(g)}forEachLine(e,A,i,n,o,a){let r=n+this.left.height,s=o+this.left.length+this.break;if(this.break)e<s&&this.left.forEachLine(e,A,i,n,o,a),A>=s&&this.right.forEachLine(e,A,i,r,s,a);else{let g=this.lineAt(s,Po.ByPos,i,n,o);e<g.from&&this.left.forEachLine(e,g.from-1,i,n,o,a),g.to>=e&&g.from<=A&&a(g),A>g.to&&this.right.forEachLine(g.to+1,A,i,r,s,a)}}replace(e,A,i){let n=this.left.length+this.break;if(A<n)return this.balanced(this.left.replace(e,A,i),this.right);if(e>this.left.length)return this.balanced(this.left,this.right.replace(e-n,A-n,i));let o=[];e>0&&this.decomposeLeft(e,o);let a=o.length;for(let r of i)o.push(r);if(e>0&&aP(o,a-1),A<this.length){let r=o.length;this.decomposeRight(A,o),aP(o,r)}return hg.of(o)}decomposeLeft(e,A){let i=this.left.length;if(e<=i)return this.left.decomposeLeft(e,A);A.push(this.left),this.break&&(i++,e>=i&&A.push(null)),e>i&&this.right.decomposeLeft(e-i,A)}decomposeRight(e,A){let i=this.left.length,n=i+this.break;if(e>=n)return this.right.decomposeRight(e-n,A);e<i&&this.left.decomposeRight(e,A),this.break&&e<n&&A.push(null),A.push(this.right)}balanced(e,A){return e.size>2*A.size||A.size>2*e.size?hg.of(this.break?[e,null,A]:[e,A]):(this.left=q8(this.left,e),this.right=q8(this.right,A),this.setHeight(e.height+A.height),this.outdated=e.outdated||A.outdated,this.size=e.size+A.size,this.length=e.length+this.break+A.length,this)}updateHeight(e,A=0,i=!1,n){let{left:o,right:a}=this,r=A+o.length+this.break,s=null;return n&&n.from<=A+o.length&&n.more?s=o=o.updateHeight(e,A,i,n):o.updateHeight(e,A,i),n&&n.from<=r+a.length&&n.more?s=a=a.updateHeight(e,r,i,n):a.updateHeight(e,r,i),s?this.balanced(o,a):(this.height=this.left.height+this.right.height,this.outdated=!1,this)}toString(){return this.left+(this.break?\" \":\"-\")+this.right}};function aP(t,e){let A,i;t[e]==null&&(A=t[e-1])instanceof x2&&(i=t[e+1])instanceof x2&&t.splice(e-1,3,new x2(A.length+1+i.length))}var $4A=5,xk=class t{constructor(e,A){this.pos=e,this.oracle=A,this.nodes=[],this.lineStart=-1,this.lineEnd=-1,this.covering=null,this.writtenTo=e}get isCovered(){return this.covering&&this.nodes[this.nodes.length-1]==this.covering}span(e,A){if(this.lineStart>-1){let i=Math.min(A,this.lineEnd),n=this.nodes[this.nodes.length-1];n instanceof $g?n.length+=i-this.pos:(i>this.pos||!this.isCovered)&&this.nodes.push(new $g(i-this.pos,-1,0)),this.writtenTo=i,A>i&&(this.nodes.push(null),this.writtenTo++,this.lineStart=-1)}this.pos=A}point(e,A,i){if(e<A||i.heightRelevant){let n=i.widget?i.widget.estimatedHeight:0,o=i.widget?i.widget.lineBreaks:0;n<0&&(n=this.oracle.lineHeight);let a=A-e;i.block?this.addBlock(new V8(a,n,i)):(a||o||n>=$4A)&&this.addLineDeco(n,o,a)}else A>e&&this.span(e,A);this.lineEnd>-1&&this.lineEnd<this.pos&&(this.lineEnd=this.oracle.doc.lineAt(this.pos).to)}enterLine(){if(this.lineStart>-1)return;let{from:e,to:A}=this.oracle.doc.lineAt(this.pos);this.lineStart=e,this.lineEnd=A,this.writtenTo<e&&((this.writtenTo<e-1||this.nodes[this.nodes.length-1]==null)&&this.nodes.push(this.blankContent(this.writtenTo,e-1)),this.nodes.push(null)),this.pos>e&&this.nodes.push(new $g(this.pos-e,-1,0)),this.writtenTo=this.pos}blankContent(e,A){let i=new x2(A-e);return this.oracle.doc.lineAt(e).to==A&&(i.flags|=4),i}ensureLine(){this.enterLine();let e=this.nodes.length?this.nodes[this.nodes.length-1]:null;if(e instanceof $g)return e;let A=new $g(0,-1,0);return this.nodes.push(A),A}addBlock(e){this.enterLine();let A=e.deco;A&&A.startSide>0&&!this.isCovered&&this.ensureLine(),this.nodes.push(e),this.writtenTo=this.pos=this.pos+e.length,A&&A.endSide>0&&(this.covering=e)}addLineDeco(e,A,i){let n=this.ensureLine();n.length+=i,n.collapsed+=i,n.widgetHeight=Math.max(n.widgetHeight,e),n.breaks+=A,this.writtenTo=this.pos=this.pos+i}finish(e){let A=this.nodes.length==0?null:this.nodes[this.nodes.length-1];this.lineStart>-1&&!(A instanceof $g)&&!this.isCovered?this.nodes.push(new $g(0,-1,0)):(this.writtenTo<this.pos||A==null)&&this.nodes.push(this.blankContent(this.writtenTo,this.pos));let i=e;for(let n of this.nodes)n instanceof $g&&n.updateHeight(this.oracle,i),i+=n?n.length:1;return this.nodes}static build(e,A,i,n){let o=new t(i,e);return zn.spans(A,i,n,o,0),o.finish(i)}};function A3A(t,e,A){let i=new Rk;return zn.compare(t,e,A,i,0),i.changes}var Rk=class{constructor(){this.changes=[]}compareRange(){}comparePoint(e,A,i,n){(e<A||i&&i.heightRelevant||n&&n.heightRelevant)&&sQ(e,A,this.changes,5)}};function e3A(t,e){let A=t.getBoundingClientRect(),i=t.ownerDocument,n=i.defaultView||window,o=Math.max(0,A.left),a=Math.min(n.innerWidth,A.right),r=Math.max(0,A.top),s=Math.min(n.innerHeight,A.bottom);for(let g=t.parentNode;g&&g!=i.body;)if(g.nodeType==1){let l=g,C=window.getComputedStyle(l);if((l.scrollHeight>l.clientHeight||l.scrollWidth>l.clientWidth)&&C.overflow!=\"visible\"){let I=l.getBoundingClientRect();o=Math.max(o,I.left),a=Math.min(a,I.right),r=Math.max(r,I.top),s=Math.min(g==t.parentNode?n.innerHeight:s,I.bottom)}g=C.position==\"absolute\"||C.position==\"fixed\"?l.offsetParent:l.parentNode}else if(g.nodeType==11)g=g.host;else break;return{left:o-A.left,right:Math.max(o,a)-A.left,top:r-(A.top+e),bottom:Math.max(r,s)-(A.top+e)}}function t3A(t){let e=t.getBoundingClientRect(),A=t.ownerDocument.defaultView||window;return e.left<A.innerWidth&&e.right>0&&e.top<A.innerHeight&&e.bottom>0}function i3A(t,e){let A=t.getBoundingClientRect();return{left:0,right:A.right-A.left,top:e,bottom:A.bottom-(A.top+e)}}var C3=class{constructor(e,A,i,n){this.from=e,this.to=A,this.size=i,this.displaySize=n}static same(e,A){if(e.length!=A.length)return!1;for(let i=0;i<e.length;i++){let n=e[i],o=A[i];if(n.from!=o.from||n.to!=o.to||n.size!=o.size)return!1}return!0}draw(e,A){return vt.replace({widget:new Nk(this.displaySize*(A?e.scaleY:e.scaleX),A)}).range(this.from,this.to)}},Nk=class extends Ps{constructor(e,A){super(),this.size=e,this.vertical=A}eq(e){return e.size==this.size&&e.vertical==this.vertical}toDOM(){let e=document.createElement(\"div\");return this.vertical?e.style.height=this.size+\"px\":(e.style.width=this.size+\"px\",e.style.height=\"2px\",e.style.display=\"inline-block\"),e}get estimatedHeight(){return this.vertical?this.size:-1}},W8=class{constructor(e,A){this.view=e,this.state=A,this.pixelViewport={left:0,right:window.innerWidth,top:0,bottom:0},this.inView=!0,this.paddingTop=0,this.paddingBottom=0,this.contentDOMWidth=0,this.contentDOMHeight=0,this.editorHeight=0,this.editorWidth=0,this.scaleX=1,this.scaleY=1,this.scrollOffset=0,this.scrolledToBottom=!1,this.scrollAnchorPos=0,this.scrollAnchorHeight=-1,this.scaler=rP,this.scrollTarget=null,this.printing=!1,this.mustMeasureContent=!0,this.defaultTextDirection=go.LTR,this.visibleRanges=[],this.mustEnforceCursorAssoc=!1;let i=A.facet(ck).some(n=>typeof n!=\"function\"&&n.class==\"cm-lineWrapping\");this.heightOracle=new Mk(i),this.stateDeco=sP(A),this.heightMap=hg.empty().applyChanges(this.stateDeco,Bn.empty,this.heightOracle.setDoc(A.doc),[new jl(0,0,0,A.doc.length)]);for(let n=0;n<2&&(this.viewport=this.getViewport(0,null),!!this.updateForViewport());n++);this.updateViewportLines(),this.lineGaps=this.ensureLineGaps([]),this.lineGapDeco=vt.set(this.lineGaps.map(n=>n.draw(this,!1))),this.scrollParent=e.scrollDOM,this.computeVisibleRanges()}updateForViewport(){let e=[this.viewport],{main:A}=this.state.selection;for(let i=0;i<=1;i++){let n=i?A.head:A.anchor;if(!e.some(({from:o,to:a})=>n>=o&&n<=a)){let{from:o,to:a}=this.lineBlockAt(n);e.push(new oQ(o,a))}}return this.viewports=e.sort((i,n)=>i.from-n.from),this.updateScaler()}updateScaler(){let e=this.scaler;return this.scaler=this.heightMap.height<=7e6?rP:new Fk(this.heightOracle,this.heightMap,this.viewports),e.eq(this.scaler)?0:2}updateViewportLines(){this.viewportLines=[],this.heightMap.forEachLine(this.viewport.from,this.viewport.to,this.heightOracle.setDoc(this.state.doc),0,0,e=>{this.viewportLines.push(n3(e,this.scaler))})}update(e,A=null){this.state=e.state;let i=this.stateDeco;this.stateDeco=sP(this.state);let n=e.changedRanges,o=jl.extendWithRanges(n,A3A(i,this.stateDeco,e?e.changes:Rr.empty(this.state.doc.length))),a=this.heightMap.height,r=this.scrolledToBottom?null:this.scrollAnchorAt(this.scrollOffset);oP(),this.heightMap=this.heightMap.applyChanges(this.stateDeco,e.startState.doc,this.heightOracle.setDoc(this.state.doc),o),(this.heightMap.height!=a||dQ)&&(e.flags|=2),r?(this.scrollAnchorPos=e.changes.mapPos(r.from,-1),this.scrollAnchorHeight=r.top):(this.scrollAnchorPos=-1,this.scrollAnchorHeight=a);let s=o.length?this.mapViewport(this.viewport,e.changes):this.viewport;(A&&(A.range.head<s.from||A.range.head>s.to)||!this.viewportIsAppropriate(s))&&(s=this.getViewport(0,A));let g=s.from!=this.viewport.from||s.to!=this.viewport.to;this.viewport=s,e.flags|=this.updateForViewport(),(g||!e.changes.empty||e.flags&2)&&this.updateViewportLines(),(this.lineGaps.length||this.viewport.to-this.viewport.from>4e3)&&this.updateLineGaps(this.ensureLineGaps(this.mapLineGaps(this.lineGaps,e.changes))),e.flags|=this.computeVisibleRanges(e.changes),A&&(this.scrollTarget=A),!this.mustEnforceCursorAssoc&&(e.selectionSet||e.focusChanged)&&e.view.lineWrapping&&e.state.selection.main.empty&&e.state.selection.main.assoc&&!e.state.facet(OP)&&(this.mustEnforceCursorAssoc=!0)}measure(){let{view:e}=this,A=e.contentDOM,i=window.getComputedStyle(A),n=this.heightOracle,o=i.whiteSpace;this.defaultTextDirection=i.direction==\"rtl\"?go.RTL:go.LTR;let a=this.heightOracle.mustRefreshForWrapping(o)||this.mustMeasureContent===\"refresh\",r=A.getBoundingClientRect(),s=a||this.mustMeasureContent||this.contentDOMHeight!=r.height;this.contentDOMHeight=r.height,this.mustMeasureContent=!1;let g=0,l=0;if(r.width&&r.height){let{scaleX:v,scaleY:F}=bP(A,r);(v>.005&&Math.abs(this.scaleX-v)>.005||F>.005&&Math.abs(this.scaleY-F)>.005)&&(this.scaleX=v,this.scaleY=F,g|=16,a=s=!0)}let C=(parseInt(i.paddingTop)||0)*this.scaleY,I=(parseInt(i.paddingBottom)||0)*this.scaleY;(this.paddingTop!=C||this.paddingBottom!=I)&&(this.paddingTop=C,this.paddingBottom=I,g|=18),this.editorWidth!=e.scrollDOM.clientWidth&&(n.lineWrapping&&(s=!0),this.editorWidth=e.scrollDOM.clientWidth,g|=16);let d=MP(this.view.contentDOM,!1).y;d!=this.scrollParent&&(this.scrollParent=d,this.scrollAnchorHeight=-1,this.scrollOffset=0);let B=this.getScrollOffset();this.scrollOffset!=B&&(this.scrollAnchorHeight=-1,this.scrollOffset=B),this.scrolledToBottom=SP(this.scrollParent||e.win);let Q=(this.printing?i3A:e3A)(A,this.paddingTop),E=Q.top-this.pixelViewport.top,f=Q.bottom-this.pixelViewport.bottom;this.pixelViewport=Q;let b=this.pixelViewport.bottom>this.pixelViewport.top&&this.pixelViewport.right>this.pixelViewport.left;if(b!=this.inView&&(this.inView=b,b&&(s=!0)),!this.inView&&!this.scrollTarget&&!t3A(e.dom))return 0;let R=r.width;if((this.contentDOMWidth!=R||this.editorHeight!=e.scrollDOM.clientHeight)&&(this.contentDOMWidth=r.width,this.editorHeight=e.scrollDOM.clientHeight,g|=16),s){let v=e.docView.measureVisibleLineHeights(this.viewport);if(n.mustRefreshForHeights(v)&&(a=!0),a||n.lineWrapping&&Math.abs(R-this.contentDOMWidth)>n.charWidth){let{lineHeight:F,charWidth:G,textHeight:U}=e.docView.measureTextSize();a=F>0&&n.refresh(o,F,G,U,Math.max(5,R/G),v),a&&(e.docView.minWidth=0,g|=16)}E>0&&f>0?l=Math.max(E,f):E<0&&f<0&&(l=Math.min(E,f)),oP();for(let F of this.viewports){let G=F.from==this.viewport.from?v:e.docView.measureVisibleLineHeights(F);this.heightMap=(a?hg.empty().applyChanges(this.stateDeco,Bn.empty,this.heightOracle,[new jl(0,0,0,e.state.doc.length)]):this.heightMap).updateHeight(n,0,a,new kk(F.from,G))}dQ&&(g|=2)}let M=!this.viewportIsAppropriate(this.viewport,l)||this.scrollTarget&&(this.scrollTarget.range.head<this.viewport.from||this.scrollTarget.range.head>this.viewport.to);return M&&(g&2&&(g|=this.updateScaler()),this.viewport=this.getViewport(l,this.scrollTarget),g|=this.updateForViewport()),(g&2||M)&&this.updateViewportLines(),(this.lineGaps.length||this.viewport.to-this.viewport.from>4e3)&&this.updateLineGaps(this.ensureLineGaps(a?[]:this.lineGaps,e)),g|=this.computeVisibleRanges(),this.mustEnforceCursorAssoc&&(this.mustEnforceCursorAssoc=!1,e.docView.enforceCursorAssoc()),g}get visibleTop(){return this.scaler.fromDOM(this.pixelViewport.top)}get visibleBottom(){return this.scaler.fromDOM(this.pixelViewport.bottom)}getViewport(e,A){let i=.5-Math.max(-.5,Math.min(.5,e/1e3/2)),n=this.heightMap,o=this.heightOracle,{visibleTop:a,visibleBottom:r}=this,s=new oQ(n.lineAt(a-i*1e3,Po.ByHeight,o,0,0).from,n.lineAt(r+(1-i)*1e3,Po.ByHeight,o,0,0).to);if(A){let{head:g}=A.range;if(g<s.from||g>s.to){let l=Math.min(this.editorHeight,this.pixelViewport.bottom-this.pixelViewport.top),C=n.lineAt(g,Po.ByPos,o,0,0),I;A.y==\"center\"?I=(C.top+C.bottom)/2-l/2:A.y==\"start\"||A.y==\"nearest\"&&g<s.from?I=C.top:I=C.bottom-l,s=new oQ(n.lineAt(I-1e3/2,Po.ByHeight,o,0,0).from,n.lineAt(I+l+1e3/2,Po.ByHeight,o,0,0).to)}}return s}mapViewport(e,A){let i=A.mapPos(e.from,-1),n=A.mapPos(e.to,1);return new oQ(this.heightMap.lineAt(i,Po.ByPos,this.heightOracle,0,0).from,this.heightMap.lineAt(n,Po.ByPos,this.heightOracle,0,0).to)}viewportIsAppropriate({from:e,to:A},i=0){if(!this.inView)return!0;let{top:n}=this.heightMap.lineAt(e,Po.ByPos,this.heightOracle,0,0),{bottom:o}=this.heightMap.lineAt(A,Po.ByPos,this.heightOracle,0,0),{visibleTop:a,visibleBottom:r}=this;return(e==0||n<=a-Math.max(10,Math.min(-i,250)))&&(A==this.state.doc.length||o>=r+Math.max(10,Math.min(i,250)))&&n>a-2*1e3&&o<r+2*1e3}mapLineGaps(e,A){if(!e.length||A.empty)return e;let i=[];for(let n of e)A.touchesRange(n.from,n.to)||i.push(new C3(A.mapPos(n.from),A.mapPos(n.to),n.size,n.displaySize));return i}ensureLineGaps(e,A){let i=this.heightOracle.lineWrapping,n=i?1e4:2e3,o=n>>1,a=n<<1;if(this.defaultTextDirection!=go.LTR&&!i)return[];let r=[],s=(l,C,I,d)=>{if(C-l<o)return;let B=this.state.selection.main,Q=[B.from];B.empty||Q.push(B.to);for(let f of Q)if(f>l&&f<C){s(l,f-10,I,d),s(f+10,C,I,d);return}let E=o3A(e,f=>f.from>=I.from&&f.to<=I.to&&Math.abs(f.from-l)<o&&Math.abs(f.to-C)<o&&!Q.some(b=>f.from<b&&f.to>b));if(!E){if(C<I.to&&A&&i&&A.visibleRanges.some(R=>R.from<=C&&R.to>=C)){let R=A.moveToLineBoundary(ce.cursor(C),!1,!0).head;R>l&&(C=R)}let f=this.gapSize(I,l,C,d),b=i||f<2e6?f:2e6;E=new C3(l,C,f,b)}r.push(E)},g=l=>{if(l.length<a||l.type!=Lr.Text)return;let C=n3A(l.from,l.to,this.stateDeco);if(C.total<a)return;let I=this.scrollTarget?this.scrollTarget.range.head:null,d,B;if(i){let Q=n/this.heightOracle.lineLength*this.heightOracle.lineHeight,E,f;if(I!=null){let b=k8(C,I),R=((this.visibleBottom-this.visibleTop)/2+Q)/l.height;E=b-R,f=b+R}else E=(this.visibleTop-l.top-Q)/l.height,f=(this.visibleBottom-l.top+Q)/l.height;d=M8(C,E),B=M8(C,f)}else{let Q=C.total*this.heightOracle.charWidth,E=n*this.heightOracle.charWidth,f=0;if(Q>2e6)for(let F of e)F.from>=l.from&&F.from<l.to&&F.size!=F.displaySize&&F.from*this.heightOracle.charWidth+f<this.pixelViewport.left&&(f=F.size-F.displaySize);let b=this.pixelViewport.left+f,R=this.pixelViewport.right+f,M,v;if(I!=null){let F=k8(C,I),G=((R-b)/2+E)/Q;M=F-G,v=F+G}else M=(b-E)/Q,v=(R+E)/Q;d=M8(C,M),B=M8(C,v)}d>l.from&&s(l.from,d,l,C),B<l.to&&s(B,l.to,l,C)};for(let l of this.viewportLines)Array.isArray(l.type)?l.type.forEach(g):g(l);return r}gapSize(e,A,i,n){let o=k8(n,i)-k8(n,A);return this.heightOracle.lineWrapping?e.height*o:n.total*this.heightOracle.charWidth*o}updateLineGaps(e){C3.same(e,this.lineGaps)||(this.lineGaps=e,this.lineGapDeco=vt.set(e.map(A=>A.draw(this,this.heightOracle.lineWrapping))))}computeVisibleRanges(e){let A=this.stateDeco;this.lineGaps.length&&(A=A.concat(this.lineGapDeco));let i=[];zn.spans(A,this.viewport.from,this.viewport.to,{span(o,a){i.push({from:o,to:a})},point(){}},20);let n=0;if(i.length!=this.visibleRanges.length)n=12;else for(let o=0;o<i.length&&!(n&8);o++){let a=this.visibleRanges[o],r=i[o];(a.from!=r.from||a.to!=r.to)&&(n|=4,e&&e.mapPos(a.from,-1)==r.from&&e.mapPos(a.to,1)==r.to||(n|=8))}return this.visibleRanges=i,n}lineBlockAt(e){return e>=this.viewport.from&&e<=this.viewport.to&&this.viewportLines.find(A=>A.from<=e&&A.to>=e)||n3(this.heightMap.lineAt(e,Po.ByPos,this.heightOracle,0,0),this.scaler)}lineBlockAtHeight(e){return e>=this.viewportLines[0].top&&e<=this.viewportLines[this.viewportLines.length-1].bottom&&this.viewportLines.find(A=>A.top<=e&&A.bottom>=e)||n3(this.heightMap.lineAt(this.scaler.fromDOM(e),Po.ByHeight,this.heightOracle,0,0),this.scaler)}getScrollOffset(){return(this.scrollParent==this.view.scrollDOM?this.scrollParent.scrollTop:(this.scrollParent?this.scrollParent.getBoundingClientRect().top:0)-this.view.contentDOM.getBoundingClientRect().top)*this.scaleY}scrollAnchorAt(e){let A=this.lineBlockAtHeight(e+8);return A.from>=this.viewport.from||this.viewportLines[0].top-e>200?A:this.viewportLines[0]}elementAtHeight(e){return n3(this.heightMap.blockAt(this.scaler.fromDOM(e),this.heightOracle,0,0),this.scaler)}get docHeight(){return this.scaler.toDOM(this.heightMap.height)}get contentHeight(){return this.docHeight+this.paddingTop+this.paddingBottom}},oQ=class{constructor(e,A){this.from=e,this.to=A}};function n3A(t,e,A){let i=[],n=t,o=0;return zn.spans(A,t,e,{span(){},point(a,r){a>n&&(i.push({from:n,to:a}),o+=a-n),n=r}},20),n<e&&(i.push({from:n,to:e}),o+=e-n),{total:o,ranges:i}}function M8({total:t,ranges:e},A){if(A<=0)return e[0].from;if(A>=1)return e[e.length-1].to;let i=Math.floor(t*A);for(let n=0;;n++){let{from:o,to:a}=e[n],r=a-o;if(i<=r)return o+i;i-=r}}function k8(t,e){let A=0;for(let{from:i,to:n}of t.ranges){if(e<=n){A+=e-i;break}A+=n-i}return A/t.total}function o3A(t,e){for(let A of t)if(e(A))return A}var rP={toDOM(t){return t},fromDOM(t){return t},scale:1,eq(t){return t==this}};function sP(t){let e=t.facet(n5).filter(i=>typeof i!=\"function\"),A=t.facet(eS).filter(i=>typeof i!=\"function\");return A.length&&e.push(zn.join(A)),e}var Fk=class t{constructor(e,A,i){let n=0,o=0,a=0;this.viewports=i.map(({from:r,to:s})=>{let g=A.lineAt(r,Po.ByPos,e,0,0).top,l=A.lineAt(s,Po.ByPos,e,0,0).bottom;return n+=l-g,{from:r,to:s,top:g,bottom:l,domTop:0,domBottom:0}}),this.scale=(7e6-n)/(A.height-n);for(let r of this.viewports)r.domTop=a+(r.top-o)*this.scale,a=r.domBottom=r.domTop+(r.bottom-r.top),o=r.bottom}toDOM(e){for(let A=0,i=0,n=0;;A++){let o=A<this.viewports.length?this.viewports[A]:null;if(!o||e<o.top)return n+(e-i)*this.scale;if(e<=o.bottom)return o.domTop+(e-o.top);i=o.bottom,n=o.domBottom}}fromDOM(e){for(let A=0,i=0,n=0;;A++){let o=A<this.viewports.length?this.viewports[A]:null;if(!o||e<o.domTop)return i+(e-n)/this.scale;if(e<=o.domBottom)return o.top+(e-o.domTop);i=o.bottom,n=o.domBottom}}eq(e){return e instanceof t?this.scale==e.scale&&this.viewports.length==e.viewports.length&&this.viewports.every((A,i)=>A.from==e.viewports[i].from&&A.to==e.viewports[i].to):!1}};function n3(t,e){if(e.scale==1)return t;let A=e.toDOM(t.top),i=e.toDOM(t.bottom);return new Pl(t.from,t.length,A,i-A,Array.isArray(t._content)?t._content.map(n=>n3(n,e)):t._content)}var S8=qe.define({combine:t=>t.join(\" \")}),WM=qe.define({combine:t=>t.indexOf(!0)>-1}),Lk=Xg.newName(),lj=Xg.newName(),cj=Xg.newName(),Cj={\"&light\":\".\"+lj,\"&dark\":\".\"+cj};function _k(t,e,A){return new Xg(e,{finish(i){return/&/.test(i)?i.replace(/&\\w*/,n=>{if(n==\"&\")return t;if(!A||!A[n])throw new RangeError(`Unsupported selector: ${n}`);return A[n]}):t+\" \"+i}})}var a3A=_k(\".\"+Lk,{\"&\":{position:\"relative !important\",boxSizing:\"border-box\",\"&.cm-focused\":{outline:\"1px dotted #212121\"},display:\"flex !important\",flexDirection:\"column\"},\".cm-scroller\":{display:\"flex !important\",alignItems:\"flex-start !important\",fontFamily:\"monospace\",lineHeight:1.4,height:\"100%\",overflowX:\"auto\",position:\"relative\",zIndex:0,overflowAnchor:\"none\"},\".cm-content\":{margin:0,flexGrow:2,flexShrink:0,display:\"block\",whiteSpace:\"pre\",wordWrap:\"normal\",boxSizing:\"border-box\",minHeight:\"100%\",padding:\"4px 0\",outline:\"none\",\"&[contenteditable=true]\":{WebkitUserModify:\"read-write-plaintext-only\"}},\".cm-lineWrapping\":{whiteSpace_fallback:\"pre-wrap\",whiteSpace:\"break-spaces\",wordBreak:\"break-word\",overflowWrap:\"anywhere\",flexShrink:1},\"&light .cm-content\":{caretColor:\"black\"},\"&dark .cm-content\":{caretColor:\"white\"},\".cm-line\":{display:\"block\",padding:\"0 2px 0 6px\"},\".cm-layer\":{position:\"absolute\",left:0,top:0,contain:\"size style\",\"& > *\":{position:\"absolute\"}},\"&light .cm-selectionBackground\":{background:\"#d9d9d9\"},\"&dark .cm-selectionBackground\":{background:\"#222\"},\"&light.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground\":{background:\"#d7d4f0\"},\"&dark.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground\":{background:\"#233\"},\".cm-cursorLayer\":{pointerEvents:\"none\"},\"&.cm-focused > .cm-scroller > .cm-cursorLayer\":{animation:\"steps(1) cm-blink 1.2s infinite\"},\"@keyframes cm-blink\":{\"0%\":{},\"50%\":{opacity:0},\"100%\":{}},\"@keyframes cm-blink2\":{\"0%\":{},\"50%\":{opacity:0},\"100%\":{}},\".cm-cursor, .cm-dropCursor\":{borderLeft:\"1.2px solid black\",marginLeft:\"-0.6px\",pointerEvents:\"none\"},\".cm-cursor\":{display:\"none\"},\"&dark .cm-cursor\":{borderLeftColor:\"#ddd\"},\".cm-selectionHandle\":{backgroundColor:\"currentColor\",width:\"1.5px\"},\".cm-selectionHandle-start::before, .cm-selectionHandle-end::before\":{content:'\"\"',backgroundColor:\"inherit\",borderRadius:\"50%\",width:\"8px\",height:\"8px\",position:\"absolute\",left:\"-3.25px\"},\".cm-selectionHandle-start::before\":{top:\"-8px\"},\".cm-selectionHandle-end::before\":{bottom:\"-8px\"},\".cm-dropCursor\":{position:\"absolute\"},\"&.cm-focused > .cm-scroller > .cm-cursorLayer .cm-cursor\":{display:\"block\"},\".cm-iso\":{unicodeBidi:\"isolate\"},\".cm-announced\":{position:\"fixed\",top:\"-10000px\"},\"@media print\":{\".cm-announced\":{display:\"none\"}},\"&light .cm-activeLine\":{backgroundColor:\"#cceeff44\"},\"&dark .cm-activeLine\":{backgroundColor:\"#99eeff33\"},\"&light .cm-specialChar\":{color:\"red\"},\"&dark .cm-specialChar\":{color:\"#f78\"},\".cm-gutters\":{flexShrink:0,display:\"flex\",height:\"100%\",boxSizing:\"border-box\",zIndex:200},\".cm-gutters-before\":{insetInlineStart:0},\".cm-gutters-after\":{insetInlineEnd:0},\"&light .cm-gutters\":{backgroundColor:\"#f5f5f5\",color:\"#6c6c6c\",border:\"0px solid #ddd\",\"&.cm-gutters-before\":{borderRightWidth:\"1px\"},\"&.cm-gutters-after\":{borderLeftWidth:\"1px\"}},\"&dark .cm-gutters\":{backgroundColor:\"#333338\",color:\"#ccc\"},\".cm-gutter\":{display:\"flex !important\",flexDirection:\"column\",flexShrink:0,boxSizing:\"border-box\",minHeight:\"100%\",overflow:\"hidden\"},\".cm-gutterElement\":{boxSizing:\"border-box\"},\".cm-lineNumbers .cm-gutterElement\":{padding:\"0 3px 0 5px\",minWidth:\"20px\",textAlign:\"right\",whiteSpace:\"nowrap\"},\"&light .cm-activeLineGutter\":{backgroundColor:\"#e2f2ff\"},\"&dark .cm-activeLineGutter\":{backgroundColor:\"#222227\"},\".cm-panels\":{boxSizing:\"border-box\",position:\"sticky\",left:0,right:0,zIndex:300},\"&light .cm-panels\":{backgroundColor:\"#f5f5f5\",color:\"black\"},\"&light .cm-panels-top\":{borderBottom:\"1px solid #ddd\"},\"&light .cm-panels-bottom\":{borderTop:\"1px solid #ddd\"},\"&dark .cm-panels\":{backgroundColor:\"#333338\",color:\"white\"},\".cm-dialog\":{padding:\"2px 19px 4px 6px\",position:\"relative\",\"& label\":{fontSize:\"80%\"}},\".cm-dialog-close\":{position:\"absolute\",top:\"3px\",right:\"4px\",backgroundColor:\"inherit\",border:\"none\",font:\"inherit\",fontSize:\"14px\",padding:\"0\"},\".cm-tab\":{display:\"inline-block\",overflow:\"hidden\",verticalAlign:\"bottom\"},\".cm-widgetBuffer\":{verticalAlign:\"text-top\",height:\"1em\",width:0,display:\"inline\"},\".cm-placeholder\":{color:\"#888\",display:\"inline-block\",verticalAlign:\"top\",userSelect:\"none\"},\".cm-highlightSpace\":{backgroundImage:\"radial-gradient(circle at 50% 55%, #aaa 20%, transparent 5%)\",backgroundPosition:\"center\"},\".cm-highlightTab\":{backgroundImage:`url('data:image/svg+xml,<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"200\" height=\"20\"><path stroke=\"%23888\" stroke-width=\"1\" fill=\"none\" d=\"M1 10H196L190 5M190 15L196 10M197 4L197 16\"/></svg>')`,backgroundSize:\"auto 100%\",backgroundPosition:\"right 90%\",backgroundRepeat:\"no-repeat\"},\".cm-trailingSpace\":{backgroundColor:\"#ff332255\"},\".cm-button\":{verticalAlign:\"middle\",color:\"inherit\",fontSize:\"70%\",padding:\".2em 1em\",borderRadius:\"1px\"},\"&light .cm-button\":{backgroundImage:\"linear-gradient(#eff1f5, #d9d9df)\",border:\"1px solid #888\",\"&:active\":{backgroundImage:\"linear-gradient(#b4b4b4, #d0d3d6)\"}},\"&dark .cm-button\":{backgroundImage:\"linear-gradient(#393939, #111)\",border:\"1px solid #888\",\"&:active\":{backgroundImage:\"linear-gradient(#111, #333)\"}},\".cm-textfield\":{verticalAlign:\"middle\",color:\"inherit\",fontSize:\"70%\",border:\"1px solid silver\",padding:\".2em .5em\"},\"&light .cm-textfield\":{backgroundColor:\"white\"},\"&dark .cm-textfield\":{border:\"1px solid #555\",backgroundColor:\"inherit\"}},Cj),r3A={childList:!0,characterData:!0,subtree:!0,attributes:!0,characterDataOldValue:!0},ZM=ot.ie&&ot.ie_version<=11,Gk=class{constructor(e){this.view=e,this.active=!1,this.editContext=null,this.selectionRange=new rk,this.selectionChanged=!1,this.delayedFlush=-1,this.resizeTimeout=-1,this.queue=[],this.delayedAndroidKey=null,this.flushingAndroidKey=-1,this.lastChange=0,this.scrollTargets=[],this.intersection=null,this.resizeScroll=null,this.intersecting=!1,this.gapIntersection=null,this.gaps=[],this.printQuery=null,this.parentCheck=-1,this.dom=e.contentDOM,this.observer=new MutationObserver(A=>{for(let i of A)this.queue.push(i);(ot.ie&&ot.ie_version<=11||ot.ios&&e.composing)&&A.some(i=>i.type==\"childList\"&&i.removedNodes.length||i.type==\"characterData\"&&i.oldValue.length>i.target.nodeValue.length)?this.flushSoon():this.flush()}),window.EditContext&&ot.android&&e.constructor.EDIT_CONTEXT!==!1&&!(ot.chrome&&ot.chrome_version<126)&&(this.editContext=new Kk(e),e.state.facet(W0)&&(e.contentDOM.editContext=this.editContext.editContext)),ZM&&(this.onCharData=A=>{this.queue.push({target:A.target,type:\"characterData\",oldValue:A.prevValue}),this.flushSoon()}),this.onSelectionChange=this.onSelectionChange.bind(this),this.onResize=this.onResize.bind(this),this.onPrint=this.onPrint.bind(this),this.onScroll=this.onScroll.bind(this),window.matchMedia&&(this.printQuery=window.matchMedia(\"print\")),typeof ResizeObserver==\"function\"&&(this.resizeScroll=new ResizeObserver(()=>{var A;((A=this.view.docView)===null||A===void 0?void 0:A.lastUpdate)<Date.now()-75&&this.onResize()}),this.resizeScroll.observe(e.scrollDOM)),this.addWindowListeners(this.win=e.win),this.start(),typeof IntersectionObserver==\"function\"&&(this.intersection=new IntersectionObserver(A=>{this.parentCheck<0&&(this.parentCheck=setTimeout(this.listenForScroll.bind(this),1e3)),A.length>0&&A[A.length-1].intersectionRatio>0!=this.intersecting&&(this.intersecting=!this.intersecting,this.intersecting!=this.view.inView&&this.onScrollChanged(document.createEvent(\"Event\")))},{threshold:[0,.001]}),this.intersection.observe(this.dom),this.gapIntersection=new IntersectionObserver(A=>{A.length>0&&A[A.length-1].intersectionRatio>0&&this.onScrollChanged(document.createEvent(\"Event\"))},{})),this.listenForScroll(),this.readSelectionRange()}onScrollChanged(e){this.view.inputState.runHandlers(\"scroll\",e),this.intersecting&&this.view.measure()}onScroll(e){this.intersecting&&this.flush(!1),this.editContext&&this.view.requestMeasure(this.editContext.measureReq),this.onScrollChanged(e)}onResize(){this.resizeTimeout<0&&(this.resizeTimeout=setTimeout(()=>{this.resizeTimeout=-1,this.view.requestMeasure()},50))}onPrint(e){(e.type==\"change\"||!e.type)&&!e.matches||(this.view.viewState.printing=!0,this.view.measure(),setTimeout(()=>{this.view.viewState.printing=!1,this.view.requestMeasure()},500))}updateGaps(e){if(this.gapIntersection&&(e.length!=this.gaps.length||this.gaps.some((A,i)=>A!=e[i]))){this.gapIntersection.disconnect();for(let A of e)this.gapIntersection.observe(A);this.gaps=e}}onSelectionChange(e){let A=this.selectionChanged;if(!this.readSelectionRange()||this.delayedAndroidKey)return;let{view:i}=this,n=this.selectionRange;if(i.state.facet(W0)?i.root.activeElement!=this.dom:!a3(this.dom,n))return;let o=n.anchorNode&&i.docView.tile.nearest(n.anchorNode);if(o&&o.isWidget()&&o.widget.ignoreEvent(e)){A||(this.selectionChanged=!1);return}(ot.ie&&ot.ie_version<=11||ot.android&&ot.chrome)&&!i.state.selection.main.empty&&n.focusNode&&r3(n.focusNode,n.focusOffset,n.anchorNode,n.anchorOffset)?this.flushSoon():this.flush(!1)}readSelectionRange(){let{view:e}=this,A=E3(e.root);if(!A)return!1;let i=ot.safari&&e.root.nodeType==11&&e.root.activeElement==this.dom&&s3A(this.view,A)||A;if(!i||this.selectionRange.eq(i))return!1;let n=a3(this.dom,i);return n&&!this.selectionChanged&&e.inputState.lastFocusTime>Date.now()-200&&e.inputState.lastTouchTime<Date.now()-300&&i4A(this.dom,i)?(this.view.inputState.lastFocusTime=0,e.docView.updateSelection(),!1):(this.selectionRange.setRange(i),n&&(this.selectionChanged=!0),!0)}setSelectionRange(e,A){this.selectionRange.set(e.node,e.offset,A.node,A.offset),this.selectionChanged=!1}clearSelectionRange(){this.selectionRange.set(null,0,null,0)}listenForScroll(){this.parentCheck=-1;let e=0,A=null;for(let i=this.dom;i;)if(i.nodeType==1)!A&&e<this.scrollTargets.length&&this.scrollTargets[e]==i?e++:A||(A=this.scrollTargets.slice(0,e)),A&&A.push(i),i=i.assignedSlot||i.parentNode;else if(i.nodeType==11)i=i.host;else break;if(e<this.scrollTargets.length&&!A&&(A=this.scrollTargets.slice(0,e)),A){for(let i of this.scrollTargets)i.removeEventListener(\"scroll\",this.onScroll);for(let i of this.scrollTargets=A)i.addEventListener(\"scroll\",this.onScroll)}}ignore(e){if(!this.active)return e();try{return this.stop(),e()}finally{this.start(),this.clear()}}start(){this.active||(this.observer.observe(this.dom,r3A),ZM&&this.dom.addEventListener(\"DOMCharacterDataModified\",this.onCharData),this.active=!0)}stop(){this.active&&(this.active=!1,this.observer.disconnect(),ZM&&this.dom.removeEventListener(\"DOMCharacterDataModified\",this.onCharData))}clear(){this.processRecords(),this.queue.length=0,this.selectionChanged=!1}delayAndroidKey(e,A){var i;if(!this.delayedAndroidKey){let n=()=>{let o=this.delayedAndroidKey;o&&(this.clearDelayedAndroidKey(),this.view.inputState.lastKeyCode=o.keyCode,this.view.inputState.lastKeyTime=Date.now(),!this.flush()&&o.force&&gQ(this.dom,o.key,o.keyCode))};this.flushingAndroidKey=this.view.win.requestAnimationFrame(n)}(!this.delayedAndroidKey||e==\"Enter\")&&(this.delayedAndroidKey={key:e,keyCode:A,force:this.lastChange<Date.now()-50||!!(!((i=this.delayedAndroidKey)===null||i===void 0)&&i.force)})}clearDelayedAndroidKey(){this.win.cancelAnimationFrame(this.flushingAndroidKey),this.delayedAndroidKey=null,this.flushingAndroidKey=-1}flushSoon(){this.delayedFlush<0&&(this.delayedFlush=this.view.win.requestAnimationFrame(()=>{this.delayedFlush=-1,this.flush()}))}forceFlush(){this.delayedFlush>=0&&(this.view.win.cancelAnimationFrame(this.delayedFlush),this.delayedFlush=-1),this.flush()}pendingRecords(){for(let e of this.observer.takeRecords())this.queue.push(e);return this.queue}processRecords(){let e=this.pendingRecords();e.length&&(this.queue=[]);let A=-1,i=-1,n=!1;for(let o of e){let a=this.readMutation(o);a&&(a.typeOver&&(n=!0),A==-1?{from:A,to:i}=a:(A=Math.min(a.from,A),i=Math.max(a.to,i)))}return{from:A,to:i,typeOver:n}}readChange(){let{from:e,to:A,typeOver:i}=this.processRecords(),n=this.selectionChanged&&a3(this.dom,this.selectionRange);if(e<0&&!n)return null;e>-1&&(this.lastChange=Date.now()),this.view.inputState.lastFocusTime=0,this.selectionChanged=!1;let o=new wk(this.view,e,A,i);return this.view.docView.domChanged={newSel:o.newSel?o.newSel.main:null},o}flush(e=!0){if(this.delayedFlush>=0||this.delayedAndroidKey)return!1;e&&this.readSelectionRange();let A=this.readChange();if(!A)return this.view.requestMeasure(),!1;let i=this.view.state,n=Aj(this.view,A);return this.view.state==i&&(A.domChanged||A.newSel&&!j8(this.view.state.selection,A.newSel.main))&&this.view.update([]),n}readMutation(e){let A=this.view.docView.tile.nearest(e.target);if(!A||A.isWidget())return null;if(A.markDirty(e.type==\"attributes\"),e.type==\"childList\"){let i=gP(A,e.previousSibling||e.target.previousSibling,-1),n=gP(A,e.nextSibling||e.target.nextSibling,1);return{from:i?A.posAfter(i):A.posAtStart,to:n?A.posBefore(n):A.posAtEnd,typeOver:!1}}else return e.type==\"characterData\"?{from:A.posAtStart,to:A.posAtEnd,typeOver:e.target.nodeValue==e.oldValue}:null}setWindow(e){e!=this.win&&(this.removeWindowListeners(this.win),this.win=e,this.addWindowListeners(this.win))}addWindowListeners(e){e.addEventListener(\"resize\",this.onResize),this.printQuery?this.printQuery.addEventListener?this.printQuery.addEventListener(\"change\",this.onPrint):this.printQuery.addListener(this.onPrint):e.addEventListener(\"beforeprint\",this.onPrint),e.addEventListener(\"scroll\",this.onScroll),e.document.addEventListener(\"selectionchange\",this.onSelectionChange)}removeWindowListeners(e){e.removeEventListener(\"scroll\",this.onScroll),e.removeEventListener(\"resize\",this.onResize),this.printQuery?this.printQuery.removeEventListener?this.printQuery.removeEventListener(\"change\",this.onPrint):this.printQuery.removeListener(this.onPrint):e.removeEventListener(\"beforeprint\",this.onPrint),e.document.removeEventListener(\"selectionchange\",this.onSelectionChange)}update(e){this.editContext&&(this.editContext.update(e),e.startState.facet(W0)!=e.state.facet(W0)&&(e.view.contentDOM.editContext=e.state.facet(W0)?this.editContext.editContext:null))}destroy(){var e,A,i;this.stop(),(e=this.intersection)===null||e===void 0||e.disconnect(),(A=this.gapIntersection)===null||A===void 0||A.disconnect(),(i=this.resizeScroll)===null||i===void 0||i.disconnect();for(let n of this.scrollTargets)n.removeEventListener(\"scroll\",this.onScroll);this.removeWindowListeners(this.win),clearTimeout(this.parentCheck),clearTimeout(this.resizeTimeout),this.win.cancelAnimationFrame(this.delayedFlush),this.win.cancelAnimationFrame(this.flushingAndroidKey),this.editContext&&(this.view.contentDOM.editContext=null,this.editContext.destroy())}};function gP(t,e,A){for(;e;){let i=sa.get(e);if(i&&i.parent==t)return i;let n=e.parentNode;e=n!=t.dom?n:A>0?e.nextSibling:e.previousSibling}return null}function lP(t,e){let A=e.startContainer,i=e.startOffset,n=e.endContainer,o=e.endOffset,a=t.docView.domAtPos(t.state.selection.main.anchor,1);return r3(a.node,a.offset,n,o)&&([A,i,n,o]=[n,o,A,i]),{anchorNode:A,anchorOffset:i,focusNode:n,focusOffset:o}}function s3A(t,e){if(e.getComposedRanges){let n=e.getComposedRanges(t.root)[0];if(n)return lP(t,n)}let A=null;function i(n){n.preventDefault(),n.stopImmediatePropagation(),A=n.getTargetRanges()[0]}return t.contentDOM.addEventListener(\"beforeinput\",i,!0),t.dom.ownerDocument.execCommand(\"indent\"),t.contentDOM.removeEventListener(\"beforeinput\",i,!0),A?lP(t,A):null}var Kk=class{constructor(e){this.from=0,this.to=0,this.pendingContextChange=null,this.handlers=Object.create(null),this.composing=null,this.resetRange(e.state);let A=this.editContext=new window.EditContext({text:e.state.doc.sliceString(this.from,this.to),selectionStart:this.toContextPos(Math.max(this.from,Math.min(this.to,e.state.selection.main.anchor))),selectionEnd:this.toContextPos(e.state.selection.main.head)});this.handlers.textupdate=i=>{let n=e.state.selection.main,{anchor:o,head:a}=n,r=this.toEditorPos(i.updateRangeStart),s=this.toEditorPos(i.updateRangeEnd);e.inputState.composing>=0&&!this.composing&&(this.composing={contextBase:i.updateRangeStart,editorBase:r,drifted:!1});let g=s-r>i.text.length;r==this.from&&o<this.from?r=o:s==this.to&&o>this.to&&(s=o);let l=ej(e.state.sliceDoc(r,s),i.text,(g?n.from:n.to)-r,g?\"end\":null);if(!l){let I=ce.single(this.toEditorPos(i.selectionStart),this.toEditorPos(i.selectionEnd));j8(I,n)||e.dispatch({selection:I,userEvent:\"select\"});return}let C={from:l.from+r,to:l.toA+r,insert:Bn.of(i.text.slice(l.from,l.toB).split(`\n`))};if((ot.mac||ot.android)&&C.from==a-1&&/^\\. ?$/.test(i.text)&&e.contentDOM.getAttribute(\"autocorrect\")==\"off\"&&(C={from:r,to:s,insert:Bn.of([i.text.replace(\".\",\" \")])}),this.pendingContextChange=C,!e.state.readOnly){let I=this.to-this.from+(C.to-C.from+C.insert.length);iS(e,C,ce.single(this.toEditorPos(i.selectionStart,I),this.toEditorPos(i.selectionEnd,I)))}this.pendingContextChange&&(this.revertPending(e.state),this.setSelection(e.state)),C.from<C.to&&!C.insert.length&&e.inputState.composing>=0&&!/[\\\\p{Alphabetic}\\\\p{Number}_]/.test(A.text.slice(Math.max(0,i.updateRangeStart-1),Math.min(A.text.length,i.updateRangeStart+1)))&&this.handlers.compositionend(i)},this.handlers.characterboundsupdate=i=>{let n=[],o=null;for(let a=this.toEditorPos(i.rangeStart),r=this.toEditorPos(i.rangeEnd);a<r;a++){let s=e.coordsForChar(a);o=s&&new DOMRect(s.left,s.top,s.right-s.left,s.bottom-s.top)||o||new DOMRect,n.push(o)}A.updateCharacterBounds(i.rangeStart,n)},this.handlers.textformatupdate=i=>{let n=[];for(let o of i.getTextFormats()){let a=o.underlineStyle,r=o.underlineThickness;if(!/none/i.test(a)&&!/none/i.test(r)){let s=this.toEditorPos(o.rangeStart),g=this.toEditorPos(o.rangeEnd);if(s<g){let l=`text-decoration: underline ${/^[a-z]/.test(a)?a+\" \":a==\"Dashed\"?\"dashed \":a==\"Squiggle\"?\"wavy \":\"\"}${/thin/i.test(r)?1:2}px`;n.push(vt.mark({attributes:{style:l}}).range(s,g))}}}e.dispatch({effects:PP.of(vt.set(n))})},this.handlers.compositionstart=()=>{e.inputState.composing<0&&(e.inputState.composing=0,e.inputState.compositionFirstChange=!0)},this.handlers.compositionend=()=>{if(e.inputState.composing=-1,e.inputState.compositionFirstChange=null,this.composing){let{drifted:i}=this.composing;this.composing=null,i&&this.reset(e.state)}};for(let i in this.handlers)A.addEventListener(i,this.handlers[i]);this.measureReq={read:i=>{this.editContext.updateControlBounds(i.contentDOM.getBoundingClientRect());let n=E3(i.root);n&&n.rangeCount&&this.editContext.updateSelectionBounds(n.getRangeAt(0).getBoundingClientRect())}}}applyEdits(e){let A=0,i=!1,n=this.pendingContextChange;return e.changes.iterChanges((o,a,r,s,g)=>{if(i)return;let l=g.length-(a-o);if(n&&a>=n.to)if(n.from==o&&n.to==a&&n.insert.eq(g)){n=this.pendingContextChange=null,A+=l,this.to+=l;return}else n=null,this.revertPending(e.state);if(o+=A,a+=A,a<=this.from)this.from+=l,this.to+=l;else if(o<this.to){if(o<this.from||a>this.to||this.to-this.from+g.length>3e4){i=!0;return}this.editContext.updateText(this.toContextPos(o),this.toContextPos(a),g.toString()),this.to+=l}A+=l}),n&&!i&&this.revertPending(e.state),!i}update(e){let A=this.pendingContextChange,i=e.startState.selection.main;this.composing&&(this.composing.drifted||!e.changes.touchesRange(i.from,i.to)&&e.transactions.some(n=>!n.isUserEvent(\"input.type\")&&n.changes.touchesRange(this.from,this.to)))?(this.composing.drifted=!0,this.composing.editorBase=e.changes.mapPos(this.composing.editorBase)):!this.applyEdits(e)||!this.rangeIsValid(e.state)?(this.pendingContextChange=null,this.reset(e.state)):(e.docChanged||e.selectionSet||A)&&this.setSelection(e.state),(e.geometryChanged||e.docChanged||e.selectionSet)&&e.view.requestMeasure(this.measureReq)}resetRange(e){let{head:A}=e.selection.main;this.from=Math.max(0,A-1e4),this.to=Math.min(e.doc.length,A+1e4)}reset(e){this.resetRange(e),this.editContext.updateText(0,this.editContext.text.length,e.doc.sliceString(this.from,this.to)),this.setSelection(e)}revertPending(e){let A=this.pendingContextChange;this.pendingContextChange=null,this.editContext.updateText(this.toContextPos(A.from),this.toContextPos(A.from+A.insert.length),e.doc.sliceString(A.from,A.to))}setSelection(e){let{main:A}=e.selection,i=this.toContextPos(Math.max(this.from,Math.min(this.to,A.anchor))),n=this.toContextPos(A.head);(this.editContext.selectionStart!=i||this.editContext.selectionEnd!=n)&&this.editContext.updateSelection(i,n)}rangeIsValid(e){let{head:A}=e.selection.main;return!(this.from>0&&A-this.from<500||this.to<e.doc.length&&this.to-A<500||this.to-this.from>1e4*3)}toEditorPos(e,A=this.to-this.from){e=Math.min(e,A);let i=this.composing;return i&&i.drifted?i.editorBase+(e-i.contextBase):e+this.from}toContextPos(e){let A=this.composing;return A&&A.drifted?A.contextBase+(e-A.editorBase):e-this.from}destroy(){for(let e in this.handlers)this.editContext.removeEventListener(e,this.handlers[e])}},ai=(()=>{class t{get state(){return this.viewState.state}get viewport(){return this.viewState.viewport}get visibleRanges(){return this.viewState.visibleRanges}get inView(){return this.viewState.inView}get composing(){return!!this.inputState&&this.inputState.composing>0}get compositionStarted(){return!!this.inputState&&this.inputState.composing>=0}get root(){return this._root}get win(){return this.dom.ownerDocument.defaultView||window}constructor(A={}){var i;this.plugins=[],this.pluginMap=new Map,this.editorAttrs={},this.contentAttrs={},this.bidiCache=[],this.destroyed=!1,this.updateState=2,this.measureScheduled=-1,this.measureRequests=[],this.contentDOM=document.createElement(\"div\"),this.scrollDOM=document.createElement(\"div\"),this.scrollDOM.tabIndex=-1,this.scrollDOM.className=\"cm-scroller\",this.scrollDOM.appendChild(this.contentDOM),this.announceDOM=document.createElement(\"div\"),this.announceDOM.className=\"cm-announced\",this.announceDOM.setAttribute(\"aria-live\",\"polite\"),this.dom=document.createElement(\"div\"),this.dom.appendChild(this.announceDOM),this.dom.appendChild(this.scrollDOM),A.parent&&A.parent.appendChild(this.dom);let{dispatch:n}=A;this.dispatchTransactions=A.dispatchTransactions||n&&(o=>o.forEach(a=>n(a,this)))||(o=>this.update(o)),this.dispatch=this.dispatch.bind(this),this._root=A.root||t4A(A.parent)||document,this.viewState=new W8(this,A.state||Ga.create(A)),A.scrollTo&&A.scrollTo.is(y8)&&(this.viewState.scrollTarget=A.scrollTo.value.clip(this.viewState.state)),this.plugins=this.state.facet(nQ).map(o=>new g3(o));for(let o of this.plugins)o.update(this);this.observer=new Gk(this),this.inputState=new yk(this),this.inputState.ensureHandlers(this.plugins),this.docView=new z8(this),this.mountStyles(),this.updateAttrs(),this.updateState=0,this.requestMeasure(),!((i=document.fonts)===null||i===void 0)&&i.ready&&document.fonts.ready.then(()=>{this.viewState.mustMeasureContent=\"refresh\",this.requestMeasure()})}dispatch(...A){let i=A.length==1&&A[0]instanceof Wc?A:A.length==1&&Array.isArray(A[0])?A[0]:[this.state.update(...A)];this.dispatchTransactions(i,this)}update(A){if(this.updateState!=0)throw new Error(\"Calls to EditorView.update are not allowed while an update is in progress\");let i=!1,n=!1,o,a=this.state;for(let d of A){if(d.startState!=a)throw new RangeError(\"Trying to update state with a transaction that doesn't start from the previous state.\");a=d.state}if(this.destroyed){this.viewState.state=a;return}let r=this.hasFocus,s=0,g=null;A.some(d=>d.annotation(rj))?(this.inputState.notifiedFocused=r,s=1):r!=this.inputState.notifiedFocused&&(this.inputState.notifiedFocused=r,g=sj(a,r),g||(s=1));let l=this.observer.delayedAndroidKey,C=null;if(l?(this.observer.clearDelayedAndroidKey(),C=this.observer.readChange(),(C&&!this.state.doc.eq(a.doc)||!this.state.selection.eq(a.selection))&&(C=null)):this.observer.clear(),a.facet(Ga.phrases)!=this.state.facet(Ga.phrases))return this.setState(a);o=T8.create(this,a,A),o.flags|=s;let I=this.viewState.scrollTarget;try{this.updateState=2;for(let d of A){if(I&&(I=I.map(d.changes)),d.scrollIntoView){let{main:B}=d.state.selection;I=new s3(B.empty?B:ce.cursor(B.head,B.head>B.anchor?-1:1))}for(let B of d.effects)B.is(y8)&&(I=B.value.clip(this.state))}this.viewState.update(o,I),this.bidiCache=Z8.update(this.bidiCache,o.changes),o.empty||(this.updatePlugins(o),this.inputState.update(o)),i=this.docView.update(o),this.state.facet(i3)!=this.styleModules&&this.mountStyles(),n=this.updateAttrs(),this.showAnnouncements(A),this.docView.updateSelection(i,A.some(d=>d.isUserEvent(\"select.pointer\")))}finally{this.updateState=0}if(o.startState.facet(S8)!=o.state.facet(S8)&&(this.viewState.mustMeasureContent=!0),(i||n||I||this.viewState.mustEnforceCursorAssoc||this.viewState.mustMeasureContent)&&this.requestMeasure(),i&&this.docViewUpdate(),!o.empty)for(let d of this.state.facet(PM))try{d(o)}catch(B){dr(this.state,B,\"update listener\")}(g||C)&&Promise.resolve().then(()=>{g&&this.state==g.startState&&this.dispatch(g),C&&!Aj(this,C)&&l.force&&gQ(this.contentDOM,l.key,l.keyCode)})}setState(A){if(this.updateState!=0)throw new Error(\"Calls to EditorView.setState are not allowed while an update is in progress\");if(this.destroyed){this.viewState.state=A;return}this.updateState=2;let i=this.hasFocus;try{for(let n of this.plugins)n.destroy(this);this.viewState=new W8(this,A),this.plugins=A.facet(nQ).map(n=>new g3(n)),this.pluginMap.clear();for(let n of this.plugins)n.update(this);this.docView.destroy(),this.docView=new z8(this),this.inputState.ensureHandlers(this.plugins),this.mountStyles(),this.updateAttrs(),this.bidiCache=[]}finally{this.updateState=0}i&&this.focus(),this.requestMeasure()}updatePlugins(A){let i=A.startState.facet(nQ),n=A.state.facet(nQ);if(i!=n){let o=[];for(let a of n){let r=i.indexOf(a);if(r<0)o.push(new g3(a));else{let s=this.plugins[r];s.mustUpdate=A,o.push(s)}}for(let a of this.plugins)a.mustUpdate!=A&&a.destroy(this);this.plugins=o,this.pluginMap.clear()}else for(let o of this.plugins)o.mustUpdate=A;for(let o=0;o<this.plugins.length;o++)this.plugins[o].update(this);i!=n&&this.inputState.ensureHandlers(this.plugins)}docViewUpdate(){for(let A of this.plugins){let i=A.value;if(i&&i.docViewUpdate)try{i.docViewUpdate(this)}catch(n){dr(this.state,n,\"doc view update listener\")}}}measure(A=!0){if(this.destroyed)return;if(this.measureScheduled>-1&&this.win.cancelAnimationFrame(this.measureScheduled),this.observer.delayedAndroidKey){this.measureScheduled=-1,this.requestMeasure();return}this.measureScheduled=0,A&&this.observer.forceFlush();let i=null,n=this.viewState.scrollParent,o=this.viewState.getScrollOffset(),{scrollAnchorPos:a,scrollAnchorHeight:r}=this.viewState;Math.abs(o-this.viewState.scrollOffset)>1&&(r=-1),this.viewState.scrollAnchorHeight=-1;try{for(let s=0;;s++){if(r<0)if(SP(n||this.win))a=-1,r=this.viewState.heightMap.height;else{let B=this.viewState.scrollAnchorAt(o);a=B.from,r=B.top}this.updateState=1;let g=this.viewState.measure();if(!g&&!this.measureRequests.length&&this.viewState.scrollTarget==null)break;if(s>5){console.warn(this.measureRequests.length?\"Measure loop restarted more than 5 times\":\"Viewport failed to stabilize\");break}let l=[];g&4||([this.measureRequests,l]=[l,this.measureRequests]);let C=l.map(B=>{try{return B.read(this)}catch(Q){return dr(this.state,Q),cP}}),I=T8.create(this,this.state,[]),d=!1;I.flags|=g,i?i.flags|=g:i=I,this.updateState=2,I.empty||(this.updatePlugins(I),this.inputState.update(I),this.updateAttrs(),d=this.docView.update(I),d&&this.docViewUpdate());for(let B=0;B<l.length;B++)if(C[B]!=cP)try{let Q=l[B];Q.write&&Q.write(C[B],this)}catch(Q){dr(this.state,Q)}if(d&&this.docView.updateSelection(!0),!I.viewportChanged&&this.measureRequests.length==0){if(this.viewState.editorHeight)if(this.viewState.scrollTarget){this.docView.scrollIntoView(this.viewState.scrollTarget),this.viewState.scrollTarget=null,r=-1;continue}else{let Q=((a<0?this.viewState.heightMap.height:this.viewState.lineBlockAt(a).top)-r)/this.scaleY;if((Q>1||Q<-1)&&(n==this.scrollDOM||this.hasFocus||Math.max(this.inputState.lastWheelEvent,this.inputState.lastTouchTime)>Date.now()-100)){o=o+Q,n?n.scrollTop+=Q:this.win.scrollBy(0,Q),r=-1;continue}}break}}}finally{this.updateState=0,this.measureScheduled=-1}if(i&&!i.empty)for(let s of this.state.facet(PM))s(i)}get themeClasses(){return Lk+\" \"+(this.state.facet(WM)?cj:lj)+\" \"+this.state.facet(S8)}updateAttrs(){let A=CP(this,zz,{class:\"cm-editor\"+(this.hasFocus?\" cm-focused \":\" \")+this.themeClasses}),i={spellcheck:\"false\",autocorrect:\"off\",autocapitalize:\"off\",writingsuggestions:\"false\",translate:\"no\",contenteditable:this.state.facet(W0)?\"true\":\"false\",class:\"cm-content\",style:`${ot.tabSize}: ${this.state.tabSize}`,role:\"textbox\",\"aria-multiline\":\"true\"};this.state.readOnly&&(i[\"aria-readonly\"]=\"true\"),CP(this,ck,i);let n=this.observer.ignore(()=>{let o=Yz(this.contentDOM,this.contentAttrs,i),a=Yz(this.dom,this.editorAttrs,A);return o||a});return this.editorAttrs=A,this.contentAttrs=i,n}showAnnouncements(A){let i=!0;for(let n of A)for(let o of n.effects)if(o.is(t.announce)){i&&(this.announceDOM.textContent=\"\"),i=!1;let a=this.announceDOM.appendChild(document.createElement(\"div\"));a.textContent=o.value}}mountStyles(){this.styleModules=this.state.facet(i3);let A=this.state.facet(t.cspNonce);Xg.mount(this.root,this.styleModules.concat(a3A).reverse(),A?{nonce:A}:void 0)}readMeasured(){if(this.updateState==2)throw new Error(\"Reading the editor layout isn't allowed during an update\");this.updateState==0&&this.measureScheduled>-1&&this.measure(!1)}requestMeasure(A){if(this.measureScheduled<0&&(this.measureScheduled=this.win.requestAnimationFrame(()=>this.measure())),A){if(this.measureRequests.indexOf(A)>-1)return;if(A.key!=null){for(let i=0;i<this.measureRequests.length;i++)if(this.measureRequests[i].key===A.key){this.measureRequests[i]=A;return}}this.measureRequests.push(A)}}plugin(A){let i=this.pluginMap.get(A);return(i===void 0||i&&i.plugin!=A)&&this.pluginMap.set(A,i=this.plugins.find(n=>n.plugin==A)||null),i&&i.update(this).value}get documentTop(){return this.contentDOM.getBoundingClientRect().top+this.viewState.paddingTop}get documentPadding(){return{top:this.viewState.paddingTop,bottom:this.viewState.paddingBottom}}get scaleX(){return this.viewState.scaleX}get scaleY(){return this.viewState.scaleY}elementAtHeight(A){return this.readMeasured(),this.viewState.elementAtHeight(A)}lineBlockAtHeight(A){return this.readMeasured(),this.viewState.lineBlockAtHeight(A)}get viewportLineBlocks(){return this.viewState.viewportLines}lineBlockAt(A){return this.viewState.lineBlockAt(A)}get contentHeight(){return this.viewState.contentHeight}moveByChar(A,i,n){return VM(this,A,Wz(this,A,i,n))}moveByGroup(A,i){return VM(this,A,Wz(this,A,i,n=>x4A(this,A.head,n)))}visualLineSide(A,i){let n=this.bidiSpans(A),o=this.textDirectionAt(A.from),a=n[i?n.length-1:0];return ce.cursor(a.side(i,o)+A.from,a.forward(!i,o)?1:-1)}moveToLineBoundary(A,i,n=!0){return S4A(this,A,i,n)}moveVertically(A,i,n){return VM(this,A,R4A(this,A,i,n))}domAtPos(A,i=1){return this.docView.domAtPos(A,i)}posAtDOM(A,i=0){return this.docView.posFromDOM(A,i)}posAtCoords(A,i=!0){this.readMeasured();let n=mk(this,A,i);return n&&n.pos}posAndSideAtCoords(A,i=!0){return this.readMeasured(),mk(this,A,i)}coordsAtPos(A,i=1){this.readMeasured();let n=this.docView.coordsAt(A,i);if(!n||n.left==n.right)return n;let o=this.state.doc.lineAt(A),a=this.bidiSpans(o),r=a[el.find(a,A-o.from,-1,i)];return H8(n,r.dir==go.LTR==i>0)}coordsForChar(A){return this.readMeasured(),this.docView.coordsForChar(A)}get defaultCharacterWidth(){return this.viewState.heightOracle.charWidth}get defaultLineHeight(){return this.viewState.heightOracle.lineHeight}get textDirection(){return this.viewState.defaultTextDirection}textDirectionAt(A){return!this.state.facet(Oz)||A<this.viewport.from||A>this.viewport.to?this.textDirection:(this.readMeasured(),this.docView.textDirectionAt(A))}get lineWrapping(){return this.viewState.heightOracle.lineWrapping}bidiSpans(A){if(A.length>g3A)return _P(A.length);let i=this.textDirectionAt(A.from),n;for(let a of this.bidiCache)if(a.from==A.from&&a.dir==i&&(a.fresh||LP(a.isolates,n=Pz(this,A))))return a.order;n||(n=Pz(this,A));let o=l4A(A.text,i,n);return this.bidiCache.push(new Z8(A.from,A.to,i,n,!0,o)),o}get hasFocus(){var A;return(this.dom.ownerDocument.hasFocus()||ot.safari&&((A=this.inputState)===null||A===void 0?void 0:A.lastContextMenu)>Date.now()-3e4)&&this.root.activeElement==this.contentDOM}focus(){this.observer.ignore(()=>{kP(this.contentDOM),this.docView.updateSelection()})}setRoot(A){this._root!=A&&(this._root=A,this.observer.setWindow((A.nodeType==9?A:A.ownerDocument).defaultView||window),this.mountStyles())}destroy(){this.root.activeElement==this.contentDOM&&this.contentDOM.blur();for(let A of this.plugins)A.destroy(this);this.plugins=[],this.inputState.destroy(),this.docView.destroy(),this.dom.remove(),this.observer.destroy(),this.measureScheduled>-1&&this.win.cancelAnimationFrame(this.measureScheduled),this.destroyed=!0}static scrollIntoView(A,i={}){return y8.of(new s3(typeof A==\"number\"?ce.cursor(A):A,i.y,i.x,i.yMargin,i.xMargin))}scrollSnapshot(){let{scrollTop:A,scrollLeft:i}=this.scrollDOM,n=this.viewState.scrollAnchorAt(A);return y8.of(new s3(ce.cursor(n.from),\"start\",\"start\",n.top-A,i,!0))}setTabFocusMode(A){A==null?this.inputState.tabFocusMode=this.inputState.tabFocusMode<0?0:-1:typeof A==\"boolean\"?this.inputState.tabFocusMode=A?0:-1:this.inputState.tabFocusMode!=0&&(this.inputState.tabFocusMode=Date.now()+A)}static domEventHandlers(A){return ho.define(()=>({}),{eventHandlers:A})}static domEventObservers(A){return ho.define(()=>({}),{eventObservers:A})}static theme(A,i){let n=Xg.newName(),o=[S8.of(n),i3.of(_k(`.${n}`,A))];return i&&i.dark&&o.push(WM.of(!0)),o}static baseTheme(A){return zl.lowest(i3.of(_k(\".\"+Lk,A,Cj)))}static findFromDOM(A){var i;let n=A.querySelector(\".cm-content\"),o=n&&sa.get(n)||sa.get(A);return((i=o?.root)===null||i===void 0?void 0:i.view)||null}}return t.styleModule=i3,t.inputHandler=HP,t.clipboardInputFilter=$k,t.clipboardOutputFilter=AS,t.scrollHandler=zP,t.focusChangeEffect=TP,t.perLineTextDirection=Oz,t.exceptionSink=YP,t.updateListener=PM,t.editable=W0,t.mouseSelectionStyle=JP,t.dragMovesSelection=UP,t.clickAddsSelectionRange=KP,t.decorations=n5,t.blockWrappers=jP,t.outerDecorations=eS,t.atomicRanges=u3,t.bidiIsolatedRanges=qP,t.scrollMargins=VP,t.darkTheme=WM,t.cspNonce=qe.define({combine:e=>e.length?e[0]:\"\"}),t.contentAttributes=ck,t.editorAttributes=zz,t.lineWrapping=t.contentAttributes.of({class:\"cm-lineWrapping\"}),t.announce=Ui.define(),t})(),g3A=4096,cP={},Z8=class t{constructor(e,A,i,n,o,a){this.from=e,this.to=A,this.dir=i,this.isolates=n,this.fresh=o,this.order=a}static update(e,A){if(A.empty&&!e.some(o=>o.fresh))return e;let i=[],n=e.length?e[e.length-1].dir:go.LTR;for(let o=Math.max(0,e.length-10);o<e.length;o++){let a=e[o];a.dir==n&&!A.touchesRange(a.from,a.to)&&i.push(new t(A.mapPos(a.from,1),A.mapPos(a.to,-1),a.dir,a.isolates,!1,a.order))}return i}};function CP(t,e,A){for(let i=t.state.facet(e),n=i.length-1;n>=0;n--){let o=i[n],a=typeof o==\"function\"?o(t):o;a&&Wk(a,A)}return A}var l3A=ot.mac?\"mac\":ot.windows?\"win\":ot.linux?\"linux\":\"key\";function c3A(t,e){let A=t.split(/-(?!$)/),i=A[A.length-1];i==\"Space\"&&(i=\" \");let n,o,a,r;for(let s=0;s<A.length-1;++s){let g=A[s];if(/^(cmd|meta|m)$/i.test(g))r=!0;else if(/^a(lt)?$/i.test(g))n=!0;else if(/^(c|ctrl|control)$/i.test(g))o=!0;else if(/^s(hift)?$/i.test(g))a=!0;else if(/^mod$/i.test(g))e==\"mac\"?r=!0:o=!0;else throw new Error(\"Unrecognized modifier name: \"+g)}return n&&(i=\"Alt-\"+i),o&&(i=\"Ctrl-\"+i),r&&(i=\"Meta-\"+i),a&&(i=\"Shift-\"+i),i}function x8(t,e,A){return e.altKey&&(t=\"Alt-\"+t),e.ctrlKey&&(t=\"Ctrl-\"+t),e.metaKey&&(t=\"Meta-\"+t),A!==!1&&e.shiftKey&&(t=\"Shift-\"+t),t}var C3A=zl.default(ai.domEventHandlers({keydown(t,e){return Bj(Ij(e.state),t,e,\"editor\")}})),QQ=qe.define({enables:C3A}),IP=new WeakMap;function Ij(t){let e=t.facet(QQ),A=IP.get(e);return A||IP.set(e,A=d3A(e.reduce((i,n)=>i.concat(n),[]))),A}function dj(t,e,A){return Bj(Ij(t.state),e,t,A)}var S2=null,I3A=4e3;function d3A(t,e=l3A){let A=Object.create(null),i=Object.create(null),n=(a,r)=>{let s=i[a];if(s==null)i[a]=r;else if(s!=r)throw new Error(\"Key binding \"+a+\" is used both as a regular binding and as a multi-stroke prefix\")},o=(a,r,s,g,l)=>{var C,I;let d=A[a]||(A[a]=Object.create(null)),B=r.split(/ (?!$)/).map(f=>c3A(f,e));for(let f=1;f<B.length;f++){let b=B.slice(0,f).join(\" \");n(b,!0),d[b]||(d[b]={preventDefault:!0,stopPropagation:!1,run:[R=>{let M=S2={view:R,prefix:b,scope:a};return setTimeout(()=>{S2==M&&(S2=null)},I3A),!0}]})}let Q=B.join(\" \");n(Q,!1);let E=d[Q]||(d[Q]={preventDefault:!1,stopPropagation:!1,run:((I=(C=d._any)===null||C===void 0?void 0:C.run)===null||I===void 0?void 0:I.slice())||[]});s&&E.run.push(s),g&&(E.preventDefault=!0),l&&(E.stopPropagation=!0)};for(let a of t){let r=a.scope?a.scope.split(\" \"):[\"editor\"];if(a.any)for(let g of r){let l=A[g]||(A[g]=Object.create(null));l._any||(l._any={preventDefault:!1,stopPropagation:!1,run:[]});let{any:C}=a;for(let I in l)l[I].run.push(d=>C(d,Uk))}let s=a[e]||a.key;if(s)for(let g of r)o(g,s,a.run,a.preventDefault,a.stopPropagation),a.shift&&o(g,\"Shift-\"+s,a.shift,a.preventDefault,a.stopPropagation)}return A}var Uk=null;function Bj(t,e,A,i){Uk=e;let n=_z(e),o=Fr(n,0),a=Eg(o)==n.length&&n!=\" \",r=\"\",s=!1,g=!1,l=!1;S2&&S2.view==A&&S2.scope==i&&(r=S2.prefix+\" \",ij.indexOf(e.keyCode)<0&&(g=!0,S2=null));let C=new Set,I=E=>{if(E){for(let f of E.run)if(!C.has(f)&&(C.add(f),f(A)))return E.stopPropagation&&(l=!0),!0;E.preventDefault&&(E.stopPropagation&&(l=!0),g=!0)}return!1},d=t[i],B,Q;return d&&(I(d[r+x8(n,e,!a)])?s=!0:a&&(e.altKey||e.metaKey||e.ctrlKey)&&!(ot.windows&&e.ctrlKey&&e.altKey)&&!(ot.mac&&e.altKey&&!(e.ctrlKey||e.metaKey))&&(B=V0[e.keyCode])&&B!=n?(I(d[r+x8(B,e,!0)])||e.shiftKey&&(Q=tQ[e.keyCode])!=n&&Q!=B&&I(d[r+x8(Q,e,!1)]))&&(s=!0):a&&e.shiftKey&&I(d[r+x8(n,e,!0)])&&(s=!0),!s&&I(d._any)&&(s=!0)),g&&(s=!0),s&&l&&e.stopPropagation(),Uk=null,s}var E1=class t{constructor(e,A,i,n,o){this.className=e,this.left=A,this.top=i,this.width=n,this.height=o}draw(){let e=document.createElement(\"div\");return e.className=this.className,this.adjust(e),e}update(e,A){return A.className!=this.className?!1:(this.adjust(e),!0)}adjust(e){e.style.left=this.left+\"px\",e.style.top=this.top+\"px\",this.width!=null&&(e.style.width=this.width+\"px\"),e.style.height=this.height+\"px\"}eq(e){return this.left==e.left&&this.top==e.top&&this.width==e.width&&this.height==e.height&&this.className==e.className}static forRange(e,A,i){if(i.empty){let n=e.coordsAtPos(i.head,i.assoc||1);if(!n)return[];let o=Qj(e);return[new t(A,n.left-o.left,n.top-o.top,null,n.bottom-n.top)]}else return B3A(e,A,i)}};function Qj(t){let e=t.scrollDOM.getBoundingClientRect();return{left:(t.textDirection==go.LTR?e.left:e.right-t.scrollDOM.clientWidth*t.scaleX)-t.scrollDOM.scrollLeft*t.scaleX,top:e.top-t.scrollDOM.scrollTop*t.scaleY}}function dP(t,e,A,i){let n=t.coordsAtPos(e,A*2);if(!n)return i;let o=t.dom.getBoundingClientRect(),a=(n.top+n.bottom)/2,r=t.posAtCoords({x:o.left+1,y:a}),s=t.posAtCoords({x:o.right-1,y:a});return r==null||s==null?i:{from:Math.max(i.from,Math.min(r,s)),to:Math.min(i.to,Math.max(r,s))}}function B3A(t,e,A){if(A.to<=t.viewport.from||A.from>=t.viewport.to)return[];let i=Math.max(A.from,t.viewport.from),n=Math.min(A.to,t.viewport.to),o=t.textDirection==go.LTR,a=t.contentDOM,r=a.getBoundingClientRect(),s=Qj(t),g=a.querySelector(\".cm-line\"),l=g&&window.getComputedStyle(g),C=r.left+(l?parseInt(l.paddingLeft)+Math.min(0,parseInt(l.textIndent)):0),I=r.right-(l?parseInt(l.paddingRight):0),d=fk(t,i,1),B=fk(t,n,-1),Q=d.type==Lr.Text?d:null,E=B.type==Lr.Text?B:null;if(Q&&(t.lineWrapping||d.widgetLineBreaks)&&(Q=dP(t,i,1,Q)),E&&(t.lineWrapping||B.widgetLineBreaks)&&(E=dP(t,n,-1,E)),Q&&E&&Q.from==E.from&&Q.to==E.to)return b(R(A.from,A.to,Q));{let v=Q?R(A.from,null,Q):M(d,!1),F=E?R(null,A.to,E):M(B,!0),G=[];return(Q||d).to<(E||B).from-(Q&&E?1:0)||d.widgetLineBreaks>1&&v.bottom+t.defaultLineHeight/2<F.top?G.push(f(C,v.bottom,I,F.top)):v.bottom<F.top&&t.elementAtHeight((v.bottom+F.top)/2).type==Lr.Text&&(v.bottom=F.top=(v.bottom+F.top)/2),b(v).concat(G).concat(b(F))}function f(v,F,G,U){return new E1(e,v-s.left,F-s.top,Math.max(0,G-v),U-F)}function b({top:v,bottom:F,horizontal:G}){let U=[];for(let Y=0;Y<G.length;Y+=2)U.push(f(G[Y],v,G[Y+1],F));return U}function R(v,F,G){let U=1e9,Y=-1e9,j=[];function AA(P,nA,eA,dA,iA){let aA=t.coordsAtPos(P,P==G.to?-2:2),hA=t.coordsAtPos(eA,eA==G.from?2:-2);!aA||!hA||(U=Math.min(aA.top,hA.top,U),Y=Math.max(aA.bottom,hA.bottom,Y),iA==go.LTR?j.push(o&&nA?C:aA.left,o&&dA?I:hA.right):j.push(!o&&dA?C:hA.left,!o&&nA?I:aA.right))}let z=v??G.from,yA=F??G.to;for(let P of t.visibleRanges)if(P.to>z&&P.from<yA)for(let nA=Math.max(P.from,z),eA=Math.min(P.to,yA);;){let dA=t.state.doc.lineAt(nA);for(let iA of t.bidiSpans(dA)){let aA=iA.from+dA.from,hA=iA.to+dA.from;if(aA>=eA)break;hA>nA&&AA(Math.max(aA,nA),v==null&&aA<=z,Math.min(hA,eA),F==null&&hA>=yA,iA.dir)}if(nA=dA.to+1,nA>=eA)break}return j.length==0&&AA(z,v==null,yA,F==null,t.textDirection),{top:U,bottom:Y,horizontal:j}}function M(v,F){let G=r.top+(F?v.top:v.bottom);return{top:G,bottom:G,horizontal:[]}}}function Q3A(t,e){return t.constructor==e.constructor&&t.eq(e)}var Jk=class{constructor(e,A){this.view=e,this.layer=A,this.drawn=[],this.scaleX=1,this.scaleY=1,this.measureReq={read:this.measure.bind(this),write:this.draw.bind(this)},this.dom=e.scrollDOM.appendChild(document.createElement(\"div\")),this.dom.classList.add(\"cm-layer\"),A.above&&this.dom.classList.add(\"cm-layer-above\"),A.class&&this.dom.classList.add(A.class),this.scale(),this.dom.setAttribute(\"aria-hidden\",\"true\"),this.setOrder(e.state),e.requestMeasure(this.measureReq),A.mount&&A.mount(this.dom,e)}update(e){e.startState.facet(_8)!=e.state.facet(_8)&&this.setOrder(e.state),(this.layer.update(e,this.dom)||e.geometryChanged)&&(this.scale(),e.view.requestMeasure(this.measureReq))}docViewUpdate(e){this.layer.updateOnDocViewUpdate!==!1&&e.requestMeasure(this.measureReq)}setOrder(e){let A=0,i=e.facet(_8);for(;A<i.length&&i[A]!=this.layer;)A++;this.dom.style.zIndex=String((this.layer.above?150:-1)-A)}measure(){return this.layer.markers(this.view)}scale(){let{scaleX:e,scaleY:A}=this.view;(e!=this.scaleX||A!=this.scaleY)&&(this.scaleX=e,this.scaleY=A,this.dom.style.transform=`scale(${1/e}, ${1/A})`)}draw(e){if(e.length!=this.drawn.length||e.some((A,i)=>!Q3A(A,this.drawn[i]))){let A=this.dom.firstChild,i=0;for(let n of e)n.update&&A&&n.constructor&&this.drawn[i].constructor&&n.update(A,this.drawn[i])?(A=A.nextSibling,i++):this.dom.insertBefore(n.draw(),A);for(;A;){let n=A.nextSibling;A.remove(),A=n}this.drawn=e,ot.safari&&ot.safari_version>=26&&(this.dom.style.display=this.dom.firstChild?\"\":\"none\")}}destroy(){this.layer.destroy&&this.layer.destroy(this.dom,this.view),this.dom.remove()}},_8=qe.define();function Ej(t){return[ho.define(e=>new Jk(e,t)),_8.of(t)]}var BQ=qe.define({combine(t){return Ir(t,{cursorBlinkRate:1200,drawRangeCursor:!0,iosSelectionHandles:!0},{cursorBlinkRate:(e,A)=>Math.min(e,A),drawRangeCursor:(e,A)=>e||A})}});function hj(t={}){return[BQ.of(t),E3A,h3A,u3A,OP.of(!0)]}function uj(t){return t.startState.facet(BQ)!=t.state.facet(BQ)}var E3A=Ej({above:!0,markers(t){let{state:e}=t,A=e.facet(BQ),i=[];for(let n of e.selection.ranges){let o=n==e.selection.main;if(n.empty||A.drawRangeCursor&&!(o&&ot.ios&&A.iosSelectionHandles)){let a=o?\"cm-cursor cm-cursor-primary\":\"cm-cursor cm-cursor-secondary\",r=n.empty?n:ce.cursor(n.head,n.assoc);for(let s of E1.forRange(t,a,r))i.push(s)}}return i},update(t,e){t.transactions.some(i=>i.selection)&&(e.style.animationName=e.style.animationName==\"cm-blink\"?\"cm-blink2\":\"cm-blink\");let A=uj(t);return A&&BP(t.state,e),t.docChanged||t.selectionSet||A},mount(t,e){BP(e.state,t)},class:\"cm-cursorLayer\"});function BP(t,e){e.style.animationDuration=t.facet(BQ).cursorBlinkRate+\"ms\"}var h3A=Ej({above:!1,markers(t){let e=[],{main:A,ranges:i}=t.state.selection;for(let n of i)if(!n.empty)for(let o of E1.forRange(t,\"cm-selectionBackground\",n))e.push(o);if(ot.ios&&!A.empty&&t.state.facet(BQ).iosSelectionHandles){for(let n of E1.forRange(t,\"cm-selectionHandle cm-selectionHandle-start\",ce.cursor(A.from,1)))e.push(n);for(let n of E1.forRange(t,\"cm-selectionHandle cm-selectionHandle-end\",ce.cursor(A.to,1)))e.push(n)}return e},update(t,e){return t.docChanged||t.selectionSet||t.viewportChanged||uj(t)},class:\"cm-selectionLayer\"}),u3A=zl.highest(ai.theme({\".cm-line\":{\"& ::selection, &::selection\":{backgroundColor:\"transparent !important\"},caretColor:\"transparent !important\"},\".cm-content\":{caretColor:\"transparent !important\",\"& :focus\":{caretColor:\"initial !important\",\"&::selection, & ::selection\":{backgroundColor:\"Highlight !important\"}}}})),fj=Ui.define({map(t,e){return t==null?null:e.mapPos(t)}}),o3=Qa.define({create(){return null},update(t,e){return t!=null&&(t=e.changes.mapPos(t)),e.effects.reduce((A,i)=>i.is(fj)?i.value:A,t)}}),f3A=ho.fromClass(class{constructor(t){this.view=t,this.cursor=null,this.measureReq={read:this.readPos.bind(this),write:this.drawCursor.bind(this)}}update(t){var e;let A=t.state.field(o3);A==null?this.cursor!=null&&((e=this.cursor)===null||e===void 0||e.remove(),this.cursor=null):(this.cursor||(this.cursor=this.view.scrollDOM.appendChild(document.createElement(\"div\")),this.cursor.className=\"cm-dropCursor\"),(t.startState.field(o3)!=A||t.docChanged||t.geometryChanged)&&this.view.requestMeasure(this.measureReq))}readPos(){let{view:t}=this,e=t.state.field(o3),A=e!=null&&t.coordsAtPos(e);if(!A)return null;let i=t.scrollDOM.getBoundingClientRect();return{left:A.left-i.left+t.scrollDOM.scrollLeft*t.scaleX,top:A.top-i.top+t.scrollDOM.scrollTop*t.scaleY,height:A.bottom-A.top}}drawCursor(t){if(this.cursor){let{scaleX:e,scaleY:A}=this.view;t?(this.cursor.style.left=t.left/e+\"px\",this.cursor.style.top=t.top/A+\"px\",this.cursor.style.height=t.height/A+\"px\"):this.cursor.style.left=\"-100000px\"}}destroy(){this.cursor&&this.cursor.remove()}setDropPos(t){this.view.state.field(o3)!=t&&this.view.dispatch({effects:fj.of(t)})}},{eventObservers:{dragover(t){this.setDropPos(this.view.posAtCoords({x:t.clientX,y:t.clientY}))},dragleave(t){(t.target==this.view.contentDOM||!this.view.contentDOM.contains(t.relatedTarget))&&this.setDropPos(null)},dragend(){this.setDropPos(null)},drop(){this.setDropPos(null)}}});function mj(){return[o3,f3A]}function QP(t,e,A,i,n){e.lastIndex=0;for(let o=t.iterRange(A,i),a=A,r;!o.next().done;a+=o.value.length)if(!o.lineBreak)for(;r=e.exec(o.value);)n(a+r.index,r)}function m3A(t,e){let A=t.visibleRanges;if(A.length==1&&A[0].from==t.viewport.from&&A[0].to==t.viewport.to)return A;let i=[];for(let{from:n,to:o}of A)n=Math.max(t.state.doc.lineAt(n).from,n-e),o=Math.min(t.state.doc.lineAt(o).to,o+e),i.length&&i[i.length-1].to>=n?i[i.length-1].to=o:i.push({from:n,to:o});return i}var Yk=class{constructor(e){let{regexp:A,decoration:i,decorate:n,boundary:o,maxLength:a=1e3}=e;if(!A.global)throw new RangeError(\"The regular expression given to MatchDecorator should have its 'g' flag set\");if(this.regexp=A,n)this.addMatch=(r,s,g,l)=>n(l,g,g+r[0].length,r,s);else if(typeof i==\"function\")this.addMatch=(r,s,g,l)=>{let C=i(r,s,g);C&&l(g,g+r[0].length,C)};else if(i)this.addMatch=(r,s,g,l)=>l(g,g+r[0].length,i);else throw new RangeError(\"Either 'decorate' or 'decoration' should be provided to MatchDecorator\");this.boundary=o,this.maxLength=a}createDeco(e){let A=new Nr,i=A.add.bind(A);for(let{from:n,to:o}of m3A(e,this.maxLength))QP(e.state.doc,this.regexp,n,o,(a,r)=>this.addMatch(r,e,a,i));return A.finish()}updateDeco(e,A){let i=1e9,n=-1;return e.docChanged&&e.changes.iterChanges((o,a,r,s)=>{s>=e.view.viewport.from&&r<=e.view.viewport.to&&(i=Math.min(r,i),n=Math.max(s,n))}),e.viewportMoved||n-i>1e3?this.createDeco(e.view):n>-1?this.updateRange(e.view,A.map(e.changes),i,n):A}updateRange(e,A,i,n){for(let o of e.visibleRanges){let a=Math.max(o.from,i),r=Math.min(o.to,n);if(r>=a){let s=e.state.doc.lineAt(a),g=s.to<r?e.state.doc.lineAt(r):s,l=Math.max(o.from,s.from),C=Math.min(o.to,g.to);if(this.boundary){for(;a>s.from;a--)if(this.boundary.test(s.text[a-1-s.from])){l=a;break}for(;r<g.to;r++)if(this.boundary.test(g.text[r-g.from])){C=r;break}}let I=[],d,B=(Q,E,f)=>I.push(f.range(Q,E));if(s==g)for(this.regexp.lastIndex=l-s.from;(d=this.regexp.exec(s.text))&&d.index<C-s.from;)this.addMatch(d,e,d.index+s.from,B);else QP(e.state.doc,this.regexp,l,C,(Q,E)=>this.addMatch(E,e,Q,B));A=A.update({filterFrom:l,filterTo:C,filter:(Q,E)=>Q<l||E>C,add:I})}}return A}},Hk=/x/.unicode!=null?\"gu\":\"g\",p3A=new RegExp(`[\\0-\\b\n-\u001f\\x7F-\\x9F\\xAD\\u061C\\u200B\\u200E\\u200F\\u2028\\u2029\\u202D\\u202E\\u2066\\u2067\\u2069\\uFEFF\\uFFF9-\\uFFFC]`,Hk),D3A={0:\"null\",7:\"bell\",8:\"backspace\",10:\"newline\",11:\"vertical tab\",13:\"carriage return\",27:\"escape\",8203:\"zero width space\",8204:\"zero width non-joiner\",8205:\"zero width joiner\",8206:\"left-to-right mark\",8207:\"right-to-left mark\",8232:\"line separator\",8237:\"left-to-right override\",8238:\"right-to-left override\",8294:\"left-to-right isolate\",8295:\"right-to-left isolate\",8297:\"pop directional isolate\",8233:\"paragraph separator\",65279:\"zero width no-break space\",65532:\"object replacement\"},XM=null;function w3A(){var t;if(XM==null&&typeof document<\"u\"&&document.body){let e=document.body.style;XM=((t=e.tabSize)!==null&&t!==void 0?t:e.MozTabSize)!=null}return XM||!1}var G8=qe.define({combine(t){let e=Ir(t,{render:null,specialChars:p3A,addSpecialChars:null});return(e.replaceTabs=!w3A())&&(e.specialChars=new RegExp(\"\t|\"+e.specialChars.source,Hk)),e.addSpecialChars&&(e.specialChars=new RegExp(e.specialChars.source+\"|\"+e.addSpecialChars.source,Hk)),e}});function pj(t={}){return[G8.of(t),y3A()]}var EP=null;function y3A(){return EP||(EP=ho.fromClass(class{constructor(t){this.view=t,this.decorations=vt.none,this.decorationCache=Object.create(null),this.decorator=this.makeDecorator(t.state.facet(G8)),this.decorations=this.decorator.createDeco(t)}makeDecorator(t){return new Yk({regexp:t.specialChars,decoration:(e,A,i)=>{let{doc:n}=A.state,o=Fr(e[0],0);if(o==9){let a=n.lineAt(i),r=A.state.tabSize,s=q0(a.text,r,i-a.from);return vt.replace({widget:new Ok((r-s%r)*this.view.defaultCharacterWidth/this.view.scaleX)})}return this.decorationCache[o]||(this.decorationCache[o]=vt.replace({widget:new Tk(t,o)}))},boundary:t.replaceTabs?void 0:/[^]/})}update(t){let e=t.state.facet(G8);t.startState.facet(G8)!=e?(this.decorator=this.makeDecorator(e),this.decorations=this.decorator.createDeco(t.view)):this.decorations=this.decorator.updateDeco(t,this.decorations)}},{decorations:t=>t.decorations}))}var v3A=\"\\u2022\";function b3A(t){return t>=32?v3A:t==10?\"\\u2424\":String.fromCharCode(9216+t)}var Tk=class extends Ps{constructor(e,A){super(),this.options=e,this.code=A}eq(e){return e.code==this.code}toDOM(e){let A=b3A(this.code),i=e.state.phrase(\"Control character\")+\" \"+(D3A[this.code]||\"0x\"+this.code.toString(16)),n=this.options.render&&this.options.render(this.code,i,A);if(n)return n;let o=document.createElement(\"span\");return o.textContent=A,o.title=i,o.setAttribute(\"aria-label\",i),o.className=\"cm-specialChar\",o}ignoreEvent(){return!1}},Ok=class extends Ps{constructor(e){super(),this.width=e}eq(e){return e.width==this.width}toDOM(){let e=document.createElement(\"span\");return e.textContent=\"\t\",e.className=\"cm-tab\",e.style.width=this.width+\"px\",e}ignoreEvent(){return!1}};function Dj(){return k3A}var M3A=vt.line({class:\"cm-activeLine\"}),k3A=ho.fromClass(class{constructor(t){this.decorations=this.getDeco(t)}update(t){(t.docChanged||t.selectionSet)&&(this.decorations=this.getDeco(t.view))}getDeco(t){let e=-1,A=[];for(let i of t.state.selection.ranges){let n=t.lineBlockAt(i.head);n.from>e&&(A.push(M3A.range(n.from)),e=n.from)}return vt.set(A)}},{decorations:t=>t.decorations});var zk=2e3;function S3A(t,e,A){let i=Math.min(e.line,A.line),n=Math.max(e.line,A.line),o=[];if(e.off>zk||A.off>zk||e.col<0||A.col<0){let a=Math.min(e.off,A.off),r=Math.max(e.off,A.off);for(let s=i;s<=n;s++){let g=t.doc.line(s);g.length<=r&&o.push(ce.range(g.from+a,g.to+r))}}else{let a=Math.min(e.col,A.col),r=Math.max(e.col,A.col);for(let s=i;s<=n;s++){let g=t.doc.line(s),l=D8(g.text,a,t.tabSize,!0);if(l<0)o.push(ce.cursor(g.to));else{let C=D8(g.text,r,t.tabSize);o.push(ce.range(g.from+l,g.from+C))}}}return o}function x3A(t,e){let A=t.coordsAtPos(t.viewport.from);return A?Math.round(Math.abs((A.left-e)/t.defaultCharacterWidth)):-1}function hP(t,e){let A=t.posAtCoords({x:e.clientX,y:e.clientY},!1),i=t.state.doc.lineAt(A),n=A-i.from,o=n>zk?-1:n==i.length?x3A(t,e.clientX):q0(i.text,t.state.tabSize,A-i.from);return{line:i.number,col:o,off:n}}function R3A(t,e){let A=hP(t,e),i=t.state.selection;return A?{update(n){if(n.docChanged){let o=n.changes.mapPos(n.startState.doc.line(A.line).from),a=n.state.doc.lineAt(o);A={line:a.number,col:A.col,off:Math.min(A.off,a.length)},i=i.map(n.changes)}},get(n,o,a){let r=hP(t,n);if(!r)return i;let s=S3A(t.state,A,r);return s.length?a?ce.create(s.concat(i.ranges)):ce.create(s):i}}:null}function wj(t){let e=t?.eventFilter||(A=>A.altKey&&A.button==0);return ai.mouseSelectionStyle.of((A,i)=>e(i)?R3A(A,i):null)}var N3A={Alt:[18,t=>!!t.altKey],Control:[17,t=>!!t.ctrlKey],Shift:[16,t=>!!t.shiftKey],Meta:[91,t=>!!t.metaKey]},F3A={style:\"cursor: crosshair\"};function yj(t={}){let[e,A]=N3A[t.key||\"Alt\"],i=ho.fromClass(class{constructor(n){this.view=n,this.isDown=!1}set(n){this.isDown!=n&&(this.isDown=n,this.view.update([]))}},{eventObservers:{keydown(n){this.set(n.keyCode==e||A(n))},keyup(n){(n.keyCode==e||!A(n))&&this.set(!1)},mousemove(n){this.set(A(n))}}});return[i,ai.contentAttributes.of(n=>{var o;return!((o=n.plugin(i))===null||o===void 0)&&o.isDown?F3A:null})]}var R8=\"-10000px\",X8=class{constructor(e,A,i,n){this.facet=A,this.createTooltipView=i,this.removeTooltipView=n,this.input=e.state.facet(A),this.tooltips=this.input.filter(a=>a);let o=null;this.tooltipViews=this.tooltips.map(a=>o=i(a,o))}update(e,A){var i;let n=e.state.facet(this.facet),o=n.filter(s=>s);if(n===this.input){for(let s of this.tooltipViews)s.update&&s.update(e);return!1}let a=[],r=A?[]:null;for(let s=0;s<o.length;s++){let g=o[s],l=-1;if(g){for(let C=0;C<this.tooltips.length;C++){let I=this.tooltips[C];I&&I.create==g.create&&(l=C)}if(l<0)a[s]=this.createTooltipView(g,s?a[s-1]:null),r&&(r[s]=!!g.above);else{let C=a[s]=this.tooltipViews[l];r&&(r[s]=A[l]),C.update&&C.update(e)}}}for(let s of this.tooltipViews)a.indexOf(s)<0&&(this.removeTooltipView(s),(i=s.destroy)===null||i===void 0||i.call(s));return A&&(r.forEach((s,g)=>A[g]=s),A.length=r.length),this.input=n,this.tooltips=o,this.tooltipViews=a,!0}};function L3A(t){let e=t.dom.ownerDocument.documentElement;return{top:0,left:0,bottom:e.clientHeight,right:e.clientWidth}}var $M=qe.define({combine:t=>{var e,A,i;return{position:ot.ios?\"absolute\":((e=t.find(n=>n.position))===null||e===void 0?void 0:e.position)||\"fixed\",parent:((A=t.find(n=>n.parent))===null||A===void 0?void 0:A.parent)||null,tooltipSpace:((i=t.find(n=>n.tooltipSpace))===null||i===void 0?void 0:i.tooltipSpace)||L3A}}}),uP=new WeakMap,nS=ho.fromClass(class{constructor(t){this.view=t,this.above=[],this.inView=!0,this.madeAbsolute=!1,this.lastTransaction=0,this.measureTimeout=-1;let e=t.state.facet($M);this.position=e.position,this.parent=e.parent,this.classes=t.themeClasses,this.createContainer(),this.measureReq={read:this.readMeasure.bind(this),write:this.writeMeasure.bind(this),key:this},this.resizeObserver=typeof ResizeObserver==\"function\"?new ResizeObserver(()=>this.measureSoon()):null,this.manager=new X8(t,EQ,(A,i)=>this.createTooltip(A,i),A=>{this.resizeObserver&&this.resizeObserver.unobserve(A.dom),A.dom.remove()}),this.above=this.manager.tooltips.map(A=>!!A.above),this.intersectionObserver=typeof IntersectionObserver==\"function\"?new IntersectionObserver(A=>{Date.now()>this.lastTransaction-50&&A.length>0&&A[A.length-1].intersectionRatio<1&&this.measureSoon()},{threshold:[1]}):null,this.observeIntersection(),t.win.addEventListener(\"resize\",this.measureSoon=this.measureSoon.bind(this)),this.maybeMeasure()}createContainer(){this.parent?(this.container=document.createElement(\"div\"),this.container.style.position=\"relative\",this.container.className=this.view.themeClasses,this.parent.appendChild(this.container)):this.container=this.view.dom}observeIntersection(){if(this.intersectionObserver){this.intersectionObserver.disconnect();for(let t of this.manager.tooltipViews)this.intersectionObserver.observe(t.dom)}}measureSoon(){this.measureTimeout<0&&(this.measureTimeout=setTimeout(()=>{this.measureTimeout=-1,this.maybeMeasure()},50))}update(t){t.transactions.length&&(this.lastTransaction=Date.now());let e=this.manager.update(t,this.above);e&&this.observeIntersection();let A=e||t.geometryChanged,i=t.state.facet($M);if(i.position!=this.position&&!this.madeAbsolute){this.position=i.position;for(let n of this.manager.tooltipViews)n.dom.style.position=this.position;A=!0}if(i.parent!=this.parent){this.parent&&this.container.remove(),this.parent=i.parent,this.createContainer();for(let n of this.manager.tooltipViews)this.container.appendChild(n.dom);A=!0}else this.parent&&this.view.themeClasses!=this.classes&&(this.classes=this.container.className=this.view.themeClasses);A&&this.maybeMeasure()}createTooltip(t,e){let A=t.create(this.view),i=e?e.dom:null;if(A.dom.classList.add(\"cm-tooltip\"),t.arrow&&!A.dom.querySelector(\".cm-tooltip > .cm-tooltip-arrow\")){let n=document.createElement(\"div\");n.className=\"cm-tooltip-arrow\",A.dom.appendChild(n)}return A.dom.style.position=this.position,A.dom.style.top=R8,A.dom.style.left=\"0px\",this.container.insertBefore(A.dom,i),A.mount&&A.mount(this.view),this.resizeObserver&&this.resizeObserver.observe(A.dom),A}destroy(){var t,e,A;this.view.win.removeEventListener(\"resize\",this.measureSoon);for(let i of this.manager.tooltipViews)i.dom.remove(),(t=i.destroy)===null||t===void 0||t.call(i);this.parent&&this.container.remove(),(e=this.resizeObserver)===null||e===void 0||e.disconnect(),(A=this.intersectionObserver)===null||A===void 0||A.disconnect(),clearTimeout(this.measureTimeout)}readMeasure(){let t=1,e=1,A=!1;if(this.position==\"fixed\"&&this.manager.tooltipViews.length){let{dom:o}=this.manager.tooltipViews[0];if(ot.safari){let a=o.getBoundingClientRect();A=Math.abs(a.top+1e4)>1||Math.abs(a.left)>1}else A=!!o.offsetParent&&o.offsetParent!=this.container.ownerDocument.body}if(A||this.position==\"absolute\")if(this.parent){let o=this.parent.getBoundingClientRect();o.width&&o.height&&(t=o.width/this.parent.offsetWidth,e=o.height/this.parent.offsetHeight)}else({scaleX:t,scaleY:e}=this.view.viewState);let i=this.view.scrollDOM.getBoundingClientRect(),n=tS(this.view);return{visible:{left:i.left+n.left,top:i.top+n.top,right:i.right-n.right,bottom:i.bottom-n.bottom},parent:this.parent?this.container.getBoundingClientRect():this.view.dom.getBoundingClientRect(),pos:this.manager.tooltips.map((o,a)=>{let r=this.manager.tooltipViews[a];return r.getCoords?r.getCoords(o.pos):this.view.coordsAtPos(o.pos)}),size:this.manager.tooltipViews.map(({dom:o})=>o.getBoundingClientRect()),space:this.view.state.facet($M).tooltipSpace(this.view),scaleX:t,scaleY:e,makeAbsolute:A}}writeMeasure(t){var e;if(t.makeAbsolute){this.madeAbsolute=!0,this.position=\"absolute\";for(let r of this.manager.tooltipViews)r.dom.style.position=\"absolute\"}let{visible:A,space:i,scaleX:n,scaleY:o}=t,a=[];for(let r=0;r<this.manager.tooltips.length;r++){let s=this.manager.tooltips[r],g=this.manager.tooltipViews[r],{dom:l}=g,C=t.pos[r],I=t.size[r];if(!C||s.clip!==!1&&(C.bottom<=Math.max(A.top,i.top)||C.top>=Math.min(A.bottom,i.bottom)||C.right<Math.max(A.left,i.left)-.1||C.left>Math.min(A.right,i.right)+.1)){l.style.top=R8;continue}let d=s.arrow?g.dom.querySelector(\".cm-tooltip-arrow\"):null,B=d?7:0,Q=I.right-I.left,E=(e=uP.get(g))!==null&&e!==void 0?e:I.bottom-I.top,f=g.offset||G3A,b=this.view.textDirection==go.LTR,R=I.width>i.right-i.left?b?i.left:i.right-I.width:b?Math.max(i.left,Math.min(C.left-(d?14:0)+f.x,i.right-Q)):Math.min(Math.max(i.left,C.left-Q+(d?14:0)-f.x),i.right-Q),M=this.above[r];!s.strictSide&&(M?C.top-E-B-f.y<i.top:C.bottom+E+B+f.y>i.bottom)&&M==i.bottom-C.bottom>C.top-i.top&&(M=this.above[r]=!M);let v=(M?C.top-i.top:i.bottom-C.bottom)-B;if(v<E&&g.resize!==!1){if(v<this.view.defaultLineHeight){l.style.top=R8;continue}uP.set(g,E),l.style.height=(E=v)/o+\"px\"}else l.style.height&&(l.style.height=\"\");let F=M?C.top-E-B-f.y:C.bottom+B+f.y,G=R+Q;if(g.overlap!==!0)for(let U of a)U.left<G&&U.right>R&&U.top<F+E&&U.bottom>F&&(F=M?U.top-E-2-B:U.bottom+B+2);if(this.position==\"absolute\"?(l.style.top=(F-t.parent.top)/o+\"px\",fP(l,(R-t.parent.left)/n)):(l.style.top=F/o+\"px\",fP(l,R/n)),d){let U=C.left+(b?f.x:-f.x)-(R+14-7);d.style.left=U/n+\"px\"}g.overlap!==!0&&a.push({left:R,top:F,right:G,bottom:F+E}),l.classList.toggle(\"cm-tooltip-above\",M),l.classList.toggle(\"cm-tooltip-below\",!M),g.positioned&&g.positioned(t.space)}}maybeMeasure(){if(this.manager.tooltips.length&&(this.view.inView&&this.view.requestMeasure(this.measureReq),this.inView!=this.view.inView&&(this.inView=this.view.inView,!this.inView)))for(let t of this.manager.tooltipViews)t.dom.style.top=R8}},{eventObservers:{scroll(){this.maybeMeasure()}}});function fP(t,e){let A=parseInt(t.style.left,10);(isNaN(A)||Math.abs(e-A)>1)&&(t.style.left=e+\"px\")}var _3A=ai.baseTheme({\".cm-tooltip\":{zIndex:500,boxSizing:\"border-box\"},\"&light .cm-tooltip\":{border:\"1px solid #bbb\",backgroundColor:\"#f5f5f5\"},\"&light .cm-tooltip-section:not(:first-child)\":{borderTop:\"1px solid #bbb\"},\"&dark .cm-tooltip\":{backgroundColor:\"#333338\",color:\"white\"},\".cm-tooltip-arrow\":{height:\"7px\",width:\"14px\",position:\"absolute\",zIndex:-1,overflow:\"hidden\",\"&:before, &:after\":{content:\"''\",position:\"absolute\",width:0,height:0,borderLeft:\"7px solid transparent\",borderRight:\"7px solid transparent\"},\".cm-tooltip-above &\":{bottom:\"-7px\",\"&:before\":{borderTop:\"7px solid #bbb\"},\"&:after\":{borderTop:\"7px solid #f5f5f5\",bottom:\"1px\"}},\".cm-tooltip-below &\":{top:\"-7px\",\"&:before\":{borderBottom:\"7px solid #bbb\"},\"&:after\":{borderBottom:\"7px solid #f5f5f5\",top:\"1px\"}}},\"&dark .cm-tooltip .cm-tooltip-arrow\":{\"&:before\":{borderTopColor:\"#333338\",borderBottomColor:\"#333338\"},\"&:after\":{borderTopColor:\"transparent\",borderBottomColor:\"transparent\"}}}),G3A={x:0,y:0},EQ=qe.define({enables:[nS,_3A]}),$8=qe.define({combine:t=>t.reduce((e,A)=>e.concat(A),[])}),A5=class t{static create(e){return new t(e)}constructor(e){this.view=e,this.mounted=!1,this.dom=document.createElement(\"div\"),this.dom.classList.add(\"cm-tooltip-hover\"),this.manager=new X8(e,$8,(A,i)=>this.createHostedView(A,i),A=>A.dom.remove())}createHostedView(e,A){let i=e.create(this.view);return i.dom.classList.add(\"cm-tooltip-section\"),this.dom.insertBefore(i.dom,A?A.dom.nextSibling:this.dom.firstChild),this.mounted&&i.mount&&i.mount(this.view),i}mount(e){for(let A of this.manager.tooltipViews)A.mount&&A.mount(e);this.mounted=!0}positioned(e){for(let A of this.manager.tooltipViews)A.positioned&&A.positioned(e)}update(e){this.manager.update(e)}destroy(){var e;for(let A of this.manager.tooltipViews)(e=A.destroy)===null||e===void 0||e.call(A)}passProp(e){let A;for(let i of this.manager.tooltipViews){let n=i[e];if(n!==void 0){if(A===void 0)A=n;else if(A!==n)return}}return A}get offset(){return this.passProp(\"offset\")}get getCoords(){return this.passProp(\"getCoords\")}get overlap(){return this.passProp(\"overlap\")}get resize(){return this.passProp(\"resize\")}},K3A=EQ.compute([$8],t=>{let e=t.facet($8);return e.length===0?null:{pos:Math.min(...e.map(A=>A.pos)),end:Math.max(...e.map(A=>{var i;return(i=A.end)!==null&&i!==void 0?i:A.pos})),create:A5.create,above:e[0].above,arrow:e.some(A=>A.arrow)}}),Pk=class{constructor(e,A,i,n,o){this.view=e,this.source=A,this.field=i,this.setHover=n,this.hoverTime=o,this.hoverTimeout=-1,this.restartTimeout=-1,this.pending=null,this.lastMove={x:0,y:0,target:e.dom,time:0},this.checkHover=this.checkHover.bind(this),e.dom.addEventListener(\"mouseleave\",this.mouseleave=this.mouseleave.bind(this)),e.dom.addEventListener(\"mousemove\",this.mousemove=this.mousemove.bind(this))}update(){this.pending&&(this.pending=null,clearTimeout(this.restartTimeout),this.restartTimeout=setTimeout(()=>this.startHover(),20))}get active(){return this.view.state.field(this.field)}checkHover(){if(this.hoverTimeout=-1,this.active.length)return;let e=Date.now()-this.lastMove.time;e<this.hoverTime?this.hoverTimeout=setTimeout(this.checkHover,this.hoverTime-e):this.startHover()}startHover(){clearTimeout(this.restartTimeout);let{view:e,lastMove:A}=this,i=e.docView.tile.nearest(A.target);if(!i)return;let n,o=1;if(i.isWidget())n=i.posAtStart;else{if(n=e.posAtCoords(A),n==null)return;let r=e.coordsAtPos(n);if(!r||A.y<r.top||A.y>r.bottom||A.x<r.left-e.defaultCharacterWidth||A.x>r.right+e.defaultCharacterWidth)return;let s=e.bidiSpans(e.state.doc.lineAt(n)).find(l=>l.from<=n&&l.to>=n),g=s&&s.dir==go.RTL?-1:1;o=A.x<r.left?-g:g}let a=this.source(e,n,o);if(a?.then){let r=this.pending={pos:n};a.then(s=>{this.pending==r&&(this.pending=null,s&&!(Array.isArray(s)&&!s.length)&&e.dispatch({effects:this.setHover.of(Array.isArray(s)?s:[s])}))},s=>dr(e.state,s,\"hover tooltip\"))}else a&&!(Array.isArray(a)&&!a.length)&&e.dispatch({effects:this.setHover.of(Array.isArray(a)?a:[a])})}get tooltip(){let e=this.view.plugin(nS),A=e?e.manager.tooltips.findIndex(i=>i.create==A5.create):-1;return A>-1?e.manager.tooltipViews[A]:null}mousemove(e){var A,i;this.lastMove={x:e.clientX,y:e.clientY,target:e.target,time:Date.now()},this.hoverTimeout<0&&(this.hoverTimeout=setTimeout(this.checkHover,this.hoverTime));let{active:n,tooltip:o}=this;if(n.length&&o&&!U3A(o.dom,e)||this.pending){let{pos:a}=n[0]||this.pending,r=(i=(A=n[0])===null||A===void 0?void 0:A.end)!==null&&i!==void 0?i:a;(a==r?this.view.posAtCoords(this.lastMove)!=a:!J3A(this.view,a,r,e.clientX,e.clientY))&&(this.view.dispatch({effects:this.setHover.of([])}),this.pending=null)}}mouseleave(e){clearTimeout(this.hoverTimeout),this.hoverTimeout=-1;let{active:A}=this;if(A.length){let{tooltip:i}=this;i&&i.dom.contains(e.relatedTarget)?this.watchTooltipLeave(i.dom):this.view.dispatch({effects:this.setHover.of([])})}}watchTooltipLeave(e){let A=i=>{e.removeEventListener(\"mouseleave\",A),this.active.length&&!this.view.dom.contains(i.relatedTarget)&&this.view.dispatch({effects:this.setHover.of([])})};e.addEventListener(\"mouseleave\",A)}destroy(){clearTimeout(this.hoverTimeout),clearTimeout(this.restartTimeout),this.view.dom.removeEventListener(\"mouseleave\",this.mouseleave),this.view.dom.removeEventListener(\"mousemove\",this.mousemove)}},N8=4;function U3A(t,e){let{left:A,right:i,top:n,bottom:o}=t.getBoundingClientRect(),a;if(a=t.querySelector(\".cm-tooltip-arrow\")){let r=a.getBoundingClientRect();n=Math.min(r.top,n),o=Math.max(r.bottom,o)}return e.clientX>=A-N8&&e.clientX<=i+N8&&e.clientY>=n-N8&&e.clientY<=o+N8}function J3A(t,e,A,i,n,o){let a=t.scrollDOM.getBoundingClientRect(),r=t.documentTop+t.documentPadding.top+t.contentHeight;if(a.left>i||a.right<i||a.top>n||Math.min(a.bottom,r)<n)return!1;let s=t.posAtCoords({x:i,y:n},!1);return s>=e&&s<=A}function vj(t,e={}){let A=Ui.define(),i=Qa.define({create(){return[]},update(n,o){if(n.length&&(e.hideOnChange&&(o.docChanged||o.selection)?n=[]:e.hideOn&&(n=n.filter(a=>!e.hideOn(o,a))),o.docChanged)){let a=[];for(let r of n){let s=o.changes.mapPos(r.pos,-1,xr.TrackDel);if(s!=null){let g=Object.assign(Object.create(null),r);g.pos=s,g.end!=null&&(g.end=o.changes.mapPos(g.end)),a.push(g)}}n=a}for(let a of o.effects)a.is(A)&&(n=a.value),a.is(Y3A)&&(n=[]);return n},provide:n=>$8.from(n)});return{active:i,extension:[i,ho.define(n=>new Pk(n,t,i,A,e.hoverTime||300)),K3A]}}function oS(t,e){let A=t.plugin(nS);if(!A)return null;let i=A.manager.tooltips.indexOf(e);return i<0?null:A.manager.tooltipViews[i]}var Y3A=Ui.define();var mP=qe.define({combine(t){let e,A;for(let i of t)e=e||i.topContainer,A=A||i.bottomContainer;return{topContainer:e,bottomContainer:A}}});function f3(t,e){let A=t.plugin(bj),i=A?A.specs.indexOf(e):-1;return i>-1?A.panels[i]:null}var bj=ho.fromClass(class{constructor(t){this.input=t.state.facet(m1),this.specs=this.input.filter(A=>A),this.panels=this.specs.map(A=>A(t));let e=t.state.facet(mP);this.top=new aQ(t,!0,e.topContainer),this.bottom=new aQ(t,!1,e.bottomContainer),this.top.sync(this.panels.filter(A=>A.top)),this.bottom.sync(this.panels.filter(A=>!A.top));for(let A of this.panels)A.dom.classList.add(\"cm-panel\"),A.mount&&A.mount()}update(t){let e=t.state.facet(mP);this.top.container!=e.topContainer&&(this.top.sync([]),this.top=new aQ(t.view,!0,e.topContainer)),this.bottom.container!=e.bottomContainer&&(this.bottom.sync([]),this.bottom=new aQ(t.view,!1,e.bottomContainer)),this.top.syncClasses(),this.bottom.syncClasses();let A=t.state.facet(m1);if(A!=this.input){let i=A.filter(s=>s),n=[],o=[],a=[],r=[];for(let s of i){let g=this.specs.indexOf(s),l;g<0?(l=s(t.view),r.push(l)):(l=this.panels[g],l.update&&l.update(t)),n.push(l),(l.top?o:a).push(l)}this.specs=i,this.panels=n,this.top.sync(o),this.bottom.sync(a);for(let s of r)s.dom.classList.add(\"cm-panel\"),s.mount&&s.mount()}else for(let i of this.panels)i.update&&i.update(t)}destroy(){this.top.sync([]),this.bottom.sync([])}},{provide:t=>ai.scrollMargins.of(e=>{let A=e.plugin(t);return A&&{top:A.top.scrollMargin(),bottom:A.bottom.scrollMargin()}})}),aQ=class{constructor(e,A,i){this.view=e,this.top=A,this.container=i,this.dom=void 0,this.classes=\"\",this.panels=[],this.syncClasses()}sync(e){for(let A of this.panels)A.destroy&&e.indexOf(A)<0&&A.destroy();this.panels=e,this.syncDOM()}syncDOM(){if(this.panels.length==0){this.dom&&(this.dom.remove(),this.dom=void 0);return}if(!this.dom){this.dom=document.createElement(\"div\"),this.dom.className=this.top?\"cm-panels cm-panels-top\":\"cm-panels cm-panels-bottom\",this.dom.style[this.top?\"top\":\"bottom\"]=\"0\";let A=this.container||this.view.dom;A.insertBefore(this.dom,this.top?A.firstChild:null)}let e=this.dom.firstChild;for(let A of this.panels)if(A.dom.parentNode==this.dom){for(;e!=A.dom;)e=pP(e);e=e.nextSibling}else this.dom.insertBefore(A.dom,e);for(;e;)e=pP(e)}scrollMargin(){return!this.dom||this.container?0:Math.max(0,this.top?this.dom.getBoundingClientRect().bottom-Math.max(0,this.view.scrollDOM.getBoundingClientRect().top):Math.min(innerHeight,this.view.scrollDOM.getBoundingClientRect().bottom)-this.dom.getBoundingClientRect().top)}syncClasses(){if(!(!this.container||this.classes==this.view.themeClasses)){for(let e of this.classes.split(\" \"))e&&this.container.classList.remove(e);for(let e of(this.classes=this.view.themeClasses).split(\" \"))e&&this.container.classList.add(e)}}};function pP(t){let e=t.nextSibling;return t.remove(),e}var m1=qe.define({enables:bj});function Mj(t,e){let A,i=new Promise(a=>A=a),n=a=>H3A(a,e,A);t.state.field(Ak,!1)?t.dispatch({effects:kj.of(n)}):t.dispatch({effects:Ui.appendConfig.of(Ak.init(()=>[n]))});let o=Sj.of(n);return{close:o,result:i.then(a=>((t.win.queueMicrotask||(s=>t.win.setTimeout(s,10)))(()=>{t.state.field(Ak).indexOf(n)>-1&&t.dispatch({effects:o})}),a))}}var Ak=Qa.define({create(){return[]},update(t,e){for(let A of e.effects)A.is(kj)?t=[A.value].concat(t):A.is(Sj)&&(t=t.filter(i=>i!=A.value));return t},provide:t=>m1.computeN([t],e=>e.field(t))}),kj=Ui.define(),Sj=Ui.define();function H3A(t,e,A){let i=e.content?e.content(t,()=>a(null)):null;if(!i){if(i=Pn(\"form\"),e.input){let r=Pn(\"input\",e.input);/^(text|password|number|email|tel|url)$/.test(r.type)&&r.classList.add(\"cm-textfield\"),r.name||(r.name=\"input\"),i.appendChild(Pn(\"label\",(e.label||\"\")+\": \",r))}else i.appendChild(document.createTextNode(e.label||\"\"));i.appendChild(document.createTextNode(\" \")),i.appendChild(Pn(\"button\",{class:\"cm-button\",type:\"submit\"},e.submitLabel||\"OK\"))}let n=i.nodeName==\"FORM\"?[i]:i.querySelectorAll(\"form\");for(let r=0;r<n.length;r++){let s=n[r];s.addEventListener(\"keydown\",g=>{g.keyCode==27?(g.preventDefault(),a(null)):g.keyCode==13&&(g.preventDefault(),a(s))}),s.addEventListener(\"submit\",g=>{g.preventDefault(),a(s)})}let o=Pn(\"div\",i,Pn(\"button\",{onclick:()=>a(null),\"aria-label\":t.state.phrase(\"close\"),class:\"cm-dialog-close\",type:\"button\"},[\"\\xD7\"]));e.class&&(o.className=e.class),o.classList.add(\"cm-dialog\");function a(r){o.contains(o.ownerDocument.activeElement)&&t.focus(),A(r)}return{dom:o,top:e.top,mount:()=>{if(e.focus){let r;typeof e.focus==\"string\"?r=i.querySelector(e.focus):r=i.querySelector(\"input\")||i.querySelector(\"button\"),r&&\"select\"in r?r.select():r&&\"focus\"in r&&r.focus()}}}}var qs=class extends Zg{compare(e){return this==e||this.constructor==e.constructor&&this.eq(e)}eq(e){return!1}destroy(e){}};qs.prototype.elementClass=\"\";qs.prototype.toDOM=void 0;qs.prototype.mapMode=xr.TrackBefore;qs.prototype.startSide=qs.prototype.endSide=-1;qs.prototype.point=!0;var K8=qe.define(),T3A=qe.define(),O3A={class:\"\",renderEmptyElements:!1,elementStyle:\"\",markers:()=>zn.empty,lineMarker:()=>null,widgetMarker:()=>null,lineMarkerChange:null,initialSpacer:null,updateSpacer:null,domEventHandlers:{},side:\"before\"},I3=qe.define();function a5(t){return[xj(),I3.of(BA(BA({},O3A),t))]}var jk=qe.define({combine:t=>t.some(e=>e)});function xj(t){let e=[z3A];return t&&t.fixed===!1&&e.push(jk.of(!0)),e}var z3A=ho.fromClass(class{constructor(t){this.view=t,this.domAfter=null,this.prevViewport=t.viewport,this.dom=document.createElement(\"div\"),this.dom.className=\"cm-gutters cm-gutters-before\",this.dom.setAttribute(\"aria-hidden\",\"true\"),this.dom.style.minHeight=this.view.contentHeight/this.view.scaleY+\"px\",this.gutters=t.state.facet(I3).map(e=>new e5(t,e)),this.fixed=!t.state.facet(jk);for(let e of this.gutters)e.config.side==\"after\"?this.getDOMAfter().appendChild(e.dom):this.dom.appendChild(e.dom);this.fixed&&(this.dom.style.position=\"sticky\"),this.syncGutters(!1),t.scrollDOM.insertBefore(this.dom,t.contentDOM)}getDOMAfter(){return this.domAfter||(this.domAfter=document.createElement(\"div\"),this.domAfter.className=\"cm-gutters cm-gutters-after\",this.domAfter.setAttribute(\"aria-hidden\",\"true\"),this.domAfter.style.minHeight=this.view.contentHeight/this.view.scaleY+\"px\",this.domAfter.style.position=this.fixed?\"sticky\":\"\",this.view.scrollDOM.appendChild(this.domAfter)),this.domAfter}update(t){if(this.updateGutters(t)){let e=this.prevViewport,A=t.view.viewport,i=Math.min(e.to,A.to)-Math.max(e.from,A.from);this.syncGutters(i<(A.to-A.from)*.8)}if(t.geometryChanged){let e=this.view.contentHeight/this.view.scaleY+\"px\";this.dom.style.minHeight=e,this.domAfter&&(this.domAfter.style.minHeight=e)}this.view.state.facet(jk)!=!this.fixed&&(this.fixed=!this.fixed,this.dom.style.position=this.fixed?\"sticky\":\"\",this.domAfter&&(this.domAfter.style.position=this.fixed?\"sticky\":\"\")),this.prevViewport=t.view.viewport}syncGutters(t){let e=this.dom.nextSibling;t&&(this.dom.remove(),this.domAfter&&this.domAfter.remove());let A=zn.iter(this.view.state.facet(K8),this.view.viewport.from),i=[],n=this.gutters.map(o=>new Vk(o,this.view.viewport,-this.view.documentPadding.top));for(let o of this.view.viewportLineBlocks)if(i.length&&(i=[]),Array.isArray(o.type)){let a=!0;for(let r of o.type)if(r.type==Lr.Text&&a){qk(A,i,r.from);for(let s of n)s.line(this.view,r,i);a=!1}else if(r.widget)for(let s of n)s.widget(this.view,r)}else if(o.type==Lr.Text){qk(A,i,o.from);for(let a of n)a.line(this.view,o,i)}else if(o.widget)for(let a of n)a.widget(this.view,o);for(let o of n)o.finish();t&&(this.view.scrollDOM.insertBefore(this.dom,e),this.domAfter&&this.view.scrollDOM.appendChild(this.domAfter))}updateGutters(t){let e=t.startState.facet(I3),A=t.state.facet(I3),i=t.docChanged||t.heightChanged||t.viewportChanged||!zn.eq(t.startState.facet(K8),t.state.facet(K8),t.view.viewport.from,t.view.viewport.to);if(e==A)for(let n of this.gutters)n.update(t)&&(i=!0);else{i=!0;let n=[];for(let o of A){let a=e.indexOf(o);a<0?n.push(new e5(this.view,o)):(this.gutters[a].update(t),n.push(this.gutters[a]))}for(let o of this.gutters)o.dom.remove(),n.indexOf(o)<0&&o.destroy();for(let o of n)o.config.side==\"after\"?this.getDOMAfter().appendChild(o.dom):this.dom.appendChild(o.dom);this.gutters=n}return i}destroy(){for(let t of this.gutters)t.destroy();this.dom.remove(),this.domAfter&&this.domAfter.remove()}},{provide:t=>ai.scrollMargins.of(e=>{let A=e.plugin(t);if(!A||A.gutters.length==0||!A.fixed)return null;let i=A.dom.offsetWidth*e.scaleX,n=A.domAfter?A.domAfter.offsetWidth*e.scaleX:0;return e.textDirection==go.LTR?{left:i,right:n}:{right:i,left:n}})});function DP(t){return Array.isArray(t)?t:[t]}function qk(t,e,A){for(;t.value&&t.from<=A;)t.from==A&&e.push(t.value),t.next()}var Vk=class{constructor(e,A,i){this.gutter=e,this.height=i,this.i=0,this.cursor=zn.iter(e.markers,A.from)}addElement(e,A,i){let{gutter:n}=this,o=(A.top-this.height)/e.scaleY,a=A.height/e.scaleY;if(this.i==n.elements.length){let r=new t5(e,a,o,i);n.elements.push(r),n.dom.appendChild(r.dom)}else n.elements[this.i].update(e,a,o,i);this.height=A.bottom,this.i++}line(e,A,i){let n=[];qk(this.cursor,n,A.from),i.length&&(n=n.concat(i));let o=this.gutter.config.lineMarker(e,A,n);o&&n.unshift(o);let a=this.gutter;n.length==0&&!a.config.renderEmptyElements||this.addElement(e,A,n)}widget(e,A){let i=this.gutter.config.widgetMarker(e,A.widget,A),n=i?[i]:null;for(let o of e.state.facet(T3A)){let a=o(e,A.widget,A);a&&(n||(n=[])).push(a)}n&&this.addElement(e,A,n)}finish(){let e=this.gutter;for(;e.elements.length>this.i;){let A=e.elements.pop();e.dom.removeChild(A.dom),A.destroy()}}},e5=class{constructor(e,A){this.view=e,this.config=A,this.elements=[],this.spacer=null,this.dom=document.createElement(\"div\"),this.dom.className=\"cm-gutter\"+(this.config.class?\" \"+this.config.class:\"\");for(let i in A.domEventHandlers)this.dom.addEventListener(i,n=>{let o=n.target,a;if(o!=this.dom&&this.dom.contains(o)){for(;o.parentNode!=this.dom;)o=o.parentNode;let s=o.getBoundingClientRect();a=(s.top+s.bottom)/2}else a=n.clientY;let r=e.lineBlockAtHeight(a-e.documentTop);A.domEventHandlers[i](e,r,n)&&n.preventDefault()});this.markers=DP(A.markers(e)),A.initialSpacer&&(this.spacer=new t5(e,0,0,[A.initialSpacer(e)]),this.dom.appendChild(this.spacer.dom),this.spacer.dom.style.cssText+=\"visibility: hidden; pointer-events: none\")}update(e){let A=this.markers;if(this.markers=DP(this.config.markers(e.view)),this.spacer&&this.config.updateSpacer){let n=this.config.updateSpacer(this.spacer.markers[0],e);n!=this.spacer.markers[0]&&this.spacer.update(e.view,0,0,[n])}let i=e.view.viewport;return!zn.eq(this.markers,A,i.from,i.to)||(this.config.lineMarkerChange?this.config.lineMarkerChange(e):!1)}destroy(){for(let e of this.elements)e.destroy()}},t5=class{constructor(e,A,i,n){this.height=-1,this.above=0,this.markers=[],this.dom=document.createElement(\"div\"),this.dom.className=\"cm-gutterElement\",this.update(e,A,i,n)}update(e,A,i,n){this.height!=A&&(this.height=A,this.dom.style.height=A+\"px\"),this.above!=i&&(this.dom.style.marginTop=(this.above=i)?i+\"px\":\"\"),P3A(this.markers,n)||this.setMarkers(e,n)}setMarkers(e,A){let i=\"cm-gutterElement\",n=this.dom.firstChild;for(let o=0,a=0;;){let r=a,s=o<A.length?A[o++]:null,g=!1;if(s){let l=s.elementClass;l&&(i+=\" \"+l);for(let C=a;C<this.markers.length;C++)if(this.markers[C].compare(s)){r=C,g=!0;break}}else r=this.markers.length;for(;a<r;){let l=this.markers[a++];if(l.toDOM){l.destroy(n);let C=n.nextSibling;n.remove(),n=C}}if(!s)break;s.toDOM&&(g?n=n.nextSibling:this.dom.insertBefore(s.toDOM(e),n)),g&&a++}this.dom.className=i,this.markers=A}destroy(){this.setMarkers(null,[])}};function P3A(t,e){if(t.length!=e.length)return!1;for(let A=0;A<t.length;A++)if(!t[A].compare(e[A]))return!1;return!0}var j3A=qe.define(),q3A=qe.define(),rQ=qe.define({combine(t){return Ir(t,{formatNumber:String,domEventHandlers:{}},{domEventHandlers(e,A){let i=Object.assign({},e);for(let n in A){let o=i[n],a=A[n];i[n]=o?(r,s,g)=>o(r,s,g)||a(r,s,g):a}return i}})}}),d3=class extends qs{constructor(e){super(),this.number=e}eq(e){return this.number==e.number}toDOM(){return document.createTextNode(this.number)}};function ek(t,e){return t.state.facet(rQ).formatNumber(e,t.state)}var V3A=I3.compute([rQ],t=>({class:\"cm-lineNumbers\",renderEmptyElements:!1,markers(e){return e.state.facet(j3A)},lineMarker(e,A,i){return i.some(n=>n.toDOM)?null:new d3(ek(e,e.state.doc.lineAt(A.from).number))},widgetMarker:(e,A,i)=>{for(let n of e.state.facet(q3A)){let o=n(e,A,i);if(o)return o}return null},lineMarkerChange:e=>e.startState.facet(rQ)!=e.state.facet(rQ),initialSpacer(e){return new d3(ek(e,wP(e.state.doc.lines)))},updateSpacer(e,A){let i=ek(A.view,wP(A.view.state.doc.lines));return i==e.number?e:new d3(i)},domEventHandlers:t.facet(rQ).domEventHandlers,side:\"before\"}));function Rj(t={}){return[rQ.of(t),xj(),V3A]}function wP(t){let e=9;for(;e<t;)e=e*10+9;return e}var W3A=new class extends qs{constructor(){super(...arguments),this.elementClass=\"cm-activeLineGutter\"}},Z3A=K8.compute([\"selection\"],t=>{let e=[],A=-1;for(let i of t.selection.ranges){let n=t.doc.lineAt(i.head).from;n>A&&(A=n,e.push(W3A.range(n)))}return zn.of(e)});function Nj(){return Z3A}var X3A=0,m3=class{constructor(e,A){this.from=e,this.to=A}},wi=class{constructor(e={}){this.id=X3A++,this.perNode=!!e.perNode,this.deserialize=e.deserialize||(()=>{throw new Error(\"This node type doesn't define a deserialize function\")}),this.combine=e.combine||null}add(e){if(this.perNode)throw new RangeError(\"Can't add per-node props to node types\");return typeof e!=\"function\"&&(e=ts.match(e)),A=>{let i=e(A);return i===void 0?null:[this,i]}}};wi.closedBy=new wi({deserialize:t=>t.split(\" \")});wi.openedBy=new wi({deserialize:t=>t.split(\" \")});wi.group=new wi({deserialize:t=>t.split(\" \")});wi.isolate=new wi({deserialize:t=>{if(t&&t!=\"rtl\"&&t!=\"ltr\"&&t!=\"auto\")throw new RangeError(\"Invalid value for isolate: \"+t);return t||\"auto\"}});wi.contextHash=new wi({perNode:!0});wi.lookAhead=new wi({perNode:!0});wi.mounted=new wi({perNode:!0});var p1=class{constructor(e,A,i,n=!1){this.tree=e,this.overlay=A,this.parser=i,this.bracketed=n}static get(e){return e&&e.props&&e.props[wi.mounted.id]}},$3A=Object.create(null),ts=class t{constructor(e,A,i,n=0){this.name=e,this.props=A,this.id=i,this.flags=n}static define(e){let A=e.props&&e.props.length?Object.create(null):$3A,i=(e.top?1:0)|(e.skipped?2:0)|(e.error?4:0)|(e.name==null?8:0),n=new t(e.name||\"\",A,e.id,i);if(e.props){for(let o of e.props)if(Array.isArray(o)||(o=o(n)),o){if(o[0].perNode)throw new RangeError(\"Can't store a per-node prop on a node type\");A[o[0].id]=o[1]}}return n}prop(e){return this.props[e.id]}get isTop(){return(this.flags&1)>0}get isSkipped(){return(this.flags&2)>0}get isError(){return(this.flags&4)>0}get isAnonymous(){return(this.flags&8)>0}is(e){if(typeof e==\"string\"){if(this.name==e)return!0;let A=this.prop(wi.group);return A?A.indexOf(e)>-1:!1}return this.id==e}static match(e){let A=Object.create(null);for(let i in e)for(let n of i.split(\" \"))A[n]=e[i];return i=>{for(let n=i.prop(wi.group),o=-1;o<(n?n.length:0);o++){let a=A[o<0?i.name:n[o]];if(a)return a}}}};ts.none=new ts(\"\",Object.create(null),0,8);var p3=class t{constructor(e){this.types=e;for(let A=0;A<e.length;A++)if(e[A].id!=A)throw new RangeError(\"Node type ids should correspond to array positions when creating a node set\")}extend(...e){let A=[];for(let i of this.types){let n=null;for(let o of e){let a=o(i);if(a){n||(n=Object.assign({},i.props));let r=a[1],s=a[0];s.combine&&s.id in n&&(r=s.combine(n[s.id],r)),n[s.id]=r}}A.push(n?new ts(i.name,n,i.id,i.flags):i)}return new t(A)}},r5=new WeakMap,Fj=new WeakMap,Ea=(function(t){return t[t.ExcludeBuffers=1]=\"ExcludeBuffers\",t[t.IncludeAnonymous=2]=\"IncludeAnonymous\",t[t.IgnoreMounts=4]=\"IgnoreMounts\",t[t.IgnoreOverlays=8]=\"IgnoreOverlays\",t[t.EnterBracketed=16]=\"EnterBracketed\",t})(Ea||{}),Ma=class t{constructor(e,A,i,n,o){if(this.type=e,this.children=A,this.positions=i,this.length=n,this.props=null,o&&o.length){this.props=Object.create(null);for(let[a,r]of o)this.props[typeof a==\"number\"?a:a.id]=r}}toString(){let e=p1.get(this);if(e&&!e.overlay)return e.tree.toString();let A=\"\";for(let i of this.children){let n=i.toString();n&&(A&&(A+=\",\"),A+=n)}return this.type.name?(/\\W/.test(this.type.name)&&!this.type.isError?JSON.stringify(this.type.name):this.type.name)+(A.length?\"(\"+A+\")\":\"\"):A}cursor(e=0){return new y3(this.topNode,e)}cursorAt(e,A=0,i=0){let n=r5.get(this)||this.topNode,o=new y3(n);return o.moveTo(e,A),r5.set(this,o._tree),o}get topNode(){return new A0(this,0,0,null)}resolve(e,A=0){let i=D3(r5.get(this)||this.topNode,e,A,!1);return r5.set(this,i),i}resolveInner(e,A=0){let i=D3(Fj.get(this)||this.topNode,e,A,!0);return Fj.set(this,i),i}resolveStack(e,A=0){return AuA(this,e,A)}iterate(e){let{enter:A,leave:i,from:n=0,to:o=this.length}=e,a=e.mode||0,r=(a&Ea.IncludeAnonymous)>0;for(let s=this.cursor(a|Ea.IncludeAnonymous);;){let g=!1;if(s.from<=o&&s.to>=n&&(!r&&s.type.isAnonymous||A(s)!==!1)){if(s.firstChild())continue;g=!0}for(;g&&i&&(r||!s.type.isAnonymous)&&i(s),!s.nextSibling();){if(!s.parent())return;g=!0}}}prop(e){return e.perNode?this.props?this.props[e.id]:void 0:this.type.prop(e)}get propValues(){let e=[];if(this.props)for(let A in this.props)e.push([+A,this.props[A]]);return e}balance(e={}){return this.children.length<=8?this:CS(ts.none,this.children,this.positions,0,this.children.length,0,this.length,(A,i,n)=>new t(this.type,A,i,n,this.propValues),e.makeTree||((A,i,n)=>new t(ts.none,A,i,n)))}static build(e){return euA(e)}};Ma.empty=new Ma(ts.none,[],[],0);var aS=class t{constructor(e,A){this.buffer=e,this.index=A}get id(){return this.buffer[this.index-4]}get start(){return this.buffer[this.index-3]}get end(){return this.buffer[this.index-2]}get size(){return this.buffer[this.index-1]}get pos(){return this.index}next(){this.index-=4}fork(){return new t(this.buffer,this.index)}},N2=class t{constructor(e,A,i){this.buffer=e,this.length=A,this.set=i}get type(){return ts.none}toString(){let e=[];for(let A=0;A<this.buffer.length;)e.push(this.childString(A)),A=this.buffer[A+3];return e.join(\",\")}childString(e){let A=this.buffer[e],i=this.buffer[e+3],n=this.set.types[A],o=n.name;if(/\\W/.test(o)&&!n.isError&&(o=JSON.stringify(o)),e+=4,i==e)return o;let a=[];for(;e<i;)a.push(this.childString(e)),e=this.buffer[e+3];return o+\"(\"+a.join(\",\")+\")\"}findChild(e,A,i,n,o){let{buffer:a}=this,r=-1;for(let s=e;s!=A&&!(Gj(o,n,a[s+1],a[s+2])&&(r=s,i>0));s=a[s+3]);return r}slice(e,A,i){let n=this.buffer,o=new Uint16Array(A-e),a=0;for(let r=e,s=0;r<A;){o[s++]=n[r++],o[s++]=n[r++]-i;let g=o[s++]=n[r++]-i;o[s++]=n[r++]-e,a=Math.max(a,g)}return new t(o,a,this.set)}};function Gj(t,e,A,i){switch(t){case-2:return A<e;case-1:return i>=e&&A<e;case 0:return A<e&&i>e;case 1:return A<=e&&i>e;case 2:return i>e;case 4:return!0}}function D3(t,e,A,i){for(var n;t.from==t.to||(A<1?t.from>=e:t.from>e)||(A>-1?t.to<=e:t.to<e);){let a=!i&&t instanceof A0&&t.index<0?null:t.parent;if(!a)return t;t=a}let o=i?0:Ea.IgnoreOverlays;if(i)for(let a=t,r=a.parent;r;a=r,r=a.parent)a instanceof A0&&a.index<0&&((n=r.enter(e,A,o))===null||n===void 0?void 0:n.from)!=a.from&&(t=r);for(;;){let a=t.enter(e,A,o);if(!a)return t;t=a}}var g5=class{cursor(e=0){return new y3(this,e)}getChild(e,A=null,i=null){let n=Lj(this,e,A,i);return n.length?n[0]:null}getChildren(e,A=null,i=null){return Lj(this,e,A,i)}resolve(e,A=0){return D3(this,e,A,!1)}resolveInner(e,A=0){return D3(this,e,A,!0)}matchContext(e){return rS(this.parent,e)}enterUnfinishedNodesBefore(e){let A=this.childBefore(e),i=this;for(;A;){let n=A.lastChild;if(!n||n.to!=A.to)break;n.type.isError&&n.from==n.to?(i=A,A=n.prevSibling):A=n}return i}get node(){return this}get next(){return this.parent}},A0=class t extends g5{constructor(e,A,i,n){super(),this._tree=e,this.from=A,this.index=i,this._parent=n}get type(){return this._tree.type}get name(){return this._tree.type.name}get to(){return this.from+this._tree.length}nextChild(e,A,i,n,o=0){for(let a=this;;){for(let{children:r,positions:s}=a._tree,g=A>0?r.length:-1;e!=g;e+=A){let l=r[e],C=s[e]+a.from,I;if(!(!(o&Ea.EnterBracketed&&l instanceof Ma&&(I=p1.get(l))&&!I.overlay&&I.bracketed&&i>=C&&i<=C+l.length)&&!Gj(n,i,C,C+l.length))){if(l instanceof N2){if(o&Ea.ExcludeBuffers)continue;let d=l.findChild(0,l.buffer.length,A,i-C,n);if(d>-1)return new w3(new sS(a,l,e,C),null,d)}else if(o&Ea.IncludeAnonymous||!l.type.isAnonymous||cS(l)){let d;if(!(o&Ea.IgnoreMounts)&&(d=p1.get(l))&&!d.overlay)return new t(d.tree,C,e,a);let B=new t(l,C,e,a);return o&Ea.IncludeAnonymous||!B.type.isAnonymous?B:B.nextChild(A<0?l.children.length-1:0,A,i,n,o)}}}if(o&Ea.IncludeAnonymous||!a.type.isAnonymous||(a.index>=0?e=a.index+A:e=A<0?-1:a._parent._tree.children.length,a=a._parent,!a))return null}}get firstChild(){return this.nextChild(0,1,0,4)}get lastChild(){return this.nextChild(this._tree.children.length-1,-1,0,4)}childAfter(e){return this.nextChild(0,1,e,2)}childBefore(e){return this.nextChild(this._tree.children.length-1,-1,e,-2)}prop(e){return this._tree.prop(e)}enter(e,A,i=0){let n;if(!(i&Ea.IgnoreOverlays)&&(n=p1.get(this._tree))&&n.overlay){let o=e-this.from,a=i&Ea.EnterBracketed&&n.bracketed;for(let{from:r,to:s}of n.overlay)if((A>0||a?r<=o:r<o)&&(A<0||a?s>=o:s>o))return new t(n.tree,n.overlay[0].from+this.from,-1,this)}return this.nextChild(0,1,e,A,i)}nextSignificantParent(){let e=this;for(;e.type.isAnonymous&&e._parent;)e=e._parent;return e}get parent(){return this._parent?this._parent.nextSignificantParent():null}get nextSibling(){return this._parent&&this.index>=0?this._parent.nextChild(this.index+1,1,0,4):null}get prevSibling(){return this._parent&&this.index>=0?this._parent.nextChild(this.index-1,-1,0,4):null}get tree(){return this._tree}toTree(){return this._tree}toString(){return this._tree.toString()}};function Lj(t,e,A,i){let n=t.cursor(),o=[];if(!n.firstChild())return o;if(A!=null){for(let a=!1;!a;)if(a=n.type.is(A),!n.nextSibling())return o}for(;;){if(i!=null&&n.type.is(i))return o;if(n.type.is(e)&&o.push(n.node),!n.nextSibling())return i==null?o:[]}}function rS(t,e,A=e.length-1){for(let i=t;A>=0;i=i.parent){if(!i)return!1;if(!i.type.isAnonymous){if(e[A]&&e[A]!=i.name)return!1;A--}}return!0}var sS=class{constructor(e,A,i,n){this.parent=e,this.buffer=A,this.index=i,this.start=n}},w3=class t extends g5{get name(){return this.type.name}get from(){return this.context.start+this.context.buffer.buffer[this.index+1]}get to(){return this.context.start+this.context.buffer.buffer[this.index+2]}constructor(e,A,i){super(),this.context=e,this._parent=A,this.index=i,this.type=e.buffer.set.types[e.buffer.buffer[i]]}child(e,A,i){let{buffer:n}=this.context,o=n.findChild(this.index+4,n.buffer[this.index+3],e,A-this.context.start,i);return o<0?null:new t(this.context,this,o)}get firstChild(){return this.child(1,0,4)}get lastChild(){return this.child(-1,0,4)}childAfter(e){return this.child(1,e,2)}childBefore(e){return this.child(-1,e,-2)}prop(e){return this.type.prop(e)}enter(e,A,i=0){if(i&Ea.ExcludeBuffers)return null;let{buffer:n}=this.context,o=n.findChild(this.index+4,n.buffer[this.index+3],A>0?1:-1,e-this.context.start,A);return o<0?null:new t(this.context,this,o)}get parent(){return this._parent||this.context.parent.nextSignificantParent()}externalSibling(e){return this._parent?null:this.context.parent.nextChild(this.context.index+e,e,0,4)}get nextSibling(){let{buffer:e}=this.context,A=e.buffer[this.index+3];return A<(this._parent?e.buffer[this._parent.index+3]:e.buffer.length)?new t(this.context,this._parent,A):this.externalSibling(1)}get prevSibling(){let{buffer:e}=this.context,A=this._parent?this._parent.index+4:0;return this.index==A?this.externalSibling(-1):new t(this.context,this._parent,e.findChild(A,this.index,-1,0,4))}get tree(){return null}toTree(){let e=[],A=[],{buffer:i}=this.context,n=this.index+4,o=i.buffer[this.index+3];if(o>n){let a=i.buffer[this.index+1];e.push(i.slice(n,o,a)),A.push(0)}return new Ma(this.type,e,A,this.to-this.from)}toString(){return this.context.buffer.childString(this.index)}};function Kj(t){if(!t.length)return null;let e=0,A=t[0];for(let o=1;o<t.length;o++){let a=t[o];(a.from>A.from||a.to<A.to)&&(A=a,e=o)}let i=A instanceof A0&&A.index<0?null:A.parent,n=t.slice();return i?n[e]=i:n.splice(e,1),new gS(n,A)}var gS=class{constructor(e,A){this.heads=e,this.node=A}get next(){return Kj(this.heads)}};function AuA(t,e,A){let i=t.resolveInner(e,A),n=null;for(let o=i instanceof A0?i:i.context.parent;o;o=o.parent)if(o.index<0){let a=o.parent;(n||(n=[i])).push(a.resolve(e,A)),o=a}else{let a=p1.get(o.tree);if(a&&a.overlay&&a.overlay[0].from<=e&&a.overlay[a.overlay.length-1].to>=e){let r=new A0(a.tree,a.overlay[0].from+o.from,-1,o);(n||(n=[i])).push(D3(r,e,A,!1))}}return n?Kj(n):i}var y3=class{get name(){return this.type.name}constructor(e,A=0){if(this.buffer=null,this.stack=[],this.index=0,this.bufferNode=null,this.mode=A&~Ea.EnterBracketed,e instanceof A0)this.yieldNode(e);else{this._tree=e.context.parent,this.buffer=e.context;for(let i=e._parent;i;i=i._parent)this.stack.unshift(i.index);this.bufferNode=e,this.yieldBuf(e.index)}}yieldNode(e){return e?(this._tree=e,this.type=e.type,this.from=e.from,this.to=e.to,!0):!1}yieldBuf(e,A){this.index=e;let{start:i,buffer:n}=this.buffer;return this.type=A||n.set.types[n.buffer[e]],this.from=i+n.buffer[e+1],this.to=i+n.buffer[e+2],!0}yield(e){return e?e instanceof A0?(this.buffer=null,this.yieldNode(e)):(this.buffer=e.context,this.yieldBuf(e.index,e.type)):!1}toString(){return this.buffer?this.buffer.buffer.childString(this.index):this._tree.toString()}enterChild(e,A,i){if(!this.buffer)return this.yield(this._tree.nextChild(e<0?this._tree._tree.children.length-1:0,e,A,i,this.mode));let{buffer:n}=this.buffer,o=n.findChild(this.index+4,n.buffer[this.index+3],e,A-this.buffer.start,i);return o<0?!1:(this.stack.push(this.index),this.yieldBuf(o))}firstChild(){return this.enterChild(1,0,4)}lastChild(){return this.enterChild(-1,0,4)}childAfter(e){return this.enterChild(1,e,2)}childBefore(e){return this.enterChild(-1,e,-2)}enter(e,A,i=this.mode){return this.buffer?i&Ea.ExcludeBuffers?!1:this.enterChild(1,e,A):this.yield(this._tree.enter(e,A,i))}parent(){if(!this.buffer)return this.yieldNode(this.mode&Ea.IncludeAnonymous?this._tree._parent:this._tree.parent);if(this.stack.length)return this.yieldBuf(this.stack.pop());let e=this.mode&Ea.IncludeAnonymous?this.buffer.parent:this.buffer.parent.nextSignificantParent();return this.buffer=null,this.yieldNode(e)}sibling(e){if(!this.buffer)return this._tree._parent?this.yield(this._tree.index<0?null:this._tree._parent.nextChild(this._tree.index+e,e,0,4,this.mode)):!1;let{buffer:A}=this.buffer,i=this.stack.length-1;if(e<0){let n=i<0?0:this.stack[i]+4;if(this.index!=n)return this.yieldBuf(A.findChild(n,this.index,-1,0,4))}else{let n=A.buffer[this.index+3];if(n<(i<0?A.buffer.length:A.buffer[this.stack[i]+3]))return this.yieldBuf(n)}return i<0?this.yield(this.buffer.parent.nextChild(this.buffer.index+e,e,0,4,this.mode)):!1}nextSibling(){return this.sibling(1)}prevSibling(){return this.sibling(-1)}atLastNode(e){let A,i,{buffer:n}=this;if(n){if(e>0){if(this.index<n.buffer.buffer.length)return!1}else for(let o=0;o<this.index;o++)if(n.buffer.buffer[o+3]<this.index)return!1;({index:A,parent:i}=n)}else({index:A,_parent:i}=this._tree);for(;i;{index:A,_parent:i}=i)if(A>-1)for(let o=A+e,a=e<0?-1:i._tree.children.length;o!=a;o+=e){let r=i._tree.children[o];if(this.mode&Ea.IncludeAnonymous||r instanceof N2||!r.type.isAnonymous||cS(r))return!1}return!0}move(e,A){if(A&&this.enterChild(e,0,4))return!0;for(;;){if(this.sibling(e))return!0;if(this.atLastNode(e)||!this.parent())return!1}}next(e=!0){return this.move(1,e)}prev(e=!0){return this.move(-1,e)}moveTo(e,A=0){for(;(this.from==this.to||(A<1?this.from>=e:this.from>e)||(A>-1?this.to<=e:this.to<e))&&this.parent(););for(;this.enterChild(1,e,A););return this}get node(){if(!this.buffer)return this._tree;let e=this.bufferNode,A=null,i=0;if(e&&e.context==this.buffer)A:for(let n=this.index,o=this.stack.length;o>=0;){for(let a=e;a;a=a._parent)if(a.index==n){if(n==this.index)return a;A=a,i=o+1;break A}n=this.stack[--o]}for(let n=i;n<this.stack.length;n++)A=new w3(this.buffer,A,this.stack[n]);return this.bufferNode=new w3(this.buffer,A,this.index)}get tree(){return this.buffer?null:this._tree._tree}iterate(e,A){for(let i=0;;){let n=!1;if(this.type.isAnonymous||e(this)!==!1){if(this.firstChild()){i++;continue}this.type.isAnonymous||(n=!0)}for(;;){if(n&&A&&A(this),n=this.type.isAnonymous,!i)return;if(this.nextSibling())break;this.parent(),i--,n=!0}}}matchContext(e){if(!this.buffer)return rS(this.node.parent,e);let{buffer:A}=this.buffer,{types:i}=A.set;for(let n=e.length-1,o=this.stack.length-1;n>=0;o--){if(o<0)return rS(this._tree,e,n);let a=i[A.buffer[this.stack[o]]];if(!a.isAnonymous){if(e[n]&&e[n]!=a.name)return!1;n--}}return!0}};function cS(t){return t.children.some(e=>e instanceof N2||!e.type.isAnonymous||cS(e))}function euA(t){var e;let{buffer:A,nodeSet:i,maxBufferLength:n=1024,reused:o=[],minRepeatType:a=i.types.length}=t,r=Array.isArray(A)?new aS(A,A.length):A,s=i.types,g=0,l=0;function C(v,F,G,U,Y,j){let{id:AA,start:z,end:yA,size:P}=r,nA=l,eA=g;if(P<0)if(r.next(),P==-1){let JA=o[AA];G.push(JA),U.push(z-v);return}else if(P==-3){g=AA;return}else if(P==-4){l=AA;return}else throw new RangeError(`Unrecognized record size: ${P}`);let dA=s[AA],iA,aA,hA=z-v;if(yA-z<=n&&(aA=E(r.pos-F,Y))){let JA=new Uint16Array(aA.size-aA.skip),ee=r.pos-aA.size,UA=JA.length;for(;r.pos>ee;)UA=f(aA.start,JA,UA);iA=new N2(JA,yA-aA.start,i),hA=aA.start-v}else{let JA=r.pos-P;r.next();let ee=[],UA=[],mA=AA>=a?AA:-1,KA=0,ze=yA;for(;r.pos>JA;)mA>=0&&r.id==mA&&r.size>=0?(r.end<=ze-n&&(B(ee,UA,z,KA,r.end,ze,mA,nA,eA),KA=ee.length,ze=r.end),r.next()):j>2500?I(z,JA,ee,UA):C(z,JA,ee,UA,mA,j+1);if(mA>=0&&KA>0&&KA<ee.length&&B(ee,UA,z,KA,z,ze,mA,nA,eA),ee.reverse(),UA.reverse(),mA>-1&&KA>0){let Ke=d(dA,eA);iA=CS(dA,ee,UA,0,ee.length,0,yA-z,Ke,Ke)}else iA=Q(dA,ee,UA,yA-z,nA-yA,eA)}G.push(iA),U.push(hA)}function I(v,F,G,U){let Y=[],j=0,AA=-1;for(;r.pos>F;){let{id:z,start:yA,end:P,size:nA}=r;if(nA>4)r.next();else{if(AA>-1&&yA<AA)break;AA<0&&(AA=P-n),Y.push(z,yA,P),j++,r.next()}}if(j){let z=new Uint16Array(j*4),yA=Y[Y.length-2];for(let P=Y.length-3,nA=0;P>=0;P-=3)z[nA++]=Y[P],z[nA++]=Y[P+1]-yA,z[nA++]=Y[P+2]-yA,z[nA++]=nA;G.push(new N2(z,Y[2]-yA,i)),U.push(yA-v)}}function d(v,F){return(G,U,Y)=>{let j=0,AA=G.length-1,z,yA;if(AA>=0&&(z=G[AA])instanceof Ma){if(!AA&&z.type==v&&z.length==Y)return z;(yA=z.prop(wi.lookAhead))&&(j=U[AA]+z.length+yA)}return Q(v,G,U,Y,j,F)}}function B(v,F,G,U,Y,j,AA,z,yA){let P=[],nA=[];for(;v.length>U;)P.push(v.pop()),nA.push(F.pop()+G-Y);v.push(Q(i.types[AA],P,nA,j-Y,z-j,yA)),F.push(Y-G)}function Q(v,F,G,U,Y,j,AA){if(j){let z=[wi.contextHash,j];AA=AA?[z].concat(AA):[z]}if(Y>25){let z=[wi.lookAhead,Y];AA=AA?[z].concat(AA):[z]}return new Ma(v,F,G,U,AA)}function E(v,F){let G=r.fork(),U=0,Y=0,j=0,AA=G.end-n,z={size:0,start:0,skip:0};A:for(let yA=G.pos-v;G.pos>yA;){let P=G.size;if(G.id==F&&P>=0){z.size=U,z.start=Y,z.skip=j,j+=4,U+=4,G.next();continue}let nA=G.pos-P;if(P<0||nA<yA||G.start<AA)break;let eA=G.id>=a?4:0,dA=G.start;for(G.next();G.pos>nA;){if(G.size<0)if(G.size==-3||G.size==-4)eA+=4;else break A;else G.id>=a&&(eA+=4);G.next()}Y=dA,U+=P,j+=eA}return(F<0||U==v)&&(z.size=U,z.start=Y,z.skip=j),z.size>4?z:void 0}function f(v,F,G){let{id:U,start:Y,end:j,size:AA}=r;if(r.next(),AA>=0&&U<a){let z=G;if(AA>4){let yA=r.pos-(AA-4);for(;r.pos>yA;)G=f(v,F,G)}F[--G]=z,F[--G]=j-v,F[--G]=Y-v,F[--G]=U}else AA==-3?g=U:AA==-4&&(l=U);return G}let b=[],R=[];for(;r.pos>0;)C(t.start||0,t.bufferStart||0,b,R,-1,0);let M=(e=t.length)!==null&&e!==void 0?e:b.length?R[0]+b[0].length:0;return new Ma(s[t.topID],b.reverse(),R.reverse(),M)}var _j=new WeakMap;function s5(t,e){if(!t.isAnonymous||e instanceof N2||e.type!=t)return 1;let A=_j.get(e);if(A==null){A=1;for(let i of e.children){if(i.type!=t||!(i instanceof Ma)){A=1;break}A+=s5(t,i)}_j.set(e,A)}return A}function CS(t,e,A,i,n,o,a,r,s){let g=0;for(let B=i;B<n;B++)g+=s5(t,e[B]);let l=Math.ceil(g*1.5/8),C=[],I=[];function d(B,Q,E,f,b){for(let R=E;R<f;){let M=R,v=Q[R],F=s5(t,B[R]);for(R++;R<f;R++){let G=s5(t,B[R]);if(F+G>=l)break;F+=G}if(R==M+1){if(F>l){let G=B[M];d(G.children,G.positions,0,G.children.length,Q[M]+b);continue}C.push(B[M])}else{let G=Q[R-1]+B[R-1].length-v;C.push(CS(t,B,Q,M,R,v,G,null,s))}I.push(v+b-o)}}return d(e,A,i,n,0),(r||s)(C,I,a)}var D1=class t{constructor(e,A,i,n,o=!1,a=!1){this.from=e,this.to=A,this.tree=i,this.offset=n,this.open=(o?1:0)|(a?2:0)}get openStart(){return(this.open&1)>0}get openEnd(){return(this.open&2)>0}static addTree(e,A=[],i=!1){let n=[new t(0,e.length,e,0,!1,i)];for(let o of A)o.to>e.length&&n.push(o);return n}static applyChanges(e,A,i=128){if(!A.length)return e;let n=[],o=1,a=e.length?e[0]:null;for(let r=0,s=0,g=0;;r++){let l=r<A.length?A[r]:null,C=l?l.fromA:1e9;if(C-s>=i)for(;a&&a.from<C;){let I=a;if(s>=I.from||C<=I.to||g){let d=Math.max(I.from,s)-g,B=Math.min(I.to,C)-g;I=d>=B?null:new t(d,B,I.tree,I.offset+g,r>0,!!l)}if(I&&n.push(I),a.to>C)break;a=o<e.length?e[o++]:null}if(!l)break;s=l.toA,g=l.toA-l.toB}return n}},hQ=class{startParse(e,A,i){return typeof e==\"string\"&&(e=new lS(e)),i=i?i.length?i.map(n=>new m3(n.from,n.to)):[new m3(0,0)]:[new m3(0,e.length)],this.createParse(e,A||[],i)}parse(e,A,i){let n=this.startParse(e,A,i);for(;;){let o=n.advance();if(o)return o}}},lS=class{constructor(e){this.string=e}get length(){return this.string.length}chunk(e){return this.string.slice(e)}get lineChunks(){return!1}read(e,A){return this.string.slice(e,A)}};var K1e=new wi({perNode:!0});var tuA=0,Vl=class t{constructor(e,A,i,n){this.name=e,this.set=A,this.base=i,this.modified=n,this.id=tuA++}toString(){let{name:e}=this;for(let A of this.modified)A.name&&(e=`${A.name}(${e})`);return e}static define(e,A){let i=typeof e==\"string\"?e:\"?\";if(e instanceof t&&(A=e),A?.base)throw new Error(\"Can not derive from a modified tag\");let n=new t(i,[],null,[]);if(n.set.push(n),A)for(let o of A.set)n.set.push(o);return n}static defineModifier(e){let A=new I5(e);return i=>i.modified.indexOf(A)>-1?i:I5.get(i.base||i,i.modified.concat(A).sort((n,o)=>n.id-o.id))}},iuA=0,I5=class t{constructor(e){this.name=e,this.instances=[],this.id=iuA++}static get(e,A){if(!A.length)return e;let i=A[0].instances.find(r=>r.base==e&&nuA(A,r.modified));if(i)return i;let n=[],o=new Vl(e.name,n,e,A);for(let r of A)r.instances.push(o);let a=ouA(A);for(let r of e.set)if(!r.modified.length)for(let s of a)n.push(t.get(r,s));return o}};function nuA(t,e){return t.length==e.length&&t.every((A,i)=>A==e[i])}function ouA(t){let e=[[]];for(let A=0;A<t.length;A++)for(let i=0,n=e.length;i<n;i++)e.push(e[i].concat(t[A]));return e.sort((A,i)=>i.length-A.length)}function d5(t){let e=Object.create(null);for(let A in t){let i=t[A];Array.isArray(i)||(i=[i]);for(let n of A.split(\" \"))if(n){let o=[],a=2,r=n;for(let C=0;;){if(r==\"...\"&&C>0&&C+3==n.length){a=1;break}let I=/^\"(?:[^\"\\\\]|\\\\.)*?\"|[^\\/!]+/.exec(r);if(!I)throw new RangeError(\"Invalid path: \"+n);if(o.push(I[0]==\"*\"?\"\":I[0][0]=='\"'?JSON.parse(I[0]):I[0]),C+=I[0].length,C==n.length)break;let d=n[C++];if(C==n.length&&d==\"!\"){a=0;break}if(d!=\"/\")throw new RangeError(\"Invalid path: \"+n);r=n.slice(C)}let s=o.length-1,g=o[s];if(!g)throw new RangeError(\"Invalid path: \"+n);let l=new y1(i,a,s>0?o.slice(0,s):null);e[g]=l.sort(e[g])}}return Yj.add(e)}var Yj=new wi({combine(t,e){let A,i,n;for(;t||e;){if(!t||e&&t.depth>=e.depth?(n=e,e=e.next):(n=t,t=t.next),A&&A.mode==n.mode&&!n.context&&!A.context)continue;let o=new y1(n.tags,n.mode,n.context);A?A.next=o:i=o,A=o}return i}}),y1=class{constructor(e,A,i,n){this.tags=e,this.mode=A,this.context=i,this.next=n}get opaque(){return this.mode==0}get inherit(){return this.mode==1}sort(e){return!e||e.depth<this.depth?(this.next=e,this):(e.next=this.sort(e.next),e)}get depth(){return this.context?this.context.length:0}};y1.empty=new y1([],2,null);function QS(t,e){let A=Object.create(null);for(let o of t)if(!Array.isArray(o.tag))A[o.tag.id]=o.class;else for(let a of o.tag)A[a.id]=o.class;let{scope:i,all:n=null}=e||{};return{style:o=>{let a=n;for(let r of o)for(let s of r.set){let g=A[s.id];if(g){a=a?a+\" \"+g:g;break}}return a},scope:i}}function auA(t,e){let A=null;for(let i of t){let n=i.style(e);n&&(A=A?A+\" \"+n:n)}return A}function Hj(t,e,A,i=0,n=t.length){let o=new dS(i,Array.isArray(e)?e:[e],A);o.highlightRange(t.cursor(),i,n,\"\",o.highlighters),o.flush(n)}var dS=class{constructor(e,A,i){this.at=e,this.highlighters=A,this.span=i,this.class=\"\"}startSpan(e,A){A!=this.class&&(this.flush(e),e>this.at&&(this.at=e),this.class=A)}flush(e){e>this.at&&this.class&&this.span(this.at,e,this.class)}highlightRange(e,A,i,n,o){let{type:a,from:r,to:s}=e;if(r>=i||s<=A)return;a.isTop&&(o=this.highlighters.filter(d=>!d.scope||d.scope(a)));let g=n,l=ruA(e)||y1.empty,C=auA(o,l.tags);if(C&&(g&&(g+=\" \"),g+=C,l.mode==1&&(n+=(n?\" \":\"\")+C)),this.startSpan(Math.max(A,r),g),l.opaque)return;let I=e.tree&&e.tree.prop(wi.mounted);if(I&&I.overlay){let d=e.node.enter(I.overlay[0].from+r,1),B=this.highlighters.filter(E=>!E.scope||E.scope(I.tree.type)),Q=e.firstChild();for(let E=0,f=r;;E++){let b=E<I.overlay.length?I.overlay[E]:null,R=b?b.from+r:s,M=Math.max(A,f),v=Math.min(i,R);if(M<v&&Q)for(;e.from<v&&(this.highlightRange(e,M,v,n,o),this.startSpan(Math.min(v,e.to),g),!(e.to>=R||!e.nextSibling())););if(!b||R>i)break;f=b.to+r,f>A&&(this.highlightRange(d.cursor(),Math.max(A,b.from+r),Math.min(i,f),\"\",B),this.startSpan(Math.min(i,f),g))}Q&&e.parent()}else if(e.firstChild()){I&&(n=\"\");do if(!(e.to<=A)){if(e.from>=i)break;this.highlightRange(e,A,i,n,o),this.startSpan(Math.min(i,e.to),g)}while(e.nextSibling());e.parent()}}};function ruA(t){let e=t.type.prop(Yj);for(;e&&e.context&&!t.matchContext(e.context);)e=e.next;return e||null}var je=Vl.define,l5=je(),F2=je(),Uj=je(F2),Jj=je(F2),L2=je(),c5=je(L2),IS=je(L2),i0=je(),w1=je(i0),e0=je(),t0=je(),BS=je(),v3=je(BS),C5=je(),xe={comment:l5,lineComment:je(l5),blockComment:je(l5),docComment:je(l5),name:F2,variableName:je(F2),typeName:Uj,tagName:je(Uj),propertyName:Jj,attributeName:je(Jj),className:je(F2),labelName:je(F2),namespace:je(F2),macroName:je(F2),literal:L2,string:c5,docString:je(c5),character:je(c5),attributeValue:je(c5),number:IS,integer:je(IS),float:je(IS),bool:je(L2),regexp:je(L2),escape:je(L2),color:je(L2),url:je(L2),keyword:e0,self:je(e0),null:je(e0),atom:je(e0),unit:je(e0),modifier:je(e0),operatorKeyword:je(e0),controlKeyword:je(e0),definitionKeyword:je(e0),moduleKeyword:je(e0),operator:t0,derefOperator:je(t0),arithmeticOperator:je(t0),logicOperator:je(t0),bitwiseOperator:je(t0),compareOperator:je(t0),updateOperator:je(t0),definitionOperator:je(t0),typeOperator:je(t0),controlOperator:je(t0),punctuation:BS,separator:je(BS),bracket:v3,angleBracket:je(v3),squareBracket:je(v3),paren:je(v3),brace:je(v3),content:i0,heading:w1,heading1:je(w1),heading2:je(w1),heading3:je(w1),heading4:je(w1),heading5:je(w1),heading6:je(w1),contentSeparator:je(i0),list:je(i0),quote:je(i0),emphasis:je(i0),strong:je(i0),link:je(i0),monospace:je(i0),strikethrough:je(i0),inserted:je(),deleted:je(),changed:je(),invalid:je(),meta:C5,documentMeta:je(C5),annotation:je(C5),processingInstruction:je(C5),definition:Vl.defineModifier(\"definition\"),constant:Vl.defineModifier(\"constant\"),function:Vl.defineModifier(\"function\"),standard:Vl.defineModifier(\"standard\"),local:Vl.defineModifier(\"local\"),special:Vl.defineModifier(\"special\")};for(let t in xe){let e=xe[t];e instanceof Vl&&(e.name=t)}var Y1e=QS([{tag:xe.link,class:\"tok-link\"},{tag:xe.heading,class:\"tok-heading\"},{tag:xe.emphasis,class:\"tok-emphasis\"},{tag:xe.strong,class:\"tok-strong\"},{tag:xe.keyword,class:\"tok-keyword\"},{tag:xe.atom,class:\"tok-atom\"},{tag:xe.bool,class:\"tok-bool\"},{tag:xe.url,class:\"tok-url\"},{tag:xe.labelName,class:\"tok-labelName\"},{tag:xe.inserted,class:\"tok-inserted\"},{tag:xe.deleted,class:\"tok-deleted\"},{tag:xe.literal,class:\"tok-literal\"},{tag:xe.string,class:\"tok-string\"},{tag:xe.number,class:\"tok-number\"},{tag:[xe.regexp,xe.escape,xe.special(xe.string)],class:\"tok-string2\"},{tag:xe.variableName,class:\"tok-variableName\"},{tag:xe.local(xe.variableName),class:\"tok-variableName tok-local\"},{tag:xe.definition(xe.variableName),class:\"tok-variableName tok-definition\"},{tag:xe.special(xe.variableName),class:\"tok-variableName2\"},{tag:xe.definition(xe.propertyName),class:\"tok-propertyName tok-definition\"},{tag:xe.typeName,class:\"tok-typeName\"},{tag:xe.namespace,class:\"tok-namespace\"},{tag:xe.className,class:\"tok-className\"},{tag:xe.macroName,class:\"tok-macroName\"},{tag:xe.propertyName,class:\"tok-propertyName\"},{tag:xe.operator,class:\"tok-operator\"},{tag:xe.comment,class:\"tok-comment\"},{tag:xe.meta,class:\"tok-meta\"},{tag:xe.invalid,class:\"tok-invalid\"},{tag:xe.punctuation,class:\"tok-punctuation\"}]);var ES,uQ=new wi;function suA(t){return qe.define({combine:t?e=>e.concat(t):void 0})}var guA=new wi,Wl=(()=>{class t{constructor(A,i,n=[],o=\"\"){this.data=A,this.name=o,Ga.prototype.hasOwnProperty(\"tree\")||Object.defineProperty(Ga.prototype,\"tree\",{get(){return Br(this)}}),this.parser=i,this.extension=[_2.of(this),Ga.languageData.of((a,r,s)=>{let g=Tj(a,r,s),l=g.type.prop(uQ);if(!l)return[];let C=a.facet(l),I=g.type.prop(guA);if(I){let d=g.resolve(r-g.from,s);for(let B of I)if(B.test(d,a)){let Q=a.facet(B.facet);return B.type==\"replace\"?Q:Q.concat(C)}}return C})].concat(n)}isActiveAt(A,i,n=-1){return Tj(A,i,n).type.prop(uQ)==this.data}findRegions(A){let i=A.facet(_2);if(i?.data==this.data)return[{from:0,to:A.doc.length}];if(!i||!i.allowsNesting)return[];let n=[],o=(a,r)=>{if(a.prop(uQ)==this.data){n.push({from:r,to:r+a.length});return}let s=a.prop(wi.mounted);if(s){if(s.tree.prop(uQ)==this.data){if(s.overlay)for(let g of s.overlay)n.push({from:g.from+r,to:g.to+r});else n.push({from:r,to:r+a.length});return}else if(s.overlay){let g=n.length;if(o(s.tree,s.overlay[0].from+r),n.length>g)return}}for(let g=0;g<a.children.length;g++){let l=a.children[g];l instanceof Ma&&o(l,a.positions[g]+r)}};return o(Br(A),0),n}get allowsNesting(){return!0}}return t.setState=Ui.define(),t})();function Tj(t,e,A){let i=t.facet(_2),n=Br(t).topNode;if(!i||i.allowsNesting)for(let o=n;o;o=o.enter(e,A,Ea.ExcludeBuffers|Ea.EnterBracketed))o.type.isTop&&(n=o);return n}var B5=class t extends Wl{constructor(e,A,i){super(e,A,[],i),this.parser=A}static define(e){let A=suA(e.languageData);return new t(A,e.parser.configure({props:[uQ.add(i=>i.isTop?A:void 0)]}),e.name)}configure(e,A){return new t(this.data,this.parser.configure(e),A||this.name)}get allowsNesting(){return this.parser.hasWrappers()}};function Br(t){let e=t.field(Wl.state,!1);return e?e.tree:Ma.empty}function kS(t,e,A=50){var i;let n=(i=t.field(Wl.state,!1))===null||i===void 0?void 0:i.context;if(!n)return null;let o=n.viewport;n.updateViewport({from:0,to:e});let a=n.isDone(e)||n.work(A,e)?n.tree:null;return n.updateViewport(o),a}var mS=class{constructor(e){this.doc=e,this.cursorPos=0,this.string=\"\",this.cursor=e.iter()}get length(){return this.doc.length}syncTo(e){return this.string=this.cursor.next(e-this.cursorPos).value,this.cursorPos=e+this.string.length,this.cursorPos-this.string.length}chunk(e){return this.syncTo(e),this.string}get lineChunks(){return!0}read(e,A){let i=this.cursorPos-this.string.length;return e<i||A>=this.cursorPos?this.doc.sliceString(e,A):this.string.slice(e-i,A-i)}},b3=null,pS=class t{constructor(e,A,i=[],n,o,a,r,s){this.parser=e,this.state=A,this.fragments=i,this.tree=n,this.treeLen=o,this.viewport=a,this.skipped=r,this.scheduleOn=s,this.parse=null,this.tempSkipped=[]}static create(e,A,i){return new t(e,A,[],Ma.empty,0,i,[],null)}startParse(){return this.parser.startParse(new mS(this.state.doc),this.fragments)}work(e,A){return A!=null&&A>=this.state.doc.length&&(A=void 0),this.tree!=Ma.empty&&this.isDone(A??this.state.doc.length)?(this.takeTree(),!0):this.withContext(()=>{var i;if(typeof e==\"number\"){let n=Date.now()+e;e=()=>Date.now()>n}for(this.parse||(this.parse=this.startParse()),A!=null&&(this.parse.stoppedAt==null||this.parse.stoppedAt>A)&&A<this.state.doc.length&&this.parse.stopAt(A);;){let n=this.parse.advance();if(n)if(this.fragments=this.withoutTempSkipped(D1.addTree(n,this.fragments,this.parse.stoppedAt!=null)),this.treeLen=(i=this.parse.stoppedAt)!==null&&i!==void 0?i:this.state.doc.length,this.tree=n,this.parse=null,this.treeLen<(A??this.state.doc.length))this.parse=this.startParse();else return!0;if(e())return!1}})}takeTree(){let e,A;this.parse&&(e=this.parse.parsedPos)>=this.treeLen&&((this.parse.stoppedAt==null||this.parse.stoppedAt>e)&&this.parse.stopAt(e),this.withContext(()=>{for(;!(A=this.parse.advance()););}),this.treeLen=e,this.tree=A,this.fragments=this.withoutTempSkipped(D1.addTree(this.tree,this.fragments,!0)),this.parse=null)}withContext(e){let A=b3;b3=this;try{return e()}finally{b3=A}}withoutTempSkipped(e){for(let A;A=this.tempSkipped.pop();)e=Oj(e,A.from,A.to);return e}changes(e,A){let{fragments:i,tree:n,treeLen:o,viewport:a,skipped:r}=this;if(this.takeTree(),!e.empty){let s=[];if(e.iterChangedRanges((g,l,C,I)=>s.push({fromA:g,toA:l,fromB:C,toB:I})),i=D1.applyChanges(i,s),n=Ma.empty,o=0,a={from:e.mapPos(a.from,-1),to:e.mapPos(a.to,1)},this.skipped.length){r=[];for(let g of this.skipped){let l=e.mapPos(g.from,1),C=e.mapPos(g.to,-1);l<C&&r.push({from:l,to:C})}}}return new t(this.parser,A,i,n,o,a,r,this.scheduleOn)}updateViewport(e){if(this.viewport.from==e.from&&this.viewport.to==e.to)return!1;this.viewport=e;let A=this.skipped.length;for(let i=0;i<this.skipped.length;i++){let{from:n,to:o}=this.skipped[i];n<e.to&&o>e.from&&(this.fragments=Oj(this.fragments,n,o),this.skipped.splice(i--,1))}return this.skipped.length>=A?!1:(this.reset(),!0)}reset(){this.parse&&(this.takeTree(),this.parse=null)}skipUntilInView(e,A){this.skipped.push({from:e,to:A})}static getSkippingParser(e){return new class extends hQ{createParse(A,i,n){let o=n[0].from,a=n[n.length-1].to;return{parsedPos:o,advance(){let s=b3;if(s){for(let g of n)s.tempSkipped.push(g);e&&(s.scheduleOn=s.scheduleOn?Promise.all([s.scheduleOn,e]):e)}return this.parsedPos=a,new Ma(ts.none,[],[],a-o)},stoppedAt:null,stopAt(){}}}}}isDone(e){e=Math.min(e,this.state.doc.length);let A=this.fragments;return this.treeLen>=e&&A.length&&A[0].from==0&&A[0].to>=e}static get(){return b3}};function Oj(t,e,A){return D1.applyChanges(t,[{fromA:e,toA:A,fromB:e,toB:A}])}var k3=class t{constructor(e){this.context=e,this.tree=e.tree}apply(e){if(!e.docChanged&&this.tree==this.context.tree)return this;let A=this.context.changes(e.changes,e.state),i=this.context.treeLen==e.startState.doc.length?void 0:Math.max(e.changes.mapPos(this.context.treeLen),A.viewport.to);return A.work(20,i)||A.takeTree(),new t(A)}static init(e){let A=Math.min(3e3,e.doc.length),i=pS.create(e.facet(_2).parser,e,{from:0,to:A});return i.work(20,A)||i.takeTree(),new t(i)}};Wl.state=Qa.define({create:k3.init,update(t,e){for(let A of e.effects)if(A.is(Wl.setState))return A.value;return e.startState.facet(_2)!=e.state.facet(_2)?k3.init(e.state):t.apply(e)}});var Zj=t=>{let e=setTimeout(()=>t(),500);return()=>clearTimeout(e)};typeof requestIdleCallback<\"u\"&&(Zj=t=>{let e=-1,A=setTimeout(()=>{e=requestIdleCallback(t,{timeout:400})},100);return()=>e<0?clearTimeout(A):cancelIdleCallback(e)});var hS=typeof navigator<\"u\"&&(!((ES=navigator.scheduling)===null||ES===void 0)&&ES.isInputPending)?()=>navigator.scheduling.isInputPending():null,luA=ho.fromClass(class{constructor(e){this.view=e,this.working=null,this.workScheduled=0,this.chunkEnd=-1,this.chunkBudget=-1,this.work=this.work.bind(this),this.scheduleWork()}update(e){let A=this.view.state.field(Wl.state).context;(A.updateViewport(e.view.viewport)||this.view.viewport.to>A.treeLen)&&this.scheduleWork(),(e.docChanged||e.selectionSet)&&(this.view.hasFocus&&(this.chunkBudget+=50),this.scheduleWork()),this.checkAsyncSchedule(A)}scheduleWork(){if(this.working)return;let{state:e}=this.view,A=e.field(Wl.state);(A.tree!=A.context.tree||!A.context.isDone(e.doc.length))&&(this.working=Zj(this.work))}work(e){this.working=null;let A=Date.now();if(this.chunkEnd<A&&(this.chunkEnd<0||this.view.hasFocus)&&(this.chunkEnd=A+3e4,this.chunkBudget=3e3),this.chunkBudget<=0)return;let{state:i,viewport:{to:n}}=this.view,o=i.field(Wl.state);if(o.tree==o.context.tree&&o.context.isDone(n+1e5))return;let a=Date.now()+Math.min(this.chunkBudget,100,e&&!hS?Math.max(25,e.timeRemaining()-5):1e9),r=o.context.treeLen<n&&i.doc.length>n+1e3,s=o.context.work(()=>hS&&hS()||Date.now()>a,n+(r?0:1e5));this.chunkBudget-=Date.now()-A,(s||this.chunkBudget<=0)&&(o.context.takeTree(),this.view.dispatch({effects:Wl.setState.of(new k3(o.context))})),this.chunkBudget>0&&!(s&&!r)&&this.scheduleWork(),this.checkAsyncSchedule(o.context)}checkAsyncSchedule(e){e.scheduleOn&&(this.workScheduled++,e.scheduleOn.then(()=>this.scheduleWork()).catch(A=>dr(this.view.state,A)).then(()=>this.workScheduled--),e.scheduleOn=null)}destroy(){this.working&&this.working()}isWorking(){return!!(this.working||this.workScheduled>0)}},{eventHandlers:{focus(){this.scheduleWork()}}}),_2=qe.define({combine(t){return t.length?t[0]:null},enables:t=>[Wl.state,luA,ai.contentAttributes.compute([t],e=>{let A=e.facet(t);return A&&A.name?{\"data-language\":A.name}:{}})]}),Q5=class{constructor(e,A=[]){this.language=e,this.support=A,this.extension=[e,A]}};var cuA=qe.define(),M1=qe.define({combine:t=>{if(!t.length)return\"  \";let e=t[0];if(!e||/\\S/.test(e)||Array.from(e).some(A=>A!=e[0]))throw new Error(\"Invalid indent unit: \"+JSON.stringify(t[0]));return e}});function Xl(t){let e=t.facet(M1);return e.charCodeAt(0)==9?t.tabSize*e.length:e.length}function pQ(t,e){let A=\"\",i=t.tabSize,n=t.facet(M1)[0];if(n==\"\t\"){for(;e>=i;)A+=\"\t\",e-=i;n=\" \"}for(let o=0;o<e;o++)A+=n;return A}function h5(t,e){t instanceof Ga&&(t=new v1(t));for(let i of t.state.facet(cuA)){let n=i(t,e);if(n!==void 0)return n}let A=Br(t.state);return A.length>=e?CuA(t,A,e):null}var v1=class{constructor(e,A={}){this.state=e,this.options=A,this.unit=Xl(e)}lineAt(e,A=1){let i=this.state.doc.lineAt(e),{simulateBreak:n,simulateDoubleBreak:o}=this.options;return n!=null&&n>=i.from&&n<=i.to?o&&n==e?{text:\"\",from:e}:(A<0?n<e:n<=e)?{text:i.text.slice(n-i.from),from:n}:{text:i.text.slice(0,n-i.from),from:i.from}:i}textAfterPos(e,A=1){if(this.options.simulateDoubleBreak&&e==this.options.simulateBreak)return\"\";let{text:i,from:n}=this.lineAt(e,A);return i.slice(e-n,Math.min(i.length,e+100-n))}column(e,A=1){let{text:i,from:n}=this.lineAt(e,A),o=this.countColumn(i,e-n),a=this.options.overrideIndentation?this.options.overrideIndentation(n):-1;return a>-1&&(o+=a-this.countColumn(i,i.search(/\\S|$/))),o}countColumn(e,A=e.length){return q0(e,this.state.tabSize,A)}lineIndent(e,A=1){let{text:i,from:n}=this.lineAt(e,A),o=this.options.overrideIndentation;if(o){let a=o(n);if(a>-1)return a}return this.countColumn(i,i.search(/\\S|$/))}get simulatedBreak(){return this.options.simulateBreak||null}},SS=new wi;function CuA(t,e,A){let i=e.resolveStack(A),n=e.resolveInner(A,-1).resolve(A,0).enterUnfinishedNodesBefore(A);if(n!=i.node){let o=[];for(let a=n;a&&!(a.from<i.node.from||a.to>i.node.to||a.from==i.node.from&&a.type==i.node.type);a=a.parent)o.push(a);for(let a=o.length-1;a>=0;a--)i={node:o[a],next:i}}return Xj(i,t,A)}function Xj(t,e,A){for(let i=t;i;i=i.next){let n=duA(i.node);if(n)return n(DS.create(e,A,i))}return 0}function IuA(t){return t.pos==t.options.simulateBreak&&t.options.simulateDoubleBreak}function duA(t){let e=t.type.prop(SS);if(e)return e;let A=t.firstChild,i;if(A&&(i=A.type.prop(wi.closedBy))){let n=t.lastChild,o=n&&i.indexOf(n.name)>-1;return a=>huA(a,!0,1,void 0,o&&!IuA(a)?n.from:void 0)}return t.parent==null?BuA:null}function BuA(){return 0}var DS=class t extends v1{constructor(e,A,i){super(e.state,e.options),this.base=e,this.pos=A,this.context=i}get node(){return this.context.node}static create(e,A,i){return new t(e,A,i)}get textAfter(){return this.textAfterPos(this.pos)}get baseIndent(){return this.baseIndentFor(this.node)}baseIndentFor(e){let A=this.state.doc.lineAt(e.from);for(;;){let i=e.resolve(A.from);for(;i.parent&&i.parent.from==i.from;)i=i.parent;if(QuA(i,e))break;A=this.state.doc.lineAt(i.from)}return this.lineIndent(A.from)}continue(){return Xj(this.context.next,this.base,this.pos)}};function QuA(t,e){for(let A=e;A;A=A.parent)if(t==A)return!0;return!1}function EuA(t){let e=t.node,A=e.childAfter(e.from),i=e.lastChild;if(!A)return null;let n=t.options.simulateBreak,o=t.state.doc.lineAt(A.from),a=n==null||n<=o.from?o.to:Math.min(o.to,n);for(let r=A.to;;){let s=e.childAfter(r);if(!s||s==i)return null;if(!s.type.isSkipped){if(s.from>=a)return null;let g=/^ */.exec(o.text.slice(A.to-o.from))[0].length;return{from:A.from,to:A.to+g}}r=s.to}}function huA(t,e,A,i,n){let o=t.textAfter,a=o.match(/^\\s*/)[0].length,r=i&&o.slice(a,a+i.length)==i||n==t.pos+a,s=e?EuA(t):null;return s?r?t.column(s.from):t.column(s.to):t.baseIndent+(r?0:t.unit*A)}function xS({except:t,units:e=1}={}){return A=>{let i=t&&t.test(A.textAfter);return A.baseIndent+(i?0:e*A.unit)}}var uuA=200;function $j(){return Ga.transactionFilter.of(t=>{if(!t.docChanged||!t.isUserEvent(\"input.type\")&&!t.isUserEvent(\"input.complete\"))return t;let e=t.startState.languageDataAt(\"indentOnInput\",t.startState.selection.main.head);if(!e.length)return t;let A=t.newDoc,{head:i}=t.newSelection.main,n=A.lineAt(i);if(i>n.from+uuA)return t;let o=A.sliceString(n.from,i);if(!e.some(g=>g.test(o)))return t;let{state:a}=t,r=-1,s=[];for(let{head:g}of a.selection.ranges){let l=a.doc.lineAt(g);if(l.from==r)continue;r=l.from;let C=h5(a,l.from);if(C==null)continue;let I=/^\\s*/.exec(l.text)[0],d=pQ(a,C);I!=d&&s.push({from:l.from,to:l.from+I.length,insert:d})}return s.length?[t,{changes:s,sequential:!0}]:t})}var RS=qe.define(),S3=new wi;function Aq(t){let e=t.firstChild,A=t.lastChild;return e&&e.to<A.from?{from:e.to,to:A.type.isError?t.to:A.from}:null}function fuA(t,e,A){let i=Br(t);if(i.length<A)return null;let n=i.resolveStack(A,1),o=null;for(let a=n;a;a=a.next){let r=a.node;if(r.to<=A||r.from>A)continue;if(o&&r.from<e)break;let s=r.type.prop(S3);if(s&&(r.to<i.length-50||i.length==t.doc.length||!muA(r))){let g=s(r,t);g&&g.from<=A&&g.from>=e&&g.to>A&&(o=g)}}return o}function muA(t){let e=t.lastChild;return e&&e.to==t.to&&e.type.isError}function fQ(t,e,A){for(let i of t.facet(RS)){let n=i(t,e,A);if(n)return n}return fuA(t,e,A)}function eq(t,e){let A=e.mapPos(t.from,1),i=e.mapPos(t.to,-1);return A>=i?void 0:{from:A,to:i}}var DQ=Ui.define({map:eq}),x3=Ui.define({map:eq});function tq(t){let e=[];for(let{head:A}of t.state.selection.ranges)e.some(i=>i.from<=A&&i.to>=A)||e.push(t.lineBlockAt(A));return e}var b1=Qa.define({create(){return vt.none},update(t,e){e.isUserEvent(\"delete\")&&e.changes.iterChangedRanges((A,i)=>t=zj(t,A,i)),t=t.map(e.changes);for(let A of e.effects)if(A.is(DQ)&&!puA(t,A.value.from,A.value.to)){let{preparePlaceholder:i}=e.state.facet(LS),n=i?vt.replace({widget:new wS(i(e.state,A.value))}):Pj;t=t.update({add:[n.range(A.value.from,A.value.to)]})}else A.is(x3)&&(t=t.update({filter:(i,n)=>A.value.from!=i||A.value.to!=n,filterFrom:A.value.from,filterTo:A.value.to}));return e.selection&&(t=zj(t,e.selection.main.head)),t},provide:t=>ai.decorations.from(t),toJSON(t,e){let A=[];return t.between(0,e.doc.length,(i,n)=>{A.push(i,n)}),A},fromJSON(t){if(!Array.isArray(t)||t.length%2)throw new RangeError(\"Invalid JSON for fold state\");let e=[];for(let A=0;A<t.length;){let i=t[A++],n=t[A++];if(typeof i!=\"number\"||typeof n!=\"number\")throw new RangeError(\"Invalid JSON for fold state\");e.push(Pj.range(i,n))}return vt.set(e,!0)}});function zj(t,e,A=e){let i=!1;return t.between(e,A,(n,o)=>{n<A&&o>e&&(i=!0)}),i?t.update({filterFrom:e,filterTo:A,filter:(n,o)=>n>=A||o<=e}):t}function E5(t,e,A){var i;let n=null;return(i=t.field(b1,!1))===null||i===void 0||i.between(e,A,(o,a)=>{(!n||n.from>o)&&(n={from:o,to:a})}),n}function puA(t,e,A){let i=!1;return t.between(e,e,(n,o)=>{n==e&&o==A&&(i=!0)}),i}function iq(t,e){return t.field(b1,!1)?e:e.concat(Ui.appendConfig.of(aq()))}var DuA=t=>{for(let e of tq(t)){let A=fQ(t.state,e.from,e.to);if(A)return t.dispatch({effects:iq(t.state,[DQ.of(A),nq(t,A)])}),!0}return!1},NS=t=>{if(!t.state.field(b1,!1))return!1;let e=[];for(let A of tq(t)){let i=E5(t.state,A.from,A.to);i&&e.push(x3.of(i),nq(t,i,!1))}return e.length&&t.dispatch({effects:e}),e.length>0};function nq(t,e,A=!0){let i=t.state.doc.lineAt(e.from).number,n=t.state.doc.lineAt(e.to).number;return ai.announce.of(`${t.state.phrase(A?\"Folded lines\":\"Unfolded lines\")} ${i} ${t.state.phrase(\"to\")} ${n}.`)}var wuA=t=>{let{state:e}=t,A=[];for(let i=0;i<e.doc.length;){let n=t.lineBlockAt(i),o=fQ(e,n.from,n.to);o&&A.push(DQ.of(o)),i=(o?t.lineBlockAt(o.to):n).to+1}return A.length&&t.dispatch({effects:iq(t.state,A)}),!!A.length},FS=t=>{let e=t.state.field(b1,!1);if(!e||!e.size)return!1;let A=[];return e.between(0,t.state.doc.length,(i,n)=>{A.push(x3.of({from:i,to:n}))}),t.dispatch({effects:A}),!0};var oq=[{key:\"Ctrl-Shift-[\",mac:\"Cmd-Alt-[\",run:DuA},{key:\"Ctrl-Shift-]\",mac:\"Cmd-Alt-]\",run:NS},{key:\"Ctrl-Alt-[\",run:wuA},{key:\"Ctrl-Alt-]\",run:FS}],yuA={placeholderDOM:null,preparePlaceholder:null,placeholderText:\"\\u2026\"},LS=qe.define({combine(t){return Ir(t,yuA)}});function aq(t){let e=[b1,buA];return t&&e.push(LS.of(t)),e}function rq(t,e){let{state:A}=t,i=A.facet(LS),n=a=>{let r=t.lineBlockAt(t.posAtDOM(a.target)),s=E5(t.state,r.from,r.to);s&&t.dispatch({effects:x3.of(s)}),a.preventDefault()};if(i.placeholderDOM)return i.placeholderDOM(t,n,e);let o=document.createElement(\"span\");return o.textContent=i.placeholderText,o.setAttribute(\"aria-label\",A.phrase(\"folded code\")),o.title=A.phrase(\"unfold\"),o.className=\"cm-foldPlaceholder\",o.onclick=n,o}var Pj=vt.replace({widget:new class extends Ps{toDOM(t){return rq(t,null)}}}),wS=class extends Ps{constructor(e){super(),this.value=e}eq(e){return this.value==e.value}toDOM(e){return rq(e,this.value)}},vuA={openText:\"\\u2304\",closedText:\"\\u203A\",markerDOM:null,domEventHandlers:{},foldingChanged:()=>!1},M3=class extends qs{constructor(e,A){super(),this.config=e,this.open=A}eq(e){return this.config==e.config&&this.open==e.open}toDOM(e){if(this.config.markerDOM)return this.config.markerDOM(this.open);let A=document.createElement(\"span\");return A.textContent=this.open?this.config.openText:this.config.closedText,A.title=e.state.phrase(this.open?\"Fold line\":\"Unfold line\"),A}};function sq(t={}){let e=BA(BA({},vuA),t),A=new M3(e,!0),i=new M3(e,!1),n=ho.fromClass(class{constructor(a){this.from=a.viewport.from,this.markers=this.buildMarkers(a)}update(a){(a.docChanged||a.viewportChanged||a.startState.facet(_2)!=a.state.facet(_2)||a.startState.field(b1,!1)!=a.state.field(b1,!1)||Br(a.startState)!=Br(a.state)||e.foldingChanged(a))&&(this.markers=this.buildMarkers(a.view))}buildMarkers(a){let r=new Nr;for(let s of a.viewportLineBlocks){let g=E5(a.state,s.from,s.to)?i:fQ(a.state,s.from,s.to)?A:null;g&&r.add(s.from,s.from,g)}return r.finish()}}),{domEventHandlers:o}=e;return[n,a5({class:\"cm-foldGutter\",markers(a){var r;return((r=a.plugin(n))===null||r===void 0?void 0:r.markers)||zn.empty},initialSpacer(){return new M3(e,!1)},domEventHandlers:Ve(BA({},o),{click:(a,r,s)=>{if(o.click&&o.click(a,r,s))return!0;let g=E5(a.state,r.from,r.to);if(g)return a.dispatch({effects:x3.of(g)}),!0;let l=fQ(a.state,r.from,r.to);return l?(a.dispatch({effects:DQ.of(l)}),!0):!1}})}),aq()]}var buA=ai.baseTheme({\".cm-foldPlaceholder\":{backgroundColor:\"#eee\",border:\"1px solid #ddd\",color:\"#888\",borderRadius:\".2em\",margin:\"0 1px\",padding:\"0 1px\",cursor:\"pointer\"},\".cm-foldGutter span\":{padding:\"0 1px\",cursor:\"pointer\"}}),mQ=class t{constructor(e,A){this.specs=e;let i;function n(r){let s=Xg.newName();return(i||(i=Object.create(null)))[\".\"+s]=r,s}let o=typeof A.all==\"string\"?A.all:A.all?n(A.all):void 0,a=A.scope;this.scope=a instanceof Wl?r=>r.prop(uQ)==a.data:a?r=>r==a:void 0,this.style=QS(e.map(r=>({tag:r.tag,class:r.class||n(Object.assign({},r,{tag:null}))})),{all:o}).style,this.module=i?new Xg(i):null,this.themeType=A.themeType}static define(e,A){return new t(e,A||{})}},yS=qe.define(),gq=qe.define({combine(t){return t.length?[t[0]]:null}});function uS(t){let e=t.facet(yS);return e.length?e:t.facet(gq)}function _S(t,e){let A=[MuA],i;return t instanceof mQ&&(t.module&&A.push(ai.styleModule.of(t.module)),i=t.themeType),e?.fallback?A.push(gq.of(t)):i?A.push(yS.computeN([ai.darkTheme],n=>n.facet(ai.darkTheme)==(i==\"dark\")?[t]:[])):A.push(yS.of(t)),A}var vS=class{constructor(e){this.markCache=Object.create(null),this.tree=Br(e.state),this.decorations=this.buildDeco(e,uS(e.state)),this.decoratedTo=e.viewport.to}update(e){let A=Br(e.state),i=uS(e.state),n=i!=uS(e.startState),{viewport:o}=e.view,a=e.changes.mapPos(this.decoratedTo,1);A.length<o.to&&!n&&A.type==this.tree.type&&a>=o.to?(this.decorations=this.decorations.map(e.changes),this.decoratedTo=a):(A!=this.tree||e.viewportChanged||n)&&(this.tree=A,this.decorations=this.buildDeco(e.view,i),this.decoratedTo=o.to)}buildDeco(e,A){if(!A||!this.tree.length)return vt.none;let i=new Nr;for(let{from:n,to:o}of e.visibleRanges)Hj(this.tree,A,(a,r,s)=>{i.add(a,r,this.markCache[s]||(this.markCache[s]=vt.mark({class:s})))},n,o);return i.finish()}},MuA=zl.high(ho.fromClass(vS,{decorations:t=>t.decorations})),lq=mQ.define([{tag:xe.meta,color:\"#404740\"},{tag:xe.link,textDecoration:\"underline\"},{tag:xe.heading,textDecoration:\"underline\",fontWeight:\"bold\"},{tag:xe.emphasis,fontStyle:\"italic\"},{tag:xe.strong,fontWeight:\"bold\"},{tag:xe.strikethrough,textDecoration:\"line-through\"},{tag:xe.keyword,color:\"#708\"},{tag:[xe.atom,xe.bool,xe.url,xe.contentSeparator,xe.labelName],color:\"#219\"},{tag:[xe.literal,xe.inserted],color:\"#164\"},{tag:[xe.string,xe.deleted],color:\"#a11\"},{tag:[xe.regexp,xe.escape,xe.special(xe.string)],color:\"#e40\"},{tag:xe.definition(xe.variableName),color:\"#00f\"},{tag:xe.local(xe.variableName),color:\"#30a\"},{tag:[xe.typeName,xe.namespace],color:\"#085\"},{tag:xe.className,color:\"#167\"},{tag:[xe.special(xe.variableName),xe.macroName],color:\"#256\"},{tag:xe.definition(xe.propertyName),color:\"#00c\"},{tag:xe.comment,color:\"#940\"},{tag:xe.invalid,color:\"#f00\"}]),kuA=ai.baseTheme({\"&.cm-focused .cm-matchingBracket\":{backgroundColor:\"#328c8252\"},\"&.cm-focused .cm-nonmatchingBracket\":{backgroundColor:\"#bb555544\"}}),cq=1e4,Cq=\"()[]{}\",Iq=qe.define({combine(t){return Ir(t,{afterCursor:!0,brackets:Cq,maxScanDistance:cq,renderMatch:RuA})}}),SuA=vt.mark({class:\"cm-matchingBracket\"}),xuA=vt.mark({class:\"cm-nonmatchingBracket\"});function RuA(t){let e=[],A=t.matched?SuA:xuA;return e.push(A.range(t.start.from,t.start.to)),t.end&&e.push(A.range(t.end.from,t.end.to)),e}function jj(t){let e=[],A=t.facet(Iq);for(let i of t.selection.ranges){if(!i.empty)continue;let n=Zl(t,i.head,-1,A)||i.head>0&&Zl(t,i.head-1,1,A)||A.afterCursor&&(Zl(t,i.head,1,A)||i.head<t.doc.length&&Zl(t,i.head+1,-1,A));n&&(e=e.concat(A.renderMatch(n,t)))}return vt.set(e,!0)}var NuA=ho.fromClass(class{constructor(t){this.paused=!1,this.decorations=jj(t.state)}update(t){(t.docChanged||t.selectionSet||this.paused)&&(t.view.composing?(this.decorations=this.decorations.map(t.changes),this.paused=!0):(this.decorations=jj(t.state),this.paused=!1))}},{decorations:t=>t.decorations}),FuA=[NuA,kuA];function dq(t={}){return[Iq.of(t),FuA]}var LuA=new wi;function bS(t,e,A){let i=t.prop(e<0?wi.openedBy:wi.closedBy);if(i)return i;if(t.name.length==1){let n=A.indexOf(t.name);if(n>-1&&n%2==(e<0?1:0))return[A[n+e]]}return null}function MS(t){let e=t.type.prop(LuA);return e?e(t.node):t}function Zl(t,e,A,i={}){let n=i.maxScanDistance||cq,o=i.brackets||Cq,a=Br(t),r=a.resolveInner(e,A);for(let s=r;s;s=s.parent){let g=bS(s.type,A,o);if(g&&s.from<s.to){let l=MS(s);if(l&&(A>0?e>=l.from&&e<l.to:e>l.from&&e<=l.to))return _uA(t,e,A,s,l,g,o)}}return GuA(t,e,A,a,r.type,n,o)}function _uA(t,e,A,i,n,o,a){let r=i.parent,s={from:n.from,to:n.to},g=0,l=r?.cursor();if(l&&(A<0?l.childBefore(i.from):l.childAfter(i.to)))do if(A<0?l.to<=i.from:l.from>=i.to){if(g==0&&o.indexOf(l.type.name)>-1&&l.from<l.to){let C=MS(l);return{start:s,end:C?{from:C.from,to:C.to}:void 0,matched:!0}}else if(bS(l.type,A,a))g++;else if(bS(l.type,-A,a)){if(g==0){let C=MS(l);return{start:s,end:C&&C.from<C.to?{from:C.from,to:C.to}:void 0,matched:!1}}g--}}while(A<0?l.prevSibling():l.nextSibling());return{start:s,matched:!1}}function GuA(t,e,A,i,n,o,a){let r=A<0?t.sliceDoc(e-1,e):t.sliceDoc(e,e+1),s=a.indexOf(r);if(s<0||s%2==0!=A>0)return null;let g={from:A<0?e-1:e,to:A>0?e+1:e},l=t.doc.iterRange(e,A>0?t.doc.length:0),C=0;for(let I=0;!l.next().done&&I<=o;){let d=l.value;A<0&&(I+=d.length);let B=e+I*A;for(let Q=A>0?0:d.length-1,E=A>0?d.length:-1;Q!=E;Q+=A){let f=a.indexOf(d[Q]);if(!(f<0||i.resolveInner(B+Q,1).type!=n))if(f%2==0==A>0)C++;else{if(C==1)return{start:g,end:{from:B+Q,to:B+Q+1},matched:f>>1==s>>1};C--}}A>0&&(I+=d.length)}return l.done?{start:g,matched:!1}:null}var KuA=Object.create(null),qj=[ts.none];var Vj=[],Wj=Object.create(null),UuA=Object.create(null);for(let[t,e]of[[\"variable\",\"variableName\"],[\"variable-2\",\"variableName.special\"],[\"string-2\",\"string.special\"],[\"def\",\"variableName.definition\"],[\"tag\",\"tagName\"],[\"attribute\",\"attributeName\"],[\"type\",\"typeName\"],[\"builtin\",\"variableName.standard\"],[\"qualifier\",\"modifier\"],[\"error\",\"invalid\"],[\"header\",\"heading\"],[\"property\",\"propertyName\"]])UuA[t]=JuA(KuA,e);function fS(t,e){Vj.indexOf(t)>-1||(Vj.push(t),console.warn(e))}function JuA(t,e){let A=[];for(let r of e.split(\" \")){let s=[];for(let g of r.split(\".\")){let l=t[g]||xe[g];l?typeof l==\"function\"?s.length?s=s.map(l):fS(g,`Modifier ${g} used at start of tag`):s.length?fS(g,`Tag ${g} used as modifier`):s=Array.isArray(l)?l:[l]:fS(g,`Unknown highlighting tag ${g}`)}for(let g of s)A.push(g)}if(!A.length)return 0;let i=e.replace(/ /g,\"_\"),n=i+\" \"+A.map(r=>r.id),o=Wj[n];if(o)return o.id;let a=Wj[n]=ts.define({id:qj.length,name:i,props:[d5({[i]:A})]});return qj.push(a),a.id}var V1e={rtl:vt.mark({class:\"cm-iso\",inclusive:!0,attributes:{dir:\"rtl\"},bidiIsolate:go.RTL}),ltr:vt.mark({class:\"cm-iso\",inclusive:!0,attributes:{dir:\"ltr\"},bidiIsolate:go.LTR}),auto:vt.mark({class:\"cm-iso\",inclusive:!0,attributes:{dir:\"auto\"},bidiIsolate:null})};var YuA=t=>{let{state:e}=t,A=e.doc.lineAt(e.selection.main.from),i=JS(t.state,A.from);return i.line?HuA(t):i.block?OuA(t):!1};function US(t,e){return({state:A,dispatch:i})=>{if(A.readOnly)return!1;let n=t(e,A);return n?(i(A.update(n)),!0):!1}}var HuA=US(juA,0);var TuA=US(Dq,0);var OuA=US((t,e)=>Dq(t,e,PuA(e)),0);function JS(t,e){let A=t.languageDataAt(\"commentTokens\",e,1);return A.length?A[0]:{}}var R3=50;function zuA(t,{open:e,close:A},i,n){let o=t.sliceDoc(i-R3,i),a=t.sliceDoc(n,n+R3),r=/\\s*$/.exec(o)[0].length,s=/^\\s*/.exec(a)[0].length,g=o.length-r;if(o.slice(g-e.length,g)==e&&a.slice(s,s+A.length)==A)return{open:{pos:i-r,margin:r&&1},close:{pos:n+s,margin:s&&1}};let l,C;n-i<=2*R3?l=C=t.sliceDoc(i,n):(l=t.sliceDoc(i,i+R3),C=t.sliceDoc(n-R3,n));let I=/^\\s*/.exec(l)[0].length,d=/\\s*$/.exec(C)[0].length,B=C.length-d-A.length;return l.slice(I,I+e.length)==e&&C.slice(B,B+A.length)==A?{open:{pos:i+I+e.length,margin:/\\s/.test(l.charAt(I+e.length))?1:0},close:{pos:n-d-A.length,margin:/\\s/.test(C.charAt(B-1))?1:0}}:null}function PuA(t){let e=[];for(let A of t.selection.ranges){let i=t.doc.lineAt(A.from),n=A.to<=i.to?i:t.doc.lineAt(A.to);n.from>i.from&&n.from==A.to&&(n=A.to==i.to+1?i:t.doc.lineAt(A.to-1));let o=e.length-1;o>=0&&e[o].to>i.from?e[o].to=n.to:e.push({from:i.from+/^\\s*/.exec(i.text)[0].length,to:n.to})}return e}function Dq(t,e,A=e.selection.ranges){let i=A.map(o=>JS(e,o.from).block);if(!i.every(o=>o))return null;let n=A.map((o,a)=>zuA(e,i[a],o.from,o.to));if(t!=2&&!n.every(o=>o))return{changes:e.changes(A.map((o,a)=>n[a]?[]:[{from:o.from,insert:i[a].open+\" \"},{from:o.to,insert:\" \"+i[a].close}]))};if(t!=1&&n.some(o=>o)){let o=[];for(let a=0,r;a<n.length;a++)if(r=n[a]){let s=i[a],{open:g,close:l}=r;o.push({from:g.pos-s.open.length,to:g.pos+g.margin},{from:l.pos-l.margin,to:l.pos+s.close.length})}return{changes:o}}return null}function juA(t,e,A=e.selection.ranges){let i=[],n=-1;A:for(let{from:o,to:a}of A){let r=i.length,s=1e9,g;for(let l=o;l<=a;){let C=e.doc.lineAt(l);if(g==null&&(g=JS(e,C.from).line,!g))continue A;if(C.from>n&&(o==a||a>C.from)){n=C.from;let I=/^\\s*/.exec(C.text)[0].length,d=I==C.length,B=C.text.slice(I,I+g.length)==g?I:-1;I<C.text.length&&I<s&&(s=I),i.push({line:C,comment:B,token:g,indent:I,empty:d,single:!1})}l=C.to+1}if(s<1e9)for(let l=r;l<i.length;l++)i[l].indent<i[l].line.text.length&&(i[l].indent=s);i.length==r+1&&(i[r].single=!0)}if(t!=2&&i.some(o=>o.comment<0&&(!o.empty||o.single))){let o=[];for(let{line:r,token:s,indent:g,empty:l,single:C}of i)(C||!l)&&o.push({from:r.from+g,insert:s+\" \"});let a=e.changes(o);return{changes:a,selection:e.selection.map(a,1)}}else if(t!=1&&i.some(o=>o.comment>=0)){let o=[];for(let{line:a,comment:r,token:s}of i)if(r>=0){let g=a.from+r,l=g+s.length;a.text[l-a.from]==\" \"&&l++,o.push({from:g,to:l})}return{changes:o}}return null}function wQ(t,e){return ce.create(t.ranges.map(e),t.mainIndex)}function $l(t,e){return t.update({selection:e,scrollIntoView:!0,userEvent:\"select\"})}function Ac({state:t,dispatch:e},A){let i=wQ(t.selection,A);return i.eq(t.selection,!0)?!1:(e($l(t,i)),!0)}function f5(t,e){return ce.cursor(e?t.to:t.from)}function wq(t,e){return Ac(t,A=>A.empty?t.moveByChar(A,e):f5(A,e))}function is(t){return t.textDirectionAt(t.state.selection.main.head)==go.LTR}var yq=t=>wq(t,!is(t)),vq=t=>wq(t,is(t));function bq(t,e){return Ac(t,A=>A.empty?t.moveByGroup(A,e):f5(A,e))}var quA=t=>bq(t,!is(t)),VuA=t=>bq(t,is(t));var ade=typeof Intl<\"u\"&&Intl.Segmenter?new Intl.Segmenter(void 0,{granularity:\"word\"}):null;function WuA(t,e,A){if(e.type.prop(A))return!0;let i=e.to-e.from;return i&&(i>2||/[^\\s,.;:]/.test(t.sliceDoc(e.from,e.to)))||e.firstChild}function m5(t,e,A){let i=Br(t).resolveInner(e.head),n=A?wi.closedBy:wi.openedBy;for(let s=e.head;;){let g=A?i.childAfter(s):i.childBefore(s);if(!g)break;WuA(t,g,n)?i=g:s=A?g.to:g.from}let o=i.type.prop(n),a,r;return o&&(a=A?Zl(t,i.from,1):Zl(t,i.to,-1))&&a.matched?r=A?a.end.to:a.end.from:r=A?i.to:i.from,ce.cursor(r,A?-1:1)}var ZuA=t=>Ac(t,e=>m5(t.state,e,!is(t))),XuA=t=>Ac(t,e=>m5(t.state,e,is(t)));function Mq(t,e){return Ac(t,A=>{if(!A.empty)return f5(A,e);let i=t.moveVertically(A,e);return i.head!=A.head?i:t.moveToLineBoundary(A,e)})}var kq=t=>Mq(t,!1),Sq=t=>Mq(t,!0);function xq(t){let e=t.scrollDOM.clientHeight<t.scrollDOM.scrollHeight-2,A=0,i=0,n;if(e){for(let o of t.state.facet(ai.scrollMargins)){let a=o(t);a?.top&&(A=Math.max(a?.top,A)),a?.bottom&&(i=Math.max(a?.bottom,i))}n=t.scrollDOM.clientHeight-A-i}else n=(t.dom.ownerDocument.defaultView||window).innerHeight;return{marginTop:A,marginBottom:i,selfScroll:e,height:Math.max(t.defaultLineHeight,n-5)}}function Rq(t,e){let A=xq(t),{state:i}=t,n=wQ(i.selection,a=>a.empty?t.moveVertically(a,e,A.height):f5(a,e));if(n.eq(i.selection))return!1;let o;if(A.selfScroll){let a=t.coordsAtPos(i.selection.main.head),r=t.scrollDOM.getBoundingClientRect(),s=r.top+A.marginTop,g=r.bottom-A.marginBottom;a&&a.top>s&&a.bottom<g&&(o=ai.scrollIntoView(n.main.head,{y:\"start\",yMargin:a.top-s}))}return t.dispatch($l(i,n),{effects:o}),!0}var Bq=t=>Rq(t,!1),GS=t=>Rq(t,!0);function G2(t,e,A){let i=t.lineBlockAt(e.head),n=t.moveToLineBoundary(e,A);if(n.head==e.head&&n.head!=(A?i.to:i.from)&&(n=t.moveToLineBoundary(e,A,!1)),!A&&n.head==i.from&&i.length){let o=/^\\s*/.exec(t.state.sliceDoc(i.from,Math.min(i.from+100,i.to)))[0].length;o&&e.head!=i.from+o&&(n=ce.cursor(i.from+o))}return n}var $uA=t=>Ac(t,e=>G2(t,e,!0)),AfA=t=>Ac(t,e=>G2(t,e,!1)),efA=t=>Ac(t,e=>G2(t,e,!is(t))),tfA=t=>Ac(t,e=>G2(t,e,is(t))),ifA=t=>Ac(t,e=>ce.cursor(t.lineBlockAt(e.head).from,1)),nfA=t=>Ac(t,e=>ce.cursor(t.lineBlockAt(e.head).to,-1));function ofA(t,e,A){let i=!1,n=wQ(t.selection,o=>{let a=Zl(t,o.head,-1)||Zl(t,o.head,1)||o.head>0&&Zl(t,o.head-1,1)||o.head<t.doc.length&&Zl(t,o.head+1,-1);if(!a||!a.end)return o;i=!0;let r=a.start.from==o.head?a.end.to:a.end.from;return A?ce.range(o.anchor,r):ce.cursor(r)});return i?(e($l(t,n)),!0):!1}var afA=({state:t,dispatch:e})=>ofA(t,e,!1);function tl(t,e){let A=wQ(t.state.selection,i=>{let n=e(i);return ce.range(i.anchor,n.head,n.goalColumn,n.bidiLevel||void 0,n.assoc)});return A.eq(t.state.selection)?!1:(t.dispatch($l(t.state,A)),!0)}function Nq(t,e){return tl(t,A=>t.moveByChar(A,e))}var Fq=t=>Nq(t,!is(t)),Lq=t=>Nq(t,is(t));function _q(t,e){return tl(t,A=>t.moveByGroup(A,e))}var rfA=t=>_q(t,!is(t)),sfA=t=>_q(t,is(t));var gfA=t=>tl(t,e=>m5(t.state,e,!is(t))),lfA=t=>tl(t,e=>m5(t.state,e,is(t)));function Gq(t,e){return tl(t,A=>t.moveVertically(A,e))}var Kq=t=>Gq(t,!1),Uq=t=>Gq(t,!0);function Jq(t,e){return tl(t,A=>t.moveVertically(A,e,xq(t).height))}var Qq=t=>Jq(t,!1),Eq=t=>Jq(t,!0),cfA=t=>tl(t,e=>G2(t,e,!0)),CfA=t=>tl(t,e=>G2(t,e,!1)),IfA=t=>tl(t,e=>G2(t,e,!is(t))),dfA=t=>tl(t,e=>G2(t,e,is(t))),BfA=t=>tl(t,e=>ce.cursor(t.lineBlockAt(e.head).from)),QfA=t=>tl(t,e=>ce.cursor(t.lineBlockAt(e.head).to)),hq=({state:t,dispatch:e})=>(e($l(t,{anchor:0})),!0),uq=({state:t,dispatch:e})=>(e($l(t,{anchor:t.doc.length})),!0),fq=({state:t,dispatch:e})=>(e($l(t,{anchor:t.selection.main.anchor,head:0})),!0),mq=({state:t,dispatch:e})=>(e($l(t,{anchor:t.selection.main.anchor,head:t.doc.length})),!0),EfA=({state:t,dispatch:e})=>(e(t.update({selection:{anchor:0,head:t.doc.length},userEvent:\"select\"})),!0),hfA=({state:t,dispatch:e})=>{let A=p5(t).map(({from:i,to:n})=>ce.range(i,Math.min(n+1,t.doc.length)));return e(t.update({selection:ce.create(A),userEvent:\"select\"})),!0},ufA=({state:t,dispatch:e})=>{let A=wQ(t.selection,i=>{let n=Br(t),o=n.resolveStack(i.from,1);if(i.empty){let a=n.resolveStack(i.from,-1);a.node.from>=o.node.from&&a.node.to<=o.node.to&&(o=a)}for(let a=o;a;a=a.next){let{node:r}=a;if((r.from<i.from&&r.to>=i.to||r.to>i.to&&r.from<=i.from)&&a.next)return ce.range(r.to,r.from)}return i});return A.eq(t.selection)?!1:(e($l(t,A)),!0)};function Yq(t,e){let{state:A}=t,i=A.selection,n=A.selection.ranges.slice();for(let o of A.selection.ranges){let a=A.doc.lineAt(o.head);if(e?a.to<t.state.doc.length:a.from>0)for(let r=o;;){let s=t.moveVertically(r,e);if(s.head<a.from||s.head>a.to){n.some(g=>g.head==s.head)||n.push(s);break}else{if(s.head==r.head)break;r=s}}}return n.length==i.ranges.length?!1:(t.dispatch($l(A,ce.create(n,n.length-1))),!0)}var ffA=t=>Yq(t,!1),mfA=t=>Yq(t,!0),pfA=({state:t,dispatch:e})=>{let A=t.selection,i=null;return A.ranges.length>1?i=ce.create([A.main]):A.main.empty||(i=ce.create([ce.cursor(A.main.head)])),i?(e($l(t,i)),!0):!1};function N3(t,e){if(t.state.readOnly)return!1;let A=\"delete.selection\",{state:i}=t,n=i.changeByRange(o=>{let{from:a,to:r}=o;if(a==r){let s=e(o);s<a?(A=\"delete.backward\",s=u5(t,s,!1)):s>a&&(A=\"delete.forward\",s=u5(t,s,!0)),a=Math.min(a,s),r=Math.max(r,s)}else a=u5(t,a,!1),r=u5(t,r,!0);return a==r?{range:o}:{changes:{from:a,to:r},range:ce.cursor(a,a<o.head?-1:1)}});return n.changes.empty?!1:(t.dispatch(i.update(n,{scrollIntoView:!0,userEvent:A,effects:A==\"delete.selection\"?ai.announce.of(i.phrase(\"Selection deleted\")):void 0})),!0)}function u5(t,e,A){if(t instanceof ai)for(let i of t.state.facet(ai.atomicRanges).map(n=>n(t)))i.between(e,e,(n,o)=>{n<e&&o>e&&(e=A?o:n)});return e}var Hq=(t,e,A)=>N3(t,i=>{let n=i.from,{state:o}=t,a=o.doc.lineAt(n),r,s;if(A&&!e&&n>a.from&&n<a.from+200&&!/[^ \\t]/.test(r=a.text.slice(0,n-a.from))){if(r[r.length-1]==\"\t\")return n-1;let g=q0(r,o.tabSize),l=g%Xl(o)||Xl(o);for(let C=0;C<l&&r[r.length-1-C]==\" \";C++)n--;s=n}else s=_a(a.text,n-a.from,e,e)+a.from,s==n&&a.number!=(e?o.doc.lines:1)?s+=e?1:-1:!e&&/[\\ufe00-\\ufe0f]/.test(a.text.slice(s-a.from,n-a.from))&&(s=_a(a.text,s-a.from,!1,!1)+a.from);return s}),KS=t=>Hq(t,!1,!0);var Tq=t=>Hq(t,!0,!1),Oq=(t,e)=>N3(t,A=>{let i=A.head,{state:n}=t,o=n.doc.lineAt(i),a=n.charCategorizer(i);for(let r=null;;){if(i==(e?o.to:o.from)){i==A.head&&o.number!=(e?n.doc.lines:1)&&(i+=e?1:-1);break}let s=_a(o.text,i-o.from,e)+o.from,g=o.text.slice(Math.min(i,s)-o.from,Math.max(i,s)-o.from),l=a(g);if(r!=null&&l!=r)break;(g!=\" \"||i!=A.head)&&(r=l),i=s}return i}),zq=t=>Oq(t,!1),DfA=t=>Oq(t,!0);var wfA=t=>N3(t,e=>{let A=t.lineBlockAt(e.head).to;return e.head<A?A:Math.min(t.state.doc.length,e.head+1)});var yfA=t=>N3(t,e=>{let A=t.moveToLineBoundary(e,!1).head;return e.head>A?A:Math.max(0,e.head-1)}),vfA=t=>N3(t,e=>{let A=t.moveToLineBoundary(e,!0).head;return e.head<A?A:Math.min(t.state.doc.length,e.head+1)});var bfA=({state:t,dispatch:e})=>{if(t.readOnly)return!1;let A=t.changeByRange(i=>({changes:{from:i.from,to:i.to,insert:Bn.of([\"\",\"\"])},range:ce.cursor(i.from)}));return e(t.update(A,{scrollIntoView:!0,userEvent:\"input\"})),!0},MfA=({state:t,dispatch:e})=>{if(t.readOnly)return!1;let A=t.changeByRange(i=>{if(!i.empty||i.from==0||i.from==t.doc.length)return{range:i};let n=i.from,o=t.doc.lineAt(n),a=n==o.from?n-1:_a(o.text,n-o.from,!1)+o.from,r=n==o.to?n+1:_a(o.text,n-o.from,!0)+o.from;return{changes:{from:a,to:r,insert:t.doc.slice(n,r).append(t.doc.slice(a,n))},range:ce.cursor(r)}});return A.changes.empty?!1:(e(t.update(A,{scrollIntoView:!0,userEvent:\"move.character\"})),!0)};function p5(t){let e=[],A=-1;for(let i of t.selection.ranges){let n=t.doc.lineAt(i.from),o=t.doc.lineAt(i.to);if(!i.empty&&i.to==o.from&&(o=t.doc.lineAt(i.to-1)),A>=n.number){let a=e[e.length-1];a.to=o.to,a.ranges.push(i)}else e.push({from:n.from,to:o.to,ranges:[i]});A=o.number+1}return e}function Pq(t,e,A){if(t.readOnly)return!1;let i=[],n=[];for(let o of p5(t)){if(A?o.to==t.doc.length:o.from==0)continue;let a=t.doc.lineAt(A?o.to+1:o.from-1),r=a.length+1;if(A){i.push({from:o.to,to:a.to},{from:o.from,insert:a.text+t.lineBreak});for(let s of o.ranges)n.push(ce.range(Math.min(t.doc.length,s.anchor+r),Math.min(t.doc.length,s.head+r)))}else{i.push({from:a.from,to:o.from},{from:o.to,insert:t.lineBreak+a.text});for(let s of o.ranges)n.push(ce.range(s.anchor-r,s.head-r))}}return i.length?(e(t.update({changes:i,scrollIntoView:!0,selection:ce.create(n,t.selection.mainIndex),userEvent:\"move.line\"})),!0):!1}var kfA=({state:t,dispatch:e})=>Pq(t,e,!1),SfA=({state:t,dispatch:e})=>Pq(t,e,!0);function jq(t,e,A){if(t.readOnly)return!1;let i=[];for(let o of p5(t))A?i.push({from:o.from,insert:t.doc.slice(o.from,o.to)+t.lineBreak}):i.push({from:o.to,insert:t.lineBreak+t.doc.slice(o.from,o.to)});let n=t.changes(i);return e(t.update({changes:n,selection:t.selection.map(n,A?1:-1),scrollIntoView:!0,userEvent:\"input.copyline\"})),!0}var xfA=({state:t,dispatch:e})=>jq(t,e,!1),RfA=({state:t,dispatch:e})=>jq(t,e,!0),NfA=t=>{if(t.state.readOnly)return!1;let{state:e}=t,A=e.changes(p5(e).map(({from:n,to:o})=>(n>0?n--:o<e.doc.length&&o++,{from:n,to:o}))),i=wQ(e.selection,n=>{let o;if(t.lineWrapping){let a=t.lineBlockAt(n.head),r=t.coordsAtPos(n.head,n.assoc||1);r&&(o=a.bottom+t.documentTop-r.bottom+t.defaultLineHeight/2)}return t.moveVertically(n,!0,o)}).map(A);return t.dispatch({changes:A,selection:i,scrollIntoView:!0,userEvent:\"delete.line\"}),!0};function FfA(t,e){if(/\\(\\)|\\[\\]|\\{\\}/.test(t.sliceDoc(e-1,e+1)))return{from:e,to:e};let A=Br(t).resolveInner(e),i=A.childBefore(e),n=A.childAfter(e),o;return i&&n&&i.to<=e&&n.from>=e&&(o=i.type.prop(wi.closedBy))&&o.indexOf(n.name)>-1&&t.doc.lineAt(i.to).from==t.doc.lineAt(n.from).from&&!/\\S/.test(t.sliceDoc(i.to,n.from))?{from:i.to,to:n.from}:null}var pq=qq(!1),LfA=qq(!0);function qq(t){return({state:e,dispatch:A})=>{if(e.readOnly)return!1;let i=e.changeByRange(n=>{let{from:o,to:a}=n,r=e.doc.lineAt(o),s=!t&&o==a&&FfA(e,o);t&&(o=a=(a<=r.to?r:e.doc.lineAt(a)).to);let g=new v1(e,{simulateBreak:o,simulateDoubleBreak:!!s}),l=h5(g,o);for(l==null&&(l=q0(/^\\s*/.exec(e.doc.lineAt(o).text)[0],e.tabSize));a<r.to&&/\\s/.test(r.text[a-r.from]);)a++;s?{from:o,to:a}=s:o>r.from&&o<r.from+100&&!/\\S/.test(r.text.slice(0,o))&&(o=r.from);let C=[\"\",pQ(e,l)];return s&&C.push(pQ(e,g.lineIndent(r.from,-1))),{changes:{from:o,to:a,insert:Bn.of(C)},range:ce.cursor(o+1+C[1].length)}});return A(e.update(i,{scrollIntoView:!0,userEvent:\"input\"})),!0}}function YS(t,e){let A=-1;return t.changeByRange(i=>{let n=[];for(let a=i.from;a<=i.to;){let r=t.doc.lineAt(a);r.number>A&&(i.empty||i.to>r.from)&&(e(r,n,i),A=r.number),a=r.to+1}let o=t.changes(n);return{changes:n,range:ce.range(o.mapPos(i.anchor,1),o.mapPos(i.head,1))}})}var _fA=({state:t,dispatch:e})=>{if(t.readOnly)return!1;let A=Object.create(null),i=new v1(t,{overrideIndentation:o=>{let a=A[o];return a??-1}}),n=YS(t,(o,a,r)=>{let s=h5(i,o.from);if(s==null)return;/\\S/.test(o.text)||(s=0);let g=/^\\s*/.exec(o.text)[0],l=pQ(t,s);(g!=l||r.from<o.from+g.length)&&(A[o.from]=s,a.push({from:o.from,to:o.from+g.length,insert:l}))});return n.changes.empty||e(t.update(n,{userEvent:\"indent\"})),!0},Vq=({state:t,dispatch:e})=>t.readOnly?!1:(e(t.update(YS(t,(A,i)=>{i.push({from:A.from,insert:t.facet(M1)})}),{userEvent:\"input.indent\"})),!0),Wq=({state:t,dispatch:e})=>t.readOnly?!1:(e(t.update(YS(t,(A,i)=>{let n=/^\\s*/.exec(A.text)[0];if(!n)return;let o=q0(n,t.tabSize),a=0,r=pQ(t,Math.max(0,o-Xl(t)));for(;a<n.length&&a<r.length&&n.charCodeAt(a)==r.charCodeAt(a);)a++;i.push({from:A.from+a,to:A.from+n.length,insert:r.slice(a)})}),{userEvent:\"delete.dedent\"})),!0),GfA=t=>(t.setTabFocusMode(),!0);var KfA=[{key:\"Ctrl-b\",run:yq,shift:Fq,preventDefault:!0},{key:\"Ctrl-f\",run:vq,shift:Lq},{key:\"Ctrl-p\",run:kq,shift:Kq},{key:\"Ctrl-n\",run:Sq,shift:Uq},{key:\"Ctrl-a\",run:ifA,shift:BfA},{key:\"Ctrl-e\",run:nfA,shift:QfA},{key:\"Ctrl-d\",run:Tq},{key:\"Ctrl-h\",run:KS},{key:\"Ctrl-k\",run:wfA},{key:\"Ctrl-Alt-h\",run:zq},{key:\"Ctrl-o\",run:bfA},{key:\"Ctrl-t\",run:MfA},{key:\"Ctrl-v\",run:GS}],UfA=[{key:\"ArrowLeft\",run:yq,shift:Fq,preventDefault:!0},{key:\"Mod-ArrowLeft\",mac:\"Alt-ArrowLeft\",run:quA,shift:rfA,preventDefault:!0},{mac:\"Cmd-ArrowLeft\",run:efA,shift:IfA,preventDefault:!0},{key:\"ArrowRight\",run:vq,shift:Lq,preventDefault:!0},{key:\"Mod-ArrowRight\",mac:\"Alt-ArrowRight\",run:VuA,shift:sfA,preventDefault:!0},{mac:\"Cmd-ArrowRight\",run:tfA,shift:dfA,preventDefault:!0},{key:\"ArrowUp\",run:kq,shift:Kq,preventDefault:!0},{mac:\"Cmd-ArrowUp\",run:hq,shift:fq},{mac:\"Ctrl-ArrowUp\",run:Bq,shift:Qq},{key:\"ArrowDown\",run:Sq,shift:Uq,preventDefault:!0},{mac:\"Cmd-ArrowDown\",run:uq,shift:mq},{mac:\"Ctrl-ArrowDown\",run:GS,shift:Eq},{key:\"PageUp\",run:Bq,shift:Qq},{key:\"PageDown\",run:GS,shift:Eq},{key:\"Home\",run:AfA,shift:CfA,preventDefault:!0},{key:\"Mod-Home\",run:hq,shift:fq},{key:\"End\",run:$uA,shift:cfA,preventDefault:!0},{key:\"Mod-End\",run:uq,shift:mq},{key:\"Enter\",run:pq,shift:pq},{key:\"Mod-a\",run:EfA},{key:\"Backspace\",run:KS,shift:KS,preventDefault:!0},{key:\"Delete\",run:Tq,preventDefault:!0},{key:\"Mod-Backspace\",mac:\"Alt-Backspace\",run:zq,preventDefault:!0},{key:\"Mod-Delete\",mac:\"Alt-Delete\",run:DfA,preventDefault:!0},{mac:\"Mod-Backspace\",run:yfA,preventDefault:!0},{mac:\"Mod-Delete\",run:vfA,preventDefault:!0}].concat(KfA.map(t=>({mac:t.key,run:t.run,shift:t.shift}))),Zq=[{key:\"Alt-ArrowLeft\",mac:\"Ctrl-ArrowLeft\",run:ZuA,shift:gfA},{key:\"Alt-ArrowRight\",mac:\"Ctrl-ArrowRight\",run:XuA,shift:lfA},{key:\"Alt-ArrowUp\",run:kfA},{key:\"Shift-Alt-ArrowUp\",run:xfA},{key:\"Alt-ArrowDown\",run:SfA},{key:\"Shift-Alt-ArrowDown\",run:RfA},{key:\"Mod-Alt-ArrowUp\",run:ffA},{key:\"Mod-Alt-ArrowDown\",run:mfA},{key:\"Escape\",run:pfA},{key:\"Mod-Enter\",run:LfA},{key:\"Alt-l\",mac:\"Ctrl-l\",run:hfA},{key:\"Mod-i\",run:ufA,preventDefault:!0},{key:\"Mod-[\",run:Wq},{key:\"Mod-]\",run:Vq},{key:\"Mod-Alt-\\\\\",run:_fA},{key:\"Shift-Mod-k\",run:NfA},{key:\"Shift-Mod-\\\\\",run:afA},{key:\"Mod-/\",run:YuA},{key:\"Alt-A\",run:TuA},{key:\"Ctrl-m\",mac:\"Shift-Alt-m\",run:GfA}].concat(UfA),Xq={key:\"Tab\",run:Vq,shift:Wq};var y5=class{constructor(e,A,i){this.from=e,this.to=A,this.diagnostic=i}},k1=class t{constructor(e,A,i){this.diagnostics=e,this.panel=A,this.selected=i}static init(e,A,i){let n=i.facet(n0).markerFilter;n&&(e=n(e,i));let o=e.slice().sort((d,B)=>d.from-B.from||d.to-B.to),a=new Nr,r=[],s=0,g=i.doc.iter(),l=0,C=i.doc.length;for(let d=0;;){let B=d==o.length?null:o[d];if(!B&&!r.length)break;let Q,E;if(r.length)Q=s,E=r.reduce((R,M)=>Math.min(R,M.to),B&&B.from>Q?B.from:1e8);else{if(Q=B.from,Q>C)break;E=B.to,r.push(B),d++}for(;d<o.length;){let R=o[d];if(R.from==Q&&(R.to>R.from||R.to==Q))r.push(R),d++,E=Math.min(R.to,E);else{E=Math.min(R.from,E);break}}E=Math.min(E,C);let f=!1;if(r.some(R=>R.from==Q&&(R.to==E||E==C))&&(f=Q==E,!f&&E-Q<10)){let R=Q-(l+g.value.length);R>0&&(g.next(R),l=Q);for(let M=Q;;){if(M>=E){f=!0;break}if(!g.lineBreak&&l+g.value.length>M)break;M=l+g.value.length,l+=g.value.length,g.next()}}let b=gV(r);if(f)a.add(Q,Q,vt.widget({widget:new HS(b),diagnostics:r.slice()}));else{let R=r.reduce((M,v)=>v.markClass?M+\" \"+v.markClass:M,\"\");a.add(Q,E,vt.mark({class:\"cm-lintRange cm-lintRange-\"+b+R,diagnostics:r.slice(),inclusiveEnd:r.some(M=>M.to>E)}))}if(s=E,s==C)break;for(let R=0;R<r.length;R++)r[R].to<=s&&r.splice(R--,1)}let I=a.finish();return new t(I,A,K2(I))}};function K2(t,e=null,A=0){let i=null;return t.between(A,1e9,(n,o,{spec:a})=>{if(!(e&&a.diagnostics.indexOf(e)<0))if(!i)i=new y5(n,o,e||a.diagnostics[0]);else{if(a.diagnostics.indexOf(i.diagnostic)<0)return!1;i=new y5(i.from,o,i.diagnostic)}}),i}function eV(t,e){let A=e.pos,i=e.end||A,n=t.state.facet(n0).hideOn(t,A,i);if(n!=null)return n;let o=t.startState.doc.lineAt(e.pos);return!!(t.effects.some(a=>a.is(M5))||t.changes.touchesRange(o.from,Math.max(o.to,i)))}function tV(t,e){return t.field(ug,!1)?e:e.concat(Ui.appendConfig.of(cV))}function JfA(t,e){return{effects:tV(t,[M5.of(e)])}}var M5=Ui.define(),OS=Ui.define(),iV=Ui.define(),ug=Qa.define({create(){return new k1(vt.none,null,null)},update(t,e){if(e.docChanged&&t.diagnostics.size){let A=t.diagnostics.map(e.changes),i=null,n=t.panel;if(t.selected){let o=e.changes.mapPos(t.selected.from,1);i=K2(A,t.selected.diagnostic,o)||K2(A,null,o)}!A.size&&n&&e.state.facet(n0).autoPanel&&(n=null),t=new k1(A,n,i)}for(let A of e.effects)if(A.is(M5)){let i=e.state.facet(n0).autoPanel?A.value.length?F3.open:null:t.panel;t=k1.init(A.value,i,e.state)}else A.is(OS)?t=new k1(t.diagnostics,A.value?F3.open:null,t.selected):A.is(iV)&&(t=new k1(t.diagnostics,t.panel,A.value));return t},provide:t=>[m1.from(t,e=>e.panel),ai.decorations.from(t,e=>e.diagnostics)]});var YfA=vt.mark({class:\"cm-lintRange cm-lintRange-active\"});function HfA(t,e,A){let{diagnostics:i}=t.state.field(ug),n,o=-1,a=-1;i.between(e-(A<0?1:0),e+(A>0?1:0),(s,g,{spec:l})=>{if(e>=s&&e<=g&&(s==g||(e>s||A>0)&&(e<g||A<0)))return n=l.diagnostics,o=s,a=g,!1});let r=t.state.facet(n0).tooltipFilter;return n&&r&&(n=r(n,t.state)),n?{pos:o,end:a,above:t.state.doc.lineAt(o).to<a,create(){return{dom:nV(t,n)}}}:null}function nV(t,e){return Pn(\"ul\",{class:\"cm-tooltip-lint\"},e.map(A=>sV(t,A,!1)))}var TfA=t=>{let e=t.state.field(ug,!1);(!e||!e.panel)&&t.dispatch({effects:tV(t.state,[OS.of(!0)])});let A=f3(t,F3.open);return A&&A.dom.querySelector(\".cm-panel-lint ul\").focus(),!0},$q=t=>{let e=t.state.field(ug,!1);return!e||!e.panel?!1:(t.dispatch({effects:OS.of(!1)}),!0)},OfA=t=>{let e=t.state.field(ug,!1);if(!e)return!1;let A=t.state.selection.main,i=K2(e.diagnostics,null,A.to+1);return!i&&(i=K2(e.diagnostics,null,0),!i||i.from==A.from&&i.to==A.to)?!1:(t.dispatch({selection:{anchor:i.from,head:i.to},scrollIntoView:!0}),!0)};var oV=[{key:\"Mod-Shift-m\",run:TfA,preventDefault:!0},{key:\"F8\",run:OfA}],zfA=ho.fromClass(class{constructor(t){this.view=t,this.timeout=-1,this.set=!0;let{delay:e}=t.state.facet(n0);this.lintTime=Date.now()+e,this.run=this.run.bind(this),this.timeout=setTimeout(this.run,e)}run(){clearTimeout(this.timeout);let t=Date.now();if(t<this.lintTime-10)this.timeout=setTimeout(this.run,this.lintTime-t);else{this.set=!1;let{state:e}=this.view,{sources:A}=e.facet(n0);A.length&&PfA(A.map(i=>Promise.resolve(i(this.view))),i=>{this.view.state.doc==e.doc&&this.view.dispatch(JfA(this.view.state,i.reduce((n,o)=>n.concat(o))))},i=>{dr(this.view.state,i)})}}update(t){let e=t.state.facet(n0);(t.docChanged||e!=t.startState.facet(n0)||e.needsRefresh&&e.needsRefresh(t))&&(this.lintTime=Date.now()+e.delay,this.set||(this.set=!0,this.timeout=setTimeout(this.run,e.delay)))}force(){this.set&&(this.lintTime=Date.now(),this.run())}destroy(){clearTimeout(this.timeout)}});function PfA(t,e,A){let i=[],n=-1;for(let o of t)o.then(a=>{i.push(a),clearTimeout(n),i.length==t.length?e(i):n=setTimeout(()=>e(i),200)},A)}var n0=qe.define({combine(t){return BA({sources:t.map(e=>e.source).filter(e=>e!=null)},Ir(t.map(e=>e.config),{delay:750,markerFilter:null,tooltipFilter:null,needsRefresh:null,hideOn:()=>null},{delay:Math.max,markerFilter:AV,tooltipFilter:AV,needsRefresh:(e,A)=>e?A?i=>e(i)||A(i):e:A,hideOn:(e,A)=>e?A?(i,n,o)=>e(i,n,o)||A(i,n,o):e:A,autoPanel:(e,A)=>e||A}))}});function AV(t,e){return t?e?(A,i)=>e(t(A,i),i):t:e}function aV(t,e={}){return[n0.of({source:t,config:e}),zfA,cV]}function rV(t){let e=[];if(t)A:for(let{name:A}of t){for(let i=0;i<A.length;i++){let n=A[i];if(/[a-zA-Z]/.test(n)&&!e.some(o=>o.toLowerCase()==n.toLowerCase())){e.push(n);continue A}}e.push(\"\")}return e}function sV(t,e,A){var i;let n=A?rV(e.actions):[];return Pn(\"li\",{class:\"cm-diagnostic cm-diagnostic-\"+e.severity},Pn(\"span\",{class:\"cm-diagnosticText\"},e.renderMessage?e.renderMessage(t):e.message),(i=e.actions)===null||i===void 0?void 0:i.map((o,a)=>{let r=!1,s=d=>{if(d.preventDefault(),r)return;r=!0;let B=K2(t.state.field(ug).diagnostics,e);B&&o.apply(t,B.from,B.to)},{name:g}=o,l=n[a]?g.indexOf(n[a]):-1,C=l<0?g:[g.slice(0,l),Pn(\"u\",g.slice(l,l+1)),g.slice(l+1)],I=o.markClass?\" \"+o.markClass:\"\";return Pn(\"button\",{type:\"button\",class:\"cm-diagnosticAction\"+I,onclick:s,onmousedown:s,\"aria-label\":` Action: ${g}${l<0?\"\":` (access key \"${n[a]})\"`}.`},C)}),e.source&&Pn(\"div\",{class:\"cm-diagnosticSource\"},e.source))}var HS=class extends Ps{constructor(e){super(),this.sev=e}eq(e){return e.sev==this.sev}toDOM(){return Pn(\"span\",{class:\"cm-lintPoint cm-lintPoint-\"+this.sev})}},v5=class{constructor(e,A){this.diagnostic=A,this.id=\"item_\"+Math.floor(Math.random()*4294967295).toString(16),this.dom=sV(e,A,!0),this.dom.id=this.id,this.dom.setAttribute(\"role\",\"option\")}},F3=class t{constructor(e){this.view=e,this.items=[];let A=n=>{if(!(n.ctrlKey||n.altKey||n.metaKey)){if(n.keyCode==27)$q(this.view),this.view.focus();else if(n.keyCode==38||n.keyCode==33)this.moveSelection((this.selectedIndex-1+this.items.length)%this.items.length);else if(n.keyCode==40||n.keyCode==34)this.moveSelection((this.selectedIndex+1)%this.items.length);else if(n.keyCode==36)this.moveSelection(0);else if(n.keyCode==35)this.moveSelection(this.items.length-1);else if(n.keyCode==13)this.view.focus();else if(n.keyCode>=65&&n.keyCode<=90&&this.selectedIndex>=0){let{diagnostic:o}=this.items[this.selectedIndex],a=rV(o.actions);for(let r=0;r<a.length;r++)if(a[r].toUpperCase().charCodeAt(0)==n.keyCode){let s=K2(this.view.state.field(ug).diagnostics,o);s&&o.actions[r].apply(e,s.from,s.to)}}else return;n.preventDefault()}},i=n=>{for(let o=0;o<this.items.length;o++)this.items[o].dom.contains(n.target)&&this.moveSelection(o)};this.list=Pn(\"ul\",{tabIndex:0,role:\"listbox\",\"aria-label\":this.view.state.phrase(\"Diagnostics\"),onkeydown:A,onclick:i}),this.dom=Pn(\"div\",{class:\"cm-panel-lint\"},this.list,Pn(\"button\",{type:\"button\",name:\"close\",\"aria-label\":this.view.state.phrase(\"close\"),onclick:()=>$q(this.view)},\"\\xD7\")),this.update()}get selectedIndex(){let e=this.view.state.field(ug).selected;if(!e)return-1;for(let A=0;A<this.items.length;A++)if(this.items[A].diagnostic==e.diagnostic)return A;return-1}update(){let{diagnostics:e,selected:A}=this.view.state.field(ug),i=0,n=!1,o=null,a=new Set;for(e.between(0,this.view.state.doc.length,(r,s,{spec:g})=>{for(let l of g.diagnostics){if(a.has(l))continue;a.add(l);let C=-1,I;for(let d=i;d<this.items.length;d++)if(this.items[d].diagnostic==l){C=d;break}C<0?(I=new v5(this.view,l),this.items.splice(i,0,I),n=!0):(I=this.items[C],C>i&&(this.items.splice(i,C-i),n=!0)),A&&I.diagnostic==A.diagnostic?I.dom.hasAttribute(\"aria-selected\")||(I.dom.setAttribute(\"aria-selected\",\"true\"),o=I):I.dom.hasAttribute(\"aria-selected\")&&I.dom.removeAttribute(\"aria-selected\"),i++}});i<this.items.length&&!(this.items.length==1&&this.items[0].diagnostic.from<0);)n=!0,this.items.pop();this.items.length==0&&(this.items.push(new v5(this.view,{from:-1,to:-1,severity:\"info\",message:this.view.state.phrase(\"No diagnostics\")})),n=!0),o?(this.list.setAttribute(\"aria-activedescendant\",o.id),this.view.requestMeasure({key:this,read:()=>({sel:o.dom.getBoundingClientRect(),panel:this.list.getBoundingClientRect()}),write:({sel:r,panel:s})=>{let g=s.height/this.list.offsetHeight;r.top<s.top?this.list.scrollTop-=(s.top-r.top)/g:r.bottom>s.bottom&&(this.list.scrollTop+=(r.bottom-s.bottom)/g)}})):this.selectedIndex<0&&this.list.removeAttribute(\"aria-activedescendant\"),n&&this.sync()}sync(){let e=this.list.firstChild;function A(){let i=e;e=i.nextSibling,i.remove()}for(let i of this.items)if(i.dom.parentNode==this.list){for(;e!=i.dom;)A();e=i.dom.nextSibling}else this.list.insertBefore(i.dom,e);for(;e;)A()}moveSelection(e){if(this.selectedIndex<0)return;let A=this.view.state.field(ug),i=K2(A.diagnostics,this.items[e].diagnostic);i&&this.view.dispatch({selection:{anchor:i.from,head:i.to},scrollIntoView:!0,effects:iV.of(i)})}static open(e){return new t(e)}};function w5(t,e='viewBox=\"0 0 40 40\"'){return`url('data:image/svg+xml,<svg xmlns=\"http://www.w3.org/2000/svg\" ${e}>${encodeURIComponent(t)}</svg>')`}function D5(t){return w5(`<path d=\"m0 2.5 l2 -1.5 l1 0 l2 1.5 l1 0\" stroke=\"${t}\" fill=\"none\" stroke-width=\".7\"/>`,'width=\"6\" height=\"3\"')}var jfA=ai.baseTheme({\".cm-diagnostic\":{padding:\"3px 6px 3px 8px\",marginLeft:\"-1px\",display:\"block\",whiteSpace:\"pre-wrap\"},\".cm-diagnostic-error\":{borderLeft:\"5px solid #d11\"},\".cm-diagnostic-warning\":{borderLeft:\"5px solid orange\"},\".cm-diagnostic-info\":{borderLeft:\"5px solid #999\"},\".cm-diagnostic-hint\":{borderLeft:\"5px solid #66d\"},\".cm-diagnosticAction\":{font:\"inherit\",border:\"none\",padding:\"2px 4px\",backgroundColor:\"#444\",color:\"white\",borderRadius:\"3px\",marginLeft:\"8px\",cursor:\"pointer\"},\".cm-diagnosticSource\":{fontSize:\"70%\",opacity:.7},\".cm-lintRange\":{backgroundPosition:\"left bottom\",backgroundRepeat:\"repeat-x\",paddingBottom:\"0.7px\"},\".cm-lintRange-error\":{backgroundImage:D5(\"#d11\")},\".cm-lintRange-warning\":{backgroundImage:D5(\"orange\")},\".cm-lintRange-info\":{backgroundImage:D5(\"#999\")},\".cm-lintRange-hint\":{backgroundImage:D5(\"#66d\")},\".cm-lintRange-active\":{backgroundColor:\"#ffdd9980\"},\".cm-tooltip-lint\":{padding:0,margin:0},\".cm-lintPoint\":{position:\"relative\",\"&:after\":{content:'\"\"',position:\"absolute\",bottom:0,left:\"-2px\",borderLeft:\"3px solid transparent\",borderRight:\"3px solid transparent\",borderBottom:\"4px solid #d11\"}},\".cm-lintPoint-warning\":{\"&:after\":{borderBottomColor:\"orange\"}},\".cm-lintPoint-info\":{\"&:after\":{borderBottomColor:\"#999\"}},\".cm-lintPoint-hint\":{\"&:after\":{borderBottomColor:\"#66d\"}},\".cm-panel.cm-panel-lint\":{position:\"relative\",\"& ul\":{maxHeight:\"100px\",overflowY:\"auto\",\"& [aria-selected]\":{backgroundColor:\"#ddd\",\"& u\":{textDecoration:\"underline\"}},\"&:focus [aria-selected]\":{background_fallback:\"#bdf\",backgroundColor:\"Highlight\",color_fallback:\"white\",color:\"HighlightText\"},\"& u\":{textDecoration:\"none\"},padding:0,margin:0},\"& [name=close]\":{position:\"absolute\",top:\"0\",right:\"2px\",background:\"inherit\",border:\"none\",font:\"inherit\",padding:0,margin:0}},\"&dark .cm-lintRange-active\":{backgroundColor:\"#86714a80\"},\"&dark .cm-panel.cm-panel-lint ul\":{\"& [aria-selected]\":{backgroundColor:\"#2e343e\"}}});function qfA(t){return t==\"error\"?4:t==\"warning\"?3:t==\"info\"?2:1}function gV(t){let e=\"hint\",A=1;for(let i of t){let n=qfA(i.severity);n>A&&(A=n,e=i.severity)}return e}var b5=class extends qs{constructor(e){super(),this.diagnostics=e,this.severity=gV(e)}toDOM(e){let A=document.createElement(\"div\");A.className=\"cm-lint-marker cm-lint-marker-\"+this.severity;let i=this.diagnostics,n=e.state.facet(k5).tooltipFilter;return n&&(i=n(i,e.state)),i.length&&(A.onmouseover=()=>WfA(e,A,i)),A}};function VfA(t,e){let A=i=>{let n=e.getBoundingClientRect();if(!(i.clientX>n.left-10&&i.clientX<n.right+10&&i.clientY>n.top-10&&i.clientY<n.bottom+10)){for(let o=i.target;o;o=o.parentNode)if(o.nodeType==1&&o.classList.contains(\"cm-tooltip-lint\"))return;window.removeEventListener(\"mousemove\",A),t.state.field(lV)&&t.dispatch({effects:zS.of(null)})}};window.addEventListener(\"mousemove\",A)}function WfA(t,e,A){function i(){let a=t.elementAtHeight(e.getBoundingClientRect().top+5-t.documentTop);t.coordsAtPos(a.from)&&t.dispatch({effects:zS.of({pos:a.from,above:!1,clip:!1,create(){return{dom:nV(t,A),getCoords:()=>e.getBoundingClientRect()}}})}),e.onmouseout=e.onmousemove=null,VfA(t,e)}let{hoverTime:n}=t.state.facet(k5),o=setTimeout(i,n);e.onmouseout=()=>{clearTimeout(o),e.onmouseout=e.onmousemove=null},e.onmousemove=()=>{clearTimeout(o),o=setTimeout(i,n)}}function ZfA(t,e){let A=Object.create(null);for(let n of e){let o=t.lineAt(n.from);(A[o.from]||(A[o.from]=[])).push(n)}let i=[];for(let n in A)i.push(new b5(A[n]).range(+n));return zn.of(i,!0)}var XfA=a5({class:\"cm-gutter-lint\",markers:t=>t.state.field(TS),widgetMarker:(t,e,A)=>{let i=[];return t.state.field(TS).between(A.from,A.to,(n,o,a)=>{n>A.from&&n<A.to&&i.push(...a.diagnostics)}),i.length?new b5(i):null}}),TS=Qa.define({create(){return zn.empty},update(t,e){t=t.map(e.changes);let A=e.state.facet(k5).markerFilter;for(let i of e.effects)if(i.is(M5)){let n=i.value;A&&(n=A(n||[],e.state)),t=ZfA(e.state.doc,n.slice(0))}return t}}),zS=Ui.define(),lV=Qa.define({create(){return null},update(t,e){return t&&e.docChanged&&(t=eV(e,t)?null:Ve(BA({},t),{pos:e.changes.mapPos(t.pos)})),e.effects.reduce((A,i)=>i.is(zS)?i.value:A,t)},provide:t=>EQ.from(t)}),$fA=ai.baseTheme({\".cm-gutter-lint\":{width:\"1.4em\",\"& .cm-gutterElement\":{padding:\".2em\"}},\".cm-lint-marker\":{width:\"1em\",height:\"1em\"},\".cm-lint-marker-info\":{content:w5('<path fill=\"#aaf\" stroke=\"#77e\" stroke-width=\"6\" stroke-linejoin=\"round\" d=\"M5 5L35 5L35 35L5 35Z\"/>')},\".cm-lint-marker-warning\":{content:w5('<path fill=\"#fe8\" stroke=\"#fd7\" stroke-width=\"6\" stroke-linejoin=\"round\" d=\"M20 6L37 35L3 35Z\"/>')},\".cm-lint-marker-error\":{content:w5('<circle cx=\"20\" cy=\"20\" r=\"15\" fill=\"#f87\" stroke=\"#f43\" stroke-width=\"6\"/>')}}),cV=[ug,ai.decorations.compute([ug],t=>{let{selected:e,panel:A}=t.field(ug);return!e||!A||e.from==e.to?vt.none:vt.set([YfA.range(e.from,e.to)])}),vj(HfA,{hideOn:eV}),jfA],k5=qe.define({combine(t){return Ir(t,{hoverTime:300,markerFilter:null,tooltipFilter:null})}});function CV(t={}){return[k5.of(t),TS,XfA,$fA,lV]}var jS=class t{constructor(e,A,i,n,o,a,r,s,g,l=0,C){this.p=e,this.stack=A,this.state=i,this.reducePos=n,this.pos=o,this.score=a,this.buffer=r,this.bufferBase=s,this.curContext=g,this.lookAhead=l,this.parent=C}toString(){return`[${this.stack.filter((e,A)=>A%3==0).concat(this.state)}]@${this.pos}${this.score?\"!\"+this.score:\"\"}`}static start(e,A,i=0){let n=e.parser.context;return new t(e,[],A,i,i,0,[],0,n?new S5(n,n.start):null,0,null)}get context(){return this.curContext?this.curContext.context:null}pushState(e,A){this.stack.push(this.state,A,this.bufferBase+this.buffer.length),this.state=e}reduce(e){var A;let i=e>>19,n=e&65535,{parser:o}=this.p,a=this.reducePos<this.pos-25&&this.setLookAhead(this.pos),r=o.dynamicPrecedence(n);if(r&&(this.score+=r),i==0){this.pushState(o.getGoto(this.state,n,!0),this.reducePos),n<o.minRepeatTerm&&this.storeNode(n,this.reducePos,this.reducePos,a?8:4,!0),this.reduceContext(n,this.reducePos);return}let s=this.stack.length-(i-1)*3-(e&262144?6:0),g=s?this.stack[s-2]:this.p.ranges[0].from,l=this.reducePos-g;l>=2e3&&!(!((A=this.p.parser.nodeSet.types[n])===null||A===void 0)&&A.isAnonymous)&&(g==this.p.lastBigReductionStart?(this.p.bigReductionCount++,this.p.lastBigReductionSize=l):this.p.lastBigReductionSize<l&&(this.p.bigReductionCount=1,this.p.lastBigReductionStart=g,this.p.lastBigReductionSize=l));let C=s?this.stack[s-1]:0,I=this.bufferBase+this.buffer.length-C;if(n<o.minRepeatTerm||e&131072){let d=o.stateFlag(this.state,1)?this.pos:this.reducePos;this.storeNode(n,g,d,I+4,!0)}if(e&262144)this.state=this.stack[s];else{let d=this.stack[s-3];this.state=o.getGoto(d,n,!0)}for(;this.stack.length>s;)this.stack.pop();this.reduceContext(n,g)}storeNode(e,A,i,n=4,o=!1){if(e==0&&(!this.stack.length||this.stack[this.stack.length-1]<this.buffer.length+this.bufferBase)){let a=this,r=this.buffer.length;if(r==0&&a.parent&&(r=a.bufferBase-a.parent.bufferBase,a=a.parent),r>0&&a.buffer[r-4]==0&&a.buffer[r-1]>-1){if(A==i)return;if(a.buffer[r-2]>=A){a.buffer[r-2]=i;return}}}if(!o||this.pos==i)this.buffer.push(e,A,i,n);else{let a=this.buffer.length;if(a>0&&(this.buffer[a-4]!=0||this.buffer[a-1]<0)){let r=!1;for(let s=a;s>0&&this.buffer[s-2]>i;s-=4)if(this.buffer[s-1]>=0){r=!0;break}if(r)for(;a>0&&this.buffer[a-2]>i;)this.buffer[a]=this.buffer[a-4],this.buffer[a+1]=this.buffer[a-3],this.buffer[a+2]=this.buffer[a-2],this.buffer[a+3]=this.buffer[a-1],a-=4,n>4&&(n-=4)}this.buffer[a]=e,this.buffer[a+1]=A,this.buffer[a+2]=i,this.buffer[a+3]=n}}shift(e,A,i,n){if(e&131072)this.pushState(e&65535,this.pos);else if((e&262144)==0){let o=e,{parser:a}=this.p;this.pos=n;let r=a.stateFlag(o,1);!r&&(n>i||A<=a.maxNode)&&(this.reducePos=n),this.pushState(o,r?i:Math.min(i,this.reducePos)),this.shiftContext(A,i),A<=a.maxNode&&this.buffer.push(A,i,n,4)}else this.pos=n,this.shiftContext(A,i),A<=this.p.parser.maxNode&&this.buffer.push(A,i,n,4)}apply(e,A,i,n){e&65536?this.reduce(e):this.shift(e,A,i,n)}useNode(e,A){let i=this.p.reused.length-1;(i<0||this.p.reused[i]!=e)&&(this.p.reused.push(e),i++);let n=this.pos;this.reducePos=this.pos=n+e.length,this.pushState(A,n),this.buffer.push(i,n,this.reducePos,-1),this.curContext&&this.updateContext(this.curContext.tracker.reuse(this.curContext.context,e,this,this.p.stream.reset(this.pos-e.length)))}split(){let e=this,A=e.buffer.length;for(;A>0&&e.buffer[A-2]>e.reducePos;)A-=4;let i=e.buffer.slice(A),n=e.bufferBase+A;for(;e&&n==e.bufferBase;)e=e.parent;return new t(this.p,this.stack.slice(),this.state,this.reducePos,this.pos,this.score,i,n,this.curContext,this.lookAhead,e)}recoverByDelete(e,A){let i=e<=this.p.parser.maxNode;i&&this.storeNode(e,this.pos,A,4),this.storeNode(0,this.pos,A,i?8:4),this.pos=this.reducePos=A,this.score-=190}canShift(e){for(let A=new qS(this);;){let i=this.p.parser.stateSlot(A.state,4)||this.p.parser.hasAction(A.state,e);if(i==0)return!1;if((i&65536)==0)return!0;A.reduce(i)}}recoverByInsert(e){if(this.stack.length>=300)return[];let A=this.p.parser.nextStates(this.state);if(A.length>8||this.stack.length>=120){let n=[];for(let o=0,a;o<A.length;o+=2)(a=A[o+1])!=this.state&&this.p.parser.hasAction(a,e)&&n.push(A[o],a);if(this.stack.length<120)for(let o=0;n.length<8&&o<A.length;o+=2){let a=A[o+1];n.some((r,s)=>s&1&&r==a)||n.push(A[o],a)}A=n}let i=[];for(let n=0;n<A.length&&i.length<4;n+=2){let o=A[n+1];if(o==this.state)continue;let a=this.split();a.pushState(o,this.pos),a.storeNode(0,a.pos,a.pos,4,!0),a.shiftContext(A[n],this.pos),a.reducePos=this.pos,a.score-=200,i.push(a)}return i}forceReduce(){let{parser:e}=this.p,A=e.stateSlot(this.state,5);if((A&65536)==0)return!1;if(!e.validAction(this.state,A)){let i=A>>19,n=A&65535,o=this.stack.length-i*3;if(o<0||e.getGoto(this.stack[o],n,!1)<0){let a=this.findForcedReduction();if(a==null)return!1;A=a}this.storeNode(0,this.pos,this.pos,4,!0),this.score-=100}return this.reducePos=this.pos,this.reduce(A),!0}findForcedReduction(){let{parser:e}=this.p,A=[],i=(n,o)=>{if(!A.includes(n))return A.push(n),e.allActions(n,a=>{if(!(a&393216))if(a&65536){let r=(a>>19)-o;if(r>1){let s=a&65535,g=this.stack.length-r*3;if(g>=0&&e.getGoto(this.stack[g],s,!1)>=0)return r<<19|65536|s}}else{let r=i(a,o+1);if(r!=null)return r}})};return i(this.state,0)}forceAll(){for(;!this.p.parser.stateFlag(this.state,2);)if(!this.forceReduce()){this.storeNode(0,this.pos,this.pos,4,!0);break}return this}get deadEnd(){if(this.stack.length!=3)return!1;let{parser:e}=this.p;return e.data[e.stateSlot(this.state,1)]==65535&&!e.stateSlot(this.state,4)}restart(){this.storeNode(0,this.pos,this.pos,4,!0),this.state=this.stack[0],this.stack.length=0}sameState(e){if(this.state!=e.state||this.stack.length!=e.stack.length)return!1;for(let A=0;A<this.stack.length;A+=3)if(this.stack[A]!=e.stack[A])return!1;return!0}get parser(){return this.p.parser}dialectEnabled(e){return this.p.parser.dialect.flags[e]}shiftContext(e,A){this.curContext&&this.updateContext(this.curContext.tracker.shift(this.curContext.context,e,this,this.p.stream.reset(A)))}reduceContext(e,A){this.curContext&&this.updateContext(this.curContext.tracker.reduce(this.curContext.context,e,this,this.p.stream.reset(A)))}emitContext(){let e=this.buffer.length-1;(e<0||this.buffer[e]!=-3)&&this.buffer.push(this.curContext.hash,this.pos,this.pos,-3)}emitLookAhead(){let e=this.buffer.length-1;(e<0||this.buffer[e]!=-4)&&this.buffer.push(this.lookAhead,this.pos,this.pos,-4)}updateContext(e){if(e!=this.curContext.context){let A=new S5(this.curContext.tracker,e);A.hash!=this.curContext.hash&&this.emitContext(),this.curContext=A}}setLookAhead(e){return e<=this.lookAhead?!1:(this.emitLookAhead(),this.lookAhead=e,!0)}close(){this.curContext&&this.curContext.tracker.strict&&this.emitContext(),this.lookAhead>0&&this.emitLookAhead()}},S5=class{constructor(e,A){this.tracker=e,this.context=A,this.hash=e.strict?e.hash(A):0}},qS=class{constructor(e){this.start=e,this.state=e.state,this.stack=e.stack,this.base=this.stack.length}reduce(e){let A=e&65535,i=e>>19;i==0?(this.stack==this.start.stack&&(this.stack=this.stack.slice()),this.stack.push(this.state,0,0),this.base+=3):this.base-=(i-1)*3;let n=this.start.p.parser.getGoto(this.stack[this.base-3],A,!0);this.state=n}},VS=class t{constructor(e,A,i){this.stack=e,this.pos=A,this.index=i,this.buffer=e.buffer,this.index==0&&this.maybeNext()}static create(e,A=e.bufferBase+e.buffer.length){return new t(e,A,A-e.bufferBase)}maybeNext(){let e=this.stack.parent;e!=null&&(this.index=this.stack.bufferBase-e.bufferBase,this.stack=e,this.buffer=e.buffer)}get id(){return this.buffer[this.index-4]}get start(){return this.buffer[this.index-3]}get end(){return this.buffer[this.index-2]}get size(){return this.buffer[this.index-1]}next(){this.index-=4,this.pos-=4,this.index==0&&this.maybeNext()}fork(){return new t(this.stack,this.pos,this.index)}};function L3(t,e=Uint16Array){if(typeof t!=\"string\")return t;let A=null;for(let i=0,n=0;i<t.length;){let o=0;for(;;){let a=t.charCodeAt(i++),r=!1;if(a==126){o=65535;break}a>=92&&a--,a>=34&&a--;let s=a-32;if(s>=46&&(s-=46,r=!0),o+=s,r)break;o*=46}A?A[n++]=o:A=new e(o)}return A}var yQ=class{constructor(){this.start=-1,this.value=-1,this.end=-1,this.extended=-1,this.lookAhead=0,this.mask=0,this.context=0}},IV=new yQ,WS=class{constructor(e,A){this.input=e,this.ranges=A,this.chunk=\"\",this.chunkOff=0,this.chunk2=\"\",this.chunk2Pos=0,this.next=-1,this.token=IV,this.rangeIndex=0,this.pos=this.chunkPos=A[0].from,this.range=A[0],this.end=A[A.length-1].to,this.readNext()}resolveOffset(e,A){let i=this.range,n=this.rangeIndex,o=this.pos+e;for(;o<i.from;){if(!n)return null;let a=this.ranges[--n];o-=i.from-a.to,i=a}for(;A<0?o>i.to:o>=i.to;){if(n==this.ranges.length-1)return null;let a=this.ranges[++n];o+=a.from-i.to,i=a}return o}clipPos(e){if(e>=this.range.from&&e<this.range.to)return e;for(let A of this.ranges)if(A.to>e)return Math.max(e,A.from);return this.end}peek(e){let A=this.chunkOff+e,i,n;if(A>=0&&A<this.chunk.length)i=this.pos+e,n=this.chunk.charCodeAt(A);else{let o=this.resolveOffset(e,1);if(o==null)return-1;if(i=o,i>=this.chunk2Pos&&i<this.chunk2Pos+this.chunk2.length)n=this.chunk2.charCodeAt(i-this.chunk2Pos);else{let a=this.rangeIndex,r=this.range;for(;r.to<=i;)r=this.ranges[++a];this.chunk2=this.input.chunk(this.chunk2Pos=i),i+this.chunk2.length>r.to&&(this.chunk2=this.chunk2.slice(0,r.to-i)),n=this.chunk2.charCodeAt(0)}}return i>=this.token.lookAhead&&(this.token.lookAhead=i+1),n}acceptToken(e,A=0){let i=A?this.resolveOffset(A,-1):this.pos;if(i==null||i<this.token.start)throw new RangeError(\"Token end out of bounds\");this.token.value=e,this.token.end=i}acceptTokenTo(e,A){this.token.value=e,this.token.end=A}getChunk(){if(this.pos>=this.chunk2Pos&&this.pos<this.chunk2Pos+this.chunk2.length){let{chunk:e,chunkPos:A}=this;this.chunk=this.chunk2,this.chunkPos=this.chunk2Pos,this.chunk2=e,this.chunk2Pos=A,this.chunkOff=this.pos-this.chunkPos}else{this.chunk2=this.chunk,this.chunk2Pos=this.chunkPos;let e=this.input.chunk(this.pos),A=this.pos+e.length;this.chunk=A>this.range.to?e.slice(0,this.range.to-this.pos):e,this.chunkPos=this.pos,this.chunkOff=0}}readNext(){return this.chunkOff>=this.chunk.length&&(this.getChunk(),this.chunkOff==this.chunk.length)?this.next=-1:this.next=this.chunk.charCodeAt(this.chunkOff)}advance(e=1){for(this.chunkOff+=e;this.pos+e>=this.range.to;){if(this.rangeIndex==this.ranges.length-1)return this.setDone();e-=this.range.to-this.pos,this.range=this.ranges[++this.rangeIndex],this.pos=this.range.from}return this.pos+=e,this.pos>=this.token.lookAhead&&(this.token.lookAhead=this.pos+1),this.readNext()}setDone(){return this.pos=this.chunkPos=this.end,this.range=this.ranges[this.rangeIndex=this.ranges.length-1],this.chunk=\"\",this.next=-1}reset(e,A){if(A?(this.token=A,A.start=e,A.lookAhead=e+1,A.value=A.extended=-1):this.token=IV,this.pos!=e){if(this.pos=e,e==this.end)return this.setDone(),this;for(;e<this.range.from;)this.range=this.ranges[--this.rangeIndex];for(;e>=this.range.to;)this.range=this.ranges[++this.rangeIndex];e>=this.chunkPos&&e<this.chunkPos+this.chunk.length?this.chunkOff=e-this.chunkPos:(this.chunk=\"\",this.chunkOff=0),this.readNext()}return this}read(e,A){if(e>=this.chunkPos&&A<=this.chunkPos+this.chunk.length)return this.chunk.slice(e-this.chunkPos,A-this.chunkPos);if(e>=this.chunk2Pos&&A<=this.chunk2Pos+this.chunk2.length)return this.chunk2.slice(e-this.chunk2Pos,A-this.chunk2Pos);if(e>=this.range.from&&A<=this.range.to)return this.input.read(e,A);let i=\"\";for(let n of this.ranges){if(n.from>=A)break;n.to>e&&(i+=this.input.read(Math.max(n.from,e),Math.min(n.to,A)))}return i}},U2=class{constructor(e,A){this.data=e,this.id=A}token(e,A){let{parser:i}=A.p;hV(this.data,e,A,this.id,i.data,i.tokenPrecTable)}};U2.prototype.contextual=U2.prototype.fallback=U2.prototype.extend=!1;var ZS=class{constructor(e,A,i){this.precTable=A,this.elseToken=i,this.data=typeof e==\"string\"?L3(e):e}token(e,A){let i=e.pos,n=0;for(;;){let o=e.next<0,a=e.resolveOffset(1,1);if(hV(this.data,e,A,0,this.data,this.precTable),e.token.value>-1)break;if(this.elseToken==null)return;if(o||n++,a==null)break;e.reset(a,e.token)}n&&(e.reset(i,e.token),e.acceptToken(this.elseToken,n))}};ZS.prototype.contextual=U2.prototype.fallback=U2.prototype.extend=!1;function hV(t,e,A,i,n,o){let a=0,r=1<<i,{dialect:s}=A.p.parser;A:for(;(r&t[a])!=0;){let g=t[a+1];for(let d=a+3;d<g;d+=2)if((t[d+1]&r)>0){let B=t[d];if(s.allows(B)&&(e.token.value==-1||e.token.value==B||emA(B,e.token.value,n,o))){e.acceptToken(B);break}}let l=e.next,C=0,I=t[a+2];if(e.next<0&&I>C&&t[g+I*3-3]==65535){a=t[g+I*3-1];continue A}for(;C<I;){let d=C+I>>1,B=g+d+(d<<1),Q=t[B],E=t[B+1]||65536;if(l<Q)I=d;else if(l>=E)C=d+1;else{a=t[B+2],e.advance();continue A}}break}}function dV(t,e,A){for(let i=e,n;(n=t[i])!=65535;i++)if(n==A)return i-e;return-1}function emA(t,e,A,i){let n=dV(A,i,e);return n<0||dV(A,i,t)<n}var fg=typeof process<\"u\"&&process.env&&/\\bparse\\b/.test(process.env.LOG),PS=null;function BV(t,e,A){let i=t.cursor(Ea.IncludeAnonymous);for(i.moveTo(e);;)if(!(A<0?i.childBefore(e):i.childAfter(e)))for(;;){if((A<0?i.to<e:i.from>e)&&!i.type.isError)return A<0?Math.max(0,Math.min(i.to-1,e-25)):Math.min(t.length,Math.max(i.from+1,e+25));if(A<0?i.prevSibling():i.nextSibling())break;if(!i.parent())return A<0?0:t.length}}var XS=class{constructor(e,A){this.fragments=e,this.nodeSet=A,this.i=0,this.fragment=null,this.safeFrom=-1,this.safeTo=-1,this.trees=[],this.start=[],this.index=[],this.nextFragment()}nextFragment(){let e=this.fragment=this.i==this.fragments.length?null:this.fragments[this.i++];if(e){for(this.safeFrom=e.openStart?BV(e.tree,e.from+e.offset,1)-e.offset:e.from,this.safeTo=e.openEnd?BV(e.tree,e.to+e.offset,-1)-e.offset:e.to;this.trees.length;)this.trees.pop(),this.start.pop(),this.index.pop();this.trees.push(e.tree),this.start.push(-e.offset),this.index.push(0),this.nextStart=this.safeFrom}else this.nextStart=1e9}nodeAt(e){if(e<this.nextStart)return null;for(;this.fragment&&this.safeTo<=e;)this.nextFragment();if(!this.fragment)return null;for(;;){let A=this.trees.length-1;if(A<0)return this.nextFragment(),null;let i=this.trees[A],n=this.index[A];if(n==i.children.length){this.trees.pop(),this.start.pop(),this.index.pop();continue}let o=i.children[n],a=this.start[A]+i.positions[n];if(a>e)return this.nextStart=a,null;if(o instanceof Ma){if(a==e){if(a<this.safeFrom)return null;let r=a+o.length;if(r<=this.safeTo){let s=o.prop(wi.lookAhead);if(!s||r+s<this.fragment.to)return o}}this.index[A]++,a+o.length>=Math.max(this.safeFrom,e)&&(this.trees.push(o),this.start.push(a),this.index.push(0))}else this.index[A]++,this.nextStart=a+o.length}}},$S=class{constructor(e,A){this.stream=A,this.tokens=[],this.mainToken=null,this.actions=[],this.tokens=e.tokenizers.map(i=>new yQ)}getActions(e){let A=0,i=null,{parser:n}=e.p,{tokenizers:o}=n,a=n.stateSlot(e.state,3),r=e.curContext?e.curContext.hash:0,s=0;for(let g=0;g<o.length;g++){if((1<<g&a)==0)continue;let l=o[g],C=this.tokens[g];if(!(i&&!l.fallback)&&((l.contextual||C.start!=e.pos||C.mask!=a||C.context!=r)&&(this.updateCachedToken(C,l,e),C.mask=a,C.context=r),C.lookAhead>C.end+25&&(s=Math.max(C.lookAhead,s)),C.value!=0)){let I=A;if(C.extended>-1&&(A=this.addActions(e,C.extended,C.end,A)),A=this.addActions(e,C.value,C.end,A),!l.extend&&(i=C,A>I))break}}for(;this.actions.length>A;)this.actions.pop();return s&&e.setLookAhead(s),!i&&e.pos==this.stream.end&&(i=new yQ,i.value=e.p.parser.eofTerm,i.start=i.end=e.pos,A=this.addActions(e,i.value,i.end,A)),this.mainToken=i,this.actions}getMainToken(e){if(this.mainToken)return this.mainToken;let A=new yQ,{pos:i,p:n}=e;return A.start=i,A.end=Math.min(i+1,n.stream.end),A.value=i==n.stream.end?n.parser.eofTerm:0,A}updateCachedToken(e,A,i){let n=this.stream.clipPos(i.pos);if(A.token(this.stream.reset(n,e),i),e.value>-1){let{parser:o}=i.p;for(let a=0;a<o.specialized.length;a++)if(o.specialized[a]==e.value){let r=o.specializers[a](this.stream.read(e.start,e.end),i);if(r>=0&&i.p.parser.dialect.allows(r>>1)){(r&1)==0?e.value=r>>1:e.extended=r>>1;break}}}else e.value=0,e.end=this.stream.clipPos(n+1)}putAction(e,A,i,n){for(let o=0;o<n;o+=3)if(this.actions[o]==e)return n;return this.actions[n++]=e,this.actions[n++]=A,this.actions[n++]=i,n}addActions(e,A,i,n){let{state:o}=e,{parser:a}=e.p,{data:r}=a;for(let s=0;s<2;s++)for(let g=a.stateSlot(o,s?2:1);;g+=3){if(r[g]==65535)if(r[g+1]==1)g=$0(r,g+2);else{n==0&&r[g+1]==2&&(n=this.putAction($0(r,g+2),A,i,n));break}r[g]==A&&(n=this.putAction($0(r,g+1),A,i,n))}return n}},Ax=class{constructor(e,A,i,n){this.parser=e,this.input=A,this.ranges=n,this.recovering=0,this.nextStackID=9812,this.minStackPos=0,this.reused=[],this.stoppedAt=null,this.lastBigReductionStart=-1,this.lastBigReductionSize=0,this.bigReductionCount=0,this.stream=new WS(A,n),this.tokens=new $S(e,this.stream),this.topTerm=e.top[1];let{from:o}=n[0];this.stacks=[jS.start(this,e.top[0],o)],this.fragments=i.length&&this.stream.end-o>e.bufferLength*4?new XS(i,e.nodeSet):null}get parsedPos(){return this.minStackPos}advance(){let e=this.stacks,A=this.minStackPos,i=this.stacks=[],n,o;if(this.bigReductionCount>300&&e.length==1){let[a]=e;for(;a.forceReduce()&&a.stack.length&&a.stack[a.stack.length-2]>=this.lastBigReductionStart;);this.bigReductionCount=this.lastBigReductionSize=0}for(let a=0;a<e.length;a++){let r=e[a];for(;;){if(this.tokens.mainToken=null,r.pos>A)i.push(r);else{if(this.advanceStack(r,i,e))continue;{n||(n=[],o=[]),n.push(r);let s=this.tokens.getMainToken(r);o.push(s.value,s.end)}}break}}if(!i.length){let a=n&&tmA(n);if(a)return fg&&console.log(\"Finish with \"+this.stackID(a)),this.stackToTree(a);if(this.parser.strict)throw fg&&n&&console.log(\"Stuck with token \"+(this.tokens.mainToken?this.parser.getName(this.tokens.mainToken.value):\"none\")),new SyntaxError(\"No parse at \"+A);this.recovering||(this.recovering=5)}if(this.recovering&&n){let a=this.stoppedAt!=null&&n[0].pos>this.stoppedAt?n[0]:this.runRecovery(n,o,i);if(a)return fg&&console.log(\"Force-finish \"+this.stackID(a)),this.stackToTree(a.forceAll())}if(this.recovering){let a=this.recovering==1?1:this.recovering*3;if(i.length>a)for(i.sort((r,s)=>s.score-r.score);i.length>a;)i.pop();i.some(r=>r.reducePos>A)&&this.recovering--}else if(i.length>1){A:for(let a=0;a<i.length-1;a++){let r=i[a];for(let s=a+1;s<i.length;s++){let g=i[s];if(r.sameState(g)||r.buffer.length>500&&g.buffer.length>500)if((r.score-g.score||r.buffer.length-g.buffer.length)>0)i.splice(s--,1);else{i.splice(a--,1);continue A}}}i.length>12&&(i.sort((a,r)=>r.score-a.score),i.splice(12,i.length-12))}this.minStackPos=i[0].pos;for(let a=1;a<i.length;a++)i[a].pos<this.minStackPos&&(this.minStackPos=i[a].pos);return null}stopAt(e){if(this.stoppedAt!=null&&this.stoppedAt<e)throw new RangeError(\"Can't move stoppedAt forward\");this.stoppedAt=e}advanceStack(e,A,i){let n=e.pos,{parser:o}=this,a=fg?this.stackID(e)+\" -> \":\"\";if(this.stoppedAt!=null&&n>this.stoppedAt)return e.forceReduce()?e:null;if(this.fragments){let g=e.curContext&&e.curContext.tracker.strict,l=g?e.curContext.hash:0;for(let C=this.fragments.nodeAt(n);C;){let I=this.parser.nodeSet.types[C.type.id]==C.type?o.getGoto(e.state,C.type.id):-1;if(I>-1&&C.length&&(!g||(C.prop(wi.contextHash)||0)==l))return e.useNode(C,I),fg&&console.log(a+this.stackID(e)+` (via reuse of ${o.getName(C.type.id)})`),!0;if(!(C instanceof Ma)||C.children.length==0||C.positions[0]>0)break;let d=C.children[0];if(d instanceof Ma&&C.positions[0]==0)C=d;else break}}let r=o.stateSlot(e.state,4);if(r>0)return e.reduce(r),fg&&console.log(a+this.stackID(e)+` (via always-reduce ${o.getName(r&65535)})`),!0;if(e.stack.length>=8400)for(;e.stack.length>6e3&&e.forceReduce(););let s=this.tokens.getActions(e);for(let g=0;g<s.length;){let l=s[g++],C=s[g++],I=s[g++],d=g==s.length||!i,B=d?e:e.split(),Q=this.tokens.mainToken;if(B.apply(l,C,Q?Q.start:B.pos,I),fg&&console.log(a+this.stackID(B)+` (via ${(l&65536)==0?\"shift\":`reduce of ${o.getName(l&65535)}`} for ${o.getName(C)} @ ${n}${B==e?\"\":\", split\"})`),d)return!0;B.pos>n?A.push(B):i.push(B)}return!1}advanceFully(e,A){let i=e.pos;for(;;){if(!this.advanceStack(e,null,null))return!1;if(e.pos>i)return QV(e,A),!0}}runRecovery(e,A,i){let n=null,o=!1;for(let a=0;a<e.length;a++){let r=e[a],s=A[a<<1],g=A[(a<<1)+1],l=fg?this.stackID(r)+\" -> \":\"\";if(r.deadEnd&&(o||(o=!0,r.restart(),fg&&console.log(l+this.stackID(r)+\" (restarted)\"),this.advanceFully(r,i))))continue;let C=r.split(),I=l;for(let d=0;d<10&&C.forceReduce()&&(fg&&console.log(I+this.stackID(C)+\" (via force-reduce)\"),!this.advanceFully(C,i));d++)fg&&(I=this.stackID(C)+\" -> \");for(let d of r.recoverByInsert(s))fg&&console.log(l+this.stackID(d)+\" (via recover-insert)\"),this.advanceFully(d,i);this.stream.end>r.pos?(g==r.pos&&(g++,s=0),r.recoverByDelete(s,g),fg&&console.log(l+this.stackID(r)+` (via recover-delete ${this.parser.getName(s)})`),QV(r,i)):(!n||n.score<C.score)&&(n=C)}return n}stackToTree(e){return e.close(),Ma.build({buffer:VS.create(e),nodeSet:this.parser.nodeSet,topID:this.topTerm,maxBufferLength:this.parser.bufferLength,reused:this.reused,start:this.ranges[0].from,length:e.pos-this.ranges[0].from,minRepeatType:this.parser.minRepeatTerm})}stackID(e){let A=(PS||(PS=new WeakMap)).get(e);return A||PS.set(e,A=String.fromCodePoint(this.nextStackID++)),A+e}};function QV(t,e){for(let A=0;A<e.length;A++){let i=e[A];if(i.pos==t.pos&&i.sameState(t)){e[A].score<t.score&&(e[A]=t);return}}e.push(t)}var ex=class{constructor(e,A,i){this.source=e,this.flags=A,this.disabled=i}allows(e){return!this.disabled||this.disabled[e]==0}};var x5=class t extends hQ{constructor(e){if(super(),this.wrappers=[],e.version!=14)throw new RangeError(`Parser version (${e.version}) doesn't match runtime version (14)`);let A=e.nodeNames.split(\" \");this.minRepeatTerm=A.length;for(let r=0;r<e.repeatNodeCount;r++)A.push(\"\");let i=Object.keys(e.topRules).map(r=>e.topRules[r][1]),n=[];for(let r=0;r<A.length;r++)n.push([]);function o(r,s,g){n[r].push([s,s.deserialize(String(g))])}if(e.nodeProps)for(let r of e.nodeProps){let s=r[0];typeof s==\"string\"&&(s=wi[s]);for(let g=1;g<r.length;){let l=r[g++];if(l>=0)o(l,s,r[g++]);else{let C=r[g+-l];for(let I=-l;I>0;I--)o(r[g++],s,C);g++}}}this.nodeSet=new p3(A.map((r,s)=>ts.define({name:s>=this.minRepeatTerm?void 0:r,id:s,props:n[s],top:i.indexOf(s)>-1,error:s==0,skipped:e.skippedNodes&&e.skippedNodes.indexOf(s)>-1}))),e.propSources&&(this.nodeSet=this.nodeSet.extend(...e.propSources)),this.strict=!1,this.bufferLength=1024;let a=L3(e.tokenData);this.context=e.context,this.specializerSpecs=e.specialized||[],this.specialized=new Uint16Array(this.specializerSpecs.length);for(let r=0;r<this.specializerSpecs.length;r++)this.specialized[r]=this.specializerSpecs[r].term;this.specializers=this.specializerSpecs.map(EV),this.states=L3(e.states,Uint32Array),this.data=L3(e.stateData),this.goto=L3(e.goto),this.maxTerm=e.maxTerm,this.tokenizers=e.tokenizers.map(r=>typeof r==\"number\"?new U2(a,r):r),this.topRules=e.topRules,this.dialects=e.dialects||{},this.dynamicPrecedences=e.dynamicPrecedences||null,this.tokenPrecTable=e.tokenPrec,this.termNames=e.termNames||null,this.maxNode=this.nodeSet.types.length-1,this.dialect=this.parseDialect(),this.top=this.topRules[Object.keys(this.topRules)[0]]}createParse(e,A,i){let n=new Ax(this,e,A,i);for(let o of this.wrappers)n=o(n,e,A,i);return n}getGoto(e,A,i=!1){let n=this.goto;if(A>=n[0])return-1;for(let o=n[A+1];;){let a=n[o++],r=a&1,s=n[o++];if(r&&i)return s;for(let g=o+(a>>1);o<g;o++)if(n[o]==e)return s;if(r)return-1}}hasAction(e,A){let i=this.data;for(let n=0;n<2;n++)for(let o=this.stateSlot(e,n?2:1),a;;o+=3){if((a=i[o])==65535)if(i[o+1]==1)a=i[o=$0(i,o+2)];else{if(i[o+1]==2)return $0(i,o+2);break}if(a==A||a==0)return $0(i,o+1)}return 0}stateSlot(e,A){return this.states[e*6+A]}stateFlag(e,A){return(this.stateSlot(e,0)&A)>0}validAction(e,A){return!!this.allActions(e,i=>i==A?!0:null)}allActions(e,A){let i=this.stateSlot(e,4),n=i?A(i):void 0;for(let o=this.stateSlot(e,1);n==null;o+=3){if(this.data[o]==65535)if(this.data[o+1]==1)o=$0(this.data,o+2);else break;n=A($0(this.data,o+1))}return n}nextStates(e){let A=[];for(let i=this.stateSlot(e,1);;i+=3){if(this.data[i]==65535)if(this.data[i+1]==1)i=$0(this.data,i+2);else break;if((this.data[i+2]&1)==0){let n=this.data[i+1];A.some((o,a)=>a&1&&o==n)||A.push(this.data[i],n)}}return A}configure(e){let A=Object.assign(Object.create(t.prototype),this);if(e.props&&(A.nodeSet=this.nodeSet.extend(...e.props)),e.top){let i=this.topRules[e.top];if(!i)throw new RangeError(`Invalid top rule name ${e.top}`);A.top=i}return e.tokenizers&&(A.tokenizers=this.tokenizers.map(i=>{let n=e.tokenizers.find(o=>o.from==i);return n?n.to:i})),e.specializers&&(A.specializers=this.specializers.slice(),A.specializerSpecs=this.specializerSpecs.map((i,n)=>{let o=e.specializers.find(r=>r.from==i.external);if(!o)return i;let a=Object.assign(Object.assign({},i),{external:o.to});return A.specializers[n]=EV(a),a})),e.contextTracker&&(A.context=e.contextTracker),e.dialect&&(A.dialect=this.parseDialect(e.dialect)),e.strict!=null&&(A.strict=e.strict),e.wrap&&(A.wrappers=A.wrappers.concat(e.wrap)),e.bufferLength!=null&&(A.bufferLength=e.bufferLength),A}hasWrappers(){return this.wrappers.length>0}getName(e){return this.termNames?this.termNames[e]:String(e<=this.maxNode&&this.nodeSet.types[e].name||e)}get eofTerm(){return this.maxNode+1}get topNode(){return this.nodeSet.types[this.top[1]]}dynamicPrecedence(e){let A=this.dynamicPrecedences;return A==null?0:A[e]||0}parseDialect(e){let A=Object.keys(this.dialects),i=A.map(()=>!1);if(e)for(let o of e.split(\" \")){let a=A.indexOf(o);a>=0&&(i[a]=!0)}let n=null;for(let o=0;o<A.length;o++)if(!i[o])for(let a=this.dialects[A[o]],r;(r=this.data[a++])!=65535;)(n||(n=new Uint8Array(this.maxTerm+1)))[r]=1;return new ex(e,i,n)}static deserialize(e){return new t(e)}};function $0(t,e){return t[e]|t[e+1]<<16}function tmA(t){let e=null;for(let A of t){let i=A.p.stoppedAt;(A.pos==A.p.stream.end||i!=null&&A.pos>i)&&A.p.parser.stateFlag(A.state,2)&&(!e||e.score<A.score)&&(e=A)}return e}function EV(t){if(t.external){let e=t.extend?1:0;return(A,i)=>t.external(A,i)<<1|e}return t.get}var imA=d5({String:xe.string,Number:xe.number,\"True False\":xe.bool,PropertyName:xe.propertyName,Null:xe.null,\", :\":xe.separator,\"[ ]\":xe.squareBracket,\"{ }\":xe.brace}),uV=x5.deserialize({version:14,states:\"$bOVQPOOOOQO'#Cb'#CbOnQPO'#CeOvQPO'#ClOOQO'#Cr'#CrQOQPOOOOQO'#Cg'#CgO}QPO'#CfO!SQPO'#CtOOQO,59P,59PO![QPO,59PO!aQPO'#CuOOQO,59W,59WO!iQPO,59WOVQPO,59QOqQPO'#CmO!nQPO,59`OOQO1G.k1G.kOVQPO'#CnO!vQPO,59aOOQO1G.r1G.rOOQO1G.l1G.lOOQO,59X,59XOOQO-E6k-E6kOOQO,59Y,59YOOQO-E6l-E6l\",stateData:\"#O~OeOS~OQSORSOSSOTSOWQO_ROgPO~OVXOgUO~O^[O~PVO[^O~O]_OVhX~OVaO~O]bO^iX~O^dO~O]_OVha~O]bO^ia~O\",goto:\"!kjPPPPPPkPPkqwPPPPk{!RPPP!XP!e!hXSOR^bQWQRf_TVQ_Q`WRg`QcZRicQTOQZRQe^RhbRYQR]R\",nodeNames:\"\\u26A0 JsonText True False Null Number String } { Object Property PropertyName : , ] [ Array\",maxTerm:25,nodeProps:[[\"isolate\",-2,6,11,\"\"],[\"openedBy\",7,\"{\",14,\"[\"],[\"closedBy\",8,\"}\",15,\"]\"]],propSources:[imA],skippedNodes:[0],repeatNodeCount:2,tokenData:\"(|~RaXY!WYZ!W]^!Wpq!Wrs!]|}$u}!O$z!Q!R%T!R![&c![!]&t!}#O&y#P#Q'O#Y#Z'T#b#c'r#h#i(Z#o#p(r#q#r(w~!]Oe~~!`Wpq!]qr!]rs!xs#O!]#O#P!}#P;'S!];'S;=`$o<%lO!]~!}Og~~#QXrs!]!P!Q!]#O#P!]#U#V!]#Y#Z!]#b#c!]#f#g!]#h#i!]#i#j#m~#pR!Q![#y!c!i#y#T#Z#y~#|R!Q![$V!c!i$V#T#Z$V~$YR!Q![$c!c!i$c#T#Z$c~$fR!Q![!]!c!i!]#T#Z!]~$rP;=`<%l!]~$zO]~~$}Q!Q!R%T!R![&c~%YRT~!O!P%c!g!h%w#X#Y%w~%fP!Q![%i~%nRT~!Q![%i!g!h%w#X#Y%w~%zR{|&T}!O&T!Q![&Z~&WP!Q![&Z~&`PT~!Q![&Z~&hST~!O!P%c!Q![&c!g!h%w#X#Y%w~&yO[~~'OO_~~'TO^~~'WP#T#U'Z~'^P#`#a'a~'dP#g#h'g~'jP#X#Y'm~'rOR~~'uP#i#j'x~'{P#`#a(O~(RP#`#a(U~(ZOS~~(^P#f#g(a~(dP#i#j(g~(jP#X#Y(m~(rOQ~~(wOW~~(|OV~\",tokenizers:[0],topRules:{JsonText:[0,1]},tokenPrec:0});var nmA=B5.define({name:\"json\",parser:uV.configure({props:[SS.add({Object:xS({except:/^\\s*\\}/}),Array:xS({except:/^\\s*\\]/})}),S3.add({\"Object Array\":Aq})]}),languageData:{closeBrackets:{brackets:[\"[\",\"{\",'\"']},indentOnInput:/^\\s*[\\}\\]]$/}});function fV(){return new Q5(nmA)}var mV=typeof String.prototype.normalize==\"function\"?t=>t.normalize(\"NFKD\"):t=>t,Y2=class{constructor(e,A,i=0,n=e.length,o,a){this.test=a,this.value={from:0,to:0},this.done=!1,this.matches=[],this.buffer=\"\",this.bufferPos=0,this.iter=e.iterRange(i,n),this.bufferStart=i,this.normalize=o?r=>o(mV(r)):mV,this.query=this.normalize(A)}peek(){if(this.bufferPos==this.buffer.length){if(this.bufferStart+=this.buffer.length,this.iter.next(),this.iter.done)return-1;this.bufferPos=0,this.buffer=this.iter.value}return Fr(this.buffer,this.bufferPos)}next(){for(;this.matches.length;)this.matches.pop();return this.nextOverlapping()}nextOverlapping(){for(;;){let e=this.peek();if(e<0)return this.done=!0,this;let A=t3(e),i=this.bufferStart+this.bufferPos;this.bufferPos+=Eg(e);let n=this.normalize(A);if(n.length)for(let o=0,a=i;;o++){let r=n.charCodeAt(o),s=this.match(r,a,this.bufferPos+this.bufferStart);if(o==n.length-1){if(s)return this.value=s,this;break}a==i&&o<A.length&&A.charCodeAt(o)==r&&a++}}}match(e,A,i){let n=null;for(let o=0;o<this.matches.length;o+=2){let a=this.matches[o],r=!1;this.query.charCodeAt(a)==e&&(a==this.query.length-1?n={from:this.matches[o+1],to:i}:(this.matches[o]++,r=!0)),r||(this.matches.splice(o,2),o-=2)}return this.query.charCodeAt(0)==e&&(this.query.length==1?n={from:A,to:i}:this.matches.push(1,A)),n&&this.test&&!this.test(n.from,n.to,this.buffer,this.bufferStart)&&(n=null),n}};typeof Symbol<\"u\"&&(Y2.prototype[Symbol.iterator]=function(){return this});var wV={from:-1,to:-1,match:/.*/.exec(\"\")},sx=\"gm\"+(/x/.unicode==null?\"\":\"u\"),F5=class{constructor(e,A,i,n=0,o=e.length){if(this.text=e,this.to=o,this.curLine=\"\",this.done=!1,this.value=wV,/\\\\[sWDnr]|\\n|\\r|\\[\\^/.test(A))return new _5(e,A,i,n,o);this.re=new RegExp(A,sx+(i?.ignoreCase?\"i\":\"\")),this.test=i?.test,this.iter=e.iter();let a=e.lineAt(n);this.curLineStart=a.from,this.matchPos=G5(e,n),this.getLine(this.curLineStart)}getLine(e){this.iter.next(e),this.iter.lineBreak?this.curLine=\"\":(this.curLine=this.iter.value,this.curLineStart+this.curLine.length>this.to&&(this.curLine=this.curLine.slice(0,this.to-this.curLineStart)),this.iter.next())}nextLine(){this.curLineStart=this.curLineStart+this.curLine.length+1,this.curLineStart>this.to?this.curLine=\"\":this.getLine(0)}next(){for(let e=this.matchPos-this.curLineStart;;){this.re.lastIndex=e;let A=this.matchPos<=this.to&&this.re.exec(this.curLine);if(A){let i=this.curLineStart+A.index,n=i+A[0].length;if(this.matchPos=G5(this.text,n+(i==n?1:0)),i==this.curLineStart+this.curLine.length&&this.nextLine(),(i<n||i>this.value.to)&&(!this.test||this.test(i,n,A)))return this.value={from:i,to:n,match:A},this;e=this.matchPos-this.curLineStart}else if(this.curLineStart+this.curLine.length<this.to)this.nextLine(),e=0;else return this.done=!0,this}}},tx=new WeakMap,L5=class t{constructor(e,A){this.from=e,this.text=A}get to(){return this.from+this.text.length}static get(e,A,i){let n=tx.get(e);if(!n||n.from>=i||n.to<=A){let r=new t(A,e.sliceString(A,i));return tx.set(e,r),r}if(n.from==A&&n.to==i)return n;let{text:o,from:a}=n;return a>A&&(o=e.sliceString(A,a)+o,a=A),n.to<i&&(o+=e.sliceString(n.to,i)),tx.set(e,new t(a,o)),new t(A,o.slice(A-a,i-a))}},_5=class{constructor(e,A,i,n,o){this.text=e,this.to=o,this.done=!1,this.value=wV,this.matchPos=G5(e,n),this.re=new RegExp(A,sx+(i?.ignoreCase?\"i\":\"\")),this.test=i?.test,this.flat=L5.get(e,n,this.chunkEnd(n+5e3))}chunkEnd(e){return e>=this.to?this.to:this.text.lineAt(e).to}next(){for(;;){let e=this.re.lastIndex=this.matchPos-this.flat.from,A=this.re.exec(this.flat.text);if(A&&!A[0]&&A.index==e&&(this.re.lastIndex=e+1,A=this.re.exec(this.flat.text)),A){let i=this.flat.from+A.index,n=i+A[0].length;if((this.flat.to>=this.to||A.index+A[0].length<=this.flat.text.length-10)&&(!this.test||this.test(i,n,A)))return this.value={from:i,to:n,match:A},this.matchPos=G5(this.text,n+(i==n?1:0)),this}if(this.flat.to==this.to)return this.done=!0,this;this.flat=L5.get(this.text,this.flat.from,this.chunkEnd(this.flat.from+this.flat.text.length*2))}}};typeof Symbol<\"u\"&&(F5.prototype[Symbol.iterator]=_5.prototype[Symbol.iterator]=function(){return this});function omA(t){try{return new RegExp(t,sx),!0}catch(e){return!1}}function G5(t,e){if(e>=t.length)return e;let A=t.lineAt(e),i;for(;e<A.to&&(i=A.text.charCodeAt(e-A.from))>=56320&&i<57344;)e++;return e}var amA=t=>{let{state:e}=t,A=String(e.doc.lineAt(t.state.selection.main.head).number),{close:i,result:n}=Mj(t,{label:e.phrase(\"Go to line\"),input:{type:\"text\",name:\"line\",value:A},focus:!0,submitLabel:e.phrase(\"go\")});return n.then(o=>{let a=o&&/^([+-])?(\\d+)?(:\\d+)?(%)?$/.exec(o.elements.line.value);if(!a){t.dispatch({effects:i});return}let r=e.doc.lineAt(e.selection.main.head),[,s,g,l,C]=a,I=l?+l.slice(1):0,d=g?+g:r.number;if(g&&C){let E=d/100;s&&(E=E*(s==\"-\"?-1:1)+r.number/e.doc.lines),d=Math.round(e.doc.lines*E)}else g&&s&&(d=d*(s==\"-\"?-1:1)+r.number);let B=e.doc.line(Math.max(1,Math.min(e.doc.lines,d))),Q=ce.cursor(B.from+Math.max(0,Math.min(I,B.length)));t.dispatch({effects:[i,ai.scrollIntoView(Q.from,{y:\"center\"})],selection:Q})}),!0},rmA={highlightWordAroundCursor:!1,minSelectionLength:1,maxMatches:100,wholeWords:!1},yV=qe.define({combine(t){return Ir(t,rmA,{highlightWordAroundCursor:(e,A)=>e||A,minSelectionLength:Math.min,maxMatches:Math.min})}});function vV(t){let e=[CmA,cmA];return t&&e.push(yV.of(t)),e}var smA=vt.mark({class:\"cm-selectionMatch\"}),gmA=vt.mark({class:\"cm-selectionMatch cm-selectionMatch-main\"});function pV(t,e,A,i){return(A==0||t(e.sliceDoc(A-1,A))!=yo.Word)&&(i==e.doc.length||t(e.sliceDoc(i,i+1))!=yo.Word)}function lmA(t,e,A,i){return t(e.sliceDoc(A,A+1))==yo.Word&&t(e.sliceDoc(i-1,i))==yo.Word}var cmA=ho.fromClass(class{constructor(t){this.decorations=this.getDeco(t)}update(t){(t.selectionSet||t.docChanged||t.viewportChanged)&&(this.decorations=this.getDeco(t.view))}getDeco(t){let e=t.state.facet(yV),{state:A}=t,i=A.selection;if(i.ranges.length>1)return vt.none;let n=i.main,o,a=null;if(n.empty){if(!e.highlightWordAroundCursor)return vt.none;let s=A.wordAt(n.head);if(!s)return vt.none;a=A.charCategorizer(n.head),o=A.sliceDoc(s.from,s.to)}else{let s=n.to-n.from;if(s<e.minSelectionLength||s>200)return vt.none;if(e.wholeWords){if(o=A.sliceDoc(n.from,n.to),a=A.charCategorizer(n.head),!(pV(a,A,n.from,n.to)&&lmA(a,A,n.from,n.to)))return vt.none}else if(o=A.sliceDoc(n.from,n.to),!o)return vt.none}let r=[];for(let s of t.visibleRanges){let g=new Y2(A.doc,o,s.from,s.to);for(;!g.next().done;){let{from:l,to:C}=g.value;if((!a||pV(a,A,l,C))&&(n.empty&&l<=n.from&&C>=n.to?r.push(gmA.range(l,C)):(l>=n.to||C<=n.from)&&r.push(smA.range(l,C)),r.length>e.maxMatches))return vt.none}}return vt.set(r)}},{decorations:t=>t.decorations}),CmA=ai.baseTheme({\".cm-selectionMatch\":{backgroundColor:\"#99ff7780\"},\".cm-searchMatch .cm-selectionMatch\":{backgroundColor:\"transparent\"}}),ImA=({state:t,dispatch:e})=>{let{selection:A}=t,i=ce.create(A.ranges.map(n=>t.wordAt(n.head)||ce.cursor(n.head)),A.mainIndex);return i.eq(A)?!1:(e(t.update({selection:i})),!0)};function dmA(t,e){let{main:A,ranges:i}=t.selection,n=t.wordAt(A.head),o=n&&n.from==A.from&&n.to==A.to;for(let a=!1,r=new Y2(t.doc,e,i[i.length-1].to);;)if(r.next(),r.done){if(a)return null;r=new Y2(t.doc,e,0,Math.max(0,i[i.length-1].from-1)),a=!0}else{if(a&&i.some(s=>s.from==r.value.from))continue;if(o){let s=t.wordAt(r.value.from);if(!s||s.from!=r.value.from||s.to!=r.value.to)continue}return r.value}}var BmA=({state:t,dispatch:e})=>{let{ranges:A}=t.selection;if(A.some(o=>o.from===o.to))return ImA({state:t,dispatch:e});let i=t.sliceDoc(A[0].from,A[0].to);if(t.selection.ranges.some(o=>t.sliceDoc(o.from,o.to)!=i))return!1;let n=dmA(t,i);return n?(e(t.update({selection:t.selection.addRange(ce.range(n.from,n.to),!1),effects:ai.scrollIntoView(n.to)})),!0):!1},S1=qe.define({combine(t){return Ir(t,{top:!1,caseSensitive:!1,literal:!1,regexp:!1,wholeWord:!1,createPanel:e=>new ax(e),scrollToMatch:e=>ai.scrollIntoView(e)})}});function bV(t){return t?[S1.of(t),rx]:rx}var K5=class{constructor(e){this.search=e.search,this.caseSensitive=!!e.caseSensitive,this.literal=!!e.literal,this.regexp=!!e.regexp,this.replace=e.replace||\"\",this.valid=!!this.search&&(!this.regexp||omA(this.search)),this.unquoted=this.unquote(this.search),this.wholeWord=!!e.wholeWord,this.test=e.test}unquote(e){return this.literal?e:e.replace(/\\\\([nrt\\\\])/g,(A,i)=>i==\"n\"?`\n`:i==\"r\"?\"\\r\":i==\"t\"?\"\t\":\"\\\\\")}eq(e){return this.search==e.search&&this.replace==e.replace&&this.caseSensitive==e.caseSensitive&&this.regexp==e.regexp&&this.wholeWord==e.wholeWord&&this.test==e.test}create(){return this.regexp?new nx(this):new ix(this)}getCursor(e,A=0,i){let n=e.doc?e:Ga.create({doc:e});return i==null&&(i=n.doc.length),this.regexp?bQ(this,n,A,i):vQ(this,n,A,i)}},U5=class{constructor(e){this.spec=e}};function QmA(t,e,A){return(i,n,o,a)=>{if(A&&!A(i,n,o,a))return!1;let r=i>=a&&n<=a+o.length?o.slice(i-a,n-a):e.doc.sliceString(i,n);return t(r,e,i,n)}}function vQ(t,e,A,i){let n;return t.wholeWord&&(n=EmA(e.doc,e.charCategorizer(e.selection.main.head))),t.test&&(n=QmA(t.test,e,n)),new Y2(e.doc,t.unquoted,A,i,t.caseSensitive?void 0:o=>o.toLowerCase(),n)}function EmA(t,e){return(A,i,n,o)=>((o>A||o+n.length<i)&&(o=Math.max(0,A-2),n=t.sliceString(o,Math.min(t.length,i+2))),(e(J5(n,A-o))!=yo.Word||e(Y5(n,A-o))!=yo.Word)&&(e(Y5(n,i-o))!=yo.Word||e(J5(n,i-o))!=yo.Word))}var ix=class extends U5{constructor(e){super(e)}nextMatch(e,A,i){let n=vQ(this.spec,e,i,e.doc.length).nextOverlapping();if(n.done){let o=Math.min(e.doc.length,A+this.spec.unquoted.length);n=vQ(this.spec,e,0,o).nextOverlapping()}return n.done||n.value.from==A&&n.value.to==i?null:n.value}prevMatchInRange(e,A,i){for(let n=i;;){let o=Math.max(A,n-1e4-this.spec.unquoted.length),a=vQ(this.spec,e,o,n),r=null;for(;!a.nextOverlapping().done;)r=a.value;if(r)return r;if(o==A)return null;n-=1e4}}prevMatch(e,A,i){let n=this.prevMatchInRange(e,0,A);return n||(n=this.prevMatchInRange(e,Math.max(0,i-this.spec.unquoted.length),e.doc.length)),n&&(n.from!=A||n.to!=i)?n:null}getReplacement(e){return this.spec.unquote(this.spec.replace)}matchAll(e,A){let i=vQ(this.spec,e,0,e.doc.length),n=[];for(;!i.next().done;){if(n.length>=A)return null;n.push(i.value)}return n}highlight(e,A,i,n){let o=vQ(this.spec,e,Math.max(0,A-this.spec.unquoted.length),Math.min(i+this.spec.unquoted.length,e.doc.length));for(;!o.next().done;)n(o.value.from,o.value.to)}};function hmA(t,e,A){return(i,n,o)=>(!A||A(i,n,o))&&t(o[0],e,i,n)}function bQ(t,e,A,i){let n;return t.wholeWord&&(n=umA(e.charCategorizer(e.selection.main.head))),t.test&&(n=hmA(t.test,e,n)),new F5(e.doc,t.search,{ignoreCase:!t.caseSensitive,test:n},A,i)}function J5(t,e){return t.slice(_a(t,e,!1),e)}function Y5(t,e){return t.slice(e,_a(t,e))}function umA(t){return(e,A,i)=>!i[0].length||(t(J5(i.input,i.index))!=yo.Word||t(Y5(i.input,i.index))!=yo.Word)&&(t(Y5(i.input,i.index+i[0].length))!=yo.Word||t(J5(i.input,i.index+i[0].length))!=yo.Word)}var nx=class extends U5{nextMatch(e,A,i){let n=bQ(this.spec,e,i,e.doc.length).next();return n.done&&(n=bQ(this.spec,e,0,A).next()),n.done?null:n.value}prevMatchInRange(e,A,i){for(let n=1;;n++){let o=Math.max(A,i-n*1e4),a=bQ(this.spec,e,o,i),r=null;for(;!a.next().done;)r=a.value;if(r&&(o==A||r.from>o+10))return r;if(o==A)return null}}prevMatch(e,A,i){return this.prevMatchInRange(e,0,A)||this.prevMatchInRange(e,i,e.doc.length)}getReplacement(e){return this.spec.unquote(this.spec.replace).replace(/\\$([$&]|\\d+)/g,(A,i)=>{if(i==\"&\")return e.match[0];if(i==\"$\")return\"$\";for(let n=i.length;n>0;n--){let o=+i.slice(0,n);if(o>0&&o<e.match.length)return e.match[o]+i.slice(n)}return A})}matchAll(e,A){let i=bQ(this.spec,e,0,e.doc.length),n=[];for(;!i.next().done;){if(n.length>=A)return null;n.push(i.value)}return n}highlight(e,A,i,n){let o=bQ(this.spec,e,Math.max(0,A-250),Math.min(i+250,e.doc.length));for(;!o.next().done;)n(o.value.from,o.value.to)}},G3=Ui.define(),gx=Ui.define(),J2=Qa.define({create(t){return new _3(ox(t).create(),null)},update(t,e){for(let A of e.effects)A.is(G3)?t=new _3(A.value.create(),t.panel):A.is(gx)&&(t=new _3(t.query,A.value?lx:null));return t},provide:t=>m1.from(t,e=>e.panel)});var _3=class{constructor(e,A){this.query=e,this.panel=A}},fmA=vt.mark({class:\"cm-searchMatch\"}),mmA=vt.mark({class:\"cm-searchMatch cm-searchMatch-selected\"}),pmA=ho.fromClass(class{constructor(t){this.view=t,this.decorations=this.highlight(t.state.field(J2))}update(t){let e=t.state.field(J2);(e!=t.startState.field(J2)||t.docChanged||t.selectionSet||t.viewportChanged)&&(this.decorations=this.highlight(e))}highlight({query:t,panel:e}){if(!e||!t.spec.valid)return vt.none;let{view:A}=this,i=new Nr;for(let n=0,o=A.visibleRanges,a=o.length;n<a;n++){let{from:r,to:s}=o[n];for(;n<a-1&&s>o[n+1].from-500;)s=o[++n].to;t.highlight(A.state,r,s,(g,l)=>{let C=A.state.selection.ranges.some(I=>I.from==g&&I.to==l);i.add(g,l,C?mmA:fmA)})}return i.finish()}},{decorations:t=>t.decorations});function K3(t){return e=>{let A=e.state.field(J2,!1);return A&&A.query.spec.valid?t(e,A):O5(e)}}var H5=K3((t,{query:e})=>{let{to:A}=t.state.selection.main,i=e.nextMatch(t.state,A,A);if(!i)return!1;let n=ce.single(i.from,i.to),o=t.state.facet(S1);return t.dispatch({selection:n,effects:[cx(t,i),o.scrollToMatch(n.main,t)],userEvent:\"select.search\"}),kV(t),!0}),T5=K3((t,{query:e})=>{let{state:A}=t,{from:i}=A.selection.main,n=e.prevMatch(A,i,i);if(!n)return!1;let o=ce.single(n.from,n.to),a=t.state.facet(S1);return t.dispatch({selection:o,effects:[cx(t,n),a.scrollToMatch(o.main,t)],userEvent:\"select.search\"}),kV(t),!0}),DmA=K3((t,{query:e})=>{let A=e.matchAll(t.state,1e3);return!A||!A.length?!1:(t.dispatch({selection:ce.create(A.map(i=>ce.range(i.from,i.to))),userEvent:\"select.search.matches\"}),!0)}),wmA=({state:t,dispatch:e})=>{let A=t.selection;if(A.ranges.length>1||A.main.empty)return!1;let{from:i,to:n}=A.main,o=[],a=0;for(let r=new Y2(t.doc,t.sliceDoc(i,n));!r.next().done;){if(o.length>1e3)return!1;r.value.from==i&&(a=o.length),o.push(ce.range(r.value.from,r.value.to))}return e(t.update({selection:ce.create(o,a),userEvent:\"select.search.matches\"})),!0},DV=K3((t,{query:e})=>{let{state:A}=t,{from:i,to:n}=A.selection.main;if(A.readOnly)return!1;let o=e.nextMatch(A,i,i);if(!o)return!1;let a=o,r=[],s,g,l=[];a.from==i&&a.to==n&&(g=A.toText(e.getReplacement(a)),r.push({from:a.from,to:a.to,insert:g}),a=e.nextMatch(A,a.from,a.to),l.push(ai.announce.of(A.phrase(\"replaced match on line $\",A.doc.lineAt(i).number)+\".\")));let C=t.state.changes(r);return a&&(s=ce.single(a.from,a.to).map(C),l.push(cx(t,a)),l.push(A.facet(S1).scrollToMatch(s.main,t))),t.dispatch({changes:C,selection:s,effects:l,userEvent:\"input.replace\"}),!0}),ymA=K3((t,{query:e})=>{if(t.state.readOnly)return!1;let A=e.matchAll(t.state,1e9).map(n=>{let{from:o,to:a}=n;return{from:o,to:a,insert:e.getReplacement(n)}});if(!A.length)return!1;let i=t.state.phrase(\"replaced $ matches\",A.length)+\".\";return t.dispatch({changes:A,effects:ai.announce.of(i),userEvent:\"input.replace.all\"}),!0});function lx(t){return t.state.facet(S1).createPanel(t)}function ox(t,e){var A,i,n,o,a;let r=t.selection.main,s=r.empty||r.to>r.from+100?\"\":t.sliceDoc(r.from,r.to);if(e&&!s)return e;let g=t.facet(S1);return new K5({search:((A=e?.literal)!==null&&A!==void 0?A:g.literal)?s:s.replace(/\\n/g,\"\\\\n\"),caseSensitive:(i=e?.caseSensitive)!==null&&i!==void 0?i:g.caseSensitive,literal:(n=e?.literal)!==null&&n!==void 0?n:g.literal,regexp:(o=e?.regexp)!==null&&o!==void 0?o:g.regexp,wholeWord:(a=e?.wholeWord)!==null&&a!==void 0?a:g.wholeWord})}function MV(t){let e=f3(t,lx);return e&&e.dom.querySelector(\"[main-field]\")}function kV(t){let e=MV(t);e&&e==t.root.activeElement&&e.select()}var O5=t=>{let e=t.state.field(J2,!1);if(e&&e.panel){let A=MV(t);if(A&&A!=t.root.activeElement){let i=ox(t.state,e.query.spec);i.valid&&t.dispatch({effects:G3.of(i)}),A.focus(),A.select()}}else t.dispatch({effects:[gx.of(!0),e?G3.of(ox(t.state,e.query.spec)):Ui.appendConfig.of(rx)]});return!0},z5=t=>{let e=t.state.field(J2,!1);if(!e||!e.panel)return!1;let A=f3(t,lx);return A&&A.dom.contains(t.root.activeElement)&&t.focus(),t.dispatch({effects:gx.of(!1)}),!0},SV=[{key:\"Mod-f\",run:O5,scope:\"editor search-panel\"},{key:\"F3\",run:H5,shift:T5,scope:\"editor search-panel\",preventDefault:!0},{key:\"Mod-g\",run:H5,shift:T5,scope:\"editor search-panel\",preventDefault:!0},{key:\"Escape\",run:z5,scope:\"editor search-panel\"},{key:\"Mod-Shift-l\",run:wmA},{key:\"Mod-Alt-g\",run:amA},{key:\"Mod-d\",run:BmA,preventDefault:!0}],ax=class{constructor(e){this.view=e;let A=this.query=e.state.field(J2).query.spec;this.commit=this.commit.bind(this),this.searchField=Pn(\"input\",{value:A.search,placeholder:mg(e,\"Find\"),\"aria-label\":mg(e,\"Find\"),class:\"cm-textfield\",name:\"search\",form:\"\",\"main-field\":\"true\",onchange:this.commit,onkeyup:this.commit}),this.replaceField=Pn(\"input\",{value:A.replace,placeholder:mg(e,\"Replace\"),\"aria-label\":mg(e,\"Replace\"),class:\"cm-textfield\",name:\"replace\",form:\"\",onchange:this.commit,onkeyup:this.commit}),this.caseField=Pn(\"input\",{type:\"checkbox\",name:\"case\",form:\"\",checked:A.caseSensitive,onchange:this.commit}),this.reField=Pn(\"input\",{type:\"checkbox\",name:\"re\",form:\"\",checked:A.regexp,onchange:this.commit}),this.wordField=Pn(\"input\",{type:\"checkbox\",name:\"word\",form:\"\",checked:A.wholeWord,onchange:this.commit});function i(n,o,a){return Pn(\"button\",{class:\"cm-button\",name:n,onclick:o,type:\"button\"},a)}this.dom=Pn(\"div\",{onkeydown:n=>this.keydown(n),class:\"cm-search\"},[this.searchField,i(\"next\",()=>H5(e),[mg(e,\"next\")]),i(\"prev\",()=>T5(e),[mg(e,\"previous\")]),i(\"select\",()=>DmA(e),[mg(e,\"all\")]),Pn(\"label\",null,[this.caseField,mg(e,\"match case\")]),Pn(\"label\",null,[this.reField,mg(e,\"regexp\")]),Pn(\"label\",null,[this.wordField,mg(e,\"by word\")]),...e.state.readOnly?[]:[Pn(\"br\"),this.replaceField,i(\"replace\",()=>DV(e),[mg(e,\"replace\")]),i(\"replaceAll\",()=>ymA(e),[mg(e,\"replace all\")])],Pn(\"button\",{name:\"close\",onclick:()=>z5(e),\"aria-label\":mg(e,\"close\"),type:\"button\"},[\"\\xD7\"])])}commit(){let e=new K5({search:this.searchField.value,caseSensitive:this.caseField.checked,regexp:this.reField.checked,wholeWord:this.wordField.checked,replace:this.replaceField.value});e.eq(this.query)||(this.query=e,this.view.dispatch({effects:G3.of(e)}))}keydown(e){dj(this.view,e,\"search-panel\")?e.preventDefault():e.keyCode==13&&e.target==this.searchField?(e.preventDefault(),(e.shiftKey?T5:H5)(this.view)):e.keyCode==13&&e.target==this.replaceField&&(e.preventDefault(),DV(this.view))}update(e){for(let A of e.transactions)for(let i of A.effects)i.is(G3)&&!i.value.eq(this.query)&&this.setQuery(i.value)}setQuery(e){this.query=e,this.searchField.value=e.search,this.replaceField.value=e.replace,this.caseField.checked=e.caseSensitive,this.reField.checked=e.regexp,this.wordField.checked=e.wholeWord}mount(){this.searchField.select()}get pos(){return 80}get top(){return this.view.state.facet(S1).top}};function mg(t,e){return t.state.phrase(e)}var R5=30,N5=/[\\s\\.,:;?!]/;function cx(t,{from:e,to:A}){let i=t.state.doc.lineAt(e),n=t.state.doc.lineAt(A).to,o=Math.max(i.from,e-R5),a=Math.min(n,A+R5),r=t.state.sliceDoc(o,a);if(o!=i.from){for(let s=0;s<R5;s++)if(!N5.test(r[s+1])&&N5.test(r[s])){r=r.slice(s);break}}if(a!=n){for(let s=r.length-1;s>r.length-R5;s--)if(!N5.test(r[s-1])&&N5.test(r[s])){r=r.slice(0,s);break}}return ai.announce.of(`${t.state.phrase(\"current match\")}. ${r} ${t.state.phrase(\"on line\")} ${i.number}.`)}var vmA=ai.baseTheme({\".cm-panel.cm-search\":{padding:\"2px 6px 4px\",position:\"relative\",\"& [name=close]\":{position:\"absolute\",top:\"0\",right:\"4px\",backgroundColor:\"inherit\",border:\"none\",font:\"inherit\",padding:0,margin:0},\"& input, & button, & label\":{margin:\".2em .6em .2em 0\"},\"& input[type=checkbox]\":{marginRight:\".2em\"},\"& label\":{fontSize:\"80%\",whiteSpace:\"pre\"}},\"&light .cm-searchMatch\":{backgroundColor:\"#ffff0054\"},\"&dark .cm-searchMatch\":{backgroundColor:\"#00ffff8a\"},\"&light .cm-searchMatch-selected\":{backgroundColor:\"#ff6a0054\"},\"&dark .cm-searchMatch-selected\":{backgroundColor:\"#ff00ff8a\"}}),rx=[J2,zl.low(pmA),vmA];var j5=class{constructor(e,A,i,n){this.state=e,this.pos=A,this.explicit=i,this.view=n,this.abortListeners=[],this.abortOnDocChange=!1}tokenBefore(e){let A=Br(this.state).resolveInner(this.pos,-1);for(;A&&e.indexOf(A.name)<0;)A=A.parent;return A?{from:A.from,to:this.pos,text:this.state.sliceDoc(A.from,this.pos),type:A.type}:null}matchBefore(e){let A=this.state.doc.lineAt(this.pos),i=Math.max(A.from,this.pos-250),n=A.text.slice(i-A.from,this.pos-A.from),o=n.search(KV(e,!1));return o<0?null:{from:i+o,to:this.pos,text:n.slice(o)}}get aborted(){return this.abortListeners==null}addEventListener(e,A,i){e==\"abort\"&&this.abortListeners&&(this.abortListeners.push(A),i&&i.onDocChange&&(this.abortOnDocChange=!0))}};function xV(t){let e=Object.keys(t).join(\"\"),A=/\\w/.test(e);return A&&(e=e.replace(/\\w/g,\"\")),`[${A?\"\\\\w\":\"\"}${e.replace(/[^\\w\\s]/g,\"\\\\$&\")}]`}function bmA(t){let e=Object.create(null),A=Object.create(null);for(let{label:n}of t){e[n[0]]=!0;for(let o=1;o<n.length;o++)A[n[o]]=!0}let i=xV(e)+xV(A)+\"*$\";return[new RegExp(\"^\"+i),new RegExp(i)]}function MmA(t){let e=t.map(n=>typeof n==\"string\"?{label:n}:n),[A,i]=e.every(n=>/^\\w+$/.test(n.label))?[/\\w*$/,/\\w+$/]:bmA(e);return n=>{let o=n.matchBefore(i);return o||n.explicit?{from:o?o.from:n.pos,options:e,validFor:A}:null}}var q5=class{constructor(e,A,i,n){this.completion=e,this.source=A,this.match=i,this.score=n}};function R1(t){return t.selection.main.from}function KV(t,e){var A;let{source:i}=t,n=e&&i[0]!=\"^\",o=i[i.length-1]!=\"$\";return!n&&!o?t:new RegExp(`${n?\"^\":\"\"}(?:${i})${o?\"$\":\"\"}`,(A=t.flags)!==null&&A!==void 0?A:t.ignoreCase?\"i\":\"\")}var UV=Os.define();function kmA(t,e,A,i){let{main:n}=t.selection,o=A-n.from,a=i-n.from;return Ve(BA({},t.changeByRange(r=>{if(r!=n&&A!=i&&t.sliceDoc(r.from+o,r.from+a)!=t.sliceDoc(A,i))return{range:r};let s=t.toText(e);return{changes:{from:r.from+o,to:i==n.from?r.to:r.from+a,insert:s},range:ce.cursor(r.from+o+s.length)}})),{scrollIntoView:!0,userEvent:\"input.complete\"})}var RV=new WeakMap;function SmA(t){if(!Array.isArray(t))return t;let e=RV.get(t);return e||RV.set(t,e=MmA(t)),e}var V5=Ui.define(),U3=Ui.define(),Bx=class{constructor(e){this.pattern=e,this.chars=[],this.folded=[],this.any=[],this.precise=[],this.byWord=[],this.score=0,this.matched=[];for(let A=0;A<e.length;){let i=Fr(e,A),n=Eg(i);this.chars.push(i);let o=e.slice(A,A+n),a=o.toUpperCase();this.folded.push(Fr(a==o?o.toLowerCase():a,0)),A+=n}this.astral=e.length!=this.chars.length}ret(e,A){return this.score=e,this.matched=A,this}match(e){if(this.pattern.length==0)return this.ret(-100,[]);if(e.length<this.pattern.length)return null;let{chars:A,folded:i,any:n,precise:o,byWord:a}=this;if(A.length==1){let b=Fr(e,0),R=Eg(b),M=R==e.length?0:-100;if(b!=A[0])if(b==i[0])M+=-200;else return null;return this.ret(M,[0,R])}let r=e.indexOf(this.pattern);if(r==0)return this.ret(e.length==this.pattern.length?0:-100,[0,this.pattern.length]);let s=A.length,g=0;if(r<0){for(let b=0,R=Math.min(e.length,200);b<R&&g<s;){let M=Fr(e,b);(M==A[g]||M==i[g])&&(n[g++]=b),b+=Eg(M)}if(g<s)return null}let l=0,C=0,I=!1,d=0,B=-1,Q=-1,E=/[a-z]/.test(e),f=!0;for(let b=0,R=Math.min(e.length,200),M=0;b<R&&C<s;){let v=Fr(e,b);r<0&&(l<s&&v==A[l]&&(o[l++]=b),d<s&&(v==A[d]||v==i[d]?(d==0&&(B=b),Q=b+1,d++):d=0));let F,G=v<255?v>=48&&v<=57||v>=97&&v<=122?2:v>=65&&v<=90?1:0:(F=t3(v))!=F.toLowerCase()?1:F!=F.toUpperCase()?2:0;(!b||G==1&&E||M==0&&G!=0)&&(A[C]==v||i[C]==v&&(I=!0)?a[C++]=b:a.length&&(f=!1)),M=G,b+=Eg(v)}return C==s&&a[0]==0&&f?this.result(-100+(I?-200:0),a,e):d==s&&B==0?this.ret(-200-e.length+(Q==e.length?0:-100),[0,Q]):r>-1?this.ret(-700-e.length,[r,r+this.pattern.length]):d==s?this.ret(-900-e.length,[B,Q]):C==s?this.result(-100+(I?-200:0)+-700+(f?0:-1100),a,e):A.length==2?null:this.result((n[0]?-700:0)+-200+-1100,n,e)}result(e,A,i){let n=[],o=0;for(let a of A){let r=a+(this.astral?Eg(Fr(i,a)):1);o&&n[o-1]==a?n[o-1]=r:(n[o++]=a,n[o++]=r)}return this.ret(e-i.length,n)}},Qx=class{constructor(e){this.pattern=e,this.matched=[],this.score=0,this.folded=e.toLowerCase()}match(e){if(e.length<this.pattern.length)return null;let A=e.slice(0,this.pattern.length),i=A==this.pattern?0:A.toLowerCase()==this.folded?-200:null;return i==null?null:(this.matched=[0,A.length],this.score=i+(e.length==this.pattern.length?0:-100),this)}},Qr=qe.define({combine(t){return Ir(t,{activateOnTyping:!0,activateOnCompletion:()=>!1,activateOnTypingDelay:100,selectOnOpen:!0,override:null,closeOnBlur:!0,maxRenderedOptions:100,defaultKeymap:!0,tooltipClass:()=>\"\",optionClass:()=>\"\",aboveCursor:!1,icons:!0,addToOptions:[],positionInfo:xmA,filterStrict:!1,compareCompletions:(e,A)=>(e.sortText||e.label).localeCompare(A.sortText||A.label),interactionDelay:75,updateSyncTime:100},{defaultKeymap:(e,A)=>e&&A,closeOnBlur:(e,A)=>e&&A,icons:(e,A)=>e&&A,tooltipClass:(e,A)=>i=>NV(e(i),A(i)),optionClass:(e,A)=>i=>NV(e(i),A(i)),addToOptions:(e,A)=>e.concat(A),filterStrict:(e,A)=>e||A})}});function NV(t,e){return t?e?t+\" \"+e:t:e}function xmA(t,e,A,i,n,o){let a=t.textDirection==go.RTL,r=a,s=!1,g=\"top\",l,C,I=e.left-n.left,d=n.right-e.right,B=i.right-i.left,Q=i.bottom-i.top;if(r&&I<Math.min(B,d)?r=!1:!r&&d<Math.min(B,I)&&(r=!0),B<=(r?I:d))l=Math.max(n.top,Math.min(A.top,n.bottom-Q))-e.top,C=Math.min(400,r?I:d);else{s=!0,C=Math.min(400,(a?e.right:n.right-e.left)-30);let b=n.bottom-e.bottom;b>=Q||b>e.top?l=A.bottom-e.top:(g=\"bottom\",l=e.bottom-A.top)}let E=(e.bottom-e.top)/o.offsetHeight,f=(e.right-e.left)/o.offsetWidth;return{style:`${g}: ${l/E}px; max-width: ${C/f}px`,class:\"cm-completionInfo-\"+(s?a?\"left-narrow\":\"right-narrow\":r?\"left\":\"right\")}}var mx=Ui.define();function RmA(t){let e=t.addToOptions.slice();return t.icons&&e.push({render(A){let i=document.createElement(\"div\");return i.classList.add(\"cm-completionIcon\"),A.type&&i.classList.add(...A.type.split(/\\s+/g).map(n=>\"cm-completionIcon-\"+n)),i.setAttribute(\"aria-hidden\",\"true\"),i},position:20}),e.push({render(A,i,n,o){let a=document.createElement(\"span\");a.className=\"cm-completionLabel\";let r=A.displayLabel||A.label,s=0;for(let g=0;g<o.length;){let l=o[g++],C=o[g++];l>s&&a.appendChild(document.createTextNode(r.slice(s,l)));let I=a.appendChild(document.createElement(\"span\"));I.appendChild(document.createTextNode(r.slice(l,C))),I.className=\"cm-completionMatchedText\",s=C}return s<r.length&&a.appendChild(document.createTextNode(r.slice(s))),a},position:50},{render(A){if(!A.detail)return null;let i=document.createElement(\"span\");return i.className=\"cm-completionDetail\",i.textContent=A.detail,i},position:80}),e.sort((A,i)=>A.position-i.position).map(A=>A.render)}function Cx(t,e,A){if(t<=A)return{from:0,to:t};if(e<0&&(e=0),e<=t>>1){let n=Math.floor(e/A);return{from:n*A,to:(n+1)*A}}let i=Math.floor((t-e)/A);return{from:t-(i+1)*A,to:t-i*A}}var Ex=class{constructor(e,A,i){this.view=e,this.stateField=A,this.applyCompletion=i,this.info=null,this.infoDestroy=null,this.placeInfoReq={read:()=>this.measureInfo(),write:s=>this.placeInfo(s),key:this},this.space=null,this.currentClass=\"\";let n=e.state.field(A),{options:o,selected:a}=n.open,r=e.state.facet(Qr);this.optionContent=RmA(r),this.optionClass=r.optionClass,this.tooltipClass=r.tooltipClass,this.range=Cx(o.length,a,r.maxRenderedOptions),this.dom=document.createElement(\"div\"),this.dom.className=\"cm-tooltip-autocomplete\",this.updateTooltipClass(e.state),this.dom.addEventListener(\"mousedown\",s=>{let{options:g}=e.state.field(A).open;for(let l=s.target,C;l&&l!=this.dom;l=l.parentNode)if(l.nodeName==\"LI\"&&(C=/-(\\d+)$/.exec(l.id))&&+C[1]<g.length){this.applyCompletion(e,g[+C[1]]),s.preventDefault();return}if(s.target==this.list){let l=this.list.classList.contains(\"cm-completionListIncompleteTop\")&&s.clientY<this.list.firstChild.getBoundingClientRect().top?this.range.from-1:this.list.classList.contains(\"cm-completionListIncompleteBottom\")&&s.clientY>this.list.lastChild.getBoundingClientRect().bottom?this.range.to:null;l!=null&&(e.dispatch({effects:mx.of(l)}),s.preventDefault())}}),this.dom.addEventListener(\"focusout\",s=>{let g=e.state.field(this.stateField,!1);g&&g.tooltip&&e.state.facet(Qr).closeOnBlur&&s.relatedTarget!=e.contentDOM&&e.dispatch({effects:U3.of(null)})}),this.showOptions(o,n.id)}mount(){this.updateSel()}showOptions(e,A){this.list&&this.list.remove(),this.list=this.dom.appendChild(this.createListBox(e,A,this.range)),this.list.addEventListener(\"scroll\",()=>{this.info&&this.view.requestMeasure(this.placeInfoReq)})}update(e){var A;let i=e.state.field(this.stateField),n=e.startState.field(this.stateField);if(this.updateTooltipClass(e.state),i!=n){let{options:o,selected:a,disabled:r}=i.open;(!n.open||n.open.options!=o)&&(this.range=Cx(o.length,a,e.state.facet(Qr).maxRenderedOptions),this.showOptions(o,i.id)),this.updateSel(),r!=((A=n.open)===null||A===void 0?void 0:A.disabled)&&this.dom.classList.toggle(\"cm-tooltip-autocomplete-disabled\",!!r)}}updateTooltipClass(e){let A=this.tooltipClass(e);if(A!=this.currentClass){for(let i of this.currentClass.split(\" \"))i&&this.dom.classList.remove(i);for(let i of A.split(\" \"))i&&this.dom.classList.add(i);this.currentClass=A}}positioned(e){this.space=e,this.info&&this.view.requestMeasure(this.placeInfoReq)}updateSel(){let e=this.view.state.field(this.stateField),A=e.open;(A.selected>-1&&A.selected<this.range.from||A.selected>=this.range.to)&&(this.range=Cx(A.options.length,A.selected,this.view.state.facet(Qr).maxRenderedOptions),this.showOptions(A.options,e.id));let i=this.updateSelectedOption(A.selected);if(i){this.destroyInfo();let{completion:n}=A.options[A.selected],{info:o}=n;if(!o)return;let a=typeof o==\"string\"?document.createTextNode(o):o(n);if(!a)return;\"then\"in a?a.then(r=>{r&&this.view.state.field(this.stateField,!1)==e&&this.addInfoPane(r,n)}).catch(r=>dr(this.view.state,r,\"completion info\")):(this.addInfoPane(a,n),i.setAttribute(\"aria-describedby\",this.info.id))}}addInfoPane(e,A){this.destroyInfo();let i=this.info=document.createElement(\"div\");if(i.className=\"cm-tooltip cm-completionInfo\",i.id=\"cm-completionInfo-\"+Math.floor(Math.random()*65535).toString(16),e.nodeType!=null)i.appendChild(e),this.infoDestroy=null;else{let{dom:n,destroy:o}=e;i.appendChild(n),this.infoDestroy=o||null}this.dom.appendChild(i),this.view.requestMeasure(this.placeInfoReq)}updateSelectedOption(e){let A=null;for(let i=this.list.firstChild,n=this.range.from;i;i=i.nextSibling,n++)i.nodeName!=\"LI\"||!i.id?n--:n==e?i.hasAttribute(\"aria-selected\")||(i.setAttribute(\"aria-selected\",\"true\"),A=i):i.hasAttribute(\"aria-selected\")&&(i.removeAttribute(\"aria-selected\"),i.removeAttribute(\"aria-describedby\"));return A&&FmA(this.list,A),A}measureInfo(){let e=this.dom.querySelector(\"[aria-selected]\");if(!e||!this.info)return null;let A=this.dom.getBoundingClientRect(),i=this.info.getBoundingClientRect(),n=e.getBoundingClientRect(),o=this.space;if(!o){let a=this.dom.ownerDocument.documentElement;o={left:0,top:0,right:a.clientWidth,bottom:a.clientHeight}}return n.top>Math.min(o.bottom,A.bottom)-10||n.bottom<Math.max(o.top,A.top)+10?null:this.view.state.facet(Qr).positionInfo(this.view,A,n,i,o,this.dom)}placeInfo(e){this.info&&(e?(e.style&&(this.info.style.cssText=e.style),this.info.className=\"cm-tooltip cm-completionInfo \"+(e.class||\"\")):this.info.style.cssText=\"top: -1e6px\")}createListBox(e,A,i){let n=document.createElement(\"ul\");n.id=A,n.setAttribute(\"role\",\"listbox\"),n.setAttribute(\"aria-expanded\",\"true\"),n.setAttribute(\"aria-label\",this.view.state.phrase(\"Completions\")),n.addEventListener(\"mousedown\",a=>{a.target==n&&a.preventDefault()});let o=null;for(let a=i.from;a<i.to;a++){let{completion:r,match:s}=e[a],{section:g}=r;if(g){let I=typeof g==\"string\"?g:g.name;if(I!=o&&(a>i.from||i.from==0))if(o=I,typeof g!=\"string\"&&g.header)n.appendChild(g.header(g));else{let d=n.appendChild(document.createElement(\"completion-section\"));d.textContent=I}}let l=n.appendChild(document.createElement(\"li\"));l.id=A+\"-\"+a,l.setAttribute(\"role\",\"option\");let C=this.optionClass(r);C&&(l.className=C);for(let I of this.optionContent){let d=I(r,this.view.state,this.view,s);d&&l.appendChild(d)}}return i.from&&n.classList.add(\"cm-completionListIncompleteTop\"),i.to<e.length&&n.classList.add(\"cm-completionListIncompleteBottom\"),n}destroyInfo(){this.info&&(this.infoDestroy&&this.infoDestroy(),this.info.remove(),this.info=null)}destroy(){this.destroyInfo()}};function NmA(t,e){return A=>new Ex(A,t,e)}function FmA(t,e){let A=t.getBoundingClientRect(),i=e.getBoundingClientRect(),n=A.height/t.offsetHeight;i.top<A.top?t.scrollTop-=(A.top-i.top)/n:i.bottom>A.bottom&&(t.scrollTop+=(i.bottom-A.bottom)/n)}function FV(t){return(t.boost||0)*100+(t.apply?10:0)+(t.info?5:0)+(t.type?1:0)}function LmA(t,e){let A=[],i=null,n=null,o=l=>{A.push(l);let{section:C}=l.completion;if(C){i||(i=[]);let I=typeof C==\"string\"?C:C.name;i.some(d=>d.name==I)||i.push(typeof C==\"string\"?{name:I}:C)}},a=e.facet(Qr);for(let l of t)if(l.hasResult()){let C=l.result.getMatch;if(l.result.filter===!1)for(let I of l.result.options)o(new q5(I,l.source,C?C(I):[],1e9-A.length));else{let I=e.sliceDoc(l.from,l.to),d,B=a.filterStrict?new Qx(I):new Bx(I);for(let Q of l.result.options)if(d=B.match(Q.label)){let E=Q.displayLabel?C?C(Q,d.matched):[]:d.matched,f=d.score+(Q.boost||0);if(o(new q5(Q,l.source,E,f)),typeof Q.section==\"object\"&&Q.section.rank===\"dynamic\"){let{name:b}=Q.section;n||(n=Object.create(null)),n[b]=Math.max(f,n[b]||-1e9)}}}}if(i){let l=Object.create(null),C=0,I=(d,B)=>(d.rank===\"dynamic\"&&B.rank===\"dynamic\"?n[B.name]-n[d.name]:0)||(typeof d.rank==\"number\"?d.rank:1e9)-(typeof B.rank==\"number\"?B.rank:1e9)||(d.name<B.name?-1:1);for(let d of i.sort(I))C-=1e5,l[d.name]=C;for(let d of A){let{section:B}=d.completion;B&&(d.score+=l[typeof B==\"string\"?B:B.name])}}let r=[],s=null,g=a.compareCompletions;for(let l of A.sort((C,I)=>I.score-C.score||g(C.completion,I.completion))){let C=l.completion;!s||s.label!=C.label||s.detail!=C.detail||s.type!=null&&C.type!=null&&s.type!=C.type||s.apply!=C.apply||s.boost!=C.boost?r.push(l):FV(l.completion)>FV(s)&&(r[r.length-1]=l),s=l.completion}return r}var hx=class t{constructor(e,A,i,n,o,a){this.options=e,this.attrs=A,this.tooltip=i,this.timestamp=n,this.selected=o,this.disabled=a}setSelected(e,A){return e==this.selected||e>=this.options.length?this:new t(this.options,LV(A,e),this.tooltip,this.timestamp,e,this.disabled)}static build(e,A,i,n,o,a){if(n&&!a&&e.some(g=>g.isPending))return n.setDisabled();let r=LmA(e,A);if(!r.length)return n&&e.some(g=>g.isPending)?n.setDisabled():null;let s=A.facet(Qr).selectOnOpen?0:-1;if(n&&n.selected!=s&&n.selected!=-1){let g=n.options[n.selected].completion;for(let l=0;l<r.length;l++)if(r[l].completion==g){s=l;break}}return new t(r,LV(i,s),{pos:e.reduce((g,l)=>l.hasResult()?Math.min(g,l.from):g,1e8),create:YmA,above:o.aboveCursor},n?n.timestamp:Date.now(),s,!1)}map(e){return new t(this.options,this.attrs,Ve(BA({},this.tooltip),{pos:e.mapPos(this.tooltip.pos)}),this.timestamp,this.selected,this.disabled)}setDisabled(){return new t(this.options,this.attrs,this.tooltip,this.timestamp,this.selected,!0)}},ux=class t{constructor(e,A,i){this.active=e,this.id=A,this.open=i}static start(){return new t(UmA,\"cm-ac-\"+Math.floor(Math.random()*2e6).toString(36),null)}update(e){let{state:A}=e,i=A.facet(Qr),o=(i.override||A.languageDataAt(\"autocomplete\",R1(A)).map(SmA)).map(s=>(this.active.find(l=>l.source==s)||new AC(s,this.active.some(l=>l.state!=0)?1:0)).update(e,i));o.length==this.active.length&&o.every((s,g)=>s==this.active[g])&&(o=this.active);let a=this.open,r=e.effects.some(s=>s.is(px));a&&e.docChanged&&(a=a.map(e.changes)),e.selection||o.some(s=>s.hasResult()&&e.changes.touchesRange(s.from,s.to))||!_mA(o,this.active)||r?a=hx.build(o,A,this.id,a,i,r):a&&a.disabled&&!o.some(s=>s.isPending)&&(a=null),!a&&o.every(s=>!s.isPending)&&o.some(s=>s.hasResult())&&(o=o.map(s=>s.hasResult()?new AC(s.source,0):s));for(let s of e.effects)s.is(mx)&&(a=a&&a.setSelected(s.value,this.id));return o==this.active&&a==this.open?this:new t(o,this.id,a)}get tooltip(){return this.open?this.open.tooltip:null}get attrs(){return this.open?this.open.attrs:this.active.length?GmA:KmA}};function _mA(t,e){if(t==e)return!0;for(let A=0,i=0;;){for(;A<t.length&&!t[A].hasResult();)A++;for(;i<e.length&&!e[i].hasResult();)i++;let n=A==t.length,o=i==e.length;if(n||o)return n==o;if(t[A++].result!=e[i++].result)return!1}}var GmA={\"aria-autocomplete\":\"list\"},KmA={};function LV(t,e){let A={\"aria-autocomplete\":\"list\",\"aria-haspopup\":\"listbox\",\"aria-controls\":t};return e>-1&&(A[\"aria-activedescendant\"]=t+\"-\"+e),A}var UmA=[];function JV(t,e){if(t.isUserEvent(\"input.complete\")){let i=t.annotation(UV);if(i&&e.activateOnCompletion(i))return 12}let A=t.isUserEvent(\"input.type\");return A&&e.activateOnTyping?5:A?1:t.isUserEvent(\"delete.backward\")?2:t.selection?8:t.docChanged?16:0}var AC=class t{constructor(e,A,i=!1){this.source=e,this.state=A,this.explicit=i}hasResult(){return!1}get isPending(){return this.state==1}update(e,A){let i=JV(e,A),n=this;(i&8||i&16&&this.touches(e))&&(n=new t(n.source,0)),i&4&&n.state==0&&(n=new t(this.source,1)),n=n.updateFor(e,i);for(let o of e.effects)if(o.is(V5))n=new t(n.source,1,o.value);else if(o.is(U3))n=new t(n.source,0);else if(o.is(px))for(let a of o.value)a.source==n.source&&(n=a);return n}updateFor(e,A){return this.map(e.changes)}map(e){return this}touches(e){return e.changes.touchesRange(R1(e.state))}},W5=class t extends AC{constructor(e,A,i,n,o,a){super(e,3,A),this.limit=i,this.result=n,this.from=o,this.to=a}hasResult(){return!0}updateFor(e,A){var i;if(!(A&3))return this.map(e.changes);let n=this.result;n.map&&!e.changes.empty&&(n=n.map(n,e.changes));let o=e.changes.mapPos(this.from),a=e.changes.mapPos(this.to,1),r=R1(e.state);if(r>a||!n||A&2&&(R1(e.startState)==this.from||r<this.limit))return new AC(this.source,A&4?1:0);let s=e.changes.mapPos(this.limit);return JmA(n.validFor,e.state,o,a)?new t(this.source,this.explicit,s,n,o,a):n.update&&(n=n.update(n,o,a,new j5(e.state,r,!1)))?new t(this.source,this.explicit,s,n,n.from,(i=n.to)!==null&&i!==void 0?i:R1(e.state)):new AC(this.source,1,this.explicit)}map(e){return e.empty?this:(this.result.map?this.result.map(this.result,e):this.result)?new t(this.source,this.explicit,e.mapPos(this.limit),this.result,e.mapPos(this.from),e.mapPos(this.to,1)):new AC(this.source,0)}touches(e){return e.changes.touchesRange(this.from,this.to)}};function JmA(t,e,A,i){if(!t)return!1;let n=e.sliceDoc(A,i);return typeof t==\"function\"?t(n,A,i,e):KV(t,!0).test(n)}var px=Ui.define({map(t,e){return t.map(A=>A.map(e))}}),Vs=Qa.define({create(){return ux.start()},update(t,e){return t.update(e)},provide:t=>[EQ.from(t,e=>e.tooltip),ai.contentAttributes.from(t,e=>e.attrs)]});function Dx(t,e){let A=e.completion.apply||e.completion.label,i=t.state.field(Vs).active.find(n=>n.source==e.source);return i instanceof W5?(typeof A==\"string\"?t.dispatch(Ve(BA({},kmA(t.state,A,i.from,i.to)),{annotations:UV.of(e.completion)})):A(t,e.completion,i.from,i.to),!0):!1}var YmA=NmA(Vs,Dx);function P5(t,e=\"option\"){return A=>{let i=A.state.field(Vs,!1);if(!i||!i.open||i.open.disabled||Date.now()-i.open.timestamp<A.state.facet(Qr).interactionDelay)return!1;let n=1,o;e==\"page\"&&(o=oS(A,i.open.tooltip))&&(n=Math.max(2,Math.floor(o.dom.offsetHeight/o.dom.querySelector(\"li\").offsetHeight)-1));let{length:a}=i.open.options,r=i.open.selected>-1?i.open.selected+n*(t?1:-1):t?0:a-1;return r<0?r=e==\"page\"?0:a-1:r>=a&&(r=e==\"page\"?a-1:0),A.dispatch({effects:mx.of(r)}),!0}}var HmA=t=>{let e=t.state.field(Vs,!1);return t.state.readOnly||!e||!e.open||e.open.selected<0||e.open.disabled||Date.now()-e.open.timestamp<t.state.facet(Qr).interactionDelay?!1:Dx(t,e.open.options[e.open.selected])},Ix=t=>t.state.field(Vs,!1)?(t.dispatch({effects:V5.of(!0)}),!0):!1,TmA=t=>{let e=t.state.field(Vs,!1);return!e||!e.active.some(A=>A.state!=0)?!1:(t.dispatch({effects:U3.of(null)}),!0)},fx=class{constructor(e,A){this.active=e,this.context=A,this.time=Date.now(),this.updates=[],this.done=void 0}},OmA=50,zmA=1e3,PmA=ho.fromClass(class{constructor(t){this.view=t,this.debounceUpdate=-1,this.running=[],this.debounceAccept=-1,this.pendingStart=!1,this.composing=0;for(let e of t.state.field(Vs).active)e.isPending&&this.startQuery(e)}update(t){let e=t.state.field(Vs),A=t.state.facet(Qr);if(!t.selectionSet&&!t.docChanged&&t.startState.field(Vs)==e)return;let i=t.transactions.some(o=>{let a=JV(o,A);return a&8||(o.selection||o.docChanged)&&!(a&3)});for(let o=0;o<this.running.length;o++){let a=this.running[o];if(i||a.context.abortOnDocChange&&t.docChanged||a.updates.length+t.transactions.length>OmA&&Date.now()-a.time>zmA){for(let r of a.context.abortListeners)try{r()}catch(s){dr(this.view.state,s)}a.context.abortListeners=null,this.running.splice(o--,1)}else a.updates.push(...t.transactions)}this.debounceUpdate>-1&&clearTimeout(this.debounceUpdate),t.transactions.some(o=>o.effects.some(a=>a.is(V5)))&&(this.pendingStart=!0);let n=this.pendingStart?50:A.activateOnTypingDelay;if(this.debounceUpdate=e.active.some(o=>o.isPending&&!this.running.some(a=>a.active.source==o.source))?setTimeout(()=>this.startUpdate(),n):-1,this.composing!=0)for(let o of t.transactions)o.isUserEvent(\"input.type\")?this.composing=2:this.composing==2&&o.selection&&(this.composing=3)}startUpdate(){this.debounceUpdate=-1,this.pendingStart=!1;let{state:t}=this.view,e=t.field(Vs);for(let A of e.active)A.isPending&&!this.running.some(i=>i.active.source==A.source)&&this.startQuery(A);this.running.length&&e.open&&e.open.disabled&&(this.debounceAccept=setTimeout(()=>this.accept(),this.view.state.facet(Qr).updateSyncTime))}startQuery(t){let{state:e}=this.view,A=R1(e),i=new j5(e,A,t.explicit,this.view),n=new fx(t,i);this.running.push(n),Promise.resolve(t.source(i)).then(o=>{n.context.aborted||(n.done=o||null,this.scheduleAccept())},o=>{this.view.dispatch({effects:U3.of(null)}),dr(this.view.state,o)})}scheduleAccept(){this.running.every(t=>t.done!==void 0)?this.accept():this.debounceAccept<0&&(this.debounceAccept=setTimeout(()=>this.accept(),this.view.state.facet(Qr).updateSyncTime))}accept(){var t;this.debounceAccept>-1&&clearTimeout(this.debounceAccept),this.debounceAccept=-1;let e=[],A=this.view.state.facet(Qr),i=this.view.state.field(Vs);for(let n=0;n<this.running.length;n++){let o=this.running[n];if(o.done===void 0)continue;if(this.running.splice(n--,1),o.done){let r=R1(o.updates.length?o.updates[0].startState:this.view.state),s=Math.min(r,o.done.from+(o.active.explicit?0:1)),g=new W5(o.active.source,o.active.explicit,s,o.done,o.done.from,(t=o.done.to)!==null&&t!==void 0?t:r);for(let l of o.updates)g=g.update(l,A);if(g.hasResult()){e.push(g);continue}}let a=i.active.find(r=>r.source==o.active.source);if(a&&a.isPending)if(o.done==null){let r=new AC(o.active.source,0);for(let s of o.updates)r=r.update(s,A);r.isPending||e.push(r)}else this.startQuery(a)}(e.length||i.open&&i.open.disabled)&&this.view.dispatch({effects:px.of(e)})}},{eventHandlers:{blur(t){let e=this.view.state.field(Vs,!1);if(e&&e.tooltip&&this.view.state.facet(Qr).closeOnBlur){let A=e.open&&oS(this.view,e.open.tooltip);(!A||!A.dom.contains(t.relatedTarget))&&setTimeout(()=>this.view.dispatch({effects:U3.of(null)}),10)}},compositionstart(){this.composing=1},compositionend(){this.composing==3&&setTimeout(()=>this.view.dispatch({effects:V5.of(!1)}),20),this.composing=0}}}),jmA=typeof navigator==\"object\"&&/Win/.test(navigator.platform),qmA=zl.highest(ai.domEventHandlers({keydown(t,e){let A=e.state.field(Vs,!1);if(!A||!A.open||A.open.disabled||A.open.selected<0||t.key.length>1||t.ctrlKey&&!(jmA&&t.altKey)||t.metaKey)return!1;let i=A.open.options[A.open.selected],n=A.active.find(a=>a.source==i.source),o=i.completion.commitCharacters||n.result.commitCharacters;return o&&o.indexOf(t.key)>-1&&Dx(e,i),!1}})),VmA=ai.baseTheme({\".cm-tooltip.cm-tooltip-autocomplete\":{\"& > ul\":{fontFamily:\"monospace\",whiteSpace:\"nowrap\",overflow:\"hidden auto\",maxWidth_fallback:\"700px\",maxWidth:\"min(700px, 95vw)\",minWidth:\"250px\",maxHeight:\"10em\",height:\"100%\",listStyle:\"none\",margin:0,padding:0,\"& > li, & > completion-section\":{padding:\"1px 3px\",lineHeight:1.2},\"& > li\":{overflowX:\"hidden\",textOverflow:\"ellipsis\",cursor:\"pointer\"},\"& > completion-section\":{display:\"list-item\",borderBottom:\"1px solid silver\",paddingLeft:\"0.5em\",opacity:.7}}},\"&light .cm-tooltip-autocomplete ul li[aria-selected]\":{background:\"#17c\",color:\"white\"},\"&light .cm-tooltip-autocomplete-disabled ul li[aria-selected]\":{background:\"#777\"},\"&dark .cm-tooltip-autocomplete ul li[aria-selected]\":{background:\"#347\",color:\"white\"},\"&dark .cm-tooltip-autocomplete-disabled ul li[aria-selected]\":{background:\"#444\"},\".cm-completionListIncompleteTop:before, .cm-completionListIncompleteBottom:after\":{content:'\"\\xB7\\xB7\\xB7\"',opacity:.5,display:\"block\",textAlign:\"center\"},\".cm-tooltip.cm-completionInfo\":{position:\"absolute\",padding:\"3px 9px\",width:\"max-content\",maxWidth:\"400px\",boxSizing:\"border-box\",whiteSpace:\"pre-line\"},\".cm-completionInfo.cm-completionInfo-left\":{right:\"100%\"},\".cm-completionInfo.cm-completionInfo-right\":{left:\"100%\"},\".cm-completionInfo.cm-completionInfo-left-narrow\":{right:\"30px\"},\".cm-completionInfo.cm-completionInfo-right-narrow\":{left:\"30px\"},\"&light .cm-snippetField\":{backgroundColor:\"#00000022\"},\"&dark .cm-snippetField\":{backgroundColor:\"#ffffff22\"},\".cm-snippetFieldPosition\":{verticalAlign:\"text-top\",width:0,height:\"1.15em\",display:\"inline-block\",margin:\"0 -0.7px -.7em\",borderLeft:\"1.4px dotted #888\"},\".cm-completionMatchedText\":{textDecoration:\"underline\"},\".cm-completionDetail\":{marginLeft:\"0.5em\",fontStyle:\"italic\"},\".cm-completionIcon\":{fontSize:\"90%\",width:\".8em\",display:\"inline-block\",textAlign:\"center\",paddingRight:\".6em\",opacity:\"0.6\",boxSizing:\"content-box\"},\".cm-completionIcon-function, .cm-completionIcon-method\":{\"&:after\":{content:\"'\\u0192'\"}},\".cm-completionIcon-class\":{\"&:after\":{content:\"'\\u25CB'\"}},\".cm-completionIcon-interface\":{\"&:after\":{content:\"'\\u25CC'\"}},\".cm-completionIcon-variable\":{\"&:after\":{content:\"'\\u{1D465}'\"}},\".cm-completionIcon-constant\":{\"&:after\":{content:\"'\\u{1D436}'\"}},\".cm-completionIcon-type\":{\"&:after\":{content:\"'\\u{1D461}'\"}},\".cm-completionIcon-enum\":{\"&:after\":{content:\"'\\u222A'\"}},\".cm-completionIcon-property\":{\"&:after\":{content:\"'\\u25A1'\"}},\".cm-completionIcon-keyword\":{\"&:after\":{content:\"'\\u{1F511}\\uFE0E'\"}},\".cm-completionIcon-namespace\":{\"&:after\":{content:\"'\\u25A2'\"}},\".cm-completionIcon-text\":{\"&:after\":{content:\"'abc'\",fontSize:\"50%\",verticalAlign:\"middle\"}}});var J3={brackets:[\"(\",\"[\",\"{\",\"'\",'\"'],before:\")]}:;>\",stringPrefixes:[]},x1=Ui.define({map(t,e){let A=e.mapPos(t,-1,xr.TrackAfter);return A??void 0}}),wx=new class extends Zg{};wx.startSide=1;wx.endSide=-1;var YV=Qa.define({create(){return zn.empty},update(t,e){if(t=t.map(e.changes),e.selection){let A=e.state.doc.lineAt(e.selection.main.head);t=t.update({filter:i=>i>=A.from&&i<=A.to})}for(let A of e.effects)A.is(x1)&&(t=t.update({add:[wx.range(A.value,A.value+1)]}));return t}});function HV(){return[ZmA,YV]}var dx=\"()[]{}<>\\xAB\\xBB\\xBB\\xAB\\uFF3B\\uFF3D\\uFF5B\\uFF5D\";function TV(t){for(let e=0;e<dx.length;e+=2)if(dx.charCodeAt(e)==t)return dx.charAt(e+1);return t3(t<128?t:t+1)}function OV(t,e){return t.languageDataAt(\"closeBrackets\",e)[0]||J3}var WmA=typeof navigator==\"object\"&&/Android\\b/.test(navigator.userAgent),ZmA=ai.inputHandler.of((t,e,A,i)=>{if((WmA?t.composing:t.compositionStarted)||t.state.readOnly)return!1;let n=t.state.selection.main;if(i.length>2||i.length==2&&Eg(Fr(i,0))==1||e!=n.from||A!=n.to)return!1;let o=$mA(t.state,i);return o?(t.dispatch(o),!0):!1}),XmA=({state:t,dispatch:e})=>{if(t.readOnly)return!1;let i=OV(t,t.selection.main.head).brackets||J3.brackets,n=null,o=t.changeByRange(a=>{if(a.empty){let r=ApA(t.doc,a.head);for(let s of i)if(s==r&&Z5(t.doc,a.head)==TV(Fr(s,0)))return{changes:{from:a.head-s.length,to:a.head+s.length},range:ce.cursor(a.head-s.length)}}return{range:n=a}});return n||e(t.update(o,{scrollIntoView:!0,userEvent:\"delete.backward\"})),!n},zV=[{key:\"Backspace\",run:XmA}];function $mA(t,e){let A=OV(t,t.selection.main.head),i=A.brackets||J3.brackets;for(let n of i){let o=TV(Fr(n,0));if(e==n)return o==n?ipA(t,n,i.indexOf(n+n+n)>-1,A):epA(t,n,o,A.before||J3.before);if(e==o&&PV(t,t.selection.main.from))return tpA(t,n,o)}return null}function PV(t,e){let A=!1;return t.field(YV).between(0,t.doc.length,i=>{i==e&&(A=!0)}),A}function Z5(t,e){let A=t.sliceString(e,e+2);return A.slice(0,Eg(Fr(A,0)))}function ApA(t,e){let A=t.sliceString(e-2,e);return Eg(Fr(A,0))==A.length?A:A.slice(1)}function epA(t,e,A,i){let n=null,o=t.changeByRange(a=>{if(!a.empty)return{changes:[{insert:e,from:a.from},{insert:A,from:a.to}],effects:x1.of(a.to+e.length),range:ce.range(a.anchor+e.length,a.head+e.length)};let r=Z5(t.doc,a.head);return!r||/\\s/.test(r)||i.indexOf(r)>-1?{changes:{insert:e+A,from:a.head},effects:x1.of(a.head+e.length),range:ce.cursor(a.head+e.length)}:{range:n=a}});return n?null:t.update(o,{scrollIntoView:!0,userEvent:\"input.type\"})}function tpA(t,e,A){let i=null,n=t.changeByRange(o=>o.empty&&Z5(t.doc,o.head)==A?{changes:{from:o.head,to:o.head+A.length,insert:A},range:ce.cursor(o.head+A.length)}:i={range:o});return i?null:t.update(n,{scrollIntoView:!0,userEvent:\"input.type\"})}function ipA(t,e,A,i){let n=i.stringPrefixes||J3.stringPrefixes,o=null,a=t.changeByRange(r=>{if(!r.empty)return{changes:[{insert:e,from:r.from},{insert:e,from:r.to}],effects:x1.of(r.to+e.length),range:ce.range(r.anchor+e.length,r.head+e.length)};let s=r.head,g=Z5(t.doc,s),l;if(g==e){if(_V(t,s))return{changes:{insert:e+e,from:s},effects:x1.of(s+e.length),range:ce.cursor(s+e.length)};if(PV(t,s)){let I=A&&t.sliceDoc(s,s+e.length*3)==e+e+e?e+e+e:e;return{changes:{from:s,to:s+I.length,insert:I},range:ce.cursor(s+I.length)}}}else{if(A&&t.sliceDoc(s-2*e.length,s)==e+e&&(l=GV(t,s-2*e.length,n))>-1&&_V(t,l))return{changes:{insert:e+e+e+e,from:s},effects:x1.of(s+e.length),range:ce.cursor(s+e.length)};if(t.charCategorizer(s)(g)!=yo.Word&&GV(t,s,n)>-1&&!npA(t,s,e,n))return{changes:{insert:e+e,from:s},effects:x1.of(s+e.length),range:ce.cursor(s+e.length)}}return{range:o=r}});return o?null:t.update(a,{scrollIntoView:!0,userEvent:\"input.type\"})}function _V(t,e){let A=Br(t).resolveInner(e+1);return A.parent&&A.from==e}function npA(t,e,A,i){let n=Br(t).resolveInner(e,-1),o=i.reduce((a,r)=>Math.max(a,r.length),0);for(let a=0;a<5;a++){let r=t.sliceDoc(n.from,Math.min(n.to,n.from+A.length+o)),s=r.indexOf(A);if(!s||s>-1&&i.indexOf(r.slice(0,s))>-1){let l=n.firstChild;for(;l&&l.from==n.from&&l.to-l.from>A.length+s;){if(t.sliceDoc(l.to-A.length,l.to)==A)return!1;l=l.firstChild}return!0}let g=n.to==e&&n.parent;if(!g)break;n=g}return!1}function GV(t,e,A){let i=t.charCategorizer(e);if(i(t.sliceDoc(e-1,e))!=yo.Word)return e;for(let n of A){let o=e-n.length;if(t.sliceDoc(o,e)==n&&i(t.sliceDoc(o-1,o))!=yo.Word)return o}return-1}function jV(t={}){return[qmA,Vs,Qr.of(t),PmA,opA,VmA]}var yx=[{key:\"Ctrl-Space\",run:Ix},{mac:\"Alt-`\",run:Ix},{mac:\"Alt-i\",run:Ix},{key:\"Escape\",run:TmA},{key:\"ArrowDown\",run:P5(!0)},{key:\"ArrowUp\",run:P5(!1)},{key:\"PageDown\",run:P5(!0,\"page\")},{key:\"PageUp\",run:P5(!1,\"page\")},{key:\"Enter\",run:HmA}],opA=zl.highest(QQ.computeN([Qr],t=>t.facet(Qr).defaultKeymap?[yx]:[]));function apA(t,e=t.state){let A=new Set;for(let{from:i,to:n}of t.visibleRanges){let o=i;for(;o<=n;){let a=e.doc.lineAt(o);A.has(a)||A.add(a),o=a.to+1}}return A}function vx(t){let e=t.selection.main.head;return t.doc.lineAt(e)}function qV(t,e){let A=0;A:for(let i=0;i<t.length;i++)switch(t[i]){case\" \":case\"\\xA0\":{A+=1;continue A}case\"\t\":{A+=e-A%e;continue A}case\"\\r\":continue A;default:break A}return A}var $5=qe.define({combine(t){return Ir(t,{highlightActiveBlock:!0,hideFirstIndent:!1,markerType:\"fullScope\",thickness:1})}}),bx=class{constructor(e,A,i,n){this.lines=e,this.state=A,this.map=new Map,this.unitWidth=i,this.markerType=n;for(let o of this.lines)this.add(o);this.state.facet($5).highlightActiveBlock&&this.findAndSetActiveLines()}has(e){return this.map.has(typeof e==\"number\"?e:e.number)}get(e){let A=this.map.get(typeof e==\"number\"?e:e.number);if(!A)throw new Error(\"Line not found in indentation map\");return A}set(e,A,i){let n=!e.text.trim().length,o={line:e,col:A,level:i,empty:n};return this.map.set(o.line.number,o),o}add(e){if(this.has(e))return this.get(e);if(!e.length||!e.text.trim().length){if(e.number===1)return this.set(e,0,0);if(e.number===this.state.doc.lines){let a=this.closestNonEmpty(e,-1);return this.set(e,0,a.level)}let n=this.closestNonEmpty(e,-1),o=this.closestNonEmpty(e,1);return n.level>=o.level&&this.markerType!==\"codeOnly\"?this.set(e,0,n.level):n.empty&&n.level===0&&o.level!==0?this.set(e,0,0):o.level>n.level?this.set(e,0,n.level+1):this.set(e,0,o.level)}let A=qV(e.text,this.state.tabSize),i=Math.floor(A/this.unitWidth);return this.set(e,A,i)}closestNonEmpty(e,A){let i=e.number+A;for(;A===-1?i>=1:i<=this.state.doc.lines;){if(this.has(i)){let a=this.get(i);if(!a.empty)return a}let o=this.state.doc.line(i);if(o.text.trim().length){let a=qV(o.text,this.state.tabSize),r=Math.floor(a/this.unitWidth);return this.set(o,a,r)}i+=A}let n=this.state.doc.line(A===-1?1:this.state.doc.lines);return this.set(n,0,0)}findAndSetActiveLines(){let e=vx(this.state);if(!this.has(e))return;let A=this.get(e);if(this.has(A.line.number+1)){let o=this.get(A.line.number+1);o.level>A.level&&(A=o)}if(this.has(A.line.number-1)){let o=this.get(A.line.number-1);o.level>A.level&&(A=o)}if(A.level===0)return;A.active=A.level;let i,n;for(i=A.line.number;i>1;i--){if(!this.has(i-1))continue;let o=this.get(i-1);if(o.level<A.level)break;o.active=A.level}for(n=A.line.number;n<this.state.doc.lines;n++){if(!this.has(n+1))continue;let o=this.get(n+1);if(o.level<A.level)break;o.active=A.level}}};function rpA(t){let e={light:\"#F0F1F2\",dark:\"#2B3245\",activeLight:\"#E4E5E6\",activeDark:\"#3C445C\"},A=e;return t&&(A=Object.assign(Object.assign({},e),t)),ai.baseTheme({\"&light\":{\"--indent-marker-bg-color\":A.light,\"--indent-marker-active-bg-color\":A.activeLight},\"&dark\":{\"--indent-marker-bg-color\":A.dark,\"--indent-marker-active-bg-color\":A.activeDark},\".cm-line\":{position:\"relative\"},\".cm-indent-markers::before\":{content:'\"\"',position:\"absolute\",top:0,left:\"2px\",right:0,bottom:0,background:\"var(--indent-markers)\",pointerEvents:\"none\",zIndex:\"-1\"}})}function X5(t,e,A,i,n){return`${`repeating-linear-gradient(to right, var(${t}) 0 ${e}px, transparent ${e}px ${A}ch)`} ${i*A}.5ch/calc(${A*n}ch - 1px) no-repeat`}function spA(t,e,A,i,n){let{level:o,active:a}=t;if(n=n??i,A&&o===0)return[];let r=A?1:0,s=[];if(a!==void 0){let g=a-r-1;g>0&&s.push(X5(\"--indent-marker-bg-color\",i,e,r,g)),s.push(X5(\"--indent-marker-active-bg-color\",n,e,a-1,1)),a!==o&&s.push(X5(\"--indent-marker-bg-color\",i,e,a,o-a))}else s.push(X5(\"--indent-marker-bg-color\",i,e,r,o-r));return s.join(\",\")}var Mx=class{constructor(e){this.view=e,this.unitWidth=Xl(e.state),this.currentLineNumber=vx(e.state).number,this.generate(e.state)}update(e){let A=Xl(e.state),i=A!==this.unitWidth;i&&(this.unitWidth=A);let n=vx(e.state).number,o=n!==this.currentLineNumber;this.currentLineNumber=n;let a=e.state.facet($5).highlightActiveBlock&&o;(e.docChanged||e.viewportChanged||i||a)&&this.generate(e.state)}generate(e){let A=new Nr,i=apA(this.view,e),{hideFirstIndent:n,markerType:o,thickness:a,activeThickness:r}=e.facet($5),s=new bx(i,e,this.unitWidth,o);for(let g of i){let l=s.get(g.number);if(!l?.level)continue;let C=spA(l,this.unitWidth,n,a,r);A.add(g.from,g.from,vt.line({class:\"cm-indent-markers\",attributes:{style:`--indent-markers: ${C}`}}))}this.decorations=A.finish()}};function VV(t={}){return[$5.of(t),rpA(t.colors),ho.fromClass(Mx,{decorations:e=>e.decorations})]}var gpA=[\"mainAxis\",\"crossAxis\",\"fallbackPlacements\",\"fallbackStrategy\",\"fallbackAxisSideDirection\",\"flipAlignment\"],lpA=[\"mainAxis\",\"crossAxis\",\"limiter\"];function IZ(t,e){if(t==null)return{};var A,i,n=(function(a,r){if(a==null)return{};var s={};for(var g in a)if({}.hasOwnProperty.call(a,g)){if(r.indexOf(g)!==-1)continue;s[g]=a[g]}return s})(t,e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(t);for(i=0;i<o.length;i++)A=o[i],e.indexOf(A)===-1&&{}.propertyIsEnumerable.call(t,A)&&(n[A]=t[A])}return n}function WV(t,e){var A=Object.keys(t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);e&&(i=i.filter(function(n){return Object.getOwnPropertyDescriptor(t,n).enumerable})),A.push.apply(A,i)}return A}function ye(t){for(var e=1;e<arguments.length;e++){var A=arguments[e]!=null?arguments[e]:{};e%2?WV(Object(A),!0).forEach(function(i){a0(t,i,A[i])}):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(A)):WV(Object(A)).forEach(function(i){Object.defineProperty(t,i,Object.getOwnPropertyDescriptor(A,i))})}return t}function ZV(t,e,A,i,n,o,a){try{var r=t[o](a),s=r.value}catch(g){return void A(g)}r.done?e(s):Promise.resolve(s).then(i,n)}function Ut(t){return function(){var e=this,A=arguments;return new Promise(function(i,n){var o=t.apply(e,A);function a(s){ZV(o,i,n,a,r,\"next\",s)}function r(s){ZV(o,i,n,a,r,\"throw\",s)}a(void 0)})}}function dZ(t,e){BZ(t,e),e.add(t)}function lo(t,e,A){BZ(t,e),e.set(t,A)}function BZ(t,e){if(e.has(t))throw new TypeError(\"Cannot initialize the same private elements twice on an object\")}function on(t,e,A){return t.set(Ua(t,e),A),A}function De(t,e){return t.get(Ua(t,e))}function Ua(t,e,A){if(typeof t==\"function\"?t===e:t.has(e))return arguments.length<3?e:A;throw new TypeError(\"Private element is not present on this object\")}function a0(t,e,A){return(e=(function(i){var n=(function(o,a){if(typeof o!=\"object\"||!o)return o;var r=o[Symbol.toPrimitive];if(r!==void 0){var s=r.call(o,a||\"default\");if(typeof s!=\"object\")return s;throw new TypeError(\"@@toPrimitive must return a primitive value.\")}return(a===\"string\"?String:Number)(o)})(i,\"string\");return typeof n==\"symbol\"?n:n+\"\"})(e))in t?Object.defineProperty(t,e,{value:A,enumerable:!0,configurable:!0,writable:!0}):t[e]=A,t}var XV,kx,$V,Sx;typeof window<\"u\"&&((kx=(XV=(Sx=($V=window).__svelte)!==null&&Sx!==void 0?Sx:$V.__svelte={}).v)!==null&&kx!==void 0?kx:XV.v=new Set).add(\"5\");var lE=!1;lE=!0;var _r=Symbol(),CpA=!1,du=Array.isArray,IpA=Array.prototype.indexOf,hD=Array.from,dpA=Object.defineProperty,IC=Object.getOwnPropertyDescriptor,EZ=Object.getOwnPropertyDescriptors,BpA=Object.prototype,QpA=Array.prototype,GR=Object.getPrototypeOf,AW=Object.isExtensible;function Y3(t){return typeof t==\"function\"}var EpA=()=>{};function hpA(t){return t()}function iR(t){for(var e=0;e<t.length;e++)t[e]()}function hZ(){var t,e;return{promise:new Promise((A,i)=>{t=A,e=i}),resolve:t,reject:e}}var upA=1<<24,cE=16,qD=32,uZ=64,KR=128,rc=512,Gr=1024,sc=2048,hC=4096,l0=8192,CE=16384,UR=32768,P1=65536,fpA=1<<17,fZ=1<<18,mZ=1<<19,iC=1<<25,bD=32768,nR=1<<21,tI=1<<23,c0=Symbol(\"$state\"),pZ=Symbol(\"legacy props\"),mpA=Symbol(\"\"),UQ=new class extends Error{constructor(){super(...arguments),a0(this,\"name\",\"StaleReactionError\"),a0(this,\"message\",\"The reaction that called `getAbortSignal()` was re-run or destroyed\")}};function Bu(t){throw new Error(\"https://svelte.dev/e/lifecycle_outside_component\")}function DZ(t){return t===this.v}function wZ(t,e){return t!=t?e==e:t!==e||t!==null&&typeof t==\"object\"||typeof t==\"function\"}function yZ(t){return!wZ(t,this.v)}var Ao=null;function XQ(t){Ao=t}function cI(t){return vZ().get(t)}function kt(t){Ao={p:Ao,i:!1,c:null,e:null,s:t,x:null,l:lE&&!(arguments.length>1&&arguments[1]!==void 0&&arguments[1])?{s:null,u:null,$:[]}:null}}function St(t){var e=Ao,A=e.e;if(A!==null)for(var i of(e.e=null,A))TZ(i);return t!==void 0&&(e.x=t),e.i=!0,Ao=e.p,t??{}}function IE(){return!lE||Ao!==null&&Ao.l===null}function vZ(t){var e,A;return Ao===null&&Bu(),(A=(e=Ao).c)!==null&&A!==void 0?A:e.c=new Map((function(i){for(var n=i.p;n!==null;){var o=n.c;if(o!==null)return o;n=n.p}return null})(Ao)||void 0)}var J1=[];function bZ(){var t=J1;J1=[],iR(t)}function j1(t){if(J1.length===0&&!X3){var e=J1;queueMicrotask(()=>{e===J1&&bZ()})}J1.push(t)}function ppA(){for(;J1.length>0;)bZ()}function MZ(t){var e=Gn;if(e===null)return _n.f|=tI,t;if((e.f&UR)===0){if((e.f&KR)===0)throw t;e.b.error(t)}else $Q(t,e)}function $Q(t,e){for(;e!==null;){if((e.f&KR)!==0)try{return void e.b.error(t)}catch(A){t=A}e=e.parent}throw t}var uD=new Set,bo=null,Z3=null,sl=null,rl=[],VD=null,oR=!1,X3=!1,MD=new WeakMap,AD=new WeakMap,_1=new WeakMap,G1=new WeakMap,eD=new WeakMap,fD=new WeakMap,mD=new WeakMap,Dg=new WeakSet,q1=class t{constructor(){dZ(this,Dg),a0(this,\"committed\",!1),a0(this,\"current\",new Map),a0(this,\"previous\",new Map),lo(this,MD,new Set),lo(this,AD,new Set),lo(this,_1,0),lo(this,G1,0),lo(this,eD,null),lo(this,fD,[]),lo(this,mD,[]),a0(this,\"skipped_effects\",new Set),a0(this,\"is_fork\",!1)}is_deferred(){return this.is_fork||De(G1,this)>0}process(e){rl=[],Z3=null,this.apply();var A,i={parent:null,effect:null,effects:[],render_effects:[],block_effects:[]};for(var n of e)Ua(Dg,this,kZ).call(this,n,i);this.is_fork||Ua(Dg,this,DpA).call(this),this.is_deferred()?(Ua(Dg,this,zQ).call(this,i.effects),Ua(Dg,this,zQ).call(this,i.render_effects),Ua(Dg,this,zQ).call(this,i.block_effects)):(Z3=this,bo=null,eW(i.render_effects),eW(i.effects),Z3=null,(A=De(eD,this))===null||A===void 0||A.resolve()),sl=null}capture(e,A){var i;this.previous.has(e)||this.previous.set(e,A),(e.f&tI)===0&&(this.current.set(e,e.v),(i=sl)===null||i===void 0||i.set(e,e.v))}activate(){bo=this,this.apply()}deactivate(){bo===this&&(bo=null,sl=null)}flush(){if(this.activate(),rl.length>0){if(xZ(),bo!==null&&bo!==this)return}else De(_1,this)===0&&this.process([]);this.deactivate()}discard(){for(var e of De(AD,this))e(this);De(AD,this).clear()}increment(e){on(_1,this,De(_1,this)+1),e&&on(G1,this,De(G1,this)+1)}decrement(e){on(_1,this,De(_1,this)-1),e&&on(G1,this,De(G1,this)-1),this.revive()}revive(){for(var e of De(fD,this))Ur(e,sc),V1(e);for(var A of De(mD,this))Ur(A,hC),V1(A);on(fD,this,[]),on(mD,this,[]),this.flush()}oncommit(e){De(MD,this).add(e)}ondiscard(e){De(AD,this).add(e)}settled(){var e;return((e=De(eD,this))!==null&&e!==void 0?e:on(eD,this,hZ())).promise}static ensure(){if(bo===null){var e=bo=new t;uD.add(bo),X3||t.enqueue(()=>{bo===e&&e.flush()})}return bo}static enqueue(e){j1(e)}apply(){}};function kZ(t,e){t.f^=Gr;for(var A=t.first;A!==null;){var i,n=A.f,o=!!(96&n),a=o&&(n&Gr)!==0||(n&l0)!==0||this.skipped_effects.has(A);if((A.f&KR)!==0&&(i=A.b)!==null&&i!==void 0&&i.is_pending()&&(e={parent:e,effect:A,effects:[],render_effects:[],block_effects:[]}),!a&&A.fn!==null){o?A.f^=Gr:4&n?e.effects.push(A):QE(A)&&((A.f&cE)!==0&&e.block_effects.push(A),tE(A));var r=A.first;if(r!==null){A=r;continue}}var s=A.parent;for(A=A.next;A===null&&s!==null;)s===e.effect&&(Ua(Dg,this,zQ).call(this,e.effects),Ua(Dg,this,zQ).call(this,e.render_effects),Ua(Dg,this,zQ).call(this,e.block_effects),e=e.parent),A=s.next,s=s.parent}}function zQ(t){for(var e of t)((e.f&sc)!==0?De(fD,this):De(mD,this)).push(e),Ua(Dg,this,SZ).call(this,e.deps),Ur(e,Gr)}function SZ(t){if(t!==null)for(var e of t)2&e.f&&(e.f&bD)!==0&&(e.f^=bD,Ua(Dg,this,SZ).call(this,e.deps))}function DpA(){if(De(G1,this)===0){for(var t of De(MD,this))t();De(MD,this).clear()}De(_1,this)===0&&Ua(Dg,this,wpA).call(this)}function wpA(){if(uD.size>1){this.previous.clear();var t=sl,e=!0,A={parent:null,effect:null,effects:[],render_effects:[],block_effects:[]};for(var i of uD)if(i!==this){var n=[];for(var[o,a]of this.current){if(i.current.has(o)){if(!e||a===i.current.get(o))continue;i.current.set(o,a)}n.push(o)}if(n.length!==0){var r=[...i.current.keys()].filter(d=>!this.current.has(d));if(r.length>0){var s=rl;rl=[];var g=new Set,l=new Map;for(var C of n)RZ(C,r,g,l);if(rl.length>0){for(var I of(bo=i,i.apply(),rl))Ua(Dg,i,kZ).call(i,I,A);i.deactivate()}rl=s}}}else e=!1;bo=null,sl=t}this.committed=!0,uD.delete(this)}function uo(t){var e=X3;X3=!0;try{for(;;){var A;if(ppA(),rl.length===0&&((A=bo)===null||A===void 0||A.flush(),rl.length===0))return void(VD=null);xZ()}}finally{X3=e}}function xZ(){var t=H1;oR=!0;try{var e=0;for(kD(!0);rl.length>0;){var A=q1.ensure();e++>1e3&&ypA(),A.process(rl),iI.clear()}}finally{oR=!1,kD(t),VD=null}}function ypA(){try{(function(){throw new Error(\"https://svelte.dev/e/effect_update_depth_exceeded\")})()}catch(t){$Q(t,VD)}}var oC=null;function eW(t){var e=t.length;if(e!==0){for(var A=0;A<e;){var i,n=t[A++];if(!(24576&n.f)&&QE(n)&&(oC=new Set,tE(n),n.deps===null&&n.first===null&&n.nodes===null&&(n.teardown===null&&n.ac===null?qZ(n):n.fn=null),((i=oC)===null||i===void 0?void 0:i.size)>0)){for(var o of(iI.clear(),oC))if(!(24576&o.f)){for(var a=[o],r=o.parent;r!==null;)oC.has(r)&&(oC.delete(r),a.push(r)),r=r.parent;for(var s=a.length-1;s>=0;s--){var g=a[s];24576&g.f||tE(g)}}oC.clear()}}oC=null}}function RZ(t,e,A,i){if(!A.has(t)&&(A.add(t),t.reactions!==null))for(var n of t.reactions){var o=n.f;2&o?RZ(n,e,A,i):4194320&o&&(o&sc)===0&&NZ(n,e,i)&&(Ur(n,sc),V1(n))}}function NZ(t,e,A){var i=A.get(t);if(i!==void 0)return i;if(t.deps!==null)for(var n of t.deps){if(e.includes(n))return!0;if(2&n.f&&NZ(n,e,A))return A.set(n,!0),!0}return A.set(t,!1),!1}function V1(t){for(var e=VD=t;e.parent!==null;){var A=(e=e.parent).f;if(oR&&e===Gn&&(A&cE)!==0&&(A&fZ)===0)return;if(96&A){if((A&Gr)===0)return;e.f^=Gr}}rl.push(e)}var j2=new WeakMap,X2=new WeakMap,vpA=new WeakMap,K1=new WeakMap,xx=new WeakMap,Z2=new WeakMap,q2=new WeakMap,sC=new WeakMap,H2=new WeakMap,Y1=new WeakMap,PQ=new WeakMap,MQ=new WeakMap,jQ=new WeakMap,H3=new WeakMap,kQ=new WeakMap,tW=new WeakMap,O2=new WeakSet,aR=class{constructor(e,A,i){var n,o,a,r;dZ(this,O2),a0(this,\"parent\",void 0),lo(this,j2,!1),lo(this,X2,void 0),lo(this,vpA,null),lo(this,K1,void 0),lo(this,xx,void 0),lo(this,Z2,void 0),lo(this,q2,null),lo(this,sC,null),lo(this,H2,null),lo(this,Y1,null),lo(this,PQ,null),lo(this,MQ,0),lo(this,jQ,0),lo(this,H3,!1),lo(this,kQ,null),lo(this,tW,(n=()=>(on(kQ,this,uC(De(MQ,this))),()=>{on(kQ,this,null)}),a=0,r=uC(0),()=>{Au()&&(c(r),dE(()=>(a===0&&(o=QA(()=>n(()=>$3(r)))),a+=1,()=>{j1(()=>{var s;(a-=1)==0&&((s=o)===null||s===void 0||s(),o=void 0,$3(r))})})))})),on(X2,this,e),on(K1,this,A),on(xx,this,i),this.parent=Gn.b,on(j2,this,!!De(K1,this).pending),on(Z2,this,BE(()=>{Gn.b=this;var s=Ua(O2,this,bpA).call(this);try{on(q2,this,C0(()=>i(s)))}catch(g){this.error(g)}return De(jQ,this)>0?Ua(O2,this,nW).call(this):on(j2,this,!1),()=>{var g;(g=De(PQ,this))===null||g===void 0||g.remove()}},589952))}is_pending(){return De(j2,this)||!!this.parent&&this.parent.is_pending()}has_pending_snippet(){return!!De(K1,this).pending}update_pending_count(e){Ua(O2,this,FZ).call(this,e),on(MQ,this,De(MQ,this)+e),De(kQ,this)&&AE(De(kQ,this),De(MQ,this))}get_effect_pending(){return De(tW,this).call(this),c(De(kQ,this))}error(e){var A=De(K1,this).onerror,i=De(K1,this).failed;if(De(H3,this)||!A&&!i)throw e;De(q2,this)&&(Kr(De(q2,this)),on(q2,this,null)),De(sC,this)&&(Kr(De(sC,this)),on(sC,this,null)),De(H2,this)&&(Kr(De(H2,this)),on(H2,this,null));var n=!1,o=!1,a=()=>{n?console.warn(\"https://svelte.dev/e/svelte_boundary_reset_noop\"):(n=!0,o&&(function(){throw new Error(\"https://svelte.dev/e/svelte_boundary_reset_onerror\")})(),q1.ensure(),on(MQ,this,0),De(H2,this)!==null&&eE(De(H2,this),()=>{on(H2,this,null)}),on(j2,this,this.has_pending_snippet()),on(q2,this,Ua(O2,this,iW).call(this,()=>(on(H3,this,!1),C0(()=>De(xx,this).call(this,De(X2,this)))))),De(jQ,this)>0?Ua(O2,this,nW).call(this):on(j2,this,!1))},r=_n;try{Ag(null),o=!0,A?.(e,a),o=!1}catch(s){$Q(s,De(Z2,this)&&De(Z2,this).parent)}finally{Ag(r)}i&&j1(()=>{on(H2,this,Ua(O2,this,iW).call(this,()=>{q1.ensure(),on(H3,this,!0);try{return C0(()=>{i(De(X2,this),()=>e,()=>a)})}catch(s){return $Q(s,De(Z2,this).parent),null}finally{on(H3,this,!1)}}))})}};function bpA(){var t=De(X2,this);return De(j2,this)&&(on(PQ,this,nI()),De(X2,this).before(De(PQ,this)),t=De(PQ,this)),t}function iW(t){var e=Gn,A=_n,i=Ao;ll(De(Z2,this)),Ag(De(Z2,this)),XQ(De(Z2,this).ctx);try{return t()}catch(n){return MZ(n),null}finally{ll(e),Ag(A),XQ(i)}}function nW(){var t=De(K1,this).pending;De(q2,this)!==null&&(on(Y1,this,document.createDocumentFragment()),De(Y1,this).append(De(PQ,this)),ZZ(De(q2,this),De(Y1,this))),De(sC,this)===null&&on(sC,this,C0(()=>t(De(X2,this))))}function FZ(t){var e;this.has_pending_snippet()?(on(jQ,this,De(jQ,this)+t),De(jQ,this)===0&&(on(j2,this,!1),De(sC,this)&&eE(De(sC,this),()=>{on(sC,this,null)}),De(Y1,this)&&(De(X2,this).before(De(Y1,this)),on(Y1,this,null)))):this.parent&&Ua(O2,e=this.parent,FZ).call(e,t)}function LZ(t,e,A,i){var n=IE()?Qu:et;if(A.length!==0||t.length!==0){var o=bo,a=Gn,r=(function(){var g=Gn,l=_n,C=Ao,I=bo;return function(){var d=!(arguments.length>0&&arguments[0]!==void 0)||arguments[0];ll(g),Ag(l),XQ(C),d&&I?.activate()}})();t.length>0?Promise.all(t).then(()=>{r();try{return s()}finally{o?.deactivate(),tD()}}):s()}else i(e.map(n));function s(){Promise.all(A.map(g=>(function(l){var C=Gn;C===null&&(function(){throw new Error(\"https://svelte.dev/e/async_derived_orphan\")})();var I=C.b,d=void 0,B=uC(_r),Q=!_n,E=new Map;return(function(f){lc(4718592,f,!0)})(()=>{var f=hZ();d=f.promise;try{Promise.resolve(l()).then(f.resolve,f.reject).then(()=>{b===bo&&b.committed&&b.deactivate(),tD()})}catch(F){f.reject(F),tD()}var b=bo;if(Q){var R,M=!I.is_pending();I.update_pending_count(1),b.increment(M),(R=E.get(b))===null||R===void 0||R.reject(UQ),E.delete(b),E.set(b,f)}var v=function(F){var G=arguments.length>1&&arguments[1]!==void 0?arguments[1]:void 0;if(b.activate(),G)G!==UQ&&(B.f|=tI,AE(B,G));else for(var[U,Y]of((B.f&tI)!==0&&(B.f^=tI),AE(B,F),E)){if(E.delete(U),U===b)break;Y.reject(UQ)}Q&&(I.update_pending_count(-1),b.decrement(M))};f.promise.then(v,F=>v(null,F||\"unknown\"))}),ZD(()=>{for(var f of E.values())f.reject(UQ)}),new Promise(f=>{function b(R){function M(){R===d?f(B):b(d)}R.then(M,M)}b(d)})})(g))).then(g=>{r();try{i([...e.map(n),...g])}catch(l){(a.f&CE)===0&&$Q(l,a)}o?.deactivate(),tD()}).catch(g=>{$Q(g,a)})}}function tD(){ll(null),Ag(null),XQ(null)}function Qu(t){var e=_n!==null&&2&_n.f?_n:null;return Gn!==null&&(Gn.f|=mZ),{ctx:Ao,deps:null,effects:null,equals:DZ,f:2050,fn:t,reactions:null,rv:0,v:_r,wv:0,parent:e??Gn,ac:null}}function Zs(t){var e=Qu(t);return XZ(e),e}function et(t){var e=Qu(t);return e.equals=yZ,e}function _Z(t){var e=t.effects;if(e!==null){t.effects=null;for(var A=0;A<e.length;A+=1)Kr(e[A])}}function JR(t){var e,A=Gn;ll((function(i){for(var n=i.parent;n!==null;){if(!(2&n.f))return(n.f&CE)===0?n:null;n=n.parent}return null})(t));try{t.f&=-32769,_Z(t),e=tX(t)}finally{ll(A)}return e}function GZ(t){var e,A,i=JR(t);t.equals(i)||((e=bo)!==null&&e!==void 0&&e.is_fork||(t.v=i),t.wv=AX()),td||(sl!==null?(Au()||(A=bo)!==null&&A!==void 0&&A.is_fork)&&sl.set(t,i):Ur(t,(t.f&rc)===0?hC:Gr))}var dC,KZ,UZ,JZ,Rx=new Set,iI=new Map,oW=!1;function uC(t,e){return{f:0,v:t,reactions:null,equals:DZ,rv:0,wv:0}}function nC(t,e){var A=uC(t);return XZ(A),A}function CA(t){var e,A,i=arguments.length>1&&arguments[1]!==void 0&&arguments[1],n=!(arguments.length>2&&arguments[2]!==void 0)||arguments[2],o=uC(t);return i||(o.equals=yZ),lE&&n&&Ao!==null&&Ao.l!==null&&((A=(e=Ao.l).s)!==null&&A!==void 0?A:e.s=[]).push(o),o}function yg(t,e){return x(t,QA(()=>c(t))),e}function x(t,e){var A,i=arguments.length>2&&arguments[2]!==void 0&&arguments[2];return _n===null||s0&&(_n.f&fpA)===0||!IE()||!(4325394&_n.f)||(A=BC)!==null&&A!==void 0&&A.includes(t)||(function(){throw new Error(\"https://svelte.dev/e/state_unsafe_mutation\")})(),AE(t,i?JQ(e):e)}function AE(t,e){if(!t.equals(e)){var A=t.v;td?iI.set(t,e):iI.set(t,A),t.v=e;var i=q1.ensure();i.capture(t,A),2&t.f&&((t.f&sc)!==0&&JR(t),Ur(t,(t.f&rc)!==0?Gr:hC)),t.wv=AX(),YZ(t,sc),!IE()||Gn===null||(Gn.f&Gr)===0||96&Gn.f||(il===null?(function(n){il=n})([t]):il.push(t)),!i.is_fork&&Rx.size>0&&!oW&&(function(){oW=!1;var n=H1;kD(!0);var o=Array.from(Rx);try{for(var a of o)(a.f&Gr)!==0&&Ur(a,hC),QE(a)&&tE(a)}finally{kD(n)}Rx.clear()})()}return e}function aW(t){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:1,A=c(t),i=e===1?A++:A--;return x(t,A),i}function $3(t){x(t,t.v+1)}function YZ(t,e){var A=t.reactions;if(A!==null)for(var i=IE(),n=A.length,o=0;o<n;o++){var a=A[o],r=a.f;if(i||a!==Gn){var s=(r&sc)===0;if(s&&Ur(a,e),2&r){var g,l=a;(g=sl)===null||g===void 0||g.delete(l),(r&bD)===0&&(r&rc&&(a.f|=bD),YZ(l,hC))}else s&&((r&cE)!==0&&oC!==null&&oC.add(a),V1(a))}}}function JQ(t){if(typeof t!=\"object\"||t===null||c0 in t)return t;var e=GR(t);if(e!==BpA&&e!==QpA)return t;var A=new Map,i=du(t),n=nC(0),o=T1,a=r=>{if(T1===o)return r();var s=_n,g=T1;Ag(null),lW(o);var l=r();return Ag(s),lW(g),l};return i&&A.set(\"length\",nC(t.length)),new Proxy(t,{defineProperty(r,s,g){\"value\"in g&&g.configurable!==!1&&g.enumerable!==!1&&g.writable!==!1||(function(){throw new Error(\"https://svelte.dev/e/state_descriptors_fixed\")})();var l=A.get(s);return l===void 0?l=a(()=>{var C=nC(g.value);return A.set(s,C),C}):x(l,g.value,!0),!0},deleteProperty(r,s){var g=A.get(s);if(g===void 0){if(s in r){var l=a(()=>nC(_r));A.set(s,l),$3(n)}}else x(g,_r),$3(n);return!0},get(r,s,g){var l;if(s===c0)return t;var C=A.get(s),I=s in r;if(C===void 0&&(!I||(l=IC(r,s))!==null&&l!==void 0&&l.writable)&&(C=a(()=>nC(JQ(I?r[s]:_r))),A.set(s,C)),C!==void 0){var d=c(C);return d===_r?void 0:d}return Reflect.get(r,s,g)},getOwnPropertyDescriptor(r,s){var g=Reflect.getOwnPropertyDescriptor(r,s);if(g&&\"value\"in g){var l=A.get(s);l&&(g.value=c(l))}else if(g===void 0){var C=A.get(s),I=C?.v;if(C!==void 0&&I!==_r)return{enumerable:!0,configurable:!0,value:I,writable:!0}}return g},has(r,s){var g;if(s===c0)return!0;var l=A.get(s),C=l!==void 0&&l.v!==_r||Reflect.has(r,s);return(l!==void 0||Gn!==null&&(!C||(g=IC(r,s))!==null&&g!==void 0&&g.writable))&&(l===void 0&&(l=a(()=>nC(C?JQ(r[s]):_r)),A.set(s,l)),c(l)===_r)?!1:C},set(r,s,g,l){var C,I=A.get(s),d=s in r;if(i&&s===\"length\")for(var B=g;B<I.v;B+=1){var Q=A.get(B+\"\");Q!==void 0?x(Q,_r):B in r&&(Q=a(()=>nC(_r)),A.set(B+\"\",Q))}I===void 0?(!d||(C=IC(r,s))!==null&&C!==void 0&&C.writable)&&(x(I=a(()=>nC(void 0)),JQ(g)),A.set(s,I)):(d=I.v!==_r,x(I,a(()=>JQ(g))));var E=Reflect.getOwnPropertyDescriptor(r,s);if(E!=null&&E.set&&E.set.call(l,g),!d){if(i&&typeof s==\"string\"){var f=A.get(\"length\"),b=Number(s);Number.isInteger(b)&&b>=f.v&&x(f,b+1)}$3(n)}return!0},ownKeys(r){c(n);var s=Reflect.ownKeys(r).filter(C=>{var I=A.get(C);return I===void 0||I.v!==_r});for(var[g,l]of A)l.v===_r||g in r||s.push(g);return s},setPrototypeOf(){(function(){throw new Error(\"https://svelte.dev/e/state_prototype_fixed\")})()}})}function rW(t){try{if(t!==null&&typeof t==\"object\"&&c0 in t)return t[c0]}catch(e){}return t}function MpA(t,e){return Object.is(rW(t),rW(e))}function nI(){var t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:\"\";return document.createTextNode(t)}function vg(t){return UZ.call(t)}function Eu(t){return JZ.call(t)}function cA(t,e){return vg(t)}function $e(t){var e=vg(t);return e instanceof Comment&&e.data===\"\"?Eu(e):e}function bA(t){for(var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:1,A=t;e--;)A=Eu(A);return A}var sW=!1;function WD(t){var e=_n,A=Gn;Ag(null),ll(null);try{return t()}finally{Ag(e),ll(A)}}function kpA(t,e,A){var i=arguments.length>3&&arguments[3]!==void 0?arguments[3]:A;t.addEventListener(e,()=>WD(A));var n=t.__on_r;t.__on_r=n?()=>{n(),i(!0)}:()=>i(!0),sW||(sW=!0,document.addEventListener(\"reset\",o=>{Promise.resolve().then(()=>{if(!o.defaultPrevented)for(var a of o.target.elements){var r;(r=a.__on_r)===null||r===void 0||r.call(a)}})},{capture:!0}))}function HZ(t){Gn===null&&(_n===null&&(function(){throw new Error(\"https://svelte.dev/e/effect_orphan\")})(),(function(){throw new Error(\"https://svelte.dev/e/effect_in_unowned_derived\")})()),td&&(function(){throw new Error(\"https://svelte.dev/e/effect_in_teardown\")})()}function lc(t,e,A){var i=Gn;i!==null&&(i.f&l0)!==0&&(t|=l0);var n={ctx:Ao,deps:null,nodes:null,f:t|sc|rc,first:null,fn:e,last:null,next:null,parent:i,b:i&&i.b,prev:null,teardown:null,wv:0,ac:null};if(A)try{tE(n),n.f|=UR}catch(s){throw Kr(n),s}else e!==null&&V1(n);var o=n;if(A&&o.deps===null&&o.teardown===null&&o.nodes===null&&o.first===o.last&&(o.f&mZ)===0&&(o=o.first,(t&cE)!==0&&(t&P1)!==0&&o!==null&&(o.f|=P1)),o!==null&&(o.parent=i,i!==null&&(function(s,g){var l=g.last;l===null?g.last=g.first=s:(l.next=s,s.prev=l,g.last=s)})(o,i),_n!==null&&2&_n.f&&(t&uZ)===0)){var a,r=_n;((a=r.effects)!==null&&a!==void 0?a:r.effects=[]).push(o)}return n}function Au(){return _n!==null&&!s0}function ZD(t){var e=lc(8,null,!1);return Ur(e,Gr),e.teardown=t,e}function rR(t){HZ();var e=Gn.f;if(!(!_n&&(e&qD)!==0&&(e&UR)===0))return TZ(t);var A,i=Ao;((A=i.e)!==null&&A!==void 0?A:i.e=[]).push(t)}function TZ(t){return lc(1048580,t,!1)}function Er(t){return lc(4,t,!1)}function RA(t,e){var A={effect:null,ran:!1,deps:t};Ao.l.$.push(A),A.effect=dE(()=>{t(),A.ran||(A.ran=!0,QA(e))})}function mn(){var t=Ao;dE(()=>{for(var e of t.l.$){e.deps();var A=e.effect;(A.f&Gr)!==0&&Ur(A,hC),QE(A)&&tE(A),e.ran=!1}})}function dE(t){return lc(8|(arguments.length>1&&arguments[1]!==void 0?arguments[1]:0),t,!0)}function ve(t){LZ(arguments.length>3&&arguments[3]!==void 0?arguments[3]:[],arguments.length>1&&arguments[1]!==void 0?arguments[1]:[],arguments.length>2&&arguments[2]!==void 0?arguments[2]:[],e=>{lc(8,()=>t(...e.map(c)),!0)})}function BE(t){return lc(cE|(arguments.length>1&&arguments[1]!==void 0?arguments[1]:0),t,!0)}function OZ(t){return lc(upA|(arguments.length>1&&arguments[1]!==void 0?arguments[1]:0),t,!0)}function C0(t){return lc(524320,t,!0)}function zZ(t){var e=t.teardown;if(e!==null){var A=td,i=_n;gW(!0),Ag(null);try{e.call(null)}finally{gW(A),Ag(i)}}}function PZ(t){var e=arguments.length>1&&arguments[1]!==void 0&&arguments[1],A=t.first;t.first=t.last=null;for(var i,n=function(){var o=A.ac;o!==null&&WD(()=>{o.abort(UQ)}),i=A.next,(A.f&uZ)!==0?A.parent=null:Kr(A,e),A=i};A!==null;)n()}function Kr(t){var e=!(arguments.length>1&&arguments[1]!==void 0)||arguments[1],A=!1;!e&&(t.f&fZ)===0||t.nodes===null||t.nodes.end===null||(jZ(t.nodes.start,t.nodes.end),A=!0),PZ(t,e&&!A),SD(t,0),Ur(t,CE);var i=t.nodes&&t.nodes.t;if(i!==null)for(var n of i)n.stop();zZ(t);var o=t.parent;o!==null&&o.first!==null&&qZ(t),t.next=t.prev=t.teardown=t.ctx=t.deps=t.fn=t.nodes=t.ac=null}function jZ(t,e){for(;t!==null;){var A=t===e?null:Eu(t);t.remove(),t=A}}function qZ(t){var e=t.parent,A=t.prev,i=t.next;A!==null&&(A.next=i),i!==null&&(i.prev=A),e!==null&&(e.first===t&&(e.first=i),e.last===t&&(e.last=A))}function eE(t,e){var A=!(arguments.length>2&&arguments[2]!==void 0)||arguments[2],i=[];VZ(t,i,!0);var n=()=>{A&&Kr(t),e&&e()},o=i.length;if(o>0){var a=()=>--o||n();for(var r of i)r.out(a)}else n()}function VZ(t,e,A){if((t.f&l0)===0){t.f^=l0;var i=t.nodes&&t.nodes.t;if(i!==null)for(var n of i)(n.is_global||A)&&e.push(n);for(var o=t.first;o!==null;){var a=o.next;VZ(o,e,((o.f&P1)!==0||(o.f&qD)!==0&&(t.f&cE)!==0)&&A),o=a}}}function sR(t){WZ(t,!0)}function WZ(t,e){if((t.f&l0)!==0){t.f^=l0,(t.f&Gr)===0&&(Ur(t,sc),V1(t));for(var A=t.first;A!==null;){var i=A.next;WZ(A,((A.f&P1)!==0||(A.f&qD)!==0)&&e),A=i}var n=t.nodes&&t.nodes.t;if(n!==null)for(var o of n)(o.is_global||e)&&o.in()}}function ZZ(t,e){if(t.nodes)for(var A=t.nodes.start,i=t.nodes.end;A!==null;){var n=A===i?null:Eu(A);e.append(A),A=n}}var SpA=null;var H1=!1;function kD(t){H1=t}var td=!1;function gW(t){td=t}var _n=null,s0=!1;function Ag(t){_n=t}var Gn=null;function ll(t){Gn=t}var BC=null;function XZ(t){_n!==null&&(BC===null?BC=[t]:BC.push(t))}var fs=null,pg=0,il=null,$Z=1,eu=0,T1=eu;function lW(t){T1=t}function AX(){return++$Z}function QE(t){var e=t.f;if((e&sc)!==0)return!0;if(2&e&&(t.f&=-32769),(e&hC)!==0){var A=t.deps;if(A!==null)for(var i=A.length,n=0;n<i;n++){var o=A[n];if(QE(o)&&GZ(o),o.wv>t.wv)return!0}(e&rc)!==0&&sl===null&&Ur(t,Gr)}return!1}function eX(t,e){var A,i=!(arguments.length>2&&arguments[2]!==void 0)||arguments[2],n=t.reactions;if(n!==null&&((A=BC)===null||A===void 0||!A.includes(t)))for(var o=0;o<n.length;o++){var a=n[o];2&a.f?eX(a,e,!1):e===a&&(i?Ur(a,sc):(a.f&Gr)!==0&&Ur(a,hC),V1(a))}}function tX(t){var e=fs,A=pg,i=il,n=_n,o=BC,a=Ao,r=s0,s=T1,g=t.f;fs=null,pg=0,il=null,_n=96&g?null:t,BC=null,XQ(t.ctx),s0=!1,T1=++eu,t.ac!==null&&(WD(()=>{t.ac.abort(UQ)}),t.ac=null);try{t.f|=nR;var l=(0,t.fn)(),C=t.deps;if(fs!==null){var I;if(SD(t,pg),C!==null&&pg>0)for(C.length=pg+fs.length,I=0;I<fs.length;I++)C[pg+I]=fs[I];else t.deps=C=fs;if(Au()&&(t.f&rc)!==0)for(I=pg;I<C.length;I++){var d,B;((B=(d=C[I]).reactions)!==null&&B!==void 0?B:d.reactions=[]).push(t)}}else C!==null&&pg<C.length&&(SD(t,pg),C.length=pg);if(IE()&&il!==null&&!s0&&C!==null&&!(6146&t.f))for(I=0;I<il.length;I++)eX(il[I],t);return n!==null&&n!==t&&(eu++,il!==null&&(i===null?i=il:i.push(...il))),(t.f&tI)!==0&&(t.f^=tI),l}catch(Q){return MZ(Q)}finally{t.f^=nR,fs=e,pg=A,il=i,_n=n,BC=o,XQ(a),s0=r,T1=s}}function xpA(t,e){var A=e.reactions;if(A!==null){var i=IpA.call(A,t);if(i!==-1){var n=A.length-1;n===0?A=e.reactions=null:(A[i]=A[n],A.pop())}}A===null&&2&e.f&&(fs===null||!fs.includes(e))&&(Ur(e,hC),(e.f&rc)!==0&&(e.f^=rc,e.f&=-32769),_Z(e),SD(e,0))}function SD(t,e){var A=t.deps;if(A!==null)for(var i=e;i<A.length;i++)xpA(t,A[i])}function tE(t){var e=t.f;if((e&CE)===0){Ur(t,Gr);var A=Gn,i=H1;Gn=t,H1=!0;try{16777232&e?(function(o){for(var a=o.first;a!==null;){var r=a.next;(a.f&qD)===0&&Kr(a),a=r}})(t):PZ(t),zZ(t);var n=tX(t);t.teardown=typeof n==\"function\"?n:null,t.wv=$Z}finally{H1=i,Gn=A}}}function iX(){return nX.apply(this,arguments)}function nX(){return(nX=Ut(function*(){yield Promise.resolve(),uo()})).apply(this,arguments)}function c(t){var e,A,i,n,o,a=!!(2&t.f);if((e=SpA)===null||e===void 0||e.add(t),_n!==null&&!s0&&!(Gn!==null&&(Gn.f&CE)!==0||(o=BC)!==null&&o!==void 0&&o.includes(t))){var r=_n.deps;if((_n.f&nR)!==0)t.rv<eu&&(t.rv=eu,fs===null&&r!==null&&r[pg]===t?pg++:fs===null?fs=[t]:fs.includes(t)||fs.push(t));else{var s,g;((g=(s=_n).deps)!==null&&g!==void 0?g:s.deps=[]).push(t);var l=t.reactions;l===null?t.reactions=[_n]:l.includes(_n)||l.push(_n)}}if(td){if(iI.has(t))return iI.get(t);if(a){var C=t,I=C.v;return((C.f&Gr)===0&&C.reactions!==null||aX(C))&&(I=JR(C)),iI.set(C,I),I}}else a&&((A=sl)===null||A===void 0||!A.has(t)||(i=bo)!==null&&i!==void 0&&i.is_fork&&!Au())&&(QE(C=t)&&GZ(C),H1&&Au()&&(C.f&rc)===0&&oX(C));if((n=sl)!==null&&n!==void 0&&n.has(t))return sl.get(t);if((t.f&tI)!==0)throw t.v;return t.v}function oX(t){if(t.deps!==null)for(var e of(t.f^=rc,t.deps)){var A;((A=e.reactions)!==null&&A!==void 0?A:e.reactions=[]).push(t),2&e.f&&(e.f&rc)===0&&oX(e)}}function aX(t){if(t.v===_r)return!0;if(t.deps===null)return!1;for(var e of t.deps)if(iI.has(e)||2&e.f&&aX(e))return!0;return!1}function QA(t){var e=s0;try{return s0=!0,t()}finally{s0=e}}var RpA=-7169;function Ur(t,e){t.f=t.f&RpA|e}function _(t){if(typeof t==\"object\"&&t&&!(t instanceof EventTarget)){if(c0 in t)gR(t);else if(!Array.isArray(t))for(var e in t){var A=t[e];typeof A==\"object\"&&A&&c0 in A&&gR(A)}}}function gR(t){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:new Set;if(!(typeof t!=\"object\"||t===null||t instanceof EventTarget||e.has(t))){for(var A in e.add(t),t instanceof Date&&t.getTime(),t)try{gR(t[A],e)}catch(r){}var i=GR(t);if(i!==Object.prototype&&i!==Array.prototype&&i!==Map.prototype&&i!==Set.prototype&&i!==Date.prototype){var n=EZ(i);for(var o in n){var a=n[o].get;if(a)try{a.call(t)}catch(r){}}}}}var rX=new Set,lR=new Set;function sX(t,e,A){var i=arguments.length>3&&arguments[3]!==void 0?arguments[3]:{};function n(o){if(i.capture||j3.call(e,o),!o.cancelBubble)return WD(()=>A?.call(this,o))}return t.startsWith(\"pointer\")||t.startsWith(\"touch\")||t===\"wheel\"?j1(()=>{e.addEventListener(t,n,i)}):e.addEventListener(t,n,i),n}function ue(t,e,A,i,n){var o={capture:i,passive:n},a=sX(t,e,A,o);(e===document.body||e===window||e===document||e instanceof HTMLMediaElement)&&ZD(()=>{e.removeEventListener(t,a,o)})}function hu(t){for(var e=0;e<t.length;e++)rX.add(t[e]);for(var A of lR)A(t)}function j3(t){var e,A=this,i=A.ownerDocument,n=t.type,o=((e=t.composedPath)===null||e===void 0?void 0:e.call(t))||[],a=o[0]||t.target,r=0,s=t===t&&t.__root;if(s){var g=o.indexOf(s);if(g!==-1&&(A===document||A===window))return void(t.__root=A);var l=o.indexOf(A);if(l===-1)return;g<=l&&(r=g)}if((a=o[r]||t.target)!==A){dpA(t,\"currentTarget\",{configurable:!0,get:()=>a||i});var C=_n,I=Gn;Ag(null),ll(null);try{for(var d,B=[];a!==null;){var Q=a.assignedSlot||a.parentNode||a.host||null;try{var E=a[\"__\"+n];E==null||a.disabled&&t.target!==a||E.call(a,t)}catch(R){d?B.push(R):d=R}if(t.cancelBubble||Q===A||Q===null)break;a=Q}if(d){var f=function(R){queueMicrotask(()=>{throw R})};for(var b of B)f(b);throw d}}finally{t.__root=A,delete t.currentTarget,Ag(C),ll(I)}}}function YR(t){var e=document.createElement(\"template\");return e.innerHTML=t.replaceAll(\"<!>\",\"<!---->\"),e.content}function W1(t,e){var A=Gn;A.nodes===null&&(A.nodes={start:t,end:e,a:null,t:null})}function FA(t,e){var A,i=!!(1&e),n=!!(2&e),o=!t.startsWith(\"<!>\");return()=>{A===void 0&&(A=YR(o?t:\"<!>\"+t),i||(A=vg(A)));var a=n||KZ?document.importNode(A,!0):A.cloneNode(!0);return i?W1(vg(a),a.lastChild):W1(a,a),a}}function CI(t,e){return(function(A,i){var n,o=arguments.length>2&&arguments[2]!==void 0?arguments[2]:\"svg\",a=!A.startsWith(\"<!>\"),r=!!(1&i),s=\"<\".concat(o,\">\").concat(a?A:\"<!>\"+A,\"</\").concat(o,\">\");return()=>{if(!n){var g=vg(YR(s));if(r)for(n=document.createDocumentFragment();vg(g);)n.appendChild(vg(g));else n=vg(g)}var l=n.cloneNode(!0);return r?W1(vg(l),l.lastChild):W1(l,l),l}})(t,e,\"svg\")}function tr(){var t=nI((arguments.length>0&&arguments[0]!==void 0?arguments[0]:\"\")+\"\");return W1(t,t),t}function yi(){var t=document.createDocumentFragment(),e=document.createComment(\"\"),A=nI();return t.append(e,A),W1(e,A),t}function lA(t,e){t!==null&&t.before(e)}var NpA=[\"beforeinput\",\"click\",\"change\",\"dblclick\",\"contextmenu\",\"focusin\",\"focusout\",\"input\",\"keydown\",\"keyup\",\"mousedown\",\"mousemove\",\"mouseout\",\"mouseover\",\"mouseup\",\"pointerdown\",\"pointermove\",\"pointerout\",\"pointerover\",\"pointerup\",\"touchend\",\"touchmove\",\"touchstart\"],FpA={formnovalidate:\"formNoValidate\",ismap:\"isMap\",nomodule:\"noModule\",playsinline:\"playsInline\",readonly:\"readOnly\",defaultvalue:\"defaultValue\",defaultchecked:\"defaultChecked\",srcobject:\"srcObject\",novalidate:\"noValidate\",allowfullscreen:\"allowFullscreen\",disablepictureinpicture:\"disablePictureInPicture\",disableremoteplayback:\"disableRemotePlayback\"},LpA=[\"touchstart\",\"touchmove\"];function _pA(t){return LpA.includes(t)}function xt(t,e){var A,i=e==null?\"\":typeof e==\"object\"?e+\"\":e;i!==((A=t.__t)!==null&&A!==void 0?A:t.__t=t.nodeValue)&&(t.__t=i,t.nodeValue=i+\"\")}function GpA(t,e){return(function(A,i){var{target:n,anchor:o,props:a={},events:r,context:s,intro:g=!0}=i;(function(){if(dC===void 0){dC=window,KZ=/Firefox/.test(navigator.userAgent);var B=Element.prototype,Q=Node.prototype,E=Text.prototype;UZ=IC(Q,\"firstChild\").get,JZ=IC(Q,\"nextSibling\").get,AW(B)&&(B.__click=void 0,B.__className=void 0,B.__attributes=null,B.__style=void 0,B.__e=void 0),AW(E)&&(E.__t=void 0)}})();var l=new Set,C=B=>{for(var Q=0;Q<B.length;Q++){var E=B[Q];if(!l.has(E)){l.add(E);var f=_pA(E);n.addEventListener(E,j3,{passive:f});var b=SQ.get(E);b===void 0?(document.addEventListener(E,j3,{passive:f}),SQ.set(E,1)):SQ.set(E,b+1)}}};C(hD(rX)),lR.add(C);var I=void 0,d=(function(B){q1.ensure();var Q=lc(524352,B,!0);return function(){var E=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};return new Promise(f=>{E.outro?eE(Q,()=>{Kr(Q),f(void 0)}):(Kr(Q),f(void 0))})}})(()=>{var B=o??n.appendChild(nI());return(function(Q,E,f){new aR(Q,E,f)})(B,{pending:()=>{}},Q=>{s&&(kt({}),Ao.c=s),r&&(a.$$events=r),I=A(Q,a)||{},s&&St()}),()=>{for(var Q of l){n.removeEventListener(Q,j3);var E=SQ.get(Q);--E===0?(document.removeEventListener(Q,j3),SQ.delete(Q)):SQ.set(Q,E)}var f;lR.delete(C),B!==o&&((f=B.parentNode)===null||f===void 0||f.removeChild(B))}});return cR.set(I,d),I})(t,e)}var SQ=new Map,cR=new WeakMap,xQ,eC=new WeakMap,N1=new WeakMap,tC=new WeakMap,T3=new WeakMap,Nx=new WeakMap,cW=new WeakMap,KpA=new WeakMap,iE=class{constructor(e){var A=this,i=!(arguments.length>1&&arguments[1]!==void 0)||arguments[1];a0(this,\"anchor\",void 0),lo(this,eC,new Map),lo(this,N1,new Map),lo(this,tC,new Map),lo(this,T3,new Set),lo(this,Nx,!0),lo(this,cW,()=>{var n=bo;if(De(eC,this).has(n)){var o=De(eC,this).get(n),a=De(N1,this).get(o);if(a)sR(a),De(T3,this).delete(o);else{var r=De(tC,this).get(o);r&&(De(N1,this).set(o,r.effect),De(tC,this).delete(o),r.fragment.lastChild.remove(),this.anchor.before(r.fragment),a=r.effect)}for(var[s,g]of De(eC,this)){if(De(eC,this).delete(s),s===n)break;var l=De(tC,this).get(g);l&&(Kr(l.effect),De(tC,this).delete(g))}var C=function(B,Q){if(B===o||De(T3,A).has(B))return 1;var E=()=>{if(Array.from(De(eC,A).values()).includes(B)){var f=document.createDocumentFragment();ZZ(Q,f),f.append(nI()),De(tC,A).set(B,{effect:Q,fragment:f})}else Kr(Q);De(T3,A).delete(B),De(N1,A).delete(B)};De(Nx,A)||!a?(De(T3,A).add(B),eE(Q,E,!1)):E()};for(var[I,d]of De(N1,this))C(I,d)}}),lo(this,KpA,n=>{De(eC,this).delete(n);var o=Array.from(De(eC,this).values());for(var[a,r]of De(tC,this))o.includes(a)||(Kr(r.effect),De(tC,this).delete(a))}),this.anchor=e,on(Nx,this,i)}ensure(e,A){var i=bo;!A||De(N1,this).has(e)||De(tC,this).has(e)||De(N1,this).set(e,C0(()=>A(this.anchor))),De(eC,this).set(i,e),De(cW,this).call(this)}};function Jr(t){Ao===null&&Bu(),lE&&Ao.l!==null?gX(Ao).m.push(t):rR(()=>{var e=QA(t);if(typeof e==\"function\")return e})}function cl(t){Ao===null&&Bu(),Jr(()=>()=>QA(t))}function UpA(){var t=Ao;return t===null&&Bu(),(e,A,i)=>{var n,o=(n=t.s.$$events)===null||n===void 0?void 0:n[e];if(o){var a=du(o)?o.slice():[o],r=(function(g,l){var{bubbles:C=!1,cancelable:I=!1}=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};return new CustomEvent(g,{detail:l,bubbles:C,cancelable:I})})(e,A,i);for(var s of a)s.call(t.x,r);return!r.defaultPrevented}return!0}}function JpA(t){Ao===null&&Bu(),Ao.l===null&&(function(){throw new Error(\"https://svelte.dev/e/lifecycle_legacy_only\")})(),gX(Ao).b.push(t)}function gX(t){var e,A=t.l;return(e=A.u)!==null&&e!==void 0?e:A.u={a:[],b:[],m:[]}}function YA(t,e){var A=arguments.length>2&&arguments[2]!==void 0&&arguments[2],i=new iE(t);function n(o,a){i.ensure(o,a)}BE(()=>{var o=!1;e(function(a){o=!0,n(!(arguments.length>1&&arguments[1]!==void 0)||arguments[1],a)}),o||n(!1,null)},A?P1:0)}function lX(t,e,A){var i=new iE(t),n=!IE();BE(()=>{var o=e();n&&o!==null&&typeof o==\"object\"&&(o={}),i.ensure(o,A)})}function ha(t,e){return e}function Fx(t){for(var e=!(arguments.length>1&&arguments[1]!==void 0)||arguments[1],A=0;A<t.length;A++)Kr(t[A],e)}function ea(t,e,A,i,n){var o=arguments.length>5&&arguments[5]!==void 0?arguments[5]:null,a=t,r=new Map;!(4&e)||(a=t.appendChild(nI()));var s,g=null,l=et(()=>{var Q=A();return du(Q)?Q:Q==null?[]:hD(Q)}),C=!0;function I(){B.fallback=g,(function(Q,E,f,b,R){var M,v,F,G,U,Y=!!(8&b),j=E.length,AA=Q.items,z=Q.effect.first,yA=null,P=[],nA=[];if(Y)for(U=0;U<j;U+=1){var eA;F=R(E[U],U),((G=AA.get(F).e).f&iC)===0&&((eA=G.nodes)===null||eA===void 0||(eA=eA.a)===null||eA===void 0||eA.measure(),(v??(v=new Set)).add(G))}for(U=0;U<j;U+=1){if(F=R(E[U],U),G=AA.get(F).e,Q.outrogroups!==null)for(var dA of Q.outrogroups)dA.pending.delete(G),dA.done.delete(G);if((G.f&iC)!==0){if(G.f^=iC,G!==z){var iA=yA?yA.next:z;G===Q.effect.last&&(Q.effect.last=G.prev),G.prev&&(G.prev.next=G.next),G.next&&(G.next.prev=G.prev),T2(Q,yA,G),T2(Q,G,iA),O3(G,iA,f),P=[],nA=[],z=(yA=G).next;continue}O3(G,null,f)}var aA;if((G.f&l0)!==0&&(sR(G),Y&&((aA=G.nodes)===null||aA===void 0||(aA=aA.a)===null||aA===void 0||aA.unfix(),(v??(v=new Set)).delete(G))),G!==z){if(M!==void 0&&M.has(G)){if(P.length<nA.length){var hA,JA=nA[0];yA=JA.prev;var ee=P[0],UA=P[P.length-1];for(hA=0;hA<P.length;hA+=1)O3(P[hA],JA,f);for(hA=0;hA<nA.length;hA+=1)M.delete(nA[hA]);T2(Q,ee.prev,UA.next),T2(Q,yA,ee),T2(Q,UA,JA),z=JA,yA=UA,U-=1,P=[],nA=[]}else M.delete(G),O3(G,z,f),T2(Q,G.prev,G.next),T2(Q,G,yA===null?Q.effect.first:yA.next),T2(Q,yA,G),yA=G;continue}for(P=[],nA=[];z!==null&&z!==G;)(M??(M=new Set)).add(z),nA.push(z),z=z.next;if(z===null)continue}(G.f&iC)===0&&P.push(G),yA=G,z=G.next}if(Q.outrogroups!==null){for(var mA of Q.outrogroups){var KA;mA.pending.size===0&&(Fx(hD(mA.done)),(KA=Q.outrogroups)===null||KA===void 0||KA.delete(mA))}Q.outrogroups.size===0&&(Q.outrogroups=null)}if(z!==null||M!==void 0){var ze=[];if(M!==void 0)for(G of M)(G.f&l0)===0&&ze.push(G);for(;z!==null;)(z.f&l0)===0&&z!==Q.fallback&&ze.push(z),z=z.next;var Ke=ze.length;if(Ke>0){var HA=4&b&&j===0?f:null;if(Y){for(U=0;U<Ke;U+=1){var uA;(uA=ze[U].nodes)===null||uA===void 0||(uA=uA.a)===null||uA===void 0||uA.measure()}for(U=0;U<Ke;U+=1){var XA;(XA=ze[U].nodes)===null||XA===void 0||(XA=XA.a)===null||XA===void 0||XA.fix()}}(function(EA,ZA,MA){for(var be,_A=ZA.length,pA=ZA.length,Rt=function(){var ht=ZA[Et];eE(ht,()=>{if(be){if(be.pending.delete(ht),be.done.add(ht),be.pending.size===0){var Me=EA.outrogroups;Fx(hD(be.done)),Me.delete(be),Me.size===0&&(EA.outrogroups=null)}}else pA-=1},!1)},Et=0;Et<_A;Et++)Rt();if(pA===0){var Qe=MA!==null;if(Qe){var _t=MA,Ue=_t.parentNode;Ue.textContent=\"\",Ue.append(_t),EA.items.clear()}Fx(ZA,!Qe)}else{var Te;be={pending:new Set(ZA),done:new Set},((Te=EA.outrogroups)!==null&&Te!==void 0?Te:EA.outrogroups=new Set).add(be)}})(Q,ze,HA)}}Y&&j1(()=>{if(v!==void 0)for(G of v){var EA;(EA=G.nodes)===null||EA===void 0||(EA=EA.a)===null||EA===void 0||EA.apply()}})})(B,s,a,e,i),g!==null&&(s.length===0?(g.f&iC)===0?sR(g):(g.f^=iC,O3(g,null,a)):eE(g,()=>{g=null}))}var d=BE(()=>{for(var Q=(s=c(l)).length,E=new Set,f=0;f<Q;f+=1){var b=s[f],R=i(b,f),M=C?null:r.get(R);M?(M.v&&AE(M.v,b),M.i&&AE(M.i,f)):(M=YpA(r,C?a:xQ??(xQ=nI()),b,R,f,n,e,A),C||(M.e.f|=iC),r.set(R,M)),E.add(R)}Q===0&&o&&!g&&(C?g=C0(()=>o(a)):(g=C0(()=>o(xQ??(xQ=nI())))).f|=iC),C||I(),c(l)}),B={effect:d,items:r,outrogroups:null,fallback:g};C=!1}function YpA(t,e,A,i,n,o,a,r){var s=1&a?16&a?uC(A):CA(A,!1,!1):null,g=2&a?uC(n):null;return{v:s,i:g,e:C0(()=>(o(e,s??A,g??n,r),()=>{t.delete(i)}))}}function O3(t,e,A){if(t.nodes)for(var i=t.nodes.start,n=t.nodes.end,o=e&&(e.f&iC)===0?e.nodes.start:A;i!==null;){var a=Eu(i);if(o.before(i),i===n)return;i=a}}function T2(t,e,A){e===null?t.effect.first=A:e.next=A,A===null?t.effect.last=e:A.prev=e}function cX(t,e){var A=arguments.length>2&&arguments[2]!==void 0&&arguments[2],i=arguments.length>3&&arguments[3]!==void 0&&arguments[3],n=t,o=\"\";ve(()=>{var a,r=Gn;if(o!==(o=(a=e())!==null&&a!==void 0?a:\"\")&&(r.nodes!==null&&(jZ(r.nodes.start,r.nodes.end),r.nodes=null),o!==\"\")){var s=o+\"\";A?s=\"<svg>\".concat(s,\"</svg>\"):i&&(s=\"<math>\".concat(s,\"</math>\"));var g=YR(s);if((A||i)&&(g=vg(g)),W1(vg(g),g.lastChild),A||i)for(;vg(g);)n.before(vg(g));else n.before(g)}})}function Aa(t,e,A,i,n){var o,a=(o=e.$$slots)===null||o===void 0?void 0:o[A],r=!1;a===!0&&(a=e[A===\"default\"?\"children\":A],r=!0),a===void 0?n!==null&&n(t):a(t,r?()=>i:i)}function CX(t,e,A){var i=new iE(t);BE(()=>{var n,o=(n=e())!==null&&n!==void 0?n:null;i.ensure(o,o&&(a=>A(a,o)))},P1)}function as(t,e,A){Er(()=>{var i=QA(()=>e(t,A?.())||{});if(A&&i!=null&&i.update){var n=!1,o={};dE(()=>{var a=A();_(a),n&&wZ(o,a)&&(o=a,i.update(a))}),n=!0}if(i!=null&&i.destroy)return()=>i.destroy()})}function HpA(t,e){var A,i=void 0;OZ(()=>{i!==(i=e())&&(A&&(Kr(A),A=null),i&&(A=C0(()=>{Er(()=>i(t))})))})}function IX(t){var e,A,i=\"\";if(typeof t==\"string\"||typeof t==\"number\")i+=t;else if(typeof t==\"object\")if(Array.isArray(t)){var n=t.length;for(e=0;e<n;e++)t[e]&&(A=IX(t[e]))&&(i&&(i+=\" \"),i+=A)}else for(A in t)t[A]&&(i&&(i+=\" \"),i+=A);return i}function sI(t){return typeof t==\"object\"?(function(){for(var e,A,i=0,n=\"\",o=arguments.length;i<o;i++)(e=arguments[i])&&(A=IX(e))&&(n&&(n+=\" \"),n+=A);return n})(t):t??\"\"}var CW=[...` \t\n\\r\\f\\xA0\\v\\uFEFF`];function IW(t){var e=arguments.length>1&&arguments[1]!==void 0&&arguments[1]?\" !important;\":\";\",A=\"\";for(var i in t){var n=t[i];n!=null&&n!==\"\"&&(A+=\" \"+i+\": \"+n+e)}return A}function Lx(t){return t[0]!==\"-\"||t[1]!==\"-\"?t.toLowerCase():t}function Xt(t,e,A,i,n,o){var a=t.__className;if(a!==A||a===void 0){var r=(function(l,C,I){var d=l==null?\"\":\"\"+l;if(C&&(d=d?d+\" \"+C:C),I){for(var B in I)if(I[B])d=d?d+\" \"+B:B;else if(d.length)for(var Q=B.length,E=0;(E=d.indexOf(B,E))>=0;){var f=E+Q;E!==0&&!CW.includes(d[E-1])||f!==d.length&&!CW.includes(d[f])?E=f:d=(E===0?\"\":d.substring(0,E))+d.substring(f+1)}}return d===\"\"?null:d})(A,i,o);r==null?t.removeAttribute(\"class\"):e?t.className=r:t.setAttribute(\"class\",r),t.__className=A}else if(o&&n!==o)for(var s in o){var g=!!o[s];n!=null&&g===!!n[s]||t.classList.toggle(s,g)}return o}function _x(t){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},A=arguments.length>2?arguments[2]:void 0,i=arguments.length>3?arguments[3]:void 0;for(var n in A){var o=A[n];e[n]!==o&&(A[n]==null?t.style.removeProperty(n):t.style.setProperty(n,o,i))}}function gl(t,e,A,i){if(t.__style!==e){var n=(function(o,a){if(a){var r,s,g=\"\";if(Array.isArray(a)?(r=a[0],s=a[1]):r=a,o){o=String(o).replaceAll(/\\s*\\/\\*.*?\\*\\/\\s*/g,\"\").trim();var l=!1,C=0,I=!1,d=[];r&&d.push(...Object.keys(r).map(Lx)),s&&d.push(...Object.keys(s).map(Lx));for(var B=0,Q=-1,E=o.length,f=0;f<E;f++){var b=o[f];if(I?b===\"/\"&&o[f-1]===\"*\"&&(I=!1):l?l===b&&(l=!1):b===\"/\"&&o[f+1]===\"*\"?I=!0:b==='\"'||b===\"'\"?l=b:b===\"(\"?C++:b===\")\"&&C--,!I&&l===!1&&C===0){if(b===\":\"&&Q===-1)Q=f;else if(b===\";\"||f===E-1){if(Q!==-1){var R=Lx(o.substring(B,Q).trim());d.includes(R)||(b!==\";\"&&f++,g+=\" \"+o.substring(B,f).trim()+\";\")}B=f+1,Q=-1}}}}return r&&(g+=IW(r)),s&&(g+=IW(s,!0)),(g=g.trim())===\"\"?null:g}return o==null?null:String(o)})(e,i);n==null?t.removeAttribute(\"style\"):t.style.cssText=n,t.__style=e}else i&&(Array.isArray(i)?(_x(t,A?.[0],i[0]),_x(t,A?.[1],i[1],\"important\")):_x(t,A,i));return i}function CR(t,e){var A=arguments.length>2&&arguments[2]!==void 0&&arguments[2];if(t.multiple){if(e==null)return;if(!du(e))return void console.warn(\"https://svelte.dev/e/select_multiple_invalid_value\");for(var i of t.options)i.selected=e.includes(dW(i))}else{for(i of t.options)if(MpA(dW(i),e))return void(i.selected=!0);A&&e===void 0||(t.selectedIndex=-1)}}function TpA(t){var e=new MutationObserver(()=>{CR(t,t.__value)});e.observe(t,{childList:!0,subtree:!0,attributes:!0,attributeFilter:[\"value\"]}),ZD(()=>{e.disconnect()})}function dW(t){return\"__value\"in t?t.__value:t.value}var GQ=Symbol(\"class\"),z3=Symbol(\"style\"),dX=Symbol(\"is custom element\"),BX=Symbol(\"is html\");function Z1(t,e){var A=HR(t);A.value!==(A.value=e??void 0)&&(t.value!==e||e===0&&t.nodeName===\"PROGRESS\")&&(t.value=e??\"\")}function fn(t,e,A,i){var n=HR(t);n[e]!==(n[e]=A)&&(e===\"loading\"&&(t[mpA]=A),A==null?t.removeAttribute(e):typeof A!=\"string\"&&QX(t).includes(e)?t[e]=A:t.setAttribute(e,A))}function OpA(t,e,A,i){var n,o=HR(t),a=o[dX],r=!o[BX],s=e||{},g=t.tagName===\"OPTION\";for(var l in e)l in A||(A[l]=null);A.class?A.class=sI(A.class):(i||A[GQ])&&(A.class=null),A[z3]&&((n=A.style)!==null&&n!==void 0||(A.style=null));var C,I,d,B,Q,E,f=QX(t),b=function(M){var v=A[M];if(g&&M===\"value\"&&v==null)return t.value=t.__value=\"\",s[M]=v,0;if(M===\"class\")return C=t.namespaceURI===\"http://www.w3.org/1999/xhtml\",Xt(t,C,v,i,e?.[GQ],A[GQ]),s[M]=v,s[GQ]=A[GQ],0;if(M===\"style\")return gl(t,v,e?.[z3],A[z3]),s[M]=v,s[z3]=A[z3],0;if(v===(I=s[M])&&(v!==void 0||!t.hasAttribute(M))||(s[M]=v,(d=M[0]+M[1])===\"$$\"))return 0;if(d===\"on\"){var F={},G=\"$$\"+M,U=M.slice(2);if(B=(function(P){return NpA.includes(P)})(U),(function(P){return P.endsWith(\"capture\")&&P!==\"gotpointercapture\"&&P!==\"lostpointercapture\"})(U)&&(U=U.slice(0,-7),F.capture=!0),!B&&I){if(v!=null)return 0;t.removeEventListener(U,s[G],F),s[G]=null}if(v!=null)if(B)t[\"__\".concat(U)]=v,hu([U]);else{let P=function(nA){s[M].call(this,nA)};var yA=P;s[G]=sX(U,t,P,F)}else B&&(t[\"__\".concat(U)]=void 0)}else if(M===\"style\")fn(t,M,v);else if(M===\"autofocus\")(function(P,nA){if(nA){var eA=document.body;P.autofocus=!0,j1(()=>{document.activeElement===eA&&P.focus()})}})(t,!!v);else if(a||M!==\"__value\"&&(M!==\"value\"||v==null))if(M===\"selected\"&&g)(function(P,nA){nA?P.hasAttribute(\"selected\")||P.setAttribute(\"selected\",\"\"):P.removeAttribute(\"selected\")})(t,v);else if(Q=M,r||(Q=(function(P){var nA;return P=P.toLowerCase(),(nA=FpA[P])!==null&&nA!==void 0?nA:P})(Q)),E=Q===\"defaultValue\"||Q===\"defaultChecked\",v!=null||a||E)E||f.includes(Q)&&(a||typeof v!=\"string\")?(t[Q]=v,Q in o&&(o[Q]=_r)):typeof v!=\"function\"&&fn(t,Q,v);else if(o[M]=null,Q===\"value\"||Q===\"checked\"){var Y=t,j=e===void 0;if(Q===\"value\"){var AA=Y.defaultValue;Y.removeAttribute(Q),Y.defaultValue=AA,Y.value=Y.__value=j?AA:null}else{var z=Y.defaultChecked;Y.removeAttribute(Q),Y.defaultChecked=z,Y.checked=!!j&&z}}else t.removeAttribute(M);else t.value=t.__value=v};for(var R in A)b(R);return s}function pD(t,e){var A=arguments.length>5?arguments[5]:void 0,i=arguments.length>6&&arguments[6]!==void 0&&arguments[6],n=arguments.length>7&&arguments[7]!==void 0&&arguments[7];LZ(arguments.length>4&&arguments[4]!==void 0?arguments[4]:[],arguments.length>2&&arguments[2]!==void 0?arguments[2]:[],arguments.length>3&&arguments[3]!==void 0?arguments[3]:[],o=>{var a=void 0,r={},s=t.nodeName===\"SELECT\",g=!1;if(OZ(()=>{var C=e(...o.map(c)),I=OpA(t,a,C,A,i,n);for(var d of(g&&s&&\"value\"in C&&CR(t,C.value),Object.getOwnPropertySymbols(r)))C[d]||Kr(r[d]);for(var B of Object.getOwnPropertySymbols(C)){var Q=C[B];B.description!==\"@attach\"||a&&Q===a[B]||(r[B]&&Kr(r[B]),r[B]=C0(()=>HpA(t,()=>Q))),I[B]=Q}a=I}),s){var l=t;Er(()=>{CR(l,a.value,!0),TpA(l)})}g=!0})}function HR(t){var e;return(e=t.__attributes)!==null&&e!==void 0?e:t.__attributes={[dX]:t.nodeName.includes(\"-\"),[BX]:t.namespaceURI===\"http://www.w3.org/1999/xhtml\"}}var BW=new Map;function QX(t){var e,A=t.getAttribute(\"is\")||t.nodeName,i=BW.get(A);if(i)return i;BW.set(A,i=[]);for(var n=t,o=Element.prototype;o!==n;){for(var a in e=EZ(n))e[a].set&&i.push(a);n=GR(n)}return i}function xD(t,e){var A=arguments.length>2&&arguments[2]!==void 0?arguments[2]:e,i=new WeakSet;kpA(t,\"input\",(function(){var n=Ut(function*(o){var a=o?t.defaultValue:t.value;if(a=Gx(t)?Kx(a):a,A(a),bo!==null&&i.add(bo),yield iX(),a!==(a=e())){var r=t.selectionStart,s=t.selectionEnd,g=t.value.length;if(t.value=a??\"\",s!==null){var l=t.value.length;r===s&&s===g&&l>g?(t.selectionStart=l,t.selectionEnd=l):(t.selectionStart=r,t.selectionEnd=Math.min(s,l))}}});return function(o){return n.apply(this,arguments)}})()),QA(e)==null&&t.value&&(A(Gx(t)?Kx(t.value):t.value),bo!==null&&i.add(bo)),dE(()=>{var n=e();if(t===document.activeElement){var o=Z3??bo;if(i.has(o))return}Gx(t)&&n===Kx(t.value)||(t.type!==\"date\"||n||t.value)&&n!==t.value&&(t.value=n??\"\")})}function Gx(t){var e=t.type;return e===\"number\"||e===\"range\"}function Kx(t){return t===\"\"?null:+t}function Tt(t,e,A){var i=IC(t,e);i&&i.set&&(t[e]=A,ZD(()=>{t[e]=null}))}function QW(t,e){return t===e||t?.[c0]===e}function Mo(){var t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},e=arguments.length>1?arguments[1]:void 0,A=arguments.length>2?arguments[2]:void 0;return Er(()=>{var i,n;return dE(()=>{i=n,n=[],QA(()=>{t!==A(...n)&&(e(t,...n),i&&QW(A(...i),t)&&e(null,...i))})}),()=>{j1(()=>{n&&QW(A(...n),t)&&e(null,...n)})}}),t}function aC(t){return function(){for(var e=arguments.length,A=new Array(e),i=0;i<e;i++)A[i]=arguments[i];return A[0].stopPropagation(),t?.apply(this,A)}}function z2(t){return function(){for(var e=arguments.length,A=new Array(e),i=0;i<e;i++)A[i]=arguments[i];return A[0].preventDefault(),t?.apply(this,A)}}function $t(){var t=arguments.length>0&&arguments[0]!==void 0&&arguments[0],e=Ao,A=e.l.u;if(A){var i,n=()=>_(e.s);if(t){var o=0,a={},r=Qu(()=>{var s=!1,g=e.s;for(var l in g)g[l]!==a[l]&&(a[l]=g[l],s=!0);return s&&o++,o});n=()=>c(r)}A.b.length&&(i=()=>{EW(e,n),iR(A.b)},HZ(),lc(1048584,i,!0)),rR(()=>{var s=QA(()=>A.m.map(hpA));return()=>{for(var g of s)typeof g==\"function\"&&g()}}),A.a.length&&rR(()=>{EW(e,n),iR(A.a)})}}function EW(t,e){if(t.l.s)for(var A of t.l.s)c(A);e()}function XD(t){var e=uC(0);return function(){return arguments.length===1?(x(e,c(e)+1),arguments[0]):(c(e),t())}}function q3(t,e){var A,i=(A=t.$$events)===null||A===void 0?void 0:A[e.type],n=du(i)?i.slice():i==null?[]:[i];for(var o of n)o.call(this,e)}var iD=!1,zpA={get(t,e){if(!t.exclude.includes(e))return c(t.version),e in t.special?t.special[e]():t.props[e]},set(t,e,A){if(!(e in t.special)){var i=Gn;try{ll(t.parent_effect),t.special[e]=N({get[e](){return t.props[e]}},e,4)}finally{ll(i)}}return t.special[e](A),aW(t.version),!0},getOwnPropertyDescriptor(t,e){if(!t.exclude.includes(e))return e in t.props?{enumerable:!0,configurable:!0,value:t.props[e]}:void 0},deleteProperty:(t,e)=>(t.exclude.includes(e)||(t.exclude.push(e),aW(t.version)),!0),has:(t,e)=>!t.exclude.includes(e)&&e in t.props,ownKeys:t=>Reflect.ownKeys(t.props).filter(e=>!t.exclude.includes(e))};function nD(t,e){return new Proxy({props:t,exclude:e,special:{},version:uC(0),parent_effect:Gn},zpA)}var PpA={get(t,e){for(var A=t.props.length;A--;){var i=t.props[A];if(Y3(i)&&(i=i()),typeof i==\"object\"&&i!==null&&e in i)return i[e]}},set(t,e,A){for(var i=t.props.length;i--;){var n=t.props[i];Y3(n)&&(n=n());var o=IC(n,e);if(o&&o.set)return o.set(A),!0}return!1},getOwnPropertyDescriptor(t,e){for(var A=t.props.length;A--;){var i=t.props[A];if(Y3(i)&&(i=i()),typeof i==\"object\"&&i!==null&&e in i){var n=IC(i,e);return n&&!n.configurable&&(n.configurable=!0),n}}},has(t,e){if(e===c0||e===pZ)return!1;for(var A of t.props)if(Y3(A)&&(A=A()),A!=null&&e in A)return!0;return!1},ownKeys(t){var e=[];for(var A of t.props)if(Y3(A)&&(A=A()),A){for(var i in A)e.includes(i)||e.push(i);for(var n of Object.getOwnPropertySymbols(A))e.includes(n)||e.push(n)}return e}};function oI(){for(var t=arguments.length,e=new Array(t),A=0;A<t;A++)e[A]=arguments[A];return new Proxy({props:e},PpA)}function N(t,e,A,i){var n,o,a=!lE||!!(2&A),r=!!(8&A),s=!!(16&A),g=i,l=!0,C=()=>(l&&(l=!1,g=s?QA(i):i),g);if(r){var I,d,B=c0 in t||pZ in t;n=(I=(d=IC(t,e))===null||d===void 0?void 0:d.set)!==null&&I!==void 0?I:B&&e in t?v=>t[e]=v:void 0}var Q,E=!1;if(r?[o,E]=(function(v){var F=iD;try{return iD=!1,[v(),iD]}finally{iD=F}})(()=>t[e]):o=t[e],o===void 0&&i!==void 0&&(o=C(),n&&(a&&(function(){throw new Error(\"https://svelte.dev/e/props_invalid_value\")})(),n(o))),Q=a?()=>{var v=t[e];return v===void 0?C():(l=!0,v)}:()=>{var v=t[e];return v!==void 0&&(g=void 0),v===void 0?g:v},a&&!(4&A))return Q;if(n){var f=t.$$legacy;return function(v,F){return arguments.length>0?(a&&F&&!f&&!E||n(F?Q():v),v):Q()}}var b=!1,R=(1&A?Qu:et)(()=>(b=!1,Q()));r&&c(R);var M=Gn;return function(v,F){if(arguments.length>0){var G=F?c(R):a&&r?JQ(v):v;return x(R,G),b=!0,g!==void 0&&(g=G),v}return td&&b||(M.f&CE)!==0?R.v:c(R)}}function qa(t){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:(function(i){var n=(function(o){try{if(typeof window<\"u\"&&window.localStorage!==void 0)return window.localStorage[o]}catch(a){}})(\"debug\");return n!=null&&n.endsWith(\"*\")?i.startsWith(n.slice(0,-1)):i===n})(t);if(!e)return jpA;var A=(function(i){for(var n=0,o=0;o<i.length;o++)n=(n<<5)-n+i.charCodeAt(o),n|=0;return hW[Math.abs(n)%hW.length]})(t);return function(){for(var i=arguments.length,n=new Array(i),o=0;o<i;o++)n[o]=arguments[o];console.log(\"%c\".concat(t),\"color:\".concat(A),...n)}}function jpA(){}var hW=[\"#0000CC\",\"#0099FF\",\"#009400\",\"#8dd200\",\"#CCCC00\",\"#CC9933\",\"#ae04e7\",\"#ff35d7\",\"#FF3333\",\"#FF6600\",\"#FF9933\",\"#FFCC33\"],qpA=0;function YQ(){return++qpA}function hr(t){return parseInt(t,10)}function TR(t){return VpA.test(t)}var VpA=/^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$/;function Qn(t){return typeof t==\"object\"&&t!==null&&(t.constructor===void 0||t.constructor.name===\"Object\")}function jo(t){return typeof t==\"object\"&&t!==null&&(t.constructor===void 0||t.constructor.name===\"Object\"||t.constructor.name===\"Array\")}function WpA(t){return t===!0||t===!1}function IR(t){if(typeof t==\"number\")return t>9466848e5&&isFinite(t)&&Math.floor(t)===t&&!isNaN(new Date(t).valueOf());if(typeof t==\"bigint\")return IR(Number(t));try{var e=t&&t.valueOf();if(e!==t)return IR(e)}catch(A){return!1}return!1}function EX(t){(oD=oD||window.document.createElement(\"div\")).style.color=\"\",oD.style.color=t;var e=oD.style.color;return e!==\"\"?e.replace(/\\s+/g,\"\").toLowerCase():void 0}var oD=void 0;function ZpA(t){return typeof t==\"string\"&&t.length<99&&!!EX(t)}function OR(t,e){if(typeof t==\"number\"||typeof t==\"string\"||typeof t==\"boolean\"||t===void 0)return typeof t;if(typeof t==\"bigint\")return\"number\";if(t===null)return\"null\";if(Array.isArray(t))return\"array\";if(Qn(t))return\"object\";var A=e.stringify(t);return A&&TR(A)?\"number\":A===\"true\"||A===\"false\"?\"boolean\":A===\"null\"?\"null\":\"unknown\"}var XpA=/^https?:\\/\\/\\S+$/;function $D(t){return typeof t==\"string\"&&XpA.test(t)}function EE(t,e){if(t===\"\")return\"\";var A=t.trim();return A===\"null\"?null:A===\"true\"||A!==\"false\"&&(TR(A)?e.parse(A):t)}var $pA=[];function uW(t,e){if(t.length!==e.length)return!1;for(var A=0;A<t.length;A++)if(t[A]!==e[A])return!1;return!0}function dR(t){var e=arguments.length>1&&arguments[1]!==void 0&&arguments[1],A={};if(!Array.isArray(t))throw new TypeError(\"Array expected\");function i(a,r){(!Array.isArray(a)&&!Qn(a)||e&&r.length>0)&&(A[pt(r)]=!0),Qn(a)&&Object.keys(a).forEach(s=>{i(a[s],r.concat(s))})}for(var n=Math.min(t.length,1e4),o=0;o<n;o++)i(t[o],$pA);return Object.keys(A).sort().map(As)}function hX(t,e,A){if(!(e<=t))for(var i=t;i<e;i++)A(i)}function RD(t,e){return t.length>e?t.slice(0,e):t}function fW(t){return ye({},t)}function mW(t){return Object.values(t)}function pW(t,e,A,i){var n=t.slice(0),o=n.splice(e,A);return n.splice.apply(n,[e+i,0,...o]),n}function A6A(t,e,A){return t.slice(0,e).concat(A).concat(t.slice(e))}function uu(t,e){try{return e.parse(t)}catch(A){return e.parse(jg(t))}}function uX(t,e){try{return uu(t,e)}catch(A){return}}function fu(t,e){t=t.replace(mX,\"\");try{return e(t)}catch(A){}try{return e(\"{\"+t+\"}\")}catch(A){}try{return e(\"[\"+t+\"]\")}catch(A){}throw new Error(\"Failed to parse partial JSON\")}function fX(t){t=t.replace(mX,\"\");try{return jg(t)}catch(i){}try{var e=jg(\"[\"+t+\"]\");return e.substring(1,e.length-1)}catch(i){}try{var A=jg(\"{\"+t+\"}\");return A.substring(1,A.length-1)}catch(i){}throw new Error(\"Failed to repair partial JSON\")}var mX=/,\\s*$/;function nE(t,e){var A=wW.exec(e);if(A){var i=hr(A[2]),n=(function(d,B){for(var Q=arguments.length>2&&arguments[2]!==void 0?arguments[2]:0,E=arguments.length>3&&arguments[3]!==void 0?arguments[3]:d.length,f=0,b=Q;b<E;b++)d.charAt(b)===B&&f++;return f})(t,`\n`,0,i),o=i-t.lastIndexOf(`\n`,i)-1;return{position:i,line:n,column:o,message:e.replace(wW,()=>\"line \".concat(n+1,\" column \").concat(o+1))}}var a=n6A.exec(e),r=a?hr(a[1]):void 0,s=r!==void 0?r-1:void 0,g=o6A.exec(e),l=g?hr(g[1]):void 0,C=l!==void 0?l-1:void 0,I=s!==void 0&&C!==void 0?(function(d,B,Q){for(var E=d.indexOf(`\n`),f=1;f<B&&E!==-1;)E=d.indexOf(`\n`,E+1),f++;return E!==-1?E+Q+1:void 0})(t,s,C):void 0;return{position:I,line:s,column:C,message:e.replace(/^JSON.parse: /,\"\").replace(/ of the JSON data$/,\"\")}}function Ux(t,e){try{var A=_R.default.parse(t),i=pt(e),n=A.pointers[i];if(n)return{path:e,line:n.key?n.key.line:n.value?n.value.line:0,column:n.key?n.key.column:n.value?n.value.column:0,from:n.key?n.key.pos:n.value?n.value.pos:0,to:n.keyEnd?n.keyEnd.pos:n.valueEnd?n.valueEnd.pos:0}}catch(o){console.error(o)}return{path:e,line:0,column:0,from:0,to:0}}function Jx(t){return Qn(t)?t.json!==void 0?t.text!==void 0?'Content must contain either a property \"json\" or a property \"text\" but not both':void 0:t.text===void 0?'Content must contain either a property \"json\" or a property \"text\"':typeof t.text!=\"string\"?'Content \"text\" property must be a string containing a JSON document. Did you mean to use the \"json\" property instead?':void 0:\"Content must be an object\"}function tu(t){return Qn(t)&&typeof t.text==\"string\"}function iu(t){return Qn(t)&&t.json!==void 0}function e6A(t){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:void 0,A=arguments.length>2&&arguments[2]!==void 0?arguments[2]:JSON;return tu(t)?t:{text:A.stringify(t.json,null,e)}}function DW(t){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:JSON;return iu(t)?t:{json:e.parse(t.text)}}function BR(t,e,A){return e6A(t,e,A).text}function t6A(t,e){return i6A(t,e)>e}function i6A(t){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:1/0;if(tu(t))return t.text.length;var A=t.json,i=0;return(function n(o){if(Array.isArray(o)){if((i+=o.length-1+2)>e)return;for(var a=0;a<o.length;a++)if(n(o[a]),i>e)return}else if(Qn(o)){var r=Object.keys(o);i+=2+r.length+(r.length-1);for(var s=0;s<r.length;s++){var g=r[s],l=o[g];i+=g.length+2,n(l)}}else i+=typeof o==\"string\"?o.length+2:String(o).length})(A),i}var wW=/(position|char) (\\d+)/,n6A=/line (\\d+)/,o6A=/column (\\d+)/;function pX(t,e){return t.parse===e.parse&&t.stringify===e.stringify}function yW(t){var e=t.substring(0,999).trim();return!e.includes(`\n`)&&a6A.test(e)}var ga,jn,tc,ic,nc,al,aI,a6A=/[,:]\\S/;function zR(t){var{escapeControlCharacters:e,escapeUnicodeCharacters:A}=t;return e?A?r6A:s6A:A?g6A:l6A}(function(t){t.text=\"text\",t.tree=\"tree\",t.table=\"table\"})(ga||(ga={})),(function(t){t.after=\"after\",t.inside=\"inside\",t.key=\"key\",t.value=\"value\",t.multi=\"multi\",t.text=\"text\"})(jn||(jn={})),(function(t){t.after=\"after\",t.key=\"key\",t.value=\"value\",t.inside=\"inside\"})(tc||(tc={})),(function(t){t.info=\"info\",t.warning=\"warning\",t.error=\"error\"})(ic||(ic={})),(function(t){t.key=\"key\",t.value=\"value\"})(nc||(nc={})),(function(t){t.asc=\"asc\",t.desc=\"desc\"})(al||(al={})),(function(t){t.no=\"no\",t.self=\"self\",t.nextInside=\"nextInside\"})(aI||(aI={}));var r6A={escapeValue:t=>DX(vX(String(t))),unescapeValue:t=>bX(wX(t))},s6A={escapeValue:t=>vX(String(t)),unescapeValue:t=>bX(t)},g6A={escapeValue:t=>DX(String(t)),unescapeValue:t=>wX(t)},l6A={escapeValue:t=>String(t),unescapeValue:t=>t};function DX(t){return t.replace(/[^\\x20-\\x7F]/g,e=>{var A;return e===\"\\b\"||e===\"\\f\"||e===`\n`||e===\"\\r\"||e===\"\t\"?e:\"\\\\u\"+(\"000\"+((A=e.codePointAt(0))===null||A===void 0?void 0:A.toString(16))).slice(-4)})}function wX(t){return t.replace(/\\\\u[a-fA-F0-9]{4}/g,e=>{try{var A=JSON.parse('\"'+e+'\"');return yX[A]||A}catch(i){return e}})}var yX={'\"':'\\\\\"',\"\\\\\":\"\\\\\\\\\",\"\\b\":\"\\\\b\",\"\\f\":\"\\\\f\",\"\\n\":\"\\\\n\",\"\\r\":\"\\\\r\",\"\t\":\"\\\\t\"},c6A={'\\\\\"':'\"',\"\\\\\\\\\":\"\\\\\",\"\\\\/\":\"/\",\"\\\\b\":\"\\b\",\"\\\\f\":\"\\f\",\"\\\\n\":`\n`,\"\\\\r\":\"\\r\",\"\\\\t\":\"\t\"};function vX(t){return t.replace(/[\"\\b\\f\\n\\r\\t\\\\]/g,e=>yX[e]||e)}function bX(t){return t.replace(/\\\\[\"bfnrt\\\\]/g,e=>c6A[e]||e)}function oE(t){return typeof t!=\"string\"?String(t):t.endsWith(`\n`)?t+`\n`:t}function MX(t,e){return hE(t,A=>A.nodeName.toUpperCase()===e.toUpperCase())}function $2(t,e,A){return hE(t,i=>(function(n,o,a){return typeof n.getAttribute==\"function\"&&n.getAttribute(o)===a})(i,e,A))}function hE(t,e){return!!PR(t,e)}function PR(t,e){for(var A=t;A&&!e(A);)A=A.parentNode;return A}function mu(t){var e,A;return(e=t==null||(A=t.ownerDocument)===null||A===void 0?void 0:A.defaultView)!==null&&e!==void 0?e:void 0}function jR(t){var e=mu(t),A=e?.document.activeElement;return!!A&&hE(A,i=>i===t)}function kX(t,e){return PR(t,A=>A.nodeName===e)}function Yx(t){return $2(t,\"data-type\",\"selectable-key\")?jn.key:$2(t,\"data-type\",\"selectable-value\")?jn.value:$2(t,\"data-type\",\"insert-selection-area-inside\")?jn.inside:$2(t,\"data-type\",\"insert-selection-area-after\")?jn.after:jn.multi}function DD(t){return encodeURIComponent(pt(t))}function SX(t){var e,A=PR(t,n=>!(n==null||!n.hasAttribute)&&n.hasAttribute(\"data-path\")),i=(e=A?.getAttribute(\"data-path\"))!==null&&e!==void 0?e:void 0;return i?As(decodeURIComponent(i)):void 0}function C6A(t){var{allElements:e,currentElement:A,direction:i,hasPrio:n=()=>!0,margin:o=10}=t,a=Z9(e.filter(function(f){var b=f.getBoundingClientRect();return b.width>0&&b.height>0}),s),r=s(A);function s(f){var b=f.getBoundingClientRect();return{x:b.left+b.width/2,y:b.top+b.height/2,rect:b,element:f}}function g(f,b){var R=arguments.length>2&&arguments[2]!==void 0?arguments[2]:1,M=f.x-b.x,v=(f.y-b.y)*R;return Math.sqrt(M*M+v*v)}var l=f=>g(f,r);if(i===\"Left\"||i===\"Right\"){var C=i===\"Left\"?a.filter(f=>{return b=r,f.rect.left+o<b.rect.left;var b}):a.filter(f=>{return b=r,f.rect.right>b.rect.right+o;var b}),I=C.filter(f=>{return b=f,R=r,Math.abs(b.y-R.y)<o;var b,R}),d=jB(I,l)||jB(C,f=>g(f,r,10));return d?.element}if(i===\"Up\"||i===\"Down\"){var B=i===\"Up\"?a.filter(f=>{return b=r,f.y+o<b.y;var b}):a.filter(f=>{return b=r,f.y>b.y+o;var b}),Q=B.filter(f=>n(f.element)),E=jB(Q,l)||jB(B,l);return E?.element}}function qR(){var t,e,A,i;return typeof navigator<\"u\"&&(t=(e=(A=navigator)===null||A===void 0||(A=A.platform)===null||A===void 0?void 0:A.toUpperCase().includes(\"MAC\"))!==null&&e!==void 0?e:(i=navigator)===null||i===void 0||(i=i.userAgentData)===null||i===void 0||(i=i.platform)===null||i===void 0?void 0:i.toUpperCase().includes(\"MAC\"))!==null&&t!==void 0&&t}function fC(t){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:\"+\",A=[];VR(t,arguments.length>2&&arguments[2]!==void 0?arguments[2]:qR)&&A.push(\"Ctrl\"),t.altKey&&A.push(\"Alt\"),t.shiftKey&&A.push(\"Shift\");var i=t.key.length===1?t.key.toUpperCase():t.key;return i in I6A||A.push(i),A.join(e)}function VR(t){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:qR;return t.ctrlKey||t.metaKey&&e()}var I6A={Ctrl:!0,Command:!0,Control:!0,Alt:!0,Option:!0,Shift:!0};function Pt(t,e){e===void 0&&(e={});var A=e.insertAt;if(t&&typeof document<\"u\"){var i=document.head||document.getElementsByTagName(\"head\")[0],n=document.createElement(\"style\");n.type=\"text/css\",A===\"top\"&&i.firstChild?i.insertBefore(n,i.firstChild):i.appendChild(n),n.styleSheet?n.styleSheet.cssText=t:n.appendChild(document.createTextNode(t))}}Pt(`.jse-absolute-popup.svelte-enkkpn {\n  position: relative;\n  left: 0;\n  top: 0;\n  width: 0;\n  height: 0;\n  z-index: 1001;\n}\n.jse-absolute-popup.svelte-enkkpn .jse-hidden-input:where(.svelte-enkkpn) {\n  position: fixed;\n  left: 0;\n  top: 0;\n  width: 0;\n  height: 0;\n  padding: 0;\n  margin: 0;\n  border: none;\n  outline: none;\n  overflow: hidden;\n}\n.jse-absolute-popup.svelte-enkkpn .jse-absolute-popup-content:where(.svelte-enkkpn) {\n  position: absolute;\n}`);var d6A=FA('<div class=\"jse-absolute-popup-content svelte-enkkpn\"><input type=\"text\" readonly=\"\" tabindex=\"-1\" class=\"jse-hidden-input svelte-enkkpn\"/> <!></div>'),B6A=FA('<div role=\"none\" class=\"jse-absolute-popup svelte-enkkpn\"><!></div>');function Q6A(t,e){kt(e,!1);var A=N(e,\"popup\",8),i=N(e,\"closeAbsolutePopup\",8),n=CA(),o=CA();function a(C){A().options&&A().options.closeOnOuterClick&&!hE(C.target,I=>I===c(n))&&i()(A().id)}function r(C){fC(C)===\"Escape\"&&(C.preventDefault(),C.stopPropagation(),i()(A().id))}Jr(function(){c(o)&&c(o).focus()}),$t();var s=B6A();ue(\"mousedown\",dC,function(C){a(C)},!0),ue(\"keydown\",dC,r,!0),ue(\"wheel\",dC,function(C){a(C)},!0);var g=cA(s),l=C=>{var I=d6A(),d=cA(I);Mo(d,B=>x(o,B),()=>c(o)),CX(bA(d,2),()=>A().component,(B,Q)=>{Q(B,oI(()=>A().props))}),ve(B=>gl(I,B),[()=>(c(n),_(A()),QA(()=>(function(B,Q){var E=B.getBoundingClientRect(),{left:f,top:b,positionAbove:R,positionLeft:M}=(function(){if(Q.anchor){var{anchor:v,width:F=0,height:G=0,offsetTop:U=0,offsetLeft:Y=0,position:j}=Q,{left:AA,top:z,bottom:yA,right:P}=v.getBoundingClientRect(),nA=j===\"top\"||z+G>window.innerHeight&&z>G,eA=j===\"left\"||AA+F>window.innerWidth&&AA>F;return{left:eA?P-Y:AA+Y,top:nA?z-U:yA+U,positionAbove:nA,positionLeft:eA}}if(typeof Q.left==\"number\"&&typeof Q.top==\"number\"){var{left:dA,top:iA,width:aA=0,height:hA=0}=Q;return{left:dA,top:iA,positionAbove:iA+hA>window.innerHeight&&iA>hA,positionLeft:dA+aA>window.innerWidth&&dA>aA}}throw new Error('Invalid config: pass either \"left\" and \"top\", or pass \"anchor\"')})();return(R?\"bottom: \".concat(E.top-b,\"px;\"):\"top: \".concat(b-E.top,\"px;\"))+(M?\"right: \".concat(E.left-f,\"px;\"):\"left: \".concat(f-E.left,\"px;\"))})(c(n),A().options)))]),lA(C,I)};YA(g,C=>{c(n)&&C(l)}),Mo(s,C=>x(n,C),()=>c(n)),ue(\"mousedown\",s,function(C){C.stopPropagation()}),ue(\"keydown\",s,r),lA(t,s),St()}var E6A=FA(\"<!> <!>\",1);function QR(t,e){kt(e,!1);var A=qa(\"jsoneditor:AbsolutePopup\"),i=CA([],!0);function n(r){var s=c(i).findIndex(l=>l.id===r);if(s!==-1){var g=c(i)[s];g.options.onClose&&g.options.onClose(),x(i,c(i).filter(l=>l.id!==r))}}(function(r,s){vZ().set(r,s)})(\"absolute-popup\",{openAbsolutePopup:function(r,s,g){A(\"open...\",s,g);var l={id:YQ(),component:r,props:s||{},options:g||{}};return x(i,[...c(i),l]),l.id},closeAbsolutePopup:n}),RA(()=>c(i),()=>{A(\"popups\",c(i))}),mn(),$t(!0);var o=E6A(),a=$e(o);ea(a,1,()=>c(i),ha,(r,s)=>{Q6A(r,{get popup(){return c(s)},closeAbsolutePopup:n})}),Aa(bA(a,2),e,\"default\",{},null),lA(t,o),St()}function pu(t,e){for(var A=new Set(e),i=t.replace(/ \\(copy( \\d+)?\\)$/,\"\"),n=t,o=1;A.has(n);){var a=\"copy\"+(o>1?\" \"+o:\"\");n=\"\".concat(i,\" (\").concat(a,\")\"),o++}return n}function gC(t,e){var A=e-3;return t.length>e?t.substring(0,A)+\"...\":t}function h6A(t){if(t===\"\")return\"\";var e=t.toLowerCase();if(e===\"null\")return null;if(e===\"true\")return!0;if(e===\"false\")return!1;if(e!==\"undefined\"){var A=Number(t),i=parseFloat(t);return isNaN(A)||isNaN(i)?t:A}}var u6A={id:\"jsonquery\",name:\"JSONQuery\",description:`\n<p>\n  Enter a <a href=\"https://jsonquerylang.org\" target=\"_blank\" \n  rel=\"noopener noreferrer\">JSON Query</a> function to filter, sort, or transform the data.\n  You can use functions like <code>get</code>, <code>filter</code>,\n  <code>sort</code>, <code>pick</code>, <code>groupBy</code>, <code>uniq</code>, etcetera. \n  Example query: <code>filter(.age >= 18)</code>\n</p>\n`,createQuery:function(t,e){var{filter:A,sort:i,projection:n}=e,o=[];A&&A.path&&A.relation&&A.value&&o.push([\"filter\",[(a=A.relation,aM(\"1 \".concat(a,\" 1\"))[0]),aD(A.path),h6A(A.value)]]);var a;return i&&i.path&&i.direction&&o.push([\"sort\",aD(i.path),i.direction===\"desc\"?\"desc\":\"asc\"]),n&&n.paths&&(n.paths.length>1?o.push([\"pick\",...n.paths.map(aD)]):o.push([\"map\",aD(n.paths[0])])),KO([\"pipe\",...o])},executeQuery:function(t,e,A){var i=pX(A,JSON)?t:(function(n){var o=A.stringify(n);return o!==void 0?JSON.parse(o):void 0})(t);return e.trim()!==\"\"?UO(i,e):i}};function aD(t){return[\"get\",...t]}var f6A=CI(\"<g><!></g>\");function m6A(t,e){kt(e,!1);var A=870711,i=CA(\"\"),n=N(e,\"data\",8);function o(r){if(!r||!r.raw)return\"\";var s=r.raw,g={};return s=s.replace(/\\s(?:xml:)?id=[\"']?([^\"')\\s]+)/g,(l,C)=>{var I=\"fa-\".concat((A+=1).toString(16));return g[C]=I,' id=\"'.concat(I,'\"')}),s=s.replace(/#(?:([^'\")\\s]+)|xpointer\\(id\\((['\"]?)([^')]+)\\2\\)\\))/g,(l,C,I,d)=>{var B=C||d;return B&&g[B]?\"#\".concat(g[B]):l}),s}RA(()=>_(n()),()=>{x(i,o(n()))}),mn();var a=f6A();cX(cA(a),()=>c(i),!0),lA(t,a),St()}Pt(`\n  .fa-icon.svelte-v67cny {\n    display: inline-block;\n    fill: currentColor;\n  }\n  .fa-flip-horizontal.svelte-v67cny {\n    transform: scale(-1, 1);\n  }\n  .fa-flip-vertical.svelte-v67cny {\n    transform: scale(1, -1);\n  }\n  .fa-spin.svelte-v67cny {\n    animation: svelte-v67cny-fa-spin 1s 0s infinite linear;\n  }\n  .fa-inverse.svelte-v67cny {\n    color: #fff;\n  }\n  .fa-pulse.svelte-v67cny {\n    animation: svelte-v67cny-fa-spin 1s infinite steps(8);\n  }\n  @keyframes svelte-v67cny-fa-spin {\n    0% {\n      transform: rotate(0deg);\n    }\n    100% {\n      transform: rotate(360deg);\n    }\n  }\n`);var p6A=CI(\"<svg><!></svg>\"),D6A=CI(\"<path></path>\"),w6A=CI(\"<polygon></polygon>\"),y6A=CI(\"<!><!><!>\",1);function Pi(t,e){var A=nD(e,[\"children\",\"$$slots\",\"$$events\",\"$$legacy\"]),i=nD(A,[\"class\",\"data\",\"scale\",\"spin\",\"inverse\",\"pulse\",\"flip\",\"label\",\"style\"]);kt(e,!1);var n=N(e,\"class\",8,\"\"),o=N(e,\"data\",8),a=CA(),r=N(e,\"scale\",8,1),s=N(e,\"spin\",8,!1),g=N(e,\"inverse\",8,!1),l=N(e,\"pulse\",8,!1),C=N(e,\"flip\",8,void 0),I=N(e,\"label\",8,\"\"),d=N(e,\"style\",8,\"\"),B=CA(10),Q=CA(10),E=CA(),f=CA();function b(){var M=1;return r()!==void 0&&(M=Number(r())),isNaN(M)||M<=0?(console.warn('Invalid prop: prop \"scale\" should be a number over 0.'),1):1*M}function R(){return c(a)?Math.max(c(a).width,c(a).height)/16:1}RA(()=>(_(o()),_(d()),_(r())),()=>{x(a,(function(M){var v;if(M){if(!(\"definition\"in M)){if(\"iconName\"in M&&\"icon\"in M){M.iconName;var[F,G,,,U]=M.icon;v={width:F,height:G,paths:(Array.isArray(U)?U:[U]).map(Y=>({d:Y}))}}else v=M[Object.keys(M)[0]];return v}console.error(\"`import faIconName from '@fortawesome/package-name/faIconName` not supported - Please use `import { faIconName } from '@fortawesome/package-name/faIconName'` instead\")}})(o())),d(),r(),x(B,c(a)?c(a).width/R()*b():0),x(Q,c(a)?c(a).height/R()*b():0),x(E,(function(){var M=\"\";d()!==null&&(M+=d());var v=b();return v===1?M.length===0?\"\":M:(M===\"\"||M.endsWith(\";\")||(M+=\"; \"),\"\".concat(M,\"font-size: \").concat(v,\"em\"))})()),x(f,c(a)?\"0 0 \".concat(c(a).width,\" \").concat(c(a).height):\"0 0 \".concat(c(B),\" \").concat(c(Q)))}),mn(),$t(),(function(M,v){var F=nD(v,[\"children\",\"$$slots\",\"$$events\",\"$$legacy\"]),G=nD(F,[\"class\",\"width\",\"height\",\"box\",\"spin\",\"inverse\",\"pulse\",\"flip\",\"style\",\"label\"]),U=N(v,\"class\",8,\"\"),Y=N(v,\"width\",8),j=N(v,\"height\",8),AA=N(v,\"box\",8,\"0 0 0 0\"),z=N(v,\"spin\",8,!1),yA=N(v,\"inverse\",8,!1),P=N(v,\"pulse\",8,!1),nA=N(v,\"flip\",8,\"none\"),eA=N(v,\"style\",8,\"\"),dA=N(v,\"label\",8,\"\"),iA=p6A();pD(iA,()=>{var aA;return ye(ye({version:\"1.1\",class:\"fa-icon \".concat((aA=U())!==null&&aA!==void 0?aA:\"\"),width:Y(),height:j(),\"aria-label\":dA(),role:dA()?\"img\":\"presentation\",viewBox:AA(),style:eA()},G),{},{[GQ]:{\"fa-spin\":z(),\"fa-pulse\":P(),\"fa-inverse\":yA(),\"fa-flip-horizontal\":nA()===\"horizontal\",\"fa-flip-vertical\":nA()===\"vertical\"}})},void 0,void 0,void 0,\"svelte-v67cny\"),Aa(cA(iA),v,\"default\",{},null),lA(M,iA)})(t,oI({get label(){return I()},get width(){return c(B)},get height(){return c(Q)},get box(){return c(f)},get style(){return c(E)},get spin(){return s()},get flip(){return C()},get inverse(){return g()},get pulse(){return l()},get class(){return n()}},()=>i,{children:(M,v)=>{var F=yi();Aa($e(F),e,\"default\",{},G=>{var U=y6A(),Y=$e(U);ea(Y,1,()=>(c(a),QA(()=>{var yA;return((yA=c(a))===null||yA===void 0?void 0:yA.paths)||[]})),ha,(yA,P)=>{var nA=D6A();pD(nA,()=>ye({},c(P))),lA(yA,nA)});var j=bA(Y);ea(j,1,()=>(c(a),QA(()=>{var yA;return((yA=c(a))===null||yA===void 0?void 0:yA.polygons)||[]})),ha,(yA,P)=>{var nA=w6A();pD(nA,()=>ye({},c(P))),lA(yA,nA)});var AA=bA(j),z=yA=>{m6A(yA,{get data(){return c(a)},set data(P){x(a,P)},$$legacy:!0})};YA(AA,yA=>{c(a),QA(()=>{var P;return(P=c(a))===null||P===void 0?void 0:P.raw})&&yA(z)}),lA(G,U)}),lA(M,F)},$$slots:{default:!0}})),St()}Pt(`/* over all fonts, sizes, and colors */\n/* \"consolas\" for Windows, \"menlo\" for Mac with fallback to \"monaco\", 'Ubuntu Mono' for Ubuntu */\n/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */\n/* main, menu, modal */\n/* jsoneditor modal */\n/* tooltip in text mode */\n/* panels: navigation bar, gutter, search box */\n/* navigation-bar */\n/* context menu */\n/* contents: json key and values */\n/* contents: selected or hovered */\n/* contents: section of collapsed items in an array */\n/* contents: highlighting of search matches */\n/* contents: inline tags inside the JSON document */\n/* contents: table */\n/* controls in modals: inputs, buttons, and \\`a\\` */\n/* messages */\n/* svelte-select */\n/* color picker */\n.jse-boolean-toggle.svelte-eli4ob {\n  padding: 0;\n  margin: 1px 0 0;\n  vertical-align: top;\n  display: inline-flex;\n  color: var(--jse-value-color-boolean, #ff8c00);\n}\n\n.jse-boolean-toggle.svelte-eli4ob:not(.jse-readonly) {\n  cursor: pointer;\n}`);var v6A=FA('<div role=\"checkbox\" tabindex=\"-1\"><!></div>');function b6A(t,e){kt(e,!1);var A=N(e,\"path\",9),i=N(e,\"value\",9),n=N(e,\"readOnly\",9),o=N(e,\"onPatch\",9),a=N(e,\"focus\",9);$t(!0);var r,s=v6A(),g=cA(s),l=et(()=>i()===!0?rM:sM);Pi(g,{get data(){return c(l)}}),ve(()=>{fn(s,\"aria-checked\",i()===!0),r=Xt(s,1,\"jse-boolean-toggle svelte-eli4ob\",null,r,{\"jse-readonly\":n()}),fn(s,\"title\",n()?\"Boolean value \".concat(i()):\"Click to toggle this boolean value\")}),ue(\"mousedown\",s,function(C){C.stopPropagation(),n()||(o()([{op:\"replace\",path:pt(A()),value:!i()}]),a()())}),lA(t,s),St()}Pt(`/* over all fonts, sizes, and colors */\n/* \"consolas\" for Windows, \"menlo\" for Mac with fallback to \"monaco\", 'Ubuntu Mono' for Ubuntu */\n/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */\n/* main, menu, modal */\n/* jsoneditor modal */\n/* tooltip in text mode */\n/* panels: navigation bar, gutter, search box */\n/* navigation-bar */\n/* context menu */\n/* contents: json key and values */\n/* contents: selected or hovered */\n/* contents: section of collapsed items in an array */\n/* contents: highlighting of search matches */\n/* contents: inline tags inside the JSON document */\n/* contents: table */\n/* controls in modals: inputs, buttons, and \\`a\\` */\n/* messages */\n/* svelte-select */\n/* color picker */\n.jse-color-picker-popup.svelte-v77py2 .picker_wrapper.popup,\n.jse-color-picker-popup.svelte-v77py2 .picker_wrapper.popup .picker_arrow::before,\n.jse-color-picker-popup.svelte-v77py2 .picker_wrapper.popup .picker_arrow::after {\n  background: var(--jse-color-picker-background, var(--jse-panel-background, #ebebeb));\n  line-height: normal;\n}\n.jse-color-picker-popup.svelte-v77py2 .picker_slider,\n.jse-color-picker-popup.svelte-v77py2 .picker_sl,\n.jse-color-picker-popup.svelte-v77py2 .picker_editor input,\n.jse-color-picker-popup.svelte-v77py2 .picker_sample,\n.jse-color-picker-popup.svelte-v77py2 .picker_done button {\n  box-shadow: var(--jse-color-picker-border-box-shadow, #cbcbcb 0 0 0 1px);\n}\n.jse-color-picker-popup.svelte-v77py2 .picker_editor input {\n  background: var(--jse-background-color, #fff);\n  color: var(--jse-text-color, #4d4d4d);\n}\n.jse-color-picker-popup.svelte-v77py2 .picker_done button {\n  background: var(--jse-button-background, #e0e0e0);\n  color: var(--jse-button-color, var(--jse-text-color, #4d4d4d));\n}\n.jse-color-picker-popup.svelte-v77py2 .picker_done button:hover {\n  background: var(--jse-button-background-highlight, #e7e7e7);\n}`);var M6A=FA('<div class=\"jse-color-picker-popup svelte-v77py2\"></div>');function k6A(t,e){kt(e,!1);var A=N(e,\"color\",8),i=N(e,\"onChange\",8),n=N(e,\"showOnTop\",8),o=CA(),a=()=>{};Jr(Ut(function*(){var s,g=new((s=yield import(\"./chunk-GLGRLUIJ.js\"))===null||s===void 0?void 0:s.default)({parent:c(o),color:A(),popup:n()?\"top\":\"bottom\",onDone(l){var C=l.rgba[3]===1?l.hex.substring(0,7):l.hex;i()(C)}});g.show(),a=()=>{g.destroy()}})),cl(()=>{a()}),$t();var r=M6A();Mo(r,s=>x(o,s),()=>c(o)),lA(t,r),St()}Pt(`/* over all fonts, sizes, and colors */\n/* \"consolas\" for Windows, \"menlo\" for Mac with fallback to \"monaco\", 'Ubuntu Mono' for Ubuntu */\n/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */\n/* main, menu, modal */\n/* jsoneditor modal */\n/* tooltip in text mode */\n/* panels: navigation bar, gutter, search box */\n/* navigation-bar */\n/* context menu */\n/* contents: json key and values */\n/* contents: selected or hovered */\n/* contents: section of collapsed items in an array */\n/* contents: highlighting of search matches */\n/* contents: inline tags inside the JSON document */\n/* contents: table */\n/* controls in modals: inputs, buttons, and \\`a\\` */\n/* messages */\n/* svelte-select */\n/* color picker */\n.jse-color-picker-button.svelte-13mgyo6 {\n  font-size: var(--jse-font-size-mono, 14px);\n  width: var(--jse-color-picker-button-size, 1em);\n  height: var(--jse-color-picker-button-size, 1em);\n  box-sizing: border-box;\n  padding: 0;\n  margin: 2px 0 0 calc(0.5 * var(--jse-padding, 10px));\n  display: inline-flex;\n  vertical-align: top;\n  border: 1px solid var(--jse-text-color, #4d4d4d);\n  border-radius: 2px;\n  background: inherit;\n  outline: none;\n}\n\n.jse-color-picker-button.svelte-13mgyo6:not(.jse-readonly) {\n  cursor: pointer;\n}`);var S6A=FA('<button type=\"button\"></button>');function x6A(t,e){kt(e,!1);var A=CA(void 0,!0),i=CA(void 0,!0),{openAbsolutePopup:n}=cI(\"absolute-popup\"),o=N(e,\"path\",9),a=N(e,\"value\",9),r=N(e,\"readOnly\",9),s=N(e,\"onPatch\",9),g=N(e,\"focus\",9);function l(B){s()([{op:\"replace\",path:pt(o()),value:B}]),C()}function C(){g()()}RA(()=>_(a()),()=>{x(A,EX(a()))}),RA(()=>(_(r()),_(a())),()=>{x(i,r()?\"Color \".concat(a()):\"Click to open a color picker\")}),mn(),$t(!0);var I,d=S6A();ve(()=>{var B;I=Xt(d,1,\"jse-color-picker-button svelte-13mgyo6\",null,I,{\"jse-readonly\":r()}),gl(d,\"background: \".concat((B=c(A))!==null&&B!==void 0?B:\"\")),fn(d,\"title\",c(i)),fn(d,\"aria-label\",c(i))}),ue(\"click\",d,function(B){var Q,E;if(!r()){var f=B.target,b=f.getBoundingClientRect().top,R=((Q=(E=mu(f))===null||E===void 0?void 0:E.innerHeight)!==null&&Q!==void 0?Q:0)-b<300&&b>300,M={color:a(),onChange:l,showOnTop:R};n(k6A,M,{anchor:f,closeOnOuterClick:!0,onClose:C,offsetTop:18,offsetLeft:-8,height:300})}}),lA(t,d),St()}var Hx=1e3,nu=100,rD=100,ND=2e4,qQ=[{start:0,end:nu}],R6A=1048576,N6A=1048576,Tx=10485760,Ox=\"Insert or paste contents, enter [ insert a new array, enter { to insert a new object, or start typing to insert a new value\",WR=\"Open context menu (Click here, right click on the selection, or use the context menu button or Ctrl+Q)\",F1=\"hover-insert-inside\",sD=\"hover-insert-after\",vW=\"hover-collection\",zx=\"valid\",bW=\"repairable\",lC=336,cC=260,V3=100,MW={[al.asc]:\"ascending\",[al.desc]:\"descending\"};function xX(t){for(var e=eM(t,r=>r.start),A=[e[0]],i=0;i<e.length;i++){var n=A.length-1,o=A[n],a=e[i];a.start<=o.end?A[n]={start:Math.min(o.start,a.start),end:Math.max(o.end,a.end)}:A.push(a)}return A}function ER(t){return FD(t)+nu}function FD(t){return Math.floor(t/nu)*nu}function hR(t){return!!t&&(t.type===\"space\"||t.space===!0)}function V2(t){return!!t&&(t.type===\"separator\"||t.separator===!0)}function kW(t){return!!t&&t.type===\"label\"&&typeof t.text==\"string\"}function rC(t){return!!t&&typeof t.onClick==\"function\"}function RQ(t){return!!t&&t.type===\"dropdown-button\"&&rC(t.main)&&Array.isArray(t.items)}function SW(t){return!!t&&t.type===\"row\"&&Array.isArray(t.items)}function xW(t){return!!t&&t.type===\"column\"&&Array.isArray(t.items)}function RW(t){return Qn(t)&&Qn(t.parseError)}function F6A(t){return Qn(t)&&Array.isArray(t.validationErrors)}function L6A(t){return Qn(t)&&Array.isArray(t.path)&&typeof t.message==\"string\"&&\"severity\"in t}function _6A(t){return Qn(t)&&L6A(t)&&typeof t.isChildError==\"boolean\"}function G6A(t){return Qn(t)&&typeof t.action==\"function\"&&Qn(t.props)}function Ws(t){return t!==void 0&&t.type===\"object\"}function Pa(t){return t!==void 0&&t.type===\"array\"}function ZR(t){return t!==void 0&&t.type===\"value\"}function X1(t){return Ws(t)||Pa(t)}function RX(t){return t!==void 0&&Array.isArray(t.searchResults)}function LD(t){return!!t&&t.type===\"tree\"}function NW(t){return!!t&&t.type===\"text\"}function FW(t){return!!t&&t.type===\"mode\"}function uR(t){var{json:e,expand:A}=t,i=(function(n){var{json:o,factory:a}=n;return Array.isArray(o)?a.createArrayDocumentState():Qn(o)?a.createObjectDocumentState():o!==void 0?a.createValueDocumentState():void 0})({json:e,factory:AN});return A&&i?ec(e,i,[],A):i}function XR(){var{expanded:t}=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{expanded:!1};return{type:\"array\",expanded:t,visibleSections:qQ,items:[]}}function $R(){var{expanded:t}=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{expanded:!1};return{type:\"object\",expanded:t,properties:{}}}var AN={createObjectDocumentState:$R,createArrayDocumentState:XR,createValueDocumentState:function(){return{type:\"value\"}}};function NX(t,e,A,i){var{createObjectDocumentState:n,createArrayDocumentState:o,createValueDocumentState:a}=i;return(function r(s,g,l){if(Array.isArray(s)){var C=Pa(g)?g:o();if(l.length===0)return C;var I=hr(l[0]),d=r(s[I],C.items[I],l.slice(1));return Sr(C,[\"items\",l[0]],d)}if(Qn(s)){var B=Ws(g)?g:n();if(l.length===0)return B;var Q=l[0],E=r(s[Q],B.properties[Q],l.slice(1));return Sr(B,[\"properties\",Q],E)}return ZR(g)?g:a()})(t,e,A)}function wg(t,e){return ou(t,e,arguments.length>2&&arguments[2]!==void 0?arguments[2]:[],(A,i)=>{if(A!==void 0&&i!==void 0)return Array.isArray(A)?Pa(i)?i:XR({expanded:!!X1(i)&&i.expanded}):Qn(A)?Ws(i)?i:$R({expanded:!!X1(i)&&i.expanded}):ZR(i)?i:void 0},()=>!0)}function ou(t,e,A,i,n){var o=i(t,e,A);if(Array.isArray(t)&&Pa(o)&&n(o)){var a=[];return eN(t,o.visibleSections,s=>{var g=A.concat(String(s)),l=ou(t[s],o.items[s],g,i,n);l!==void 0&&(a[s]=l)}),uW(a,o.items)?o:ye(ye({},o),{},{items:a})}if(Qn(t)&&Ws(o)&&n(o)){var r={};return Object.keys(t).forEach(s=>{var g=A.concat(s),l=ou(t[s],o.properties[s],g,i,n);l!==void 0&&(r[s]=l)}),uW(Object.values(r),Object.values(o.properties))?o:ye(ye({},o),{},{properties:r})}return o}function eN(t,e,A){e.forEach(i=>{var{start:n,end:o}=i;hX(n,Math.min(t.length,o),A)})}function au(t,e){for(var A=t,i=[],n=0;n<e.length;){if(Array.isArray(A)){var o=e[n];i.push(\"items\",o),A=A[hr(o)]}else{if(!Qn(A))throw new Error(\"Cannot convert path: Object or Array expected at index \".concat(n));var a=e[n];i.push(\"properties\",a),A=A[a]}n++}return i}function ec(t,e,A,i){for(var n=e,o=function(r){var s=A.slice(0,r);n=aE(t,n,s,(g,l)=>{var C=X1(l)&&!l.expanded?ye(ye({},l),{},{expanded:!0}):l;return Pa(C)?(function(I,d){if((function(E,f){return E.some(b=>f>=b.start&&f<b.end)})(I.visibleSections,d))return I;var B=FD(d),Q={start:B,end:ER(B)};return ye(ye({},I),{},{visibleSections:xX(I.visibleSections.concat(Q))})})(C,hr(A[r])):C})},a=0;a<A.length;a++)o(a);return aE(t,n,A,(r,s)=>(function(g,l,C,I){return ou(g,l,C,(d,B,Q)=>Array.isArray(d)&&I(Q)?Pa(B)?B.expanded?B:ye(ye({},B),{},{expanded:!0}):XR({expanded:!0}):Qn(d)&&I(Q)?Ws(B)?B.expanded?B:ye(ye({},B),{},{expanded:!0}):$R({expanded:!0}):B,d=>X1(d)&&d.expanded)})(r,s,[],i))}function LW(t,e,A,i){return aE(t,e,A,(n,o)=>i?(function(a,r,s){return ou(a,r,s,(g,l)=>_W(l),()=>!0)})(n,o,A):_W(o))}function _W(t){return Pa(t)&&t.expanded?ye(ye({},t),{},{expanded:!1,visibleSections:qQ}):Ws(t)&&t.expanded?ye(ye({},t),{},{expanded:!1}):t}function FX(t,e,A){var i={json:t,documentState:e},n=A.reduce((o,a)=>({json:Js(o.json,[a]),documentState:K6A(o.json,o.documentState,a)}),i);return{json:n.json,documentState:wg(n.json,n.documentState)}}function K6A(t,e,A){if(b9(A))return GW(t,e,A,void 0);if(M9(A))return KW(t,e,A);if(m6(A)){var i=Ys(t,A.path),n=g0(t,e,i);return n?Aw(t,e,i,{type:\"value\",enforceString:n}):e}return p6(A)||s2(A)?(function(o,a,r){if(s2(r)&&r.from===r.path)return a;var s=a,g=Ys(o,r.from),l=o0(o,s,g);return s2(r)&&(s=KW(o,s,{path:r.from})),s=GW(o,s,{path:r.path},l),s})(t,e,A):e}function o0(t,e,A){try{return Pe(e,au(t,A))}catch(i){return}}function tN(t,e,A,i,n){var o=NX(t,e,A,n);return S4(o,au(t,A),a=>{var r=Pe(t,A);return i(r,a)})}function Aw(t,e,A,i){return(function(n,o,a,r,s){var g=NX(n,o,a,s);return Sr(g,au(n,a),r)})(t,e,A,i,AN)}function aE(t,e,A,i){return tN(t,e,A,i,AN)}function GW(t,e,A,i){var n=Ys(t,A.path),o=e;return o=aE(t,o,Li(n),(a,r)=>{if(!Pa(r))return r;var s=hr(fi(n)),{items:g,visibleSections:l}=r;return ye(ye({},r),{},{items:s<g.length?A6A(g,s,i!==void 0?[i]:Array(1)):g,visibleSections:LX(l,s,1)})}),Aw(t,o,n,i)}function KW(t,e,A){var i=Ys(t,A.path),n=Li(i),o=Pe(t,n);return Array.isArray(o)?aE(t,e,n,(a,r)=>{if(!Pa(r))return r;var s=hr(fi(i)),{items:g,visibleSections:l}=r;return ye(ye({},r),{},{items:g.slice(0,s).concat(g.slice(s+1)),visibleSections:LX(l,s,-1)})}):(function(a,r,s){var g=au(a,s);return cr(r,g)?n1(r,au(a,s)):r})(t,e,i)}function LX(t,e,A){return(function(i){for(var n=i.slice(0),o=1;o<n.length;)n[o-1].end===n[o].start&&(n[o-1]={start:n[o-1].start,end:n[o].end},n.splice(o)),o++;return n})(t.map(i=>({start:i.start>e?i.start+A:i.start,end:i.end>e?i.end+A:i.end})))}function g0(t,e,A){var i,n=Pe(t,A),o=o0(t,e,A),a=ZR(o)?o.enforceString:void 0;return typeof a==\"boolean\"?a:typeof(i=n)==\"string\"&&typeof EE(i,JSON)!=\"string\"}function Du(t,e){var A=arguments.length>2&&arguments[2]!==void 0&&arguments[2],i=t.indexOf(e);return i!==-1?A?t.slice(i):t.slice(i+1):[]}function iN(t,e){var A=[];return(function i(n,o,a){A.push(a),Lo(n)&&Pa(o)&&o.expanded&&eN(n,o.visibleSections,r=>{i(n[r],o.items[r],a.concat(String(r)))}),Oo(n)&&Ws(o)&&o.expanded&&Object.keys(n).forEach(r=>{i(n[r],o.properties[r],a.concat(r))})})(t,e,[]),A}function _X(t,e){var A=!(arguments.length>2&&arguments[2]!==void 0)||arguments[2],i=[];return(function n(o,a){i.push({path:a,type:tc.value});var r=o0(t,e,a);if(o&&X1(r)&&r.expanded){if(A&&i.push({path:a,type:tc.inside}),Lo(o)){var s=Pa(r)?r.visibleSections:qQ;eN(o,s,g=>{var l=a.concat(String(g));n(o[g],l),A&&i.push({path:l,type:tc.after})})}Oo(o)&&Object.keys(o).forEach(g=>{var l=a.concat(g);i.push({path:l,type:tc.key}),n(o[g],l),A&&i.push({path:l,type:tc.after})})}})(t,[]),i}function Px(t,e,A){var i=iN(t,e),n=i.map(pt).indexOf(pt(A));if(n!==-1&&n<i.length-1)return i[n+1]}function $1(t,e,A){var i=arguments.length>3&&arguments[3]!==void 0?arguments[3]:10240;return ec(t,e,A,t6A({json:Pe(t,A)},i)?W3:nN)}function jx(t,e,A){var i=o0(t,e,A);return X1(i)&&i.expanded?e:$1(t,e,A)}function W3(t){return t.length===0||t.length===1&&t[0]===\"0\"}function fR(t){return t.length===0}function nN(){return!0}function wD(){return!1}function Xs(t){return t&&t.type===jn.after||!1}function Ka(t){return t&&t.type===jn.inside||!1}function ja(t){return t&&t.type===jn.key||!1}function an(t){return t&&t.type===jn.value||!1}function $n(t){return t&&t.type===jn.multi||!1}function ew(t){return $n(t)&&di(t.focusPath,t.anchorPath)}function ru(t){return $n(t)||Xs(t)||Ka(t)||ja(t)||an(t)}function qx(t){return t&&t.type===jn.text||!1}function gI(t,e){var A=[];return(function(i,n,o){if(n){var a=O1(n),r=st(n);if(di(a,r))return o(a);if(i!==void 0){var s=KX(a,r);if(a.length===s.length||r.length===s.length)return o(s);var g=ns(a,r),l=CC(i,g),C=rI(i,g),I=EC(i,g,l),d=EC(i,g,C);if(!(I===-1||d===-1)){var B=Pe(i,s);if(Oo(B)){for(var Q=Object.keys(B),E=I;E<=d;E++){var f=o(s.concat(Q[E]));if(f!==void 0)return f}return}if(Lo(B)){for(var b=I;b<=d;b++){var R=o(s.concat(String(b)));if(R!==void 0)return R}return}throw new Error(\"Failed to create selection\")}}}})(t,e,i=>{A.push(i)}),A}function GX(t){return Ka(t)?t.path:Li(st(t))}function CC(t,e){if(!$n(e))return e.path;var A=EC(t,e,e.anchorPath);return EC(t,e,e.focusPath)<A?e.focusPath:e.anchorPath}function rI(t,e){if(!$n(e))return e.path;var A=EC(t,e,e.anchorPath);return EC(t,e,e.focusPath)>A?e.focusPath:e.anchorPath}function UW(t,e,A){var i=arguments.length>3&&arguments[3]!==void 0&&arguments[3];if(A){var n=i?st(A):CC(t,A),o=(function(s,g,l){var C=iN(s,g),I=C.map(pt),d=pt(l),B=I.indexOf(d);if(B!==-1&&B>0)return C[B-1]})(t,e,n);if(i)return Ka(A)||Xs(A)?o!==void 0?ns(n,n):void 0:o!==void 0?ns(O1(A),o):void 0;if(Xs(A)||Ka(A))return _i(n);if(ja(A)){if(o===void 0||o.length===0)return;var a=Li(o),r=Pe(t,a);return Array.isArray(r)||zi(o)?_i(o):mC(o)}return an(A),o!==void 0?_i(o):void 0}}function JW(t,e,A,i){if(!A)return{caret:void 0,previous:void 0,next:void 0};var n=_X(t,e,i),o=n.findIndex(a=>di(a.path,st(A))&&String(a.type)===String(A.type));return{caret:o!==-1?n[o]:void 0,previous:o!==-1&&o>0?n[o-1]:void 0,next:o!==-1&&o<n.length-1?n[o+1]:void 0}}function NQ(t,e){for(var A=iN(t,e),i=0;i<A.length-1&&A[i+1].length>A[i].length;)i++;var n=A[i];return n===void 0||n.length===0||Array.isArray(Pe(t,Li(n)))?_i(n):mC(n)}function rE(t,e){if(e.length===1){var A=Wg(e);if(A.op===\"replace\")return _i(Ys(t,A.path))}if(!zi(e)&&e.every(a=>a.op===\"move\")){var i=Wg(e),n=e.slice(1);if((p6(i)||s2(i))&&i.from!==i.path&&n.every(a=>(p6(a)||s2(a))&&a.from===a.path))return mC(Ys(t,i.path))}var o=e.filter(a=>a.op!==\"test\"&&a.op!==\"remove\"&&(a.op!==\"move\"||a.from!==a.path)&&typeof a.path==\"string\").map(a=>Ys(t,a.path));if(!zi(o))return{type:jn.multi,anchorPath:Wg(o),focusPath:fi(o)}}function KX(t,e){for(var A=0;A<t.length&&A<e.length&&t[A]===e[A];)A++;return t.slice(0,A)}function _D(t){return ja(t)||an(t)||ew(t)}function YW(t,e){return _D(e)&&jo(Pe(t,st(e)))?st(e):Li(st(e))}function I0(t,e){if(t.length<e.length)return!1;for(var A=0;A<e.length;A++)if(t[A]!==e[A])return!1;return!0}function r0(t){if(za(t)){var{type:e,path:A}=t;return{type:e,path:A}}return t}function mC(t){return{type:jn.key,path:t}}function oN(t,e){return{type:jn.key,path:t,edit:!0,initialValue:e}}function _i(t){return{type:jn.value,path:t}}function GD(t,e){return{type:jn.value,path:t,edit:!0,initialValue:e}}function pC(t){return{type:jn.inside,path:t}}function QC(t){return{type:jn.after,path:t}}function ns(t,e){var A=KX(t,e),i=t.length>A.length&&e.length>A.length;return{type:jn.multi,anchorPath:i?A.concat(t[A.length]):A,focusPath:i?A.concat(e[A.length]):A}}function UX(t,e,A,i){if(ja(e))return String(fi(e.path));if(an(e)){var n=Pe(t,e.path);return typeof n==\"string\"?n:i.stringify(n,null,A)}if($n(e)){if(zi(e.focusPath))return i.stringify(t,null,A);var o=GX(e),a=Pe(t,o);if(Array.isArray(a)){if(ew(e)){var r=Pe(t,e.focusPath);return i.stringify(r,null,A)}return gI(t,e).map(s=>{var g=Pe(t,s);return\"\".concat(i.stringify(g,null,A),\",\")}).join(`\n`)}return gI(t,e).map(s=>{var g=fi(s),l=Pe(t,s);return\"\".concat(i.stringify(g),\": \").concat(i.stringify(l,null,A),\",\")}).join(`\n`)}}function za(t){return(ja(t)||an(t))&&t.edit===!0}function HQ(t){return ja(t)||an(t)||$n(t)}function gD(t){return ja(t)||an(t)||ew(t)}function mR(t){switch(t.type){case tc.key:return mC(t.path);case tc.value:return _i(t.path);case tc.after:return QC(t.path);case tc.inside:return pC(t.path)}}function HW(t,e){switch(t){case jn.key:return mC(e);case jn.value:return _i(e);case jn.after:return QC(e);case jn.inside:return pC(e);case jn.multi:case jn.text:return ns(e,e)}}function lD(t,e,A){if(e)return su(t,e,A)||I0($n(e)?Li(e.focusPath):e.path,A)?e:void 0}function su(t,e,A){if(t===void 0||!e)return!1;if(ja(e)||Ka(e)||Xs(e))return di(e.path,A);if(an(e))return I0(A,e.path);if($n(e)){var i=CC(t,e),n=rI(t,e),o=Li(e.focusPath);if(!I0(A,o)||A.length<=o.length)return!1;var a=EC(t,e,i),r=EC(t,e,n),s=EC(t,e,A);return s!==-1&&s>=a&&s<=r}return!1}function EC(t,e,A){var i=Li(e.focusPath);if(!I0(A,i)||A.length<=i.length)return-1;var n=A[i.length],o=Pe(t,i);if(Oo(o))return Object.keys(o).indexOf(n);if(Lo(o)){var a=hr(n);if(a<o.length)return a}return-1}function st(t){return $n(t)?t.focusPath:t.path}function O1(t){return $n(t)?t.anchorPath:t.path}function gc(){for(var t=[],e=arguments.length,A=new Array(e),i=0;i<e;i++)A[i]=arguments[i];for(var n of A)if(typeof n==\"string\"&&t.push(n),n&&typeof n==\"object\")for(var o in n)Object.hasOwnProperty.call(n,o)&&n[o]&&t.push(o);return t.join(\" \")}function JX(t,e,A){return gc(\"jse-value\",\"jse-\"+OR(t,A),{\"jse-url\":$D(t),\"jse-empty\":typeof t==\"string\"&&t.length===0,\"jse-table-cell\":e===ga.table})}Pt(`/* over all fonts, sizes, and colors */\n/* \"consolas\" for Windows, \"menlo\" for Mac with fallback to \"monaco\", 'Ubuntu Mono' for Ubuntu */\n/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */\n/* main, menu, modal */\n/* jsoneditor modal */\n/* tooltip in text mode */\n/* panels: navigation bar, gutter, search box */\n/* navigation-bar */\n/* context menu */\n/* contents: json key and values */\n/* contents: selected or hovered */\n/* contents: section of collapsed items in an array */\n/* contents: highlighting of search matches */\n/* contents: inline tags inside the JSON document */\n/* contents: table */\n/* controls in modals: inputs, buttons, and \\`a\\` */\n/* messages */\n/* svelte-select */\n/* color picker */\n.jse-value.jse-string.svelte-1r0oryi {\n  color: var(--jse-value-color-string, #008000);\n}\n.jse-value.jse-object.svelte-1r0oryi, .jse-value.jse-array.svelte-1r0oryi {\n  min-width: 16px;\n  color: var(--jse-delimiter-color, rgba(0, 0, 0, 0.38));\n}\n.jse-value.jse-number.svelte-1r0oryi {\n  color: var(--jse-value-color-number, #ee422e);\n}\n.jse-value.jse-boolean.svelte-1r0oryi {\n  color: var(--jse-value-color-boolean, #ff8c00);\n}\n.jse-value.jse-null.svelte-1r0oryi {\n  color: var(--jse-value-color-null, #004ed0);\n}\n.jse-value.jse-invalid.svelte-1r0oryi {\n  color: var(--jse-text-color, #4d4d4d);\n}\n.jse-value.jse-url.svelte-1r0oryi {\n  color: var(--jse-value-color-url, #008000);\n  text-decoration: underline;\n}\n\ndiv.jse-editable-div.svelte-1r0oryi {\n  min-width: 2em;\n  padding: 0 5px;\n  box-sizing: border-box;\n  outline: none;\n  border-radius: 1px;\n  vertical-align: top;\n  cursor: text !important;\n  word-break: normal;\n  white-space: pre-wrap;\n  overflow-wrap: anywhere;\n}\ndiv.jse-editable-div.jse-short-text.svelte-1r0oryi {\n  overflow-wrap: normal;\n}\ndiv.jse-editable-div.jse-table-cell.svelte-1r0oryi {\n  overflow-wrap: normal;\n  white-space: nowrap;\n}\ndiv.jse-editable-div[contenteditable=true].svelte-1r0oryi {\n  outline: var(--jse-edit-outline, 2px solid #656565);\n  background: var(--jse-background-color, #fff);\n  position: relative;\n  display: inline-block;\n  border-radius: 0;\n  z-index: 3;\n}\ndiv.jse-editable-div.jse-empty.svelte-1r0oryi:not(:focus) {\n  outline: 1px dotted var(--jse-tag-background, rgba(0, 0, 0, 0.2));\n  -moz-outline-radius: 2px;\n}\ndiv.jse-editable-div.jse-empty.svelte-1r0oryi::after {\n  pointer-events: none;\n  color: var(--jse-tag-background, rgba(0, 0, 0, 0.2));\n}`);var U6A=FA('<div role=\"textbox\" tabindex=\"0\" contenteditable=\"true\" spellcheck=\"false\"></div>');function YX(t,e){kt(e,!1);var A=qa(\"jsoneditor:EditableDiv\"),i=N(e,\"value\",9),n=N(e,\"initialValue\",9),o=N(e,\"shortText\",9,!1),a=N(e,\"label\",9),r=N(e,\"onChange\",9),s=N(e,\"onCancel\",9),g=N(e,\"onFind\",9),l=N(e,\"onPaste\",9,ra),C=N(e,\"onValueClass\",9,()=>\"\"),I=CA(void 0,!0),d=CA(void 0,!0),B=!1;function Q(){return c(I)?(function(b){return b.replace(/\\n$/,\"\")})(c(I).innerText):\"\"}function E(b){c(I)&&yg(I,c(I).innerText=oE(b))}Jr(()=>{A(\"onMount\",{value:i(),initialValue:n()}),E(n()!==void 0?n():i()),c(I)&&(function(b){if(b.firstChild!=null){var R=document.createRange(),M=window.getSelection();R.setStart(b,1),R.collapse(!0),M?.removeAllRanges(),M?.addRange(R)}else b.focus()})(c(I))}),cl(()=>{var b=Q();A(\"onDestroy\",{closed:B,value:i(),newValue:b}),B||b===i()||r()(b,aI.no)}),RA(()=>(_(C()),_(i())),()=>{x(d,C()(i()))}),mn(),$t(!0);var f=U6A();Mo(f,b=>x(I,b),()=>c(I)),ve(b=>{fn(f,\"aria-label\",a()),Xt(f,1,b,\"svelte-1r0oryi\")},[()=>sI((_(gc),c(d),_(o()),QA(()=>gc(\"jse-editable-div\",c(d),{\"jse-short-text\":o()}))))]),ue(\"input\",f,function(){var b=Q();b===\"\"&&E(\"\"),x(d,C()(b))}),ue(\"keydown\",f,function(b){b.stopPropagation();var R=fC(b);if(R===\"Escape\"&&(b.preventDefault(),B=!0,s()()),R===\"Enter\"||R===\"Tab\"){b.preventDefault(),B=!0;var M=Q();r()(M,aI.nextInside)}R===\"Ctrl+F\"&&(b.preventDefault(),g()(!1)),R===\"Ctrl+H\"&&(b.preventDefault(),g()(!0))}),ue(\"paste\",f,function(b){if(b.stopPropagation(),l()&&b.clipboardData){var R=b.clipboardData.getData(\"text/plain\");l()(R)}}),ue(\"blur\",f,function(){var b=document.hasFocus(),R=Q();A(\"handleBlur\",{hasFocus:b,closed:B,value:i(),newValue:R}),document.hasFocus()&&!B&&(B=!0,R!==i()&&r()(R,aI.self))}),lA(t,f),St()}function J6A(t,e){kt(e,!1);var A=N(e,\"path\",9),i=N(e,\"value\",9),n=N(e,\"selection\",9),o=N(e,\"mode\",9),a=N(e,\"parser\",9),r=N(e,\"normalization\",9),s=N(e,\"enforceString\",9),g=N(e,\"onPatch\",9),l=N(e,\"onPasteJson\",9),C=N(e,\"onSelect\",9),I=N(e,\"onFind\",9),d=N(e,\"focus\",9),B=N(e,\"findNextInside\",9);function Q(R){return s()?R:EE(R,a())}function E(){C()(_i(A())),d()()}$t(!0);var f=et(()=>(_(r()),_(i()),QA(()=>r().escapeValue(i())))),b=et(()=>(_(za),_(n()),QA(()=>za(n())?n().initialValue:void 0)));YX(t,{get value(){return c(f)},get initialValue(){return c(b)},label:\"Edit value\",onChange:function(R,M){g()([{op:\"replace\",path:pt(A()),value:Q(r().unescapeValue(R))}],(v,F,G)=>{if(!G||di(A(),st(G)))return{state:F,selection:M===aI.nextInside?B()(A()):_i(A())}}),d()()},onCancel:E,onPaste:function(R){try{var M=a().parse(R);jo(M)&&l()({path:A(),contents:M,onPasteAsJson:()=>{E();var v=[{op:\"replace\",path:pt(A()),value:M}];g()(v,(F,G)=>({state:$1(F,G,A())}))}})}catch(v){}},get onFind(){return I()},onValueClass:function(R){return JX(Q(r().unescapeValue(R)),o(),a())}}),St()}function TQ(t,e,A){var i=Li(e),n=Pe(t,i);if(Lo(n)){var o=hr(fi(e));return A.map((g,l)=>({op:\"add\",path:pt(i.concat(String(o+l))),value:g.value}))}if(Oo(n)){var a=fi(e),r=Object.keys(n),s=a!==void 0?Du(r,a,!0):[];return[...A.map(g=>{var l=pu(g.key,r);return{op:\"add\",path:pt(i.concat(l)),value:g.value}}),...s.map(g=>lI(i,g))]}throw new Error(\"Cannot create insert operations: parent must be an Object or Array\")}function pR(t,e,A){var i=Pe(t,e);if(Array.isArray(i)){var n=i.length;return A.map((o,a)=>({op:\"add\",path:pt(e.concat(String(n+a))),value:o.value}))}return A.map(o=>{var a=pu(o.key,Object.keys(i));return{op:\"add\",path:pt(e.concat(a)),value:o.value}})}function wu(t,e,A,i){var n=e.filter(r=>r!==A),o=pu(i,n),a=Du(e,A,!1);return[{op:\"move\",from:pt(t.concat(A)),path:pt(t.concat(o))},...a.map(r=>lI(t,r))]}function HX(t,e){var A=fi(e);if(zi(A))throw new Error(\"Cannot duplicate root object\");var i=Li(A),n=fi(A),o=Pe(t,i);if(Lo(o)){var a=fi(e),r=a?hr(fi(a))+1:0;return[...e.map((l,C)=>({op:\"copy\",from:pt(l),path:pt(i.concat(String(C+r)))}))]}if(Oo(o)){var s=Object.keys(o),g=n!==void 0?Du(s,n,!1):[];return[...e.map(l=>{var C=pu(fi(l),s);return{op:\"copy\",from:pt(l),path:pt(i.concat(C))}}),...g.map(l=>lI(i,l))]}throw new Error(\"Cannot create duplicate operations: parent must be an Object or Array\")}function TX(t,e){if(an(e))return[{op:\"move\",from:pt(e.path),path:\"\"}];if(!$n(e))throw new Error(\"Cannot create extract operations: parent must be an Object or Array\");var A=Li(e.focusPath),i=Pe(t,A);if(Lo(i)){var n=gI(t,e).map(a=>{var r=hr(fi(a));return i[r]});return[{op:\"replace\",path:\"\",value:n}]}if(Oo(i)){var o={};return gI(t,e).forEach(a=>{var r=String(fi(a));o[r]=i[r]}),[{op:\"replace\",path:\"\",value:o}]}throw new Error(\"Cannot extract: unsupported type of selection \"+JSON.stringify(e))}function OX(t,e,A,i){if(ja(e)){var n=uX(A,i),o=Li(e.path),a=Pe(t,o);return wu(o,Object.keys(a),fi(e.path),typeof n==\"string\"?n:A)}if(an(e)||$n(e)&&zi(e.focusPath))try{return[{op:\"replace\",path:pt(st(e)),value:fu(A,F=>uu(F,i))}]}catch(F){return[{op:\"replace\",path:pt(st(e)),value:A}]}if($n(e)){var r=Vx(A,i);return(function(F,G,U){var Y=Wg(G),j=Li(Y),AA=Pe(F,j);if(Lo(AA)){var z=Wg(G),yA=z?hr(fi(z)):0;return[...KD(G),...U.map((JA,ee)=>({op:\"add\",path:pt(j.concat(String(ee+yA))),value:JA.value}))]}if(Oo(AA)){var P=fi(G),nA=Li(P),eA=fi(P),dA=Object.keys(AA),iA=eA!==void 0?Du(dA,eA,!1):[],aA=new Set(G.map(JA=>fi(JA))),hA=dA.filter(JA=>!aA.has(JA));return[...KD(G),...U.map(JA=>{var ee=pu(JA.key,hA);return{op:\"add\",path:pt(nA.concat(ee)),value:JA.value}}),...iA.map(JA=>lI(nA,JA))]}throw new Error(\"Cannot create replace operations: parent must be an Object or Array\")})(t,gI(t,e),r)}if(Xs(e)){var s=Vx(A,i),g=e.path,l=Li(g),C=Pe(t,l);if(Lo(C)){var I=hr(fi(g));return TQ(t,l.concat(String(I+1)),s)}if(Oo(C)){var d=String(fi(g)),B=Object.keys(C);if(zi(B)||fi(B)===d)return pR(t,l,s);var Q=B.indexOf(d),E=B[Q+1];return TQ(t,l.concat(E),s)}throw new Error(\"Cannot create insert operations: parent must be an Object or Array\")}if(Ka(e)){var f=Vx(A,i),b=e.path,R=Pe(t,b);if(Lo(R))return TQ(t,b.concat(\"0\"),f);if(Oo(R)){var M=Object.keys(R);if(zi(M))return pR(t,b,f);var v=Wg(M);return TQ(t,b.concat(v),f)}throw new Error(\"Cannot create insert operations: parent must be an Object or Array\")}throw new Error(\"Cannot insert: unsupported type of selection \"+JSON.stringify(e))}function KD(t){return t.map(e=>({op:\"remove\",path:pt(e)})).reverse()}function lI(t,e){return{op:\"move\",from:pt(t.concat(e)),path:pt(t.concat(e))}}function Vx(t,e){var A=/^\\s*{/.test(t),i=/^\\s*\\[/.test(t),n=uX(t,e),o=n!==void 0?n:fu(t,a=>uu(a,e));return A&&Qn(o)||i&&Array.isArray(o)?[{key:\"New item\",value:o}]:Array.isArray(o)?o.map((a,r)=>({key:\"New item \"+r,value:a})):Qn(o)?Object.keys(o).map(a=>({key:a,value:o[a]})):[{key:\"New item\",value:o}]}function zX(t,e){if(ja(e)){var A=Li(e.path),i=Pe(t,A),n=wu(A,Object.keys(i),fi(e.path),\"\");return{operations:n,newSelection:rE(t,n)}}if(an(e))return{operations:[{op:\"replace\",path:pt(e.path),value:\"\"}],newSelection:e};if($n(e)){var o=gI(t,e),a=KD(o),r=fi(o);if(zi(r))return{operations:[{op:\"replace\",path:\"\",value:\"\"}],newSelection:_i([])};var s=Li(r),g=Pe(t,s);if(Lo(g)){var l=Wg(o),C=hr(fi(l));return{operations:a,newSelection:C===0?pC(s):QC(s.concat(String(C-1)))}}if(Oo(g)){var I=Object.keys(g),d=Wg(o),B=fi(d),Q=I.indexOf(B),E=I[Q-1];return{operations:a,newSelection:Q===0?pC(s):QC(s.concat(E))}}throw new Error(\"Cannot create remove operations: parent must be an Object or Array\")}throw new Error(\"Cannot remove: unsupported type of selection \"+JSON.stringify(e))}function PX(t,e){var A=(function(i,n){if(zi(n)||!n.every(s2))return n;var o=[];for(var a of n){var r=TW(As(a.from)),s=TW(As(a.path));if(!r||!s)return n;o.push({from:r,path:s,operation:a})}var g=o[0].path.parent,l=Pe(i,g);if(!Oo(l)||!o.every(B=>(function(Q,E){return di(Q.from.parent,E)&&di(Q.path.parent,E)})(B,g)))return n;var C=(function(B,Q){var E=Object.keys(Q),f=E.slice();for(var b of B){var R=f.indexOf(b.from.key);R!==-1&&(f.splice(R,1),f.push(b.path.key))}for(var M=0;M<E.length&&E[M]===f[M];)M++;return f[M]})(o,i),I=B=>B.operation,d=o.filter(B=>B.operation.from!==B.operation.path);return d.some(B=>B.path.key===C)?d.map(I):[lI(g,C),...d.map(I)]})(t,e);return D6(t,A,{before:(i,n,o)=>{if(M9(n)){var a=As(n.path);return{revertOperations:[...o,...Wx(i,a)]}}if(s2(n)){var r=As(n.from);return{revertOperations:n.from===n.path?[n,...Wx(i,r)]:[...o,...Wx(i,r)]}}return{document:i}}})}function TW(t){return t.length>0?{parent:Li(t),key:fi(t)}:void 0}function Wx(t,e){var A=Li(e),i=fi(e),n=Pe(t,A);return Oo(n)?Du(Object.keys(n),i,!1).map(o=>lI(A,o)):[]}function OW(t){var e=t.activeIndex<t.items.length-1?t.activeIndex+1:t.items.length>0?0:-1,A=t.items[e],i=t.items.map((n,o)=>ye(ye({},n),{},{active:o===e}));return ye(ye({},t),{},{items:i,activeItem:A,activeIndex:e})}function zW(t,e){var A,i=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{},n=t.toLowerCase(),o=(A=i?.maxResults)!==null&&A!==void 0?A:1/0,a=i?.columns,r=[],s=[];function g(E){r.length>=o||r.push(E)}function l(E,f){if(Lo(f)){var b=s.length;s.push(\"0\");for(var R=0;R<f.length;R++)if(s[b]=String(R),l(E,f[R]),r.length>=o)return;s.pop()}else if(Oo(f)){var M=Object.keys(f),v=s.length;for(var F of(s.push(\"\"),M))if(s[v]=F,PW(F,E,s,nc.key,g),l(E,f[F]),r.length>=o)return;s.pop()}else PW(String(f),E,s,nc.value,g)}if(t===\"\")return[];if(a){if(!Array.isArray(e))throw new Error(\"json must be an Array when option columns is defined\");for(var C=0;C<e.length;C++){s[0]=String(C);for(var I=e[C],d=0;d<a.length;d++){var B=a[d];if(B.length===1)s[1]=B[0];else for(var Q=0;Q<B.length;Q++)s[Q+1]=B[Q];for(;s.length>B.length+1;)s.pop();l(n,Pe(I,B))}if(r.length>=o)break}return r}return l(n,e),r}function PW(t,e,A,i,n){var o=t.toLowerCase(),a=0,r=-1,s=-1;do(s=o.indexOf(e,r))!==-1&&(r=s+e.length,n({path:A.slice(0),field:i,fieldIndex:a,start:s,end:r}),a++);while(s!==-1)}function DR(t,e,A,i){return t.substring(0,A)+e+t.substring(i)}function jW(t,e,A){var i=t;return W9(A,n=>{i=DR(i,e,n.start,n.end)}),i}function Y6A(t,e,A,i,n){var{field:o,path:a,start:r,end:s}=i;if(o===nc.key){var g=Li(a),l=Pe(t,g),C=fi(a),I=wu(g,Object.keys(l),C,DR(C,A,r,s));return{newSelection:rE(t,I),operations:I}}if(o===nc.value){var d=Pe(t,a);if(d===void 0)throw new Error(\"Cannot replace: path not found \".concat(pt(a)));var B=typeof d==\"string\"?d:String(d),Q=g0(t,e,a),E=DR(B,A,r,s),f=[{op:\"replace\",path:pt(a),value:Q?E:EE(E,n)}];return{newSelection:rE(t,f),operations:f}}throw new Error(\"Cannot replace: unknown type of search result field \".concat(o))}function qW(t){return t.path.concat(t.field,String(t.fieldIndex))}function VW(t){var e=RX(t)?t.searchResults.filter(A=>A.field===nc.key):void 0;return e&&e.length>0?e:void 0}function WW(t){var e=RX(t)?t.searchResults.filter(A=>A.field===nc.value):void 0;return e&&e.length>0?e:void 0}var H6A={createObjectDocumentState:()=>({type:\"object\",properties:{}}),createArrayDocumentState:()=>({type:\"array\",items:[]}),createValueDocumentState:()=>({type:\"value\"})};function jX(t,e){return e.reduce((A,i)=>(function(n,o,a,r){return tN(n,o,a,r,H6A)})(t,A,i.path,(n,o)=>ye(ye({},o),{},{searchResults:o.searchResults?o.searchResults.concat(i):[i]})),void 0)}function UD(t){var e,A=(e=t?.searchResults)!==null&&e!==void 0?e:[],i=Ws(t)?Object.values(t.properties).flatMap(UD):Pa(t)?t.items.flatMap(UD):[];return A.concat(i)}Pt(`/* over all fonts, sizes, and colors */\n/* \"consolas\" for Windows, \"menlo\" for Mac with fallback to \"monaco\", 'Ubuntu Mono' for Ubuntu */\n/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */\n/* main, menu, modal */\n/* jsoneditor modal */\n/* tooltip in text mode */\n/* panels: navigation bar, gutter, search box */\n/* navigation-bar */\n/* context menu */\n/* contents: json key and values */\n/* contents: selected or hovered */\n/* contents: section of collapsed items in an array */\n/* contents: highlighting of search matches */\n/* contents: inline tags inside the JSON document */\n/* contents: table */\n/* controls in modals: inputs, buttons, and \\`a\\` */\n/* messages */\n/* svelte-select */\n/* color picker */\n.jse-highlight.svelte-19qyvy6 {\n  background-color: var(--jse-search-match-color, #ffe665);\n  outline: var(--jse-search-match-outline, none);\n}\n.jse-highlight.jse-active.svelte-19qyvy6 {\n  background-color: var(--jse-search-match-active-color, var(--jse-search-match-color, #ffe665));\n  outline: var(--jse-search-match-outline, 2px solid #e0be00);\n}`);var T6A=FA(\"<span> </span>\");function qX(t,e){kt(e,!1);var A=CA(),i=N(e,\"text\",8),n=N(e,\"searchResultItems\",8);RA(()=>(_(i()),_(n())),()=>{x(A,(function(a,r){var s=[],g=0;for(var l of r){var C=a.slice(g,l.start);C!==\"\"&&s.push({resultIndex:void 0,type:\"normal\",text:C,active:!1});var I=a.slice(l.start,l.end);s.push({resultIndex:l.resultIndex,type:\"highlight\",text:I,active:l.active}),g=l.end}var d=fi(r);return d&&d.end<a.length&&s.push({type:\"normal\",text:a.slice(d.end),resultIndex:void 0,active:!1}),s})(String(i()),n()))}),mn(),$t();var o=yi();ea($e(o),1,()=>c(A),ha,(a,r)=>{var s=yi(),g=$e(s),l=I=>{var d=tr();ve(()=>xt(d,(c(r),QA(()=>c(r).text)))),lA(I,d)},C=I=>{var d,B=T6A(),Q=cA(B);ve((E,f)=>{d=Xt(B,1,\"jse-highlight svelte-19qyvy6\",null,d,{\"jse-active\":c(r).active}),fn(B,\"data-search-result-index\",E),xt(Q,f)},[()=>(c(r),QA(()=>String(c(r).resultIndex))),()=>(_(oE),c(r),QA(()=>oE(c(r).text)))]),lA(I,B)};YA(g,I=>{c(r),QA(()=>c(r).type===\"normal\")?I(l):I(C,!1)}),lA(a,s)}),lA(t,o),St()}function yD(t){var e=1e3;if(t<900)return t.toFixed()+\" B\";var A=t/e;if(A<900)return A.toFixed(1)+\" KB\";var i=A/e;if(i<900)return i.toFixed(1)+\" MB\";var n=i/e;return n<900?n.toFixed(1)+\" GB\":(n/e).toFixed(1)+\" TB\"}Pt(`/* over all fonts, sizes, and colors */\n/* \"consolas\" for Windows, \"menlo\" for Mac with fallback to \"monaco\", 'Ubuntu Mono' for Ubuntu */\n/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */\n/* main, menu, modal */\n/* jsoneditor modal */\n/* tooltip in text mode */\n/* panels: navigation bar, gutter, search box */\n/* navigation-bar */\n/* context menu */\n/* contents: json key and values */\n/* contents: selected or hovered */\n/* contents: section of collapsed items in an array */\n/* contents: highlighting of search matches */\n/* contents: inline tags inside the JSON document */\n/* contents: table */\n/* controls in modals: inputs, buttons, and \\`a\\` */\n/* messages */\n/* svelte-select */\n/* color picker */\n.jse-tag.svelte-ubve9r {\n  border: none;\n  font-size: 80%;\n  font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen-Sans, Ubuntu, Cantarell, \"Helvetica Neue\", sans-serif);\n  color: var(--jse-tag-color, var(--jse-text-color-inverse, #fff));\n  background: var(--jse-tag-background, rgba(0, 0, 0, 0.2));\n  border-radius: 2px;\n  cursor: pointer;\n  display: inline-block;\n  padding: 0 4px;\n  line-height: normal;\n  margin: 1px 0;\n}\n.jse-tag.svelte-ubve9r:hover {\n  opacity: 0.8;\n}\n.jse-tag.disabled.svelte-ubve9r {\n  opacity: 0.7;\n  cursor: inherit;\n}`);var O6A=FA('<button type=\"button\"><!></button>');function vD(t,e){kt(e,!0);var A,i=Zs(()=>e.onclick?o=>{o.preventDefault(),o.stopPropagation(),e.onclick()}:void 0),n=O6A();n.__click=function(){for(var o,a=arguments.length,r=new Array(a),s=0;s<a;s++)r[s]=arguments[s];(o=c(i))===null||o===void 0||o.apply(this,r)},(function(o,a){for(var r=arguments.length,s=new Array(r>2?r-2:0),g=2;g<r;g++)s[g-2]=arguments[g];var l=new iE(o);BE(()=>{var C,I=(C=a())!==null&&C!==void 0?C:null;l.ensure(I,I&&(d=>I(d,...s)))},P1)})(cA(n),()=>{var o;return(o=e.children)!==null&&o!==void 0?o:EpA}),ve(()=>A=Xt(n,1,\"jse-tag svelte-ubve9r\",null,A,{disabled:!e.onclick})),lA(t,n),St()}hu([\"click\"]);Pt(`/* over all fonts, sizes, and colors */\n/* \"consolas\" for Windows, \"menlo\" for Mac with fallback to \"monaco\", 'Ubuntu Mono' for Ubuntu */\n/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */\n/* main, menu, modal */\n/* jsoneditor modal */\n/* tooltip in text mode */\n/* panels: navigation bar, gutter, search box */\n/* navigation-bar */\n/* context menu */\n/* contents: json key and values */\n/* contents: selected or hovered */\n/* contents: section of collapsed items in an array */\n/* contents: highlighting of search matches */\n/* contents: inline tags inside the JSON document */\n/* contents: table */\n/* controls in modals: inputs, buttons, and \\`a\\` */\n/* messages */\n/* svelte-select */\n/* color picker */\n.jse-value.jse-string.svelte-1saqp8c {\n  color: var(--jse-value-color-string, #008000);\n}\n.jse-value.jse-object.svelte-1saqp8c, .jse-value.jse-array.svelte-1saqp8c {\n  min-width: 16px;\n  color: var(--jse-delimiter-color, rgba(0, 0, 0, 0.38));\n}\n.jse-value.jse-number.svelte-1saqp8c {\n  color: var(--jse-value-color-number, #ee422e);\n}\n.jse-value.jse-boolean.svelte-1saqp8c {\n  color: var(--jse-value-color-boolean, #ff8c00);\n}\n.jse-value.jse-null.svelte-1saqp8c {\n  color: var(--jse-value-color-null, #004ed0);\n}\n.jse-value.jse-invalid.svelte-1saqp8c {\n  color: var(--jse-text-color, #4d4d4d);\n}\n.jse-value.jse-url.svelte-1saqp8c {\n  color: var(--jse-value-color-url, #008000);\n  text-decoration: underline;\n}\n\n.jse-value.svelte-1saqp8c {\n  display: inline-block;\n  min-width: 2em;\n  padding: 0 5px;\n  box-sizing: border-box;\n  outline: none;\n  border-radius: 1px;\n  vertical-align: top;\n  word-break: normal;\n  overflow-wrap: anywhere;\n  white-space: pre-wrap;\n}\n.jse-value.jse-table-cell.svelte-1saqp8c {\n  overflow-wrap: normal;\n  white-space: nowrap;\n}\n.jse-value.jse-empty.svelte-1saqp8c {\n  min-width: 4em;\n  outline: 1px dotted var(--jse-tag-background, rgba(0, 0, 0, 0.2));\n  -moz-outline-radius: 2px;\n}\n.jse-value.jse-empty.svelte-1saqp8c::after {\n  pointer-events: none;\n  color: var(--jse-tag-background, rgba(0, 0, 0, 0.2));\n  content: \"value\";\n}`);var z6A=FA('<div role=\"button\" tabindex=\"-1\" data-type=\"selectable-value\"><!> <!></div>');function P6A(t,e){kt(e,!0);var A=nC(!0),i=Zs(()=>c(A)&&typeof e.value==\"string\"&&e.value.length>e.truncateTextSize&&(!e.searchResultItems||!e.searchResultItems.some(d=>d.active&&d.end>e.truncateTextSize))),n=Zs(()=>c(i)&&typeof e.value==\"string\"?e.value.substring(0,e.truncateTextSize).trim():e.value),o=Zs(()=>$D(e.value));function a(){x(A,!1)}var r=z6A();r.__click=function(d){typeof e.value==\"string\"&&c(o)&&VR(d)&&(d.preventDefault(),d.stopPropagation(),window.open(e.value,\"_blank\"))},r.__dblclick=function(d){e.readOnly||(d.preventDefault(),e.onSelect(GD(e.path)))};var s=cA(r),g=d=>{var B=Zs(()=>e.normalization.escapeValue(c(n)));qX(d,{get text(){return c(B)},get searchResultItems(){return e.searchResultItems}})},l=d=>{var B=tr();ve(Q=>xt(B,Q),[()=>oE(e.normalization.escapeValue(c(n)))]),lA(d,B)};YA(s,d=>{e.searchResultItems?d(g):d(l,!1)});var C=bA(s,2),I=d=>{vD(d,{onclick:a,children:(B,Q)=>{var E=tr();ve(f=>xt(E,\"Show more (\".concat(f??\"\",\")\")),[()=>yD(e.value.length)]),lA(B,E)},$$slots:{default:!0}})};YA(C,d=>{c(i)&&typeof e.value==\"string\"&&d(I)}),ve(d=>{Xt(r,1,d,\"svelte-1saqp8c\"),fn(r,\"title\",c(o)?\"Ctrl+Click or Ctrl+Enter to open url in new window\":void 0)},[()=>sI(JX(e.value,e.mode,e.parser))]),lA(t,r),St()}hu([\"click\",\"dblclick\"]);Pt(`/* over all fonts, sizes, and colors */\n/* \"consolas\" for Windows, \"menlo\" for Mac with fallback to \"monaco\", 'Ubuntu Mono' for Ubuntu */\n/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */\n/* main, menu, modal */\n/* jsoneditor modal */\n/* tooltip in text mode */\n/* panels: navigation bar, gutter, search box */\n/* navigation-bar */\n/* context menu */\n/* contents: json key and values */\n/* contents: selected or hovered */\n/* contents: section of collapsed items in an array */\n/* contents: highlighting of search matches */\n/* contents: inline tags inside the JSON document */\n/* contents: table */\n/* controls in modals: inputs, buttons, and \\`a\\` */\n/* messages */\n/* svelte-select */\n/* color picker */\n.jse-tooltip.svelte-brt1mq {\n  font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen-Sans, Ubuntu, Cantarell, \"Helvetica Neue\", sans-serif);\n  font-size: var(--jse-font-size, 16px);\n  line-height: normal;\n  padding: calc(0.5 * var(--jse-padding, 10px)) var(--jse-padding, 10px);\n  border-radius: 3px;\n  background: var(--jse-context-menu-background, #656565);\n  color: var(--jse-context-menu-color, var(--jse-text-color-inverse, #fff));\n  white-space: nowrap;\n  box-shadow: var(--jse-controls-box-shadow, 0 2px 6px 0 rgba(0, 0, 0, 0.24));\n}`);var j6A=FA('<div class=\"jse-tooltip svelte-brt1mq\"> </div>');function q6A(t,e){var A=N(e,\"text\",8),i=j6A(),n=cA(i);ve(()=>xt(n,A())),lA(t,i)}function sE(t,e){var A,{text:i,openAbsolutePopup:n,closeAbsolutePopup:o}=e;function a(){A=n(q6A,{text:i},{position:\"top\",width:10*i.length,offsetTop:3,anchor:t,closeOnOuterClick:!0})}function r(){o(A)}return t.addEventListener(\"mouseenter\",a),t.addEventListener(\"mouseleave\",r),{destroy(){t.removeEventListener(\"mouseenter\",a),t.removeEventListener(\"mouseleave\",r)}}}Pt(`/* over all fonts, sizes, and colors */\n/* \"consolas\" for Windows, \"menlo\" for Mac with fallback to \"monaco\", 'Ubuntu Mono' for Ubuntu */\n/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */\n/* main, menu, modal */\n/* jsoneditor modal */\n/* tooltip in text mode */\n/* panels: navigation bar, gutter, search box */\n/* navigation-bar */\n/* context menu */\n/* contents: json key and values */\n/* contents: selected or hovered */\n/* contents: section of collapsed items in an array */\n/* contents: highlighting of search matches */\n/* contents: inline tags inside the JSON document */\n/* contents: table */\n/* controls in modals: inputs, buttons, and \\`a\\` */\n/* messages */\n/* svelte-select */\n/* color picker */\n.jse-timestamp.svelte-1jcpman {\n  padding: 0;\n  margin: 0;\n  vertical-align: middle;\n  display: inline-flex;\n  color: var(--jse-value-color-number, #ee422e);\n}`);var V6A=FA('<div class=\"jse-timestamp svelte-1jcpman\"><!></div>');function W6A(t,e){kt(e,!1);var A=CA(void 0,!0),i=cI(\"absolute-popup\"),n=N(e,\"value\",9);RA(()=>_(n()),()=>{x(A,\"Time: \".concat(new Date(n()).toString()))}),mn(),$t(!0);var o=V6A();Pi(cA(o),{get data(){return JO}}),as(o,(a,r)=>sE?.(a,r),()=>ye({text:c(A)},i)),lA(t,o),St()}function Z6A(t){var e=[];return!t.isEditing&&WpA(t.value)&&e.push({component:b6A,props:t}),!t.isEditing&&ZpA(t.value)&&e.push({component:x6A,props:t}),t.isEditing&&e.push({component:J6A,props:t}),t.isEditing||e.push({component:P6A,props:t}),!t.isEditing&&IR(t.value)&&e.push({component:W6A,props:t}),e}function $s(t){return t.map((e,A)=>$6A.test(e)?\"[\"+e+\"]\":/[.[\\]]/.test(e)||e===\"\"?'[\"'+(function(i){return i.replace(/\"/g,'\\\\\"')})(e)+'\"]':(A>0?\".\":\"\")+e).join(\"\")}function X6A(t){for(var e=[],A=0;A<t.length;)t[A]===\".\"&&A++,t[A]===\"[\"?(A++,t[A]==='\"'?(A++,e.push(i(o=>o==='\"',!0)),n('\"')):e.push(i(o=>o===\"]\")),n(\"]\")):e.push(i(o=>o===\".\"||o===\"[\"));function i(o){for(var a=arguments.length>1&&arguments[1]!==void 0&&arguments[1],r=\"\";A<t.length&&!o(t[A]);)a&&t[A]===\"\\\\\"&&t[A+1]==='\"'?(r+='\"',A+=2):(r+=t[A],A++);return r}function n(o){if(t[A]!==o)throw new SyntaxError(\"Invalid JSON path: \".concat(o,\" expected at position \").concat(A));A++}return e}function W2(t){return{value:t,label:zi(t)?\"(item root)\":$s(t)}}var $6A=/^\\d+$/,A8A={},e8A={showWizard:!0,showOriginal:!0},JD=Math.min,z1=Math.max,YD=Math.round,cD=Math.floor,d0=t=>({x:t,y:t}),t8A={left:\"right\",right:\"left\",bottom:\"top\",top:\"bottom\"},i8A={start:\"end\",end:\"start\"};function ZW(t,e,A){return z1(t,JD(e,A))}function tw(t,e){return typeof t==\"function\"?t(e):t}function Ad(t){return t.split(\"-\")[0]}function iw(t){return t.split(\"-\")[1]}function VX(t){return t===\"x\"?\"y\":\"x\"}function WX(t){return t===\"y\"?\"height\":\"width\"}var n8A=new Set([\"top\",\"bottom\"]);function AI(t){return n8A.has(Ad(t))?\"y\":\"x\"}function ZX(t){return VX(AI(t))}function wR(t){return t.replace(/start|end/g,e=>i8A[e])}var XW=[\"left\",\"right\"],$W=[\"right\",\"left\"],o8A=[\"top\",\"bottom\"],a8A=[\"bottom\",\"top\"];function r8A(t,e,A,i){var n=iw(t),o=(function(a,r,s){switch(a){case\"top\":case\"bottom\":return s?r?$W:XW:r?XW:$W;case\"left\":case\"right\":return r?o8A:a8A;default:return[]}})(Ad(t),A===\"start\",i);return n&&(o=o.map(a=>a+\"-\"+n),e&&(o=o.concat(o.map(wR)))),o}function CD(t){return t.replace(/left|right|bottom|top/g,e=>t8A[e])}function s8A(t){return typeof t!=\"number\"?(function(e){return ye({top:0,right:0,bottom:0,left:0},e)})(t):{top:t,right:t,bottom:t,left:t}}function HD(t){var{x:e,y:A,width:i,height:n}=t;return{width:i,height:n,top:A,left:e,right:e+i,bottom:A+n,x:e,y:A}}function AZ(t,e,A){var i,{reference:n,floating:o}=t,a=AI(e),r=ZX(e),s=WX(r),g=Ad(e),l=a===\"y\",C=n.x+n.width/2-o.width/2,I=n.y+n.height/2-o.height/2,d=n[s]/2-o[s]/2;switch(g){case\"top\":i={x:C,y:n.y-o.height};break;case\"bottom\":i={x:C,y:n.y+n.height};break;case\"right\":i={x:n.x+n.width,y:I};break;case\"left\":i={x:n.x-o.width,y:I};break;default:i={x:n.x,y:n.y}}switch(iw(e)){case\"start\":i[r]-=d*(A&&l?-1:1);break;case\"end\":i[r]+=d*(A&&l?-1:1)}return i}var g8A=(function(){var t=Ut(function*(e,A,i){for(var{placement:n=\"bottom\",strategy:o=\"absolute\",middleware:a=[],platform:r}=i,s=a.filter(Boolean),g=yield r.isRTL==null?void 0:r.isRTL(A),l=yield r.getElementRects({reference:e,floating:A,strategy:o}),{x:C,y:I}=AZ(l,n,g),d=n,B={},Q=0,E=0;E<s.length;E++){var{name:f,fn:b}=s[E],{x:R,y:M,data:v,reset:F}=yield b({x:C,y:I,initialPlacement:n,placement:d,strategy:o,middlewareData:B,rects:l,platform:r,elements:{reference:e,floating:A}});C=R??C,I=M??I,B=ye(ye({},B),{},{[f]:ye(ye({},B[f]),v)}),F&&Q<=50&&(Q++,typeof F==\"object\"&&(F.placement&&(d=F.placement),F.rects&&(l=F.rects===!0?yield r.getElementRects({reference:e,floating:A,strategy:o}):F.rects),{x:C,y:I}=AZ(l,d,g)),E=-1)}return{x:C,y:I,placement:d,strategy:o,middlewareData:B}});return function(e,A,i){return t.apply(this,arguments)}})();function XX(t,e){return yR.apply(this,arguments)}function yR(){return yR=Ut(function*(t,e){var A;e===void 0&&(e={});var{x:i,y:n,platform:o,rects:a,elements:r,strategy:s}=t,{boundary:g=\"clippingAncestors\",rootBoundary:l=\"viewport\",elementContext:C=\"floating\",altBoundary:I=!1,padding:d=0}=tw(e,t),B=s8A(d),Q=r[I?C===\"floating\"?\"reference\":\"floating\":C],E=HD(yield o.getClippingRect({element:(A=yield o.isElement==null?void 0:o.isElement(Q))==null||A?Q:Q.contextElement||(yield o.getDocumentElement==null?void 0:o.getDocumentElement(r.floating)),boundary:g,rootBoundary:l,strategy:s})),f=C===\"floating\"?{x:i,y:n,width:a.floating.width,height:a.floating.height}:a.reference,b=yield o.getOffsetParent==null?void 0:o.getOffsetParent(r.floating),R=(yield o.isElement==null?void 0:o.isElement(b))&&(yield o.getScale==null?void 0:o.getScale(b))||{x:1,y:1},M=HD(o.convertOffsetParentRelativeRectToViewportRelativeRect?yield o.convertOffsetParentRelativeRectToViewportRelativeRect({elements:r,rect:f,offsetParent:b,strategy:s}):f);return{top:(E.top-M.top+B.top)/R.y,bottom:(M.bottom-E.bottom+B.bottom)/R.y,left:(E.left-M.left+B.left)/R.x,right:(M.right-E.right+B.right)/R.x}}),yR.apply(this,arguments)}var l8A=new Set([\"left\",\"top\"]);function vR(){return vR=Ut(function*(t,e){var{placement:A,platform:i,elements:n}=t,o=yield i.isRTL==null?void 0:i.isRTL(n.floating),a=Ad(A),r=iw(A),s=AI(A)===\"y\",g=l8A.has(a)?-1:1,l=o&&s?-1:1,C=tw(e,t),{mainAxis:I,crossAxis:d,alignmentAxis:B}=typeof C==\"number\"?{mainAxis:C,crossAxis:0,alignmentAxis:null}:{mainAxis:C.mainAxis||0,crossAxis:C.crossAxis||0,alignmentAxis:C.alignmentAxis};return r&&typeof B==\"number\"&&(d=r===\"end\"?-1*B:B),s?{x:d*l,y:I*g}:{x:I*g,y:d*l}}),vR.apply(this,arguments)}function nw(){return typeof window<\"u\"}function gE(t){return $X(t)?(t.nodeName||\"\").toLowerCase():\"#document\"}function bg(t){var e;return(t==null||(e=t.ownerDocument)==null?void 0:e.defaultView)||window}function B0(t){var e;return(e=($X(t)?t.ownerDocument:t.document)||window.document)==null?void 0:e.documentElement}function $X(t){return!!nw()&&(t instanceof Node||t instanceof bg(t).Node)}function oc(t){return!!nw()&&(t instanceof Element||t instanceof bg(t).Element)}function Q0(t){return!!nw()&&(t instanceof HTMLElement||t instanceof bg(t).HTMLElement)}function eZ(t){return!(!nw()||typeof ShadowRoot>\"u\")&&(t instanceof ShadowRoot||t instanceof bg(t).ShadowRoot)}var c8A=new Set([\"inline\",\"contents\"]);function gu(t){var{overflow:e,overflowX:A,overflowY:i,display:n}=ac(t);return/auto|scroll|overlay|hidden|clip/.test(e+i+A)&&!c8A.has(n)}var C8A=new Set([\"table\",\"td\",\"th\"]);function I8A(t){return C8A.has(gE(t))}var d8A=[\":popover-open\",\":modal\"];function TD(t){return d8A.some(e=>{try{return t.matches(e)}catch(A){return!1}})}var B8A=[\"transform\",\"translate\",\"scale\",\"rotate\",\"perspective\"],Q8A=[\"transform\",\"translate\",\"scale\",\"rotate\",\"perspective\",\"filter\"],E8A=[\"paint\",\"layout\",\"strict\",\"content\"];function bR(t){var e=aN(),A=oc(t)?ac(t):t;return B8A.some(i=>!!A[i]&&A[i]!==\"none\")||!!A.containerType&&A.containerType!==\"normal\"||!e&&!!A.backdropFilter&&A.backdropFilter!==\"none\"||!e&&!!A.filter&&A.filter!==\"none\"||Q8A.some(i=>(A.willChange||\"\").includes(i))||E8A.some(i=>(A.contain||\"\").includes(i))}function aN(){return!(typeof CSS>\"u\"||!CSS.supports)&&CSS.supports(\"-webkit-backdrop-filter\",\"none\")}var h8A=new Set([\"html\",\"body\",\"#document\"]);function VQ(t){return h8A.has(gE(t))}function ac(t){return bg(t).getComputedStyle(t)}function ow(t){return oc(t)?{scrollLeft:t.scrollLeft,scrollTop:t.scrollTop}:{scrollLeft:t.scrollX,scrollTop:t.scrollY}}function eI(t){if(gE(t)===\"html\")return t;var e=t.assignedSlot||t.parentNode||eZ(t)&&t.host||B0(t);return eZ(e)?e.host:e}function A$(t){var e=eI(t);return VQ(e)?t.ownerDocument?t.ownerDocument.body:t.body:Q0(e)&&gu(e)?e:A$(e)}function lu(t,e,A){var i;e===void 0&&(e=[]),A===void 0&&(A=!0);var n=A$(t),o=n===((i=t.ownerDocument)==null?void 0:i.body),a=bg(n);if(o){var r=MR(a);return e.concat(a,a.visualViewport||[],gu(n)?n:[],r&&A?lu(r):[])}return e.concat(n,lu(n,[],A))}function MR(t){return t.parent&&Object.getPrototypeOf(t.parent)?t.frameElement:null}function e$(t){var e=ac(t),A=parseFloat(e.width)||0,i=parseFloat(e.height)||0,n=Q0(t),o=n?t.offsetWidth:A,a=n?t.offsetHeight:i,r=YD(A)!==o||YD(i)!==a;return r&&(A=o,i=a),{width:A,height:i,$:r}}function rN(t){return oc(t)?t:t.contextElement}function WQ(t){var e=rN(t);if(!Q0(e))return d0(1);var A=e.getBoundingClientRect(),{width:i,height:n,$:o}=e$(e),a=(o?YD(A.width):A.width)/i,r=(o?YD(A.height):A.height)/n;return a&&Number.isFinite(a)||(a=1),r&&Number.isFinite(r)||(r=1),{x:a,y:r}}var u8A=d0(0);function t$(t){var e=bg(t);return aN()&&e.visualViewport?{x:e.visualViewport.offsetLeft,y:e.visualViewport.offsetTop}:u8A}function ed(t,e,A,i){e===void 0&&(e=!1),A===void 0&&(A=!1);var n=t.getBoundingClientRect(),o=rN(t),a=d0(1);e&&(i?oc(i)&&(a=WQ(i)):a=WQ(t));var r=(function(v,F,G){return F===void 0&&(F=!1),!(!G||F&&G!==bg(v))&&F})(o,A,i)?t$(o):d0(0),s=(n.left+r.x)/a.x,g=(n.top+r.y)/a.y,l=n.width/a.x,C=n.height/a.y;if(o)for(var I=bg(o),d=i&&oc(i)?bg(i):i,B=I,Q=MR(B);Q&&i&&d!==B;){var E=WQ(Q),f=Q.getBoundingClientRect(),b=ac(Q),R=f.left+(Q.clientLeft+parseFloat(b.paddingLeft))*E.x,M=f.top+(Q.clientTop+parseFloat(b.paddingTop))*E.y;s*=E.x,g*=E.y,l*=E.x,C*=E.y,s+=R,g+=M,Q=MR(B=bg(Q))}return HD({width:l,height:C,x:s,y:g})}function OD(t,e){var A=ow(t).scrollLeft;return e?e.left+A:ed(B0(t)).left+A}function i$(t,e){var A=t.getBoundingClientRect();return{x:A.left+e.scrollLeft-OD(t,A),y:A.top+e.scrollTop}}var f8A=new Set([\"absolute\",\"fixed\"]);function tZ(t,e,A){var i;if(e===\"viewport\")i=(function(o,a){var r=bg(o),s=B0(o),g=r.visualViewport,l=s.clientWidth,C=s.clientHeight,I=0,d=0;if(g){l=g.width,C=g.height;var B=aN();(!B||B&&a===\"fixed\")&&(I=g.offsetLeft,d=g.offsetTop)}var Q=OD(s);if(Q<=0){var E=s.ownerDocument,f=E.body,b=getComputedStyle(f),R=E.compatMode===\"CSS1Compat\"&&parseFloat(b.marginLeft)+parseFloat(b.marginRight)||0,M=Math.abs(s.clientWidth-f.clientWidth-R);M<=25&&(l-=M)}else Q<=25&&(l+=Q);return{width:l,height:C,x:I,y:d}})(t,A);else if(e===\"document\")i=(function(o){var a=B0(o),r=ow(o),s=o.ownerDocument.body,g=z1(a.scrollWidth,a.clientWidth,s.scrollWidth,s.clientWidth),l=z1(a.scrollHeight,a.clientHeight,s.scrollHeight,s.clientHeight),C=-r.scrollLeft+OD(o),I=-r.scrollTop;return ac(s).direction===\"rtl\"&&(C+=z1(a.clientWidth,s.clientWidth)-g),{width:g,height:l,x:C,y:I}})(B0(t));else if(oc(e))i=(function(o,a){var r=ed(o,!0,a===\"fixed\"),s=r.top+o.clientTop,g=r.left+o.clientLeft,l=Q0(o)?WQ(o):d0(1);return{width:o.clientWidth*l.x,height:o.clientHeight*l.y,x:g*l.x,y:s*l.y}})(e,A);else{var n=t$(t);i={x:e.x-n.x,y:e.y-n.y,width:e.width,height:e.height}}return HD(i)}function n$(t,e){var A=eI(t);return!(A===e||!oc(A)||VQ(A))&&(ac(A).position===\"fixed\"||n$(A,e))}function m8A(t,e,A){var i=Q0(e),n=B0(e),o=A===\"fixed\",a=ed(t,!0,o,e),r={scrollLeft:0,scrollTop:0},s=d0(0);function g(){s.x=OD(n)}if(i||!i&&!o)if((gE(e)!==\"body\"||gu(n))&&(r=ow(e)),i){var l=ed(e,!0,o,e);s.x=l.x+e.clientLeft,s.y=l.y+e.clientTop}else n&&g();o&&!i&&n&&g();var C=!n||i||o?d0(0):i$(n,r);return{x:a.left+r.scrollLeft-s.x-C.x,y:a.top+r.scrollTop-s.y-C.y,width:a.width,height:a.height}}function Zx(t){return ac(t).position===\"static\"}function iZ(t,e){if(!Q0(t)||ac(t).position===\"fixed\")return null;if(e)return e(t);var A=t.offsetParent;return B0(t)===A&&(A=A.ownerDocument.body),A}function nZ(t,e){var A=bg(t);if(TD(t))return A;if(!Q0(t)){for(var i=eI(t);i&&!VQ(i);){if(oc(i)&&!Zx(i))return i;i=eI(i)}return A}for(var n=iZ(t,e);n&&I8A(n)&&Zx(n);)n=iZ(n,e);return n&&VQ(n)&&Zx(n)&&!bR(n)?A:n||(function(o){for(var a=eI(o);Q0(a)&&!VQ(a);){if(bR(a))return a;if(TD(a))return null;a=eI(a)}return null})(t)||A}var p8A={convertOffsetParentRelativeRectToViewportRelativeRect:function(t){var{elements:e,rect:A,offsetParent:i,strategy:n}=t,o=n===\"fixed\",a=B0(i),r=!!e&&TD(e.floating);if(i===a||r&&o)return A;var s={scrollLeft:0,scrollTop:0},g=d0(1),l=d0(0),C=Q0(i);if((C||!C&&!o)&&((gE(i)!==\"body\"||gu(a))&&(s=ow(i)),Q0(i))){var I=ed(i);g=WQ(i),l.x=I.x+i.clientLeft,l.y=I.y+i.clientTop}var d=!a||C||o?d0(0):i$(a,s);return{width:A.width*g.x,height:A.height*g.y,x:A.x*g.x-s.scrollLeft*g.x+l.x+d.x,y:A.y*g.y-s.scrollTop*g.y+l.y+d.y}},getDocumentElement:B0,getClippingRect:function(t){var{element:e,boundary:A,rootBoundary:i,strategy:n}=t,o=A===\"clippingAncestors\"?TD(e)?[]:(function(g,l){var C=l.get(g);if(C)return C;for(var I=lu(g,[],!1).filter(b=>oc(b)&&gE(b)!==\"body\"),d=null,B=ac(g).position===\"fixed\",Q=B?eI(g):g;oc(Q)&&!VQ(Q);){var E=ac(Q),f=bR(Q);f||E.position!==\"fixed\"||(d=null),(B?!f&&!d:!f&&E.position===\"static\"&&d&&f8A.has(d.position)||gu(Q)&&!f&&n$(g,Q))?I=I.filter(b=>b!==Q):d=E,Q=eI(Q)}return l.set(g,I),I})(e,this._c):[].concat(A),a=[...o,i],r=a[0],s=a.reduce((g,l)=>{var C=tZ(e,l,n);return g.top=z1(C.top,g.top),g.right=JD(C.right,g.right),g.bottom=JD(C.bottom,g.bottom),g.left=z1(C.left,g.left),g},tZ(e,r,n));return{width:s.right-s.left,height:s.bottom-s.top,x:s.left,y:s.top}},getOffsetParent:nZ,getElementRects:(function(){var t=Ut(function*(e){var A=this.getOffsetParent||nZ,i=this.getDimensions,n=yield i(e.floating);return{reference:m8A(e.reference,yield A(e.floating),e.strategy),floating:{x:0,y:0,width:n.width,height:n.height}}});return function(e){return t.apply(this,arguments)}})(),getClientRects:function(t){return Array.from(t.getClientRects())},getDimensions:function(t){var{width:e,height:A}=e$(t);return{width:e,height:A}},getScale:WQ,isElement:oc,isRTL:function(t){return ac(t).direction===\"rtl\"}};function oZ(t,e){return t.x===e.x&&t.y===e.y&&t.width===e.width&&t.height===e.height}function D8A(t,e,A,i){i===void 0&&(i={});var{ancestorScroll:n=!0,ancestorResize:o=!0,elementResize:a=typeof ResizeObserver==\"function\",layoutShift:r=typeof IntersectionObserver==\"function\",animationFrame:s=!1}=i,g=rN(t),l=n||o?[...g?lu(g):[],...lu(e)]:[];l.forEach(E=>{n&&E.addEventListener(\"scroll\",A,{passive:!0}),o&&E.addEventListener(\"resize\",A)});var C,I=g&&r?(function(E,f){var b,R=null,M=B0(E);function v(){var F;clearTimeout(b),(F=R)==null||F.disconnect(),R=null}return(function F(G,U){G===void 0&&(G=!1),U===void 0&&(U=1),v();var Y=E.getBoundingClientRect(),{left:j,top:AA,width:z,height:yA}=Y;if(G||f(),z&&yA){var P={rootMargin:-cD(AA)+\"px \"+-cD(M.clientWidth-(j+z))+\"px \"+-cD(M.clientHeight-(AA+yA))+\"px \"+-cD(j)+\"px\",threshold:z1(0,JD(1,U))||1},nA=!0;try{R=new IntersectionObserver(eA,ye(ye({},P),{},{root:M.ownerDocument}))}catch(dA){R=new IntersectionObserver(eA,P)}R.observe(E)}function eA(dA){var iA=dA[0].intersectionRatio;if(iA!==U){if(!nA)return F();iA?F(!1,iA):b=setTimeout(()=>{F(!1,1e-7)},1e3)}iA!==1||oZ(Y,E.getBoundingClientRect())||F(),nA=!1}})(!0),v})(g,A):null,d=-1,B=null;a&&(B=new ResizeObserver(E=>{var[f]=E;f&&f.target===g&&B&&(B.unobserve(e),cancelAnimationFrame(d),d=requestAnimationFrame(()=>{var b;(b=B)==null||b.observe(e)})),A()}),g&&!s&&B.observe(g),B.observe(e));var Q=s?ed(t):null;return s&&(function E(){var f=ed(t);Q&&!oZ(Q,f)&&A(),Q=f,C=requestAnimationFrame(E)})(),A(),()=>{var E;l.forEach(f=>{n&&f.removeEventListener(\"scroll\",A),o&&f.removeEventListener(\"resize\",A)}),I?.(),(E=B)==null||E.disconnect(),B=null,s&&cancelAnimationFrame(C)}}var w8A=function(t){return t===void 0&&(t=0),{name:\"offset\",options:t,fn:e=>Ut(function*(){var A,i,{x:n,y:o,placement:a,middlewareData:r}=e,s=yield(function(g,l){return vR.apply(this,arguments)})(e,t);return a===((A=r.offset)==null?void 0:A.placement)&&(i=r.arrow)!=null&&i.alignmentOffset?{}:{x:n+s.x,y:o+s.y,data:ye(ye({},s),{},{placement:a})}})()}},y8A=function(t){return t===void 0&&(t={}),{name:\"shift\",options:t,fn:e=>Ut(function*(){var{x:A,y:i,placement:n}=e,o=tw(t,e),{mainAxis:a=!0,crossAxis:r=!1,limiter:s={fn:R=>{var{x:M,y:v}=R;return{x:M,y:v}}}}=o,g=IZ(o,lpA),l={x:A,y:i},C=yield XX(e,g),I=AI(Ad(n)),d=VX(I),B=l[d],Q=l[I];if(a){var E=d===\"y\"?\"bottom\":\"right\";B=ZW(B+C[d===\"y\"?\"top\":\"left\"],B,B-C[E])}if(r){var f=I===\"y\"?\"bottom\":\"right\";Q=ZW(Q+C[I===\"y\"?\"top\":\"left\"],Q,Q-C[f])}var b=s.fn(ye(ye({},e),{},{[d]:B,[I]:Q}));return ye(ye({},b),{},{data:{x:b.x-A,y:b.y-i,enabled:{[d]:a,[I]:r}}})})()}},v8A=function(t){return t===void 0&&(t={}),{name:\"flip\",options:t,fn:e=>Ut(function*(){var A,i,{placement:n,middlewareData:o,rects:a,initialPlacement:r,platform:s,elements:g}=e,l=tw(t,e),{mainAxis:C=!0,crossAxis:I=!0,fallbackPlacements:d,fallbackStrategy:B=\"bestFit\",fallbackAxisSideDirection:Q=\"none\",flipAlignment:E=!0}=l,f=IZ(l,gpA);if((A=o.arrow)!=null&&A.alignmentOffset)return{};var b=Ad(n),R=AI(r),M=Ad(r)===r,v=yield s.isRTL==null?void 0:s.isRTL(g.floating),F=d||(M||!E?[CD(r)]:(function(hA){var JA=CD(hA);return[wR(hA),JA,wR(JA)]})(r)),G=Q!==\"none\";!d&&G&&F.push(...r8A(r,E,Q,v));var U=[r,...F],Y=yield XX(e,f),j=[],AA=((i=o.flip)==null?void 0:i.overflows)||[];if(C&&j.push(Y[b]),I){var z=(function(hA,JA,ee){ee===void 0&&(ee=!1);var UA=iw(hA),mA=ZX(hA),KA=WX(mA),ze=mA===\"x\"?UA===(ee?\"end\":\"start\")?\"right\":\"left\":UA===\"start\"?\"bottom\":\"top\";return JA.reference[KA]>JA.floating[KA]&&(ze=CD(ze)),[ze,CD(ze)]})(n,a,v);j.push(Y[z[0]],Y[z[1]])}if(AA=[...AA,{placement:n,overflows:j}],!j.every(hA=>hA<=0)){var yA,P,nA=(((yA=o.flip)==null?void 0:yA.index)||0)+1,eA=U[nA];if(eA&&(!(I===\"alignment\"&&R!==AI(eA))||AA.every(hA=>AI(hA.placement)!==R||hA.overflows[0]>0)))return{data:{index:nA,overflows:AA},reset:{placement:eA}};var dA=(P=AA.filter(hA=>hA.overflows[0]<=0).sort((hA,JA)=>hA.overflows[1]-JA.overflows[1])[0])==null?void 0:P.placement;if(!dA)switch(B){case\"bestFit\":var iA,aA=(iA=AA.filter(hA=>{if(G){var JA=AI(hA.placement);return JA===R||JA===\"y\"}return!0}).map(hA=>[hA.placement,hA.overflows.filter(JA=>JA>0).reduce((JA,ee)=>JA+ee,0)]).sort((hA,JA)=>hA[1]-JA[1])[0])==null?void 0:iA[0];aA&&(dA=aA);break;case\"initialPlacement\":dA=r}if(n!==dA)return{reset:{placement:dA}}}return{}})()}};function b8A(t){var e,A,i={autoUpdate:!0},n=t,o=s=>ye(ye(ye({},i),t||{}),s||{}),a=s=>{e&&A&&(n=o(s),((g,l,C)=>{var I=new Map,d=ye({platform:p8A},C),B=ye(ye({},d.platform),{},{_c:I});return g8A(g,l,ye(ye({},d),{},{platform:B}))})(e,A,n).then(g=>{var l;Object.assign(A.style,{position:g.strategy,left:\"\".concat(g.x,\"px\"),top:\"\".concat(g.y,\"px\")}),!((l=n)===null||l===void 0)&&l.onComputed&&n.onComputed(g)}))},r=s=>{cl(s.subscribe(g=>{e===void 0?(e=g,a()):(Object.assign(e,g),a())}))};return[s=>{if(\"subscribe\"in s)return r(s),{};e=s,a()},(s,g)=>{var l;A=s,n=o(g),setTimeout(()=>a(g),0),a(g);var C=()=>{l&&(l(),l=void 0)},I=function(){var{autoUpdate:d}=arguments.length>0&&arguments[0]!==void 0?arguments[0]:n||{};C(),d!==!1&&iX().then(()=>D8A(e,A,()=>a(n),d===!0?{}:d))};return l=I(),{update(d){a(d),l=I(d)},destroy(){C()}}},a]}function M8A(t){var{loadOptions:e,filterText:A,items:i,multiple:n,value:o,itemId:a,groupBy:r,filterSelectedItems:s,itemFilter:g,convertStringItemsToObjects:l,filterGroupedItems:C,label:I}=t;if(i&&e)return i;if(!i)return[];i&&i.length>0&&typeof i[0]!=\"object\"&&(i=l(i));var d=i.filter(B=>{var Q=g(B[I],A,B);return Q&&n&&o!=null&&o.length&&(Q=!o.some(E=>!!s&&E[a]===B[a])),Q});return r&&(d=C(d)),d}function k8A(t){return o$.apply(this,arguments)}function o$(){return(o$=Ut(function*(t){var{dispatch:e,loadOptions:A,convertStringItemsToObjects:i,filterText:n}=t,o=yield A(n).catch(a=>{console.warn(\"svelte-select loadOptions error :>> \",a),e(\"error\",{type:\"loadOptions\",details:a})});if(o&&!o.cancelled)return o?(o&&o.length>0&&typeof o[0]!=\"object\"&&(o=i(o)),e(\"loaded\",{items:o})):o=[],{filteredItems:o,loading:!1,focused:!0,listOpen:!0}})).apply(this,arguments)}Pt(`\n  svg.svelte-1kxu7be {\n      width: var(--chevron-icon-width, 20px);\n      height: var(--chevron-icon-width, 20px);\n      color: var(--chevron-icon-colour, currentColor);\n  }\n`);var S8A=CI(`<svg width=\"100%\" height=\"100%\" viewBox=\"0 0 20 20\" focusable=\"false\" aria-hidden=\"true\" class=\"svelte-1kxu7be\"><path fill=\"currentColor\" d=\"M4.516 7.548c0.436-0.446 1.043-0.481 1.576 0l3.908 3.747\n          3.908-3.747c0.533-0.481 1.141-0.446 1.574 0 0.436 0.445 0.408 1.197 0\n          1.615-0.406 0.418-4.695 4.502-4.695 4.502-0.217 0.223-0.502\n          0.335-0.787 0.335s-0.57-0.112-0.789-0.335c0\n          0-4.287-4.084-4.695-4.502s-0.436-1.17 0-1.615z\"></path></svg>`);Pt(`\n    svg.svelte-1hraxrc {\n        width: var(--clear-icon-width, 20px);\n        height: var(--clear-icon-width, 20px);\n        color: var(--clear-icon-color, currentColor);\n    }\n`);var x8A=CI(`<svg width=\"100%\" height=\"100%\" viewBox=\"-2 -2 50 50\" focusable=\"false\" aria-hidden=\"true\" role=\"presentation\" class=\"svelte-1hraxrc\"><path fill=\"currentColor\" d=\"M34.923,37.251L24,26.328L13.077,37.251L9.436,33.61l10.923-10.923L9.436,11.765l3.641-3.641L24,19.047L34.923,8.124\n    l3.641,3.641L27.641,22.688L38.564,33.61L34.923,37.251z\"></path></svg>`);function Xx(t){lA(t,x8A())}Pt(`\n    .loading.svelte-y9fi5p {\n        width: var(--spinner-width, 20px);\n        height: var(--spinner-height, 20px);\n        color: var(--spinner-color, var(--icons-color));\n        animation: svelte-y9fi5p-rotate 0.75s linear infinite;\n        transform-origin: center center;\n        transform: none;\n    }\n\n    .circle_path.svelte-y9fi5p {\n        stroke-dasharray: 90;\n        stroke-linecap: round;\n    }\n\n    @keyframes svelte-y9fi5p-rotate {\n        100% {\n            transform: rotate(360deg);\n        }\n    }\n`);var R8A=CI('<svg class=\"loading svelte-y9fi5p\" viewBox=\"25 25 50 50\"><circle class=\"circle_path svelte-y9fi5p\" cx=\"50\" cy=\"50\" r=\"20\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"5\" stroke-miterlimit=\"10\"></circle></svg>');Pt(`\n    .svelte-select.svelte-1ul7oo4 {\n        /* deprecating camelCase custom props in favour of kebab-case for v5 */\n        --borderRadius: var(--border-radius);\n        --clearSelectColor: var(--clear-select-color);\n        --clearSelectWidth: var(--clear-select-width);\n        --disabledBackground: var(--disabled-background);\n        --disabledBorderColor: var(--disabled-border-color);\n        --disabledColor: var(--disabled-color);\n        --disabledPlaceholderColor: var(--disabled-placeholder-color);\n        --disabledPlaceholderOpacity: var(--disabled-placeholder-opacity);\n        --errorBackground: var(--error-background);\n        --errorBorder: var(--error-border);\n        --groupItemPaddingLeft: var(--group-item-padding-left);\n        --groupTitleColor: var(--group-title-color);\n        --groupTitleFontSize: var(--group-title-font-size);\n        --groupTitleFontWeight: var(--group-title-font-weight);\n        --groupTitlePadding: var(--group-title-padding);\n        --groupTitleTextTransform: var(--group-title-text-transform);\n        --groupTitleBorderColor: var(--group-title-border-color);\n        --groupTitleBorderWidth: var(--group-title-border-width);\n        --groupTitleBorderStyle: var(--group-title-border-style);\n        --indicatorColor: var(--chevron-color);\n        --indicatorHeight: var(--chevron-height);\n        --indicatorWidth: var(--chevron-width);\n        --inputColor: var(--input-color);\n        --inputLeft: var(--input-left);\n        --inputLetterSpacing: var(--input-letter-spacing);\n        --inputMargin: var(--input-margin);\n        --inputPadding: var(--input-padding);\n        --itemActiveBackground: var(--item-active-background);\n        --itemColor: var(--item-color);\n        --itemFirstBorderRadius: var(--item-first-border-radius);\n        --itemHoverBG: var(--item-hover-bg);\n        --itemHoverColor: var(--item-hover-color);\n        --itemIsActiveBG: var(--item-is-active-bg);\n        --itemIsActiveColor: var(--item-is-active-color);\n        --itemIsNotSelectableColor: var(--item-is-not-selectable-color);\n        --itemPadding: var(--item-padding);\n        --listBackground: var(--list-background);\n        --listBorder: var(--list-border);\n        --listBorderRadius: var(--list-border-radius);\n        --listEmptyColor: var(--list-empty-color);\n        --listEmptyPadding: var(--list-empty-padding);\n        --listEmptyTextAlign: var(--list-empty-text-align);\n        --listMaxHeight: var(--list-max-height);\n        --listPosition: var(--list-position);\n        --listShadow: var(--list-shadow);\n        --listZIndex: var(--list-z-index);\n        --multiItemBG: var(--multi-item-bg);\n        --multiItemBorderRadius: var(--multi-item-border-radius);\n        --multiItemDisabledHoverBg: var(--multi-item-disabled-hover-bg);\n        --multiItemDisabledHoverColor: var(--multi-item-disabled-hover-color);\n        --multiItemHeight: var(--multi-item-height);\n        --multiItemMargin: var(--multi-item-margin);\n        --multiItemPadding: var(--multi-item-padding);\n        --multiSelectInputMargin: var(--multi-select-input-margin);\n        --multiSelectInputPadding: var(--multi-select-input-padding);\n        --multiSelectPadding: var(--multi-select-padding);\n        --placeholderColor: var(--placeholder-color);\n        --placeholderOpacity: var(--placeholder-opacity);\n        --selectedItemPadding: var(--selected-item-padding);\n        --spinnerColor: var(--spinner-color);\n        --spinnerHeight: var(--spinner-height);\n        --spinnerWidth: var(--spinner-width);\n\n        --internal-padding: 0 0 0 16px;\n\n        border: var(--border, 1px solid #d8dbdf);\n        border-radius: var(--border-radius, 6px);\n        min-height: var(--height, 42px);\n        position: relative;\n        display: flex;\n        align-items: stretch;\n        padding: var(--padding, var(--internal-padding));\n        background: var(--background, #fff);\n        margin: var(--margin, 0);\n        width: var(--width, 100%);\n        font-size: var(--font-size, 16px);\n        max-height: var(--max-height);\n    }\n\n    .svelte-1ul7oo4 {\n        box-sizing: var(--box-sizing, border-box);\n    }\n\n    .svelte-select.svelte-1ul7oo4:hover {\n        border: var(--border-hover, 1px solid #b2b8bf);\n    }\n\n    .value-container.svelte-1ul7oo4 {\n        display: flex;\n        flex: 1 1 0%;\n        flex-wrap: wrap;\n        align-items: center;\n        gap: 5px 10px;\n        padding: var(--value-container-padding, 5px 0);\n        position: relative;\n        overflow: var(--value-container-overflow, hidden);\n        align-self: stretch;\n    }\n\n    .prepend.svelte-1ul7oo4,\n    .indicators.svelte-1ul7oo4 {\n        display: flex;\n        flex-shrink: 0;\n        align-items: center;\n    }\n\n    .indicators.svelte-1ul7oo4 {\n        position: var(--indicators-position);\n        top: var(--indicators-top);\n        right: var(--indicators-right);\n        bottom: var(--indicators-bottom);\n    }\n\n    input.svelte-1ul7oo4 {\n        position: absolute;\n        cursor: default;\n        border: none;\n        color: var(--input-color, var(--item-color));\n        padding: var(--input-padding, 0);\n        letter-spacing: var(--input-letter-spacing, inherit);\n        margin: var(--input-margin, 0);\n        min-width: 10px;\n        top: 0;\n        right: 0;\n        bottom: 0;\n        left: 0;\n        background: transparent;\n        font-size: var(--font-size, 16px);\n    }\n\n    .svelte-1ul7oo4:not(.multi) > .value-container:where(.svelte-1ul7oo4) > input:where(.svelte-1ul7oo4) {\n        width: 100%;\n        height: 100%;\n    }\n\n    input.svelte-1ul7oo4::placeholder {\n        color: var(--placeholder-color, #78848f);\n        opacity: var(--placeholder-opacity, 1);\n    }\n\n    input.svelte-1ul7oo4:focus {\n        outline: none;\n    }\n\n    .svelte-select.focused.svelte-1ul7oo4 {\n        border: var(--border-focused, 1px solid #006fe8);\n        border-radius: var(--border-radius-focused, var(--border-radius, 6px));\n    }\n\n    .disabled.svelte-1ul7oo4 {\n        background: var(--disabled-background, #ebedef);\n        border-color: var(--disabled-border-color, #ebedef);\n        color: var(--disabled-color, #c1c6cc);\n    }\n\n    .disabled.svelte-1ul7oo4 input:where(.svelte-1ul7oo4)::placeholder {\n        color: var(--disabled-placeholder-color, #c1c6cc);\n        opacity: var(--disabled-placeholder-opacity, 1);\n    }\n\n    .selected-item.svelte-1ul7oo4 {\n        position: relative;\n        overflow: var(--selected-item-overflow, hidden);\n        padding: var(--selected-item-padding, 0 20px 0 0);\n        text-overflow: ellipsis;\n        white-space: nowrap;\n        color: var(--selected-item-color, inherit);\n        font-size: var(--font-size, 16px);\n    }\n\n    .multi.svelte-1ul7oo4 .selected-item:where(.svelte-1ul7oo4) {\n        position: absolute;\n        line-height: var(--height, 42px);\n        height: var(--height, 42px);\n    }\n\n    .selected-item.svelte-1ul7oo4:focus {\n        outline: none;\n    }\n\n    .hide-selected-item.svelte-1ul7oo4 {\n        opacity: 0;\n    }\n\n    .icon.svelte-1ul7oo4 {\n        display: flex;\n        align-items: center;\n        justify-content: center;\n    }\n\n    .clear-select.svelte-1ul7oo4 {\n        all: unset;\n        display: flex;\n        align-items: center;\n        justify-content: center;\n        width: var(--clear-select-width, 40px);\n        height: var(--clear-select-height, 100%);\n        color: var(--clear-select-color, var(--icons-color));\n        margin: var(--clear-select-margin, 0);\n        pointer-events: all;\n        flex-shrink: 0;\n    }\n\n    .clear-select.svelte-1ul7oo4:focus {\n        outline: var(--clear-select-focus-outline, 1px solid #006fe8);\n    }\n\n    .loading.svelte-1ul7oo4 {\n        width: var(--loading-width, 40px);\n        height: var(--loading-height);\n        color: var(--loading-color, var(--icons-color));\n        margin: var(--loading--margin, 0);\n        flex-shrink: 0;\n    }\n\n    .chevron.svelte-1ul7oo4 {\n        width: var(--chevron-width, 40px);\n        height: var(--chevron-height, 40px);\n        background: var(--chevron-background, transparent);\n        pointer-events: var(--chevron-pointer-events, none);\n        color: var(--chevron-color, var(--icons-color));\n        border: var(--chevron-border, 0 0 0 1px solid #d8dbdf);\n        flex-shrink: 0;\n    }\n\n    .multi.svelte-1ul7oo4 {\n        padding: var(--multi-select-padding, var(--internal-padding));\n    }\n\n    .multi.svelte-1ul7oo4 input:where(.svelte-1ul7oo4) {\n        padding: var(--multi-select-input-padding, 0);\n        position: relative;\n        margin: var(--multi-select-input-margin, 5px 0);\n        flex: 1 1 40px;\n    }\n\n    .svelte-select.error.svelte-1ul7oo4 {\n        border: var(--error-border, 1px solid #ff2d55);\n        background: var(--error-background, #fff);\n    }\n\n    .a11y-text.svelte-1ul7oo4 {\n        z-index: 9999;\n        border: 0px;\n        clip: rect(1px, 1px, 1px, 1px);\n        height: 1px;\n        width: 1px;\n        position: absolute;\n        overflow: hidden;\n        padding: 0px;\n        white-space: nowrap;\n    }\n\n    .multi-item.svelte-1ul7oo4 {\n        background: var(--multi-item-bg, #ebedef);\n        margin: var(--multi-item-margin, 0);\n        outline: var(--multi-item-outline, 1px solid #ddd);\n        border-radius: var(--multi-item-border-radius, 4px);\n        height: var(--multi-item-height, 25px);\n        line-height: var(--multi-item-height, 25px);\n        display: flex;\n        cursor: default;\n        padding: var(--multi-item-padding, 0 5px);\n        overflow: hidden;\n        gap: var(--multi-item-gap, 4px);\n        outline-offset: -1px;\n        max-width: var(--multi-max-width, none);\n        color: var(--multi-item-color, var(--item-color));\n    }\n\n    .multi-item.disabled.svelte-1ul7oo4:hover {\n        background: var(--multi-item-disabled-hover-bg, #ebedef);\n        color: var(--multi-item-disabled-hover-color, #c1c6cc);\n    }\n\n    .multi-item-text.svelte-1ul7oo4 {\n        overflow: hidden;\n        text-overflow: ellipsis;\n        white-space: nowrap;\n    }\n\n    .multi-item-clear.svelte-1ul7oo4 {\n        display: flex;\n        align-items: center;\n        justify-content: center;\n        --clear-icon-color: var(--multi-item-clear-icon-color, #000);\n    }\n\n    .multi-item.active.svelte-1ul7oo4 {\n        outline: var(--multi-item-active-outline, 1px solid #006fe8);\n    }\n\n    .svelte-select-list.svelte-1ul7oo4 {\n        box-shadow: var(--list-shadow, 0 2px 3px 0 rgba(44, 62, 80, 0.24));\n        border-radius: var(--list-border-radius, 4px);\n        max-height: var(--list-max-height, 252px);\n        overflow-y: auto;\n        background: var(--list-background, #fff);\n        position: var(--list-position, absolute);\n        z-index: var(--list-z-index, 2);\n        border: var(--list-border);\n    }\n\n    .prefloat.svelte-1ul7oo4 {\n        opacity: 0;\n        pointer-events: none;\n    }\n\n    .list-group-title.svelte-1ul7oo4 {\n        color: var(--group-title-color, #8f8f8f);\n        cursor: default;\n        font-size: var(--group-title-font-size, 16px);\n        font-weight: var(--group-title-font-weight, 600);\n        height: var(--height, 42px);\n        line-height: var(--height, 42px);\n        padding: var(--group-title-padding, 0 20px);\n        text-overflow: ellipsis;\n        overflow-x: hidden;\n        white-space: nowrap;\n        text-transform: var(--group-title-text-transform, uppercase);\n        border-width: var(--group-title-border-width, medium);\n        border-style: var(--group-title-border-style, none);\n        border-color: var(--group-title-border-color, color);\n    }\n\n    .empty.svelte-1ul7oo4 {\n        text-align: var(--list-empty-text-align, center);\n        padding: var(--list-empty-padding, 20px 0);\n        color: var(--list-empty-color, #78848f);\n    }\n\n    .item.svelte-1ul7oo4 {\n        cursor: default;\n        height: var(--item-height, var(--height, 42px));\n        line-height: var(--item-line-height, var(--height, 42px));\n        padding: var(--item-padding, 0 20px);\n        color: var(--item-color, inherit);\n        text-overflow: ellipsis;\n        overflow: hidden;\n        white-space: nowrap;\n        transition: var(--item-transition, all 0.2s);\n        align-items: center;\n        width: 100%;\n    }\n\n    .item.group-item.svelte-1ul7oo4 {\n        padding-left: var(--group-item-padding-left, 40px);\n    }\n\n    .item.svelte-1ul7oo4:active {\n        background: var(--item-active-background, #b9daff);\n    }\n\n    .item.active.svelte-1ul7oo4 {\n        background: var(--item-is-active-bg, #007aff);\n        color: var(--item-is-active-color, #fff);\n    }\n\n    .item.first.svelte-1ul7oo4 {\n        border-radius: var(--item-first-border-radius, 4px 4px 0 0);\n    }\n\n    .item.hover.svelte-1ul7oo4:not(.active) {\n        background: var(--item-hover-bg, #e7f2ff);\n        color: var(--item-hover-color, inherit);\n    }\n\n    .item.not-selectable.svelte-1ul7oo4,\n    .item.hover.item.not-selectable.svelte-1ul7oo4,\n    .item.active.item.not-selectable.svelte-1ul7oo4,\n    .item.not-selectable.svelte-1ul7oo4:active {\n        color: var(--item-is-not-selectable-color, #999);\n        background: transparent;\n    }\n\n    .required.svelte-1ul7oo4 {\n        opacity: 0;\n        z-index: -1;\n        position: absolute;\n        top: 0;\n        left: 0;\n        bottom: 0;\n        right: 0;\n    }\n`);var N8A=FA('<div class=\"list-item svelte-1ul7oo4\" tabindex=\"-1\" role=\"none\"><div><!></div></div>'),F8A=FA('<div class=\"empty svelte-1ul7oo4\">No options</div>'),L8A=FA('<div role=\"none\"><!> <!> <!></div>'),_8A=FA('<span id=\"aria-selection\" class=\"svelte-1ul7oo4\"> </span> <span id=\"aria-context\" class=\"svelte-1ul7oo4\"> </span>',1),G8A=FA('<div class=\"multi-item-clear svelte-1ul7oo4\"><!></div>'),K8A=FA('<div role=\"none\"><span class=\"multi-item-text svelte-1ul7oo4\"><!></span> <!></div>'),U8A=FA(\"<div><!></div>\"),J8A=FA('<div class=\"icon loading svelte-1ul7oo4\" aria-hidden=\"true\"><!></div>'),Y8A=FA('<button type=\"button\" class=\"icon clear-select svelte-1ul7oo4\"><!></button>'),H8A=FA('<div class=\"icon chevron svelte-1ul7oo4\" aria-hidden=\"true\"><!></div>'),T8A=FA('<input type=\"hidden\" class=\"svelte-1ul7oo4\"/>'),O8A=FA('<select class=\"required svelte-1ul7oo4\" required tabindex=\"-1\" aria-hidden=\"true\"></select>'),z8A=FA('<div role=\"none\"><!> <span aria-live=\"polite\" aria-atomic=\"false\" aria-relevant=\"additions text\" class=\"a11y-text svelte-1ul7oo4\"><!></span> <div class=\"prepend svelte-1ul7oo4\"><!></div> <div class=\"value-container svelte-1ul7oo4\"><!> <input/></div> <div class=\"indicators svelte-1ul7oo4\"><!> <!> <!></div> <!> <!></div>');function U1(t,e){var A=(function(IA){var SA={};for(var re in IA.children&&(SA.default=!0),IA.$$slots)SA[re]=!0;return SA})(e);kt(e,!1);var i,n=CA(),o=CA(),a=CA(),r=CA(),s=CA(),g=CA(),l=CA(),C=CA(),I=CA(),d=UpA(),B=N(e,\"justValue\",12,null),Q=N(e,\"filter\",8,M8A),E=N(e,\"getItems\",8,k8A),f=N(e,\"id\",8,null),b=N(e,\"name\",8,null),R=N(e,\"container\",12,void 0),M=N(e,\"input\",12,void 0),v=N(e,\"multiple\",8,!1),F=N(e,\"multiFullItemClearable\",8,!1),G=N(e,\"disabled\",8,!1),U=N(e,\"focused\",12,!1),Y=N(e,\"value\",12,null),j=N(e,\"filterText\",12,\"\"),AA=N(e,\"placeholder\",8,\"Please select\"),z=N(e,\"placeholderAlwaysShow\",8,!1),yA=N(e,\"items\",12,null),P=N(e,\"label\",8,\"label\"),nA=N(e,\"itemFilter\",8,(IA,SA,re)=>\"\".concat(IA).toLowerCase().includes(SA.toLowerCase())),eA=N(e,\"groupBy\",8,void 0),dA=N(e,\"groupFilter\",8,IA=>IA),iA=N(e,\"groupHeaderSelectable\",8,!1),aA=N(e,\"itemId\",8,\"value\"),hA=N(e,\"loadOptions\",8,void 0),JA=N(e,\"containerStyles\",8,\"\"),ee=N(e,\"hasError\",8,!1),UA=N(e,\"filterSelectedItems\",8,!0),mA=N(e,\"required\",8,!1),KA=N(e,\"closeListOnChange\",8,!0),ze=N(e,\"clearFilterTextOnBlur\",8,!0),Ke=N(e,\"createGroupHeaderItem\",8,(IA,SA)=>({value:IA,[P()]:IA})),HA=()=>c(l),uA=N(e,\"searchable\",8,!0),XA=N(e,\"inputStyles\",8,\"\"),EA=N(e,\"clearable\",8,!0),ZA=N(e,\"loading\",12,!1),MA=N(e,\"listOpen\",12,!1),be=N(e,\"debounce\",8,function(IA){var SA=arguments.length>1&&arguments[1]!==void 0?arguments[1]:1;clearTimeout(i),i=setTimeout(IA,SA)}),_A=N(e,\"debounceWait\",8,300),pA=N(e,\"hideEmptyState\",8,!1),Rt=N(e,\"inputAttributes\",24,()=>({})),Et=N(e,\"listAutoWidth\",8,!0),Qe=N(e,\"showChevron\",8,!1),_t=N(e,\"listOffset\",8,5),Ue=N(e,\"hoverItemIndex\",12,0),Te=N(e,\"floatingConfig\",24,()=>({})),ht=N(e,\"class\",8,\"\"),Me=CA(),Ai=CA(),J=CA(),O=CA(),tA=CA();function oA(IA){return IA.map((SA,re)=>({index:re,value:SA,label:\"\".concat(SA)}))}function NA(IA){var SA=[],re={};IA.forEach(tt=>{var at=eA()(tt);SA.includes(at)||(SA.push(at),re[at]=[],at&&re[at].push(Object.assign(Ke()(at,tt),{id:at,groupHeader:!0,selectable:iA()}))),re[at].push(Object.assign({groupItem:!!at},tt))});var Se=[];return dA()(SA).forEach(tt=>{re[tt]&&Se.push(...re[tt])}),Se}function de(){var IA=arguments.length>0&&arguments[0]!==void 0?arguments[0]:0,SA=arguments.length>1?arguments[1]:void 0;Ue(IA<0?0:IA),!SA&&eA()&&c(l)[Ue()]&&!c(l)[Ue()].selectable&&gi(1)}function Ee(){var IA=!0;if(Y()){var SA=[],re=[];Y().forEach(Se=>{SA.includes(Se[aA()])?IA=!1:(SA.push(Se[aA()]),re.push(Se))}),IA||Y(re)}return IA}function xA(IA){var SA=IA?IA[aA()]:Y()[aA()];return yA().find(re=>re[aA()]===SA)}function LA(IA){return dt.apply(this,arguments)}function dt(){return(dt=Ut(function*(IA){var SA=Y()[IA];Y().length===1?Y(void 0):Y(Y().filter(re=>re!==SA)),d(\"clear\",SA)})).apply(this,arguments)}function At(IA){if(U())switch(IA.stopPropagation(),IA.key){case\"Escape\":IA.preventDefault(),Le();break;case\"Enter\":if(IA.preventDefault(),MA()){if(c(l).length===0)break;var SA=c(l)[Ue()];if(Y()&&!v()&&Y()[aA()]===SA[aA()]){Le();break}L(c(l)[Ue()])}break;case\"ArrowDown\":IA.preventDefault(),MA()?gi(1):(MA(!0),x(Me,void 0));break;case\"ArrowUp\":IA.preventDefault(),MA()?gi(-1):(MA(!0),x(Me,void 0));break;case\"Tab\":if(MA()&&U()){if(c(l).length===0||Y()&&Y()[aA()]===c(l)[Ue()][aA()])return Le();IA.preventDefault(),L(c(l)[Ue()]),Le()}break;case\"Backspace\":if(!v()||j().length>0)return;if(v()&&Y()&&Y().length>0){if(LA(c(Me)!==void 0?c(Me):Y().length-1),c(Me)===0||c(Me)===void 0)break;x(Me,Y().length>c(Me)?c(Me)-1:void 0)}break;case\"ArrowLeft\":if(!Y()||!v()||j().length>0)return;c(Me)===void 0?x(Me,Y().length-1):Y().length>c(Me)&&c(Me)!==0&&x(Me,c(Me)-1);break;case\"ArrowRight\":if(!Y()||!v()||j().length>0||c(Me)===void 0)return;c(Me)===Y().length-1?x(Me,void 0):c(Me)<Y().length-1&&x(Me,c(Me)+1)}}function Je(IA){var SA,re;U()&&M()===((SA=document)===null||SA===void 0?void 0:SA.activeElement)||(IA&&d(\"focus\",IA),(re=M())===null||re===void 0||re.focus(),U(!0))}function Ge(IA){return ri.apply(this,arguments)}function ri(){return(ri=Ut(function*(IA){var SA;Nt||(MA()||U())&&(d(\"blur\",IA),Le(),U(!1),x(Me,void 0),(SA=M())===null||SA===void 0||SA.blur())})).apply(this,arguments)}function en(){if(!G())return j().length>0?MA(!0):void MA(!MA())}function rn(){d(\"clear\",Y()),Y(void 0),Le(),Je()}function Le(){ze()&&j(\"\"),MA(!1)}JpA(Ut(function*(){x(Ai,Y()),x(J,j()),x(O,v())})),Jr(()=>{MA()&&U(!0),U()&&M()&&M().focus()});var ji=N(e,\"ariaValues\",8,IA=>\"Option \".concat(IA,\", selected.\")),Bi=N(e,\"ariaListOpen\",8,(IA,SA)=>\"You are currently focused on option \".concat(IA,\". There are \").concat(SA,\" results available.\")),vi=N(e,\"ariaFocused\",8,()=>\"Select is focused, type to refine list, press down to open the menu.\"),Ji,Dt=CA(null);function qi(){clearTimeout(Ji),Ji=setTimeout(()=>{Nt=!1},100)}cl(()=>{var IA;(IA=c(Dt))===null||IA===void 0||IA.remove()});var Nt=!1;function L(IA){IA&&IA.selectable!==!1&&(function(SA){if(SA){j(\"\");var re=Object.assign({},SA);if(re.groupHeader&&!re.selectable)return;Y(v()?Y()?Y().concat([re]):[re]:Y(re)),setTimeout(()=>{KA()&&Le(),x(Me,void 0),d(\"change\",Y()),d(\"select\",SA)})}})(IA)}function gt(IA){Nt||Ue(IA)}function gi(IA){if(c(l).filter(re=>!Object.hasOwn(re,\"selectable\")||re.selectable===!0).length===0)return Ue(0);IA>0&&Ue()===c(l).length-1?Ue(0):IA<0&&Ue()===0?Ue(c(l).length-1):Ue(Ue()+IA);var SA=c(l)[Ue()];SA&&SA.selectable===!1&&(IA!==1&&IA!==-1||gi(IA))}function sn(IA,SA,re){if(!v())return SA&&SA[re]===IA[re]}var gn=ko,Kn=ko;function ko(IA){return{update(SA){SA.scroll&&(qi(),IA.scrollIntoView({behavior:\"auto\",block:\"nearest\"}))}}}var eo=CA({strategy:\"absolute\",placement:\"bottom-start\",middleware:[w8A(_t()),v8A(),y8A()],autoUpdate:!1}),[fo,Go,co]=b8A(c(eo)),ta=CA(!0);RA(()=>(_(yA()),_(Y())),()=>{yA(),Y()&&(function(){if(typeof Y()==\"string\"){var IA=(yA()||[]).find(SA=>SA[aA()]===Y());Y(IA||{[aA()]:Y(),label:Y()})}else v()&&Array.isArray(Y())&&Y().length>0&&Y(Y().map(SA=>typeof SA==\"string\"?{value:SA,label:SA}:SA))})()}),RA(()=>(_(Rt()),_(uA())),()=>{!Rt()&&uA()||(x(tA,Object.assign({autocapitalize:\"none\",autocomplete:\"off\",autocorrect:\"off\",spellcheck:!1,tabindex:0,type:\"text\",\"aria-autocomplete\":\"list\"},Rt())),f()&&yg(tA,c(tA).id=f()),uA()||yg(tA,c(tA).readonly=!0))}),RA(()=>_(v()),()=>{v()&&Y()&&(Array.isArray(Y())?Y([...Y()]):Y([Y()]))}),RA(()=>(c(O),_(v())),()=>{c(O)&&!v()&&Y()&&Y(null)}),RA(()=>(_(v()),_(Y())),()=>{v()&&Y()&&Y().length>1&&Ee()}),RA(()=>_(Y()),()=>{Y()&&(v()?JSON.stringify(Y())!==JSON.stringify(c(Ai))&&Ee()&&d(\"input\",Y()):c(Ai)&&JSON.stringify(Y()[aA()])===JSON.stringify(c(Ai)[aA()])||d(\"input\",Y()))}),RA(()=>(_(Y()),_(v()),c(Ai)),()=>{!Y()&&v()&&c(Ai)&&d(\"input\",Y())}),RA(()=>(_(U()),_(M())),()=>{!U()&&M()&&Le()}),RA(()=>(_(j()),c(J)),()=>{j()!==c(J)&&(hA()||j().length!==0)&&(hA()?be()(Ut(function*(){ZA(!0);var IA=yield E()({dispatch:d,loadOptions:hA(),convertStringItemsToObjects:oA,filterText:j()});IA?(ZA(IA.loading),MA(MA()?IA.listOpen:j().length>0),U(MA()&&IA.focused),yA(eA()?NA(IA.filteredItems):IA.filteredItems)):(ZA(!1),U(!0),MA(!0))}),_A()):(MA(!0),v()&&x(Me,void 0)))}),RA(()=>(_(Q()),_(hA()),_(j()),_(yA()),_(v()),_(Y()),_(aA()),_(eA()),_(P()),_(UA()),_(nA())),()=>{x(l,Q()({loadOptions:hA(),filterText:j(),items:yA(),multiple:v(),value:Y(),itemId:aA(),groupBy:eA(),label:P(),filterSelectedItems:UA(),itemFilter:nA(),convertStringItemsToObjects:oA,filterGroupedItems:NA}))}),RA(()=>(_(v()),_(MA()),_(Y()),c(l)),()=>{!v()&&MA()&&Y()&&c(l)&&de(c(l).findIndex(IA=>IA[aA()]===Y()[aA()]),!0)}),RA(()=>(_(MA()),_(v())),()=>{MA()&&v()&&Ue(0)}),RA(()=>_(j()),()=>{j()&&Ue(0)}),RA(()=>_(Ue()),()=>{var IA;IA=Ue(),d(\"hoverItem\",IA)}),RA(()=>(_(v()),_(Y())),()=>{x(n,v()?Y()&&Y().length>0:Y())}),RA(()=>(c(n),_(j())),()=>{x(o,c(n)&&j().length>0)}),RA(()=>(c(n),_(EA()),_(G()),_(ZA())),()=>{x(a,c(n)&&EA()&&!G()&&!ZA())}),RA(()=>(_(z()),_(v()),_(AA()),_(Y())),()=>{var IA;x(r,z()&&v()||v()&&((IA=Y())===null||IA===void 0?void 0:IA.length)===0?AA():Y()?\"\":AA())}),RA(()=>(_(Y()),_(v())),()=>{var IA,SA;x(s,Y()?(IA=v(),SA=void 0,SA=IA&&Y().length>0?Y().map(re=>re[P()]).join(\", \"):Y()[P()],ji()(SA)):\"\")}),RA(()=>(c(l),_(Ue()),_(U()),_(MA())),()=>{x(g,(function(){if(!c(l)||c(l).length===0)return\"\";var IA=c(l)[Ue()];if(MA()&&IA){var SA=c(l)?c(l).length:0;return Bi()(IA[P()],SA)}return vi()()})((c(l),Ue(),U(),MA())))}),RA(()=>_(yA()),()=>{(function(IA){IA&&IA.length!==0&&!IA.some(SA=>typeof SA!=\"object\")&&Y()&&(v()?!Y().some(SA=>!SA||!SA[aA()]):Y()[aA()])&&(Array.isArray(Y())?Y(Y().map(SA=>xA(SA)||SA)):Y(xA()||Y()))})(yA())}),RA(()=>(_(v()),_(Y()),_(aA())),()=>{B((v(),Y(),aA(),v()?Y()?Y().map(IA=>IA[aA()]):null:Y()?Y()[aA()]:Y()))}),RA(()=>(_(v()),c(Ai),_(Y())),()=>{v()||!c(Ai)||Y()||d(\"input\",Y())}),RA(()=>(_(MA()),c(l),_(v()),_(Y())),()=>{MA()&&c(l)&&!v()&&!Y()&&de()}),RA(()=>c(l),()=>{(function(IA){MA()&&d(\"filter\",IA)})(c(l))}),RA(()=>(_(R()),_(Te()),c(eo)),()=>{R()&&Te()&&co(Object.assign(c(eo),Te()))}),RA(()=>c(Dt),()=>{x(C,!!c(Dt))}),RA(()=>(c(Dt),_(MA())),()=>{(function(IA,SA){if(!IA||!SA)return x(ta,!0);setTimeout(()=>{x(ta,!1)},0)})(c(Dt),MA())}),RA(()=>(_(MA()),_(R()),c(Dt)),()=>{MA()&&R()&&c(Dt)&&(function(){var{width:IA}=R().getBoundingClientRect();yg(Dt,c(Dt).style.width=Et()?IA+\"px\":\"auto\")})()}),RA(()=>_(Ue()),()=>{x(I,Ue())}),RA(()=>(_(M()),_(MA()),_(U())),()=>{M()&&MA()&&!U()&&Je()}),RA(()=>(_(R()),_(Te())),()=>{var IA;R()&&((IA=Te())===null||IA===void 0?void 0:IA.autoUpdate)===void 0&&yg(eo,c(eo).autoUpdate=!0)}),mn();var Ko={getFilteredItems:HA,handleClear:rn};$t();var qo,Co=z8A();ue(\"click\",dC,function(IA){var SA;MA()||U()||!R()||R().contains(IA.target)||(SA=c(Dt))!==null&&SA!==void 0&&SA.contains(IA.target)||Ge()}),ue(\"keydown\",dC,At);var se=cA(Co),Ci=IA=>{var SA,re=L8A(),Se=cA(re),tt=jt=>{var Si=yi();Aa($e(Si),e,\"list-prepend\",{},null),lA(jt,Si)};YA(Se,jt=>{QA(()=>A[\"list-prepend\"])&&jt(tt)});var at=bA(Se,2),bt=jt=>{var Si=yi();Aa($e(Si),e,\"list\",{get filteredItems(){return c(l)}},null),lA(jt,Si)},Sn=jt=>{var Si=yi(),ca=$e(Si),Ft=xi=>{var Yi=yi();ea($e(Yi),1,()=>c(l),ha,(Un,cn,Mt)=>{var Vo,xo=N8A(),u=cA(xo);Aa(cA(u),e,\"item\",{get item(){return c(cn)},index:Mt},w=>{var S=tr();ve(()=>xt(S,(c(cn),_(P()),QA(()=>{var T;return(T=c(cn))===null||T===void 0?void 0:T[P()]})))),lA(w,S)}),as(u,(w,S)=>gn?.(w),()=>({scroll:sn(c(cn),Y(),aA()),listDom:c(C)})),as(u,(w,S)=>Kn?.(w),()=>({scroll:c(I)===Mt,listDom:c(C)})),ve(w=>Vo=Xt(u,1,\"item svelte-1ul7oo4\",null,Vo,w),[()=>{var w,S;return{\"list-group-title\":c(cn).groupHeader,active:sn(c(cn),Y(),aA()),first:(S=Mt,S===0),hover:Ue()===Mt,\"group-item\":c(cn).groupItem,\"not-selectable\":((w=c(cn))===null||w===void 0?void 0:w.selectable)===!1}}]),ue(\"mouseover\",xo,()=>gt(Mt)),ue(\"focus\",xo,()=>gt(Mt)),ue(\"click\",xo,aC(()=>(function(w){var{item:S,i:T}=w;if(S?.selectable!==!1)return Y()&&!v()&&Y()[aA()]===S[aA()]?Le():void((function(k){return k.groupHeader&&k.selectable||k.selectable||!k.hasOwnProperty(\"selectable\")})(S)&&(Ue(T),L(S)))})({item:c(cn),i:Mt}))),ue(\"keydown\",xo,z2(aC(function(w){q3.call(this,e,w)}))),lA(Un,xo)}),lA(xi,Yi)},rt=xi=>{var Yi=yi(),Un=$e(Yi),cn=Mt=>{var Vo=yi();Aa($e(Vo),e,\"empty\",{},xo=>{lA(xo,F8A())}),lA(Mt,Vo)};YA(Un,Mt=>{pA()||Mt(cn)},!0),lA(xi,Yi)};YA(ca,xi=>{c(l),QA(()=>c(l).length>0)?xi(Ft):xi(rt,!1)},!0),lA(jt,Si)};YA(at,jt=>{QA(()=>A.list)?jt(bt):jt(Sn,!1)});var ki=bA(at,2),Gi=jt=>{var Si=yi();Aa($e(Si),e,\"list-append\",{},null),lA(jt,Si)};YA(ki,jt=>{QA(()=>A[\"list-append\"])&&jt(Gi)}),as(re,jt=>Go?.(jt)),Mo(re,jt=>x(Dt,jt),()=>c(Dt)),Er(()=>ue(\"scroll\",re,qi)),Er(()=>ue(\"pointerup\",re,z2(aC(function(jt){q3.call(this,e,jt)})))),Er(()=>ue(\"mousedown\",re,z2(aC(function(jt){q3.call(this,e,jt)})))),ve(()=>SA=Xt(re,1,\"svelte-select-list svelte-1ul7oo4\",null,SA,{prefloat:c(ta)})),lA(IA,re)};YA(se,IA=>{MA()&&IA(Ci)});var tn=bA(se,2),ln=cA(tn),So=IA=>{var SA=_8A(),re=$e(SA),Se=cA(re),tt=cA(bA(re,2));ve(()=>{xt(Se,c(s)),xt(tt,c(g))}),lA(IA,SA)};YA(ln,IA=>{U()&&IA(So)});var la=bA(tn,2);Aa(cA(la),e,\"prepend\",{},null);var pi=bA(la,2),to=cA(pi),Ja=IA=>{var SA=yi(),re=$e(SA),Se=at=>{var bt=yi();ea($e(bt),1,Y,ha,(Sn,ki,Gi)=>{var jt,Si=K8A(),ca=cA(Si);Aa(cA(ca),e,\"selection\",{get selection(){return c(ki)},index:Gi},xi=>{var Yi=tr();ve(()=>xt(Yi,(c(ki),_(P()),QA(()=>c(ki)[P()])))),lA(xi,Yi)});var Ft=bA(ca,2),rt=xi=>{var Yi=G8A();Aa(cA(Yi),e,\"multi-clear-icon\",{},Un=>{Xx(Un)}),ue(\"pointerup\",Yi,z2(aC(()=>LA(Gi)))),lA(xi,Yi)};YA(Ft,xi=>{G()||F()||!Xx||xi(rt)}),ve(()=>jt=Xt(Si,1,\"multi-item svelte-1ul7oo4\",null,jt,{active:c(Me)===Gi,disabled:G()})),ue(\"click\",Si,z2(()=>F()?LA(Gi):{})),ue(\"keydown\",Si,z2(aC(function(xi){q3.call(this,e,xi)}))),lA(Sn,Si)}),lA(at,bt)},tt=at=>{var bt,Sn=U8A();Aa(cA(Sn),e,\"selection\",{get selection(){return Y()}},ki=>{var Gi=tr();ve(()=>xt(Gi,(_(Y()),_(P()),QA(()=>Y()[P()])))),lA(ki,Gi)}),ve(()=>bt=Xt(Sn,1,\"selected-item svelte-1ul7oo4\",null,bt,{\"hide-selected-item\":c(o)})),lA(at,Sn)};YA(re,at=>{v()?at(Se):at(tt,!1)}),lA(IA,SA)};YA(to,IA=>{c(n)&&IA(Ja)});var Io=bA(to,2);pD(Io,()=>ye(ye({readOnly:!uA()},c(tA)),{},{placeholder:c(r),style:XA(),disabled:G()}),void 0,void 0,void 0,\"svelte-1ul7oo4\",!0),Mo(Io,IA=>M(IA),()=>M());var Sa=bA(pi,2),kn=cA(Sa),Mi=IA=>{var SA=J8A();Aa(cA(SA),e,\"loading-icon\",{},re=>{(function(Se){lA(Se,R8A())})(re)}),lA(IA,SA)};YA(kn,IA=>{ZA()&&IA(Mi)});var Ot=bA(kn,2),pn=IA=>{var SA=Y8A();Aa(cA(SA),e,\"clear-icon\",{},re=>{Xx(re)}),ue(\"click\",SA,rn),lA(IA,SA)};YA(Ot,IA=>{c(a)&&IA(pn)});var io=bA(Ot,2),mo=IA=>{var SA=H8A();Aa(cA(SA),e,\"chevron-icon\",{get listOpen(){return MA()}},re=>{(function(Se){lA(Se,S8A())})(re)}),lA(IA,SA)};YA(io,IA=>{Qe()&&IA(mo)});var vA=bA(Sa,2);Aa(vA,e,\"input-hidden\",{get value(){return Y()}},IA=>{var SA=T8A();ve(re=>{fn(SA,\"name\",b()),Z1(SA,re)},[()=>(_(Y()),QA(()=>Y()?JSON.stringify(Y()):null))]),lA(IA,SA)});var VA=bA(vA,2),me=IA=>{var SA=yi();Aa($e(SA),e,\"required\",{get value(){return Y()}},re=>{lA(re,O8A())}),lA(IA,SA)};return YA(VA,IA=>{_(mA()),_(Y()),QA(()=>mA()&&(!Y()||Y().length===0))&&IA(me)}),Er(()=>ue(\"pointerup\",Co,z2(en))),Mo(Co,IA=>R(IA),()=>R()),as(Co,IA=>fo?.(IA)),ve(()=>{var IA;qo=Xt(Co,1,\"svelte-select \".concat((IA=ht())!==null&&IA!==void 0?IA:\"\"),\"svelte-1ul7oo4\",qo,{multi:v(),disabled:G(),focused:U(),\"list-open\":MA(),\"show-chevron\":Qe(),error:ee()}),gl(Co,JA())}),ue(\"keydown\",Io,At),ue(\"blur\",Io,Ge),ue(\"focus\",Io,Je),xD(Io,j),lA(t,Co),Tt(e,\"getFilteredItems\",HA),Tt(e,\"handleClear\",rn),St(Ko)}Pt(`/* over all fonts, sizes, and colors */\n/* \"consolas\" for Windows, \"menlo\" for Mac with fallback to \"monaco\", 'Ubuntu Mono' for Ubuntu */\n/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */\n/* main, menu, modal */\n/* jsoneditor modal */\n/* tooltip in text mode */\n/* panels: navigation bar, gutter, search box */\n/* navigation-bar */\n/* context menu */\n/* contents: json key and values */\n/* contents: selected or hovered */\n/* contents: section of collapsed items in an array */\n/* contents: highlighting of search matches */\n/* contents: inline tags inside the JSON document */\n/* contents: table */\n/* controls in modals: inputs, buttons, and \\`a\\` */\n/* messages */\n/* svelte-select */\n/* color picker */\ntable.jse-transform-wizard.svelte-9wqi8y {\n  border-collapse: collapse;\n  border-spacing: 0;\n  width: 100%;\n}\ntable.jse-transform-wizard.svelte-9wqi8y input:where(.svelte-9wqi8y) {\n  font-family: inherit;\n  font-size: inherit;\n}\ntable.jse-transform-wizard.svelte-9wqi8y tr:where(.svelte-9wqi8y) th:where(.svelte-9wqi8y) {\n  font-weight: normal;\n  text-align: left;\n  width: 60px;\n}\ntable.jse-transform-wizard.svelte-9wqi8y tr:where(.svelte-9wqi8y) td:where(.svelte-9wqi8y) .jse-horizontal:where(.svelte-9wqi8y) {\n  width: 100%;\n  display: flex;\n  flex-direction: row;\n  margin-bottom: calc(0.5 * var(--jse-padding, 10px));\n}\ntable.jse-transform-wizard.svelte-9wqi8y tr:where(.svelte-9wqi8y) td:where(.svelte-9wqi8y) .jse-horizontal:where(.svelte-9wqi8y) .svelte-select .multi-item {\n  align-items: center;\n}\ntable.jse-transform-wizard.svelte-9wqi8y tr:where(.svelte-9wqi8y) td:where(.svelte-9wqi8y) .jse-horizontal:where(.svelte-9wqi8y) .svelte-select .value-container {\n  gap: 0 !important;\n}\ntable.jse-transform-wizard.svelte-9wqi8y tr:where(.svelte-9wqi8y) td:where(.svelte-9wqi8y) .jse-horizontal:where(.svelte-9wqi8y) .svelte-select.jse-filter-path {\n  flex: 4;\n  margin-right: calc(0.5 * var(--jse-padding, 10px));\n}\ntable.jse-transform-wizard.svelte-9wqi8y tr:where(.svelte-9wqi8y) td:where(.svelte-9wqi8y) .jse-horizontal:where(.svelte-9wqi8y) .svelte-select.jse-filter-relation {\n  flex: 1.5;\n  margin-right: calc(0.5 * var(--jse-padding, 10px));\n}\ntable.jse-transform-wizard.svelte-9wqi8y tr:where(.svelte-9wqi8y) td:where(.svelte-9wqi8y) .jse-horizontal:where(.svelte-9wqi8y) .svelte-select.jse-sort-path {\n  flex: 3;\n  margin-right: calc(0.5 * var(--jse-padding, 10px));\n}\ntable.jse-transform-wizard.svelte-9wqi8y tr:where(.svelte-9wqi8y) td:where(.svelte-9wqi8y) .jse-horizontal:where(.svelte-9wqi8y) .svelte-select.jse-sort-direction {\n  flex: 1;\n}\ntable.jse-transform-wizard.svelte-9wqi8y tr:where(.svelte-9wqi8y) td:where(.svelte-9wqi8y) .jse-horizontal:where(.svelte-9wqi8y) .svelte-select.jse-projection-paths {\n  flex: 1;\n}\ntable.jse-transform-wizard.svelte-9wqi8y tr:where(.svelte-9wqi8y) td:where(.svelte-9wqi8y) .jse-horizontal:where(.svelte-9wqi8y) .svelte-select input {\n  box-sizing: border-box;\n}\ntable.jse-transform-wizard.svelte-9wqi8y tr:where(.svelte-9wqi8y) td:where(.svelte-9wqi8y) .jse-horizontal:where(.svelte-9wqi8y) .jse-filter-value:where(.svelte-9wqi8y) {\n  flex: 4;\n  padding: 4px 8px;\n  border: var(--jse-input-border, 1px solid #d8dbdf);\n  border-radius: var(--jse-input-radius, 3px);\n  outline: none;\n  background: var(--jse-input-background, var(--jse-background-color, #fff));\n  color: inherit;\n}\ntable.jse-transform-wizard.svelte-9wqi8y tr:where(.svelte-9wqi8y) td:where(.svelte-9wqi8y) .jse-horizontal:where(.svelte-9wqi8y) .jse-filter-value:where(.svelte-9wqi8y):focus {\n  border: var(--jse-input-border-focus, 1px solid var(--jse-input-border-focus, var(--jse-theme-color, #3883fa)));\n}`);var P8A=FA('<table class=\"jse-transform-wizard svelte-9wqi8y\"><tbody><tr class=\"svelte-9wqi8y\"><th class=\"svelte-9wqi8y\">Filter</th><td class=\"svelte-9wqi8y\"><div class=\"jse-horizontal svelte-9wqi8y\"><!> <!> <input class=\"jse-filter-value svelte-9wqi8y\"/></div></td></tr><tr class=\"svelte-9wqi8y\"><th class=\"svelte-9wqi8y\">Sort</th><td class=\"svelte-9wqi8y\"><div class=\"jse-horizontal svelte-9wqi8y\"><!> <!></div></td></tr><tr class=\"svelte-9wqi8y\"><th class=\"svelte-9wqi8y\">Pick</th><td class=\"svelte-9wqi8y\"><div class=\"jse-horizontal svelte-9wqi8y\"><!></div></td></tr></tbody></table>');function j8A(t,e){var A,i,n,o,a;kt(e,!1);var r=CA(void 0,!0),s=CA(void 0,!0),g=CA(void 0,!0),l=CA(void 0,!0),C=CA(void 0,!0),I=CA(void 0,!0),d=qa(\"jsoneditor:TransformWizard\"),B=N(e,\"json\",9),Q=N(e,\"queryOptions\",29,()=>({})),E=N(e,\"onChange\",9),f=[\"==\",\"!=\",\"<\",\"<=\",\">\",\">=\"].map(UA=>({value:UA,label:UA})),b=[{value:\"asc\",label:\"ascending\"},{value:\"desc\",label:\"descending\"}],R=CA((A=Q())!==null&&A!==void 0&&(A=A.filter)!==null&&A!==void 0&&A.path?W2(Q().filter.path):void 0,!0),M=CA((i=f.find(UA=>{var mA;return UA.value===((mA=Q().filter)===null||mA===void 0?void 0:mA.relation)}))!==null&&i!==void 0?i:f[0],!0),v=CA(((n=Q())===null||n===void 0||(n=n.filter)===null||n===void 0?void 0:n.value)||\"\",!0),F=CA((o=Q())!==null&&o!==void 0&&(o=o.sort)!==null&&o!==void 0&&o.path?W2(Q().sort.path):void 0,!0),G=CA((a=b.find(UA=>{var mA;return UA.value===((mA=Q().sort)===null||mA===void 0?void 0:mA.direction)}))!==null&&a!==void 0?a:b[0],!0);RA(()=>_(B()),()=>{x(r,Array.isArray(B()))}),RA(()=>(c(r),_(B())),()=>{x(s,c(r)?dR(B()):[])}),RA(()=>(c(r),_(B())),()=>{x(g,c(r)?dR(B(),!0):[])}),RA(()=>(c(s),W2),()=>{x(l,c(s).map(W2))}),RA(()=>(c(g),W2),()=>{x(C,c(g)?c(g).map(W2):[])}),RA(()=>(_(Q()),c(C),di),()=>{var UA;x(I,(UA=Q())!==null&&UA!==void 0&&(UA=UA.projection)!==null&&UA!==void 0&&UA.paths&&c(C)?Q().projection.paths.map(mA=>c(C).find(KA=>di(KA.value,mA))).filter(mA=>!!mA):void 0)}),RA(()=>c(R),()=>{var UA,mA,KA;mA=(UA=c(R))===null||UA===void 0?void 0:UA.value,di((KA=Q())===null||KA===void 0||(KA=KA.filter)===null||KA===void 0?void 0:KA.path,mA)||(d(\"changeFilterPath\",mA),Q(Sr(Q(),[\"filter\",\"path\"],mA,!0)),E()(Q()))}),RA(()=>c(M),()=>{var UA,mA,KA;mA=(UA=c(M))===null||UA===void 0?void 0:UA.value,di((KA=Q())===null||KA===void 0||(KA=KA.filter)===null||KA===void 0?void 0:KA.relation,mA)||(d(\"changeFilterRelation\",mA),Q(Sr(Q(),[\"filter\",\"relation\"],mA,!0)),E()(Q()))}),RA(()=>c(v),()=>{var UA,mA;UA=c(v),di((mA=Q())===null||mA===void 0||(mA=mA.filter)===null||mA===void 0?void 0:mA.value,UA)||(d(\"changeFilterValue\",UA),Q(Sr(Q(),[\"filter\",\"value\"],UA,!0)),E()(Q()))}),RA(()=>c(F),()=>{var UA,mA,KA;mA=(UA=c(F))===null||UA===void 0?void 0:UA.value,di((KA=Q())===null||KA===void 0||(KA=KA.sort)===null||KA===void 0?void 0:KA.path,mA)||(d(\"changeSortPath\",mA),Q(Sr(Q(),[\"sort\",\"path\"],mA,!0)),E()(Q()))}),RA(()=>c(G),()=>{var UA,mA,KA;mA=(UA=c(G))===null||UA===void 0?void 0:UA.value,di((KA=Q())===null||KA===void 0||(KA=KA.sort)===null||KA===void 0?void 0:KA.direction,mA)||(d(\"changeSortDirection\",mA),Q(Sr(Q(),[\"sort\",\"direction\"],mA,!0)),E()(Q()))}),RA(()=>c(I),()=>{(function(UA){var mA;di((mA=Q())===null||mA===void 0||(mA=mA.projection)===null||mA===void 0?void 0:mA.paths,UA)||(d(\"changeProjectionPaths\",UA),Q(Sr(Q(),[\"projection\",\"paths\"],UA,!0)),E()(Q()))})(c(I)?c(I).map(UA=>UA.value):void 0)}),mn(),$t(!0);var U=P8A(),Y=cA(U),j=cA(Y),AA=bA(cA(j)),z=cA(AA),yA=cA(z);U1(yA,{class:\"jse-filter-path\",showChevron:!0,get items(){return c(l)},get value(){return c(R)},set value(UA){x(R,UA)},$$legacy:!0});var P=bA(yA,2);U1(P,{class:\"jse-filter-relation\",showChevron:!0,clearable:!1,get items(){return f},get value(){return c(M)},set value(UA){x(M,UA)},$$legacy:!0});var nA=bA(P,2),eA=bA(j),dA=bA(cA(eA)),iA=cA(dA),aA=cA(iA);U1(aA,{class:\"jse-sort-path\",showChevron:!0,get items(){return c(l)},get value(){return c(F)},set value(UA){x(F,UA)},$$legacy:!0}),U1(bA(aA,2),{class:\"jse-sort-direction\",showChevron:!0,clearable:!1,get items(){return b},get value(){return c(G)},set value(UA){x(G,UA)},$$legacy:!0});var hA=bA(eA),JA=bA(cA(hA)),ee=cA(JA);U1(cA(ee),{class:\"jse-projection-paths\",multiple:!0,showChevron:!0,get items(){return c(C)},get value(){return c(I)},set value(UA){x(I,UA)},$$legacy:!0}),xD(nA,()=>c(v),UA=>x(v,UA)),lA(t,U),St()}Pt(`/* over all fonts, sizes, and colors */\n/* \"consolas\" for Windows, \"menlo\" for Mac with fallback to \"monaco\", 'Ubuntu Mono' for Ubuntu */\n/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */\n/* main, menu, modal */\n/* jsoneditor modal */\n/* tooltip in text mode */\n/* panels: navigation bar, gutter, search box */\n/* navigation-bar */\n/* context menu */\n/* contents: json key and values */\n/* contents: selected or hovered */\n/* contents: section of collapsed items in an array */\n/* contents: highlighting of search matches */\n/* contents: inline tags inside the JSON document */\n/* contents: table */\n/* controls in modals: inputs, buttons, and \\`a\\` */\n/* messages */\n/* svelte-select */\n/* color picker */\n.jse-select-query-language.svelte-jrd4q2 {\n  position: relative;\n  width: 32px;\n}\n.jse-select-query-language.svelte-jrd4q2 .jse-select-query-language-container:where(.svelte-jrd4q2) {\n  position: absolute;\n  top: 0;\n  right: 0;\n  display: flex;\n  flex-direction: column;\n  box-shadow: var(--jse-controls-box-shadow, 0 2px 6px 0 rgba(0, 0, 0, 0.24));\n}\n.jse-select-query-language.svelte-jrd4q2 .jse-select-query-language-container:where(.svelte-jrd4q2) .jse-query-language:where(.svelte-jrd4q2) {\n  border: none;\n  background: transparent;\n  color: inherit;\n  cursor: pointer;\n  font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen-Sans, Ubuntu, Cantarell, \"Helvetica Neue\", sans-serif);\n  font-size: var(--jse-font-size, 16px);\n  padding: 5px;\n  margin: 0;\n  text-align: left;\n  padding: var(--jse-padding, 10px) calc(2 * var(--jse-padding, 10px));\n  white-space: nowrap;\n  color: var(--jse-context-menu-color, var(--jse-text-color-inverse, #fff));\n  background: var(--jse-context-menu-background, #656565);\n}\n.jse-select-query-language.svelte-jrd4q2 .jse-select-query-language-container:where(.svelte-jrd4q2) .jse-query-language:where(.svelte-jrd4q2):hover {\n  background: var(--jse-context-menu-background-highlight, #7a7a7a);\n}`);var q8A=FA('<button type=\"button\"><!> </button>'),V8A=FA('<div class=\"jse-select-query-language svelte-jrd4q2\"><div class=\"jse-select-query-language-container svelte-jrd4q2\"></div></div>');function W8A(t,e){kt(e,!1);var A=N(e,\"queryLanguages\",8),i=N(e,\"queryLanguageId\",12),n=N(e,\"onChangeQueryLanguage\",8);$t();var o=V8A();ea(cA(o),5,A,ha,(a,r)=>{var s,g=q8A(),l=cA(g),C=B=>{Pi(B,{get data(){return rM}})},I=B=>{Pi(B,{get data(){return sM}})};YA(l,B=>{c(r),_(i()),QA(()=>c(r).id===i())?B(C):B(I,!1)});var d=bA(l);ve(()=>{var B;s=Xt(g,1,\"jse-query-language svelte-jrd4q2\",null,s,{selected:c(r).id===i()}),fn(g,\"title\",(c(r),QA(()=>\"Select \".concat(c(r).name,\" as query language\")))),xt(d,\" \".concat((c(r),(B=QA(()=>c(r).name))!==null&&B!==void 0?B:\"\")))}),ue(\"click\",g,()=>{return B=c(r).id,i(B),void n()(B);var B}),lA(a,g)}),lA(t,o),St()}Pt(`/* over all fonts, sizes, and colors */\n/* \"consolas\" for Windows, \"menlo\" for Mac with fallback to \"monaco\", 'Ubuntu Mono' for Ubuntu */\n/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */\n/* main, menu, modal */\n/* jsoneditor modal */\n/* tooltip in text mode */\n/* panels: navigation bar, gutter, search box */\n/* navigation-bar */\n/* context menu */\n/* contents: json key and values */\n/* contents: selected or hovered */\n/* contents: section of collapsed items in an array */\n/* contents: highlighting of search matches */\n/* contents: inline tags inside the JSON document */\n/* contents: table */\n/* controls in modals: inputs, buttons, and \\`a\\` */\n/* messages */\n/* svelte-select */\n/* color picker */\n.jse-header.svelte-1k211ye {\n  display: flex;\n  background: var(--jse-theme-color, #3883fa);\n  color: var(--jse-menu-color, var(--jse-text-color-inverse, #fff));\n}\n.jse-header.svelte-1k211ye .jse-title:where(.svelte-1k211ye) {\n  flex: 1;\n  padding: 5px;\n  vertical-align: middle;\n}\n.jse-header.svelte-1k211ye button:where(.svelte-1k211ye) {\n  border: none;\n  background: transparent;\n  min-width: 32px;\n  color: inherit;\n  cursor: pointer;\n}\n.jse-header.svelte-1k211ye button:where(.svelte-1k211ye):hover {\n  background: rgba(255, 255, 255, 0.1);\n}`);var Z8A=FA('<button type=\"button\" class=\"jse-fullscreen svelte-1k211ye\" title=\"Toggle full screen\"><!></button>'),X8A=FA('<div class=\"jse-header svelte-1k211ye\"><div class=\"jse-title svelte-1k211ye\"> </div> <!> <!> <button type=\"button\" class=\"jse-close svelte-1k211ye\"><!></button></div>');function zD(t,e){kt(e,!1);var A=N(e,\"title\",9,\"Modal\"),i=N(e,\"fullScreenButton\",9,!1),n=N(e,\"fullscreen\",13,!1),o=N(e,\"onClose\",9,void 0);$t(!0);var a=X8A(),r=cA(a),s=cA(r),g=bA(r,2);Aa(g,e,\"actions\",{},null);var l=bA(g,2),C=d=>{var B=Z8A(),Q=cA(B),E=et(()=>n()?iz:XO);Pi(Q,{get data(){return c(E)}}),ue(\"click\",B,()=>n(!n())),lA(d,B)};YA(l,d=>{i()&&d(C)});var I=bA(l,2);Pi(cA(I),{get data(){return q4}}),ve(()=>xt(s,A())),ue(\"click\",I,()=>{var d;return(d=o())===null||d===void 0?void 0:d()}),lA(t,a),St()}Pt(`/* over all fonts, sizes, and colors */\n/* \"consolas\" for Windows, \"menlo\" for Mac with fallback to \"monaco\", 'Ubuntu Mono' for Ubuntu */\n/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */\n/* main, menu, modal */\n/* jsoneditor modal */\n/* tooltip in text mode */\n/* panels: navigation bar, gutter, search box */\n/* navigation-bar */\n/* context menu */\n/* contents: json key and values */\n/* contents: selected or hovered */\n/* contents: section of collapsed items in an array */\n/* contents: highlighting of search matches */\n/* contents: inline tags inside the JSON document */\n/* contents: table */\n/* controls in modals: inputs, buttons, and \\`a\\` */\n/* messages */\n/* svelte-select */\n/* color picker */\n.jse-config.svelte-5gkegr {\n  border: none;\n  background: transparent;\n  min-width: 32px;\n  color: inherit;\n  cursor: pointer;\n}\n.jse-config.svelte-5gkegr:hover {\n  background: rgba(255, 255, 255, 0.1);\n}\n.jse-config.hide.svelte-5gkegr {\n  display: none;\n}`);var $8A=FA('<button slot=\"actions\" type=\"button\" title=\"Select a query language\"><!></button>'),$x=qa(\"jsoneditor:AutoScrollHandler\");function aZ(t){var e,A;function i(r){return r<20?200:r<50?400:1200}function n(){if(t){var r=.05*(e||0);t.scrollTop+=r}}function o(r){A&&r===e||(a(),$x(\"startAutoScroll\",r),e=r,A=setInterval(n,50))}function a(){A&&($x(\"stopAutoScroll\"),clearInterval(A),A=void 0,e=void 0)}return $x(\"createAutoScrollHandler\",t),{onDrag:function(r){if(t){var s=r.clientY,{top:g,bottom:l}=t.getBoundingClientRect();s<g?o(-i(g-s)):s>l?o(i(s-l)):a()}},onDragEnd:function(){a()}}}var A5A=(t,e,A,i)=>(t/=i/2)<1?A/2*t*t+e:-A/2*(--t*(t-2)-1)+e,a$=()=>{var t,e,A,i,n,o,a,r,s,g,l,C,I;function d(E){return E.getBoundingClientRect().top-(t.getBoundingClientRect?t.getBoundingClientRect().top:0)+A}function B(E){t.scrollTo?t.scrollTo(t.scrollLeft,E):t.scrollTop=E}function Q(E){g||(g=E),B(o(l=E-g,A,r,s)),I=!0,l<s?requestAnimationFrame(Q):(function(){B(A+r),e&&a&&(e.setAttribute(\"tabindex\",\"-1\"),e.focus()),typeof C==\"function\"&&C(),g=0,I=!1})()}return function(E){var f=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};switch(s=1e3,n=f.offset||0,C=f.callback,o=f.easing||A5A,a=f.a11y||!1,typeof f.container){case\"object\":t=f.container;break;case\"string\":t=document.querySelector(f.container);break;default:t=window.document.documentElement}switch(A=t.scrollTop,typeof E){case\"number\":e=void 0,a=!1,i=A+E;break;case\"object\":i=d(e=E);break;case\"string\":e=document.querySelector(E),i=d(e)}switch(r=i-A+n,typeof f.duration){case\"number\":s=f.duration;break;case\"function\":s=f.duration(r)}I?g=0:requestAnimationFrame(Q)}};function OQ(t,e){var A=Date.now(),i=t();return e(Date.now()-A),i}var KQ=qa(\"validation\"),e5A={createObjectDocumentState:()=>({type:\"object\",properties:{}}),createArrayDocumentState:()=>({type:\"array\",items:[]}),createValueDocumentState:()=>({type:\"value\"})};function rZ(t,e,A,i){return tN(t,e,A,i,e5A)}function r$(t,e,A,i){if(KQ(\"validateJSON\"),!e)return[];if(A!==i){var n=A.stringify(t);return e(n!==void 0?i.parse(n):void 0)}return e(t)}function t5A(t,e,A,i){if(KQ(\"validateText\"),t.length>104857600)return{validationErrors:[{path:[],message:\"Validation turned off: the document is too large\",severity:ic.info}]};if(t.length!==0)try{var n=OQ(()=>A.parse(t),s=>KQ(\"validate: parsed json in \".concat(s,\" ms\")));if(!e)return;var o=A===i?n:OQ(()=>i.parse(t),s=>KQ(\"validate: parsed json with the validationParser in \".concat(s,\" ms\"))),a=OQ(()=>e(o),s=>KQ(\"validate: validated json in \".concat(s,\" ms\")));return zi(a)?void 0:{validationErrors:a}}catch(s){var r=OQ(()=>(function(g,l){if(g.length>R6A)return!1;try{return l.parse(jg(g)),!0}catch(C){return!1}})(t,A),g=>KQ(\"validate: checked whether repairable in \".concat(g,\" ms\")));return{parseError:nE(t,s.message||s.toString()),isRepairable:r}}}var ID=qa(\"jsoneditor:FocusTracker\");function sN(t){var e,{onMount:A,onDestroy:i,getWindow:n,hasFocus:o,onFocus:a,onBlur:r}=t,s=!1;function g(){var C=o();C&&(clearTimeout(e),s||(ID(\"focus\"),a(),s=C))}function l(){s&&(clearTimeout(e),e=setTimeout(()=>{o()||(ID(\"blur\"),s=!1,r())}))}A(()=>{ID(\"mount FocusTracker\");var C=n();C&&(C.addEventListener(\"focusin\",g,!0),C.addEventListener(\"focusout\",l,!0))}),i(()=>{ID(\"destroy FocusTracker\");var C=n();C&&(C.removeEventListener(\"focusin\",g,!0),C.removeEventListener(\"focusout\",l,!0))})}Pt(`/* over all fonts, sizes, and colors */\n/* \"consolas\" for Windows, \"menlo\" for Mac with fallback to \"monaco\", 'Ubuntu Mono' for Ubuntu */\n/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */\n/* main, menu, modal */\n/* jsoneditor modal */\n/* tooltip in text mode */\n/* panels: navigation bar, gutter, search box */\n/* navigation-bar */\n/* context menu */\n/* contents: json key and values */\n/* contents: selected or hovered */\n/* contents: section of collapsed items in an array */\n/* contents: highlighting of search matches */\n/* contents: inline tags inside the JSON document */\n/* contents: table */\n/* controls in modals: inputs, buttons, and \\`a\\` */\n/* messages */\n/* svelte-select */\n/* color picker */\n.jse-message.svelte-cbvd26 {\n  font-family: var(--jse-font-family-mono, consolas, menlo, monaco, \"Ubuntu Mono\", \"source-code-pro\", monospace);\n  font-size: var(--jse-font-size-mono, 14px);\n  padding: var(--jse-padding, 10px);\n  display: flex;\n  gap: var(--jse-padding, 10px);\n  flex-wrap: wrap;\n  align-items: stretch;\n}\n.jse-message.jse-success.svelte-cbvd26 {\n  background: var(--message-success-background, #9ac45d);\n  color: var(--jse-message-success-color, #fff);\n}\n.jse-message.svelte-cbvd26 .jse-text:where(.svelte-cbvd26) {\n  display: flex;\n  flex: 1;\n  min-width: 60%;\n  align-items: center;\n}\n.jse-message.svelte-cbvd26 .jse-text.jse-clickable:where(.svelte-cbvd26) {\n  cursor: pointer;\n}\n.jse-message.svelte-cbvd26 .jse-text.jse-clickable:where(.svelte-cbvd26):hover {\n  background-color: rgba(255, 255, 255, 0.1);\n}\n.jse-message.jse-error.svelte-cbvd26 {\n  background: var(--jse-message-error-background, var(--jse-error-color, #ee5341));\n  color: var(--jse-message-error-color, #fff);\n}\n.jse-message.jse-warning.svelte-cbvd26 {\n  background: var(--jse-message-warning-background, #ffde5c);\n  color: var(--jse-message-warning-color, #4d4d4d);\n}\n.jse-message.jse-info.svelte-cbvd26 {\n  background: var(--jse-message-info-background, #4f91ff);\n  color: var(--jse-message-info-color, #fff);\n}\n.jse-message.svelte-cbvd26 .jse-actions:where(.svelte-cbvd26) {\n  display: flex;\n  gap: var(--jse-padding, 10px);\n}\n.jse-message.svelte-cbvd26 .jse-actions:where(.svelte-cbvd26) button.jse-action:where(.svelte-cbvd26) {\n  border: none;\n  background: transparent;\n  color: inherit;\n  cursor: pointer;\n  font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen-Sans, Ubuntu, Cantarell, \"Helvetica Neue\", sans-serif);\n  font-size: var(--jse-font-size, 16px);\n  padding: 5px;\n  margin: 0;\n  background: var(--jse-message-action-background, rgba(255, 255, 255, 0.2));\n  color: inherit;\n  padding: calc(0.5 * var(--jse-padding, 10px)) var(--jse-padding, 10px);\n}\n.jse-message.svelte-cbvd26 .jse-actions:where(.svelte-cbvd26) button.jse-action:where(.svelte-cbvd26):hover {\n  background: var(--jse-message-action-background-highlight, rgba(255, 255, 255, 0.3));\n}`);var i5A=FA('<button type=\"button\" class=\"jse-button jse-action jse-primary svelte-cbvd26\"><!> </button>'),n5A=FA('<div><div role=\"button\" tabindex=\"-1\"><div class=\"jse-text-centered\"><!> </div></div> <div class=\"jse-actions svelte-cbvd26\"></div></div>');function Mg(t,e){kt(e,!1);var A=N(e,\"type\",9,\"success\"),i=N(e,\"icon\",9,void 0),n=N(e,\"message\",9,void 0),o=N(e,\"actions\",25,()=>[]),a=N(e,\"onClick\",9,void 0),r=N(e,\"onClose\",9,void 0);r()&&cl(r()),$t(!0);var s,g=n5A(),l=cA(g),C=cA(l),I=cA(C),d=Q=>{Pi(Q,{get data(){return i()}})};YA(I,Q=>{i()&&Q(d)});var B=bA(I);ea(bA(l,2),5,o,ha,(Q,E)=>{var f=i5A(),b=cA(f),R=v=>{Pi(v,{get data(){return c(E),QA(()=>c(E).icon)}})};YA(b,v=>{c(E),QA(()=>c(E).icon)&&v(R)});var M=bA(b);ve(()=>{var v;fn(f,\"title\",(c(E),QA(()=>c(E).title))),f.disabled=(c(E),QA(()=>c(E).disabled)),xt(M,\" \".concat((c(E),(v=QA(()=>c(E).text))!==null&&v!==void 0?v:\"\")))}),ue(\"click\",f,()=>{c(E).onClick&&c(E).onClick()}),ue(\"mousedown\",f,()=>{c(E).onMouseDown&&c(E).onMouseDown()}),lA(Q,f)}),ve(()=>{var Q,E;Xt(g,1,\"jse-message jse-\".concat((Q=A())!==null&&Q!==void 0?Q:\"\"),\"svelte-cbvd26\"),s=Xt(l,1,\"jse-text svelte-cbvd26\",null,s,{\"jse-clickable\":!!a()}),xt(B,\" \".concat((E=n())!==null&&E!==void 0?E:\"\"))}),ue(\"click\",l,function(){a()&&a()()}),lA(t,g),St()}Pt(`/* over all fonts, sizes, and colors */\n/* \"consolas\" for Windows, \"menlo\" for Mac with fallback to \"monaco\", 'Ubuntu Mono' for Ubuntu */\n/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */\n/* main, menu, modal */\n/* jsoneditor modal */\n/* tooltip in text mode */\n/* panels: navigation bar, gutter, search box */\n/* navigation-bar */\n/* context menu */\n/* contents: json key and values */\n/* contents: selected or hovered */\n/* contents: section of collapsed items in an array */\n/* contents: highlighting of search matches */\n/* contents: inline tags inside the JSON document */\n/* contents: table */\n/* controls in modals: inputs, buttons, and \\`a\\` */\n/* messages */\n/* svelte-select */\n/* color picker */\n.jse-validation-errors-overview.svelte-1342rh4 {\n  font-family: var(--jse-font-family-mono, consolas, menlo, monaco, \"Ubuntu Mono\", \"source-code-pro\", monospace);\n  font-size: var(--jse-font-size-mono, 14px);\n  overflow: auto;\n  max-height: 25%;\n}\n.jse-validation-errors-overview.svelte-1342rh4 table:where(.svelte-1342rh4) {\n  border-collapse: collapse;\n  width: 100%;\n}\n.jse-validation-errors-overview.svelte-1342rh4 table:where(.svelte-1342rh4) tr:where(.svelte-1342rh4) {\n  cursor: pointer;\n}\n.jse-validation-errors-overview.svelte-1342rh4 table:where(.svelte-1342rh4) tr.jse-validation-error:where(.svelte-1342rh4) {\n  background: var(--jse-message-error-background, var(--jse-error-color, #ee5341));\n  color: var(--jse-message-error-color, #fff);\n}\n.jse-validation-errors-overview.svelte-1342rh4 table:where(.svelte-1342rh4) tr.jse-validation-warning:where(.svelte-1342rh4) {\n  background: var(--jse-message-warning-background, #ffde5c);\n  color: var(--jse-message-warning-color, #4d4d4d);\n}\n.jse-validation-errors-overview.svelte-1342rh4 table:where(.svelte-1342rh4) tr.jse-validation-warning:where(.svelte-1342rh4):hover {\n  filter: brightness(105%);\n}\n.jse-validation-errors-overview.svelte-1342rh4 table:where(.svelte-1342rh4) tr.jse-validation-info:where(.svelte-1342rh4) {\n  background: var(--jse-message-info-background, #4f91ff);\n  color: var(--jse-message-info-color, #fff);\n}\n.jse-validation-errors-overview.svelte-1342rh4 table:where(.svelte-1342rh4) tr:where(.svelte-1342rh4):hover {\n  filter: brightness(110%);\n}\n.jse-validation-errors-overview.svelte-1342rh4 table:where(.svelte-1342rh4) tr:where(.svelte-1342rh4) td:where(.svelte-1342rh4) {\n  padding: 4px var(--jse-padding, 10px);\n  vertical-align: middle;\n}\n.jse-validation-errors-overview.svelte-1342rh4 table:where(.svelte-1342rh4) tr:where(.svelte-1342rh4) td.jse-validation-error-icon:where(.svelte-1342rh4) {\n  width: 36px;\n  box-sizing: border-box;\n}\n.jse-validation-errors-overview.svelte-1342rh4 table:where(.svelte-1342rh4) tr:where(.svelte-1342rh4) td.jse-validation-error-action:where(.svelte-1342rh4) {\n  width: 36px;\n  box-sizing: border-box;\n  padding: 0;\n}\n.jse-validation-errors-overview.svelte-1342rh4 table:where(.svelte-1342rh4) tr:where(.svelte-1342rh4) td.jse-validation-error-action:where(.svelte-1342rh4) button.jse-validation-errors-collapse:where(.svelte-1342rh4) {\n  border: none;\n  background: transparent;\n  color: inherit;\n  cursor: pointer;\n  font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen-Sans, Ubuntu, Cantarell, \"Helvetica Neue\", sans-serif);\n  font-size: var(--jse-font-size, 16px);\n  padding: 5px;\n  margin: 0;\n  width: 36px;\n  height: 26px;\n  cursor: pointer;\n}\n.jse-validation-errors-overview.svelte-1342rh4 table:where(.svelte-1342rh4) tr:where(.svelte-1342rh4) td.jse-validation-error-action:where(.svelte-1342rh4) button.jse-validation-errors-collapse:where(.svelte-1342rh4):hover {\n  background-color: rgba(255, 255, 255, 0.2);\n}\n.jse-validation-errors-overview.svelte-1342rh4 table:where(.svelte-1342rh4) tr:where(.svelte-1342rh4) td:where(.svelte-1342rh4) div.jse-validation-errors-expand:where(.svelte-1342rh4) {\n  display: inline-block;\n  position: relative;\n  top: 3px;\n}`);var o5A=FA('<button type=\"button\" class=\"jse-validation-errors-collapse svelte-1342rh4\" title=\"Collapse validation errors\"><!></button>'),a5A=FA('<tr tabindex=\"0\"><td class=\"jse-validation-error-icon svelte-1342rh4\"><!></td><td class=\"jse-validation-error-path svelte-1342rh4\"> </td><td class=\"jse-validation-error-message svelte-1342rh4\"> </td><td class=\"jse-validation-error-action svelte-1342rh4\"><!></td></tr>'),r5A=FA('<tr class=\"jse-validation-error svelte-1342rh4\"><td class=\"svelte-1342rh4\"></td><td class=\"svelte-1342rh4\"></td><td class=\"svelte-1342rh4\"> </td><td class=\"svelte-1342rh4\"></td></tr>'),s5A=FA('<table class=\"jse-validation-errors-overview-expanded svelte-1342rh4\"><tbody><!><!></tbody></table>'),g5A=FA('<table class=\"jse-validation-errors-overview-collapsed svelte-1342rh4\"><tbody><tr><td class=\"jse-validation-error-icon svelte-1342rh4\"><!></td><td class=\"jse-validation-error-count svelte-1342rh4\"> <div class=\"jse-validation-errors-expand svelte-1342rh4\"><!></div></td></tr></tbody></table>'),l5A=FA('<div class=\"jse-validation-errors-overview svelte-1342rh4\"><!></div>');function gN(t,e){kt(e,!1);var A=CA(void 0,!0),i=N(e,\"validationErrors\",9),n=N(e,\"selectError\",9),o=CA(!0,!0);function a(){x(o,!1)}function r(){x(o,!0)}RA(()=>_(i()),()=>{x(A,i().length)}),mn(),$t(!0);var s=yi(),g=$e(s),l=C=>{var I=l5A(),d=cA(I),B=E=>{var f=s5A(),b=cA(f),R=cA(b);ea(R,1,()=>(_(RD),_(i()),_(rD),QA(()=>RD(i(),rD))),ha,(F,G,U)=>{var Y=a5A(),j=cA(Y);Pi(cA(j),{get data(){return v2}});var AA=bA(j),z=cA(AA),yA=bA(AA),P=cA(yA),nA=cA(bA(yA)),eA=dA=>{var iA=o5A();Pi(cA(iA),{get data(){return tz}}),ue(\"click\",iA,aC(a)),lA(dA,iA)};YA(nA,dA=>{_(i()),QA(()=>U===0&&i().length>1)&&dA(eA)}),ve(dA=>{var iA;Xt(Y,1,\"jse-validation-\".concat((c(G),(iA=QA(()=>c(G).severity))!==null&&iA!==void 0?iA:\"\")),\"svelte-1342rh4\"),xt(z,dA),xt(P,(c(G),QA(()=>c(G).message)))},[()=>(_($s),c(G),QA(()=>$s(c(G).path)))]),ue(\"click\",Y,()=>{setTimeout(()=>n()(c(G)))}),lA(F,Y)});var M=bA(R),v=F=>{var G=r5A(),U=bA(cA(G),2),Y=cA(U);ve(()=>xt(Y,\"(and \".concat(c(A)-rD,\" more errors)\"))),lA(F,G)};YA(M,F=>{c(A)>rD&&F(v)}),lA(E,f)},Q=E=>{var f=g5A(),b=cA(f),R=cA(b),M=cA(R);Pi(cA(M),{get data(){return v2}});var v=cA(bA(M));Pi(cA(bA(v)),{get data(){return IM}}),ve(F=>{var G;Xt(R,1,\"jse-validation-\".concat(F??\"\"),\"svelte-1342rh4\"),xt(v,\"\".concat((G=c(A))!==null&&G!==void 0?G:\"\",\" validation errors \"))},[()=>(_(i()),QA(()=>{return F=i(),[ic.error,ic.warning,ic.info].find(G=>F.some(U=>U.severity===G));var F}))]),ue(\"click\",R,r),lA(E,f)};YA(d,E=>{c(o)||c(A)===1?E(B):E(Q,!1)}),lA(C,I)};YA(g,C=>{_(zi),_(i()),QA(()=>!zi(i()))&&C(l)}),lA(t,s),St()}function PD(t,e){if(t)return t.addEventListener(\"keydown\",A),{destroy(){t.removeEventListener(\"keydown\",A)}};function A(i){i.key===\"Escape\"&&(i.preventDefault(),i.stopPropagation(),e())}}Pt(`/* over all fonts, sizes, and colors */\n/* \"consolas\" for Windows, \"menlo\" for Mac with fallback to \"monaco\", 'Ubuntu Mono' for Ubuntu */\n/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */\n/* main, menu, modal */\n/* jsoneditor modal */\n/* tooltip in text mode */\n/* panels: navigation bar, gutter, search box */\n/* navigation-bar */\n/* context menu */\n/* contents: json key and values */\n/* contents: selected or hovered */\n/* contents: section of collapsed items in an array */\n/* contents: highlighting of search matches */\n/* contents: inline tags inside the JSON document */\n/* contents: table */\n/* controls in modals: inputs, buttons, and \\`a\\` */\n/* messages */\n/* svelte-select */\n/* color picker */\ndialog.jse-modal.svelte-2aoco4 {\n  border-radius: 3px;\n  font-size: var(--jse-padding, 10px);\n  border: none;\n  padding: 0;\n  display: flex;\n  min-width: 0;\n  margin: auto;\n  overflow: visible;\n  transition: width 0.1s ease-in-out, height 0.1s ease-in-out;\n}\ndialog.jse-modal.jse-sort-modal.svelte-2aoco4 {\n  width: 400px;\n}\ndialog.jse-modal.jse-repair-modal.svelte-2aoco4 {\n  width: 600px;\n  height: 500px;\n}\ndialog.jse-modal.jse-jsoneditor-modal.svelte-2aoco4 {\n  width: 800px;\n  height: 600px;\n}\ndialog.jse-modal.jse-transform-modal.svelte-2aoco4 {\n  width: 1200px;\n  height: 800px;\n}\ndialog.jse-modal.jse-fullscreen.svelte-2aoco4 {\n  width: 100%;\n  height: 100%;\n}\ndialog.jse-modal.svelte-2aoco4::backdrop {\n  background: var(--jse-overlay-background, rgba(0, 0, 0, 0.3));\n}\ndialog.jse-modal[open].svelte-2aoco4 {\n  animation: svelte-2aoco4-zoom 0.3s cubic-bezier(0.34, 1.56, 0.64, 1);\n}\ndialog.jse-modal[open].svelte-2aoco4::backdrop {\n  animation: svelte-2aoco4-fade 0.2s ease-out;\n}\ndialog.jse-modal.svelte-2aoco4 .jse-modal-inner:where(.svelte-2aoco4) {\n  flex: 1;\n  display: flex;\n  flex-direction: column;\n  min-width: 0;\n  min-height: 0;\n  padding: 0;\n  font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen-Sans, Ubuntu, Cantarell, \"Helvetica Neue\", sans-serif);\n  font-size: var(--jse-font-size, 16px);\n  line-height: normal;\n  background: var(--jse-modal-background, #f5f5f5);\n  color: var(--jse-text-color, #4d4d4d);\n}\n@keyframes svelte-2aoco4-zoom {\n  from {\n    transform: scale(0.95);\n  }\n  to {\n    transform: scale(1);\n  }\n}\n@keyframes svelte-2aoco4-fade {\n  from {\n    opacity: 0;\n  }\n  to {\n    opacity: 1;\n  }\n}\ndialog.jse-modal.svelte-2aoco4 .svelte-select {\n  --border: var(--jse-svelte-select-border, 1px solid #d8dbdf);\n  --item-is-active-bg: var(--jse-item-is-active-bg, #3883fa);\n  --border-radius: var(--jse-svelte-select-border-radius, 3px);\n  --background: var(--jse-svelte-select-background, #fff);\n  --padding: var(--jse-svelte-select-padding, 0 10px);\n  --multi-select-padding: var(--jse-svelte-select-multi-select-padding, 0 10px);\n  --font-size: var(--jse-svelte-select-font-size, var(--jse-font-size, 16px));\n  --height: 36px;\n  --multi-item-height: 28px;\n  --multi-item-margin: 2px;\n  --multi-item-padding: 2px 8px;\n  --multi-item-border-radius: 6px;\n  --indicator-top: 8px;\n}`);var c5A=FA('<dialog><div class=\"jse-modal-inner svelte-2aoco4\"><!></div></dialog>');function cu(t,e){kt(e,!1);var A=N(e,\"className\",8,void 0),i=N(e,\"fullscreen\",8,!1),n=N(e,\"onClose\",8),o=CA();function a(){n()()}Jr(()=>c(o).showModal()),cl(()=>c(o).close()),$t();var r,s=c5A(),g=cA(s);Aa(cA(g),e,\"default\",{},null),Mo(s,l=>x(o,l),()=>c(o)),Er(()=>ue(\"close\",s,a)),Er(()=>{return ue(\"pointerdown\",s,(l=a,function(){for(var C=arguments.length,I=new Array(C),d=0;d<C;d++)I[d]=arguments[d];I[0].target===this&&l?.apply(this,I)}));var l}),Er(()=>ue(\"cancel\",s,z2(function(l){q3.call(this,e,l)}))),as(s,(l,C)=>PD?.(l,C),()=>a),ve(l=>r=Xt(s,1,l,\"svelte-2aoco4\",r,{\"jse-fullscreen\":i()}),[()=>sI((_(gc),_(A()),QA(()=>gc(\"jse-modal\",A()))))]),lA(t,s),St()}Pt(`/* over all fonts, sizes, and colors */\n/* \"consolas\" for Windows, \"menlo\" for Mac with fallback to \"monaco\", 'Ubuntu Mono' for Ubuntu */\n/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */\n/* main, menu, modal */\n/* jsoneditor modal */\n/* tooltip in text mode */\n/* panels: navigation bar, gutter, search box */\n/* navigation-bar */\n/* context menu */\n/* contents: json key and values */\n/* contents: selected or hovered */\n/* contents: section of collapsed items in an array */\n/* contents: highlighting of search matches */\n/* contents: inline tags inside the JSON document */\n/* contents: table */\n/* controls in modals: inputs, buttons, and \\`a\\` */\n/* messages */\n/* svelte-select */\n/* color picker */\n.jse-modal-contents.svelte-10a6ob6 {\n  flex: 1;\n  display: flex;\n  flex-direction: column;\n  padding: 20px;\n  overflow: auto;\n  min-width: 0;\n  min-height: 0;\n}\n.jse-modal-contents.svelte-10a6ob6 .jse-actions:where(.svelte-10a6ob6) {\n  display: flex;\n  flex-direction: row;\n  justify-content: flex-end;\n  padding-top: var(--jse-padding, 10px);\n}\n.jse-modal-contents.svelte-10a6ob6 .jse-actions:where(.svelte-10a6ob6) button.jse-primary:where(.svelte-10a6ob6) {\n  border: none;\n  background: transparent;\n  color: inherit;\n  cursor: pointer;\n  font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen-Sans, Ubuntu, Cantarell, \"Helvetica Neue\", sans-serif);\n  font-size: var(--jse-font-size, 16px);\n  padding: 5px;\n  margin: 0;\n  background: var(--jse-button-primary-background, var(--jse-theme-color, #3883fa));\n  color: var(--jse-button-primary-color, #fff);\n  padding: var(--jse-padding, 10px) calc(2 * var(--jse-padding, 10px));\n  border-radius: 3px;\n}\n.jse-modal-contents.svelte-10a6ob6 .jse-actions:where(.svelte-10a6ob6) button.jse-primary:where(.svelte-10a6ob6):hover {\n  background: var(--jse-button-primary-background-highlight, var(--jse-theme-color-highlight, #5f9dff));\n}\n.jse-modal-contents.svelte-10a6ob6 .jse-actions:where(.svelte-10a6ob6) button.jse-primary:where(.svelte-10a6ob6):disabled {\n  background: var(--jse-button-primary-background-disabled, #9d9d9d);\n}\n\n.jse-shortcuts.svelte-10a6ob6 {\n  display: flex;\n  flex-wrap: wrap;\n  justify-content: space-around;\n  margin: calc(2 * var(--jse-padding, 10px)) 0;\n}\n.jse-shortcuts.svelte-10a6ob6 .jse-shortcut:where(.svelte-10a6ob6) .jse-key:where(.svelte-10a6ob6) {\n  font-size: 200%;\n  color: var(--jse-theme-color, #3883fa);\n}`);var C5A=FA('<!> <div class=\"jse-modal-contents svelte-10a6ob6\"><div>Clipboard permission is disabled by your browser. You can use:</div> <div class=\"jse-shortcuts svelte-10a6ob6\"><div class=\"jse-shortcut svelte-10a6ob6\"><div class=\"jse-key svelte-10a6ob6\"> </div> for copy</div> <div class=\"jse-shortcut svelte-10a6ob6\"><div class=\"jse-key svelte-10a6ob6\"> </div> for cut</div> <div class=\"jse-shortcut svelte-10a6ob6\"><div class=\"jse-key svelte-10a6ob6\"> </div> for paste</div></div> <div class=\"jse-actions svelte-10a6ob6\"><button type=\"button\" class=\"jse-primary svelte-10a6ob6\">Close</button></div></div>',1);function s$(t,e){kt(e,!1);var A=N(e,\"onClose\",9),i=qR()?\"\\u2318\":\"Ctrl\";$t(!0),cu(t,{get onClose(){return A()},className:\"jse-copy-paste\",children:(n,o)=>{var a=C5A(),r=$e(a);zD(r,{title:\"Copying and pasting\",get onClose(){return A()}});var s=bA(r,2),g=bA(cA(s),2),l=cA(g),C=cA(l),I=cA(C),d=bA(l,2),B=cA(d),Q=cA(B),E=cA(bA(d,2)),f=cA(E),b=cA(bA(g,2));ve(()=>{xt(I,\"\".concat(i,\"+C\")),xt(Q,\"\".concat(i,\"+X\")),xt(f,\"\".concat(i,\"+V\"))}),ue(\"click\",b,function(){for(var R,M=arguments.length,v=new Array(M),F=0;F<M;F++)v[F]=arguments[F];(R=A())===null||R===void 0||R.apply(this,v)}),lA(n,a)},$$slots:{default:!0}}),St()}Pt(`/* over all fonts, sizes, and colors */\n/* \"consolas\" for Windows, \"menlo\" for Mac with fallback to \"monaco\", 'Ubuntu Mono' for Ubuntu */\n/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */\n/* main, menu, modal */\n/* jsoneditor modal */\n/* tooltip in text mode */\n/* panels: navigation bar, gutter, search box */\n/* navigation-bar */\n/* context menu */\n/* contents: json key and values */\n/* contents: selected or hovered */\n/* contents: section of collapsed items in an array */\n/* contents: highlighting of search matches */\n/* contents: inline tags inside the JSON document */\n/* contents: table */\n/* controls in modals: inputs, buttons, and \\`a\\` */\n/* messages */\n/* svelte-select */\n/* color picker */\n.jse-menu.svelte-3erbu0 {\n  background: var(--jse-theme-color, #3883fa);\n  font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen-Sans, Ubuntu, Cantarell, \"Helvetica Neue\", sans-serif);\n  font-size: var(--jse-font-size-main-menu, 14px);\n  color: var(--jse-menu-color, var(--jse-text-color-inverse, #fff));\n  display: flex;\n  flex-wrap: wrap;\n  align-items: stretch;\n  position: relative;\n}\n.jse-menu.svelte-3erbu0 .jse-button:where(.svelte-3erbu0) {\n  font-family: inherit;\n  font-size: inherit;\n  line-height: 1.5em;\n  border: none;\n  background: transparent;\n  color: inherit;\n  cursor: pointer;\n  width: var(--jse-menu-button-size, 32px);\n  height: var(--jse-menu-button-size, 32px);\n  padding: calc(0.5 * var(--jse-padding, 10px));\n  margin: 0;\n  border-radius: 0;\n  display: inline-flex;\n  align-items: center;\n  text-align: center;\n  justify-content: center;\n}\n.jse-menu.svelte-3erbu0 .jse-button:where(.svelte-3erbu0):hover, .jse-menu.svelte-3erbu0 .jse-button:where(.svelte-3erbu0):focus {\n  background: var(--jse-theme-color-highlight, #5f9dff);\n}\n.jse-menu.svelte-3erbu0 .jse-button:where(.svelte-3erbu0):disabled {\n  color: var(--jse-menu-color, var(--jse-text-color-inverse, #fff));\n  opacity: 0.5;\n  background: transparent;\n}\n.jse-menu.svelte-3erbu0 .jse-button.jse-group-button:where(.svelte-3erbu0) {\n  width: auto;\n  height: calc(var(--jse-menu-button-size, 32px) - var(--jse-padding, 10px));\n  margin: calc(0.5 * var(--jse-padding, 10px)) 0;\n  padding: 0 calc(0.5 * var(--jse-padding, 10px)) 1px;\n  border: 1px solid var(--jse-menu-color, var(--jse-text-color-inverse, #fff));\n}\n.jse-menu.svelte-3erbu0 .jse-button.jse-group-button:where(.svelte-3erbu0):not(.jse-last) {\n  border-right: none;\n}\n.jse-menu.svelte-3erbu0 .jse-button.jse-group-button.jse-first:where(.svelte-3erbu0) {\n  margin-left: calc(0.5 * var(--jse-padding, 10px));\n}\n.jse-menu.svelte-3erbu0 .jse-button.jse-group-button.jse-last:where(.svelte-3erbu0) {\n  margin-right: calc(0.5 * var(--jse-padding, 10px));\n}\n.jse-menu.svelte-3erbu0 .jse-button.jse-group-button:where(.svelte-3erbu0):hover, .jse-menu.svelte-3erbu0 .jse-button.jse-group-button:where(.svelte-3erbu0):focus {\n  background: var(--jse-theme-color-highlight, #5f9dff);\n}\n.jse-menu.svelte-3erbu0 .jse-button.jse-group-button.jse-selected:where(.svelte-3erbu0) {\n  background: var(--jse-menu-color, var(--jse-text-color-inverse, #fff));\n  color: var(--jse-theme-color, #3883fa);\n}\n.jse-menu.svelte-3erbu0 .jse-space:where(.svelte-3erbu0) {\n  flex: 1;\n}\n.jse-menu.svelte-3erbu0 .jse-separator:where(.svelte-3erbu0) {\n  background: var(--jse-menu-color, var(--jse-text-color-inverse, #fff));\n  opacity: 0.3;\n  width: 1px;\n  margin: 3px;\n}`);var I5A=FA('<div class=\"jse-separator svelte-3erbu0\"></div>'),d5A=FA('<div class=\"jse-space svelte-3erbu0\"></div>'),B5A=FA('<button type=\"button\"><!> <!></button>'),Q5A=FA('<div class=\"jse-menu svelte-3erbu0\"><!> <!> <!></div>');function aw(t,e){kt(e,!1);var A=N(e,\"items\",25,()=>[]);$t(!0);var i=Q5A(),n=cA(i);Aa(n,e,\"left\",{},null);var o=bA(n,2);ea(o,1,A,ha,(a,r)=>{var s=yi(),g=$e(s),l=I=>{lA(I,I5A())},C=I=>{var d=yi(),B=$e(d),Q=f=>{lA(f,d5A())},E=f=>{var b=yi(),R=$e(b),M=F=>{var G=B5A(),U=cA(G),Y=z=>{Pi(z,{get data(){return c(r),QA(()=>c(r).icon)}})};YA(U,z=>{c(r),QA(()=>c(r).icon)&&z(Y)});var j=bA(U,2),AA=z=>{var yA=tr();ve(()=>xt(yA,(c(r),QA(()=>c(r).text)))),lA(z,yA)};YA(j,z=>{c(r),QA(()=>c(r).text)&&z(AA)}),ve(()=>{var z;Xt(G,1,\"jse-button \".concat((c(r),(z=QA(()=>c(r).className))!==null&&z!==void 0?z:\"\")),\"svelte-3erbu0\"),fn(G,\"title\",(c(r),QA(()=>c(r).title))),G.disabled=(c(r),QA(()=>c(r).disabled||!1))}),ue(\"click\",G,function(){for(var z,yA=arguments.length,P=new Array(yA),nA=0;nA<yA;nA++)P[nA]=arguments[nA];(z=c(r).onClick)===null||z===void 0||z.apply(this,P)}),lA(F,G)},v=F=>{var G=tr();ve(U=>xt(G,U),[()=>(c(r),QA(()=>(function(U){return console.error(\"Unknown type of menu item\",U),\"???\"})(c(r))))]),lA(F,G)};YA(R,F=>{_(rC),c(r),QA(()=>rC(c(r)))?F(M):F(v,!1)},!0),lA(f,b)};YA(B,f=>{_(hR),c(r),QA(()=>hR(c(r)))?f(Q):f(E,!1)},!0),lA(I,d)};YA(g,I=>{_(V2),c(r),QA(()=>V2(c(r)))?I(l):I(C,!1)}),lA(a,s)}),Aa(bA(o,2),e,\"right\",{},null),lA(t,i),St()}Pt(`/* over all fonts, sizes, and colors */\n/* \"consolas\" for Windows, \"menlo\" for Mac with fallback to \"monaco\", 'Ubuntu Mono' for Ubuntu */\n/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */\n/* main, menu, modal */\n/* jsoneditor modal */\n/* tooltip in text mode */\n/* panels: navigation bar, gutter, search box */\n/* navigation-bar */\n/* context menu */\n/* contents: json key and values */\n/* contents: selected or hovered */\n/* contents: section of collapsed items in an array */\n/* contents: highlighting of search matches */\n/* contents: inline tags inside the JSON document */\n/* contents: table */\n/* controls in modals: inputs, buttons, and \\`a\\` */\n/* messages */\n/* svelte-select */\n/* color picker */\n.jse-json-repair-component.svelte-16jv58j {\n  flex: 1;\n  display: flex;\n  flex-direction: column;\n  background: var(--jse-background-color, #fff);\n  color: var(--jse-text-color, #4d4d4d);\n}\n.jse-json-repair-component.svelte-16jv58j .jse-info:where(.svelte-16jv58j) {\n  padding: calc(0.5 * var(--jse-padding, 10px));\n  font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen-Sans, Ubuntu, Cantarell, \"Helvetica Neue\", sans-serif);\n  font-size: var(--jse-font-size, 16px);\n  vertical-align: center;\n}\n.jse-json-repair-component.svelte-16jv58j .jse-json-text:where(.svelte-16jv58j) {\n  flex: 1;\n  border: none;\n  padding: 2px;\n  font-family: var(--jse-font-family-mono, consolas, menlo, monaco, \"Ubuntu Mono\", \"source-code-pro\", monospace);\n  font-size: var(--jse-font-size-mono, 14px);\n  background: var(--jse-input-background, var(--jse-background-color, #fff));\n  color: var(--jse-text-color, #4d4d4d);\n  resize: none;\n  outline: none;\n}`);var E5A=FA('<div slot=\"left\" class=\"jse-info svelte-16jv58j\">Repair invalid JSON, then click apply</div>'),h5A=FA('<div class=\"jse-json-repair-component svelte-16jv58j\"><!> <!> <textarea class=\"jse-json-text svelte-16jv58j\" autocomplete=\"off\" autocapitalize=\"off\" spellcheck=\"false\"></textarea></div>');function u5A(t,e){kt(e,!1);var A=CA(void 0,!0),i=CA(void 0,!0),n=CA(void 0,!0),o=CA(void 0,!0),a=CA(void 0,!0),r=CA(void 0,!0),s=N(e,\"text\",13,\"\"),g=N(e,\"readOnly\",9,!1),l=N(e,\"onParse\",9),C=N(e,\"onRepair\",9),I=N(e,\"onChange\",9,void 0),d=N(e,\"onApply\",9),B=N(e,\"onCancel\",9),Q=qa(\"jsoneditor:JSONRepair\"),E=CA(void 0,!0);function f(){if(c(E)&&c(A)){var AA=c(A).position!==void 0?c(A).position:0;c(E).setSelectionRange(AA,AA),c(E).focus()}}function b(){d()(s())}function R(){try{s(C()(s())),I()&&I()(s())}catch(AA){}}var M=CA(void 0,!0);RA(()=>_(s()),()=>{x(A,(function(AA){try{return void l()(AA)}catch(z){return nE(AA,z.message)}})(s()))}),RA(()=>_(s()),()=>{x(i,(function(AA){try{return C()(AA),!0}catch(z){return!1}})(s()))}),RA(()=>c(A),()=>{Q(\"error\",c(A))}),RA(()=>_(B()),()=>{x(M,[{type:\"space\"},{type:\"button\",icon:q4,title:\"Cancel repair\",className:\"jse-cancel\",onClick:B()}])}),RA(()=>QM,()=>{x(n,{icon:QM,text:\"Show me\",title:\"Scroll to the error location\",onClick:f})}),RA(()=>P0,()=>{x(o,{icon:P0,text:\"Auto repair\",title:\"Automatically repair JSON\",onClick:R})}),RA(()=>(c(i),c(n),c(o)),()=>{x(a,c(i)?[c(n),c(o)]:[c(n)])}),RA(()=>_(g()),()=>{x(r,[{icon:g8,text:\"Apply\",title:\"Apply fixed JSON\",disabled:g(),onClick:b}])}),mn(),$t(!0);var v=h5A(),F=cA(v);aw(F,{get items(){return c(M)},$$slots:{left:(AA,z)=>{lA(AA,E5A())}}});var G=bA(F,2),U=AA=>{var z=et(()=>(c(A),QA(()=>\"Cannot parse JSON: \".concat(c(A).message))));Mg(AA,{type:\"error\",get icon(){return v2},get message(){return c(z)},get actions(){return c(a)}})},Y=AA=>{Mg(AA,{type:\"success\",message:\"JSON is valid now and can be parsed.\",get actions(){return c(r)}})};YA(G,AA=>{c(A)?AA(U):AA(Y,!1)});var j=bA(G,2);Mo(j,AA=>x(E,AA),()=>c(E)),ve(()=>{j.readOnly=g(),Z1(j,s())}),ue(\"input\",j,function(AA){Q(\"handleChange\");var z=AA.target.value;s()!==z&&(s(z),I()&&I()(s()))}),lA(t,v),St()}function g$(t,e){kt(e,!1);var A=N(e,\"text\",13),i=N(e,\"onParse\",9),n=N(e,\"onRepair\",9),o=N(e,\"onApply\",9),a=N(e,\"onClose\",9);function r(g){o()(g),a()()}function s(){a()()}$t(!0),cu(t,{get onClose(){return a()},className:\"jse-repair-modal\",children:(g,l)=>{u5A(g,{get onParse(){return i()},get onRepair(){return n()},onApply:r,onCancel:s,get text(){return A()},set text(C){A(C)},$$legacy:!0})},$$slots:{default:!0}}),St()}Pt(`/* over all fonts, sizes, and colors */\n/* \"consolas\" for Windows, \"menlo\" for Mac with fallback to \"monaco\", 'Ubuntu Mono' for Ubuntu */\n/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */\n/* main, menu, modal */\n/* jsoneditor modal */\n/* tooltip in text mode */\n/* panels: navigation bar, gutter, search box */\n/* navigation-bar */\n/* context menu */\n/* contents: json key and values */\n/* contents: selected or hovered */\n/* contents: section of collapsed items in an array */\n/* contents: highlighting of search matches */\n/* contents: inline tags inside the JSON document */\n/* contents: table */\n/* controls in modals: inputs, buttons, and \\`a\\` */\n/* messages */\n/* svelte-select */\n/* color picker */\ndiv.jse-collapsed-items.svelte-1v6dhm4 {\n  margin-left: calc(var(--level) * var(--jse-indent-size, calc(1em + 4px)));\n  font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen-Sans, Ubuntu, Cantarell, \"Helvetica Neue\", sans-serif);\n  font-size: var(--jse-font-size, 16px);\n  color: var(--jse-collapsed-items-link-color, rgba(0, 0, 0, 0.38));\n  padding: calc(0.5 * var(--jse-padding, 10px));\n  border: 8px solid transparent;\n  border-width: 8px 0;\n  background-color: var(--jse-contents-background-color, transparent);\n  background-image: linear-gradient(var(--jse-collapsed-items-background-color, #f5f5f5), var(--jse-collapsed-items-background-color, #f5f5f5)), linear-gradient(to bottom right, transparent 50.5%, var(--jse-collapsed-items-background-color, #f5f5f5) 50.5%), linear-gradient(to bottom left, transparent 50.5%, var(--jse-collapsed-items-background-color, #f5f5f5) 50.5%), linear-gradient(to top right, transparent 50.5%, var(--jse-collapsed-items-background-color, #f5f5f5) 50.5%), linear-gradient(to top left, transparent 50.5%, var(--jse-collapsed-items-background-color, #f5f5f5) 50.5%);\n  background-repeat: repeat, repeat-x, repeat-x, repeat-x, repeat-x;\n  background-position: 0 0, 8px 0, 8px 0, 8px 100%, 8px 100%;\n  background-size: auto auto, 16px 16px, 16px 16px, 16px 16px, 16px 16px;\n  background-clip: padding-box, border-box, border-box, border-box, border-box;\n  background-origin: padding-box, border-box, border-box, border-box, border-box;\n  display: flex;\n}\ndiv.jse-collapsed-items.jse-selected.svelte-1v6dhm4 {\n  background-color: var(--jse-selection-background-color, #d3d3d3);\n  --jse-collapsed-items-background-color: var(--jse-collapsed-items-selected-background-color, #c2c2c2);\n}\ndiv.jse-collapsed-items.svelte-1v6dhm4 div.jse-text:where(.svelte-1v6dhm4),\ndiv.jse-collapsed-items.svelte-1v6dhm4 button.jse-expand-items:where(.svelte-1v6dhm4) {\n  margin: 0 calc(0.5 * var(--jse-padding, 10px));\n}\ndiv.jse-collapsed-items.svelte-1v6dhm4 div.jse-text:where(.svelte-1v6dhm4) {\n  display: inline;\n}\ndiv.jse-collapsed-items.svelte-1v6dhm4 button.jse-expand-items:where(.svelte-1v6dhm4) {\n  font-family: inherit;\n  font-size: inherit;\n  color: var(--jse-collapsed-items-link-color, rgba(0, 0, 0, 0.38));\n  background: none;\n  border: none;\n  padding: 0;\n  text-decoration: underline;\n  cursor: pointer;\n}\ndiv.jse-collapsed-items.svelte-1v6dhm4 button.jse-expand-items:where(.svelte-1v6dhm4):hover, div.jse-collapsed-items.svelte-1v6dhm4 button.jse-expand-items:where(.svelte-1v6dhm4):focus {\n  color: var(--jse-collapsed-items-link-color-highlight, #ee5341);\n}`);var f5A=FA('<button type=\"button\" class=\"jse-expand-items svelte-1v6dhm4\"> </button>'),m5A=FA('<div role=\"none\"><div><div class=\"jse-text svelte-1v6dhm4\"> </div> <!></div></div>');function p5A(t,e){kt(e,!1);var A=CA(void 0,!0),i=CA(void 0,!0),n=CA(void 0,!0),o=CA(void 0,!0),a=CA(void 0,!0),r=N(e,\"visibleSections\",9),s=N(e,\"sectionIndex\",9),g=N(e,\"total\",9),l=N(e,\"path\",9),C=N(e,\"selection\",9),I=N(e,\"onExpandSection\",9),d=N(e,\"context\",9);RA(()=>(_(r()),_(s())),()=>{x(A,r()[s()])}),RA(()=>c(A),()=>{x(i,c(A).end)}),RA(()=>(_(r()),_(s()),_(g())),()=>{x(n,r()[s()+1]?r()[s()+1].start:g())}),RA(()=>(_(d()),_(C()),_(l()),c(i)),()=>{x(o,su(d().getJson(),C(),l().concat(String(c(i)))))}),RA(()=>(c(i),c(n)),()=>{x(a,(function(M,v){var F={start:M,end:Math.min(ER(M),v)},G=Math.max(FD((M+v)/2),M),U={start:G,end:Math.min(ER(G),v)},Y=FD(v),j=Y===v?Y-nu:Y,AA={start:Math.max(j,M),end:v},z=[F],yA=U.start>=F.end&&U.end<=AA.start;return yA&&z.push(U),AA.start>=(yA?U.end:F.end)&&z.push(AA),z})(c(i),c(n)))}),mn(),$t(!0);var B,Q,E=m5A(),f=cA(E),b=cA(f),R=cA(b);ea(bA(b,2),1,()=>c(a),ha,(M,v)=>{var F=f5A(),G=cA(F);ve(()=>{var U,Y;return xt(G,\"show \".concat((c(v),(U=QA(()=>c(v).start))!==null&&U!==void 0?U:\"\"),\"-\").concat((c(v),(Y=QA(()=>c(v).end))!==null&&Y!==void 0?Y:\"\")))}),ue(\"click\",F,()=>I()(l(),c(v))),lA(M,F)}),ve(()=>{var M,v;B=Xt(E,1,\"jse-collapsed-items svelte-1v6dhm4\",null,B,{\"jse-selected\":c(o)}),Q=gl(E,\"\",Q,{\"--level\":(_(l()),QA(()=>l().length+2))}),xt(R,\"Items \".concat((M=c(i))!==null&&M!==void 0?M:\"\",\"-\").concat((v=c(n))!==null&&v!==void 0?v:\"\"))}),ue(\"mousemove\",E,function(M){M.stopPropagation()}),lA(t,E),St()}Pt(`/* over all fonts, sizes, and colors */\n/* \"consolas\" for Windows, \"menlo\" for Mac with fallback to \"monaco\", 'Ubuntu Mono' for Ubuntu */\n/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */\n/* main, menu, modal */\n/* jsoneditor modal */\n/* tooltip in text mode */\n/* panels: navigation bar, gutter, search box */\n/* navigation-bar */\n/* context menu */\n/* contents: json key and values */\n/* contents: selected or hovered */\n/* contents: section of collapsed items in an array */\n/* contents: highlighting of search matches */\n/* contents: inline tags inside the JSON document */\n/* contents: table */\n/* controls in modals: inputs, buttons, and \\`a\\` */\n/* messages */\n/* svelte-select */\n/* color picker */\n.jse-context-menu-pointer.svelte-10ijtzr {\n  position: absolute;\n  top: calc(-0.5 * var(--jse-context-menu-pointer-size, calc(1em + 4px)));\n  right: calc(-0.5 * var(--jse-context-menu-pointer-size, calc(1em + 4px)));\n  width: var(--jse-context-menu-pointer-size, calc(1em + 4px));\n  height: var(--jse-context-menu-pointer-size, calc(1em + 4px));\n  padding: 0;\n  margin: 0;\n  cursor: pointer;\n  background: transparent;\n  border-radius: 2px;\n  background: var(--jse-context-menu-pointer-hover-background, #b2b2b2);\n  color: var(--jse-context-menu-pointer-color, var(--jse-context-menu-color, var(--jse-text-color-inverse, #fff)));\n  border: none;\n  box-shadow: var(--jse-controls-box-shadow, 0 2px 6px 0 rgba(0, 0, 0, 0.24));\n}\n.jse-context-menu-pointer.jse-root.svelte-10ijtzr {\n  top: 0;\n  right: calc(-2px - var(--jse-context-menu-pointer-size, calc(1em + 4px)));\n}\n.jse-context-menu-pointer.jse-insert.svelte-10ijtzr {\n  right: -1px;\n}\n.jse-context-menu-pointer.svelte-10ijtzr:hover {\n  background: var(--jse-context-menu-pointer-background-highlight, var(--jse-context-menu-background-highlight, #7a7a7a));\n}\n.jse-context-menu-pointer.jse-selected.svelte-10ijtzr {\n  background: var(--jse-context-menu-pointer-background, var(--jse-context-menu-background, #656565));\n}\n.jse-context-menu-pointer.jse-selected.svelte-10ijtzr:hover {\n  background: var(--jse-context-menu-pointer-background-highlight, var(--jse-context-menu-background-highlight, #7a7a7a));\n}`);var D5A=FA('<button type=\"button\"><!></button>');function P2(t,e){kt(e,!1);var A=N(e,\"root\",9,!1),i=N(e,\"insert\",9,!1),n=N(e,\"selected\",9),o=N(e,\"onContextMenu\",9);$t(!0);var a,r=D5A();Pi(cA(r),{get data(){return qc}}),ve(()=>{a=Xt(r,1,\"jse-context-menu-pointer svelte-10ijtzr\",null,a,{\"jse-root\":A(),\"jse-insert\":i(),\"jse-selected\":n()}),fn(r,\"title\",WR)}),ue(\"click\",r,function(s){for(var g=s.target;g&&g.nodeName!==\"BUTTON\";)g=g.parentNode;g&&o()({anchor:g,left:0,top:0,width:cC,height:lC,offsetTop:2,offsetLeft:0,showTip:!0})}),lA(t,r),St()}Pt(`/* over all fonts, sizes, and colors */\n/* \"consolas\" for Windows, \"menlo\" for Mac with fallback to \"monaco\", 'Ubuntu Mono' for Ubuntu */\n/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */\n/* main, menu, modal */\n/* jsoneditor modal */\n/* tooltip in text mode */\n/* panels: navigation bar, gutter, search box */\n/* navigation-bar */\n/* context menu */\n/* contents: json key and values */\n/* contents: selected or hovered */\n/* contents: section of collapsed items in an array */\n/* contents: highlighting of search matches */\n/* contents: inline tags inside the JSON document */\n/* contents: table */\n/* controls in modals: inputs, buttons, and \\`a\\` */\n/* messages */\n/* svelte-select */\n/* color picker */\n.jse-key.svelte-1n4cez4 {\n  display: inline-block;\n  min-width: 2em;\n  padding: 0 5px;\n  box-sizing: border-box;\n  outline: none;\n  border-radius: 1px;\n  vertical-align: top;\n  color: var(--jse-key-color, #1a1a1a);\n  word-break: normal;\n  overflow-wrap: normal;\n  white-space: pre-wrap;\n}\n.jse-key.jse-empty.svelte-1n4cez4 {\n  min-width: 3em;\n  outline: 1px dotted var(--jse-tag-background, rgba(0, 0, 0, 0.2));\n  -moz-outline-radius: 2px;\n}\n.jse-key.jse-empty.svelte-1n4cez4::after {\n  pointer-events: none;\n  color: var(--jse-tag-background, rgba(0, 0, 0, 0.2));\n  content: \"key\";\n}`);var w5A=FA('<div role=\"none\" data-type=\"selectable-key\"><!></div>'),y5A=FA(\"<!> <!>\",1),v5A=FA('<div role=\"button\" tabindex=\"-1\" class=\"jse-value\" data-type=\"selectable-value\"></div>');function l$(t,e){kt(e,!0);var A=Zs(()=>an(e.selection)&&za(e.selection)),i=Zs(()=>e.context.onRenderValue({path:e.path,value:e.value,mode:e.context.mode,truncateTextSize:e.context.truncateTextSize,readOnly:e.context.readOnly,enforceString:e.enforceString,isEditing:c(A),parser:e.context.parser,normalization:e.context.normalization,selection:e.selection,searchResultItems:e.searchResultItems,onPatch:e.context.onPatch,onPasteJson:e.context.onPasteJson,onSelect:e.context.onSelect,onFind:e.context.onFind,findNextInside:e.context.findNextInside,focus:e.context.focus})),n=yi();ea($e(n),17,()=>c(i),ha,(o,a)=>{var r=yi(),s=$e(r),g=C=>{var I=Zs(()=>c(a).action),d=v5A();as(d,(B,Q)=>{var E;return(E=c(I))===null||E===void 0?void 0:E(B,Q)},()=>c(a).props),lA(C,d)},l=C=>{var I=Zs(()=>c(a).component),d=yi();CX($e(d),()=>c(I),(B,Q)=>{Q(B,oI(()=>c(a).props))}),lA(C,d)};YA(s,C=>{G6A(c(a))?C(g):C(l,!1)}),lA(o,r)}),lA(t,n),St()}var b5A={selecting:!1,selectionAnchor:void 0,selectionAnchorType:void 0,selectionFocus:void 0,dragging:!1};function AR(t){var{json:e,selection:A,deltaY:i,items:n}=t;if(!A)return{operations:void 0,updatedSelection:void 0,offset:0};var o=i<0?(function(l){for(var{json:C,items:I,selection:d,deltaY:B}=l,Q=CC(C,d),E=I.findIndex(F=>di(F.path,Q)),f=()=>{var F;return(F=I[b-1])===null||F===void 0?void 0:F.height},b=E,R=0;f()!==void 0&&Math.abs(B)>R+f()/2;)R+=f(),b-=1;var M=I[b].path,v=b-E;return b!==E&&I[b]!==void 0?{beforePath:M,offset:v}:void 0})({json:e,selection:A,deltaY:i,items:n}):(function(l){for(var C,{json:I,items:d,selection:B,deltaY:Q}=l,E=rI(I,B),f=d.findIndex(j=>di(j.path,E)),b=0,R=f,M=()=>{var j;return(j=d[R+1])===null||j===void 0?void 0:j.height};M()!==void 0&&Math.abs(Q)>b+M()/2;)b+=M(),R+=1;var v=Li(E),F=Pe(I,v),G=Array.isArray(F)?R:R+1,U=(C=d[G])===null||C===void 0?void 0:C.path,Y=R-f;return U?{beforePath:U,offset:Y}:{append:!0,offset:Y}})({json:e,selection:A,deltaY:i,items:n});if(!o||o.offset===0)return{operations:void 0,updatedSelection:void 0,offset:0};var a=(function(l,C,I){if(!C)return[];var d=\"beforePath\"in I?I.beforePath:void 0,B=\"append\"in I?I.append:void 0,Q=Li(st(C)),E=Pe(l,Q);if(!(B||d&&I0(d,Q)&&d.length>Q.length))return[];var f=CC(l,C),b=rI(l,C),R=fi(f),M=fi(b),v=d?d[Q.length]:void 0;if(!Oo(E)){if(Lo(E)){var F=hr(R),G=hr(M),U=v!==void 0?hr(v):E.length;return iM(G-F+1,U<F?yA=>({op:\"move\",from:pt(Q.concat(String(F+yA))),path:pt(Q.concat(String(U+yA)))}):()=>({op:\"move\",from:pt(Q.concat(String(F))),path:pt(Q.concat(String(U)))}))}throw new Error(\"Cannot create move operations: parent must be an Object or Array\")}var Y=Object.keys(E),j=Y.indexOf(R),AA=Y.indexOf(M),z=B?Y.length:v!==void 0?Y.indexOf(v):-1;return j!==-1&&AA!==-1&&z!==-1?z>j?[...Y.slice(j,AA+1),...Y.slice(z,Y.length)].map(yA=>lI(Q,yA)):[...Y.slice(z,j),...Y.slice(AA+1,Y.length)].map(yA=>lI(Q,yA)):[]})(e,A,o),r=Li(CC(e,A)),s=Pe(e,r);if(Array.isArray(s)){var g=(function(l){var C,I,{items:d,json:B,selection:Q,offset:E}=l,f=CC(B,Q),b=rI(B,Q),R=d.findIndex(G=>di(G.path,f)),M=d.findIndex(G=>di(G.path,b)),v=(C=d[R+E])===null||C===void 0?void 0:C.path,F=(I=d[M+E])===null||I===void 0?void 0:I.path;return ns(v,F)})({items:n,json:e,selection:A,offset:o.offset});return{operations:a,updatedSelection:g,offset:o.offset}}return{operations:a,updatedSelection:void 0,offset:o.offset}}Pt(`/* over all fonts, sizes, and colors */\n/* \"consolas\" for Windows, \"menlo\" for Mac with fallback to \"monaco\", 'Ubuntu Mono' for Ubuntu */\n/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */\n/* main, menu, modal */\n/* jsoneditor modal */\n/* tooltip in text mode */\n/* panels: navigation bar, gutter, search box */\n/* navigation-bar */\n/* context menu */\n/* contents: json key and values */\n/* contents: selected or hovered */\n/* contents: section of collapsed items in an array */\n/* contents: highlighting of search matches */\n/* contents: inline tags inside the JSON document */\n/* contents: table */\n/* controls in modals: inputs, buttons, and \\`a\\` */\n/* messages */\n/* svelte-select */\n/* color picker */\nbutton.jse-validation-error.svelte-q6a061 {\n  border: none;\n  background: transparent;\n  color: inherit;\n  cursor: pointer;\n  font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen-Sans, Ubuntu, Cantarell, \"Helvetica Neue\", sans-serif);\n  font-size: var(--jse-font-size, 16px);\n  padding: 5px;\n  margin: 0;\n  padding: 0;\n  margin: 0;\n  vertical-align: top;\n  display: inline-flex;\n  color: var(--jse-error-color, #ee5341);\n}\n\nbutton.jse-validation-info.svelte-q6a061 {\n  border: none;\n  background: transparent;\n  color: inherit;\n  cursor: pointer;\n  font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen-Sans, Ubuntu, Cantarell, \"Helvetica Neue\", sans-serif);\n  font-size: var(--jse-font-size, 16px);\n  padding: 5px;\n  margin: 0;\n  padding: 0;\n  margin: 0;\n  vertical-align: top;\n  display: inline-flex;\n  color: var(--jse-info-color, #4f91ff);\n}\n\nbutton.jse-validation-warning.svelte-q6a061 {\n  border: none;\n  background: transparent;\n  color: inherit;\n  cursor: pointer;\n  font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen-Sans, Ubuntu, Cantarell, \"Helvetica Neue\", sans-serif);\n  font-size: var(--jse-font-size, 16px);\n  padding: 5px;\n  margin: 0;\n  padding: 0;\n  margin: 0;\n  vertical-align: top;\n  display: inline-flex;\n  color: var(--jse-warning-color, #fdc539);\n}`);var M5A=FA('<button type=\"button\"><!></button>');function ZQ(t,e){kt(e,!1);var A=CA(),i=cI(\"absolute-popup\"),n=N(e,\"validationError\",8),o=N(e,\"onExpand\",8);RA(()=>_(n()),()=>{x(A,_6A(n())&&n().isChildError?\"Contains invalid data\":n().message)}),mn(),$t();var a=M5A();Pi(cA(a),{get data(){return v2}}),Er(()=>ue(\"click\",a,function(){for(var r,s=arguments.length,g=new Array(s),l=0;l<s;l++)g[l]=arguments[l];(r=o())===null||r===void 0||r.apply(this,g)})),as(a,(r,s)=>sE?.(r,s),()=>ye({text:c(A)},i)),ve(()=>{var r;return Xt(a,1,\"jse-validation-\".concat((_(n()),(r=QA(()=>n().severity))!==null&&r!==void 0?r:\"\")),\"svelte-q6a061\")}),lA(t,a),St()}Pt(`/* over all fonts, sizes, and colors */\n/* \"consolas\" for Windows, \"menlo\" for Mac with fallback to \"monaco\", 'Ubuntu Mono' for Ubuntu */\n/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */\n/* main, menu, modal */\n/* jsoneditor modal */\n/* tooltip in text mode */\n/* panels: navigation bar, gutter, search box */\n/* navigation-bar */\n/* context menu */\n/* contents: json key and values */\n/* contents: selected or hovered */\n/* contents: section of collapsed items in an array */\n/* contents: highlighting of search matches */\n/* contents: inline tags inside the JSON document */\n/* contents: table */\n/* controls in modals: inputs, buttons, and \\`a\\` */\n/* messages */\n/* svelte-select */\n/* color picker */\n.jse-expand.svelte-1qi6rc1 {\n  width: var(--jse-indent-size, calc(1em + 4px));\n  padding: 0;\n  margin: 0;\n  border: none;\n  cursor: pointer;\n  background: transparent;\n  color: var(--jse-delimiter-color, rgba(0, 0, 0, 0.38));\n  font-size: var(--jse-font-size-mono, 14px);\n  height: var(--jse-line-height, calc(1em + 4px));\n}\n.jse-expand.svelte-1qi6rc1:hover {\n  opacity: 0.8;\n}\n\n.jse-meta.svelte-1qi6rc1,\n.jse-separator.svelte-1qi6rc1,\n.jse-index.svelte-1qi6rc1,\n.jse-bracket.svelte-1qi6rc1 {\n  vertical-align: top;\n  color: var(--jse-delimiter-color, rgba(0, 0, 0, 0.38));\n}\n\n.jse-index.svelte-1qi6rc1 {\n  padding: 0 calc(0.5 * var(--jse-padding, 10px));\n}\n\n.jse-bracket.svelte-1qi6rc1 {\n  padding: 0 2px;\n}\n.jse-bracket.jse-expanded.svelte-1qi6rc1 {\n  padding-right: var(--jse-padding, 10px);\n}\n\n.jse-identifier.svelte-1qi6rc1 {\n  vertical-align: top;\n  position: relative;\n}\n\n.jse-json-node.svelte-1qi6rc1 {\n  position: relative;\n  color: var(--jse-text-color, #4d4d4d);\n}\n.jse-json-node.jse-root.svelte-1qi6rc1 {\n  min-height: 100%;\n  padding-bottom: 2px;\n  box-sizing: border-box;\n}\n.jse-json-node.jse-root.svelte-1qi6rc1 > .jse-contents-outer:where(.svelte-1qi6rc1) > .jse-contents:where(.svelte-1qi6rc1) {\n  padding-left: 0;\n}\n.jse-json-node.svelte-1qi6rc1 .jse-props:where(.svelte-1qi6rc1),\n.jse-json-node.svelte-1qi6rc1 .jse-items:where(.svelte-1qi6rc1) {\n  position: relative;\n}\n.jse-json-node.svelte-1qi6rc1 .jse-header-outer:where(.svelte-1qi6rc1),\n.jse-json-node.svelte-1qi6rc1 .jse-footer-outer:where(.svelte-1qi6rc1) {\n  display: flex;\n  margin-left: calc(var(--level) * var(--jse-indent-size, calc(1em + 4px)));\n}\n.jse-json-node.svelte-1qi6rc1 .jse-header:where(.svelte-1qi6rc1) {\n  position: relative;\n}\n.jse-json-node.svelte-1qi6rc1 .jse-header:where(.svelte-1qi6rc1) .jse-meta:where(.svelte-1qi6rc1) > .jse-meta-inner:where(.svelte-1qi6rc1) {\n  display: flex;\n  justify-content: center;\n}\n.jse-json-node.svelte-1qi6rc1 .jse-contents-outer:where(.svelte-1qi6rc1) {\n  display: flex;\n  margin-left: calc(var(--level) * var(--jse-indent-size, calc(1em + 4px)));\n}\n.jse-json-node.svelte-1qi6rc1 .jse-header:where(.svelte-1qi6rc1),\n.jse-json-node.svelte-1qi6rc1 .jse-contents:where(.svelte-1qi6rc1) {\n  display: flex;\n  flex-direction: row;\n  align-items: flex-start;\n}\n.jse-json-node.svelte-1qi6rc1 .jse-contents:where(.svelte-1qi6rc1) {\n  padding-left: var(--jse-indent-size, calc(1em + 4px));\n  cursor: var(--jse-contents-cursor, pointer);\n}\n.jse-json-node.svelte-1qi6rc1 .jse-contents:where(.svelte-1qi6rc1) .jse-value-outer:where(.svelte-1qi6rc1) {\n  display: inline-flex;\n}\n.jse-json-node.svelte-1qi6rc1 .jse-footer:where(.svelte-1qi6rc1) {\n  display: inline-flex;\n  padding-left: calc(var(--jse-indent-size, calc(1em + 4px)) + 5px);\n}\n.jse-json-node.svelte-1qi6rc1 .jse-header:where(.svelte-1qi6rc1),\n.jse-json-node.svelte-1qi6rc1 .jse-contents:where(.svelte-1qi6rc1),\n.jse-json-node.svelte-1qi6rc1 .jse-footer:where(.svelte-1qi6rc1) {\n  background: var(--jse-contents-background-color, transparent);\n}\n.jse-json-node.svelte-1qi6rc1 .jse-insert-selection-area:where(.svelte-1qi6rc1) {\n  padding: 0 calc(0.5 * var(--jse-padding, 10px));\n  flex: 1;\n}\n.jse-json-node.svelte-1qi6rc1 .jse-insert-selection-area.jse-inside:where(.svelte-1qi6rc1) {\n  display: inline-flex;\n  align-items: center;\n}\n.jse-json-node.svelte-1qi6rc1 .jse-insert-selection-area.jse-after:where(.svelte-1qi6rc1) {\n  display: flex;\n  align-items: flex-end;\n}\n.jse-json-node.svelte-1qi6rc1 .jse-context-menu-pointer-anchor:where(.svelte-1qi6rc1) {\n  position: relative;\n}\n.jse-json-node.svelte-1qi6rc1 .jse-insert-area:where(.svelte-1qi6rc1) {\n  display: flex;\n  position: relative;\n  z-index: 1;\n  margin-left: calc(var(--level) * var(--jse-indent-size, calc(1em + 4px)));\n  max-width: 250px;\n  min-width: 100px;\n  height: 0;\n  margin-right: calc(0.5 * var(--jse-padding, 10px));\n  outline: 1px solid;\n}\n.jse-json-node.svelte-1qi6rc1 .jse-insert-area.jse-hovered:where(.svelte-1qi6rc1) {\n  outline-color: var(--jse-context-menu-pointer-hover-background, #b2b2b2);\n}\n.jse-json-node.svelte-1qi6rc1 .jse-key-outer:where(.svelte-1qi6rc1) {\n  position: relative;\n}\n.jse-json-node.svelte-1qi6rc1 .jse-key-outer:where(.svelte-1qi6rc1):hover,\n.jse-json-node.svelte-1qi6rc1 .jse-value-outer:where(.svelte-1qi6rc1):hover,\n.jse-json-node.svelte-1qi6rc1 .jse-meta:where(.svelte-1qi6rc1):hover,\n.jse-json-node.svelte-1qi6rc1 .jse-footer:where(.svelte-1qi6rc1):hover {\n  background: var(--jse-hover-background-color, rgba(0, 0, 0, 0.06));\n  cursor: var(--jse-contents-cursor, pointer);\n}\n.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-value-outer,\n.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-meta,\n.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-items .jse-header,\n.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-items .jse-contents,\n.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-props .jse-header,\n.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-props .jse-contents,\n.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-footer {\n  background: var(--jse-hover-background-color, rgba(0, 0, 0, 0.06));\n  cursor: var(--jse-contents-cursor, pointer);\n}\n.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-value-outer .jse-value-outer,\n.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-value-outer .jse-meta,\n.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-meta .jse-value-outer,\n.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-meta .jse-meta,\n.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-items .jse-header .jse-value-outer,\n.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-items .jse-header .jse-meta,\n.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-items .jse-contents .jse-value-outer,\n.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-items .jse-contents .jse-meta,\n.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-props .jse-header .jse-value-outer,\n.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-props .jse-header .jse-meta,\n.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-props .jse-contents .jse-value-outer,\n.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-props .jse-contents .jse-meta,\n.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-footer .jse-value-outer,\n.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-footer .jse-meta {\n  background: none;\n}\n.jse-json-node.jse-selected.svelte-1qi6rc1 .jse-header:where(.svelte-1qi6rc1),\n.jse-json-node.jse-selected.svelte-1qi6rc1 .jse-contents:where(.svelte-1qi6rc1),\n.jse-json-node.jse-selected.svelte-1qi6rc1 .jse-footer:where(.svelte-1qi6rc1) {\n  background: var(--jse-selection-background-color, #d3d3d3);\n  cursor: var(--jse-contents-selected-cursor, grab);\n}\n.jse-json-node.jse-selected.svelte-1qi6rc1 .jse-key-outer:where(.svelte-1qi6rc1):hover,\n.jse-json-node.jse-selected.svelte-1qi6rc1 .jse-value-outer:where(.svelte-1qi6rc1):hover,\n.jse-json-node.jse-selected.svelte-1qi6rc1 .jse-meta:where(.svelte-1qi6rc1):hover,\n.jse-json-node.jse-selected.svelte-1qi6rc1 .jse-footer:where(.svelte-1qi6rc1):hover {\n  background: inherit;\n  cursor: inherit;\n}\n.jse-json-node.svelte-1qi6rc1 .jse-key-outer.jse-selected-key:where(.svelte-1qi6rc1) {\n  background: var(--jse-selection-background-color, #d3d3d3);\n  cursor: var(--jse-contents-selected-cursor, grab);\n}\n.jse-json-node.jse-selected-value.svelte-1qi6rc1 .jse-value-outer,\n.jse-json-node.jse-selected-value.svelte-1qi6rc1 .jse-meta,\n.jse-json-node.jse-selected-value.svelte-1qi6rc1 .jse-items .jse-header,\n.jse-json-node.jse-selected-value.svelte-1qi6rc1 .jse-items .jse-contents,\n.jse-json-node.jse-selected-value.svelte-1qi6rc1 .jse-props .jse-header,\n.jse-json-node.jse-selected-value.svelte-1qi6rc1 .jse-props .jse-contents,\n.jse-json-node.jse-selected-value.svelte-1qi6rc1 .jse-footer {\n  background: var(--jse-selection-background-color, #d3d3d3);\n  cursor: var(--jse-contents-selected-cursor, grab);\n}\n.jse-json-node.jse-selected-value.svelte-1qi6rc1 .jse-value-outer .jse-key-outer:hover,\n.jse-json-node.jse-selected-value.svelte-1qi6rc1 .jse-meta .jse-key-outer:hover,\n.jse-json-node.jse-selected-value.svelte-1qi6rc1 .jse-items .jse-header .jse-key-outer:hover,\n.jse-json-node.jse-selected-value.svelte-1qi6rc1 .jse-items .jse-contents .jse-key-outer:hover,\n.jse-json-node.jse-selected-value.svelte-1qi6rc1 .jse-props .jse-header .jse-key-outer:hover,\n.jse-json-node.jse-selected-value.svelte-1qi6rc1 .jse-props .jse-contents .jse-key-outer:hover,\n.jse-json-node.jse-selected-value.svelte-1qi6rc1 .jse-footer .jse-key-outer:hover {\n  background: inherit;\n  cursor: inherit;\n}\n.jse-json-node.jse-readonly.svelte-1qi6rc1 {\n  --jse-contents-selected-cursor: pointer;\n}\n.jse-json-node.svelte-1qi6rc1 .jse-insert-area.jse-selected:where(.svelte-1qi6rc1) {\n  outline-color: var(--jse-context-menu-pointer-background, var(--jse-context-menu-background, #656565));\n}`);var vo=XD(()=>b5A),k5A=FA('<div class=\"jse-separator svelte-1qi6rc1\">:</div>'),S5A=FA('<div class=\"jse-bracket svelte-1qi6rc1\">[</div> <!> &nbsp;',1),x5A=FA('<div class=\"jse-bracket svelte-1qi6rc1\">[</div> <!> <div class=\"jse-bracket svelte-1qi6rc1\">]</div>',1),R5A=FA('<div class=\"jse-context-menu-pointer-anchor svelte-1qi6rc1\"><!></div>'),N5A=FA('<div role=\"none\" class=\"jse-insert-selection-area jse-inside svelte-1qi6rc1\" data-type=\"insert-selection-area-inside\"></div>'),F5A=FA('<div role=\"none\" class=\"jse-insert-selection-area jse-after svelte-1qi6rc1\" data-type=\"insert-selection-area-after\"></div>'),L5A=FA('<div data-type=\"insert-selection-area-inside\"><!></div>'),_5A=FA('<div slot=\"identifier\" class=\"jse-identifier svelte-1qi6rc1\"><div class=\"jse-index svelte-1qi6rc1\"> </div></div>'),G5A=FA(\"<!> <!>\",1),K5A=FA('<div role=\"none\" class=\"jse-insert-selection-area jse-after svelte-1qi6rc1\" data-type=\"insert-selection-area-after\"></div>'),U5A=FA('<div class=\"jse-items svelte-1qi6rc1\"><!> <!></div> <div class=\"jse-footer-outer svelte-1qi6rc1\"><div data-type=\"selectable-value\" class=\"jse-footer svelte-1qi6rc1\"><span class=\"jse-bracket svelte-1qi6rc1\">]</span></div> <!></div>',1),J5A=FA('<div class=\"jse-header-outer svelte-1qi6rc1\"><div class=\"jse-header svelte-1qi6rc1\"><button type=\"button\" class=\"jse-expand svelte-1qi6rc1\" title=\"Expand or collapse this array (Ctrl+Click to expand/collapse recursively)\"><!></button> <!> <!> <div class=\"jse-meta svelte-1qi6rc1\"><div class=\"jse-meta-inner svelte-1qi6rc1\" data-type=\"selectable-value\"><!></div></div> <!></div> <!> <!></div> <!>',1),Y5A=FA('<div class=\"jse-separator svelte-1qi6rc1\">:</div>'),H5A=FA('<div class=\"jse-bracket jse-expanded svelte-1qi6rc1\">&lbrace;</div>'),T5A=FA('<div class=\"jse-bracket svelte-1qi6rc1\">&lbrace;</div> <!> <div class=\"jse-bracket svelte-1qi6rc1\">&rbrace;</div>',1),O5A=FA('<div class=\"jse-context-menu-pointer-anchor svelte-1qi6rc1\"><!></div>'),z5A=FA('<div role=\"none\" class=\"jse-insert-selection-area jse-inside svelte-1qi6rc1\" data-type=\"insert-selection-area-inside\"></div>'),P5A=FA('<div role=\"none\" class=\"jse-insert-selection-area jse-after svelte-1qi6rc1\" data-type=\"insert-selection-area-after\"></div>'),j5A=FA('<div data-type=\"insert-selection-area-inside\"><!></div>'),q5A=FA('<div slot=\"identifier\"><!></div>'),V5A=FA('<div role=\"none\" class=\"jse-insert-selection-area jse-after svelte-1qi6rc1\" data-type=\"insert-selection-area-after\"></div>'),W5A=FA('<div class=\"jse-props svelte-1qi6rc1\"><!> <!></div> <div class=\"jse-footer-outer svelte-1qi6rc1\"><div data-type=\"selectable-value\" class=\"jse-footer svelte-1qi6rc1\"><div class=\"jse-bracket svelte-1qi6rc1\">&rbrace;</div></div> <!></div>',1),Z5A=FA('<div class=\"jse-header-outer svelte-1qi6rc1\"><div class=\"jse-header svelte-1qi6rc1\"><button type=\"button\" class=\"jse-expand svelte-1qi6rc1\" title=\"Expand or collapse this object (Ctrl+Click to expand/collapse recursively)\"><!></button> <!> <!> <div class=\"jse-meta svelte-1qi6rc1\" data-type=\"selectable-value\"><div class=\"jse-meta-inner svelte-1qi6rc1\"><!></div></div> <!></div> <!> <!></div> <!>',1),X5A=FA('<div class=\"jse-separator svelte-1qi6rc1\">:</div>'),$5A=FA('<div class=\"jse-context-menu-pointer-anchor svelte-1qi6rc1\"><!></div>'),ADA=FA('<div role=\"none\" class=\"jse-insert-selection-area jse-after svelte-1qi6rc1\" data-type=\"insert-selection-area-after\"></div>'),eDA=FA('<div class=\"jse-contents-outer svelte-1qi6rc1\"><div class=\"jse-contents svelte-1qi6rc1\"><!> <!> <div class=\"jse-value-outer svelte-1qi6rc1\"><!></div> <!></div> <!> <!></div>'),tDA=FA('<div data-type=\"insert-selection-area-after\"><!></div>'),iDA=FA('<div role=\"treeitem\" tabindex=\"-1\"><!> <!></div>');function kR(t,e){kt(e,!1);var A=CA(void 0,!0),i=CA(void 0,!0),n=N(e,\"pointer\",9),o=N(e,\"value\",9),a=N(e,\"state\",9),r=N(e,\"validationErrors\",9),s=N(e,\"searchResults\",9),g=N(e,\"selection\",9),l=N(e,\"context\",9),C=N(e,\"onDragSelectionStart\",9),I=qa(\"jsoneditor:JSONNode\"),d=CA(void 0,!0),B=void 0,Q=CA(void 0,!0),E=CA(void 0,!0),f=CA(void 0,!0),b=CA(void 0,!0),R=CA(void 0,!0),M=CA(void 0,!0),v=CA(void 0,!0);function F(HA){HA.stopPropagation();var uA=VR(HA);l().onExpand(c(E),!c(f),uA)}function G(){l().onExpand(c(E),!0)}function U(HA,uA){var XA=wu(c(E),Object.keys(o()),HA,uA);return l().onPatch(XA),fi(As(XA[0].path))}function Y(HA){l().onDrag(HA)}function j(HA){vo().selecting&&(vo(vo().selecting=!1),HA.stopPropagation()),l().onDragEnd(),document.removeEventListener(\"mousemove\",Y,!0),document.removeEventListener(\"mouseup\",j)}function AA(){var HA;return((HA=l().findElement([]))===null||HA===void 0||(HA=HA.getBoundingClientRect())===null||HA===void 0?void 0:HA.top)||0}function z(HA,uA){var XA=AA()-HA.initialContentTop;return uA.clientY-HA.initialClientY-XA}function yA(HA){if(!l().readOnly&&g()){var uA=Li(st(g()));if(di(c(E),uA)){var XA=(function(_A,pA){var Rt=[];function Et(O){var tA=c(E).concat(O),oA=l().findElement(tA);oA!==void 0&&Rt.push({path:tA,height:oA.clientHeight})}if(Array.isArray(o())){var Qe=l().getJson();if(Qe===void 0)return;var _t=CC(Qe,_A),Ue=rI(Qe,_A),Te=parseInt(fi(_t),10),ht=parseInt(fi(Ue),10),Me=pA.find(O=>Te>=O.start&&ht<=O.end);if(!Me)return;var{start:Ai,end:J}=Me;hX(Ai,Math.min(o().length,J),O=>Et(String(O)))}else Object.keys(o()).forEach(Et);return Rt})(g(),c(R)||qQ);if(I(\"dragSelectionStart\",{selection:g(),items:XA}),XA){var EA=l().getJson();if(EA!==void 0){var ZA=CC(EA,g()),MA=XA.findIndex(_A=>di(_A.path,ZA)),{offset:be}=AR({json:EA,selection:l().getSelection(),deltaY:0,items:XA});x(Q,{initialTarget:HA.target,initialClientY:HA.clientY,initialContentTop:AA(),selectionStartIndex:MA,selectionItemsCount:gI(EA,g()).length,items:XA,offset:be,didMoveItems:!1}),vo(vo().dragging=!0),document.addEventListener(\"mousemove\",P,!0),document.addEventListener(\"mouseup\",nA)}}else I(\"Cannot drag the current selection (probably spread over multiple sections)\")}else C()(HA)}}function P(HA){if(c(Q)){var uA=l().getJson();if(uA===void 0)return;var XA=z(c(Q),HA),{offset:EA}=AR({json:uA,selection:l().getSelection(),deltaY:XA,items:c(Q).items});EA!==c(Q).offset&&(I(\"drag selection\",EA,XA),x(Q,ye(ye({},c(Q)),{},{offset:EA,didMoveItems:!0})))}}function nA(HA){if(c(Q)){var uA=l().getJson();if(uA===void 0)return;var XA=z(c(Q),HA),{operations:EA,updatedSelection:ZA}=AR({json:uA,selection:l().getSelection(),deltaY:XA,items:c(Q).items});if(EA)l().onPatch(EA,(_A,pA)=>({state:pA,selection:ZA??g()}));else if(HA.target===c(Q).initialTarget&&!c(Q).didMoveItems){var MA=Yx(HA.target),be=SX(HA.target);be&&l().onSelect(HW(MA,be))}x(Q,void 0),vo(vo().dragging=!1),document.removeEventListener(\"mousemove\",P,!0),document.removeEventListener(\"mouseup\",nA)}}function eA(HA){HA.shiftKey||(HA.stopPropagation(),HA.preventDefault(),l().onSelect(pC(c(E))))}function dA(HA){HA.shiftKey||(HA.stopPropagation(),HA.preventDefault(),l().onSelect(QC(c(E))))}function iA(HA){l().onSelect(pC(c(E))),uo(),l().onContextMenu(HA)}function aA(HA){l().onSelect(QC(c(E))),uo(),l().onContextMenu(HA)}RA(()=>_(n()),()=>{x(E,As(n()))}),RA(()=>_(n()),()=>{x(A,encodeURIComponent(n()))}),RA(()=>_(a()),()=>{x(f,!!X1(a())&&a().expanded)}),RA(()=>(_(o()),_(a())),()=>{x(b,g0(o(),a(),[]))}),RA(()=>_(a()),()=>{x(R,Pa(a())?a().visibleSections:void 0)}),RA(()=>_(r()),()=>{var HA;x(M,(HA=r())===null||HA===void 0?void 0:HA.validationError)}),RA(()=>(_(l()),_(g()),c(E)),()=>{x(v,su(l().getJson(),g(),c(E)))}),RA(()=>c(E),()=>{x(i,c(E).length===0)}),mn(),$t(!0);var hA,JA,ee=iDA(),UA=cA(ee),mA=HA=>{var uA=J5A(),XA=$e(uA),EA=cA(XA),ZA=cA(EA),MA=cA(ZA),be=xA=>{Pi(xA,{get data(){return qc}})},_A=xA=>{Pi(xA,{get data(){return qB}})};YA(MA,xA=>{c(f)?xA(be):xA(_A,!1)});var pA=bA(ZA,2);Aa(pA,e,\"identifier\",{},null);var Rt=bA(pA,2),Et=xA=>{lA(xA,k5A())};YA(Rt,xA=>{c(i)||xA(Et)});var Qe=bA(Rt,2),_t=cA(Qe),Ue=cA(_t),Te=xA=>{var LA=S5A();vD(bA($e(LA),2),{children:(dt,At)=>{var Je=tr();ve(()=>{var Ge,ri;return xt(Je,\"\".concat((_(o()),(Ge=QA(()=>o().length))!==null&&Ge!==void 0?Ge:\"\"),`\n                `).concat((_(o()),(ri=QA(()=>o().length===1?\"item\":\"items\"))!==null&&ri!==void 0?ri:\"\")))}),lA(dt,Je)},$$slots:{default:!0}}),lA(xA,LA)},ht=xA=>{var LA=x5A();vD(bA($e(LA),2),{onclick:G,children:(dt,At)=>{var Je=tr();ve(()=>{var Ge,ri;return xt(Je,\"\".concat((_(o()),(Ge=QA(()=>o().length))!==null&&Ge!==void 0?Ge:\"\"),`\n                `).concat((_(o()),(ri=QA(()=>o().length===1?\"item\":\"items\"))!==null&&ri!==void 0?ri:\"\")))}),lA(dt,Je)},$$slots:{default:!0}}),lA(xA,LA)};YA(Ue,xA=>{c(f)?xA(Te):xA(ht,!1)});var Me=bA(Qe,2),Ai=xA=>{var LA=R5A();P2(cA(LA),{get root(){return c(i)},selected:!0,get onContextMenu(){return _(l()),QA(()=>l().onContextMenu)}}),lA(xA,LA)};YA(Me,xA=>{_(l()),c(v),_(g()),_(an),_($n),_(za),_(di),_(st),c(E),QA(()=>!l().readOnly&&c(v)&&g()&&(an(g())||$n(g()))&&!za(g())&&di(st(g()),c(E)))&&xA(Ai)});var J=bA(EA,2),O=xA=>{ZQ(xA,{get validationError(){return c(M)},onExpand:G})};YA(J,xA=>{c(M),c(f),QA(()=>c(M)&&(!c(f)||!c(M).isChildError))&&xA(O)});var tA=bA(J,2),oA=xA=>{var LA=N5A();ue(\"click\",LA,eA),lA(xA,LA)},NA=xA=>{var LA=F5A();ue(\"click\",LA,dA),lA(xA,LA)};YA(tA,xA=>{c(f)?xA(oA):xA(NA,!1)});var de=bA(XA,2),Ee=xA=>{var LA=U5A(),dt=$e(LA),At=cA(dt),Je=rn=>{var Le,ji,Bi=L5A(),vi=cA(Bi),Ji=et(()=>(c(v),_(Ka),_(g()),QA(()=>c(v)&&Ka(g()))));P2(vi,{insert:!0,get selected(){return c(Ji)},onContextMenu:iA}),ve(Dt=>{Le=Xt(Bi,1,\"jse-insert-area jse-inside svelte-1qi6rc1\",null,Le,Dt),fn(Bi,\"title\",Ox),ji=gl(Bi,\"\",ji,{\"--level\":(c(E),QA(()=>c(E).length+1))})},[()=>({\"jse-hovered\":c(d)===F1,\"jse-selected\":c(v)&&Ka(g())})]),lA(rn,Bi)};YA(At,rn=>{_(l()),c(d),_(F1),c(v),_(Ka),_(g()),QA(()=>!l().readOnly&&(c(d)===F1||c(v)&&Ka(g())))&&rn(Je)}),ea(bA(At,2),1,()=>c(R)||qQ,ha,(rn,Le,ji)=>{var Bi=G5A(),vi=$e(Bi);ea(vi,1,()=>(_(o()),c(Le),c(Q),QA(()=>(function(qi,Nt,L){var gt=Nt.start,gi=Math.min(Nt.end,qi.length),sn=a8(gt,gi);return L&&L.offset!==0?pW(sn,L.selectionStartIndex,L.selectionItemsCount,L.offset).map((gn,Kn)=>({index:gn,gutterIndex:Kn})):sn.map(gn=>({index:gn,gutterIndex:gn}))})(o(),c(Le),c(Q)))),qi=>qi.index,(qi,Nt)=>{var L=et(()=>(_(Pa),_(r()),c(Nt),QA(()=>Pa(r())?r().items[c(Nt).index]:void 0))),gt=et(()=>(_(lD),_(l()),_(g()),c(E),c(Nt),QA(()=>lD(l().getJson(),g(),c(E).concat(String(c(Nt).index)))))),gi=yi(),sn=$e(gi),gn=et(()=>(_(R4),_(n()),c(Nt),QA(()=>R4(n(),c(Nt).index)))),Kn=et(()=>(_(Pa),_(a()),c(Nt),QA(()=>Pa(a())?a().items[c(Nt).index]:void 0))),ko=et(()=>(_(Pa),_(s()),c(Nt),QA(()=>Pa(s())?s().items[c(Nt).index]:void 0)));kR(sn,{get value(){return _(o()),c(Nt),QA(()=>o()[c(Nt).index])},get pointer(){return c(gn)},get state(){return c(Kn)},get validationErrors(){return c(L)},get searchResults(){return c(ko)},get selection(){return c(gt)},get context(){return l()},onDragSelectionStart:yA,$$slots:{identifier:(eo,fo)=>{var Go=_5A(),co=cA(Go),ta=cA(co);ve(()=>xt(ta,(c(Nt),QA(()=>c(Nt).gutterIndex)))),lA(eo,Go)}}}),lA(qi,gi)});var Ji=bA(vi,2),Dt=qi=>{var Nt=et(()=>c(R)||qQ);p5A(qi,{get visibleSections(){return c(Nt)},sectionIndex:ji,get total(){return _(o()),QA(()=>o().length)},get path(){return c(E)},get onExpandSection(){return _(l()),QA(()=>l().onExpandSection)},get selection(){return g()},get context(){return l()}})};YA(Ji,qi=>{c(Le),_(o()),QA(()=>c(Le).end<o().length)&&qi(Dt)}),lA(rn,Bi)});var Ge=bA(dt,2),ri=bA(cA(Ge),2),en=rn=>{var Le=K5A();ue(\"click\",Le,dA),lA(rn,Le)};YA(ri,rn=>{c(i)||rn(en)}),lA(xA,LA)};YA(de,xA=>{c(f)&&xA(Ee)}),ue(\"click\",ZA,F),lA(HA,uA)},KA=HA=>{var uA=yi(),XA=$e(uA),EA=MA=>{var be=Z5A(),_A=$e(be),pA=cA(_A),Rt=cA(pA),Et=cA(Rt),Qe=Ge=>{Pi(Ge,{get data(){return qc}})},_t=Ge=>{Pi(Ge,{get data(){return qB}})};YA(Et,Ge=>{c(f)?Ge(Qe):Ge(_t,!1)});var Ue=bA(Rt,2);Aa(Ue,e,\"identifier\",{},null);var Te=bA(Ue,2),ht=Ge=>{lA(Ge,Y5A())};YA(Te,Ge=>{c(i)||Ge(ht)});var Me=bA(Te,2),Ai=cA(Me),J=cA(Ai),O=Ge=>{lA(Ge,H5A())},tA=Ge=>{var ri=T5A();vD(bA($e(ri),2),{onclick:G,children:(en,rn)=>{var Le=tr();ve((ji,Bi)=>xt(Le,\"\".concat(ji??\"\",`\n                `).concat(Bi??\"\")),[()=>(_(o()),QA(()=>Object.keys(o()).length)),()=>(_(o()),QA(()=>Object.keys(o()).length===1?\"prop\":\"props\"))]),lA(en,Le)},$$slots:{default:!0}}),lA(Ge,ri)};YA(J,Ge=>{c(f)?Ge(O):Ge(tA,!1)});var oA=bA(Me,2),NA=Ge=>{var ri=O5A();P2(cA(ri),{get root(){return c(i)},selected:!0,get onContextMenu(){return _(l()),QA(()=>l().onContextMenu)}}),lA(Ge,ri)};YA(oA,Ge=>{_(l()),c(v),_(g()),_(an),_($n),_(za),_(di),_(st),c(E),QA(()=>!l().readOnly&&c(v)&&g()&&(an(g())||$n(g()))&&!za(g())&&di(st(g()),c(E)))&&Ge(NA)});var de=bA(pA,2),Ee=Ge=>{ZQ(Ge,{get validationError(){return c(M)},onExpand:G})};YA(de,Ge=>{c(M),c(f),QA(()=>c(M)&&(!c(f)||!c(M).isChildError))&&Ge(Ee)});var xA=bA(de,2),LA=Ge=>{var ri=z5A();ue(\"click\",ri,eA),lA(Ge,ri)},dt=Ge=>{var ri=yi(),en=$e(ri),rn=Le=>{var ji=P5A();ue(\"click\",ji,dA),lA(Le,ji)};YA(en,Le=>{c(i)||Le(rn)},!0),lA(Ge,ri)};YA(xA,Ge=>{c(f)?Ge(LA):Ge(dt,!1)});var At=bA(_A,2),Je=Ge=>{var ri=W5A(),en=$e(ri),rn=cA(en),Le=Ji=>{var Dt,qi,Nt=j5A(),L=cA(Nt),gt=et(()=>(c(v),_(Ka),_(g()),QA(()=>c(v)&&Ka(g()))));P2(L,{insert:!0,get selected(){return c(gt)},onContextMenu:iA}),ve(gi=>{Dt=Xt(Nt,1,\"jse-insert-area jse-inside svelte-1qi6rc1\",null,Dt,gi),fn(Nt,\"title\",Ox),qi=gl(Nt,\"\",qi,{\"--level\":(c(E),QA(()=>c(E).length+1))})},[()=>({\"jse-hovered\":c(d)===F1,\"jse-selected\":c(v)&&Ka(g())})]),lA(Ji,Nt)};YA(rn,Ji=>{_(l()),c(d),_(F1),c(v),_(Ka),_(g()),QA(()=>!l().readOnly&&(c(d)===F1||c(v)&&Ka(g())))&&Ji(Le)}),ea(bA(rn,2),1,()=>(_(o()),c(Q),QA(()=>(function(Ji,Dt){var qi=Object.keys(Ji);return Dt&&Dt.offset!==0?pW(qi,Dt.selectionStartIndex,Dt.selectionItemsCount,Dt.offset):qi})(o(),c(Q)))),ha,(Ji,Dt)=>{var qi=et(()=>(_(R4),_(n()),c(Dt),QA(()=>R4(n(),c(Dt))))),Nt=et(()=>(_(Ws),_(s()),c(Dt),QA(()=>Ws(s())?s().properties[c(Dt)]:void 0))),L=et(()=>(_(Ws),_(r()),c(Dt),QA(()=>Ws(r())?r().properties[c(Dt)]:void 0))),gt=et(()=>(c(E),c(Dt),QA(()=>c(E).concat(c(Dt))))),gi=et(()=>(_(lD),_(l()),_(g()),_(c(gt)),QA(()=>lD(l().getJson(),g(),c(gt))))),sn=yi(),gn=$e(sn),Kn=et(()=>(_(Ws),_(a()),c(Dt),QA(()=>Ws(a())?a().properties[c(Dt)]:void 0)));kR(gn,{get value(){return _(o()),c(Dt),QA(()=>o()[c(Dt)])},get pointer(){return c(qi)},get state(){return c(Kn)},get validationErrors(){return c(L)},get searchResults(){return c(Nt)},get selection(){return c(gi)},get context(){return l()},onDragSelectionStart:yA,$$slots:{identifier:(ko,eo)=>{var fo,Go=q5A(),co=cA(Go),ta=et(()=>(_(VW),_(c(Nt)),QA(()=>VW(c(Nt)))));(function(Ko,qo){kt(qo,!1);var Co=CA(void 0,!0),se=CA(void 0,!0),Ci=N(qo,\"pointer\",9),tn=N(qo,\"key\",9),ln=N(qo,\"selection\",9),So=N(qo,\"searchResultItems\",9),la=N(qo,\"onUpdateKey\",9),pi=N(qo,\"context\",9),to=CA(void 0,!0);function Ja(vA){c(se)||pi().readOnly||(vA.preventDefault(),pi().onSelect(oN(c(to))))}function Io(vA,VA){var me=la()(tn(),pi().normalization.unescapeValue(vA)),IA=Li(c(to)).concat(me);pi().onSelect(VA===aI.nextInside?_i(IA):mC(IA)),VA!==aI.self&&pi().focus()}function Sa(){pi().onSelect(mC(c(to))),pi().focus()}RA(()=>_(Ci()),()=>{x(to,As(Ci()))}),RA(()=>(_(ln()),c(to)),()=>{x(Co,ja(ln())&&di(ln().path,c(to)))}),RA(()=>(c(Co),_(ln())),()=>{x(se,c(Co)&&za(ln()))}),mn(),$t(!0);var kn=y5A(),Mi=$e(kn),Ot=vA=>{var VA=et(()=>(_(pi()),_(tn()),QA(()=>pi().normalization.escapeValue(tn())))),me=et(()=>(_(za),_(ln()),QA(()=>za(ln())?ln().initialValue:void 0)));YX(vA,{get value(){return c(VA)},get initialValue(){return c(me)},label:\"Edit key\",shortText:!0,onChange:Io,onCancel:Sa,get onFind(){return _(pi()),QA(()=>pi().onFind)}})},pn=vA=>{var VA,me=w5A(),IA=cA(me),SA=Se=>{var tt=et(()=>(_(pi()),_(tn()),QA(()=>pi().normalization.escapeValue(tn()))));qX(Se,{get text(){return c(tt)},get searchResultItems(){return So()}})},re=Se=>{var tt=tr();ve(at=>xt(tt,at),[()=>(_(oE),_(pi()),_(tn()),QA(()=>oE(pi().normalization.escapeValue(tn()))))]),lA(Se,tt)};YA(IA,Se=>{So()?Se(SA):Se(re,!1)}),ve(()=>VA=Xt(me,1,\"jse-key svelte-1n4cez4\",null,VA,{\"jse-empty\":tn()===\"\"})),ue(\"dblclick\",me,Ja),lA(vA,me)};YA(Mi,vA=>{_(pi()),c(se),QA(()=>!pi().readOnly&&c(se))?vA(Ot):vA(pn,!1)});var io=bA(Mi,2),mo=vA=>{P2(vA,{selected:!0,get onContextMenu(){return _(pi()),QA(()=>pi().onContextMenu)}})};YA(io,vA=>{_(pi()),c(Co),c(se),QA(()=>!pi().readOnly&&c(Co)&&!c(se))&&vA(mo)}),lA(Ko,kn),St()})(co,{get pointer(){return c(qi)},get key(){return c(Dt)},get selection(){return c(gi)},get searchResultItems(){return c(ta)},get context(){return l()},onUpdateKey:U}),ve(Ko=>fo=Xt(Go,1,\"jse-key-outer svelte-1qi6rc1\",null,fo,Ko),[()=>({\"jse-selected-key\":ja(c(gi))&&di(c(gi).path,c(gt))})]),lA(ko,Go)}}}),lA(Ji,sn)});var ji=bA(en,2),Bi=bA(cA(ji),2),vi=Ji=>{var Dt=V5A();ue(\"click\",Dt,dA),lA(Ji,Dt)};YA(Bi,Ji=>{c(i)||Ji(vi)}),lA(Ge,ri)};YA(At,Ge=>{c(f)&&Ge(Je)}),ue(\"click\",Rt,F),lA(MA,be)},ZA=MA=>{var be=eDA(),_A=cA(be),pA=cA(_A);Aa(pA,e,\"identifier\",{},null);var Rt=bA(pA,2),Et=oA=>{lA(oA,X5A())};YA(Rt,oA=>{c(i)||oA(Et)});var Qe=bA(Rt,2),_t=cA(Qe),Ue=et(()=>c(v)?g():void 0),Te=et(()=>(_(WW),_(s()),QA(()=>WW(s()))));l$(_t,{get path(){return c(E)},get value(){return o()},get enforceString(){return c(b)},get selection(){return c(Ue)},get searchResultItems(){return c(Te)},get context(){return l()}});var ht=bA(Qe,2),Me=oA=>{var NA=$5A();P2(cA(NA),{get root(){return c(i)},selected:!0,get onContextMenu(){return _(l()),QA(()=>l().onContextMenu)}}),lA(oA,NA)};YA(ht,oA=>{_(l()),c(v),_(g()),_(an),_($n),_(za),_(di),_(st),c(E),QA(()=>!l().readOnly&&c(v)&&g()&&(an(g())||$n(g()))&&!za(g())&&di(st(g()),c(E)))&&oA(Me)});var Ai=bA(_A,2),J=oA=>{ZQ(oA,{get validationError(){return c(M)},onExpand:G})};YA(Ai,oA=>{c(M)&&oA(J)});var O=bA(Ai,2),tA=oA=>{var NA=ADA();ue(\"click\",NA,dA),lA(oA,NA)};YA(O,oA=>{c(i)||oA(tA)}),lA(MA,be)};YA(XA,MA=>{_(Qn),_(o()),QA(()=>Qn(o()))?MA(EA):MA(ZA,!1)},!0),lA(HA,uA)};YA(UA,HA=>{_(o()),QA(()=>Array.isArray(o()))?HA(mA):HA(KA,!1)});var ze=bA(UA,2),Ke=HA=>{var uA,XA=tDA(),EA=cA(XA),ZA=et(()=>(c(v),_(Xs),_(g()),QA(()=>c(v)&&Xs(g()))));P2(EA,{insert:!0,get selected(){return c(ZA)},onContextMenu:aA}),ve(MA=>{uA=Xt(XA,1,\"jse-insert-area jse-after svelte-1qi6rc1\",null,uA,MA),fn(XA,\"title\",Ox)},[()=>({\"jse-hovered\":c(d)===sD,\"jse-selected\":c(v)&&Xs(g())})]),lA(HA,XA)};YA(ze,HA=>{_(l()),c(d),_(sD),c(v),_(Xs),_(g()),QA(()=>!l().readOnly&&(c(d)===sD||c(v)&&Xs(g())))&&HA(Ke)}),ve((HA,uA)=>{hA=Xt(ee,1,HA,\"svelte-1qi6rc1\",hA,uA),fn(ee,\"data-path\",c(A)),fn(ee,\"aria-selected\",c(v)),JA=gl(ee,\"\",JA,{\"--level\":(c(E),QA(()=>c(E).length))})},[()=>sI((_(gc),c(f),_(l()),c(E),_(o()),QA(()=>gc(\"jse-json-node\",{\"jse-expanded\":c(f)},l().onClassName(c(E),o()))))),()=>({\"jse-root\":c(i),\"jse-selected\":c(v)&&$n(g()),\"jse-selected-value\":c(v)&&an(g()),\"jse-readonly\":l().readOnly,\"jse-hovered\":c(d)===vW})]),ue(\"mousedown\",ee,function(HA){if((HA.buttons===1||HA.buttons===2)&&!((uA=HA.target).nodeName===\"DIV\"&&uA.contentEditable===\"true\"||HA.buttons===1&&MX(HA.target,\"BUTTON\"))){var uA;HA.stopPropagation(),HA.preventDefault(),l().focus(),document.addEventListener(\"mousemove\",Y,!0),document.addEventListener(\"mouseup\",j);var XA=Yx(HA.target),EA=l().getJson(),ZA=l().getDocumentState();if(!g()||XA===jn.after||XA===jn.inside||g().type!==XA&&g().type!==jn.multi||!su(EA,g(),c(E)))if(vo(vo().selecting=!0),vo(vo().selectionAnchor=c(E)),vo(vo().selectionAnchorType=XA),vo(vo().selectionFocus=c(E)),HA.shiftKey){var MA=l().getSelection();MA&&l().onSelect(ns(O1(MA),c(E)))}else if(XA===jn.multi)if(c(i)&&HA.target.hasAttribute(\"data-path\")){var be=fi(_X(o(),ZA));l().onSelect(mR(be))}else l().onSelect(ns(c(E),c(E)));else EA!==void 0&&l().onSelect(HW(XA,c(E)));else HA.button===0&&C()(HA)}}),ue(\"mousemove\",ee,function(HA){if(vo().selecting){HA.preventDefault(),HA.stopPropagation(),vo().selectionFocus===void 0&&window.getSelection&&window.getSelection().empty();var uA=Yx(HA.target);di(c(E),vo().selectionFocus)&&uA===vo().selectionAnchorType||(vo(vo().selectionFocus=c(E)),vo(vo().selectionAnchorType=uA),l().onSelect(ns(vo().selectionAnchor||vo().selectionFocus,vo().selectionFocus)))}}),ue(\"mouseover\",ee,function(HA){vo().selecting||vo().dragging||(HA.stopPropagation(),$2(HA.target,\"data-type\",\"selectable-value\")?x(d,vW):$2(HA.target,\"data-type\",\"selectable-key\")?x(d,void 0):$2(HA.target,\"data-type\",\"insert-selection-area-inside\")?x(d,F1):$2(HA.target,\"data-type\",\"insert-selection-area-after\")&&x(d,sD),clearTimeout(B))}),ue(\"mouseout\",ee,function(HA){HA.stopPropagation(),B=window.setTimeout(()=>x(d,void 0))}),lA(t,ee),St()}var c$={prefix:\"fas\",iconName:\"jsoneditor-expand\",icon:[512,512,[],\"\",\"M 0,448 V 512 h 512 v -64 z M 0,0 V 64 H 512 V 0 Z M 256,96 128,224 h 256 z M 256,416 384,288 H 128 Z\"]},C$={prefix:\"fas\",iconName:\"jsoneditor-collapse\",icon:[512,512,[],\"\",\"m 0,224 v 64 h 512 v -64 z M 256,192 384,64 H 128 Z M 256,320 128,448 h 256 z\"]},sZ={prefix:\"fas\",iconName:\"jsoneditor-format\",icon:[512,512,[],\"\",\"M 0,32 v 64 h 416 v -64 z M 160,160 v 64 h 352 v -64 z M 160,288 v 64 h 288 v -64 z M 0,416 v 64 h 320 v -64 z\"]},nDA={prefix:\"fas\",iconName:\"jsoneditor-compact\",icon:[512,512,[],\"\",\"M 0,32 v 64 h 512 v -64 z M 0,160 v 64 h 512 v -64 z M 0,288 v 64 h 352 v -64 z\"]};Pt(`/* over all fonts, sizes, and colors */\n/* \"consolas\" for Windows, \"menlo\" for Mac with fallback to \"monaco\", 'Ubuntu Mono' for Ubuntu */\n/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */\n/* main, menu, modal */\n/* jsoneditor modal */\n/* tooltip in text mode */\n/* panels: navigation bar, gutter, search box */\n/* navigation-bar */\n/* context menu */\n/* contents: json key and values */\n/* contents: selected or hovered */\n/* contents: section of collapsed items in an array */\n/* contents: highlighting of search matches */\n/* contents: inline tags inside the JSON document */\n/* contents: table */\n/* controls in modals: inputs, buttons, and \\`a\\` */\n/* messages */\n/* svelte-select */\n/* color picker */\n.jse-welcome.svelte-1lhnan {\n  flex: 1;\n  overflow: auto;\n  font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen-Sans, Ubuntu, Cantarell, \"Helvetica Neue\", sans-serif);\n  font-size: var(--jse-font-size, 16px);\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  border-left: var(--jse-main-border, 1px solid #d7d7d7);\n  border-right: var(--jse-main-border, 1px solid #d7d7d7);\n}\n.jse-welcome.svelte-1lhnan:last-child {\n  border-bottom: var(--jse-main-border, 1px solid #d7d7d7);\n}\n.jse-welcome.svelte-1lhnan .jse-space.jse-before:where(.svelte-1lhnan) {\n  flex: 1;\n}\n.jse-welcome.svelte-1lhnan .jse-space.jse-after:where(.svelte-1lhnan) {\n  flex: 2;\n}\n.jse-welcome.svelte-1lhnan .jse-contents:where(.svelte-1lhnan) {\n  display: flex;\n  flex-direction: column;\n  max-width: 300px;\n  margin: 2em var(--jse-padding, 10px);\n  gap: var(--jse-padding, 10px);\n}\n.jse-welcome.svelte-1lhnan .jse-contents:where(.svelte-1lhnan) .jse-welcome-info:where(.svelte-1lhnan) {\n  color: var(--jse-panel-color-readonly, #b2b2b2);\n}\n.jse-welcome.svelte-1lhnan .jse-contents:where(.svelte-1lhnan) button:where(.svelte-1lhnan) {\n  border: none;\n  background: transparent;\n  color: inherit;\n  cursor: pointer;\n  font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen-Sans, Ubuntu, Cantarell, \"Helvetica Neue\", sans-serif);\n  font-size: var(--jse-font-size, 16px);\n  padding: 5px;\n  margin: 0;\n  background: var(--jse-button-primary-background, var(--jse-theme-color, #3883fa));\n  color: var(--jse-button-primary-color, #fff);\n  padding: var(--jse-padding, 10px) calc(2 * var(--jse-padding, 10px));\n  border-radius: 3px;\n}\n.jse-welcome.svelte-1lhnan .jse-contents:where(.svelte-1lhnan) button:where(.svelte-1lhnan):hover {\n  background: var(--jse-button-primary-background-highlight, var(--jse-theme-color-highlight, #5f9dff));\n}\n.jse-welcome.svelte-1lhnan .jse-contents:where(.svelte-1lhnan) button:where(.svelte-1lhnan):disabled {\n  background: var(--jse-button-primary-background-disabled, #9d9d9d);\n}`);var oDA=FA('<div class=\"jse-welcome-info svelte-1lhnan\">You can paste clipboard data using <b>Ctrl+V</b>, or use the following options:</div> <button class=\"svelte-1lhnan\">Create object</button> <button class=\"svelte-1lhnan\">Create array</button>',1),aDA=FA('<div class=\"jse-welcome svelte-1lhnan\" role=\"none\"><div class=\"jse-space jse-before svelte-1lhnan\"></div> <div class=\"jse-contents svelte-1lhnan\"><div class=\"jse-welcome-title\">Empty document</div> <!></div> <div class=\"jse-space jse-after svelte-1lhnan\"></div></div>');function SR(t,e){var A=typeof t==\"string\"?t.toLowerCase():t,i=typeof e==\"string\"?e.toLowerCase():e;return(0,QZ.default)(A,i)}function I$(t){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:[],A=arguments.length>2&&arguments[2]!==void 0?arguments[2]:[],i=arguments.length>3&&arguments[3]!==void 0?arguments[3]:1,n=Pe(t,e);if(Lo(n)){if(A===void 0)throw new Error(\"Cannot sort: no property selected by which to sort the array\");return(function(o){var a=arguments.length>1&&arguments[1]!==void 0?arguments[1]:[],r=arguments.length>2&&arguments[2]!==void 0?arguments[2]:[],s=arguments.length>3&&arguments[3]!==void 0?arguments[3]:1,g=(function(C,I){var d={boolean:0,number:1,string:2,undefined:4},B=3;return function(Q,E){var f=Pe(Q,C),b=Pe(E,C);if(typeof f!=typeof b){var R,M,v=(R=d[typeof f])!==null&&R!==void 0?R:B,F=(M=d[typeof b])!==null&&M!==void 0?M:B;return v>F?I:v<F?-I:0}return typeof f==\"number\"||typeof f==\"boolean\"?f>b?I:f<b?-I:0:jo(f)?0:I*SR(f,b)}})(r,s),l=Pe(o,a);return[{op:\"replace\",path:pt(a),value:l.slice(0).sort(g)}]})(t,e,A,i)}if(Qn(n))return(function(o){var a=arguments.length>1&&arguments[1]!==void 0?arguments[1]:[],r=arguments.length>2&&arguments[2]!==void 0?arguments[2]:1,s=Pe(o,a),g=Object.keys(s).slice();g.sort((C,I)=>r*SR(C,I));var l={};return g.forEach(C=>l[C]=s[C]),[{op:\"replace\",path:pt(a),value:l}]})(t,e,i);throw new Error(\"Cannot sort: no array or object\")}hu([\"click\"]);Pt(`/* over all fonts, sizes, and colors */\n/* \"consolas\" for Windows, \"menlo\" for Mac with fallback to \"monaco\", 'Ubuntu Mono' for Ubuntu */\n/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */\n/* main, menu, modal */\n/* jsoneditor modal */\n/* tooltip in text mode */\n/* panels: navigation bar, gutter, search box */\n/* navigation-bar */\n/* context menu */\n/* contents: json key and values */\n/* contents: selected or hovered */\n/* contents: section of collapsed items in an array */\n/* contents: highlighting of search matches */\n/* contents: inline tags inside the JSON document */\n/* contents: table */\n/* controls in modals: inputs, buttons, and \\`a\\` */\n/* messages */\n/* svelte-select */\n/* color picker */\n.jse-navigation-bar-dropdown.svelte-1k47orx {\n  position: absolute;\n  top: 100%;\n  left: 0;\n  z-index: 3;\n  background: var(--jse-navigation-bar-background, var(--jse-background-color, #fff));\n  color: var(--jse-navigation-bar-dropdown-color, #656565);\n  box-shadow: var(--jse-controls-box-shadow, 0 2px 6px 0 rgba(0, 0, 0, 0.24));\n  display: flex;\n  flex-direction: column;\n  max-height: 300px;\n  overflow: auto;\n  min-width: 80px;\n}\n.jse-navigation-bar-dropdown.svelte-1k47orx button.jse-navigation-bar-dropdown-item:where(.svelte-1k47orx) {\n  font-family: var(--jse-font-family-mono, consolas, menlo, monaco, \"Ubuntu Mono\", \"source-code-pro\", monospace);\n  font-size: var(--jse-font-size-mono, 14px);\n  border: none;\n  background: transparent;\n  color: inherit;\n  cursor: pointer;\n  outline: none;\n  text-align: left;\n  white-space: nowrap;\n  box-sizing: border-box;\n  padding: calc(0.5 * var(--jse-padding, 10px)) 36px;\n}\n.jse-navigation-bar-dropdown.svelte-1k47orx button.jse-navigation-bar-dropdown-item:where(.svelte-1k47orx):focus, .jse-navigation-bar-dropdown.svelte-1k47orx button.jse-navigation-bar-dropdown-item:where(.svelte-1k47orx):hover {\n  background: var(--jse-navigation-bar-background-highlight, #e5e5e5);\n}\n.jse-navigation-bar-dropdown.svelte-1k47orx button.jse-navigation-bar-dropdown-item.jse-selected:where(.svelte-1k47orx) {\n  background: var(--jse-navigation-bar-dropdown-color, #656565);\n  color: var(--jse-navigation-bar-background, var(--jse-background-color, #fff));\n}`);var rDA=FA('<button type=\"button\"> </button>'),sDA=FA('<button type=\"button\" class=\"jse-navigation-bar-dropdown-item svelte-1k47orx\">...</button>'),gDA=FA('<div class=\"jse-navigation-bar-dropdown svelte-1k47orx\"><!> <!></div>');function lDA(t,e){kt(e,!1);var A=N(e,\"items\",9),i=N(e,\"selectedItem\",9),n=N(e,\"onSelect\",9);$t(!0);var o=gDA(),a=cA(o);ea(a,1,()=>(_(RD),_(A()),QA(()=>RD(A(),100))),g=>g,(g,l)=>{var C,I=rDA(),d=cA(I);ve((B,Q)=>{C=Xt(I,1,\"jse-navigation-bar-dropdown-item svelte-1k47orx\",null,C,{\"jse-selected\":c(l)===i()}),fn(I,\"title\",B),xt(d,Q)},[()=>(c(l),QA(()=>c(l).toString())),()=>(_(gC),c(l),QA(()=>gC(c(l).toString(),30)))]),ue(\"click\",I,aC(()=>n()(c(l)))),lA(g,I)});var r=bA(a,2),s=g=>{var l=sDA();fn(l,\"title\",\"Limited to 100 items\"),lA(g,l)};YA(r,g=>{_(A()),QA(()=>A().length>100)&&g(s)}),lA(t,o),St()}Pt(`/* over all fonts, sizes, and colors */\n/* \"consolas\" for Windows, \"menlo\" for Mac with fallback to \"monaco\", 'Ubuntu Mono' for Ubuntu */\n/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */\n/* main, menu, modal */\n/* jsoneditor modal */\n/* tooltip in text mode */\n/* panels: navigation bar, gutter, search box */\n/* navigation-bar */\n/* context menu */\n/* contents: json key and values */\n/* contents: selected or hovered */\n/* contents: section of collapsed items in an array */\n/* contents: highlighting of search matches */\n/* contents: inline tags inside the JSON document */\n/* contents: table */\n/* controls in modals: inputs, buttons, and \\`a\\` */\n/* messages */\n/* svelte-select */\n/* color picker */\n.jse-navigation-bar-item.svelte-13sijxb {\n  position: relative;\n  display: flex;\n}\n.jse-navigation-bar-item.svelte-13sijxb button.jse-navigation-bar-button:where(.svelte-13sijxb) {\n  font-family: inherit;\n  font-size: inherit;\n  padding: calc(0.5 * var(--jse-padding, 10px)) 2px;\n  border: none;\n  background: transparent;\n  color: inherit;\n  cursor: pointer;\n  outline: none;\n  min-width: 2em;\n  white-space: nowrap;\n}\n.jse-navigation-bar-item.svelte-13sijxb button.jse-navigation-bar-button:where(.svelte-13sijxb):focus, .jse-navigation-bar-item.svelte-13sijxb button.jse-navigation-bar-button:where(.svelte-13sijxb):hover {\n  background: var(--jse-panel-button-background-highlight, #e0e0e0);\n  color: var(--panel-button-color-highlight, var(--jse-text-color, #4d4d4d));\n}\n.jse-navigation-bar-item.svelte-13sijxb button.jse-navigation-bar-button.jse-navigation-bar-arrow:where(.svelte-13sijxb) {\n  padding: 2px var(--jse-padding, 10px) 0;\n}\n.jse-navigation-bar-item.svelte-13sijxb button.jse-navigation-bar-button.jse-navigation-bar-arrow.jse-open:where(.svelte-13sijxb) {\n  background: var(--jse-navigation-bar-background, var(--jse-background-color, #fff));\n  color: var(--jse-navigation-bar-dropdown-color, #656565);\n}\n.jse-navigation-bar-item.svelte-13sijxb:last-child {\n  padding-right: var(--jse-padding, 10px);\n}`);var cDA=FA('<button type=\"button\" class=\"jse-navigation-bar-button svelte-13sijxb\"> </button>'),CDA=FA('<div class=\"jse-navigation-bar-item svelte-13sijxb\"><button type=\"button\"><!></button> <!></div>');function gZ(t,e){kt(e,!1);var A,i=CA(void 0,!0),n=CA(void 0,!0),{openAbsolutePopup:o,closeAbsolutePopup:a}=cI(\"absolute-popup\"),r=N(e,\"path\",9),s=N(e,\"index\",9),g=N(e,\"onSelect\",9),l=N(e,\"getItems\",9),C=CA(void 0,!0),I=CA(!1,!0);function d(R){a(A),g()(c(i).concat(R))}RA(()=>(_(r()),_(s())),()=>{x(i,r().slice(0,s()))}),RA(()=>(_(r()),_(s())),()=>{x(n,r()[s()])}),mn(),$t(!0);var B,Q=CDA(),E=cA(Q);Pi(cA(E),{get data(){return IM}});var f=bA(E,2),b=R=>{var M=cDA(),v=cA(M);ve(()=>xt(v,c(n))),ue(\"click\",M,()=>d(c(n))),lA(R,M)};YA(f,R=>{c(n)!==void 0&&R(b)}),Mo(Q,R=>x(C,R),()=>c(C)),ve(()=>B=Xt(E,1,\"jse-navigation-bar-button jse-navigation-bar-arrow svelte-13sijxb\",null,B,{\"jse-open\":c(I)})),ue(\"click\",E,function(){if(c(C)){x(I,!0);var R={items:l()(c(i)),selectedItem:c(n),onSelect:d};A=o(lDA,R,{anchor:c(C),closeOnOuterClick:!0,onClose:()=>{x(I,!1)}})}}),lA(t,Q),St()}function lN(t){var e,A;if(navigator.clipboard)return navigator.clipboard.writeText(t);if((e=(A=document).queryCommandSupported)!==null&&e!==void 0&&e.call(A,\"copy\")){var i=document.createElement(\"textarea\");i.value=t,i.style.position=\"fixed\",i.style.opacity=\"0\",document.body.appendChild(i),i.select();try{document.execCommand(\"copy\")}catch(n){console.error(n)}finally{document.body.removeChild(i)}return Promise.resolve()}return console.error(\"Copy failed.\"),Promise.resolve()}Pt(`/* over all fonts, sizes, and colors */\n/* \"consolas\" for Windows, \"menlo\" for Mac with fallback to \"monaco\", 'Ubuntu Mono' for Ubuntu */\n/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */\n/* main, menu, modal */\n/* jsoneditor modal */\n/* tooltip in text mode */\n/* panels: navigation bar, gutter, search box */\n/* navigation-bar */\n/* context menu */\n/* contents: json key and values */\n/* contents: selected or hovered */\n/* contents: section of collapsed items in an array */\n/* contents: highlighting of search matches */\n/* contents: inline tags inside the JSON document */\n/* contents: table */\n/* controls in modals: inputs, buttons, and \\`a\\` */\n/* messages */\n/* svelte-select */\n/* color picker */\n.jse-navigation-bar-path-editor.svelte-uyexy4 {\n  flex: 1;\n  display: flex;\n  border: var(--jse-edit-outline, 2px solid #656565);\n  background: var(--jse-background-color, #fff);\n}\n.jse-navigation-bar-path-editor.svelte-uyexy4 input.jse-navigation-bar-text:where(.svelte-uyexy4) {\n  flex: 1;\n  font-family: inherit;\n  font-size: inherit;\n  padding: 0 5px 1px;\n  background: var(--jse-background-color, #fff);\n  color: var(--jse-text-color, #4d4d4d);\n  border: none;\n  outline: none;\n}\n.jse-navigation-bar-path-editor.svelte-uyexy4 button:where(.svelte-uyexy4) {\n  border: none;\n  background: var(--jse-background-color, #fff);\n  cursor: pointer;\n  font-family: inherit;\n  font-size: 80%;\n  color: inherit;\n}\n.jse-navigation-bar-path-editor.svelte-uyexy4 button.jse-navigation-bar-copy.copied:where(.svelte-uyexy4) {\n  color: var(--message-success-background, #9ac45d);\n}\n.jse-navigation-bar-path-editor.svelte-uyexy4 button.jse-navigation-bar-validation-error:where(.svelte-uyexy4) {\n  color: var(--jse-error-color, #ee5341);\n}\n.jse-navigation-bar-path-editor.error.svelte-uyexy4 {\n  border-color: var(--jse-error-color, #ee5341);\n}\n.jse-navigation-bar-path-editor.error.svelte-uyexy4 input.jse-navigation-bar-text:where(.svelte-uyexy4) {\n  color: var(--jse-error-color, #ee5341);\n}\n.jse-navigation-bar-path-editor.svelte-uyexy4 .jse-copied-text:where(.svelte-uyexy4) {\n  background: var(--message-success-background, #9ac45d);\n  color: var(--jse-message-success-color, #fff);\n  position: relative;\n  margin: 2px;\n  padding: 0 5px;\n  border-radius: 3px;\n}`);var IDA=FA('<button type=\"button\" class=\"jse-navigation-bar-validation-error svelte-uyexy4\"><!></button>'),dDA=FA('<div class=\"jse-copied-text svelte-uyexy4\">Copied!</div>'),BDA=FA('<div><input type=\"text\" class=\"jse-navigation-bar-text svelte-uyexy4\"/> <!> <!> <button type=\"button\" title=\"Copy selected path to the clipboard\"><!></button></div>');function QDA(t,e){kt(e,!1);var A=CA(),i=cI(\"absolute-popup\"),n=N(e,\"path\",8),o=N(e,\"pathParser\",8),a=N(e,\"onChange\",8),r=N(e,\"onClose\",8),s=N(e,\"onError\",8),g=N(e,\"pathExists\",8),l=CA(),C=CA(),I=CA(!1),d=void 0,B=CA(!1);function Q(){c(l).focus()}function E(j){try{var AA=o().parse(j);return(function(z){if(!g()(z))throw new Error(\"Path does not exist in current document\")})(AA),{path:AA,error:void 0}}catch(z){return{path:void 0,error:z}}}Jr(()=>{Q()}),cl(()=>{clearTimeout(d)}),RA(()=>(_(o()),_(n())),()=>{x(C,o().stringify(n()))}),RA(()=>(c(I),c(C)),()=>{x(A,c(I)?E(c(C)).error:void 0)}),mn(),$t();var f,b=BDA(),R=cA(b);Mo(R,j=>x(l,j),()=>c(l));var M=bA(R,2),v=j=>{var AA=IDA();Pi(cA(AA),{get data(){return v2}}),as(AA,(z,yA)=>sE?.(z,yA),()=>ye({text:String(c(A)||\"\")},i)),lA(j,AA)};YA(M,j=>{c(A)&&j(v)});var F=bA(M,2),G=j=>{lA(j,dDA())};YA(F,j=>{c(B)&&j(G)});var U,Y=bA(F,2);Pi(cA(Y),{get data(){return j0}}),ve(()=>{f=Xt(b,1,\"jse-navigation-bar-path-editor svelte-uyexy4\",null,f,{error:c(A)}),Z1(R,c(C)),U=Xt(Y,1,\"jse-navigation-bar-copy svelte-uyexy4\",null,U,{copied:c(B)})}),ue(\"keydown\",R,aC(function(j){var AA=fC(j);if(AA===\"Escape\"&&(j.preventDefault(),r()()),AA===\"Enter\"){j.preventDefault(),x(I,!0);var z=E(c(C));z.path!==void 0?a()(z.path):s()(z.error)}})),ue(\"input\",R,function(j){x(C,j.currentTarget.value)}),ue(\"click\",Y,function(){lN(c(C)),x(B,!0),d=window.setTimeout(()=>x(B,!1),1e3),Q()}),lA(t,b),St()}Pt(`/* over all fonts, sizes, and colors */\n/* \"consolas\" for Windows, \"menlo\" for Mac with fallback to \"monaco\", 'Ubuntu Mono' for Ubuntu */\n/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */\n/* main, menu, modal */\n/* jsoneditor modal */\n/* tooltip in text mode */\n/* panels: navigation bar, gutter, search box */\n/* navigation-bar */\n/* context menu */\n/* contents: json key and values */\n/* contents: selected or hovered */\n/* contents: section of collapsed items in an array */\n/* contents: highlighting of search matches */\n/* contents: inline tags inside the JSON document */\n/* contents: table */\n/* controls in modals: inputs, buttons, and \\`a\\` */\n/* messages */\n/* svelte-select */\n/* color picker */\n.jse-navigation-bar.svelte-hjhal6 {\n  font-family: var(--jse-font-family-mono, consolas, menlo, monaco, \"Ubuntu Mono\", \"source-code-pro\", monospace);\n  font-size: var(--jse-font-size-mono, 14px);\n  background: var(--jse-panel-background, #ebebeb);\n  color: var(--jse-panel-button-color, inherit);\n  padding: 0;\n  margin: 0;\n  display: flex;\n  overflow: auto;\n  border-left: var(--jse-main-border, 1px solid #d7d7d7);\n  border-right: var(--jse-main-border, 1px solid #d7d7d7);\n}\n.jse-navigation-bar.svelte-hjhal6 .jse-navigation-bar-edit:where(.svelte-hjhal6) {\n  font-family: var(--jse-font-family-mono, consolas, menlo, monaco, \"Ubuntu Mono\", \"source-code-pro\", monospace);\n  font-size: var(--jse-font-size-mono, 14px);\n  padding: calc(0.5 * var(--jse-padding, 10px)) var(--jse-padding, 10px);\n  color: var(--jse-panel-color-readonly, #b2b2b2);\n  background: transparent;\n  border: none;\n  display: flex;\n  cursor: pointer;\n  outline: none;\n  align-items: center;\n}\n.jse-navigation-bar.svelte-hjhal6 .jse-navigation-bar-edit.flex:where(.svelte-hjhal6) {\n  flex: 1;\n}\n.jse-navigation-bar.svelte-hjhal6 .jse-navigation-bar-edit:where(.svelte-hjhal6):focus, .jse-navigation-bar.svelte-hjhal6 .jse-navigation-bar-edit:where(.svelte-hjhal6):hover, .jse-navigation-bar.svelte-hjhal6 .jse-navigation-bar-edit.editing:where(.svelte-hjhal6) {\n  background: var(--jse-panel-button-background-highlight, #e0e0e0);\n  color: var(--panel-button-color-highlight, var(--jse-text-color, #4d4d4d));\n  transition: color 0.2s ease-in, background 0.2s ease-in;\n}\n.jse-navigation-bar.svelte-hjhal6 .jse-navigation-bar-edit:where(.svelte-hjhal6) .jse-navigation-bar-space:where(.svelte-hjhal6) {\n  flex: 1;\n  text-align: left;\n}`);var EDA=FA(\"<!> <!>\",1),hDA=FA('<div class=\"jse-navigation-bar svelte-hjhal6\"><!> <button type=\"button\"><span class=\"jse-navigation-bar-space svelte-hjhal6\"> </span> <!></button></div>');function uDA(t,e){kt(e,!1);var A=CA(void 0,!0),i=CA(void 0,!0),n=qa(\"jsoneditor:NavigationBar\"),o=N(e,\"json\",9),a=N(e,\"selection\",9),r=N(e,\"onSelect\",9),s=N(e,\"onError\",9),g=N(e,\"pathParser\",9),l=CA(void 0,!0),C=CA(!1,!0);function I(AA){n(\"get items for path\",AA);var z=Pe(o(),AA);if(Array.isArray(z))return a8(0,z.length).map(String);if(Qn(z)){var yA=Object.keys(z).slice(0);return yA.sort(SR),yA}return[]}function d(AA){return cr(o(),AA)}function B(AA){n(\"select path\",JSON.stringify(AA)),r()(ns(AA,AA))}function Q(){x(C,!1)}function E(AA){Q(),B(AA)}RA(()=>(_(a()),st),()=>{x(A,a()?st(a()):[])}),RA(()=>(_(o()),c(A)),()=>{x(i,jo(Pe(o(),c(A))))}),RA(()=>c(A),()=>{c(A),setTimeout(()=>{if(c(l)&&c(l).scrollTo){var AA=c(l).scrollWidth-c(l).clientWidth;AA>0&&(n(\"scrollTo \",AA),c(l).scrollTo({left:AA,behavior:\"smooth\"}))}})}),mn(),$t(!0);var f=hDA(),b=cA(f),R=AA=>{var z=EDA(),yA=$e(z);ea(yA,1,()=>c(A),ha,(eA,dA,iA)=>{gZ(eA,{getItems:I,get path(){return c(A)},index:iA,onSelect:B})});var P=bA(yA,2),nA=eA=>{gZ(eA,{getItems:I,get path(){return c(A)},get index(){return c(A),QA(()=>c(A).length)},onSelect:B})};YA(P,eA=>{c(i)&&eA(nA)}),lA(AA,z)},M=AA=>{QDA(AA,{get path(){return c(A)},onClose:Q,onChange:E,get onError(){return s()},pathExists:d,get pathParser(){return g()}})};YA(b,AA=>{c(C)?AA(M,!1):AA(R)});var v,F=bA(b,2),G=cA(F),U=cA(G),Y=bA(G,2),j=et(()=>c(C)?Az:VO);Pi(Y,{get data(){return c(j)}}),Mo(f,AA=>x(l,AA),()=>c(l)),ve(AA=>{v=Xt(F,1,\"jse-navigation-bar-edit svelte-hjhal6\",null,v,{flex:!c(C),editing:c(C)}),fn(F,\"title\",c(C)?\"Cancel editing the selected path\":\"Edit the selected path\"),xt(U,AA)},[()=>(_(jo),_(o()),c(C),QA(()=>jo(o())||c(C)?\"\\xA0\":\"Navigation bar\"))]),ue(\"click\",F,function(){x(C,!c(C))}),lA(t,f),St()}Pt(`/* over all fonts, sizes, and colors */\n/* \"consolas\" for Windows, \"menlo\" for Mac with fallback to \"monaco\", 'Ubuntu Mono' for Ubuntu */\n/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */\n/* main, menu, modal */\n/* jsoneditor modal */\n/* tooltip in text mode */\n/* panels: navigation bar, gutter, search box */\n/* navigation-bar */\n/* context menu */\n/* contents: json key and values */\n/* contents: selected or hovered */\n/* contents: section of collapsed items in an array */\n/* contents: highlighting of search matches */\n/* contents: inline tags inside the JSON document */\n/* contents: table */\n/* controls in modals: inputs, buttons, and \\`a\\` */\n/* messages */\n/* svelte-select */\n/* color picker */\n.jse-search-box.svelte-1x1x8q0 {\n  border: var(--jse-panel-border, var(--jse-main-border, 1px solid #d7d7d7));\n  border-radius: 3px;\n  font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen-Sans, Ubuntu, Cantarell, \"Helvetica Neue\", sans-serif);\n  font-size: var(--jse-font-size, 16px);\n  background: var(--jse-panel-background, #ebebeb);\n  color: var(--jse-panel-color-readonly, #b2b2b2);\n  box-shadow: var(--jse-controls-box-shadow, 0 2px 6px 0 rgba(0, 0, 0, 0.24));\n  display: inline-block;\n  width: 400px;\n  max-width: 100%;\n  overflow: auto;\n}\n.jse-search-box.svelte-1x1x8q0 .jse-search-form:where(.svelte-1x1x8q0) {\n  display: flex;\n  align-items: stretch;\n}\n.jse-search-box.svelte-1x1x8q0 .jse-search-form:where(.svelte-1x1x8q0) button:where(.svelte-1x1x8q0),\n.jse-search-box.svelte-1x1x8q0 .jse-search-form:where(.svelte-1x1x8q0) input:where(.svelte-1x1x8q0) {\n  font-family: inherit;\n  font-size: inherit;\n}\n.jse-search-box.svelte-1x1x8q0 .jse-search-form:where(.svelte-1x1x8q0) button:where(.svelte-1x1x8q0) {\n  display: block;\n  text-align: center;\n  border: none;\n  padding: 0 5px;\n  margin: 0;\n  cursor: pointer;\n  color: var(--jse-panel-button-color, inherit);\n  background: var(--jse-panel-button-background, transparent);\n}\n.jse-search-box.svelte-1x1x8q0 .jse-search-form:where(.svelte-1x1x8q0) button:where(.svelte-1x1x8q0):hover {\n  color: var(--panel-button-color-highlight, var(--jse-text-color, #4d4d4d));\n  background: var(--jse-panel-button-background-highlight, #e0e0e0);\n}\n.jse-search-box.svelte-1x1x8q0 .jse-search-form:where(.svelte-1x1x8q0) input:where(.svelte-1x1x8q0) {\n  color: var(--jse-panel-color, var(--jse-text-color, #4d4d4d));\n  border: var(--jse-input-border, 1px solid #d8dbdf);\n  border-radius: 3px;\n  background: var(--jse-input-background, var(--jse-background-color, #fff));\n  height: 28px;\n  padding: 0 5px;\n  margin: 0;\n  flex: 1;\n  width: 0;\n  min-width: 50px;\n  outline: none;\n}\n.jse-search-box.svelte-1x1x8q0 .jse-search-form:where(.svelte-1x1x8q0) .jse-replace-toggle:where(.svelte-1x1x8q0) {\n  padding: var(--jse-padding, 10px) calc(0.5 * var(--jse-padding, 10px));\n  min-width: 20px;\n  background: var(--jse-panel-button-background-highlight, #e0e0e0);\n}\n.jse-search-box.svelte-1x1x8q0 .jse-search-form:where(.svelte-1x1x8q0) .jse-search-contents:where(.svelte-1x1x8q0) {\n  flex: 1;\n  display: flex;\n  flex-direction: column;\n  padding: calc(0.5 * var(--jse-padding, 10px));\n  gap: calc(0.5 * var(--jse-padding, 10px));\n}\n.jse-search-box.svelte-1x1x8q0 .jse-search-form:where(.svelte-1x1x8q0) .jse-search-contents:where(.svelte-1x1x8q0) .jse-search-section:where(.svelte-1x1x8q0) {\n  flex: 1;\n  display: flex;\n  align-items: center;\n  position: relative;\n}\n.jse-search-box.svelte-1x1x8q0 .jse-search-form:where(.svelte-1x1x8q0) .jse-search-contents:where(.svelte-1x1x8q0) .jse-search-section:where(.svelte-1x1x8q0) .jse-search-icon:where(.svelte-1x1x8q0) {\n  color: inherit;\n  cursor: inherit;\n  background: inherit;\n  width: 32px;\n  text-align: center;\n}\n.jse-search-box.svelte-1x1x8q0 .jse-search-form:where(.svelte-1x1x8q0) .jse-search-contents:where(.svelte-1x1x8q0) .jse-search-section:where(.svelte-1x1x8q0) label.jse-search-input-label:where(.svelte-1x1x8q0) {\n  flex: 1;\n  display: flex;\n}\n.jse-search-box.svelte-1x1x8q0 .jse-search-form:where(.svelte-1x1x8q0) .jse-search-contents:where(.svelte-1x1x8q0) .jse-search-section:where(.svelte-1x1x8q0) .jse-search-count:where(.svelte-1x1x8q0) {\n  color: inherit;\n  font-size: 80%;\n  visibility: hidden;\n  padding: 0 5px;\n  min-width: 36px;\n  text-align: center;\n}\n.jse-search-box.svelte-1x1x8q0 .jse-search-form:where(.svelte-1x1x8q0) .jse-search-contents:where(.svelte-1x1x8q0) .jse-search-section:where(.svelte-1x1x8q0) .jse-search-count.jse-visible:where(.svelte-1x1x8q0) {\n  visibility: visible;\n}\n.jse-search-box.svelte-1x1x8q0 .jse-search-form:where(.svelte-1x1x8q0) .jse-search-contents:where(.svelte-1x1x8q0) .jse-replace-section:where(.svelte-1x1x8q0) {\n  flex: 1;\n  display: flex;\n  padding-left: 32px;\n}\n.jse-search-box.svelte-1x1x8q0 .jse-search-form:where(.svelte-1x1x8q0) .jse-search-contents:where(.svelte-1x1x8q0) .jse-replace-section:where(.svelte-1x1x8q0) button:where(.svelte-1x1x8q0) {\n  width: auto;\n}`);var fDA=FA('<button type=\"button\" class=\"jse-replace-toggle svelte-1x1x8q0\" title=\"Toggle visibility of replace options (Ctrl+H)\"><!></button>'),mDA=FA('<div class=\"jse-replace-section svelte-1x1x8q0\"><input class=\"jse-replace-input svelte-1x1x8q0\" title=\"Enter replacement text\" type=\"text\" placeholder=\"Replace\"/> <button type=\"button\" title=\"Replace current occurrence (Ctrl+Enter)\" class=\"svelte-1x1x8q0\">Replace</button> <button type=\"button\" title=\"Replace all occurrences\" class=\"svelte-1x1x8q0\">All</button></div>'),pDA=FA('<div class=\"jse-search-box svelte-1x1x8q0\"><form class=\"jse-search-form svelte-1x1x8q0\"><!> <div class=\"jse-search-contents svelte-1x1x8q0\"><div class=\"jse-search-section svelte-1x1x8q0\"><div class=\"jse-search-icon svelte-1x1x8q0\"><!></div> <label class=\"jse-search-input-label svelte-1x1x8q0\" about=\"jse-search input\"><input class=\"jse-search-input svelte-1x1x8q0\" title=\"Enter text to search\" type=\"text\" placeholder=\"Find\"/></label> <div> </div> <button type=\"button\" class=\"jse-search-next svelte-1x1x8q0\" title=\"Go to next search result (Enter)\"><!></button> <button type=\"button\" class=\"jse-search-previous svelte-1x1x8q0\" title=\"Go to previous search result (Shift+Enter)\"><!></button> <button type=\"button\" class=\"jse-search-clear svelte-1x1x8q0\" title=\"Close search box (Esc)\"><!></button></div> <!></div></form></div>');function d$(t,e){kt(e,!1);var A=CA(void 0,!0),i=CA(void 0,!0),n=CA(void 0,!0),o=qa(\"jsoneditor:SearchBox\"),a=N(e,\"json\",9),r=N(e,\"documentState\",9),s=N(e,\"parser\",9),g=N(e,\"showSearch\",9),l=N(e,\"showReplace\",13),C=N(e,\"readOnly\",9),I=N(e,\"columns\",9),d=N(e,\"onSearch\",9),B=N(e,\"onFocus\",9),Q=N(e,\"onPatch\",9),E=N(e,\"onClose\",9),f=CA(\"\",!0),b=\"\",R=CA(\"\",!0),M=CA(!1,!0),v=CA(void 0,!0),F=PB(function(MA){return KA.apply(this,arguments)},300),G=PB(function(MA){return ze.apply(this,arguments)},300);function U(){l(!l()&&!C())}function Y(MA){MA.stopPropagation();var be=fC(MA);be===\"Enter\"&&(MA.preventDefault(),c(f)!==b?F.flush():iA()),be===\"Shift+Enter\"&&(MA.preventDefault(),hA()),be===\"Ctrl+Enter\"&&(MA.preventDefault(),l()?yA():iA()),be===\"Ctrl+H\"&&(MA.preventDefault(),U()),be===\"Escape\"&&(MA.preventDefault(),uA())}function j(MA){fC(MA)===\"Enter\"&&(MA.preventDefault(),MA.stopPropagation(),yA())}function AA(){return z.apply(this,arguments)}function z(){return(z=Ut(function*(){uo(),yield F.flush()})).apply(this,arguments)}function yA(){return P.apply(this,arguments)}function P(){return(P=Ut(function*(){var MA;if(!C()){var be=(MA=c(v))===null||MA===void 0?void 0:MA.activeItem;if(o(\"handleReplace\",{replaceText:c(R),activeItem:be}),c(v)&&be&&a()!==void 0){x(v,ye(ye({},OW(c(v))),{},{activeIndex:c(i)}));var{operations:_A,newSelection:pA}=Y6A(a(),r(),c(R),be,s());Q()(_A,(Rt,Et)=>({state:Et,selection:pA})),uo(),yield G.flush(),yield ee()}}})).apply(this,arguments)}function nA(){return eA.apply(this,arguments)}function eA(){return(eA=Ut(function*(){if(!C()){o(\"handleReplaceAll\",{text:c(f),replaceText:c(R)});var{operations:MA,newSelection:be}=(function(_A,pA,Rt,Et,Qe){for(var _t=zW(Rt,_A,{maxResults:1/0}),Ue=[],Te=0;Te<_t.length;Te++){var ht=_t[Te-1],Me=_t[Te];Te!==0&&Me.field===ht.field&&di(Me.path,ht.path)?fi(Ue).items.push(Me):Ue.push({path:Me.path,field:Me.field,items:[Me]})}Ue.sort((O,tA)=>O.field!==tA.field?O.field===nc.key?1:-1:tA.path.length-O.path.length);var Ai,J=[];return Ue.forEach(O=>{var{field:tA,path:oA,items:NA}=O;if(tA===nc.key){var de=Li(oA),Ee=Pe(_A,de),xA=fi(oA),LA=wu(de,Object.keys(Ee),xA,jW(xA,Et,NA));J=J.concat(LA),Ai=rE(_A,LA)}else{if(tA!==nc.value)throw new Error(\"Cannot replace: unknown type of search result field \".concat(tA));var dt=Pe(_A,oA);if(dt===void 0)throw new Error(\"Cannot replace: path not found \".concat(pt(oA)));var At=typeof dt==\"string\"?dt:String(dt),Je=g0(_A,pA,oA),Ge=jW(At,Et,NA),ri=[{op:\"replace\",path:pt(oA),value:Je?Ge:EE(Ge,Qe)}];J=J.concat(ri),Ai=rE(_A,ri)}}),{operations:J,newSelection:Ai}})(a(),r(),c(f),c(R),s());Q()(MA,(_A,pA)=>({state:pA,selection:be})),yield ee()}})).apply(this,arguments)}function dA(MA){MA.select()}function iA(){return aA.apply(this,arguments)}function aA(){return(aA=Ut(function*(){x(v,c(v)?OW(c(v)):void 0),yield ee()})).apply(this,arguments)}function hA(){return JA.apply(this,arguments)}function JA(){return JA=Ut(function*(){x(v,c(v)?(function(MA){var be=MA.activeIndex>0?MA.activeIndex-1:MA.items.length-1,_A=MA.items[be],pA=MA.items.map((Rt,Et)=>ye(ye({},Rt),{},{active:Et===be}));return ye(ye({},MA),{},{items:pA,activeItem:_A,activeIndex:be})})(c(v)):void 0),yield ee()}),JA.apply(this,arguments)}function ee(){return UA.apply(this,arguments)}function UA(){return(UA=Ut(function*(){var MA;o(\"handleFocus\",c(v));var be=(MA=c(v))===null||MA===void 0?void 0:MA.activeItem;be&&a()!==void 0&&(yield B()(be.path,be.resultIndex))})).apply(this,arguments)}function mA(){return mA=Ut(function*(MA){yield Ke(MA,c(f),a())}),mA.apply(this,arguments)}function KA(){return KA=Ut(function*(MA){yield Ke(g(),MA,a()),yield ee()}),KA.apply(this,arguments)}function ze(){return ze=Ut(function*(MA){yield Ke(g(),c(f),MA)}),ze.apply(this,arguments)}function Ke(MA,be,_A){return HA.apply(this,arguments)}function HA(){return HA=Ut(function*(MA,be,_A){return MA?(o(\"applySearch\",{showSearch:MA,text:be}),be===\"\"?(o(\"clearing search result\"),c(v)!==void 0&&x(v,void 0),Promise.resolve()):(b=be,x(M,!0),new Promise(pA=>{setTimeout(()=>{var Rt=zW(be,_A,{maxResults:Hx,columns:I()});x(v,(function(Et,Qe){var _t=Qe!=null&&Qe.activeItem?qW(Qe.activeItem):void 0,Ue=Et.findIndex(Me=>di(_t,qW(Me))),Te=Ue!==-1?Ue:Qe?.activeIndex!==void 0&&Qe?.activeIndex<Et.length?Qe?.activeIndex:Et.length>0?0:-1,ht=Et.map((Me,Ai)=>ye(ye({resultIndex:Ai},Me),{},{active:Ai===Te}));return{items:ht,activeItem:ht[Te],activeIndex:Te}})(Rt,c(v))),x(M,!1),pA()})}))):(c(v)&&x(v,void 0),Promise.resolve())}),HA.apply(this,arguments)}function uA(){o(\"handleClose\"),F.cancel(),G.cancel(),Ke(!1,c(f),a()),E()()}RA(()=>c(v),()=>{var MA;x(A,((MA=c(v))===null||MA===void 0||(MA=MA.items)===null||MA===void 0?void 0:MA.length)||0)}),RA(()=>c(v),()=>{var MA;x(i,((MA=c(v))===null||MA===void 0?void 0:MA.activeIndex)||0)}),RA(()=>(c(A),Hx),()=>{x(n,c(A)>=Hx?\"\".concat(999,\"+\"):String(c(A)))}),RA(()=>(_(d()),c(v)),()=>{d()(c(v))}),RA(()=>_(g()),()=>{(function(MA){mA.apply(this,arguments)})(g())}),RA(()=>c(f),()=>{F(c(f))}),RA(()=>_(a()),()=>{G(a())}),mn(),$t(!0);var XA=yi(),EA=$e(XA),ZA=MA=>{var be=pDA(),_A=cA(be),pA=cA(_A),Rt=xA=>{var LA=fDA(),dt=cA(LA),At=et(()=>l()?qc:qB);Pi(dt,{get data(){return c(At)}}),ue(\"click\",LA,U),lA(xA,LA)};YA(pA,xA=>{C()||xA(Rt)});var Et=cA(bA(pA,2)),Qe=cA(Et),_t=cA(Qe),Ue=xA=>{Pi(xA,{get data(){return qO},spin:!0})},Te=xA=>{Pi(xA,{get data(){return P4}})};YA(_t,xA=>{c(M)?xA(Ue):xA(Te,!1)});var ht=bA(Qe,2),Me=cA(ht);Er(()=>xD(Me,()=>c(f),xA=>x(f,xA))),as(Me,xA=>dA?.(xA)),Er(()=>ue(\"paste\",Me,AA));var Ai,J=bA(ht,2),O=cA(J),tA=bA(J,2);Pi(cA(tA),{get data(){return ez}});var oA=bA(tA,2);Pi(cA(oA),{get data(){return jO}});var NA=bA(oA,2);Pi(cA(NA),{get data(){return q4}});var de=bA(Et,2),Ee=xA=>{var LA=mDA(),dt=cA(LA),At=bA(dt,2),Je=bA(At,2);xD(dt,()=>c(R),Ge=>x(R,Ge)),ue(\"keydown\",dt,j),ue(\"click\",At,yA),ue(\"click\",Je,nA),lA(xA,LA)};YA(de,xA=>{l()&&!C()&&xA(Ee)}),ve(()=>{var xA;Ai=Xt(J,1,\"jse-search-count svelte-1x1x8q0\",null,Ai,{\"jse-visible\":c(f)!==\"\"}),xt(O,\"\".concat(c(i)!==-1&&c(i)<c(A)?\"\".concat(c(i)+1,\"/\"):\"\").concat((xA=c(n))!==null&&xA!==void 0?xA:\"\"))}),ue(\"click\",tA,iA),ue(\"click\",oA,hA),ue(\"click\",NA,uA),ue(\"keydown\",_A,Y),lA(MA,be)};YA(EA,MA=>{g()&&MA(ZA)}),lA(t,XA),St()}var Cu=Symbol(\"path\");function DDA(t,e){var A=arguments.length>2&&arguments[2]!==void 0?arguments[2]:1/0,i={};Array.isArray(t)&&(function(o,a,r){if(o.length<a)o.forEach(r);else for(var s=a>1?(o.length-1)/(a-1):o.length,g=0;g<a;g++){var l=Math.floor(g*s);r(o[l],l,o)}})(t,A,o=>{Qn(o)?B$(o,i,e):i[Cu]=!0});var n=[];return Cu in i&&n.push([]),Q$(i,[],n,e),n}function B$(t,e,A){for(var i in t){var n=t[i],o=e[i]||(e[i]={});Qn(n)&&A?B$(n,o,A):o[Cu]===void 0&&(o[Cu]=!0)}}function Q$(t,e,A,i){for(var n in t){var o=e.concat(n),a=t[n];a&&a[Cu]===!0&&A.push(o),Oo(a)&&i&&Q$(a,o,A,i)}}function wDA(t,e,A,i,n,o){for(var a=arguments.length>6&&arguments[6]!==void 0?arguments[6]:80,r=Lo(A)?A.length:0,s=(function(b,R){var M=Object.values(b);if(zi(M))return R;var v=(F,G)=>F+G;return M.reduce(v)/M.length})(i,n),g=t-a,l=e+2*a,C=b=>i[b]||n,I=0,d=o;d<g&&I<r;)d+=C(I),I++;I>0&&(d-=C(--I));for(var B=I,Q=0;Q<l&&B<r;)Q+=C(B),B++;for(var E=0,f=B;f<r;f++)E+=C(f);return{startIndex:I,endIndex:B,startHeight:d,endHeight:E,averageItemHeight:s,visibleHeight:Q,visibleItems:Lo(A)?A.slice(I,B):[]}}function lZ(t,e,A,i){for(var{rowIndex:n}=nl(t,e),o=0,a=0;a<n;a++)o+=A[a]||i;return o}function nl(t,e){var[A,...i]=t,n=parseInt(A,10);return{rowIndex:isNaN(n)?-1:n,columnIndex:e.findIndex(o=>I0(i,o))}}function L1(t,e){var{rowIndex:A,columnIndex:i}=t;return[String(A),...e[i]]}function yDA(t,e){var[A,i]=AM(t,a=>TR(a.path[0])),n=X9(A,vDA),o=$9(n,a=>{var r={row:[],columns:{}};return a.forEach(s=>{var g=(function(l,C){var I=nl(l.path,C);return I.columnIndex!==-1?I.columnIndex:-1})(s,e);g!==-1?(r.columns[g]===void 0&&(r.columns[g]=[]),r.columns[g].push(s)):r.row.push(s)}),r});return{root:i,rows:o}}function FQ(t,e){if(e&&e.length!==0)return e.length===1?e[0]:{path:t,message:\"Multiple validation issues: \"+e.map(A=>$s(A.path)+\" \"+A.message).join(\", \"),severity:ic.warning}}function vDA(t){return parseInt(t.path[0],10)}function bDA(t,e,A){var i=e.some(n=>(function(o,a,r){if(!o)return!1;if(a.op===\"replace\"){var s=As(a.path),{rowIndex:g,columnIndex:l}=nl(s,r),C=r.findIndex(I=>di(I,o.path));if(g!==-1&&l!==-1&&l!==C)return!1}return!0})(t,n,A));return i?void 0:t}var os=qa(\"jsoneditor:actions\");function E$(t){return xR.apply(this,arguments)}function xR(){return xR=Ut(function*(t){var{json:e,selection:A,indentation:i,readOnly:n,parser:o,onPatch:a}=t;if(!n&&e!==void 0&&A&&HQ(A)){var r=UX(e,A,i,o);if(r!==void 0){os(\"cut\",{selection:A,clipboard:r,indentation:i}),yield lN(r);var{operations:s,newSelection:g}=zX(e,A);a(s,(l,C)=>({state:C,selection:g}))}}}),xR.apply(this,arguments)}function h$(t){return RR.apply(this,arguments)}function RR(){return RR=Ut(function*(t){var{json:e,selection:A,indentation:i,parser:n}=t,o=UX(e,A,i,n);o!==void 0&&(os(\"copy\",{clipboard:o,indentation:i}),yield lN(o))}),RR.apply(this,arguments)}function u$(t){var{clipboardText:e,json:A,selection:i,readOnly:n,parser:o,onPatch:a,onChangeText:r,onPasteMultilineText:s,openRepairModal:g}=t;if(!n)try{l(e)}catch(C){g(e,I=>{os(\"repaired pasted text: \",I),l(I)})}function l(C){if(A!==void 0){var I=i||_i([]),d=OX(A,I,C,o),B=(function(Q,E,f){var b=arguments.length>3&&arguments[3]!==void 0?arguments[3]:N6A;if(Q.length>b)return!1;var R=/\\n/.test(Q);if(!R)return!1;var M=E.some(F=>F.op===\"replace\"&&Array.isArray(F.value)),v=E.filter(F=>F.op===\"add\").length>1;if(!M&&!v)return!1;try{return fu(Q,f.parse),!1}catch(F){return!0}})(e,d,o);os(\"paste\",{pastedText:C,operations:d,ensureSelection:I,pasteMultilineText:B}),a(d,(Q,E)=>{var f=E;return d.filter(b=>(b9(b)||m6(b))&&jo(b.value)).forEach(b=>{var R=Ys(A,b.path);f=$1(Q,f,R)}),{state:f}}),B&&s(C)}else os(\"paste text\",{pastedText:C}),r(e,(Q,E)=>{if(Q)return{state:$1(Q,E,[])}})}}function f$(t){var{json:e,text:A,selection:i,keepSelection:n,readOnly:o,onChange:a,onPatch:r}=t;if(!o&&i){var s=e!==void 0&&(ja(i)||an(i))?ns(i.path,i.path):i;if(zi(st(i)))os(\"remove root\",{selection:i}),a&&a({text:\"\",json:void 0},e!==void 0?{text:void 0,json:e}:{text:A||\"\",json:e},{contentErrors:void 0,patchResult:void 0});else if(e!==void 0){var{operations:g,newSelection:l}=zX(e,s);os(\"remove\",{operations:g,selection:i,newSelection:l}),r(g,(C,I)=>({state:I,selection:n?i:l}))}}}function jD(t){var{insertType:e,selectInside:A,initialValue:i,json:n,selection:o,readOnly:a,parser:r,onPatch:s,onReplaceJson:g}=t;if(!a){var l=(function(Q,E,f){if(f===\"object\")return{};if(f===\"array\")return[];if(f===\"structure\"&&Q!==void 0){var b=E?GX(E):[],R=Pe(Q,b);if(Array.isArray(R)&&!zi(R)){var M=Wg(R);return jo(M)?q9(M,v=>Array.isArray(v)?[]:Qn(v)?void 0:\"\"):\"\"}}return\"\"})(n,o,e);if(n!==void 0){var C=r.stringify(l),I=OX(n,o,C,r);os(\"onInsert\",{insertType:e,operations:I,newValue:l,data:C});var d=fi(I.filter(Q=>Q.op===\"add\"||Q.op===\"replace\"));s(I,(Q,E,f)=>{if(d){var b=Ys(Q,d.path);if(jo(l))return{state:ec(Q,E,b,nN),selection:A?pC(b):f};if(l===\"\"){var R=zi(b)?void 0:Pe(Q,Li(b));return{state:ec(Q,E,b,wD),selection:Qn(R)?oN(b,i):GD(b,i)}}}}),os(\"after patch\")}else{os(\"onInsert\",{insertType:e,newValue:l});var B=[];g(l,(Q,E)=>({state:$1(Q,E,B),selection:jo(l)?pC(B):GD(B)}))}}}function m$(t){return NR.apply(this,arguments)}function NR(){return NR=Ut(function*(t){var{char:e,selectInside:A,json:i,selection:n,readOnly:o,parser:a,onPatch:r,onReplaceJson:s,onSelect:g}=t;o||(ja(n)?g(ye(ye({},n),{},{edit:!0,initialValue:e})):e===\"{\"?jD({insertType:\"object\",selectInside:A,initialValue:void 0,json:i,selection:n,readOnly:o,parser:a,onPatch:r,onReplaceJson:s}):e===\"[\"?jD({insertType:\"array\",selectInside:A,initialValue:void 0,json:i,selection:n,readOnly:o,parser:a,onPatch:r,onReplaceJson:s}):an(n)&&i!==void 0?jo(Pe(i,n.path))||g(ye(ye({},n),{},{edit:!0,initialValue:e})):(os(\"onInsertValueWithCharacter\",{char:e}),yield(function(l){return FR.apply(this,arguments)})({char:e,json:i,selection:n,readOnly:o,parser:a,onPatch:r,onReplaceJson:s})))}),NR.apply(this,arguments)}function FR(){return FR=Ut(function*(t){var{char:e,json:A,selection:i,readOnly:n,parser:o,onPatch:a,onReplaceJson:r}=t;n||jD({insertType:\"value\",selectInside:!1,initialValue:e,json:A,selection:i,readOnly:n,parser:o,onPatch:a,onReplaceJson:r})}),FR.apply(this,arguments)}Pt(`/* over all fonts, sizes, and colors */\n/* \"consolas\" for Windows, \"menlo\" for Mac with fallback to \"monaco\", 'Ubuntu Mono' for Ubuntu */\n/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */\n/* main, menu, modal */\n/* jsoneditor modal */\n/* tooltip in text mode */\n/* panels: navigation bar, gutter, search box */\n/* navigation-bar */\n/* context menu */\n/* contents: json key and values */\n/* contents: selected or hovered */\n/* contents: section of collapsed items in an array */\n/* contents: highlighting of search matches */\n/* contents: inline tags inside the JSON document */\n/* contents: table */\n/* controls in modals: inputs, buttons, and \\`a\\` */\n/* messages */\n/* svelte-select */\n/* color picker */\n.jse-json-preview.svelte-25xmyd {\n  flex: 1;\n  font-family: var(--jse-font-family-mono, consolas, menlo, monaco, \"Ubuntu Mono\", \"source-code-pro\", monospace);\n  font-size: var(--jse-font-size-mono, 14px);\n  color: var(--jse-panel-color-readonly, #b2b2b2);\n  overflow: auto;\n  white-space: pre-wrap;\n  padding: 2px;\n  border-left: var(--jse-main-border, 1px solid #d7d7d7);\n  border-right: var(--jse-main-border, 1px solid #d7d7d7);\n  border-bottom: var(--jse-main-border, 1px solid #d7d7d7);\n}`);var MDA=FA('<div class=\"jse-json-preview svelte-25xmyd\"> </div>');function p$(t,e){kt(e,!1);var A=CA(),i=CA(),n=N(e,\"text\",8),o=N(e,\"json\",8),a=N(e,\"indentation\",8),r=N(e,\"parser\",8);RA(()=>(_(o()),_(n())),()=>{x(A,o()!==void 0?{json:o()}:{text:n()||\"\"})}),RA(()=>(c(A),_(a()),_(r()),ND),()=>{x(i,gC(BR(c(A),a(),r()),ND))}),mn(),$t();var s=MDA(),g=cA(s);ve(()=>xt(g,c(i))),lA(t,s),St()}Pt(`/* over all fonts, sizes, and colors */\n/* \"consolas\" for Windows, \"menlo\" for Mac with fallback to \"monaco\", 'Ubuntu Mono' for Ubuntu */\n/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */\n/* main, menu, modal */\n/* jsoneditor modal */\n/* tooltip in text mode */\n/* panels: navigation bar, gutter, search box */\n/* navigation-bar */\n/* context menu */\n/* contents: json key and values */\n/* contents: selected or hovered */\n/* contents: section of collapsed items in an array */\n/* contents: highlighting of search matches */\n/* contents: inline tags inside the JSON document */\n/* contents: table */\n/* controls in modals: inputs, buttons, and \\`a\\` */\n/* messages */\n/* svelte-select */\n/* color picker */\nbutton.jse-context-menu-button.svelte-16jz6ui {\n  border: none;\n  background: transparent;\n  color: inherit;\n  cursor: pointer;\n  font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen-Sans, Ubuntu, Cantarell, \"Helvetica Neue\", sans-serif);\n  font-size: var(--jse-font-size, 16px);\n  padding: 5px;\n  margin: 0;\n  flex: 1;\n  white-space: nowrap;\n  padding: var(--jse-padding, 10px);\n  color: inherit;\n}\nbutton.jse-context-menu-button.svelte-16jz6ui:hover {\n  background: var(--jse-context-menu-background-highlight, #7a7a7a);\n}\nbutton.jse-context-menu-button.svelte-16jz6ui:focus {\n  background: var(--jse-context-menu-background-highlight, #7a7a7a);\n  z-index: 1;\n}\nbutton.jse-context-menu-button.svelte-16jz6ui:disabled {\n  color: var(--jse-context-menu-color-disabled, #9d9d9d);\n  background: unset;\n}\nbutton.jse-context-menu-button.left.svelte-16jz6ui {\n  text-align: left;\n}\nbutton.jse-context-menu-button.svelte-16jz6ui svg {\n  width: 16px;\n}`);var kDA=FA('<button type=\"button\"><!> <!></button>');function eR(t,e){kt(e,!1);var A=N(e,\"item\",8),i=N(e,\"className\",8,void 0),n=N(e,\"onRequestClose\",8);$t();var o=kDA(),a=cA(o),r=l=>{Pi(l,{get data(){return _(A()),QA(()=>A().icon)}})};YA(a,l=>{_(A()),QA(()=>A().icon)&&l(r)});var s=bA(a,2),g=l=>{var C=tr();ve(()=>xt(C,(_(A()),QA(()=>A().text)))),lA(l,C)};YA(s,l=>{_(A()),QA(()=>A().text)&&l(g)}),ve(l=>{Xt(o,1,l,\"svelte-16jz6ui\"),fn(o,\"title\",(_(A()),QA(()=>A().title))),o.disabled=(_(A()),QA(()=>A().disabled||!1))},[()=>sI((_(gc),_(i()),_(A()),QA(()=>gc(\"jse-context-menu-button\",i(),A().className))))]),ue(\"click\",o,l=>{n()(),A().onClick(l)}),lA(t,o),St()}Pt(`/* over all fonts, sizes, and colors */\n/* \"consolas\" for Windows, \"menlo\" for Mac with fallback to \"monaco\", 'Ubuntu Mono' for Ubuntu */\n/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */\n/* main, menu, modal */\n/* jsoneditor modal */\n/* tooltip in text mode */\n/* panels: navigation bar, gutter, search box */\n/* navigation-bar */\n/* context menu */\n/* contents: json key and values */\n/* contents: selected or hovered */\n/* contents: section of collapsed items in an array */\n/* contents: highlighting of search matches */\n/* contents: inline tags inside the JSON document */\n/* contents: table */\n/* controls in modals: inputs, buttons, and \\`a\\` */\n/* messages */\n/* svelte-select */\n/* color picker */\n.jse-dropdown-button.svelte-bov1j6 {\n  flex: 1;\n  line-height: normal;\n  border: none;\n  background: transparent;\n  color: inherit;\n  cursor: pointer;\n  font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen-Sans, Ubuntu, Cantarell, \"Helvetica Neue\", sans-serif);\n  font-size: var(--jse-font-size, 16px);\n  padding: 5px;\n  margin: 0;\n  position: relative;\n  padding: 0;\n  display: flex;\n}\n.jse-dropdown-button.svelte-bov1j6 ul:where(.svelte-bov1j6) {\n  margin: 0;\n  padding: 0;\n}\n.jse-dropdown-button.svelte-bov1j6 ul:where(.svelte-bov1j6) li:where(.svelte-bov1j6) {\n  margin: 0;\n  padding: 0;\n  list-style-type: none;\n}\n.jse-dropdown-button.svelte-bov1j6 button.jse-open-dropdown:where(.svelte-bov1j6) {\n  border: none;\n  background: transparent;\n  color: inherit;\n  cursor: pointer;\n  font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen-Sans, Ubuntu, Cantarell, \"Helvetica Neue\", sans-serif);\n  font-size: var(--jse-font-size, 16px);\n  padding: 5px;\n  margin: 0;\n  width: 2em;\n  background: var(--jse-context-menu-background, #656565);\n  color: var(--jse-context-menu-color, var(--jse-text-color-inverse, #fff));\n  border-radius: 0;\n}\n.jse-dropdown-button.svelte-bov1j6 button.jse-open-dropdown.jse-visible:where(.svelte-bov1j6) {\n  background: var(--jse-context-menu-background, #656565);\n}\n.jse-dropdown-button.svelte-bov1j6 button.jse-open-dropdown:where(.svelte-bov1j6):hover {\n  background: var(--jse-context-menu-background-highlight, #7a7a7a);\n}\n.jse-dropdown-button.svelte-bov1j6 button.jse-open-dropdown:where(.svelte-bov1j6):focus {\n  z-index: 1;\n}\n.jse-dropdown-button.svelte-bov1j6 button.jse-open-dropdown:where(.svelte-bov1j6):disabled {\n  color: var(--jse-context-menu-color-disabled, #9d9d9d);\n  background: unset;\n}\n.jse-dropdown-button.svelte-bov1j6 .jse-dropdown-items:where(.svelte-bov1j6) {\n  display: none;\n  position: absolute;\n  top: 100%;\n  left: 0;\n  z-index: 1;\n  background: var(--jse-context-menu-background, #656565);\n  color: var(--jse-context-menu-color, var(--jse-text-color-inverse, #fff));\n  box-shadow: var(--jse-controls-box-shadow, 0 2px 6px 0 rgba(0, 0, 0, 0.24));\n}\n.jse-dropdown-button.svelte-bov1j6 .jse-dropdown-items.jse-visible:where(.svelte-bov1j6) {\n  display: block;\n}\n.jse-dropdown-button.svelte-bov1j6 .jse-dropdown-items:where(.svelte-bov1j6) button:where(.svelte-bov1j6) {\n  border: none;\n  background: transparent;\n  color: inherit;\n  cursor: pointer;\n  font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen-Sans, Ubuntu, Cantarell, \"Helvetica Neue\", sans-serif);\n  font-size: var(--jse-font-size, 16px);\n  padding: 5px;\n  margin: 0;\n  width: 100%;\n  text-align: left;\n  padding: var(--jse-padding, 10px);\n  margin: 0;\n}\n.jse-dropdown-button.svelte-bov1j6 .jse-dropdown-items:where(.svelte-bov1j6) button:where(.svelte-bov1j6):hover {\n  background: var(--jse-context-menu-background-highlight, #7a7a7a);\n}\n.jse-dropdown-button.svelte-bov1j6 .jse-dropdown-items:where(.svelte-bov1j6) button:where(.svelte-bov1j6):disabled {\n  color: var(--jse-context-menu-color-disabled, #9d9d9d);\n  background: unset;\n}`);var SDA=FA('<li class=\"svelte-bov1j6\"><button type=\"button\"><!> </button></li>'),xDA=FA('<div role=\"button\" tabindex=\"0\" class=\"jse-dropdown-button svelte-bov1j6\"><!> <button type=\"button\" data-type=\"jse-open-dropdown\"><!></button> <div><ul class=\"svelte-bov1j6\"></ul></div></div>');Pt(`/* over all fonts, sizes, and colors */\n/* \"consolas\" for Windows, \"menlo\" for Mac with fallback to \"monaco\", 'Ubuntu Mono' for Ubuntu */\n/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */\n/* main, menu, modal */\n/* jsoneditor modal */\n/* tooltip in text mode */\n/* panels: navigation bar, gutter, search box */\n/* navigation-bar */\n/* context menu */\n/* contents: json key and values */\n/* contents: selected or hovered */\n/* contents: section of collapsed items in an array */\n/* contents: highlighting of search matches */\n/* contents: inline tags inside the JSON document */\n/* contents: table */\n/* controls in modals: inputs, buttons, and \\`a\\` */\n/* messages */\n/* svelte-select */\n/* color picker */\nbutton.jse-context-menu-button.svelte-1y5l9l1 {\n  border: none;\n  background: transparent;\n  color: inherit;\n  cursor: pointer;\n  font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen-Sans, Ubuntu, Cantarell, \"Helvetica Neue\", sans-serif);\n  font-size: var(--jse-font-size, 16px);\n  padding: 5px;\n  margin: 0;\n  flex: 1;\n  white-space: nowrap;\n  padding: var(--jse-padding, 10px);\n  color: inherit;\n}\nbutton.jse-context-menu-button.svelte-1y5l9l1:hover {\n  background: var(--jse-context-menu-background-highlight, #7a7a7a);\n}\nbutton.jse-context-menu-button.svelte-1y5l9l1:focus {\n  background: var(--jse-context-menu-background-highlight, #7a7a7a);\n  z-index: 1;\n}\nbutton.jse-context-menu-button.svelte-1y5l9l1:disabled {\n  color: var(--jse-context-menu-color-disabled, #9d9d9d);\n  background: unset;\n}\nbutton.jse-context-menu-button.left.svelte-1y5l9l1 {\n  text-align: left;\n}\nbutton.jse-context-menu-button.svelte-1y5l9l1 svg {\n  width: 16px;\n}`);var RDA=FA('<button type=\"button\" slot=\"defaultItem\"><!> </button>');function tR(t,e){kt(e,!1);var A=CA(),i=N(e,\"item\",8),n=N(e,\"className\",8,void 0),o=N(e,\"onRequestClose\",8);RA(()=>(_(i()),_(o())),()=>{x(A,i().items.map(a=>ye(ye({},a),{},{onClick:r=>{o()(),a.onClick(r)}})))}),mn(),$t(),(function(a,r){kt(r,!1);var s=CA(void 0,!0),g=N(r,\"items\",25,()=>[]),l=N(r,\"title\",9,void 0),C=N(r,\"width\",9,\"120px\"),I=CA(!1,!0);function d(){x(I,!1)}function B(v){fC(v)===\"Escape\"&&(v.preventDefault(),x(I,!1))}Jr(()=>{document.addEventListener(\"click\",d),document.addEventListener(\"keydown\",B)}),cl(()=>{document.removeEventListener(\"click\",d),document.removeEventListener(\"keydown\",B)}),RA(()=>_(g()),()=>{x(s,g().every(v=>v.disabled===!0))}),mn(),$t(!0);var Q=xDA(),E=cA(Q);Aa(E,r,\"defaultItem\",{},null);var f,b=bA(E,2);Pi(cA(b),{get data(){return qc}});var R,M=bA(b,2);ea(cA(M),5,g,ha,(v,F)=>{var G=SDA(),U=cA(G),Y=cA(U),j=z=>{Pi(z,{get data(){return c(F),QA(()=>c(F).icon)}})};YA(Y,z=>{c(F),QA(()=>c(F).icon)&&z(j)});var AA=bA(Y);ve(()=>{var z;fn(U,\"title\",(c(F),QA(()=>c(F).title))),U.disabled=(c(F),QA(()=>c(F).disabled)),Xt(U,1,sI((c(F),QA(()=>c(F).className))),\"svelte-bov1j6\"),xt(AA,\" \".concat((c(F),(z=QA(()=>c(F).text))!==null&&z!==void 0?z:\"\")))}),ue(\"click\",U,z=>c(F).onClick(z)),lA(v,G)}),ve(()=>{var v;fn(Q,\"title\",l()),f=Xt(b,1,\"jse-open-dropdown svelte-bov1j6\",null,f,{\"jse-visible\":c(I)}),b.disabled=c(s),R=Xt(M,1,\"jse-dropdown-items svelte-bov1j6\",null,R,{\"jse-visible\":c(I)}),gl(M,\"width: \".concat((v=C())!==null&&v!==void 0?v:\"\",\";\"))}),ue(\"click\",b,function(){var v=c(I);setTimeout(()=>x(I,!v))}),ue(\"click\",Q,d),lA(a,Q),St()})(t,{get width(){return _(i()),QA(()=>i().width)},get items(){return c(A)},$$slots:{defaultItem:(a,r)=>{var s=RDA(),g=cA(s),l=I=>{Pi(I,{get data(){return _(i()),QA(()=>i().main.icon)}})};YA(g,I=>{_(i()),QA(()=>i().main.icon)&&I(l)});var C=bA(g);ve(I=>{var d;Xt(s,1,I,\"svelte-1y5l9l1\"),fn(s,\"title\",(_(i()),QA(()=>i().main.title))),s.disabled=(_(i()),QA(()=>i().main.disabled||!1)),xt(C,\" \".concat((_(i()),(d=QA(()=>i().main.text))!==null&&d!==void 0?d:\"\")))},[()=>sI((_(gc),_(n()),_(i()),QA(()=>gc(\"jse-context-menu-button\",n(),i().main.className))))]),ue(\"click\",s,I=>{o()(),i().main.onClick(I)}),lA(a,s)}}}),St()}Pt(`/* over all fonts, sizes, and colors */\n/* \"consolas\" for Windows, \"menlo\" for Mac with fallback to \"monaco\", 'Ubuntu Mono' for Ubuntu */\n/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */\n/* main, menu, modal */\n/* jsoneditor modal */\n/* tooltip in text mode */\n/* panels: navigation bar, gutter, search box */\n/* navigation-bar */\n/* context menu */\n/* contents: json key and values */\n/* contents: selected or hovered */\n/* contents: section of collapsed items in an array */\n/* contents: highlighting of search matches */\n/* contents: inline tags inside the JSON document */\n/* contents: table */\n/* controls in modals: inputs, buttons, and \\`a\\` */\n/* messages */\n/* svelte-select */\n/* color picker */\n.jse-contextmenu.svelte-1shjn02 {\n  box-shadow: var(--jse-controls-box-shadow, 0 2px 6px 0 rgba(0, 0, 0, 0.24));\n  font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen-Sans, Ubuntu, Cantarell, \"Helvetica Neue\", sans-serif);\n  font-size: var(--jse-font-size, 16px);\n  background: var(--jse-context-menu-background, #656565);\n  color: var(--jse-context-menu-color, var(--jse-text-color-inverse, #fff));\n}\n.jse-contextmenu.svelte-1shjn02 .jse-row:where(.svelte-1shjn02) {\n  display: flex;\n  flex-direction: row;\n  align-items: flex-start;\n  justify-content: stretch;\n}\n.jse-contextmenu.svelte-1shjn02 .jse-row:where(.svelte-1shjn02) div.jse-label:where(.svelte-1shjn02) {\n  flex: 1;\n  white-space: nowrap;\n  padding: var(--jse-padding, 10px);\n  color: var(--jse-context-menu-color-disabled, #9d9d9d);\n  line-height: normal;\n}\n.jse-contextmenu.svelte-1shjn02 .jse-row:where(.svelte-1shjn02) div.jse-tip:where(.svelte-1shjn02) {\n  flex: 1;\n  background: var(--jse-context-menu-tip-background, rgba(255, 255, 255, 0.2));\n  color: var(--context-menu-tip-color, inherit);\n  margin: calc(0.5 * var(--jse-padding, 10px));\n  padding: calc(0.5 * var(--jse-padding, 10px)) var(--jse-padding, 10px);\n  font-size: 80%;\n  line-height: 1.3em;\n  display: flex;\n  flex-direction: row;\n  align-items: flex-start;\n  gap: var(--jse-padding, 10px);\n  border-radius: 3px;\n}\n.jse-contextmenu.svelte-1shjn02 .jse-row:where(.svelte-1shjn02) div.jse-tip:where(.svelte-1shjn02) div.jse-tip-icon:where(.svelte-1shjn02) {\n  padding-top: calc(0.5 * var(--jse-padding, 10px));\n}\n.jse-contextmenu.svelte-1shjn02 .jse-column:where(.svelte-1shjn02) {\n  flex: 1;\n  display: flex;\n  flex-direction: column;\n  align-items: stretch;\n}\n.jse-contextmenu.svelte-1shjn02 .jse-column:where(.svelte-1shjn02):not(:last-child) {\n  border-right: 1px solid var(--jse-context-menu-separator-color, #7a7a7a);\n}\n.jse-contextmenu.svelte-1shjn02 .jse-separator:where(.svelte-1shjn02) {\n  width: 100%;\n  height: 1px;\n  background: var(--jse-context-menu-separator-color, #7a7a7a);\n}`);var NDA=FA('<div class=\"jse-separator svelte-1shjn02\"></div>'),FDA=FA('<div class=\"jse-label svelte-1shjn02\"> </div>'),LDA=FA('<div class=\"jse-column svelte-1shjn02\"></div>'),_DA=FA('<div class=\"jse-separator svelte-1shjn02\"></div>'),GDA=FA('<div class=\"jse-row svelte-1shjn02\"></div>'),KDA=FA('<div class=\"jse-separator svelte-1shjn02\"></div>'),UDA=FA('<div class=\"jse-row svelte-1shjn02\"><div class=\"jse-tip svelte-1shjn02\"><div class=\"jse-tip-icon svelte-1shjn02\"><!></div> <div class=\"jse-tip-text\"> </div></div></div>'),JDA=FA('<div role=\"menu\" tabindex=\"-1\" class=\"jse-contextmenu svelte-1shjn02\"><!> <!></div>');function D$(t,e){kt(e,!1);var A=N(e,\"items\",9),i=N(e,\"onRequestClose\",9),n=N(e,\"tip\",9),o=CA(void 0,!0);Jr(()=>{var I=Array.from(c(o).querySelectorAll(\"button\")).find(d=>!d.disabled);I&&I.focus()});var a={ArrowUp:\"Up\",ArrowDown:\"Down\",ArrowLeft:\"Left\",ArrowRight:\"Right\"};function r(I){return console.error(\"Unknown type of context menu item\",I),\"???\"}$t(!0);var s=JDA(),g=cA(s);ea(g,1,A,ha,(I,d)=>{var B=yi(),Q=$e(B),E=b=>{eR(b,{get item(){return c(d)},get onRequestClose(){return i()}})},f=b=>{var R=yi(),M=$e(R),v=G=>{tR(G,{get item(){return c(d)},get onRequestClose(){return i()}})},F=G=>{var U=yi(),Y=$e(U),j=z=>{var yA=GDA();ea(yA,5,()=>(c(d),QA(()=>c(d).items)),ha,(P,nA)=>{var eA=yi(),dA=$e(eA),iA=hA=>{eR(hA,{get item(){return c(nA)},get onRequestClose(){return i()}})},aA=hA=>{var JA=yi(),ee=$e(JA),UA=KA=>{tR(KA,{get item(){return c(nA)},get onRequestClose(){return i()}})},mA=KA=>{var ze=yi(),Ke=$e(ze),HA=XA=>{var EA=LDA();ea(EA,5,()=>(c(nA),QA(()=>c(nA).items)),ha,(ZA,MA)=>{var be=yi(),_A=$e(be),pA=Et=>{eR(Et,{className:\"left\",get item(){return c(MA)},get onRequestClose(){return i()}})},Rt=Et=>{var Qe=yi(),_t=$e(Qe),Ue=ht=>{tR(ht,{className:\"left\",get item(){return c(MA)},get onRequestClose(){return i()}})},Te=ht=>{var Me=yi(),Ai=$e(Me),J=tA=>{lA(tA,NDA())},O=tA=>{var oA=yi(),NA=$e(oA),de=xA=>{var LA=FDA(),dt=cA(LA);ve(()=>xt(dt,(c(MA),QA(()=>c(MA).text)))),lA(xA,LA)},Ee=xA=>{var LA=tr();ve(dt=>xt(LA,dt),[()=>(c(MA),QA(()=>r(c(MA))))]),lA(xA,LA)};YA(NA,xA=>{_(kW),c(MA),QA(()=>kW(c(MA)))?xA(de):xA(Ee,!1)},!0),lA(tA,oA)};YA(Ai,tA=>{_(V2),c(MA),QA(()=>V2(c(MA)))?tA(J):tA(O,!1)},!0),lA(ht,Me)};YA(_t,ht=>{_(RQ),c(MA),QA(()=>RQ(c(MA)))?ht(Ue):ht(Te,!1)},!0),lA(Et,Qe)};YA(_A,Et=>{_(rC),c(MA),QA(()=>rC(c(MA)))?Et(pA):Et(Rt,!1)}),lA(ZA,be)}),lA(XA,EA)},uA=XA=>{var EA=yi(),ZA=$e(EA),MA=_A=>{lA(_A,_DA())},be=_A=>{var pA=tr();ve(Rt=>xt(pA,Rt),[()=>(c(nA),QA(()=>r(c(nA))))]),lA(_A,pA)};YA(ZA,_A=>{_(V2),c(nA),QA(()=>V2(c(nA)))?_A(MA):_A(be,!1)},!0),lA(XA,EA)};YA(Ke,XA=>{_(xW),c(nA),QA(()=>xW(c(nA)))?XA(HA):XA(uA,!1)},!0),lA(KA,ze)};YA(ee,KA=>{_(RQ),c(nA),QA(()=>RQ(c(nA)))?KA(UA):KA(mA,!1)},!0),lA(hA,JA)};YA(dA,hA=>{_(rC),c(nA),QA(()=>rC(c(nA)))?hA(iA):hA(aA,!1)}),lA(P,eA)}),lA(z,yA)},AA=z=>{var yA=yi(),P=$e(yA),nA=dA=>{lA(dA,KDA())},eA=dA=>{var iA=tr();ve(aA=>xt(iA,aA),[()=>(c(d),QA(()=>r(c(d))))]),lA(dA,iA)};YA(P,dA=>{_(V2),c(d),QA(()=>V2(c(d)))?dA(nA):dA(eA,!1)},!0),lA(z,yA)};YA(Y,z=>{_(SW),c(d),QA(()=>SW(c(d)))?z(j):z(AA,!1)},!0),lA(G,U)};YA(M,G=>{_(RQ),c(d),QA(()=>RQ(c(d)))?G(v):G(F,!1)},!0),lA(b,R)};YA(Q,b=>{_(rC),c(d),QA(()=>rC(c(d)))?b(E):b(f,!1)}),lA(I,B)});var l=bA(g,2),C=I=>{var d=UDA(),B=cA(d),Q=cA(B);Pi(cA(Q),{get data(){return YO}});var E=cA(bA(Q,2));ve(()=>xt(E,n())),lA(I,d)};YA(l,I=>{n()&&I(C)}),Mo(s,I=>x(o,I),()=>c(o)),ue(\"keydown\",s,function(I){var d=fC(I),B=a[d];if(B&&I.target){I.preventDefault();var Q=C6A({allElements:Array.from(c(o).querySelectorAll(\"button:not([disabled])\")),currentElement:I.target,direction:B,hasPrio:E=>E.getAttribute(\"data-type\")!==\"jse-open-dropdown\"});Q&&Q.focus()}}),lA(t,s),St()}Pt(`/* over all fonts, sizes, and colors */\n/* \"consolas\" for Windows, \"menlo\" for Mac with fallback to \"monaco\", 'Ubuntu Mono' for Ubuntu */\n/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */\n/* main, menu, modal */\n/* jsoneditor modal */\n/* tooltip in text mode */\n/* panels: navigation bar, gutter, search box */\n/* navigation-bar */\n/* context menu */\n/* contents: json key and values */\n/* contents: selected or hovered */\n/* contents: section of collapsed items in an array */\n/* contents: highlighting of search matches */\n/* contents: inline tags inside the JSON document */\n/* contents: table */\n/* controls in modals: inputs, buttons, and \\`a\\` */\n/* messages */\n/* svelte-select */\n/* color picker */\n.jse-value.jse-string.svelte-1htmvf1 {\n  color: var(--jse-value-color-string, #008000);\n}\n.jse-value.jse-object.svelte-1htmvf1, .jse-value.jse-array.svelte-1htmvf1 {\n  min-width: 16px;\n  color: var(--jse-delimiter-color, rgba(0, 0, 0, 0.38));\n}\n.jse-value.jse-number.svelte-1htmvf1 {\n  color: var(--jse-value-color-number, #ee422e);\n}\n.jse-value.jse-boolean.svelte-1htmvf1 {\n  color: var(--jse-value-color-boolean, #ff8c00);\n}\n.jse-value.jse-null.svelte-1htmvf1 {\n  color: var(--jse-value-color-null, #004ed0);\n}\n.jse-value.jse-invalid.svelte-1htmvf1 {\n  color: var(--jse-text-color, #4d4d4d);\n}\n.jse-value.jse-url.svelte-1htmvf1 {\n  color: var(--jse-value-color-url, #008000);\n  text-decoration: underline;\n}\n\n.jse-enum-value.svelte-1htmvf1 {\n  background: var(--jse-hover-background-color, rgba(0, 0, 0, 0.06));\n  border: none;\n  padding: 0;\n  font-family: inherit;\n  font-size: inherit;\n  cursor: pointer;\n  outline: none;\n}\n.jse-enum-value.jse-selected.svelte-1htmvf1 {\n  background: var(--jse-selection-background-color, #d3d3d3);\n  color: inherit;\n}\n.jse-enum-value.jse-value.svelte-1htmvf1:focus {\n  color: var(--jse-text-color, #4d4d4d);\n}`);var iBe=FA(\"<option> </option>\"),nBe=FA(\"<select></select>\");var dD,BD;function QD(t,e){return dD||(BD=new WeakMap,dD=new ResizeObserver(A=>{for(var i of A){var n=BD.get(i.target);n&&n(i.target)}})),BD.set(t,e),dD.observe(t),{destroy:()=>{BD.delete(t),dD.unobserve(t)}}}Pt(`/* over all fonts, sizes, and colors */\n/* \"consolas\" for Windows, \"menlo\" for Mac with fallback to \"monaco\", 'Ubuntu Mono' for Ubuntu */\n/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */\n/* main, menu, modal */\n/* jsoneditor modal */\n/* tooltip in text mode */\n/* panels: navigation bar, gutter, search box */\n/* navigation-bar */\n/* context menu */\n/* contents: json key and values */\n/* contents: selected or hovered */\n/* contents: section of collapsed items in an array */\n/* contents: highlighting of search matches */\n/* contents: inline tags inside the JSON document */\n/* contents: table */\n/* controls in modals: inputs, buttons, and \\`a\\` */\n/* messages */\n/* svelte-select */\n/* color picker */\n.jse-tree-mode.svelte-10mlrw4 {\n  flex: 1;\n  display: flex;\n  flex-direction: column;\n  position: relative;\n  background: var(--jse-background-color, #fff);\n  min-width: 0;\n  min-height: 0;\n  font-family: var(--jse-font-family-mono, consolas, menlo, monaco, \"Ubuntu Mono\", \"source-code-pro\", monospace);\n  font-size: var(--jse-font-size-mono, 14px);\n  color: var(--jse-text-color, #4d4d4d);\n  line-height: var(--jse-line-height, calc(1em + 4px));\n}\n.jse-tree-mode.svelte-10mlrw4 .jse-hidden-input-label:where(.svelte-10mlrw4) .jse-hidden-input:where(.svelte-10mlrw4) {\n  position: fixed;\n  top: -10px;\n  left: -10px;\n  width: 1px;\n  height: 1px;\n  padding: 0;\n  border: 0;\n  outline: none;\n}\n.jse-tree-mode.no-main-menu.svelte-10mlrw4 {\n  border-top: var(--jse-main-border, 1px solid #d7d7d7);\n}\n.jse-tree-mode.svelte-10mlrw4 .jse-search-box-container:where(.svelte-10mlrw4) {\n  position: relative;\n  height: 0;\n  top: var(--jse-padding, 10px);\n  margin-right: calc(var(--jse-padding, 10px) + 20px);\n  margin-left: var(--jse-padding, 10px);\n  text-align: right;\n  z-index: 3;\n}\n.jse-tree-mode.svelte-10mlrw4 .jse-contents:where(.svelte-10mlrw4) {\n  flex: 1;\n  overflow: auto;\n  position: relative;\n  padding: 2px;\n  display: flex;\n  flex-direction: column;\n  border-left: var(--jse-main-border, 1px solid #d7d7d7);\n  border-right: var(--jse-main-border, 1px solid #d7d7d7);\n}\n.jse-tree-mode.svelte-10mlrw4 .jse-contents:where(.svelte-10mlrw4):last-child {\n  border-bottom: var(--jse-main-border, 1px solid #d7d7d7);\n}\n.jse-tree-mode.svelte-10mlrw4 .jse-contents:where(.svelte-10mlrw4) .jse-loading-space:where(.svelte-10mlrw4) {\n  flex: 1;\n}\n.jse-tree-mode.svelte-10mlrw4 .jse-contents:where(.svelte-10mlrw4) .jse-loading:where(.svelte-10mlrw4) {\n  flex: 2;\n  text-align: center;\n  color: var(--jse-panel-color-readonly, #b2b2b2);\n  box-sizing: border-box;\n  font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen-Sans, Ubuntu, Cantarell, \"Helvetica Neue\", sans-serif);\n  font-size: var(--jse-font-size, 16px);\n}\n.jse-tree-mode.svelte-10mlrw4 .jse-contents:where(.svelte-10mlrw4) .jse-search-box-background:where(.svelte-10mlrw4) {\n  border: 50px solid var(--jse-modal-background, #f5f5f5);\n  margin: -2px;\n  margin-bottom: 2px;\n  display: inline-block;\n}`);var YDA=FA(\"<!> <!>\",1),HDA=FA('<div class=\"jse-search-box-background svelte-10mlrw4\"></div>'),TDA=FA('<div class=\"jse-search-box-container svelte-10mlrw4\"><!></div> <div class=\"jse-contents svelte-10mlrw4\"><!> <!></div> <!> <!> <!> <!>',1),ODA=FA('<label class=\"jse-hidden-input-label svelte-10mlrw4\"><input type=\"text\" tabindex=\"-1\" class=\"jse-hidden-input svelte-10mlrw4\"/></label> <!>',1),zDA=FA('<div class=\"jse-contents svelte-10mlrw4\"><div class=\"jse-loading-space svelte-10mlrw4\"></div> <div class=\"jse-loading svelte-10mlrw4\">loading...</div></div>'),PDA=FA('<div role=\"tree\" tabindex=\"-1\"><!> <!> <!></div> <!> <!>',1);function LR(t,e){kt(e,!1);var A=CA(void 0,!0),i=qa(\"jsoneditor:TreeMode\"),n=typeof window>\"u\";i(\"isSSR:\",n);var o=w2(),a=w2(),{openAbsolutePopup:r,closeAbsolutePopup:s}=cI(\"absolute-popup\"),g=CA(void 0,!0),l=CA(void 0,!0),C=CA(void 0,!0),I=!1,d=a$(),B=N(e,\"readOnly\",9),Q=N(e,\"externalContent\",9),E=N(e,\"externalSelection\",9),f=N(e,\"history\",9),b=N(e,\"truncateTextSize\",9),R=N(e,\"mainMenuBar\",9),M=N(e,\"navigationBar\",9),v=N(e,\"escapeControlCharacters\",9),F=N(e,\"escapeUnicodeCharacters\",9),G=N(e,\"parser\",9),U=N(e,\"parseMemoizeOne\",9),Y=N(e,\"validator\",9),j=N(e,\"validationParser\",9),AA=N(e,\"pathParser\",9),z=N(e,\"indentation\",9),yA=N(e,\"onError\",9),P=N(e,\"onChange\",9),nA=N(e,\"onChangeMode\",9),eA=N(e,\"onSelect\",9),dA=N(e,\"onUndo\",9),iA=N(e,\"onRedo\",9),aA=N(e,\"onRenderValue\",9),hA=N(e,\"onRenderMenu\",9),JA=N(e,\"onRenderContextMenu\",9),ee=N(e,\"onClassName\",9),UA=N(e,\"onFocus\",9),mA=N(e,\"onBlur\",9),KA=N(e,\"onSortModal\",9),ze=N(e,\"onTransformModal\",9),Ke=N(e,\"onJSONEditorModal\",9),HA=!1,uA=CA(!1,!0),XA=CA(void 0,!0);sN({onMount:Jr,onDestroy:cl,getWindow:()=>mu(c(C)),hasFocus:()=>HA&&document.hasFocus()||jR(c(C)),onFocus:()=>{I=!0,UA()&&UA()()},onBlur:()=>{I=!1,mA()&&mA()()}});var EA=CA(void 0,!0),ZA=CA(void 0,!0),MA=void 0,be=!1,_A=CA(uR({json:c(EA)}),!0),pA=CA(ru(E())?E():void 0,!0);function Rt(q){x(pA,q)}Jr(()=>{if(c(pA)){var q=st(c(pA));x(_A,ec(c(EA),c(_A),q,wD)),setTimeout(()=>mo(q))}});var Et,Qe=CA(void 0,!0),_t=CA(void 0,!0),Ue=CA(void 0,!0),Te=CA(void 0,!0),ht=CA(!1,!0),Me=CA(!1,!0);function Ai(q){x(Te,(Et=q)?jX(c(EA),Et.items):void 0)}function J(q,fA){return O.apply(this,arguments)}function O(){return(O=Ut(function*(q,fA){x(_A,ec(c(EA),c(_A),q,wD));var PA=io(fA);yield Mi(q,{element:PA})})).apply(this,arguments)}function tA(){x(ht,!1),x(Me,!1),Mt()}function oA(q){i(\"select validation error\",q),x(pA,_i(q.path)),Mi(q.path)}function NA(q){var fA=arguments.length>1&&arguments[1]!==void 0?arguments[1]:fR;i(\"expand\"),x(_A,ec(c(EA),c(_A),q,fA))}function de(q,fA){x(_A,LW(c(EA),c(_A),q,fA)),c(pA)&&(function(PA,Ne){return I0(st(PA),Ne)&&(st(PA).length>Ne.length||Ka(PA))})(c(pA),q)&&x(pA,void 0)}var Ee=CA(!1,!0),xA=CA([],!0),LA=CA(void 0,!0),dt=VB(r$);function At(q,fA,PA,Ne){OQ(()=>{var pe;try{pe=dt(q,fA,PA,Ne)}catch(we){pe=[{path:[],message:\"Failed to validate: \"+we.message,severity:ic.warning}]}di(pe,c(xA))||(i(\"validationErrors changed:\",pe),x(xA,pe),x(LA,(function(we,it){var zt;return it.forEach(bi=>{zt=rZ(we,zt,bi.path,(Dn,Hi)=>ye(ye({},Hi),{},{validationError:bi}))}),it.forEach(bi=>{for(var Dn=bi.path;Dn.length>0;)Dn=Li(Dn),zt=rZ(we,zt,Dn,(Hi,no)=>no.validationError?no:ye(ye({},no),{},{validationError:{isChildError:!0,path:Dn,message:\"Contains invalid data\",severity:ic.warning}}))}),zt})(q,c(xA))))},pe=>i(\"validationErrors updated in \".concat(pe,\" ms\")))}function Je(){return i(\"validate\"),MA?{parseError:MA,isRepairable:!1}:(At(c(EA),Y(),G(),j()),zi(c(xA))?void 0:{validationErrors:c(xA)})}function Ge(){return c(EA)}function ri(){return c(_A)}function en(){return c(pA)}function rn(q){i(\"applyExternalContent\",{updatedContent:q}),iu(q)?(function(fA){if(fA!==void 0){var PA=!di(c(EA),fA);if(i(\"update external json\",{isChanged:PA,currentlyText:c(EA)===void 0}),!!PA){var Ne={documentState:c(_A),selection:c(pA),json:c(EA),text:c(ZA),textIsRepaired:c(Ee)};x(EA,fA),x(_A,wg(fA,c(_A))),Le(c(EA)),x(ZA,void 0),x(Ee,!1),MA=void 0,ji(c(EA)),Bi(Ne)}}})(q.json):tu(q)&&(function(fA){if(!(fA===void 0||iu(Q()))){var PA=fA!==c(ZA);if(i(\"update external text\",{isChanged:PA}),!!PA){var Ne={documentState:c(_A),selection:c(pA),json:c(EA),text:c(ZA),textIsRepaired:c(Ee)};try{x(EA,U()(fA)),x(_A,wg(c(EA),c(_A))),Le(c(EA)),x(ZA,fA),x(Ee,!1),MA=void 0}catch(pe){try{x(EA,U()(jg(fA))),x(_A,wg(c(EA),c(_A))),Le(c(EA)),x(ZA,fA),x(Ee,!0),MA=void 0,ji(c(EA))}catch(we){x(EA,void 0),x(_A,void 0),x(ZA,Q().text),x(Ee,!1),MA=c(ZA)!==void 0&&c(ZA)!==\"\"?nE(c(ZA),pe.message||String(pe)):void 0}}ji(c(EA)),Bi(Ne)}}})(q.text)}function Le(q){be||(be=!0,x(_A,$1(q,c(_A),[])))}function ji(q){c(pA)&&(cr(q,O1(c(pA)))&&cr(q,st(c(pA)))||(i(\"clearing selection: path does not exist anymore\",c(pA)),x(pA,NQ(q,c(_A)))))}function Bi(q){if(q.json!==void 0||q.text!==void 0){var fA=c(EA)!==void 0&&q.json!==void 0;f().add({type:\"tree\",undo:{patch:fA?[{op:\"replace\",path:\"\",value:q.json}]:void 0,json:q.json,text:q.text,documentState:q.documentState,textIsRepaired:q.textIsRepaired,selection:r0(q.selection),sortedColumn:void 0},redo:{patch:fA?[{op:\"replace\",path:\"\",value:c(EA)}]:void 0,json:c(EA),text:c(ZA),documentState:c(_A),textIsRepaired:c(Ee),selection:r0(c(pA)),sortedColumn:void 0}})}}function vi(q,fA){var PA;if(i(\"patch\",q,fA),c(EA)===void 0)throw new Error(\"Cannot apply patch: no JSON\");var Ne=c(EA),pe={json:void 0,text:c(ZA),documentState:c(_A),selection:r0(c(pA)),textIsRepaired:c(Ee),sortedColumn:void 0},we=PX(c(EA),q),it=FX(c(EA),c(_A),q),zt=(PA=rE(c(EA),q))!==null&&PA!==void 0?PA:c(pA),bi=typeof fA==\"function\"?fA(it.json,it.documentState,zt):void 0;return x(EA,bi?.json!==void 0?bi.json:it.json),x(_A,bi?.state!==void 0?bi.state:it.documentState),x(pA,bi?.selection!==void 0?bi.selection:zt),x(ZA,void 0),x(Ee,!1),x(_t,void 0),x(Ue,void 0),MA=void 0,ji(c(EA)),f().add({type:\"tree\",undo:ye({patch:we},pe),redo:{patch:q,json:void 0,text:c(ZA),documentState:c(_A),selection:r0(c(pA)),sortedColumn:void 0,textIsRepaired:c(Ee)}}),{json:c(EA),previousJson:Ne,undo:we,redo:q}}function Ji(){!B()&&c(pA)&&x(pA,oN(st(c(pA))))}function Dt(){if(!B()&&c(pA)){var q=st(c(pA)),fA=Pe(c(EA),q);jo(fA)?(function(PA,Ne){i(\"openJSONEditorModal\",{path:PA,value:Ne}),HA=!0,Ke()({content:{json:Ne},path:PA,onPatch:c(w).onPatch,onClose:()=>{HA=!1,setTimeout(Mt)}})})(q,fA):x(pA,GD(q))}}function qi(){if(!B()&&an(c(pA))){var q=st(c(pA)),fA=pt(q),PA=Pe(c(EA),q),Ne=!g0(c(EA),c(_A),q),pe=Ne?String(PA):EE(String(PA),G());i(\"handleToggleEnforceString\",{enforceString:Ne,value:PA,updatedValue:pe}),VA([{op:\"replace\",path:fA,value:pe}],(we,it)=>({state:Aw(c(EA),it,q,{type:\"value\",enforceString:Ne})}))}}function Nt(){return c(Ee)&&c(EA)!==void 0&&me(c(EA)),c(EA)!==void 0?{json:c(EA)}:{text:c(ZA)||\"\"}}function L(){return gt.apply(this,arguments)}function gt(){return gt=Ut(function*(){var q=!(arguments.length>0&&arguments[0]!==void 0)||arguments[0];yield E$({json:c(EA),selection:c(pA),indentation:q?z():void 0,readOnly:B(),parser:G(),onPatch:VA})}),gt.apply(this,arguments)}function gi(){return sn.apply(this,arguments)}function sn(){return sn=Ut(function*(){var q=!(arguments.length>0&&arguments[0]!==void 0)||arguments[0];c(EA)!==void 0&&(yield h$({json:c(EA),selection:c(pA),indentation:q?z():void 0,parser:G()}))}),sn.apply(this,arguments)}function gn(q){var fA;q.preventDefault(),eo((fA=q.clipboardData)===null||fA===void 0?void 0:fA.getData(\"text/plain\"))}function Kn(){return ko.apply(this,arguments)}function ko(){return(ko=Ut(function*(){try{eo(yield navigator.clipboard.readText())}catch(q){console.error(q),x(uA,!0)}})).apply(this,arguments)}function eo(q){q!==void 0&&u$({clipboardText:q,json:c(EA),selection:c(pA),readOnly:B(),parser:G(),onPatch:VA,onChangeText:IA,onPasteMultilineText:Sn,openRepairModal:fo})}function fo(q,fA){x(XA,{text:q,onParse:PA=>fu(PA,Ne=>uu(Ne,G())),onRepair:fX,onApply:fA,onClose:Mt})}function Go(){f$({json:c(EA),text:c(ZA),selection:c(pA),keepSelection:!1,readOnly:B(),onChange:P(),onPatch:VA})}function co(){!B()&&c(EA)!==void 0&&c(pA)&&HQ&&!zi(st(c(pA)))&&(i(\"duplicate\",{selection:c(pA)}),VA(HX(c(EA),gI(c(EA),c(pA)))))}function ta(){B()||!c(pA)||!$n(c(pA))&&!an(c(pA))||zi(st(c(pA)))||(i(\"extract\",{selection:c(pA)}),VA(TX(c(EA),c(pA)),(q,fA)=>{if(jo(q))return{state:jx(q,fA,[])}}))}function Ko(q){jD({insertType:q,selectInside:!0,initialValue:void 0,json:c(EA),selection:c(pA),readOnly:B(),parser:G(),onPatch:VA,onReplaceJson:me})}function qo(q){ja(c(pA))&&x(pA,_i(c(pA).path)),c(pA)||x(pA,NQ(c(EA),c(_A))),Ko(q)}function Co(q){if(!B()&&c(pA))if(gD(c(pA)))try{var fA=O1(c(pA)),PA=Pe(c(EA),fA),Ne=(function(we,it,zt){if(it===\"array\"){if(Array.isArray(we))return we;if(Qn(we))return mW(we);if(typeof we==\"string\")try{var bi=zt.parse(we);if(Array.isArray(bi))return bi;if(Qn(bi))return mW(bi)}catch(Hi){return[we]}return[we]}if(it===\"object\"){if(Array.isArray(we))return fW(we);if(Qn(we))return we;if(typeof we==\"string\")try{var Dn=zt.parse(we);if(Qn(Dn))return Dn;if(Array.isArray(Dn))return fW(Dn)}catch(Hi){return{value:we}}return{value:we}}if(it===\"value\")return jo(we)?zt.stringify(we):we;throw new Error(\"Cannot convert \".concat(OR(we,zt),\" to \").concat(it))})(PA,q,G());if(Ne===PA)return;var pe=[{op:\"replace\",path:pt(fA),value:Ne}];i(\"handleConvert\",{selection:c(pA),path:fA,type:q,operations:pe}),VA(pe,(we,it)=>({state:c(pA)?$1(we,it,st(c(pA))):c(_A)}))}catch(we){yA()(we)}else yA()(new Error(\"Cannot convert current selection to \".concat(q)))}function se(){if(c(pA)){var q=UW(c(EA),c(_A),c(pA),!1),fA=Li(st(c(pA)));q&&!zi(st(q))&&di(fA,Li(st(q)))?x(pA,QC(st(q))):x(pA,pC(fA)),i(\"insert before\",{selection:c(pA),selectionBefore:q,parentPath:fA}),uo(),Gi()}}function Ci(){if(c(pA)){var q=rI(c(EA),c(pA));i(\"insert after\",q),x(pA,QC(q)),uo(),Gi()}}function tn(q){return ln.apply(this,arguments)}function ln(){return(ln=Ut(function*(q){yield m$({char:q,selectInside:!0,json:c(EA),selection:c(pA),readOnly:B(),parser:G(),onPatch:VA,onReplaceJson:me,onSelect:Rt})})).apply(this,arguments)}function So(){if(!B()&&f().canUndo){var q=f().undo();if(LD(q)){var fA={json:c(EA),text:c(ZA)};x(EA,q.undo.patch?Js(c(EA),q.undo.patch):q.undo.json),x(_A,q.undo.documentState),x(pA,q.undo.selection),x(ZA,q.undo.text),x(Ee,q.undo.textIsRepaired),MA=void 0,i(\"undo\",{item:q,json:c(EA),documentState:c(_A),selection:c(pA)}),vA(fA,q.undo.patch&&q.redo.patch?{json:c(EA),previousJson:fA.json,redo:q.undo.patch,undo:q.redo.patch}:void 0),Mt(),c(pA)&&Mi(st(c(pA)),{scrollToWhenVisible:!1})}else dA()(q)}}function la(){if(!B()&&f().canRedo){var q=f().redo();if(LD(q)){var fA={json:c(EA),text:c(ZA)};x(EA,q.redo.patch?Js(c(EA),q.redo.patch):q.redo.json),x(_A,q.redo.documentState),x(pA,q.redo.selection),x(ZA,q.redo.text),x(Ee,q.redo.textIsRepaired),MA=void 0,i(\"redo\",{item:q,json:c(EA),documentState:c(_A),selection:c(pA)}),vA(fA,q.undo.patch&&q.redo.patch?{json:c(EA),previousJson:fA.json,redo:q.redo.patch,undo:q.undo.patch}:void 0),Mt(),c(pA)&&Mi(st(c(pA)),{scrollToWhenVisible:!1})}else iA()(q)}}function pi(q){var fA;B()||c(EA)===void 0||(HA=!0,KA()({id:o,json:c(EA),rootPath:q,onSort:(fA=Ut(function*(PA){var{operations:Ne}=PA;i(\"onSort\",q,Ne),VA(Ne,(pe,we)=>({state:jx(pe,we,q),selection:_i(q)}))}),function(PA){return fA.apply(this,arguments)}),onClose:()=>{HA=!1,setTimeout(Mt)}}))}function to(){c(pA)&&pi(YW(c(EA),c(pA)))}function Ja(){pi([])}function Io(q){if(c(EA)!==void 0){var{id:fA,onTransform:PA,onClose:Ne}=q,pe=q.rootPath||[];HA=!0,ze()({id:fA||a,json:c(EA),rootPath:pe,onTransform:we=>{PA?PA({operations:we,json:c(EA),transformedJson:Js(c(EA),we)}):(i(\"onTransform\",pe,we),VA(we,(it,zt)=>({state:jx(it,zt,pe),selection:_i(pe)})))},onClose:()=>{HA=!1,setTimeout(Mt),Ne&&Ne()}})}}function Sa(){c(pA)&&Io({rootPath:YW(c(EA),c(pA))})}function kn(){Io({rootPath:[]})}function Mi(q){return Ot.apply(this,arguments)}function Ot(){return Ot=Ut(function*(q){var{scrollToWhenVisible:fA=!0,element:PA}=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};x(_A,ec(c(EA),c(_A),q,wD));var Ne=PA??pn(q);if(i(\"scrollTo\",{path:q,elem:Ne,refContents:c(g)}),!Ne||!c(g))return Promise.resolve();var pe=c(g).getBoundingClientRect(),we=Ne.getBoundingClientRect();if(!fA&&we.bottom>pe.top&&we.top<pe.bottom)return Promise.resolve();var it=-pe.height/4;return new Promise(zt=>{d(Ne,{container:c(g),offset:it,duration:300,callback:()=>zt()})})}),Ot.apply(this,arguments)}function pn(q){var fA,PA;return uo(),(fA=(PA=c(g))===null||PA===void 0?void 0:PA.querySelector('div[data-path=\"'.concat(DD(q),'\"]')))!==null&&fA!==void 0?fA:void 0}function io(q){var fA,PA;return uo(),(fA=(PA=c(g))===null||PA===void 0?void 0:PA.querySelector('span[data-search-result-index=\"'.concat(q,'\"]')))!==null&&fA!==void 0?fA:void 0}function mo(q){var fA=pn(q);if(fA&&c(g)){var PA=c(g).getBoundingClientRect(),Ne=fA.getBoundingClientRect(),pe=jo(Pe(c(EA),q))?20:Ne.height;Ne.top<PA.top+20?d(fA,{container:c(g),offset:-20,duration:0}):Ne.top+pe>PA.bottom-20&&d(fA,{container:c(g),offset:-(PA.height-pe-20),duration:0})}}function vA(q,fA){if(q.json!==void 0||q?.text!==void 0){if(c(ZA)!==void 0){var PA,Ne={text:c(ZA),json:void 0};(PA=P())===null||PA===void 0||PA(Ne,q,{contentErrors:Je(),patchResult:fA})}else if(c(EA)!==void 0){var pe,we={text:void 0,json:c(EA)};(pe=P())===null||pe===void 0||pe(we,q,{contentErrors:Je(),patchResult:fA})}}}function VA(q,fA){i(\"handlePatch\",q,fA);var PA={json:c(EA),text:c(ZA)},Ne=vi(q,fA);return vA(PA,Ne),Ne}function me(q,fA){var PA={json:c(EA),text:c(ZA)},Ne={documentState:c(_A),selection:c(pA),json:c(EA),text:c(ZA),textIsRepaired:c(Ee)},pe=ec(c(EA),wg(q,c(_A)),[],W3),we=typeof fA==\"function\"?fA(q,pe,c(pA)):void 0;x(EA,we?.json!==void 0?we.json:q),x(_A,we?.state!==void 0?we.state:pe),x(pA,we?.selection!==void 0?we.selection:c(pA)),x(ZA,void 0),x(Ee,!1),MA=void 0,ji(c(EA)),Bi(Ne),vA(PA,void 0)}function IA(q,fA){i(\"handleChangeText\");var PA={json:c(EA),text:c(ZA)},Ne={documentState:c(_A),selection:c(pA),json:c(EA),text:c(ZA),textIsRepaired:c(Ee)};try{x(EA,U()(q)),x(_A,ec(c(EA),wg(c(EA),c(_A)),[],W3)),x(ZA,void 0),x(Ee,!1),MA=void 0}catch(we){try{x(EA,U()(jg(q))),x(_A,ec(c(EA),wg(c(EA),c(_A)),[],W3)),x(ZA,q),x(Ee,!0),MA=void 0}catch(it){x(EA,void 0),x(_A,uR({json:c(EA),expand:W3})),x(ZA,q),x(Ee,!1),MA=c(ZA)!==\"\"?nE(c(ZA),we.message||String(we)):void 0}}if(typeof fA==\"function\"){var pe=fA(c(EA),c(_A),c(pA));x(EA,pe?.json!==void 0?pe.json:c(EA)),x(_A,pe?.state!==void 0?pe.state:c(_A)),x(pA,pe?.selection!==void 0?pe.selection:c(pA))}ji(c(EA)),Bi(Ne),vA(PA,void 0)}function SA(q,fA){var PA=arguments.length>2&&arguments[2]!==void 0&&arguments[2];i(\"handleExpand\",{path:q,expanded:fA,recursive:PA}),fA?NA(q,PA?nN:fR):de(q,PA),Mt()}function re(){SA([],!0,!0)}function Se(){SA([],!1,!0)}function tt(q){i(\"openFind\",{findAndReplace:q}),x(ht,!1),x(Me,!1),uo(),x(ht,!0),x(Me,q)}function at(q,fA){i(\"handleExpandSection\",q,fA),x(_A,(function(PA,Ne,pe,we){return aE(PA,Ne,pe,(it,zt)=>{if(!Pa(zt))return zt;var bi=xX(zt.visibleSections.concat(we));return ye(ye({},zt),{},{visibleSections:bi})})})(c(EA),c(_A),q,fA))}function bt(q){i(\"pasted json as text\",q),x(_t,q)}function Sn(q){i(\"pasted multiline text\",{pastedText:q}),x(Ue,q)}function ki(q){var fA,{anchor:PA,left:Ne,top:pe,width:we,height:it,offsetTop:zt,offsetLeft:bi,showTip:Dn}=q,Hi=(function(Jn){var{json:Jo,documentState:Cn,selection:Lt,readOnly:Vi,onEditKey:Vt,onEditValue:mt,onToggleEnforceString:si,onCut:Wo,onCopy:Yn,onPaste:Yo,onRemove:ia,onDuplicate:nr,onExtract:u0,onInsertBefore:ng,onInsert:dl,onConvert:Ec,onInsertAfter:Bl,onSort:Hr,onTransform:or}=Jn,og=Jo!==void 0,f0=!!Lt,ag=!!Lt&&zi(st(Lt)),wn=Lt?Pe(Jo,st(Lt)):void 0,ua=Array.isArray(wn)?\"Edit array\":Qn(wn)?\"Edit object\":\"Edit value\",fa=og&&($n(Lt)||ja(Lt)||an(Lt)),mI=Lt&&!ag?Pe(Jo,Li(st(Lt))):void 0,dd=!Vi&&og&&_D(Lt)&&!ag&&!Array.isArray(mI),pI=!Vi&&og&&Lt!==void 0&&_D(Lt),YE=pI&&!jo(wn),Bd=!Vi&&fa,HE=fa,lv=!Vi&&f0,cv=!Vi&&og&&fa&&!ag,Cv=!Vi&&og&&Lt!==void 0&&($n(Lt)||an(Lt))&&!ag,hc=fa,DI=hc?\"Convert to:\":\"Insert:\",ma=!Vi&&(Ka(Lt)&&Array.isArray(wn)||Xs(Lt)&&Array.isArray(mI)),kg=!Vi&&(hc?gD(Lt)&&!Qn(wn):f0),TE=!Vi&&(hc?gD(Lt)&&!Array.isArray(wn):f0),OE=!Vi&&(hc?gD(Lt)&&jo(wn):f0),wI=Lt!==void 0&&g0(Jo,Cn,st(Lt));function fr(zE){fa?zE!==\"structure\"&&Ec(zE):dl(zE)}return[{type:\"row\",items:[{type:\"button\",onClick:()=>Vt(),icon:s1,text:\"Edit key\",title:\"Edit the key (Double-click on the key)\",disabled:!dd},{type:\"dropdown-button\",main:{type:\"button\",onClick:()=>mt(),icon:s1,text:ua,title:\"Edit the value (Double-click on the value)\",disabled:!pI},width:\"11em\",items:[{type:\"button\",icon:s1,text:ua,title:\"Edit the value (Double-click on the value)\",onClick:()=>mt(),disabled:!pI},{type:\"button\",icon:wI?CM:BM,text:\"Enforce string\",title:\"Enforce keeping the value as string when it contains a numeric value\",onClick:()=>si(),disabled:!YE}]}]},{type:\"separator\"},{type:\"row\",items:[{type:\"dropdown-button\",main:{type:\"button\",onClick:()=>Wo(!0),icon:g1,text:\"Cut\",title:\"Cut selected contents, formatted with indentation (Ctrl+X)\",disabled:!Bd},width:\"10em\",items:[{type:\"button\",icon:g1,text:\"Cut formatted\",title:\"Cut selected contents, formatted with indentation (Ctrl+X)\",onClick:()=>Wo(!0),disabled:!Bd},{type:\"button\",icon:g1,text:\"Cut compacted\",title:\"Cut selected contents, without indentation (Ctrl+Shift+X)\",onClick:()=>Wo(!1),disabled:!Bd}]},{type:\"dropdown-button\",main:{type:\"button\",onClick:()=>Yn(!0),icon:j0,text:\"Copy\",title:\"Copy selected contents, formatted with indentation (Ctrl+C)\",disabled:!HE},width:\"12em\",items:[{type:\"button\",icon:j0,text:\"Copy formatted\",title:\"Copy selected contents, formatted with indentation (Ctrl+C)\",onClick:()=>Yn(!0),disabled:!HE},{type:\"button\",icon:j0,text:\"Copy compacted\",title:\"Copy selected contents, without indentation (Ctrl+Shift+C)\",onClick:()=>Yn(!1),disabled:!HE}]},{type:\"button\",onClick:()=>Yo(),icon:gM,text:\"Paste\",title:\"Paste clipboard contents (Ctrl+V)\",disabled:!lv}]},{type:\"separator\"},{type:\"row\",items:[{type:\"column\",items:[{type:\"button\",onClick:()=>nr(),icon:cM,text:\"Duplicate\",title:\"Duplicate selected contents (Ctrl+D)\",disabled:!cv},{type:\"button\",onClick:()=>u0(),icon:TO,text:\"Extract\",title:\"Extract selected contents\",disabled:!Cv},{type:\"button\",onClick:()=>Hr(),icon:V4,text:\"Sort\",title:\"Sort array or object contents\",disabled:Vi||!fa},{type:\"button\",onClick:()=>or(),icon:z4,text:\"Transform\",title:\"Transform array or object contents (filter, sort, project)\",disabled:Vi||!fa},{type:\"button\",onClick:()=>ia(),icon:s8,text:\"Remove\",title:\"Remove selected contents (Delete)\",disabled:Vi||!fa}]},{type:\"column\",items:[{type:\"label\",text:DI},{type:\"button\",onClick:()=>fr(\"structure\"),icon:hc?W4:l1,text:\"Structure\",title:DI+\" structure like the first item in the array\",disabled:!ma},{type:\"button\",onClick:()=>fr(\"object\"),icon:hc?W4:l1,text:\"Object\",title:DI+\" object\",disabled:!kg},{type:\"button\",onClick:()=>fr(\"array\"),icon:hc?W4:l1,text:\"Array\",title:DI+\" array\",disabled:!TE},{type:\"button\",onClick:()=>fr(\"value\"),icon:hc?W4:l1,text:\"Value\",title:DI+\" value\",disabled:!OE}]}]},{type:\"separator\"},{type:\"row\",items:[{type:\"button\",onClick:()=>ng(),icon:WO,text:\"Insert before\",title:\"Select area before current entry to insert or paste contents\",disabled:Vi||!fa||ag},{type:\"button\",onClick:()=>Bl(),icon:OO,text:\"Insert after\",title:\"Select area after current entry to insert or paste contents\",disabled:Vi||!fa||ag}]}]})({json:c(EA),documentState:c(_A),selection:c(pA),readOnly:B(),onEditKey:Ji,onEditValue:Dt,onToggleEnforceString:qi,onCut:L,onCopy:gi,onPaste:Kn,onRemove:Go,onDuplicate:co,onExtract:ta,onInsertBefore:se,onInsert:qo,onInsertAfter:Ci,onConvert:Co,onSort:to,onTransform:Sa}),no=(fA=JA()(Hi))!==null&&fA!==void 0?fA:Hi;if(no!==!1){var qt={left:Ne,top:pe,offsetTop:zt,offsetLeft:bi,width:we,height:it,anchor:PA,closeOnOuterClick:!0,onClose:()=>{HA=!1,Mt()}};HA=!0;var Uo=r(D$,{tip:Dn?\"Tip: you can open this context menu via right-click or with Ctrl+Q\":void 0,items:no,onRequestClose:()=>s(Uo)},qt)}}function Gi(q){if(!za(c(pA)))if(q&&(q.stopPropagation(),q.preventDefault()),q&&q.type===\"contextmenu\"&&q.target!==c(l))ki({left:q.clientX,top:q.clientY,width:cC,height:lC,showTip:!1});else{var fA,PA=(fA=c(g))===null||fA===void 0?void 0:fA.querySelector(\".jse-context-menu-pointer.jse-selected\");if(PA)ki({anchor:PA,offsetTop:2,width:cC,height:lC,showTip:!1});else{var Ne,pe=(Ne=c(g))===null||Ne===void 0?void 0:Ne.getBoundingClientRect();pe&&ki({top:pe.top+2,left:pe.left+2,width:cC,height:lC,showTip:!1})}}}function jt(q){ki({anchor:kX(q.target,\"BUTTON\"),offsetTop:0,width:cC,height:lC,showTip:!0})}function Si(){return ca.apply(this,arguments)}function ca(){return(ca=Ut(function*(){if(i(\"apply pasted json\",c(_t)),c(_t)){var{onPasteAsJson:q}=c(_t);x(_t,void 0),q(),setTimeout(Mt)}})).apply(this,arguments)}function Ft(){return rt.apply(this,arguments)}function rt(){return(rt=Ut(function*(){i(\"apply pasted multiline text\",c(Ue)),c(Ue)&&(eo(JSON.stringify(c(Ue))),setTimeout(Mt))})).apply(this,arguments)}function xi(){i(\"clear pasted json\"),x(_t,void 0),Mt()}function Yi(){i(\"clear pasted multiline text\"),x(Ue,void 0),Mt()}function Un(){nA()(ga.text)}function cn(q){x(pA,q),Mt(),Mi(st(q))}function Mt(){i(\"focus\"),c(l)&&(c(l).focus(),c(l).select())}function Vo(q){return(function(fA,PA,Ne){var pe=Li(Ne),we=[fi(Ne)],it=Pe(fA,pe),zt=it?Px(it,PA,we):void 0;return zt?_i(pe.concat(zt)):QC(Ne)})(c(EA),c(_A),q)}function xo(q){c(A)&&c(A).onDrag(q)}function u(){c(A)&&c(A).onDragEnd()}var w=CA(void 0,!0);RA(()=>c(pA),()=>{var q;q=c(pA),di(q,E())||(i(\"onSelect\",q),eA()(q))}),RA(()=>(_(v()),_(F())),()=>{x(Qe,zR({escapeControlCharacters:v(),escapeUnicodeCharacters:F()}))}),RA(()=>c(ht),()=>{(function(q){c(g)&&q&&c(g).scrollTop===0&&(yg(g,c(g).style.overflowAnchor=\"none\"),yg(g,c(g).scrollTop+=V3),setTimeout(()=>{c(g)&&yg(g,c(g).style.overflowAnchor=\"\")}))})(c(ht))}),RA(()=>_(Q()),()=>{rn(Q())}),RA(()=>_(E()),()=>{(function(q){di(c(pA),q)||(i(\"applyExternalSelection\",{selection:c(pA),externalSelection:q}),ru(q)&&x(pA,q))})(E())}),RA(()=>(c(EA),_(Y()),_(G()),_(j())),()=>{At(c(EA),Y(),G(),j())}),RA(()=>(c(g),aZ),()=>{x(A,c(g)?aZ(c(g)):void 0)}),RA(()=>(_(B()),_(b()),_(G()),c(Qe),_(aA()),_(ee())),()=>{x(w,{mode:ga.tree,readOnly:B(),truncateTextSize:b(),parser:G(),normalization:c(Qe),getJson:Ge,getDocumentState:ri,getSelection:en,findElement:pn,findNextInside:Vo,focus:Mt,onPatch:VA,onInsert:Ko,onExpand:SA,onSelect:Rt,onFind:tt,onExpandSection:at,onPasteJson:bt,onRenderValue:aA(),onContextMenu:ki,onClassName:ee()||(()=>{}),onDrag:xo,onDragEnd:u})}),RA(()=>c(w),()=>{i(\"context changed\",c(w))}),mn();var S={expand:NA,collapse:de,validate:Je,getJson:Ge,patch:vi,acceptAutoRepair:Nt,openTransformModal:Io,scrollTo:Mi,findElement:pn,findSearchResult:io,focus:Mt};$t(!0);var T=PDA();ue(\"mousedown\",dC,function(q){!hE(q.target,fA=>fA===c(C))&&za(c(pA))&&(i(\"click outside the editor, exit edit mode\"),x(pA,r0(c(pA))),I&&c(l)&&(c(l).focus(),c(l).blur()),i(\"blur (outside editor)\"),c(l)&&c(l).blur())});var k,H=$e(T),Z=cA(H),gA=q=>{(function(fA,PA){kt(PA,!1);var Ne=CA(void 0,!0),pe=CA(void 0,!0),we=CA(void 0,!0),it=N(PA,\"json\",9),zt=N(PA,\"selection\",9),bi=N(PA,\"readOnly\",9),Dn=N(PA,\"showSearch\",13,!1),Hi=N(PA,\"history\",9),no=N(PA,\"onExpandAll\",9),qt=N(PA,\"onCollapseAll\",9),Uo=N(PA,\"onUndo\",9),Jn=N(PA,\"onRedo\",9),Jo=N(PA,\"onSort\",9),Cn=N(PA,\"onTransform\",9),Lt=N(PA,\"onContextMenu\",9),Vi=N(PA,\"onCopy\",9),Vt=N(PA,\"onRenderMenu\",9);function mt(){Dn(!Dn())}var si=CA(void 0,!0),Wo=CA(void 0,!0),Yn=CA(void 0,!0),Yo=CA(void 0,!0);RA(()=>_(it()),()=>{x(Ne,it()!==void 0)}),RA(()=>(c(Ne),_(zt()),an),()=>{x(pe,c(Ne)&&($n(zt())||ja(zt())||an(zt())))}),RA(()=>(_(no()),_(it())),()=>{x(si,{type:\"button\",icon:c$,title:\"Expand all\",className:\"jse-expand-all\",onClick:no(),disabled:!jo(it())})}),RA(()=>(_(qt()),_(it())),()=>{x(Wo,{type:\"button\",icon:C$,title:\"Collapse all\",className:\"jse-collapse-all\",onClick:qt(),disabled:!jo(it())})}),RA(()=>_(it()),()=>{x(Yn,{type:\"button\",icon:P4,title:\"Search (Ctrl+F)\",className:\"jse-search\",onClick:mt,disabled:it()===void 0})}),RA(()=>(_(bi()),c(si),c(Wo),_(Jo()),_(it()),_(Cn()),c(Yn),_(Lt()),_(Uo()),_(Hi()),_(Jn()),_(Vi()),c(pe)),()=>{x(Yo,bi()?[c(si),c(Wo),{type:\"separator\"},{type:\"button\",icon:j0,title:\"Copy (Ctrl+C)\",className:\"jse-copy\",onClick:Vi(),disabled:!c(pe)},{type:\"separator\"},c(Yn),{type:\"space\"}]:[c(si),c(Wo),{type:\"separator\"},{type:\"button\",icon:V4,title:\"Sort\",className:\"jse-sort\",onClick:Jo(),disabled:bi()||it()===void 0},{type:\"button\",icon:z4,title:\"Transform contents (filter, sort, project)\",className:\"jse-transform\",onClick:Cn(),disabled:bi()||it()===void 0},c(Yn),{type:\"button\",icon:lM,title:WR,className:\"jse-contextmenu\",onClick:Lt()},{type:\"separator\"},{type:\"button\",icon:c8,title:\"Undo (Ctrl+Z)\",className:\"jse-undo\",onClick:Uo(),disabled:!Hi().canUndo},{type:\"button\",icon:l8,title:\"Redo (Ctrl+Shift+Z)\",className:\"jse-redo\",onClick:Jn(),disabled:!Hi().canRedo},{type:\"space\"}])}),RA(()=>(_(Vt()),c(Yo)),()=>{x(we,Vt()(c(Yo))||c(Yo))}),mn(),$t(!0),aw(fA,{get items(){return c(we)}}),St()})(q,{get json(){return c(EA)},get selection(){return c(pA)},get readOnly(){return B()},get history(){return f()},onExpandAll:re,onCollapseAll:Se,onUndo:So,onRedo:la,onSort:Ja,onTransform:kn,onContextMenu:jt,onCopy:gi,get onRenderMenu(){return hA()},get showSearch(){return c(ht)},set showSearch(fA){x(ht,fA)},$$legacy:!0})};YA(Z,q=>{R()&&q(gA)});var DA=bA(Z,2),Ae=q=>{uDA(q,{get json(){return c(EA)},get selection(){return c(pA)},onSelect:cn,get onError(){return yA()},get pathParser(){return AA()}})};YA(DA,q=>{M()&&q(Ae)});var ne=bA(DA,2),Be=q=>{var fA=ODA(),PA=$e(fA),Ne=cA(PA);Ne.readOnly=!0,Mo(Ne,zt=>x(l,zt),()=>c(l));var pe=bA(PA,2),we=zt=>{var bi=yi(),Dn=$e(bi),Hi=qt=>{(function(Uo,Jn){function Jo(si){si.stopPropagation(),Jn.onCreateObject()}function Cn(si){si.stopPropagation(),Jn.onCreateArray()}kt(Jn,!0);var Lt=aDA();Lt.__click=()=>Jn.onClick();var Vi=bA(cA(Lt),2),Vt=bA(cA(Vi),2),mt=si=>{var Wo=oDA(),Yn=bA($e(Wo),2);fn(Yn,\"title\",\"Create an empty JSON object (press '{')\"),Yn.__click=Jo;var Yo=bA(Yn,2);fn(Yo,\"title\",\"Create an empty JSON array (press '[')\"),Yo.__click=Cn,lA(si,Wo)};YA(Vt,si=>{Jn.readOnly||si(mt)}),lA(Uo,Lt),St()})(qt,{get readOnly(){return B()},onCreateObject:()=>{Mt(),tn(\"{\")},onCreateArray:()=>{Mt(),tn(\"[\")},onClick:()=>{Mt()}})},no=qt=>{var Uo=YDA(),Jn=$e(Uo),Jo=et(()=>B()?[]:[{icon:j4,text:\"Repair manually\",title:'Open the document in \"code\" mode and repair it manually',onClick:Un}]);Mg(Jn,{type:\"error\",message:\"The loaded JSON document is invalid and could not be repaired automatically.\",get actions(){return c(Jo)}}),p$(bA(Jn,2),{get text(){return c(ZA)},get json(){return c(EA)},get indentation(){return z()},get parser(){return G()}}),lA(qt,Uo)};YA(Dn,qt=>{c(ZA)===\"\"||c(ZA)===void 0?qt(Hi):qt(no,!1)}),lA(zt,bi)},it=zt=>{var bi=TDA(),Dn=$e(bi);d$(cA(Dn),{get json(){return c(EA)},get documentState(){return c(_A)},get parser(){return G()},get showSearch(){return c(ht)},get showReplace(){return c(Me)},get readOnly(){return B()},columns:void 0,onSearch:Ai,onFocus:J,onPatch:VA,onClose:tA});var Hi=bA(Dn,2);fn(Hi,\"data-jsoneditor-scrollable-contents\",!0);var no=cA(Hi),qt=Vt=>{lA(Vt,HDA())};YA(no,Vt=>{c(ht)&&Vt(qt)}),kR(bA(no,2),{get value(){return c(EA)},pointer:\"\",get state(){return c(_A)},get validationErrors(){return c(LA)},get searchResults(){return c(Te)},get selection(){return c(pA)},get context(){return c(w)},get onDragSelectionStart(){return ra}}),Mo(Hi,Vt=>x(g,Vt),()=>c(g));var Uo=bA(Hi,2),Jn=Vt=>{var mt=et(()=>(c(_t),QA(()=>\"You pasted a JSON \".concat(Array.isArray(c(_t).contents)?\"array\":\"object\",\" as text\")))),si=et(()=>[{icon:P0,text:\"Paste as JSON instead\",title:\"Replace the value with the pasted JSON\",onMouseDown:Si},{text:\"Leave as is\",title:\"Keep the JSON embedded in the value\",onClick:xi}]);Mg(Vt,{type:\"info\",get message(){return c(mt)},get actions(){return c(si)}})};YA(Uo,Vt=>{c(_t)&&Vt(Jn)});var Jo=bA(Uo,2),Cn=Vt=>{var mt=et(()=>[{icon:P0,text:\"Paste as string instead\",title:\"Paste the clipboard data as a single string value instead of an array\",onClick:Ft},{text:\"Leave as is\",title:\"Keep the pasted array\",onClick:Yi}]);Mg(Vt,{type:\"info\",message:\"Multiline text was pasted as array\",get actions(){return c(mt)}})};YA(Jo,Vt=>{c(Ue)&&Vt(Cn)});var Lt=bA(Jo,2),Vi=Vt=>{var mt=et(()=>B()?[]:[{icon:g8,text:\"Ok\",title:\"Accept the repaired document\",onClick:Nt},{icon:j4,text:\"Repair manually instead\",title:\"Leave the document unchanged and repair it manually instead\",onClick:Un}]);Mg(Vt,{type:\"success\",message:\"The loaded JSON document was invalid but is successfully repaired.\",get actions(){return c(mt)},onClose:Mt})};YA(Lt,Vt=>{c(Ee)&&Vt(Vi)}),gN(bA(Lt,2),{get validationErrors(){return c(xA)},selectError:oA}),lA(zt,bi)};YA(pe,zt=>{c(EA)===void 0?zt(we):zt(it,!1)}),ue(\"paste\",Ne,gn),lA(q,fA)},Ye=q=>{lA(q,zDA())};YA(ne,q=>{n?q(Ye,!1):q(Be)}),Mo(H,q=>x(C,q),()=>c(C));var ke=bA(H,2),Re=q=>{s$(q,{onClose:()=>x(uA,!1)})};YA(ke,q=>{c(uA)&&q(Re)});var ii=bA(ke,2),xn=q=>{g$(q,oI(()=>c(XA),{onClose:()=>{var fA;(fA=c(XA))===null||fA===void 0||fA.onClose(),x(XA,void 0)}}))};return YA(ii,q=>{c(XA)&&q(xn)}),ve(()=>k=Xt(H,1,\"jse-tree-mode svelte-10mlrw4\",null,k,{\"no-main-menu\":!R()})),ue(\"keydown\",H,function(q){var fA=fC(q),PA=q.shiftKey;if(i(\"keydown\",{combo:fA,key:q.key}),fA===\"Ctrl+X\"&&(q.preventDefault(),L(!0)),fA===\"Ctrl+Shift+X\"&&(q.preventDefault(),L(!1)),fA===\"Ctrl+C\"&&(q.preventDefault(),gi(!0)),fA===\"Ctrl+Shift+C\"&&(q.preventDefault(),gi(!1)),fA===\"Ctrl+D\"&&(q.preventDefault(),co()),fA!==\"Delete\"&&fA!==\"Backspace\"||(q.preventDefault(),Go()),fA===\"Insert\"&&(q.preventDefault(),Ko(\"structure\")),fA===\"Ctrl+A\"&&(q.preventDefault(),x(pA,_i([]))),fA===\"Ctrl+Q\"&&Gi(q),fA===\"ArrowUp\"||fA===\"Shift+ArrowUp\"){q.preventDefault();var Ne=c(pA)?UW(c(EA),c(_A),c(pA),PA)||c(pA):NQ(c(EA),c(_A));x(pA,Ne),mo(st(Ne))}if(fA===\"ArrowDown\"||fA===\"Shift+ArrowDown\"){q.preventDefault();var pe=c(pA)?(function(Hi,no,qt){var Uo=arguments.length>3&&arguments[3]!==void 0&&arguments[3];if(qt){var Jn=Uo?st(qt):rI(Hi,qt),Jo=jo(Pe(Hi,Jn))?LW(Hi,no,Jn,!0):no,Cn=Px(Hi,no,Jn),Lt=Px(Hi,Jo,Jn);if(Uo)return Ka(qt)?Cn!==void 0?ns(Cn,Cn):void 0:Xs(qt)?Lt!==void 0?ns(Lt,Lt):void 0:Lt!==void 0?ns(O1(qt),Lt):void 0;if(Xs(qt))return Lt!==void 0?_i(Lt):void 0;if(Ka(qt)||an(qt))return Cn!==void 0?_i(Cn):void 0;if(ja(qt)){if(Cn===void 0||Cn.length===0)return;var Vi=Li(Cn),Vt=Pe(Hi,Vi);return Array.isArray(Vt)?_i(Cn):mC(Cn)}return $n(qt)?Lt!==void 0?_i(Lt):Cn!==void 0?_i(Cn):void 0:void 0}})(c(EA),c(_A),c(pA),PA)||c(pA):NQ(c(EA),c(_A));x(pA,pe),mo(st(pe))}if(fA===\"ArrowLeft\"||fA===\"Shift+ArrowLeft\"){q.preventDefault();var we=c(pA)?(function(Hi,no,qt){var Uo=arguments.length>3&&arguments[3]!==void 0&&arguments[3],Jn=!(arguments.length>4&&arguments[4]!==void 0)||arguments[4];if(qt){var{caret:Jo,previous:Cn}=JW(Hi,no,qt,Jn);if(Uo)return $n(qt)?void 0:ns(qt.path,qt.path);if(Jo&&Cn)return mR(Cn);var Lt=Li(st(qt)),Vi=Pe(Hi,Lt);return an(qt)&&Array.isArray(Vi)?ns(qt.path,qt.path):$n(qt)&&!Array.isArray(Vi)?mC(qt.focusPath):void 0}})(c(EA),c(_A),c(pA),PA,!B())||c(pA):NQ(c(EA),c(_A));x(pA,we),mo(st(we))}if(fA===\"ArrowRight\"||fA===\"Shift+ArrowRight\"){q.preventDefault();var it=c(pA)&&c(EA)!==void 0?(function(Hi,no,qt){var Uo=arguments.length>3&&arguments[3]!==void 0&&arguments[3],Jn=!(arguments.length>4&&arguments[4]!==void 0)||arguments[4];if(qt){var{caret:Jo,next:Cn}=JW(Hi,no,qt,Jn);return Uo?$n(qt)?void 0:ns(qt.path,qt.path):Jo&&Cn?mR(Cn):$n(qt)?_i(qt.focusPath):void 0}})(c(EA),c(_A),c(pA),PA,!B())||c(pA):NQ(c(EA),c(_A));x(pA,it),mo(st(it))}if(fA===\"Enter\"&&c(pA)){if(ew(c(pA))){var zt=c(pA).focusPath,bi=Pe(c(EA),Li(zt));Array.isArray(bi)&&(q.preventDefault(),x(pA,_i(zt)))}ja(c(pA))&&(q.preventDefault(),x(pA,ye(ye({},c(pA)),{},{edit:!0}))),an(c(pA))&&(q.preventDefault(),jo(Pe(c(EA),c(pA).path))?SA(c(pA).path,!0):x(pA,ye(ye({},c(pA)),{},{edit:!0})))}if(fA.replace(/^Shift\\+/,\"\").length===1&&c(pA))return q.preventDefault(),void tn(q.key);if(fA===\"Enter\"&&(Xs(c(pA))||Ka(c(pA))))return q.preventDefault(),void tn(\"\");if(fA===\"Ctrl+Enter\"&&an(c(pA))){var Dn=Pe(c(EA),c(pA).path);$D(Dn)&&window.open(String(Dn),\"_blank\")}fA===\"Escape\"&&c(pA)&&(q.preventDefault(),x(pA,void 0)),fA===\"Ctrl+F\"&&(q.preventDefault(),tt(!1)),fA===\"Ctrl+H\"&&(q.preventDefault(),tt(!0)),fA===\"Ctrl+Z\"&&(q.preventDefault(),So()),fA===\"Ctrl+Shift+Z\"&&(q.preventDefault(),la())}),ue(\"mousedown\",H,function(q){i(\"handleMouseDown\",q);var fA=q.target;MX(fA,\"BUTTON\")||fA.isContentEditable||(Mt(),c(pA)||c(EA)!==void 0||c(ZA)!==\"\"&&c(ZA)!==void 0||(i(\"createDefaultSelection\"),x(pA,_i([]))))}),ue(\"contextmenu\",H,Gi),lA(t,T),Tt(e,\"expand\",NA),Tt(e,\"collapse\",de),Tt(e,\"validate\",Je),Tt(e,\"getJson\",Ge),Tt(e,\"patch\",vi),Tt(e,\"acceptAutoRepair\",Nt),Tt(e,\"openTransformModal\",Io),Tt(e,\"scrollTo\",Mi),Tt(e,\"findElement\",pn),Tt(e,\"findSearchResult\",io),Tt(e,\"focus\",Mt),St(S)}function w$(t){return typeof(e=t)!=\"object\"||e===null?t:new Proxy(t,{get:(A,i,n)=>w$(Reflect.get(A,i,n)),set:()=>!1,deleteProperty:()=>!1});var e}var ED=qa(\"jsoneditor:History\");function y$(){var t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},e=t.maxItems||1e3,A=[],i=0;function n(){return i<A.length}function o(){return i>0}function a(){return{canUndo:n(),canRedo:o(),items:()=>A.slice().reverse(),add:s,undo:l,redo:C,clear:g}}function r(){t.onChange&&t.onChange(a())}function s(I){ED(\"add\",I),A=[I].concat(A.slice(i)).slice(0,e),i=0,r()}function g(){ED(\"clear\"),A=[],i=0,r()}function l(){if(n()){var I=A[i];return i+=1,ED(\"undo\",I),r(),I}}function C(){if(o())return ED(\"redo\",A[i-=1]),r(),A[i]}return{get:a}}Pt(`/* over all fonts, sizes, and colors */\n/* \"consolas\" for Windows, \"menlo\" for Mac with fallback to \"monaco\", 'Ubuntu Mono' for Ubuntu */\n/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */\n/* main, menu, modal */\n/* jsoneditor modal */\n/* tooltip in text mode */\n/* panels: navigation bar, gutter, search box */\n/* navigation-bar */\n/* context menu */\n/* contents: json key and values */\n/* contents: selected or hovered */\n/* contents: section of collapsed items in an array */\n/* contents: highlighting of search matches */\n/* contents: inline tags inside the JSON document */\n/* contents: table */\n/* controls in modals: inputs, buttons, and \\`a\\` */\n/* messages */\n/* svelte-select */\n/* color picker */\n.jse-transform-modal-inner.svelte-lta8xm {\n  flex: 1;\n  display: flex;\n  flex-direction: column;\n  min-width: 0;\n  min-height: 0;\n}\n.jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) {\n  color: inherit;\n  flex: 1;\n  display: flex;\n  flex-direction: column;\n  padding: 0;\n  overflow: auto;\n  min-width: 0;\n  min-height: 0;\n}\n.jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-actions:where(.svelte-lta8xm) {\n  display: flex;\n  flex-direction: row;\n  justify-content: flex-end;\n  padding-top: var(--jse-padding, 10px);\n}\n.jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-actions:where(.svelte-lta8xm) button.jse-primary:where(.svelte-lta8xm) {\n  border: none;\n  background: transparent;\n  color: inherit;\n  cursor: pointer;\n  font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen-Sans, Ubuntu, Cantarell, \"Helvetica Neue\", sans-serif);\n  font-size: var(--jse-font-size, 16px);\n  padding: 5px;\n  margin: 0;\n  background: var(--jse-button-primary-background, var(--jse-theme-color, #3883fa));\n  color: var(--jse-button-primary-color, #fff);\n  padding: var(--jse-padding, 10px) calc(2 * var(--jse-padding, 10px));\n  border-radius: 3px;\n}\n.jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-actions:where(.svelte-lta8xm) button.jse-primary:where(.svelte-lta8xm):hover {\n  background: var(--jse-button-primary-background-highlight, var(--jse-theme-color-highlight, #5f9dff));\n}\n.jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-actions:where(.svelte-lta8xm) button.jse-primary:where(.svelte-lta8xm):disabled {\n  background: var(--jse-button-primary-background-disabled, #9d9d9d);\n}\n.jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) {\n  flex: 1;\n  display: flex;\n  gap: calc(2 * var(--jse-padding, 10px));\n  min-height: 0;\n  box-sizing: border-box;\n  padding: 0 calc(2 * var(--jse-padding, 10px)) var(--jse-padding, 10px);\n}\n.jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) .jse-query-contents:where(.svelte-lta8xm) {\n  flex: 1;\n  display: flex;\n  flex-direction: column;\n}\n.jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) .jse-query-contents:where(.svelte-lta8xm) .jse-description:where(.svelte-lta8xm) p {\n  margin: var(--jse-padding, 10px) 0;\n}\n.jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) .jse-query-contents:where(.svelte-lta8xm) .jse-description:where(.svelte-lta8xm) p:first-child {\n  margin-top: 0;\n}\n.jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) .jse-query-contents:where(.svelte-lta8xm) .jse-description:where(.svelte-lta8xm) p:last-child {\n  margin-bottom: 0;\n}\n.jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) .jse-query-contents:where(.svelte-lta8xm) .jse-description:where(.svelte-lta8xm) code {\n  background: var(--jse-modal-code-background, rgba(0, 0, 0, 0.05));\n  font-family: var(--jse-font-family-mono, consolas, menlo, monaco, \"Ubuntu Mono\", \"source-code-pro\", monospace);\n  font-size: var(--jse-font-size-mono, 14px);\n}\n.jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) .jse-query-contents:where(.svelte-lta8xm) .query-error:where(.svelte-lta8xm) {\n  color: var(--jse-error-color, #ee5341);\n}\n.jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) .jse-query-contents:where(.svelte-lta8xm) textarea.jse-query:where(.svelte-lta8xm) {\n  flex: 1;\n  outline: none;\n  resize: vertical;\n}\n.jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) .jse-data-contents:where(.svelte-lta8xm) {\n  flex: 1;\n  display: flex;\n  flex-direction: column;\n  gap: calc(2 * var(--jse-padding, 10px));\n}\n.jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) .jse-data-contents:where(.svelte-lta8xm) .jse-original-data:where(.svelte-lta8xm) {\n  flex: 1;\n  display: flex;\n  flex-direction: column;\n  min-height: 0;\n  box-sizing: border-box;\n}\n.jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) .jse-data-contents:where(.svelte-lta8xm) .jse-original-data.jse-hide:where(.svelte-lta8xm) {\n  flex: none;\n}\n.jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) .jse-data-contents:where(.svelte-lta8xm) .jse-preview-data:where(.svelte-lta8xm) {\n  flex: 1;\n  display: flex;\n  flex-direction: column;\n  min-height: 0;\n  box-sizing: border-box;\n}\n.jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) .jse-data-contents.jse-hide-original-data:where(.svelte-lta8xm) {\n  flex-direction: column;\n  gap: 0;\n  margin-bottom: 0;\n}\n.jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-actions:where(.svelte-lta8xm) {\n  padding: var(--jse-padding, 10px) calc(2 * var(--jse-padding, 10px)) calc(2 * var(--jse-padding, 10px));\n}\n@media screen and (max-width: 1200px) {\n  .jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) {\n    flex-direction: column;\n    overflow: auto;\n  }\n  .jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) .jse-query-contents:where(.svelte-lta8xm) textarea.jse-query:where(.svelte-lta8xm) {\n    min-height: 150px;\n    flex: none;\n  }\n  .jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) .jse-data-contents:where(.svelte-lta8xm) .jse-tree-mode {\n    height: 300px;\n    flex: none;\n  }\n  .jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) .jse-data-contents:where(.svelte-lta8xm) .jse-original-data:where(.svelte-lta8xm),\n  .jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) .jse-data-contents:where(.svelte-lta8xm) .jse-preview-data:where(.svelte-lta8xm) {\n    flex: unset;\n  }\n}\n.jse-transform-modal-inner.svelte-lta8xm .jse-label:where(.svelte-lta8xm) {\n  font-weight: bold;\n  display: block;\n  box-sizing: border-box;\n}\n.jse-transform-modal-inner.svelte-lta8xm .jse-label:where(.svelte-lta8xm) .jse-label-inner:where(.svelte-lta8xm) {\n  margin-top: calc(2 * var(--jse-padding, 10px));\n  margin-bottom: calc(0.5 * var(--jse-padding, 10px));\n  box-sizing: border-box;\n}\n.jse-transform-modal-inner.svelte-lta8xm .jse-label:where(.svelte-lta8xm) .jse-label-inner:where(.svelte-lta8xm) button:where(.svelte-lta8xm) {\n  border: none;\n  background: transparent;\n  color: inherit;\n  cursor: pointer;\n  font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen-Sans, Ubuntu, Cantarell, \"Helvetica Neue\", sans-serif);\n  font-size: var(--jse-font-size, 16px);\n  padding: 5px;\n  margin: 0;\n  font-weight: bold;\n  padding: 0;\n}\n.jse-transform-modal-inner.svelte-lta8xm .jse-tree-mode {\n  flex: 1;\n  background: var(--jse-input-background-readonly, transparent);\n  box-shadow: none;\n  box-sizing: border-box;\n  --jse-main-border: var(--jse-input-border, 1px solid #d8dbdf);\n}\n.jse-transform-modal-inner.svelte-lta8xm input:where(.svelte-lta8xm),\n.jse-transform-modal-inner.svelte-lta8xm textarea:where(.svelte-lta8xm) {\n  border: var(--jse-input-border, 1px solid #d8dbdf);\n  outline: none;\n  box-sizing: border-box;\n  padding: calc(0.5 * var(--jse-padding, 10px));\n  font-family: var(--jse-font-family-mono, consolas, menlo, monaco, \"Ubuntu Mono\", \"source-code-pro\", monospace);\n  font-size: var(--jse-font-size-mono, 14px);\n  color: inherit;\n  background: var(--jse-input-background, var(--jse-background-color, #fff));\n}\n.jse-transform-modal-inner.svelte-lta8xm input:where(.svelte-lta8xm):focus,\n.jse-transform-modal-inner.svelte-lta8xm textarea:where(.svelte-lta8xm):focus {\n  border: var(--jse-input-border-focus, 1px solid var(--jse-input-border-focus, var(--jse-theme-color, #3883fa)));\n}\n.jse-transform-modal-inner.svelte-lta8xm input:where(.svelte-lta8xm):read-only,\n.jse-transform-modal-inner.svelte-lta8xm textarea:where(.svelte-lta8xm):read-only {\n  background: var(--jse-input-background-readonly, transparent);\n}\n.jse-transform-modal-inner.svelte-lta8xm .jse-preview.jse-error:where(.svelte-lta8xm) {\n  flex: 1;\n  background: var(--jse-input-background-readonly, transparent);\n  border: var(--jse-input-border, 1px solid #d8dbdf);\n  color: var(--jse-error-color, #ee5341);\n  padding: calc(0.5 * var(--jse-padding, 10px));\n}\n.jse-transform-modal-inner.svelte-lta8xm a {\n  color: var(--jse-a-color, #156fc5);\n}\n.jse-transform-modal-inner.svelte-lta8xm a:hover {\n  color: var(--jse-a-color-highlight, #0f508d);\n}`);var P3=XD(()=>A8A),LQ=XD(()=>e8A),jDA=FA('<div class=\"query-error svelte-lta8xm\"> </div>'),qDA=FA(\"<!> <!>\",1),VDA=FA('<div class=\"jse-preview jse-error svelte-lta8xm\"> </div>'),WDA=FA('<!> <div class=\"jse-modal-contents svelte-lta8xm\"><div class=\"jse-main-contents svelte-lta8xm\"><div class=\"jse-query-contents svelte-lta8xm\"><div class=\"jse-label svelte-lta8xm\"><div class=\"jse-label-inner svelte-lta8xm\">Language</div></div> <div class=\"jse-description svelte-lta8xm\"><!></div> <div class=\"jse-label svelte-lta8xm\"><div class=\"jse-label-inner svelte-lta8xm\">Path</div></div> <input class=\"jse-path svelte-lta8xm\" type=\"text\" readonly=\"\" title=\"Selected path\"/> <div class=\"jse-label svelte-lta8xm\"><div class=\"jse-label-inner svelte-lta8xm\"><button type=\"button\" class=\"svelte-lta8xm\"><!> Wizard</button></div></div> <!> <div class=\"jse-label svelte-lta8xm\"><div class=\"jse-label-inner svelte-lta8xm\">Query</div></div> <textarea class=\"jse-query svelte-lta8xm\" spellcheck=\"false\"></textarea></div> <div><div><div class=\"jse-label svelte-lta8xm\"><div class=\"jse-label-inner svelte-lta8xm\"><button type=\"button\" class=\"svelte-lta8xm\"><!> Original</button></div></div> <!></div> <div class=\"jse-preview-data svelte-lta8xm\"><div class=\"jse-label svelte-lta8xm\"><div class=\"jse-label-inner svelte-lta8xm\">Preview</div></div> <!></div></div></div> <div class=\"jse-actions svelte-lta8xm\"><button type=\"button\" class=\"jse-primary svelte-lta8xm\">Transform</button></div></div>',1),ZDA=FA('<div class=\"jse-transform-modal-inner svelte-lta8xm\"><!></div>');function XDA(t,e){var A,i,n;kt(e,!1);var o=qa(\"jsoneditor:TransformModal\"),a=N(e,\"id\",25,()=>\"transform-modal-\"+YQ()),r=N(e,\"json\",9),s=N(e,\"rootPath\",25,()=>[]),g=N(e,\"indentation\",9),l=N(e,\"truncateTextSize\",9),C=N(e,\"escapeControlCharacters\",9),I=N(e,\"escapeUnicodeCharacters\",9),d=N(e,\"parser\",9),B=N(e,\"parseMemoizeOne\",9),Q=N(e,\"validationParser\",9),E=N(e,\"pathParser\",9),f=N(e,\"queryLanguages\",9),b=N(e,\"queryLanguageId\",13),R=N(e,\"onChangeQueryLanguage\",9),M=N(e,\"onRenderValue\",9),v=N(e,\"onRenderMenu\",9),F=N(e,\"onRenderContextMenu\",9),G=N(e,\"onClassName\",9),U=N(e,\"onTransform\",9),Y=N(e,\"onClose\",9),j=CA(void 0,!0),AA=CA(y$({onChange:_A=>x(AA,_A)}).get(),!0),z=CA(void 0,!0),yA=CA(void 0,!0),P=CA(!1,!0),nA=\"\".concat(a(),\":\").concat(pt(s())),eA=(A=P3()[nA])!==null&&A!==void 0?A:{},dA=CA(LQ().showWizard!==!1,!0),iA=CA(LQ().showOriginal!==!1,!0),aA=CA((i=eA.queryOptions)!==null&&i!==void 0?i:{},!0),hA=CA(b()===eA.queryLanguageId&&eA.query?eA.query:\"\",!0),JA=CA((n=eA.isManual)!==null&&n!==void 0&&n,!0),ee=CA(void 0,!0),UA=CA(void 0,!0),mA=CA({text:\"\"},!0);function KA(_A){var pA;return(pA=f().find(Rt=>Rt.id===_A))!==null&&pA!==void 0?pA:f()[0]}function ze(_A){try{x(aA,_A),x(hA,KA(b()).createQuery(c(z),_A)),x(ee,void 0),x(JA,!1),o(\"updateQueryByWizard\",{queryOptions:c(aA),query:c(hA),isManual:c(JA)})}catch(pA){x(ee,String(pA))}}function Ke(_A){x(hA,_A.target.value),x(JA,!0),o(\"handleChangeQuery\",{query:c(hA),isManual:c(JA)})}c(JA)||ze(c(aA)),Jr(()=>{var _A;(_A=c(j))===null||_A===void 0||_A.focus()});var HA=PB(function(_A,pA){if(_A===void 0)return x(mA,{text:\"\"}),void x(UA,\"Error: No JSON\");if(pA.trim()!==\"\")try{o(\"previewTransform\",{query:pA});var Rt=KA(b()).executeQuery(_A,pA,d());x(mA,{json:Rt}),x(UA,void 0)}catch(Et){x(mA,{text:\"\"}),x(UA,String(Et))}else x(mA,{json:_A})},300);function uA(){if(c(z)===void 0)return x(mA,{text:\"\"}),void x(UA,\"Error: No JSON\");try{o(\"handleTransform\",{query:c(hA)});var _A=KA(b()).executeQuery(c(z),c(hA),d());U()([{op:\"replace\",path:pt(s()),value:_A}]),Y()()}catch(pA){console.error(pA),x(mA,{text:\"\"}),x(UA,String(pA))}}function XA(){x(dA,!c(dA)),LQ(LQ().showWizard=c(dA))}function EA(){x(iA,!c(iA)),LQ(LQ().showOriginal=c(iA))}function ZA(_A){_A.focus()}function MA(_A){o(\"handleChangeQueryLanguage\",_A),b(_A),R()(_A),ze(c(aA))}function be(){c(P)?x(P,!c(P)):Y()()}RA(()=>(_(r()),_(s())),()=>{x(z,w$(Pe(r(),s())))}),RA(()=>c(z),()=>{x(yA,c(z)?{json:c(z)}:{text:\"\"})}),RA(()=>(c(z),c(hA)),()=>{HA(c(z),c(hA))}),RA(()=>(P3(),c(aA),c(hA),_(b()),c(JA)),()=>{P3(P3()[nA]={queryOptions:c(aA),query:c(hA),queryLanguageId:b(),isManual:c(JA)}),o(\"store state in memory\",nA,P3()[nA])}),mn(),$t(!0),cu(t,{get onClose(){return Y()},className:\"jse-transform-modal\",get fullscreen(){return c(P)},children:(_A,pA)=>{var Rt=ZDA();QR(cA(Rt),{children:(Et,Qe)=>{var _t=WDA(),Ue=$e(_t);(function(L,gt){kt(gt,!1);var gi,sn=N(gt,\"queryLanguages\",9),gn=N(gt,\"queryLanguageId\",9),Kn=N(gt,\"fullscreen\",13),ko=N(gt,\"onChangeQueryLanguage\",9),eo=N(gt,\"onClose\",9),fo=CA(void 0,!0),{openAbsolutePopup:Go,closeAbsolutePopup:co}=cI(\"absolute-popup\");function ta(){var Ko={queryLanguages:sn(),queryLanguageId:gn(),onChangeQueryLanguage:qo=>{co(gi),ko()(qo)}};gi=Go(W8A,Ko,{offsetTop:-2,offsetLeft:0,anchor:c(fo),closeOnOuterClick:!0})}$t(!0),zD(L,{title:\"Transform\",fullScreenButton:!0,get onClose(){return eo()},get fullscreen(){return Kn()},set fullscreen(Ko){Kn(Ko)},$$slots:{actions:(Ko,qo)=>{var Co,se=$8A();Pi(cA(se),{get data(){return ZO}}),Mo(se,Ci=>x(fo,Ci),()=>c(fo)),ve(()=>Co=Xt(se,1,\"jse-config svelte-5gkegr\",null,Co,{hide:sn().length<=1})),ue(\"click\",se,ta),lA(Ko,se)}},$$legacy:!0}),St()})(Ue,{get queryLanguages(){return f()},get queryLanguageId(){return b()},onChangeQueryLanguage:MA,get onClose(){return Y()},get fullscreen(){return c(P)},set fullscreen(L){x(P,L)},$$legacy:!0});var Te=cA(bA(Ue,2)),ht=cA(Te),Me=bA(cA(ht),2);cX(cA(Me),()=>(_(b()),QA(()=>KA(b()).description)));var Ai=bA(Me,4),J=bA(Ai,2),O=cA(J),tA=cA(O),oA=cA(tA),NA=et(()=>c(dA)?qc:qB);Pi(oA,{get data(){return c(NA)}});var de=bA(J,2),Ee=L=>{var gt=yi(),gi=$e(gt),sn=Kn=>{var ko=qDA(),eo=$e(ko);j8A(eo,{get queryOptions(){return c(aA)},get json(){return c(z)},onChange:ze});var fo=bA(eo,2),Go=co=>{var ta=jDA(),Ko=cA(ta);ve(()=>xt(Ko,c(ee))),lA(co,ta)};YA(fo,co=>{c(ee)&&co(Go)}),lA(Kn,ko)},gn=Kn=>{lA(Kn,tr(\"(Only available for arrays, not for objects)\"))};YA(gi,Kn=>{c(z),QA(()=>Array.isArray(c(z)))?Kn(sn):Kn(gn,!1)}),lA(L,gt)};YA(de,L=>{c(dA)&&L(Ee)});var xA=bA(de,4);Mo(xA,L=>x(j,L),()=>c(j));var LA,dt,At=bA(ht,2),Je=cA(At),Ge=cA(Je),ri=cA(Ge),en=cA(ri),rn=cA(en),Le=et(()=>c(iA)?qc:qB);Pi(rn,{get data(){return c(Le)}});var ji=bA(Ge,2),Bi=L=>{LR(L,{get externalContent(){return c(yA)},externalSelection:void 0,get history(){return c(AA)},readOnly:!0,get truncateTextSize(){return l()},mainMenuBar:!1,navigationBar:!1,get indentation(){return g()},get escapeControlCharacters(){return C()},get escapeUnicodeCharacters(){return I()},get parser(){return d()},get parseMemoizeOne(){return B()},get onRenderValue(){return M()},get onRenderMenu(){return v()},get onRenderContextMenu(){return F()},onError:QA(()=>console.error),get onChange(){return ra},get onChangeMode(){return ra},get onSelect(){return ra},get onUndo(){return ra},get onRedo(){return ra},get onFocus(){return ra},get onBlur(){return ra},get onSortModal(){return ra},get onTransformModal(){return ra},get onJSONEditorModal(){return ra},get onClassName(){return G()},validator:void 0,get validationParser(){return Q()},get pathParser(){return E()}})};YA(ji,L=>{c(iA)&&L(Bi)});var vi=bA(Je,2),Ji=bA(cA(vi),2),Dt=L=>{LR(L,{get externalContent(){return c(mA)},externalSelection:void 0,get history(){return c(AA)},readOnly:!0,get truncateTextSize(){return l()},mainMenuBar:!1,navigationBar:!1,get indentation(){return g()},get escapeControlCharacters(){return C()},get escapeUnicodeCharacters(){return I()},get parser(){return d()},get parseMemoizeOne(){return B()},get onRenderValue(){return M()},get onRenderMenu(){return v()},get onRenderContextMenu(){return F()},onError:QA(()=>console.error),get onChange(){return ra},get onChangeMode(){return ra},get onSelect(){return ra},get onUndo(){return ra},get onRedo(){return ra},get onFocus(){return ra},get onBlur(){return ra},get onSortModal(){return ra},get onTransformModal(){return ra},get onJSONEditorModal(){return ra},get onClassName(){return G()},validator:void 0,get validationParser(){return Q()},get pathParser(){return E()}})},qi=L=>{var gt=VDA(),gi=cA(gt);ve(()=>xt(gi,c(UA))),lA(L,gt)};YA(Ji,L=>{c(UA)?L(qi,!1):L(Dt)});var Nt=cA(bA(Te,2));Er(()=>ue(\"click\",Nt,uA)),as(Nt,L=>ZA?.(L)),ve(L=>{Z1(Ai,L),Z1(xA,c(hA)),LA=Xt(At,1,\"jse-data-contents svelte-lta8xm\",null,LA,{\"jse-hide-original-data\":!c(iA)}),dt=Xt(Je,1,\"jse-original-data svelte-lta8xm\",null,dt,{\"jse-hide\":!c(iA)}),Nt.disabled=!!c(UA)},[()=>(_(zi),_(s()),_($s),QA(()=>zi(s())?\"(document root)\":$s(s())))]),ue(\"click\",tA,XA),ue(\"input\",xA,Ke),ue(\"click\",en,EA),lA(Et,_t)},$$slots:{default:!0}}),as(Rt,(Et,Qe)=>PD?.(Et,Qe),()=>be),lA(_A,Rt)},$$slots:{default:!0}}),St()}function ol(){}var $DA=0,er=class{constructor(){var e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};this.id=$DA++,this.perNode=!!e.perNode,this.deserialize=e.deserialize||(()=>{throw new Error(\"This node type doesn't define a deserialize function\")}),this.combine=e.combine||null}add(e){if(this.perNode)throw new RangeError(\"Can't add per-node props to node types\");return typeof e!=\"function\"&&(e=Iu.match(e)),A=>{var i=e(A);return i===void 0?null:[this,i]}}};er.closedBy=new er({deserialize:t=>t.split(\" \")}),er.openedBy=new er({deserialize:t=>t.split(\" \")}),er.group=new er({deserialize:t=>t.split(\" \")}),er.isolate=new er({deserialize:t=>{if(t&&t!=\"rtl\"&&t!=\"ltr\"&&t!=\"auto\")throw new RangeError(\"Invalid value for isolate: \"+t);return t||\"auto\"}}),er.contextHash=new er({perNode:!0}),er.lookAhead=new er({perNode:!0}),er.mounted=new er({perNode:!0});var cZ,AwA=Object.create(null),Iu=class t{constructor(e,A,i){var n=arguments.length>3&&arguments[3]!==void 0?arguments[3]:0;this.name=e,this.props=A,this.id=i,this.flags=n}static define(e){var A=e.props&&e.props.length?Object.create(null):AwA,i=(e.top?1:0)|(e.skipped?2:0)|(e.error?4:0)|(e.name==null?8:0),n=new t(e.name||\"\",A,e.id,i);if(e.props){for(var o of e.props)if(Array.isArray(o)||(o=o(n)),o){if(o[0].perNode)throw new RangeError(\"Can't store a per-node prop on a node type\");A[o[0].id]=o[1]}}return n}prop(e){return this.props[e.id]}get isTop(){return(1&this.flags)>0}get isSkipped(){return(2&this.flags)>0}get isError(){return(4&this.flags)>0}get isAnonymous(){return(8&this.flags)>0}is(e){if(typeof e==\"string\"){if(this.name==e)return!0;var A=this.prop(er.group);return!!A&&A.indexOf(e)>-1}return this.id==e}static match(e){var A=Object.create(null);for(var i in e)for(var n of i.split(\" \"))A[n]=e[i];return o=>{for(var a=o.prop(er.group),r=-1;r<(a?a.length:0);r++){var s=A[r<0?o.name:a[r]];if(s)return s}}}};Iu.none=new Iu(\"\",Object.create(null),0,8),(function(t){t[t.ExcludeBuffers=1]=\"ExcludeBuffers\",t[t.IncludeAnonymous=2]=\"IncludeAnonymous\",t[t.IgnoreMounts=4]=\"IgnoreMounts\",t[t.IgnoreOverlays=8]=\"IgnoreOverlays\"})(cZ||(cZ={})),new er({perNode:!0});Pt(`/* over all fonts, sizes, and colors */\n/* \"consolas\" for Windows, \"menlo\" for Mac with fallback to \"monaco\", 'Ubuntu Mono' for Ubuntu */\n/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */\n/* main, menu, modal */\n/* jsoneditor modal */\n/* tooltip in text mode */\n/* panels: navigation bar, gutter, search box */\n/* navigation-bar */\n/* context menu */\n/* contents: json key and values */\n/* contents: selected or hovered */\n/* contents: section of collapsed items in an array */\n/* contents: highlighting of search matches */\n/* contents: inline tags inside the JSON document */\n/* contents: table */\n/* controls in modals: inputs, buttons, and \\`a\\` */\n/* messages */\n/* svelte-select */\n/* color picker */\n.jse-status-bar.svelte-1pmgv9j {\n  background: var(--jse-panel-background, #ebebeb);\n  color: var(--jse-panel-color-readonly, #b2b2b2);\n  font-family: var(--jse-font-family-mono, consolas, menlo, monaco, \"Ubuntu Mono\", \"source-code-pro\", monospace);\n  font-size: var(--jse-font-size-mono, 14px);\n  margin: 0;\n  border-top: var(--jse-panel-border, var(--jse-main-border, 1px solid #d7d7d7));\n  border-left: var(--jse-main-border, 1px solid #d7d7d7);\n  border-right: var(--jse-main-border, 1px solid #d7d7d7);\n  display: flex;\n  gap: var(--jse-padding, 10px);\n}\n.jse-status-bar.svelte-1pmgv9j:last-child {\n  border-bottom: var(--jse-main-border, 1px solid #d7d7d7);\n}\n.jse-status-bar.svelte-1pmgv9j .jse-status-bar-info:where(.svelte-1pmgv9j) {\n  padding: 2px;\n}`);var ewA=FA('<div class=\"jse-status-bar-info svelte-1pmgv9j\"> </div>'),twA=FA('<div class=\"jse-status-bar-info svelte-1pmgv9j\"> </div>'),iwA=FA('<div class=\"jse-status-bar-info svelte-1pmgv9j\"> </div>'),nwA=FA('<div class=\"jse-status-bar svelte-1pmgv9j\"><!> <!> <!></div>'),cN=mQ.define([{tag:xe.propertyName,color:\"var(--internal-key-color)\"},{tag:xe.number,color:\"var(--internal-value-color-number)\"},{tag:xe.bool,color:\"var(--internal-value-color-boolean)\"},{tag:xe.string,color:\"var(--internal-value-color-string)\"},{tag:xe.keyword,color:\"var(--internal-value-color-null)\"}]),owA=_S(cN),awA=cN.style;cN.style=t=>awA(t||[]);var rwA=[ho.fromClass(class{constructor(t){this.view=t,this.indentUnit=Xl(t.state),this.initialPaddingLeft=null,this.isChrome=window?.navigator.userAgent.includes(\"Chrome\"),this.generate(t.state)}update(t){var e=Xl(t.state);(e!==this.indentUnit||t.docChanged||t.viewportChanged)&&(this.indentUnit=e,this.generate(t.state))}generate(t){var e=new Nr;this.initialPaddingLeft?this.addStyleToBuilder(e,t,this.initialPaddingLeft):this.view.requestMeasure({read:A=>{var i=A.contentDOM.querySelector(\".cm-line\");i&&(this.initialPaddingLeft=window.getComputedStyle(i).getPropertyValue(\"padding-left\"),this.addStyleToBuilder(e,A.state,this.initialPaddingLeft)),this.decorations=e.finish()}}),this.decorations=e.finish()}addStyleToBuilder(t,e,A){var i=this.getVisibleLines(e);for(var n of i){var{numColumns:o,containsTab:a}=this.numColumns(n.text,e.tabSize),r=\"calc(\".concat(o+this.indentUnit,\"ch + \").concat(A,\")\"),s=this.isChrome?\"calc(-\".concat(o+this.indentUnit,\"ch - \").concat(a?1:0,\"px)\"):\"-\".concat(o+this.indentUnit,\"ch\");t.add(n.from,n.from,vt.line({attributes:{style:\"padding-left: \".concat(r,\"; text-indent: \").concat(s,\";\")}}))}}getVisibleLines(t){var e=new Set,A=null;for(var{from:i,to:n}of this.view.visibleRanges)for(var o=i;o<=n;){var a=t.doc.lineAt(o);A!==a&&(e.add(a),A=a),o=a.to+1}return e}numColumns(t,e){var A=0,i=!1;A:for(var n=0;n<t.length;n++)switch(t[n]){case\" \":A+=1;continue A;case\"\t\":A+=e-A%e,i=!0;continue A;case\"\\r\":continue A;default:break A}return{numColumns:A,containsTab:i}}},{decorations:t=>t.decorations})];Pt(`/* over all fonts, sizes, and colors */\n/* \"consolas\" for Windows, \"menlo\" for Mac with fallback to \"monaco\", 'Ubuntu Mono' for Ubuntu */\n/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */\n/* main, menu, modal */\n/* jsoneditor modal */\n/* tooltip in text mode */\n/* panels: navigation bar, gutter, search box */\n/* navigation-bar */\n/* context menu */\n/* contents: json key and values */\n/* contents: selected or hovered */\n/* contents: section of collapsed items in an array */\n/* contents: highlighting of search matches */\n/* contents: inline tags inside the JSON document */\n/* contents: table */\n/* controls in modals: inputs, buttons, and \\`a\\` */\n/* messages */\n/* svelte-select */\n/* color picker */\n.jse-text-mode.svelte-k2b9e6 {\n  --internal-key-color: var(--jse-key-color, #1a1a1a);\n  --internal-value-color-number: var(--jse-value-color-number, #ee422e);\n  --internal-value-color-boolean: var(--jse-value-color-boolean, #ff8c00);\n  --internal-value-color-string: var(--jse-value-color-string, #008000);\n  --internal-value-color-null: var(--jse-value-color-null, #004ed0);\n  flex: 1;\n  box-sizing: border-box;\n  display: flex;\n  flex-direction: column;\n  background: var(--jse-background-color, #fff);\n}\n.jse-text-mode.no-main-menu.svelte-k2b9e6 {\n  border-top: var(--jse-main-border, 1px solid #d7d7d7);\n}\n.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) {\n  flex: 1;\n  display: flex;\n  position: relative;\n  flex-direction: column;\n  overflow: hidden;\n  min-width: 0;\n  min-height: 0;\n  border-left: var(--jse-main-border, 1px solid #d7d7d7);\n  border-right: var(--jse-main-border, 1px solid #d7d7d7);\n}\n.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6):last-child {\n  border-bottom: var(--jse-main-border, 1px solid #d7d7d7);\n}\n.jse-text-mode.svelte-k2b9e6 .jse-contents.jse-hidden:where(.svelte-k2b9e6) {\n  visibility: hidden;\n  position: absolute;\n  top: 0;\n  left: 0;\n}\n.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor {\n  flex: 1;\n  overflow: hidden;\n}\n.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-scroller {\n  font-family: var(--jse-font-family-mono, consolas, menlo, monaco, \"Ubuntu Mono\", \"source-code-pro\", monospace);\n  font-size: var(--jse-font-size-mono, 14px);\n  line-height: var(--jse-line-height, calc(1em + 4px));\n  color: var(--jse-delimiter-color, rgba(0, 0, 0, 0.38));\n}\n.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-gutters {\n  background: var(--jse-panel-background, #ebebeb);\n  color: var(--jse-panel-color-readonly, #b2b2b2);\n  border-right: var(--jse-panel-border, var(--jse-main-border, 1px solid #d7d7d7));\n}\n.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-activeLine,\n.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-activeLineGutter {\n  background: var(--jse-active-line-background-color, rgba(0, 0, 0, 0.06));\n}\n.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-selectionBackground {\n  background: var(--jse-selection-background-color, #d3d3d3);\n}\n.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-searchMatch {\n  background-color: var(--jse-search-match-color, #ffe665);\n  outline: var(--jse-search-match-outline, none);\n}\n.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-searchMatch.cm-searchMatch-selected {\n  background-color: var(--jse-search-match-active-color, var(--jse-search-match-color, #ffe665));\n  outline: var(--jse-search-match-outline, 2px solid #e0be00);\n}\n.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-selectionMatch {\n  background-color: var(--jse-search-match-background-color, rgba(153, 255, 119, 0.5019607843));\n}\n.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-foldPlaceholder {\n  background: var(--jse-tag-background, rgba(0, 0, 0, 0.2));\n  color: var(--jse-tag-color, var(--jse-text-color-inverse, #fff));\n  border: none;\n  padding: 0 var(--jse-padding, 10px);\n}\n.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-tooltip {\n  font-size: var(--jse-font-size, 16px);\n  font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen-Sans, Ubuntu, Cantarell, \"Helvetica Neue\", sans-serif);\n  color: var(--jse-tooltip-color, var(--jse-text-color, #4d4d4d));\n  background: var(--jse-tooltip-background, var(--jse-modal-background, #f5f5f5));\n  border: var(--jse-tooltip-border, var(--jse-main-border, 1px solid #d7d7d7));\n}\n.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-diagnosticAction {\n  background: var(--jse-tooltip-action-button-color, var(--jse-text-color-inverse, #fff));\n  background: var(--jse-tooltip-action-button-background, #4d4d4d);\n}\n.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-panels {\n  border-bottom: var(--jse-panel-border, var(--jse-main-border, 1px solid #d7d7d7));\n}\n.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-search {\n  background: var(--jse-panel-background, #ebebeb);\n  color: var(--jse-panel-color, var(--jse-text-color, #4d4d4d));\n  font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen-Sans, Ubuntu, Cantarell, \"Helvetica Neue\", sans-serif);\n  font-size: var(--jse-font-size, 16px);\n}\n.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-search input {\n  font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen-Sans, Ubuntu, Cantarell, \"Helvetica Neue\", sans-serif);\n  font-size: var(--jse-font-size-text-mode-search, 80%);\n  color: var(--jse-input-color, var(--jse-text-color, #4d4d4d));\n  border: var(--jse-input-border, 1px solid #d8dbdf);\n  background: var(--jse-input-background, var(--jse-background-color, #fff));\n  margin-right: 2px;\n}\n.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-search button {\n  font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen-Sans, Ubuntu, Cantarell, \"Helvetica Neue\", sans-serif);\n  font-size: var(--jse-font-size-text-mode-search, 80%);\n  color: var(--jse-panel-button-color, inherit);\n  background: var(--jse-panel-button-background, transparent);\n  border: none;\n  cursor: pointer;\n  text-transform: capitalize;\n  padding: calc(0.5 * var(--jse-padding, 10px)) var(--jse-padding, 10px);\n  margin: 0;\n}\n.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-search button:hover {\n  color: var(--panel-button-color-highlight, var(--jse-text-color, #4d4d4d));\n  background: var(--jse-panel-button-background-highlight, #e0e0e0);\n}\n.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-search label {\n  font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen-Sans, Ubuntu, Cantarell, \"Helvetica Neue\", sans-serif);\n  font-size: var(--jse-font-size-text-mode-search, 80%);\n  padding-left: var(--jse-padding, 10px);\n}\n.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-search label input {\n  margin-right: 2px;\n}\n.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-search button[name='close'] {\n  width: 32px;\n  height: 32px;\n  font-size: 24px;\n  line-height: 24px;\n  padding: 0;\n  right: 0;\n  top: -4px;\n}\n.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-cursor-primary {\n  border-color: var(--jse-text-color, #4d4d4d);\n}\n.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .jse-loading-space:where(.svelte-k2b9e6) {\n  flex: 1;\n}\n.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .jse-loading:where(.svelte-k2b9e6) {\n  flex: 2;\n  text-align: center;\n  color: var(--jse-panel-color-readonly, #b2b2b2);\n  box-sizing: border-box;\n  font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen-Sans, Ubuntu, Cantarell, \"Helvetica Neue\", sans-serif);\n  font-size: var(--jse-font-size, 16px);\n}\n.jse-text-mode.svelte-k2b9e6 .jse-contents.jse-preview:where(.svelte-k2b9e6) {\n  flex: 1;\n  font-family: var(--jse-font-family-mono, consolas, menlo, monaco, \"Ubuntu Mono\", \"source-code-pro\", monospace);\n  font-size: var(--jse-font-size-mono, 14px);\n  color: var(--jse-panel-color-readonly, #b2b2b2);\n  overflow: auto;\n  white-space: pre-wrap;\n  word-break: break-word;\n  padding: 2px;\n}\n.jse-text-mode.svelte-k2b9e6 .jse-fold-progress:where(.svelte-k2b9e6) {\n  display: flex;\n  align-items: center;\n  gap: 8px;\n  padding: 8px 12px;\n  background: var(--jse-background-color, #fff);\n  border-top: var(--jse-panel-border, var(--jse-main-border, 1px solid #d7d7d7));\n  border-bottom: var(--jse-panel-border, var(--jse-main-border, 1px solid #d7d7d7));\n}\n.jse-text-mode.svelte-k2b9e6 .jse-fold-progress:where(.svelte-k2b9e6) .jse-fold-tip:where(.svelte-k2b9e6) {\n  font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen-Sans, Ubuntu, Cantarell, \"Helvetica Neue\", sans-serif);\n  font-size: var(--jse-font-size-mono, 14px);\n  color: var(--jse-panel-color-readonly, #b2b2b2);\n}\n.jse-text-mode.svelte-k2b9e6 .jse-fold-progress:where(.svelte-k2b9e6) .jse-fold-progress-track:where(.svelte-k2b9e6) {\n  flex: 1;\n  height: 6px;\n  background: var(--jse-panel-background, #ebebeb);\n  border-radius: 3px;\n  overflow: hidden;\n  border: 1px solid var(--jse-panel-border, var(--jse-main-border, 1px solid #d7d7d7));\n}\n.jse-text-mode.svelte-k2b9e6 .jse-fold-progress:where(.svelte-k2b9e6) .jse-fold-progress-fill:where(.svelte-k2b9e6) {\n  height: 100%;\n  background: linear-gradient(90deg, var(--jse-theme-color, #3883fa), var(--jse-theme-color-highlight, #5f9dff));\n  border-radius: 2px;\n  transition: width 0.1s ease;\n  min-width: 2px;\n}\n.jse-text-mode.svelte-k2b9e6 .jse-fold-progress:where(.svelte-k2b9e6) .jse-fold-cancel-button:where(.svelte-k2b9e6) {\n  padding: 4px 12px;\n  font-size: 12px;\n  font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen-Sans, Ubuntu, Cantarell, \"Helvetica Neue\", sans-serif);\n  background: var(--jse-theme-color, #3883fa);\n  color: #fff;\n  border-radius: 3px;\n  cursor: pointer;\n  transition: background-color 0.2s ease;\n  flex-shrink: 0;\n  border: 1px solid var(--jse-main-border, 1px solid #d7d7d7);\n}\n.jse-text-mode.svelte-k2b9e6 .jse-fold-progress:where(.svelte-k2b9e6) .jse-fold-cancel-button:where(.svelte-k2b9e6):hover {\n  background: var(--jse-theme-color-highlight, #5f9dff);\n  color: #fff;\n}`);var swA=FA('<div class=\"jse-fold-progress svelte-k2b9e6\"><span class=\"jse-fold-tip svelte-k2b9e6\">Collapsing</span> <div class=\"jse-fold-progress-track svelte-k2b9e6\"><div class=\"jse-fold-progress-fill svelte-k2b9e6\"></div></div> <button class=\"jse-fold-cancel-button svelte-k2b9e6\" type=\"button\" title=\"Cancel folding\">Cancel</button></div>'),gwA=FA('<!> <div class=\"jse-contents jse-preview svelte-k2b9e6\"> </div>',1),lwA=FA(\"<!> <!> <!> <!>\",1),cwA=FA(\"<div></div> <!> <!>\",1),CwA=FA('<div class=\"jse-contents svelte-k2b9e6\"><div class=\"jse-loading-space svelte-k2b9e6\"></div> <div class=\"jse-loading svelte-k2b9e6\">loading...</div></div>'),IwA=FA(\"<div><!> <!> <!></div>\");function dwA(t,e){kt(e,!1);var A=CA(void 0,!0),i=CA(void 0,!0),n=N(e,\"readOnly\",9),o=N(e,\"mainMenuBar\",9),a=N(e,\"statusBar\",9),r=N(e,\"askToFormat\",9),s=N(e,\"externalContent\",9),g=N(e,\"externalSelection\",9),l=N(e,\"history\",9),C=N(e,\"indentation\",9),I=N(e,\"tabSize\",9),d=N(e,\"escapeUnicodeCharacters\",9),B=N(e,\"parser\",9),Q=N(e,\"validator\",9),E=N(e,\"validationParser\",9),f=N(e,\"onChange\",9),b=N(e,\"onChangeMode\",9),R=N(e,\"onSelect\",9),M=N(e,\"onUndo\",9),v=N(e,\"onRedo\",9),F=N(e,\"onError\",9),G=N(e,\"onFocus\",9),U=N(e,\"onBlur\",9),Y=N(e,\"onRenderMenu\",9),j=N(e,\"onSortModal\",9),AA=N(e,\"onTransformModal\",9),z=qa(\"jsoneditor:TextMode\"),yA={key:\"Mod-i\",run:Ee,shift:xA,preventDefault:!0},P=typeof window>\"u\";z(\"isSSR:\",P);var nA,eA=CA(void 0,!0),dA=CA(void 0,!0),iA=CA(void 0,!0),aA=CA(!1,!0),hA=CA(r(),!0),JA=CA([],!0),ee=CA(!1,!0),UA=CA(0,!0),mA=CA(0,!0),KA=null,ze=new Zc,Ke=new Zc,HA=new Zc,uA=new Zc,XA=new Zc,EA=s(),ZA=CA(BR(EA,C(),B()),!0),MA=Os.define(),be=null;function _A(){if(!be||be.length===0)return!1;var vA=be[0].startState,VA=be[be.length-1].state,me=be.map(SA=>SA.changes).reduce((SA,re)=>SA.compose(re)),IA={type:\"text\",undo:{changes:me.invert(vA.doc).toJSON(),selection:qo(vA.selection)},redo:{changes:me.toJSON(),selection:qo(VA.selection)}};return z(\"add history item\",IA),l().add(IA),be=null,!0}var pA=CA(d(),!0);Jr(Ut(function*(){if(!P)try{nA=(function(vA){var{target:VA,initialText:me,readOnly:IA,indentation:SA}=vA;z(\"Create CodeMirror editor\",{readOnly:IA,indentation:SA});var re=(function(tt,at){return qx(tt)?tt.ranges.every(bt=>bt.anchor<at.length&&bt.head<at.length):!1})(g(),me)?sn(g()):void 0,Se=Ga.create({doc:me,selection:re,extensions:[QQ.of([Xq,yA]),ze.of(Dt()),CV(),Rj(),Nj(),pj(),sq(),Ue(),hj(),mj(),Ga.allowMultipleSelections.of(!0),$j(),_S(lq,{fallback:!0}),dq(),HV(),jV(),wj(),yj(),Dj(),vV(),QQ.of([...zV,...Zq,...SV,{key:\"Mod-z\",run:ri,preventDefault:!0},{key:\"Mod-y\",mac:\"Mod-Shift-z\",run:en,preventDefault:!0},{key:\"Ctrl-Shift-z\",run:en,preventDefault:!0},...oq,...yx,...oV]),owA,VV({hideFirstIndent:!0}),ai.domEventHandlers({dblclick:Ji}),ai.updateListener.of(tt=>{x(iA,tt.state),tt.docChanged&&(tt.transactions.some(at=>!!at.annotation(MA))||(be=[...be??[],tt]),Go()),tt.selectionSet&&Ko()}),fV(),bV({top:!0}),ai.lineWrapping,Ke.of(Ga.readOnly.of(IA)),uA.of(Ga.tabSize.of(I())),HA.of(fo(SA)),XA.of(ai.theme({},{dark:qi()}))]});return nA=new ai({state:Se,parent:VA}),re&&nA.dispatch(nA.state.update({selection:re.main,scrollIntoView:!0})),nA})({target:c(eA),initialText:Co(c(ZA),c(aA))?\"\":c(A).escapeValue(c(ZA)),readOnly:n(),indentation:C()})}catch(vA){console.error(vA)}})),cl(()=>{co(),nA&&(z(\"Destroy CodeMirror editor\"),nA.destroy()),Ai()});var Rt=w2(),Et=w2();function Qe(){nA&&(z(\"focus\"),nA.focus())}function _t(vA,VA){if(nA)try{(function(){var me=arguments.length>0&&arguments[0]!==void 0?arguments[0]:[],IA=!(arguments.length>1&&arguments[1]!==void 0)||arguments[1],SA=nA.state,re=SA.doc.length,Se=kS(SA,re,1/0);if(Se){var tt=[];if(me.length===0)tt=ht(Se,SA,void 0,IA);else{var{from:at}=Ux(c(A).escapeValue(c(ZA)),me);at!==void 0&&at!==0&&(tt=ht(Se,SA,at,IA))}tt.length>0&&(function(bt){Me.apply(this,arguments)})(tt)}})(vA,VA)}catch(me){F()(me)}}function Ue(){return RS.of((vA,VA,me)=>{var IA=kS(vA,vA.doc.length,1/0);if(!IA||IA.length<me)return null;for(var SA=null,re=IA.resolveStack(me,1);re;re=re.next){var Se=re.node;if(!(Se.to<=me||Se.from>me)){if(SA&&Se.from<VA)break;var tt=Se.type.prop(S3);if(tt&&(Se.to<IA.length-50||IA.length==vA.doc.length||!Te(Se))){var at=tt(Se,vA);at&&at.from<=me&&at.from>=VA&&at.to>me&&(SA=at)}}}return SA})}function Te(vA){var VA=vA.lastChild;return VA&&VA.to==vA.to&&VA.type.isError}function ht(vA,VA,me){var IA=!(arguments.length>3&&arguments[3]!==void 0)||arguments[3],SA=[],re=new Set;return vA.iterate({enter(Se){if(me===void 0||Se.from>=me){var tt=fQ(VA,Se.from,Se.to);if(tt){var at=\"\".concat(tt.from,\"-\").concat(tt.to);if(!re.has(at))if(IA)SA.push({from:tt.from,to:tt.to}),re.add(at);else{var bt=SA.some(Sn=>Sn.from<=tt.from&&Sn.to>=tt.to);bt||(SA.push({from:tt.from,to:tt.to}),re.add(at))}}}}}),SA}function Me(){return Me=Ut(function*(vA){if(vA.length!==0){var VA=vA.length>5e3;VA&&(x(ee,!0),x(UA,0),x(mA,vA.length),KA=new AbortController);var me=IA=>new Promise(SA=>{var re;VA&&(re=KA)!==null&&re!==void 0&&re.signal.aborted?SA():requestAnimationFrame(()=>{var Se=Math.min(IA+100,vA.length),tt=vA.slice(IA,Se);nA.dispatch({effects:tt.map(at=>DQ.of({from:at.from,to:at.to}))}),VA&&x(UA,Se),Se<vA.length?me(Se).then(SA):SA()})});yield me(0),VA&&(x(ee,!1),x(UA,0),x(mA,0),KA=null)}}),Me.apply(this,arguments)}function Ai(){KA&&KA.abort()}function J(vA){var VA=arguments.length>1&&arguments[1]!==void 0?arguments[1]:fR;if(nA)try{if(vA&&vA.length>0){var{from:me}=Ux(c(A).escapeValue(c(ZA)),vA);me!==void 0&&(nA.dispatch({selection:{anchor:me,head:me}}),NS(nA))}else FS(nA);VA?.(vA)}catch(IA){F()(IA)}}function O(){J([],()=>!0)}function tA(){_t([],!0)}var oA=!1;function NA(vA){return de(vA,!1)}function de(vA,VA){z(\"handlePatch\",vA,VA);var me=B().parse(c(ZA)),IA=Js(me,vA),SA=D6(me,vA);return gi({text:B().stringify(IA,null,C())},VA,!1),{json:IA,previousJson:me,undo:SA,redo:vA}}function Ee(){if(z(\"format\"),n())return!1;try{var vA=B().parse(c(ZA));return gi({text:B().stringify(vA,null,C())},!0,!1),x(hA,r()),!0}catch(VA){F()(VA)}return!1}function xA(){if(z(\"compact\"),n())return!1;try{var vA=B().parse(c(ZA));return gi({text:B().stringify(vA)},!0,!1),x(hA,!1),!0}catch(VA){F()(VA)}return!1}function LA(){if(z(\"repair\"),!n())try{gi({text:jg(c(ZA))},!0,!1),x(se,zx),x(Ci,void 0)}catch(vA){F()(vA)}}function dt(){var vA;if(!n())try{var VA=B().parse(c(ZA));oA=!0,j()({id:Rt,json:VA,rootPath:[],onSort:(vA=Ut(function*(me){var{operations:IA}=me;z(\"onSort\",IA),de(IA,!0)}),function(me){return vA.apply(this,arguments)}),onClose:()=>{oA=!1,Qe()}})}catch(me){F()(me)}}function At(vA){var{id:VA,rootPath:me,onTransform:IA,onClose:SA}=vA;try{var re=B().parse(c(ZA));oA=!0,AA()({id:VA||Et,json:re,rootPath:me||[],onTransform:Se=>{IA?IA({operations:Se,json:re,transformedJson:Js(re,Se)}):(z(\"onTransform\",Se),de(Se,!0))},onClose:()=>{oA=!1,Qe(),SA&&SA()}})}catch(Se){F()(Se)}}function Je(){n()||At({rootPath:[]})}function Ge(){nA&&(c(eA)&&c(eA).querySelector(\".cm-search\")?z5(nA):O5(nA))}function ri(){if(n())return!1;co();var vA=l().undo();return z(\"undo\",vA),NW(vA)?(nA.dispatch({annotations:MA.of(\"undo\"),changes:Rr.fromJSON(vA.undo.changes),selection:ce.fromJSON(vA.undo.selection),scrollIntoView:!0}),!0):(M()(vA),!1)}function en(){if(n())return!1;co();var vA=l().redo();return z(\"redo\",vA),NW(vA)?(nA.dispatch({annotations:MA.of(\"redo\"),changes:Rr.fromJSON(vA.redo.changes),selection:ce.fromJSON(vA.redo.selection),scrollIntoView:!0}),!0):(v()(vA),!1)}function rn(){x(aA,!0),gi(s(),!0,!0)}function Le(){b()(ga.tree)}function ji(){ko()}function Bi(vA){z(\"select validation error\",vA);var{from:VA,to:me}=Nt(vA);VA!==void 0&&me!==void 0&&(vi(VA,me),Qe())}function vi(vA,VA){z(\"setSelection\",{anchor:vA,head:VA}),nA&&nA.dispatch(nA.state.update({selection:{anchor:vA,head:VA},scrollIntoView:!0}))}function Ji(vA,VA){if(VA.state.selection.ranges.length===1){var me=VA.state.selection.ranges[0],IA=c(ZA).slice(me.from,me.to);if(IA===\"{\"||IA===\"[\"){var SA=_R.default.parse(c(ZA)),re=Object.keys(SA.pointers).find(tt=>{var at;return((at=SA.pointers[tt].value)===null||at===void 0?void 0:at.pos)===me.from}),Se=SA.pointers[re];re&&Se&&Se.value&&Se.valueEnd&&(z(\"pointer found, selecting inner contents of path:\",re,Se),vi(Se.value.pos+1,Se.valueEnd.pos-1))}}}function Dt(){return aV(tn,{delay:300})}function qi(){return!!c(eA)&&getComputedStyle(c(eA)).getPropertyValue(\"--jse-theme\").includes(\"dark\")}function Nt(vA){var{path:VA,message:me,severity:IA}=vA,{line:SA,column:re,from:Se,to:tt}=Ux(c(A).escapeValue(c(ZA)),VA);return{path:VA,line:SA,column:re,from:Se,to:tt,message:me,severity:IA,actions:[]}}function L(vA,VA){var{line:me,column:IA,position:SA,message:re}=vA;return{path:[],line:me,column:IA,from:SA,to:SA,severity:ic.error,message:re,actions:VA&&!n()?[{name:\"Auto repair\",apply:()=>LA()}]:void 0}}function gt(vA){return{from:vA.from||0,to:vA.to||0,message:vA.message||\"\",actions:vA.actions,severity:vA.severity}}function gi(vA,VA,me){var IA=BR(vA,C(),B()),SA=!di(vA,EA),re=EA;z(\"setCodeMirrorContent\",{isChanged:SA,emitChange:VA,forceUpdate:me}),nA&&(SA||me)&&(EA=vA,x(ZA,IA),Co(c(ZA),c(aA))||nA.dispatch({changes:{from:0,to:nA.state.doc.length,insert:c(A).escapeValue(c(ZA))}}),_A(),SA&&VA&&ta(EA,re))}function sn(vA){return qx(vA)?ce.fromJSON(vA):void 0}function gn(){return Kn.apply(this,arguments)}function Kn(){return Kn=Ut(function*(){z(\"refresh\"),yield(function(){return eo.apply(this,arguments)})()}),Kn.apply(this,arguments)}function ko(){if(nA){var vA=nA?c(A).unescapeValue(nA.state.doc.toString()):\"\",VA=vA!==c(ZA);if(z(\"onChangeCodeMirrorValue\",{isChanged:VA}),VA){var me=EA;x(ZA,vA),EA={text:c(ZA)},_A(),ta(EA,me),uo(),Ko()}}}function eo(){return(eo=Ut(function*(){if(uo(),nA){var vA=qi();return z(\"updateTheme\",{dark:vA}),nA.dispatch({effects:[XA.reconfigure(ai.theme({},{dark:vA}))]}),new Promise(VA=>setTimeout(VA))}return Promise.resolve()})).apply(this,arguments)}function fo(vA){var VA=M1.of(typeof vA==\"number\"?\" \".repeat(vA):vA);return vA===\"\t\"?[VA]:[VA,rwA]}sN({onMount:Jr,onDestroy:cl,getWindow:()=>mu(c(dA)),hasFocus:()=>oA&&document.hasFocus()||jR(c(dA)),onFocus:G(),onBlur:()=>{co(),U()()}});var Go=PB(ko,300);function co(){Go.flush()}function ta(vA,VA){f()&&f()(vA,VA,{contentErrors:ln(),patchResult:void 0})}function Ko(){R()(qo(c(iA).selection))}function qo(vA){return ye({type:jn.text},vA.toJSON())}function Co(vA,VA){return!!vA&&vA.length>Tx&&!VA}var se=CA(zx,!0),Ci=CA(void 0,!0);function tn(){if(Co(c(ZA),c(aA)))return[];var vA=ln();if(RW(vA)){var{parseError:VA,isRepairable:me}=vA;return[gt(L(VA,me))]}return F6A(vA)?vA.validationErrors.map(Nt).map(gt):[]}function ln(){z(\"validate:start\"),co();var vA=So(c(A).escapeValue(c(ZA)),Q(),B(),E());return RW(vA)?(x(se,vA.isRepairable?bW:\"invalid\"),x(Ci,vA.parseError),x(JA,[])):(x(se,zx),x(Ci,void 0),x(JA,vA?.validationErrors||[])),z(\"validate:end\"),vA}var So=VB(t5A);function la(){c(Ci)&&(function(vA){z(\"select parse error\",vA);var VA=L(vA,!1);vi(VA.from!=null?VA.from:0,VA.to!=null?VA.to:0),Qe()})(c(Ci))}var pi={icon:zO,text:\"Show me\",title:\"Move to the parse error location\",onClick:la};RA(()=>_(d()),()=>{x(A,zR({escapeControlCharacters:!1,escapeUnicodeCharacters:d()}))}),RA(()=>_(s()),()=>{gi(s(),!1,!1)}),RA(()=>_(g()),()=>{(function(vA){if(qx(vA)){var VA=sn(vA);!nA||!VA||c(iA)&&c(iA).selection.eq(VA)||(z(\"applyExternalSelection\",VA),nA.dispatch({selection:VA}))}})(g())}),RA(()=>_(Q()),()=>{(function(vA){z(\"updateLinter\",vA),nA&&nA.dispatch({effects:ze.reconfigure(Dt())})})(Q())}),RA(()=>_(C()),()=>{(function(vA){nA&&(z(\"updateIndentation\",vA),nA.dispatch({effects:HA.reconfigure(fo(vA))}))})(C())}),RA(()=>_(I()),()=>{(function(vA){nA&&(z(\"updateTabSize\",vA),nA.dispatch({effects:uA.reconfigure(Ga.tabSize.of(vA))}))})(I())}),RA(()=>_(n()),()=>{(function(vA){nA&&(z(\"updateReadOnly\",vA),nA.dispatch({effects:[Ke.reconfigure(Ga.readOnly.of(vA))]}))})(n())}),RA(()=>(c(pA),_(d())),()=>{c(pA)!==d()&&(x(pA,d()),z(\"forceUpdateText\",{escapeUnicodeCharacters:d()}),nA&&nA.dispatch({changes:{from:0,to:nA.state.doc.length,insert:c(A).escapeValue(c(ZA))}}))}),RA(()=>(c(se),_(n()),P0),()=>{x(i,c(se)!==bW||n()?[pi]:[{icon:P0,text:\"Auto repair\",title:\"Automatically repair JSON\",onClick:LA},pi])}),mn();var to={focus:Qe,collapse:_t,expand:J,patch:NA,handlePatch:de,openTransformModal:At,refresh:gn,flush:co,validate:ln};$t(!0);var Ja,Io=IwA(),Sa=cA(Io),kn=vA=>{var VA=et(()=>(c(ZA),QA(()=>c(ZA).length===0))),me=et(()=>!c(VA)),IA=et(()=>!c(VA)),SA=et(()=>!c(VA)),re=et(()=>!c(VA)),Se=et(()=>!c(VA)),tt=et(()=>!c(VA));(function(at,bt){kt(bt,!1);var Sn=CA(void 0,!0),ki=N(bt,\"readOnly\",9,!1),Gi=N(bt,\"onExpandAll\",9),jt=N(bt,\"onCollapseAll\",9),Si=N(bt,\"onFormat\",9),ca=N(bt,\"onCompact\",9),Ft=N(bt,\"onSort\",9),rt=N(bt,\"onTransform\",9),xi=N(bt,\"onToggleSearch\",9),Yi=N(bt,\"onUndo\",9),Un=N(bt,\"onRedo\",9),cn=N(bt,\"canExpandAll\",9),Mt=N(bt,\"canCollapseAll\",9),Vo=N(bt,\"canUndo\",9),xo=N(bt,\"canRedo\",9),u=N(bt,\"canFormat\",9),w=N(bt,\"canCompact\",9),S=N(bt,\"canSort\",9),T=N(bt,\"canTransform\",9),k=N(bt,\"onRenderMenu\",9),H=CA(void 0,!0),Z=CA(void 0,!0),gA={type:\"button\",icon:P4,title:\"Search (Ctrl+F)\",className:\"jse-search\",onClick:xi()},DA=CA(void 0,!0);RA(()=>(_(Gi()),_(cn())),()=>{x(H,{type:\"button\",icon:c$,title:\"Expand all\",className:\"jse-expand-all\",onClick:Gi(),disabled:!cn()})}),RA(()=>(_(jt()),_(Mt())),()=>{x(Z,{type:\"button\",icon:C$,title:\"Collapse all\",className:\"jse-collapse-all\",onClick:jt(),disabled:!Mt()})}),RA(()=>(_(ki()),c(H),c(Z),_(Si()),_(u()),_(ca()),_(w()),_(Ft()),_(S()),_(rt()),_(T()),_(Yi()),_(Vo()),_(Un()),_(xo())),()=>{x(DA,ki()?[c(H),c(Z),{type:\"separator\"},gA,{type:\"space\"}]:[c(H),c(Z),{type:\"separator\"},{type:\"button\",icon:sZ,title:\"Format JSON: add proper indentation and new lines (Ctrl+I)\",className:\"jse-format\",onClick:Si(),disabled:ki()||!u()},{type:\"button\",icon:nDA,title:\"Compact JSON: remove all white spacing and new lines (Ctrl+Shift+I)\",className:\"jse-compact\",onClick:ca(),disabled:ki()||!w()},{type:\"separator\"},{type:\"button\",icon:V4,title:\"Sort\",className:\"jse-sort\",onClick:Ft(),disabled:ki()||!S()},{type:\"button\",icon:z4,title:\"Transform contents (filter, sort, project)\",className:\"jse-transform\",onClick:rt(),disabled:ki()||!T()},gA,{type:\"separator\"},{type:\"button\",icon:c8,title:\"Undo (Ctrl+Z)\",className:\"jse-undo\",onClick:Yi(),disabled:!Vo()},{type:\"button\",icon:l8,title:\"Redo (Ctrl+Shift+Z)\",className:\"jse-redo\",onClick:Un(),disabled:!xo()},{type:\"space\"}])}),RA(()=>(_(k()),c(DA)),()=>{x(Sn,k()(c(DA))||c(DA))}),mn(),$t(!0),aw(at,{get items(){return c(Sn)}}),St()})(vA,{get readOnly(){return n()},onExpandAll:O,onCollapseAll:tA,onFormat:Ee,onCompact:xA,onSort:dt,onTransform:Je,onToggleSearch:Ge,onUndo:ri,onRedo:en,get canExpandAll(){return c(me)},get canCollapseAll(){return c(IA)},get canFormat(){return c(SA)},get canCompact(){return c(re)},get canSort(){return c(Se)},get canTransform(){return c(tt)},get canUndo(){return _(l()),QA(()=>l().canUndo)},get canRedo(){return _(l()),QA(()=>l().canRedo)},get onRenderMenu(){return Y()}})};YA(Sa,vA=>{o()&&vA(kn)});var Mi=bA(Sa,2),Ot=vA=>{var VA=swA(),me=bA(cA(VA),2),IA=cA(me),SA=bA(me,2);ve(()=>gl(IA,\"width: \".concat(c(mA)>0?c(UA)/c(mA)*100:0,\"%\"))),ue(\"click\",SA,Ai),lA(vA,VA)};YA(Mi,vA=>{c(ee)&&vA(Ot)});var pn=bA(Mi,2),io=vA=>{var VA,me=et(()=>(c(ZA),c(aA),QA(()=>Co(c(ZA),c(aA))))),IA=cwA(),SA=$e(IA);Mo(SA,bt=>x(eA,bt),()=>c(eA));var re=bA(SA,2),Se=bt=>{var Sn=gwA(),ki=$e(Sn),Gi=et(()=>(_(yD),_(Tx),c(ZA),QA(()=>\"The JSON document is larger than \".concat(yD(Tx),\", \")+\"and may crash your browser when loading it in text mode. Actual size: \".concat(yD(c(ZA).length),\".\"))));Mg(ki,{get icon(){return v2},type:\"error\",get message(){return c(Gi)},actions:[{text:\"Open anyway\",title:\"Open the document in text mode. This may freeze or crash your browser.\",onClick:rn},{text:\"Open in tree mode\",title:\"Open the document in tree mode. Tree mode can handle large documents.\",onClick:Le},{text:\"Cancel\",title:\"Cancel opening this large document.\",onClick:ji}],onClose:Qe});var jt=cA(bA(ki,2));ve(Si=>xt(jt,Si),[()=>(_(gC),c(ZA),_(ND),QA(()=>gC(c(ZA)||\"\",ND)))]),lA(bt,Sn)};YA(re,bt=>{c(me)&&bt(Se)});var tt=bA(re,2),at=bt=>{var Sn=lwA(),ki=$e(Sn),Gi=rt=>{(function(xi,Yi){kt(Yi,!1);var Un=N(Yi,\"editorState\",8),cn=CA(),Mt=CA(),Vo=CA(),xo=CA(),u=CA();RA(()=>_(Un()),()=>{var DA;x(cn,(DA=Un())===null||DA===void 0||(DA=DA.selection)===null||DA===void 0||(DA=DA.main)===null||DA===void 0?void 0:DA.head)}),RA(()=>(c(cn),_(Un())),()=>{var DA;x(Mt,c(cn)!==void 0?(DA=Un())===null||DA===void 0||(DA=DA.doc)===null||DA===void 0?void 0:DA.lineAt(c(cn)):void 0)}),RA(()=>c(Mt),()=>{x(Vo,c(Mt)!==void 0?c(Mt).number:void 0)}),RA(()=>(c(Mt),c(cn)),()=>{x(xo,c(Mt)!==void 0&&c(cn)!==void 0?c(cn)-c(Mt).from+1:void 0)}),RA(()=>_(Un()),()=>{var DA;x(u,(DA=Un())===null||DA===void 0||(DA=DA.selection)===null||DA===void 0||(DA=DA.ranges)===null||DA===void 0?void 0:DA.reduce((Ae,ne)=>Ae+ne.to-ne.from,0))}),mn(),$t();var w=nwA(),S=cA(w),T=DA=>{var Ae=ewA(),ne=cA(Ae);ve(()=>{var Be;return xt(ne,\"Line: \".concat((Be=c(Vo))!==null&&Be!==void 0?Be:\"\"))}),lA(DA,Ae)};YA(S,DA=>{c(Vo)!==void 0&&DA(T)});var k=bA(S,2),H=DA=>{var Ae=twA(),ne=cA(Ae);ve(()=>{var Be;return xt(ne,\"Column: \".concat((Be=c(xo))!==null&&Be!==void 0?Be:\"\"))}),lA(DA,Ae)};YA(k,DA=>{c(xo)!==void 0&&DA(H)});var Z=bA(k,2),gA=DA=>{var Ae=iwA(),ne=cA(Ae);ve(()=>{var Be;return xt(ne,\"Selection: \".concat((Be=c(u))!==null&&Be!==void 0?Be:\"\",\" characters\"))}),lA(DA,Ae)};YA(Z,DA=>{c(u)!==void 0&&c(u)>0&&DA(gA)}),lA(xi,w),St()})(rt,{get editorState(){return c(iA)}})};YA(ki,rt=>{a()&&rt(Gi)});var jt=bA(ki,2),Si=rt=>{Mg(rt,{type:\"error\",get icon(){return v2},get message(){return c(Ci),QA(()=>c(Ci).message)},get actions(){return c(i)},onClick:la,onClose:Qe})};YA(jt,rt=>{c(Ci)&&rt(Si)});var ca=bA(jt,2),Ft=rt=>{var xi=et(()=>[{icon:sZ,text:\"Format\",title:\"Format JSON: add proper indentation and new lines (Ctrl+I)\",onClick:Ee},{icon:q4,text:\"No thanks\",title:\"Close this message\",onClick:()=>x(hA,!1)}]);Mg(rt,{type:\"success\",message:\"Do you want to format the JSON?\",get actions(){return c(xi)},onClose:Qe})};YA(ca,rt=>{c(Ci),c(hA),_(yW),c(ZA),QA(()=>!c(Ci)&&c(hA)&&yW(c(ZA)))&&rt(Ft)}),gN(bA(ca,2),{get validationErrors(){return c(JA)},selectError:Bi}),lA(bt,Sn)};YA(tt,bt=>{c(me)||bt(at)}),ve(()=>VA=Xt(SA,1,\"jse-contents svelte-k2b9e6\",null,VA,{\"jse-hidden\":c(me)})),lA(vA,IA)},mo=vA=>{lA(vA,CwA())};return YA(pn,vA=>{P?vA(mo,!1):vA(io)}),Mo(Io,vA=>x(dA,vA),()=>c(dA)),ve(()=>Ja=Xt(Io,1,\"jse-text-mode svelte-k2b9e6\",null,Ja,{\"no-main-menu\":!o()})),lA(t,Io),Tt(e,\"focus\",Qe),Tt(e,\"collapse\",_t),Tt(e,\"expand\",J),Tt(e,\"patch\",NA),Tt(e,\"handlePatch\",de),Tt(e,\"openTransformModal\",At),Tt(e,\"refresh\",gn),Tt(e,\"flush\",co),Tt(e,\"validate\",ln),St(to)}Pt(`/* over all fonts, sizes, and colors */\n/* \"consolas\" for Windows, \"menlo\" for Mac with fallback to \"monaco\", 'Ubuntu Mono' for Ubuntu */\n/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */\n/* main, menu, modal */\n/* jsoneditor modal */\n/* tooltip in text mode */\n/* panels: navigation bar, gutter, search box */\n/* navigation-bar */\n/* context menu */\n/* contents: json key and values */\n/* contents: selected or hovered */\n/* contents: section of collapsed items in an array */\n/* contents: highlighting of search matches */\n/* contents: inline tags inside the JSON document */\n/* contents: table */\n/* controls in modals: inputs, buttons, and \\`a\\` */\n/* messages */\n/* svelte-select */\n/* color picker */\n.jse-inline-value.svelte-1jv89ui {\n  font-family: var(--jse-font-family-mono, consolas, menlo, monaco, \"Ubuntu Mono\", \"source-code-pro\", monospace);\n  font-size: var(--jse-font-size-mono, 14px);\n  line-height: var(--jse-line-height, calc(1em + 4px));\n  border: none;\n  padding: 0 calc(0.5 * var(--jse-padding, 10px));\n  background: transparent;\n  color: inherit;\n  cursor: inherit;\n}\n.jse-inline-value.jse-highlight.svelte-1jv89ui {\n  background-color: var(--jse-search-match-color, #ffe665);\n  outline: var(--jse-search-match-outline, none);\n}\n.jse-inline-value.jse-highlight.jse-active.svelte-1jv89ui {\n  background-color: var(--jse-search-match-active-color, var(--jse-search-match-color, #ffe665));\n  outline: var(--jse-search-match-outline, 2px solid #e0be00);\n}`);var BwA=FA('<button type=\"button\"> </button>');Pt(`/* over all fonts, sizes, and colors */\n/* \"consolas\" for Windows, \"menlo\" for Mac with fallback to \"monaco\", 'Ubuntu Mono' for Ubuntu */\n/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */\n/* main, menu, modal */\n/* jsoneditor modal */\n/* tooltip in text mode */\n/* panels: navigation bar, gutter, search box */\n/* navigation-bar */\n/* context menu */\n/* contents: json key and values */\n/* contents: selected or hovered */\n/* contents: section of collapsed items in an array */\n/* contents: highlighting of search matches */\n/* contents: inline tags inside the JSON document */\n/* contents: table */\n/* controls in modals: inputs, buttons, and \\`a\\` */\n/* messages */\n/* svelte-select */\n/* color picker */\n.jse-column-header.svelte-5pxwfq {\n  background: none;\n  border: none;\n  font-family: inherit;\n  font-size: inherit;\n  color: inherit;\n  display: flex;\n  gap: var(--jse-padding, 10px);\n  padding: calc(0.5 * var(--jse-padding, 10px)) var(--jse-padding, 10px) calc(0.5 * var(--jse-padding, 10px)) calc(0.5 * var(--jse-padding, 10px));\n  width: 100%;\n}\n.jse-column-header.svelte-5pxwfq:hover {\n  background: var(--jse-table-header-background-highlight, #e8e8e8);\n}\n.jse-column-header.svelte-5pxwfq:not(.jse-column-header.jse-readonly) {\n  cursor: pointer;\n}\n.jse-column-header.svelte-5pxwfq span.jse-column-sort-icon:where(.svelte-5pxwfq) {\n  height: 1em;\n}`);var QwA=FA('<span class=\"jse-column-sort-icon svelte-5pxwfq\"><!></span>'),EwA=FA('<button type=\"button\"><span class=\"jse-column-name\"> </span> <!></button>');Pt(`/* over all fonts, sizes, and colors */\n/* \"consolas\" for Windows, \"menlo\" for Mac with fallback to \"monaco\", 'Ubuntu Mono' for Ubuntu */\n/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */\n/* main, menu, modal */\n/* jsoneditor modal */\n/* tooltip in text mode */\n/* panels: navigation bar, gutter, search box */\n/* navigation-bar */\n/* context menu */\n/* contents: json key and values */\n/* contents: selected or hovered */\n/* contents: section of collapsed items in an array */\n/* contents: highlighting of search matches */\n/* contents: inline tags inside the JSON document */\n/* contents: table */\n/* controls in modals: inputs, buttons, and \\`a\\` */\n/* messages */\n/* svelte-select */\n/* color picker */\n.jse-table-mode-welcome.svelte-1b9gnk8 {\n  flex: 1;\n  display: flex;\n  flex-direction: column;\n  overflow: auto;\n  align-items: center;\n  border-left: var(--jse-main-border, 1px solid #d7d7d7);\n  border-right: var(--jse-main-border, 1px solid #d7d7d7);\n}\n.jse-table-mode-welcome.svelte-1b9gnk8:last-child {\n  border-bottom: var(--jse-main-border, 1px solid #d7d7d7);\n}\n.jse-table-mode-welcome.svelte-1b9gnk8 .jse-space.jse-before:where(.svelte-1b9gnk8) {\n  flex: 1;\n}\n.jse-table-mode-welcome.svelte-1b9gnk8 .jse-nested-arrays:where(.svelte-1b9gnk8) {\n  display: flex;\n  flex-direction: column;\n  gap: var(--jse-padding, 10px);\n  max-width: 400px;\n  margin: 2em var(--jse-padding, 10px);\n  font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen-Sans, Ubuntu, Cantarell, \"Helvetica Neue\", sans-serif);\n  font-size: var(--jse-font-size, 16px);\n}\n.jse-table-mode-welcome.svelte-1b9gnk8 .jse-nested-arrays:where(.svelte-1b9gnk8) .jse-nested-arrays-info:where(.svelte-1b9gnk8) {\n  color: var(--jse-panel-color-readonly, #b2b2b2);\n}\n.jse-table-mode-welcome.svelte-1b9gnk8 .jse-nested-arrays:where(.svelte-1b9gnk8) .jse-nested-property:where(.svelte-1b9gnk8) {\n  display: flex;\n  align-items: center;\n  gap: var(--jse-padding, 10px);\n}\n.jse-table-mode-welcome.svelte-1b9gnk8 .jse-nested-arrays:where(.svelte-1b9gnk8) .jse-nested-property:where(.svelte-1b9gnk8) .jse-nested-property-path:where(.svelte-1b9gnk8) {\n  flex: 1;\n}\n.jse-table-mode-welcome.svelte-1b9gnk8 .jse-nested-arrays:where(.svelte-1b9gnk8) .jse-nested-property:where(.svelte-1b9gnk8) .jse-nested-property-path:where(.svelte-1b9gnk8) .jse-nested-property-count:where(.svelte-1b9gnk8) {\n  opacity: 0.5;\n  white-space: nowrap;\n}\n.jse-table-mode-welcome.svelte-1b9gnk8 .jse-nested-arrays:where(.svelte-1b9gnk8) button.jse-nested-array-action:where(.svelte-1b9gnk8) {\n  text-align: left;\n  border: none;\n  background: transparent;\n  color: inherit;\n  cursor: pointer;\n  font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen-Sans, Ubuntu, Cantarell, \"Helvetica Neue\", sans-serif);\n  font-size: var(--jse-font-size, 16px);\n  padding: 5px;\n  margin: 0;\n  background: var(--jse-button-primary-background, var(--jse-theme-color, #3883fa));\n  color: var(--jse-button-primary-color, #fff);\n  padding: var(--jse-padding, 10px) calc(2 * var(--jse-padding, 10px));\n  border-radius: 3px;\n}\n.jse-table-mode-welcome.svelte-1b9gnk8 .jse-nested-arrays:where(.svelte-1b9gnk8) button.jse-nested-array-action:where(.svelte-1b9gnk8):hover {\n  background: var(--jse-button-primary-background-highlight, var(--jse-theme-color-highlight, #5f9dff));\n}\n.jse-table-mode-welcome.svelte-1b9gnk8 .jse-nested-arrays:where(.svelte-1b9gnk8) button.jse-nested-array-action:where(.svelte-1b9gnk8):disabled {\n  background: var(--jse-button-primary-background-disabled, #9d9d9d);\n}\n.jse-table-mode-welcome.svelte-1b9gnk8 .jse-space.jse-after:where(.svelte-1b9gnk8) {\n  flex: 2;\n}`);var hwA=FA(`An empty document cannot be opened in table mode. You can go to tree mode instead, or paste\n        a JSON Array using <b>Ctrl+V</b>.`,1),uwA=FA('<button type=\"button\" class=\"jse-nested-array-action svelte-1b9gnk8\">Extract</button>'),fwA=FA('<div class=\"jse-nested-property svelte-1b9gnk8\"><div class=\"jse-nested-property-path svelte-1b9gnk8\"> <span class=\"jse-nested-property-count svelte-1b9gnk8\"> </span></div> <button type=\"button\" class=\"jse-nested-array-action svelte-1b9gnk8\"> </button> <!></div>'),mwA=FA('<div class=\"jse-table-mode-welcome svelte-1b9gnk8\" role=\"none\"><div class=\"jse-space jse-before svelte-1b9gnk8\"></div> <div class=\"jse-nested-arrays svelte-1b9gnk8\"><div class=\"jse-nested-arrays-title\"> </div> <div class=\"jse-nested-arrays-info svelte-1b9gnk8\"><!></div> <!> <button type=\"button\" class=\"jse-nested-array-action svelte-1b9gnk8\">Switch to tree mode</button></div> <div class=\"jse-space jse-after svelte-1b9gnk8\"></div></div>');function pwA(t,e){kt(e,!0);var A=Zs(()=>e.json?(function(Q){var E=arguments.length>1&&arguments[1]!==void 0?arguments[1]:2,f=[];return(function b(R,M){Oo(R)&&M.length<E&&Object.keys(R).forEach(v=>{b(R[v],M.concat(v))}),Lo(R)&&f.push(M)})(Q,[]),f})(e.json).slice(0,99).filter(Q=>Q.length>0):[]),i=Zs(()=>!zi(c(A))),n=Zs(()=>e.json===void 0&&(e.text===\"\"||e.text===void 0)),o=Zs(()=>c(i)?\"Object with nested arrays\":c(n)?\"An empty document\":Oo(e.json)?\"An object\":Lo(e.json)?\"An empty array\":\"A \".concat(OR(e.json,e.parser))),a=mwA();a.__click=()=>e.onClick();var r=bA(cA(a),2),s=cA(r),g=cA(s),l=bA(s,2),C=cA(l),I=Q=>{lA(Q,tr(`An object cannot be opened in table mode. You can open a nested array instead, or open the\n        document in tree mode.`))},d=Q=>{var E=yi(),f=$e(E),b=M=>{lA(M,hwA())},R=M=>{var v=tr();ve(()=>{var F;return xt(v,\"\".concat((F=c(o))!==null&&F!==void 0?F:\"\",\" cannot be opened in table mode. You can open the document in tree mode instead.\"))}),lA(M,v)};YA(f,M=>{c(n)&&!e.readOnly?M(b):M(R,!1)},!0),lA(Q,E)};YA(C,Q=>{c(i)?Q(I):Q(d,!1)});var B=bA(l,2);ea(B,17,()=>c(A),ha,(Q,E)=>{var f=Zs(()=>(function(j){return Pe(e.json,j).length})(c(E))),b=fwA(),R=cA(b),M=cA(R),v=cA(bA(M)),F=bA(R,2);F.__click=()=>e.openJSONEditorModal(c(E));var G=cA(F),U=bA(F,2),Y=j=>{var AA=uwA();AA.__click=()=>e.extractPath(c(E)),lA(j,AA)};YA(U,j=>{e.readOnly||j(Y)}),ve(j=>{var AA;xt(M,'\"'.concat(j??\"\",'\" ')),xt(v,\"(\".concat((AA=c(f))!==null&&AA!==void 0?AA:\"\",\" \").concat(c(f)!==1?\"items\":\"item\",\")\")),xt(G,e.readOnly?\"View\":\"Edit\")},[()=>$s(c(E))]),lA(Q,b)}),bA(B,2).__click=()=>e.onChangeMode(ga.tree),ve(()=>xt(g,c(o))),lA(t,a),St()}hu([\"click\"]);Pt(`/* over all fonts, sizes, and colors */\n/* \"consolas\" for Windows, \"menlo\" for Mac with fallback to \"monaco\", 'Ubuntu Mono' for Ubuntu */\n/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */\n/* main, menu, modal */\n/* jsoneditor modal */\n/* tooltip in text mode */\n/* panels: navigation bar, gutter, search box */\n/* navigation-bar */\n/* context menu */\n/* contents: json key and values */\n/* contents: selected or hovered */\n/* contents: section of collapsed items in an array */\n/* contents: highlighting of search matches */\n/* contents: inline tags inside the JSON document */\n/* contents: table */\n/* controls in modals: inputs, buttons, and \\`a\\` */\n/* messages */\n/* svelte-select */\n/* color picker */\n.jse-column-header.svelte-1wgrwv3 {\n  background: none;\n  border: none;\n  font-family: inherit;\n  font-size: inherit;\n  color: inherit;\n  display: flex;\n  gap: var(--jse-padding, 10px);\n  padding: calc(0.5 * var(--jse-padding, 10px)) var(--jse-padding, 10px) calc(0.5 * var(--jse-padding, 10px)) calc(0.5 * var(--jse-padding, 10px));\n  width: 100%;\n}\n.jse-column-header.svelte-1wgrwv3:hover {\n  background: var(--jse-table-header-background-highlight, #e8e8e8);\n}\n.jse-column-header.svelte-1wgrwv3:not(.jse-column-header.jse-readonly) {\n  cursor: pointer;\n}`);var DwA=FA('<button type=\"button\"><!></button>');Pt(`/* over all fonts, sizes, and colors */\n/* \"consolas\" for Windows, \"menlo\" for Mac with fallback to \"monaco\", 'Ubuntu Mono' for Ubuntu */\n/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */\n/* main, menu, modal */\n/* jsoneditor modal */\n/* tooltip in text mode */\n/* panels: navigation bar, gutter, search box */\n/* navigation-bar */\n/* context menu */\n/* contents: json key and values */\n/* contents: selected or hovered */\n/* contents: section of collapsed items in an array */\n/* contents: highlighting of search matches */\n/* contents: inline tags inside the JSON document */\n/* contents: table */\n/* controls in modals: inputs, buttons, and \\`a\\` */\n/* messages */\n/* svelte-select */\n/* color picker */\n.jse-table-mode.svelte-1p86y3c {\n  flex: 1;\n  display: flex;\n  flex-direction: column;\n  position: relative;\n  background: var(--jse-background-color, #fff);\n  min-width: 0;\n  min-height: 0;\n  font-family: var(--jse-font-family-mono, consolas, menlo, monaco, \"Ubuntu Mono\", \"source-code-pro\", monospace);\n  font-size: var(--jse-font-size-mono, 14px);\n  color: var(--jse-text-color, #4d4d4d);\n  line-height: var(--jse-line-height, calc(1em + 4px));\n}\n.jse-table-mode.no-main-menu.svelte-1p86y3c {\n  border-top: var(--jse-main-border, 1px solid #d7d7d7);\n}\n.jse-table-mode.svelte-1p86y3c .jse-search-box-container:where(.svelte-1p86y3c) {\n  position: relative;\n  height: 0;\n  top: calc(var(--jse-line-height, calc(1em + 4px)) + 2 * var(--jse-padding, 10px));\n  margin-right: calc(var(--jse-padding, 10px) + 20px);\n  margin-left: var(--jse-padding, 10px);\n  text-align: right;\n  z-index: 3;\n}\n.jse-table-mode.svelte-1p86y3c .jse-hidden-input-label:where(.svelte-1p86y3c) {\n  position: fixed;\n  right: 0;\n  top: 0;\n  width: 0;\n  height: 0;\n}\n.jse-table-mode.svelte-1p86y3c .jse-hidden-input-label:where(.svelte-1p86y3c) .jse-hidden-input:where(.svelte-1p86y3c) {\n  width: 0;\n  height: 0;\n  padding: 0;\n  border: 0;\n  outline: none;\n}\n.jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c) {\n  flex: 1;\n  align-items: flex-start;\n  flex-direction: column;\n  display: flex;\n  overflow: auto;\n  overflow-anchor: none;\n  scrollbar-gutter: stable;\n  border-left: var(--jse-main-border, 1px solid #d7d7d7);\n  border-right: var(--jse-main-border, 1px solid #d7d7d7);\n}\n.jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c):last-child {\n  border-bottom: var(--jse-main-border, 1px solid #d7d7d7);\n}\n.jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c) table.jse-table-main:where(.svelte-1p86y3c) {\n  border-collapse: collapse;\n  border-spacing: 0;\n}\n.jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c) table.jse-table-main:where(.svelte-1p86y3c) .jse-table-invisible-start-section:where(.svelte-1p86y3c) td:where(.svelte-1p86y3c),\n.jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c) table.jse-table-main:where(.svelte-1p86y3c) .jse-table-invisible-end-section:where(.svelte-1p86y3c) td:where(.svelte-1p86y3c) {\n  margin: 0;\n  padding: 0;\n}\n.jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c) table.jse-table-main:where(.svelte-1p86y3c) .jse-search-box-background:where(.svelte-1p86y3c) {\n  background: var(--jse-table-header-background, #f5f5f5);\n}\n.jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c) table.jse-table-main:where(.svelte-1p86y3c) .jse-table-invisible-end-section:where(.svelte-1p86y3c) td:where(.svelte-1p86y3c) {\n  padding-bottom: var(--jse-padding, 10px);\n}\n.jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c) table.jse-table-main:where(.svelte-1p86y3c) .jse-table-row:where(.svelte-1p86y3c):hover {\n  background-color: var(--jse-table-row-odd-background, rgba(0, 0, 0, 0.05));\n}\n.jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c) table.jse-table-main:where(.svelte-1p86y3c) .jse-table-row:where(.svelte-1p86y3c) .jse-table-cell:where(.svelte-1p86y3c) {\n  padding: 0 var(--jse-padding, 10px) 0 0;\n  vertical-align: top;\n  white-space: nowrap;\n  height: var(--jse-line-height, calc(1em + 4px));\n}\n.jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c) table.jse-table-main:where(.svelte-1p86y3c) .jse-table-row:where(.svelte-1p86y3c) .jse-table-cell.jse-table-cell-header:where(.svelte-1p86y3c), .jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c) table.jse-table-main:where(.svelte-1p86y3c) .jse-table-row:where(.svelte-1p86y3c) .jse-table-cell.jse-table-cell-gutter:where(.svelte-1p86y3c) {\n  font-weight: normal;\n  text-align: left;\n  color: var(--jse-text-readonly, #8d8d8d);\n  background: var(--jse-table-header-background, #f5f5f5);\n}\n.jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c) table.jse-table-main:where(.svelte-1p86y3c) .jse-table-row:where(.svelte-1p86y3c) .jse-table-cell.jse-table-cell-header:where(.svelte-1p86y3c) {\n  padding: 0;\n  position: sticky;\n  top: 0;\n}\n.jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c) table.jse-table-main:where(.svelte-1p86y3c) .jse-table-row:where(.svelte-1p86y3c) .jse-table-cell.jse-table-cell-header:where(.svelte-1p86y3c) .jse-table-root-error:where(.svelte-1p86y3c) {\n  padding: calc(0.5 * var(--jse-padding, 10px)) var(--jse-padding, 10px) calc(0.5 * var(--jse-padding, 10px)) calc(0.5 * var(--jse-padding, 10px));\n}\n.jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c) table.jse-table-main:where(.svelte-1p86y3c) .jse-table-row:where(.svelte-1p86y3c) .jse-table-cell.jse-table-cell-gutter:where(.svelte-1p86y3c) {\n  padding: 0 var(--jse-padding, 10px) 0 calc(0.5 * var(--jse-padding, 10px));\n}\n.jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c) table.jse-table-main:where(.svelte-1p86y3c) .jse-table-row:where(.svelte-1p86y3c) .jse-table-cell:where(.svelte-1p86y3c) .jse-value-outer:where(.svelte-1p86y3c) {\n  display: inline-block;\n  cursor: var(--jse-contents-cursor, pointer);\n}\n.jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c) table.jse-table-main:where(.svelte-1p86y3c) .jse-table-row:where(.svelte-1p86y3c) .jse-table-cell:where(.svelte-1p86y3c) .jse-value-outer:where(.svelte-1p86y3c):hover {\n  background: var(--jse-hover-background-color, rgba(0, 0, 0, 0.06));\n}\n.jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c) table.jse-table-main:where(.svelte-1p86y3c) .jse-table-row:where(.svelte-1p86y3c) .jse-table-cell:where(.svelte-1p86y3c) .jse-value-outer.jse-selected-value:where(.svelte-1p86y3c) {\n  background: var(--jse-selection-background-color, #d3d3d3);\n}\n.jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c) table.jse-table-main:where(.svelte-1p86y3c) .jse-table-row:where(.svelte-1p86y3c) .jse-table-cell:where(.svelte-1p86y3c) .jse-context-menu-anchor:where(.svelte-1p86y3c) {\n  display: inline-flex;\n  position: relative;\n  vertical-align: top;\n}\n.jse-table-mode.svelte-1p86y3c .jse-contents.jse-contents-loading:where(.svelte-1p86y3c) {\n  align-items: unset;\n}\n.jse-table-mode.svelte-1p86y3c .jse-contents.jse-contents-loading:where(.svelte-1p86y3c) .jse-loading-space:where(.svelte-1p86y3c) {\n  flex: 1;\n}\n.jse-table-mode.svelte-1p86y3c .jse-contents.jse-contents-loading:where(.svelte-1p86y3c) .jse-loading:where(.svelte-1p86y3c) {\n  flex: 2;\n  text-align: center;\n  color: var(--jse-panel-color-readonly, #b2b2b2);\n  box-sizing: border-box;\n  font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen-Sans, Ubuntu, Cantarell, \"Helvetica Neue\", sans-serif);\n  font-size: var(--jse-font-size, 16px);\n}`);var wwA=FA('<div class=\"jse-table-root-error svelte-1p86y3c\"><!></div>'),ywA=FA('<th class=\"jse-table-cell jse-table-cell-header svelte-1p86y3c\"><!></th>'),vwA=FA('<th class=\"jse-table-cell jse-table-cell-header svelte-1p86y3c\"><!></th>'),bwA=FA('<th class=\"jse-table-cell jse-table-cell-gutter svelte-1p86y3c\"> <!></th>'),MwA=FA('<div class=\"jse-context-menu-anchor svelte-1p86y3c\"><!></div>'),kwA=FA('<td class=\"jse-table-cell svelte-1p86y3c\"><div><!><!></div> <!></td>'),SwA=FA('<td class=\"jse-table-cell svelte-1p86y3c\"></td>'),xwA=FA('<tr class=\"jse-table-row svelte-1p86y3c\"><!><!><!></tr>'),RwA=FA('<div class=\"jse-search-box-container svelte-1p86y3c\"><!></div> <div class=\"jse-contents svelte-1p86y3c\"><table class=\"jse-table-main svelte-1p86y3c\"><tbody><tr class=\"jse-table-row jse-table-row-header svelte-1p86y3c\"><th class=\"jse-table-cell jse-table-cell-header svelte-1p86y3c\"><!></th><!><!></tr><tr><td class=\"svelte-1p86y3c\"></td></tr><!><tr class=\"jse-table-invisible-end-section svelte-1p86y3c\"><td class=\"svelte-1p86y3c\"></td></tr></tbody></table></div> <!> <!> <!> <!>',1),NwA=FA(\"<!> <!>\",1),FwA=FA('<label class=\"jse-hidden-input-label svelte-1p86y3c\"><input type=\"text\" tabindex=\"-1\" class=\"jse-hidden-input svelte-1p86y3c\"/></label> <!>',1),LwA=FA('<div class=\"jse-contents jse-contents-loading svelte-1p86y3c\"><div class=\"jse-loading-space svelte-1p86y3c\"></div> <div class=\"jse-loading svelte-1p86y3c\">loading...</div></div>'),_wA=FA('<div role=\"table\"><!> <!></div> <!> <!>',1);function GwA(t,e){kt(e,!1);var A=CA(void 0,!0),i=CA(void 0,!0),n=CA(void 0,!0),o=qa(\"jsoneditor:TableMode\"),{openAbsolutePopup:a,closeAbsolutePopup:r}=cI(\"absolute-popup\"),s=a$(),g=w2(),l=w2(),C=typeof window>\"u\";o(\"isSSR:\",C);var I=N(e,\"readOnly\",9),d=N(e,\"externalContent\",9),B=N(e,\"externalSelection\",9),Q=N(e,\"history\",9),E=N(e,\"truncateTextSize\",9),f=N(e,\"mainMenuBar\",9),b=N(e,\"escapeControlCharacters\",9),R=N(e,\"escapeUnicodeCharacters\",9),M=N(e,\"flattenColumns\",9),v=N(e,\"parser\",9),F=N(e,\"parseMemoizeOne\",9),G=N(e,\"validator\",9),U=N(e,\"validationParser\",9),Y=N(e,\"indentation\",9),j=N(e,\"onChange\",9),AA=N(e,\"onChangeMode\",9),z=N(e,\"onSelect\",9),yA=N(e,\"onUndo\",9),P=N(e,\"onRedo\",9),nA=N(e,\"onRenderValue\",9),eA=N(e,\"onRenderMenu\",9),dA=N(e,\"onRenderContextMenu\",9),iA=N(e,\"onFocus\",9),aA=N(e,\"onBlur\",9),hA=N(e,\"onSortModal\",9),JA=N(e,\"onTransformModal\",9),ee=N(e,\"onJSONEditorModal\",9),UA=CA(void 0,!0),mA=CA(void 0,!0),KA=CA(void 0,!0),ze=CA(void 0,!0),Ke=CA(void 0,!0);sN({onMount:Jr,onDestroy:cl,getWindow:()=>mu(c(mA)),hasFocus:()=>Me&&document.hasFocus()||jR(c(mA)),onFocus:()=>{Ai=!0,iA()&&iA()()},onBlur:()=>{Ai=!1,aA()&&aA()()}});var HA,uA=CA(void 0,!0),XA=CA(void 0,!0),EA=CA(void 0,!0),ZA=CA(void 0,!0),MA=CA(void 0,!0),be=CA(void 0,!0),_A=CA(!1,!0),pA=CA(!1,!0);function Rt(k){x(be,(HA=k)?jX(c(uA),HA.items):void 0)}function Et(k){return Qe.apply(this,arguments)}function Qe(){return(Qe=Ut(function*(k){x(LA,void 0),yield gn(k)})).apply(this,arguments)}function _t(){x(_A,!1),x(pA,!1),L()}var Ue=CA(1e4,!0),Te=CA([],!0),ht=CA(void 0,!0),Me=!1,Ai=!1,J=CA(!1,!0),O=CA({},!0),tA=CA(600,!0),oA=CA(0,!0),NA=18;function de(k){x(LA,k)}function Ee(k){c(LA)&&k!==void 0&&(cr(k,O1(c(LA)))&&cr(k,st(c(LA)))||(o(\"clearing selection: path does not exist anymore\",c(LA)),x(LA,void 0)))}var xA=CA(c(uA)!==void 0?uR({json:c(uA)}):void 0,!0),LA=CA(ru(B())?B():void 0,!0),dt=CA(void 0,!0),At=CA(!1,!0);function Je(k){if(!I()){o(\"onSortByHeader\",k);var H=k.sortDirection===al.desc?-1:1;vi(I$(c(uA),[],k.path,H),(Z,gA)=>({state:gA,sortedColumn:k}))}}Jr(()=>{c(LA)&&ko(st(c(LA)))});var Ge=CA(void 0,!0);function ri(k){if(k.json!==void 0||k.text!==void 0){var H=c(uA)!==void 0&&k.json!==void 0;Q().add({type:\"tree\",undo:{patch:H?[{op:\"replace\",path:\"\",value:k.json}]:void 0,json:k.json,text:k.text,documentState:k.documentState,textIsRepaired:k.textIsRepaired,selection:r0(k.selection),sortedColumn:k.sortedColumn},redo:{patch:H?[{op:\"replace\",path:\"\",value:c(uA)}]:void 0,json:c(uA),text:c(XA),documentState:c(xA),textIsRepaired:c(At),selection:r0(c(LA)),sortedColumn:c(dt)}})}}var en=CA([],!0),rn=VB(r$);function Le(k,H,Z,gA){OQ(()=>{var DA;try{DA=rn(k,H,Z,gA)}catch(Ae){DA=[{path:[],message:\"Failed to validate: \"+Ae.message,severity:ic.warning}]}di(DA,c(en))||(o(\"validationErrors changed:\",DA),x(en,DA))},DA=>o(\"validationErrors updated in \".concat(DA,\" ms\")))}function ji(){return o(\"validate\"),c(EA)?{parseError:c(EA),isRepairable:!1}:(Le(c(uA),G(),v(),U()),zi(c(en))?void 0:{validationErrors:c(en)})}function Bi(k,H){if(o(\"patch\",k,H),c(uA)===void 0)throw new Error(\"Cannot apply patch: no JSON\");var Z=c(uA),gA={json:void 0,text:c(XA),documentState:c(xA),selection:r0(c(LA)),sortedColumn:c(dt),textIsRepaired:c(At)},DA=PX(c(uA),k),Ae=FX(c(uA),c(xA),k),ne=bDA(c(dt),k,c(Te)),Be=typeof H==\"function\"?H(Ae.json,Ae.documentState,c(LA)):void 0;return x(uA,Be?.json!==void 0?Be.json:Ae.json),x(xA,Be?.state!==void 0?Be.state:Ae.documentState),x(LA,Be?.selection!==void 0?Be.selection:c(LA)),x(dt,Be?.sortedColumn!==void 0?Be.sortedColumn:ne),x(XA,void 0),x(At,!1),x(ZA,void 0),x(MA,void 0),x(EA,void 0),Q().add({type:\"tree\",undo:ye({patch:DA},gA),redo:{patch:k,json:void 0,text:void 0,documentState:c(xA),selection:r0(c(LA)),sortedColumn:c(dt),textIsRepaired:c(At)}}),{json:c(uA),previousJson:Z,undo:DA,redo:k}}function vi(k,H){o(\"handlePatch\",k,H);var Z={json:c(uA),text:c(XA)},gA=Bi(k,H);return Ji(Z,gA),gA}function Ji(k,H){if((k.json!==void 0||k?.text!==void 0)&&j()){if(c(XA)!==void 0){var Z={text:c(XA),json:void 0};j()(Z,k,{contentErrors:ji(),patchResult:H})}else if(c(uA)!==void 0){var gA={text:void 0,json:c(uA)};j()(gA,k,{contentErrors:ji(),patchResult:H})}}}function Dt(k){o(\"pasted json as text\",k),x(ZA,k)}function qi(k){o(\"pasted multiline text\",{pastedText:k}),x(MA,k)}function Nt(k){var H=parseInt(k[0],10),Z=[String(H+1),...k.slice(1)];return cr(c(uA),Z)?_i(Z):_i(k)}function L(){o(\"focus\"),c(ze)&&(c(ze).focus(),c(ze).select())}function gt(k){x(oA,k.target.scrollTop)}function gi(){c(LA)||x(LA,(function(){if(Lo(c(uA))&&!zi(c(uA))&&!zi(c(Te)))return _i([\"0\",...c(Te)[0]])})())}function sn(){if(c(At)&&c(uA)!==void 0){var k={json:c(uA),text:c(XA)},H={json:c(uA),documentState:c(xA),selection:c(LA),sortedColumn:c(dt),text:c(XA),textIsRepaired:c(At)};x(XA,void 0),x(At,!1),Ee(c(uA)),ri(H),Ji(k,void 0)}return{json:c(uA),text:c(XA)}}function gn(k){var{scrollToWhenVisible:H=!0}=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},Z=c(_A)?V3:0,gA=lZ(k,c(Te),O,NA),DA=gA-c(oA)+Z+NA,Ae=eo(k);if(o(\"scrollTo\",{path:k,top:gA,scrollTop:c(oA),elem:Ae}),!c(KA))return Promise.resolve();var ne=c(KA).getBoundingClientRect();if(Ae&&!H){var Be=Ae.getBoundingClientRect();if(Be.bottom>ne.top&&Be.top<ne.bottom)return Promise.resolve()}var Ye=-Math.max(Z+2*NA,ne.height/4);return new Promise(Ae?ke=>{s(Ae,{container:c(KA),offset:Ye,duration:300,callback:()=>{Kn(k),ke()}})}:ke=>{s(DA,{container:c(KA),offset:Ye,duration:300,callback:()=>{uo(),Kn(k),ke()}})})}function Kn(k){var H=eo(k);if(H&&c(KA)){var Z=c(KA).getBoundingClientRect(),gA=H.getBoundingClientRect();if(gA.right>Z.right){var DA=gA.right-Z.right;yg(KA,c(KA).scrollLeft+=DA)}if(gA.left<Z.left){var Ae=Z.left-gA.left;yg(KA,c(KA).scrollLeft-=Ae)}}}function ko(k){(function(H){if(c(KA)){var{rowIndex:Z}=nl(H,c(Te)),gA=lZ(H,c(Te),O,NA),DA=gA+(O[Z]||NA),Ae=NA,ne=c(KA).getBoundingClientRect(),Be=c(oA),Ye=c(oA)+ne.height-Ae;if(DA>Ye){var ke=DA-Ye;yg(KA,c(KA).scrollTop+=ke)}if(gA<Be){var Re=Be-gA;yg(KA,c(KA).scrollTop-=Re)}}})(k),Kn(k)}function eo(k){var H,Z,gA=c(Te).find(Ae=>I0(k.slice(1),Ae)),DA=gA?k.slice(0,1).concat(gA):k;return(H=(Z=c(KA))===null||Z===void 0?void 0:Z.querySelector('td[data-path=\"'.concat(DD(DA),'\"]')))!==null&&H!==void 0?H:void 0}function fo(k){var H,{anchor:Z,left:gA,top:DA,width:Ae,height:ne,offsetTop:Be,offsetLeft:Ye,showTip:ke}=k,Re=(function(fA){var{json:PA,documentState:Ne,selection:pe,readOnly:we,onEditValue:it,onEditRow:zt,onToggleEnforceString:bi,onCut:Dn,onCopy:Hi,onPaste:no,onRemove:qt,onDuplicateRow:Uo,onInsertBeforeRow:Jn,onInsertAfterRow:Jo,onRemoveRow:Cn}=fA,Lt=PA!==void 0,Vi=!!pe,Vt=PA!==void 0&&pe?Pe(PA,st(pe)):void 0,mt=Lt&&($n(pe)||ja(pe)||an(pe)),si=!we&&Lt&&pe!==void 0&&_D(pe),Wo=si&&!jo(Vt),Yn=!we&&mt,Yo=pe!==void 0&&g0(PA,Ne,st(pe));return[{type:\"separator\"},{type:\"row\",items:[{type:\"column\",items:[{type:\"label\",text:\"Table cell:\"},{type:\"dropdown-button\",main:{type:\"button\",onClick:()=>it(),icon:s1,text:\"Edit\",title:\"Edit the value (Double-click on the value)\",disabled:!si},width:\"11em\",items:[{type:\"button\",icon:s1,text:\"Edit\",title:\"Edit the value (Double-click on the value)\",onClick:()=>it(),disabled:!si},{type:\"button\",icon:Yo?CM:BM,text:\"Enforce string\",title:\"Enforce keeping the value as string when it contains a numeric value\",onClick:()=>bi(),disabled:!Wo}]},{type:\"dropdown-button\",main:{type:\"button\",onClick:()=>Dn(!0),icon:g1,text:\"Cut\",title:\"Cut selected contents, formatted with indentation (Ctrl+X)\",disabled:!Yn},width:\"10em\",items:[{type:\"button\",icon:g1,text:\"Cut formatted\",title:\"Cut selected contents, formatted with indentation (Ctrl+X)\",onClick:()=>Dn(!0),disabled:we||!mt},{type:\"button\",icon:g1,text:\"Cut compacted\",title:\"Cut selected contents, without indentation (Ctrl+Shift+X)\",onClick:()=>Dn(!1),disabled:we||!mt}]},{type:\"dropdown-button\",main:{type:\"button\",onClick:()=>Hi(!0),icon:j0,text:\"Copy\",title:\"Copy selected contents, formatted with indentation (Ctrl+C)\",disabled:!mt},width:\"12em\",items:[{type:\"button\",icon:j0,text:\"Copy formatted\",title:\"Copy selected contents, formatted with indentation (Ctrl+C)\",onClick:()=>Hi(!1),disabled:!mt},{type:\"button\",icon:j0,text:\"Copy compacted\",title:\"Copy selected contents, without indentation (Ctrl+Shift+C)\",onClick:()=>Hi(!1),disabled:!mt}]},{type:\"button\",onClick:()=>no(),icon:gM,text:\"Paste\",title:\"Paste clipboard contents (Ctrl+V)\",disabled:we||!Vi},{type:\"button\",onClick:()=>qt(),icon:s8,text:\"Remove\",title:\"Remove selected contents (Delete)\",disabled:we||!mt}]},{type:\"column\",items:[{type:\"label\",text:\"Table row:\"},{type:\"button\",onClick:()=>zt(),icon:s1,text:\"Edit row\",title:\"Edit the current row\",disabled:we||!Vi||!Lt},{type:\"button\",onClick:()=>Uo(),icon:cM,text:\"Duplicate row\",title:\"Duplicate the current row (Ctrl+D)\",disabled:we||!Vi||!Lt},{type:\"button\",onClick:()=>Jn(),icon:l1,text:\"Insert before\",title:\"Insert a row before the current row\",disabled:we||!Vi||!Lt},{type:\"button\",onClick:()=>Jo(),icon:l1,text:\"Insert after\",title:\"Insert a row after the current row\",disabled:we||!Vi||!Lt},{type:\"button\",onClick:()=>Cn(),icon:s8,text:\"Remove row\",title:\"Remove current row\",disabled:we||!Vi||!Lt}]}]}]})({json:c(uA),documentState:c(xA),selection:c(LA),readOnly:I(),onEditValue:ta,onEditRow:Ko,onToggleEnforceString:qo,onCut:Ja,onCopy:Sa,onPaste:Ci,onRemove:Mi,onDuplicateRow:pn,onInsertBeforeRow:io,onInsertAfterRow:mo,onRemoveRow:vA}),ii=(H=dA()(Re))!==null&&H!==void 0?H:Re;if(ii!==!1){var xn={left:gA,top:DA,offsetTop:Be,offsetLeft:Ye,width:Ae,height:ne,anchor:Z,closeOnOuterClick:!0,onClose:()=>{Me=!1,L()}};Me=!0;var q=a(D$,{tip:ke?\"Tip: you can open this context menu via right-click or with Ctrl+Q\":void 0,items:ii,onRequestClose(){r(q),L()}},xn)}}function Go(k){if(!za(c(LA)))if(k&&(k.stopPropagation(),k.preventDefault()),k&&k.type===\"contextmenu\"&&k.target!==c(ze))fo({left:k.clientX,top:k.clientY,width:cC,height:lC,showTip:!1});else{var H,Z=(H=c(KA))===null||H===void 0?void 0:H.querySelector(\".jse-table-cell.jse-selected-value\");if(Z)fo({anchor:Z,offsetTop:2,width:cC,height:lC,showTip:!1});else{var gA,DA=(gA=c(KA))===null||gA===void 0?void 0:gA.getBoundingClientRect();DA&&fo({top:DA.top+2,left:DA.left+2,width:cC,height:lC,showTip:!1})}}}function co(k){fo({anchor:kX(k.target,\"BUTTON\"),offsetTop:0,width:cC,height:lC,showTip:!0})}function ta(){if(!I()&&c(LA)){var k=st(c(LA));jo(Pe(c(uA),k))?at(k):x(LA,_i(k))}}function Ko(){!I()&&c(LA)&&at(st(c(LA)).slice(0,1))}function qo(){if(!I()&&an(c(LA))){var k=c(LA).path,H=pt(k),Z=Pe(c(uA),k),gA=!g0(c(uA),c(xA),k),DA=gA?String(Z):EE(String(Z),v());o(\"handleToggleEnforceString\",{enforceString:gA,value:Z,updatedValue:DA}),vi([{op:\"replace\",path:H,value:DA}],(Ae,ne)=>({state:Aw(c(uA),ne,k,{type:\"value\",enforceString:gA})}))}}function Co(){return se.apply(this,arguments)}function se(){return(se=Ut(function*(){if(o(\"apply pasted json\",c(ZA)),c(ZA)){var{onPasteAsJson:k}=c(ZA);k(),setTimeout(L)}})).apply(this,arguments)}function Ci(){return tn.apply(this,arguments)}function tn(){return(tn=Ut(function*(){try{IA(yield navigator.clipboard.readText())}catch(k){console.error(k),x(J,!0)}})).apply(this,arguments)}function ln(){return So.apply(this,arguments)}function So(){return(So=Ut(function*(){o(\"apply pasted multiline text\",c(MA)),c(MA)&&(IA(JSON.stringify(c(MA))),setTimeout(L))})).apply(this,arguments)}function la(){o(\"clear pasted json\"),x(ZA,void 0),L()}function pi(){o(\"clear pasted multiline text\"),x(MA,void 0),L()}function to(){AA()(ga.text)}function Ja(k){return Io.apply(this,arguments)}function Io(){return(Io=Ut(function*(k){yield E$({json:c(uA),selection:c(LA),indentation:k?Y():void 0,readOnly:I(),parser:v(),onPatch:vi})})).apply(this,arguments)}function Sa(){return kn.apply(this,arguments)}function kn(){return kn=Ut(function*(){var k=!(arguments.length>0&&arguments[0]!==void 0)||arguments[0];c(uA)!==void 0&&(yield h$({json:c(uA),selection:c(LA),indentation:k?Y():void 0,parser:v()}))}),kn.apply(this,arguments)}function Mi(){f$({json:c(uA),text:c(XA),selection:c(LA),keepSelection:!0,readOnly:I(),onChange:j(),onPatch:vi})}function Ot(k){I()||(o(\"extract\",{path:k}),vi(TX(c(uA),_i(k))))}function pn(){(function(k){var{json:H,selection:Z,columns:gA,readOnly:DA,onPatch:Ae}=k;if(!DA&&H!==void 0&&Z&&HQ(Z)){var{rowIndex:ne,columnIndex:Be}=nl(st(Z),gA);os(\"duplicate row\",{rowIndex:ne});var Ye=[String(ne)];Ae(HX(H,[Ye]),(ke,Re)=>({state:Re,selection:_i(L1({rowIndex:ne<H.length?ne+1:ne,columnIndex:Be},gA))}))}})({json:c(uA),selection:c(LA),columns:c(Te),readOnly:I(),onPatch:vi})}function io(){(function(k){var{json:H,selection:Z,columns:gA,readOnly:DA,onPatch:Ae}=k;if(!DA&&H!==void 0&&Z&&HQ(Z)){var{rowIndex:ne}=nl(st(Z),gA);os(\"insert before row\",{rowIndex:ne}),Ae(TQ(H,[String(ne)],[{key:\"\",value:Oo(H[0])?{}:\"\"}]))}})({json:c(uA),selection:c(LA),columns:c(Te),readOnly:I(),onPatch:vi})}function mo(){(function(k){var{json:H,selection:Z,columns:gA,readOnly:DA,onPatch:Ae}=k;if(!DA&&H!==void 0&&Z&&HQ(Z)){var{rowIndex:ne,columnIndex:Be}=nl(st(Z),gA);os(\"insert after row\",{rowIndex:ne});var Ye=ne+1,ke=[String(Ye)],Re=[{key:\"\",value:Oo(H[0])?{}:\"\"}];Ae(Ye<H.length?TQ(H,ke,Re):pR(H,[],Re),(ii,xn)=>({state:xn,selection:_i(L1({rowIndex:Ye,columnIndex:Be},gA))}))}})({json:c(uA),selection:c(LA),columns:c(Te),readOnly:I(),onPatch:vi})}function vA(){(function(k){var{json:H,selection:Z,columns:gA,readOnly:DA,onPatch:Ae}=k;if(!DA&&H!==void 0&&Z&&HQ(Z)){var{rowIndex:ne,columnIndex:Be}=nl(st(Z),gA);os(\"remove row\",{rowIndex:ne}),Ae(KD([[String(ne)]]),(Ye,ke)=>{var Re=ne<Ye.length?ne:ne>0?ne-1:void 0,ii=Re!==void 0?_i(L1({rowIndex:Re,columnIndex:Be},gA)):void 0;return os(\"remove row new selection\",{rowIndex:ne,newRowIndex:Re,newSelection:ii}),{state:ke,selection:ii}})}})({json:c(uA),selection:c(LA),columns:c(Te),readOnly:I(),onPatch:vi})}function VA(){return(VA=Ut(function*(k){yield m$({char:k,selectInside:!1,json:c(uA),selection:c(LA),readOnly:I(),parser:v(),onPatch:vi,onReplaceJson:SA,onSelect:de})})).apply(this,arguments)}function me(k){var H;k.preventDefault(),IA((H=k.clipboardData)===null||H===void 0?void 0:H.getData(\"text/plain\"))}function IA(k){k!==void 0&&u$({clipboardText:k,json:c(uA),selection:c(LA),readOnly:I(),parser:v(),onPatch:vi,onChangeText:re,onPasteMultilineText:qi,openRepairModal:bt})}function SA(k,H){var Z={json:c(uA),text:c(XA)},gA={json:c(uA),documentState:c(xA),selection:c(LA),sortedColumn:c(dt),text:c(XA),textIsRepaired:c(At)},DA=wg(k,c(xA)),Ae=typeof H==\"function\"?H(k,DA,c(LA)):void 0;x(uA,Ae?.json!==void 0?Ae.json:k),x(xA,Ae?.state!==void 0?Ae.state:DA),x(LA,Ae?.selection!==void 0?Ae.selection:c(LA)),x(dt,void 0),x(XA,void 0),x(At,!1),x(EA,void 0),Ee(c(uA)),ri(gA),Ji(Z,void 0)}function re(k,H){o(\"handleChangeText\");var Z={json:c(uA),text:c(XA)},gA={json:c(uA),documentState:c(xA),selection:c(LA),sortedColumn:c(dt),text:c(XA),textIsRepaired:c(At)};try{x(uA,F()(k)),x(xA,wg(c(uA),c(xA))),x(XA,void 0),x(At,!1),x(EA,void 0)}catch(Ae){try{x(uA,F()(jg(k))),x(xA,wg(c(uA),c(xA))),x(XA,k),x(At,!0),x(EA,void 0)}catch(ne){x(uA,void 0),x(xA,void 0),x(XA,k),x(At,!1),x(EA,c(XA)!==\"\"?nE(c(XA),Ae.message||String(Ae)):void 0)}}if(typeof H==\"function\"){var DA=H(c(uA),c(xA),c(LA));x(uA,DA?.json!==void 0?DA.json:c(uA)),x(xA,DA?.state!==void 0?DA.state:c(xA)),x(LA,DA?.selection!==void 0?DA.selection:c(LA))}Ee(c(uA)),ri(gA),Ji(Z,void 0)}function Se(k){o(\"select validation error\",k),x(LA,_i(k.path)),gn(k.path)}function tt(k){if(c(uA)!==void 0){var{id:H,onTransform:Z,onClose:gA}=k,DA=k.rootPath||[];Me=!0,JA()({id:H||l,json:c(uA),rootPath:DA||[],onTransform:Ae=>{Z?Z({operations:Ae,json:c(uA),transformedJson:Js(c(uA),Ae)}):(o(\"onTransform\",DA,Ae),vi(Ae))},onClose:()=>{Me=!1,setTimeout(L),gA&&gA()}})}}function at(k){o(\"openJSONEditorModal\",{path:k}),Me=!0,ee()({content:{json:Pe(c(uA),k)},path:k,onPatch:vi,onClose:()=>{Me=!1,setTimeout(L)}})}function bt(k,H){x(Ke,{text:k,onParse:Z=>fu(Z,gA=>uu(gA,v())),onRepair:fX,onApply:H,onClose:L})}function Sn(){(function(k){I()||c(uA)===void 0||(Me=!0,hA()({id:g,json:c(uA),rootPath:k,onSort:H=>{var{operations:Z,itemPath:gA,direction:DA}=H;o(\"onSort\",Z,k,gA,DA),vi(Z,(Ae,ne)=>({state:ne,sortedColumn:{path:gA,sortDirection:DA===-1?al.desc:al.asc}}))},onClose:()=>{Me=!1,setTimeout(L)}}))})([])}function ki(){tt({rootPath:[]})}function Gi(k){o(\"openFind\",{findAndReplace:k}),x(_A,!1),x(pA,!1),uo(),x(_A,!0),x(pA,k)}function jt(){if(!I()&&Q().canUndo){var k=Q().undo();if(LD(k)){var H={json:c(uA),text:c(XA)};x(uA,k.undo.patch?Js(c(uA),k.undo.patch):k.undo.json),x(xA,k.undo.documentState),x(LA,k.undo.selection),x(dt,k.undo.sortedColumn),x(XA,k.undo.text),x(At,k.undo.textIsRepaired),x(EA,void 0),o(\"undo\",{item:k,json:c(uA)}),Ji(H,k.undo.patch&&k.redo.patch?{json:c(uA),previousJson:H.json,redo:k.undo.patch,undo:k.redo.patch}:void 0),L(),c(LA)&&gn(st(c(LA)),{scrollToWhenVisible:!1})}else yA()(k)}}function Si(){if(!I()&&Q().canRedo){var k=Q().redo();if(LD(k)){var H={json:c(uA),text:c(XA)};x(uA,k.redo.patch?Js(c(uA),k.redo.patch):k.redo.json),x(xA,k.redo.documentState),x(LA,k.redo.selection),x(dt,k.redo.sortedColumn),x(XA,k.redo.text),x(At,k.redo.textIsRepaired),x(EA,void 0),o(\"redo\",{item:k,json:c(uA)}),Ji(H,k.undo.patch&&k.redo.patch?{json:c(uA),previousJson:H.json,redo:k.redo.patch,undo:k.undo.patch}:void 0),L(),c(LA)&&gn(st(c(LA)),{scrollToWhenVisible:!1})}else P()(k)}}function ca(k){x(tA,k.getBoundingClientRect().height)}RA(()=>(_(b()),_(R())),()=>{x(UA,zR({escapeControlCharacters:b(),escapeUnicodeCharacters:R()}))}),RA(()=>c(_A),()=>{(function(k){if(c(KA)){var H=k?V3:-100;c(KA).scrollTo({top:yg(KA,c(KA).scrollTop+=H),left:c(KA).scrollLeft})}})(c(_A))}),RA(()=>_(d()),()=>{(function(k){var H={json:c(uA)},Z=tu(k)?k.text!==c(XA):!di(H.json,k.json);if(o(\"update external content\",{isChanged:Z}),Z){var gA={json:c(uA),documentState:c(xA),selection:c(LA),sortedColumn:c(dt),text:c(XA),textIsRepaired:c(At)};if(tu(k))try{x(uA,F()(k.text)),x(xA,wg(c(uA),c(xA))),x(XA,k.text),x(At,!1),x(EA,void 0)}catch(DA){try{x(uA,F()(jg(k.text))),x(xA,wg(c(uA),c(xA))),x(XA,k.text),x(At,!0),x(EA,void 0)}catch(Ae){x(uA,void 0),x(xA,void 0),x(XA,k.text),x(At,!1),x(EA,c(XA)!==\"\"?nE(c(XA),DA.message||String(DA)):void 0)}}else x(uA,k.json),x(xA,wg(c(uA),c(xA))),x(XA,void 0),x(At,!1),x(EA,void 0);Ee(c(uA)),x(dt,void 0),ri(gA)}})(d())}),RA(()=>_(B()),()=>{(function(k){di(c(LA),k)||(o(\"applyExternalSelection\",{selection:c(LA),externalSelection:k}),ru(k)&&x(LA,k))})(B())}),RA(()=>(c(Te),c(uA),_(M()),c(Ue)),()=>{x(Te,Lo(c(uA))?(function(k,H){var Z=new Set(H.map(pt)),gA=new Set(k.map(pt));for(var DA of Z)gA.has(DA)||Z.delete(DA);for(var Ae of gA)Z.has(Ae)||Z.add(Ae);return[...Z].map(As)})(DDA(c(uA),M(),c(Ue)),c(Te)):[])}),RA(()=>(c(uA),c(Te)),()=>{x(ht,!(!c(uA)||zi(c(Te))))}),RA(()=>(c(uA),c(Ue)),()=>{x(A,Array.isArray(c(uA))&&c(uA).length>c(Ue))}),RA(()=>(c(oA),c(tA),c(uA),c(_A),V3),()=>{x(i,wDA(c(oA),c(tA),c(uA),O,NA,c(_A)?V3:0))}),RA(()=>c(uA),()=>{c(uA),c(KA)&&c(KA).scrollTo({top:c(KA).scrollTop,left:c(KA).scrollLeft})}),RA(()=>c(LA),()=>{var k;k=c(LA),di(k,B())||(o(\"onSelect\",k),z()(k))}),RA(()=>(_(I()),_(E()),_(v()),c(UA),c(uA),c(xA),_(nA())),()=>{x(Ge,{mode:ga.table,readOnly:I(),truncateTextSize:E(),parser:v(),normalization:c(UA),getJson:()=>c(uA),getDocumentState:()=>c(xA),findElement:eo,findNextInside:Nt,focus:L,onPatch:(k,H)=>vi((function(Z,gA){return Z.flatMap(DA=>{if(m6(DA)){var Ae=As(DA.path);if(Ae.length>0){for(var ne=[DA],Be=Li(Ae);Be.length>0&&!cr(gA,Be);)ne.unshift({op:\"add\",path:pt(Be),value:{}}),Be=Li(Be);return ne}}return DA})})(k,c(uA)),H),onSelect:de,onFind:Gi,onPasteJson:Dt,onRenderValue:nA()})}),RA(()=>(c(uA),_(G()),_(v()),_(U())),()=>{Le(c(uA),G(),v(),U())}),RA(()=>(c(en),c(Te)),()=>{x(n,yDA(c(en),c(Te)))}),mn();var Ft={validate:ji,patch:Bi,focus:L,acceptAutoRepair:sn,scrollTo:gn,findElement:eo,openTransformModal:tt};$t(!0);var rt=_wA();ue(\"mousedown\",dC,function(k){!hE(k.target,H=>H===c(mA))&&za(c(LA))&&(o(\"click outside the editor, exit edit mode\"),x(LA,r0(c(LA))),Ai&&c(ze)&&(c(ze).focus(),c(ze).blur()),o(\"blur (outside editor)\"),c(ze)&&c(ze).blur())});var xi,Yi=$e(rt),Un=cA(Yi),cn=k=>{(function(H,Z){kt(Z,!1);var gA=N(Z,\"containsValidArray\",9),DA=N(Z,\"readOnly\",9),Ae=N(Z,\"showSearch\",13,!1),ne=N(Z,\"history\",9),Be=N(Z,\"onSort\",9),Ye=N(Z,\"onTransform\",9),ke=N(Z,\"onContextMenu\",9),Re=N(Z,\"onUndo\",9),ii=N(Z,\"onRedo\",9),xn=N(Z,\"onRenderMenu\",9);function q(){Ae(!Ae())}var fA=CA(void 0,!0),PA=CA(void 0,!0);RA(()=>(_(DA()),_(Be()),_(gA()),_(Ye()),_(ke()),_(Re()),_(ne()),_(ii())),()=>{x(fA,DA()?[{type:\"space\"}]:[{type:\"button\",icon:V4,title:\"Sort\",className:\"jse-sort\",onClick:Be(),disabled:DA()||!gA()},{type:\"button\",icon:z4,title:\"Transform contents (filter, sort, project)\",className:\"jse-transform\",onClick:Ye(),disabled:DA()||!gA()},{type:\"button\",icon:P4,title:\"Search (Ctrl+F)\",className:\"jse-search\",onClick:q,disabled:!gA()},{type:\"button\",icon:lM,title:WR,className:\"jse-contextmenu\",onClick:ke()},{type:\"separator\"},{type:\"button\",icon:c8,title:\"Undo (Ctrl+Z)\",className:\"jse-undo\",onClick:Re(),disabled:!ne().canUndo},{type:\"button\",icon:l8,title:\"Redo (Ctrl+Shift+Z)\",className:\"jse-redo\",onClick:ii(),disabled:!ne().canRedo},{type:\"space\"}])}),RA(()=>(_(xn()),c(fA)),()=>{x(PA,xn()(c(fA))||c(fA))}),mn(),$t(!0),aw(H,{get items(){return c(PA)}}),St()})(k,{get containsValidArray(){return c(ht)},get readOnly(){return I()},get history(){return Q()},onSort:Sn,onTransform:ki,onUndo:jt,onRedo:Si,onContextMenu:co,get onRenderMenu(){return eA()},get showSearch(){return c(_A)},set showSearch(H){x(_A,H)},$$legacy:!0})};YA(Un,k=>{f()&&k(cn)});var Mt=bA(Un,2),Vo=k=>{var H=FwA(),Z=$e(H),gA=cA(Z);gA.readOnly=!0,Mo(gA,Be=>x(ze,Be),()=>c(ze));var DA=bA(Z,2),Ae=Be=>{var Ye=RwA(),ke=$e(Ye);d$(cA(ke),{get json(){return c(uA)},get documentState(){return c(xA)},get parser(){return v()},get showSearch(){return c(_A)},get showReplace(){return c(pA)},get readOnly(){return I()},get columns(){return c(Te)},onSearch:Rt,onFocus:Et,onPatch:vi,onClose:_t});var Re=bA(ke,2),ii=cA(Re),xn=cA(ii),q=cA(xn),fA=cA(q),PA=cA(fA),Ne=mt=>{var si=et(()=>(_(FQ),c(n),QA(()=>{var ia;return FQ([],(ia=c(n))===null||ia===void 0?void 0:ia.root)}))),Wo=yi(),Yn=$e(Wo),Yo=ia=>{var nr=wwA();ZQ(cA(nr),{get validationError(){return c(si)},get onExpand(){return ol}}),lA(ia,nr)};YA(Yn,ia=>{c(si)&&ia(Yo)}),lA(mt,Wo)};YA(PA,mt=>{_(zi),c(n),QA(()=>{var si;return!zi((si=c(n))===null||si===void 0?void 0:si.root)})&&mt(Ne)});var pe=bA(fA);ea(pe,1,()=>c(Te),ha,(mt,si)=>{var Wo=ywA();(function(Yn,Yo){kt(Yo,!1);var ia=CA(void 0,!0),nr=CA(void 0,!0),u0=CA(void 0,!0),ng=N(Yo,\"path\",9),dl=N(Yo,\"sortedColumn\",9),Ec=N(Yo,\"readOnly\",9),Bl=N(Yo,\"onSort\",9);RA(()=>(_(ng()),$s),()=>{x(ia,zi(ng())?\"values\":$s(ng()))}),RA(()=>(_(dl()),_(ng())),()=>{var ua;x(nr,dl()&&di(ng(),(ua=dl())===null||ua===void 0?void 0:ua.path)?dl().sortDirection:void 0)}),RA(()=>(c(nr),MW),()=>{x(u0,c(nr)?MW[c(nr)]:void 0)}),mn(),$t(!0);var Hr,or=EwA(),og=cA(or),f0=cA(og),ag=bA(og,2),wn=ua=>{var fa=QwA(),mI=cA(fa),dd=et(()=>(c(nr),_(al),_(qc),_(dM),QA(()=>c(nr)===al.asc?qc:dM)));Pi(mI,{get data(){return c(dd)}}),ve(()=>fn(fa,\"title\",\"Currently sorted in \".concat(c(u0),\" order\"))),lA(ua,fa)};YA(ag,ua=>{c(nr)!==void 0&&ua(wn)}),ve(ua=>{Hr=Xt(or,1,\"jse-column-header svelte-5pxwfq\",null,Hr,{\"jse-readonly\":Ec()}),fn(or,\"title\",Ec()?c(ia):c(ia)+\" (Click to sort the data by this column)\"),xt(f0,ua)},[()=>(_(gC),c(ia),_(50),QA(()=>gC(c(ia),50)))]),ue(\"click\",or,function(){Ec()||Bl()({path:ng(),sortDirection:c(nr)===al.asc?al.desc:al.asc})}),lA(Yn,or),St()})(cA(Wo),{get path(){return c(si)},get sortedColumn(){return c(dt)},get readOnly(){return I()},onSort:Je}),lA(mt,Wo)});var we=bA(pe),it=mt=>{var si=vwA(),Wo=cA(si),Yn=et(()=>(c(uA),QA(()=>Array.isArray(c(uA))?c(uA).length:0)));(function(Yo,ia){kt(ia,!1);var nr=N(ia,\"count\",9),u0=N(ia,\"maxSampleCount\",9),ng=N(ia,\"readOnly\",9),dl=N(ia,\"onRefresh\",9);$t(!0);var Ec,Bl=DwA();Pi(cA(Bl),{get data(){return HO}}),ve(()=>{Ec=Xt(Bl,1,\"jse-column-header svelte-1wgrwv3\",null,Ec,{\"jse-readonly\":ng()}),fn(Bl,\"title\",\"The Columns are created by sampling \".concat(u0(),\" items out of \").concat(nr(),\". \")+\"If you're missing a column, click here to sample all of the items instead of a subset. This is slower.\")}),ue(\"click\",Bl,()=>dl()()),lA(Yo,Bl),St()})(Wo,{get count(){return c(Yn)},get maxSampleCount(){return c(Ue)},get readOnly(){return I()},onRefresh:()=>x(Ue,1/0)}),lA(mt,si)};YA(we,mt=>{c(A)&&mt(it)});var zt,bi,Dn=bA(q),Hi=cA(Dn),no=bA(Dn);ea(no,1,()=>(c(i),QA(()=>c(i).visibleItems)),ha,(mt,si,Wo)=>{var Yn=et(()=>(c(i),QA(()=>c(i).startIndex+Wo))),Yo=et(()=>(c(n),_(c(Yn)),QA(()=>c(n).rows[c(Yn)]))),ia=et(()=>(_(FQ),_(c(Yn)),_(c(Yo)),QA(()=>{var Hr;return FQ([String(c(Yn))],(Hr=c(Yo))===null||Hr===void 0?void 0:Hr.row)}))),nr=et(()=>(_(o0),c(uA),c(be),_(c(Yn)),QA(()=>o0(c(uA),c(be),[String(c(Yn))])))),u0=xwA(),ng=cA(u0);lX(ng,()=>c(Yn),Hr=>{var or=bwA(),og=cA(or),f0=bA(og),ag=wn=>{ZQ(wn,{get validationError(){return c(ia)},get onExpand(){return ol}})};YA(f0,wn=>{c(ia)&&wn(ag)}),as(or,(wn,ua)=>QD?.(wn,ua),()=>wn=>(function(ua,fa){O[fa]=ua.getBoundingClientRect().height})(wn,c(Yn))),ve(()=>{var wn;return xt(og,\"\".concat((wn=c(Yn))!==null&&wn!==void 0?wn:\"\",\" \"))}),lA(Hr,or)});var dl=bA(ng);ea(dl,1,()=>c(Te),ha,(Hr,or,og,f0)=>{var ag,wn=et(()=>(_(c(Yn)),c(or),QA(()=>[String(c(Yn))].concat(c(or))))),ua=et(()=>(_(Pe),c(si),c(or),QA(()=>Pe(c(si),c(or))))),fa=et(()=>(_(an),c(LA),_(I0),_(c(wn)),QA(()=>an(c(LA))&&I0(c(LA).path,c(wn))))),mI=et(()=>(_(c(Yo)),QA(()=>{var ma;return(ma=c(Yo))===null||ma===void 0?void 0:ma.columns[og]}))),dd=et(()=>(_(FQ),_(c(wn)),_(c(mI)),QA(()=>FQ(c(wn),c(mI))))),pI=kwA(),YE=cA(pI),Bd=cA(YE),HE=ma=>{var kg=et(()=>(_(UD),_(o0),c(si),_(c(nr)),c(or),QA(()=>UD(o0(c(si),c(nr),c(or)))))),TE=et(()=>(_(c(kg)),QA(()=>!!c(kg)&&c(kg).some(wI=>wI.active)))),OE=et(()=>(_(zi),_(c(kg)),QA(()=>!zi(c(kg)))));(function(wI,fr){kt(fr,!1);var zE=N(fr,\"path\",9),jF=N(fr,\"value\",9),qF=N(fr,\"parser\",9),vnA=N(fr,\"isSelected\",9),bnA=N(fr,\"containsSearchResult\",9),MnA=N(fr,\"containsActiveSearchResult\",9),knA=N(fr,\"onEdit\",9);$t(!0);var VF,af=BwA(),SnA=cA(af);ve(PE=>{VF=Xt(af,1,\"jse-inline-value svelte-1jv89ui\",null,VF,{\"jse-selected\":vnA(),\"jse-highlight\":bnA(),\"jse-active\":MnA()}),xt(SnA,PE)},[()=>(_(gC),_(qF()),_(jF()),_(50),QA(()=>{var PE;return gC((PE=qF().stringify(jF()))!==null&&PE!==void 0?PE:\"\",50)}))]),ue(\"dblclick\",af,()=>knA()(zE())),lA(wI,af),St()})(ma,{get path(){return c(wn)},get value(){return c(ua)},get parser(){return v()},get isSelected(){return c(fa)},get containsSearchResult(){return c(OE)},get containsActiveSearchResult(){return c(TE)},onEdit:at})},lv=ma=>{var kg=et(()=>(_(o0),c(uA),c(be),_(c(wn)),QA(()=>{var fr;return(fr=o0(c(uA),c(be),c(wn)))===null||fr===void 0?void 0:fr.searchResults}))),TE=et(()=>c(ua)!==void 0?c(ua):\"\"),OE=et(()=>(_(g0),c(uA),c(xA),_(c(wn)),QA(()=>g0(c(uA),c(xA),c(wn))))),wI=et(()=>c(fa)?c(LA):void 0);l$(ma,{get path(){return c(wn)},get value(){return c(TE)},get enforceString(){return c(OE)},get selection(){return c(wI)},get searchResultItems(){return c(kg)},get context(){return c(Ge)}})};YA(Bd,ma=>{_(jo),_(c(ua)),QA(()=>jo(c(ua)))?ma(HE):ma(lv,!1)});var cv=bA(Bd),Cv=ma=>{var kg=MwA();P2(cA(kg),{selected:!0,onContextMenu:fo}),lA(ma,kg)};YA(cv,ma=>{_(I()),_(c(fa)),_(za),c(LA),QA(()=>!I()&&c(fa)&&!za(c(LA)))&&ma(Cv)});var hc=bA(YE,2),DI=ma=>{ZQ(ma,{get validationError(){return c(dd)},get onExpand(){return ol}})};YA(hc,ma=>{c(dd)&&ma(DI)}),ve(ma=>{fn(pI,\"data-path\",ma),ag=Xt(YE,1,\"jse-value-outer svelte-1p86y3c\",null,ag,{\"jse-selected-value\":c(fa)})},[()=>(_(DD),_(c(wn)),QA(()=>DD(c(wn))))]),lA(Hr,pI)});var Ec=bA(dl),Bl=Hr=>{lA(Hr,SwA())};YA(Ec,Hr=>{c(A)&&Hr(Bl)}),lA(mt,u0)});var qt,Uo=cA(bA(no));Mo(Re,mt=>x(KA,mt),()=>c(KA)),as(Re,(mt,si)=>QD?.(mt,si),()=>ca),Er(()=>ue(\"scroll\",Re,gt));var Jn=bA(Re,2),Jo=mt=>{var si=et(()=>(c(ZA),QA(()=>\"You pasted a JSON \".concat(Array.isArray(c(ZA).contents)?\"array\":\"object\",\" as text\")))),Wo=et(()=>[{icon:P0,text:\"Paste as JSON instead\",title:\"Paste the text as JSON instead of a single value\",onMouseDown:Co},{text:\"Leave as is\",title:\"Keep the pasted content as a single value\",onClick:la}]);Mg(mt,{type:\"info\",get message(){return c(si)},get actions(){return c(Wo)}})};YA(Jn,mt=>{c(ZA)&&mt(Jo)});var Cn=bA(Jn,2),Lt=mt=>{var si=et(()=>[{icon:P0,text:\"Paste as string instead\",title:\"Paste the clipboard data as a single string value instead of an array\",onClick:ln},{text:\"Leave as is\",title:\"Keep the pasted array\",onClick:pi}]);Mg(mt,{type:\"info\",message:\"Multiline text was pasted as array\",get actions(){return c(si)}})};YA(Cn,mt=>{c(MA)&&mt(Lt)});var Vi=bA(Cn,2),Vt=mt=>{var si=et(()=>I()?[]:[{icon:g8,text:\"Ok\",title:\"Accept the repaired document\",onClick:sn},{icon:j4,text:\"Repair manually instead\",title:\"Leave the document unchanged and repair it manually instead\",onClick:to}]);Mg(mt,{type:\"success\",message:\"The loaded JSON document was invalid but is successfully repaired.\",get actions(){return c(si)},onClose:L})};YA(Vi,mt=>{c(At)&&mt(Vt)}),gN(bA(Vi,2),{get validationErrors(){return c(en)},selectError:Se}),ve(()=>{zt=Xt(Dn,1,\"jse-table-invisible-start-section svelte-1p86y3c\",null,zt,{\"jse-search-box-background\":c(_A)}),fn(Hi,\"colspan\",(c(Te),QA(()=>c(Te).length))),bi=gl(Hi,\"\",bi,{height:(c(i),QA(()=>c(i).startHeight+\"px\"))}),fn(Uo,\"colspan\",(c(Te),QA(()=>c(Te).length))),qt=gl(Uo,\"\",qt,{height:(c(i),QA(()=>c(i).endHeight+\"px\"))})}),lA(Be,Ye)},ne=Be=>{var Ye=yi(),ke=$e(Ye),Re=xn=>{var q=NwA(),fA=$e(q),PA=et(()=>I()?[]:[{icon:j4,text:\"Repair manually\",title:'Open the document in \"code\" mode and repair it manually',onClick:to}]);Mg(fA,{type:\"error\",message:\"The loaded JSON document is invalid and could not be repaired automatically.\",get actions(){return c(PA)}}),p$(bA(fA,2),{get text(){return c(XA)},get json(){return c(uA)},get indentation(){return Y()},get parser(){return v()}}),lA(xn,q)},ii=xn=>{pwA(xn,{get text(){return c(XA)},get json(){return c(uA)},get readOnly(){return I()},get parser(){return v()},openJSONEditorModal:at,extractPath:Ot,get onChangeMode(){return AA()},onClick:()=>{L()}})};YA(ke,xn=>{c(EA)&&c(XA)!==void 0&&c(XA)!==\"\"?xn(Re):xn(ii,!1)},!0),lA(Be,Ye)};YA(DA,Be=>{c(ht)?Be(Ae):Be(ne,!1)}),ue(\"paste\",gA,me),lA(k,H)},xo=k=>{lA(k,LwA())};YA(Mt,k=>{C?k(xo,!1):k(Vo)}),Mo(Yi,k=>x(mA,k),()=>c(mA));var u=bA(Yi,2),w=k=>{s$(k,{onClose:()=>x(J,!1)})};YA(u,k=>{c(J)&&k(w)});var S=bA(u,2),T=k=>{g$(k,oI(()=>c(Ke),{onClose:()=>{var H;(H=c(Ke))===null||H===void 0||H.onClose(),x(Ke,void 0)}}))};return YA(S,k=>{c(Ke)&&k(T)}),ve(()=>xi=Xt(Yi,1,\"jse-table-mode svelte-1p86y3c\",null,xi,{\"no-main-menu\":!f()})),ue(\"mousedown\",Yi,function(k){if(k.buttons===1||k.buttons===2){var H=k.target;H.isContentEditable||L();var Z=SX(H);if(Z){if(za(c(LA))&&su(c(uA),c(LA),Z))return;x(LA,_i(Z)),k.preventDefault()}}}),ue(\"keydown\",Yi,function(k){var H=fC(k);if(o(\"keydown\",{combo:H,key:k.key}),H===\"Ctrl+X\"&&(k.preventDefault(),Ja(!0)),H===\"Ctrl+Shift+X\"&&(k.preventDefault(),Ja(!1)),H===\"Ctrl+C\"&&(k.preventDefault(),Sa(!0)),H===\"Ctrl+Shift+C\"&&(k.preventDefault(),Sa(!1)),H===\"Ctrl+D\"&&(k.preventDefault(),pn()),H!==\"Delete\"&&H!==\"Backspace\"||(k.preventDefault(),Mi()),H===\"Insert\"&&k.preventDefault(),H===\"Ctrl+A\"&&k.preventDefault(),H===\"Ctrl+Q\"&&Go(k),H===\"ArrowLeft\"&&(k.preventDefault(),gi(),c(LA))){var Z=(function(Ye,ke){var{rowIndex:Re,columnIndex:ii}=nl(st(ke),Ye);return ii>0?_i(L1({rowIndex:Re,columnIndex:ii-1},Ye)):ke})(c(Te),c(LA));x(LA,Z),ko(st(Z))}if(H===\"ArrowRight\"&&(k.preventDefault(),gi(),c(LA))){var gA=(function(Ye,ke){var{rowIndex:Re,columnIndex:ii}=nl(st(ke),Ye);return ii<Ye.length-1?_i(L1({rowIndex:Re,columnIndex:ii+1},Ye)):ke})(c(Te),c(LA));x(LA,gA),ko(st(gA))}if(H===\"ArrowUp\"&&(k.preventDefault(),gi(),c(LA))){var DA=(function(Ye,ke){var{rowIndex:Re,columnIndex:ii}=nl(st(ke),Ye);return Re>0?_i(L1({rowIndex:Re-1,columnIndex:ii},Ye)):ke})(c(Te),c(LA));x(LA,DA),ko(st(DA))}if(H===\"ArrowDown\"&&(k.preventDefault(),gi(),c(LA))){var Ae=(function(Ye,ke,Re){var{rowIndex:ii,columnIndex:xn}=nl(st(Re),ke);return ii<Ye.length-1?_i(L1({rowIndex:ii+1,columnIndex:xn},ke)):Re})(c(uA),c(Te),c(LA));x(LA,Ae),ko(st(Ae))}if(H===\"Enter\"&&c(LA)&&an(c(LA))){k.preventDefault();var ne=c(LA).path;jo(Pe(c(uA),ne))?at(ne):I()||x(LA,ye(ye({},c(LA)),{},{edit:!0}))}if(H.replace(/^Shift\\+/,\"\").length===1&&c(LA))return k.preventDefault(),void(function(Ye){VA.apply(this,arguments)})(k.key);if(H===\"Ctrl+Enter\"&&an(c(LA))){k.preventDefault();var Be=Pe(c(uA),c(LA).path);$D(Be)&&window.open(String(Be),\"_blank\")}H===\"Escape\"&&c(LA)&&(k.preventDefault(),x(LA,void 0)),H===\"Ctrl+F\"&&(k.preventDefault(),Gi(!1)),H===\"Ctrl+H\"&&(k.preventDefault(),Gi(!0)),H===\"Ctrl+Z\"&&(k.preventDefault(),jt()),H===\"Ctrl+Shift+Z\"&&(k.preventDefault(),Si())}),ue(\"contextmenu\",Yi,Go),lA(t,rt),Tt(e,\"validate\",ji),Tt(e,\"patch\",Bi),Tt(e,\"focus\",L),Tt(e,\"acceptAutoRepair\",sn),Tt(e,\"scrollTo\",gn),Tt(e,\"findElement\",eo),Tt(e,\"openTransformModal\",tt),St(Ft)}function CZ(t,e){kt(e,!1);var A=N(e,\"content\",8),i=N(e,\"selection\",12),n=N(e,\"readOnly\",8),o=N(e,\"indentation\",8),a=N(e,\"tabSize\",8),r=N(e,\"truncateTextSize\",8),s=N(e,\"externalMode\",8),g=N(e,\"mainMenuBar\",8),l=N(e,\"navigationBar\",8),C=N(e,\"statusBar\",8),I=N(e,\"askToFormat\",8),d=N(e,\"escapeControlCharacters\",8),B=N(e,\"escapeUnicodeCharacters\",8),Q=N(e,\"flattenColumns\",8),E=N(e,\"parser\",8),f=N(e,\"parseMemoizeOne\",8),b=N(e,\"validator\",8),R=N(e,\"validationParser\",8),M=N(e,\"pathParser\",8),v=N(e,\"insideModal\",8),F=N(e,\"onChange\",8),G=N(e,\"onChangeMode\",8),U=N(e,\"onSelect\",8),Y=N(e,\"onRenderValue\",8),j=N(e,\"onClassName\",8),AA=N(e,\"onRenderMenu\",8),z=N(e,\"onRenderContextMenu\",8),yA=N(e,\"onError\",8),P=N(e,\"onFocus\",8),nA=N(e,\"onBlur\",8),eA=N(e,\"onSortModal\",8),dA=N(e,\"onTransformModal\",8),iA=N(e,\"onJSONEditorModal\",8),aA=CA(),hA=CA(),JA=CA(),ee=qa(\"jsoneditor:JSONEditorRoot\"),UA=CA(y$({onChange:O=>x(UA,O)}).get()),mA=CA(s());function KA(O){if(FW(O)){x(mA,O.undo.mode);var tA=c(UA).items(),oA=tA.findIndex(de=>de===O),NA=oA!==-1?tA[oA-1]:void 0;ee(\"handleUndo\",{index:oA,item:O,items:tA,prevItem:NA}),NA&&i(NA.redo.selection),G()(c(mA))}}function ze(O){if(FW(O)){x(mA,O.redo.mode);var tA=c(UA).items(),oA=tA.findIndex(de=>de===O),NA=oA!==-1?tA[oA+1]:void 0;ee(\"handleRedo\",{index:oA,item:O,items:tA,nextItem:NA}),NA&&i(NA.undo.selection),G()(c(mA))}}var Ke=CA(),HA={type:\"separator\"},uA=CA(),XA=CA();function EA(O){if(c(aA))return c(aA).patch(O);if(c(hA))return c(hA).patch(O);if(c(JA))return c(JA).patch(O);throw new Error('Method patch is not available in mode \"'.concat(c(mA),'\"'))}function ZA(O,tA){if(c(aA))return c(aA).expand(O,tA);if(c(JA))return c(JA).expand(O,tA);throw new Error('Method expand is not available in mode \"'.concat(c(mA),'\"'))}function MA(O,tA){if(c(aA))return c(aA).collapse(O,tA);if(c(JA))return c(JA).collapse(O,tA);throw new Error('Method collapse is not available in mode \"'.concat(c(mA),'\"'))}function be(O){if(c(JA))c(JA).openTransformModal(O);else if(c(aA))c(aA).openTransformModal(O);else{if(!c(hA))throw new Error('Method transform is not available in mode \"'.concat(c(mA),'\"'));c(hA).openTransformModal(O)}}function _A(){if(c(JA))return c(JA).validate();if(c(aA))return c(aA).validate();if(c(hA))return c(hA).validate();throw new Error('Method validate is not available in mode \"'.concat(c(mA),'\"'))}function pA(){return c(aA)?c(aA).acceptAutoRepair():A()}function Rt(O){if(c(aA))return c(aA).scrollTo(O);if(c(hA))return c(hA).scrollTo(O);throw new Error('Method scrollTo is not available in mode \"'.concat(c(mA),'\"'))}function Et(O){if(c(aA))return c(aA).findElement(O);if(c(hA))return c(hA).findElement(O);throw new Error('Method findElement is not available in mode \"'.concat(c(mA),'\"'))}function Qe(){c(JA)?c(JA).focus():c(aA)?c(aA).focus():c(hA)&&c(hA).focus()}function _t(){return Ue.apply(this,arguments)}function Ue(){return(Ue=Ut(function*(){c(JA)&&(yield c(JA).refresh())})).apply(this,arguments)}RA(()=>_(s()),()=>{(function(O){if(O!==c(mA)){var tA={type:\"mode\",undo:{mode:c(mA),selection:void 0},redo:{mode:O,selection:void 0}};c(mA)===\"text\"&&c(JA)&&c(JA).flush(),ee(\"add history item\",tA),c(UA).add(tA),x(mA,O)}})(s())}),RA(()=>(c(mA),_(G())),()=>{x(Ke,[{type:\"button\",text:\"text\",title:\"Switch to text mode (current mode: \".concat(c(mA),\")\"),className:\"jse-group-button jse-first\"+(c(mA)===ga.text?\" jse-selected\":\"\"),onClick:()=>G()(ga.text)},{type:\"button\",text:\"tree\",title:\"Switch to tree mode (current mode: \".concat(c(mA),\")\"),className:\"jse-group-button \"+(c(mA)===ga.tree?\" jse-selected\":\"\"),onClick:()=>G()(ga.tree)},{type:\"button\",text:\"table\",title:\"Switch to table mode (current mode: \".concat(c(mA),\")\"),className:\"jse-group-button jse-last\"+(c(mA)===ga.table?\" jse-selected\":\"\"),onClick:()=>G()(ga.table)}])}),RA(()=>(c(Ke),_(AA()),c(mA),_(v()),_(n())),()=>{x(uA,O=>{var tA=hR(O[0])?c(Ke).concat(O):c(Ke).concat(HA,O),oA=Y4(tA);return AA()(tA,{mode:c(mA),modal:v(),readOnly:n()})||oA})}),RA(()=>(_(z()),c(mA),_(v()),_(n()),_(i())),()=>{x(XA,O=>{var tA,oA=Y4(O);return(tA=z()(O,{mode:c(mA),modal:v(),readOnly:n(),selection:i()}))!==null&&tA!==void 0?tA:!n()&&oA})}),mn();var Te={patch:EA,expand:ZA,collapse:MA,transform:be,validate:_A,acceptAutoRepair:pA,scrollTo:Rt,findElement:Et,focus:Qe,refresh:_t};$t();var ht=yi(),Me=$e(ht),Ai=O=>{Mo(dwA(O,{get externalContent(){return A()},get externalSelection(){return i()},get history(){return c(UA)},get readOnly(){return n()},get indentation(){return o()},get tabSize(){return a()},get mainMenuBar(){return g()},get statusBar(){return C()},get askToFormat(){return I()},get escapeUnicodeCharacters(){return B()},get parser(){return E()},get validator(){return b()},get validationParser(){return R()},get onChange(){return F()},get onChangeMode(){return G()},get onSelect(){return U()},onUndo:KA,onRedo:ze,get onError(){return yA()},get onFocus(){return P()},get onBlur(){return nA()},get onRenderMenu(){return c(uA)},get onSortModal(){return eA()},get onTransformModal(){return dA()},$$legacy:!0}),tA=>x(JA,tA),()=>c(JA))},J=O=>{var tA=yi(),oA=$e(tA),NA=Ee=>{Mo(GwA(Ee,{get externalContent(){return A()},get externalSelection(){return i()},get history(){return c(UA)},get readOnly(){return n()},get truncateTextSize(){return r()},get mainMenuBar(){return g()},get escapeControlCharacters(){return d()},get escapeUnicodeCharacters(){return B()},get flattenColumns(){return Q()},get parser(){return E()},get parseMemoizeOne(){return f()},get validator(){return b()},get validationParser(){return R()},get indentation(){return o()},get onChange(){return F()},get onChangeMode(){return G()},get onSelect(){return U()},onUndo:KA,onRedo:ze,get onRenderValue(){return Y()},get onFocus(){return P()},get onBlur(){return nA()},get onRenderMenu(){return c(uA)},get onRenderContextMenu(){return c(XA)},get onSortModal(){return eA()},get onTransformModal(){return dA()},get onJSONEditorModal(){return iA()},$$legacy:!0}),xA=>x(hA,xA),()=>c(hA))},de=Ee=>{Mo(LR(Ee,{get externalContent(){return A()},get externalSelection(){return i()},get history(){return c(UA)},get readOnly(){return n()},get indentation(){return o()},get truncateTextSize(){return r()},get mainMenuBar(){return g()},get navigationBar(){return l()},get escapeControlCharacters(){return d()},get escapeUnicodeCharacters(){return B()},get parser(){return E()},get parseMemoizeOne(){return f()},get validator(){return b()},get validationParser(){return R()},get pathParser(){return M()},get onError(){return yA()},get onChange(){return F()},get onChangeMode(){return G()},get onSelect(){return U()},onUndo:KA,onRedo:ze,get onRenderValue(){return Y()},get onClassName(){return j()},get onFocus(){return P()},get onBlur(){return nA()},get onRenderMenu(){return c(uA)},get onRenderContextMenu(){return c(XA)},get onSortModal(){return eA()},get onTransformModal(){return dA()},get onJSONEditorModal(){return iA()},$$legacy:!0}),xA=>x(aA,xA),()=>c(aA))};YA(oA,Ee=>{c(mA),_(ga),QA(()=>c(mA)===ga.table)?Ee(NA):Ee(de,!1)},!0),lA(O,tA)};return YA(Me,O=>{c(mA),_(ga),QA(()=>c(mA)===ga.text||String(c(mA))===\"code\")?O(Ai):O(J,!1)}),lA(t,ht),Tt(e,\"patch\",EA),Tt(e,\"expand\",ZA),Tt(e,\"collapse\",MA),Tt(e,\"transform\",be),Tt(e,\"validate\",_A),Tt(e,\"acceptAutoRepair\",pA),Tt(e,\"scrollTo\",Rt),Tt(e,\"findElement\",Et),Tt(e,\"focus\",Qe),Tt(e,\"refresh\",_t),St(Te)}Pt(`/* over all fonts, sizes, and colors */\n/* \"consolas\" for Windows, \"menlo\" for Mac with fallback to \"monaco\", 'Ubuntu Mono' for Ubuntu */\n/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */\n/* main, menu, modal */\n/* jsoneditor modal */\n/* tooltip in text mode */\n/* panels: navigation bar, gutter, search box */\n/* navigation-bar */\n/* context menu */\n/* contents: json key and values */\n/* contents: selected or hovered */\n/* contents: section of collapsed items in an array */\n/* contents: highlighting of search matches */\n/* contents: inline tags inside the JSON document */\n/* contents: table */\n/* controls in modals: inputs, buttons, and \\`a\\` */\n/* messages */\n/* svelte-select */\n/* color picker */\n.jse-modal-wrapper.svelte-t4zsk3 {\n  flex: 1;\n  display: flex;\n  min-width: 0;\n  min-height: 0;\n  flex-direction: column;\n}\n.jse-modal-wrapper.svelte-t4zsk3 .jse-modal-contents:where(.svelte-t4zsk3) {\n  flex: 1;\n  display: flex;\n  flex-direction: column;\n  padding: 20px;\n  overflow: auto;\n  min-width: 0;\n  min-height: 0;\n}\n.jse-modal-wrapper.svelte-t4zsk3 .jse-modal-contents:where(.svelte-t4zsk3) .jse-actions:where(.svelte-t4zsk3) {\n  display: flex;\n  flex-direction: row;\n  justify-content: flex-end;\n  padding-top: var(--jse-padding, 10px);\n}\n.jse-modal-wrapper.svelte-t4zsk3 .jse-modal-contents:where(.svelte-t4zsk3) .jse-actions:where(.svelte-t4zsk3) button.jse-primary:where(.svelte-t4zsk3) {\n  border: none;\n  background: transparent;\n  color: inherit;\n  cursor: pointer;\n  font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen-Sans, Ubuntu, Cantarell, \"Helvetica Neue\", sans-serif);\n  font-size: var(--jse-font-size, 16px);\n  padding: 5px;\n  margin: 0;\n  background: var(--jse-button-primary-background, var(--jse-theme-color, #3883fa));\n  color: var(--jse-button-primary-color, #fff);\n  padding: var(--jse-padding, 10px) calc(2 * var(--jse-padding, 10px));\n  border-radius: 3px;\n}\n.jse-modal-wrapper.svelte-t4zsk3 .jse-modal-contents:where(.svelte-t4zsk3) .jse-actions:where(.svelte-t4zsk3) button.jse-primary:where(.svelte-t4zsk3):hover {\n  background: var(--jse-button-primary-background-highlight, var(--jse-theme-color-highlight, #5f9dff));\n}\n.jse-modal-wrapper.svelte-t4zsk3 .jse-modal-contents:where(.svelte-t4zsk3) .jse-actions:where(.svelte-t4zsk3) button.jse-primary:where(.svelte-t4zsk3):disabled {\n  background: var(--jse-button-primary-background-disabled, #9d9d9d);\n}\n.jse-modal-wrapper.svelte-t4zsk3 .jse-modal-contents:where(.svelte-t4zsk3) .jse-label:where(.svelte-t4zsk3) {\n  font-weight: bold;\n  display: block;\n  box-sizing: border-box;\n}\n.jse-modal-wrapper.svelte-t4zsk3 .jse-modal-contents:where(.svelte-t4zsk3) .jse-label:where(.svelte-t4zsk3) .jse-label-inner:where(.svelte-t4zsk3) {\n  margin-top: calc(2 * var(--jse-padding, 10px));\n  margin-bottom: calc(0.5 * var(--jse-padding, 10px));\n  box-sizing: border-box;\n}\n.jse-modal-wrapper.svelte-t4zsk3 .jse-modal-contents:where(.svelte-t4zsk3) .jse-modal-inline-editor:where(.svelte-t4zsk3) {\n  flex: 1;\n  min-height: 150px;\n  min-width: 0;\n  max-width: 100%;\n  display: flex;\n  --jse-theme-color: var(--jse-modal-editor-theme-color, #707070);\n  --jse-theme-color-highlight: var(--jse-modal-editor-theme-color-highlight, #646464);\n}\n.jse-modal-wrapper.svelte-t4zsk3 .jse-actions:where(.svelte-t4zsk3) {\n  gap: var(--jse-padding, 10px);\n  align-items: center;\n}\n.jse-modal-wrapper.svelte-t4zsk3 .jse-actions:where(.svelte-t4zsk3) .jse-error:where(.svelte-t4zsk3) {\n  flex: 1;\n  color: var(--jse-error-color, #ee5341);\n}\n.jse-modal-wrapper.svelte-t4zsk3 .jse-actions:where(.svelte-t4zsk3) button.jse-secondary:where(.svelte-t4zsk3) {\n  border: none;\n  background: transparent;\n  color: inherit;\n  cursor: pointer;\n  font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen-Sans, Ubuntu, Cantarell, \"Helvetica Neue\", sans-serif);\n  font-size: var(--jse-font-size, 16px);\n  padding: 5px;\n  margin: 0;\n  background: var(--jse-button-secondary-background, #d3d3d3);\n  color: var(--jse-button-secondary-color, var(--jse-text-color, #4d4d4d));\n  padding: var(--jse-padding, 10px) calc(2 * var(--jse-padding, 10px));\n  border-radius: 3px;\n}\n.jse-modal-wrapper.svelte-t4zsk3 .jse-actions:where(.svelte-t4zsk3) button.jse-secondary:where(.svelte-t4zsk3):hover {\n  background: var(--jse-button-secondary-background-highlight, #e1e1e1);\n}\n.jse-modal-wrapper.svelte-t4zsk3 .jse-actions:where(.svelte-t4zsk3) button.jse-secondary:where(.svelte-t4zsk3):disabled {\n  background: var(--jse-button-secondary-background-disabled, #9d9d9d);\n}\n.jse-modal-wrapper.svelte-t4zsk3 input:where(.svelte-t4zsk3) {\n  border: var(--jse-input-border, 1px solid #d8dbdf);\n  outline: none;\n  box-sizing: border-box;\n  padding: calc(0.5 * var(--jse-padding, 10px));\n  font-family: var(--jse-font-family-mono, consolas, menlo, monaco, \"Ubuntu Mono\", \"source-code-pro\", monospace);\n  font-size: var(--jse-font-size-mono, 14px);\n  color: inherit;\n  background: var(--jse-input-background, var(--jse-background-color, #fff));\n}\n.jse-modal-wrapper.svelte-t4zsk3 input:where(.svelte-t4zsk3):focus {\n  border: var(--jse-input-border-focus, 1px solid var(--jse-input-border-focus, var(--jse-theme-color, #3883fa)));\n}\n.jse-modal-wrapper.svelte-t4zsk3 input:where(.svelte-t4zsk3):read-only {\n  background: var(--jse-input-background-readonly, transparent);\n}`);var KwA=FA('<div class=\"jse-error svelte-t4zsk3\"> </div>'),UwA=FA('<button type=\"button\" class=\"jse-secondary svelte-t4zsk3\"><!> Back</button>'),JwA=FA('<button type=\"button\" class=\"jse-primary svelte-t4zsk3\">Apply</button>'),YwA=FA('<button type=\"button\" class=\"jse-primary svelte-t4zsk3\">Close</button>'),HwA=FA('<!> <div class=\"jse-modal-contents svelte-t4zsk3\"><div class=\"jse-label svelte-t4zsk3\"><div class=\"jse-label-inner svelte-t4zsk3\">Path</div></div> <input class=\"jse-path svelte-t4zsk3\" type=\"text\" readonly=\"\" title=\"Selected path\"/> <div class=\"jse-label svelte-t4zsk3\"><div class=\"jse-label-inner svelte-t4zsk3\">Contents</div></div> <div class=\"jse-modal-inline-editor svelte-t4zsk3\"><!></div> <div class=\"jse-actions svelte-t4zsk3\"><!> <!> <!></div></div>',1),TwA=FA('<div class=\"jse-modal-wrapper svelte-t4zsk3\"><!></div>'),OwA={};Pt(`/* over all fonts, sizes, and colors */\n/* \"consolas\" for Windows, \"menlo\" for Mac with fallback to \"monaco\", 'Ubuntu Mono' for Ubuntu */\n/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */\n/* main, menu, modal */\n/* jsoneditor modal */\n/* tooltip in text mode */\n/* panels: navigation bar, gutter, search box */\n/* navigation-bar */\n/* context menu */\n/* contents: json key and values */\n/* contents: selected or hovered */\n/* contents: section of collapsed items in an array */\n/* contents: highlighting of search matches */\n/* contents: inline tags inside the JSON document */\n/* contents: table */\n/* controls in modals: inputs, buttons, and \\`a\\` */\n/* messages */\n/* svelte-select */\n/* color picker */\n.jse-modal-contents.svelte-lwzlls {\n  flex: 1;\n  display: flex;\n  flex-direction: column;\n  padding: 20px;\n  overflow: auto;\n  min-width: 0;\n  min-height: 0;\n}\n.jse-modal-contents.svelte-lwzlls .jse-actions:where(.svelte-lwzlls) {\n  display: flex;\n  flex-direction: row;\n  justify-content: flex-end;\n  padding-top: var(--jse-padding, 10px);\n}\n.jse-modal-contents.svelte-lwzlls .jse-actions:where(.svelte-lwzlls) button.jse-primary:where(.svelte-lwzlls) {\n  border: none;\n  background: transparent;\n  color: inherit;\n  cursor: pointer;\n  font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen-Sans, Ubuntu, Cantarell, \"Helvetica Neue\", sans-serif);\n  font-size: var(--jse-font-size, 16px);\n  padding: 5px;\n  margin: 0;\n  background: var(--jse-button-primary-background, var(--jse-theme-color, #3883fa));\n  color: var(--jse-button-primary-color, #fff);\n  padding: var(--jse-padding, 10px) calc(2 * var(--jse-padding, 10px));\n  border-radius: 3px;\n}\n.jse-modal-contents.svelte-lwzlls .jse-actions:where(.svelte-lwzlls) button.jse-primary:where(.svelte-lwzlls):hover {\n  background: var(--jse-button-primary-background-highlight, var(--jse-theme-color-highlight, #5f9dff));\n}\n.jse-modal-contents.svelte-lwzlls .jse-actions:where(.svelte-lwzlls) button.jse-primary:where(.svelte-lwzlls):disabled {\n  background: var(--jse-button-primary-background-disabled, #9d9d9d);\n}\n.jse-modal-contents.svelte-lwzlls table:where(.svelte-lwzlls) {\n  width: 100%;\n  border-collapse: collapse;\n  border-spacing: 0;\n}\n.jse-modal-contents.svelte-lwzlls table:where(.svelte-lwzlls) th:where(.svelte-lwzlls),\n.jse-modal-contents.svelte-lwzlls table:where(.svelte-lwzlls) td:where(.svelte-lwzlls) {\n  text-align: left;\n  vertical-align: middle;\n  font-weight: normal;\n  padding-bottom: var(--jse-padding, 10px);\n}\n.jse-modal-contents.svelte-lwzlls input.jse-path:where(.svelte-lwzlls) {\n  width: 100%;\n  box-sizing: border-box;\n  padding: 5px 10px;\n  border: var(--jse-input-border, 1px solid #d8dbdf);\n  border-radius: var(--jse-input-radius, 3px);\n  font-family: inherit;\n  font-size: inherit;\n  background: inherit;\n  background: var(--jse-input-background-readonly, transparent);\n  color: inherit;\n  outline: none;\n}\n.jse-modal-contents.svelte-lwzlls .svelte-select input {\n  box-sizing: border-box;\n}\n.jse-modal-contents.svelte-lwzlls .jse-space:where(.svelte-lwzlls) {\n  height: 200px;\n}\n.jse-modal-contents.svelte-lwzlls .jse-space:where(.svelte-lwzlls) .jse-error:where(.svelte-lwzlls) {\n  color: var(--jse-error-color, #ee5341);\n}`);var _Q=XD(()=>OwA),zwA=FA('<tr><th class=\"svelte-lwzlls\">Property</th><td class=\"svelte-lwzlls\"><!></td></tr>'),PwA=FA('<div class=\"jse-error svelte-lwzlls\"> </div>'),jwA=FA('<!> <div class=\"jse-modal-contents svelte-lwzlls\"><table class=\"svelte-lwzlls\"><colgroup><col width=\"25%\"/><col width=\"75%\"/></colgroup><tbody><tr><th class=\"svelte-lwzlls\">Path</th><td class=\"svelte-lwzlls\"><input class=\"jse-path svelte-lwzlls\" type=\"text\" readonly=\"\" title=\"Selected path\"/></td></tr><!><tr><th class=\"svelte-lwzlls\">Direction</th><td class=\"svelte-lwzlls\"><!></td></tr></tbody></table> <div class=\"jse-space svelte-lwzlls\"><!></div> <div class=\"jse-actions svelte-lwzlls\"><button type=\"button\" class=\"jse-primary svelte-lwzlls\">Sort</button></div></div>',1);Pt(`/* over all fonts, sizes, and colors */\n/* \"consolas\" for Windows, \"menlo\" for Mac with fallback to \"monaco\", 'Ubuntu Mono' for Ubuntu */\n/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */\n/* main, menu, modal */\n/* jsoneditor modal */\n/* tooltip in text mode */\n/* panels: navigation bar, gutter, search box */\n/* navigation-bar */\n/* context menu */\n/* contents: json key and values */\n/* contents: selected or hovered */\n/* contents: section of collapsed items in an array */\n/* contents: highlighting of search matches */\n/* contents: inline tags inside the JSON document */\n/* contents: table */\n/* controls in modals: inputs, buttons, and \\`a\\` */\n/* messages */\n/* svelte-select */\n/* color picker */\n.jse-main.svelte-1l55585 {\n  width: 100%;\n  height: 100%;\n  min-width: 0;\n  min-height: 150px;\n  font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen-Sans, Ubuntu, Cantarell, \"Helvetica Neue\", sans-serif);\n  font-size: var(--jse-font-size, 16px);\n  line-height: normal;\n  position: relative;\n  display: flex;\n  flex-direction: row;\n}\n.jse-main.svelte-1l55585:not(.jse-focus) {\n  --jse-selection-background-color: var(--jse-selection-background-inactive-color, #e8e8e8);\n  --jse-context-menu-pointer-background: var(--jse-context-menu-pointer-hover-background, #b2b2b2);\n}`);var qwA=FA('<div role=\"none\"><!></div> <!> <!> <!>',1);function VwA(t,e){kt(e,!1);var A=CA(void 0,!0),i=qa(\"jsoneditor:JSONEditor\"),n={text:\"\"},o=void 0,a=!1,r=ga.tree,s=!0,g=!0,l=!0,C=!0,I=!1,d=!1,B=!0,Q=JSON,E=void 0,f=JSON,b={parse:X6A,stringify:$s},R=[u6A],M=R[0].id,v=ol,F=void 0,G=void 0,U=Z6A,Y=ol,j=ol,AA=ol,z=ol,yA=se=>{console.error(se),alert(se.toString())},P=ol,nA=ol,eA=N(e,\"content\",13,n),dA=N(e,\"selection\",13,o),iA=N(e,\"readOnly\",13,a),aA=N(e,\"indentation\",13,2),hA=N(e,\"tabSize\",13,4),JA=N(e,\"truncateTextSize\",13,1e3),ee=N(e,\"mode\",13,r),UA=N(e,\"mainMenuBar\",13,s),mA=N(e,\"navigationBar\",13,g),KA=N(e,\"statusBar\",13,l),ze=N(e,\"askToFormat\",13,C),Ke=N(e,\"escapeControlCharacters\",13,I),HA=N(e,\"escapeUnicodeCharacters\",13,d),uA=N(e,\"flattenColumns\",13,B),XA=N(e,\"parser\",13,Q),EA=N(e,\"validator\",13,E),ZA=N(e,\"validationParser\",13,f),MA=N(e,\"pathParser\",13,b),be=N(e,\"queryLanguages\",13,R),_A=N(e,\"queryLanguageId\",13,M),pA=N(e,\"onChangeQueryLanguage\",13,v),Rt=N(e,\"onChange\",13,F),Et=N(e,\"onSelect\",13,G),Qe=N(e,\"onRenderValue\",13,U),_t=N(e,\"onClassName\",13,Y),Ue=N(e,\"onRenderMenu\",13,j),Te=N(e,\"onRenderContextMenu\",13,AA),ht=N(e,\"onChangeMode\",13,z),Me=N(e,\"onError\",13,yA),Ai=N(e,\"onFocus\",13,P),J=N(e,\"onBlur\",13,nA),O=CA(YQ(),!0),tA=CA(!1,!0),oA=CA(void 0,!0),NA=CA(void 0,!0),de=CA(void 0,!0),Ee=CA(void 0,!0),xA=CA(XA(),!0);function LA(){return eA()}function dt(se){i(\"set\");var Ci=Jx(se);if(Ci)throw new Error(Ci);x(O,YQ()),eA(se),uo()}function At(se){i(\"update\");var Ci=Jx(se);if(Ci)throw new Error(Ci);eA(se),uo()}function Je(se){var Ci=c(oA).patch(se);return uo(),Ci}function Ge(se){dA(se),uo()}function ri(se,Ci){c(oA).expand(se,Ci),uo()}function en(se){var Ci=arguments.length>1&&arguments[1]!==void 0&&arguments[1];c(oA).collapse(se,Ci),uo()}function rn(){var se=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};c(oA).transform(se),uo()}function Le(){return c(oA).validate()}function ji(){var se=c(oA).acceptAutoRepair();return uo(),se}function Bi(se){return vi.apply(this,arguments)}function vi(){return(vi=Ut(function*(se){yield c(oA).scrollTo(se)})).apply(this,arguments)}function Ji(se){return c(oA).findElement(se)}function Dt(){c(oA).focus(),uo()}function qi(){return Nt.apply(this,arguments)}function Nt(){return(Nt=Ut(function*(){yield c(oA).refresh()})).apply(this,arguments)}function L(se){var Ci,tn,ln,So,la,pi,to,Ja,Io,Sa,kn,Mi,Ot,pn,io,mo,vA,VA,me,IA,SA,re,Se,tt,at,bt,Sn,ki,Gi,jt,Si,ca=Object.keys(se);for(var Ft of ca)switch(Ft){case\"content\":eA((Ci=se[Ft])!==null&&Ci!==void 0?Ci:n);break;case\"selection\":dA((tn=se[Ft])!==null&&tn!==void 0?tn:o);break;case\"readOnly\":iA((ln=se[Ft])!==null&&ln!==void 0?ln:a);break;case\"indentation\":aA((So=se[Ft])!==null&&So!==void 0?So:2);break;case\"tabSize\":hA((la=se[Ft])!==null&&la!==void 0?la:4);break;case\"truncateTextSize\":JA((pi=se[Ft])!==null&&pi!==void 0?pi:1e3);break;case\"mode\":ee((to=se[Ft])!==null&&to!==void 0?to:r);break;case\"mainMenuBar\":UA((Ja=se[Ft])!==null&&Ja!==void 0?Ja:s);break;case\"navigationBar\":mA((Io=se[Ft])!==null&&Io!==void 0?Io:g);break;case\"statusBar\":KA((Sa=se[Ft])!==null&&Sa!==void 0?Sa:l);break;case\"askToFormat\":ze((kn=se[Ft])!==null&&kn!==void 0?kn:C);break;case\"escapeControlCharacters\":Ke((Mi=se[Ft])!==null&&Mi!==void 0?Mi:I);break;case\"escapeUnicodeCharacters\":HA((Ot=se[Ft])!==null&&Ot!==void 0?Ot:d);break;case\"flattenColumns\":uA((pn=se[Ft])!==null&&pn!==void 0?pn:B);break;case\"parser\":XA((io=se[Ft])!==null&&io!==void 0?io:Q);break;case\"validator\":EA((mo=se[Ft])!==null&&mo!==void 0?mo:E);break;case\"validationParser\":ZA((vA=se[Ft])!==null&&vA!==void 0?vA:f);break;case\"pathParser\":MA((VA=se[Ft])!==null&&VA!==void 0?VA:b);break;case\"queryLanguages\":be((me=se[Ft])!==null&&me!==void 0?me:R);break;case\"queryLanguageId\":_A((IA=se[Ft])!==null&&IA!==void 0?IA:M);break;case\"onChangeQueryLanguage\":pA((SA=se[Ft])!==null&&SA!==void 0?SA:v);break;case\"onChange\":Rt((re=se[Ft])!==null&&re!==void 0?re:F);break;case\"onRenderValue\":Qe((Se=se[Ft])!==null&&Se!==void 0?Se:U);break;case\"onClassName\":_t((tt=se[Ft])!==null&&tt!==void 0?tt:Y);break;case\"onRenderMenu\":Ue((at=se[Ft])!==null&&at!==void 0?at:j);break;case\"onRenderContextMenu\":Te((bt=se[Ft])!==null&&bt!==void 0?bt:AA);break;case\"onChangeMode\":ht((Sn=se[Ft])!==null&&Sn!==void 0?Sn:z);break;case\"onSelect\":Et((ki=se[Ft])!==null&&ki!==void 0?ki:G);break;case\"onError\":Me((Gi=se[Ft])!==null&&Gi!==void 0?Gi:yA);break;case\"onFocus\":Ai((jt=se[Ft])!==null&&jt!==void 0?jt:P);break;case\"onBlur\":J((Si=se[Ft])!==null&&Si!==void 0?Si:nA);break;default:rt(Ft)}function rt(xi){i('Unknown property \"'.concat(xi,'\"'))}be().some(xi=>xi.id===_A())||_A(be()[0].id),uo()}function gt(){return gi.apply(this,arguments)}function gi(){return(gi=Ut(function*(){throw new Error(\"class method destroy() is deprecated. It is replaced with a method destroy() in the vanilla library.\")})).apply(this,arguments)}function sn(se,Ci,tn){eA(se),Rt()&&Rt()(se,Ci,tn)}function gn(se){dA(se),Et()&&Et()(Y4(se))}function Kn(){x(tA,!0),Ai()&&Ai()()}function ko(){x(tA,!1),J()&&J()()}function eo(se){return fo.apply(this,arguments)}function fo(){return(fo=Ut(function*(se){ee()!==se&&(ee(se),uo(),Dt(),ht()(se))})).apply(this,arguments)}function Go(se){i(\"handleChangeQueryLanguage\",se),_A(se),pA()(se)}function co(se){var{id:Ci,json:tn,rootPath:ln,onTransform:So,onClose:la}=se;iA()||x(Ee,{id:Ci,json:tn,rootPath:ln,indentation:aA(),truncateTextSize:JA(),escapeControlCharacters:Ke(),escapeUnicodeCharacters:HA(),parser:XA(),parseMemoizeOne:c(A),validationParser:ZA(),pathParser:MA(),queryLanguages:be(),queryLanguageId:_A(),onChangeQueryLanguage:Go,onRenderValue:Qe(),onRenderMenu:pi=>Ue()(pi,{mode:ee(),modal:!0,readOnly:iA()}),onRenderContextMenu:pi=>Te()(pi,{mode:ee(),modal:!0,readOnly:iA(),selection:dA()}),onClassName:_t(),onTransform:So,onClose:la})}function ta(se){iA()||x(de,se)}function Ko(se){var{content:Ci,path:tn,onPatch:ln,onClose:So}=se;i(\"onJSONEditorModal\",{content:Ci,path:tn}),x(NA,{content:Ci,path:tn,onPatch:ln,readOnly:iA(),indentation:aA(),tabSize:hA(),truncateTextSize:JA(),mainMenuBar:UA(),navigationBar:mA(),statusBar:KA(),askToFormat:ze(),escapeControlCharacters:Ke(),escapeUnicodeCharacters:HA(),flattenColumns:uA(),parser:XA(),validator:void 0,validationParser:ZA(),pathParser:MA(),onRenderValue:Qe(),onClassName:_t(),onRenderMenu:Ue(),onRenderContextMenu:Te(),onSortModal:ta,onTransformModal:co,onClose:So})}function qo(se){se.stopPropagation()}RA(()=>(_(XA()),c(xA),_(eA()),YQ),()=>{if(!pX(XA(),c(xA))){if(i(\"parser changed, recreate editor\"),iu(eA())){var se=c(xA).stringify(eA().json);eA({json:se!==void 0?XA().parse(se):void 0})}x(xA,XA()),x(O,YQ())}}),RA(()=>_(eA()),()=>{var se=Jx(eA());se&&console.error(\"Error: \"+se)}),RA(()=>_(dA()),()=>{dA()===null&&console.warn(\"selection is invalid: it is null but should be undefined\")}),RA(()=>_(XA()),()=>{x(A,VB(XA().parse))}),RA(()=>_(ee()),()=>{i(\"mode changed to\",ee())}),mn();var Co={get:LA,set:dt,update:At,patch:Je,select:Ge,expand:ri,collapse:en,transform:rn,validate:Le,acceptAutoRepair:ji,scrollTo:Bi,findElement:Ji,focus:Dt,refresh:qi,updateProps:L,destroy:gt};return $t(!0),QR(t,{children:(se,Ci)=>{var tn,ln=qwA(),So=$e(ln);lX(cA(So),()=>c(O),kn=>{Mo(CZ(kn,{get externalMode(){return ee()},get content(){return eA()},get selection(){return dA()},get readOnly(){return iA()},get indentation(){return aA()},get tabSize(){return hA()},get truncateTextSize(){return JA()},get statusBar(){return KA()},get askToFormat(){return ze()},get mainMenuBar(){return UA()},get navigationBar(){return mA()},get escapeControlCharacters(){return Ke()},get escapeUnicodeCharacters(){return HA()},get flattenColumns(){return uA()},get parser(){return XA()},get parseMemoizeOne(){return c(A)},get validator(){return EA()},get validationParser(){return ZA()},get pathParser(){return MA()},insideModal:!1,get onError(){return Me()},onChange:sn,onChangeMode:eo,onSelect:gn,get onRenderValue(){return Qe()},get onClassName(){return _t()},onFocus:Kn,onBlur:ko,get onRenderMenu(){return Ue()},get onRenderContextMenu(){return Te()},onSortModal:ta,onTransformModal:co,onJSONEditorModal:Ko,$$legacy:!0}),Mi=>x(oA,Mi),()=>c(oA))});var la=bA(So,2),pi=kn=>{(function(Mi,Ot){var pn,io;kt(Ot,!1);var mo=CA(void 0,!0),vA=CA(void 0,!0),VA=CA(void 0,!0),me=CA(void 0,!0),IA=qa(\"jsoneditor:SortModal\"),SA=N(Ot,\"id\",9),re=N(Ot,\"json\",9),Se=N(Ot,\"rootPath\",9),tt=N(Ot,\"onSort\",9),at=N(Ot,\"onClose\",9),bt={value:1,label:\"ascending\"},Sn=[bt,{value:-1,label:\"descending\"}],ki=\"\".concat(SA(),\":\").concat(pt(Se())),Gi=CA((pn=_Q()[ki])===null||pn===void 0?void 0:pn.selectedProperty,!0),jt=CA(((io=_Q()[ki])===null||io===void 0?void 0:io.selectedDirection)||bt,!0),Si=CA(void 0,!0);function ca(){try{var rt,xi,Yi;x(Si,void 0);var Un=((rt=c(Gi))===null||rt===void 0?void 0:rt.value)||((xi=c(me))===null||xi===void 0||(xi=xi[0])===null||xi===void 0?void 0:xi.value)||[],cn=(Yi=c(jt))===null||Yi===void 0?void 0:Yi.value,Mt=I$(re(),Se(),Un,cn);tt()!==void 0&&Se()!==void 0&&tt()({operations:Mt,rootPath:Se(),itemPath:Un,direction:cn}),at()()}catch(Vo){x(Si,String(Vo))}}function Ft(rt){rt.focus()}RA(()=>(_(re()),_(Se())),()=>{x(mo,Pe(re(),Se()))}),RA(()=>c(mo),()=>{x(vA,Array.isArray(c(mo)))}),RA(()=>(c(vA),c(mo)),()=>{x(VA,c(vA)?dR(c(mo)):void 0)}),RA(()=>(c(VA),W2),()=>{x(me,c(VA)?c(VA).map(W2):void 0)}),RA(()=>(_Q(),c(Gi),c(jt)),()=>{_Q(_Q()[ki]={selectedProperty:c(Gi),selectedDirection:c(jt)}),IA(\"store state in memory\",ki,_Q()[ki])}),mn(),$t(!0),cu(Mi,{get onClose(){return at()},className:\"jse-sort-modal\",children:(rt,xi)=>{var Yi=jwA(),Un=$e(Yi),cn=et(()=>c(vA)?\"Sort array items\":\"Sort object keys\");zD(Un,{get title(){return c(cn)},get onClose(){return at()}});var Mt=cA(bA(Un,2)),Vo=bA(cA(Mt)),xo=cA(Vo),u=bA(cA(xo)),w=cA(u),S=bA(xo),T=ne=>{var Be=zwA(),Ye=bA(cA(Be));U1(cA(Ye),{showChevron:!0,get items(){return c(me)},get value(){return c(Gi)},set value(ke){x(Gi,ke)},$$legacy:!0}),lA(ne,Be)};YA(S,ne=>{c(vA),c(me),QA(()=>{var Be;return c(vA)&&c(me)&&((Be=c(me))===null||Be===void 0?void 0:Be.length)>1})&&ne(T)});var k=bA(S),H=bA(cA(k));U1(cA(H),{showChevron:!0,clearable:!1,get items(){return Sn},get value(){return c(jt)},set value(ne){x(jt,ne)},$$legacy:!0});var Z=bA(Mt,2),gA=cA(Z),DA=ne=>{var Be=PwA(),Ye=cA(Be);ve(()=>xt(Ye,c(Si))),lA(ne,Be)};YA(gA,ne=>{c(Si)&&ne(DA)});var Ae=cA(bA(Z,2));Er(()=>ue(\"click\",Ae,ca)),as(Ae,ne=>Ft?.(ne)),ve(ne=>{Z1(w,ne),Ae.disabled=(c(vA),c(me),c(Gi),QA(()=>{var Be;return!!(c(vA)&&c(me)&&((Be=c(me))===null||Be===void 0?void 0:Be.length)>1)&&!c(Gi)}))},[()=>(_(Se()),_(zi),_($s),QA(()=>Se()&&!zi(Se())?$s(Se()):\"(document root)\"))]),lA(rt,Yi)},$$slots:{default:!0}}),St()})(kn,oI(()=>c(de),{onClose:()=>{var Mi;(Mi=c(de))===null||Mi===void 0||Mi.onClose(),x(de,void 0)}}))};YA(la,kn=>{c(de)&&kn(pi)});var to=bA(la,2),Ja=kn=>{XDA(kn,oI(()=>c(Ee),{onClose:()=>{var Mi;(Mi=c(Ee))===null||Mi===void 0||Mi.onClose(),x(Ee,void 0)}}))};YA(to,kn=>{c(Ee)&&kn(Ja)});var Io=bA(to,2),Sa=kn=>{(function(Mi,Ot){kt(Ot,!1);var pn=CA(void 0,!0),io=CA(void 0,!0),mo=CA(void 0,!0),vA=CA(void 0,!0),VA=qa(\"jsoneditor:JSONEditorModal\"),me=N(Ot,\"content\",9),IA=N(Ot,\"path\",9),SA=N(Ot,\"onPatch\",9),re=N(Ot,\"readOnly\",9),Se=N(Ot,\"indentation\",9),tt=N(Ot,\"tabSize\",9),at=N(Ot,\"truncateTextSize\",9),bt=N(Ot,\"mainMenuBar\",9),Sn=N(Ot,\"navigationBar\",9),ki=N(Ot,\"statusBar\",9),Gi=N(Ot,\"askToFormat\",9),jt=N(Ot,\"escapeControlCharacters\",9),Si=N(Ot,\"escapeUnicodeCharacters\",9),ca=N(Ot,\"flattenColumns\",9),Ft=N(Ot,\"parser\",9),rt=N(Ot,\"validator\",9),xi=N(Ot,\"validationParser\",9),Yi=N(Ot,\"pathParser\",9),Un=N(Ot,\"onRenderValue\",9),cn=N(Ot,\"onClassName\",9),Mt=N(Ot,\"onRenderMenu\",9),Vo=N(Ot,\"onRenderContextMenu\",9),xo=N(Ot,\"onSortModal\",9),u=N(Ot,\"onTransformModal\",9),w=N(Ot,\"onClose\",9),S=CA(void 0,!0),T=CA(void 0,!0),k={mode:gA(me()),content:me(),selection:void 0,relativePath:IA()},H=CA([k],!0),Z=CA(void 0,!0);function gA(fA){return iu(fA)&&Lo(fA.json)?ga.table:ga.tree}function DA(){var fA,PA=(fA=fi(c(H)))===null||fA===void 0?void 0:fA.selection;ru(PA)&&c(S).scrollTo(st(PA))}function Ae(){if(VA(\"handleApply\"),!re())try{x(Z,void 0);var fA=c(pn).relativePath,PA=c(pn).content,Ne=[{op:\"replace\",path:pt(fA),value:DW(PA,Ft()).json}];if(c(H).length>1){var pe=DW(c(H)[c(H).length-2].content,Ft()).json,we={json:Js(pe,Ne)},it=ye(ye({},c(H)[c(H).length-2]||k),{},{content:we});x(H,[...c(H).slice(0,c(H).length-2),it]),uo(),DA()}else SA()(Ne),w()()}catch(zt){x(Z,String(zt))}}function ne(){if(VA(\"handleClose\"),c(T))x(T,!1);else if(c(H).length>1){var fA;x(H,Li(c(H))),uo(),(fA=c(S))===null||fA===void 0||fA.focus(),DA(),x(Z,void 0)}else w()()}function Be(fA){VA(\"handleChange\",fA),Re(PA=>ye(ye({},PA),{},{content:fA}))}function Ye(fA){VA(\"handleChangeSelection\",fA),Re(PA=>ye(ye({},PA),{},{selection:fA}))}function ke(fA){VA(\"handleChangeMode\",fA),Re(PA=>ye(ye({},PA),{},{mode:fA}))}function Re(fA){var PA=fA(fi(c(H)));x(H,[...Li(c(H)),PA])}function ii(fA){x(Z,fA.toString()),console.error(fA)}function xn(fA){var PA,{content:Ne,path:pe}=fA;VA(\"handleJSONEditorModal\",{content:Ne,path:pe});var we={mode:gA(Ne),content:Ne,selection:void 0,relativePath:pe};x(H,[...c(H),we]),uo(),(PA=c(S))===null||PA===void 0||PA.focus()}function q(fA){fA.focus()}Jr(()=>{var fA;(fA=c(S))===null||fA===void 0||fA.focus()}),RA(()=>c(H),()=>{x(pn,fi(c(H))||k)}),RA(()=>c(H),()=>{x(io,c(H).flatMap(fA=>fA.relativePath))}),RA(()=>(c(io),$s),()=>{x(mo,zi(c(io))?\"(document root)\":$s(c(io)))}),RA(()=>_(Ft()),()=>{x(vA,VB(Ft().parse))}),mn(),$t(!0),cu(Mi,{onClose:ne,className:\"jse-jsoneditor-modal\",get fullscreen(){return c(T)},children:(fA,PA)=>{var Ne=TwA();QR(cA(Ne),{children:(pe,we)=>{var it=HwA(),zt=$e(it),bi=et(()=>(c(H),QA(()=>c(H).length>1?\" (\".concat(c(H).length,\")\"):\"\")));zD(zt,{get title(){var Vt;return\"Edit nested content \".concat((Vt=c(bi))!==null&&Vt!==void 0?Vt:\"\")},fullScreenButton:!0,onClose:ne,get fullscreen(){return c(T)},set fullscreen(Vt){x(T,Vt)},$$legacy:!0});var Dn=bA(zt,2),Hi=bA(cA(Dn),2),no=bA(Hi,4);Mo(CZ(cA(no),{get externalMode(){return c(pn),QA(()=>c(pn).mode)},get content(){return c(pn),QA(()=>c(pn).content)},get selection(){return c(pn),QA(()=>c(pn).selection)},get readOnly(){return re()},get indentation(){return Se()},get tabSize(){return tt()},get truncateTextSize(){return at()},get statusBar(){return ki()},get askToFormat(){return Gi()},get mainMenuBar(){return bt()},get navigationBar(){return Sn()},get escapeControlCharacters(){return jt()},get escapeUnicodeCharacters(){return Si()},get flattenColumns(){return ca()},get parser(){return Ft()},get parseMemoizeOne(){return c(vA)},get validator(){return rt()},get validationParser(){return xi()},get pathParser(){return Yi()},insideModal:!0,onError:ii,onChange:Be,onChangeMode:ke,onSelect:Ye,get onRenderValue(){return Un()},get onClassName(){return cn()},get onFocus(){return ol},get onBlur(){return ol},get onRenderMenu(){return Mt()},get onRenderContextMenu(){return Vo()},get onSortModal(){return xo()},get onTransformModal(){return u()},onJSONEditorModal:xn,$$legacy:!0}),Vt=>x(S,Vt),()=>c(S));var qt=cA(bA(no,2)),Uo=Vt=>{var mt=KwA(),si=cA(mt);ve(()=>xt(si,c(Z))),lA(Vt,mt)};YA(qt,Vt=>{c(Z)&&Vt(Uo)});var Jn=bA(qt,2),Jo=Vt=>{var mt=UwA();Pi(cA(mt),{get data(){return PO}}),ue(\"click\",mt,ne),lA(Vt,mt)};YA(Jn,Vt=>{c(H),QA(()=>c(H).length>1)&&Vt(Jo)});var Cn=bA(Jn,2),Lt=Vt=>{var mt=JwA();Er(()=>ue(\"click\",mt,Ae)),as(mt,si=>q?.(si)),lA(Vt,mt)},Vi=Vt=>{var mt=YwA();ue(\"click\",mt,ne),lA(Vt,mt)};YA(Cn,Vt=>{re()?Vt(Vi,!1):Vt(Lt)}),ve(()=>Z1(Hi,c(mo))),lA(pe,it)},$$slots:{default:!0}}),lA(fA,Ne)},$$slots:{default:!0}}),St()})(kn,oI(()=>c(NA),{onClose:()=>{var Mi;(Mi=c(NA))===null||Mi===void 0||Mi.onClose(),x(NA,void 0)}}))};YA(Io,kn=>{c(NA)&&kn(Sa)}),ve(()=>tn=Xt(So,1,\"jse-main svelte-1l55585\",null,tn,{\"jse-focus\":c(tA)})),ue(\"keydown\",So,qo),lA(se,ln)},$$slots:{default:!0}}),Tt(e,\"get\",LA),Tt(e,\"set\",dt),Tt(e,\"update\",At),Tt(e,\"patch\",Je),Tt(e,\"select\",Ge),Tt(e,\"expand\",ri),Tt(e,\"collapse\",en),Tt(e,\"transform\",rn),Tt(e,\"validate\",Le),Tt(e,\"acceptAutoRepair\",ji),Tt(e,\"scrollTo\",Bi),Tt(e,\"findElement\",Ji),Tt(e,\"focus\",Dt),Tt(e,\"refresh\",qi),Tt(e,\"updateProps\",L),Tt(e,\"destroy\",gt),St(Co)}function v$(t){var{target:e,props:A}=t,i=GpA(VwA,{target:e,props:A});return i.destroy=Ut(function*(){return(function(n,o){var a=cR.get(n);return a?(cR.delete(n),a(o)):Promise.resolve()})(i)}),uo(),i}var cc=class t{constructor(e){this.el=e}jsonString;editor=null;ngAfterViewInit(){let e={text:this.jsonString};setTimeout(()=>{this.editor=v$({target:document.getElementById(\"json-editor\"),props:{content:e,mode:ga.text,mainMenuBar:!1,statusBar:!1}})})}getJsonString(){return this.editor?.get().text}static \\u0275fac=function(A){return new(A||t)(lt(ge))};static \\u0275cmp=kA({type:t,selectors:[[\"app-json-editor\"]],inputs:{jsonString:\"jsonString\"},decls:1,vars:0,consts:[[\"id\",\"json-editor\",1,\"json-editor-container\",\"jse-theme-dark\"]],template:function(A,i){A&1&&Ni(0,\"div\",0)},styles:[\".jse-theme-dark[_ngcontent-%COMP%]{--jse-theme: dark;--jse-theme-color: #2f6dd0;--jse-theme-color-highlight: #467cd2;--jse-background-color: #1e1e1e;--jse-text-color: #d4d4d4;--jse-text-color-inverse: #4d4d4d;--jse-main-border: 1px solid #4f4f4f;--jse-menu-color: #fff;--jse-modal-background: #2f2f2f;--jse-modal-overlay-background: rgba(0, 0, 0, .5);--jse-modal-code-background: #2f2f2f;--jse-tooltip-color: var(--jse-text-color);--jse-tooltip-background: #4b4b4b;--jse-tooltip-border: 1px solid #737373;--jse-tooltip-action-button-color: inherit;--jse-tooltip-action-button-background: #737373;--jse-panel-background: #333333;--jse-panel-background-border: 1px solid #464646;--jse-panel-color: var(--jse-text-color);--jse-panel-color-readonly: #737373;--jse-panel-border: 1px solid #3c3c3c;--jse-panel-button-color-highlight: #e5e5e5;--jse-panel-button-background-highlight: #464646;--jse-navigation-bar-background: #656565;--jse-navigation-bar-background-highlight: #7e7e7e;--jse-navigation-bar-dropdown-color: var(--jse-text-color);--jse-context-menu-background: #4b4b4b;--jse-context-menu-background-highlight: #595959;--jse-context-menu-separator-color: #595959;--jse-context-menu-color: var(--jse-text-color);--jse-context-menu-pointer-background: #737373;--jse-context-menu-pointer-background-highlight: #818181;--jse-context-menu-pointer-color: var(--jse-context-menu-color);--jse-key-color: #9cdcfe;--jse-value-color: var(--jse-text-color);--jse-value-color-number: #b5cea8;--jse-value-color-boolean: #569cd6;--jse-value-color-null: #569cd6;--jse-value-color-string: #ce9178;--jse-value-color-url: #ce9178;--jse-delimiter-color: #949494;--jse-edit-outline: 2px solid var(--jse-text-color);--jse-selection-background-color: #464646;--jse-selection-background-inactive-color: #333333;--jse-hover-background-color: #343434;--jse-active-line-background-color: rgba(255, 255, 255, .06);--jse-search-match-background-color: #343434;--jse-collapsed-items-background-color: #333333;--jse-collapsed-items-selected-background-color: #565656;--jse-collapsed-items-link-color: #b2b2b2;--jse-collapsed-items-link-color-highlight: #ec8477;--jse-search-match-color: #724c27;--jse-search-match-outline: 1px solid #966535;--jse-search-match-active-color: #9f6c39;--jse-search-match-active-outline: 1px solid #bb7f43;--jse-tag-background: #444444;--jse-tag-color: #bdbdbd;--jse-table-header-background: #333333;--jse-table-header-background-highlight: #424242;--jse-table-row-odd-background: rgba(255, 255, 255, .1);--jse-input-background: #3d3d3d;--jse-input-border: var(--jse-main-border);--jse-button-background: #808080;--jse-button-background-highlight: #7a7a7a;--jse-button-color: #e0e0e0;--jse-button-secondary-background: #494949;--jse-button-secondary-background-highlight: #5d5d5d;--jse-button-secondary-background-disabled: #9d9d9d;--jse-button-secondary-color: var(--jse-text-color);--jse-a-color: #55abff;--jse-a-color-highlight: #4387c9;--jse-svelte-select-background: #3d3d3d;--jse-svelte-select-border: 1px solid #4f4f4f;--list-background: #3d3d3d;--item-hover-bg: #505050;--multi-item-bg: #5b5b5b;--input-color: #d4d4d4;--multi-clear-bg: #8a8a8a;--multi-item-clear-icon-color: #d4d4d4;--multi-item-outline: 1px solid #696969;--list-shadow: 0 2px 8px 0 rgba(0, 0, 0, .4);--jse-color-picker-background: #656565;--jse-color-picker-border-box-shadow: #8c8c8c 0 0 0 1px}.json-editor-container[_ngcontent-%COMP%]{height:100%}  .jse-message.jse-error{display:none}  .cm-gutters.cm-gutters-before{display:none}  .jse-text-mode{border-radius:10px}  .jse-contents{border-radius:10px;border-bottom:1px solid #4f4f4f}\"]})};var WwA=(t,e)=>e.name;function ZwA(t,e){if(t&1&&K(0),t&2){let A=y();Fe(\" Configure \",A.selectedBuiltInTool,\" \")}}function XwA(t,e){if(t&1&&K(0),t&2){let A=y();Fe(\" \",A.isEditMode?\"Edit Built-in Tool\":\"Add Built-in Tool\",\" \")}}function $wA(t,e){if(t&1){let A=zA();m(0,\"div\",8),$(\"click\",function(){let n=rA(A).$implicit,o=y(3);return sA(o.onToolSelected(n))}),m(1,\"mat-icon\",9),K(2),D(),m(3,\"span\",10),K(4),D()()}if(t&2){let A=e.$implicit,i=y(3);ae(\"selected\",i.selectedBuiltInTool===A),p(2),qA(i.getToolIcon(A)),p(2),qA(A)}}function AyA(t,e){if(t&1&&(m(0,\"div\",4)(1,\"h3\",5),K(2),D(),m(3,\"div\",6),Gt(4,$wA,5,4,\"div\",7,Ri),D()()),t&2){let A=e.$implicit;p(2),qA(A.name),p(2),Kt(A.tools)}}function eyA(t,e){if(t&1&&(m(0,\"div\",1),Gt(1,AyA,6,1,\"div\",4,WwA),D()),t&2){let A=y();p(),Kt(A.toolCategories)}}function tyA(t,e){if(t&1&&(m(0,\"div\",2)(1,\"h3\",11),K(2,\"Configure Tool Arguments\"),D(),GA(3,\"app-json-editor\",12),D()),t&2){let A=y();p(3),X(\"jsonString\",A.toolArgsString)}}function iyA(t,e){if(t&1){let A=zA();m(0,\"button\",14),$(\"click\",function(){rA(A);let n=y(2);return sA(n.backToToolSelection())}),K(1,\"Back\"),D()}}function nyA(t,e){if(t&1){let A=zA();V(0,iyA,2,0,\"button\",13),m(1,\"button\",14),$(\"click\",function(){rA(A);let n=y();return sA(n.saveArgs())}),K(2),D()}if(t&2){let A=y();W(A.isEditMode?-1:0),p(2),qA(A.isEditMode?\"Save\":\"Create\")}}function oyA(t,e){if(t&1){let A=zA();m(0,\"button\",14),$(\"click\",function(){rA(A);let n=y();return sA(n.cancel())}),K(1,\"Cancel\"),D(),m(2,\"button\",15),$(\"click\",function(){rA(A);let n=y();return sA(n.addTool())}),K(3),D()}if(t&2){let A=y();p(3),Fe(\" \",A.isEditMode?\"Save\":\"Create\",\" \")}}var id=class t{constructor(e,A){this.data=e;this.dialogRef=A}jsonEditorComponent;selectedBuiltInTool=\"google_search\";toolCategories=[{name:\"Search Tools\",tools:[\"google_search\",\"EnterpriseWebSearchTool\",\"VertexAiSearchTool\"]},{name:\"Context Tools\",tools:[\"FilesRetrieval\",\"load_memory\",\"preload_memory\",\"url_context\",\"VertexAiRagRetrieval\"]},{name:\"Agent Function Tools\",tools:[\"exit_loop\",\"get_user_choice\",\"load_artifacts\",\"LongRunningFunctionTool\"]}];builtInToolArgs=new Map([[\"EnterpriseWebSearchTool\",[]],[\"exit_loop\",[]],[\"FilesRetrieval\",[\"name\",\"description\",\"input_dir\"]],[\"get_user_choice\",[]],[\"google_search\",[]],[\"load_artifacts\",[]],[\"load_memory\",[]],[\"LongRunningFunctionTool\",[\"func\"]],[\"preload_memory\",[]],[\"url_context\",[]],[\"VertexAiRagRetrieval\",[\"name\",\"description\",\"rag_corpora\",\"rag_resources\",\"similarity_top_k\",\"vector_distance_threshold\"]],[\"VertexAiSearchTool\",[\"data_store_id\",\"data_store_specs\",\"search_engine_id\",\"filter\",\"max_results\"]]]);isEditMode=!1;showArgsEditor=!1;toolArgs={};toolArgsString=\"\";ngOnInit(){if(this.isEditMode=this.data.isEditMode||!1,this.isEditMode&&this.data.toolName){this.selectedBuiltInTool=this.data.toolName;let e=this.builtInToolArgs.get(this.data.toolName);if(e&&e.length>0){if(this.data.toolArgs)this.toolArgs=BA({},this.data.toolArgs),delete this.toolArgs.skip_summarization;else{this.toolArgs={};for(let A of e)this.toolArgs[A]=\"\"}this.toolArgsString=JSON.stringify(this.toolArgs,null,2),this.showArgsEditor=!0}}}onToolSelected(e){this.selectedBuiltInTool=e;let A=this.builtInToolArgs.get(e);A&&A.length>0&&(this.initializeToolArgs(e,A),this.showArgsEditor=!0)}initializeToolArgs(e,A){this.toolArgs={};for(let i of A)this.toolArgs[i]=\"\";this.toolArgsString=JSON.stringify(this.toolArgs,null,2)}backToToolSelection(){this.showArgsEditor=!1,this.toolArgs={},this.toolArgsString=\"\"}saveArgs(){if(this.jsonEditorComponent)try{this.toolArgsString=this.jsonEditorComponent.getJsonString(),this.toolArgs=JSON.parse(this.toolArgsString)}catch(e){alert(\"Invalid JSON: \"+e);return}this.addTool()}addTool(){let e={toolType:\"Built-in tool\",name:this.selectedBuiltInTool,isEditMode:this.isEditMode};Object.keys(this.toolArgs).length>0&&(e.args=this.toolArgs),this.dialogRef.close(e)}cancel(){this.dialogRef.close()}getToolIcon(e){return vB(e,\"Built-in tool\")}static \\u0275fac=function(A){return new(A||t)(lt(da),lt(Fo))};static \\u0275cmp=kA({type:t,selectors:[[\"app-built-in-tool-dialog\"]],viewQuery:function(A,i){if(A&1&&ni(cc,5),A&2){let n;Ce(n=Ie())&&(i.jsonEditorComponent=n.first)}},decls:9,vars:3,consts:[[\"mat-dialog-title\",\"\",1,\"dialog-title\"],[1,\"tool-categories-container\"],[1,\"args-editor-container\"],[\"align\",\"end\"],[1,\"tool-category\"],[1,\"category-title\"],[1,\"tool-list\"],[1,\"tool-item\",3,\"selected\"],[1,\"tool-item\",3,\"click\"],[1,\"tool-icon\"],[1,\"tool-name\"],[1,\"args-editor-title\"],[3,\"jsonString\"],[\"mat-button\",\"\"],[\"mat-button\",\"\",3,\"click\"],[\"mat-button\",\"\",\"cdkFocusInitial\",\"\",3,\"click\"]],template:function(A,i){A&1&&(m(0,\"h2\",0),V(1,ZwA,1,1)(2,XwA,1,1),D(),m(3,\"mat-dialog-content\"),V(4,eyA,3,0,\"div\",1)(5,tyA,4,1,\"div\",2),D(),m(6,\"mat-dialog-actions\",3),V(7,nyA,3,2)(8,oyA,4,1),D()),A&2&&(p(),W(i.showArgsEditor?1:2),p(3),W(i.showArgsEditor?5:4),p(3),W(i.showArgsEditor?7:8))},dependencies:[oa,yn,ya,gr,In,Ta,vn,cc],styles:[\".dialog-title[_ngcontent-%COMP%]{color:var(--mdc-dialog-subhead-color)!important;font-family:Google Sans;font-size:24px}.tool-categories-container[_ngcontent-%COMP%]{padding:16px 0}.tool-category[_ngcontent-%COMP%]{margin-bottom:24px}.tool-category[_ngcontent-%COMP%]:last-child{margin-bottom:0}.category-title[_ngcontent-%COMP%]{font-family:Google Sans;font-size:16px;font-weight:500;color:var(--mdc-dialog-supporting-text-color);margin:0 0 12px;padding-left:8px}.tool-list[_ngcontent-%COMP%]{display:grid;grid-template-columns:repeat(3,1fr);gap:8px}.tool-item[_ngcontent-%COMP%]{display:flex;align-items:center;padding:12px 16px;border-radius:8px;cursor:pointer;transition:all .2s ease;background-color:var(--builder-tool-item-background-color);border:1px solid var(--builder-tool-item-border-color);min-width:0}.tool-item[_ngcontent-%COMP%]:hover{background-color:var(--builder-tool-item-hover-background-color)}.tool-item.selected[_ngcontent-%COMP%]{background-color:#8ab4f833;border:1px solid #8ab4f8}.tool-item[_ngcontent-%COMP%]   .tool-icon[_ngcontent-%COMP%]{color:#8ab4f8;margin-right:12px;font-size:20px;width:20px;height:20px;flex-shrink:0}.tool-item[_ngcontent-%COMP%]   .tool-name[_ngcontent-%COMP%]{font-family:Google Sans;font-size:14px;color:var(--mdc-dialog-supporting-text-color)!important;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.args-editor-container[_ngcontent-%COMP%]{padding:16px 0}.args-editor-title[_ngcontent-%COMP%]{font-family:Google Sans;font-size:16px;font-weight:500;color:var(--mdc-dialog-supporting-text-color);margin:0 0 16px}\"]})};function ayA(t,e){if(t&1){let A=zA();ws(0),m(1,\"div\",6)(2,\"div\",7),$(\"click\",function(){rA(A);let n=y();return sA(n.toggleToolInfo())}),m(3,\"mat-icon\",8),K(4,\"info\"),D(),m(5,\"div\",9)(6,\"span\"),K(7,\"Tool Information\"),D()(),m(8,\"button\",10)(9,\"mat-icon\"),K(10),D()()(),m(11,\"div\",11)(12,\"div\",12)(13,\"div\",13),K(14),D(),m(15,\"div\",14),K(16),D()(),m(17,\"div\",15)(18,\"a\",16)(19,\"mat-icon\"),K(20,\"open_in_new\"),D(),m(21,\"span\"),K(22,\"View Official Documentation\"),D()()()()(),ys()}if(t&2){let A,i,n,o=y();p(10),qA(o.isToolInfoExpanded?\"expand_less\":\"expand_more\"),p(),ae(\"expanded\",o.isToolInfoExpanded),p(3),qA((A=o.getToolInfo())==null?null:A.shortDescription),p(2),qA((i=o.getToolInfo())==null?null:i.detailedDescription),p(2),X(\"href\",(n=o.getToolInfo())==null?null:n.docLink,Da)}}function ryA(t,e){t&1&&(m(0,\"mat-hint\",19),K(1,\" Start with a letter or underscore, and contain only letters, digits, and underscores. \"),D())}function syA(t,e){if(t&1){let A=zA();m(0,\"mat-form-field\",2)(1,\"mat-label\"),K(2),D(),m(3,\"input\",17),ao(\"ngModelChange\",function(n){rA(A);let o=y();return Vn(o.inputValue,n)||(o.inputValue=n),sA(n)}),$(\"keydown\",function(n){rA(A);let o=y();return sA(o.onKeyDown(n))}),D(),yt(4,ryA,2,0,\"mat-hint\",18),D()}if(t&2){let A=y();p(2),qA(A.data.inputLabel||\"Input\"),p(),oo(\"ngModel\",A.inputValue),X(\"placeholder\",A.data.inputPlaceholder||\"Enter value\"),p(),X(\"ngIf\",!A.isInputValid())}}var Cc=class t{constructor(e,A){this.dialogRef=e;this.data=A;this.inputValue=A.inputValue||\"\"}inputValue=\"\";isToolInfoExpanded=!1;isInputValid(){let e=this.inputValue.trim();return!(!e||!/^[a-zA-Z_]/.test(e)||!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(e))}onCancel(){this.dialogRef.close()}onConfirm(){if(this.data.showInput){let e=this.inputValue.trim();if(!this.isInputValid())return;this.dialogRef.close(e)}else this.dialogRef.close(\"confirm\")}onKeyDown(e){e.key===\"Enter\"&&this.data.showInput&&this.onConfirm()}getToolInfo(){if(this.data.toolType)return Hl.getToolDetailedInfo(this.data.toolType)}toggleToolInfo(){this.isToolInfoExpanded=!this.isToolInfoExpanded}static \\u0275fac=function(A){return new(A||t)(lt(Fo),lt(da))};static \\u0275cmp=kA({type:t,selectors:[[\"app-confirmation-dialog\"]],decls:12,vars:6,consts:[[\"mat-dialog-title\",\"\"],[4,\"ngIf\"],[2,\"width\",\"100%\",\"margin-top\",\"16px\"],[\"align\",\"end\"],[\"mat-button\",\"\",3,\"click\"],[\"mat-button\",\"\",\"color\",\"primary\",\"cdkFocusInitial\",\"\",3,\"click\",\"disabled\"],[1,\"tool-info-container\"],[1,\"tool-info-header\",3,\"click\"],[1,\"tool-info-icon\"],[1,\"tool-info-title\"],[\"mat-icon-button\",\"\",\"type\",\"button\",\"aria-label\",\"Toggle tool information\",1,\"tool-info-toggle\"],[1,\"tool-info-body\"],[1,\"tool-info-content\"],[1,\"tool-info-short\"],[1,\"tool-info-detailed\"],[1,\"tool-info-link-container\"],[\"target\",\"_blank\",\"rel\",\"noopener noreferrer\",1,\"tool-info-link\",3,\"href\"],[\"matInput\",\"\",\"cdkFocusInitial\",\"\",3,\"ngModelChange\",\"keydown\",\"ngModel\",\"placeholder\"],[\"style\",\"font-size: 11px; color: #666;\",4,\"ngIf\"],[2,\"font-size\",\"11px\",\"color\",\"#666\"]],template:function(A,i){A&1&&(m(0,\"h2\",0),K(1),D(),m(2,\"mat-dialog-content\"),yt(3,ayA,23,6,\"ng-container\",1),m(4,\"p\"),K(5),D(),V(6,syA,5,4,\"mat-form-field\",2),D(),m(7,\"mat-dialog-actions\",3)(8,\"button\",4),$(\"click\",function(){return i.onCancel()}),K(9,\"Cancel\"),D(),m(10,\"button\",5),$(\"click\",function(){return i.onConfirm()}),K(11),D()()),A&2&&(p(),qA(i.data.title),p(2),X(\"ngIf\",i.data.showToolInfo&&i.getToolInfo()),p(2),qA(i.data.message),p(),W(i.data.showInput?6:-1),p(4),X(\"disabled\",i.data.showInput&&!i.isInputValid()),p(),Fe(\" \",i.data.confirmButtonText||\"Confirm\",\" \"))},dependencies:[oa,yc,Cs,vn,Ia,In,ya,gr,Ta,vr,To,pl,_I,Fg,wa,yn,ro,so,Ca],styles:[\"mat-dialog-content[_ngcontent-%COMP%]{padding:20px 24px;display:flex;flex-direction:column;gap:16px;color:var(--mdc-dialog-supporting-text-color)}mat-dialog-content[_ngcontent-%COMP%]   p[_ngcontent-%COMP%]{color:var(--mdc-dialog-supporting-text-color)}[_nghost-%COMP%]     .mat-mdc-form-field{--mat-form-field-filled-container-color: var(--builder-form-field-background-color);--mat-form-field-filled-label-text-color: var(--mdc-dialog-supporting-text-color);--mat-form-field-filled-focus-label-text-color: var(--builder-text-link-color);--mat-form-field-filled-hover-label-text-color: var(--mdc-dialog-supporting-text-color)}[_nghost-%COMP%]     .mat-mdc-input-element{color:var(--mdc-dialog-supporting-text-color)!important;caret-color:var(--mdc-dialog-supporting-text-color)!important}[_nghost-%COMP%]     .mat-mdc-input-element::placeholder{color:var(--builder-text-muted-color)!important;opacity:0!important}[_nghost-%COMP%]     .mat-mdc-input-element:focus::placeholder{opacity:.6!important}[_nghost-%COMP%]     .mat-mdc-form-field-hint{color:var(--builder-text-muted-color)!important}.tool-info-container[_ngcontent-%COMP%]{background-color:#8ab4f814;border:1px solid rgba(138,180,248,.2);border-radius:8px;padding:16px;margin-bottom:16px}.tool-info-header[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;cursor:pointer;-webkit-user-select:none;user-select:none;padding:4px 0}.tool-info-header[_ngcontent-%COMP%]:hover   .tool-info-title[_ngcontent-%COMP%]{color:#a7c8ff}.tool-info-icon[_ngcontent-%COMP%]{color:#8ab4f8;font-size:20px;width:20px;height:20px;flex-shrink:0}.tool-info-title[_ngcontent-%COMP%]{flex:1;font-weight:500;color:#8ab4f8;font-size:14px;transition:color .2s ease}.tool-info-toggle[_ngcontent-%COMP%]{color:#8ab4f8;margin:-8px}.tool-info-toggle[_ngcontent-%COMP%]   mat-icon[_ngcontent-%COMP%]{transition:transform .2s ease}.tool-info-body[_ngcontent-%COMP%]{max-height:0;overflow:hidden;opacity:0;transition:max-height .3s ease,opacity .2s ease,margin-top .3s ease}.tool-info-body.expanded[_ngcontent-%COMP%]{max-height:500px;opacity:1;margin-top:12px}.tool-info-content[_ngcontent-%COMP%]{flex:1}.tool-info-short[_ngcontent-%COMP%]{font-weight:500;color:var(--mdc-dialog-supporting-text-color)!important;margin-bottom:8px;line-height:1.4}.tool-info-detailed[_ngcontent-%COMP%]{color:var(--mdc-dialog-supporting-text-color)!important;font-size:14px;line-height:1.5}.tool-info-link-container[_ngcontent-%COMP%]{margin-top:12px}.tool-info-link[_ngcontent-%COMP%]{color:#8ab4f8;text-decoration:none;font-size:14px;display:inline-flex;align-items:center;gap:4px;transition:color .2s ease}.tool-info-link[_ngcontent-%COMP%]:hover{color:#a7c8ff}.tool-info-link[_ngcontent-%COMP%]   mat-icon[_ngcontent-%COMP%]{font-size:16px;width:16px;height:16px}\"]})};var gyA=[\"mat-menu-item\",\"\"],lyA=[[[\"mat-icon\"],[\"\",\"matMenuItemIcon\",\"\"]],\"*\"],cyA=[\"mat-icon, [matMenuItemIcon]\",\"*\"];function CyA(t,e){t&1&&(Qt(),m(0,\"svg\",2),GA(1,\"polygon\",3),D())}var IyA=[\"*\"];function dyA(t,e){if(t&1){let A=zA();ti(0,\"div\",0),pc(\"click\",function(){rA(A);let n=y();return sA(n.closed.emit(\"click\"))})(\"animationstart\",function(n){rA(A);let o=y();return sA(o._onAnimationStart(n.animationName))})(\"animationend\",function(n){rA(A);let o=y();return sA(o._onAnimationDone(n.animationName))})(\"animationcancel\",function(n){rA(A);let o=y();return sA(o._onAnimationDone(n.animationName))}),ti(1,\"div\",1),He(2),Ii()()}if(t&2){let A=y();Qo(A._classList),ae(\"mat-menu-panel-animations-disabled\",A._animationsDisabled)(\"mat-menu-panel-exit-animation\",A._panelAnimationState===\"void\")(\"mat-menu-panel-animating\",A._isAnimating()),Bo(\"id\",A.panelId),ie(\"aria-label\",A.ariaLabel||null)(\"aria-labelledby\",A.ariaLabelledby||null)(\"aria-describedby\",A.ariaDescribedby||null)}}var IN=new wA(\"MAT_MENU_PANEL\"),DC=(()=>{class t{_elementRef=h(ge);_document=h(Zt);_focusMonitor=h(Ha);_parentMenu=h(IN,{optional:!0});_changeDetectorRef=h(ft);role=\"menuitem\";disabled=!1;disableRipple=!1;_hovered=new $A;_focused=new $A;_highlighted=!1;_triggersSubmenu=!1;constructor(){h(Hn).load(Za),this._parentMenu?.addItem?.(this)}focus(A,i){this._focusMonitor&&A?this._focusMonitor.focusVia(this._getHostElement(),A,i):this._getHostElement().focus(i),this._focused.next(this)}ngAfterViewInit(){this._focusMonitor&&this._focusMonitor.monitor(this._elementRef,!1)}ngOnDestroy(){this._focusMonitor&&this._focusMonitor.stopMonitoring(this._elementRef),this._parentMenu&&this._parentMenu.removeItem&&this._parentMenu.removeItem(this),this._hovered.complete(),this._focused.complete()}_getTabIndex(){return this.disabled?\"-1\":\"0\"}_getHostElement(){return this._elementRef.nativeElement}_checkDisabled(A){this.disabled&&(A.preventDefault(),A.stopPropagation())}_handleMouseEnter(){this._hovered.next(this)}getLabel(){let A=this._elementRef.nativeElement.cloneNode(!0),i=A.querySelectorAll(\"mat-icon, .material-icons\");for(let n=0;n<i.length;n++)i[n].remove();return A.textContent?.trim()||\"\"}_setHighlighted(A){this._highlighted=A,this._changeDetectorRef.markForCheck()}_setTriggersSubmenu(A){this._triggersSubmenu=A,this._changeDetectorRef.markForCheck()}_hasFocus(){return this._document&&this._document.activeElement===this._getHostElement()}static \\u0275fac=function(i){return new(i||t)};static \\u0275cmp=kA({type:t,selectors:[[\"\",\"mat-menu-item\",\"\"]],hostAttrs:[1,\"mat-mdc-menu-item\",\"mat-focus-indicator\"],hostVars:8,hostBindings:function(i,n){i&1&&$(\"click\",function(a){return n._checkDisabled(a)})(\"mouseenter\",function(){return n._handleMouseEnter()}),i&2&&(ie(\"role\",n.role)(\"tabindex\",n._getTabIndex())(\"aria-disabled\",n.disabled)(\"disabled\",n.disabled||null),ae(\"mat-mdc-menu-item-highlighted\",n._highlighted)(\"mat-mdc-menu-item-submenu-trigger\",n._triggersSubmenu))},inputs:{role:\"role\",disabled:[2,\"disabled\",\"disabled\",he],disableRipple:[2,\"disableRipple\",\"disableRipple\",he]},exportAs:[\"matMenuItem\"],attrs:gyA,ngContentSelectors:cyA,decls:5,vars:3,consts:[[1,\"mat-mdc-menu-item-text\"],[\"matRipple\",\"\",1,\"mat-mdc-menu-ripple\",3,\"matRippleDisabled\",\"matRippleTrigger\"],[\"viewBox\",\"0 0 5 10\",\"focusable\",\"false\",\"aria-hidden\",\"true\",1,\"mat-mdc-menu-submenu-icon\"],[\"points\",\"0,0 5,5 0,10\"]],template:function(i,n){i&1&&(Yt(lyA),He(0),m(1,\"span\",0),He(2,1),D(),GA(3,\"div\",1),V(4,CyA,2,0,\":svg:svg\",2)),i&2&&(p(3),X(\"matRippleDisabled\",n.disableRipple||n.disabled)(\"matRippleTrigger\",n._getHostElement()),p(),W(n._triggersSubmenu?4:-1))},dependencies:[Ns],encapsulation:2,changeDetection:0})}return t})();var ByA=new wA(\"MatMenuContent\");var QyA=new wA(\"mat-menu-default-options\",{providedIn:\"root\",factory:()=>({overlapTrigger:!1,xPosition:\"after\",yPosition:\"below\",backdropClass:\"cdk-overlay-transparent-backdrop\"})}),CN=\"_mat-menu-enter\",rw=\"_mat-menu-exit\",E0=(()=>{class t{_elementRef=h(ge);_changeDetectorRef=h(ft);_injector=h(ut);_keyManager;_xPosition;_yPosition;_firstItemFocusRef;_exitFallbackTimeout;_animationsDisabled=Oi();_allItems;_directDescendantItems=new Sg;_classList={};_panelAnimationState=\"void\";_animationDone=new $A;_isAnimating=jA(!1);parentMenu;direction;overlayPanelClass;backdropClass;ariaLabel;ariaLabelledby;ariaDescribedby;get xPosition(){return this._xPosition}set xPosition(A){this._xPosition=A,this.setPositionClasses()}get yPosition(){return this._yPosition}set yPosition(A){this._yPosition=A,this.setPositionClasses()}templateRef;items;lazyContent;overlapTrigger=!1;hasBackdrop;set panelClass(A){let i=this._previousPanelClass,n=BA({},this._classList);i&&i.length&&i.split(\" \").forEach(o=>{n[o]=!1}),this._previousPanelClass=A,A&&A.length&&(A.split(\" \").forEach(o=>{n[o]=!0}),this._elementRef.nativeElement.className=\"\"),this._classList=n}_previousPanelClass;get classList(){return this.panelClass}set classList(A){this.panelClass=A}closed=new WA;close=this.closed;panelId=h(An).getId(\"mat-menu-panel-\");constructor(){let A=h(QyA);this.overlayPanelClass=A.overlayPanelClass||\"\",this._xPosition=A.xPosition,this._yPosition=A.yPosition,this.backdropClass=A.backdropClass,this.overlapTrigger=A.overlapTrigger,this.hasBackdrop=A.hasBackdrop}ngOnInit(){this.setPositionClasses()}ngAfterContentInit(){this._updateDirectDescendants(),this._keyManager=new Mc(this._directDescendantItems).withWrap().withTypeAhead().withHomeAndEnd(),this._keyManager.tabOut.subscribe(()=>this.closed.emit(\"tab\")),this._directDescendantItems.changes.pipe(nn(this._directDescendantItems),Ei(A=>Qi(...A.map(i=>i._focused)))).subscribe(A=>this._keyManager.updateActiveItem(A)),this._directDescendantItems.changes.subscribe(A=>{let i=this._keyManager;if(this._panelAnimationState===\"enter\"&&i.activeItem?._hasFocus()){let n=A.toArray(),o=Math.max(0,Math.min(n.length-1,i.activeItemIndex||0));n[o]&&!n[o].disabled?i.setActiveItem(o):i.setNextItemActive()}})}ngOnDestroy(){this._keyManager?.destroy(),this._directDescendantItems.destroy(),this.closed.complete(),this._firstItemFocusRef?.destroy(),clearTimeout(this._exitFallbackTimeout)}_hovered(){return this._directDescendantItems.changes.pipe(nn(this._directDescendantItems),Ei(i=>Qi(...i.map(n=>n._hovered))))}addItem(A){}removeItem(A){}_handleKeydown(A){let i=A.keyCode,n=this._keyManager;switch(i){case 27:aa(A)||(A.preventDefault(),this.closed.emit(\"keydown\"));break;case 37:this.parentMenu&&this.direction===\"ltr\"&&this.closed.emit(\"keydown\");break;case 39:this.parentMenu&&this.direction===\"rtl\"&&this.closed.emit(\"keydown\");break;default:(i===38||i===40)&&n.setFocusOrigin(\"keyboard\"),n.onKeydown(A);return}}focusFirstItem(A=\"program\"){this._firstItemFocusRef?.destroy(),this._firstItemFocusRef=Nn(()=>{let i=this._resolvePanel();if(!i||!i.contains(document.activeElement)){let n=this._keyManager;n.setFocusOrigin(A).setFirstItemActive(),!n.activeItem&&i&&i.focus()}},{injector:this._injector})}resetActiveItem(){this._keyManager.setActiveItem(-1)}setElevation(A){}setPositionClasses(A=this.xPosition,i=this.yPosition){this._classList=Ve(BA({},this._classList),{\"mat-menu-before\":A===\"before\",\"mat-menu-after\":A===\"after\",\"mat-menu-above\":i===\"above\",\"mat-menu-below\":i===\"below\"}),this._changeDetectorRef.markForCheck()}_onAnimationDone(A){let i=A===rw;(i||A===CN)&&(i&&(clearTimeout(this._exitFallbackTimeout),this._exitFallbackTimeout=void 0),this._animationDone.next(i?\"void\":\"enter\"),this._isAnimating.set(!1))}_onAnimationStart(A){(A===CN||A===rw)&&this._isAnimating.set(!0)}_setIsOpen(A){if(this._panelAnimationState=A?\"enter\":\"void\",A){if(this._keyManager.activeItemIndex===0){let i=this._resolvePanel();i&&(i.scrollTop=0)}}else this._animationsDisabled||(this._exitFallbackTimeout=setTimeout(()=>this._onAnimationDone(rw),200));this._animationsDisabled&&setTimeout(()=>{this._onAnimationDone(A?CN:rw)}),this._changeDetectorRef.markForCheck()}_updateDirectDescendants(){this._allItems.changes.pipe(nn(this._allItems)).subscribe(A=>{this._directDescendantItems.reset(A.filter(i=>i._parentMenu===this)),this._directDescendantItems.notifyOnChanges()})}_resolvePanel(){let A=null;return this._directDescendantItems.length&&(A=this._directDescendantItems.first._getHostElement().closest('[role=\"menu\"]')),A}static \\u0275fac=function(i){return new(i||t)};static \\u0275cmp=kA({type:t,selectors:[[\"mat-menu\"]],contentQueries:function(i,n,o){if(i&1&&na(o,ByA,5)(o,DC,5)(o,DC,4),i&2){let a;Ce(a=Ie())&&(n.lazyContent=a.first),Ce(a=Ie())&&(n._allItems=a),Ce(a=Ie())&&(n.items=a)}},viewQuery:function(i,n){if(i&1&&ni(Fn,5),i&2){let o;Ce(o=Ie())&&(n.templateRef=o.first)}},hostVars:3,hostBindings:function(i,n){i&2&&ie(\"aria-label\",null)(\"aria-labelledby\",null)(\"aria-describedby\",null)},inputs:{backdropClass:\"backdropClass\",ariaLabel:[0,\"aria-label\",\"ariaLabel\"],ariaLabelledby:[0,\"aria-labelledby\",\"ariaLabelledby\"],ariaDescribedby:[0,\"aria-describedby\",\"ariaDescribedby\"],xPosition:\"xPosition\",yPosition:\"yPosition\",overlapTrigger:[2,\"overlapTrigger\",\"overlapTrigger\",he],hasBackdrop:[2,\"hasBackdrop\",\"hasBackdrop\",A=>A==null?null:he(A)],panelClass:[0,\"class\",\"panelClass\"],classList:\"classList\"},outputs:{closed:\"closed\",close:\"close\"},exportAs:[\"matMenu\"],features:[It([{provide:IN,useExisting:t}])],ngContentSelectors:IyA,decls:1,vars:0,consts:[[\"tabindex\",\"-1\",\"role\",\"menu\",1,\"mat-mdc-menu-panel\",3,\"click\",\"animationstart\",\"animationend\",\"animationcancel\",\"id\"],[1,\"mat-mdc-menu-content\"]],template:function(i,n){i&1&&(Yt(),mf(0,dyA,3,12,\"ng-template\"))},styles:[`mat-menu{display:none}.mat-mdc-menu-content{margin:0;padding:8px 0;outline:0}.mat-mdc-menu-content,.mat-mdc-menu-content .mat-mdc-menu-item .mat-mdc-menu-item-text{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;flex:1;white-space:normal;font-family:var(--mat-menu-item-label-text-font, var(--mat-sys-label-large-font));line-height:var(--mat-menu-item-label-text-line-height, var(--mat-sys-label-large-line-height));font-size:var(--mat-menu-item-label-text-size, var(--mat-sys-label-large-size));letter-spacing:var(--mat-menu-item-label-text-tracking, var(--mat-sys-label-large-tracking));font-weight:var(--mat-menu-item-label-text-weight, var(--mat-sys-label-large-weight))}@keyframes _mat-menu-enter{from{opacity:0;transform:scale(0.8)}to{opacity:1;transform:none}}@keyframes _mat-menu-exit{from{opacity:1}to{opacity:0}}.mat-mdc-menu-panel{min-width:112px;max-width:280px;overflow:auto;box-sizing:border-box;outline:0;animation:_mat-menu-enter 120ms cubic-bezier(0, 0, 0.2, 1);border-radius:var(--mat-menu-container-shape, var(--mat-sys-corner-extra-small));background-color:var(--mat-menu-container-color, var(--mat-sys-surface-container));box-shadow:var(--mat-menu-container-elevation-shadow, 0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12));will-change:transform,opacity}.mat-mdc-menu-panel.mat-menu-panel-exit-animation{animation:_mat-menu-exit 100ms 25ms linear forwards}.mat-mdc-menu-panel.mat-menu-panel-animations-disabled{animation:none}.mat-mdc-menu-panel.mat-menu-panel-animating{pointer-events:none}.mat-mdc-menu-panel.mat-menu-panel-animating:has(.mat-mdc-menu-content:empty){display:none}@media(forced-colors: active){.mat-mdc-menu-panel{outline:solid 1px}}.mat-mdc-menu-panel .mat-divider{border-top-color:var(--mat-menu-divider-color, var(--mat-sys-surface-variant));margin-bottom:var(--mat-menu-divider-bottom-spacing, 8px);margin-top:var(--mat-menu-divider-top-spacing, 8px)}.mat-mdc-menu-item{display:flex;position:relative;align-items:center;justify-content:flex-start;overflow:hidden;padding:0;cursor:pointer;width:100%;text-align:left;box-sizing:border-box;color:inherit;font-size:inherit;background:none;text-decoration:none;margin:0;min-height:48px;padding-left:var(--mat-menu-item-leading-spacing, 12px);padding-right:var(--mat-menu-item-trailing-spacing, 12px);-webkit-user-select:none;user-select:none;cursor:pointer;outline:none;border:none;-webkit-tap-highlight-color:rgba(0,0,0,0)}.mat-mdc-menu-item::-moz-focus-inner{border:0}[dir=rtl] .mat-mdc-menu-item{padding-left:var(--mat-menu-item-trailing-spacing, 12px);padding-right:var(--mat-menu-item-leading-spacing, 12px)}.mat-mdc-menu-item:has(.material-icons,mat-icon,[matButtonIcon]){padding-left:var(--mat-menu-item-with-icon-leading-spacing, 12px);padding-right:var(--mat-menu-item-with-icon-trailing-spacing, 12px)}[dir=rtl] .mat-mdc-menu-item:has(.material-icons,mat-icon,[matButtonIcon]){padding-left:var(--mat-menu-item-with-icon-trailing-spacing, 12px);padding-right:var(--mat-menu-item-with-icon-leading-spacing, 12px)}.mat-mdc-menu-item,.mat-mdc-menu-item:visited,.mat-mdc-menu-item:link{color:var(--mat-menu-item-label-text-color, var(--mat-sys-on-surface))}.mat-mdc-menu-item .mat-icon-no-color,.mat-mdc-menu-item .mat-mdc-menu-submenu-icon{color:var(--mat-menu-item-icon-color, var(--mat-sys-on-surface-variant))}.mat-mdc-menu-item[disabled]{cursor:default;opacity:.38}.mat-mdc-menu-item[disabled]::after{display:block;position:absolute;content:\"\";top:0;left:0;bottom:0;right:0}.mat-mdc-menu-item:focus{outline:0}.mat-mdc-menu-item .mat-icon{flex-shrink:0;margin-right:var(--mat-menu-item-spacing, 12px);height:var(--mat-menu-item-icon-size, 24px);width:var(--mat-menu-item-icon-size, 24px)}[dir=rtl] .mat-mdc-menu-item{text-align:right}[dir=rtl] .mat-mdc-menu-item .mat-icon{margin-right:0;margin-left:var(--mat-menu-item-spacing, 12px)}.mat-mdc-menu-item:not([disabled]):hover{background-color:var(--mat-menu-item-hover-state-layer-color, color-mix(in srgb, var(--mat-sys-on-surface) calc(var(--mat-sys-hover-state-layer-opacity) * 100%), transparent))}.mat-mdc-menu-item:not([disabled]).cdk-program-focused,.mat-mdc-menu-item:not([disabled]).cdk-keyboard-focused,.mat-mdc-menu-item:not([disabled]).mat-mdc-menu-item-highlighted{background-color:var(--mat-menu-item-focus-state-layer-color, color-mix(in srgb, var(--mat-sys-on-surface) calc(var(--mat-sys-focus-state-layer-opacity) * 100%), transparent))}@media(forced-colors: active){.mat-mdc-menu-item{margin-top:1px}}.mat-mdc-menu-submenu-icon{width:var(--mat-menu-item-icon-size, 24px);height:10px;fill:currentColor;padding-left:var(--mat-menu-item-spacing, 12px)}[dir=rtl] .mat-mdc-menu-submenu-icon{padding-right:var(--mat-menu-item-spacing, 12px);padding-left:0}[dir=rtl] .mat-mdc-menu-submenu-icon polygon{transform:scaleX(-1);transform-origin:center}@media(forced-colors: active){.mat-mdc-menu-submenu-icon{fill:CanvasText}}.mat-mdc-menu-item .mat-mdc-menu-ripple{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none}\n`],encapsulation:2,changeDetection:0})}return t})(),EyA=new wA(\"mat-menu-scroll-strategy\",{providedIn:\"root\",factory:()=>{let t=h(ut);return()=>R0(t)}});var uE=new WeakMap,hyA=(()=>{class t{_canHaveBackdrop;_element=h(ge);_viewContainerRef=h(Ro);_menuItemInstance=h(DC,{optional:!0,self:!0});_dir=h(wo,{optional:!0});_focusMonitor=h(Ha);_ngZone=h(Oe);_injector=h(ut);_scrollStrategy=h(EyA);_changeDetectorRef=h(ft);_animationsDisabled=Oi();_portal;_overlayRef=null;_menuOpen=!1;_closingActionsSubscription=Rn.EMPTY;_menuCloseSubscription=Rn.EMPTY;_pendingRemoval;_parentMaterialMenu;_parentInnerPadding;_openedBy=void 0;get _menu(){return this._menuInternal}set _menu(A){A!==this._menuInternal&&(this._menuInternal=A,this._menuCloseSubscription.unsubscribe(),A&&(this._parentMaterialMenu,this._menuCloseSubscription=A.close.subscribe(i=>{this._destroyMenu(i),(i===\"click\"||i===\"tab\")&&this._parentMaterialMenu&&this._parentMaterialMenu.closed.emit(i)})),this._menuItemInstance?._setTriggersSubmenu(this._triggersSubmenu()))}_menuInternal=null;constructor(A){this._canHaveBackdrop=A;let i=h(IN,{optional:!0});this._parentMaterialMenu=i instanceof E0?i:void 0}ngOnDestroy(){this._menu&&this._ownsMenu(this._menu)&&uE.delete(this._menu),this._pendingRemoval?.unsubscribe(),this._menuCloseSubscription.unsubscribe(),this._closingActionsSubscription.unsubscribe(),this._overlayRef&&(this._overlayRef.dispose(),this._overlayRef=null)}get menuOpen(){return this._menuOpen}get dir(){return this._dir&&this._dir.value===\"rtl\"?\"rtl\":\"ltr\"}_triggersSubmenu(){return!!(this._menuItemInstance&&this._parentMaterialMenu&&this._menu)}_closeMenu(){this._menu?.close.emit()}_openMenu(A){if(this._triggerIsAriaDisabled())return;let i=this._menu;if(this._menuOpen||!i)return;this._pendingRemoval?.unsubscribe();let n=uE.get(i);uE.set(i,this),n&&n!==this&&n._closeMenu();let o=this._createOverlay(i),a=o.getConfig(),r=a.positionStrategy;this._setPosition(i,r),this._canHaveBackdrop?a.hasBackdrop=i.hasBackdrop==null?!this._triggersSubmenu():i.hasBackdrop:a.hasBackdrop=i.hasBackdrop??!1,o.hasAttached()||(o.attach(this._getPortal(i)),i.lazyContent?.attach(this.menuData)),this._closingActionsSubscription=this._menuClosingActions().subscribe(()=>this._closeMenu()),i.parentMenu=this._triggersSubmenu()?this._parentMaterialMenu:void 0,i.direction=this.dir,A&&i.focusFirstItem(this._openedBy||\"program\"),this._setIsMenuOpen(!0),i instanceof E0&&(i._setIsOpen(!0),i._directDescendantItems.changes.pipe(Bt(i.close)).subscribe(()=>{r.withLockedPosition(!1).reapplyLastPosition(),r.withLockedPosition(!0)}))}focus(A,i){this._focusMonitor&&A?this._focusMonitor.focusVia(this._element,A,i):this._element.nativeElement.focus(i)}_destroyMenu(A){let i=this._overlayRef,n=this._menu;!i||!this.menuOpen||(this._closingActionsSubscription.unsubscribe(),this._pendingRemoval?.unsubscribe(),n instanceof E0&&this._ownsMenu(n)?(this._pendingRemoval=n._animationDone.pipe(qn(1)).subscribe(()=>{i.detach(),uE.has(n)||n.lazyContent?.detach()}),n._setIsOpen(!1)):(i.detach(),n?.lazyContent?.detach()),n&&this._ownsMenu(n)&&uE.delete(n),this.restoreFocus&&(A===\"keydown\"||!this._openedBy||!this._triggersSubmenu())&&this.focus(this._openedBy),this._openedBy=void 0,this._setIsMenuOpen(!1))}_setIsMenuOpen(A){A!==this._menuOpen&&(this._menuOpen=A,this._menuOpen?this.menuOpened.emit():this.menuClosed.emit(),this._triggersSubmenu()&&this._menuItemInstance._setHighlighted(A),this._changeDetectorRef.markForCheck())}_createOverlay(A){if(!this._overlayRef){let i=this._getOverlayConfig(A);this._subscribeToPositions(A,i.positionStrategy),this._overlayRef=Rl(this._injector,i),this._overlayRef.keydownEvents().subscribe(n=>{this._menu instanceof E0&&this._menu._handleKeydown(n)})}return this._overlayRef}_getOverlayConfig(A){return new Sl({positionStrategy:XI(this._injector,this._getOverlayOrigin()).withLockedPosition().withGrowAfterOpen().withTransformOriginOn(\".mat-menu-panel, .mat-mdc-menu-panel\"),backdropClass:A.backdropClass||\"cdk-overlay-transparent-backdrop\",panelClass:A.overlayPanelClass,scrollStrategy:this._scrollStrategy(),direction:this._dir||\"ltr\",disableAnimations:this._animationsDisabled})}_subscribeToPositions(A,i){A.setPositionClasses&&i.positionChanges.subscribe(n=>{this._ngZone.run(()=>{let o=n.connectionPair.overlayX===\"start\"?\"after\":\"before\",a=n.connectionPair.overlayY===\"top\"?\"below\":\"above\";A.setPositionClasses(o,a)})})}_setPosition(A,i){let[n,o]=A.xPosition===\"before\"?[\"end\",\"start\"]:[\"start\",\"end\"],[a,r]=A.yPosition===\"above\"?[\"bottom\",\"top\"]:[\"top\",\"bottom\"],[s,g]=[a,r],[l,C]=[n,o],I=0;if(this._triggersSubmenu()){if(C=n=A.xPosition===\"before\"?\"start\":\"end\",o=l=n===\"end\"?\"start\":\"end\",this._parentMaterialMenu){if(this._parentInnerPadding==null){let d=this._parentMaterialMenu.items.first;this._parentInnerPadding=d?d._getHostElement().offsetTop:0}I=a===\"bottom\"?this._parentInnerPadding:-this._parentInnerPadding}}else A.overlapTrigger||(s=a===\"top\"?\"bottom\":\"top\",g=r===\"top\"?\"bottom\":\"top\");i.withPositions([{originX:n,originY:s,overlayX:l,overlayY:a,offsetY:I},{originX:o,originY:s,overlayX:C,overlayY:a,offsetY:I},{originX:n,originY:g,overlayX:l,overlayY:r,offsetY:-I},{originX:o,originY:g,overlayX:C,overlayY:r,offsetY:-I}])}_menuClosingActions(){let A=this._getOutsideClickStream(this._overlayRef),i=this._overlayRef.detachments(),n=this._parentMaterialMenu?this._parentMaterialMenu.closed:oe(),o=this._parentMaterialMenu?this._parentMaterialMenu._hovered().pipe(We(a=>this._menuOpen&&a!==this._menuItemInstance)):oe();return Qi(A,n,o,i)}_getPortal(A){return(!this._portal||this._portal.templateRef!==A.templateRef)&&(this._portal=new Vr(A.templateRef,this._viewContainerRef)),this._portal}_ownsMenu(A){return uE.get(A)===this}_triggerIsAriaDisabled(){return he(this._element.nativeElement.getAttribute(\"aria-disabled\"))}static \\u0275fac=function(i){hf()};static \\u0275dir=OA({type:t})}return t})(),fE=(()=>{class t extends hyA{_cleanupTouchstart;_hoverSubscription=Rn.EMPTY;get _deprecatedMatMenuTriggerFor(){return this.menu}set _deprecatedMatMenuTriggerFor(A){this.menu=A}get menu(){return this._menu}set menu(A){this._menu=A}menuData;restoreFocus=!0;menuOpened=new WA;onMenuOpen=this.menuOpened;menuClosed=new WA;onMenuClose=this.menuClosed;constructor(){super(!0);let A=h(ui);this._cleanupTouchstart=A.listen(this._element.nativeElement,\"touchstart\",i=>{RI(i)||(this._openedBy=\"touch\")},{passive:!0})}triggersSubmenu(){return super._triggersSubmenu()}toggleMenu(){return this.menuOpen?this.closeMenu():this.openMenu()}openMenu(){this._openMenu(!0)}closeMenu(){this._closeMenu()}updatePosition(){this._overlayRef?.updatePosition()}ngAfterContentInit(){this._handleHover()}ngOnDestroy(){super.ngOnDestroy(),this._cleanupTouchstart(),this._hoverSubscription.unsubscribe()}_getOverlayOrigin(){return this._element}_getOutsideClickStream(A){return A.backdropClick()}_handleMousedown(A){xI(A)||(this._openedBy=A.button===0?\"mouse\":void 0,this.triggersSubmenu()&&A.preventDefault())}_handleKeydown(A){let i=A.keyCode;(i===13||i===32)&&(this._openedBy=\"keyboard\"),this.triggersSubmenu()&&(i===39&&this.dir===\"ltr\"||i===37&&this.dir===\"rtl\")&&(this._openedBy=\"keyboard\",this.openMenu())}_handleClick(A){this.triggersSubmenu()?(A.stopPropagation(),this.openMenu()):this.toggleMenu()}_handleHover(){this.triggersSubmenu()&&this._parentMaterialMenu&&(this._hoverSubscription=this._parentMaterialMenu._hovered().subscribe(A=>{A===this._menuItemInstance&&!A.disabled&&this._parentMaterialMenu?._panelAnimationState!==\"void\"&&(this._openedBy=\"mouse\",this._openMenu(!1))}))}static \\u0275fac=function(i){return new(i||t)};static \\u0275dir=OA({type:t,selectors:[[\"\",\"mat-menu-trigger-for\",\"\"],[\"\",\"matMenuTriggerFor\",\"\"]],hostAttrs:[1,\"mat-mdc-menu-trigger\"],hostVars:3,hostBindings:function(i,n){i&1&&$(\"click\",function(a){return n._handleClick(a)})(\"mousedown\",function(a){return n._handleMousedown(a)})(\"keydown\",function(a){return n._handleKeydown(a)}),i&2&&ie(\"aria-haspopup\",n.menu?\"menu\":null)(\"aria-expanded\",n.menuOpen)(\"aria-controls\",n.menuOpen?n.menu==null?null:n.menu.panelId:null)},inputs:{_deprecatedMatMenuTriggerFor:[0,\"mat-menu-trigger-for\",\"_deprecatedMatMenuTriggerFor\"],menu:[0,\"matMenuTriggerFor\",\"menu\"],menuData:[0,\"matMenuTriggerData\",\"menuData\"],restoreFocus:[0,\"matMenuTriggerRestoreFocus\",\"restoreFocus\"]},outputs:{menuOpened:\"menuOpened\",onMenuOpen:\"onMenuOpen\",menuClosed:\"menuClosed\",onMenuClose:\"onMenuClose\"},exportAs:[\"matMenuTrigger\"],features:[Ct]})}return t})();var b$=(()=>{class t{static \\u0275fac=function(i){return new(i||t)};static \\u0275mod=Xe({type:t});static \\u0275inj=Ze({imports:[YC,Kg,Fi,Fc]})}return t})();var S$=[\"*\",[[\"mat-chip-avatar\"],[\"\",\"matChipAvatar\",\"\"]],[[\"mat-chip-trailing-icon\"],[\"\",\"matChipRemove\",\"\"],[\"\",\"matChipTrailingIcon\",\"\"]]],x$=[\"*\",\"mat-chip-avatar, [matChipAvatar]\",\"mat-chip-trailing-icon,[matChipRemove],[matChipTrailingIcon]\"];function fyA(t,e){t&1&&(m(0,\"span\",3),He(1,1),D())}function myA(t,e){t&1&&(m(0,\"span\",6),He(1,2),D())}function pyA(t,e){t&1&&(m(0,\"span\",3),He(1,1),m(2,\"span\",7),Qt(),m(3,\"svg\",8),GA(4,\"path\",9),D()()())}function DyA(t,e){t&1&&(m(0,\"span\",6),He(1,2),D())}var wyA=`.mdc-evolution-chip,.mdc-evolution-chip__cell,.mdc-evolution-chip__action{display:inline-flex;align-items:center}.mdc-evolution-chip{position:relative;max-width:100%}.mdc-evolution-chip__cell,.mdc-evolution-chip__action{height:100%}.mdc-evolution-chip__cell--primary{flex-basis:100%;overflow-x:hidden}.mdc-evolution-chip__cell--trailing{flex:1 0 auto}.mdc-evolution-chip__action{align-items:center;background:none;border:none;box-sizing:content-box;cursor:pointer;display:inline-flex;justify-content:center;outline:none;padding:0;text-decoration:none;color:inherit}.mdc-evolution-chip__action--presentational{cursor:auto}.mdc-evolution-chip--disabled,.mdc-evolution-chip__action:disabled{pointer-events:none}@media(forced-colors: active){.mdc-evolution-chip--disabled,.mdc-evolution-chip__action:disabled{forced-color-adjust:none}}.mdc-evolution-chip__action--primary{font:inherit;letter-spacing:inherit;white-space:inherit;overflow-x:hidden}.mat-mdc-standard-chip .mdc-evolution-chip__action--primary::before{border-width:var(--mat-chip-outline-width, 1px);border-radius:var(--mat-chip-container-shape-radius, 8px);box-sizing:border-box;content:\"\";height:100%;left:0;position:absolute;pointer-events:none;top:0;width:100%;z-index:1;border-style:solid}.mat-mdc-standard-chip .mdc-evolution-chip__action--primary{padding-left:12px;padding-right:12px}.mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__action--primary{padding-left:0;padding-right:12px}[dir=rtl] .mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__action--primary{padding-left:12px;padding-right:0}.mat-mdc-standard-chip:not(.mdc-evolution-chip--disabled) .mdc-evolution-chip__action--primary::before{border-color:var(--mat-chip-outline-color, var(--mat-sys-outline))}.mdc-evolution-chip__action--primary:not(.mdc-evolution-chip__action--presentational):not(.mdc-ripple-upgraded):focus::before{border-color:var(--mat-chip-focus-outline-color, var(--mat-sys-on-surface-variant))}.mat-mdc-standard-chip.mdc-evolution-chip--disabled .mdc-evolution-chip__action--primary::before{border-color:var(--mat-chip-disabled-outline-color, color-mix(in srgb, var(--mat-sys-on-surface) 12%, transparent))}.mat-mdc-standard-chip.mdc-evolution-chip--selected .mdc-evolution-chip__action--primary::before{border-width:var(--mat-chip-flat-selected-outline-width, 0)}.mat-mdc-basic-chip .mdc-evolution-chip__action--primary{font:inherit}.mat-mdc-standard-chip.mdc-evolution-chip--with-leading-action .mdc-evolution-chip__action--primary{padding-left:0;padding-right:12px}[dir=rtl] .mat-mdc-standard-chip.mdc-evolution-chip--with-leading-action .mdc-evolution-chip__action--primary{padding-left:12px;padding-right:0}.mat-mdc-standard-chip.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--primary{padding-left:12px;padding-right:0}[dir=rtl] .mat-mdc-standard-chip.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--primary{padding-left:0;padding-right:12px}.mat-mdc-standard-chip.mdc-evolution-chip--with-leading-action.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--primary{padding-left:0;padding-right:0}.mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--primary{padding-left:0;padding-right:0}[dir=rtl] .mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--primary{padding-left:0;padding-right:0}.mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__action--primary{padding-left:0;padding-right:12px}[dir=rtl] .mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__action--primary{padding-left:12px;padding-right:0}.mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--primary{padding-left:0;padding-right:0}[dir=rtl] .mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--primary{padding-left:0;padding-right:0}.mdc-evolution-chip__action--secondary{position:relative;overflow:visible}.mat-mdc-standard-chip:not(.mdc-evolution-chip--disabled) .mdc-evolution-chip__action--secondary{color:var(--mat-chip-with-trailing-icon-trailing-icon-color, var(--mat-sys-on-surface-variant))}.mat-mdc-standard-chip.mdc-evolution-chip--disabled .mdc-evolution-chip__action--secondary{color:var(--mat-chip-with-trailing-icon-disabled-trailing-icon-color, var(--mat-sys-on-surface))}.mat-mdc-standard-chip.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--secondary{padding-left:8px;padding-right:8px}.mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--secondary{padding-left:8px;padding-right:8px}.mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--secondary{padding-left:8px;padding-right:8px}[dir=rtl] .mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--secondary{padding-left:8px;padding-right:8px}.mdc-evolution-chip__text-label{-webkit-user-select:none;user-select:none;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.mat-mdc-standard-chip .mdc-evolution-chip__text-label{font-family:var(--mat-chip-label-text-font, var(--mat-sys-label-large-font));line-height:var(--mat-chip-label-text-line-height, var(--mat-sys-label-large-line-height));font-size:var(--mat-chip-label-text-size, var(--mat-sys-label-large-size));font-weight:var(--mat-chip-label-text-weight, var(--mat-sys-label-large-weight));letter-spacing:var(--mat-chip-label-text-tracking, var(--mat-sys-label-large-tracking))}.mat-mdc-standard-chip:not(.mdc-evolution-chip--disabled) .mdc-evolution-chip__text-label{color:var(--mat-chip-label-text-color, var(--mat-sys-on-surface-variant))}.mat-mdc-standard-chip.mdc-evolution-chip--selected:not(.mdc-evolution-chip--disabled) .mdc-evolution-chip__text-label{color:var(--mat-chip-selected-label-text-color, var(--mat-sys-on-secondary-container))}.mat-mdc-standard-chip.mdc-evolution-chip--disabled .mdc-evolution-chip__text-label,.mat-mdc-standard-chip.mdc-evolution-chip--selected.mdc-evolution-chip--disabled .mdc-evolution-chip__text-label{color:var(--mat-chip-disabled-label-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mdc-evolution-chip__graphic{align-items:center;display:inline-flex;justify-content:center;overflow:hidden;pointer-events:none;position:relative;flex:1 0 auto}.mat-mdc-standard-chip .mdc-evolution-chip__graphic{width:var(--mat-chip-with-avatar-avatar-size, 24px);height:var(--mat-chip-with-avatar-avatar-size, 24px);font-size:var(--mat-chip-with-avatar-avatar-size, 24px)}.mdc-evolution-chip--selecting .mdc-evolution-chip__graphic{transition:width 150ms 0ms cubic-bezier(0.4, 0, 0.2, 1)}.mdc-evolution-chip--selectable:not(.mdc-evolution-chip--selected):not(.mdc-evolution-chip--with-primary-icon) .mdc-evolution-chip__graphic{width:0}.mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__graphic{padding-left:6px;padding-right:6px}.mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__graphic{padding-left:4px;padding-right:8px}[dir=rtl] .mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__graphic{padding-left:8px;padding-right:4px}.mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__graphic{padding-left:6px;padding-right:6px}.mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__graphic{padding-left:4px;padding-right:8px}[dir=rtl] .mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__graphic{padding-left:8px;padding-right:4px}.mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-leading-action .mdc-evolution-chip__graphic{padding-left:0}.mdc-evolution-chip__checkmark{position:absolute;opacity:0;top:50%;left:50%;height:20px;width:20px}.mat-mdc-standard-chip:not(.mdc-evolution-chip--disabled) .mdc-evolution-chip__checkmark{color:var(--mat-chip-with-icon-selected-icon-color, var(--mat-sys-on-secondary-container))}.mat-mdc-standard-chip.mdc-evolution-chip--disabled .mdc-evolution-chip__checkmark{color:var(--mat-chip-with-icon-disabled-icon-color, var(--mat-sys-on-surface))}.mdc-evolution-chip--selecting .mdc-evolution-chip__checkmark{transition:transform 150ms 0ms cubic-bezier(0.4, 0, 0.2, 1);transform:translate(-75%, -50%)}.mdc-evolution-chip--selected .mdc-evolution-chip__checkmark{transform:translate(-50%, -50%);opacity:1}.mdc-evolution-chip__checkmark-svg{display:block}.mdc-evolution-chip__checkmark-path{stroke-width:2px;stroke-dasharray:29.7833385;stroke-dashoffset:29.7833385;stroke:currentColor}.mdc-evolution-chip--selecting .mdc-evolution-chip__checkmark-path{transition:stroke-dashoffset 150ms 45ms cubic-bezier(0.4, 0, 0.2, 1)}.mdc-evolution-chip--selected .mdc-evolution-chip__checkmark-path{stroke-dashoffset:0}@media(forced-colors: active){.mdc-evolution-chip__checkmark-path{stroke:CanvasText !important}}.mat-mdc-standard-chip .mdc-evolution-chip__icon--trailing{height:18px;width:18px;font-size:18px}.mdc-evolution-chip--disabled .mdc-evolution-chip__icon--trailing.mat-mdc-chip-remove{opacity:calc(var(--mat-chip-trailing-action-opacity, 1)*var(--mat-chip-with-trailing-icon-disabled-trailing-icon-opacity, 0.38))}.mdc-evolution-chip--disabled .mdc-evolution-chip__icon--trailing.mat-mdc-chip-remove:focus{opacity:calc(var(--mat-chip-trailing-action-focus-opacity, 1)*var(--mat-chip-with-trailing-icon-disabled-trailing-icon-opacity, 0.38))}.mat-mdc-standard-chip{border-radius:var(--mat-chip-container-shape-radius, 8px);height:var(--mat-chip-container-height, 32px)}.mat-mdc-standard-chip:not(.mdc-evolution-chip--disabled){background-color:var(--mat-chip-elevated-container-color, transparent)}.mat-mdc-standard-chip.mdc-evolution-chip--disabled{background-color:var(--mat-chip-elevated-disabled-container-color)}.mat-mdc-standard-chip.mdc-evolution-chip--selected:not(.mdc-evolution-chip--disabled){background-color:var(--mat-chip-elevated-selected-container-color, var(--mat-sys-secondary-container))}.mat-mdc-standard-chip.mdc-evolution-chip--selected.mdc-evolution-chip--disabled{background-color:var(--mat-chip-flat-disabled-selected-container-color, color-mix(in srgb, var(--mat-sys-on-surface) 12%, transparent))}@media(forced-colors: active){.mat-mdc-standard-chip{outline:solid 1px}}.mat-mdc-standard-chip .mdc-evolution-chip__icon--primary{border-radius:var(--mat-chip-with-avatar-avatar-shape-radius, 24px);width:var(--mat-chip-with-icon-icon-size, 18px);height:var(--mat-chip-with-icon-icon-size, 18px);font-size:var(--mat-chip-with-icon-icon-size, 18px)}.mdc-evolution-chip--selected .mdc-evolution-chip__icon--primary{opacity:0}.mat-mdc-standard-chip:not(.mdc-evolution-chip--disabled) .mdc-evolution-chip__icon--primary{color:var(--mat-chip-with-icon-icon-color, var(--mat-sys-on-surface-variant))}.mat-mdc-standard-chip.mdc-evolution-chip--disabled .mdc-evolution-chip__icon--primary{color:var(--mat-chip-with-icon-disabled-icon-color, var(--mat-sys-on-surface))}.mat-mdc-chip-highlighted{--mat-chip-with-icon-icon-color: var(--mat-chip-with-icon-selected-icon-color, var(--mat-sys-on-secondary-container));--mat-chip-elevated-container-color: var(--mat-chip-elevated-selected-container-color, var(--mat-sys-secondary-container));--mat-chip-label-text-color: var(--mat-chip-selected-label-text-color, var(--mat-sys-on-secondary-container));--mat-chip-outline-width: var(--mat-chip-flat-selected-outline-width, 0)}.mat-mdc-chip-focus-overlay{background:var(--mat-chip-focus-state-layer-color, var(--mat-sys-on-surface-variant))}.mat-mdc-chip-selected .mat-mdc-chip-focus-overlay,.mat-mdc-chip-highlighted .mat-mdc-chip-focus-overlay{background:var(--mat-chip-selected-focus-state-layer-color, var(--mat-sys-on-secondary-container))}.mat-mdc-chip:hover .mat-mdc-chip-focus-overlay{background:var(--mat-chip-hover-state-layer-color, var(--mat-sys-on-surface-variant));opacity:var(--mat-chip-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-chip-focus-overlay .mat-mdc-chip-selected:hover,.mat-mdc-chip-highlighted:hover .mat-mdc-chip-focus-overlay{background:var(--mat-chip-selected-hover-state-layer-color, var(--mat-sys-on-secondary-container));opacity:var(--mat-chip-selected-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-chip.cdk-focused .mat-mdc-chip-focus-overlay{background:var(--mat-chip-focus-state-layer-color, var(--mat-sys-on-surface-variant));opacity:var(--mat-chip-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mat-mdc-chip-selected.cdk-focused .mat-mdc-chip-focus-overlay,.mat-mdc-chip-highlighted.cdk-focused .mat-mdc-chip-focus-overlay{background:var(--mat-chip-selected-focus-state-layer-color, var(--mat-sys-on-secondary-container));opacity:var(--mat-chip-selected-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mdc-evolution-chip--disabled:not(.mdc-evolution-chip--selected) .mat-mdc-chip-avatar{opacity:var(--mat-chip-with-avatar-disabled-avatar-opacity, 0.38)}.mdc-evolution-chip--disabled .mdc-evolution-chip__icon--trailing{opacity:var(--mat-chip-with-trailing-icon-disabled-trailing-icon-opacity, 0.38)}.mdc-evolution-chip--disabled.mdc-evolution-chip--selected .mdc-evolution-chip__checkmark{opacity:var(--mat-chip-with-icon-disabled-icon-opacity, 0.38)}.mat-mdc-standard-chip.mdc-evolution-chip--disabled{opacity:var(--mat-chip-disabled-container-opacity, 1)}.mat-mdc-standard-chip.mdc-evolution-chip--selected .mdc-evolution-chip__icon--trailing,.mat-mdc-standard-chip.mat-mdc-chip-highlighted .mdc-evolution-chip__icon--trailing{color:var(--mat-chip-selected-trailing-icon-color, var(--mat-sys-on-secondary-container))}.mat-mdc-standard-chip.mdc-evolution-chip--selected.mdc-evolution-chip--disabled .mdc-evolution-chip__icon--trailing,.mat-mdc-standard-chip.mat-mdc-chip-highlighted.mdc-evolution-chip--disabled .mdc-evolution-chip__icon--trailing{color:var(--mat-chip-selected-disabled-trailing-icon-color, var(--mat-sys-on-surface))}.mat-mdc-chip-edit,.mat-mdc-chip-remove{opacity:var(--mat-chip-trailing-action-opacity, 1)}.mat-mdc-chip-edit:focus,.mat-mdc-chip-remove:focus{opacity:var(--mat-chip-trailing-action-focus-opacity, 1)}.mat-mdc-chip-edit::after,.mat-mdc-chip-remove::after{background-color:var(--mat-chip-trailing-action-state-layer-color, var(--mat-sys-on-surface-variant))}.mat-mdc-chip-edit:hover::after,.mat-mdc-chip-remove:hover::after{opacity:calc(var(--mat-chip-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity)) + var(--mat-chip-trailing-action-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity)))}.mat-mdc-chip-edit:focus::after,.mat-mdc-chip-remove:focus::after{opacity:calc(var(--mat-chip-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity)) + var(--mat-chip-trailing-action-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity)))}.mat-mdc-chip-selected .mat-mdc-chip-remove::after,.mat-mdc-chip-highlighted .mat-mdc-chip-remove::after{background-color:var(--mat-chip-selected-trailing-action-state-layer-color, var(--mat-sys-on-secondary-container))}.mat-mdc-chip.cdk-focused .mat-mdc-chip-edit:focus::after,.mat-mdc-chip.cdk-focused .mat-mdc-chip-remove:focus::after{opacity:calc(var(--mat-chip-selected-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity)) + var(--mat-chip-trailing-action-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity)))}.mat-mdc-chip.cdk-focused .mat-mdc-chip-edit:hover::after,.mat-mdc-chip.cdk-focused .mat-mdc-chip-remove:hover::after{opacity:calc(var(--mat-chip-selected-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity)) + var(--mat-chip-trailing-action-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity)))}.mat-mdc-standard-chip{-webkit-tap-highlight-color:rgba(0,0,0,0)}.mat-mdc-standard-chip .mat-mdc-chip-graphic,.mat-mdc-standard-chip .mat-mdc-chip-trailing-icon{box-sizing:content-box}.mat-mdc-standard-chip._mat-animation-noopable,.mat-mdc-standard-chip._mat-animation-noopable .mdc-evolution-chip__graphic,.mat-mdc-standard-chip._mat-animation-noopable .mdc-evolution-chip__checkmark,.mat-mdc-standard-chip._mat-animation-noopable .mdc-evolution-chip__checkmark-path{transition-duration:1ms;animation-duration:1ms}.mat-mdc-chip-focus-overlay{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none;opacity:0;border-radius:inherit;transition:opacity 150ms linear}._mat-animation-noopable .mat-mdc-chip-focus-overlay{transition:none}.mat-mdc-basic-chip .mat-mdc-chip-focus-overlay{display:none}.mat-mdc-chip .mat-ripple.mat-mdc-chip-ripple{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none;border-radius:inherit}.mat-mdc-chip-avatar{text-align:center;line-height:1;color:var(--mat-chip-with-icon-icon-color, currentColor)}.mat-mdc-chip{position:relative;z-index:0}.mat-mdc-chip-action-label{text-align:left;z-index:1}[dir=rtl] .mat-mdc-chip-action-label{text-align:right}.mat-mdc-chip.mdc-evolution-chip--with-trailing-action .mat-mdc-chip-action-label{position:relative}.mat-mdc-chip-action-label .mat-mdc-chip-primary-focus-indicator{position:absolute;top:0;right:0;bottom:0;left:0;pointer-events:none}.mat-mdc-chip-action-label .mat-focus-indicator::before{margin:calc(calc(var(--mat-focus-indicator-border-width, 3px) + 2px)*-1)}.mat-mdc-chip-edit::before,.mat-mdc-chip-remove::before{margin:calc(var(--mat-focus-indicator-border-width, 3px)*-1);left:8px;right:8px}.mat-mdc-chip-edit::after,.mat-mdc-chip-remove::after{content:\"\";display:block;opacity:0;position:absolute;top:-3px;bottom:-3px;left:5px;right:5px;border-radius:50%;box-sizing:border-box;padding:12px;margin:-12px;background-clip:content-box}.mat-mdc-chip-edit .mat-icon,.mat-mdc-chip-remove .mat-icon{width:18px;height:18px;font-size:18px;box-sizing:content-box}.mat-chip-edit-input{cursor:text;display:inline-block;color:inherit;outline:0}@media(forced-colors: active){.mat-mdc-chip-selected:not(.mat-mdc-chip-multiple){outline-width:3px}}.mat-mdc-chip-action:focus-visible .mat-focus-indicator::before{content:\"\"}.mdc-evolution-chip__icon,.mat-mdc-chip-edit .mat-icon,.mat-mdc-chip-remove .mat-icon{min-height:fit-content}img.mdc-evolution-chip__icon{min-height:0}\n`;var R$=[\"*\"],yyA=`.mat-mdc-chip-set{display:flex}.mat-mdc-chip-set:focus{outline:none}.mat-mdc-chip-set .mdc-evolution-chip-set__chips{min-width:100%;margin-left:-8px;margin-right:0}.mat-mdc-chip-set .mdc-evolution-chip{margin:4px 0 4px 8px}[dir=rtl] .mat-mdc-chip-set .mdc-evolution-chip-set__chips{margin-left:0;margin-right:-8px}[dir=rtl] .mat-mdc-chip-set .mdc-evolution-chip{margin-left:0;margin-right:8px}.mdc-evolution-chip-set__chips{display:flex;flex-flow:wrap;min-width:0}.mat-mdc-chip-set-stacked{flex-direction:column;align-items:flex-start}.mat-mdc-chip-set-stacked .mat-mdc-chip{width:100%}.mat-mdc-chip-set-stacked .mdc-evolution-chip__graphic{flex-grow:0}.mat-mdc-chip-set-stacked .mdc-evolution-chip__action--primary{flex-basis:100%;justify-content:start}input.mat-mdc-chip-input{flex:1 0 150px;margin-left:8px}[dir=rtl] input.mat-mdc-chip-input{margin-left:0;margin-right:8px}.mat-mdc-form-field:not(.mat-form-field-hide-placeholder) input.mat-mdc-chip-input::placeholder{opacity:1}.mat-mdc-form-field:not(.mat-form-field-hide-placeholder) input.mat-mdc-chip-input::-moz-placeholder{opacity:1}.mat-mdc-form-field:not(.mat-form-field-hide-placeholder) input.mat-mdc-chip-input::-webkit-input-placeholder{opacity:1}.mat-mdc-form-field:not(.mat-form-field-hide-placeholder) input.mat-mdc-chip-input:-ms-input-placeholder{opacity:1}.mat-mdc-chip-set+input.mat-mdc-chip-input{margin-left:0;margin-right:0}\n`,EN=new wA(\"mat-chips-default-options\",{providedIn:\"root\",factory:()=>({separatorKeyCodes:[13]})}),dN=new wA(\"MatChipAvatar\"),M$=new wA(\"MatChipTrailingIcon\"),k$=new wA(\"MatChipEdit\"),BN=new wA(\"MatChipRemove\"),hN=new wA(\"MatChip\"),N$=(()=>{class t{_elementRef=h(ge);_parentChip=h(hN);_isPrimary=!0;_isLeading=!1;get disabled(){return this._disabled||this._parentChip?.disabled||!1}set disabled(A){this._disabled=A}_disabled=!1;tabIndex=-1;_allowFocusWhenDisabled=!1;_getDisabledAttribute(){return this.disabled&&!this._allowFocusWhenDisabled?\"\":null}constructor(){h(Hn).load(Za),this._elementRef.nativeElement.nodeName===\"BUTTON\"&&this._elementRef.nativeElement.setAttribute(\"type\",\"button\")}focus(){this._elementRef.nativeElement.focus()}static \\u0275fac=function(i){return new(i||t)};static \\u0275dir=OA({type:t,selectors:[[\"\",\"matChipContent\",\"\"]],hostAttrs:[1,\"mat-mdc-chip-action\",\"mdc-evolution-chip__action\",\"mdc-evolution-chip__action--presentational\"],hostVars:8,hostBindings:function(i,n){i&2&&(ie(\"disabled\",n._getDisabledAttribute())(\"aria-disabled\",n.disabled),ae(\"mdc-evolution-chip__action--primary\",n._isPrimary)(\"mdc-evolution-chip__action--secondary\",!n._isPrimary)(\"mdc-evolution-chip__action--trailing\",!n._isPrimary&&!n._isLeading))},inputs:{disabled:[2,\"disabled\",\"disabled\",he],tabIndex:[2,\"tabIndex\",\"tabIndex\",A=>A==null?-1:Zi(A)],_allowFocusWhenDisabled:\"_allowFocusWhenDisabled\"}})}return t})(),uN=(()=>{class t extends N${_getTabindex(){return this.disabled&&!this._allowFocusWhenDisabled?null:this.tabIndex.toString()}_handleClick(A){!this.disabled&&this._isPrimary&&(A.preventDefault(),this._parentChip._handlePrimaryActionInteraction())}_handleKeydown(A){(A.keyCode===13||A.keyCode===32)&&!this.disabled&&this._isPrimary&&!this._parentChip._isEditing&&(A.preventDefault(),this._parentChip._handlePrimaryActionInteraction())}static \\u0275fac=(()=>{let A;return function(n){return(A||(A=hi(t)))(n||t)}})();static \\u0275dir=OA({type:t,selectors:[[\"\",\"matChipAction\",\"\"]],hostVars:3,hostBindings:function(i,n){i&1&&$(\"click\",function(a){return n._handleClick(a)})(\"keydown\",function(a){return n._handleKeydown(a)}),i&2&&(ie(\"tabindex\",n._getTabindex()),ae(\"mdc-evolution-chip__action--presentational\",!1))},features:[Ct]})}return t})(),F$=(()=>{class t{static \\u0275fac=function(i){return new(i||t)};static \\u0275dir=OA({type:t,selectors:[[\"mat-chip-avatar\"],[\"\",\"matChipAvatar\",\"\"]],hostAttrs:[\"role\",\"img\",1,\"mat-mdc-chip-avatar\",\"mdc-evolution-chip__icon\",\"mdc-evolution-chip__icon--primary\"],features:[It([{provide:dN,useExisting:t}])]})}return t})();var L$=(()=>{class t extends uN{_isPrimary=!1;_handleClick(A){this.disabled||(A.stopPropagation(),A.preventDefault(),this._parentChip.remove())}_handleKeydown(A){(A.keyCode===13||A.keyCode===32)&&!this.disabled&&(A.stopPropagation(),A.preventDefault(),this._parentChip.remove())}static \\u0275fac=(()=>{let A;return function(n){return(A||(A=hi(t)))(n||t)}})();static \\u0275dir=OA({type:t,selectors:[[\"\",\"matChipRemove\",\"\"]],hostAttrs:[\"role\",\"button\",1,\"mat-mdc-chip-remove\",\"mat-mdc-chip-trailing-icon\",\"mat-focus-indicator\",\"mdc-evolution-chip__icon\",\"mdc-evolution-chip__icon--trailing\"],hostVars:1,hostBindings:function(i,n){i&2&&ie(\"aria-hidden\",null)},features:[It([{provide:BN,useExisting:t}]),Ct]})}return t})(),yu=(()=>{class t{_changeDetectorRef=h(ft);_elementRef=h(ge);_tagName=h(DL);_ngZone=h(Oe);_focusMonitor=h(Ha);_globalRippleOptions=h(JC,{optional:!0});_document=h(Zt);_onFocus=new $A;_onBlur=new $A;_isBasicChip=!1;role=null;_hasFocusInternal=!1;_pendingFocus=!1;_actionChanges;_animationsDisabled=Oi();_allLeadingIcons;_allTrailingIcons;_allEditIcons;_allRemoveIcons;_hasFocus(){return this._hasFocusInternal}id=h(An).getId(\"mat-mdc-chip-\");ariaLabel=null;ariaDescription=null;_chipListDisabled=!1;_hadFocusOnRemove=!1;_textElement;get value(){return this._value!==void 0?this._value:this._textElement.textContent.trim()}set value(A){this._value=A}_value;color;removable=!0;highlighted=!1;disableRipple=!1;get disabled(){return this._disabled||this._chipListDisabled}set disabled(A){this._disabled=A}_disabled=!1;removed=new WA;destroyed=new WA;basicChipAttrName=\"mat-basic-chip\";leadingIcon;editIcon;trailingIcon;removeIcon;primaryAction;_rippleLoader=h($f);_injector=h(ut);constructor(){let A=h(Hn);A.load(Za),A.load(KC),this._monitorFocus(),this._rippleLoader?.configureRipple(this._elementRef.nativeElement,{className:\"mat-mdc-chip-ripple\",disabled:this._isRippleDisabled()})}ngOnInit(){this._isBasicChip=this._elementRef.nativeElement.hasAttribute(this.basicChipAttrName)||this._tagName.toLowerCase()===this.basicChipAttrName}ngAfterViewInit(){this._textElement=this._elementRef.nativeElement.querySelector(\".mat-mdc-chip-action-label\"),this._pendingFocus&&(this._pendingFocus=!1,this.focus())}ngAfterContentInit(){this._actionChanges=Qi(this._allLeadingIcons.changes,this._allTrailingIcons.changes,this._allEditIcons.changes,this._allRemoveIcons.changes).subscribe(()=>this._changeDetectorRef.markForCheck())}ngDoCheck(){this._rippleLoader.setDisabled(this._elementRef.nativeElement,this._isRippleDisabled())}ngOnDestroy(){this._focusMonitor.stopMonitoring(this._elementRef),this._rippleLoader?.destroyRipple(this._elementRef.nativeElement),this._actionChanges?.unsubscribe(),this.destroyed.emit({chip:this}),this.destroyed.complete()}remove(){this.removable&&(this._hadFocusOnRemove=this._hasFocus(),this.removed.emit({chip:this}))}_isRippleDisabled(){return this.disabled||this.disableRipple||this._animationsDisabled||this._isBasicChip||!this._hasInteractiveActions()||!!this._globalRippleOptions?.disabled}_hasTrailingIcon(){return!!(this.trailingIcon||this.removeIcon)}_handleKeydown(A){(A.keyCode===8&&!A.repeat||A.keyCode===46)&&(A.preventDefault(),this.remove())}focus(){this.disabled||(this.primaryAction?this.primaryAction.focus():this._pendingFocus=!0)}_getSourceAction(A){return this._getActions().find(i=>{let n=i._elementRef.nativeElement;return n===A||n.contains(A)})}_getActions(){let A=[];return this.editIcon&&A.push(this.editIcon),this.primaryAction&&A.push(this.primaryAction),this.removeIcon&&A.push(this.removeIcon),A}_handlePrimaryActionInteraction(){}_hasInteractiveActions(){return this._getActions().length>0}_edit(A){}_monitorFocus(){this._focusMonitor.monitor(this._elementRef,!0).subscribe(A=>{let i=A!==null;i!==this._hasFocusInternal&&(this._hasFocusInternal=i,i?this._onFocus.next({chip:this}):(this._changeDetectorRef.markForCheck(),setTimeout(()=>this._ngZone.run(()=>this._onBlur.next({chip:this})))))})}static \\u0275fac=function(i){return new(i||t)};static \\u0275cmp=kA({type:t,selectors:[[\"mat-basic-chip\"],[\"\",\"mat-basic-chip\",\"\"],[\"mat-chip\"],[\"\",\"mat-chip\",\"\"]],contentQueries:function(i,n,o){if(i&1&&na(o,dN,5)(o,k$,5)(o,M$,5)(o,BN,5)(o,dN,5)(o,M$,5)(o,k$,5)(o,BN,5),i&2){let a;Ce(a=Ie())&&(n.leadingIcon=a.first),Ce(a=Ie())&&(n.editIcon=a.first),Ce(a=Ie())&&(n.trailingIcon=a.first),Ce(a=Ie())&&(n.removeIcon=a.first),Ce(a=Ie())&&(n._allLeadingIcons=a),Ce(a=Ie())&&(n._allTrailingIcons=a),Ce(a=Ie())&&(n._allEditIcons=a),Ce(a=Ie())&&(n._allRemoveIcons=a)}},viewQuery:function(i,n){if(i&1&&ni(uN,5),i&2){let o;Ce(o=Ie())&&(n.primaryAction=o.first)}},hostAttrs:[1,\"mat-mdc-chip\"],hostVars:31,hostBindings:function(i,n){i&1&&$(\"keydown\",function(a){return n._handleKeydown(a)}),i&2&&(Bo(\"id\",n.id),ie(\"role\",n.role)(\"aria-label\",n.ariaLabel),Qo(\"mat-\"+(n.color||\"primary\")),ae(\"mdc-evolution-chip\",!n._isBasicChip)(\"mdc-evolution-chip--disabled\",n.disabled)(\"mdc-evolution-chip--with-trailing-action\",n._hasTrailingIcon())(\"mdc-evolution-chip--with-primary-graphic\",n.leadingIcon)(\"mdc-evolution-chip--with-primary-icon\",n.leadingIcon)(\"mdc-evolution-chip--with-avatar\",n.leadingIcon)(\"mat-mdc-chip-with-avatar\",n.leadingIcon)(\"mat-mdc-chip-highlighted\",n.highlighted)(\"mat-mdc-chip-disabled\",n.disabled)(\"mat-mdc-basic-chip\",n._isBasicChip)(\"mat-mdc-standard-chip\",!n._isBasicChip)(\"mat-mdc-chip-with-trailing-icon\",n._hasTrailingIcon())(\"_mat-animation-noopable\",n._animationsDisabled))},inputs:{role:\"role\",id:\"id\",ariaLabel:[0,\"aria-label\",\"ariaLabel\"],ariaDescription:[0,\"aria-description\",\"ariaDescription\"],value:\"value\",color:\"color\",removable:[2,\"removable\",\"removable\",he],highlighted:[2,\"highlighted\",\"highlighted\",he],disableRipple:[2,\"disableRipple\",\"disableRipple\",he],disabled:[2,\"disabled\",\"disabled\",he]},outputs:{removed:\"removed\",destroyed:\"destroyed\"},exportAs:[\"matChip\"],features:[It([{provide:hN,useExisting:t}])],ngContentSelectors:x$,decls:8,vars:2,consts:[[1,\"mat-mdc-chip-focus-overlay\"],[1,\"mdc-evolution-chip__cell\",\"mdc-evolution-chip__cell--primary\"],[\"matChipContent\",\"\"],[1,\"mdc-evolution-chip__graphic\",\"mat-mdc-chip-graphic\"],[1,\"mdc-evolution-chip__text-label\",\"mat-mdc-chip-action-label\"],[1,\"mat-mdc-chip-primary-focus-indicator\",\"mat-focus-indicator\"],[1,\"mdc-evolution-chip__cell\",\"mdc-evolution-chip__cell--trailing\"]],template:function(i,n){i&1&&(Yt(S$),GA(0,\"span\",0),m(1,\"span\",1)(2,\"span\",2),V(3,fyA,2,0,\"span\",3),m(4,\"span\",4),He(5),GA(6,\"span\",5),D()()(),V(7,myA,2,0,\"span\",6)),i&2&&(p(3),W(n.leadingIcon?3:-1),p(4),W(n._hasTrailingIcon()?7:-1))},dependencies:[N$],styles:[`.mdc-evolution-chip,.mdc-evolution-chip__cell,.mdc-evolution-chip__action{display:inline-flex;align-items:center}.mdc-evolution-chip{position:relative;max-width:100%}.mdc-evolution-chip__cell,.mdc-evolution-chip__action{height:100%}.mdc-evolution-chip__cell--primary{flex-basis:100%;overflow-x:hidden}.mdc-evolution-chip__cell--trailing{flex:1 0 auto}.mdc-evolution-chip__action{align-items:center;background:none;border:none;box-sizing:content-box;cursor:pointer;display:inline-flex;justify-content:center;outline:none;padding:0;text-decoration:none;color:inherit}.mdc-evolution-chip__action--presentational{cursor:auto}.mdc-evolution-chip--disabled,.mdc-evolution-chip__action:disabled{pointer-events:none}@media(forced-colors: active){.mdc-evolution-chip--disabled,.mdc-evolution-chip__action:disabled{forced-color-adjust:none}}.mdc-evolution-chip__action--primary{font:inherit;letter-spacing:inherit;white-space:inherit;overflow-x:hidden}.mat-mdc-standard-chip .mdc-evolution-chip__action--primary::before{border-width:var(--mat-chip-outline-width, 1px);border-radius:var(--mat-chip-container-shape-radius, 8px);box-sizing:border-box;content:\"\";height:100%;left:0;position:absolute;pointer-events:none;top:0;width:100%;z-index:1;border-style:solid}.mat-mdc-standard-chip .mdc-evolution-chip__action--primary{padding-left:12px;padding-right:12px}.mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__action--primary{padding-left:0;padding-right:12px}[dir=rtl] .mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__action--primary{padding-left:12px;padding-right:0}.mat-mdc-standard-chip:not(.mdc-evolution-chip--disabled) .mdc-evolution-chip__action--primary::before{border-color:var(--mat-chip-outline-color, var(--mat-sys-outline))}.mdc-evolution-chip__action--primary:not(.mdc-evolution-chip__action--presentational):not(.mdc-ripple-upgraded):focus::before{border-color:var(--mat-chip-focus-outline-color, var(--mat-sys-on-surface-variant))}.mat-mdc-standard-chip.mdc-evolution-chip--disabled .mdc-evolution-chip__action--primary::before{border-color:var(--mat-chip-disabled-outline-color, color-mix(in srgb, var(--mat-sys-on-surface) 12%, transparent))}.mat-mdc-standard-chip.mdc-evolution-chip--selected .mdc-evolution-chip__action--primary::before{border-width:var(--mat-chip-flat-selected-outline-width, 0)}.mat-mdc-basic-chip .mdc-evolution-chip__action--primary{font:inherit}.mat-mdc-standard-chip.mdc-evolution-chip--with-leading-action .mdc-evolution-chip__action--primary{padding-left:0;padding-right:12px}[dir=rtl] .mat-mdc-standard-chip.mdc-evolution-chip--with-leading-action .mdc-evolution-chip__action--primary{padding-left:12px;padding-right:0}.mat-mdc-standard-chip.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--primary{padding-left:12px;padding-right:0}[dir=rtl] .mat-mdc-standard-chip.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--primary{padding-left:0;padding-right:12px}.mat-mdc-standard-chip.mdc-evolution-chip--with-leading-action.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--primary{padding-left:0;padding-right:0}.mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--primary{padding-left:0;padding-right:0}[dir=rtl] .mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--primary{padding-left:0;padding-right:0}.mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__action--primary{padding-left:0;padding-right:12px}[dir=rtl] .mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__action--primary{padding-left:12px;padding-right:0}.mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--primary{padding-left:0;padding-right:0}[dir=rtl] .mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--primary{padding-left:0;padding-right:0}.mdc-evolution-chip__action--secondary{position:relative;overflow:visible}.mat-mdc-standard-chip:not(.mdc-evolution-chip--disabled) .mdc-evolution-chip__action--secondary{color:var(--mat-chip-with-trailing-icon-trailing-icon-color, var(--mat-sys-on-surface-variant))}.mat-mdc-standard-chip.mdc-evolution-chip--disabled .mdc-evolution-chip__action--secondary{color:var(--mat-chip-with-trailing-icon-disabled-trailing-icon-color, var(--mat-sys-on-surface))}.mat-mdc-standard-chip.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--secondary{padding-left:8px;padding-right:8px}.mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--secondary{padding-left:8px;padding-right:8px}.mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--secondary{padding-left:8px;padding-right:8px}[dir=rtl] .mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--secondary{padding-left:8px;padding-right:8px}.mdc-evolution-chip__text-label{-webkit-user-select:none;user-select:none;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.mat-mdc-standard-chip .mdc-evolution-chip__text-label{font-family:var(--mat-chip-label-text-font, var(--mat-sys-label-large-font));line-height:var(--mat-chip-label-text-line-height, var(--mat-sys-label-large-line-height));font-size:var(--mat-chip-label-text-size, var(--mat-sys-label-large-size));font-weight:var(--mat-chip-label-text-weight, var(--mat-sys-label-large-weight));letter-spacing:var(--mat-chip-label-text-tracking, var(--mat-sys-label-large-tracking))}.mat-mdc-standard-chip:not(.mdc-evolution-chip--disabled) .mdc-evolution-chip__text-label{color:var(--mat-chip-label-text-color, var(--mat-sys-on-surface-variant))}.mat-mdc-standard-chip.mdc-evolution-chip--selected:not(.mdc-evolution-chip--disabled) .mdc-evolution-chip__text-label{color:var(--mat-chip-selected-label-text-color, var(--mat-sys-on-secondary-container))}.mat-mdc-standard-chip.mdc-evolution-chip--disabled .mdc-evolution-chip__text-label,.mat-mdc-standard-chip.mdc-evolution-chip--selected.mdc-evolution-chip--disabled .mdc-evolution-chip__text-label{color:var(--mat-chip-disabled-label-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mdc-evolution-chip__graphic{align-items:center;display:inline-flex;justify-content:center;overflow:hidden;pointer-events:none;position:relative;flex:1 0 auto}.mat-mdc-standard-chip .mdc-evolution-chip__graphic{width:var(--mat-chip-with-avatar-avatar-size, 24px);height:var(--mat-chip-with-avatar-avatar-size, 24px);font-size:var(--mat-chip-with-avatar-avatar-size, 24px)}.mdc-evolution-chip--selecting .mdc-evolution-chip__graphic{transition:width 150ms 0ms cubic-bezier(0.4, 0, 0.2, 1)}.mdc-evolution-chip--selectable:not(.mdc-evolution-chip--selected):not(.mdc-evolution-chip--with-primary-icon) .mdc-evolution-chip__graphic{width:0}.mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__graphic{padding-left:6px;padding-right:6px}.mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__graphic{padding-left:4px;padding-right:8px}[dir=rtl] .mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__graphic{padding-left:8px;padding-right:4px}.mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__graphic{padding-left:6px;padding-right:6px}.mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__graphic{padding-left:4px;padding-right:8px}[dir=rtl] .mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__graphic{padding-left:8px;padding-right:4px}.mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-leading-action .mdc-evolution-chip__graphic{padding-left:0}.mdc-evolution-chip__checkmark{position:absolute;opacity:0;top:50%;left:50%;height:20px;width:20px}.mat-mdc-standard-chip:not(.mdc-evolution-chip--disabled) .mdc-evolution-chip__checkmark{color:var(--mat-chip-with-icon-selected-icon-color, var(--mat-sys-on-secondary-container))}.mat-mdc-standard-chip.mdc-evolution-chip--disabled .mdc-evolution-chip__checkmark{color:var(--mat-chip-with-icon-disabled-icon-color, var(--mat-sys-on-surface))}.mdc-evolution-chip--selecting .mdc-evolution-chip__checkmark{transition:transform 150ms 0ms cubic-bezier(0.4, 0, 0.2, 1);transform:translate(-75%, -50%)}.mdc-evolution-chip--selected .mdc-evolution-chip__checkmark{transform:translate(-50%, -50%);opacity:1}.mdc-evolution-chip__checkmark-svg{display:block}.mdc-evolution-chip__checkmark-path{stroke-width:2px;stroke-dasharray:29.7833385;stroke-dashoffset:29.7833385;stroke:currentColor}.mdc-evolution-chip--selecting .mdc-evolution-chip__checkmark-path{transition:stroke-dashoffset 150ms 45ms cubic-bezier(0.4, 0, 0.2, 1)}.mdc-evolution-chip--selected .mdc-evolution-chip__checkmark-path{stroke-dashoffset:0}@media(forced-colors: active){.mdc-evolution-chip__checkmark-path{stroke:CanvasText !important}}.mat-mdc-standard-chip .mdc-evolution-chip__icon--trailing{height:18px;width:18px;font-size:18px}.mdc-evolution-chip--disabled .mdc-evolution-chip__icon--trailing.mat-mdc-chip-remove{opacity:calc(var(--mat-chip-trailing-action-opacity, 1)*var(--mat-chip-with-trailing-icon-disabled-trailing-icon-opacity, 0.38))}.mdc-evolution-chip--disabled .mdc-evolution-chip__icon--trailing.mat-mdc-chip-remove:focus{opacity:calc(var(--mat-chip-trailing-action-focus-opacity, 1)*var(--mat-chip-with-trailing-icon-disabled-trailing-icon-opacity, 0.38))}.mat-mdc-standard-chip{border-radius:var(--mat-chip-container-shape-radius, 8px);height:var(--mat-chip-container-height, 32px)}.mat-mdc-standard-chip:not(.mdc-evolution-chip--disabled){background-color:var(--mat-chip-elevated-container-color, transparent)}.mat-mdc-standard-chip.mdc-evolution-chip--disabled{background-color:var(--mat-chip-elevated-disabled-container-color)}.mat-mdc-standard-chip.mdc-evolution-chip--selected:not(.mdc-evolution-chip--disabled){background-color:var(--mat-chip-elevated-selected-container-color, var(--mat-sys-secondary-container))}.mat-mdc-standard-chip.mdc-evolution-chip--selected.mdc-evolution-chip--disabled{background-color:var(--mat-chip-flat-disabled-selected-container-color, color-mix(in srgb, var(--mat-sys-on-surface) 12%, transparent))}@media(forced-colors: active){.mat-mdc-standard-chip{outline:solid 1px}}.mat-mdc-standard-chip .mdc-evolution-chip__icon--primary{border-radius:var(--mat-chip-with-avatar-avatar-shape-radius, 24px);width:var(--mat-chip-with-icon-icon-size, 18px);height:var(--mat-chip-with-icon-icon-size, 18px);font-size:var(--mat-chip-with-icon-icon-size, 18px)}.mdc-evolution-chip--selected .mdc-evolution-chip__icon--primary{opacity:0}.mat-mdc-standard-chip:not(.mdc-evolution-chip--disabled) .mdc-evolution-chip__icon--primary{color:var(--mat-chip-with-icon-icon-color, var(--mat-sys-on-surface-variant))}.mat-mdc-standard-chip.mdc-evolution-chip--disabled .mdc-evolution-chip__icon--primary{color:var(--mat-chip-with-icon-disabled-icon-color, var(--mat-sys-on-surface))}.mat-mdc-chip-highlighted{--mat-chip-with-icon-icon-color: var(--mat-chip-with-icon-selected-icon-color, var(--mat-sys-on-secondary-container));--mat-chip-elevated-container-color: var(--mat-chip-elevated-selected-container-color, var(--mat-sys-secondary-container));--mat-chip-label-text-color: var(--mat-chip-selected-label-text-color, var(--mat-sys-on-secondary-container));--mat-chip-outline-width: var(--mat-chip-flat-selected-outline-width, 0)}.mat-mdc-chip-focus-overlay{background:var(--mat-chip-focus-state-layer-color, var(--mat-sys-on-surface-variant))}.mat-mdc-chip-selected .mat-mdc-chip-focus-overlay,.mat-mdc-chip-highlighted .mat-mdc-chip-focus-overlay{background:var(--mat-chip-selected-focus-state-layer-color, var(--mat-sys-on-secondary-container))}.mat-mdc-chip:hover .mat-mdc-chip-focus-overlay{background:var(--mat-chip-hover-state-layer-color, var(--mat-sys-on-surface-variant));opacity:var(--mat-chip-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-chip-focus-overlay .mat-mdc-chip-selected:hover,.mat-mdc-chip-highlighted:hover .mat-mdc-chip-focus-overlay{background:var(--mat-chip-selected-hover-state-layer-color, var(--mat-sys-on-secondary-container));opacity:var(--mat-chip-selected-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-chip.cdk-focused .mat-mdc-chip-focus-overlay{background:var(--mat-chip-focus-state-layer-color, var(--mat-sys-on-surface-variant));opacity:var(--mat-chip-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mat-mdc-chip-selected.cdk-focused .mat-mdc-chip-focus-overlay,.mat-mdc-chip-highlighted.cdk-focused .mat-mdc-chip-focus-overlay{background:var(--mat-chip-selected-focus-state-layer-color, var(--mat-sys-on-secondary-container));opacity:var(--mat-chip-selected-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mdc-evolution-chip--disabled:not(.mdc-evolution-chip--selected) .mat-mdc-chip-avatar{opacity:var(--mat-chip-with-avatar-disabled-avatar-opacity, 0.38)}.mdc-evolution-chip--disabled .mdc-evolution-chip__icon--trailing{opacity:var(--mat-chip-with-trailing-icon-disabled-trailing-icon-opacity, 0.38)}.mdc-evolution-chip--disabled.mdc-evolution-chip--selected .mdc-evolution-chip__checkmark{opacity:var(--mat-chip-with-icon-disabled-icon-opacity, 0.38)}.mat-mdc-standard-chip.mdc-evolution-chip--disabled{opacity:var(--mat-chip-disabled-container-opacity, 1)}.mat-mdc-standard-chip.mdc-evolution-chip--selected .mdc-evolution-chip__icon--trailing,.mat-mdc-standard-chip.mat-mdc-chip-highlighted .mdc-evolution-chip__icon--trailing{color:var(--mat-chip-selected-trailing-icon-color, var(--mat-sys-on-secondary-container))}.mat-mdc-standard-chip.mdc-evolution-chip--selected.mdc-evolution-chip--disabled .mdc-evolution-chip__icon--trailing,.mat-mdc-standard-chip.mat-mdc-chip-highlighted.mdc-evolution-chip--disabled .mdc-evolution-chip__icon--trailing{color:var(--mat-chip-selected-disabled-trailing-icon-color, var(--mat-sys-on-surface))}.mat-mdc-chip-edit,.mat-mdc-chip-remove{opacity:var(--mat-chip-trailing-action-opacity, 1)}.mat-mdc-chip-edit:focus,.mat-mdc-chip-remove:focus{opacity:var(--mat-chip-trailing-action-focus-opacity, 1)}.mat-mdc-chip-edit::after,.mat-mdc-chip-remove::after{background-color:var(--mat-chip-trailing-action-state-layer-color, var(--mat-sys-on-surface-variant))}.mat-mdc-chip-edit:hover::after,.mat-mdc-chip-remove:hover::after{opacity:calc(var(--mat-chip-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity)) + var(--mat-chip-trailing-action-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity)))}.mat-mdc-chip-edit:focus::after,.mat-mdc-chip-remove:focus::after{opacity:calc(var(--mat-chip-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity)) + var(--mat-chip-trailing-action-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity)))}.mat-mdc-chip-selected .mat-mdc-chip-remove::after,.mat-mdc-chip-highlighted .mat-mdc-chip-remove::after{background-color:var(--mat-chip-selected-trailing-action-state-layer-color, var(--mat-sys-on-secondary-container))}.mat-mdc-chip.cdk-focused .mat-mdc-chip-edit:focus::after,.mat-mdc-chip.cdk-focused .mat-mdc-chip-remove:focus::after{opacity:calc(var(--mat-chip-selected-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity)) + var(--mat-chip-trailing-action-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity)))}.mat-mdc-chip.cdk-focused .mat-mdc-chip-edit:hover::after,.mat-mdc-chip.cdk-focused .mat-mdc-chip-remove:hover::after{opacity:calc(var(--mat-chip-selected-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity)) + var(--mat-chip-trailing-action-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity)))}.mat-mdc-standard-chip{-webkit-tap-highlight-color:rgba(0,0,0,0)}.mat-mdc-standard-chip .mat-mdc-chip-graphic,.mat-mdc-standard-chip .mat-mdc-chip-trailing-icon{box-sizing:content-box}.mat-mdc-standard-chip._mat-animation-noopable,.mat-mdc-standard-chip._mat-animation-noopable .mdc-evolution-chip__graphic,.mat-mdc-standard-chip._mat-animation-noopable .mdc-evolution-chip__checkmark,.mat-mdc-standard-chip._mat-animation-noopable .mdc-evolution-chip__checkmark-path{transition-duration:1ms;animation-duration:1ms}.mat-mdc-chip-focus-overlay{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none;opacity:0;border-radius:inherit;transition:opacity 150ms linear}._mat-animation-noopable .mat-mdc-chip-focus-overlay{transition:none}.mat-mdc-basic-chip .mat-mdc-chip-focus-overlay{display:none}.mat-mdc-chip .mat-ripple.mat-mdc-chip-ripple{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none;border-radius:inherit}.mat-mdc-chip-avatar{text-align:center;line-height:1;color:var(--mat-chip-with-icon-icon-color, currentColor)}.mat-mdc-chip{position:relative;z-index:0}.mat-mdc-chip-action-label{text-align:left;z-index:1}[dir=rtl] .mat-mdc-chip-action-label{text-align:right}.mat-mdc-chip.mdc-evolution-chip--with-trailing-action .mat-mdc-chip-action-label{position:relative}.mat-mdc-chip-action-label .mat-mdc-chip-primary-focus-indicator{position:absolute;top:0;right:0;bottom:0;left:0;pointer-events:none}.mat-mdc-chip-action-label .mat-focus-indicator::before{margin:calc(calc(var(--mat-focus-indicator-border-width, 3px) + 2px)*-1)}.mat-mdc-chip-edit::before,.mat-mdc-chip-remove::before{margin:calc(var(--mat-focus-indicator-border-width, 3px)*-1);left:8px;right:8px}.mat-mdc-chip-edit::after,.mat-mdc-chip-remove::after{content:\"\";display:block;opacity:0;position:absolute;top:-3px;bottom:-3px;left:5px;right:5px;border-radius:50%;box-sizing:border-box;padding:12px;margin:-12px;background-clip:content-box}.mat-mdc-chip-edit .mat-icon,.mat-mdc-chip-remove .mat-icon{width:18px;height:18px;font-size:18px;box-sizing:content-box}.mat-chip-edit-input{cursor:text;display:inline-block;color:inherit;outline:0}@media(forced-colors: active){.mat-mdc-chip-selected:not(.mat-mdc-chip-multiple){outline-width:3px}}.mat-mdc-chip-action:focus-visible .mat-focus-indicator::before{content:\"\"}.mdc-evolution-chip__icon,.mat-mdc-chip-edit .mat-icon,.mat-mdc-chip-remove .mat-icon{min-height:fit-content}img.mdc-evolution-chip__icon{min-height:0}\n`],encapsulation:2,changeDetection:0})}return t})();var fN=(()=>{class t extends yu{_defaultOptions=h(EN,{optional:!0});chipListSelectable=!0;_chipListMultiple=!1;_chipListHideSingleSelectionIndicator=this._defaultOptions?.hideSingleSelectionIndicator??!1;get selectable(){return this._selectable&&this.chipListSelectable}set selectable(A){this._selectable=A,this._changeDetectorRef.markForCheck()}_selectable=!0;get selected(){return this._selected}set selected(A){this._setSelectedState(A,!1,!0)}_selected=!1;get ariaSelected(){return this.selectable?this.selected.toString():null}basicChipAttrName=\"mat-basic-chip-option\";selectionChange=new WA;ngOnInit(){super.ngOnInit(),this.role=\"presentation\"}select(){this._setSelectedState(!0,!1,!0)}deselect(){this._setSelectedState(!1,!1,!0)}selectViaInteraction(){this._setSelectedState(!0,!0,!0)}toggleSelected(A=!1){return this._setSelectedState(!this.selected,A,!0),this.selected}_handlePrimaryActionInteraction(){this.disabled||(this.focus(),this.selectable&&this.toggleSelected(!0))}_hasLeadingGraphic(){return this.leadingIcon?!0:!this._chipListHideSingleSelectionIndicator||this._chipListMultiple}_setSelectedState(A,i,n){A!==this.selected&&(this._selected=A,n&&this.selectionChange.emit({source:this,isUserInput:i,selected:this.selected}),this._changeDetectorRef.markForCheck())}static \\u0275fac=(()=>{let A;return function(n){return(A||(A=hi(t)))(n||t)}})();static \\u0275cmp=kA({type:t,selectors:[[\"mat-basic-chip-option\"],[\"\",\"mat-basic-chip-option\",\"\"],[\"mat-chip-option\"],[\"\",\"mat-chip-option\",\"\"]],hostAttrs:[1,\"mat-mdc-chip\",\"mat-mdc-chip-option\"],hostVars:37,hostBindings:function(i,n){i&2&&(Bo(\"id\",n.id),ie(\"tabindex\",null)(\"aria-label\",null)(\"aria-description\",null)(\"role\",n.role),ae(\"mdc-evolution-chip\",!n._isBasicChip)(\"mdc-evolution-chip--filter\",!n._isBasicChip)(\"mdc-evolution-chip--selectable\",!n._isBasicChip)(\"mat-mdc-chip-selected\",n.selected)(\"mat-mdc-chip-multiple\",n._chipListMultiple)(\"mat-mdc-chip-disabled\",n.disabled)(\"mat-mdc-chip-with-avatar\",n.leadingIcon)(\"mdc-evolution-chip--disabled\",n.disabled)(\"mdc-evolution-chip--selected\",n.selected)(\"mdc-evolution-chip--selecting\",!n._animationsDisabled)(\"mdc-evolution-chip--with-trailing-action\",n._hasTrailingIcon())(\"mdc-evolution-chip--with-primary-icon\",n.leadingIcon)(\"mdc-evolution-chip--with-primary-graphic\",n._hasLeadingGraphic())(\"mdc-evolution-chip--with-avatar\",n.leadingIcon)(\"mat-mdc-chip-highlighted\",n.highlighted)(\"mat-mdc-chip-with-trailing-icon\",n._hasTrailingIcon()))},inputs:{selectable:[2,\"selectable\",\"selectable\",he],selected:[2,\"selected\",\"selected\",he]},outputs:{selectionChange:\"selectionChange\"},features:[It([{provide:yu,useExisting:t},{provide:hN,useExisting:t}]),Ct],ngContentSelectors:x$,decls:8,vars:6,consts:[[1,\"mat-mdc-chip-focus-overlay\"],[1,\"mdc-evolution-chip__cell\",\"mdc-evolution-chip__cell--primary\"],[\"matChipAction\",\"\",\"role\",\"option\",3,\"_allowFocusWhenDisabled\"],[1,\"mdc-evolution-chip__graphic\",\"mat-mdc-chip-graphic\"],[1,\"mdc-evolution-chip__text-label\",\"mat-mdc-chip-action-label\"],[1,\"mat-mdc-chip-primary-focus-indicator\",\"mat-focus-indicator\"],[1,\"mdc-evolution-chip__cell\",\"mdc-evolution-chip__cell--trailing\"],[1,\"mdc-evolution-chip__checkmark\"],[\"viewBox\",\"-2 -3 30 30\",\"focusable\",\"false\",\"aria-hidden\",\"true\",1,\"mdc-evolution-chip__checkmark-svg\"],[\"fill\",\"none\",\"stroke\",\"currentColor\",\"d\",\"M1.73,12.91 8.1,19.28 22.79,4.59\",1,\"mdc-evolution-chip__checkmark-path\"]],template:function(i,n){i&1&&(Yt(S$),GA(0,\"span\",0),m(1,\"span\",1)(2,\"button\",2),V(3,pyA,5,0,\"span\",3),m(4,\"span\",4),He(5),GA(6,\"span\",5),D()()(),V(7,DyA,2,0,\"span\",6)),i&2&&(p(2),X(\"_allowFocusWhenDisabled\",!0),ie(\"aria-description\",n.ariaDescription)(\"aria-label\",n.ariaLabel)(\"aria-selected\",n.ariaSelected),p(),W(n._hasLeadingGraphic()?3:-1),p(4),W(n._hasTrailingIcon()?7:-1))},dependencies:[uN],styles:[wyA],encapsulation:2,changeDetection:0})}return t})();var mN=(()=>{class t{_elementRef=h(ge);_changeDetectorRef=h(ft);_dir=h(wo,{optional:!0});_lastDestroyedFocusedChipIndex=null;_keyManager;_destroyed=new $A;_defaultRole=\"presentation\";get chipFocusChanges(){return this._getChipStream(A=>A._onFocus)}get chipDestroyedChanges(){return this._getChipStream(A=>A.destroyed)}get chipRemovedChanges(){return this._getChipStream(A=>A.removed)}get disabled(){return this._disabled}set disabled(A){this._disabled=A,this._syncChipsState()}_disabled=!1;get empty(){return!this._chips||this._chips.length===0}get role(){return this._explicitRole?this._explicitRole:this.empty?null:this._defaultRole}tabIndex=0;set role(A){this._explicitRole=A}_explicitRole=null;get focused(){return this._hasFocusedChip()}_chips;_chipActions=new Sg;constructor(){}ngAfterViewInit(){this._setUpFocusManagement(),this._trackChipSetChanges(),this._trackDestroyedFocusedChip()}ngOnDestroy(){this._keyManager?.destroy(),this._chipActions.destroy(),this._destroyed.next(),this._destroyed.complete()}_hasFocusedChip(){return this._chips&&this._chips.some(A=>A._hasFocus())}_syncChipsState(){this._chips?.forEach(A=>{A._chipListDisabled=this._disabled,A._changeDetectorRef.markForCheck()})}focus(){}_handleKeydown(A){this._originatesFromChip(A)&&this._keyManager.onKeydown(A)}_isValidIndex(A){return A>=0&&A<this._chips.length}_allowFocusEscape(){let A=this._elementRef.nativeElement.tabIndex;A!==-1&&(this._elementRef.nativeElement.tabIndex=-1,setTimeout(()=>this._elementRef.nativeElement.tabIndex=A))}_getChipStream(A){return this._chips.changes.pipe(nn(null),Ei(()=>Qi(...this._chips.map(A))))}_originatesFromChip(A){let i=A.target;for(;i&&i!==this._elementRef.nativeElement;){if(i.classList.contains(\"mat-mdc-chip\"))return!0;i=i.parentElement}return!1}_setUpFocusManagement(){this._chips.changes.pipe(nn(this._chips)).subscribe(A=>{let i=[];A.forEach(n=>n._getActions().forEach(o=>i.push(o))),this._chipActions.reset(i),this._chipActions.notifyOnChanges()}),this._keyManager=new Mc(this._chipActions).withVerticalOrientation().withHorizontalOrientation(this._dir?this._dir.value:\"ltr\").withHomeAndEnd().skipPredicate(A=>this._skipPredicate(A)),this.chipFocusChanges.pipe(Bt(this._destroyed)).subscribe(({chip:A})=>{let i=A._getSourceAction(document.activeElement);i&&this._keyManager.updateActiveItem(i)}),this._dir?.change.pipe(Bt(this._destroyed)).subscribe(A=>this._keyManager.withHorizontalOrientation(A))}_skipPredicate(A){return A.disabled}_trackChipSetChanges(){this._chips.changes.pipe(nn(null),Bt(this._destroyed)).subscribe(()=>{this.disabled&&Promise.resolve().then(()=>this._syncChipsState()),this._redirectDestroyedChipFocus()})}_trackDestroyedFocusedChip(){this.chipDestroyedChanges.pipe(Bt(this._destroyed)).subscribe(A=>{let n=this._chips.toArray().indexOf(A.chip),o=A.chip._hasFocus(),a=A.chip._hadFocusOnRemove&&this._keyManager.activeItem&&A.chip._getActions().includes(this._keyManager.activeItem),r=o||a;this._isValidIndex(n)&&r&&(this._lastDestroyedFocusedChipIndex=n)})}_redirectDestroyedChipFocus(){if(this._lastDestroyedFocusedChipIndex!=null){if(this._chips.length){let A=Math.min(this._lastDestroyedFocusedChipIndex,this._chips.length-1),i=this._chips.toArray()[A];i.disabled?this._chips.length===1?this.focus():this._keyManager.setPreviousItemActive():i.focus()}else this.focus();this._lastDestroyedFocusedChipIndex=null}}static \\u0275fac=function(i){return new(i||t)};static \\u0275cmp=kA({type:t,selectors:[[\"mat-chip-set\"]],contentQueries:function(i,n,o){if(i&1&&na(o,yu,5),i&2){let a;Ce(a=Ie())&&(n._chips=a)}},hostAttrs:[1,\"mat-mdc-chip-set\",\"mdc-evolution-chip-set\"],hostVars:1,hostBindings:function(i,n){i&1&&$(\"keydown\",function(a){return n._handleKeydown(a)}),i&2&&ie(\"role\",n.role)},inputs:{disabled:[2,\"disabled\",\"disabled\",he],role:\"role\",tabIndex:[2,\"tabIndex\",\"tabIndex\",A=>A==null?0:Zi(A)]},ngContentSelectors:R$,decls:2,vars:0,consts:[[\"role\",\"presentation\",1,\"mdc-evolution-chip-set__chips\"]],template:function(i,n){i&1&&(Yt(),ti(0,\"div\",0),He(1),Ii())},styles:[`.mat-mdc-chip-set{display:flex}.mat-mdc-chip-set:focus{outline:none}.mat-mdc-chip-set .mdc-evolution-chip-set__chips{min-width:100%;margin-left:-8px;margin-right:0}.mat-mdc-chip-set .mdc-evolution-chip{margin:4px 0 4px 8px}[dir=rtl] .mat-mdc-chip-set .mdc-evolution-chip-set__chips{margin-left:0;margin-right:-8px}[dir=rtl] .mat-mdc-chip-set .mdc-evolution-chip{margin-left:0;margin-right:8px}.mdc-evolution-chip-set__chips{display:flex;flex-flow:wrap;min-width:0}.mat-mdc-chip-set-stacked{flex-direction:column;align-items:flex-start}.mat-mdc-chip-set-stacked .mat-mdc-chip{width:100%}.mat-mdc-chip-set-stacked .mdc-evolution-chip__graphic{flex-grow:0}.mat-mdc-chip-set-stacked .mdc-evolution-chip__action--primary{flex-basis:100%;justify-content:start}input.mat-mdc-chip-input{flex:1 0 150px;margin-left:8px}[dir=rtl] input.mat-mdc-chip-input{margin-left:0;margin-right:8px}.mat-mdc-form-field:not(.mat-form-field-hide-placeholder) input.mat-mdc-chip-input::placeholder{opacity:1}.mat-mdc-form-field:not(.mat-form-field-hide-placeholder) input.mat-mdc-chip-input::-moz-placeholder{opacity:1}.mat-mdc-form-field:not(.mat-form-field-hide-placeholder) input.mat-mdc-chip-input::-webkit-input-placeholder{opacity:1}.mat-mdc-form-field:not(.mat-form-field-hide-placeholder) input.mat-mdc-chip-input:-ms-input-placeholder{opacity:1}.mat-mdc-chip-set+input.mat-mdc-chip-input{margin-left:0;margin-right:0}\n`],encapsulation:2,changeDetection:0})}return t})(),QN=class{source;value;constructor(e,A){this.source=e,this.value=A}},vyA={provide:gg,useExisting:ar(()=>pN),multi:!0},pN=(()=>{class t extends mN{_onTouched=()=>{};_onChange=()=>{};_defaultRole=\"listbox\";_defaultOptions=h(EN,{optional:!0});get multiple(){return this._multiple}set multiple(A){this._multiple=A,this._syncListboxProperties()}_multiple=!1;get selected(){let A=this._chips.toArray().filter(i=>i.selected);return this.multiple?A:A[0]}ariaOrientation=\"horizontal\";get selectable(){return this._selectable}set selectable(A){this._selectable=A,this._syncListboxProperties()}_selectable=!0;compareWith=(A,i)=>A===i;required=!1;get hideSingleSelectionIndicator(){return this._hideSingleSelectionIndicator}set hideSingleSelectionIndicator(A){this._hideSingleSelectionIndicator=A,this._syncListboxProperties()}_hideSingleSelectionIndicator=this._defaultOptions?.hideSingleSelectionIndicator??!1;get chipSelectionChanges(){return this._getChipStream(A=>A.selectionChange)}get chipBlurChanges(){return this._getChipStream(A=>A._onBlur)}get value(){return this._value}set value(A){this._chips&&this._chips.length&&this._setSelectionByValue(A,!1),this._value=A}_value;change=new WA;_chips=void 0;ngAfterContentInit(){this._chips.changes.pipe(nn(null),Bt(this._destroyed)).subscribe(()=>{this.value!==void 0&&Promise.resolve().then(()=>{this._setSelectionByValue(this.value,!1)}),this._syncListboxProperties()}),this.chipBlurChanges.pipe(Bt(this._destroyed)).subscribe(()=>this._blur()),this.chipSelectionChanges.pipe(Bt(this._destroyed)).subscribe(A=>{this.multiple||this._chips.forEach(i=>{i!==A.source&&i._setSelectedState(!1,!1,!1)}),A.isUserInput&&this._propagateChanges()})}focus(){if(this.disabled)return;let A=this._getFirstSelectedChip();A&&!A.disabled?A.focus():this._chips.length>0?this._keyManager.setFirstItemActive():this._elementRef.nativeElement.focus()}writeValue(A){A!=null?this.value=A:this.value=void 0}registerOnChange(A){this._onChange=A}registerOnTouched(A){this._onTouched=A}setDisabledState(A){this.disabled=A}_setSelectionByValue(A,i=!0){this._clearSelection(),Array.isArray(A)?A.forEach(n=>this._selectValue(n,i)):this._selectValue(A,i)}_blur(){this.disabled||setTimeout(()=>{this.focused||this._markAsTouched()})}_keydown(A){A.keyCode===9&&super._allowFocusEscape()}_markAsTouched(){this._onTouched(),this._changeDetectorRef.markForCheck()}_propagateChanges(){let A=null;Array.isArray(this.selected)?A=this.selected.map(i=>i.value):A=this.selected?this.selected.value:void 0,this._value=A,this.change.emit(new QN(this,A)),this._onChange(A),this._changeDetectorRef.markForCheck()}_clearSelection(A){this._chips.forEach(i=>{i!==A&&i.deselect()})}_selectValue(A,i){let n=this._chips.find(o=>o.value!=null&&this.compareWith(o.value,A));return n&&(i?n.selectViaInteraction():n.select()),n}_syncListboxProperties(){this._chips&&Promise.resolve().then(()=>{this._chips.forEach(A=>{A._chipListMultiple=this.multiple,A.chipListSelectable=this._selectable,A._chipListHideSingleSelectionIndicator=this.hideSingleSelectionIndicator,A._changeDetectorRef.markForCheck()})})}_getFirstSelectedChip(){return Array.isArray(this.selected)?this.selected.length?this.selected[0]:void 0:this.selected}_skipPredicate(A){return!1}static \\u0275fac=(()=>{let A;return function(n){return(A||(A=hi(t)))(n||t)}})();static \\u0275cmp=kA({type:t,selectors:[[\"mat-chip-listbox\"]],contentQueries:function(i,n,o){if(i&1&&na(o,fN,5),i&2){let a;Ce(a=Ie())&&(n._chips=a)}},hostAttrs:[1,\"mdc-evolution-chip-set\",\"mat-mdc-chip-listbox\"],hostVars:10,hostBindings:function(i,n){i&1&&$(\"focus\",function(){return n.focus()})(\"blur\",function(){return n._blur()})(\"keydown\",function(a){return n._keydown(a)}),i&2&&(Bo(\"tabIndex\",n.disabled||n.empty?-1:n.tabIndex),ie(\"role\",n.role)(\"aria-required\",n.role?n.required:null)(\"aria-disabled\",n.disabled.toString())(\"aria-multiselectable\",n.multiple)(\"aria-orientation\",n.ariaOrientation),ae(\"mat-mdc-chip-list-disabled\",n.disabled)(\"mat-mdc-chip-list-required\",n.required))},inputs:{multiple:[2,\"multiple\",\"multiple\",he],ariaOrientation:[0,\"aria-orientation\",\"ariaOrientation\"],selectable:[2,\"selectable\",\"selectable\",he],compareWith:\"compareWith\",required:[2,\"required\",\"required\",he],hideSingleSelectionIndicator:[2,\"hideSingleSelectionIndicator\",\"hideSingleSelectionIndicator\",he],value:\"value\"},outputs:{change:\"change\"},features:[It([vyA]),Ct],ngContentSelectors:R$,decls:2,vars:0,consts:[[\"role\",\"presentation\",1,\"mdc-evolution-chip-set__chips\"]],template:function(i,n){i&1&&(Yt(),ti(0,\"div\",0),He(1),Ii())},styles:[yyA],encapsulation:2,changeDetection:0})}return t})();var sw=(()=>{class t{static \\u0275fac=function(i){return new(i||t)};static \\u0275mod=Xe({type:t});static \\u0275inj=Ze({providers:[Gd,{provide:EN,useValue:{separatorKeyCodes:[13]}}],imports:[YC,Fi]})}return t})();var gw=new wA(\"ThemeService\");var mE=class t{themeService=h(gw);get currentTheme(){return this.themeService.currentTheme()}get themeIcon(){return this.currentTheme===\"light\"?\"dark_mode\":\"light_mode\"}get themeTooltip(){return this.currentTheme===\"light\"?\"Switch to dark mode\":\"Switch to light mode\"}toggleTheme(){this.themeService.toggleTheme()}static \\u0275fac=function(A){return new(A||t)};static \\u0275cmp=kA({type:t,selectors:[[\"app-theme-toggle\"]],decls:3,vars:2,consts:[[\"mat-icon-button\",\"\",\"aria-label\",\"Toggle theme\",1,\"theme-toggle-button\",3,\"click\",\"matTooltip\"]],template:function(A,i){A&1&&(m(0,\"button\",0),$(\"click\",function(){return i.toggleTheme()}),m(1,\"mat-icon\"),K(2),D()()),A&2&&(X(\"matTooltip\",i.themeTooltip),p(2),qA(i.themeIcon))},dependencies:[Ug,In,Cs,Ia,WC,Ba],styles:[\".theme-toggle-button[_ngcontent-%COMP%]{color:var(--side-panel-mat-icon-color)}.theme-toggle-button[_ngcontent-%COMP%]:hover{opacity:.8}.builder-mode-action-button[_nghost-%COMP%]   .theme-toggle-button[_ngcontent-%COMP%]{background-color:var(--builder-secondary-background-color);color:var(--builder-text-tertiary-color);border-radius:50%;transition:all .2s ease;margin-right:0!important}.builder-mode-action-button[_nghost-%COMP%]   .theme-toggle-button[_ngcontent-%COMP%]:hover{background-color:var(--builder-hover-background-color);color:var(--builder-text-primary-color);opacity:1}.builder-mode-action-button[_nghost-%COMP%]   .theme-toggle-button[_ngcontent-%COMP%]   mat-icon[_ngcontent-%COMP%]{font-size:20px}\"]})};var G$=(t,e)=>e.name;function byA(t,e){if(t&1&&K(0),t&2){let A=y().$implicit;Fe(\" AgentTool: \",A.name,\" \")}}function MyA(t,e){if(t&1&&K(0),t&2){let A=y().$implicit;Fe(\" \",A.name,\" \")}}function kyA(t,e){t&1&&(m(0,\"mat-icon\",28),K(1,\"chevron_right\"),D())}function SyA(t,e){if(t&1){let A=zA();m(0,\"div\",27),$(\"click\",function(){let n=rA(A).$implicit,o=y(2);return sA(o.selectAgentFromBreadcrumb(n))}),V(1,byA,1,1)(2,MyA,1,1),D(),V(3,kyA,2,0,\"mat-icon\",28)}if(t&2){let A=e.$implicit,i=e.$index,n=y(2);ae(\"current-agent\",(n.currentSelectedAgent==null?null:n.currentSelectedAgent.name)===A.name),p(),W(i===0&&n.isInAgentToolContext()?1:2),p(2),W(i<n.hierarchyPath.length-1?3:-1)}}function xyA(t,e){if(t&1&&(m(0,\"div\",13),Gt(1,SyA,4,4,null,null,G$),D()),t&2){let A=y();p(),Kt(A.hierarchyPath)}}function RyA(t,e){if(t&1&&(m(0,\"mat-option\",34),K(1),D()),t&2){let A=e.$implicit;X(\"value\",A),p(),qA(A)}}function NyA(t,e){if(t&1&&(m(0,\"mat-option\",34),K(1),D()),t&2){let A=e.$implicit;X(\"value\",A),p(),qA(A)}}function FyA(t,e){if(t&1){let A=zA();m(0,\"mat-form-field\")(1,\"mat-label\"),K(2,\"Model\"),D(),m(3,\"mat-select\",36),ao(\"ngModelChange\",function(n){rA(A);let o=y(2);return Vn(o.agentConfig.model,n)||(o.agentConfig.model=n),sA(n)}),Gt(4,NyA,2,2,\"mat-option\",34,Ri),D()()}if(t&2){let A=y(2);p(3),oo(\"ngModel\",A.agentConfig.model),p(),Kt(A.models)}}function LyA(t,e){if(t&1){let A=zA();m(0,\"mat-form-field\")(1,\"mat-label\"),K(2,\"Instructions\"),D(),m(3,\"textarea\",37),ao(\"ngModelChange\",function(n){rA(A);let o=y(2);return Vn(o.agentConfig.instruction,n)||(o.agentConfig.instruction=n),sA(n)}),D()(),m(4,\"mat-form-field\")(5,\"mat-label\"),K(6,\"Description (optional)\"),D(),m(7,\"textarea\",38),ao(\"ngModelChange\",function(n){rA(A);let o=y(2);return Vn(o.agentConfig.description,n)||(o.agentConfig.description=n),sA(n)}),D()()}if(t&2){let A=y(2);p(3),oo(\"ngModel\",A.agentConfig.instruction),p(4),oo(\"ngModel\",A.agentConfig.description)}}function _yA(t,e){if(t&1){let A=zA();m(0,\"mat-form-field\")(1,\"mat-label\"),K(2,\"Max Iteration\"),D(),m(3,\"input\",39),ao(\"ngModelChange\",function(n){rA(A);let o=y(2);return Vn(o.agentConfig.max_iterations,n)||(o.agentConfig.max_iterations=n),sA(n)}),D()()}if(t&2){let A=y(2);p(3),oo(\"ngModel\",A.agentConfig.max_iterations)}}function GyA(t,e){if(t&1){let A=zA();m(0,\"mat-checkbox\",36),ao(\"ngModelChange\",function(n){rA(A);let o=y(2);return Vn(o.agentConfig.skip_summarization,n)||(o.agentConfig.skip_summarization=n),sA(n)}),K(1,\"Skip summarization\"),D()}if(t&2){let A=y(2);oo(\"ngModel\",A.agentConfig.skip_summarization)}}function KyA(t,e){if(t&1){let A=zA();m(0,\"div\",17)(1,\"div\",29)(2,\"mat-form-field\",30)(3,\"mat-label\"),K(4,\"Agent Name\"),D(),m(5,\"input\",31),ao(\"ngModelChange\",function(n){rA(A);let o=y();return Vn(o.agentConfig.name,n)||(o.agentConfig.name=n),sA(n)}),D()(),m(6,\"mat-form-field\",32)(7,\"mat-label\"),K(8,\"Agent Type\"),D(),m(9,\"mat-select\",33),ao(\"ngModelChange\",function(n){rA(A);let o=y();return Vn(o.agentConfig.agent_class,n)||(o.agentConfig.agent_class=n),sA(n)}),Gt(10,RyA,2,2,\"mat-option\",34,Ri),D()()(),V(12,FyA,6,1,\"mat-form-field\"),V(13,LyA,8,2),V(14,_yA,4,1,\"mat-form-field\"),V(15,GyA,2,1,\"mat-checkbox\",35),D()}if(t&2){let A=y();p(5),oo(\"ngModel\",A.agentConfig.name),X(\"disabled\",A.agentConfig.isRoot),p(4),oo(\"ngModel\",A.agentConfig.agent_class),p(),Kt(A.agentTypes),p(2),W(A.agentConfig.agent_class===\"LlmAgent\"?12:-1),p(),W(A.agentConfig.agent_class===\"LlmAgent\"?13:-1),p(),W(A.agentConfig.agent_class===\"LoopAgent\"?14:-1),p(),W(A.agentConfig.isAgentTool?15:-1)}}function UyA(t,e){if(t&1){let A=zA();m(0,\"mat-chip\",43),$(\"click\",function(){let n=rA(A).$implicit,o=y(4);return sA(o.selectTool(n))}),m(1,\"mat-icon\",44),K(2),D(),m(3,\"span\",45),K(4),D(),m(5,\"button\",46),$(\"click\",function(n){let o=rA(A).$implicit,a=y(4);return a.deleteTool(a.agentConfig.name,o),sA(n.stopPropagation())}),m(6,\"mat-icon\"),K(7,\"cancel\"),D()()()}if(t&2){let A=e.$implicit,i=y(4);p(2),qA(i.getToolIcon(A)),p(2),qA(A.name)}}function JyA(t,e){if(t&1&&(m(0,\"div\",20)(1,\"mat-chip-set\",41),Gt(2,UyA,8,2,\"mat-chip\",42,Ri),D()()),t&2){let A=y(),i=y(2);p(2),Kt(A.get(i.agentConfig.name))}}function YyA(t,e){if(t&1&&V(0,JyA,4,0,\"div\",20),t&2){let A=e,i=y(2);W(i.agentConfig&&A.get(i.agentConfig.name)&&A.get(i.agentConfig.name).length>0?0:-1)}}function HyA(t,e){if(t&1){let A=zA();m(0,\"div\",15)(1,\"div\",16)(2,\"div\"),K(3,\" Tools \"),D(),m(4,\"div\")(5,\"button\",40,2)(7,\"mat-icon\"),K(8,\"add\"),D()(),m(9,\"mat-menu\",null,3)(11,\"button\",23),$(\"click\",function(){rA(A);let n=y();return sA(n.addTool(\"Function tool\"))}),m(12,\"span\"),K(13,\"Function tool\"),D()(),m(14,\"button\",23),$(\"click\",function(){rA(A);let n=y();return sA(n.addTool(\"Built-in tool\"))}),m(15,\"span\"),K(16,\"Built-in tool\"),D()(),m(17,\"button\",23),$(\"click\",function(){rA(A);let n=y();return sA(n.createAgentTool())}),m(18,\"span\"),K(19,\"Agent tool\"),D()()()()(),V(20,YyA,1,1),oi(21,\"async\"),D()}if(t&2){let A,i=Wi(10),n=y();p(5),X(\"matMenuTriggerFor\",i),p(6),X(\"matTooltip\",n.toolMenuTooltips(\"Function tool\")),p(3),X(\"matTooltip\",n.toolMenuTooltips(\"Built-in tool\")),p(3),X(\"matTooltip\",n.toolMenuTooltips(\"Agent tool\")),p(3),W((A=li(21,5,n.toolsMap$))?20:-1,A)}}function TyA(t,e){if(t&1){let A=zA();m(0,\"mat-chip\",43),$(\"click\",function(){let n=rA(A).$implicit,o=y(2);return sA(o.selectAgent(n))}),m(1,\"mat-icon\",44),K(2),D(),m(3,\"span\",45),K(4),D(),m(5,\"button\",48),$(\"click\",function(n){let o=rA(A).$implicit;return y(2).deleteSubAgent(o.name),sA(n.stopPropagation())}),m(6,\"mat-icon\"),K(7,\"cancel\"),D()()()}if(t&2){let A=e.$implicit,i=y(2);p(2),qA(i.getAgentIcon(A.agent_class)),p(2),qA(A.name)}}function OyA(t,e){if(t&1&&(m(0,\"div\",20)(1,\"mat-chip-set\",47),Gt(2,TyA,8,2,\"mat-chip\",42,G$),D()()),t&2){let A=y();p(2),Kt(A.agentConfig.sub_agents)}}function zyA(t,e){if(t&1){let A=zA();GA(0,\"mat-divider\"),m(1,\"div\",22),K(2,\"Model (LLM) Interaction\"),D(),m(3,\"button\",23),$(\"click\",function(){rA(A);let n=y();return sA(n.addCallback(\"before_model\"))}),m(4,\"span\"),K(5,\"Before Model\"),D()(),m(6,\"button\",23),$(\"click\",function(){rA(A);let n=y();return sA(n.addCallback(\"after_model\"))}),m(7,\"span\"),K(8,\"After Model\"),D()(),GA(9,\"mat-divider\"),m(10,\"div\",22),K(11,\"Tool Execution\"),D(),m(12,\"button\",23),$(\"click\",function(){rA(A);let n=y();return sA(n.addCallback(\"before_tool\"))}),m(13,\"span\"),K(14,\"Before Tool\"),D()(),m(15,\"button\",23),$(\"click\",function(){rA(A);let n=y();return sA(n.addCallback(\"after_tool\"))}),m(16,\"span\"),K(17,\"After Tool\"),D()()}if(t&2){let A=y();p(3),X(\"matTooltip\",A.callbackMenuTooltips(\"before_model\")),p(3),X(\"matTooltip\",A.callbackMenuTooltips(\"after_model\")),p(6),X(\"matTooltip\",A.callbackMenuTooltips(\"before_tool\")),p(3),X(\"matTooltip\",A.callbackMenuTooltips(\"after_tool\"))}}function PyA(t,e){if(t&1){let A=zA();m(0,\"div\",52),$(\"click\",function(){let n=rA(A).$implicit,o=y(3);return sA(o.editCallback(n))}),m(1,\"mat-chip\",53)(2,\"span\",54)(3,\"span\",55),K(4),D(),m(5,\"span\",56),K(6),D()()(),m(7,\"button\",57),$(\"click\",function(n){let o=rA(A).$implicit,a=y(3);return a.deleteCallback(a.agentConfig.name,o),sA(n.stopPropagation())}),m(8,\"mat-icon\"),K(9,\"remove\"),D()()()}if(t&2){let A=e.$implicit;p(4),qA(A.type),p(2),qA(A.name)}}function jyA(t,e){if(t&1&&(m(0,\"div\",49)(1,\"mat-chip-set\",50),Gt(2,PyA,10,2,\"div\",51,Ri),D()()),t&2){let A=y(),i=y();p(2),Kt(A.get(i.agentConfig.name))}}function qyA(t,e){if(t&1&&V(0,jyA,4,0,\"div\",49),t&2){let A=e,i=y();W(i.agentConfig&&A.get(i.agentConfig.name)&&A.get(i.agentConfig.name).length>0?0:-1)}}var lw=class t{CALLBACKS_TAB_INDEX=3;jsonEditorComponent;appNameInput=\"\";exitBuilderMode=new WA;closePanel=new WA;featureFlagService=h(lr);isAlwaysOnSidePanelEnabledObs=this.featureFlagService.isAlwaysOnSidePanelEnabled();toolArgsString=jA(\"\");editingToolArgs=jA(!1);editingTool=null;selectedTabIndex=0;agentConfig={isRoot:!1,name:\"\",agent_class:\"\",model:\"\",instruction:\"\",sub_agents:[],tools:[],callbacks:[]};hierarchyPath=[];currentSelectedAgent=void 0;isRootAgentEditable=!0;models=[\"gemini-2.5-flash\",\"gemini-2.5-pro\"];agentTypes=[\"LlmAgent\",\"LoopAgent\",\"ParallelAgent\",\"SequentialAgent\"];agentBuilderService=h(Kc);dialog=h(Qs);agentService=h(Ks);snackBar=h(ZC);router=h(qr);cdr=h(ft);selectedTool=void 0;toolAgentName=\"\";toolTypes=[\"Custom tool\",\"Function tool\",\"Built-in tool\",\"Agent Tool\"];editingCallback=null;selectedCallback=void 0;callbackTypes=[\"before_agent\",\"before_model\",\"before_tool\",\"after_tool\",\"after_model\",\"after_agent\"];builtInTools=[\"EnterpriseWebSearchTool\",\"exit_loop\",\"FilesRetrieval\",\"get_user_choice\",\"google_search\",\"load_artifacts\",\"load_memory\",\"LongRunningFunctionTool\",\"preload_memory\",\"url_context\",\"VertexAiRagRetrieval\",\"VertexAiSearchTool\"];builtInToolArgs=new Map([[\"EnterpriseWebSearchTool\",[]],[\"exit_loop\",[]],[\"FilesRetrieval\",[\"name\",\"description\",\"input_dir\"]],[\"get_user_choice\",[]],[\"google_search\",[]],[\"load_artifacts\",[]],[\"load_memory\",[]],[\"LongRunningFunctionTool\",[\"func\"]],[\"preload_memory\",[]],[\"url_context\",[]],[\"VertexAiRagRetrieval\",[\"name\",\"description\",\"rag_corpora\",\"rag_resources\",\"similarity_top_k\",\"vector_distance_threshold\"]],[\"VertexAiSearchTool\",[\"data_store_id\",\"data_store_specs\",\"search_engine_id\",\"filter\",\"max_results\"]]]);header=\"Select an agent or tool to edit\";toolsMap$;callbacksMap$;getJsonStringForEditor(e){if(!e)return\"{}\";let A=BA({},e);return delete A.skip_summarization,JSON.stringify(A,null,2)}constructor(){this.toolsMap$=this.agentBuilderService.getAgentToolsMap(),this.callbacksMap$=this.agentBuilderService.getAgentCallbacksMap(),this.agentBuilderService.getSelectedNode().subscribe(e=>{this.agentConfig=e,this.currentSelectedAgent=e,e&&(this.editingTool=null,this.editingCallback=null,this.header=\"Agent configuration\",this.updateBreadcrumb(e)),this.cdr.markForCheck()}),this.agentBuilderService.getSelectedTool().subscribe(e=>{this.selectedTool=e,!(e&&e.toolType===\"Agent Tool\")&&(e?(this.editingTool=e,this.editingToolArgs.set(!1),setTimeout(()=>{let A=e.toolType==\"Function tool\"?\"Function tool\":e.name;if(e.toolType==\"Function tool\"&&!e.name&&(e.name=\"Function tool\"),e.toolType===\"Custom tool\")e.args||(e.args={}),this.toolArgsString.set(this.getJsonStringForEditor(e.args)),this.editingToolArgs.set(!0);else{let i=this.builtInToolArgs.get(A);if(i){e.args||(e.args={});for(let n of i)e.args&&(e.args[n]=\"\")}this.toolArgsString.set(this.getJsonStringForEditor(e.args)),e.args&&this.getObjectKeys(e.args).length>0&&this.editingToolArgs.set(!0)}this.cdr.markForCheck()}),this.selectedTabIndex=2):this.editingTool=null,this.cdr.markForCheck())}),this.agentBuilderService.getSelectedCallback().subscribe(e=>{this.selectedCallback=e,e?(this.selectCallback(e),this.selectedTabIndex=this.CALLBACKS_TAB_INDEX):this.editingCallback=null,this.cdr.markForCheck()}),this.agentBuilderService.getAgentCallbacks().subscribe(e=>{this.agentConfig&&e&&this.agentConfig.name===e.agentName&&(this.agentConfig=Ve(BA({},this.agentConfig),{callbacks:e.callbacks}),this.cdr.markForCheck())}),this.agentBuilderService.getSideTabChangeRequest().subscribe(e=>{e===\"tools\"?this.selectedTabIndex=2:e===\"config\"&&(this.selectedTabIndex=0)})}getObjectKeys(e){return e?Object.keys(e).filter(A=>A!==\"skip_summarization\"):[]}getCallbacksByType(){let e=new Map;return this.callbackTypes.forEach(A=>{e.set(A,[])}),this.agentConfig?.callbacks&&this.agentConfig.callbacks.forEach(A=>{let i=e.get(A.type);i&&i.push(A)}),e}updateBreadcrumb(e){this.hierarchyPath=this.buildHierarchyPath(e)}buildHierarchyPath(e){let A=[],i=this.findContextualRoot(e);return i?e.name===i.name?[i]:this.findPathToAgent(i,e,[i])||[e]:[e]}isInAgentToolContext(){return!this.hierarchyPath||this.hierarchyPath.length===0?!1:this.hierarchyPath[0]?.isAgentTool===!0}findContextualRoot(e){if(e.isAgentTool)return e;let A=this.agentBuilderService.getNodes();for(let n of A)if(n.isAgentTool&&this.findPathToAgent(n,e,[n]))return n;let i=this.agentBuilderService.getRootNode();if(i&&this.findPathToAgent(i,e,[i]))return i;if(e.isRoot)return e;for(let n of A)if(n.isRoot&&this.findPathToAgent(n,e,[n]))return n;return i}findPathToAgent(e,A,i){if(e.name===A.name)return i;for(let n of e.sub_agents){let o=[...i,n],a=this.findPathToAgent(n,A,o);if(a)return a}return null}selectAgentFromBreadcrumb(e){this.agentBuilderService.setSelectedNode(e),this.selectedTabIndex=0}selectAgent(e){this.agentBuilderService.setSelectedNode(e),this.selectedTabIndex=0}selectTool(e){if(e.toolType===\"Agent Tool\"){let A=e.name;this.agentBuilderService.requestNewTab(A);return}if(e.toolType===\"Function tool\"||e.toolType===\"Built-in tool\"){this.editTool(e);return}this.agentBuilderService.setSelectedTool(e)}editTool(e){if(!this.agentConfig)return;let A;e.toolType===\"Built-in tool\"?A=this.dialog.open(id,{width:\"700px\",maxWidth:\"90vw\",data:{toolName:e.name,isEditMode:!0,toolArgs:e.args}}):A=this.dialog.open(r2,{width:\"500px\",data:{toolType:e.toolType,toolName:e.name,isEditMode:!0}}),A.afterClosed().subscribe(i=>{if(i&&i.isEditMode){let n=this.agentConfig.tools?.findIndex(o=>o.name===e.name);n!==void 0&&n!==-1&&this.agentConfig.tools&&(this.agentConfig.tools[n].name=i.name,i.args&&(this.agentConfig.tools[n].args=i.args),this.agentBuilderService.setAgentTools(this.agentConfig.name,this.agentConfig.tools))}})}addTool(e){if(this.agentConfig){let A;e===\"Built-in tool\"?A=this.dialog.open(id,{width:\"700px\",maxWidth:\"90vw\",data:{}}):A=this.dialog.open(r2,{width:\"500px\",data:{toolType:e}}),A.afterClosed().subscribe(i=>{if(i){let n={toolType:i.toolType,name:i.name};this.agentBuilderService.addTool(this.agentConfig.name,n),this.agentBuilderService.setSelectedTool(n)}})}}addCallback(e){if(this.agentConfig){let A=this.agentConfig?.callbacks?.map(n=>n.name)??[];this.dialog.open(k4,{width:\"500px\",data:{callbackType:e,existingCallbackNames:A}}).afterClosed().subscribe(n=>{if(n){let o={name:n.name,type:n.type};this.agentBuilderService.addCallback(this.agentConfig.name,o)}})}}editCallback(e){if(!this.agentConfig)return;let A=this.agentConfig.callbacks?.map(n=>n.name)??[];this.dialog.open(k4,{width:\"500px\",data:{callbackType:e.type,existingCallbackNames:A,isEditMode:!0,callback:e,availableCallbackTypes:this.callbackTypes}}).afterClosed().subscribe(n=>{if(n&&n.isEditMode){let o=this.agentBuilderService.updateCallback(this.agentConfig.name,e.name,Ve(BA({},e),{name:n.name,type:n.type}));o.success?this.cdr.markForCheck():console.error(\"Failed to update callback:\",o.error)}})}deleteCallback(e,A){this.dialog.open(Cc,{data:{title:\"Delete Callback\",message:`Are you sure you want to delete ${A.name}?`,confirmButtonText:\"Delete\"}}).afterClosed().subscribe(n=>{if(n===\"confirm\"){let o=this.agentBuilderService.deleteCallback(e,A);o.success?this.cdr.markForCheck():console.error(\"Failed to delete callback:\",o.error)}})}addSubAgent(e){e&&this.agentBuilderService.setAddSubAgentSubject(e)}deleteSubAgent(e){this.agentBuilderService.setDeleteSubAgentSubject(e)}deleteTool(e,A){let i=A.toolType===\"Agent Tool\",n=i&&A.toolAgentName||A.name;this.dialog.open(Cc,{data:{title:i?\"Delete Agent Tool\":\"Delete Tool\",message:i?`Are you sure you want to delete the agent tool \"${n}\"? This will also delete the corresponding board.`:`Are you sure you want to delete ${n}?`,confirmButtonText:\"Delete\"}}).afterClosed().subscribe(a=>{if(a===\"confirm\")if(A.toolType===\"Agent Tool\"){let r=A.toolAgentName||A.name;this.deleteAgentToolAndBoard(e,A,r)}else this.agentBuilderService.deleteTool(e,A)})}deleteAgentToolAndBoard(e,A,i){this.agentBuilderService.deleteTool(e,A),this.agentBuilderService.requestTabDeletion(i)}backToToolList(){this.editingTool=null,this.agentBuilderService.setSelectedTool(void 0)}editToolArgs(){this.editingToolArgs.set(!0)}cancelEditToolArgs(e){this.editingToolArgs.set(!1),this.toolArgsString.set(this.getJsonStringForEditor(e?.args))}saveToolArgs(e){if(this.jsonEditorComponent&&e)try{let A=JSON.parse(this.jsonEditorComponent.getJsonString()),i=e.args?e.args.skip_summarization:!1;e.args=A,e.args.skip_summarization=i,this.toolArgsString.set(JSON.stringify(e.args,null,2)),this.editingToolArgs.set(!1)}catch(A){console.error(\"Error parsing tool arguments JSON\",A)}}onToolTypeSelectionChange(e){e?.toolType===\"Built-in tool\"?(e.name=\"google_search\",this.onBuiltInToolSelectionChange(e)):e?.toolType===\"Custom tool\"?(e.args={},this.toolArgsString.set(this.getJsonStringForEditor(e.args)),this.editingToolArgs.set(!0)):e&&(e.name=\"\",e.args={skip_summarization:!1},this.toolArgsString.set(\"{}\"),this.editingToolArgs.set(!1))}onBuiltInToolSelectionChange(e){e&&(this.editingToolArgs.set(!1),setTimeout(()=>{e.args={skip_summarization:!1};let A=this.builtInToolArgs.get(e.name);if(A)for(let i of A)e.args&&(e.args[i]=\"\");this.toolArgsString.set(this.getJsonStringForEditor(e.args)),e.args&&this.getObjectKeys(e.args).length>0&&this.editingToolArgs.set(!0),this.cdr.markForCheck()}))}selectCallback(e){this.editingCallback=e}backToCallbackList(){this.editingCallback=null}onCallbackTypeChange(e){}createAgentTool(){this.dialog.open(Cc,{width:\"750px\",height:\"450px\",data:{title:\"Create Agent Tool\",message:\"Please enter a name for the agent tool:\",confirmButtonText:\"Create\",showInput:!0,inputLabel:\"Agent Tool Name\",inputPlaceholder:\"Enter agent tool name\",showToolInfo:!0,toolType:\"Agent tool\"}}).afterClosed().subscribe(A=>{if(A&&typeof A==\"string\"){let i=this.agentConfig?.name||\"root_agent\";this.agentBuilderService.requestNewTab(A,i)}})}saveChanges(){if(!this.agentBuilderService.getRootNode()){this.snackBar.open(\"Please create an agent first.\",\"OK\");return}this.appNameInput?this.saveAgent(this.appNameInput):this.agentService.getApp().subscribe(A=>{A?this.saveAgent(A):this.snackBar.open(\"No agent selected. Please select an agent first.\",\"OK\")})}cancelChanges(){this.agentService.agentChangeCancel(this.appNameInput).subscribe(e=>{}),this.exitBuilderMode.emit()}saveAgent(e){let A=this.agentBuilderService.getRootNode();if(!A){this.snackBar.open(\"Please create an agent first.\",\"OK\");return}let i=new FormData,n=this.agentBuilderService.getCurrentAgentToolBoards();zc.generateYamlFile(A,i,e,n),this.agentService.agentBuildTmp(i).subscribe(o=>{o&&this.agentService.agentBuild(i).subscribe(a=>{a?this.router.navigate([\"/\"],{queryParams:{app:e}}).then(()=>{window.location.reload()}):this.snackBar.open(\"Something went wrong, please try again\",\"OK\")})})}getToolIcon(e){return vB(e.name,e.toolType)}getAgentIcon(e){switch(e){case\"SequentialAgent\":return\"more_horiz\";case\"LoopAgent\":return\"sync\";case\"ParallelAgent\":return\"density_medium\";default:return\"psychology\"}}addSubAgentWithType(e){if(!this.agentConfig?.name)return;let A=this.agentConfig.agent_class!==\"LlmAgent\";this.agentBuilderService.setAddSubAgentSubject(this.agentConfig.name,e,A)}callbackMenuTooltips(e){return Hl.getCallbackMenuTooltips(e)}toolMenuTooltips(e){return Hl.getToolMenuTooltips(e)}static \\u0275fac=function(A){return new(A||t)};static \\u0275cmp=kA({type:t,selectors:[[\"app-builder-tabs\"]],viewQuery:function(A,i){if(A&1&&ni(cc,5),A&2){let n;Ce(n=Ie())&&(i.jsonEditorComponent=n.first)}},inputs:{appNameInput:\"appNameInput\"},outputs:{exitBuilderMode:\"exitBuilderMode\",closePanel:\"closePanel\"},decls:77,vars:12,consts:[[\"subAgentMenu\",\"matMenu\"],[\"callbacksMenu\",\"matMenu\"],[\"agentMenuTrigger\",\"matMenuTrigger\"],[\"toolsMenu\",\"matMenu\"],[2,\"margin-top\",\"20px\",\"margin-left\",\"20px\",\"display\",\"flex\"],[2,\"width\",\"100%\"],[1,\"drawer-header\"],[1,\"drawer-logo\"],[\"src\",\"assets/ADK-512-color.svg\",\"width\",\"32px\",\"height\",\"32px\"],[2,\"display\",\"flex\",\"align-items\",\"center\",\"gap\",\"8px\",\"margin-right\",\"15px\"],[\"matTooltip\",\"Collapse panel\",1,\"material-symbols-outlined\",2,\"color\",\"#c4c7c5\",\"cursor\",\"pointer\",3,\"click\"],[1,\"builder-tabs-container\"],[1,\"builder-tab-content\"],[1,\"agent-breadcrumb-container\"],[1,\"content-wrapper\"],[1,\"builder-panel-wrapper\"],[1,\"panel-title\"],[1,\"config-form\"],[\"mat-icon-button\",\"\",\"type\",\"button\",\"aria-label\",\"Add sub agent\",1,\"panel-action-button\",3,\"matMenuTriggerFor\"],[\"mat-menu-item\",\"\",3,\"click\"],[1,\"tools-chips-container\"],[\"mat-icon-button\",\"\",\"type\",\"button\",\"aria-label\",\"Add callback\",1,\"panel-action-button\",3,\"matMenuTriggerFor\"],[1,\"menu-header\"],[\"mat-menu-item\",\"\",\"matTooltipPosition\",\"right\",3,\"click\",\"matTooltip\"],[1,\"action-buttons\"],[\"mat-raised-button\",\"\",\"color\",\"secondary\",1,\"save-button\",3,\"click\"],[\"mat-button\",\"\",1,\"cancel-button\",3,\"click\"],[1,\"breadcrumb-chip\",3,\"click\"],[1,\"breadcrumb-arrow\"],[1,\"form-row\"],[1,\"agent-name-field\"],[\"matInput\",\"\",3,\"ngModelChange\",\"ngModel\",\"disabled\"],[1,\"agent-type-field\"],[\"disabled\",\"\",3,\"ngModelChange\",\"ngModel\"],[3,\"value\"],[3,\"ngModel\"],[3,\"ngModelChange\",\"ngModel\"],[\"matInput\",\"\",\"rows\",\"5\",3,\"ngModelChange\",\"ngModel\"],[\"matInput\",\"\",\"rows\",\"3\",3,\"ngModelChange\",\"ngModel\"],[\"matInput\",\"\",\"type\",\"number\",\"min\",\"1\",3,\"ngModelChange\",\"ngModel\"],[\"mat-icon-button\",\"\",\"type\",\"button\",\"aria-label\",\"Add tool\",1,\"panel-action-button\",3,\"matMenuTriggerFor\"],[\"aria-label\",\"Tools\"],[1,\"tool-chip\"],[1,\"tool-chip\",3,\"click\"],[\"matChipAvatar\",\"\",1,\"tool-icon\"],[1,\"tool-chip-name\"],[\"matChipRemove\",\"\",\"aria-label\",\"Remove tool\",3,\"click\"],[\"aria-label\",\"Sub Agents\"],[\"matChipRemove\",\"\",\"aria-label\",\"Remove sub agent\",3,\"click\"],[1,\"tools-chips-container\",\"callbacks-list\"],[\"aria-label\",\"Callbacks\"],[1,\"callback-row\"],[1,\"callback-row\",3,\"click\"],[1,\"callback-chip\"],[1,\"chip-content\"],[1,\"chip-type\"],[1,\"chip-name\"],[\"mat-icon-button\",\"\",\"aria-label\",\"Remove callback\",1,\"callback-remove\",3,\"click\"]],template:function(A,i){if(A&1&&(m(0,\"div\",4)(1,\"div\",5)(2,\"div\",6)(3,\"div\",7),GA(4,\"img\",8),K(5,\" Agent Development Kit \"),D(),m(6,\"div\",9),GA(7,\"app-theme-toggle\"),m(8,\"span\",10),$(\"click\",function(){return i.closePanel.emit()}),K(9,\"left_panel_close\"),D()()()()(),m(10,\"div\",11)(11,\"div\",12),V(12,xyA,3,0,\"div\",13),m(13,\"div\",14)(14,\"div\",15)(15,\"div\",16),K(16,\" Configuration \"),D(),m(17,\"div\"),V(18,KyA,16,7,\"div\",17),D()(),V(19,HyA,22,7,\"div\",15),m(20,\"div\",15)(21,\"div\",16)(22,\"div\"),K(23,\" Sub Agents \"),D(),m(24,\"div\")(25,\"button\",18)(26,\"mat-icon\"),K(27,\"add\"),D()(),m(28,\"mat-menu\",null,0)(30,\"button\",19),$(\"click\",function(){return i.addSubAgentWithType(\"LlmAgent\")}),m(31,\"mat-icon\"),K(32,\"psychology\"),D(),m(33,\"span\"),K(34,\"LLM Agent\"),D()(),m(35,\"button\",19),$(\"click\",function(){return i.addSubAgentWithType(\"SequentialAgent\")}),m(36,\"mat-icon\"),K(37,\"more_horiz\"),D(),m(38,\"span\"),K(39,\"Sequential Agent\"),D()(),m(40,\"button\",19),$(\"click\",function(){return i.addSubAgentWithType(\"LoopAgent\")}),m(41,\"mat-icon\"),K(42,\"sync\"),D(),m(43,\"span\"),K(44,\"Loop Agent\"),D()(),m(45,\"button\",19),$(\"click\",function(){return i.addSubAgentWithType(\"ParallelAgent\")}),m(46,\"mat-icon\"),K(47,\"density_medium\"),D(),m(48,\"span\"),K(49,\"Parallel Agent\"),D()()()()(),V(50,OyA,4,0,\"div\",20),D(),m(51,\"div\",15)(52,\"div\",16)(53,\"div\"),K(54,\" Callbacks \"),D(),m(55,\"div\")(56,\"button\",21)(57,\"mat-icon\"),K(58,\"add\"),D()(),m(59,\"mat-menu\",null,1)(61,\"div\",22),K(62,\"Agent Lifecycle\"),D(),m(63,\"button\",23),$(\"click\",function(){return i.addCallback(\"before_agent\")}),m(64,\"span\"),K(65,\"Before Agent\"),D()(),m(66,\"button\",23),$(\"click\",function(){return i.addCallback(\"after_agent\")}),m(67,\"span\"),K(68,\"After Agent\"),D()(),V(69,zyA,18,4),D()()(),V(70,qyA,1,1),oi(71,\"async\"),D()(),m(72,\"div\",24)(73,\"button\",25),$(\"click\",function(){return i.saveChanges()}),K(74,\" Save \"),D(),m(75,\"button\",26),$(\"click\",function(){return i.cancelChanges()}),K(76,\" Cancel \"),D()()()()),A&2){let n,o=Wi(29),a=Wi(60);p(12),W(i.hierarchyPath.length>0?12:-1),p(6),W(i.agentConfig?18:-1),p(),W((i.agentConfig==null?null:i.agentConfig.agent_class)===\"LlmAgent\"?19:-1),p(6),X(\"matMenuTriggerFor\",o),p(25),W(i.agentConfig&&i.agentConfig.sub_agents&&i.agentConfig.sub_agents.length>0?50:-1),p(6),X(\"matMenuTriggerFor\",a),p(7),X(\"matTooltip\",i.callbackMenuTooltips(\"before_agent\")),p(3),X(\"matTooltip\",i.callbackMenuTooltips(\"after_agent\")),p(3),W((i.agentConfig==null?null:i.agentConfig.agent_class)===\"LlmAgent\"?69:-1),p(),W((n=li(71,10,i.callbacksMap$))?70:-1,n)}},dependencies:[oa,yn,ro,Fv,so,Gv,Ca,vn,yB,kY,To,In,wa,Ia,pl,Mr,Yg,Ba,E0,fE,DC,sw,yu,F$,L$,mN,CJ,up,mE,Pr],styles:[\".builder-tabs-container[_ngcontent-%COMP%]{width:100%;margin-top:40px;height:calc(95vh - 20px);display:flex;flex-direction:column}.agent-breadcrumb-container[_ngcontent-%COMP%]{padding:2px 20px 8px;display:flex;align-items:center;gap:6px;flex-wrap:wrap;border-bottom:1px solid var(--builder-border-color)}.breadcrumb-chip[_ngcontent-%COMP%]{background-color:transparent;color:var(--builder-text-muted-color);font-family:Google Sans;font-size:16px;font-weight:500;border:none;cursor:pointer;transition:all .2s ease;padding:4px 8px;border-radius:4px;display:inline-block;-webkit-user-select:none;user-select:none}.breadcrumb-chip[_ngcontent-%COMP%]:hover{color:var(--builder-text-link-color)}.breadcrumb-chip.current-agent[_ngcontent-%COMP%]{color:var(--builder-text-primary-color);font-weight:500}.breadcrumb-arrow[_ngcontent-%COMP%]{color:var(--builder-breadcrumb-separator-color);font-size:16px;width:16px;height:16px}.builder-tab-content[_ngcontent-%COMP%]{color:var(--builder-text-secondary-color);display:flex;flex-direction:column;flex:1;overflow:hidden}.builder-tab-content[_ngcontent-%COMP%]   p[_ngcontent-%COMP%]{margin:8px 0;font-size:14px;line-height:1.5}.builder-tab-content[_ngcontent-%COMP%]{--mat-form-field-filled-container-color: var(--builder-form-field-background-color);--mat-form-field-filled-focus-active-indicator-color: var(--builder-form-field-background-color);--mat-form-field-filled-active-indicator-color: var(--builder-form-field-background-color);--mat-form-field-filled-hover-active-indicator-color: var(--builder-form-field-background-color);--mat-form-field-filled-label-text-color: var(--builder-text-secondary-color);--mat-form-field-filled-focus-label-text-color: var(--builder-text-link-color);--mat-form-field-filled-hover-label-text-color: var(--builder-text-secondary-color)}[_nghost-%COMP%]     .mat-mdc-text-field-wrapper{border:none!important}.components-section[_ngcontent-%COMP%]{margin-bottom:32px}.components-section[_ngcontent-%COMP%]   h4[_ngcontent-%COMP%]{color:var(--builder-text-primary-color);font-size:14px;font-weight:500;margin:0 0 16px;text-transform:uppercase;letter-spacing:.5px}.config-form[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:16px;margin-top:20px}.config-form[_ngcontent-%COMP%]   .form-row[_ngcontent-%COMP%]{display:flex;gap:16px;align-items:flex-start}.config-form[_ngcontent-%COMP%]   .form-row[_ngcontent-%COMP%]   .agent-name-field[_ngcontent-%COMP%]{flex:1}.config-form[_ngcontent-%COMP%]   .form-row[_ngcontent-%COMP%]   .agent-type-field[_ngcontent-%COMP%]{width:32%}.config-form[_ngcontent-%COMP%]   mat-form-field[_ngcontent-%COMP%]{width:100%}.config-form[_ngcontent-%COMP%]   mat-checkbox[_ngcontent-%COMP%]{margin-bottom:8px}.config-form[_ngcontent-%COMP%]   .tool-code-section[_ngcontent-%COMP%]{margin-top:16px}.config-form[_ngcontent-%COMP%]   .tool-code-section[_ngcontent-%COMP%]   p[_ngcontent-%COMP%]{margin:0 0 8px;color:var(--builder-text-secondary-color);font-size:14px;font-weight:500}.config-form[_ngcontent-%COMP%]   .tool-args-header[_ngcontent-%COMP%]{color:var(--builder-text-primary-color);font-size:14px;font-weight:500;letter-spacing:.5px;text-transform:uppercase}.json-editor-wrapper[_ngcontent-%COMP%]{height:300px;max-height:300px}.tab-content-container[_ngcontent-%COMP%]{margin-top:20px;overflow-y:auto}.agent-list-row[_ngcontent-%COMP%]{display:flex;margin-top:10px}.sub-agent-list-row[_ngcontent-%COMP%]{display:flex;margin-top:10px;margin-left:16px}.tree-view[_ngcontent-%COMP%]   mat-tree[_ngcontent-%COMP%]{background-color:inherit!important}.tree-view[_ngcontent-%COMP%]   expand-button[_ngcontent-%COMP%]{background-color:transparent;border:0}.node-item[_ngcontent-%COMP%]{display:flex;align-items:center}.node-icon[_ngcontent-%COMP%]{margin-right:14px}.node-name[_ngcontent-%COMP%]{margin-top:2px;display:flex;align-items:center}.no-tools-message[_ngcontent-%COMP%]{display:block;color:var(--builder-text-secondary-color);font-size:16px;margin-top:16px;margin-bottom:16px;text-align:center}.tools-list[_ngcontent-%COMP%]{list-style:none;padding:0}.tool-name[_ngcontent-%COMP%]{cursor:pointer;padding:11px;border-radius:8px;display:flex;justify-content:space-between;align-items:center;margin-bottom:4px;background-color:var(--builder-card-background-color);color:var(--builder-text-primary-color);font-family:Google Sans Mono,monospace;font-size:14px;font-style:normal;font-weight:500;line-height:20px;letter-spacing:.25px}.tool-name[_ngcontent-%COMP%]   button[_ngcontent-%COMP%]{visibility:hidden}.tool-name[_ngcontent-%COMP%]:hover{background-color:var(--builder-hover-background-color)}.tool-name[_ngcontent-%COMP%]:hover   button[_ngcontent-%COMP%]{visibility:visible}.tool-list-item-name[_ngcontent-%COMP%]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;padding-right:8px}  .tools-chips-container .mat-mdc-chip-set{width:100%}  .tools-chips-container.callbacks-list .mat-mdc-chip-set{display:flex;flex-direction:column;gap:8px;width:100%}  .tools-chips-container .mat-mdc-chip.tool-chip{background-color:var(--builder-tool-chip-background-color);color:var(--builder-text-primary-color);font-family:Google Sans,sans-serif;font-size:14px;font-weight:500;cursor:pointer;margin:4px}  .tools-chips-container .mat-mdc-chip.tool-chip:hover{background-color:var(--builder-tool-chip-hover-color)}  .tools-chips-container .mat-mdc-chip.tool-chip .mat-mdc-chip-action-label{display:flex;align-items:center;gap:6px}  .tools-chips-container .mat-mdc-chip.tool-chip .tool-chip-name{display:inline-flex;align-items:center}  .tools-chips-container .mat-mdc-chip.tool-chip .tool-icon{font-size:18px;width:18px;height:18px}  .tools-chips-container .mat-mdc-chip.tool-chip .mat-mdc-chip-remove{opacity:1;color:var(--builder-text-secondary-color)}  .tools-chips-container .mat-mdc-chip.tool-chip .mat-mdc-chip-remove mat-icon{font-size:18px;width:18px;height:18px}  .tools-chips-container .mat-mdc-chip.tool-chip .mat-mdc-chip-remove:hover{color:var(--builder-text-primary-color)}  .tools-chips-container .mat-mdc-chip.callback-chip{background:var(--builder-callback-chip-background-color);background-color:var(--builder-callback-chip-background-color);color:var(--builder-callback-chip-text-color);font-family:Google Sans,sans-serif;font-size:14px;display:flex;flex-direction:row;align-items:center;gap:12px;width:auto;height:40px;border-radius:8px;border:none;box-shadow:none;outline:none;--mdc-chip-outline-width: 0;--mdc-chip-outline-color: transparent;--mdc-chip-elevated-container-color: var(--builder-callback-chip-background-color);--mdc-chip-flat-container-color: var(--builder-callback-chip-background-color);flex:1 1 auto;min-width:0}  .tools-chips-container .mat-mdc-chip.callback-chip:before,   .tools-chips-container .mat-mdc-chip.callback-chip:after,   .tools-chips-container .mat-mdc-chip.callback-chip .mat-mdc-chip-focus-overlay{border:none;box-shadow:none}  .tools-chips-container .mat-mdc-chip.callback-chip .mat-mdc-chip-action-label{display:flex;flex:1;align-items:center;width:100%;gap:12px}  .tools-chips-container .mat-mdc-chip.callback-chip .chip-content{display:flex;flex-direction:row;align-items:center;gap:12px;flex:1;min-width:0}  .tools-chips-container .mat-mdc-chip.callback-chip .chip-type{color:var(--builder-callback-chip-type-color);font-size:13px;font-weight:500;white-space:nowrap}  .tools-chips-container .mat-mdc-chip.callback-chip .chip-name{color:var(--builder-callback-chip-name-color);font-size:15px;font-weight:600;flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis}.tools-chips-container[_ngcontent-%COMP%]{margin-top:12px;padding:0 4px}.tools-chips-container.callbacks-list[_ngcontent-%COMP%]{padding-right:0;padding-left:0}.callback-row[_ngcontent-%COMP%]{display:flex;align-items:center;gap:12px;width:100%;cursor:pointer}.callback-remove[_ngcontent-%COMP%]{color:var(--builder-icon-color);cursor:pointer;width:32px;height:32px;min-width:32px;min-height:32px;display:inline-flex;align-items:center;justify-content:center;padding:0}.callback-remove[_ngcontent-%COMP%]   mat-icon[_ngcontent-%COMP%]{font-size:18px;width:18px;height:18px;line-height:1;display:flex;align-items:center;justify-content:center;transform:translateY(.5px)}.back-button[_ngcontent-%COMP%]{margin-bottom:16px}.add-tool-button[_ngcontent-%COMP%]{width:100%;background:linear-gradient(0deg,var(--builder-add-button-background-color) 0%,var(--builder-add-button-background-color) 100%),var(--builder-panel-background-color);border:none;border-radius:4px;margin-top:12px;cursor:pointer}.add-tool-button-detail[_ngcontent-%COMP%]{display:flex;padding:8px 16px 8px 12px;justify-content:center}.add-tool-button-text[_ngcontent-%COMP%]{padding-top:2px;color:var(--builder-add-button-text-color);font-family:Google Sans;font-size:14px;font-style:normal;font-weight:500;line-height:20px;letter-spacing:.25px}.agent-tool-section[_ngcontent-%COMP%]{margin-top:16px;padding:16px;border:1px solid var(--builder-border-color);border-radius:8px;background-color:var(--builder-secondary-background-color)}.agent-tool-section[_ngcontent-%COMP%]   h3[_ngcontent-%COMP%]{color:var(--builder-text-primary-color);font-size:16px;font-weight:500;margin:0 0 8px}.agent-tool-section[_ngcontent-%COMP%]   p[_ngcontent-%COMP%]{color:var(--builder-text-secondary-color);font-size:14px;margin:0 0 16px;line-height:1.5}.agent-tool-section[_ngcontent-%COMP%]   .create-agent-tool-btn[_ngcontent-%COMP%]{background-color:var(--builder-button-primary-background-color);color:var(--builder-button-primary-text-color);font-weight:500}.agent-tool-section[_ngcontent-%COMP%]   .create-agent-tool-btn[_ngcontent-%COMP%]:hover{background-color:var(--builder-button-primary-hover-color)}.no-callbacks-message[_ngcontent-%COMP%]{color:var(--builder-text-secondary-color);font-size:16px;margin-top:16px;text-align:center}.callback-name[_ngcontent-%COMP%]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;padding-right:8px}.callback-section[_ngcontent-%COMP%]{margin-top:16px}.callback-section[_ngcontent-%COMP%]   .callback-section-label[_ngcontent-%COMP%]{margin:0 0 8px;color:var(--builder-text-secondary-color);font-size:14px;font-weight:500;text-transform:none}.callback-groups-wrapper[_ngcontent-%COMP%]{margin-top:16px}.callback-group[_ngcontent-%COMP%]{margin-top:5px;--mat-expansion-container-background-color: var(--builder-expansion-background-color);--mat-expansion-header-focus-state-layer-color: red;--mat-expansion-header-description-color: var(--builder-expansion-header-description-color);--mat-expansion-header-text-size: 15}.callback-list[_ngcontent-%COMP%]{padding:8px 0}.no-callbacks-in-type[_ngcontent-%COMP%]{color:var(--builder-text-secondary-color);font-size:14px;font-style:italic;padding:12px;text-align:center}.callback-item[_ngcontent-%COMP%]{cursor:pointer;padding:8px 12px;border-radius:4px;display:flex;justify-content:space-between;align-items:center;margin-bottom:4px;background-color:var(--builder-card-background-color);color:var(--builder-text-primary-color);font-family:Google Sans Mono,monospace;font-size:14px;font-style:normal;font-weight:500;line-height:20px;letter-spacing:.25px}.callback-item[_ngcontent-%COMP%]   button[_ngcontent-%COMP%]{visibility:hidden}.callback-item[_ngcontent-%COMP%]:hover{background-color:var(--builder-expansion-hover-color)}.callback-item[_ngcontent-%COMP%]:hover   button[_ngcontent-%COMP%]{visibility:visible}.add-callback-icon[_ngcontent-%COMP%]{color:var(--builder-button-primary-background-color)}.add-callback-icon[_ngcontent-%COMP%]:hover{background-color:var(--builder-add-button-background-color)}  .callback-group .mat-expansion-panel-header.mat-expanded:focus{background-color:var(--builder-expansion-hover-color)!important}  .callback-group .mat-expansion-panel-header.mat-expanded{background-color:var(--builder-expansion-hover-color)!important}  .callback-group .mat-expansion-panel-header.mat-expanded:hover{background-color:var(--builder-expansion-hover-color)!important}  .callback-group .mat-expansion-panel-header-title{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}mat-tab-group[_ngcontent-%COMP%]{flex:1;display:flex;flex-direction:column;overflow:hidden;padding:16px 20px 0;min-height:0}  .mat-mdc-tab-body-wrapper{flex:1;overflow:hidden;min-height:0}  .mat-mdc-tab-body-content{flex:1;overflow:hidden;display:flex;flex-direction:column;min-height:0}mat-tab-group[_ngcontent-%COMP%]{flex:1;padding-bottom:0;display:flex;flex-direction:column;overflow:hidden}  .mat-mdc-tab-body-wrapper{flex:1;overflow:hidden}  .mat-mdc-tab-body-content{height:100%;overflow:hidden}  .mat-drawer-inner-container{overflow:hidden}.action-buttons[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:8px;padding:16px 20px;border-top:1px solid var(--builder-border-color);flex-shrink:0;margin-top:auto;background-color:var(--builder-panel-background-color)}.action-buttons[_ngcontent-%COMP%]   .save-button[_ngcontent-%COMP%]{background-color:var(--builder-button-primary-background-color);color:var(--builder-button-primary-text-color);font-weight:500}.action-buttons[_ngcontent-%COMP%]   .save-button[_ngcontent-%COMP%]:hover{background-color:var(--builder-button-primary-hover-color)}.action-buttons[_ngcontent-%COMP%]   .cancel-button[_ngcontent-%COMP%]{color:var(--builder-button-secondary-text-color);border:1px solid var(--builder-button-secondary-border-color)}.action-buttons[_ngcontent-%COMP%]   .cancel-button[_ngcontent-%COMP%]:hover{background-color:var(--builder-button-secondary-hover-background-color);color:var(--builder-button-secondary-hover-text-color)}.builder-panel-wrapper[_ngcontent-%COMP%]{border-bottom:1px solid var(--builder-border-color);padding:12px 24px}.panel-title[_ngcontent-%COMP%]{color:var(--builder-text-tertiary-color);font-family:Google Sans;font-size:16px;font-style:normal;font-weight:500;line-height:24px;display:flex;justify-content:space-between}.panel-title[_ngcontent-%COMP%]   .panel-action-button[_ngcontent-%COMP%]{color:var(--builder-icon-color);width:32px;height:32px;min-width:32px;min-height:32px;border-radius:50%;display:inline-flex;align-items:center;justify-content:center;padding:0}.panel-title[_ngcontent-%COMP%]   .panel-action-button[_ngcontent-%COMP%]   mat-icon[_ngcontent-%COMP%]{font-size:18px;width:18px;height:18px;line-height:1;display:flex;align-items:center;justify-content:center}.content-wrapper[_ngcontent-%COMP%]{flex:1;overflow-y:auto}.drawer-logo[_ngcontent-%COMP%]{margin-left:9px;display:flex;align-items:center}.drawer-logo[_ngcontent-%COMP%]   img[_ngcontent-%COMP%]{margin-right:9px}.drawer-logo[_ngcontent-%COMP%]{font-size:16px;font-style:normal;font-weight:500;line-height:24px;letter-spacing:.1px}.drawer-header[_ngcontent-%COMP%]{width:100%;display:flex;justify-content:space-between;align-items:center;--mat-button-filled-container-color: var(--side-panel-button-filled-container-color);--mat-button-filled-label-text-color: var(--side-panel-button-filled-label-text-color)}.drawer-header[_ngcontent-%COMP%]   .mat-icon[_ngcontent-%COMP%]{width:36px;height:36px;color:var(--side-panel-mat-icon-color);cursor:pointer;display:flex;align-items:center;justify-content:center}  .mat-mdc-menu-panel{background-color:var(--builder-menu-background-color)!important}  .mat-mdc-menu-panel .menu-header{color:var(--builder-text-secondary-color);font-size:12px;padding:8px 16px;font-weight:500;text-transform:uppercase;pointer-events:none}  .mat-mdc-menu-panel .mat-mdc-menu-item{color:var(--builder-text-primary-color)}  .mat-mdc-menu-panel .mat-mdc-menu-item:hover{background-color:var(--builder-menu-item-hover-color)}  .mat-mdc-menu-panel mat-divider{border-top-color:var(--builder-menu-divider-color);margin:4px 0}\"],changeDetection:0})};var pE=new wA(\"MARKDOWN_COMPONENT\");var VyA=[\"chatMessages\"],WyA=(t,e)=>({\"user-message\":t,\"bot-message\":e}),ZyA=t=>({text:t,thought:!1});function XyA(t,e){t&1&&(m(0,\"div\",7)(1,\"mat-icon\",12),K(2,\"smart_toy\"),D(),m(3,\"h3\"),K(4,\"Assistant Ready\"),D(),m(5,\"p\"),K(6,\"Your builder assistant is ready to help you build agents.\"),D()())}function $yA(t,e){t&1&&(m(0,\"div\",15)(1,\"span\",16),K(2,\"\\u30FB\\u30FB\\u30FB\"),D()())}function AvA(t,e){if(t&1&&(m(0,\"div\",18),K(1,\"Assistant\"),D(),$i(2,19)),t&2){let A=y(2).$implicit,i=y(2);p(2),X(\"ngComponentOutlet\",i.markdownComponent)(\"ngComponentOutletInputs\",zr(2,ZyA,A.text))}}function evA(t,e){if(t&1&&(m(0,\"div\",17),K(1),D()),t&2){let A=y(2).$implicit;p(),qA(A.text)}}function tvA(t,e){if(t&1&&V(0,AvA,3,4)(1,evA,2,1,\"div\",17),t&2){let A=y().$implicit;W(A.role===\"bot\"?0:1)}}function ivA(t,e){if(t&1&&(m(0,\"div\",13)(1,\"mat-card\",14),V(2,$yA,3,0,\"div\",15)(3,tvA,2,1),D()()),t&2){let A=e.$implicit;X(\"ngClass\",fl(2,WyA,A.role===\"user\",A.role===\"bot\")),p(2),W(A.isLoading?2:3)}}function nvA(t,e){if(t&1&&Gt(0,ivA,4,5,\"div\",13,Ri),t&2){let A=y();Kt(A.messages)}}var cw=class t{isVisible=!0;appName=\"\";closePanel=new WA;reloadCanvas=new WA;assistantAppName=\"__adk_agent_builder_assistant\";userId=\"user\";currentSession=\"\";userMessage=\"\";messages=[];shouldAutoScroll=!1;isGenerating=!1;chatMessages;markdownComponent=h(pE);agentService=h(Ks);sessionService=h(Hg);agentBuilderService=h(Kc);constructor(){}ngOnInit(){this.sessionService.createSession(this.userId,this.assistantAppName).subscribe(e=>{this.currentSession=e.id;let A={appName:this.assistantAppName,userId:this.userId,sessionId:e.id,newMessage:{role:\"user\",parts:[{text:\"hello\"}]},streaming:!1,stateDelta:{root_directory:`${this.appName}/tmp/${this.appName}`}};this.messages.push({role:\"bot\",text:\"\",isLoading:!0}),this.shouldAutoScroll=!0,this.isGenerating=!0,this.agentService.runSse(A).subscribe({next:i=>ct(this,null,function*(){if(i.content){let n=\"\";for(let o of i.content.parts)o.text&&(n+=o.text);if(n){let o=this.messages[this.messages.length-1];o.role===\"bot\"&&o.isLoading&&(o.text=n,o.isLoading=!1,this.shouldAutoScroll=!0)}}}),error:i=>{console.error(\"SSE error:\",i);let n=this.messages[this.messages.length-1];n.role===\"bot\"&&n.isLoading&&(n.text=\"Sorry, I encountered an error. Please try again.\",n.isLoading=!1,this.shouldAutoScroll=!0),this.isGenerating=!1},complete:()=>{this.isGenerating=!1}})})}onClosePanel(){this.closePanel.emit()}sendMessage(e){if(e.trim()){this.saveAgent(this.appName),e!=\"____Something went wrong, please try again\"&&this.messages.push({role:\"user\",text:e});let A=e;this.userMessage=\"\",this.messages.push({role:\"bot\",text:\"\",isLoading:!0}),this.shouldAutoScroll=!0,this.isGenerating=!0;let i={appName:this.assistantAppName,userId:this.userId,sessionId:this.currentSession,newMessage:{role:\"user\",parts:[{text:A}]},streaming:!1};this.agentService.runSse(i).subscribe({next:n=>ct(this,null,function*(){if(n.errorCode&&(n.errorCode==\"MALFORMED_FUNCTION_CALL\"||n.errorCode==\"STOP\")){this.sendMessage(\"____Something went wrong, please try again\");return}if(n.content){let o=\"\";for(let a of n.content.parts)a.text&&(o+=a.text);if(o){let a=this.messages[this.messages.length-1];a.role===\"bot\"&&a.isLoading&&(a.text=o,a.isLoading=!1,this.shouldAutoScroll=!0,this.reloadCanvas.emit())}}}),error:n=>{console.error(\"SSE error:\",n);let o=this.messages[this.messages.length-1];o.role===\"bot\"&&o.isLoading&&(o.text=\"Sorry, I encountered an error. Please try again.\",o.isLoading=!1,this.shouldAutoScroll=!0),this.isGenerating=!1},complete:()=>{this.isGenerating=!1}})}}ngAfterViewChecked(){this.shouldAutoScroll&&(this.scrollToBottom(),this.shouldAutoScroll=!1)}scrollToBottom(){try{this.chatMessages&&setTimeout(()=>{this.chatMessages.nativeElement.scrollTop=this.chatMessages.nativeElement.scrollHeight},50)}catch(e){console.error(\"Error scrolling to bottom:\",e)}}onKeyDown(e){if(e.key===\"Enter\"){if(e.shiftKey)return;this.userMessage?.trim()&&this.currentSession&&(e.preventDefault(),this.sendMessage(this.userMessage))}}saveAgent(e){let A=this.agentBuilderService.getRootNode();if(!A)return;let i=new FormData,n=this.agentBuilderService.getCurrentAgentToolBoards();zc.generateYamlFile(A,i,e,n),this.agentService.agentBuildTmp(i).subscribe(o=>{console.log(o?\"save to tmp\":\"something went wrong\")})}static \\u0275fac=function(A){return new(A||t)};static \\u0275cmp=kA({type:t,selectors:[[\"app-builder-assistant\"]],viewQuery:function(A,i){if(A&1&&ni(VyA,5),A&2){let n;Ce(n=Ie())&&(i.chatMessages=n.first)}},inputs:{isVisible:\"isVisible\",appName:\"appName\"},outputs:{closePanel:\"closePanel\",reloadCanvas:\"reloadCanvas\"},decls:21,vars:6,consts:[[\"chatMessages\",\"\"],[1,\"builder-assistant-panel\"],[1,\"panel-header\"],[1,\"panel-title\"],[\"mat-icon-button\",\"\",\"matTooltip\",\"Close assistant panel\",1,\"close-btn\",3,\"click\"],[1,\"panel-content\"],[1,\"chat-messages\"],[1,\"assistant-placeholder\"],[1,\"chat-input-container\"],[1,\"input-wrapper\"],[\"cdkTextareaAutosize\",\"\",\"cdkAutosizeMinRows\",\"1\",\"cdkAutosizeMaxRows\",\"5\",\"placeholder\",\"Ask Gemini to build your agent\",1,\"assistant-input-box\",3,\"ngModelChange\",\"keydown\",\"ngModel\",\"disabled\"],[\"mat-icon-button\",\"\",\"matTooltip\",\"Send message\",1,\"send-button\",3,\"click\",\"disabled\"],[1,\"large-icon\"],[3,\"ngClass\"],[1,\"message-card\"],[1,\"loading-message\"],[1,\"dots\"],[1,\"message-text\"],[1,\"bot-label\"],[3,\"ngComponentOutlet\",\"ngComponentOutletInputs\"]],template:function(A,i){if(A&1){let n=zA();m(0,\"div\",1)(1,\"div\",2)(2,\"div\",3)(3,\"mat-icon\"),K(4,\"auto_awesome\"),D(),m(5,\"span\"),K(6,\"Assistant\"),D()(),m(7,\"button\",4),$(\"click\",function(){return i.onClosePanel()}),m(8,\"mat-icon\"),K(9,\"close\"),D()()(),m(10,\"div\",5)(11,\"div\",6,0),V(13,XyA,7,0,\"div\",7)(14,nvA,2,0),D(),m(15,\"div\",8)(16,\"div\",9)(17,\"textarea\",10),ao(\"ngModelChange\",function(a){return rA(n),Vn(i.userMessage,a)||(i.userMessage=a),sA(a)}),$(\"keydown\",function(a){return i.onKeyDown(a)}),D(),m(18,\"button\",11),$(\"click\",function(){return i.sendMessage(i.userMessage.trim())}),m(19,\"mat-icon\"),K(20,\"send\"),D()()()()()()}A&2&&(ae(\"hidden\",!i.isVisible),p(13),W(i.messages.length===0?13:14),p(4),oo(\"ngModel\",i.userMessage),X(\"disabled\",i.isGenerating),p(),X(\"disabled\",!i.userMessage.trim()||i.isGenerating))},dependencies:[oa,Rg,FC,yn,ro,so,Ca,In,Ia,Ba,nB,_d,nm],styles:[\".builder-assistant-panel[_ngcontent-%COMP%]{position:fixed;right:0;top:72px;width:400px;height:calc(100vh - 72px);background:var(--builder-assistant-panel-background-color);border-left:1px solid var(--builder-assistant-panel-border-color);box-shadow:-2px 0 10px #0006;z-index:999;display:flex;flex-direction:column;transition:transform .3s ease}.builder-assistant-panel.hidden[_ngcontent-%COMP%]{transform:translate(100%)}.panel-header[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:space-between;padding:16px 20px;border-bottom:1px solid var(--builder-assistant-panel-border-color);background:var(--builder-assistant-panel-header-background-color)}.panel-title[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;font-weight:400;font-size:16px;color:var(--builder-text-primary-color);font-family:Google Sans,Helvetica Neue,sans-serif}.panel-title[_ngcontent-%COMP%]   mat-icon[_ngcontent-%COMP%]{color:var(--builder-text-primary-color);font-size:20px;width:20px;height:20px}.close-btn[_ngcontent-%COMP%]{color:var(--builder-text-tertiary-color)}.close-btn[_ngcontent-%COMP%]:hover{color:var(--builder-text-primary-color);background-color:var(--builder-add-button-background-color)}.panel-content[_ngcontent-%COMP%]{flex:1;display:flex;flex-direction:column;background:var(--builder-assistant-panel-background-color);overflow:hidden}.assistant-placeholder[_ngcontent-%COMP%]{display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;height:300px;color:var(--builder-text-secondary-color)}.assistant-placeholder[_ngcontent-%COMP%]   .large-icon[_ngcontent-%COMP%]{font-size:64px;width:64px;height:64px;margin-bottom:16px;color:var(--builder-button-primary-background-color)}.assistant-placeholder[_ngcontent-%COMP%]   h3[_ngcontent-%COMP%]{margin:0 0 8px;font-size:20px;font-weight:500;color:var(--builder-text-primary-color);font-family:Google Sans,Helvetica Neue,sans-serif}.assistant-placeholder[_ngcontent-%COMP%]   p[_ngcontent-%COMP%]{margin:0;font-size:14px;line-height:1.5;color:var(--builder-text-secondary-color)}.chat-messages[_ngcontent-%COMP%]{flex:1;padding:20px;overflow-y:auto;display:flex;flex-direction:column}.chat-input-container[_ngcontent-%COMP%]{padding:16px 20px 20px;border-top:none;background:var(--builder-assistant-panel-background-color)}.input-wrapper[_ngcontent-%COMP%]{display:flex;align-items:center;background-color:var(--builder-assistant-input-background-color);border-radius:50px;padding:10px 6px 10px 18px;gap:8px}.assistant-input-box[_ngcontent-%COMP%]{flex:1;color:var(--builder-assistant-input-text-color);border:none;padding:0;background:transparent;resize:none;overflow:hidden;font-family:Google Sans,Helvetica Neue,sans-serif;font-size:14px;line-height:20px;min-height:20px;max-height:120px}.assistant-input-box[_ngcontent-%COMP%]::placeholder{color:var(--builder-assistant-input-placeholder-color);font-size:14px}.assistant-input-box[_ngcontent-%COMP%]:focus{outline:none}.assistant-input-box[_ngcontent-%COMP%]::-webkit-scrollbar{width:4px}.assistant-input-box[_ngcontent-%COMP%]::-webkit-scrollbar-thumb{background:var(--builder-border-color);border-radius:4px}.send-button[_ngcontent-%COMP%]{background-color:transparent;color:var(--builder-assistant-send-button-color);width:36px;height:36px;min-width:36px;flex-shrink:0;margin:0;padding:0}.send-button[_ngcontent-%COMP%]     .mat-mdc-button-touch-target{display:none}.send-button[_ngcontent-%COMP%]     .mat-mdc-button-persistent-ripple{display:none}.send-button[_ngcontent-%COMP%]:disabled{background-color:transparent;color:var(--builder-assistant-send-button-disabled-color)}.send-button[_ngcontent-%COMP%]:hover:not(:disabled){background-color:var(--builder-add-button-background-color);color:var(--builder-assistant-send-button-hover-color);border-radius:50%}.send-button[_ngcontent-%COMP%]   mat-icon[_ngcontent-%COMP%]{font-size:20px;width:20px;height:20px}.message-card[_ngcontent-%COMP%]{padding:10px 16px;margin:6px 0;font-size:14px;font-weight:400;position:relative;display:block;box-shadow:none;line-height:1.5;width:100%}.user-message[_ngcontent-%COMP%]{display:block;width:100%;margin-bottom:12px}.user-message[_ngcontent-%COMP%]   .message-card[_ngcontent-%COMP%]{background-color:var(--builder-assistant-user-message-background-color);border:1px solid var(--builder-assistant-user-message-border-color);border-radius:4px;color:var(--builder-assistant-user-message-text-color);padding:8px 12px}.bot-message[_ngcontent-%COMP%]{display:block;width:100%;margin-bottom:0}.bot-message[_ngcontent-%COMP%]   .message-card[_ngcontent-%COMP%]{background-color:transparent;border:none;border-radius:0;color:var(--builder-assistant-bot-message-text-color);padding:0;margin:0}.bot-label[_ngcontent-%COMP%]{font-size:12px;font-weight:500;color:var(--builder-text-secondary-color);margin-bottom:8px;font-family:Google Sans,Helvetica Neue,sans-serif}.message-text[_ngcontent-%COMP%]{white-space:pre-line;word-break:break-word;overflow-wrap:break-word;font-family:Google Sans,Helvetica Neue,sans-serif}.message-text[_ngcontent-%COMP%]     p{margin:0;line-height:1.4}.message-text[_ngcontent-%COMP%]     p:first-child{margin-top:0}.message-text[_ngcontent-%COMP%]     p:last-child{margin-bottom:0}.message-text[_ngcontent-%COMP%]     ul, .message-text[_ngcontent-%COMP%]     ol{margin:0;padding-left:1.5em}.message-text[_ngcontent-%COMP%]     li{margin:0}.message-text[_ngcontent-%COMP%]     code{background-color:#ffffff1a;padding:2px 4px;border-radius:3px;font-family:Monaco,Menlo,Ubuntu Mono,monospace;font-size:.9em}.message-text[_ngcontent-%COMP%]     pre{background-color:#ffffff0d;padding:8px 12px;border-radius:6px;overflow-x:auto;margin:.5em 0}.message-text[_ngcontent-%COMP%]     pre code{background:none;padding:0}.message-text[_ngcontent-%COMP%]     blockquote{border-left:3px solid var(--builder-button-primary-background-color);padding-left:12px;margin:.5em 0;font-style:italic;color:var(--builder-text-tertiary-color)}.message-text[_ngcontent-%COMP%]     strong{font-weight:600}.message-text[_ngcontent-%COMP%]     em{font-style:italic}.loading-message[_ngcontent-%COMP%]{display:flex;align-items:center;color:var(--builder-text-secondary-color);font-family:Google Sans,Helvetica Neue,sans-serif;padding:0;margin:0}.loading-message[_ngcontent-%COMP%]   .dots[_ngcontent-%COMP%]{font-size:24px;letter-spacing:-12px;animation:_ngcontent-%COMP%_pulse 1.4s ease-in-out infinite;display:inline-block;line-height:1}@keyframes _ngcontent-%COMP%_pulse{0%,to{opacity:.3}50%{opacity:1}}\"]})};var DE=class t{constructor(e,A){this.http=e;this.zone=A}apiServerDomain=kr.getApiServerBaseUrl();_currentApp=new Jt(\"\");currentApp=this._currentApp.asObservable();isLoading=new Jt(!1);getApp(){return this.currentApp}setApp(e){this._currentApp.next(e)}getLoadingState(){return this.isLoading}runSse(e){let A=this.apiServerDomain+\"/run_sse\";return this.isLoading.next(!0),new Ti(i=>{let n=this;fetch(A,{method:\"POST\",headers:{\"Content-Type\":\"application/json\",Accept:\"text/event-stream\"},body:JSON.stringify(e)}).then(o=>{let a=o.body?.getReader(),r=new TextDecoder(\"utf-8\"),s=\"\",g=()=>{a?.read().then(({done:l,value:C})=>{if(this.isLoading.next(!0),l)return this.isLoading.next(!1),i.complete();let I=r.decode(C,{stream:!0});s+=I;try{s.split(/\\r?\\n/).filter(B=>B.startsWith(\"data:\")).forEach(B=>{let Q=B.replace(/^data:\\s*/,\"\"),E=JSON.parse(Q);n.zone.run(()=>i.next(E))}),s=\"\"}catch(d){d instanceof SyntaxError&&g()}g()}).catch(l=>{n.zone.run(()=>i.error(l))})};g()}).catch(o=>{n.zone.run(()=>i.error(o))})})}listApps(){if(this.apiServerDomain!=null){let e=this.apiServerDomain+\"/list-apps?relative_path=./\";return this.http.get(e)}return new Ti}agentBuild(e){if(this.apiServerDomain!=null){let A=this.apiServerDomain+\"/builder/save\";return this.http.post(A,e)}return new Ti}agentBuildTmp(e){if(this.apiServerDomain!=null){let A=this.apiServerDomain+\"/builder/save?tmp=true\";return this.http.post(A,e)}return new Ti}getAgentBuilder(e){if(this.apiServerDomain!=null){let A=this.apiServerDomain+`/builder/app/${e}?ts=${Date.now()}`;return this.http.get(A,{responseType:\"text\"})}return new Ti}getAgentBuilderTmp(e){if(this.apiServerDomain!=null){let A=this.apiServerDomain+`/builder/app/${e}?ts=${Date.now()}&tmp=true`;return this.http.get(A,{responseType:\"text\"})}return new Ti}getSubAgentBuilder(e,A){if(this.apiServerDomain!=null){let i=this.apiServerDomain+`/builder/app/${e}?ts=${Date.now()}&file_path=${A}&tmp=true`;return this.http.get(i,{responseType:\"text\"})}return new Ti}agentChangeCancel(e){if(this.apiServerDomain!=null){let A=this.apiServerDomain+`/builder/app/${e}/cancel`;return this.http.post(A,{})}return new Ti}getAppInfo(e){if(this.apiServerDomain!=null){let A=this.apiServerDomain+`/dev/build_graph/${e}`;return this.http.get(A)}return new Ti}static \\u0275fac=function(A){return new(A||t)(Do(ks),Do(Oe))};static \\u0275prov=TA({token:t,factory:t.\\u0275fac,providedIn:\"root\"})};var Cw=\"http://www.w3.org/1999/xhtml\",DN={svg:\"http://www.w3.org/2000/svg\",xhtml:Cw,xlink:\"http://www.w3.org/1999/xlink\",xml:\"http://www.w3.org/XML/1998/namespace\",xmlns:\"http://www.w3.org/2000/xmlns/\"};function wC(t){var e=t+=\"\",A=e.indexOf(\":\");return A>=0&&(e=t.slice(0,A))!==\"xmlns\"&&(t=t.slice(A+1)),DN.hasOwnProperty(e)?{space:DN[e],local:t}:t}function avA(t){return function(){var e=this.ownerDocument,A=this.namespaceURI;return A===Cw&&e.documentElement.namespaceURI===Cw?e.createElement(t):e.createElementNS(A,t)}}function rvA(t){return function(){return this.ownerDocument.createElementNS(t.space,t.local)}}function Iw(t){var e=wC(t);return(e.local?rvA:avA)(e)}function svA(){}function nd(t){return t==null?svA:function(){return this.querySelector(t)}}function K$(t){typeof t!=\"function\"&&(t=nd(t));for(var e=this._groups,A=e.length,i=new Array(A),n=0;n<A;++n)for(var o=e[n],a=o.length,r=i[n]=new Array(a),s,g,l=0;l<a;++l)(s=o[l])&&(g=t.call(s,s.__data__,l,o))&&(\"__data__\"in s&&(g.__data__=s.__data__),r[l]=g);return new ka(i,this._parents)}function wN(t){return t==null?[]:Array.isArray(t)?t:Array.from(t)}function gvA(){return[]}function vu(t){return t==null?gvA:function(){return this.querySelectorAll(t)}}function lvA(t){return function(){return wN(t.apply(this,arguments))}}function U$(t){typeof t==\"function\"?t=lvA(t):t=vu(t);for(var e=this._groups,A=e.length,i=[],n=[],o=0;o<A;++o)for(var a=e[o],r=a.length,s,g=0;g<r;++g)(s=a[g])&&(i.push(t.call(s,s.__data__,g,a)),n.push(s));return new ka(i,n)}function bu(t){return function(){return this.matches(t)}}function dw(t){return function(e){return e.matches(t)}}var cvA=Array.prototype.find;function CvA(t){return function(){return cvA.call(this.children,t)}}function IvA(){return this.firstElementChild}function J$(t){return this.select(t==null?IvA:CvA(typeof t==\"function\"?t:dw(t)))}var dvA=Array.prototype.filter;function BvA(){return Array.from(this.children)}function QvA(t){return function(){return dvA.call(this.children,t)}}function Y$(t){return this.selectAll(t==null?BvA:QvA(typeof t==\"function\"?t:dw(t)))}function H$(t){typeof t!=\"function\"&&(t=bu(t));for(var e=this._groups,A=e.length,i=new Array(A),n=0;n<A;++n)for(var o=e[n],a=o.length,r=i[n]=[],s,g=0;g<a;++g)(s=o[g])&&t.call(s,s.__data__,g,o)&&r.push(s);return new ka(i,this._parents)}function Bw(t){return new Array(t.length)}function T$(){return new ka(this._enter||this._groups.map(Bw),this._parents)}function Mu(t,e){this.ownerDocument=t.ownerDocument,this.namespaceURI=t.namespaceURI,this._next=null,this._parent=t,this.__data__=e}Mu.prototype={constructor:Mu,appendChild:function(t){return this._parent.insertBefore(t,this._next)},insertBefore:function(t,e){return this._parent.insertBefore(t,e)},querySelector:function(t){return this._parent.querySelector(t)},querySelectorAll:function(t){return this._parent.querySelectorAll(t)}};function O$(t){return function(){return t}}function EvA(t,e,A,i,n,o){for(var a=0,r,s=e.length,g=o.length;a<g;++a)(r=e[a])?(r.__data__=o[a],i[a]=r):A[a]=new Mu(t,o[a]);for(;a<s;++a)(r=e[a])&&(n[a]=r)}function hvA(t,e,A,i,n,o,a){var r,s,g=new Map,l=e.length,C=o.length,I=new Array(l),d;for(r=0;r<l;++r)(s=e[r])&&(I[r]=d=a.call(s,s.__data__,r,e)+\"\",g.has(d)?n[r]=s:g.set(d,s));for(r=0;r<C;++r)d=a.call(t,o[r],r,o)+\"\",(s=g.get(d))?(i[r]=s,s.__data__=o[r],g.delete(d)):A[r]=new Mu(t,o[r]);for(r=0;r<l;++r)(s=e[r])&&g.get(I[r])===s&&(n[r]=s)}function uvA(t){return t.__data__}function z$(t,e){if(!arguments.length)return Array.from(this,uvA);var A=e?hvA:EvA,i=this._parents,n=this._groups;typeof t!=\"function\"&&(t=O$(t));for(var o=n.length,a=new Array(o),r=new Array(o),s=new Array(o),g=0;g<o;++g){var l=i[g],C=n[g],I=C.length,d=fvA(t.call(l,l&&l.__data__,g,i)),B=d.length,Q=r[g]=new Array(B),E=a[g]=new Array(B),f=s[g]=new Array(I);A(l,C,Q,E,f,d,e);for(var b=0,R=0,M,v;b<B;++b)if(M=Q[b]){for(b>=R&&(R=b+1);!(v=E[R])&&++R<B;);M._next=v||null}}return a=new ka(a,i),a._enter=r,a._exit=s,a}function fvA(t){return typeof t==\"object\"&&\"length\"in t?t:Array.from(t)}function P$(){return new ka(this._exit||this._groups.map(Bw),this._parents)}function j$(t,e,A){var i=this.enter(),n=this,o=this.exit();return typeof t==\"function\"?(i=t(i),i&&(i=i.selection())):i=i.append(t+\"\"),e!=null&&(n=e(n),n&&(n=n.selection())),A==null?o.remove():A(o),i&&n?i.merge(n).order():n}function q$(t){for(var e=t.selection?t.selection():t,A=this._groups,i=e._groups,n=A.length,o=i.length,a=Math.min(n,o),r=new Array(n),s=0;s<a;++s)for(var g=A[s],l=i[s],C=g.length,I=r[s]=new Array(C),d,B=0;B<C;++B)(d=g[B]||l[B])&&(I[B]=d);for(;s<n;++s)r[s]=A[s];return new ka(r,this._parents)}function V$(){for(var t=this._groups,e=-1,A=t.length;++e<A;)for(var i=t[e],n=i.length-1,o=i[n],a;--n>=0;)(a=i[n])&&(o&&a.compareDocumentPosition(o)^4&&o.parentNode.insertBefore(a,o),o=a);return this}function W$(t){t||(t=mvA);function e(C,I){return C&&I?t(C.__data__,I.__data__):!C-!I}for(var A=this._groups,i=A.length,n=new Array(i),o=0;o<i;++o){for(var a=A[o],r=a.length,s=n[o]=new Array(r),g,l=0;l<r;++l)(g=a[l])&&(s[l]=g);s.sort(e)}return new ka(n,this._parents).order()}function mvA(t,e){return t<e?-1:t>e?1:t>=e?0:NaN}function Z$(){var t=arguments[0];return arguments[0]=this,t.apply(null,arguments),this}function X$(){return Array.from(this)}function $$(){for(var t=this._groups,e=0,A=t.length;e<A;++e)for(var i=t[e],n=0,o=i.length;n<o;++n){var a=i[n];if(a)return a}return null}function AAA(){let t=0;for(let e of this)++t;return t}function eAA(){return!this.node()}function tAA(t){for(var e=this._groups,A=0,i=e.length;A<i;++A)for(var n=e[A],o=0,a=n.length,r;o<a;++o)(r=n[o])&&t.call(r,r.__data__,o,n);return this}function pvA(t){return function(){this.removeAttribute(t)}}function DvA(t){return function(){this.removeAttributeNS(t.space,t.local)}}function wvA(t,e){return function(){this.setAttribute(t,e)}}function yvA(t,e){return function(){this.setAttributeNS(t.space,t.local,e)}}function vvA(t,e){return function(){var A=e.apply(this,arguments);A==null?this.removeAttribute(t):this.setAttribute(t,A)}}function bvA(t,e){return function(){var A=e.apply(this,arguments);A==null?this.removeAttributeNS(t.space,t.local):this.setAttributeNS(t.space,t.local,A)}}function iAA(t,e){var A=wC(t);if(arguments.length<2){var i=this.node();return A.local?i.getAttributeNS(A.space,A.local):i.getAttribute(A)}return this.each((e==null?A.local?DvA:pvA:typeof e==\"function\"?A.local?bvA:vvA:A.local?yvA:wvA)(A,e))}function Qw(t){return t.ownerDocument&&t.ownerDocument.defaultView||t.document&&t||t.defaultView}function MvA(t){return function(){this.style.removeProperty(t)}}function kvA(t,e,A){return function(){this.style.setProperty(t,e,A)}}function SvA(t,e,A){return function(){var i=e.apply(this,arguments);i==null?this.style.removeProperty(t):this.style.setProperty(t,i,A)}}function nAA(t,e,A){return arguments.length>1?this.each((e==null?MvA:typeof e==\"function\"?SvA:kvA)(t,e,A??\"\")):II(this.node(),t)}function II(t,e){return t.style.getPropertyValue(e)||Qw(t).getComputedStyle(t,null).getPropertyValue(e)}function xvA(t){return function(){delete this[t]}}function RvA(t,e){return function(){this[t]=e}}function NvA(t,e){return function(){var A=e.apply(this,arguments);A==null?delete this[t]:this[t]=A}}function oAA(t,e){return arguments.length>1?this.each((e==null?xvA:typeof e==\"function\"?NvA:RvA)(t,e)):this.node()[t]}function aAA(t){return t.trim().split(/^|\\s+/)}function yN(t){return t.classList||new rAA(t)}function rAA(t){this._node=t,this._names=aAA(t.getAttribute(\"class\")||\"\")}rAA.prototype={add:function(t){var e=this._names.indexOf(t);e<0&&(this._names.push(t),this._node.setAttribute(\"class\",this._names.join(\" \")))},remove:function(t){var e=this._names.indexOf(t);e>=0&&(this._names.splice(e,1),this._node.setAttribute(\"class\",this._names.join(\" \")))},contains:function(t){return this._names.indexOf(t)>=0}};function sAA(t,e){for(var A=yN(t),i=-1,n=e.length;++i<n;)A.add(e[i])}function gAA(t,e){for(var A=yN(t),i=-1,n=e.length;++i<n;)A.remove(e[i])}function FvA(t){return function(){sAA(this,t)}}function LvA(t){return function(){gAA(this,t)}}function _vA(t,e){return function(){(e.apply(this,arguments)?sAA:gAA)(this,t)}}function lAA(t,e){var A=aAA(t+\"\");if(arguments.length<2){for(var i=yN(this.node()),n=-1,o=A.length;++n<o;)if(!i.contains(A[n]))return!1;return!0}return this.each((typeof e==\"function\"?_vA:e?FvA:LvA)(A,e))}function GvA(){this.textContent=\"\"}function KvA(t){return function(){this.textContent=t}}function UvA(t){return function(){var e=t.apply(this,arguments);this.textContent=e??\"\"}}function cAA(t){return arguments.length?this.each(t==null?GvA:(typeof t==\"function\"?UvA:KvA)(t)):this.node().textContent}function JvA(){this.innerHTML=\"\"}function YvA(t){return function(){this.innerHTML=t}}function HvA(t){return function(){var e=t.apply(this,arguments);this.innerHTML=e??\"\"}}function CAA(t){return arguments.length?this.each(t==null?JvA:(typeof t==\"function\"?HvA:YvA)(t)):this.node().innerHTML}function TvA(){this.nextSibling&&this.parentNode.appendChild(this)}function IAA(){return this.each(TvA)}function OvA(){this.previousSibling&&this.parentNode.insertBefore(this,this.parentNode.firstChild)}function dAA(){return this.each(OvA)}function BAA(t){var e=typeof t==\"function\"?t:Iw(t);return this.select(function(){return this.appendChild(e.apply(this,arguments))})}function zvA(){return null}function QAA(t,e){var A=typeof t==\"function\"?t:Iw(t),i=e==null?zvA:typeof e==\"function\"?e:nd(e);return this.select(function(){return this.insertBefore(A.apply(this,arguments),i.apply(this,arguments)||null)})}function PvA(){var t=this.parentNode;t&&t.removeChild(this)}function EAA(){return this.each(PvA)}function jvA(){var t=this.cloneNode(!1),e=this.parentNode;return e?e.insertBefore(t,this.nextSibling):t}function qvA(){var t=this.cloneNode(!0),e=this.parentNode;return e?e.insertBefore(t,this.nextSibling):t}function hAA(t){return this.select(t?qvA:jvA)}function uAA(t){return arguments.length?this.property(\"__data__\",t):this.node().__data__}function VvA(t){return function(e){t.call(this,e,this.__data__)}}function WvA(t){return t.trim().split(/^|\\s+/).map(function(e){var A=\"\",i=e.indexOf(\".\");return i>=0&&(A=e.slice(i+1),e=e.slice(0,i)),{type:e,name:A}})}function ZvA(t){return function(){var e=this.__on;if(e){for(var A=0,i=-1,n=e.length,o;A<n;++A)o=e[A],(!t.type||o.type===t.type)&&o.name===t.name?this.removeEventListener(o.type,o.listener,o.options):e[++i]=o;++i?e.length=i:delete this.__on}}}function XvA(t,e,A){return function(){var i=this.__on,n,o=VvA(e);if(i){for(var a=0,r=i.length;a<r;++a)if((n=i[a]).type===t.type&&n.name===t.name){this.removeEventListener(n.type,n.listener,n.options),this.addEventListener(n.type,n.listener=o,n.options=A),n.value=e;return}}this.addEventListener(t.type,o,A),n={type:t.type,name:t.name,value:e,listener:o,options:A},i?i.push(n):this.__on=[n]}}function fAA(t,e,A){var i=WvA(t+\"\"),n,o=i.length,a;if(arguments.length<2){var r=this.node().__on;if(r){for(var s=0,g=r.length,l;s<g;++s)for(n=0,l=r[s];n<o;++n)if((a=i[n]).type===l.type&&a.name===l.name)return l.value}return}for(r=e?XvA:ZvA,n=0;n<o;++n)this.each(r(i[n],e,A));return this}function mAA(t,e,A){var i=Qw(t),n=i.CustomEvent;typeof n==\"function\"?n=new n(e,A):(n=i.document.createEvent(\"Event\"),A?(n.initEvent(e,A.bubbles,A.cancelable),n.detail=A.detail):n.initEvent(e,!1,!1)),t.dispatchEvent(n)}function $vA(t,e){return function(){return mAA(this,t,e)}}function A7A(t,e){return function(){return mAA(this,t,e.apply(this,arguments))}}function pAA(t,e){return this.each((typeof e==\"function\"?A7A:$vA)(t,e))}function*DAA(){for(var t=this._groups,e=0,A=t.length;e<A;++e)for(var i=t[e],n=0,o=i.length,a;n<o;++n)(a=i[n])&&(yield a)}var vN=[null];function ka(t,e){this._groups=t,this._parents=e}function wAA(){return new ka([[document.documentElement]],vN)}function e7A(){return this}ka.prototype=wAA.prototype={constructor:ka,select:K$,selectAll:U$,selectChild:J$,selectChildren:Y$,filter:H$,data:z$,enter:T$,exit:P$,join:j$,merge:q$,selection:e7A,order:V$,sort:W$,call:Z$,nodes:X$,node:$$,size:AAA,empty:eAA,each:tAA,attr:iAA,style:nAA,property:oAA,classed:lAA,text:cAA,html:CAA,raise:IAA,lower:dAA,append:BAA,insert:QAA,remove:EAA,clone:hAA,datum:uAA,on:fAA,dispatch:pAA,[Symbol.iterator]:DAA};var yC=wAA;function ur(t){return typeof t==\"string\"?new ka([[document.querySelector(t)]],[document.documentElement]):new ka([[t]],vN)}function yAA(t){let e;for(;e=t.sourceEvent;)t=e;return t}function Cl(t,e){if(t=yAA(t),e===void 0&&(e=t.currentTarget),e){var A=e.ownerSVGElement||e;if(A.createSVGPoint){var i=A.createSVGPoint();return i.x=t.clientX,i.y=t.clientY,i=i.matrixTransform(e.getScreenCTM().inverse()),[i.x,i.y]}if(e.getBoundingClientRect){var n=e.getBoundingClientRect();return[t.clientX-n.left-e.clientLeft,t.clientY-n.top-e.clientTop]}}return[t.pageX,t.pageY]}var t7A={value:()=>{}};function bAA(){for(var t=0,e=arguments.length,A={},i;t<e;++t){if(!(i=arguments[t]+\"\")||i in A||/[\\s.]/.test(i))throw new Error(\"illegal type: \"+i);A[i]=[]}return new Ew(A)}function Ew(t){this._=t}function i7A(t,e){return t.trim().split(/^|\\s+/).map(function(A){var i=\"\",n=A.indexOf(\".\");if(n>=0&&(i=A.slice(n+1),A=A.slice(0,n)),A&&!e.hasOwnProperty(A))throw new Error(\"unknown type: \"+A);return{type:A,name:i}})}Ew.prototype=bAA.prototype={constructor:Ew,on:function(t,e){var A=this._,i=i7A(t+\"\",A),n,o=-1,a=i.length;if(arguments.length<2){for(;++o<a;)if((n=(t=i[o]).type)&&(n=n7A(A[n],t.name)))return n;return}if(e!=null&&typeof e!=\"function\")throw new Error(\"invalid callback: \"+e);for(;++o<a;)if(n=(t=i[o]).type)A[n]=vAA(A[n],t.name,e);else if(e==null)for(n in A)A[n]=vAA(A[n],t.name,null);return this},copy:function(){var t={},e=this._;for(var A in e)t[A]=e[A].slice();return new Ew(t)},call:function(t,e){if((n=arguments.length-2)>0)for(var A=new Array(n),i=0,n,o;i<n;++i)A[i]=arguments[i+2];if(!this._.hasOwnProperty(t))throw new Error(\"unknown type: \"+t);for(o=this._[t],i=0,n=o.length;i<n;++i)o[i].value.apply(e,A)},apply:function(t,e,A){if(!this._.hasOwnProperty(t))throw new Error(\"unknown type: \"+t);for(var i=this._[t],n=0,o=i.length;n<o;++n)i[n].value.apply(e,A)}};function n7A(t,e){for(var A=0,i=t.length,n;A<i;++A)if((n=t[A]).name===e)return n.value}function vAA(t,e,A){for(var i=0,n=t.length;i<n;++i)if(t[i].name===e){t[i]=t7A,t=t.slice(0,i).concat(t.slice(i+1));break}return A!=null&&t.push({name:e,value:A}),t}var od=bAA;var MAA={passive:!1},ad={capture:!0,passive:!1};function hw(t){t.stopImmediatePropagation()}function dI(t){t.preventDefault(),t.stopImmediatePropagation()}function ku(t){var e=t.document.documentElement,A=ur(t).on(\"dragstart.drag\",dI,ad);\"onselectstart\"in e?A.on(\"selectstart.drag\",dI,ad):(e.__noselect=e.style.MozUserSelect,e.style.MozUserSelect=\"none\")}function Su(t,e){var A=t.document.documentElement,i=ur(t).on(\"dragstart.drag\",null);e&&(i.on(\"click.drag\",dI,ad),setTimeout(function(){i.on(\"click.drag\",null)},0)),\"onselectstart\"in A?i.on(\"selectstart.drag\",null):(A.style.MozUserSelect=A.__noselect,delete A.__noselect)}var xu=t=>()=>t;function Ru(t,{sourceEvent:e,subject:A,target:i,identifier:n,active:o,x:a,y:r,dx:s,dy:g,dispatch:l}){Object.defineProperties(this,{type:{value:t,enumerable:!0,configurable:!0},sourceEvent:{value:e,enumerable:!0,configurable:!0},subject:{value:A,enumerable:!0,configurable:!0},target:{value:i,enumerable:!0,configurable:!0},identifier:{value:n,enumerable:!0,configurable:!0},active:{value:o,enumerable:!0,configurable:!0},x:{value:a,enumerable:!0,configurable:!0},y:{value:r,enumerable:!0,configurable:!0},dx:{value:s,enumerable:!0,configurable:!0},dy:{value:g,enumerable:!0,configurable:!0},_:{value:l}})}Ru.prototype.on=function(){var t=this._.on.apply(this._,arguments);return t===this._?this:t};function o7A(t){return!t.ctrlKey&&!t.button}function a7A(){return this.parentNode}function r7A(t,e){return e??{x:t.x,y:t.y}}function s7A(){return navigator.maxTouchPoints||\"ontouchstart\"in this}function uw(){var t=o7A,e=a7A,A=r7A,i=s7A,n={},o=od(\"start\",\"drag\",\"end\"),a=0,r,s,g,l,C=0;function I(M){M.on(\"mousedown.drag\",d).filter(i).on(\"touchstart.drag\",E).on(\"touchmove.drag\",f,MAA).on(\"touchend.drag touchcancel.drag\",b).style(\"touch-action\",\"none\").style(\"-webkit-tap-highlight-color\",\"rgba(0,0,0,0)\")}function d(M,v){if(!(l||!t.call(this,M,v))){var F=R(this,e.call(this,M,v),M,v,\"mouse\");F&&(ur(M.view).on(\"mousemove.drag\",B,ad).on(\"mouseup.drag\",Q,ad),ku(M.view),hw(M),g=!1,r=M.clientX,s=M.clientY,F(\"start\",M))}}function B(M){if(dI(M),!g){var v=M.clientX-r,F=M.clientY-s;g=v*v+F*F>C}n.mouse(\"drag\",M)}function Q(M){ur(M.view).on(\"mousemove.drag mouseup.drag\",null),Su(M.view,g),dI(M),n.mouse(\"end\",M)}function E(M,v){if(t.call(this,M,v)){var F=M.changedTouches,G=e.call(this,M,v),U=F.length,Y,j;for(Y=0;Y<U;++Y)(j=R(this,G,M,v,F[Y].identifier,F[Y]))&&(hw(M),j(\"start\",M,F[Y]))}}function f(M){var v=M.changedTouches,F=v.length,G,U;for(G=0;G<F;++G)(U=n[v[G].identifier])&&(dI(M),U(\"drag\",M,v[G]))}function b(M){var v=M.changedTouches,F=v.length,G,U;for(l&&clearTimeout(l),l=setTimeout(function(){l=null},500),G=0;G<F;++G)(U=n[v[G].identifier])&&(hw(M),U(\"end\",M,v[G]))}function R(M,v,F,G,U,Y){var j=o.copy(),AA=Cl(Y||F,v),z,yA,P;if((P=A.call(M,new Ru(\"beforestart\",{sourceEvent:F,target:I,identifier:U,active:a,x:AA[0],y:AA[1],dx:0,dy:0,dispatch:j}),G))!=null)return z=P.x-AA[0]||0,yA=P.y-AA[1]||0,function nA(eA,dA,iA){var aA=AA,hA;switch(eA){case\"start\":n[U]=nA,hA=a++;break;case\"end\":delete n[U],--a;case\"drag\":AA=Cl(iA||dA,v),hA=a;break}j.call(eA,M,new Ru(eA,{sourceEvent:dA,subject:P,target:I,identifier:U,active:hA,x:AA[0]+z,y:AA[1]+yA,dx:AA[0]-aA[0],dy:AA[1]-aA[1],dispatch:j}),G)}}return I.filter=function(M){return arguments.length?(t=typeof M==\"function\"?M:xu(!!M),I):t},I.container=function(M){return arguments.length?(e=typeof M==\"function\"?M:xu(M),I):e},I.subject=function(M){return arguments.length?(A=typeof M==\"function\"?M:xu(M),I):A},I.touchable=function(M){return arguments.length?(i=typeof M==\"function\"?M:xu(!!M),I):i},I.on=function(){var M=o.on.apply(o,arguments);return M===o?I:M},I.clickDistance=function(M){return arguments.length?(C=(M=+M)*M,I):Math.sqrt(C)},I}function fw(t,e,A){t.prototype=e.prototype=A,A.constructor=t}function bN(t,e){var A=Object.create(t.prototype);for(var i in e)A[i]=e[i];return A}function Lu(){}var Nu=.7,Dw=1/Nu,wE=\"\\\\s*([+-]?\\\\d+)\\\\s*\",Fu=\"\\\\s*([+-]?(?:\\\\d*\\\\.)?\\\\d+(?:[eE][+-]?\\\\d+)?)\\\\s*\",h0=\"\\\\s*([+-]?(?:\\\\d*\\\\.)?\\\\d+(?:[eE][+-]?\\\\d+)?)%\\\\s*\",g7A=/^#([0-9a-f]{3,8})$/,l7A=new RegExp(`^rgb\\\\(${wE},${wE},${wE}\\\\)$`),c7A=new RegExp(`^rgb\\\\(${h0},${h0},${h0}\\\\)$`),C7A=new RegExp(`^rgba\\\\(${wE},${wE},${wE},${Fu}\\\\)$`),I7A=new RegExp(`^rgba\\\\(${h0},${h0},${h0},${Fu}\\\\)$`),d7A=new RegExp(`^hsl\\\\(${Fu},${h0},${h0}\\\\)$`),B7A=new RegExp(`^hsla\\\\(${Fu},${h0},${h0},${Fu}\\\\)$`),kAA={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074};fw(Lu,BI,{copy(t){return Object.assign(new this.constructor,this,t)},displayable(){return this.rgb().displayable()},hex:SAA,formatHex:SAA,formatHex8:Q7A,formatHsl:E7A,formatRgb:xAA,toString:xAA});function SAA(){return this.rgb().formatHex()}function Q7A(){return this.rgb().formatHex8()}function E7A(){return GAA(this).formatHsl()}function xAA(){return this.rgb().formatRgb()}function BI(t){var e,A;return t=(t+\"\").trim().toLowerCase(),(e=g7A.exec(t))?(A=e[1].length,e=parseInt(e[1],16),A===6?RAA(e):A===3?new eg(e>>8&15|e>>4&240,e>>4&15|e&240,(e&15)<<4|e&15,1):A===8?mw(e>>24&255,e>>16&255,e>>8&255,(e&255)/255):A===4?mw(e>>12&15|e>>8&240,e>>8&15|e>>4&240,e>>4&15|e&240,((e&15)<<4|e&15)/255):null):(e=l7A.exec(t))?new eg(e[1],e[2],e[3],1):(e=c7A.exec(t))?new eg(e[1]*255/100,e[2]*255/100,e[3]*255/100,1):(e=C7A.exec(t))?mw(e[1],e[2],e[3],e[4]):(e=I7A.exec(t))?mw(e[1]*255/100,e[2]*255/100,e[3]*255/100,e[4]):(e=d7A.exec(t))?LAA(e[1],e[2]/100,e[3]/100,1):(e=B7A.exec(t))?LAA(e[1],e[2]/100,e[3]/100,e[4]):kAA.hasOwnProperty(t)?RAA(kAA[t]):t===\"transparent\"?new eg(NaN,NaN,NaN,0):null}function RAA(t){return new eg(t>>16&255,t>>8&255,t&255,1)}function mw(t,e,A,i){return i<=0&&(t=e=A=NaN),new eg(t,e,A,i)}function h7A(t){return t instanceof Lu||(t=BI(t)),t?(t=t.rgb(),new eg(t.r,t.g,t.b,t.opacity)):new eg}function yE(t,e,A,i){return arguments.length===1?h7A(t):new eg(t,e,A,i??1)}function eg(t,e,A,i){this.r=+t,this.g=+e,this.b=+A,this.opacity=+i}fw(eg,yE,bN(Lu,{brighter(t){return t=t==null?Dw:Math.pow(Dw,t),new eg(this.r*t,this.g*t,this.b*t,this.opacity)},darker(t){return t=t==null?Nu:Math.pow(Nu,t),new eg(this.r*t,this.g*t,this.b*t,this.opacity)},rgb(){return this},clamp(){return new eg(sd(this.r),sd(this.g),sd(this.b),ww(this.opacity))},displayable(){return-.5<=this.r&&this.r<255.5&&-.5<=this.g&&this.g<255.5&&-.5<=this.b&&this.b<255.5&&0<=this.opacity&&this.opacity<=1},hex:NAA,formatHex:NAA,formatHex8:u7A,formatRgb:FAA,toString:FAA}));function NAA(){return`#${rd(this.r)}${rd(this.g)}${rd(this.b)}`}function u7A(){return`#${rd(this.r)}${rd(this.g)}${rd(this.b)}${rd((isNaN(this.opacity)?1:this.opacity)*255)}`}function FAA(){let t=ww(this.opacity);return`${t===1?\"rgb(\":\"rgba(\"}${sd(this.r)}, ${sd(this.g)}, ${sd(this.b)}${t===1?\")\":`, ${t})`}`}function ww(t){return isNaN(t)?1:Math.max(0,Math.min(1,t))}function sd(t){return Math.max(0,Math.min(255,Math.round(t)||0))}function rd(t){return t=sd(t),(t<16?\"0\":\"\")+t.toString(16)}function LAA(t,e,A,i){return i<=0?t=e=A=NaN:A<=0||A>=1?t=e=NaN:e<=0&&(t=NaN),new Ic(t,e,A,i)}function GAA(t){if(t instanceof Ic)return new Ic(t.h,t.s,t.l,t.opacity);if(t instanceof Lu||(t=BI(t)),!t)return new Ic;if(t instanceof Ic)return t;t=t.rgb();var e=t.r/255,A=t.g/255,i=t.b/255,n=Math.min(e,A,i),o=Math.max(e,A,i),a=NaN,r=o-n,s=(o+n)/2;return r?(e===o?a=(A-i)/r+(A<i)*6:A===o?a=(i-e)/r+2:a=(e-A)/r+4,r/=s<.5?o+n:2-o-n,a*=60):r=s>0&&s<1?0:a,new Ic(a,r,s,t.opacity)}function KAA(t,e,A,i){return arguments.length===1?GAA(t):new Ic(t,e,A,i??1)}function Ic(t,e,A,i){this.h=+t,this.s=+e,this.l=+A,this.opacity=+i}fw(Ic,KAA,bN(Lu,{brighter(t){return t=t==null?Dw:Math.pow(Dw,t),new Ic(this.h,this.s,this.l*t,this.opacity)},darker(t){return t=t==null?Nu:Math.pow(Nu,t),new Ic(this.h,this.s,this.l*t,this.opacity)},rgb(){var t=this.h%360+(this.h<0)*360,e=isNaN(t)||isNaN(this.s)?0:this.s,A=this.l,i=A+(A<.5?A:1-A)*e,n=2*A-i;return new eg(MN(t>=240?t-240:t+120,n,i),MN(t,n,i),MN(t<120?t+240:t-120,n,i),this.opacity)},clamp(){return new Ic(_AA(this.h),pw(this.s),pw(this.l),ww(this.opacity))},displayable(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1},formatHsl(){let t=ww(this.opacity);return`${t===1?\"hsl(\":\"hsla(\"}${_AA(this.h)}, ${pw(this.s)*100}%, ${pw(this.l)*100}%${t===1?\")\":`, ${t})`}`}}));function _AA(t){return t=(t||0)%360,t<0?t+360:t}function pw(t){return Math.max(0,Math.min(1,t||0))}function MN(t,e,A){return(t<60?e+(A-e)*t/60:t<180?A:t<240?e+(A-e)*(240-t)/60:e)*255}function kN(t,e,A,i,n){var o=t*t,a=o*t;return((1-3*t+3*o-a)*e+(4-6*o+3*a)*A+(1+3*t+3*o-3*a)*i+a*n)/6}function UAA(t){var e=t.length-1;return function(A){var i=A<=0?A=0:A>=1?(A=1,e-1):Math.floor(A*e),n=t[i],o=t[i+1],a=i>0?t[i-1]:2*n-o,r=i<e-1?t[i+2]:2*o-n;return kN((A-i/e)*e,a,n,o,r)}}function JAA(t){var e=t.length;return function(A){var i=Math.floor(((A%=1)<0?++A:A)*e),n=t[(i+e-1)%e],o=t[i%e],a=t[(i+1)%e],r=t[(i+2)%e];return kN((A-i/e)*e,n,o,a,r)}}var SN=t=>()=>t;function f7A(t,e){return function(A){return t+A*e}}function m7A(t,e,A){return t=Math.pow(t,A),e=Math.pow(e,A)-t,A=1/A,function(i){return Math.pow(t+i*e,A)}}function YAA(t){return(t=+t)==1?yw:function(e,A){return A-e?m7A(e,A,t):SN(isNaN(e)?A:e)}}function yw(t,e){var A=e-t;return A?f7A(t,A):SN(isNaN(t)?e:t)}var vw=(function t(e){var A=YAA(e);function i(n,o){var a=A((n=yE(n)).r,(o=yE(o)).r),r=A(n.g,o.g),s=A(n.b,o.b),g=yw(n.opacity,o.opacity);return function(l){return n.r=a(l),n.g=r(l),n.b=s(l),n.opacity=g(l),n+\"\"}}return i.gamma=t,i})(1);function HAA(t){return function(e){var A=e.length,i=new Array(A),n=new Array(A),o=new Array(A),a,r;for(a=0;a<A;++a)r=yE(e[a]),i[a]=r.r||0,n[a]=r.g||0,o[a]=r.b||0;return i=t(i),n=t(n),o=t(o),r.opacity=1,function(s){return r.r=i(s),r.g=n(s),r.b=o(s),r+\"\"}}}var p7A=HAA(UAA),D7A=HAA(JAA);function Il(t,e){return t=+t,e=+e,function(A){return t*(1-A)+e*A}}var RN=/[-+]?(?:\\d+\\.?\\d*|\\.?\\d+)(?:[eE][-+]?\\d+)?/g,xN=new RegExp(RN.source,\"g\");function w7A(t){return function(){return t}}function y7A(t){return function(e){return t(e)+\"\"}}function NN(t,e){var A=RN.lastIndex=xN.lastIndex=0,i,n,o,a=-1,r=[],s=[];for(t=t+\"\",e=e+\"\";(i=RN.exec(t))&&(n=xN.exec(e));)(o=n.index)>A&&(o=e.slice(A,o),r[a]?r[a]+=o:r[++a]=o),(i=i[0])===(n=n[0])?r[a]?r[a]+=n:r[++a]=n:(r[++a]=null,s.push({i:a,x:Il(i,n)})),A=xN.lastIndex;return A<e.length&&(o=e.slice(A),r[a]?r[a]+=o:r[++a]=o),r.length<2?s[0]?y7A(s[0].x):w7A(e):(e=s.length,function(g){for(var l=0,C;l<e;++l)r[(C=s[l]).i]=C.x(g);return r.join(\"\")})}var TAA=180/Math.PI,bw={translateX:0,translateY:0,rotate:0,skewX:0,scaleX:1,scaleY:1};function FN(t,e,A,i,n,o){var a,r,s;return(a=Math.sqrt(t*t+e*e))&&(t/=a,e/=a),(s=t*A+e*i)&&(A-=t*s,i-=e*s),(r=Math.sqrt(A*A+i*i))&&(A/=r,i/=r,s/=r),t*i<e*A&&(t=-t,e=-e,s=-s,a=-a),{translateX:n,translateY:o,rotate:Math.atan2(e,t)*TAA,skewX:Math.atan(s)*TAA,scaleX:a,scaleY:r}}var Mw;function OAA(t){let e=new(typeof DOMMatrix==\"function\"?DOMMatrix:WebKitCSSMatrix)(t+\"\");return e.isIdentity?bw:FN(e.a,e.b,e.c,e.d,e.e,e.f)}function zAA(t){return t==null?bw:(Mw||(Mw=document.createElementNS(\"http://www.w3.org/2000/svg\",\"g\")),Mw.setAttribute(\"transform\",t),(t=Mw.transform.baseVal.consolidate())?(t=t.matrix,FN(t.a,t.b,t.c,t.d,t.e,t.f)):bw)}function PAA(t,e,A,i){function n(g){return g.length?g.pop()+\" \":\"\"}function o(g,l,C,I,d,B){if(g!==C||l!==I){var Q=d.push(\"translate(\",null,e,null,A);B.push({i:Q-4,x:Il(g,C)},{i:Q-2,x:Il(l,I)})}else(C||I)&&d.push(\"translate(\"+C+e+I+A)}function a(g,l,C,I){g!==l?(g-l>180?l+=360:l-g>180&&(g+=360),I.push({i:C.push(n(C)+\"rotate(\",null,i)-2,x:Il(g,l)})):l&&C.push(n(C)+\"rotate(\"+l+i)}function r(g,l,C,I){g!==l?I.push({i:C.push(n(C)+\"skewX(\",null,i)-2,x:Il(g,l)}):l&&C.push(n(C)+\"skewX(\"+l+i)}function s(g,l,C,I,d,B){if(g!==C||l!==I){var Q=d.push(n(d)+\"scale(\",null,\",\",null,\")\");B.push({i:Q-4,x:Il(g,C)},{i:Q-2,x:Il(l,I)})}else(C!==1||I!==1)&&d.push(n(d)+\"scale(\"+C+\",\"+I+\")\")}return function(g,l){var C=[],I=[];return g=t(g),l=t(l),o(g.translateX,g.translateY,l.translateX,l.translateY,C,I),a(g.rotate,l.rotate,C,I),r(g.skewX,l.skewX,C,I),s(g.scaleX,g.scaleY,l.scaleX,l.scaleY,C,I),g=l=null,function(d){for(var B=-1,Q=I.length,E;++B<Q;)C[(E=I[B]).i]=E.x(d);return C.join(\"\")}}}var LN=PAA(OAA,\"px, \",\"px)\",\"deg)\"),_N=PAA(zAA,\", \",\")\",\")\");var v7A=1e-12;function jAA(t){return((t=Math.exp(t))+1/t)/2}function b7A(t){return((t=Math.exp(t))-1/t)/2}function M7A(t){return((t=Math.exp(2*t))-1)/(t+1)}var GN=(function t(e,A,i){function n(o,a){var r=o[0],s=o[1],g=o[2],l=a[0],C=a[1],I=a[2],d=l-r,B=C-s,Q=d*d+B*B,E,f;if(Q<v7A)f=Math.log(I/g)/e,E=function(G){return[r+G*d,s+G*B,g*Math.exp(e*G*f)]};else{var b=Math.sqrt(Q),R=(I*I-g*g+i*Q)/(2*g*A*b),M=(I*I-g*g-i*Q)/(2*I*A*b),v=Math.log(Math.sqrt(R*R+1)-R),F=Math.log(Math.sqrt(M*M+1)-M);f=(F-v)/e,E=function(G){var U=G*f,Y=jAA(v),j=g/(A*b)*(Y*M7A(e*U+v)-b7A(v));return[r+j*d,s+j*B,g*Y/jAA(e*U+v)]}}return E.duration=f*1e3*e/Math.SQRT2,E}return n.rho=function(o){var a=Math.max(.001,+o),r=a*a,s=r*r;return t(a,r,s)},n})(Math.SQRT2,2,4);var vE=0,Gu=0,_u=0,VAA=1e3,kw,Ku,Sw=0,gd=0,xw=0,Uu=typeof performance==\"object\"&&performance.now?performance:Date,WAA=typeof window==\"object\"&&window.requestAnimationFrame?window.requestAnimationFrame.bind(window):function(t){setTimeout(t,17)};function Yu(){return gd||(WAA(k7A),gd=Uu.now()+xw)}function k7A(){gd=0}function Ju(){this._call=this._time=this._next=null}Ju.prototype=Rw.prototype={constructor:Ju,restart:function(t,e,A){if(typeof t!=\"function\")throw new TypeError(\"callback is not a function\");A=(A==null?Yu():+A)+(e==null?0:+e),!this._next&&Ku!==this&&(Ku?Ku._next=this:kw=this,Ku=this),this._call=t,this._time=A,KN()},stop:function(){this._call&&(this._call=null,this._time=1/0,KN())}};function Rw(t,e,A){var i=new Ju;return i.restart(t,e,A),i}function ZAA(){Yu(),++vE;for(var t=kw,e;t;)(e=gd-t._time)>=0&&t._call.call(void 0,e),t=t._next;--vE}function qAA(){gd=(Sw=Uu.now())+xw,vE=Gu=0;try{ZAA()}finally{vE=0,x7A(),gd=0}}function S7A(){var t=Uu.now(),e=t-Sw;e>VAA&&(xw-=e,Sw=t)}function x7A(){for(var t,e=kw,A,i=1/0;e;)e._call?(i>e._time&&(i=e._time),t=e,e=e._next):(A=e._next,e._next=null,e=t?t._next=A:kw=A);Ku=t,KN(i)}function KN(t){if(!vE){Gu&&(Gu=clearTimeout(Gu));var e=t-gd;e>24?(t<1/0&&(Gu=setTimeout(qAA,t-Uu.now()-xw)),_u&&(_u=clearInterval(_u))):(_u||(Sw=Uu.now(),_u=setInterval(S7A,VAA)),vE=1,WAA(qAA))}}function Nw(t,e,A){var i=new Ju;return e=e==null?0:+e,i.restart(n=>{i.stop(),t(n+e)},e,A),i}var R7A=od(\"start\",\"end\",\"cancel\",\"interrupt\"),N7A=[],AeA=0,XAA=1,Lw=2,Fw=3,$AA=4,_w=5,Hu=6;function QI(t,e,A,i,n,o){var a=t.__transition;if(!a)t.__transition={};else if(A in a)return;F7A(t,A,{name:e,index:i,group:n,on:R7A,tween:N7A,time:o.time,delay:o.delay,duration:o.duration,ease:o.ease,timer:null,state:AeA})}function Tu(t,e){var A=ir(t,e);if(A.state>AeA)throw new Error(\"too late; already scheduled\");return A}function Yr(t,e){var A=ir(t,e);if(A.state>Fw)throw new Error(\"too late; already running\");return A}function ir(t,e){var A=t.__transition;if(!A||!(A=A[e]))throw new Error(\"transition not found\");return A}function F7A(t,e,A){var i=t.__transition,n;i[e]=A,A.timer=Rw(o,0,A.time);function o(g){A.state=XAA,A.timer.restart(a,A.delay,A.time),A.delay<=g&&a(g-A.delay)}function a(g){var l,C,I,d;if(A.state!==XAA)return s();for(l in i)if(d=i[l],d.name===A.name){if(d.state===Fw)return Nw(a);d.state===$AA?(d.state=Hu,d.timer.stop(),d.on.call(\"interrupt\",t,t.__data__,d.index,d.group),delete i[l]):+l<e&&(d.state=Hu,d.timer.stop(),d.on.call(\"cancel\",t,t.__data__,d.index,d.group),delete i[l])}if(Nw(function(){A.state===Fw&&(A.state=$AA,A.timer.restart(r,A.delay,A.time),r(g))}),A.state=Lw,A.on.call(\"start\",t,t.__data__,A.index,A.group),A.state===Lw){for(A.state=Fw,n=new Array(I=A.tween.length),l=0,C=-1;l<I;++l)(d=A.tween[l].value.call(t,t.__data__,A.index,A.group))&&(n[++C]=d);n.length=C+1}}function r(g){for(var l=g<A.duration?A.ease.call(null,g/A.duration):(A.timer.restart(s),A.state=_w,1),C=-1,I=n.length;++C<I;)n[C].call(t,l);A.state===_w&&(A.on.call(\"end\",t,t.__data__,A.index,A.group),s())}function s(){A.state=Hu,A.timer.stop(),delete i[e];for(var g in i)return;delete t.__transition}}function ld(t,e){var A=t.__transition,i,n,o=!0,a;if(A){e=e==null?null:e+\"\";for(a in A){if((i=A[a]).name!==e){o=!1;continue}n=i.state>Lw&&i.state<_w,i.state=Hu,i.timer.stop(),i.on.call(n?\"interrupt\":\"cancel\",t,t.__data__,i.index,i.group),delete A[a]}o&&delete t.__transition}}function eeA(t){return this.each(function(){ld(this,t)})}function L7A(t,e){var A,i;return function(){var n=Yr(this,t),o=n.tween;if(o!==A){i=A=o;for(var a=0,r=i.length;a<r;++a)if(i[a].name===e){i=i.slice(),i.splice(a,1);break}}n.tween=i}}function _7A(t,e,A){var i,n;if(typeof A!=\"function\")throw new Error;return function(){var o=Yr(this,t),a=o.tween;if(a!==i){n=(i=a).slice();for(var r={name:e,value:A},s=0,g=n.length;s<g;++s)if(n[s].name===e){n[s]=r;break}s===g&&n.push(r)}o.tween=n}}function teA(t,e){var A=this._id;if(t+=\"\",arguments.length<2){for(var i=ir(this.node(),A).tween,n=0,o=i.length,a;n<o;++n)if((a=i[n]).name===t)return a.value;return null}return this.each((e==null?L7A:_7A)(A,t,e))}function bE(t,e,A){var i=t._id;return t.each(function(){var n=Yr(this,i);(n.value||(n.value={}))[e]=A.apply(this,arguments)}),function(n){return ir(n,i).value[e]}}function Gw(t,e){var A;return(typeof e==\"number\"?Il:e instanceof BI?vw:(A=BI(e))?(e=A,vw):NN)(t,e)}function G7A(t){return function(){this.removeAttribute(t)}}function K7A(t){return function(){this.removeAttributeNS(t.space,t.local)}}function U7A(t,e,A){var i,n=A+\"\",o;return function(){var a=this.getAttribute(t);return a===n?null:a===i?o:o=e(i=a,A)}}function J7A(t,e,A){var i,n=A+\"\",o;return function(){var a=this.getAttributeNS(t.space,t.local);return a===n?null:a===i?o:o=e(i=a,A)}}function Y7A(t,e,A){var i,n,o;return function(){var a,r=A(this),s;return r==null?void this.removeAttribute(t):(a=this.getAttribute(t),s=r+\"\",a===s?null:a===i&&s===n?o:(n=s,o=e(i=a,r)))}}function H7A(t,e,A){var i,n,o;return function(){var a,r=A(this),s;return r==null?void this.removeAttributeNS(t.space,t.local):(a=this.getAttributeNS(t.space,t.local),s=r+\"\",a===s?null:a===i&&s===n?o:(n=s,o=e(i=a,r)))}}function ieA(t,e){var A=wC(t),i=A===\"transform\"?_N:Gw;return this.attrTween(t,typeof e==\"function\"?(A.local?H7A:Y7A)(A,i,bE(this,\"attr.\"+t,e)):e==null?(A.local?K7A:G7A)(A):(A.local?J7A:U7A)(A,i,e))}function T7A(t,e){return function(A){this.setAttribute(t,e.call(this,A))}}function O7A(t,e){return function(A){this.setAttributeNS(t.space,t.local,e.call(this,A))}}function z7A(t,e){var A,i;function n(){var o=e.apply(this,arguments);return o!==i&&(A=(i=o)&&O7A(t,o)),A}return n._value=e,n}function P7A(t,e){var A,i;function n(){var o=e.apply(this,arguments);return o!==i&&(A=(i=o)&&T7A(t,o)),A}return n._value=e,n}function neA(t,e){var A=\"attr.\"+t;if(arguments.length<2)return(A=this.tween(A))&&A._value;if(e==null)return this.tween(A,null);if(typeof e!=\"function\")throw new Error;var i=wC(t);return this.tween(A,(i.local?z7A:P7A)(i,e))}function j7A(t,e){return function(){Tu(this,t).delay=+e.apply(this,arguments)}}function q7A(t,e){return e=+e,function(){Tu(this,t).delay=e}}function oeA(t){var e=this._id;return arguments.length?this.each((typeof t==\"function\"?j7A:q7A)(e,t)):ir(this.node(),e).delay}function V7A(t,e){return function(){Yr(this,t).duration=+e.apply(this,arguments)}}function W7A(t,e){return e=+e,function(){Yr(this,t).duration=e}}function aeA(t){var e=this._id;return arguments.length?this.each((typeof t==\"function\"?V7A:W7A)(e,t)):ir(this.node(),e).duration}function Z7A(t,e){if(typeof e!=\"function\")throw new Error;return function(){Yr(this,t).ease=e}}function reA(t){var e=this._id;return arguments.length?this.each(Z7A(e,t)):ir(this.node(),e).ease}function X7A(t,e){return function(){var A=e.apply(this,arguments);if(typeof A!=\"function\")throw new Error;Yr(this,t).ease=A}}function seA(t){if(typeof t!=\"function\")throw new Error;return this.each(X7A(this._id,t))}function geA(t){typeof t!=\"function\"&&(t=bu(t));for(var e=this._groups,A=e.length,i=new Array(A),n=0;n<A;++n)for(var o=e[n],a=o.length,r=i[n]=[],s,g=0;g<a;++g)(s=o[g])&&t.call(s,s.__data__,g,o)&&r.push(s);return new ms(i,this._parents,this._name,this._id)}function leA(t){if(t._id!==this._id)throw new Error;for(var e=this._groups,A=t._groups,i=e.length,n=A.length,o=Math.min(i,n),a=new Array(i),r=0;r<o;++r)for(var s=e[r],g=A[r],l=s.length,C=a[r]=new Array(l),I,d=0;d<l;++d)(I=s[d]||g[d])&&(C[d]=I);for(;r<i;++r)a[r]=e[r];return new ms(a,this._parents,this._name,this._id)}function $7A(t){return(t+\"\").trim().split(/^|\\s+/).every(function(e){var A=e.indexOf(\".\");return A>=0&&(e=e.slice(0,A)),!e||e===\"start\"})}function AbA(t,e,A){var i,n,o=$7A(e)?Tu:Yr;return function(){var a=o(this,t),r=a.on;r!==i&&(n=(i=r).copy()).on(e,A),a.on=n}}function ceA(t,e){var A=this._id;return arguments.length<2?ir(this.node(),A).on.on(t):this.each(AbA(A,t,e))}function ebA(t){return function(){var e=this.parentNode;for(var A in this.__transition)if(+A!==t)return;e&&e.removeChild(this)}}function CeA(){return this.on(\"end.remove\",ebA(this._id))}function IeA(t){var e=this._name,A=this._id;typeof t!=\"function\"&&(t=nd(t));for(var i=this._groups,n=i.length,o=new Array(n),a=0;a<n;++a)for(var r=i[a],s=r.length,g=o[a]=new Array(s),l,C,I=0;I<s;++I)(l=r[I])&&(C=t.call(l,l.__data__,I,r))&&(\"__data__\"in l&&(C.__data__=l.__data__),g[I]=C,QI(g[I],e,A,I,g,ir(l,A)));return new ms(o,this._parents,e,A)}function deA(t){var e=this._name,A=this._id;typeof t!=\"function\"&&(t=vu(t));for(var i=this._groups,n=i.length,o=[],a=[],r=0;r<n;++r)for(var s=i[r],g=s.length,l,C=0;C<g;++C)if(l=s[C]){for(var I=t.call(l,l.__data__,C,s),d,B=ir(l,A),Q=0,E=I.length;Q<E;++Q)(d=I[Q])&&QI(d,e,A,Q,I,B);o.push(I),a.push(l)}return new ms(o,a,e,A)}var tbA=yC.prototype.constructor;function BeA(){return new tbA(this._groups,this._parents)}function ibA(t,e){var A,i,n;return function(){var o=II(this,t),a=(this.style.removeProperty(t),II(this,t));return o===a?null:o===A&&a===i?n:n=e(A=o,i=a)}}function QeA(t){return function(){this.style.removeProperty(t)}}function nbA(t,e,A){var i,n=A+\"\",o;return function(){var a=II(this,t);return a===n?null:a===i?o:o=e(i=a,A)}}function obA(t,e,A){var i,n,o;return function(){var a=II(this,t),r=A(this),s=r+\"\";return r==null&&(s=r=(this.style.removeProperty(t),II(this,t))),a===s?null:a===i&&s===n?o:(n=s,o=e(i=a,r))}}function abA(t,e){var A,i,n,o=\"style.\"+e,a=\"end.\"+o,r;return function(){var s=Yr(this,t),g=s.on,l=s.value[o]==null?r||(r=QeA(e)):void 0;(g!==A||n!==l)&&(i=(A=g).copy()).on(a,n=l),s.on=i}}function EeA(t,e,A){var i=(t+=\"\")==\"transform\"?LN:Gw;return e==null?this.styleTween(t,ibA(t,i)).on(\"end.style.\"+t,QeA(t)):typeof e==\"function\"?this.styleTween(t,obA(t,i,bE(this,\"style.\"+t,e))).each(abA(this._id,t)):this.styleTween(t,nbA(t,i,e),A).on(\"end.style.\"+t,null)}function rbA(t,e,A){return function(i){this.style.setProperty(t,e.call(this,i),A)}}function sbA(t,e,A){var i,n;function o(){var a=e.apply(this,arguments);return a!==n&&(i=(n=a)&&rbA(t,a,A)),i}return o._value=e,o}function heA(t,e,A){var i=\"style.\"+(t+=\"\");if(arguments.length<2)return(i=this.tween(i))&&i._value;if(e==null)return this.tween(i,null);if(typeof e!=\"function\")throw new Error;return this.tween(i,sbA(t,e,A??\"\"))}function gbA(t){return function(){this.textContent=t}}function lbA(t){return function(){var e=t(this);this.textContent=e??\"\"}}function ueA(t){return this.tween(\"text\",typeof t==\"function\"?lbA(bE(this,\"text\",t)):gbA(t==null?\"\":t+\"\"))}function cbA(t){return function(e){this.textContent=t.call(this,e)}}function CbA(t){var e,A;function i(){var n=t.apply(this,arguments);return n!==A&&(e=(A=n)&&cbA(n)),e}return i._value=t,i}function feA(t){var e=\"text\";if(arguments.length<1)return(e=this.tween(e))&&e._value;if(t==null)return this.tween(e,null);if(typeof t!=\"function\")throw new Error;return this.tween(e,CbA(t))}function meA(){for(var t=this._name,e=this._id,A=Kw(),i=this._groups,n=i.length,o=0;o<n;++o)for(var a=i[o],r=a.length,s,g=0;g<r;++g)if(s=a[g]){var l=ir(s,e);QI(s,t,A,g,a,{time:l.time+l.delay+l.duration,delay:0,duration:l.duration,ease:l.ease})}return new ms(i,this._parents,t,A)}function peA(){var t,e,A=this,i=A._id,n=A.size();return new Promise(function(o,a){var r={value:a},s={value:function(){--n===0&&o()}};A.each(function(){var g=Yr(this,i),l=g.on;l!==t&&(e=(t=l).copy(),e._.cancel.push(r),e._.interrupt.push(r),e._.end.push(s)),g.on=e}),n===0&&o()})}var IbA=0;function ms(t,e,A,i){this._groups=t,this._parents=e,this._name=A,this._id=i}function DeA(t){return yC().transition(t)}function Kw(){return++IbA}var vC=yC.prototype;ms.prototype=DeA.prototype={constructor:ms,select:IeA,selectAll:deA,selectChild:vC.selectChild,selectChildren:vC.selectChildren,filter:geA,merge:leA,selection:BeA,transition:meA,call:vC.call,nodes:vC.nodes,node:vC.node,size:vC.size,empty:vC.empty,each:vC.each,on:ceA,attr:ieA,attrTween:neA,style:EeA,styleTween:heA,text:ueA,textTween:feA,remove:CeA,tween:teA,delay:oeA,duration:aeA,ease:reA,easeVarying:seA,end:peA,[Symbol.iterator]:vC[Symbol.iterator]};function Uw(t){return((t*=2)<=1?t*t*t:(t-=2)*t*t+2)/2}var dbA={time:null,delay:0,duration:250,ease:Uw};function BbA(t,e){for(var A;!(A=t.__transition)||!(A=A[e]);)if(!(t=t.parentNode))throw new Error(`transition ${e} not found`);return A}function weA(t){var e,A;t instanceof ms?(e=t._id,t=t._name):(e=Kw(),(A=dbA).time=Yu(),t=t==null?null:t+\"\");for(var i=this._groups,n=i.length,o=0;o<n;++o)for(var a=i[o],r=a.length,s,g=0;g<r;++g)(s=a[g])&&QI(s,t,e,g,a,A||BbA(s,e));return new ms(i,this._parents,t,e)}yC.prototype.interrupt=eeA;yC.prototype.transition=weA;var Ou=t=>()=>t;function UN(t,{sourceEvent:e,target:A,transform:i,dispatch:n}){Object.defineProperties(this,{type:{value:t,enumerable:!0,configurable:!0},sourceEvent:{value:e,enumerable:!0,configurable:!0},target:{value:A,enumerable:!0,configurable:!0},transform:{value:i,enumerable:!0,configurable:!0},_:{value:n}})}function dc(t,e,A){this.k=t,this.x=e,this.y=A}dc.prototype={constructor:dc,scale:function(t){return t===1?this:new dc(this.k*t,this.x,this.y)},translate:function(t,e){return t===0&e===0?this:new dc(this.k,this.x+this.k*t,this.y+this.k*e)},apply:function(t){return[t[0]*this.k+this.x,t[1]*this.k+this.y]},applyX:function(t){return t*this.k+this.x},applyY:function(t){return t*this.k+this.y},invert:function(t){return[(t[0]-this.x)/this.k,(t[1]-this.y)/this.k]},invertX:function(t){return(t-this.x)/this.k},invertY:function(t){return(t-this.y)/this.k},rescaleX:function(t){return t.copy().domain(t.range().map(this.invertX,this).map(t.invert,t))},rescaleY:function(t){return t.copy().domain(t.range().map(this.invertY,this).map(t.invert,t))},toString:function(){return\"translate(\"+this.x+\",\"+this.y+\") scale(\"+this.k+\")\"}};var EI=new dc(1,0,0);JN.prototype=dc.prototype;function JN(t){for(;!t.__zoom;)if(!(t=t.parentNode))return EI;return t.__zoom}function Jw(t){t.stopImmediatePropagation()}function ME(t){t.preventDefault(),t.stopImmediatePropagation()}function QbA(t){return(!t.ctrlKey||t.type===\"wheel\")&&!t.button}function EbA(){var t=this;return t instanceof SVGElement?(t=t.ownerSVGElement||t,t.hasAttribute(\"viewBox\")?(t=t.viewBox.baseVal,[[t.x,t.y],[t.x+t.width,t.y+t.height]]):[[0,0],[t.width.baseVal.value,t.height.baseVal.value]]):[[0,0],[t.clientWidth,t.clientHeight]]}function yeA(){return this.__zoom||EI}function hbA(t){return-t.deltaY*(t.deltaMode===1?.05:t.deltaMode?1:.002)*(t.ctrlKey?10:1)}function ubA(){return navigator.maxTouchPoints||\"ontouchstart\"in this}function fbA(t,e,A){var i=t.invertX(e[0][0])-A[0][0],n=t.invertX(e[1][0])-A[1][0],o=t.invertY(e[0][1])-A[0][1],a=t.invertY(e[1][1])-A[1][1];return t.translate(n>i?(i+n)/2:Math.min(0,i)||Math.max(0,n),a>o?(o+a)/2:Math.min(0,o)||Math.max(0,a))}function YN(){var t=QbA,e=EbA,A=fbA,i=hbA,n=ubA,o=[0,1/0],a=[[-1/0,-1/0],[1/0,1/0]],r=250,s=GN,g=od(\"start\",\"zoom\",\"end\"),l,C,I,d=500,B=150,Q=0,E=10;function f(P){P.property(\"__zoom\",yeA).on(\"wheel.zoom\",U,{passive:!1}).on(\"mousedown.zoom\",Y).on(\"dblclick.zoom\",j).filter(n).on(\"touchstart.zoom\",AA).on(\"touchmove.zoom\",z).on(\"touchend.zoom touchcancel.zoom\",yA).style(\"-webkit-tap-highlight-color\",\"rgba(0,0,0,0)\")}f.transform=function(P,nA,eA,dA){var iA=P.selection?P.selection():P;iA.property(\"__zoom\",yeA),P!==iA?v(P,nA,eA,dA):iA.interrupt().each(function(){F(this,arguments).event(dA).start().zoom(null,typeof nA==\"function\"?nA.apply(this,arguments):nA).end()})},f.scaleBy=function(P,nA,eA,dA){f.scaleTo(P,function(){var iA=this.__zoom.k,aA=typeof nA==\"function\"?nA.apply(this,arguments):nA;return iA*aA},eA,dA)},f.scaleTo=function(P,nA,eA,dA){f.transform(P,function(){var iA=e.apply(this,arguments),aA=this.__zoom,hA=eA==null?M(iA):typeof eA==\"function\"?eA.apply(this,arguments):eA,JA=aA.invert(hA),ee=typeof nA==\"function\"?nA.apply(this,arguments):nA;return A(R(b(aA,ee),hA,JA),iA,a)},eA,dA)},f.translateBy=function(P,nA,eA,dA){f.transform(P,function(){return A(this.__zoom.translate(typeof nA==\"function\"?nA.apply(this,arguments):nA,typeof eA==\"function\"?eA.apply(this,arguments):eA),e.apply(this,arguments),a)},null,dA)},f.translateTo=function(P,nA,eA,dA,iA){f.transform(P,function(){var aA=e.apply(this,arguments),hA=this.__zoom,JA=dA==null?M(aA):typeof dA==\"function\"?dA.apply(this,arguments):dA;return A(EI.translate(JA[0],JA[1]).scale(hA.k).translate(typeof nA==\"function\"?-nA.apply(this,arguments):-nA,typeof eA==\"function\"?-eA.apply(this,arguments):-eA),aA,a)},dA,iA)};function b(P,nA){return nA=Math.max(o[0],Math.min(o[1],nA)),nA===P.k?P:new dc(nA,P.x,P.y)}function R(P,nA,eA){var dA=nA[0]-eA[0]*P.k,iA=nA[1]-eA[1]*P.k;return dA===P.x&&iA===P.y?P:new dc(P.k,dA,iA)}function M(P){return[(+P[0][0]+ +P[1][0])/2,(+P[0][1]+ +P[1][1])/2]}function v(P,nA,eA,dA){P.on(\"start.zoom\",function(){F(this,arguments).event(dA).start()}).on(\"interrupt.zoom end.zoom\",function(){F(this,arguments).event(dA).end()}).tween(\"zoom\",function(){var iA=this,aA=arguments,hA=F(iA,aA).event(dA),JA=e.apply(iA,aA),ee=eA==null?M(JA):typeof eA==\"function\"?eA.apply(iA,aA):eA,UA=Math.max(JA[1][0]-JA[0][0],JA[1][1]-JA[0][1]),mA=iA.__zoom,KA=typeof nA==\"function\"?nA.apply(iA,aA):nA,ze=s(mA.invert(ee).concat(UA/mA.k),KA.invert(ee).concat(UA/KA.k));return function(Ke){if(Ke===1)Ke=KA;else{var HA=ze(Ke),uA=UA/HA[2];Ke=new dc(uA,ee[0]-HA[0]*uA,ee[1]-HA[1]*uA)}hA.zoom(null,Ke)}})}function F(P,nA,eA){return!eA&&P.__zooming||new G(P,nA)}function G(P,nA){this.that=P,this.args=nA,this.active=0,this.sourceEvent=null,this.extent=e.apply(P,nA),this.taps=0}G.prototype={event:function(P){return P&&(this.sourceEvent=P),this},start:function(){return++this.active===1&&(this.that.__zooming=this,this.emit(\"start\")),this},zoom:function(P,nA){return this.mouse&&P!==\"mouse\"&&(this.mouse[1]=nA.invert(this.mouse[0])),this.touch0&&P!==\"touch\"&&(this.touch0[1]=nA.invert(this.touch0[0])),this.touch1&&P!==\"touch\"&&(this.touch1[1]=nA.invert(this.touch1[0])),this.that.__zoom=nA,this.emit(\"zoom\"),this},end:function(){return--this.active===0&&(delete this.that.__zooming,this.emit(\"end\")),this},emit:function(P){var nA=ur(this.that).datum();g.call(P,this.that,new UN(P,{sourceEvent:this.sourceEvent,target:f,type:P,transform:this.that.__zoom,dispatch:g}),nA)}};function U(P,...nA){if(!t.apply(this,arguments))return;var eA=F(this,nA).event(P),dA=this.__zoom,iA=Math.max(o[0],Math.min(o[1],dA.k*Math.pow(2,i.apply(this,arguments)))),aA=Cl(P);if(eA.wheel)(eA.mouse[0][0]!==aA[0]||eA.mouse[0][1]!==aA[1])&&(eA.mouse[1]=dA.invert(eA.mouse[0]=aA)),clearTimeout(eA.wheel);else{if(dA.k===iA)return;eA.mouse=[aA,dA.invert(aA)],ld(this),eA.start()}ME(P),eA.wheel=setTimeout(hA,B),eA.zoom(\"mouse\",A(R(b(dA,iA),eA.mouse[0],eA.mouse[1]),eA.extent,a));function hA(){eA.wheel=null,eA.end()}}function Y(P,...nA){if(I||!t.apply(this,arguments))return;var eA=P.currentTarget,dA=F(this,nA,!0).event(P),iA=ur(P.view).on(\"mousemove.zoom\",ee,!0).on(\"mouseup.zoom\",UA,!0),aA=Cl(P,eA),hA=P.clientX,JA=P.clientY;ku(P.view),Jw(P),dA.mouse=[aA,this.__zoom.invert(aA)],ld(this),dA.start();function ee(mA){if(ME(mA),!dA.moved){var KA=mA.clientX-hA,ze=mA.clientY-JA;dA.moved=KA*KA+ze*ze>Q}dA.event(mA).zoom(\"mouse\",A(R(dA.that.__zoom,dA.mouse[0]=Cl(mA,eA),dA.mouse[1]),dA.extent,a))}function UA(mA){iA.on(\"mousemove.zoom mouseup.zoom\",null),Su(mA.view,dA.moved),ME(mA),dA.event(mA).end()}}function j(P,...nA){if(t.apply(this,arguments)){var eA=this.__zoom,dA=Cl(P.changedTouches?P.changedTouches[0]:P,this),iA=eA.invert(dA),aA=eA.k*(P.shiftKey?.5:2),hA=A(R(b(eA,aA),dA,iA),e.apply(this,nA),a);ME(P),r>0?ur(this).transition().duration(r).call(v,hA,dA,P):ur(this).call(f.transform,hA,dA,P)}}function AA(P,...nA){if(t.apply(this,arguments)){var eA=P.touches,dA=eA.length,iA=F(this,nA,P.changedTouches.length===dA).event(P),aA,hA,JA,ee;for(Jw(P),hA=0;hA<dA;++hA)JA=eA[hA],ee=Cl(JA,this),ee=[ee,this.__zoom.invert(ee),JA.identifier],iA.touch0?!iA.touch1&&iA.touch0[2]!==ee[2]&&(iA.touch1=ee,iA.taps=0):(iA.touch0=ee,aA=!0,iA.taps=1+!!l);l&&(l=clearTimeout(l)),aA&&(iA.taps<2&&(C=ee[0],l=setTimeout(function(){l=null},d)),ld(this),iA.start())}}function z(P,...nA){if(this.__zooming){var eA=F(this,nA).event(P),dA=P.changedTouches,iA=dA.length,aA,hA,JA,ee;for(ME(P),aA=0;aA<iA;++aA)hA=dA[aA],JA=Cl(hA,this),eA.touch0&&eA.touch0[2]===hA.identifier?eA.touch0[0]=JA:eA.touch1&&eA.touch1[2]===hA.identifier&&(eA.touch1[0]=JA);if(hA=eA.that.__zoom,eA.touch1){var UA=eA.touch0[0],mA=eA.touch0[1],KA=eA.touch1[0],ze=eA.touch1[1],Ke=(Ke=KA[0]-UA[0])*Ke+(Ke=KA[1]-UA[1])*Ke,HA=(HA=ze[0]-mA[0])*HA+(HA=ze[1]-mA[1])*HA;hA=b(hA,Math.sqrt(Ke/HA)),JA=[(UA[0]+KA[0])/2,(UA[1]+KA[1])/2],ee=[(mA[0]+ze[0])/2,(mA[1]+ze[1])/2]}else if(eA.touch0)JA=eA.touch0[0],ee=eA.touch0[1];else return;eA.zoom(\"touch\",A(R(hA,JA,ee),eA.extent,a))}}function yA(P,...nA){if(this.__zooming){var eA=F(this,nA).event(P),dA=P.changedTouches,iA=dA.length,aA,hA;for(Jw(P),I&&clearTimeout(I),I=setTimeout(function(){I=null},d),aA=0;aA<iA;++aA)hA=dA[aA],eA.touch0&&eA.touch0[2]===hA.identifier?delete eA.touch0:eA.touch1&&eA.touch1[2]===hA.identifier&&delete eA.touch1;if(eA.touch1&&!eA.touch0&&(eA.touch0=eA.touch1,delete eA.touch1),eA.touch0)eA.touch0[1]=this.__zoom.invert(eA.touch0[0]);else if(eA.end(),eA.taps===2&&(hA=Cl(hA,this),Math.hypot(C[0]-hA[0],C[1]-hA[1])<E)){var JA=ur(this).on(\"dblclick.zoom\");JA&&JA.apply(this,arguments)}}}return f.wheelDelta=function(P){return arguments.length?(i=typeof P==\"function\"?P:Ou(+P),f):i},f.filter=function(P){return arguments.length?(t=typeof P==\"function\"?P:Ou(!!P),f):t},f.touchable=function(P){return arguments.length?(n=typeof P==\"function\"?P:Ou(!!P),f):n},f.extent=function(P){return arguments.length?(e=typeof P==\"function\"?P:Ou([[+P[0][0],+P[0][1]],[+P[1][0],+P[1][1]]]),f):e},f.scaleExtent=function(P){return arguments.length?(o[0]=+P[0],o[1]=+P[1],f):[o[0],o[1]]},f.translateExtent=function(P){return arguments.length?(a[0][0]=+P[0][0],a[1][0]=+P[1][0],a[0][1]=+P[0][1],a[1][1]=+P[1][1],f):[[a[0][0],a[0][1]],[a[1][0],a[1][1]]]},f.constrain=function(P){return arguments.length?(A=P,f):A},f.duration=function(P){return arguments.length?(r=+P,f):r},f.interpolate=function(P){return arguments.length?(s=P,f):s},f.on=function(){var P=g.on.apply(g,arguments);return P===g?f:P},f.clickDistance=function(P){return arguments.length?(Q=(P=+P)*P,f):Math.sqrt(Q)},f.tapDistance=function(P){return arguments.length?(E=+P,f):E},f}var mbA=[\"edgeLabelWrapper\"],pbA=[\"edgeLabel\",\"\"];function DbA(t,e){t&1&&$i(0)}function wbA(t,e){if(t&1&&(Qt(),m(0,\"foreignObject\"),Tr(),m(1,\"div\",1,0),yt(3,DbA,1,0,\"ng-container\",2),D()()),t&2){let A=y(2),i=y();ie(\"x\",i.edgeLabelPoint().x)(\"y\",i.edgeLabelPoint().y)(\"width\",A.size().width)(\"height\",A.size().height),p(3),X(\"ngTemplateOutlet\",e)(\"ngTemplateOutletContext\",i.getLabelContext())}}function ybA(t,e){if(t&1&&V(0,wbA,4,6,\":svg:foreignObject\"),t&2){let A,i=y(2);W((A=i.htmlTemplate())?0:-1,A)}}function vbA(t,e){if(t&1&&(Qt(),m(0,\"foreignObject\"),Tr(),m(1,\"div\",1,0),K(3),D()()),t&2){let A=y(),i=y();ie(\"x\",i.edgeLabelPoint().x)(\"y\",i.edgeLabelPoint().y)(\"width\",A.size().width)(\"height\",A.size().height),p(),QL(i.edgeLabelStyle()),p(2),Fe(\" \",A.edgeLabel.text,\" \")}}function bbA(t,e){if(t&1&&(V(0,ybA,1,1),V(1,vbA,4,7,\":svg:foreignObject\")),t&2){let A=e,i=y();W(A.edgeLabel.type===\"html-template\"&&i.htmlTemplate()?0:-1),p(),W(A.edgeLabel.type===\"default\"?1:-1)}}var MbA=[\"edge\",\"\"];function kbA(t,e){if(t&1){let A=zA();Qt(),GA(0,\"path\",0),m(1,\"path\",1),$(\"click\",function(){rA(A);let n=y();return n.select(),sA(n.pull())}),D()}if(t&2){let A=y();ae(\"edge_selected\",A.model().selected()),ie(\"d\",A.model().path().path)(\"marker-start\",A.model().markerStartUrl())(\"marker-end\",A.model().markerEndUrl()),p(),ie(\"d\",A.model().path().path)}}function SbA(t,e){if(t&1&&$i(0,2),t&2){let A=y(2);X(\"ngTemplateOutlet\",e)(\"ngTemplateOutletContext\",A.model().context)(\"ngTemplateOutletInjector\",A.injector)}}function xbA(t,e){if(t&1&&V(0,SbA,1,3,\"ng-container\",2),t&2){let A,i=y();W((A=i.edgeTemplate())?0:-1,A)}}function RbA(t,e){if(t&1&&(Qt(),GA(0,\"g\",3)),t&2){let A=y(),i=y();X(\"model\",A)(\"point\",e)(\"edgeModel\",i.model())(\"htmlTemplate\",i.edgeLabelHtmlTemplate())}}function NbA(t,e){if(t&1&&V(0,RbA,1,4,\":svg:g\",3),t&2){let A,i=y();W((A=(A=i.model().path().labelPoints)==null?null:A.start)?0:-1,A)}}function FbA(t,e){if(t&1&&(Qt(),GA(0,\"g\",3)),t&2){let A=y(),i=y();X(\"model\",A)(\"point\",e)(\"edgeModel\",i.model())(\"htmlTemplate\",i.edgeLabelHtmlTemplate())}}function LbA(t,e){if(t&1&&V(0,FbA,1,4,\":svg:g\",3),t&2){let A,i=y();W((A=(A=i.model().path().labelPoints)==null?null:A.center)?0:-1,A)}}function _bA(t,e){if(t&1&&(Qt(),GA(0,\"g\",3)),t&2){let A=y(),i=y();X(\"model\",A)(\"point\",e)(\"edgeModel\",i.model())(\"htmlTemplate\",i.edgeLabelHtmlTemplate())}}function GbA(t,e){if(t&1&&V(0,_bA,1,4,\":svg:g\",3),t&2){let A,i=y();W((A=(A=i.model().path().labelPoints)==null?null:A.end)?0:-1,A)}}function KbA(t,e){if(t&1){let A=zA();Qt(),m(0,\"circle\",5),$(\"pointerStart\",function(n){rA(A);let o=y(2);return sA(o.startReconnection(n,o.model().targetHandle()))}),D()}if(t&2){let A=y(2);ie(\"cx\",A.model().sourceHandle().pointAbsolute().x)(\"cy\",A.model().sourceHandle().pointAbsolute().y)}}function UbA(t,e){if(t&1){let A=zA();Qt(),m(0,\"circle\",5),$(\"pointerStart\",function(n){rA(A);let o=y(2);return sA(o.startReconnection(n,o.model().sourceHandle()))}),D()}if(t&2){let A=y(2);ie(\"cx\",A.model().targetHandle().pointAbsolute().x)(\"cy\",A.model().targetHandle().pointAbsolute().y)}}function JbA(t,e){if(t&1&&(V(0,KbA,1,2,\":svg:circle\",4),V(1,UbA,1,2,\":svg:circle\",4)),t&2){let A=y();W(A.model().reconnectable===!0||A.model().reconnectable===\"source\"?0:-1),p(),W(A.model().reconnectable===!0||A.model().reconnectable===\"target\"?1:-1)}}var YeA=[\"*\"],YbA=[\"resizer\"],HbA=[\"resizable\",\"\"];function TbA(t,e){if(t&1){let A=zA();Qt(),m(0,\"g\")(1,\"line\",1),$(\"pointerStart\",function(n){rA(A);let o=y();return sA(o.startResize(\"top\",n))}),D(),m(2,\"line\",2),$(\"pointerStart\",function(n){rA(A);let o=y();return sA(o.startResize(\"left\",n))}),D(),m(3,\"line\",3),$(\"pointerStart\",function(n){rA(A);let o=y();return sA(o.startResize(\"bottom\",n))}),D(),m(4,\"line\",4),$(\"pointerStart\",function(n){rA(A);let o=y();return sA(o.startResize(\"right\",n))}),D(),m(5,\"rect\",5),$(\"pointerStart\",function(n){rA(A);let o=y();return sA(o.startResize(\"top-left\",n))}),D(),m(6,\"rect\",6),$(\"pointerStart\",function(n){rA(A);let o=y();return sA(o.startResize(\"top-right\",n))}),D(),m(7,\"rect\",7),$(\"pointerStart\",function(n){rA(A);let o=y();return sA(o.startResize(\"bottom-left\",n))}),D(),m(8,\"rect\",8),$(\"pointerStart\",function(n){rA(A);let o=y();return sA(o.startResize(\"bottom-right\",n))}),D()()}if(t&2){let A=y();p(),ie(\"x1\",A.lineGap)(\"y1\",-A.gap())(\"x2\",A.model.size().width-A.lineGap)(\"y2\",-A.gap())(\"stroke\",A.resizerColor()),p(),ie(\"x1\",-A.gap())(\"y1\",A.lineGap)(\"x2\",-A.gap())(\"y2\",A.model.size().height-A.lineGap)(\"stroke\",A.resizerColor()),p(),ie(\"x1\",A.lineGap)(\"y1\",A.model.size().height+A.gap())(\"x2\",A.model.size().width-A.lineGap)(\"y2\",A.model.size().height+A.gap())(\"stroke\",A.resizerColor()),p(),ie(\"x1\",A.model.size().width+A.gap())(\"y1\",A.lineGap)(\"x2\",A.model.size().width+A.gap())(\"y2\",A.model.size().height-A.lineGap)(\"stroke\",A.resizerColor()),p(),ie(\"x\",-(A.handleSize/2)-A.gap())(\"y\",-(A.handleSize/2)-A.gap())(\"width\",A.handleSize)(\"height\",A.handleSize)(\"fill\",A.resizerColor()),p(),ie(\"x\",A.model.size().width-A.handleSize/2+A.gap())(\"y\",-(A.handleSize/2)-A.gap())(\"width\",A.handleSize)(\"height\",A.handleSize)(\"fill\",A.resizerColor()),p(),ie(\"x\",-(A.handleSize/2)-A.gap())(\"y\",A.model.size().height-A.handleSize/2+A.gap())(\"width\",A.handleSize)(\"height\",A.handleSize)(\"fill\",A.resizerColor()),p(),ie(\"x\",A.model.size().width-A.handleSize/2+A.gap())(\"y\",A.model.size().height-A.handleSize/2+A.gap())(\"width\",A.handleSize)(\"height\",A.handleSize)(\"fill\",A.resizerColor())}}var ObA=[\"node\",\"\"];function zbA(t,e){if(t&1){let A=zA();Qt(),m(0,\"foreignObject\",3),$(\"click\",function(){rA(A);let n=y();return n.pullNode(),sA(n.selectNode())}),Tr(),m(1,\"default-node\",4),GA(2,\"div\",5)(3,\"handle\",6)(4,\"handle\",7),D()()}if(t&2){let A=y();ie(\"width\",A.model().foWidth())(\"height\",A.model().foHeight()),p(),En(\"width\",A.model().styleWidth())(\"height\",A.model().styleHeight())(\"max-width\",A.model().styleWidth())(\"max-height\",A.model().styleHeight()),X(\"selected\",A.model().selected()),p(),X(\"outerHTML\",A.model().text(),xg)}}function PbA(t,e){if(t&1){let A=zA();Qt(),m(0,\"foreignObject\",3),$(\"click\",function(){rA(A);let n=y();return sA(n.pullNode())}),Tr(),m(1,\"div\",8),$i(2,9),D()()}if(t&2){let A=y();ie(\"width\",A.model().foWidth())(\"height\",A.model().foHeight()),p(),En(\"width\",A.model().styleWidth())(\"height\",A.model().styleHeight()),p(),X(\"ngTemplateOutlet\",A.nodeTemplate()??null)(\"ngTemplateOutletContext\",A.model().context)(\"ngTemplateOutletInjector\",A.injector)}}function jbA(t,e){if(t&1){let A=zA();Qt(),m(0,\"g\",10),$(\"click\",function(){rA(A);let n=y();return sA(n.pullNode())}),$i(1,9),D()}if(t&2){let A=y();p(),X(\"ngTemplateOutlet\",A.nodeSvgTemplate()??null)(\"ngTemplateOutletContext\",A.model().context)(\"ngTemplateOutletInjector\",A.injector)}}function qbA(t,e){if(t&1){let A=zA();Qt(),m(0,\"foreignObject\",3),$(\"click\",function(){rA(A);let n=y(2);return sA(n.pullNode())}),Tr(),m(1,\"div\",8),$i(2,11),D()()}if(t&2){let A=y(2);ie(\"width\",A.model().foWidth())(\"height\",A.model().foHeight()),p(),En(\"width\",A.model().styleWidth())(\"height\",A.model().styleHeight()),p(),X(\"ngComponentOutlet\",e)(\"ngComponentOutletInputs\",A.model().componentTypeInputs)(\"ngComponentOutletInjector\",A.injector)}}function VbA(t,e){if(t&1&&(V(0,qbA,3,9,\":svg:foreignObject\",0),oi(1,\"async\")),t&2){let A,i=y();W((A=li(1,1,i.model().componentInstance$))?0:-1,A)}}function WbA(t,e){if(t&1){let A=zA();Qt(),m(0,\"rect\",12),$(\"click\",function(){rA(A);let n=y();return n.pullNode(),sA(n.selectNode())}),D()}if(t&2){let A=y();En(\"stroke\",A.model().color())(\"fill\",A.model().color()),ae(\"default-group-node_selected\",A.model().selected()),X(\"resizable\",A.model().resizable())(\"gap\",3)(\"resizerColor\",A.model().color()),ie(\"width\",A.model().size().width)(\"height\",A.model().size().height)}}function ZbA(t,e){if(t&1){let A=zA();Qt(),m(0,\"g\",10),$(\"click\",function(){rA(A);let n=y();return sA(n.pullNode())}),$i(1,9),D()}if(t&2){let A=y();p(),X(\"ngTemplateOutlet\",A.groupNodeTemplate()??null)(\"ngTemplateOutletContext\",A.model().context)(\"ngTemplateOutletInjector\",A.injector)}}function XbA(t,e){}function $bA(t,e){if(t&1&&yt(0,XbA,0,0,\"ng-template\",13),t&2){let A=y();X(\"ngTemplateOutlet\",A)}}function A9A(t,e){if(t&1&&V(0,$bA,1,1,null,13),t&2){let A=y();W(A.model().resizable()?0:-1)}}function e9A(t,e){if(t&1){let A=zA();Qt(),m(0,\"circle\",17),$(\"pointerStart\",function(n){rA(A);let o=y().$implicit,a=y();return sA(a.startConnection(n,o))})(\"pointerEnd\",function(){rA(A);let n=y(2);return sA(n.endConnection())}),D()}if(t&2){let A=y().$implicit;ie(\"cx\",A.hostOffset().x)(\"cy\",A.hostOffset().y)(\"stroke-width\",A.strokeWidth)}}function t9A(t,e){if(t&1){let A=zA();Qt(),m(0,\"g\",18),$(\"pointerStart\",function(n){rA(A);let o=y().$implicit,a=y();return sA(a.startConnection(n,o))})(\"pointerEnd\",function(){rA(A);let n=y(2);return sA(n.endConnection())}),D()}if(t&2){let A=y().$implicit;X(\"handleSizeController\",A)}}function i9A(t,e){t&1&&(Qt(),$i(0))}function n9A(t,e){if(t&1){let A=zA();Qt(),m(0,\"g\",18),$(\"pointerStart\",function(n){rA(A);let o=y().$implicit,a=y();return sA(a.startConnection(n,o))})(\"pointerEnd\",function(){rA(A);let n=y(2);return sA(n.endConnection())}),yt(1,i9A,1,0,\"ng-container\",19),D()}if(t&2){let A=y().$implicit;X(\"handleSizeController\",A),p(),X(\"ngTemplateOutlet\",A.template)(\"ngTemplateOutletContext\",A.templateContext)}}function o9A(t,e){if(t&1){let A=zA();Qt(),m(0,\"circle\",20),$(\"pointerEnd\",function(){rA(A);let n=y().$implicit,o=y();return o.endConnection(),sA(o.resetValidateConnection(n))})(\"pointerOver\",function(){rA(A);let n=y().$implicit,o=y();return sA(o.validateConnection(n))})(\"pointerOut\",function(){rA(A);let n=y().$implicit,o=y();return sA(o.resetValidateConnection(n))}),D()}if(t&2){let A=y().$implicit,i=y();ie(\"r\",i.model().magnetRadius)(\"cx\",A.hostOffset().x)(\"cy\",A.hostOffset().y)}}function a9A(t,e){if(t&1&&(V(0,e9A,1,3,\":svg:circle\",14),V(1,t9A,1,1,\":svg:g\",15),V(2,n9A,2,3,\":svg:g\",15),V(3,o9A,1,3,\":svg:circle\",16)),t&2){let A=e.$implicit,i=y();W(A.template===void 0?0:-1),p(),W(A.template===null?1:-1),p(),W(A.template?2:-1),p(),W(i.showMagnet()?3:-1)}}function r9A(t,e){if(t&1&&(Qt(),m(0,\"foreignObject\"),Tr(),$i(1,13),D()),t&2){let A=e.$implicit;ie(\"width\",A.size().width)(\"height\",A.size().height)(\"transform\",A.transform()),p(),X(\"ngTemplateOutlet\",A.template())}}var s9A=[\"connection\",\"\"];function g9A(t,e){if(t&1&&(Qt(),GA(0,\"path\",0)),t&2){let A=y(2);ie(\"d\",e)(\"marker-end\",A.markerUrl())(\"stroke\",A.defaultColor)}}function l9A(t,e){if(t&1&&V(0,g9A,1,3,\":svg:path\",0),t&2){let A,i=y();W((A=i.path())?0:-1,A)}}function c9A(t,e){t&1&&$i(0)}function C9A(t,e){if(t&1&&yt(0,c9A,1,0,\"ng-container\",1),t&2){let A=y(2);X(\"ngTemplateOutlet\",e)(\"ngTemplateOutletContext\",A.getContext())}}function I9A(t,e){if(t&1&&V(0,C9A,1,2,\"ng-container\"),t&2){let A,i=y();W((A=i.template())?0:-1,A)}}var d9A=[\"background\",\"\"];function B9A(t,e){if(t&1&&(Qt(),ti(0,\"pattern\",0),Ni(1,\"circle\"),Ii(),Ni(2,\"rect\",1)),t&2){let A=y();ie(\"id\",A.patternId)(\"x\",A.x())(\"y\",A.y())(\"width\",A.scaledGap())(\"height\",A.scaledGap()),p(),ie(\"cx\",A.patternSize())(\"cy\",A.patternSize())(\"r\",A.patternSize())(\"fill\",A.patternColor()),p(),ie(\"fill\",A.patternUrl)}}function Q9A(t,e){if(t&1&&(Qt(),ti(0,\"pattern\",0),Ni(1,\"image\"),Ii(),Ni(2,\"rect\",1)),t&2){let A=y(2);ie(\"id\",A.patternId)(\"x\",A.imageX())(\"y\",A.imageY())(\"width\",A.scaledImageWidth())(\"height\",A.scaledImageHeight()),p(),ie(\"href\",A.bgImageSrc())(\"width\",A.scaledImageWidth())(\"height\",A.scaledImageHeight()),p(),ie(\"fill\",A.patternUrl)}}function E9A(t,e){if(t&1&&(Qt(),Ni(0,\"image\")),t&2){let A=y(2);ie(\"x\",A.imageX())(\"y\",A.imageY())(\"width\",A.scaledImageWidth())(\"height\",A.scaledImageHeight())(\"href\",A.bgImageSrc())}}function h9A(t,e){if(t&1&&(V(0,Q9A,3,9),V(1,E9A,1,5,\":svg:image\")),t&2){let A=y();W(A.repeated()?0:-1),p(),W(A.repeated()?-1:1)}}var u9A=[\"flowDefs\",\"\"];function f9A(t,e){if(t&1&&(Qt(),Ni(0,\"polyline\",3)),t&2){let A=y().$implicit,i=y();En(\"stroke\",A.value.color??i.defaultColor)(\"stroke-width\",A.value.strokeWidth??2)(\"fill\",A.value.color??i.defaultColor)}}function m9A(t,e){if(t&1&&(Qt(),Ni(0,\"polyline\",4)),t&2){let A=y().$implicit,i=y();En(\"stroke\",A.value.color??i.defaultColor)(\"stroke-width\",A.value.strokeWidth??2)}}function p9A(t,e){if(t&1&&(Qt(),ti(0,\"marker\",0),V(1,f9A,1,6,\":svg:polyline\",1),V(2,m9A,1,4,\":svg:polyline\",2),Ii()),t&2){let A=e.$implicit;ie(\"id\",A.key)(\"markerWidth\",A.value.width??16.5)(\"markerHeight\",A.value.height??16.5)(\"orient\",A.value.orient??\"auto-start-reverse\")(\"markerUnits\",A.value.markerUnits??\"userSpaceOnUse\"),p(),W(A.value.type===\"arrow-closed\"||!A.value.type?1:-1),p(),W(A.value.type===\"arrow\"?2:-1)}}var D9A=[\"previewFlow\",\"\"],w9A=[\"alignmentHelper\",\"\"];function y9A(t,e){if(t&1&&(Qt(),Ni(0,\"line\")),t&2){let A=e.$implicit,i=y(3);ie(\"stroke\",i.lineColor())(\"stroke-dasharray\",A.isCenter?4:null)(\"x1\",A.x)(\"y1\",A.y)(\"x2\",A.x2)(\"y2\",A.y2)}}function v9A(t,e){t&1&&Gt(0,y9A,1,6,\":svg:line\",null,fd),t&2&&Kt(e.lines)}function b9A(t,e){if(t&1&&V(0,v9A,2,0),t&2){let A,i=y();W((A=i.intersections())?0:-1,A)}}function M9A(t,e){t&1&&(Qt(),GA(0,\"g\",8))}function k9A(t,e){if(t&1&&(Qt(),GA(0,\"g\",9)),t&2){let A=y();X(\"tolerance\",A.tolerance)(\"lineColor\",A.lineColor)}}function S9A(t,e){t&1&&V(0,M9A,1,0,\":svg:g\",8)(1,k9A,1,2,\":svg:g\",9),t&2&&W(e===!0?0:1)}function x9A(t,e){if(t&1&&(Qt(),GA(0,\"g\",10)),t&2){let A,i=e.$implicit,n=y(2);X(\"model\",i)(\"groupNodeTemplate\",(A=n.groupNodeTemplateDirective())==null?null:A.templateRef),ie(\"transform\",i.pointTransform())}}function R9A(t,e){if(t&1&&(Qt(),GA(0,\"g\",11)),t&2){let A,i,n=e.$implicit,o=y(2);X(\"model\",n)(\"edgeTemplate\",(A=o.edgeTemplateDirective())==null?null:A.templateRef)(\"edgeLabelHtmlTemplate\",(i=o.edgeLabelHtmlDirective())==null?null:i.templateRef)}}function N9A(t,e){if(t&1&&(Qt(),GA(0,\"g\",12)),t&2){let A,i,n=e.$implicit,o=y(2);X(\"model\",n)(\"nodeTemplate\",(A=o.nodeTemplateDirective())==null?null:A.templateRef)(\"nodeSvgTemplate\",(i=o.nodeSvgTemplateDirective())==null?null:i.templateRef),ie(\"transform\",n.pointTransform())}}function F9A(t,e){if(t&1&&(Gt(0,x9A,1,3,\":svg:g\",10,ud().trackNodes,!0),Gt(2,R9A,1,3,\":svg:g\",11,ud().trackEdges,!0),Gt(4,N9A,1,4,\":svg:g\",12,ud().trackNodes,!0)),t&2){let A=y();Kt(A.groups()),p(2),Kt(A.edgeModels()),p(2),Kt(A.nonGroups())}}function L9A(t,e){if(t&1&&(Qt(),GA(0,\"g\",11)),t&2){let A,i,n=e.$implicit,o=y(2);X(\"model\",n)(\"edgeTemplate\",(A=o.edgeTemplateDirective())==null?null:A.templateRef)(\"edgeLabelHtmlTemplate\",(i=o.edgeLabelHtmlDirective())==null?null:i.templateRef)}}function _9A(t,e){if(t&1&&(Qt(),GA(0,\"g\",13)),t&2){let A,i,n,o=e.$implicit,a=y(2);X(\"model\",o)(\"nodeTemplate\",(A=a.nodeTemplateDirective())==null?null:A.templateRef)(\"nodeSvgTemplate\",(i=a.nodeSvgTemplateDirective())==null?null:i.templateRef)(\"groupNodeTemplate\",(n=a.groupNodeTemplateDirective())==null?null:n.templateRef),ie(\"transform\",o.pointTransform())}}function G9A(t,e){if(t&1&&(Gt(0,L9A,1,3,\":svg:g\",11,ud().trackEdges,!0),Gt(2,_9A,1,5,\":svg:g\",13,ud().trackNodes,!0)),t&2){let A=y();Kt(A.edgeModels()),p(2),Kt(A.nodeModels())}}function K9A(t,e){t&1&&(Qt(),$i(0,6)),t&2&&X(\"ngTemplateOutlet\",e.template())}function U9A(t,e){if(t&1&&GA(0,\"canvas\",7),t&2){let A=y();X(\"width\",A.flowWidth())(\"height\",A.flowHeight())}}var J9A=(t,e)=>{let A=Math.max(0,Math.min(t.x+t.width,e.x+e.width)-Math.max(t.x,e.x)),i=Math.max(0,Math.min(t.y+t.height,e.y+e.height)-Math.max(t.y,e.y));return Math.ceil(A*i)};function HeA(t){if(t.length===0)return{x:0,y:0,width:0,height:0};let e={x:1/0,y:1/0,x2:-1/0,y2:-1/0};return t.forEach(A=>{let i=H9A(A);e=O9A(e,i)}),T9A(e)}function Y9A(t,e,A){let i=e.find(o=>o.rawNode.id===t);if(!i)return[];let n=Hw(i);return e.filter(o=>{if(o.rawNode.id===t)return!1;let a=J9A(Hw(o),n);return A?.partially?a>0:a>=n.width*n.height})}function H9A(t){return{x:t.point().x,y:t.point().y,x2:t.point().x+t.size().width,y2:t.point().y+t.size().height}}function Hw(t){return{x:t.globalPoint().x,y:t.globalPoint().y,width:t.width(),height:t.height()}}function T9A({x:t,y:e,x2:A,y2:i}){return{x:t,y:e,width:A-t,height:i-e}}function O9A(t,e){return{x:Math.min(t.x,e.x),y:Math.min(t.y,e.y),x2:Math.max(t.x2,e.x2),y2:Math.max(t.y2,e.y2)}}var Tw=class{constructor(e){this.settings=e,this.curve=e.curve??\"bezier\",this.type=e.type??\"default\",this.mode=e.mode??\"strict\";let A=this.getValidators(e);this.validator=i=>A.every(n=>n(i))}getValidators(e){let A=[];return A.push(z9A),this.mode===\"loose\"&&A.push(P9A),e.validator&&A.push(e.validator),A}},z9A=t=>t.source!==t.target,P9A=t=>t.sourceHandle!==void 0&&t.targetHandle!==void 0;function SE(t){return t.split(\"\").reduce((e,A)=>(e=(e<<5)-e+A.charCodeAt(0),e&e),0)}var ig=(()=>{class t{constructor(){this.nodes=jA([],{equal:(A,i)=>!A.length&&!i.length?!0:A===i}),this.rawNodes=_e(()=>this.nodes().map(A=>A.rawNode)),this.edges=jA([],{equal:(A,i)=>!A.length&&!i.length?!0:A===i}),this.rawEdges=_e(()=>this.edges().map(A=>A.edge)),this.validEdges=_e(()=>{let A=this.nodes();return this.edges().filter(i=>A.includes(i.source())&&A.includes(i.target()))}),this.connection=jA(new Tw({})),this.markers=_e(()=>{let A=new Map;this.validEdges().forEach(n=>{if(n.edge.markers?.start){let o=SE(JSON.stringify(n.edge.markers.start));A.set(o,n.edge.markers.start)}if(n.edge.markers?.end){let o=SE(JSON.stringify(n.edge.markers.end));A.set(o,n.edge.markers.end)}});let i=this.connection().settings.marker;if(i){let n=SE(JSON.stringify(i));A.set(n,i)}return A}),this.entities=_e(()=>[...this.nodes(),...this.edges()]),this.minimap=jA(null)}getNode(A){return this.nodes().find(({rawNode:i})=>i.id===A)}getDetachedEdges(){return this.edges().filter(A=>A.detached())}static{this.\\u0275fac=function(i){return new(i||t)}}static{this.\\u0275prov=TA({token:t,factory:t.\\u0275fac})}}return t})();function j9A(t,e,A,i,n,o){let a=e/(t.width*(1+o)),r=A/(t.height*(1+o)),s=Math.min(a,r),g=q9A(s,i,n),l=t.x+t.width/2,C=t.y+t.height/2,I=e/2-l*g,d=A/2-C*g;return{x:I,y:d,zoom:g}}function q9A(t,e=0,A=1){return Math.min(Math.max(t,e),A)}function V9A(t,e,A){let i=t.zoom;return{x:-t.x/i,y:-t.y/i,width:e/i,height:A/i}}function W9A(t,e,A,i){let n=V9A(e,A,i);return!(t.x+t.width<n.x||t.x>n.x+n.width||t.y+t.height<n.y||t.y>n.y+n.height)}var Z9A={detachedGroupsLayer:!1,virtualization:!1,virtualizationZoomThreshold:.5,lazyLoadTrigger:\"immediate\"},rs=(()=>{class t{constructor(){this.entitiesSelectable=jA(!0),this.elevateNodesOnSelect=jA(!0),this.elevateEdgesOnSelect=jA(!0),this.view=jA([400,400]),this.computedFlowWidth=jA(0),this.computedFlowHeight=jA(0),this.minZoom=jA(.5),this.maxZoom=jA(3),this.background=jA({type:\"solid\",color:\"#fff\"}),this.snapGrid=jA([1,1]),this.optimization=jA(Z9A)}static{this.\\u0275fac=function(i){return new(i||t)}}static{this.\\u0275prov=TA({token:t,factory:t.\\u0275fac})}}return t})(),cd=(()=>{class t{constructor(){this.entitiesService=h(ig),this.flowSettingsService=h(rs),this.writableViewport=jA({changeType:\"initial\",state:t.getDefaultViewport(),duration:0}),this.readableViewport=jA(t.getDefaultViewport()),this.viewportChangeEnd$=new $A}static getDefaultViewport(){return{zoom:1,x:0,y:0}}fitView(A={padding:.1,duration:0,nodes:[]}){let i=this.getBoundsNodes(A.nodes??[]),n=j9A(HeA(i),this.flowSettingsService.computedFlowWidth(),this.flowSettingsService.computedFlowHeight(),this.flowSettingsService.minZoom(),this.flowSettingsService.maxZoom(),A.padding??.1),o=A.duration??0;this.writableViewport.set({changeType:\"absolute\",state:n,duration:o})}triggerViewportChangeEvent(A){A===\"end\"&&this.viewportChangeEnd$.next()}getBoundsNodes(A){return A?.length?A.map(i=>this.entitiesService.nodes().find(({rawNode:n})=>n.id===i)).filter(i=>!!i):this.entitiesService.nodes()}static{this.\\u0275fac=function(i){return new(i||t)}}static{this.\\u0275prov=TA({token:t,factory:t.\\u0275fac})}}return t})();function bC(t){return t!==void 0}var Xw=(()=>{class t{constructor(){this.element=h(ge).nativeElement}static{this.\\u0275fac=function(i){return new(i||t)}}static{this.\\u0275dir=OA({type:t,selectors:[[\"svg\",\"rootSvgRef\",\"\"]]})}}return t})();function veA(){let t=window.navigator.userAgent.toLowerCase(),e=/(macintosh|macintel|macppc|mac68k|macos)/i,A=/(win32|win64|windows|wince)/i,i=/(iphone|ipad|ipod)/i,n=null;return e.test(t)?n=\"macos\":i.test(t)?n=\"ios\":A.test(t)?n=\"windows\":/android/.test(t)?n=\"android\":!n&&/linux/.test(t)&&(n=\"linux\"),n}var zN=(()=>{class t{constructor(){this.actions=jA({multiSelection:[veA()===\"macos\"?\"MetaLeft\":\"ControlLeft\",veA()===\"macos\"?\"MetaRight\":\"ControlRight\"]}),this.actionsActive={multiSelection:!1},Tn(this.actions).pipe(Ei(()=>Qi(mc(document,\"keydown\").pipe(Wt(A=>{for(let i in this.actions())(this.actions()[i]??[]).includes(A.code)&&(this.actionsActive[i]=!0)})),mc(document,\"keyup\").pipe(Wt(A=>{for(let i in this.actions())(this.actions()[i]??[]).includes(A.code)&&(this.actionsActive[i]=!1)})))),br()).subscribe()}setShortcuts(A){this.actions.update(i=>BA(BA({},i),A))}isActiveAction(A){return this.actionsActive[A]}static{this.\\u0275fac=function(i){return new(i||t)}}static{this.\\u0275prov=TA({token:t,factory:t.\\u0275fac})}}return t})(),Vu=(()=>{class t{constructor(){this.flowEntitiesService=h(ig),this.keyboardService=h(zN),this.viewport$=new $A,this.resetSelection=this.viewport$.pipe(Wt(({start:A,end:i,target:n})=>{if(A&&i&&n){let o=t.delta,a=Math.abs(i.x-A.x),r=Math.abs(i.y-A.y),s=a<o&&r<o,g=!n.closest(\".selectable\");s&&g&&this.select(null)}}),br()).subscribe()}static{this.delta=6}setViewport(A){this.viewport$.next(A)}select(A){A?.selected()||(this.keyboardService.isActiveAction(\"multiSelection\")||this.flowEntitiesService.entities().forEach(i=>i.selected.set(!1)),A&&A.selected.set(!0))}static{this.\\u0275fac=function(i){return new(i||t)}}static{this.\\u0275prov=TA({token:t,factory:t.\\u0275fac})}}return t})(),HN=(()=>{class t{constructor(){this.rootSvg=h(Xw).element,this.host=h(ge).nativeElement,this.selectionService=h(Vu),this.viewportService=h(cd),this.flowSettingsService=h(rs),this.zone=h(Oe),this.rootSvgSelection=ur(this.rootSvg),this.transform=jA(\"\"),this.viewportForSelection={},this.manualViewportChangeEffect=pa(()=>{let A=this.viewportService.writableViewport(),i=A.state;if(A.changeType!==\"initial\"){if(bC(i.zoom)&&!bC(i.x)&&!bC(i.y)){this.rootSvgSelection.transition().duration(A.duration).call(this.zoomBehavior.scaleTo,i.zoom);return}if(bC(i.x)&&bC(i.y)&&!bC(i.zoom)){let n=Zo(this.viewportService.readableViewport).zoom;this.rootSvgSelection.transition().duration(A.duration).call(this.zoomBehavior.transform,EI.translate(i.x,i.y).scale(n));return}if(bC(i.x)&&bC(i.y)&&bC(i.zoom)){this.rootSvgSelection.transition().duration(A.duration).call(this.zoomBehavior.transform,EI.translate(i.x,i.y).scale(i.zoom));return}}},{allowSignalWrites:!0}),this.handleZoom=({transform:A})=>{this.viewportService.readableViewport.set(TN(A)),this.transform.set(A.toString())},this.handleZoomStart=({transform:A})=>{this.viewportForSelection={start:TN(A)}},this.handleZoomEnd=({transform:A,sourceEvent:i})=>{this.zone.run(()=>{this.viewportForSelection=Ve(BA({},this.viewportForSelection),{end:TN(A),target:X9A(i)}),this.viewportService.triggerViewportChangeEvent(\"end\"),this.selectionService.setViewport(this.viewportForSelection)})},this.filterCondition=A=>A.type===\"mousedown\"||A.type===\"touchstart\"?A.target.closest(\".vflow-node\")===null:!0}ngOnInit(){this.zone.runOutsideAngular(()=>{this.zoomBehavior=YN().scaleExtent([this.flowSettingsService.minZoom(),this.flowSettingsService.maxZoom()]).filter(this.filterCondition).on(\"start\",this.handleZoomStart).on(\"zoom\",this.handleZoom).on(\"end\",this.handleZoomEnd),this.rootSvgSelection.call(this.zoomBehavior).on(\"dblclick.zoom\",null)})}static{this.\\u0275fac=function(i){return new(i||t)}}static{this.\\u0275dir=OA({type:t,selectors:[[\"g\",\"mapContext\",\"\"]],hostVars:1,hostBindings:function(i,n){i&2&&ie(\"transform\",n.transform())}})}}return t})(),TN=t=>({zoom:t.k,x:t.x,y:t.y}),X9A=t=>{if(t instanceof Event&&t.target instanceof Element)return t.target},Ow=t=>Math.round(t*100)/100;function tg(t,e){return Math.ceil(t/e)*e}var hI=(()=>{class t{constructor(){this.status=jA({state:\"idle\",payload:null})}setIdleStatus(){this.status.set({state:\"idle\",payload:null})}setConnectionStartStatus(A,i){this.status.set({state:\"connection-start\",payload:{source:A,sourceHandle:i}})}setReconnectionStartStatus(A,i,n){this.status.set({state:\"reconnection-start\",payload:{source:A,sourceHandle:i,oldEdge:n}})}setConnectionValidationStatus(A,i,n,o,a){this.status.set({state:\"connection-validation\",payload:{source:i,target:n,sourceHandle:o,targetHandle:a,valid:A}})}setReconnectionValidationStatus(A,i,n,o,a,r){this.status.set({state:\"reconnection-validation\",payload:{source:i,target:n,sourceHandle:o,targetHandle:a,valid:A,oldEdge:r}})}setConnectionEndStatus(A,i,n,o){this.status.set({state:\"connection-end\",payload:{source:A,target:i,sourceHandle:n,targetHandle:o}})}setReconnectionEndStatus(A,i,n,o,a){this.status.set({state:\"reconnection-end\",payload:{source:A,target:i,sourceHandle:n,targetHandle:o,oldEdge:a}})}setNodeDragStartStatus(A){this.status.set({state:\"node-drag-start\",payload:{node:A}})}setNodeDragEndStatus(A){this.status.set({state:\"node-drag-end\",payload:{node:A}})}static{this.\\u0275fac=function(i){return new(i||t)}}static{this.\\u0275prov=TA({token:t,factory:t.\\u0275fac})}}return t})();function beA(t){return t.state===\"node-drag-start\"}function $9A(t){return t.state===\"node-drag-end\"}var TeA=(()=>{class t{constructor(){this.entitiesService=h(ig),this.settingsService=h(rs),this.flowStatusService=h(hI)}enable(A,i){ur(A).call(this.getDragBehavior(i))}disable(A){ur(A).call(uw().on(\"drag\",null))}destroy(A){ur(A).on(\".drag\",null)}getDragBehavior(A){let i=[],n=[],o=a=>A.dragHandlesCount()?!!a.target.closest(\".vflow-drag-handle\"):!0;return uw().filter(o).on(\"start\",a=>{i=this.getDragNodes(A),this.flowStatusService.setNodeDragStartStatus(A),n=i.map(r=>({x:r.point().x-a.x,y:r.point().y-a.y}))}).on(\"drag\",a=>{i.forEach((r,s)=>{let g={x:Ow(a.x+n[s].x),y:Ow(a.y+n[s].y)};this.moveNode(r,g)})}).on(\"end\",()=>{this.flowStatusService.setNodeDragEndStatus(A)})}getDragNodes(A){return A.selected()?this.entitiesService.nodes().filter(i=>i.selected()&&i.draggable()):[A]}moveNode(A,i){i=this.alignToGrid(i);let n=A.parent();n&&(i.x=Math.min(n.width()-A.width(),i.x),i.x=Math.max(0,i.x),i.y=Math.min(n.height()-A.height(),i.y),i.y=Math.max(0,i.y)),A.setPoint(i)}alignToGrid(A){let[i,n]=this.settingsService.snapGrid();return i>1&&(A.x=tg(A.x,i)),n>1&&(A.y=tg(A.y,n)),A}static{this.\\u0275fac=function(i){return new(i||t)}}static{this.\\u0275prov=TA({token:t,factory:t.\\u0275fac})}}return t})(),MeA=(()=>{class t{constructor(){this.templateRef=h(Fn)}static ngTemplateContextGuard(A,i){return!0}static{this.\\u0275fac=function(i){return new(i||t)}}static{this.\\u0275dir=OA({type:t,selectors:[[\"ng-template\",\"edge\",\"\"]]})}}return t})(),keA=(()=>{class t{constructor(){this.templateRef=h(Fn)}static ngTemplateContextGuard(A,i){return!0}static{this.\\u0275fac=function(i){return new(i||t)}}static{this.\\u0275dir=OA({type:t,selectors:[[\"ng-template\",\"connection\",\"\"]]})}}return t})(),SeA=(()=>{class t{constructor(){this.templateRef=h(Fn)}static ngTemplateContextGuard(A,i){return!0}static{this.\\u0275fac=function(i){return new(i||t)}}static{this.\\u0275dir=OA({type:t,selectors:[[\"ng-template\",\"edgeLabelHtml\",\"\"]]})}}return t})(),zw=(()=>{class t{constructor(){this.templateRef=h(Fn)}static ngTemplateContextGuard(A,i){return!0}static{this.\\u0275fac=function(i){return new(i||t)}}static{this.\\u0275dir=OA({type:t,selectors:[[\"ng-template\",\"nodeHtml\",\"\"]]})}}return t})(),xeA=(()=>{class t{constructor(){this.templateRef=h(Fn)}static ngTemplateContextGuard(A,i){return!0}static{this.\\u0275fac=function(i){return new(i||t)}}static{this.\\u0275dir=OA({type:t,selectors:[[\"ng-template\",\"nodeSvg\",\"\"]]})}}return t})(),Pw=(()=>{class t{constructor(){this.templateRef=h(Fn)}static ngTemplateContextGuard(A,i){return!0}static{this.\\u0275fac=function(i){return new(i||t)}}static{this.\\u0275dir=OA({type:t,selectors:[[\"ng-template\",\"groupNode\",\"\"]]})}}return t})();function ReA(t,e){let A=t.reduce((i,n)=>(i[n.rawNode.id]=n,i),{});e.forEach(i=>{i.source.set(A[i.edge.source]),i.target.set(A[i.edge.target])})}function ju(t){try{return new Proxy(t,{apply:()=>{}})(),!0}catch(e){return!1}}var PN=(()=>{class t{constructor(){this._event$=new $A,this.event$=this._event$.asObservable()}pushEvent(A){this._event$.next(A)}static{this.\\u0275fac=function(i){return new(i||t)}}static{this.\\u0275prov=TA({token:t,factory:t.\\u0275fac})}}return t})(),xE=(()=>{class t{constructor(){this.model=jA(null)}static{this.\\u0275fac=function(i){return new(i||t)}}static{this.\\u0275prov=TA({token:t,factory:t.\\u0275fac})}}return t})(),OeA=(()=>{class t{constructor(){this.eventBus=h(PN),this.nodeService=h(xE),this.destroyRef=h(Wa),this.selected=this.nodeService.model().selected,this.data=jA(void 0)}ngOnInit(){this.trackEvents().pipe(br(this.destroyRef)).subscribe()}trackEvents(){let A=Object.getOwnPropertyNames(this),i=new Map;for(let n of A){let o=this[n];o instanceof WA&&i.set(o,n),o instanceof fL&&i.set(AMA(o),n)}return Qi(...Array.from(i.keys()).map(n=>n.pipe(Wt(o=>{this.eventBus.pushEvent({nodeId:this.nodeService.model()?.rawNode.id??\"\",eventName:i.get(n),eventPayload:o})}))))}static{this.\\u0275fac=function(i){return new(i||t)}}static{this.\\u0275dir=OA({type:t,standalone:!1})}}return t})();function AMA(t){return new Ti(e=>{let A=t.subscribe(i=>{e.next(i)});return()=>{A.unsubscribe()}})}var eMA=(()=>{class t extends OeA{constructor(){super(...arguments),this.node=nt.required()}ngOnInit(){let A=this.node().data;A&&(this.data=A),super.ngOnInit()}static{this.\\u0275fac=(()=>{let A;return function(n){return(A||(A=hi(t)))(n||t)}})()}static{this.\\u0275dir=OA({type:t,inputs:{node:[1,\"node\"]},standalone:!1,features:[Ct]})}}return t})(),tMA=(()=>{class t extends OeA{constructor(){super(...arguments),this.node=nt.required()}ngOnInit(){this.node().data&&this.data.set(this.node().data),super.ngOnInit()}static{this.\\u0275fac=(()=>{let A;return function(n){return(A||(A=hi(t)))(n||t)}})()}static{this.\\u0275dir=OA({type:t,inputs:{node:[1,\"node\"]},standalone:!1,features:[Ct]})}}return t})();function zeA(t){return Object.prototype.isPrototypeOf.call(tMA,t)}function PeA(t){return Object.prototype.isPrototypeOf.call(eMA,t)}function iMA(t){return typeof t.point==\"function\"}function nMA(t){return zeA(t.type)?!0:ju(t.type)&&!ju(t.point)}function oMA(t){return PeA(t.type)?!0:ju(t.type)&&ju(t.point)}var jw=2;function aMA(t){return iMA(t)?t:Ve(BA({},rMA(t)),{id:t.id,type:t.type})}function rMA(t){let e={};for(let A in t)Object.prototype.hasOwnProperty.call(t,A)&&(e[A]=jA(t[A]));return e}function sMA(t,e,A){!e&&gL(t);let i=e??h(ut);return A?Ya(i,A):i}function qu(t,e){let A=sMA(qu,e?.injector),i;return _e(()=>(i||(i=Zo(()=>Is(t,Ve(BA({},e),{injector:A})))),i()))}function gMA(t){return t.rawNode.type===\"default-group\"||t.rawNode.type===\"template-group\"}var Cd=(()=>{class t{constructor(){this.flowEntitiesService=h(ig),this.flowSettingsService=h(rs),this.viewportService=h(cd),this.nodes=_e(()=>this.flowSettingsService.optimization().virtualization?this.viewportNodesAfterInteraction().sort((A,i)=>A.renderOrder()-i.renderOrder()):[...this.flowEntitiesService.nodes()].sort((A,i)=>A.renderOrder()-i.renderOrder())),this.groups=_e(()=>this.nodes().filter(A=>!!A.children().length||gMA(A))),this.nonGroups=_e(()=>this.nodes().filter(A=>!this.groups().includes(A))),this.viewportNodes=_e(()=>{let A=this.flowEntitiesService.nodes(),i=this.viewportService.readableViewport(),n=this.flowSettingsService.computedFlowWidth(),o=this.flowSettingsService.computedFlowHeight();return A.filter(a=>{let{x:r,y:s}=a.globalPoint(),g=a.width(),l=a.height();return W9A({x:r,y:s,width:g,height:l},i,n,o)})}),this.viewportNodesAfterInteraction=qu(Qi(Tn(this.flowEntitiesService.nodes).pipe(Ed(sf),We(A=>!!A.length)),this.viewportService.viewportChangeEnd$.pipe(ps(300))).pipe(fe(()=>{let A=this.viewportService.readableViewport(),i=this.flowSettingsService.optimization().virtualizationZoomThreshold;return A.zoom<i?[]:this.viewportNodes()})),{initialValue:[]}),this.maxOrder=_e(()=>Math.max(...this.flowEntitiesService.nodes().map(A=>A.renderOrder())))}pullNode(A){A.renderOrder.set(this.maxOrder()+1),A.children().forEach(i=>this.pullNode(i))}static{this.\\u0275fac=function(i){return new(i||t)}}static{this.\\u0275prov=TA({token:t,factory:t.\\u0275fac})}}return t})();function qw(t,e){e||(e={equal:Object.is});let A;return _e(()=>A=t(A),e)}var lMA=(()=>{class t{static{this.defaultWidth=100}static{this.defaultHeight=50}static{this.defaultColor=\"#1b262c\"}constructor(A){this.rawNode=A,this.entitiesService=h(ig),this.settingsService=h(rs),this.nodeRenderingService=h(Cd),this.isVisible=jA(!1),this.point=jA({x:0,y:0}),this.width=jA(t.defaultWidth),this.height=jA(t.defaultHeight),this.size=_e(()=>({width:this.width(),height:this.height()})),this.styleWidth=_e(()=>this.controlledByResizer()?`${this.width()}px`:\"100%\"),this.styleHeight=_e(()=>this.controlledByResizer()?`${this.height()}px`:\"100%\"),this.foWidth=_e(()=>this.width()+jw),this.foHeight=_e(()=>this.height()+jw),this.renderOrder=jA(0),this.selected=jA(!1),this.preview=jA({style:{}}),this.globalPoint=_e(()=>{let n=this.parent(),o=this.point().x,a=this.point().y;for(;n!==null;)o+=n.point().x,a+=n.point().y,n=n.parent();return{x:o,y:a}}),this.pointTransform=_e(()=>`translate(${this.globalPoint().x}, ${this.globalPoint().y})`),this.handles=jA([]),this.draggable=jA(!0),this.dragHandlesCount=jA(0),this.magnetRadius=20,this.isComponentType=nMA(this.rawNode)||oMA(this.rawNode),this.shouldLoad=qw(n=>{if(n||this.settingsService.optimization().lazyLoadTrigger===\"immediate\")return!0;if(this.settingsService.optimization().lazyLoadTrigger===\"viewport\"){if(zeA(this.rawNode.type)||PeA(this.rawNode.type))return!0;if(ju(this.rawNode.type)||this.rawNode.type===\"html-template\"||this.rawNode.type===\"svg-template\"||this.rawNode.type===\"template-group\")return this.nodeRenderingService.viewportNodes().includes(this)}return!0}),this.componentInstance$=Tn(this.shouldLoad).pipe(We(Boolean),Ei(()=>this.rawNode.type()),Ho(()=>oe(this.rawNode.type)),Ds(1)),this.text=jA(\"\"),this.componentTypeInputs={node:this.rawNode},this.parent=_e(()=>this.entitiesService.nodes().find(n=>n.rawNode.id===this.parentId())??null),this.children=_e(()=>this.entitiesService.nodes().filter(n=>n.parentId()===this.rawNode.id)),this.color=jA(t.defaultColor),this.controlledByResizer=jA(!1),this.resizable=jA(!1),this.resizing=jA(!1),this.resizerTemplate=jA(null),this.context={$implicit:{}},this.parentId=jA(null);let i=aMA(A);i.point&&(this.point=i.point),i.width&&(this.width=i.width),i.height&&(this.height=i.height),i.draggable&&(this.draggable=i.draggable),i.parentId&&(this.parentId=i.parentId),i.preview&&(this.preview=i.preview),i.type===\"default-group\"&&i.color&&(this.color=i.color),i.type===\"default-group\"&&i.resizable&&(this.resizable=i.resizable),i.type===\"default\"&&i.text&&(this.text=i.text),i.type===\"html-template\"&&(this.context={$implicit:{node:A,selected:this.selected.asReadonly(),shouldLoad:this.shouldLoad}}),i.type===\"svg-template\"&&(this.context={$implicit:{node:A,selected:this.selected.asReadonly(),width:this.width.asReadonly(),height:this.height.asReadonly(),shouldLoad:this.shouldLoad}}),i.type===\"template-group\"&&(this.context={$implicit:{node:A,selected:this.selected.asReadonly(),width:this.width.asReadonly(),height:this.height.asReadonly(),shouldLoad:this.shouldLoad}}),this.point$=Tn(this.point),this.width$=Tn(this.width),this.height$=Tn(this.height),this.size$=Tn(this.size),this.selected$=Tn(this.selected),this.handles$=Tn(this.handles)}setPoint(A){this.point.set(A)}}return t})(),zu=class{constructor(e){this.edgeLabel=e,this.size=jA({width:0,height:0})}};function MC(t,e,A){return{x:(1-A)*t.x+A*e.x,y:(1-A)*t.y+A*e.y}}function jN({sourcePoint:t,targetPoint:e}){return{path:`M ${t.x},${t.y}L ${e.x},${e.y}`,labelPoints:{start:MC(t,e,.15),center:MC(t,e,.5),end:MC(t,e,.85)}}}function qN({sourcePoint:t,targetPoint:e,sourcePosition:A,targetPosition:i}){let n={x:t.x-e.x,y:t.y-e.y},o=NeA(t,A,n),a=NeA(e,i,n),r=`M${t.x},${t.y} C${o.x},${o.y} ${a.x},${a.y} ${e.x},${e.y}`;return cMA(r,t,e,o,a)}function NeA(t,e,A){let i={x:0,y:0};switch(e){case\"top\":i.y=1;break;case\"bottom\":i.y=-1;break;case\"right\":i.x=1;break;case\"left\":i.x=-1;break}let n={x:A.x*Math.abs(i.x),y:A.y*Math.abs(i.y)},a=.25*25*Math.sqrt(Math.abs(n.x+n.y));return{x:t.x+i.x*a,y:t.y-i.y*a}}function cMA(t,e,A,i,n){return{path:t,labelPoints:{start:ON(e,A,i,n,.1),center:ON(e,A,i,n,.5),end:ON(e,A,i,n,.9)}}}function ON(t,e,A,i,n){let o=MC(t,A,n),a=MC(A,i,n),r=MC(i,e,n);return MC(MC(o,a,n),MC(a,r,n),n)}var FeA={left:{x:-1,y:0},right:{x:1,y:0},top:{x:0,y:-1},bottom:{x:0,y:1}};function CMA(t,e){let A=Math.abs(e.x-t.x)/2,i=e.x<t.x?e.x+A:e.x-A,n=Math.abs(e.y-t.y)/2,o=e.y<t.y?e.y+n:e.y-n;return[i,o,A,n]}var IMA=({source:t,sourcePosition:e=\"bottom\",target:A})=>e===\"left\"||e===\"right\"?t.x<A.x?{x:1,y:0}:{x:-1,y:0}:t.y<A.y?{x:0,y:1}:{x:0,y:-1},LeA=(t,e)=>Math.sqrt(Math.pow(e.x-t.x,2)+Math.pow(e.y-t.y,2));function dMA({source:t,sourcePosition:e=\"bottom\",target:A,targetPosition:i=\"top\",offset:n}){let o=FeA[e],a=FeA[i],r={x:t.x+o.x*n,y:t.y+o.y*n},s={x:A.x+a.x*n,y:A.y+a.y*n},g=IMA({source:r,sourcePosition:e,target:s}),l=g.x!==0?\"x\":\"y\",C=g[l],I=[],d,B,Q={x:0,y:0},E={x:0,y:0},[f,b]=CMA(t,A);if(o[l]*a[l]===-1){d=f,B=b;let M=[{x:d,y:r.y},{x:d,y:s.y}],v=[{x:r.x,y:B},{x:s.x,y:B}];o[l]===C?I=l===\"x\"?M:v:I=l===\"x\"?v:M}else{let M=[{x:r.x,y:s.y}],v=[{x:s.x,y:r.y}];if(l===\"x\"?I=o.x===C?v:M:I=o.y===C?M:v,e===i){let j=Math.abs(t[l]-A[l]);if(j<=n){let AA=Math.min(n-1,n-j);o[l]===C?Q[l]=(r[l]>t[l]?-1:1)*AA:E[l]=(s[l]>A[l]?-1:1)*AA}}if(e!==i){let j=l===\"x\"?\"y\":\"x\",AA=o[l]===a[j],z=r[j]>s[j],yA=r[j]<s[j];(o[l]===1&&(!AA&&z||AA&&yA)||o[l]!==1&&(!AA&&yA||AA&&z))&&(I=l===\"x\"?M:v)}let F={x:r.x+Q.x,y:r.y+Q.y},G={x:s.x+E.x,y:s.y+E.y},U=Math.max(Math.abs(F.x-I[0].x),Math.abs(G.x-I[0].x)),Y=Math.max(Math.abs(F.y-I[0].y),Math.abs(G.y-I[0].y));U>=Y?(d=(F.x+G.x)/2,B=I[0].y):(d=I[0].x,B=(F.y+G.y)/2)}return[[t,{x:r.x+Q.x,y:r.y+Q.y},...I,{x:s.x+E.x,y:s.y+E.y},A],d,B]}function BMA(t,e,A,i){let n=Math.min(LeA(t,e)/2,LeA(e,A)/2,i),{x:o,y:a}=e;if(t.x===o&&o===A.x||t.y===a&&a===A.y)return`L${o} ${a}`;if(t.y===a){let g=t.x<A.x?-1:1,l=t.y<A.y?1:-1;return`L ${o+n*g},${a}Q ${o},${a} ${o},${a+n*l}`}let r=t.x<A.x?1:-1,s=t.y<A.y?-1:1;return`L ${o},${a+n*s}Q ${o},${a} ${o+n*r},${a}`}function kE({sourcePoint:t,targetPoint:e,sourcePosition:A,targetPosition:i},n=5){let[o,a,r]=dMA({source:t,sourcePosition:A,target:e,targetPosition:i,offset:20}),s=o.reduce((B,Q,E)=>{let f=\"\";return E>0&&E<o.length-1?f=BMA(o[E-1],Q,o[E+1],n):f=`${E===0?\"M\":\"L\"}${Q.x} ${Q.y}`,B+=f,B},\"\"),g=o.length;if(g<2)return{path:s,labelPoints:{start:{x:a,y:r},center:{x:a,y:r},end:{x:a,y:r}}};let l=new Array(g-1),C=new Array(g);C[0]=0;let I=0;for(let B=0;B<g-1;B++){let Q=o[B+1].x-o[B].x,E=o[B+1].y-o[B].y,f=Math.sqrt(Q*Q+E*E);l[B]=f,I+=f,C[B+1]=I}let d=B=>{let Q=I*B;if(Q<=0)return o[0];if(Q>=I)return o[g-1];let E=0,f=g-1;for(;E<f-1;){let G=E+f>>>1;C[G]<Q?E=G:f=G}let b=C[E],M=(Q-b)/l[E],v=o[E],F=o[E+1];return{x:v.x+(F.x-v.x)*M,y:v.y+(F.y-v.y)*M}};return{path:s,labelPoints:{start:d(.15),center:{x:a,y:r},end:d(.85)}}}var VN=class{constructor(e){this.edge=e,this.flowEntitiesService=h(ig),this.source=jA(void 0),this.target=jA(void 0),this.selected=jA(!1),this.selected$=Tn(this.selected),this.shouldLoad=_e(()=>(this.source()?.shouldLoad()??!1)&&(this.target()?.shouldLoad()??!1)),this.renderOrder=jA(0),this.detached=_e(()=>{let A=this.source(),i=this.target();if(!A||!i)return!0;let n=!1,o=!1;return this.edge.sourceHandle?n=!!A.handles().find(a=>a.rawHandle.id===this.edge.sourceHandle):n=!!A.handles().find(a=>a.rawHandle.type===\"source\"),this.edge.targetHandle?o=!!i.handles().find(a=>a.rawHandle.id===this.edge.targetHandle):o=!!i.handles().find(a=>a.rawHandle.type===\"target\"),!n||!o}),this.detached$=Tn(this.detached),this.path=_e(()=>{let A=this.sourceHandle(),i=this.targetHandle();if(!A||!i)return{path:\"\"};let n=this.getPathFactoryParams(A,i);switch(this.curve){case\"straight\":return jN(n);case\"bezier\":return qN(n);case\"smooth-step\":return kE(n);case\"step\":return kE(n,0);default:return this.curve(n)}}),this.sourceHandle=qw(A=>{let i=null;return this.floating?i=this.closestHandles().sourceHandle:this.edge.sourceHandle?i=this.source()?.handles().find(n=>n.rawHandle.id===this.edge.sourceHandle)??null:i=this.source()?.handles().find(n=>n.rawHandle.type===\"source\")??null,i===null?A:i}),this.targetHandle=qw(A=>{let i=null;return this.floating?i=this.closestHandles().targetHandle:this.edge.targetHandle?i=this.target()?.handles().find(n=>n.rawHandle.id===this.edge.targetHandle)??null:i=this.target()?.handles().find(n=>n.rawHandle.type===\"target\")??null,i===null?A:i}),this.closestHandles=_e(()=>{let A=this.source(),i=this.target();if(!A||!i)return{sourceHandle:null,targetHandle:null};let n=this.flowEntitiesService.connection().mode===\"strict\"?A.handles().filter(g=>g.rawHandle.type===\"source\"):A.handles(),o=this.flowEntitiesService.connection().mode===\"strict\"?i.handles().filter(g=>g.rawHandle.type===\"target\"):i.handles();if(n.length===0||o.length===0)return{sourceHandle:null,targetHandle:null};let a=1/0,r=null,s=null;for(let g of n)for(let l of o){let C=g.pointAbsolute(),I=l.pointAbsolute(),d=Math.sqrt(Math.pow(C.x-I.x,2)+Math.pow(C.y-I.y,2));d<a&&(a=d,r=g,s=l)}return{sourceHandle:r,targetHandle:s}}),this.markerStartUrl=_e(()=>{let A=this.edge.markers?.start;return A?`url(#${SE(JSON.stringify(A))})`:\"\"}),this.markerEndUrl=_e(()=>{let A=this.edge.markers?.end;return A?`url(#${SE(JSON.stringify(A))})`:\"\"}),this.context={$implicit:{edge:this.edge,path:_e(()=>this.path().path),markerStart:this.markerStartUrl,markerEnd:this.markerEndUrl,selected:this.selected.asReadonly(),shouldLoad:this.shouldLoad}},this.edgeLabels={},this.type=e.type??\"default\",this.curve=e.curve??\"bezier\",this.reconnectable=e.reconnectable??!1,this.floating=e.floating??!1,e.edgeLabels?.start&&(this.edgeLabels.start=new zu(e.edgeLabels.start)),e.edgeLabels?.center&&(this.edgeLabels.center=new zu(e.edgeLabels.center)),e.edgeLabels?.end&&(this.edgeLabels.end=new zu(e.edgeLabels.end))}getPathFactoryParams(e,A){return{mode:\"edge\",edge:this.edge,sourcePoint:e.pointAbsolute(),targetPoint:A.pointAbsolute(),sourcePosition:e.rawHandle.position,targetPosition:A.rawHandle.position,allEdges:this.flowEntitiesService.rawEdges(),allNodes:this.flowEntitiesService.rawNodes()}}},Vw=class{static nodes(e,A){let i=new Map;return A.forEach(n=>i.set(n.rawNode,n)),e.map(n=>i.get(n)??new lMA(n))}static edges(e,A){let i=new Map;return A.forEach(n=>i.set(n.edge,n)),e.map(n=>i.has(n)?i.get(n):new VN(n))}},QMA=25,WN=(()=>{class t{constructor(){this.entitiesService=h(ig),this.nodesPositionChange$=Tn(this.entitiesService.nodes).pipe(Ei(A=>Qi(...A.map(i=>i.point$.pipe(rg(1),fe(()=>i))))),fe(A=>[{type:\"position\",id:A.rawNode.id,point:A.point()},...this.entitiesService.nodes().filter(i=>i!==A&&i.selected()).map(i=>({type:\"position\",id:i.rawNode.id,point:i.point()}))])),this.nodeSizeChange$=Tn(this.entitiesService.nodes).pipe(Ei(A=>Qi(...A.map(i=>i.size$.pipe(rg(1),fe(()=>i))))),fe(A=>[{type:\"size\",id:A.rawNode.id,size:A.size()}])),this.nodeAddChange$=Tn(this.entitiesService.nodes).pipe(kC(),fe(([A,i])=>i.filter(n=>!A.includes(n))),We(A=>!!A.length),fe(A=>A.map(i=>({type:\"add\",id:i.rawNode.id})))),this.nodeRemoveChange$=Tn(this.entitiesService.nodes).pipe(kC(),fe(([A,i])=>A.filter(n=>!i.includes(n))),We(A=>!!A.length),fe(A=>A.map(i=>({type:\"remove\",id:i.rawNode.id})))),this.nodeSelectedChange$=Tn(this.entitiesService.nodes).pipe(Ei(A=>Qi(...A.map(i=>i.selected$.pipe(hl(),rg(1),fe(()=>i))))),fe(A=>[{type:\"select\",id:A.rawNode.id,selected:A.selected()}])),this.changes$=Qi(this.nodesPositionChange$,this.nodeSizeChange$,this.nodeAddChange$,this.nodeRemoveChange$,this.nodeSelectedChange$).pipe(Ed(sf,QMA))}static{this.\\u0275fac=function(i){return new(i||t)}}static{this.\\u0275prov=TA({token:t,factory:t.\\u0275fac})}}return t})(),EMA=(t,e)=>t.length===e.length&&[...new Set([...t,...e])].every(A=>t.filter(i=>i===A).length===e.filter(i=>i===A).length),ZN=(()=>{class t{constructor(){this.entitiesService=h(ig),this.edgeDetachedChange$=Qi(Tn(_e(()=>{let A=this.entitiesService.nodes();return Zo(this.entitiesService.edges).filter(({source:n,target:o})=>!A.includes(n())||!A.includes(o()))})),Tn(this.entitiesService.edges).pipe(Ei(A=>nL(...A.map(i=>i.detached$.pipe(fe(()=>i))))),fe(A=>A.filter(i=>i.detached())),rg(2))).pipe(hl(EMA),We(A=>!!A.length),fe(A=>A.map(({edge:i})=>({type:\"detached\",id:i.id})))),this.edgeAddChange$=Tn(this.entitiesService.edges).pipe(kC(),fe(([A,i])=>i.filter(n=>!A.includes(n))),We(A=>!!A.length),fe(A=>A.map(({edge:i})=>({type:\"add\",id:i.id})))),this.edgeRemoveChange$=Tn(this.entitiesService.edges).pipe(kC(),fe(([A,i])=>A.filter(n=>!i.includes(n))),We(A=>!!A.length),fe(A=>A.map(({edge:i})=>({type:\"remove\",id:i.id})))),this.edgeSelectChange$=Tn(this.entitiesService.edges).pipe(Ei(A=>Qi(...A.map(i=>i.selected$.pipe(hl(),rg(1),fe(()=>i))))),fe(A=>[{type:\"select\",id:A.edge.id,selected:A.selected()}])),this.changes$=Qi(this.edgeDetachedChange$,this.edgeAddChange$,this.edgeRemoveChange$,this.edgeSelectChange$).pipe(Ed(sf))}static{this.\\u0275fac=function(i){return new(i||t)}}static{this.\\u0275prov=TA({token:t,factory:t.\\u0275fac})}}return t})(),hMA=(()=>{class t{constructor(){this.nodesChangeService=h(WN),this.edgesChangeService=h(ZN),this.onNodesChange=hn(this.nodesChangeService.changes$),this.onNodesChangePosition=hn(this.nodeChangesOfType(\"position\"),{alias:\"onNodesChange.position\"}),this.onNodesChangePositionSignle=hn(this.singleChange(this.nodeChangesOfType(\"position\")),{alias:\"onNodesChange.position.single\"}),this.onNodesChangePositionMany=hn(this.manyChanges(this.nodeChangesOfType(\"position\")),{alias:\"onNodesChange.position.many\"}),this.onNodesChangeSize=hn(this.nodeChangesOfType(\"size\"),{alias:\"onNodesChange.size\"}),this.onNodesChangeSizeSingle=hn(this.singleChange(this.nodeChangesOfType(\"size\")),{alias:\"onNodesChange.size.single\"}),this.onNodesChangeSizeMany=hn(this.manyChanges(this.nodeChangesOfType(\"size\")),{alias:\"onNodesChange.size.many\"}),this.onNodesChangeAdd=hn(this.nodeChangesOfType(\"add\"),{alias:\"onNodesChange.add\"}),this.onNodesChangeAddSingle=hn(this.singleChange(this.nodeChangesOfType(\"add\")),{alias:\"onNodesChange.add.single\"}),this.onNodesChangeAddMany=hn(this.manyChanges(this.nodeChangesOfType(\"add\")),{alias:\"onNodesChange.add.many\"}),this.onNodesChangeRemove=hn(this.nodeChangesOfType(\"remove\"),{alias:\"onNodesChange.remove\"}),this.onNodesChangeRemoveSingle=hn(this.singleChange(this.nodeChangesOfType(\"remove\")),{alias:\"onNodesChange.remove.single\"}),this.onNodesChangeRemoveMany=hn(this.manyChanges(this.nodeChangesOfType(\"remove\")),{alias:\"onNodesChange.remove.many\"}),this.onNodesChangeSelect=hn(this.nodeChangesOfType(\"select\"),{alias:\"onNodesChange.select\"}),this.onNodesChangeSelectSingle=hn(this.singleChange(this.nodeChangesOfType(\"select\")),{alias:\"onNodesChange.select.single\"}),this.onNodesChangeSelectMany=hn(this.manyChanges(this.nodeChangesOfType(\"select\")),{alias:\"onNodesChange.select.many\"}),this.onEdgesChange=hn(this.edgesChangeService.changes$),this.onNodesChangeDetached=hn(this.edgeChangesOfType(\"detached\"),{alias:\"onEdgesChange.detached\"}),this.onNodesChangeDetachedSingle=hn(this.singleChange(this.edgeChangesOfType(\"detached\")),{alias:\"onEdgesChange.detached.single\"}),this.onNodesChangeDetachedMany=hn(this.manyChanges(this.edgeChangesOfType(\"detached\")),{alias:\"onEdgesChange.detached.many\"}),this.onEdgesChangeAdd=hn(this.edgeChangesOfType(\"add\"),{alias:\"onEdgesChange.add\"}),this.onEdgeChangeAddSingle=hn(this.singleChange(this.edgeChangesOfType(\"add\")),{alias:\"onEdgesChange.add.single\"}),this.onEdgeChangeAddMany=hn(this.manyChanges(this.edgeChangesOfType(\"add\")),{alias:\"onEdgesChange.add.many\"}),this.onEdgeChangeRemove=hn(this.edgeChangesOfType(\"remove\"),{alias:\"onEdgesChange.remove\"}),this.onEdgeChangeRemoveSingle=hn(this.singleChange(this.edgeChangesOfType(\"remove\")),{alias:\"onEdgesChange.remove.single\"}),this.onEdgeChangeRemoveMany=hn(this.manyChanges(this.edgeChangesOfType(\"remove\")),{alias:\"onEdgesChange.remove.many\"}),this.onEdgeChangeSelect=hn(this.edgeChangesOfType(\"select\"),{alias:\"onEdgesChange.select\"}),this.onEdgeChangeSelectSingle=hn(this.singleChange(this.edgeChangesOfType(\"select\")),{alias:\"onEdgesChange.select.single\"}),this.onEdgeChangeSelectMany=hn(this.manyChanges(this.edgeChangesOfType(\"select\")),{alias:\"onEdgesChange.select.many\"})}nodeChangesOfType(A){return this.nodesChangeService.changes$.pipe(fe(i=>i.filter(n=>n.type===A)),We(i=>!!i.length))}edgeChangesOfType(A){return this.edgesChangeService.changes$.pipe(fe(i=>i.filter(n=>n.type===A)),We(i=>!!i.length))}singleChange(A){return A.pipe(We(i=>i.length===1),fe(([i])=>i))}manyChanges(A){return A.pipe(We(i=>i.length>1))}static{this.\\u0275fac=function(i){return new(i||t)}}static{this.\\u0275dir=OA({type:t,selectors:[[\"\",\"changesController\",\"\"]],outputs:{onNodesChange:\"onNodesChange\",onNodesChangePosition:\"onNodesChange.position\",onNodesChangePositionSignle:\"onNodesChange.position.single\",onNodesChangePositionMany:\"onNodesChange.position.many\",onNodesChangeSize:\"onNodesChange.size\",onNodesChangeSizeSingle:\"onNodesChange.size.single\",onNodesChangeSizeMany:\"onNodesChange.size.many\",onNodesChangeAdd:\"onNodesChange.add\",onNodesChangeAddSingle:\"onNodesChange.add.single\",onNodesChangeAddMany:\"onNodesChange.add.many\",onNodesChangeRemove:\"onNodesChange.remove\",onNodesChangeRemoveSingle:\"onNodesChange.remove.single\",onNodesChangeRemoveMany:\"onNodesChange.remove.many\",onNodesChangeSelect:\"onNodesChange.select\",onNodesChangeSelectSingle:\"onNodesChange.select.single\",onNodesChangeSelectMany:\"onNodesChange.select.many\",onEdgesChange:\"onEdgesChange\",onNodesChangeDetached:\"onEdgesChange.detached\",onNodesChangeDetachedSingle:\"onEdgesChange.detached.single\",onNodesChangeDetachedMany:\"onEdgesChange.detached.many\",onEdgesChangeAdd:\"onEdgesChange.add\",onEdgeChangeAddSingle:\"onEdgesChange.add.single\",onEdgeChangeAddMany:\"onEdgesChange.add.many\",onEdgeChangeRemove:\"onEdgesChange.remove\",onEdgeChangeRemoveSingle:\"onEdgesChange.remove.single\",onEdgeChangeRemoveMany:\"onEdgesChange.remove.many\",onEdgeChangeSelect:\"onEdgesChange.select\",onEdgeChangeSelectSingle:\"onEdgesChange.select.single\",onEdgeChangeSelectMany:\"onEdgesChange.select.many\"}})}}return t})(),$w=(()=>{class t{constructor(){this.host=h(ge).nativeElement,this.initialTouch$=new $A,this.prevTouchEvent=null,this.mouseMovement$=mc(this.host,\"mousemove\").pipe(fe(A=>({x:A.clientX,y:A.clientY,movementX:A.movementX,movementY:A.movementY,target:A.target,originalEvent:A})),Ed(Qd),SC()),this.touchMovement$=Qi(this.initialTouch$,mc(this.host,\"touchmove\")).pipe(Wt(A=>A.preventDefault()),fe(A=>{let i=A.touches[0]?.clientX??0,n=A.touches[0]?.clientY??0,o=this.prevTouchEvent?A.touches[0].pageX-this.prevTouchEvent.touches[0].pageX:0,a=this.prevTouchEvent?A.touches[0].pageY-this.prevTouchEvent.touches[0].pageY:0,r=document.elementFromPoint(i,n);return{x:i,y:n,movementX:o,movementY:a,target:r,originalEvent:A}}),Wt(A=>this.prevTouchEvent=A.originalEvent),Ed(Qd),SC()),this.pointerMovement$=Qi(this.mouseMovement$,this.touchMovement$),this.touchEnd$=mc(this.host,\"touchend\").pipe(fe(A=>{let i=A.changedTouches[0]?.clientX??0,n=A.changedTouches[0]?.clientY??0,o=document.elementFromPoint(i,n);return{x:i,y:n,target:o,originalEvent:A}}),Wt(()=>this.prevTouchEvent=null),SC()),this.mouseUp$=mc(this.host,\"mouseup\").pipe(fe(A=>{let i=A.clientX,n=A.clientY,o=A.target;return{x:i,y:n,target:o,originalEvent:A}}),SC()),this.documentPointerEnd$=Qi(mc(document,\"mouseup\"),mc(document,\"touchend\")).pipe(SC())}setInitialTouch(A){this.initialTouch$.next(A)}static{this.\\u0275fac=function(i){return new(i||t)}}static{this.\\u0275dir=OA({type:t,selectors:[[\"svg\",\"rootPointer\",\"\"]]})}}return t})(),Pu=(()=>{class t{constructor(){this.pointerMovementDirective=h($w),this.rootSvg=h(Xw).element,this.host=h(ge).nativeElement,this.svgCurrentSpacePoint=_e(()=>{let A=this.pointerMovement();return A?this.documentPointToFlowPoint({x:A.x,y:A.y}):{x:0,y:0}}),this.pointerMovement=Is(this.pointerMovementDirective.pointerMovement$)}documentPointToFlowPoint(A){let i=this.rootSvg.createSVGPoint();return i.x=A.x,i.y=A.y,i.matrixTransform(this.host.getScreenCTM().inverse())}static{this.\\u0275fac=function(i){return new(i||t)}}static{this.\\u0275dir=OA({type:t,selectors:[[\"g\",\"spacePointContext\",\"\"]]})}}return t})();function uMA(t){return typeof t==\"string\"?{type:\"solid\",color:t}:t}function Ww(t,e,A){let i=A.value;return A.value=function(...n){queueMicrotask(()=>{i?.apply(this,n)})},A}var jeA=(()=>{class t{constructor(){this.toolbars=jA([]),this.nodeToolbarsMap=_e(()=>{let A=new Map;return this.toolbars().forEach(i=>{let n=A.get(i.node)??[];A.set(i.node,[...n,i])}),A})}addToolbar(A){this.toolbars.update(i=>[...i,A])}removeToolbar(A){this.toolbars.update(i=>i.filter(n=>n!==A))}static{this.\\u0275fac=function(i){return new(i||t)}}static{this.\\u0275prov=TA({token:t,factory:t.\\u0275fac})}}return jE([Ww],t.prototype,\"addToolbar\",null),jE([Ww],t.prototype,\"removeToolbar\",null),t})();function Ay(t,e){return new Ti(A=>{let i=new ResizeObserver(n=>{e.run(()=>A.next(n))});return t.forEach(n=>i.observe(n)),()=>i.disconnect()})}var fMA=(()=>{class t{constructor(){this.zone=h(Oe),this.destroyRef=h(Wa),this.settingsService=h(rs),this.model=nt.required(),this.edgeModel=nt.required(),this.point=nt({x:0,y:0}),this.htmlTemplate=nt(),this.edgeLabelWrapperRef=Xo.required(\"edgeLabelWrapper\"),this.edgeLabelPoint=_e(()=>{let A=this.point(),{width:i,height:n}=this.model().size();return{x:A.x-i/2,y:A.y-n/2}}),this.edgeLabelStyle=_e(()=>{let A=this.model().edgeLabel;if(A.type===\"default\"&&A.style){let i=this.settingsService.background(),n=\"transparent\";return i.type===\"dots\"&&(n=i.backgroundColor??\"#fff\"),i.type===\"solid\"&&(n=i.color),A.style.backgroundColor=A.style.backgroundColor??n,A.style}return null})}ngAfterViewInit(){let A=this.edgeLabelWrapperRef().nativeElement;Ay([A],this.zone).pipe(nn(null),Wt(()=>{let i=A.clientWidth+jw,n=A.clientHeight+jw;this.model().size.set({width:i,height:n})}),br(this.destroyRef)).subscribe()}getLabelContext(){return{$implicit:{edge:this.edgeModel().edge,label:this.model().edgeLabel}}}static{this.\\u0275fac=function(i){return new(i||t)}}static{this.\\u0275cmp=kA({type:t,selectors:[[\"g\",\"edgeLabel\",\"\"]],viewQuery:function(i,n){i&1&&Or(n.edgeLabelWrapperRef,mbA,5),i&2&&rr()},inputs:{model:[1,\"model\"],edgeModel:[1,\"edgeModel\"],point:[1,\"point\"],htmlTemplate:[1,\"htmlTemplate\"]},attrs:pbA,decls:1,vars:1,consts:[[\"edgeLabelWrapper\",\"\"],[1,\"edge-label-wrapper\"],[4,\"ngTemplateOutlet\",\"ngTemplateOutletContext\"]],template:function(i,n){if(i&1&&V(0,bbA,2,2),i&2){let o;W((o=n.model())?0:-1,o)}},dependencies:[Ng],styles:[\".edge-label-wrapper[_ngcontent-%COMP%]{width:max-content;margin-top:1px;margin-left:1px}\"],changeDetection:0})}}return t})();function qeA(t){let e={};return t.sourceHandle.rawHandle.type===\"source\"?(e.source=t.source,e.sourceHandle=t.sourceHandle):(e.source=t.target,e.sourceHandle=t.targetHandle),t.targetHandle.rawHandle.type===\"target\"?(e.target=t.target,e.targetHandle=t.targetHandle):(e.target=t.source,e.targetHandle=t.sourceHandle),e}var VeA=(()=>{class t{constructor(){this.statusService=h(hI),this.flowEntitiesService=h(ig),this.onConnect=hn(Tn(this.statusService.status).pipe(We(A=>A.state===\"connection-end\"),fe(A=>Yw(A,this.isStrictMode())),Wt(()=>this.statusService.setIdleStatus()),We(A=>this.flowEntitiesService.connection().validator(A)))),this.connect=hn(Tn(this.statusService.status).pipe(We(A=>A.state===\"connection-end\"),fe(A=>Yw(A,this.isStrictMode())),Wt(()=>this.statusService.setIdleStatus()),We(A=>this.flowEntitiesService.connection().validator(A)))),this.onReconnect=hn(Tn(this.statusService.status).pipe(We(A=>A.state===\"reconnection-end\"),fe(A=>{let i=Yw(A,this.isStrictMode()),n=A.payload.oldEdge.edge;return{connection:i,oldEdge:n}}),Wt(()=>this.statusService.setIdleStatus()),We(({connection:A})=>this.flowEntitiesService.connection().validator(A)))),this.reconnect=hn(Tn(this.statusService.status).pipe(We(A=>A.state===\"reconnection-end\"),fe(A=>{let i=Yw(A,this.isStrictMode()),n=A.payload.oldEdge.edge;return{connection:i,oldEdge:n}}),Wt(()=>this.statusService.setIdleStatus()),We(({connection:A})=>this.flowEntitiesService.connection().validator(A)))),this.isStrictMode=_e(()=>this.flowEntitiesService.connection().mode===\"strict\")}startConnection(A){this.statusService.setConnectionStartStatus(A.parentNode,A)}startReconnection(A,i){this.statusService.setReconnectionStartStatus(A.parentNode,A,i)}validateConnection(A){let i=this.statusService.status();if(i.state===\"connection-start\"||i.state===\"reconnection-start\"){let n=i.state===\"reconnection-start\",o=i.payload.source,a=A.parentNode,r=i.payload.sourceHandle,s=A;if(this.isStrictMode()){let l=qeA({source:i.payload.source,sourceHandle:i.payload.sourceHandle,target:A.parentNode,targetHandle:A});o=l.source,a=l.target,r=l.sourceHandle,s=l.targetHandle}let g=this.flowEntitiesService.connection().validator({source:o.rawNode.id,target:a.rawNode.id,sourceHandle:r.rawHandle.id,targetHandle:s.rawHandle.id});A.state.set(g?\"valid\":\"invalid\"),n?this.statusService.setReconnectionValidationStatus(g,i.payload.source,A.parentNode,i.payload.sourceHandle,A,i.payload.oldEdge):this.statusService.setConnectionValidationStatus(g,i.payload.source,A.parentNode,i.payload.sourceHandle,A)}}resetValidateConnection(A){A.state.set(\"idle\");let i=this.statusService.status();(i.state===\"connection-validation\"||i.state===\"reconnection-validation\")&&(i.state===\"reconnection-validation\"?this.statusService.setReconnectionStartStatus(i.payload.source,i.payload.sourceHandle,i.payload.oldEdge):this.statusService.setConnectionStartStatus(i.payload.source,i.payload.sourceHandle))}endConnection(){let A=this.statusService.status();if(A.state===\"connection-validation\"||A.state===\"reconnection-validation\"){let i=A.state===\"reconnection-validation\",n=A.payload.source,o=A.payload.sourceHandle,a=A.payload.target,r=A.payload.targetHandle;i?this.statusService.setReconnectionEndStatus(n,a,o,r,A.payload.oldEdge):this.statusService.setConnectionEndStatus(n,a,o,r)}}static{this.\\u0275fac=function(i){return new(i||t)}}static{this.\\u0275dir=OA({type:t,selectors:[[\"\",\"onConnect\",\"\"],[\"\",\"onReconnect\",\"\"],[\"\",\"connect\",\"\"],[\"\",\"reconnect\",\"\"]],outputs:{onConnect:\"onConnect\",connect:\"connect\",onReconnect:\"onReconnect\",reconnect:\"reconnect\"}})}}return t})();function Yw(t,e){let A=t.payload.source,i=t.payload.target,n=t.payload.sourceHandle,o=t.payload.targetHandle;if(e){let l=qeA({source:t.payload.source,sourceHandle:t.payload.sourceHandle,target:t.payload.target,targetHandle:t.payload.targetHandle});A=l.source,i=l.target,n=l.sourceHandle,o=l.targetHandle}let a=A.rawNode.id,r=i.rawNode.id,s=n.rawHandle.id,g=o.rawHandle.id;return{source:a,target:r,sourceHandle:s,targetHandle:g}}var Zw=(()=>{class t{constructor(){this.flowEntitiesService=h(ig),this.flowSettingsService=h(rs),this.edges=_e(()=>this.flowSettingsService.optimization().virtualization?this.viewportEdges().sort((A,i)=>A.renderOrder()-i.renderOrder()):[...this.flowEntitiesService.validEdges()].sort((A,i)=>A.renderOrder()-i.renderOrder())),this.viewportEdges=_e(()=>this.flowEntitiesService.validEdges().filter(A=>{let i=A.sourceHandle(),n=A.targetHandle();return i&&n})),this.maxOrder=_e(()=>Math.max(...this.flowEntitiesService.validEdges().map(A=>A.renderOrder())))}pull(A){A.renderOrder()!==0&&this.maxOrder()===A.renderOrder()||A.renderOrder.set(this.maxOrder()+1)}static{this.\\u0275fac=function(i){return new(i||t)}}static{this.\\u0275prov=TA({token:t,factory:t.\\u0275fac})}}return t})();function mMA(t){return window.TouchEvent&&t instanceof TouchEvent}var eF=(()=>{class t{constructor(){this.hostElement=h(ge).nativeElement,this.pointerMovementDirective=h($w),this.pointerOver=No(),this.pointerOut=No(),this.pointerStart=No(),this.pointerEnd=No(),this.wasPointerOver=!1,this.touchEnd=this.pointerMovementDirective.touchEnd$.pipe(We(({target:A})=>A===this.hostElement),Wt(({originalEvent:A})=>this.pointerEnd.emit(A)),br()).subscribe(),this.touchOverOut=this.pointerMovementDirective.touchMovement$.pipe(Wt(({target:A,originalEvent:i})=>{this.handleTouchOverAndOut(A,i)}),br()).subscribe()}onPointerStart(A){this.pointerStart.emit(A),mMA(A)&&this.pointerMovementDirective.setInitialTouch(A)}onPointerEnd(A){this.pointerEnd.emit(A)}onMouseOver(A){this.pointerOver.emit(A)}onMouseOut(A){this.pointerOut.emit(A)}handleTouchOverAndOut(A,i){A===this.hostElement?(this.pointerOver.emit(i),this.wasPointerOver=!0):(this.wasPointerOver&&this.pointerOut.emit(i),this.wasPointerOver=!1)}static{this.\\u0275fac=function(i){return new(i||t)}}static{this.\\u0275dir=OA({type:t,selectors:[[\"\",\"pointerStart\",\"\"],[\"\",\"pointerEnd\",\"\"],[\"\",\"pointerOver\",\"\"],[\"\",\"pointerOut\",\"\"]],hostBindings:function(i,n){i&1&&$(\"mousedown\",function(a){return n.onPointerStart(a)})(\"touchstart\",function(a){return n.onPointerStart(a)})(\"mouseup\",function(a){return n.onPointerEnd(a)})(\"mouseover\",function(a){return n.onMouseOver(a)})(\"mouseout\",function(a){return n.onMouseOut(a)})},outputs:{pointerOver:\"pointerOver\",pointerOut:\"pointerOut\",pointerStart:\"pointerStart\",pointerEnd:\"pointerEnd\"}})}}return t})(),WeA=(()=>{class t{constructor(){this.injector=h(ut),this.selectionService=h(Vu),this.flowSettingsService=h(rs),this.flowStatusService=h(hI),this.edgeRenderingService=h(Zw),this.connectionController=h(VeA,{optional:!0}),this.model=nt.required(),this.edgeTemplate=nt(),this.edgeLabelHtmlTemplate=nt(),this.isReconnecting=_e(()=>{let A=this.flowStatusService.status();return(A.state===\"reconnection-start\"||A.state===\"reconnection-validation\")&&A.payload.oldEdge===this.model()})}select(){this.flowSettingsService.entitiesSelectable()&&this.selectionService.select(this.model())}pull(){this.flowSettingsService.elevateEdgesOnSelect()&&this.edgeRenderingService.pull(this.model())}startReconnection(A,i){A.stopPropagation(),this.connectionController?.startReconnection(i,this.model())}static{this.\\u0275fac=function(i){return new(i||t)}}static{this.\\u0275cmp=kA({type:t,selectors:[[\"g\",\"edge\",\"\"]],hostAttrs:[1,\"selectable\"],hostVars:2,hostBindings:function(i,n){i&2&&En(\"visibility\",n.isReconnecting()?\"hidden\":\"visible\")},inputs:{model:[1,\"model\"],edgeTemplate:[1,\"edgeTemplate\"],edgeLabelHtmlTemplate:[1,\"edgeLabelHtmlTemplate\"]},attrs:MbA,decls:6,vars:6,consts:[[1,\"edge\"],[1,\"interactive-edge\",3,\"click\"],[3,\"ngTemplateOutlet\",\"ngTemplateOutletContext\",\"ngTemplateOutletInjector\"],[\"edgeLabel\",\"\",3,\"model\",\"point\",\"edgeModel\",\"htmlTemplate\"],[\"r\",\"10\",1,\"reconnect-handle\"],[\"r\",\"10\",1,\"reconnect-handle\",3,\"pointerStart\"]],template:function(i,n){if(i&1&&(V(0,kbA,2,6),V(1,xbA,1,1),V(2,NbA,1,1),V(3,LbA,1,1),V(4,GbA,1,1),V(5,JbA,2,2)),i&2){let o,a,r;W(n.model().type===\"default\"?0:-1),p(),W(n.model().type===\"template\"&&n.edgeTemplate()?1:-1),p(),W((o=n.model().edgeLabels.start)?2:-1,o),p(),W((a=n.model().edgeLabels.center)?3:-1,a),p(),W((r=n.model().edgeLabels.end)?4:-1,r),p(),W(n.model().sourceHandle()&&n.model().targetHandle()?5:-1)}},dependencies:[Ng,fMA,eF],styles:[\".edge[_ngcontent-%COMP%]{fill:none;stroke-width:2;stroke:#b1b1b7}.edge_selected[_ngcontent-%COMP%]{stroke-width:2.5;stroke:#0f4c75}.interactive-edge[_ngcontent-%COMP%]{fill:none;stroke-width:20;stroke:transparent}.reconnect-handle[_ngcontent-%COMP%]{fill:transparent;cursor:move}\"],changeDetection:0})}}return t})(),XN=(()=>{class t{constructor(){this.node=jA(null)}createHandle(A){let i=this.node();i&&i.handles.update(n=>[...n,A])}destroyHandle(A){let i=this.node();i&&i.handles.update(n=>n.filter(o=>o!==A))}static{this.\\u0275fac=function(i){return new(i||t)}}static{this.\\u0275prov=TA({token:t,factory:t.\\u0275fac})}}return jE([Ww],t.prototype,\"createHandle\",null),t})(),pMA=(()=>{class t{constructor(){this.handleModel=nt.required({alias:\"handleSizeController\"}),this.handleWrapper=h(ge)}ngAfterViewInit(){let A=this.handleWrapper.nativeElement,i=A.getBBox(),n=DMA(A);this.handleModel().size.set({width:i.width+n,height:i.height+n})}static{this.\\u0275fac=function(i){return new(i||t)}}static{this.\\u0275dir=OA({type:t,selectors:[[\"\",\"handleSizeController\",\"\"]],inputs:{handleModel:[1,\"handleSizeController\",\"handleModel\"]}})}}return t})();function DMA(t){let e=t.firstElementChild;if(e){let A=getComputedStyle(e).strokeWidth,i=Number(A.replace(\"px\",\"\"));return isNaN(i)?0:i}return 0}var wMA=(()=>{class t{constructor(){this.selected=nt(!1)}static{this.\\u0275fac=function(i){return new(i||t)}}static{this.\\u0275cmp=kA({type:t,selectors:[[\"default-node\"]],hostVars:2,hostBindings:function(i,n){i&2&&ae(\"selected\",n.selected())},inputs:{selected:[1,\"selected\"]},ngContentSelectors:YeA,decls:1,vars:0,template:function(i,n){i&1&&(Yt(),He(0))},styles:[\"[_nghost-%COMP%]{border:1.5px solid #1b262c;border-radius:5px;display:flex;align-items:center;justify-content:center;color:#000;background-color:#fff}.selected[_nghost-%COMP%]{border-width:2px}\"],changeDetection:0})}}return t})(),yMA=(()=>{class t{get model(){return this.nodeAccessor.model()}constructor(){this.nodeAccessor=h(xE),this.rootPointer=h($w),this.viewportService=h(cd),this.spacePointContext=h(Pu),this.settingsService=h(rs),this.hostRef=h(ge),this.resizable=nt(),this.resizerColor=nt(\"#2e414c\"),this.gap=nt(1.5),this.resizer=Xo.required(\"resizer\"),this.lineGap=3,this.handleSize=6,this.resizeSide=null,this.zoom=_e(()=>this.viewportService.readableViewport().zoom??0),this.minWidth=0,this.minHeight=0,this.maxWidth=1/0,this.maxHeight=1/0,this.resizeOnGlobalMouseMove=this.rootPointer.pointerMovement$.pipe(We(()=>this.resizeSide!==null),We(A=>A.movementX!==0||A.movementY!==0),Wt(A=>this.resize(A)),br()).subscribe(),this.endResizeOnGlobalMouseUp=this.rootPointer.documentPointerEnd$.pipe(Wt(()=>this.endResize()),br()).subscribe(),pa(()=>{let A=this.resizable();typeof A==\"boolean\"?this.model.resizable.set(A):this.model.resizable.set(!0)},{allowSignalWrites:!0})}ngOnInit(){this.model.controlledByResizer.set(!0),this.model.resizerTemplate.set(this.resizer())}ngOnDestroy(){this.model.controlledByResizer.set(!1)}ngAfterViewInit(){this.minWidth=+getComputedStyle(this.hostRef.nativeElement).minWidth.replace(\"px\",\"\")||0,this.minHeight=+getComputedStyle(this.hostRef.nativeElement).minHeight.replace(\"px\",\"\")||0,this.maxWidth=+getComputedStyle(this.hostRef.nativeElement).maxWidth.replace(\"px\",\"\")||1/0,this.maxHeight=+getComputedStyle(this.hostRef.nativeElement).maxHeight.replace(\"px\",\"\")||1/0}startResize(A,i){i.stopPropagation(),this.resizeSide=A,this.model.resizing.set(!0)}resize(A){if(!this.resizeSide)return;let i=vMA(A.movementX,A.movementY,this.zoom()),n=this.applyResize(this.resizeSide,this.model,i,this.getDistanceToEdge(A)),{x:o,y:a,width:r,height:s}=bMA(n,this.model,this.resizeSide,this.minWidth,this.minHeight,this.maxWidth,this.maxHeight);this.model.setPoint({x:o,y:a}),this.model.width.set(r),this.model.height.set(s)}endResize(){this.resizeSide=null,this.model.resizing.set(!1)}getDistanceToEdge(A){let i=this.spacePointContext.documentPointToFlowPoint({x:A.x,y:A.y}),{x:n,y:o}=this.model.globalPoint();return{left:i.x-n,right:i.x-(n+this.model.width()),top:i.y-o,bottom:i.y-(o+this.model.height())}}applyResize(A,i,n,o){let{x:a,y:r}=i.point(),s=i.width(),g=i.height(),[l,C]=this.settingsService.snapGrid();switch(A){case\"left\":{let I=n.x+o.left,d=tg(a+I,l),B=d-a;return{x:d,y:r,width:s-B,height:g}}case\"right\":{let I=n.x+o.right,d=tg(s+I,l);return{x:a,y:r,width:d,height:g}}case\"top\":{let I=n.y+o.top,d=tg(r+I,C),B=d-r;return{x:a,y:d,width:s,height:g-B}}case\"bottom\":{let I=n.y+o.bottom,d=tg(g+I,C);return{x:a,y:r,width:s,height:d}}case\"top-left\":{let I=n.x+o.left,d=n.y+o.top,B=tg(a+I,l),Q=tg(r+d,C),E=B-a,f=Q-r;return{x:B,y:Q,width:s-E,height:g-f}}case\"top-right\":{let I=n.x+o.right,d=n.y+o.top,B=tg(r+d,C),Q=B-r;return{x:a,y:B,width:tg(s+I,l),height:g-Q}}case\"bottom-left\":{let I=n.x+o.left,d=n.y+o.bottom,B=tg(a+I,l),Q=B-a;return{x:B,y:r,width:s-Q,height:tg(g+d,C)}}case\"bottom-right\":{let I=n.x+o.right,d=n.y+o.bottom;return{x:a,y:r,width:tg(s+I,l),height:tg(g+d,C)}}}}static{this.\\u0275fac=function(i){return new(i||t)}}static{this.\\u0275cmp=kA({type:t,selectors:[[\"\",\"resizable\",\"\"]],viewQuery:function(i,n){i&1&&Or(n.resizer,YbA,5),i&2&&rr()},inputs:{resizable:[1,\"resizable\"],resizerColor:[1,\"resizerColor\"],gap:[1,\"gap\"]},attrs:HbA,ngContentSelectors:YeA,decls:3,vars:0,consts:[[\"resizer\",\"\"],[\"stroke-width\",\"2\",1,\"top\",3,\"pointerStart\"],[\"stroke-width\",\"2\",1,\"left\",3,\"pointerStart\"],[\"stroke-width\",\"2\",1,\"bottom\",3,\"pointerStart\"],[\"stroke-width\",\"2\",1,\"right\",3,\"pointerStart\"],[1,\"top-left\",3,\"pointerStart\"],[1,\"top-right\",3,\"pointerStart\"],[1,\"bottom-left\",3,\"pointerStart\"],[1,\"bottom-right\",3,\"pointerStart\"]],template:function(i,n){i&1&&(Yt(),yt(0,TbA,9,40,\"ng-template\",null,0,NC),He(2))},dependencies:[eF],styles:[\".top[_ngcontent-%COMP%]{cursor:n-resize}.left[_ngcontent-%COMP%]{cursor:w-resize}.right[_ngcontent-%COMP%]{cursor:e-resize}.bottom[_ngcontent-%COMP%]{cursor:s-resize}.top-left[_ngcontent-%COMP%]{cursor:nw-resize}.top-right[_ngcontent-%COMP%]{cursor:ne-resize}.bottom-left[_ngcontent-%COMP%]{cursor:sw-resize}.bottom-right[_ngcontent-%COMP%]{cursor:se-resize}\"],changeDetection:0})}}return jE([Ww],t.prototype,\"ngAfterViewInit\",null),t})();function vMA(t,e,A){return{x:Ow(t/A),y:Ow(e/A)}}function bMA(t,e,A,i,n,o,a){let{x:r,y:s,width:g,height:l}=t;g=Math.max(g,0),l=Math.max(l,0),g=Math.max(i,g),l=Math.max(n,l),g=Math.min(o,g),l=Math.min(a,l),r=Math.min(r,e.point().x+e.width()-i),s=Math.min(s,e.point().y+e.height()-n),r=Math.max(r,e.point().x+e.width()-o),s=Math.max(s,e.point().y+e.height()-a);let C=e.parent();if(C){let d=C.width(),B=C.height(),Q=e.point().x,E=e.point().y;r=Math.max(r,0),s=Math.max(s,0),A.includes(\"left\")&&r===0&&(g=Math.min(g,Q+e.width())),A.includes(\"top\")&&s===0&&(l=Math.min(l,E+e.height())),g=Math.min(g,d-r),l=Math.min(l,B-s)}let I=HeA(e.children());return I&&(A.includes(\"left\")&&(r=Math.min(r,e.point().x+e.width()-(I.x+I.width)),g=Math.max(g,I.x+I.width)),A.includes(\"right\")&&(g=Math.max(g,I.x+I.width)),A.includes(\"bottom\")&&(l=Math.max(l,I.y+I.height)),A.includes(\"top\")&&(s=Math.min(s,e.point().y+e.height()-(I.y+I.height)),l=Math.max(l,I.y+I.height))),{x:r,y:s,width:g,height:l}}var $N=class{constructor(e,A){this.rawHandle=e,this.parentNode=A,this.strokeWidth=2,this.size=jA({width:10+2*this.strokeWidth,height:10+2*this.strokeWidth}),this.pointAbsolute=_e(()=>({x:this.parentNode.globalPoint().x+this.hostOffset().x+this.sizeOffset().x,y:this.parentNode.globalPoint().y+this.hostOffset().y+this.sizeOffset().y})),this.state=jA(\"idle\"),this.updateHostSizeAndPosition$=new $A,this.hostSize=Is(this.updateHostSizeAndPosition$.pipe(fe(()=>this.getHostSize())),{initialValue:{width:0,height:0}}),this.hostPosition=Is(this.updateHostSizeAndPosition$.pipe(fe(()=>({x:this.hostReference instanceof HTMLElement?this.hostReference.offsetLeft:0,y:this.hostReference instanceof HTMLElement?this.hostReference.offsetTop:0}))),{initialValue:{x:0,y:0}}),this.hostOffset=_e(()=>{switch(this.rawHandle.position){case\"left\":return{x:-this.rawHandle.userOffsetX,y:-this.rawHandle.userOffsetY+this.hostPosition().y+this.hostSize().height/2};case\"right\":return{x:-this.rawHandle.userOffsetX+this.parentNode.size().width,y:-this.rawHandle.userOffsetY+this.hostPosition().y+this.hostSize().height/2};case\"top\":return{x:-this.rawHandle.userOffsetX+this.hostPosition().x+this.hostSize().width/2,y:-this.rawHandle.userOffsetY};case\"bottom\":return{x:-this.rawHandle.userOffsetX+this.hostPosition().x+this.hostSize().width/2,y:-this.rawHandle.userOffsetY+this.parentNode.size().height}}}),this.sizeOffset=_e(()=>{switch(this.rawHandle.position){case\"left\":return{x:-(this.size().width/2),y:0};case\"right\":return{x:this.size().width/2,y:0};case\"top\":return{x:0,y:-(this.size().height/2)};case\"bottom\":return{x:0,y:this.size().height/2}}}),this.hostReference=this.rawHandle.hostReference,this.template=this.rawHandle.template,this.templateContext={$implicit:{point:this.hostOffset,state:this.state,node:this.parentNode.rawNode}}}updateHost(){this.updateHostSizeAndPosition$.next()}getHostSize(){return this.hostReference instanceof HTMLElement?{width:this.hostReference.offsetWidth,height:this.hostReference.offsetHeight}:this.hostReference instanceof SVGGraphicsElement?this.hostReference.getBBox():{width:0,height:0}}},tF=(()=>{class t{constructor(){this.injector=h(ut),this.handleService=h(XN),this.element=h(ge).nativeElement,this.destroyRef=h(Wa),this.position=nt.required(),this.type=nt.required(),this.id=nt(),this.template=nt(),this.offsetX=nt(0),this.offsetY=nt(0)}ngOnInit(){Ya(this.injector,()=>{let A=this.handleService.node();if(A){let i=new $N({position:this.position(),type:this.type(),id:this.id(),hostReference:this.element.parentElement,template:this.template(),userOffsetX:this.offsetX(),userOffsetY:this.offsetY()},A);this.handleService.createHandle(i),requestAnimationFrame(()=>i.updateHost()),this.destroyRef.onDestroy(()=>this.handleService.destroyHandle(i))}})}static{this.\\u0275fac=function(i){return new(i||t)}}static{this.\\u0275cmp=kA({type:t,selectors:[[\"handle\"]],inputs:{position:[1,\"position\"],type:[1,\"type\"],id:[1,\"id\"],template:[1,\"template\"],offsetX:[1,\"offsetX\"],offsetY:[1,\"offsetY\"]},decls:0,vars:0,template:function(i,n){},encapsulation:2,changeDetection:0})}}return t})(),MMA=(()=>{class t{constructor(){this.nodeAccessor=h(xE),this.zone=h(Oe),this.destroyRef=h(Wa),this.hostElementRef=h(ge)}ngOnInit(){this.nodeAccessor.model().handles$.pipe(Ei(i=>Ay([...i.map(n=>n.hostReference),this.hostElementRef.nativeElement],this.zone).pipe(fe(()=>i))),Wt(i=>{i.forEach(n=>n.updateHost())}),br(this.destroyRef)).subscribe()}static{this.\\u0275fac=function(i){return new(i||t)}}static{this.\\u0275dir=OA({type:t,selectors:[[\"\",\"nodeHandlesController\",\"\"]]})}}return t})(),kMA=(()=>{class t{constructor(){this.nodeAccessor=h(xE),this.zone=h(Oe),this.destroyRef=h(Wa),this.hostElementRef=h(ge)}ngOnInit(){let A=this.nodeAccessor.model(),i=this.hostElementRef.nativeElement;Qi(Ay([i],this.zone)).pipe(nn(null),We(()=>!A.resizing()),Wt(()=>{A.width.set(i.clientWidth),A.height.set(i.clientHeight)}),br(this.destroyRef)).subscribe()}static{this.\\u0275fac=function(i){return new(i||t)}}static{this.\\u0275dir=OA({type:t,selectors:[[\"\",\"nodeResizeController\",\"\"]]})}}return t})(),ZeA=(()=>{class t{constructor(){this.injector=h(ut),this.handleService=h(XN),this.draggableService=h(TeA),this.flowStatusService=h(hI),this.nodeRenderingService=h(Cd),this.flowSettingsService=h(rs),this.selectionService=h(Vu),this.hostRef=h(ge),this.nodeAccessor=h(xE),this.overlaysService=h(jeA),this.connectionController=h(VeA,{optional:!0}),this.model=nt.required(),this.nodeTemplate=nt(),this.nodeSvgTemplate=nt(),this.groupNodeTemplate=nt(),this.showMagnet=_e(()=>this.flowStatusService.status().state===\"connection-start\"||this.flowStatusService.status().state===\"connection-validation\"||this.flowStatusService.status().state===\"reconnection-start\"||this.flowStatusService.status().state===\"reconnection-validation\"),this.toolbars=_e(()=>this.overlaysService.nodeToolbarsMap().get(this.model()))}ngOnInit(){this.model().isVisible.set(!0),this.nodeAccessor.model.set(this.model()),this.handleService.node.set(this.model()),pa(()=>{this.model().draggable()?this.draggableService.enable(this.hostRef.nativeElement,this.model()):this.draggableService.disable(this.hostRef.nativeElement)},{injector:this.injector})}ngOnDestroy(){this.model().isVisible.set(!1),this.draggableService.destroy(this.hostRef.nativeElement)}startConnection(A,i){A.stopPropagation(),this.connectionController?.startConnection(i)}validateConnection(A){this.connectionController?.validateConnection(A)}resetValidateConnection(A){this.connectionController?.resetValidateConnection(A)}endConnection(){this.connectionController?.endConnection()}pullNode(){this.flowSettingsService.elevateNodesOnSelect()&&this.nodeRenderingService.pullNode(this.model())}selectNode(){this.flowSettingsService.entitiesSelectable()&&this.selectionService.select(this.model())}static{this.\\u0275fac=function(i){return new(i||t)}}static{this.\\u0275cmp=kA({type:t,selectors:[[\"g\",\"node\",\"\"]],hostAttrs:[1,\"vflow-node\"],inputs:{model:[1,\"model\"],nodeTemplate:[1,\"nodeTemplate\"],nodeSvgTemplate:[1,\"nodeSvgTemplate\"],groupNodeTemplate:[1,\"groupNodeTemplate\"]},features:[It([XN,xE])],attrs:ObA,decls:11,vars:7,consts:[[1,\"selectable\"],[\"nodeHandlesController\",\"\",1,\"selectable\"],[\"rx\",\"5\",\"ry\",\"5\",1,\"default-group-node\",3,\"resizable\",\"gap\",\"resizerColor\",\"default-group-node_selected\",\"stroke\",\"fill\"],[1,\"selectable\",3,\"click\"],[\"nodeHandlesController\",\"\",3,\"selected\"],[3,\"outerHTML\"],[\"type\",\"source\",\"position\",\"right\"],[\"type\",\"target\",\"position\",\"left\"],[\"nodeHandlesController\",\"\",\"nodeResizeController\",\"\",1,\"wrapper\"],[3,\"ngTemplateOutlet\",\"ngTemplateOutletContext\",\"ngTemplateOutletInjector\"],[\"nodeHandlesController\",\"\",1,\"selectable\",3,\"click\"],[3,\"ngComponentOutlet\",\"ngComponentOutletInputs\",\"ngComponentOutletInjector\"],[\"rx\",\"5\",\"ry\",\"5\",1,\"default-group-node\",3,\"click\",\"resizable\",\"gap\",\"resizerColor\"],[3,\"ngTemplateOutlet\"],[\"r\",\"5\",1,\"default-handle\"],[3,\"handleSizeController\"],[1,\"magnet\"],[\"r\",\"5\",1,\"default-handle\",3,\"pointerStart\",\"pointerEnd\"],[3,\"pointerStart\",\"pointerEnd\",\"handleSizeController\"],[4,\"ngTemplateOutlet\",\"ngTemplateOutletContext\"],[1,\"magnet\",3,\"pointerEnd\",\"pointerOver\",\"pointerOut\"]],template:function(i,n){if(i&1&&(V(0,zbA,5,12,\":svg:foreignObject\",0),V(1,PbA,3,9,\":svg:foreignObject\",0),V(2,jbA,2,3,\":svg:g\",1),V(3,VbA,2,3),V(4,WbA,1,11,\":svg:rect\",2),V(5,ZbA,2,3,\":svg:g\",1),V(6,A9A,1,1),Gt(7,a9A,4,4,null,null,Ri),Gt(9,r9A,2,4,\":svg:foreignObject\",null,Ri)),i&2){let o;W(n.model().rawNode.type===\"default\"?0:-1),p(),W(n.model().rawNode.type===\"html-template\"&&n.nodeTemplate()?1:-1),p(),W(n.model().rawNode.type===\"svg-template\"&&n.nodeSvgTemplate()?2:-1),p(),W(n.model().isComponentType?3:-1),p(),W(n.model().rawNode.type===\"default-group\"?4:-1),p(),W(n.model().rawNode.type===\"template-group\"&&n.groupNodeTemplate()?5:-1),p(),W((o=n.model().resizerTemplate())?6:-1,o),p(),Kt(n.model().handles()),p(2),Kt(n.toolbars())}},dependencies:[eF,wMA,tF,Ng,FC,yMA,pMA,MMA,kMA,Pr],styles:[\".magnet[_ngcontent-%COMP%]{opacity:0}.wrapper[_ngcontent-%COMP%]{display:table-cell}.default-group-node[_ngcontent-%COMP%]{stroke-width:1.5px;fill-opacity:.05}.default-group-node_selected[_ngcontent-%COMP%]{stroke-width:2px}.default-handle[_ngcontent-%COMP%]{stroke:#fff;fill:#1b262c}\"],changeDetection:0})}}return t})(),SMA=(()=>{class t{constructor(){this.flowStatusService=h(hI),this.spacePointContext=h(Pu),this.flowEntitiesService=h(ig),this.model=nt.required(),this.template=nt(),this.path=_e(()=>{let A=this.flowStatusService.status(),i=this.model().curve;if(A.state===\"connection-start\"||A.state===\"reconnection-start\"){let n=A.payload.sourceHandle,o=n.pointAbsolute(),a=n.rawHandle.position,r=this.spacePointContext.svgCurrentSpacePoint(),s=_eA(n.rawHandle.position),g=this.getPathFactoryParams(o,r,a,s);switch(i){case\"straight\":return jN(g).path;case\"bezier\":return qN(g).path;case\"smooth-step\":return kE(g).path;case\"step\":return kE(g,0).path;default:return i(g).path}}if(A.state===\"connection-validation\"||A.state===\"reconnection-validation\"){let n=A.payload.sourceHandle,o=n.pointAbsolute(),a=n.rawHandle.position,r=A.payload.targetHandle,s=A.payload.valid?r.pointAbsolute():this.spacePointContext.svgCurrentSpacePoint(),g=A.payload.valid?r.rawHandle.position:_eA(n.rawHandle.position),l=this.getPathFactoryParams(o,s,a,g);switch(i){case\"straight\":return jN(l).path;case\"bezier\":return qN(l).path;case\"smooth-step\":return kE(l).path;case\"step\":return kE(l,0).path;default:return i(l).path}}return null}),this.markerUrl=_e(()=>{let A=this.model().settings.marker;return A?`url(#${SE(JSON.stringify(A))})`:\"\"}),this.defaultColor=\"rgb(177, 177, 183)\"}getContext(){return{$implicit:{path:this.path,marker:this.markerUrl}}}getPathFactoryParams(A,i,n,o){return{mode:\"connection\",sourcePoint:A,targetPoint:i,sourcePosition:n,targetPosition:o,allEdges:this.flowEntitiesService.rawEdges(),allNodes:this.flowEntitiesService.rawNodes()}}static{this.\\u0275fac=function(i){return new(i||t)}}static{this.\\u0275cmp=kA({type:t,selectors:[[\"g\",\"connection\",\"\"]],inputs:{model:[1,\"model\"],template:[1,\"template\"]},attrs:s9A,decls:2,vars:2,consts:[[\"fill\",\"none\",\"stroke-width\",\"2\"],[4,\"ngTemplateOutlet\",\"ngTemplateOutletContext\"]],template:function(i,n){i&1&&(V(0,l9A,1,1),V(1,I9A,1,1)),i&2&&(W(n.model().type===\"default\"?0:-1),p(),W(n.model().type===\"template\"?1:-1))},dependencies:[Ng],encapsulation:2,changeDetection:0})}}return t})();function _eA(t){switch(t){case\"top\":return\"bottom\";case\"bottom\":return\"top\";case\"left\":return\"right\";case\"right\":return\"left\"}}function xMA(){return String.fromCharCode(65+Math.floor(Math.random()*26))+Date.now()}var RMA=\"#fff\",NMA=20,FMA=2,GeA=\"rgb(177, 177, 183)\",KeA=.1,LMA=!0,_MA=(()=>{class t{constructor(){this.viewportService=h(cd),this.rootSvg=h(Xw).element,this.settingsService=h(rs),this.backgroundSignal=this.settingsService.background,this.scaledGap=_e(()=>{let A=this.backgroundSignal();return A.type===\"dots\"?this.viewportService.readableViewport().zoom*(A.gap??NMA):0}),this.x=_e(()=>this.viewportService.readableViewport().x%this.scaledGap()),this.y=_e(()=>this.viewportService.readableViewport().y%this.scaledGap()),this.patternColor=_e(()=>{let A=this.backgroundSignal();return A.type===\"dots\"?A.color??GeA:GeA}),this.patternSize=_e(()=>{let A=this.backgroundSignal();return A.type===\"dots\"?this.viewportService.readableViewport().zoom*(A.size??FMA)/2:0}),this.bgImageSrc=_e(()=>{let A=this.backgroundSignal();return A.type===\"image\"?A.src:\"\"}),this.imageSize=qu(Tn(this.backgroundSignal).pipe(Ei(()=>GMA(this.bgImageSrc())),fe(A=>({width:A.naturalWidth,height:A.naturalHeight}))),{initialValue:{width:0,height:0}}),this.scaledImageWidth=_e(()=>{let A=this.backgroundSignal();if(A.type===\"image\"){let i=A.fixed?1:this.viewportService.readableViewport().zoom;return this.imageSize().width*i*(A.scale??KeA)}return 0}),this.scaledImageHeight=_e(()=>{let A=this.backgroundSignal();if(A.type===\"image\"){let i=A.fixed?1:this.viewportService.readableViewport().zoom;return this.imageSize().height*i*(A.scale??KeA)}return 0}),this.imageX=_e(()=>{let A=this.backgroundSignal();return A.type===\"image\"?A.repeat?A.fixed?0:this.viewportService.readableViewport().x%this.scaledImageWidth():A.fixed?0:this.viewportService.readableViewport().x:0}),this.imageY=_e(()=>{let A=this.backgroundSignal();return A.type===\"image\"?A.repeat?A.fixed?0:this.viewportService.readableViewport().y%this.scaledImageHeight():A.fixed?0:this.viewportService.readableViewport().y:0}),this.repeated=_e(()=>{let A=this.backgroundSignal();return A.type===\"image\"&&(A.repeat??LMA)}),this.patternId=xMA(),this.patternUrl=`url(#${this.patternId})`,pa(()=>{let A=this.backgroundSignal();A.type===\"dots\"&&(this.rootSvg.style.backgroundColor=A.backgroundColor??RMA),A.type===\"solid\"&&(this.rootSvg.style.backgroundColor=A.color)})}static{this.\\u0275fac=function(i){return new(i||t)}}static{this.\\u0275cmp=kA({type:t,selectors:[[\"g\",\"background\",\"\"]],attrs:d9A,decls:2,vars:2,consts:[[\"patternUnits\",\"userSpaceOnUse\"],[\"x\",\"0\",\"y\",\"0\",\"width\",\"100%\",\"height\",\"100%\"]],template:function(i,n){i&1&&(V(0,B9A,3,10),V(1,h9A,2,2)),i&2&&(W(n.backgroundSignal().type===\"dots\"?0:-1),p(),W(n.backgroundSignal().type===\"image\"?1:-1))},encapsulation:2,changeDetection:0})}}return t})();function GMA(t){let e=new Image;return e.src=t,new Promise(A=>{e.onload=()=>A(e)})}var KMA=(()=>{class t{constructor(){this.markers=nt.required(),this.defaultColor=\"rgb(177, 177, 183)\"}static{this.\\u0275fac=function(i){return new(i||t)}}static{this.\\u0275cmp=kA({type:t,selectors:[[\"defs\",\"flowDefs\",\"\"]],inputs:{markers:[1,\"markers\"]},attrs:u9A,decls:3,vars:2,consts:[[\"viewBox\",\"-10 -10 20 20\",\"refX\",\"0\",\"refY\",\"0\"],[\"points\",\"-5,-4 1,0 -5,4 -5,-4\",1,\"marker__arrow_closed\",3,\"stroke\",\"stroke-width\",\"fill\"],[\"points\",\"-5,-4 0,0 -5,4\",1,\"marker__arrow_default\",3,\"stroke\",\"stroke-width\"],[\"points\",\"-5,-4 1,0 -5,4 -5,-4\",1,\"marker__arrow_closed\"],[\"points\",\"-5,-4 0,0 -5,4\",1,\"marker__arrow_default\"]],template:function(i,n){i&1&&(Gt(0,p9A,3,7,\":svg:marker\",0,Ri),oi(2,\"keyvalue\")),i&2&&Kt(li(2,0,n.markers()))},dependencies:[bf],styles:[\".marker__arrow_default[_ngcontent-%COMP%]{stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;fill:none}.marker__arrow_closed[_ngcontent-%COMP%]{stroke-linecap:round;stroke-linejoin:round}\"],changeDetection:0})}}return t})(),UMA=(()=>{class t{constructor(){this.host=h(ge),this.flowSettingsService=h(rs),this.flowWidth=_e(()=>{let A=this.flowSettingsService.view();return A===\"auto\"?\"100%\":A[0]}),this.flowHeight=_e(()=>{let A=this.flowSettingsService.view();return A===\"auto\"?\"100%\":A[1]}),Ay([this.host.nativeElement],h(Oe)).pipe(Wt(([A])=>{this.flowSettingsService.computedFlowWidth.set(A.contentRect.width),this.flowSettingsService.computedFlowHeight.set(A.contentRect.height)}),br()).subscribe()}static{this.\\u0275fac=function(i){return new(i||t)}}static{this.\\u0275dir=OA({type:t,selectors:[[\"svg\",\"flowSizeController\",\"\"]],hostVars:2,hostBindings:function(i,n){i&2&&ie(\"width\",n.flowWidth())(\"height\",n.flowHeight())}})}}return t})(),JMA=(()=>{class t{constructor(){this.flowStatusService=h(hI)}resetConnection(){let A=this.flowStatusService.status();(A.state===\"connection-start\"||A.state===\"reconnection-start\")&&this.flowStatusService.setIdleStatus()}static{this.\\u0275fac=function(i){return new(i||t)}}static{this.\\u0275dir=OA({type:t,selectors:[[\"svg\",\"rootSvgContext\",\"\"]],hostBindings:function(i,n){i&1&&$(\"mouseup\",function(){return n.resetConnection()},m0)(\"touchend\",function(){return n.resetConnection()},m0)(\"contextmenu\",function(){return n.resetConnection()})}})}}return t})();function AF(t,e){let A=[];for(let i of e){let{x:n,y:o}=i.globalPoint();t.x>=n&&t.x<=n+i.width()&&t.y>=o&&t.y<=o+i.height()&&A.push({x:t.x-n,y:t.y-o,spaceNodeId:i.rawNode.id})}return A.reverse(),A.push({spaceNodeId:null,x:t.x,y:t.y}),A}var iF=(()=>{class t{static{this.\\u0275fac=function(i){return new(i||t)}}static{this.\\u0275prov=TA({token:t,factory:t.\\u0275fac})}}return t})(),YMA=(()=>{class t extends iF{shouldRenderNode(A){return!A.isVisible()}static{this.\\u0275fac=(()=>{let A;return function(n){return(A||(A=hi(t)))(n||t)}})()}static{this.\\u0275prov=TA({token:t,factory:t.\\u0275fac})}}return t})();function HMA(t,e){if(Object.keys(e.preview().style).length){zMA(t,e);return}if(e.rawNode.type===\"default\"){TMA(t,e);return}if(e.rawNode.type===\"default-group\"){OMA(t,e);return}PMA(t,e)}function TMA(t,e){let A=e.globalPoint(),i=e.width(),n=e.height();XeA(t,e,5),t.fillStyle=\"white\",t.fill(),t.strokeStyle=\"#1b262c\",t.lineWidth=1.5,t.stroke(),t.fillStyle=\"black\",t.font=\"14px Arial\",t.textAlign=\"center\",t.textBaseline=\"middle\";let o=A.x+i/2,a=A.y+n/2;t.fillText(e.text(),o,a)}function OMA(t,e){let A=e.globalPoint(),i=e.width(),n=e.height();t.globalAlpha=.05,t.fillStyle=e.color(),t.fillRect(A.x,A.y,i,n),t.globalAlpha=1,t.strokeStyle=e.color(),t.lineWidth=1.5,t.strokeRect(A.x,A.y,i,n)}function zMA(t,e){let A=e.globalPoint(),i=e.width(),n=e.height(),o=e.preview().style;if(o.borderRadius){let a=parseFloat(o.borderRadius);XeA(t,e,a)}else t.beginPath(),t.rect(A.x,A.y,i,n),t.closePath();o.backgroundColor&&(t.fillStyle=o.backgroundColor),o.borderColor&&(t.strokeStyle=o.borderColor),o.borderWidth&&(t.lineWidth=parseFloat(o.borderWidth)),t.fill(),t.stroke()}function PMA(t,e){let A=e.globalPoint(),i=e.width(),n=e.height();t.fillStyle=\"rgb(0 0 0 / 10%)\",t.fillRect(A.x,A.y,i,n)}function XeA(t,e,A){let i=e.globalPoint(),n=e.width(),o=e.height();t.beginPath(),t.moveTo(i.x+A,i.y),t.lineTo(i.x+n-A,i.y),t.quadraticCurveTo(i.x+n,i.y,i.x+n,i.y+A),t.lineTo(i.x+n,i.y+o-A),t.quadraticCurveTo(i.x+n,i.y+o,i.x+n-A,i.y+o),t.lineTo(i.x+A,i.y+o),t.quadraticCurveTo(i.x,i.y+o,i.x,i.y+o-A),t.lineTo(i.x,i.y+A),t.quadraticCurveTo(i.x,i.y,i.x+A,i.y),t.closePath()}var jMA=(()=>{class t{constructor(){this.viewportService=h(cd),this.renderStrategy=h(iF),this.nodeRenderingService=h(Cd),this.renderer2=h(ui),this.element=h(ge).nativeElement,this.ctx=this.element.getContext(\"2d\"),this.width=nt(0),this.height=nt(0),this.dpr=window.devicePixelRatio,pa(()=>{this.renderer2.setProperty(this.element,\"width\",this.width()*this.dpr),this.renderer2.setProperty(this.element,\"height\",this.height()*this.dpr),this.renderer2.setStyle(this.element,\"width\",`${this.width()}px`),this.renderer2.setStyle(this.element,\"height\",`${this.height()}px`),this.ctx.scale(this.dpr,this.dpr)}),pa(()=>{let A=this.viewportService.readableViewport();this.ctx.clearRect(0,0,this.width(),this.height()),this.ctx.save(),this.ctx.setTransform(A.zoom*this.dpr,0,0,A.zoom*this.dpr,A.x*this.dpr,A.y*this.dpr);for(let i=0;i<this.nodeRenderingService.viewportNodes().length;i++){let n=this.nodeRenderingService.viewportNodes()[i];this.renderStrategy.shouldRenderNode(n)&&HMA(this.ctx,n)}this.ctx.restore()})}static{this.\\u0275fac=function(i){return new(i||t)}}static{this.\\u0275cmp=kA({type:t,selectors:[[\"canvas\",\"previewFlow\",\"\"]],inputs:{width:[1,\"width\"],height:[1,\"height\"]},attrs:D9A,decls:0,vars:0,template:function(i,n){},encapsulation:2,changeDetection:0})}}return t})(),UeA=(()=>{class t{constructor(){this.nodeRenderingService=h(Cd),this.edgeRenderingService=h(Zw),this.flowEntitiesService=h(ig),this.settingsService=h(rs),this.flowInitialized=jA(!1),h(Oe).runOutsideAngular(()=>ct(this,null,function*(){yield qMA(2),this.flowInitialized.set(!0)}))}static{this.\\u0275fac=function(i){return new(i||t)}}static{this.\\u0275prov=TA({token:t,factory:t.\\u0275fac})}}return t})();function qMA(t){return new Promise(e=>{let A=0;function i(){A++,A<t?requestAnimationFrame(i):e()}requestAnimationFrame(i)})}function JeA(t){return Ve(BA({},t),{left:t.x,right:t.x+t.width,top:t.y,bottom:t.y+t.height})}var VMA=(()=>{class t{constructor(){this.nodeRenderingService=h(Cd),this.flowStatus=h(hI),this.tolerance=nt(10),this.lineColor=nt(\"#1b262c\"),this.isNodeDragging=_e(()=>beA(this.flowStatus.status())),this.intersections=qw(A=>{let i=this.flowStatus.status();if(beA(i)){let n=i.payload.node,o=JeA(Hw(n)),a=this.nodeRenderingService.viewportNodes().filter(I=>I!==n).filter(I=>!n.children().includes(I)).map(I=>JeA(Hw(I))),r=[],s=o.x,g=o.y,l=1/0,C=1/0;return a.forEach(I=>{let d=o.left+o.width/2,B=I.left+I.width/2;for(let[f,b,R,M]of[[d,B,B-o.width/2,!0],[o.left,I.left,I.left,!1],[o.left,I.right,I.right,!1],[o.right,I.left,I.left-o.width,!1],[o.right,I.right,I.right-o.width,!1]]){let v=Math.abs(f-b);if(v<=this.tolerance()){let F=Math.min(o.top,I.top),G=Math.max(o.bottom,I.bottom);if(r.push({x:b,y:F,x2:b,y2:G,isCenter:M}),v<l&&(l=v,s=R),M)break}}let Q=o.top+o.height/2,E=I.top+I.height/2;for(let[f,b,R,M]of[[Q,E,E-o.height/2,!0],[o.top,I.top,I.top,!1],[o.top,I.bottom,I.bottom,!1],[o.bottom,I.top,I.top-o.height,!1],[o.bottom,I.bottom,I.bottom-o.height,!1]]){let v=Math.abs(f-b);if(v<=this.tolerance()){let F=Math.min(o.left,I.left),G=Math.max(o.right,I.right);if(r.push({x:F,y:b,x2:G,y2:b,isCenter:M}),v<C&&(C=v,g=R),M)break}}}),{lines:r,snappedX:s,snappedY:g}}return A}),Tn(this.flowStatus.status).pipe(We($9A),fe(A=>A.payload.node),fe(A=>[A,this.intersections()]),Wt(([A,i])=>{if(i){let n={x:i.snappedX,y:i.snappedY},o=A.parent()?[A.parent()]:[];A.setPoint(AF(n,o)[0])}}),br()).subscribe()}static{this.\\u0275fac=function(i){return new(i||t)}}static{this.\\u0275cmp=kA({type:t,selectors:[[\"g\",\"alignmentHelper\",\"\"]],inputs:{tolerance:[1,\"tolerance\"],lineColor:[1,\"lineColor\"]},attrs:w9A,decls:1,vars:1,template:function(i,n){i&1&&V(0,b9A,1,1),i&2&&W(n.isNodeDragging()?0:-1)},encapsulation:2,changeDetection:0})}}return t})();var $eA=(()=>{class t{constructor(){this.viewportService=h(cd),this.flowEntitiesService=h(ig),this.nodesChangeService=h(WN),this.edgesChangeService=h(ZN),this.nodeRenderingService=h(Cd),this.edgeRenderingService=h(Zw),this.flowSettingsService=h(rs),this.componentEventBusService=h(PN),this.keyboardService=h(zN),this.injector=h(ut),this.flowRenderingService=h(UeA),this.alignmentHelper=nt(!1),this.nodeModels=this.nodeRenderingService.nodes,this.groups=this.nodeRenderingService.groups,this.nonGroups=this.nodeRenderingService.nonGroups,this.edgeModels=this.edgeRenderingService.edges,this.onComponentNodeEvent=hn(this.componentEventBusService.event$),this.nodeTemplateDirective=w0(zw),this.nodeSvgTemplateDirective=w0(xeA),this.groupNodeTemplateDirective=w0(Pw),this.edgeTemplateDirective=w0(MeA),this.edgeLabelHtmlDirective=w0(SeA),this.connectionTemplateDirective=w0(keA),this.mapContext=Xo(HN),this.spacePointContext=Xo.required(Pu),this.viewport=this.viewportService.readableViewport.asReadonly(),this.nodesChange=qu(this.nodesChangeService.changes$,{initialValue:[]}),this.edgesChange=qu(this.edgesChangeService.changes$,{initialValue:[]}),this.initialized=this.flowRenderingService.flowInitialized.asReadonly(),this.viewportChange$=Tn(this.viewportService.readableViewport).pipe(rg(1)),this.nodesChange$=this.nodesChangeService.changes$,this.edgesChange$=this.edgesChangeService.changes$,this.initialized$=Tn(this.flowRenderingService.flowInitialized),this.markers=this.flowEntitiesService.markers,this.minimap=this.flowEntitiesService.minimap,this.flowOptimization=this.flowSettingsService.optimization,this.flowWidth=this.flowSettingsService.computedFlowWidth,this.flowHeight=this.flowSettingsService.computedFlowHeight}set view(A){this.flowSettingsService.view.set(A)}set minZoom(A){this.flowSettingsService.minZoom.set(A)}set maxZoom(A){this.flowSettingsService.maxZoom.set(A)}set background(A){this.flowSettingsService.background.set(uMA(A))}set optimization(A){this.flowSettingsService.optimization.update(i=>BA(BA({},i),A))}set entitiesSelectable(A){this.flowSettingsService.entitiesSelectable.set(A)}set keyboardShortcuts(A){this.keyboardService.setShortcuts(A)}set connection(A){this.flowEntitiesService.connection.set(A)}get connection(){return this.flowEntitiesService.connection()}set snapGrid(A){this.flowSettingsService.snapGrid.set(A)}set elevateNodesOnSelect(A){this.flowSettingsService.elevateNodesOnSelect.set(A)}set elevateEdgesOnSelect(A){this.flowSettingsService.elevateEdgesOnSelect.set(A)}set nodes(A){let i=Ya(this.injector,()=>Vw.nodes(A,this.flowEntitiesService.nodes()));ReA(i,this.flowEntitiesService.edges()),this.flowEntitiesService.nodes.set(i),i.forEach(n=>this.nodeRenderingService.pullNode(n))}set edges(A){let i=Ya(this.injector,()=>Vw.edges(A,this.flowEntitiesService.edges()));ReA(this.flowEntitiesService.nodes(),i),this.flowEntitiesService.edges.set(i)}viewportTo(A){this.viewportService.writableViewport.set({changeType:\"absolute\",state:A,duration:0})}zoomTo(A){this.viewportService.writableViewport.set({changeType:\"absolute\",state:{zoom:A},duration:0})}panTo(A){this.viewportService.writableViewport.set({changeType:\"absolute\",state:A,duration:0})}fitView(A){this.viewportService.fitView(A)}getNode(A){return this.flowEntitiesService.getNode(A)?.rawNode}getDetachedEdges(){return this.flowEntitiesService.getDetachedEdges().map(A=>A.edge)}documentPointToFlowPoint(A,i){let n=this.spacePointContext().documentPointToFlowPoint(A);return i?.spaces?AF(n,this.nodeRenderingService.groups()):n}getIntesectingNodes(A,i={partially:!0}){return Y9A(A,this.nodeModels(),i).map(n=>n.rawNode)}toNodeSpace(A,i){let n=this.nodeModels().find(a=>a.rawNode.id===A);if(!n)return{x:1/0,y:1/0};if(i===null)return n.globalPoint();let o=this.nodeModels().find(a=>a.rawNode.id===i);return o?AF(n.globalPoint(),[o])[0]:{x:1/0,y:1/0}}trackNodes(A,{rawNode:i}){return i}trackEdges(A,{edge:i}){return i}static{this.\\u0275fac=function(i){return new(i||t)}}static{this.\\u0275cmp=kA({type:t,selectors:[[\"vflow\"]],contentQueries:function(i,n,o){i&1&&wf(o,n.nodeTemplateDirective,zw,5)(o,n.nodeSvgTemplateDirective,xeA,5)(o,n.groupNodeTemplateDirective,Pw,5)(o,n.edgeTemplateDirective,MeA,5)(o,n.edgeLabelHtmlDirective,SeA,5)(o,n.connectionTemplateDirective,keA,5),i&2&&rr(6)},viewQuery:function(i,n){i&1&&Or(n.mapContext,HN,5)(n.spacePointContext,Pu,5),i&2&&rr(2)},inputs:{view:\"view\",minZoom:\"minZoom\",maxZoom:\"maxZoom\",background:\"background\",optimization:\"optimization\",entitiesSelectable:\"entitiesSelectable\",keyboardShortcuts:\"keyboardShortcuts\",connection:[2,\"connection\",\"connection\",A=>new Tw(A)],snapGrid:\"snapGrid\",elevateNodesOnSelect:\"elevateNodesOnSelect\",elevateEdgesOnSelect:\"elevateEdgesOnSelect\",nodes:\"nodes\",alignmentHelper:[1,\"alignmentHelper\"],edges:\"edges\"},outputs:{onComponentNodeEvent:\"onComponentNodeEvent\"},features:[It([TeA,cd,hI,ig,WN,ZN,Cd,Zw,Vu,rs,PN,zN,jeA,{provide:iF,useClass:YMA},UeA]),ff([{directive:hMA,outputs:[\"onNodesChange\",\"onNodesChange\",\"onNodesChange.position\",\"onNodesChange.position\",\"onNodesChange.position.single\",\"onNodesChange.position.single\",\"onNodesChange.position.many\",\"onNodesChange.position.many\",\"onNodesChange.size\",\"onNodesChange.size\",\"onNodesChange.size.single\",\"onNodesChange.size.single\",\"onNodesChange.size.many\",\"onNodesChange.size.many\",\"onNodesChange.add\",\"onNodesChange.add\",\"onNodesChange.add.single\",\"onNodesChange.add.single\",\"onNodesChange.add.many\",\"onNodesChange.add.many\",\"onNodesChange.remove\",\"onNodesChange.remove\",\"onNodesChange.remove.single\",\"onNodesChange.remove.single\",\"onNodesChange.remove.many\",\"onNodesChange.remove.many\",\"onNodesChange.select\",\"onNodesChange.select\",\"onNodesChange.select.single\",\"onNodesChange.select.single\",\"onNodesChange.select.many\",\"onNodesChange.select.many\",\"onEdgesChange\",\"onEdgesChange\",\"onEdgesChange.detached\",\"onEdgesChange.detached\",\"onEdgesChange.detached.single\",\"onEdgesChange.detached.single\",\"onEdgesChange.detached.many\",\"onEdgesChange.detached.many\",\"onEdgesChange.add\",\"onEdgesChange.add\",\"onEdgesChange.add.single\",\"onEdgesChange.add.single\",\"onEdgesChange.add.many\",\"onEdgesChange.add.many\",\"onEdgesChange.remove\",\"onEdgesChange.remove\",\"onEdgesChange.remove.single\",\"onEdgesChange.remove.single\",\"onEdgesChange.remove.many\",\"onEdgesChange.remove.many\",\"onEdgesChange.select\",\"onEdgesChange.select\",\"onEdgesChange.select.single\",\"onEdgesChange.select.single\",\"onEdgesChange.select.many\",\"onEdgesChange.select.many\"]}])],decls:11,vars:8,consts:[[\"flow\",\"\"],[\"rootSvgRef\",\"\",\"rootSvgContext\",\"\",\"rootPointer\",\"\",\"flowSizeController\",\"\",1,\"root-svg\"],[\"flowDefs\",\"\",3,\"markers\"],[\"background\",\"\"],[\"mapContext\",\"\",\"spacePointContext\",\"\"],[\"connection\",\"\",3,\"model\",\"template\"],[3,\"ngTemplateOutlet\"],[\"previewFlow\",\"\",1,\"preview-flow\",3,\"width\",\"height\"],[\"alignmentHelper\",\"\"],[\"alignmentHelper\",\"\",3,\"tolerance\",\"lineColor\"],[\"node\",\"\",3,\"model\",\"groupNodeTemplate\"],[\"edge\",\"\",3,\"model\",\"edgeTemplate\",\"edgeLabelHtmlTemplate\"],[\"node\",\"\",3,\"model\",\"nodeTemplate\",\"nodeSvgTemplate\"],[\"node\",\"\",3,\"model\",\"nodeTemplate\",\"nodeSvgTemplate\",\"groupNodeTemplate\"]],template:function(i,n){if(i&1&&(Qt(),m(0,\"svg\",1,0),GA(2,\"defs\",2)(3,\"g\",3),m(4,\"g\",4),V(5,S9A,2,1),GA(6,\"g\",5),V(7,F9A,6,0),V(8,G9A,4,0),D(),V(9,K9A,1,1,\":svg:ng-container\",6),D(),V(10,U9A,1,2,\"canvas\",7)),i&2){let o,a,r;p(2),X(\"markers\",n.markers()),p(3),W((o=n.alignmentHelper())?5:-1,o),p(),X(\"model\",n.connection)(\"template\",(a=n.connectionTemplateDirective())==null?null:a.templateRef),p(),W(n.flowOptimization().detachedGroupsLayer?7:-1),p(),W(n.flowOptimization().detachedGroupsLayer?-1:8),p(),W((r=n.minimap())?9:-1,r),p(),W(n.flowOptimization().virtualization?10:-1)}},dependencies:[Xw,JMA,$w,UMA,KMA,_MA,HN,Pu,SMA,ZeA,WeA,Ng,jMA,VMA],styles:[\"[_nghost-%COMP%]{display:grid;grid-template-columns:1fr;width:100%;height:100%;-webkit-user-select:none;user-select:none}[_nghost-%COMP%]     *{box-sizing:border-box}.root-svg[_ngcontent-%COMP%]{grid-row-start:1;grid-column-start:1}.preview-flow[_ngcontent-%COMP%]{pointer-events:none;grid-row-start:1;grid-column-start:1}\"],changeDetection:0})}}return t})();var AtA=(()=>{class t{constructor(){this.flowSettingsService=h(rs),this.selectionService=h(Vu),this.parentEdge=h(WeA,{optional:!0}),this.parentNode=h(ZeA,{optional:!0}),this.host=h(ge),this.selectOnEvent=this.getEvent$().pipe(Wt(()=>this.select()),br()).subscribe()}select(){let A=this.entity();A&&this.flowSettingsService.entitiesSelectable()&&this.selectionService.select(A)}entity(){return this.parentNode?this.parentNode.model():this.parentEdge?this.parentEdge.model():null}getEvent$(){return mc(this.host.nativeElement,\"click\")}static{this.\\u0275fac=function(i){return new(i||t)}}static{this.\\u0275dir=OA({type:t,selectors:[[\"\",\"selectable\",\"\"]]})}}return t})();var ZMA=[\"canvas\"],XMA=[\"svgCanvas\"],$MA=()=>({type:\"dots\",color:\"#424242\",size:1,gap:12}),AkA=()=>[12,12],ekA=(t,e)=>e.name;function tkA(t,e){if(t&1){let A=zA();m(0,\"div\",6)(1,\"div\",11)(2,\"button\",12),$(\"click\",function(){rA(A);let n=y();return sA(n.backToMainCanvas())}),m(3,\"mat-icon\"),K(4,\"arrow_back\"),D()(),m(5,\"div\",13)(6,\"span\",14),K(7,\"smart_toy\"),D(),m(8,\"div\",15)(9,\"h3\",16),K(10),D(),m(11,\"p\",17),K(12,\"Agent Tool\"),D()()()()()}if(t&2){let A=y();p(2),X(\"matTooltip\",A.getBackButtonTooltip()),p(8),qA(A.currentAgentTool())}}function ikA(t,e){if(t&1){let A=zA();m(0,\"span\",18),$(\"click\",function(){rA(A);let n=y();return sA(n.toggleSidePanelRequest.emit())}),K(1,\"left_panel_open\"),D()}}function nkA(t,e){if(t&1){let A=zA();Qt(),m(0,\"foreignObject\"),Tr(),m(1,\"div\",27),$(\"click\",function(n){return n.stopPropagation()}),m(2,\"button\",28,0),$(\"click\",function(n){return n.stopPropagation()}),m(4,\"mat-icon\"),K(5,\"add\"),D()(),m(6,\"span\",29),K(7,\"Add sub-agent\"),D(),m(8,\"mat-menu\",null,1)(10,\"button\",30),$(\"click\",function(n){let o;rA(A);let a=Wi(3),r=y().$implicit,s=y(2);return sA(s.handleAgentTypeSelection(\"LlmAgent\",r.node.data==null||(o=r.node.data())==null?null:o.name,a,n,!0))}),m(11,\"mat-icon\"),K(12,\"psychology\"),D(),m(13,\"span\"),K(14,\"LLM Agent\"),D()(),m(15,\"button\",30),$(\"click\",function(n){let o;rA(A);let a=Wi(3),r=y().$implicit,s=y(2);return sA(s.handleAgentTypeSelection(\"SequentialAgent\",r.node.data==null||(o=r.node.data())==null?null:o.name,a,n,!0))}),m(16,\"mat-icon\"),K(17,\"more_horiz\"),D(),m(18,\"span\"),K(19,\"Sequential Agent\"),D()(),m(20,\"button\",30),$(\"click\",function(n){let o;rA(A);let a=Wi(3),r=y().$implicit,s=y(2);return sA(s.handleAgentTypeSelection(\"LoopAgent\",r.node.data==null||(o=r.node.data())==null?null:o.name,a,n,!0))}),m(21,\"mat-icon\"),K(22,\"sync\"),D(),m(23,\"span\"),K(24,\"Loop Agent\"),D()(),m(25,\"button\",30),$(\"click\",function(n){let o;rA(A);let a=Wi(3),r=y().$implicit,s=y(2);return sA(s.handleAgentTypeSelection(\"ParallelAgent\",r.node.data==null||(o=r.node.data())==null?null:o.name,a,n,!0))}),m(26,\"mat-icon\"),K(27,\"density_medium\"),D(),m(28,\"span\"),K(29,\"Parallel Agent\"),D()()()()()}if(t&2){let A=Wi(9),i=y().$implicit;ie(\"width\",200)(\"height\",100)(\"x\",i.width()/2-100)(\"y\",i.height()/2-40),p(2),X(\"matMenuTriggerFor\",A)}}function okA(t,e){t&1&&(Qt(),GA(0,\"handle\",26))}function akA(t,e){if(t&1){let A=zA();Qt(),m(0,\"g\")(1,\"rect\",21),$(\"click\",function(n){let o=rA(A).$implicit,a=y(2);return sA(a.onGroupClick(o.node,n))})(\"pointerdown\",function(n){let o=rA(A).$implicit,a=y(2);return sA(a.onGroupPointerDown(o.node,n))}),D(),m(2,\"foreignObject\",22),Tr(),m(3,\"div\",23)(4,\"mat-icon\",24),K(5),D(),m(6,\"span\",25),K(7),D()()(),V(8,nkA,30,5,\":svg:foreignObject\"),V(9,okA,1,0,\":svg:handle\",26),D()}if(t&2){let A,i,n=e.$implicit,o=y(2);p(),En(\"stroke\",o.isGroupSelected(n.node)?\"rgba(0, 187, 234, 0.8)\":\"rgba(0, 187, 234, 0.3)\")(\"fill\",o.isGroupSelected(n.node)?\"rgba(0, 187, 234, 0.1)\":\"rgba(0, 187, 234, 0.03)\")(\"stroke-width\",o.isGroupSelected(n.node)?3:2),ie(\"width\",n.width())(\"height\",n.height()),p(),ie(\"width\",200)(\"height\",32),p(3),qA(o.getAgentIcon(n.node.data==null||(A=n.node.data())==null?null:A.agent_class)),p(2),qA(n.node.data==null||(i=n.node.data())==null?null:i.agent_class),p(),W(o.isGroupEmpty(n.node.id)?8:-1),p(),W(o.shouldShowTopHandle(n.node)?9:-1)}}function rkA(t,e){t&1&&(m(0,\"span\",35),K(1,\"Root\"),D())}function skA(t,e){if(t&1){let A=zA();m(0,\"button\",43),$(\"click\",function(n){rA(A),y();let o=vs(0);return y(2).openDeleteSubAgentDialog(o),sA(n.stopPropagation())}),m(1,\"mat-icon\"),K(2,\"delete\"),D()()}}function gkA(t,e){if(t&1){let A=zA();m(0,\"div\",46),$(\"click\",function(n){let o=rA(A).$implicit,a=y(2).$implicit;return y(2).selectTool(o,a.node),sA(n.stopPropagation())}),m(1,\"mat-icon\",47),K(2),D(),m(3,\"span\",48),K(4),D()()}if(t&2){let A=e.$implicit,i=y(4);p(2),qA(i.getToolIcon(A)),p(2),qA(A.name)}}function lkA(t,e){if(t&1&&(m(0,\"div\",38)(1,\"div\",44),Gt(2,gkA,5,2,\"div\",45,ekA),D()()),t&2){y();let A=vs(3);p(2),Kt(A)}}function ckA(t,e){if(t&1){let A=zA();m(0,\"div\",39)(1,\"button\",49,2),$(\"click\",function(n){return n.stopPropagation()}),m(3,\"span\",50),K(4,\"+\"),D()(),m(5,\"mat-menu\",null,3)(7,\"button\",30),$(\"click\",function(n){let o;rA(A);let a=Wi(2),r=y().$implicit,s=y(2);return sA(s.handleAgentTypeSelection(\"LlmAgent\",(o=r.node.data())==null?null:o.name,a,n))}),m(8,\"mat-icon\"),K(9,\"psychology\"),D(),m(10,\"span\"),K(11,\"LLM Agent\"),D()(),m(12,\"button\",30),$(\"click\",function(n){let o;rA(A);let a=Wi(2),r=y().$implicit,s=y(2);return sA(s.handleAgentTypeSelection(\"SequentialAgent\",(o=r.node.data())==null?null:o.name,a,n))}),m(13,\"mat-icon\"),K(14,\"more_horiz\"),D(),m(15,\"span\"),K(16,\"Sequential Agent\"),D()(),m(17,\"button\",30),$(\"click\",function(n){let o;rA(A);let a=Wi(2),r=y().$implicit,s=y(2);return sA(s.handleAgentTypeSelection(\"LoopAgent\",(o=r.node.data())==null?null:o.name,a,n))}),m(18,\"mat-icon\"),K(19,\"sync\"),D(),m(20,\"span\"),K(21,\"Loop Agent\"),D()(),m(22,\"button\",30),$(\"click\",function(n){let o;rA(A);let a=Wi(2),r=y().$implicit,s=y(2);return sA(s.handleAgentTypeSelection(\"ParallelAgent\",(o=r.node.data())==null?null:o.name,a,n))}),m(23,\"mat-icon\"),K(24,\"density_medium\"),D(),m(25,\"span\"),K(26,\"Parallel Agent\"),D()()()()}if(t&2){let A=Wi(6);p(),X(\"matMenuTriggerFor\",A)}}function CkA(t,e){t&1&&GA(0,\"handle\",40)}function IkA(t,e){t&1&&GA(0,\"handle\",26)}function dkA(t,e){t&1&&GA(0,\"handle\",41)}function BkA(t,e){t&1&&GA(0,\"handle\",42)}function QkA(t,e){if(t&1){let A=zA();wr(0)(1),oi(2,\"async\"),wr(3),m(4,\"div\",31),$(\"click\",function(n){let o=rA(A).$implicit,a=y(2);return sA(a.onCustomTemplateNodeClick(o.node,n))})(\"pointerdown\",function(n){let o=rA(A).$implicit,a=y(2);return sA(a.onNodePointerDown(o.node,n))}),m(5,\"div\",32)(6,\"div\",33)(7,\"mat-icon\",34),K(8),D(),K(9),V(10,rkA,2,0,\"span\",35),D(),m(11,\"div\",36),V(12,skA,3,0,\"button\",37),D()(),V(13,lkA,4,0,\"div\",38),V(14,ckA,27,1,\"div\",39),V(15,CkA,1,0,\"handle\",40),V(16,IkA,1,0,\"handle\",26),V(17,dkA,1,0,\"handle\",41),V(18,BkA,1,0,\"handle\",42),D()}if(t&2){let A=e.$implicit,i=y(2),n=A.node.data==null?null:A.node.data(),o=sg((n==null?null:n.name)||\"root_agent\"),a=li(2,17,i.toolsMap$);p(3);let s=sg(i.getToolsForNode(o,a)).length>0;p(),ae(\"custom-node_selected\",i.isNodeSelected(A.node))(\"custom-node_has-tools\",s)(\"in-group\",A.node.parentId&&A.node.parentId()),p(4),qA(i.getAgentIcon(n==null?null:n.agent_class)),p(),Fe(\" \",o,\" \"),p(),W(i.isRootAgent(o)?10:-1),p(2),W(i.isRootAgentForCurrentTab(o)?-1:12),p(),W(s?13:-1),p(),W(i.shouldShowAddButton(A.node)?14:-1),p(),W(i.shouldShowLeftHandle(A.node)?15:-1),p(),W(i.shouldShowTopHandle(A.node)?16:-1),p(),W(i.shouldShowRightHandle(A.node)?17:-1),p(),W(i.shouldShowBottomHandle(A.node)?18:-1)}}function EkA(t,e){if(t&1&&(m(0,\"vflow\",8),yt(1,akA,10,14,\"ng-template\",19)(2,QkA,19,20,\"ng-template\",20),D()),t&2){let A=y();X(\"nodes\",A.vflowNodes())(\"edges\",A.edges())(\"background\",WE(4,$MA))(\"snapGrid\",WE(5,AkA))}}function hkA(t,e){t&1&&(m(0,\"div\",9)(1,\"div\",51)(2,\"mat-icon\",52),K(3,\"touch_app\"),D(),m(4,\"h4\"),K(5,\"Start Building Your ADK\"),D(),m(6,\"p\"),K(7,\"Drag components from the left panel to create your workflow\"),D(),m(8,\"div\",53)(9,\"div\",54)(10,\"mat-icon\"),K(11,\"drag_indicator\"),D(),m(12,\"span\"),K(13,\"Drag to move nodes\"),D()(),m(14,\"div\",54)(15,\"mat-icon\"),K(16,\"link\"),D(),m(17,\"span\"),K(18,\"Shift + Click to connect nodes\"),D()()()()())}var RE=class t{constructor(e,A,i){this.dialog=e;this.agentService=A;this.router=i;this.toolsMap$=this.agentBuilderService.getAgentToolsMap(),this.agentBuilderService.getSelectedTool().subscribe(n=>{this.selectedTool=n})}_snackBar=h(ZC);canvasRef;svgCanvasRef;agentBuilderService=h(Kc);cdr=h(ft);showSidePanel=!0;showBuilderAssistant=!1;appNameInput=\"\";toggleSidePanelRequest=new WA;builderAssistantCloseRequest=new WA;ctx;connections=jA([]);nodeId=1;edgeId=1;callbackId=1;toolId=1;appName=\"\";nodes=jA([]);edges=jA([]);workflowShellWidth=340;workflowGroupWidth=420;workflowGroupHeight=220;workflowGroupYOffset=180;workflowGroupXOffset=-40;workflowInnerNodePoint={x:40,y:80};groupNodes=jA([]);vflowNodes=_e(()=>[...this.groupNodes(),...this.nodes()]);selectedAgents=[];selectedTool;selectedCallback;currentAgentTool=jA(null);agentToolBoards=jA(new Map);isAgentToolMode=!1;navigationStack=[];existingAgent=void 0;toolsMap$;nodePositions=new Map;ngOnInit(){this.agentService.getApp().subscribe(e=>{e&&(this.appName=e)}),this.appNameInput&&(this.appName=this.appNameInput),this.agentBuilderService.getNewTabRequest().subscribe(e=>{if(e){let{tabName:A,currentAgentName:i}=e;this.switchToAgentToolBoard(A,i)}}),this.agentBuilderService.getTabDeletionRequest().subscribe(e=>{e&&this.deleteAgentToolBoard(e)}),this.agentBuilderService.getSelectedCallback().subscribe(e=>{this.selectedCallback=e}),this.agentBuilderService.getAgentCallbacks().subscribe(e=>{if(e){let A=this.nodes().find(i=>i.data?i.data().name===e.agentName:void 0);if(A&&A.data){let i=A.data();i.callbacks=e.callbacks,A.data.set(i)}}}),this.agentBuilderService.getDeleteSubAgentSubject().subscribe(e=>{e&&this.openDeleteSubAgentDialog(e)}),this.agentBuilderService.getAddSubAgentSubject().subscribe(e=>{e.parentAgentName&&this.addSubAgent(e.parentAgentName,e.agentClass,e.isFromEmptyGroup)}),this.agentBuilderService.getSelectedNode().subscribe(e=>{this.selectedAgents=this.nodes().filter(A=>A.data&&A.data().name===e?.name)}),this.toolsMap$.subscribe(e=>{this.nodes().some(i=>i.parentId&&i.parentId())&&this.groupNodes().length>0&&this.updateGroupDimensions()})}ngOnChanges(e){e.appNameInput&&e.appNameInput.currentValue&&(this.appName=e.appNameInput.currentValue)}ngAfterViewInit(){}onCustomTemplateNodeClick(e,A){this.shouldIgnoreNodeInteraction(A.target)||this.selectAgentNode(e,{openConfig:!0})}onNodePointerDown(e,A){this.shouldIgnoreNodeInteraction(A.target)||this.selectAgentNode(e,{openConfig:!1})}onGroupClick(e,A){if(A.stopPropagation(),!e?.data)return;let i=e.data().name,n=this.nodes().find(o=>o.data&&o.data().name===i);n&&this.selectAgentNode(n,{openConfig:!0})}onGroupPointerDown(e,A){if(A.stopPropagation(),!e?.data)return;let i=e.data().name,n=this.nodes().find(o=>o.data&&o.data().name===i);n&&this.selectAgentNode(n,{openConfig:!1})}onCanvasClick(e){let A=e.target;if(!A)return;let i=[\".custom-node\",\".action-button-bar\",\".add-subagent-btn\",\".open-panel-btn\",\".agent-tool-banner\",\".mat-mdc-menu-panel\"];A.closest(i.join(\",\"))||this.clearCanvasSelection()}shouldIgnoreNodeInteraction(e){return e?!!e.closest(\"mat-chip, .add-subagent-btn, .mat-mdc-menu-panel\"):!1}selectAgentNode(e,A={}){if(!e?.data)return;let i=this.agentBuilderService.getNode(e.data().name);i&&(this.agentBuilderService.setSelectedTool(void 0),this.agentBuilderService.setSelectedNode(i),this.nodePositions.set(i.name,BA({},e.point())),A.openConfig&&this.agentBuilderService.requestSideTabChange(\"config\"))}handleAgentTypeSelection(e,A,i,n,o=!1){n.stopPropagation(),i?.closeMenu(),this.onAgentTypeSelected(e,A,o)}clearCanvasSelection(){!this.selectedAgents.length&&!this.selectedTool&&!this.selectedCallback||(this.selectedAgents=[],this.selectedTool=void 0,this.selectedCallback=void 0,this.agentBuilderService.setSelectedNode(void 0),this.agentBuilderService.setSelectedTool(void 0),this.agentBuilderService.setSelectedCallback(void 0),this.cdr.markForCheck())}onAddResource(e){}onAgentTypeSelected(e,A,i=!1){A&&this.addSubAgent(A,e,i)}generateNodeId(){return this.nodeId+=1,this.nodeId.toString()}generateEdgeId(){return this.edgeId+=1,this.edgeId.toString()}createNode(e,A,i){let n=jA(e),a={id:this.generateNodeId(),point:jA(BA({},A)),type:\"html-template\",data:n};return i&&(a.parentId=jA(i)),this.nodePositions.set(e.name,BA({},a.point())),a}createWorkflowGroup(e,A,i,n,o,a){let r,s=null;if(n){let d=(o||this.groupNodes()).find(B=>B.id===n);if(d){let B=d.point(),Q=d.height?d.height():this.workflowGroupHeight;if(a&&o){let E=a.filter(f=>f.parentId&&f.parentId()===d.id);if(E.length>0){let U=0;for(let Y of E){let j=Y.data?Y.data():void 0,AA=120;j&&j.tools&&j.tools.length>0&&(AA+=20+j.tools.length*36),U=Math.max(U,AA)}Q=Math.max(220,80+U+40)}}r={x:B.x,y:B.y+Q+60},s=null}else r={x:i.x+this.workflowGroupXOffset,y:i.y+this.workflowGroupYOffset}}else r={x:i.x+this.workflowGroupXOffset,y:i.y+this.workflowGroupYOffset};let g=this.generateNodeId(),l={id:g,point:jA(r),type:\"template-group\",data:jA(e),parentId:jA(s),width:jA(this.workflowGroupWidth),height:jA(this.workflowGroupHeight)},C=e.agent_class===\"SequentialAgent\"?{id:this.generateEdgeId(),source:A.id,sourceHandle:\"source-bottom\",target:g,targetHandle:\"target-top\"}:null;return{groupNode:l,edge:C}}calculateWorkflowChildPosition(e,A){let r=(A-20)/2;return{x:45+e*428,y:r}}createAgentNodeWithGroup(e,A,i,n,o){let a=this.createNode(e,A,i),r=null,s=null;if(this.isWorkflowAgent(e.agent_class)){let g=this.createWorkflowGroup(e,a,A,i,n,o);r=g.groupNode,s=g.edge}return{shellNode:a,groupNode:r,groupEdge:s}}createWorkflowChildEdge(e,A){return this.createWorkflowChildEdgeFromArrays(e,A,this.nodes(),this.groupNodes())}createWorkflowChildEdgeFromArrays(e,A,i,n){if(!A)return null;let o=n.find(r=>r.id===A);if(!o||!o.data)return null;let a=o.data().agent_class;if(a===\"LoopAgent\"||a===\"ParallelAgent\"){let r=i.find(s=>s.data&&s.data().name===o.data().name);if(r)return{id:this.generateEdgeId(),source:r.id,sourceHandle:\"source-bottom\",target:e.id,targetHandle:\"target-top\"}}if(a===\"SequentialAgent\"){let r=i.filter(l=>l.parentId&&l.parentId()===A);if(r.length===0)return null;r.sort((l,C)=>l.point().x-C.point().x);let s=r.findIndex(l=>l.id===e.id);if(s<=0)return null;let g=r[s-1];return{id:this.generateEdgeId(),source:g.id,sourceHandle:\"source-right\",target:e.id,targetHandle:\"target-left\"}}return null}isWorkflowAgent(e){return e?e===\"SequentialAgent\"||e===\"ParallelAgent\"||e===\"LoopAgent\":!1}addSubAgent(e,A=\"LlmAgent\",i=!1){let n=this.nodes().find(C=>C.data&&C.data().name===e);if(!n||!n.data)return;let a={name:this.agentBuilderService.getNextSubAgentName(),agent_class:A,model:\"gemini-2.5-flash\",instruction:\"You are a sub-agent that performs specialized tasks.\",isRoot:!1,sub_agents:[],tools:[]},r=this.isWorkflowAgent(n.data().agent_class),s=n.parentId&&n.parentId()&&this.groupNodes().some(C=>C.id===n.parentId()),g,l=null;if(i&&r){let C=n.data();if(!C)return;let I=this.groupNodes().find(b=>b.data&&b.data()?.name===C.name);if(!I){console.error(\"Could not find group for workflow node\");return}let d=this.agentBuilderService.getNode(n.data().name);if(!d){console.error(\"Could not find clicked agent data\");return}let B=d.sub_agents.length,Q=I.height?I.height():this.workflowGroupHeight,E=this.calculateWorkflowChildPosition(B,Q),f=this.createAgentNodeWithGroup(a,E,I.id);g=f.shellNode,l=f.groupNode,d.sub_agents.push(a),l&&this.groupNodes.set([...this.groupNodes(),l]),f.groupEdge&&this.edges.set([...this.edges(),f.groupEdge])}else if(s){let C=n.parentId()??void 0,I=this.groupNodes().find(R=>R.id===C);if(!I||!I.data){console.error(\"Could not find parent group node\");return}let d=I.data().name,B=this.agentBuilderService.getNode(d);if(!B){console.error(\"Could not find workflow parent agent\");return}let Q=B.sub_agents.length,E=I.height?I.height():this.workflowGroupHeight,f=this.calculateWorkflowChildPosition(Q,E),b=this.createAgentNodeWithGroup(a,f,C);g=b.shellNode,l=b.groupNode,B.sub_agents.push(a),l&&this.groupNodes.set([...this.groupNodes(),l]),b.groupEdge&&this.edges.set([...this.edges(),b.groupEdge])}else{let C=n.data().sub_agents.length,I={x:n.point().x+C*400,y:n.point().y+300},d=this.createAgentNodeWithGroup(a,I);g=d.shellNode,l=d.groupNode;let B=this.agentBuilderService.getNode(n.data().name);B&&B.sub_agents.push(a),l&&this.groupNodes.set([...this.groupNodes(),l]),d.groupEdge&&this.edges.set([...this.edges(),d.groupEdge])}if(this.agentBuilderService.addNode(a),this.nodes.set([...this.nodes(),g]),this.selectedAgents=[g],(s||r)&&this.updateGroupDimensions(),r||s){let C=g.parentId?g.parentId()??void 0:void 0,I=this.createWorkflowChildEdge(g,C);I&&this.edges.set([...this.edges(),I])}else{let C={id:this.generateEdgeId(),source:n.id,sourceHandle:\"source-bottom\",target:g.id,targetHandle:\"target-top\"};this.edges.set([...this.edges(),C])}this.agentBuilderService.setSelectedNode(a),this.agentBuilderService.requestSideTabChange(\"config\")}addTool(e){let A=this.nodes().find(o=>o.id===e);if(!A||!A.data)return;let i=A.data();if(!i)return;this.dialog.open(r2,{width:\"500px\"}).afterClosed().subscribe(o=>{if(o)if(o.toolType===\"Agent Tool\")this.createAgentTool(i.name);else{let a={toolType:o.toolType,name:o.name};this.agentBuilderService.addTool(i.name,a),this.agentBuilderService.setSelectedTool(a)}})}addCallback(e){let A=this.nodes().find(o=>o.id===e);if(!A||!A.data)return;let i={name:`callback_${this.callbackId}`,type:\"before_agent\",code:`def callback_function(callback_context):\n    # Add your callback logic here\n    return None`,description:\"Auto-generated callback\"};this.callbackId++;let n=this.agentBuilderService.addCallback(A.data().name,i);n.success||this._snackBar.open(n.error||\"Failed to add callback\",\"Close\",{duration:3e3,panelClass:[\"error-snackbar\"]})}createAgentTool(e){this.dialog.open(Cc,{width:\"750px\",height:\"310px\",data:{title:\"Create Agent Tool\",message:\"Please enter a name for the agent tool:\",confirmButtonText:\"Create\",showInput:!0,inputLabel:\"Agent Tool Name\",inputPlaceholder:\"Enter agent tool name\"}}).afterClosed().subscribe(i=>{i&&typeof i==\"string\"&&this.agentBuilderService.requestNewTab(i,e)})}deleteTool(e,A){let i=A.toolType===\"Agent Tool\",n=i&&A.toolAgentName||A.name;this.dialog.open(Cc,{data:{title:i?\"Delete Agent Tool\":\"Delete Tool\",message:i?`Are you sure you want to delete the agent tool \"${n}\"? This will also delete the corresponding board.`:`Are you sure you want to delete ${n}?`,confirmButtonText:\"Delete\"}}).afterClosed().subscribe(a=>{a===\"confirm\"&&this.deleteToolWithoutDialog(e,A)})}deleteToolWithoutDialog(e,A){if(A.toolType===\"Agent Tool\"){let i=A.toolAgentName||A.name;this.deleteAgentToolAndBoard(e,A,i)}else this.agentBuilderService.deleteTool(e,A)}deleteAgentToolAndBoard(e,A,i){this.agentBuilderService.deleteTool(e,A),this.agentBuilderService.requestTabDeletion(i)}deleteCallback(e,A){this.dialog.open(Cc,{data:{title:\"Delete Callback\",message:`Are you sure you want to delete ${A.name}?`,confirmButtonText:\"Delete\"}}).afterClosed().subscribe(n=>{if(n===\"confirm\"){let o=this.agentBuilderService.deleteCallback(e,A);o.success||this._snackBar.open(o.error||\"Failed to delete callback\",\"Close\",{duration:3e3,panelClass:[\"error-snackbar\"]}),this.cdr.detectChanges()}})}openDeleteSubAgentDialog(e){this.dialog.open(Cc,{data:{title:\"Delete sub agent\",message:`Are you sure you want to delete ${e}? This will also delete all the underlying sub agents and tools.`,confirmButtonText:\"Delete\"}}).afterClosed().subscribe(i=>{i===\"confirm\"&&this.deleteSubAgent(e)})}deleteSubAgent(e){let A=this.agentBuilderService.getNode(e);if(!A)return;let i=this.agentBuilderService.getParentNode(this.agentBuilderService.getRootNode(),A,void 0,this.agentToolBoards());i&&(this.deleteSubAgentHelper(A,i),this.agentBuilderService.getSelectedNode().pipe(qn(1),We(n=>!!n)).subscribe(n=>{this.agentBuilderService.getNodes().includes(n)||this.agentBuilderService.setSelectedNode(i)}))}isNodeInSequentialWorkflow(e){if(!e.parentId||!e.parentId())return!1;let A=e.parentId(),i=this.groupNodes().find(n=>n.id===A);return!i||!i.data?!1:i.data().agent_class===\"SequentialAgent\"}getSequentialSiblings(e){if(!e.parentId||!e.parentId())return{previous:void 0,next:void 0};let A=e.parentId(),i=this.nodes().filter(o=>o.parentId&&o.parentId()===A);i.sort((o,a)=>o.point().x-a.point().x);let n=i.findIndex(o=>o.id===e.id);return n===-1?{previous:void 0,next:void 0}:{previous:n>0?i[n-1]:void 0,next:n<i.length-1?i[n+1]:void 0}}deleteSubAgentHelper(e,A){if(!e)return;for(let n of e.sub_agents)this.deleteSubAgentHelper(n,e);for(let n of e.tools??[])this.deleteToolWithoutDialog(e.name,n);let i=this.nodes().find(n=>n.data&&n.data().name===e.name);if(i){let n=this.isNodeInSequentialWorkflow(i),o,a;if(n){let s=this.getSequentialSiblings(i);o=s.previous,a=s.next}this.nodes.set(this.nodes().filter(s=>s.id!==i.id));let r=this.groupNodes().find(s=>s.data&&s.data().name===e.name);if(r){this.groupNodes.set(this.groupNodes().filter(g=>g.id!==r.id));let s=this.edges().filter(g=>g.target!==i.id&&g.source!==i.id&&g.target!==r.id&&g.source!==r.id);this.edges.set(s)}else{let s=this.edges().filter(g=>g.target!==i.id&&g.source!==i.id);this.edges.set(s)}if(n&&o&&a){let s={id:this.generateEdgeId(),source:o.id,sourceHandle:\"source-right\",target:a.id,targetHandle:\"target-left\"};this.edges.set([...this.edges(),s])}}this.nodePositions.delete(e.name),A.sub_agents=A.sub_agents.filter(n=>n.name!==e.name),this.agentBuilderService.deleteNode(e),i&&i.parentId&&i.parentId()&&this.updateGroupDimensions()}selectTool(e,A){if(e.toolType===\"Agent Tool\"){let i=e.name;this.switchToAgentToolBoard(i);return}if(e.toolType===\"Function tool\"||e.toolType===\"Built-in tool\"){if(A.data){let i=this.agentBuilderService.getNode(A.data().name);i&&this.editTool(e,i)}return}if(A.data){let i=this.agentBuilderService.getNode(A.data().name);i&&this.agentBuilderService.setSelectedNode(i)}this.agentBuilderService.setSelectedTool(e)}editTool(e,A){let i;e.toolType===\"Built-in tool\"?i=this.dialog.open(id,{width:\"700px\",maxWidth:\"90vw\",data:{toolName:e.name,isEditMode:!0,toolArgs:e.args}}):i=this.dialog.open(r2,{width:\"500px\",data:{toolType:e.toolType,toolName:e.name,isEditMode:!0}}),i.afterClosed().subscribe(n=>{if(n&&n.isEditMode){let o=A.tools?.findIndex(a=>a.name===e.name);o!==void 0&&o!==-1&&A.tools&&(A.tools[o].name=n.name,n.args&&(A.tools[o].args=n.args),this.agentBuilderService.setAgentTools(A.name,A.tools))}})}selectCallback(e,A){if(A.data){let i=this.agentBuilderService.getNode(A.data().name);i&&this.agentBuilderService.setSelectedNode(i)}this.agentBuilderService.setSelectedCallback(e)}openToolsTab(e){if(e.data){let A=this.agentBuilderService.getNode(e.data().name);A&&this.agentBuilderService.setSelectedNode(A)}this.agentBuilderService.requestSideTabChange(\"tools\")}saveAgent(e){let A=this.agentBuilderService.getRootNode();if(!A){this._snackBar.open(\"Please create an agent first.\",\"OK\");return}let i=new FormData,n=this.agentToolBoards();zc.generateYamlFile(A,i,e,n),this.agentService.agentBuild(i).subscribe(o=>{o?this.router.navigate([\"/\"],{queryParams:{app:e}}).then(()=>{window.location.reload()}):this._snackBar.open(\"Something went wrong, please try again\",\"OK\")})}isRootAgent(e){let A=this.agentBuilderService.getRootNode();return A?A.name===e:!1}isRootAgentForCurrentTab(e){return this.isAgentToolMode&&this.currentAgentTool()?e===this.currentAgentTool():this.isRootAgent(e)}shouldShowHorizontalHandle(e,A){if(!e.parentId||!e.parentId())return!1;let i=e.parentId(),n=this.groupNodes().find(s=>s.id===i);if(!n||!n.data||n.data().agent_class!==\"SequentialAgent\")return!1;let a=this.nodes().filter(s=>s.parentId&&s.parentId()===i);if(a.length<=1)return!1;a.sort((s,g)=>s.point().x-g.point().x);let r=a.findIndex(s=>s.id===e.id);return A===\"left\"?r>0:r<a.length-1}shouldShowLeftHandle(e){return this.shouldShowHorizontalHandle(e,\"left\")}shouldShowRightHandle(e){return this.shouldShowHorizontalHandle(e,\"right\")}shouldShowBottomHandle(e){let A=e.data?e.data():void 0;return A?!!(this.isWorkflowAgent(A.agent_class)||A.agent_class===\"LlmAgent\"&&A.sub_agents&&A.sub_agents.length>0):!1}shouldShowTopHandle(e){let A=e.data?e.data():void 0,i=A?.name,n=i?this.isRootAgent(i):!1;if(e.type===\"template-group\")return A?.agent_class===\"SequentialAgent\";if(n)return!1;if(e.parentId&&e.parentId()){let a=e.parentId(),r=this.groupNodes().find(s=>s.id===a);if(r&&r.data){let s=r.data().agent_class;if(s===\"LoopAgent\"||s===\"ParallelAgent\")return!0}return!1}return!0}getToolsForNode(e,A){return!e||!A?[]:A.get(e)??[]}loadFromYaml(e,A){try{let i=DB(e);this.agentBuilderService.clear(),this.nodePositions.clear(),this.agentToolBoards.set(new Map),this.agentBuilderService.setAgentToolBoards(new Map),this.currentAgentTool.set(null),this.isAgentToolMode=!1,this.navigationStack=[];let n=Ve(BA({name:i.name||\"root_agent\",agent_class:i.agent_class||\"LlmAgent\",model:i.model||\"gemini-2.5-flash\",instruction:i.instruction||\"\",description:i.description||\"\"},i.max_iterations&&{max_iterations:i.max_iterations}),{isRoot:!0,sub_agents:i.sub_agents||[],tools:this.parseToolsFromYaml(i.tools||[]),callbacks:this.parseCallbacksFromYaml(i)});this.agentBuilderService.addNode(n),this.agentBuilderService.setSelectedNode(n),this.processAgentToolsFromYaml(n.tools||[],A),this.loadAgentBoard(n)}catch(i){console.error(\"Error parsing YAML:\",i)}}parseToolsFromYaml(e){return e.map(A=>{let i={name:A.name,toolType:this.determineToolType(A),toolAgentName:A.name};if(A.name===\"AgentTool\"&&A.args&&A.args.agent&&A.args.agent.config_path){i.toolType=\"Agent Tool\";let o=A.args.agent.config_path.replace(\"./\",\"\").replace(\".yaml\",\"\");i.name=o,i.toolAgentName=o,i.args=A.args}else A.args&&(i.args=A.args);return i})}parseCallbacksFromYaml(e){let A=[];return Object.keys(e).forEach(i=>{if(i.endsWith(\"_callback\")&&Array.isArray(e[i])){let n=i.replace(\"_callback\",\"\");e[i].forEach(o=>{o.name&&A.push({name:o.name,type:n})})}}),A}determineToolType(e){return e.name===\"AgentTool\"&&e.args&&e.args.agent?\"Agent Tool\":e.name&&e.name.includes(\".\")&&e.args?\"Custom tool\":e.name&&e.name.includes(\".\")&&!e.args?\"Function tool\":\"Built-in tool\"}processAgentToolsFromYaml(e,A){let i=e.filter(n=>n.toolType===\"Agent Tool\");for(let n of i)this.agentToolBoards().has(n.name)||this.loadAgentToolConfiguration(n,A)}loadAgentToolConfiguration(e,A){let i=e.name;this.agentService.getSubAgentBuilder(A,`${i}.yaml`).subscribe({next:n=>{if(n)try{let o=DB(n),a=Ve(BA({name:o.name||i,agent_class:o.agent_class||\"LlmAgent\",model:o.model||\"gemini-2.5-flash\",instruction:o.instruction||`You are the ${i} agent that can be used as a tool by other agents.`,description:o.description||\"\"},o.max_iterations&&{max_iterations:o.max_iterations}),{isRoot:!1,sub_agents:o.sub_agents||[],tools:this.parseToolsFromYaml(o.tools||[]),callbacks:this.parseCallbacksFromYaml(o),isAgentTool:!0,skip_summarization:!!e.args?.skip_summarization}),r=this.agentToolBoards();if(r.set(i,a),this.agentToolBoards.set(r),this.agentBuilderService.setAgentToolBoards(r),this.agentBuilderService.addNode(a),this.processAgentToolsFromYaml(a.tools||[],A),a.sub_agents&&a.sub_agents.length>0)for(let s of a.sub_agents)s.config_path&&this.agentService.getSubAgentBuilder(A,s.config_path).subscribe(g=>{if(g){let l=DB(g);this.processAgentToolsFromYaml(this.parseToolsFromYaml(l.tools||[]),A)}})}catch(o){console.error(`Error parsing YAML for agent tool ${i}:`,o),this.createDefaultAgentToolConfiguration(e)}else this.createDefaultAgentToolConfiguration(e)},error:n=>{console.error(`Error loading agent tool configuration for ${i}:`,n),this.createDefaultAgentToolConfiguration(e)}})}createDefaultAgentToolConfiguration(e){let A=e.name,i={name:A,agent_class:\"LlmAgent\",model:\"gemini-2.5-flash\",instruction:`You are the ${A} agent that can be used as a tool by other agents.`,isRoot:!1,sub_agents:[],tools:[],isAgentTool:!0,skip_summarization:!!e.args?.skip_summarization},n=this.agentToolBoards();n.set(A,i),this.agentToolBoards.set(n),this.agentBuilderService.setAgentToolBoards(n),this.agentBuilderService.addNode(i)}loadAgentTools(e){e.tools?(e.tools=e.tools.filter(A=>A.name&&A.name.trim()!==\"\"),e.tools.forEach(A=>{A.toolType!==\"Agent Tool\"&&(A.name.includes(\".\")&&A.args?A.toolType=\"Custom tool\":A.name.includes(\".\")&&!A.args?A.toolType=\"Function tool\":A.toolType=\"Built-in tool\")})):e.tools=[]}isNodeSelected(e){return this.selectedAgents.includes(e)}isGroupSelected(e){if(!e.data)return!1;let A=e.data().name,i=this.nodes().find(n=>n.data&&n.data().name===A);return i?this.isNodeSelected(i):!1}loadSubAgents(e,A){return ct(this,null,function*(){let i=[{node:A,depth:1,index:1,parentShellId:void 0,parentAgent:void 0,parentGroupId:void 0}],n=[],o=[],a=[];for(;i.length>0;){let{node:r,depth:s,index:g,parentShellId:l,parentAgent:C,parentGroupId:I}=i.shift(),d=r;if(r.config_path)try{let M=yield tL(this.agentService.getSubAgentBuilder(e,r.config_path));d=DB(M),d.tools&&(d.tools=this.parseToolsFromYaml(d.tools||[])),this.processAgentToolsFromYaml(d.tools||[],e)}catch(M){console.error(`Failed to load agent from ${r.config_path}`,M);continue}if(C&&C.sub_agents){let M=C.sub_agents.indexOf(r);M!==-1&&(C.sub_agents[M]=d,this.agentBuilderService.addNode(C))}this.agentBuilderService.addNode(d);let B=this.nodePositions.get(d.name),Q=this.isWorkflowAgent(d.agent_class),E=C?this.isWorkflowAgent(C.agent_class):!1,f,b,R=null;if(E&&!d.isRoot){let M=C?.sub_agents.indexOf(d)??g,v=o.find(U=>U.id===I),F=v?.height?v.height():this.workflowGroupHeight;f=B??this.calculateWorkflowChildPosition(M,F);let G=this.createAgentNodeWithGroup(d,f,I??void 0,o,n);b=G.shellNode,R=G.groupNode,n.push(b),R&&o.push(R),G.groupEdge&&a.push(G.groupEdge)}else{if(B)f=B;else if(!l)f={x:100,y:150};else{let v=n.find(F=>F.id===l);v?f={x:v.point().x+(g-1)*400,y:v.point().y+300}:f={x:100,y:s*150+50}}let M=this.createAgentNodeWithGroup(d,f,void 0,o,n);b=M.shellNode,R=M.groupNode,n.push(b),Q&&!d.isRoot&&(R&&o.push(R),M.groupEdge&&a.push(M.groupEdge))}if(l)if(I){let M=this.createWorkflowChildEdgeFromArrays(b,I,n,o);M&&a.push(M)}else{let M={id:this.generateEdgeId(),source:l,sourceHandle:\"source-bottom\",target:b.id,targetHandle:\"target-top\"};a.push(M)}if(d.sub_agents&&d.sub_agents.length>0){let M=1,v=Q&&R?R.id:I;for(let F of d.sub_agents)i.push({node:F,parentShellId:b.id,depth:s+1,index:M,parentAgent:d,parentGroupId:v}),M++}}this.nodes.set(n),this.groupNodes.set(o),this.edges.set(a),this.updateGroupDimensions()})}switchToAgentToolBoard(e,A){let i=this.currentAgentTool()||\"main\";i!==e&&this.navigationStack.push(i);let n=this.agentToolBoards(),o=n.get(e);if(!o){o={isRoot:!1,name:e,agent_class:\"LlmAgent\",model:\"gemini-2.5-flash\",instruction:`You are the ${e} agent that can be used as a tool by other agents.`,sub_agents:[],tools:[],isAgentTool:!0,skip_summarization:!1};let a=new Map(n);a.set(e,o),this.agentToolBoards.set(a),this.agentBuilderService.setAgentToolBoards(a),A?this.addAgentToolToAgent(e,A):this.addAgentToolToRoot(e)}this.currentAgentTool.set(e),this.isAgentToolMode=!0,this.loadAgentBoard(o),this.agentBuilderService.setSelectedNode(o),this.agentBuilderService.requestSideTabChange(\"config\")}backToMainCanvas(){if(this.navigationStack.length>0){let e=this.navigationStack.pop();if(e===\"main\"){this.currentAgentTool.set(null),this.isAgentToolMode=!1;let A=this.agentBuilderService.getRootNode();A&&(this.loadAgentBoard(A),this.agentBuilderService.setSelectedNode(A),this.agentBuilderService.requestSideTabChange(\"config\"))}else{let i=this.agentToolBoards().get(e);i&&(this.currentAgentTool.set(e),this.isAgentToolMode=!0,this.loadAgentBoard(i),this.agentBuilderService.setSelectedNode(i),this.agentBuilderService.requestSideTabChange(\"config\"))}}else{this.currentAgentTool.set(null),this.isAgentToolMode=!1;let e=this.agentBuilderService.getRootNode();e&&(this.loadAgentBoard(e),this.agentBuilderService.setSelectedNode(e),this.agentBuilderService.requestSideTabChange(\"config\"))}}loadAgentBoard(e){return ct(this,null,function*(){if(this.captureCurrentNodePositions(),this.nodes.set([]),this.groupNodes.set([]),this.edges.set([]),this.nodeId=0,this.edgeId=0,this.loadAgentTools(e),this.agentBuilderService.addNode(e),e.tools&&e.tools.length>0?this.agentBuilderService.setAgentTools(e.name,e.tools):this.agentBuilderService.setAgentTools(e.name,[]),e.sub_agents&&e.sub_agents.length>0)yield this.loadSubAgents(this.appName,e);else{let A=this.nodePositions.get(e.name)??{x:100,y:150},i=this.createNode(e,A);if(this.nodes.set([i]),this.isWorkflowAgent(e.agent_class)){let{groupNode:n,edge:o}=this.createWorkflowGroup(e,i,A);this.groupNodes.set([n]),o&&this.edges.set([o])}}this.agentBuilderService.setSelectedNode(e)})}addAgentToolToAgent(e,A){let i=this.agentBuilderService.getNode(A);if(i){if(i.tools&&i.tools.some(o=>o.name===e))return;let n={name:e,toolType:\"Agent Tool\",toolAgentName:e};i.tools||(i.tools=[]),i.tools.push(n),i.tools=i.tools.filter(o=>o.name&&o.name.trim()!==\"\"),this.agentBuilderService.setAgentTools(A,i.tools)}}addAgentToolToRoot(e){let A=this.agentBuilderService.getRootNode();if(A){if(A.tools&&A.tools.some(n=>n.name===e))return;let i={name:e,toolType:\"Agent Tool\",toolAgentName:e};A.tools||(A.tools=[]),A.tools.push(i),this.agentBuilderService.setAgentTools(\"root_agent\",A.tools)}}deleteAgentToolBoard(e){let A=this.agentToolBoards(),i=new Map(A);i.delete(e),this.agentToolBoards.set(i),this.agentBuilderService.setAgentToolBoards(i);let n=this.agentBuilderService.getNodes();for(let o of n)o.tools&&(o.tools=o.tools.filter(a=>!(a.toolType===\"Agent Tool\"&&(a.toolAgentName===e||a.name===e))),this.agentBuilderService.setAgentTools(o.name,o.tools));this.navigationStack=this.navigationStack.filter(o=>o!==e),this.currentAgentTool()===e&&this.backToMainCanvas()}getBackButtonTooltip(){if(this.navigationStack.length>0){let e=this.navigationStack[this.navigationStack.length-1];return e===\"main\"?\"Back to Main Canvas\":`Back to ${e}`}return\"Back to Main Canvas\"}onBuilderAssistantClose(){this.builderAssistantCloseRequest.emit()}reloadCanvasFromYaml(){this.appNameInput&&this.agentService.getAgentBuilderTmp(this.appNameInput).subscribe({next:e=>{e&&this.loadFromYaml(e,this.appNameInput)},error:e=>{console.error(\"Error reloading canvas:\",e)}})}captureCurrentNodePositions(){for(let e of this.nodes()){if(!e?.data)continue;let A=e.data();A&&this.nodePositions.set(A.name,BA({},e.point()))}}updateGroupDimensions(){for(let s of this.groupNodes()){if(!s.data)continue;let g=s.data().name,l=this.nodes().filter(f=>f.parentId&&f.parentId()===s.id);if(l.length===0){s.width&&s.width.set(480),s.height&&s.height.set(220);continue}l.sort((f,b)=>f.point().x-b.point().x),l.forEach((f,b)=>{let G={x:45+b*428,y:80};if(f.point.set(G),f.data){let U=f.data();U&&this.nodePositions.set(U.name,G)}});let C=1/0,I=1/0,d=-1/0,B=-1/0;for(let f of l){let b=f.point(),R=f.data?f.data():void 0,M=120;R&&R.tools&&R.tools.length>0&&(M+=20+R.tools.length*36),C=Math.min(C,b.x),I=Math.min(I,b.y),d=Math.max(d,b.x+340+68),B=Math.max(B,b.y+M)}let Q=d-C+80,E=B-I+80;s.width&&s.width.set(Math.max(480,Q)),s.height&&s.height.set(Math.max(220,E))}}getToolIcon(e){return vB(e.name,e.toolType)}getAgentIcon(e){switch(e){case\"SequentialAgent\":return\"more_horiz\";case\"LoopAgent\":return\"sync\";case\"ParallelAgent\":return\"density_medium\";default:return\"psychology\"}}isGroupEmpty(e){return!this.nodes().some(i=>i.parentId&&i.parentId()===e)}shouldShowAddButton(e){let A=e.data?e.data():void 0;if(!A)return!1;let i=this.isWorkflowAgent(A.agent_class),n=e.parentId&&e.parentId();if(i&&!n||!this.isNodeSelected(e))return!1;if(n&&e.parentId){let o=e.parentId(),a=this.nodes().filter(s=>s.parentId&&s.parentId()===o);if(a.length===0)return!0;let r=a.reduce((s,g)=>g.point().x>s.point().x?g:s,a[0]);return e.id===r.id}return!0}static \\u0275fac=function(A){return new(A||t)(lt(Qs),lt(DE),lt(qr))};static \\u0275cmp=kA({type:t,selectors:[[\"app-canvas\"]],viewQuery:function(A,i){if(A&1&&ni(ZMA,5)(XMA,5),A&2){let n;Ce(n=Ie())&&(i.canvasRef=n.first),Ce(n=Ie())&&(i.svgCanvasRef=n.first)}},inputs:{showSidePanel:\"showSidePanel\",showBuilderAssistant:\"showBuilderAssistant\",appNameInput:\"appNameInput\"},outputs:{toggleSidePanelRequest:\"toggleSidePanelRequest\",builderAssistantCloseRequest:\"builderAssistantCloseRequest\"},features:[ei],decls:7,vars:8,consts:[[\"emptyGroupMenuTrigger\",\"matMenuTrigger\"],[\"emptyGroupMenu\",\"matMenu\"],[\"agentMenuTrigger\",\"matMenuTrigger\"],[\"agentMenu\",\"matMenu\"],[1,\"canvas-container\"],[1,\"canvas-workspace\",3,\"click\"],[1,\"agent-tool-banner\"],[\"matTooltip\",\"Open panel\",1,\"material-symbols-outlined\",\"open-panel-btn\"],[\"view\",\"auto\",3,\"nodes\",\"edges\",\"background\",\"snapGrid\"],[1,\"canvas-instructions\"],[3,\"closePanel\",\"reloadCanvas\",\"isVisible\",\"appName\"],[1,\"banner-content\"],[\"mat-icon-button\",\"\",1,\"back-to-main-btn\",3,\"click\",\"matTooltip\"],[1,\"banner-info\"],[1,\"material-symbols-outlined\",\"banner-icon\"],[1,\"banner-text\"],[1,\"agent-tool-name\"],[1,\"banner-subtitle\"],[\"matTooltip\",\"Open panel\",1,\"material-symbols-outlined\",\"open-panel-btn\",3,\"click\"],[\"groupNode\",\"\"],[\"nodeHtml\",\"\"],[\"selectable\",\"\",\"rx\",\"12\",\"ry\",\"12\",3,\"click\",\"pointerdown\"],[\"x\",\"12\",\"y\",\"12\"],[1,\"workflow-group-chip\"],[1,\"workflow-chip-icon\"],[1,\"workflow-chip-label\"],[\"type\",\"target\",\"position\",\"top\",\"id\",\"target-top\"],[1,\"empty-group-placeholder\",3,\"click\"],[\"mat-icon-button\",\"\",\"matTooltip\",\"Add sub-agent\",\"aria-label\",\"Add sub-agent\",3,\"click\",\"matMenuTriggerFor\"],[1,\"empty-group-label\"],[\"mat-menu-item\",\"\",3,\"click\"],[\"selectable\",\"\",1,\"custom-node\",3,\"click\",\"pointerdown\"],[1,\"node-title-wrapper\"],[1,\"node-title\"],[2,\"margin-right\",\"5px\"],[1,\"node-badge\"],[1,\"action-button-bar\"],[\"matIconButton\",\"\",\"matTooltip\",\"Delete sub-agent\",\"aria-label\",\"Delete sub-agent\",1,\"action-btn\",\"delete-subagent-btn\"],[1,\"tools-container\"],[1,\"add-subagent-container\"],[\"type\",\"target\",\"position\",\"left\",\"id\",\"target-left\"],[\"type\",\"source\",\"position\",\"right\",\"id\",\"source-right\"],[\"type\",\"source\",\"position\",\"bottom\",\"id\",\"source-bottom\"],[\"matIconButton\",\"\",\"matTooltip\",\"Delete sub-agent\",\"aria-label\",\"Delete sub-agent\",1,\"action-btn\",\"delete-subagent-btn\",3,\"click\"],[1,\"tools-list\"],[1,\"tool-item\"],[1,\"tool-item\",3,\"click\"],[1,\"tool-item-icon\"],[1,\"tool-item-name\"],[\"matIconButton\",\"\",\"matTooltip\",\"Add sub-agent\",\"aria-label\",\"Add sub-agent\",1,\"add-subagent-btn\",3,\"click\",\"matMenuTriggerFor\"],[1,\"add-subagent-symbol\"],[1,\"instruction-content\"],[1,\"instruction-icon\"],[1,\"instruction-tips\"],[1,\"tip\"]],template:function(A,i){A&1&&(m(0,\"div\",4)(1,\"div\",5),$(\"click\",function(o){return i.onCanvasClick(o)}),V(2,tkA,13,2,\"div\",6),V(3,ikA,2,0,\"span\",7),V(4,EkA,3,6,\"vflow\",8),V(5,hkA,19,0,\"div\",9),D(),m(6,\"app-builder-assistant\",10),$(\"closePanel\",function(){return i.onBuilderAssistantClose()})(\"reloadCanvas\",function(){return i.reloadCanvasFromYaml()}),D()()),A&2&&(p(),ae(\"has-banner\",i.currentAgentTool()),p(),W(i.currentAgentTool()?2:-1),p(),W(i.showSidePanel?-1:3),p(),W(i.vflowNodes().length>0?4:-1),p(),W(i.vflowNodes().length===0?5:-1),p(),X(\"isVisible\",i.showBuilderAssistant)(\"appName\",i.appName))},dependencies:[$eA,tF,AtA,zw,Pw,In,Ba,E0,DC,fE,cw,Pr],styles:['[_nghost-%COMP%]{width:100%;height:100%;display:flex;flex-direction:column;flex:1;min-height:0}.canvas-container[_ngcontent-%COMP%]{width:100%;height:100%;background:var(--builder-canvas-container-background);display:flex;flex-direction:column;border-radius:8px;overflow:hidden;box-shadow:var(--builder-canvas-shadow);flex:1;min-height:0;position:relative}.canvas-header[_ngcontent-%COMP%]{background:var(--builder-canvas-header-background);padding:16px 24px;border-bottom:2px solid var(--builder-border-color);display:flex;justify-content:space-between;align-items:center}.canvas-header[_ngcontent-%COMP%]   h3[_ngcontent-%COMP%]{margin:0;color:var(--builder-text-primary-color);font-size:18px;font-weight:600;font-family:Google Sans,Helvetica Neue,sans-serif;background:var(--builder-canvas-header-title-gradient);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text}.canvas-controls[_ngcontent-%COMP%]{display:flex;gap:8px}.canvas-controls[_ngcontent-%COMP%]   button[_ngcontent-%COMP%]{background:var(--builder-button-background-color);border:1px solid var(--builder-button-border-color);color:var(--builder-button-text-color);transition:all .3s ease}.canvas-controls[_ngcontent-%COMP%]   button[_ngcontent-%COMP%]:hover{background:var(--builder-button-hover-background-color);border-color:var(--builder-button-hover-border-color);transform:translateY(-1px)}.canvas-workspace[_ngcontent-%COMP%]{flex:1;position:relative;overflow:hidden;background-color:var(--builder-canvas-workspace-background);min-height:0;width:100%;height:100%}.agent-tool-banner[_ngcontent-%COMP%]{position:absolute;top:0;left:0;right:0;z-index:1000;background:linear-gradient(135deg,#1e3a8a,#3b82f6);border-bottom:2px solid rgba(59,130,246,.3);box-shadow:0 4px 16px #0000004d}.agent-tool-banner[_ngcontent-%COMP%]   .banner-content[_ngcontent-%COMP%]{padding:12px 20px;display:flex;align-items:center;gap:16px}.agent-tool-banner[_ngcontent-%COMP%]   .banner-content[_ngcontent-%COMP%]   .back-to-main-btn[_ngcontent-%COMP%]{background:#ffffff1a;color:#fff;border:1px solid rgba(255,255,255,.2);transition:all .2s ease}.agent-tool-banner[_ngcontent-%COMP%]   .banner-content[_ngcontent-%COMP%]   .back-to-main-btn[_ngcontent-%COMP%]:hover{background:#fff3;transform:scale(1.05)}.agent-tool-banner[_ngcontent-%COMP%]   .banner-content[_ngcontent-%COMP%]   .back-to-main-btn[_ngcontent-%COMP%]   mat-icon[_ngcontent-%COMP%]{font-size:20px;width:20px;height:20px}.agent-tool-banner[_ngcontent-%COMP%]   .banner-content[_ngcontent-%COMP%]   .banner-info[_ngcontent-%COMP%]{display:flex;align-items:center;gap:12px;flex:1}.agent-tool-banner[_ngcontent-%COMP%]   .banner-content[_ngcontent-%COMP%]   .banner-info[_ngcontent-%COMP%]   .banner-icon[_ngcontent-%COMP%]{font-size:28px;width:28px;height:28px;color:#ffffffe6}.agent-tool-banner[_ngcontent-%COMP%]   .banner-content[_ngcontent-%COMP%]   .banner-info[_ngcontent-%COMP%]   .banner-text[_ngcontent-%COMP%]   .agent-tool-name[_ngcontent-%COMP%]{margin:0;color:#fff;font-size:18px;font-weight:600;font-family:Google Sans,Helvetica Neue,sans-serif;line-height:1.2}.agent-tool-banner[_ngcontent-%COMP%]   .banner-content[_ngcontent-%COMP%]   .banner-info[_ngcontent-%COMP%]   .banner-text[_ngcontent-%COMP%]   .banner-subtitle[_ngcontent-%COMP%]{margin:0;color:#fffc;font-size:12px;font-weight:400;line-height:1}.canvas-workspace[_ngcontent-%COMP%]:has(.agent-tool-banner)   vflow[_ngcontent-%COMP%]{padding-top:68px}.canvas-workspace.has-banner[_ngcontent-%COMP%]     vflow{padding-top:68px!important}  vflow{width:100%!important;height:100%!important;display:block!important}  vflow .root-svg{background-color:var(--builder-canvas-workspace-background)!important;color:var(--builder-text-primary-color)!important;width:100%!important;height:100%!important;min-width:100%!important;min-height:100%!important}.diagram-canvas[_ngcontent-%COMP%]{display:block;width:100%;height:100%;cursor:crosshair;transition:cursor .2s ease;object-fit:contain;image-rendering:pixelated}.diagram-canvas[_ngcontent-%COMP%]:active{cursor:grabbing}.canvas-instructions[_ngcontent-%COMP%]{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);text-align:center;pointer-events:none;z-index:1}.instruction-content[_ngcontent-%COMP%]{background:var(--builder-canvas-instruction-background);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);border:2px solid var(--builder-canvas-instruction-border);border-radius:16px;padding:32px;box-shadow:var(--builder-canvas-shadow)}.instruction-content[_ngcontent-%COMP%]   .instruction-icon[_ngcontent-%COMP%]{font-size:48px;width:48px;height:48px;color:var(--builder-button-text-color);margin-bottom:16px;animation:_ngcontent-%COMP%_pulse 2s infinite}.instruction-content[_ngcontent-%COMP%]   h4[_ngcontent-%COMP%]{color:var(--builder-text-primary-color);font-size:20px;font-weight:600;margin:0 0 12px;font-family:Google Sans,Helvetica Neue,sans-serif}.instruction-content[_ngcontent-%COMP%]   p[_ngcontent-%COMP%]{color:var(--builder-text-secondary-color);font-size:14px;margin:0 0 24px;line-height:1.5}.instruction-tips[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:12px;align-items:flex-start}.tip[_ngcontent-%COMP%]{display:flex;align-items:center;gap:12px;color:var(--builder-accent-color);font-size:13px}.tip[_ngcontent-%COMP%]   mat-icon[_ngcontent-%COMP%]{font-size:18px;width:18px;height:18px}.connection-mode-indicator[_ngcontent-%COMP%]{position:absolute;top:20px;left:50%;transform:translate(-50%);z-index:10;animation:_ngcontent-%COMP%_slideDown .3s ease-out}.connection-indicator-content[_ngcontent-%COMP%]{background:linear-gradient(135deg,#1b73e8,#4285f4);color:#fff;padding:12px 20px;border-radius:24px;display:flex;align-items:center;gap:12px;box-shadow:0 4px 16px #1b73e866;border:1px solid rgba(255,255,255,.2)}.connection-indicator-content[_ngcontent-%COMP%]   .connection-icon[_ngcontent-%COMP%]{font-size:20px;width:20px;height:20px;animation:_ngcontent-%COMP%_pulse 1.5s infinite}.connection-indicator-content[_ngcontent-%COMP%]   span[_ngcontent-%COMP%]{font-size:14px;font-weight:500;white-space:nowrap}.connection-indicator-content[_ngcontent-%COMP%]   button[_ngcontent-%COMP%]{background:#fff3;color:#fff;border:1px solid rgba(255,255,255,.3);width:32px;height:32px;min-width:32px}.connection-indicator-content[_ngcontent-%COMP%]   button[_ngcontent-%COMP%]:hover{background:#ffffff4d;transform:scale(1.1)}.connection-indicator-content[_ngcontent-%COMP%]   button[_ngcontent-%COMP%]   mat-icon[_ngcontent-%COMP%]{font-size:18px;width:18px;height:18px}@keyframes _ngcontent-%COMP%_slideDown{0%{opacity:0;transform:translate(-50%) translateY(-20px)}to{opacity:1;transform:translate(-50%) translateY(0)}}.canvas-footer[_ngcontent-%COMP%]{background:var(--builder-canvas-header-background);padding:12px 24px;border-top:1px solid var(--builder-border-color);display:flex;justify-content:space-between;align-items:center}.node-count[_ngcontent-%COMP%], .connection-count[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;color:var(--builder-text-secondary-color);font-size:13px;font-weight:500}.node-count[_ngcontent-%COMP%]   mat-icon[_ngcontent-%COMP%], .connection-count[_ngcontent-%COMP%]   mat-icon[_ngcontent-%COMP%]{font-size:16px;width:16px;height:16px;color:var(--builder-accent-color)}@keyframes _ngcontent-%COMP%_pulse{0%,to{opacity:1;transform:scale(1)}50%{opacity:.7;transform:scale(1.05)}}.canvas-workspace.drag-over[_ngcontent-%COMP%]{background:radial-gradient(circle at 20% 50%,rgba(66,133,244,.1) 0%,transparent 50%),radial-gradient(circle at 80% 20%,rgba(52,168,83,.1) 0%,transparent 50%),radial-gradient(circle at 40% 80%,rgba(251,188,4,.1) 0%,transparent 50%),#131314}.canvas-workspace.drag-over[_ngcontent-%COMP%]:before{content:\"\";position:absolute;inset:0;border:2px dashed #00bbea;border-radius:8px;margin:16px;animation:_ngcontent-%COMP%_dashMove 1s linear infinite}@keyframes _ngcontent-%COMP%_dashMove{0%{border-color:#8ab4f84d}50%{border-color:#8ab4f8cc}to{border-color:#8ab4f84d}}@media(max-width:768px){.canvas-header[_ngcontent-%COMP%]{padding:12px 16px}.canvas-header[_ngcontent-%COMP%]   h3[_ngcontent-%COMP%]{font-size:16px}.instruction-content[_ngcontent-%COMP%]{padding:24px;margin:16px}.instruction-content[_ngcontent-%COMP%]   .instruction-icon[_ngcontent-%COMP%]{font-size:36px;width:36px;height:36px}.instruction-content[_ngcontent-%COMP%]   h4[_ngcontent-%COMP%]{font-size:18px}.canvas-footer[_ngcontent-%COMP%]{padding:8px 16px;flex-direction:column;gap:8px}}.custom-node[_ngcontent-%COMP%]{width:340px;background:var(--builder-canvas-node-background);border:1px solid var(--builder-canvas-node-border);border-radius:8px;align-items:center;position:relative;max-height:none;padding-bottom:0;overflow:visible}.custom-node[_ngcontent-%COMP%]:hover{border-color:var(--builder-canvas-node-hover-border)}.custom-node_selected[_ngcontent-%COMP%]{border:2px solid;border-color:var(--builder-accent-color)}.custom-node_selected[_ngcontent-%COMP%]   mat-chip[_ngcontent-%COMP%]{--mdc-chip-outline-color: var(--builder-canvas-node-chip-outline)}.custom-node_selected[_ngcontent-%COMP%]:hover{border-color:var(--builder-accent-color)}[_nghost-%COMP%]     .default-group-node{background-color:var(--builder-canvas-group-background)!important;border:2px solid var(--builder-canvas-group-border)!important}.node-title-wrapper[_ngcontent-%COMP%]{padding-top:12px;padding-bottom:12px;border-radius:8px 8px 0 0;display:flex;justify-content:space-between;align-items:center}.node-title[_ngcontent-%COMP%]{padding-left:12px;padding-right:12px;display:flex;align-items:center;color:var(--builder-text-primary-color);font-weight:500}.node-badge[_ngcontent-%COMP%]{margin-left:8px;padding:2px 6px;border-radius:999px;background:var(--builder-canvas-node-badge-background);color:var(--builder-accent-color);font-size:11px;font-weight:600;letter-spacing:.04em;text-transform:uppercase}.tools-container[_ngcontent-%COMP%]{padding:8px 12px;border-top:1px solid var(--builder-border-color)}.tools-list[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:4px}.tool-item[_ngcontent-%COMP%]{display:flex;align-items:center;gap:10px;padding:8px 10px;border-radius:4px;cursor:pointer;transition:background-color .2s ease;color:var(--builder-text-primary-color)}.tool-item[_ngcontent-%COMP%]:hover{background-color:var(--builder-item-hover-color)}.tool-item[_ngcontent-%COMP%]   .tool-item-icon[_ngcontent-%COMP%]{font-size:22px;width:22px;height:22px;color:var(--builder-text-primary-color);flex-shrink:0}.tool-item[_ngcontent-%COMP%]   .tool-item-name[_ngcontent-%COMP%]{font-family:Google Sans,sans-serif;font-size:15px;font-weight:400;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tool-item.more-tools[_ngcontent-%COMP%]{color:var(--builder-text-secondary-color);font-style:italic}.tool-item.more-tools[_ngcontent-%COMP%]   .tool-item-icon[_ngcontent-%COMP%]{color:var(--builder-text-secondary-color)}.custom-node_selected[_ngcontent-%COMP%]   .node-title-wrapper[_ngcontent-%COMP%]{border-bottom-color:var(--builder-canvas-node-chip-outline)}.custom-node_selected[_ngcontent-%COMP%]   .node-title-wrapper[_ngcontent-%COMP%]   .node-title[_ngcontent-%COMP%]{color:var(--builder-accent-color)}.tools-header[_ngcontent-%COMP%]{font-family:Google Sans;color:var(--builder-text-muted-color);margin-bottom:10px;font-size:14px;font-weight:500;display:flex;align-items:center;justify-content:space-between}.callbacks-container[_ngcontent-%COMP%]{padding:12px 6px 12px 12px}.callbacks-header[_ngcontent-%COMP%]{font-family:Google Sans;color:var(--builder-text-muted-color);margin-bottom:10px;font-size:14px;font-weight:500;display:flex;align-items:center;justify-content:space-between}.callback-type[_ngcontent-%COMP%]{font-size:11px;background:var(--builder-chip-background-color);color:var(--builder-accent-color);padding:2px 6px;border-radius:4px;margin-left:4px;font-weight:500}.add-callback-btn[_ngcontent-%COMP%]{background:none;border:none;cursor:pointer;border-radius:4px;width:28px;height:28px;padding:0}.add-callback-btn[_ngcontent-%COMP%]   mat-icon[_ngcontent-%COMP%]{margin:0;font-size:18px;width:18px;height:18px}.add-callback-btn[_ngcontent-%COMP%]:hover{color:var(--builder-text-primary-color);background-color:var(--builder-item-hover-color);transform:scale(1.1)}.instruction-title[_ngcontent-%COMP%]{font-family:Google Sans;color:var(--builder-text-muted-color);margin-bottom:10px}.instructions[_ngcontent-%COMP%]{font-family:Google Sans;margin-bottom:10px}.agent-resources[_ngcontent-%COMP%]{padding:8px 12px}.empty-resource[_ngcontent-%COMP%]{margin-top:8px;color:var(--builder-text-secondary-color);margin-bottom:8px;display:flex;font-size:13px}.empty-resource[_ngcontent-%COMP%]   button[_ngcontent-%COMP%]{display:none}.action-button-bar[_ngcontent-%COMP%]{display:flex;gap:8px;margin-right:4px}.action-button-bar[_ngcontent-%COMP%]   .action-btn[_ngcontent-%COMP%]{background:none;color:var(--builder-text-secondary-color);border:none;width:32px;height:32px;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:all .2s ease;pointer-events:auto;border-radius:4px}.action-button-bar[_ngcontent-%COMP%]   .action-btn[_ngcontent-%COMP%]:hover{color:var(--builder-text-primary-color);background-color:var(--builder-item-hover-color);transform:scale(1.1)}.action-button-bar[_ngcontent-%COMP%]   .action-btn[_ngcontent-%COMP%]   mat-icon[_ngcontent-%COMP%]{font-size:20px;width:20px;height:20px}.action-button-bar[_ngcontent-%COMP%]   .delete-subagent-btn[_ngcontent-%COMP%]:hover{color:var(--builder-text-primary-color)}.add-tool-btn[_ngcontent-%COMP%]{background:none;border:none;cursor:pointer;border-radius:4px;width:28px;height:28px;padding:0}.add-tool-btn[_ngcontent-%COMP%]   mat-icon[_ngcontent-%COMP%]{margin:0;font-size:18px;width:18px;height:18px}.add-tool-btn[_ngcontent-%COMP%]:hover{color:var(--builder-text-primary-color);background-color:var(--builder-item-hover-color);transform:scale(1.1)}.add-subagent-container[_ngcontent-%COMP%]{position:absolute;left:50%;bottom:-68px;transform:translate(-50%);display:flex;justify-content:center;pointer-events:none}.custom-node.in-group[_ngcontent-%COMP%]   .add-subagent-container[_ngcontent-%COMP%]{left:auto;right:-68px;bottom:50%;transform:translateY(50%)}.add-subagent-container[_ngcontent-%COMP%]   .add-subagent-btn[_ngcontent-%COMP%]{width:48px;height:48px;border-radius:50%;border:2px solid var(--builder-accent-color);background:var(--builder-canvas-add-btn-background);color:var(--builder-accent-color);display:flex;align-items:center;justify-content:center;padding:0;box-sizing:border-box;transition:transform .2s ease,box-shadow .2s ease,background .2s ease;pointer-events:auto}.add-subagent-container[_ngcontent-%COMP%]   .add-subagent-btn[_ngcontent-%COMP%]   .add-subagent-symbol[_ngcontent-%COMP%]{font-size:28px;line-height:1;font-weight:400}.add-subagent-container[_ngcontent-%COMP%]   .add-subagent-btn[_ngcontent-%COMP%]:hover{transform:scale(1.05);box-shadow:var(--builder-canvas-add-btn-shadow);background:var(--builder-canvas-add-btn-hover-background)}.add-subagent-container[_ngcontent-%COMP%]   .add-subagent-btn[_ngcontent-%COMP%]:focus-visible{outline:none;box-shadow:var(--builder-canvas-add-btn-shadow)}.open-panel-btn[_ngcontent-%COMP%]{position:absolute;width:24px;height:24px;color:var(--builder-text-tertiary-color);cursor:pointer;margin-left:20px;margin-top:20px;z-index:9999}.custom-node[_ngcontent-%COMP%]:hover   .action-button-bar[_ngcontent-%COMP%], .custom-node.custom-node_selected[_ngcontent-%COMP%]   .action-button-bar[_ngcontent-%COMP%]{opacity:1;pointer-events:auto}[_nghost-%COMP%]     div[nodehandlescontroller][noderesizecontroller].wrapper{height:0px!important;overflow:visible!important}[_nghost-%COMP%]     foreignObject.selectable, [_nghost-%COMP%]     foreignObject.selectable>div{overflow:visible!important}[_nghost-%COMP%]     .interactive-edge{stroke:var(--builder-accent-color)!important;stroke-width:2!important}[_nghost-%COMP%]     .default-handle{stroke:var(--builder-accent-color)!important;stroke-width:1!important;fill:var(--builder-canvas-handle-fill)!important}[_nghost-%COMP%]     .reconnect-handle{stroke:var(--builder-accent-color)!important;stroke-width:2!important;fill:var(--builder-canvas-reconnect-handle-fill)!important}[_nghost-%COMP%]     .workflow-group-chip{display:inline-flex;align-items:center;gap:6px;padding:6px 12px;background:var(--builder-canvas-workflow-chip-background);border:1px solid var(--builder-canvas-workflow-chip-border);border-radius:16px;color:var(--builder-accent-color);font-family:Google Sans,sans-serif;font-size:12px;font-weight:500;height:32px;box-sizing:border-box;white-space:nowrap;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px)}[_nghost-%COMP%]     .workflow-group-chip .workflow-chip-icon{font-size:16px;width:16px;height:16px;line-height:16px}[_nghost-%COMP%]     .workflow-group-chip .workflow-chip-label{color:var(--builder-text-primary-color);font-weight:500;font-size:12px;line-height:1}[_nghost-%COMP%]     .empty-group-placeholder{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;padding:16px;border-radius:8px;text-align:center;background:var(--builder-canvas-empty-group-background);border:2px dashed var(--builder-canvas-empty-group-border);transition:all .3s ease}[_nghost-%COMP%]     .empty-group-placeholder:hover{background:var(--builder-canvas-empty-group-hover-background);border-color:var(--builder-canvas-empty-group-hover-border)}[_nghost-%COMP%]     .empty-group-placeholder button{border:2px solid var(--builder-accent-color);background-color:var(--builder-canvas-empty-group-btn-background);color:var(--builder-accent-color);width:40px;height:40px;display:inline-flex;align-items:center;justify-content:center;border-radius:50%;transition:all .2s ease}[_nghost-%COMP%]     .empty-group-placeholder button:hover{background-color:var(--builder-canvas-empty-group-btn-hover-background);transform:scale(1.1);box-shadow:var(--builder-canvas-add-btn-shadow)}[_nghost-%COMP%]     .empty-group-placeholder button mat-icon{font-size:24px;width:24px;height:24px}[_nghost-%COMP%]     .empty-group-placeholder .empty-group-label{font-size:13px;font-weight:500;color:var(--builder-text-secondary-color);font-family:Google Sans,sans-serif}']})};function ukA(t,e){t&1&&Ni(0,\"div\",2)}var fkA=new wA(\"MAT_PROGRESS_BAR_DEFAULT_OPTIONS\");var ey=(()=>{class t{_elementRef=h(ge);_ngZone=h(Oe);_changeDetectorRef=h(ft);_renderer=h(ui);_cleanupTransitionEnd;constructor(){let A=Eh(),i=h(fkA,{optional:!0});this._isNoopAnimation=A===\"di-disabled\",A===\"reduced-motion\"&&this._elementRef.nativeElement.classList.add(\"mat-progress-bar-reduced-motion\"),i&&(i.color&&(this.color=this._defaultColor=i.color),this.mode=i.mode||this.mode)}_isNoopAnimation;get color(){return this._color||this._defaultColor}set color(A){this._color=A}_color;_defaultColor=\"primary\";get value(){return this._value}set value(A){this._value=etA(A||0),this._changeDetectorRef.markForCheck()}_value=0;get bufferValue(){return this._bufferValue||0}set bufferValue(A){this._bufferValue=etA(A||0),this._changeDetectorRef.markForCheck()}_bufferValue=0;animationEnd=new WA;get mode(){return this._mode}set mode(A){this._mode=A,this._changeDetectorRef.markForCheck()}_mode=\"determinate\";ngAfterViewInit(){this._ngZone.runOutsideAngular(()=>{this._cleanupTransitionEnd=this._renderer.listen(this._elementRef.nativeElement,\"transitionend\",this._transitionendHandler)})}ngOnDestroy(){this._cleanupTransitionEnd?.()}_getPrimaryBarTransform(){return`scaleX(${this._isIndeterminate()?1:this.value/100})`}_getBufferBarFlexBasis(){return`${this.mode===\"buffer\"?this.bufferValue:100}%`}_isIndeterminate(){return this.mode===\"indeterminate\"||this.mode===\"query\"}_transitionendHandler=A=>{this.animationEnd.observers.length===0||!A.target||!A.target.classList.contains(\"mdc-linear-progress__primary-bar\")||(this.mode===\"determinate\"||this.mode===\"buffer\")&&this._ngZone.run(()=>this.animationEnd.next({value:this.value}))};static \\u0275fac=function(i){return new(i||t)};static \\u0275cmp=kA({type:t,selectors:[[\"mat-progress-bar\"]],hostAttrs:[\"role\",\"progressbar\",\"aria-valuemin\",\"0\",\"aria-valuemax\",\"100\",\"tabindex\",\"-1\",1,\"mat-mdc-progress-bar\",\"mdc-linear-progress\"],hostVars:10,hostBindings:function(i,n){i&2&&(ie(\"aria-valuenow\",n._isIndeterminate()?null:n.value)(\"mode\",n.mode),Qo(\"mat-\"+n.color),ae(\"_mat-animation-noopable\",n._isNoopAnimation)(\"mdc-linear-progress--animation-ready\",!n._isNoopAnimation)(\"mdc-linear-progress--indeterminate\",n._isIndeterminate()))},inputs:{color:\"color\",value:[2,\"value\",\"value\",Zi],bufferValue:[2,\"bufferValue\",\"bufferValue\",Zi],mode:\"mode\"},outputs:{animationEnd:\"animationEnd\"},exportAs:[\"matProgressBar\"],decls:7,vars:5,consts:[[\"aria-hidden\",\"true\",1,\"mdc-linear-progress__buffer\"],[1,\"mdc-linear-progress__buffer-bar\"],[1,\"mdc-linear-progress__buffer-dots\"],[\"aria-hidden\",\"true\",1,\"mdc-linear-progress__bar\",\"mdc-linear-progress__primary-bar\"],[1,\"mdc-linear-progress__bar-inner\"],[\"aria-hidden\",\"true\",1,\"mdc-linear-progress__bar\",\"mdc-linear-progress__secondary-bar\"]],template:function(i,n){i&1&&(ti(0,\"div\",0),Ni(1,\"div\",1),V(2,ukA,1,0,\"div\",2),Ii(),ti(3,\"div\",3),Ni(4,\"span\",4),Ii(),ti(5,\"div\",5),Ni(6,\"span\",4),Ii()),i&2&&(p(),En(\"flex-basis\",n._getBufferBarFlexBasis()),p(),W(n.mode===\"buffer\"?2:-1),p(),En(\"transform\",n._getPrimaryBarTransform()))},styles:[`.mat-mdc-progress-bar{--mat-progress-bar-animation-multiplier: 1;display:block;text-align:start}.mat-mdc-progress-bar[mode=query]{transform:scaleX(-1)}.mat-mdc-progress-bar._mat-animation-noopable .mdc-linear-progress__buffer-dots,.mat-mdc-progress-bar._mat-animation-noopable .mdc-linear-progress__primary-bar,.mat-mdc-progress-bar._mat-animation-noopable .mdc-linear-progress__secondary-bar,.mat-mdc-progress-bar._mat-animation-noopable .mdc-linear-progress__bar-inner.mdc-linear-progress__bar-inner{animation:none}.mat-mdc-progress-bar._mat-animation-noopable .mdc-linear-progress__primary-bar,.mat-mdc-progress-bar._mat-animation-noopable .mdc-linear-progress__buffer-bar{transition:transform 1ms}.mat-progress-bar-reduced-motion{--mat-progress-bar-animation-multiplier: 2}.mdc-linear-progress{position:relative;width:100%;transform:translateZ(0);outline:1px solid rgba(0,0,0,0);overflow-x:hidden;transition:opacity 250ms 0ms cubic-bezier(0.4, 0, 0.6, 1);height:max(var(--mat-progress-bar-track-height, 4px),var(--mat-progress-bar-active-indicator-height, 4px))}@media(forced-colors: active){.mdc-linear-progress{outline-color:CanvasText}}.mdc-linear-progress__bar{position:absolute;top:0;bottom:0;margin:auto 0;width:100%;animation:none;transform-origin:top left;transition:transform 250ms 0ms cubic-bezier(0.4, 0, 0.6, 1);height:var(--mat-progress-bar-active-indicator-height, 4px)}.mdc-linear-progress--indeterminate .mdc-linear-progress__bar{transition:none}[dir=rtl] .mdc-linear-progress__bar{right:0;transform-origin:center right}.mdc-linear-progress__bar-inner{display:inline-block;position:absolute;width:100%;animation:none;border-top-style:solid;border-color:var(--mat-progress-bar-active-indicator-color, var(--mat-sys-primary));border-top-width:var(--mat-progress-bar-active-indicator-height, 4px)}.mdc-linear-progress__buffer{display:flex;position:absolute;top:0;bottom:0;margin:auto 0;width:100%;overflow:hidden;height:var(--mat-progress-bar-track-height, 4px);border-radius:var(--mat-progress-bar-track-shape, var(--mat-sys-corner-none))}.mdc-linear-progress__buffer-dots{background-image:radial-gradient(circle, var(--mat-progress-bar-track-color, var(--mat-sys-surface-variant)) calc(var(--mat-progress-bar-track-height, 4px) / 2), transparent 0);background-repeat:repeat-x;background-size:calc(calc(var(--mat-progress-bar-track-height, 4px) / 2)*5);background-position:left;flex:auto;transform:rotate(180deg);animation:mdc-linear-progress-buffering calc(250ms*var(--mat-progress-bar-animation-multiplier)) infinite linear}@media(forced-colors: active){.mdc-linear-progress__buffer-dots{background-color:ButtonBorder}}[dir=rtl] .mdc-linear-progress__buffer-dots{animation:mdc-linear-progress-buffering-reverse calc(250ms*var(--mat-progress-bar-animation-multiplier)) infinite linear;transform:rotate(0)}.mdc-linear-progress__buffer-bar{flex:0 1 100%;transition:flex-basis 250ms 0ms cubic-bezier(0.4, 0, 0.6, 1);background-color:var(--mat-progress-bar-track-color, var(--mat-sys-surface-variant))}.mdc-linear-progress__primary-bar{transform:scaleX(0)}.mdc-linear-progress--indeterminate .mdc-linear-progress__primary-bar{left:-145.166611%}.mdc-linear-progress--indeterminate.mdc-linear-progress--animation-ready .mdc-linear-progress__primary-bar{animation:mdc-linear-progress-primary-indeterminate-translate calc(2s*var(--mat-progress-bar-animation-multiplier)) infinite linear}.mdc-linear-progress--indeterminate.mdc-linear-progress--animation-ready .mdc-linear-progress__primary-bar>.mdc-linear-progress__bar-inner{animation:mdc-linear-progress-primary-indeterminate-scale calc(2s*var(--mat-progress-bar-animation-multiplier)) infinite linear}[dir=rtl] .mdc-linear-progress.mdc-linear-progress--animation-ready .mdc-linear-progress__primary-bar{animation-name:mdc-linear-progress-primary-indeterminate-translate-reverse}[dir=rtl] .mdc-linear-progress.mdc-linear-progress--indeterminate .mdc-linear-progress__primary-bar{right:-145.166611%;left:auto}.mdc-linear-progress__secondary-bar{display:none}.mdc-linear-progress--indeterminate .mdc-linear-progress__secondary-bar{left:-54.888891%;display:block}.mdc-linear-progress--indeterminate.mdc-linear-progress--animation-ready .mdc-linear-progress__secondary-bar{animation:mdc-linear-progress-secondary-indeterminate-translate calc(2s*var(--mat-progress-bar-animation-multiplier)) infinite linear}.mdc-linear-progress--indeterminate.mdc-linear-progress--animation-ready .mdc-linear-progress__secondary-bar>.mdc-linear-progress__bar-inner{animation:mdc-linear-progress-secondary-indeterminate-scale calc(2s*var(--mat-progress-bar-animation-multiplier)) infinite linear}[dir=rtl] .mdc-linear-progress.mdc-linear-progress--animation-ready .mdc-linear-progress__secondary-bar{animation-name:mdc-linear-progress-secondary-indeterminate-translate-reverse}[dir=rtl] .mdc-linear-progress.mdc-linear-progress--indeterminate .mdc-linear-progress__secondary-bar{right:-54.888891%;left:auto}@keyframes mdc-linear-progress-buffering{from{transform:rotate(180deg) translateX(calc(var(--mat-progress-bar-track-height, 4px) * -2.5))}}@keyframes mdc-linear-progress-primary-indeterminate-translate{0%{transform:translateX(0)}20%{animation-timing-function:cubic-bezier(0.5, 0, 0.701732, 0.495819);transform:translateX(0)}59.15%{animation-timing-function:cubic-bezier(0.302435, 0.381352, 0.55, 0.956352);transform:translateX(83.67142%)}100%{transform:translateX(200.611057%)}}@keyframes mdc-linear-progress-primary-indeterminate-scale{0%{transform:scaleX(0.08)}36.65%{animation-timing-function:cubic-bezier(0.334731, 0.12482, 0.785844, 1);transform:scaleX(0.08)}69.15%{animation-timing-function:cubic-bezier(0.06, 0.11, 0.6, 1);transform:scaleX(0.661479)}100%{transform:scaleX(0.08)}}@keyframes mdc-linear-progress-secondary-indeterminate-translate{0%{animation-timing-function:cubic-bezier(0.15, 0, 0.515058, 0.409685);transform:translateX(0)}25%{animation-timing-function:cubic-bezier(0.31033, 0.284058, 0.8, 0.733712);transform:translateX(37.651913%)}48.35%{animation-timing-function:cubic-bezier(0.4, 0.627035, 0.6, 0.902026);transform:translateX(84.386165%)}100%{transform:translateX(160.277782%)}}@keyframes mdc-linear-progress-secondary-indeterminate-scale{0%{animation-timing-function:cubic-bezier(0.205028, 0.057051, 0.57661, 0.453971);transform:scaleX(0.08)}19.15%{animation-timing-function:cubic-bezier(0.152313, 0.196432, 0.648374, 1.004315);transform:scaleX(0.457104)}44.15%{animation-timing-function:cubic-bezier(0.257759, -0.003163, 0.211762, 1.38179);transform:scaleX(0.72796)}100%{transform:scaleX(0.08)}}@keyframes mdc-linear-progress-primary-indeterminate-translate-reverse{0%{transform:translateX(0)}20%{animation-timing-function:cubic-bezier(0.5, 0, 0.701732, 0.495819);transform:translateX(0)}59.15%{animation-timing-function:cubic-bezier(0.302435, 0.381352, 0.55, 0.956352);transform:translateX(-83.67142%)}100%{transform:translateX(-200.611057%)}}@keyframes mdc-linear-progress-secondary-indeterminate-translate-reverse{0%{animation-timing-function:cubic-bezier(0.15, 0, 0.515058, 0.409685);transform:translateX(0)}25%{animation-timing-function:cubic-bezier(0.31033, 0.284058, 0.8, 0.733712);transform:translateX(-37.651913%)}48.35%{animation-timing-function:cubic-bezier(0.4, 0.627035, 0.6, 0.902026);transform:translateX(-84.386165%)}100%{transform:translateX(-160.277782%)}}@keyframes mdc-linear-progress-buffering-reverse{from{transform:translateX(-10px)}}\n`],encapsulation:2,changeDetection:0})}return t})();function etA(t,e=0,A=100){return Math.max(e,Math.min(A,t))}var ttA=(()=>{class t{static \\u0275fac=function(i){return new(i||t)};static \\u0275mod=Xe({type:t});static \\u0275inj=Ze({imports:[Fi]})}return t})();var pkA=[\"determinateSpinner\"];function DkA(t,e){if(t&1&&(Qt(),m(0,\"svg\",11),GA(1,\"circle\",12),D()),t&2){let A=y();ie(\"viewBox\",A._viewBox()),p(),En(\"stroke-dasharray\",A._strokeCircumference(),\"px\")(\"stroke-dashoffset\",A._strokeCircumference()/2,\"px\")(\"stroke-width\",A._circleStrokeWidth(),\"%\"),ie(\"r\",A._circleRadius())}}var wkA=new wA(\"mat-progress-spinner-default-options\",{providedIn:\"root\",factory:()=>({diameter:itA})}),itA=100,ykA=10,uI=(()=>{class t{_elementRef=h(ge);_noopAnimations;get color(){return this._color||this._defaultColor}set color(A){this._color=A}_color;_defaultColor=\"primary\";_determinateCircle;constructor(){let A=h(wkA),i=Eh(),n=this._elementRef.nativeElement;this._noopAnimations=i===\"di-disabled\"&&!!A&&!A._forceAnimations,this.mode=n.nodeName.toLowerCase()===\"mat-spinner\"?\"indeterminate\":\"determinate\",!this._noopAnimations&&i===\"reduced-motion\"&&n.classList.add(\"mat-progress-spinner-reduced-motion\"),A&&(A.color&&(this.color=this._defaultColor=A.color),A.diameter&&(this.diameter=A.diameter),A.strokeWidth&&(this.strokeWidth=A.strokeWidth))}mode;get value(){return this.mode===\"determinate\"?this._value:0}set value(A){this._value=Math.max(0,Math.min(100,A||0))}_value=0;get diameter(){return this._diameter}set diameter(A){this._diameter=A||0}_diameter=itA;get strokeWidth(){return this._strokeWidth??this.diameter/10}set strokeWidth(A){this._strokeWidth=A||0}_strokeWidth;_circleRadius(){return(this.diameter-ykA)/2}_viewBox(){let A=this._circleRadius()*2+this.strokeWidth;return`0 0 ${A} ${A}`}_strokeCircumference(){return 2*Math.PI*this._circleRadius()}_strokeDashOffset(){return this.mode===\"determinate\"?this._strokeCircumference()*(100-this._value)/100:null}_circleStrokeWidth(){return this.strokeWidth/this.diameter*100}static \\u0275fac=function(i){return new(i||t)};static \\u0275cmp=kA({type:t,selectors:[[\"mat-progress-spinner\"],[\"mat-spinner\"]],viewQuery:function(i,n){if(i&1&&ni(pkA,5),i&2){let o;Ce(o=Ie())&&(n._determinateCircle=o.first)}},hostAttrs:[\"role\",\"progressbar\",\"tabindex\",\"-1\",1,\"mat-mdc-progress-spinner\",\"mdc-circular-progress\"],hostVars:18,hostBindings:function(i,n){i&2&&(ie(\"aria-valuemin\",0)(\"aria-valuemax\",100)(\"aria-valuenow\",n.mode===\"determinate\"?n.value:null)(\"mode\",n.mode),Qo(\"mat-\"+n.color),En(\"width\",n.diameter,\"px\")(\"height\",n.diameter,\"px\")(\"--mat-progress-spinner-size\",n.diameter+\"px\")(\"--mat-progress-spinner-active-indicator-width\",n.diameter+\"px\"),ae(\"_mat-animation-noopable\",n._noopAnimations)(\"mdc-circular-progress--indeterminate\",n.mode===\"indeterminate\"))},inputs:{color:\"color\",mode:\"mode\",value:[2,\"value\",\"value\",Zi],diameter:[2,\"diameter\",\"diameter\",Zi],strokeWidth:[2,\"strokeWidth\",\"strokeWidth\",Zi]},exportAs:[\"matProgressSpinner\"],decls:14,vars:11,consts:[[\"circle\",\"\"],[\"determinateSpinner\",\"\"],[\"aria-hidden\",\"true\",1,\"mdc-circular-progress__determinate-container\"],[\"xmlns\",\"http://www.w3.org/2000/svg\",\"focusable\",\"false\",1,\"mdc-circular-progress__determinate-circle-graphic\"],[\"cx\",\"50%\",\"cy\",\"50%\",1,\"mdc-circular-progress__determinate-circle\"],[\"aria-hidden\",\"true\",1,\"mdc-circular-progress__indeterminate-container\"],[1,\"mdc-circular-progress__spinner-layer\"],[1,\"mdc-circular-progress__circle-clipper\",\"mdc-circular-progress__circle-left\"],[3,\"ngTemplateOutlet\"],[1,\"mdc-circular-progress__gap-patch\"],[1,\"mdc-circular-progress__circle-clipper\",\"mdc-circular-progress__circle-right\"],[\"xmlns\",\"http://www.w3.org/2000/svg\",\"focusable\",\"false\",1,\"mdc-circular-progress__indeterminate-circle-graphic\"],[\"cx\",\"50%\",\"cy\",\"50%\"]],template:function(i,n){if(i&1&&(yt(0,DkA,2,8,\"ng-template\",null,0,NC),m(2,\"div\",2,1),Qt(),m(4,\"svg\",3),GA(5,\"circle\",4),D()(),Tr(),m(6,\"div\",5)(7,\"div\",6)(8,\"div\",7),$i(9,8),D(),m(10,\"div\",9),$i(11,8),D(),m(12,\"div\",10),$i(13,8),D()()()),i&2){let o=Wi(1);p(4),ie(\"viewBox\",n._viewBox()),p(),En(\"stroke-dasharray\",n._strokeCircumference(),\"px\")(\"stroke-dashoffset\",n._strokeDashOffset(),\"px\")(\"stroke-width\",n._circleStrokeWidth(),\"%\"),ie(\"r\",n._circleRadius()),p(4),X(\"ngTemplateOutlet\",o),p(2),X(\"ngTemplateOutlet\",o),p(2),X(\"ngTemplateOutlet\",o)}},dependencies:[Ng],styles:[`.mat-mdc-progress-spinner{--mat-progress-spinner-animation-multiplier: 1;display:block;overflow:hidden;line-height:0;position:relative;direction:ltr;transition:opacity 250ms cubic-bezier(0.4, 0, 0.6, 1)}.mat-mdc-progress-spinner circle{stroke-width:var(--mat-progress-spinner-active-indicator-width, 4px)}.mat-mdc-progress-spinner._mat-animation-noopable,.mat-mdc-progress-spinner._mat-animation-noopable .mdc-circular-progress__determinate-circle{transition:none !important}.mat-mdc-progress-spinner._mat-animation-noopable .mdc-circular-progress__indeterminate-circle-graphic,.mat-mdc-progress-spinner._mat-animation-noopable .mdc-circular-progress__spinner-layer,.mat-mdc-progress-spinner._mat-animation-noopable .mdc-circular-progress__indeterminate-container{animation:none !important}.mat-mdc-progress-spinner._mat-animation-noopable .mdc-circular-progress__indeterminate-container circle{stroke-dasharray:0 !important}@media(forced-colors: active){.mat-mdc-progress-spinner .mdc-circular-progress__indeterminate-circle-graphic,.mat-mdc-progress-spinner .mdc-circular-progress__determinate-circle{stroke:currentColor;stroke:CanvasText}}.mat-progress-spinner-reduced-motion{--mat-progress-spinner-animation-multiplier: 1.25}.mdc-circular-progress__determinate-container,.mdc-circular-progress__indeterminate-circle-graphic,.mdc-circular-progress__indeterminate-container,.mdc-circular-progress__spinner-layer{position:absolute;width:100%;height:100%}.mdc-circular-progress__determinate-container{transform:rotate(-90deg)}.mdc-circular-progress--indeterminate .mdc-circular-progress__determinate-container{opacity:0}.mdc-circular-progress__indeterminate-container{font-size:0;letter-spacing:0;white-space:nowrap;opacity:0}.mdc-circular-progress--indeterminate .mdc-circular-progress__indeterminate-container{opacity:1;animation:mdc-circular-progress-container-rotate calc(1568.2352941176ms*var(--mat-progress-spinner-animation-multiplier)) linear infinite}.mdc-circular-progress__determinate-circle-graphic,.mdc-circular-progress__indeterminate-circle-graphic{fill:rgba(0,0,0,0)}.mat-mdc-progress-spinner .mdc-circular-progress__determinate-circle,.mat-mdc-progress-spinner .mdc-circular-progress__indeterminate-circle-graphic{stroke:var(--mat-progress-spinner-active-indicator-color, var(--mat-sys-primary))}@media(forced-colors: active){.mat-mdc-progress-spinner .mdc-circular-progress__determinate-circle,.mat-mdc-progress-spinner .mdc-circular-progress__indeterminate-circle-graphic{stroke:CanvasText}}.mdc-circular-progress__determinate-circle{transition:stroke-dashoffset 500ms cubic-bezier(0, 0, 0.2, 1)}.mdc-circular-progress__gap-patch{position:absolute;top:0;left:47.5%;box-sizing:border-box;width:5%;height:100%;overflow:hidden}.mdc-circular-progress__gap-patch .mdc-circular-progress__indeterminate-circle-graphic{left:-900%;width:2000%;transform:rotate(180deg)}.mdc-circular-progress__circle-clipper .mdc-circular-progress__indeterminate-circle-graphic{width:200%}.mdc-circular-progress__circle-right .mdc-circular-progress__indeterminate-circle-graphic{left:-100%}.mdc-circular-progress--indeterminate .mdc-circular-progress__circle-left .mdc-circular-progress__indeterminate-circle-graphic{animation:mdc-circular-progress-left-spin calc(1333ms*var(--mat-progress-spinner-animation-multiplier)) cubic-bezier(0.4, 0, 0.2, 1) infinite both}.mdc-circular-progress--indeterminate .mdc-circular-progress__circle-right .mdc-circular-progress__indeterminate-circle-graphic{animation:mdc-circular-progress-right-spin calc(1333ms*var(--mat-progress-spinner-animation-multiplier)) cubic-bezier(0.4, 0, 0.2, 1) infinite both}.mdc-circular-progress__circle-clipper{display:inline-flex;position:relative;width:50%;height:100%;overflow:hidden}.mdc-circular-progress--indeterminate .mdc-circular-progress__spinner-layer{animation:mdc-circular-progress-spinner-layer-rotate calc(5332ms*var(--mat-progress-spinner-animation-multiplier)) cubic-bezier(0.4, 0, 0.2, 1) infinite both}@keyframes mdc-circular-progress-container-rotate{to{transform:rotate(360deg)}}@keyframes mdc-circular-progress-spinner-layer-rotate{12.5%{transform:rotate(135deg)}25%{transform:rotate(270deg)}37.5%{transform:rotate(405deg)}50%{transform:rotate(540deg)}62.5%{transform:rotate(675deg)}75%{transform:rotate(810deg)}87.5%{transform:rotate(945deg)}100%{transform:rotate(1080deg)}}@keyframes mdc-circular-progress-left-spin{from{transform:rotate(265deg)}50%{transform:rotate(130deg)}to{transform:rotate(265deg)}}@keyframes mdc-circular-progress-right-spin{from{transform:rotate(-265deg)}50%{transform:rotate(-130deg)}to{transform:rotate(-265deg)}}\n`],encapsulation:2,changeDetection:0})}return t})();var ntA=(()=>{class t{static \\u0275fac=function(i){return new(i||t)};static \\u0275mod=Xe({type:t});static \\u0275inj=Ze({imports:[Fi]})}return t})();function ty(t){if(!t)return!1;if(t.name===\"computer\"){let i=t.args?.action,n=t.args?.coordinate;return[\"left_click\",\"right_click\",\"middle_click\",\"double_click\"].includes(i)&&Array.isArray(n)&&n.length===2}let e=[\"click_at\",\"hover_at\",\"type_text_at\",\"scroll_at\",\"drag_and_drop\",\"mouse_move\",\"scroll_document\"].includes(t.name),A=t.args?.x!=null&&t.args?.y!=null||Array.isArray(t.args?.coordinate)&&t.args?.coordinate.length===2;return e&&A}function NE(t){return t?!!t.response?.image?.data:!1}var iy=class t{set json(e){this.formattedJson=this.syntaxHighlight(e)}formattedJson=\"\";sanitizer=h(Wr);syntaxHighlight(e){if(!e)return\"\";try{let A=JSON.parse(e);e=JSON.stringify(A,null,0)}catch(A){return this.sanitizer.bypassSecurityTrustHtml(this.escapeHtml(e))}return e=e.replace(/&/g,\"&amp;\").replace(/</g,\"&lt;\").replace(/>/g,\"&gt;\"),e=e.replace(/(\"(\\\\u[a-zA-Z0-9]{4}|\\\\[^u]|[^\\\\\"])*\"(\\s*:)?|\\b(true|false|null)\\b|-?\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?)/g,A=>{let i=\"json-number\";return/^\"/.test(A)?/:$/.test(A)?i=\"json-key\":i=\"json-string\":/true|false/.test(A)?i=\"json-boolean\":/null/.test(A)&&(i=\"json-null\"),'<span class=\"'+i+'\">'+A+\"</span>\"}),this.sanitizer.bypassSecurityTrustHtml(e)}escapeHtml(e){return e.replace(/&/g,\"&amp;\").replace(/</g,\"&lt;\").replace(/>/g,\"&gt;\").replace(/\"/g,\"&quot;\").replace(/'/g,\"&#039;\")}static \\u0275fac=function(A){return new(A||t)};static \\u0275cmp=kA({type:t,selectors:[[\"app-json-tooltip\"]],inputs:{json:\"json\"},decls:1,vars:1,consts:[[3,\"innerHTML\"]],template:function(A,i){A&1&&Ni(0,\"div\",0),A&2&&Bo(\"innerHTML\",i.formattedJson,xg)},styles:[\"[_nghost-%COMP%]{display:block;font-family:Courier New,monospace;font-size:12px;line-height:1.4;white-space:pre-wrap;max-width:800px}\"]})};var ny=class t{json=\"\";overlayRef=null;overlay=h(Bp);elementRef=h(ge);show(){if(!this.json)return;let e=this.overlay.position().flexibleConnectedTo(this.elementRef).withPositions([{originX:\"center\",originY:\"top\",overlayX:\"center\",overlayY:\"bottom\",offsetY:-8}]);this.overlayRef=this.overlay.create({positionStrategy:e,scrollStrategy:this.overlay.scrollStrategies.close(),panelClass:\"json-tooltip-panel\"});let A=new Cg(iy),i=this.overlayRef.attach(A);i.instance.json=this.json}hide(){this.overlayRef&&(this.overlayRef.dispose(),this.overlayRef=null)}ngOnDestroy(){this.hide()}static \\u0275fac=function(A){return new(A||t)};static \\u0275dir=OA({type:t,selectors:[[\"\",\"appJsonTooltip\",\"\"]],hostBindings:function(A,i){A&1&&$(\"mouseenter\",function(){return i.show()})(\"mouseleave\",function(){return i.hide()})},inputs:{json:[0,\"appJsonTooltip\",\"json\"]}})};function bkA(t,e){if(t&1&&GA(0,\"a2ui-surface\",0),t&2){let A=y();X(\"surfaceId\",A.surfaceId())(\"surface\",A.surface())}}var oy=class t{processor=h(_L);beginRendering=null;surfaceUpdate=null;dataModelUpdate=null;surfaceId=jA(null);activeSurface=jA(null);surface=_e(()=>this.activeSurface());constructor(){}ngOnChanges(e){let A=[],i=null;e.beginRendering&&this.beginRendering&&Object.keys(this.beginRendering).length>0&&(A.push(this.beginRendering),i=this.beginRendering?.beginRendering?.surfaceId??i),e.surfaceUpdate&&this.surfaceUpdate&&Object.keys(this.surfaceUpdate).length>0&&(A.push(this.surfaceUpdate),i=this.surfaceUpdate?.surfaceUpdate?.surfaceId??i),e.dataModelUpdate&&this.dataModelUpdate&&Object.keys(this.dataModelUpdate).length>0&&(A.push(this.dataModelUpdate),i=this.dataModelUpdate?.dataModelUpdate?.surfaceId??i),A.length>0&&this.processor.processMessages(A),i&&this.surfaceId.set(i);let n=this.surfaceId();if(n){let o=this.processor.getSurfaces();o.has(n)&&this.activeSurface.set(o.get(n))}}static \\u0275fac=function(A){return new(A||t)};static \\u0275cmp=kA({type:t,selectors:[[\"app-a2ui-canvas\"]],inputs:{beginRendering:\"beginRendering\",surfaceUpdate:\"surfaceUpdate\",dataModelUpdate:\"dataModelUpdate\"},features:[ei],decls:1,vars:1,consts:[[3,\"surfaceId\",\"surface\"]],template:function(A,i){A&1&&V(0,bkA,1,2,\"a2ui-surface\",0),A&2&&W(i.surface()?0:-1)},dependencies:[oa,UL],styles:[\"[_nghost-%COMP%]{display:block;height:100%;width:100%;overflow:auto}[_nghost-%COMP%]     *{box-sizing:border-box}.canvas[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:16px;padding:16px;box-sizing:border-box;min-height:100%}\"],changeDetection:0})};function MkA(t,e){if(t&1&&K(0),t&2){let A=y(3);Fe(\" (\",A.functionCall.args.action,\") \")}}function kkA(t,e){if(t&1&&(m(0,\"span\",5),K(1),D()),t&2){y();let A=vs(5);X(\"matTooltip\",A.isVirtual?\"Virtual (1000x1000)\":\"Hardware Mapping\"),p(),EL(\" [@ \",A.x,\"\",A.isVirtual?\"v\":\"px\",\", \",A.y,\"\",A.isVirtual?\"v\":\"px\",\"] \")}}function SkA(t,e){if(t&1){let A=zA();m(0,\"div\",2),$(\"click\",function(){rA(A);let n=y(2);return sA(n.clickEvent.emit(n.index))}),m(1,\"div\",3)(2,\"span\",4),K(3),V(4,MkA,1,1),wr(5),V(6,kkA,2,5,\"span\",5),D()(),m(7,\"div\",6)(8,\"img\",7),$(\"load\",function(n){rA(A);let o=y(2);return sA(o.onImageLoad(n))}),D(),GA(9,\"div\",8),D()()}if(t&2){y();let A=vs(0),i=y();p(3),Fe(\" \",i.functionCall.name,\" \"),p(),W(i.functionCall.args&&i.functionCall.args.action?4:-1),p();let n=sg(i.getActualPixelCoordinates());p(),W(n?6:-1),p(2),X(\"src\",A,Da),p(),X(\"ngStyle\",i.getClickBoxStyle())}}function xkA(t,e){if(t&1&&(wr(0),V(1,SkA,10,6,\"div\",1)),t&2){let A=sg(y().getPreviousComputerUseScreenshot());p(),W(A?1:-1)}}function RkA(t,e){if(t&1){let A=zA();m(0,\"div\",9),$(\"click\",function(){rA(A);let n=y();return sA(n.clickEvent.emit(n.index))}),m(1,\"div\",3)(2,\"span\",4),K(3),D()(),GA(4,\"img\",10),m(5,\"div\",11)(6,\"mat-icon\",12),K(7,\"computer\"),D(),m(8,\"span\",13),K(9),D()()()}if(t&2){let A=y();p(3),qA(A.functionResponse.name),p(),X(\"src\",A.getComputerUseScreenshot(),Da),p(5),qA(A.getComputerUseUrl())}}var ay=class t{functionCall;functionResponse;allMessages=[];index=0;clickEvent=new WA;imageDimensions=new Map;VIRTUAL_WIDTH=1e3;VIRTUAL_HEIGHT=1e3;isComputerUseResponse(){return!!this.functionResponse&&NE(this.functionResponse)}isComputerUseClick(){return!!this.functionCall&&ty(this.functionCall)}getComputerUseScreenshot(){return this.getScreenshotFromPayload(this.functionResponse?.response)}getComputerUseUrl(){return this.isComputerUseResponse()&&(this.functionResponse?.response).url||\"\"}getPreviousComputerUseScreenshot(){for(let e=this.index-1;e>=0;e--){let A=this.allMessages[e];if(this.isMsgComputerUseResponse(A)&&A.functionResponses&&A.functionResponses.length>0)for(let i=A.functionResponses.length-1;i>=0;i--){let n=A.functionResponses[i];if(NE(n)){let o=n.response;return this.getScreenshotFromPayload(o)}}}return\"\"}getClickCoordinates(){if(!this.isComputerUseClick())return null;let e=this.functionCall.args;return e?e.coordinate?{x:Number(e.coordinate[0]),y:Number(e.coordinate[1])}:e.x!=null&&e.y!=null?{x:Number(e.x),y:Number(e.y)}:null:null}getActualPixelCoordinates(){let e=this.getClickCoordinates();if(!e)return null;let A=this.imageDimensions.get(this.index);return A?{x:Math.round(e.x/this.VIRTUAL_WIDTH*A.width),y:Math.round(e.y/this.VIRTUAL_HEIGHT*A.height),isVirtual:!1}:Ve(BA({},e),{isVirtual:!0})}getClickBoxStyle(){let e=this.getClickCoordinates();if(!e)return{display:\"none\"};let A=e.x/this.VIRTUAL_WIDTH*100,i=e.y/this.VIRTUAL_HEIGHT*100;return{left:`${A}%`,top:`${i}%`}}onImageLoad(e){let A=e.target;A.naturalWidth&&A.naturalHeight&&this.imageDimensions.set(this.index,{width:A.naturalWidth,height:A.naturalHeight})}isMsgComputerUseResponse(e){return e.functionResponses&&e.functionResponses.length>0?e.functionResponses.some(A=>NE(A)):!1}getScreenshotFromPayload(e){let A=e?.image;if(!A?.data)return\"\";let i=A.data;return i.startsWith(\"data:\")?i:`data:${A.mimetype||\"image/png\"};base64,${i}`}static \\u0275fac=function(A){return new(A||t)};static \\u0275cmp=kA({type:t,selectors:[[\"app-computer-action\"]],inputs:{functionCall:\"functionCall\",functionResponse:\"functionResponse\",allMessages:\"allMessages\",index:\"index\"},outputs:{clickEvent:\"clickEvent\"},decls:2,vars:1,consts:[[1,\"computer-use-container\"],[1,\"computer-use-container\",\"click-visualization-container\"],[1,\"computer-use-container\",\"click-visualization-container\",3,\"click\"],[1,\"computer-use-header\"],[1,\"computer-use-tool-name\"],[1,\"actual-pixels\",3,\"matTooltip\"],[1,\"image-wrapper\"],[\"alt\",\"Computer Use Screenshot\",1,\"computer-use-screenshot\",3,\"load\",\"src\"],[1,\"click-overlay-box\",3,\"ngStyle\"],[1,\"computer-use-container\",3,\"click\"],[\"alt\",\"Computer Use Screenshot\",1,\"computer-use-screenshot\",3,\"src\"],[1,\"computer-use-footprint\"],[1,\"computer-icon\"],[1,\"url-text\"]],template:function(A,i){A&1&&V(0,xkA,2,2)(1,RkA,10,3,\"div\",0),A&2&&W(i.isComputerUseClick()?0:i.isComputerUseResponse()?1:-1)},dependencies:[oa,vf,Ug,In,WC,Ba],styles:['[_nghost-%COMP%]{display:block}.computer-use-container[_ngcontent-%COMP%]{display:flex;flex-direction:column;max-width:600px;border-radius:12px;border:1px solid var(--chat-panel-input-field-mat-mdc-text-field-wrapper-border-color);overflow:hidden;cursor:pointer;margin:5px 5px 10px;background-color:var(--chat-panel-bot-message-message-card-background-color);transition:opacity .2s}.computer-use-container[_ngcontent-%COMP%]:hover{opacity:.9}.computer-use-tool-name[_ngcontent-%COMP%]{font-size:12px;font-family:monospace;font-weight:600;color:var(--chat-panel-input-field-textarea-color);opacity:.9;padding:12px}.computer-use-tool-name[_ngcontent-%COMP%]   .actual-pixels[_ngcontent-%COMP%]{opacity:.6;margin-left:8px;font-weight:400}.computer-use-screenshot[_ngcontent-%COMP%]{width:100%;height:auto;display:block;border-bottom:1px solid var(--chat-panel-input-field-mat-mdc-text-field-wrapper-border-color)}.computer-use-footprint[_ngcontent-%COMP%]{display:flex;align-items:center;padding:8px 12px;gap:8px;background-color:var(--chat-panel-thought-chip-background-color)}.computer-icon[_ngcontent-%COMP%]{font-size:18px;width:18px;height:18px;flex-shrink:0}.url-text[_ngcontent-%COMP%]{font-size:11px;font-family:monospace;white-space:normal;word-break:break-all;color:var(--chat-panel-input-field-textarea-color);opacity:.8;min-width:0}.image-wrapper[_ngcontent-%COMP%]{position:relative;width:100%}.click-overlay-box[_ngcontent-%COMP%]{position:absolute;width:24px;height:24px;border:1px solid rgba(255,255,255,.8);border-radius:50%;transform:translate(-50%,-50%);background-color:#ff00004d;box-shadow:0 0 4px #00000080;pointer-events:none;z-index:10;display:flex;align-items:center;justify-content:center}.click-overlay-box[_ngcontent-%COMP%]:before{content:\"\";width:2px;height:2px;background-color:red;border-radius:50%;box-shadow:0 0 2px #fff;z-index:11}.click-overlay-box[_ngcontent-%COMP%]:after{content:\"\";position:absolute;width:100%;height:100%;background:linear-gradient(to right,transparent 48%,rgba(255,255,255,.6) 48%,rgba(255,255,255,.6) 52%,transparent 52%),linear-gradient(to bottom,transparent 48%,rgba(255,255,255,.6) 48%,rgba(255,255,255,.6) 52%,transparent 52%);border-radius:50%}']})};function NkA(t,e){t&1&&(m(0,\"div\",1)(1,\"mat-icon\"),K(2,\"check_circle\"),D(),m(3,\"span\"),K(4,\"Response sent\"),D()())}function FkA(t,e){t&1&&(m(0,\"div\",2)(1,\"mat-icon\"),K(2,\"hourglass_empty\"),D(),m(3,\"span\"),K(4,\"Sending...\"),D()())}function LkA(t,e){if(t&1){let A=zA();m(0,\"div\",3)(1,\"mat-icon\",4),K(2,\"rate_review\"),D(),m(3,\"input\",5),ao(\"ngModelChange\",function(n){rA(A);let o=y();return Vn(o.functionCall.userResponse,n)||(o.functionCall.userResponse=n),sA(n)}),$(\"keydown.enter\",function(){rA(A);let n=y();return sA(n.onSend())}),D(),m(4,\"button\",6),$(\"click\",function(){rA(A);let n=y();return sA(n.onSend())}),m(5,\"mat-icon\"),K(6,\"send\"),D()()()}if(t&2){let A=y();p(3),oo(\"ngModel\",A.functionCall.userResponse),p(),X(\"disabled\",!A.functionCall.userResponse)}}var ry=class t{functionCall;appName;userId;sessionId;responseComplete=new WA;agentService=h(Ks);cdr=h(ft);responseChunks=[];onSend(){if(!this.functionCall.userResponse||!this.functionCall.userResponse.trim())return;this.functionCall.responseStatus=\"sending\",this.cdr.detectChanges();let e={appName:this.appName,userId:this.userId,sessionId:this.sessionId,newMessage:{role:\"user\",parts:[{functionResponse:{id:this.functionCall.id,name:this.functionCall.name,response:{response:this.functionCall.userResponse}}}]},functionCallEventId:this.functionCall.functionCallEventId};this.responseChunks=[],this.agentService.runSse(e).subscribe({next:A=>ct(this,null,function*(){this.responseChunks.push(A)}),error:A=>{console.error(\"SSE error:\",A),this.functionCall.responseStatus=\"pending\",this.responseChunks=[],this.cdr.detectChanges()},complete:()=>{console.log(\"Long-running response complete for:\",this.functionCall.name),this.functionCall.responseStatus=\"sent\",this.responseComplete.emit(this.responseChunks),this.cdr.detectChanges()}})}static \\u0275fac=function(A){return new(A||t)};static \\u0275cmp=kA({type:t,selectors:[[\"app-long-running-response\"]],inputs:{functionCall:\"functionCall\",appName:\"appName\",userId:\"userId\",sessionId:\"sessionId\"},outputs:{responseComplete:\"responseComplete\"},decls:4,vars:1,consts:[[1,\"response-chip-container\",3,\"click\"],[1,\"status-chip\",\"sent\"],[1,\"status-chip\",\"sending\"],[1,\"input-chip\"],[1,\"input-icon\"],[\"placeholder\",\"Enter response...\",1,\"response-input\",3,\"ngModelChange\",\"keydown.enter\",\"ngModel\"],[\"mat-icon-button\",\"\",1,\"send-icon-btn\",3,\"click\",\"disabled\"]],template:function(A,i){A&1&&(m(0,\"div\",0),$(\"click\",function(o){return o.stopPropagation()}),V(1,NkA,5,0,\"div\",1)(2,FkA,5,0,\"div\",2)(3,LkA,7,2,\"div\",3),D()),A&2&&(p(),W(i.functionCall.responseStatus===\"sent\"?1:i.functionCall.responseStatus===\"sending\"?2:3))},dependencies:[yn,ro,so,Ca,Ia,In],styles:[\".response-chip-container[_ngcontent-%COMP%]{display:inline-block;margin:5px}.input-chip[_ngcontent-%COMP%]{display:inline-flex;align-items:center;gap:4px;border:1px solid var(--mat-standard-button-toggle-divider-color);border-radius:16px;padding:0 4px 0 12px;background-color:var(--chat-panel-function-event-button-background-color);height:30px;box-sizing:border-box;max-width:300px}.input-chip[_ngcontent-%COMP%]   .input-icon[_ngcontent-%COMP%]{color:var(--long-running-response-icon-color);font-size:18px;width:18px;height:18px}.input-chip[_ngcontent-%COMP%]   .response-input[_ngcontent-%COMP%]{border:none;outline:none;background:transparent;font-size:13px;flex:1;min-width:120px;padding:0;color:var(--long-running-response-input-text-color);caret-color:var(--long-running-response-input-caret-color)}.input-chip[_ngcontent-%COMP%]   .response-input[_ngcontent-%COMP%]::placeholder{color:var(--long-running-response-input-placeholder-color)}.input-chip[_ngcontent-%COMP%]   .send-icon-btn[_ngcontent-%COMP%]{width:24px;height:24px;padding:0;min-width:unset;color:var(--long-running-response-send-button-color)}.input-chip[_ngcontent-%COMP%]   .send-icon-btn[_ngcontent-%COMP%]   mat-icon[_ngcontent-%COMP%]{font-size:18px;width:18px;height:18px}.status-chip[_ngcontent-%COMP%]{display:inline-flex;align-items:center;gap:4px;border-radius:16px;padding:0 12px;font-size:13px;font-weight:500;height:32px;box-sizing:border-box;border:1px solid;line-height:32px}.status-chip[_ngcontent-%COMP%]   mat-icon[_ngcontent-%COMP%]{font-size:18px;width:18px;height:18px}.status-chip.sending[_ngcontent-%COMP%]{background-color:#2196f31a;border-color:#2196f34d;color:#2196f3}.status-chip.sent[_ngcontent-%COMP%]{background-color:#4caf501a;border-color:#4caf504d;color:#4caf50}\"]})};var sy=new wA(\"FeedbackService\");var _kA={goodResponseTooltip:\"Good response\",badResponseTooltip:\"Bad response\",feedbackAdditionalLabel:\"Additional feedback (Optional)\",feedbackCommentPlaceholderDown:\"Share what could be improved in the response\",feedbackCommentPlaceholderUp:\"Share what you liked about the response\",feedbackCancelButton:\"Cancel\",feedbackSubmitButton:\"Submit\",feedbackDialogTitle:\"Reasons for feedback (Select all that apply)\",feedbackReasonHallucination:\"Hallucinated libraries / APIs etc\",feedbackReasonIncomplete:\"Incomplete answer\",feedbackReasonFollowup:\"Didn't understand followup\",feedbackReasonFactual:\"Factual errors\",feedbackReasonLinks:\"Broken/incorrect links\",feedbackReasonIrrelevant:\"Irrelevant information\",feedbackReasonRepetitive:\"Repetitive\",feedbackReasonAccurate:\"Accurate info\",feedbackReasonHelpful:\"Helpful\",feedbackReasonConcise:\"Concise\",feedbackReasonUnderstanding:\"Good understanding\",feedbackReasonClear:\"Clear and easy to follow\"},otA=new wA(\"Message Feedback Messages\",{factory:()=>_kA});function GkA(t,e){t&1&&(m(0,\"mat-icon\"),K(1,\"thumb_up_filled\"),D())}function KkA(t,e){t&1&&(m(0,\"mat-icon\"),K(1,\"thumb_up\"),D())}function UkA(t,e){t&1&&(m(0,\"mat-icon\"),K(1,\"thumb_down_filled\"),D())}function JkA(t,e){t&1&&(m(0,\"mat-icon\"),K(1,\"thumb_down\"),D())}function YkA(t,e){if(t&1&&(m(0,\"mat-chip-option\",7),K(1),D()),t&2){let A=e.$implicit;X(\"value\",A),p(),Fe(\" \",A,\" \")}}function HkA(t,e){if(t&1){let A=zA();m(0,\"div\",4)(1,\"div\",5)(2,\"h3\"),K(3),D(),m(4,\"mat-chip-listbox\",6),Gt(5,YkA,2,2,\"mat-chip-option\",7,Ri),D()(),m(7,\"div\",8)(8,\"h3\"),K(9),D(),m(10,\"mat-form-field\",9)(11,\"textarea\",10),K(12,\"        \"),D()()(),m(13,\"div\",11)(14,\"button\",12),$(\"click\",function(){rA(A);let n=y();return sA(n.onDetailedFeedbackCancelled())}),K(15),D(),m(16,\"button\",13),$(\"click\",function(){rA(A);let n=y();return sA(n.onDetailedFeedbackSubmitted())}),K(17),D()()()}if(t&2){let A=y();p(3),qA(A.i18n.feedbackDialogTitle),p(),X(\"formControl\",A.selectedReasons),p(),Kt(A.reasons()),p(4),qA(A.i18n.feedbackAdditionalLabel),p(2),X(\"formControl\",A.comment)(\"placeholder\",A.feedbackPlaceholder()),p(4),Fe(\" \",A.i18n.feedbackCancelButton,\" \"),p(2),Fe(\" \",A.i18n.feedbackSubmitButton,\" \")}}var gy=class t{sessionName=nt.required();eventId=nt.required();i18n=h(otA);feedbackService=h(sy);existingFeedback=ym({params:()=>({sessionName:this.sessionName(),eventId:this.eventId()}),stream:({params:e})=>this.feedbackService.getFeedback(e.sessionName,e.eventId)});selectedFeedbackDirection=jA(void 0);feedbackDirection=_e(()=>this.selectedFeedbackDirection()??this.existingFeedback.value()?.direction);isDetailedFeedbackVisible=jA(!1);feedbackPlaceholder=_e(()=>this.feedbackDirection()===\"up\"?this.i18n.feedbackCommentPlaceholderUp:this.i18n.feedbackCommentPlaceholderDown);positiveReasonsResource=ym({stream:()=>this.feedbackService.getPositiveFeedbackReasons()});negativeReasonsResource=ym({stream:()=>this.feedbackService.getNegativeFeedbackReasons()});reasons=_e(()=>this.feedbackDirection()===\"up\"?this.positiveReasonsResource.value():this.negativeReasonsResource.value());selectedReasons=new ss([]);comment=new ss(\"\");isLoading=jA(!1);sendFeedback(e){this.feedbackDirection()===e?(this.isLoading.set(!0),this.feedbackService.deleteFeedback(this.sessionName(),this.eventId()).subscribe(()=>{this.isLoading.set(!1),this.selectedFeedbackDirection.set(void 0),this.resetDetailedFeedback()})):(this.selectedReasons.reset(),this.isLoading.set(!0),this.feedbackService.sendFeedback(this.sessionName(),this.eventId(),{direction:e}).subscribe(()=>{this.isLoading.set(!1),this.isDetailedFeedbackVisible.set(!0),this.selectedFeedbackDirection.set(e)}))}onDetailedFeedbackSubmitted(){let e=this.feedbackDirection();e&&(this.isLoading.set(!0),this.feedbackService.sendFeedback(this.sessionName(),this.eventId(),{direction:e,reasons:this.selectedReasons.value??[],comment:this.comment.value??void 0}).subscribe(()=>{this.isLoading.set(!1),this.resetDetailedFeedback()}))}onDetailedFeedbackCancelled(){this.selectedFeedbackDirection.set(void 0),this.resetDetailedFeedback()}resetDetailedFeedback(){this.isDetailedFeedbackVisible.set(!1),this.comment.reset(),this.selectedReasons.reset([])}static \\u0275fac=function(A){return new(A||t)};static \\u0275cmp=kA({type:t,selectors:[[\"app-message-feedback\"]],inputs:{sessionName:[1,\"sessionName\"],eventId:[1,\"eventId\"]},decls:9,vars:7,consts:[[1,\"message-feedback-container\"],[1,\"feedback-buttons\"],[\"mat-icon-button\",\"\",3,\"click\",\"matTooltip\",\"disabled\"],[\"class\",\"feedback-details-container\",4,\"ngIf\"],[1,\"feedback-details-container\"],[1,\"reasons-chips\"],[\"multiple\",\"\",3,\"formControl\"],[3,\"value\"],[1,\"additional-feedback\"],[\"appearance\",\"outline\"],[\"matInput\",\"\",3,\"formControl\",\"placeholder\"],[1,\"actions\"],[\"mat-stroked-button\",\"\",3,\"click\"],[\"mat-flat-button\",\"\",\"color\",\"primary\",3,\"click\"]],template:function(A,i){A&1&&(m(0,\"div\",0)(1,\"div\",1)(2,\"button\",2),$(\"click\",function(){return i.sendFeedback(\"up\")}),V(3,GkA,2,0,\"mat-icon\")(4,KkA,2,0,\"mat-icon\"),D(),m(5,\"button\",2),$(\"click\",function(){return i.sendFeedback(\"down\")}),V(6,UkA,2,0,\"mat-icon\")(7,JkA,2,0,\"mat-icon\"),D()(),yt(8,HkA,18,7,\"div\",3),D()),A&2&&(p(2),X(\"matTooltip\",i.i18n.goodResponseTooltip)(\"disabled\",i.isLoading()),p(),W(i.feedbackDirection()===\"up\"?3:4),p(2),X(\"matTooltip\",i.i18n.badResponseTooltip)(\"disabled\",i.isLoading()),p(),W(i.feedbackDirection()===\"down\"?6:7),p(2),X(\"ngIf\",i.isDetailedFeedbackVisible()))},dependencies:[oa,yc,bc,ro,so,SI,Cs,vn,Ia,sw,pN,fN,vr,To,Ug,In,Fg,wa,WC,Ba],styles:[\".message-feedback-container[_ngcontent-%COMP%]{display:block}.feedback-buttons[_ngcontent-%COMP%]{--mat-icon-button-touch-target-size: 32px;--button-size: 32px;--icon-size: 12px;margin-left:96px;display:flex}.feedback-buttons[_ngcontent-%COMP%]   button[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:center;width:var(--button-size);height:var(--button-size);transition:all .2s ease}.feedback-buttons[_ngcontent-%COMP%]   button[_ngcontent-%COMP%]   mat-icon[_ngcontent-%COMP%]{font-size:var(--icon-size);height:var(--icon-size);width:var(--icon-size);transition:all .2s ease}.feedback-buttons[_ngcontent-%COMP%]   button.selected[_ngcontent-%COMP%]{background-color:var(--side-panel-button-filled-container-color, var(--mat-sys-primary));color:var(--side-panel-button-filled-label-text-color, white)}.feedback-buttons[_ngcontent-%COMP%]   button.selected[_ngcontent-%COMP%]   mat-icon[_ngcontent-%COMP%]{color:inherit}.reasons-chips[_ngcontent-%COMP%]{margin-bottom:20px}.feedback-details-container[_ngcontent-%COMP%]{margin-left:54px;max-width:500px;padding:16px;background-color:var(--builder-card-background-color);border-radius:8px;margin-top:8px;border:1px solid var(--builder-border-color)}.feedback-details-container[_ngcontent-%COMP%]   .additional-feedback[_ngcontent-%COMP%]   h3[_ngcontent-%COMP%]{font-weight:500;margin-bottom:8px;margin-top:0;color:var(--builder-text-secondary-color)}.feedback-details-container[_ngcontent-%COMP%]   .additional-feedback[_ngcontent-%COMP%]   mat-form-field[_ngcontent-%COMP%]{width:100%}.feedback-details-container[_ngcontent-%COMP%]   .additional-feedback[_ngcontent-%COMP%]   mat-form-field[_ngcontent-%COMP%]   textarea[_ngcontent-%COMP%]{min-height:60px;resize:vertical}.feedback-details-container[_ngcontent-%COMP%]   .actions[_ngcontent-%COMP%]{display:flex;justify-content:flex-end;gap:8px;margin-top:12px}.feedback-details-container[_ngcontent-%COMP%]   .actions[_ngcontent-%COMP%]   button[_ngcontent-%COMP%]{border-radius:18px;padding:0 16px;height:32px;line-height:32px;font-weight:500}\"]})};var TkA={cancelEditingTooltip:\"Cancel editing\",saveEvalMessageTooltip:\"Save eval case message\",thoughtChipLabel:\"Thought\",outcomeLabel:\"Outcome\",outputLabel:\"Output\",actualToolUsesLabel:\"Actual tool uses:\",expectedToolUsesLabel:\"Expected tool uses:\",actualResponseLabel:\"Actual response:\",expectedResponseLabel:\"Expected response:\",matchScoreLabel:\"Match score\",thresholdLabel:\"Threshold\",evalPassLabel:\"Pass\",evalFailLabel:\"Fail\",editEvalMessageTooltip:\"Edit eval case message\",deleteEvalMessageTooltip:\"Delete eval case message\",editFunctionArgsTooltip:\"Edit function arguments\",typeMessagePlaceholder:\"Type a Message...\",uploadFileTooltip:\"Upload local file\",moreOptionsTooltip:\"More options\",updateStateMenuLabel:\"Update state\",updateStateMenuTooltip:\"Update the session state\",turnOffMicTooltip:\"Turn off microphone\",useMicTooltip:\"Use microphone\",turnOffCamTooltip:\"Turn off camera\",useCamTooltip:\"Use camera\",updatedSessionStateChipLabel:\"Updated session state\"},atA=new wA(\"Chat Panel Messages\",{factory:()=>TkA});var OkA=[\"videoContainer\"],zkA=[\"autoScroll\"],PkA=[\"messageTextarea\"],jkA=t=>({selected:t}),qkA=(t,e)=>({\"user-message\":t,\"bot-message\":e}),VkA=(t,e)=>({\"eval-pass\":t,\"eval-fail\":e}),WkA=t=>({hidden:t}),ZkA=(t,e)=>({\"eval-fail\":t,\"message-card--highlighted\":e}),XkA=(t,e)=>({text:t,thought:e}),ly=t=>({\"function-event-button-highlight\":t}),nF=t=>({hidden:t});function $kA(t,e){t&1&&(m(0,\"div\",8),GA(1,\"mat-progress-bar\",10),D())}function ASA(t,e){if(t&1&&(m(0,\"div\",22),K(1),D()),t&2){let A=y(2).$index,i=y(2);p(),Fe(\" #\",i.getOverallEventNumber(A),\" \")}}function eSA(t,e){t&1&&GA(0,\"div\",23)}function tSA(t,e){if(t&1&&(m(0,\"div\",12),V(1,ASA,2,1,\"div\",22)(2,eSA,1,0,\"div\",23),D()),t&2){let A=y().$index,i=y(2);p(),W(i.isFirstUserMessageInGroup(A)?1:2)}}function iSA(t,e){if(t&1&&(m(0,\"div\",22),K(1),D()),t&2){let A=y(2).$index,i=y(2);p(),Fe(\" #\",i.getOverallEventNumber(A),\" \")}}function nSA(t,e){t&1&&GA(0,\"div\",23)}function oSA(t,e){if(t&1&&(m(0,\"div\",14),V(1,iSA,2,1,\"div\",22)(2,nSA,1,0,\"div\",23),D()),t&2){let A=y().$index,i=y(2);p(),W(i.isFirstMessageInEventGroup(A)?1:2)}}function aSA(t,e){if(t&1&&(m(0,\"button\",24)(1,\"mat-icon\",25),K(2,\"robot_2\"),D()()),t&2){let A=y(),i=A.$implicit,n=A.$index,o=y(2);Qo(o.customIconColorClass(n)),X(\"disabled\",!i.eventId)(\"matTooltip\",o.getAgentNameFromEvent(n))(\"ngClass\",zr(5,WkA,!o.getAgentNameFromEvent(n)))}}function rSA(t,e){t&1&&GA(0,\"mat-progress-bar\",27)}function sSA(t,e){if(t&1&&GA(0,\"img\",33),t&2){let A=y().$implicit;X(\"src\",A.url,Da)}}function gSA(t,e){if(t&1&&(m(0,\"a\",34),K(1),D()),t&2){let A=y(2).$implicit;X(\"href\",A.url,Da),p(),qA(A.file.name)}}function lSA(t,e){if(t&1&&K(0),t&2){let A=y(2).$implicit;Fe(\" \",A.file.name,\" \")}}function cSA(t,e){if(t&1&&(m(0,\"mat-icon\"),K(1,\"insert_drive_file\"),D(),V(2,gSA,2,2,\"a\",34)(3,lSA,1,1)),t&2){let A=y().$implicit;p(2),W(A.url?2:3)}}function CSA(t,e){if(t&1&&(m(0,\"div\",32),V(1,sSA,1,1,\"img\",33),V(2,cSA,4,1),D()),t&2){let A=e.$implicit;p(),W(A.file.type.startsWith(\"image/\")?1:-1),p(),W(A.file.type.startsWith(\"image/\")?-1:2)}}function ISA(t,e){if(t&1&&(m(0,\"div\",28),Gt(1,CSA,3,2,\"div\",32,Ri),D()),t&2){let A=y(2).$implicit;p(),Kt(A.attachments)}}function dSA(t,e){if(t&1&&(m(0,\"div\",29),K(1),D()),t&2){let A=y(4);p(),qA(A.i18n.thoughtChipLabel)}}function BSA(t,e){if(t&1){let A=zA();m(0,\"div\",35)(1,\"textarea\",37,2),$(\"ngModelChange\",function(n){rA(A);let o=y(5);return sA(o.userEditEvalCaseMessageChange.emit(n))})(\"keydown\",function(n){rA(A);let o=y(3).$implicit,a=y(2);return sA(a.handleKeydown.emit({event:n,message:o}))}),D(),m(3,\"div\",38)(4,\"span\",39),$(\"click\",function(){rA(A);let n=y(3).$implicit,o=y(2);return sA(o.cancelEditMessage.emit(n))}),K(5,\" close \"),D(),m(6,\"span\",40),$(\"click\",function(){rA(A);let n=y(3).$implicit,o=y(2);return sA(o.saveEditMessage.emit(n))}),K(7,\" check \"),D()()()}if(t&2){let A=y(5);p(),X(\"ngModel\",A.userEditEvalCaseMessage),p(3),X(\"matTooltip\",A.i18n.cancelEditingTooltip),p(2),X(\"matTooltip\",A.i18n.saveEvalMessageTooltip)}}function QSA(t,e){if(t&1&&$i(0,36),t&2){let A=y(3).$implicit,i=y(2);X(\"ngComponentOutlet\",i.markdownComponent)(\"ngComponentOutletInputs\",fl(2,XkA,A.text,A.thought))}}function ESA(t,e){if(t&1&&V(0,BSA,8,3,\"div\",35)(1,QSA,1,5,\"ng-container\",36),t&2){let A=y(2).$implicit;W(A.isEditing?0:1)}}function hSA(t,e){if(t&1&&(m(0,\"div\"),GA(1,\"div\",41),D()),t&2){let A=y(2).$implicit,i=y(2);p(),X(\"innerHTML\",i.renderGooglerSearch(A.renderedContent),xg)}}function uSA(t,e){if(t&1&&GA(0,\"app-a2ui-canvas\",30),t&2){let A=y(2).$implicit;X(\"beginRendering\",A.a2uiData.beginRendering)(\"surfaceUpdate\",A.a2uiData.surfaceUpdate)(\"dataModelUpdate\",A.a2uiData.dataModelUpdate)}}function fSA(t,e){if(t&1&&(m(0,\"code\"),K(1),D()),t&2){let A=y(2).$implicit;p(),Fe(\" \",A.executableCode.code,\" \")}}function mSA(t,e){if(t&1&&(m(0,\"div\")(1,\"div\"),K(2),D(),m(3,\"div\"),K(4),D()()),t&2){let A=y(2).$implicit,i=y(2);p(2),Dc(\"\",i.i18n.outcomeLabel,\": \",A.codeExecutionResult.outcome),p(2),Dc(\"\",i.i18n.outputLabel,\": \",A.codeExecutionResult.output)}}function pSA(t,e){if(t&1){let A=zA();m(0,\"div\",42)(1,\"img\",43),$(\"click\",function(){rA(A);let n=y(4).$implicit,o=y(2);return sA(o.openViewImageDialog.emit(n.inlineData.data))}),D()()}if(t&2){let A=y(4).$implicit;p(),X(\"src\",A.inlineData.data,Da)}}function DSA(t,e){if(t&1&&(m(0,\"div\"),GA(1,\"app-audio-player\",44),D()),t&2){let A=y(4).$implicit;p(),X(\"base64data\",A.inlineData.data)}}function wSA(t,e){if(t&1){let A=zA();m(0,\"div\")(1,\"div\",45)(2,\"mat-icon\"),K(3,\"description\"),D(),m(4,\"button\",46),$(\"click\",function(){rA(A);let n=y(4).$implicit,o=y(2);return sA(o.openBase64InNewTab.emit({data:n.inlineData.data,mimeType:n.inlineData.mimeType}))}),K(5),D()()()}if(t&2){let A=y(4).$implicit;p(5),Fe(\" \",A.inlineData.name,\" \")}}function ySA(t,e){if(t&1){let A=zA();m(0,\"div\")(1,\"button\",46),$(\"click\",function(){rA(A);let n=y(4).$implicit,o=y(2);return sA(o.openBase64InNewTab.emit({data:n.inlineData.data,mimeType:n.inlineData.mimeType}))}),K(2),D()()}if(t&2){let A=y(4).$implicit;p(2),Fe(\" \",A.inlineData.name,\" \")}}function vSA(t,e){if(t&1&&(m(0,\"div\")(1,\"div\"),V(2,pSA,2,1,\"div\",42)(3,DSA,2,1,\"div\")(4,wSA,6,1,\"div\")(5,ySA,3,1,\"div\"),D()()),t&2){let A,i=y(3).$implicit,n=y(2);p(2),W((A=i.inlineData.mediaType)===n.MediaType.IMAGE?2:A===n.MediaType.AUDIO?3:A===n.MediaType.TEXT?4:5)}}function bSA(t,e){if(t&1){let A=zA();m(0,\"div\")(1,\"img\",47),$(\"click\",function(){rA(A);let n=y(4).$implicit,o=y(2);return sA(o.openViewImageDialog.emit(n.inlineData.data))}),D()()}if(t&2){let A=y(4).$implicit;p(),X(\"src\",A.inlineData.data,Da)}}function MSA(t,e){if(t&1&&(m(0,\"div\",32)(1,\"mat-icon\"),K(2,\"insert_drive_file\"),D(),m(3,\"a\",34),K(4),D()()),t&2){let A=y(4).$implicit;p(3),X(\"href\",A.inlineData.data,Da),p(),qA(A.inlineData.displayName)}}function kSA(t,e){if(t&1&&(m(0,\"div\"),V(1,bSA,2,1,\"div\")(2,MSA,5,2,\"div\",32),D()),t&2){let A=y(3).$implicit;p(),W(A.inlineData.mimeType.startsWith(\"image/\")?1:2)}}function SSA(t,e){if(t&1&&V(0,vSA,6,1,\"div\")(1,kSA,3,1,\"div\"),t&2){let A=y(2).$implicit;W(A.role===\"bot\"?0:1)}}function xSA(t,e){if(t&1&&(m(0,\"div\",50)(1,\"div\",51),K(2),D(),GA(3,\"ngx-json-viewer\",52),D(),m(4,\"div\",53)(5,\"div\",54),K(6),D(),GA(7,\"ngx-json-viewer\",52),D()),t&2){let A=y(3).$implicit,i=y(2);p(2),qA(i.i18n.actualToolUsesLabel),p(),X(\"json\",A.actualInvocationToolUses),p(3),qA(i.i18n.expectedToolUsesLabel),p(),X(\"json\",A.expectedInvocationToolUses)}}function RSA(t,e){if(t&1&&(m(0,\"div\",50)(1,\"div\",51),K(2),D(),m(3,\"div\"),K(4),D()(),m(5,\"div\",53)(6,\"div\",54),K(7),D(),m(8,\"div\"),K(9),D()()),t&2){let A=y(3).$implicit,i=y(2);p(2),qA(i.i18n.actualResponseLabel),p(2),qA(A.actualFinalResponse),p(3),qA(i.i18n.expectedResponseLabel),p(2),qA(A.expectedFinalResponse)}}function NSA(t,e){if(t&1&&(m(0,\"div\",49)(1,\"span\",55),K(2),D(),m(3,\"span\",56),K(4),D()()),t&2){let A=y(3).$implicit,i=y(2);p(2),Dc(\"\",i.i18n.matchScoreLabel,\": \",A.evalScore),p(2),Dc(\"\",i.i18n.thresholdLabel,\": \",A.evalThreshold)}}function FSA(t,e){if(t&1&&(m(0,\"div\",31)(1,\"div\",48),V(2,xSA,8,4)(3,RSA,10,4),D(),V(4,NSA,5,4,\"div\",49),D()),t&2){let A=y(2).$implicit;p(2),W(A.actualInvocationToolUses?2:A.actualFinalResponse?3:-1),p(2),W(A.evalScore!==void 0&&A.evalThreshold!==void 0?4:-1)}}function LSA(t,e){if(t&1&&(m(0,\"mat-card\",26),V(1,rSA,1,0,\"mat-progress-bar\",27),V(2,ISA,3,0,\"div\",28),m(3,\"div\"),V(4,dSA,2,1,\"div\",29),m(5,\"div\"),V(6,ESA,2,1),D(),V(7,hSA,2,1,\"div\"),V(8,uSA,1,3,\"app-a2ui-canvas\",30),D(),V(9,fSA,2,1,\"code\"),V(10,mSA,5,4,\"div\"),V(11,SSA,2,1),V(12,FSA,5,2,\"div\",31),D()),t&2){let A=y(),i=A.$implicit,n=A.$index,o=y(2);ae(\"landing-message\",i.isLanding),X(\"ngClass\",fl(13,ZkA,i.evalStatus===2,o.shouldMessageHighlighted(n))),p(),W(i.isLoading?1:-1),p(),W(i.attachments?2:-1),p(2),W(i.thought?4:-1),p(2),W(i.text?6:-1),p(),W(i.renderedContent?7:-1),p(),W(i.a2uiData?8:-1),p(),W(i.executableCode?9:-1),p(),W(i.codeExecutionResult?10:-1),p(),W(i.inlineData?11:-1),p(),W(i.failedMetric&&i.evalStatus===2?12:-1)}}function _SA(t,e){if(t&1){let A=zA();m(0,\"app-computer-action\",60),$(\"clickEvent\",function(n){rA(A);let o=y(5);return sA(o.clickEvent.emit(n))}),D()}if(t&2){let A=y().$implicit,i=y(2).$index,n=y(2);X(\"functionCall\",A)(\"allMessages\",n.messages)(\"index\",i)}}function GSA(t,e){if(t&1&&(m(0,\"button\",58)(1,\"mat-icon\"),K(2,\"bolt\"),D(),K(3),D()),t&2){let A=y().$implicit,i=y(2).$index,n=y(2);X(\"ngClass\",zr(3,ly,n.shouldMessageHighlighted(i)))(\"appJsonTooltip\",A.args?n.JSON.stringify(A.args):\"\"),p(3),Fe(\" \",A.name,\" \")}}function KSA(t,e){if(t&1){let A=zA();m(0,\"app-long-running-response\",61),$(\"responseComplete\",function(n){rA(A);let o=y(5);return sA(o.longRunningResponseComplete.emit(n))}),D()}if(t&2){let A=y().$implicit,i=y(4);X(\"functionCall\",A)(\"appName\",i.appName)(\"userId\",i.userId)(\"sessionId\",i.sessionId)}}function USA(t,e){if(t&1&&(V(0,_SA,1,3,\"app-computer-action\",57)(1,GSA,4,5,\"button\",58),V(2,KSA,1,4,\"app-long-running-response\",59)),t&2){let A=e.$implicit,i=y(4);W(i.isComputerUseClick(A)?0:1),p(2),W(A.needsResponse?2:-1)}}function JSA(t,e){if(t&1&&Gt(0,USA,3,2,null,null,Ri),t&2){let A=y().$implicit;Kt(A.functionCalls)}}function YSA(t,e){if(t&1){let A=zA();m(0,\"app-computer-action\",63),$(\"clickEvent\",function(n){rA(A);let o=y(5);return sA(o.clickEvent.emit(n))}),D()}if(t&2){let A=y().$implicit,i=y(2).$index,n=y(2);X(\"functionResponse\",A)(\"allMessages\",n.messages)(\"index\",i)}}function HSA(t,e){if(t&1&&(m(0,\"button\",58)(1,\"mat-icon\"),K(2,\"check\"),D(),K(3),D()),t&2){let A=y().$implicit,i=y(2).$index,n=y(2);X(\"ngClass\",zr(3,ly,n.shouldMessageHighlighted(i)))(\"appJsonTooltip\",A.response?n.JSON.stringify(A.response):\"\"),p(3),Fe(\" \",A.name,\" \")}}function TSA(t,e){if(t&1&&V(0,YSA,1,3,\"app-computer-action\",62)(1,HSA,4,5,\"button\",58),t&2){let A=e.$implicit,i=y(4);W(i.isComputerUseResponse(A)?0:1)}}function OSA(t,e){if(t&1&&Gt(0,TSA,2,1,null,null,Ri),t&2){let A=y().$implicit;Kt(A.functionResponses)}}function zSA(t,e){if(t&1&&(m(0,\"button\",17)(1,\"mat-icon\"),K(2,\"data_object\"),D(),K(3,\" State \"),D()),t&2){let A=y().$index,i=y(2);X(\"ngClass\",zr(2,ly,i.shouldMessageHighlighted(A)))(\"appJsonTooltip\",i.getStateDeltaTooltip(A))}}function PSA(t,e){if(t&1&&(m(0,\"button\",18)(1,\"mat-icon\"),K(2,\"attachment\"),D(),K(3,\" Artifact \"),D()),t&2){let A=y().$index,i=y(2);X(\"ngClass\",zr(2,ly,i.shouldMessageHighlighted(A)))(\"appJsonTooltip\",i.getArtifactDeltaTooltip(A))}}function jSA(t,e){if(t&1){let A=zA();m(0,\"div\")(1,\"span\",64),$(\"click\",function(){rA(A);let n=y(2).$implicit,o=y(2);return sA(o.editEvalCaseMessage.emit(n))}),K(2,\" edit \"),D(),m(3,\"span\",64),$(\"click\",function(){rA(A);let n=y(2),o=n.$implicit,a=n.$index,r=y(2);return sA(r.deleteEvalCaseMessage.emit({message:o,index:a}))}),K(4,\" delete \"),D()()}if(t&2){let A=y(4);p(),X(\"ngClass\",zr(4,nF,A.isEvalCaseEditing))(\"matTooltip\",A.i18n.editEvalMessageTooltip),p(2),X(\"ngClass\",zr(6,nF,A.isEvalCaseEditing))(\"matTooltip\",A.i18n.deleteEvalMessageTooltip)}}function qSA(t,e){if(t&1){let A=zA();m(0,\"div\")(1,\"span\",64),$(\"click\",function(){rA(A);let n=y(2).$implicit,o=y(2);return sA(o.editFunctionArgs.emit(n))}),K(2,\" edit \"),D()()}if(t&2){let A=y(4);p(),X(\"ngClass\",zr(2,nF,A.isEvalCaseEditing))(\"matTooltip\",A.i18n.editFunctionArgsTooltip)}}function VSA(t,e){if(t&1&&V(0,jSA,5,8,\"div\")(1,qSA,3,4,\"div\"),t&2){let A=y().$implicit,i=y(2);W(A.text?0:i.isEditFunctionArgsEnabled&&A.functionCalls&&A.functionCalls.length>0?1:-1)}}function WSA(t,e){t&1&&(m(0,\"button\",20)(1,\"mat-icon\"),K(2,\"person\"),D()())}function ZSA(t,e){if(t&1&&GA(0,\"app-message-feedback\",21),t&2){let A=y().$implicit,i=y(2);X(\"sessionName\",i.sessionName())(\"eventId\",A.eventId)}}function XSA(t,e){if(t&1){let A=zA();m(0,\"div\",9)(1,\"div\",11),$(\"click\",function(n){let o=rA(A),a=o.$implicit,r=o.$index,s=y(2);return sA(s.handleRowClick(n,a,r))}),V(2,tSA,3,1,\"div\",12),m(3,\"div\",13),V(4,oSA,3,1,\"div\",14),V(5,aSA,3,7,\"button\",15),V(6,LSA,13,16,\"mat-card\",16),V(7,JSA,2,0),V(8,OSA,2,0),V(9,zSA,4,4,\"button\",17),V(10,PSA,4,4,\"button\",18),m(11,\"div\",13)(12,\"span\",19),K(13),D(),m(14,\"span\"),K(15),D()(),V(16,VSA,2,1),V(17,WSA,3,0,\"button\",20),D()(),V(18,ZSA,1,2,\"app-message-feedback\",21),D()}if(t&2){let A=e.$implicit,i=e.$index,n=y(2);p(),X(\"ngClass\",zr(16,jkA,n.isMessageEventSelected(i))),p(),W(A.role===\"user\"?2:-1),p(),X(\"ngClass\",fl(18,qkA,A.role===\"user\",A.role===\"bot\")),p(),W(A.role===\"bot\"&&!A.isLoading?4:-1),p(),W(A.role===\"bot\"?5:-1),p(),W(n.shouldShowMessageCard(A)?6:-1),p(),W(A.functionCalls&&A.functionCalls.length>0?7:-1),p(),W(A.functionResponses&&A.functionResponses.length>0?8:-1),p(),W(A.role===\"bot\"&&n.hasStateDelta(i)?9:-1),p(),W(A.role===\"bot\"&&n.hasArtifactDelta(i)?10:-1),p(),X(\"ngClass\",fl(21,VkA,A.evalStatus===1,A.evalStatus===2)),p(2),qA(A.evalStatus===1?\"check\":A.evalStatus===2?\"close\":\"\"),p(2),qA(A.evalStatus===1?n.i18n.evalPassLabel:A.evalStatus===2?n.i18n.evalFailLabel:\"\"),p(),W(n.evalCase&&A.role===\"bot\"&&n.isEvalEditMode?16:-1),p(),W(A.role===\"user\"?17:-1),p(),W(n.isUserFeedbackEnabled()&&!n.isLoadingAgentResponse()&&A.role===\"bot\"?18:-1)}}function $SA(t,e){if(t&1){let A=zA();m(0,\"div\",7,0),$(\"scroll\",function(n){rA(A);let o=y();return sA(o.onScroll.next(n))}),V(2,$kA,2,0,\"div\",8),oi(3,\"async\"),oi(4,\"async\"),GA(5,\"div\",null,1),Gt(7,XSA,19,24,\"div\",9,Ri),D()}if(t&2){let A=y();p(2),W(li(3,1,A.uiStateService.isMessagesLoading())&&li(4,3,A.featureFlagService.isInfinityMessageScrollingEnabled())?2:-1),p(5),Kt(A.messages)}}function AxA(t,e){if(t&1){let A=zA();m(0,\"div\",77),GA(1,\"img\",78),m(2,\"button\",79),$(\"click\",function(){rA(A);let n=y().$index,o=y(4);return sA(o.removeFile.emit(n))}),m(3,\"mat-icon\",80),K(4,\"close\"),D()()()}if(t&2){let A=y().$implicit;p(),X(\"src\",A.url,Da)}}function exA(t,e){if(t&1){let A=zA();m(0,\"div\",76)(1,\"button\",79),$(\"click\",function(){rA(A);let n=y().$index,o=y(4);return sA(o.removeFile.emit(n))}),m(2,\"mat-icon\",80),K(3,\"close\"),D()(),m(4,\"div\",81)(5,\"mat-icon\"),K(6,\"insert_drive_file\"),D(),m(7,\"span\"),K(8),D()()()}if(t&2){let A=y().$implicit;p(8),qA(A.file.name)}}function txA(t,e){if(t&1&&(m(0,\"div\"),V(1,AxA,5,1,\"div\",77)(2,exA,9,1,\"div\",76),D()),t&2){let A=e.$implicit;p(),W(A.file.type.startsWith(\"image/\")?1:A.file.type.startsWith(\"image/\")?-1:2)}}function ixA(t,e){if(t&1){let A=zA();m(0,\"div\",76)(1,\"button\",79),$(\"click\",function(){rA(A);let n=y(4);return sA(n.removeStateUpdate.emit())}),m(2,\"mat-icon\",80),K(3,\"close\"),D()(),m(4,\"div\",81)(5,\"span\"),K(6),D()()()}if(t&2){let A=y(4);p(6),qA(A.i18n.updatedSessionStateChipLabel)}}function nxA(t,e){if(t&1&&(m(0,\"div\",68),Gt(1,txA,3,1,\"div\",null,Ri),V(3,ixA,7,1,\"div\",76),D()),t&2){let A=y(3);p(),Kt(A.selectedFiles),p(2),W(A.updatedSessionState?3:-1)}}function oxA(t,e){if(t&1){let A=zA();m(0,\"div\",65)(1,\"input\",66,3),$(\"change\",function(n){rA(A);let o=y(2);return sA(o.fileSelect.emit(n))}),D(),m(3,\"mat-form-field\",67),V(4,nxA,4,1,\"div\",68),m(5,\"textarea\",69),$(\"ngModelChange\",function(n){rA(A);let o=y(2);return sA(o.userInputChange.emit(n))})(\"keydown.enter\",function(n){rA(A);let o=y(2);return sA(o.sendMessage.emit(n))}),D(),m(6,\"div\",70)(7,\"div\")(8,\"button\",71),oi(9,\"async\"),$(\"click\",function(){rA(A);let n=Wi(2);return sA(n.click())}),m(10,\"mat-icon\"),K(11,\"attach_file\"),D()(),m(12,\"button\",72),oi(13,\"async\"),m(14,\"mat-icon\"),K(15,\"more_vert\"),D()(),m(16,\"mat-menu\",null,4)(18,\"span\",73),$(\"click\",function(){rA(A);let n=y(2);return sA(n.updateState.emit())}),K(19),D()()(),m(20,\"div\")(21,\"button\",74),oi(22,\"async\"),$(\"click\",function(){rA(A);let n=y(2);return sA(n.toggleAudioRecording.emit())}),m(23,\"mat-icon\"),K(24,\"mic\"),D()(),m(25,\"button\",75),oi(26,\"async\"),$(\"click\",function(){rA(A);let n=y(2);return sA(n.toggleVideoRecording.emit())}),m(27,\"mat-icon\"),K(28,\"videocam\"),D()()()()()()}if(t&2){let A=Wi(17),i=y(2);p(4),W(i.selectedFiles.length&&i.appName!=\"\"||i.updatedSessionState?4:-1),p(),X(\"ngModel\",i.userInput)(\"placeholder\",i.i18n.typeMessagePlaceholder),p(3),X(\"matTooltip\",i.i18n.uploadFileTooltip)(\"disabled\",!li(9,18,i.isMessageFileUploadEnabledObs)),p(4),X(\"matMenuTriggerFor\",A)(\"matTooltip\",i.i18n.moreOptionsTooltip)(\"disabled\",!li(13,20,i.isManualStateUpdateEnabledObs)),p(6),X(\"matTooltip\",i.i18n.updateStateMenuTooltip),p(),Fe(\" \",i.i18n.updateStateMenuLabel,\" \"),p(2),ae(\"recording\",i.isAudioRecording),X(\"matTooltip\",i.isAudioRecording?i.i18n.turnOffMicTooltip:i.i18n.useMicTooltip)(\"disabled\",!li(22,22,i.isBidiStreamingEnabledObs)),p(4),ae(\"recording\",i.isVideoRecording),X(\"matTooltip\",i.isVideoRecording?i.i18n.turnOffCamTooltip:i.i18n.useCamTooltip)(\"disabled\",!li(26,24,i.isBidiStreamingEnabledObs))}}function axA(t,e){if(t&1&&V(0,oxA,29,26,\"div\",65),t&2){let A=y();W(A.canEditSession()?0:-1)}}function rxA(t,e){t&1&&(m(0,\"div\",6),GA(1,\"mat-progress-spinner\",82),D())}var rtA=\"root_agent\",FE=class t{appName=\"\";sessionName=nt(\"\");messages=[];isChatMode=!0;evalCase=null;isEvalEditMode=!1;isEvalCaseEditing=!1;isEditFunctionArgsEnabled=!1;userInput=\"\";userEditEvalCaseMessage=\"\";selectedFiles=[];updatedSessionState=null;eventData=new Map;selectedEvent=void 0;isAudioRecording=!1;isVideoRecording=!1;hoveredEventMessageIndices=[];userId=\"\";sessionId=\"\";userInputChange=new WA;userEditEvalCaseMessageChange=new WA;clickEvent=new WA;handleKeydown=new WA;cancelEditMessage=new WA;saveEditMessage=new WA;openViewImageDialog=new WA;openBase64InNewTab=new WA;editEvalCaseMessage=new WA;deleteEvalCaseMessage=new WA;editFunctionArgs=new WA;fileSelect=new WA;removeFile=new WA;removeStateUpdate=new WA;sendMessage=new WA;updateState=new WA;toggleAudioRecording=new WA;toggleVideoRecording=new WA;longRunningResponseComplete=new WA;videoContainer;scrollContainer;textarea;scrollInterrupted=!1;scrollHeight=0;lastMessageRef=null;nextPageToken=\"\";i18n=h(atA);uiStateService=h(Tg);stringToColorService=h(CB);markdownComponent=h(pE);featureFlagService=h(lr);agentService=h(Ks);sessionService=h(Hg);destroyRef=h(Wa);MediaType=i1;JSON=JSON;isMessageFileUploadEnabledObs=this.featureFlagService.isMessageFileUploadEnabled();isManualStateUpdateEnabledObs=this.featureFlagService.isManualStateUpdateEnabled();isBidiStreamingEnabledObs=this.featureFlagService.isBidiStreamingEnabled();canEditSession=jA(!0);isUserFeedbackEnabled=Is(this.featureFlagService.isFeedbackServiceEnabled());isLoadingAgentResponse=Is(this.agentService.getLoadingState());onScroll=new $A;sanitizer=h(Wr);constructor(){pa(()=>{let e=this.sessionName();e&&(this.nextPageToken=\"\",this.uiStateService.lazyLoadMessages(e,{pageSize:100,pageToken:this.nextPageToken}).pipe(po()).subscribe())})}ngOnInit(){this.featureFlagService.isInfinityMessageScrollingEnabled().pipe(po(),We(e=>e),Ei(()=>Qi(this.uiStateService.onNewMessagesLoaded().pipe(Wt(e=>{this.nextPageToken=e.nextPageToken??\"\",e.isBackground||this.restoreScrollPosition()})),this.onScroll.pipe(Ei(e=>{let A=e.target;return A.scrollTop!==0?xa:this.nextPageToken?(this.scrollHeight=A.scrollHeight,this.uiStateService.lazyLoadMessages(this.sessionName(),{pageSize:100,pageToken:this.nextPageToken}).pipe(po(),Ho(()=>iL))):xa})))),br(this.destroyRef)).subscribe()}ngAfterViewInit(){this.scrollContainer?.nativeElement&&(this.scrollContainer.nativeElement.addEventListener(\"wheel\",()=>{this.scrollInterrupted=!0}),this.scrollContainer.nativeElement.addEventListener(\"touchmove\",()=>{this.scrollInterrupted=!0}))}ngOnChanges(e){if(e.messages){let A=this.messages[this.messages.length-1];A!==this.lastMessageRef&&((A?.role===\"user\"||A?.isLoading===!0)&&(this.scrollInterrupted=!1),this.scrollToBottom()),this.lastMessageRef=A}}scrollToBottom(){this.scrollInterrupted||setTimeout(()=>{this.scrollContainer?.nativeElement.scrollTo({top:this.scrollContainer.nativeElement.scrollHeight,behavior:\"auto\"})},50)}getAgentNameFromEvent(e){let A=this.messages[e].eventId;return this.eventData.get(A)?.author??rtA}customIconColorClass(e){let A=this.getAgentNameFromEvent(e);return A!==rtA?`custom-icon-color-${this.stringToColorService.stc(A).replace(\"#\",\"\")}`:\"\"}shouldMessageHighlighted(e){return this.hoveredEventMessageIndices.includes(e)}isMessageEventSelected(e){let A=this.messages[e];return A.eventId&&this.selectedEvent&&A.eventId===this.selectedEvent.id}shouldShowMessageCard(e){return!!(e.text||e.attachments||e.inlineData||e.executableCode||e.codeExecutionResult||e.a2uiData||e.renderedContent||e.isLoading||e.failedMetric&&e.evalStatus===2)}getBotEventNumber(e){let A=this.messages[e];if(A.role!==\"bot\"||!A.eventId)return-1;let i=[];for(let n=0;n<=e;n++){let o=this.messages[n];o.role===\"bot\"&&o.eventId&&!i.includes(o.eventId)&&i.push(o.eventId)}return i.indexOf(A.eventId)+1}getOverallEventNumber(e){let A=0,i=null,n=null;for(let o=0;o<=e;o++){let a=this.messages[o];if(a.role===\"user\"){if(i!==\"user\"&&(A++,i=\"user\"),o===e)return A}else if(a.role===\"bot\"&&a.eventId&&(a.eventId!==n&&(A++,n=a.eventId,i=\"bot\"),o===e))return A}return-1}isFirstUserMessageInGroup(e){return this.messages[e].role!==\"user\"?!1:e===0?!0:this.messages[e-1].role!==\"user\"}isFirstMessageInEventGroup(e){let A=this.messages[e];return A.role!==\"bot\"||!A.eventId?!1:e===0?!0:this.messages[e-1].eventId!==A.eventId}hasStateDelta(e){let A=this.messages[e];if(!A.eventId)return!1;let n=this.eventData.get(A.eventId)?.actions?.stateDelta;return n&&Object.keys(n).length>0}hasArtifactDelta(e){let A=this.messages[e];if(!A.eventId)return!1;let n=this.eventData.get(A.eventId)?.actions?.artifactDelta;return n&&Object.keys(n).length>0}renderGooglerSearch(e){return this.sanitizer.bypassSecurityTrustHtml(e)}restoreScrollPosition(){if(!this.scrollHeight){this.scrollInterrupted=!1,this.scrollToBottom();return}let e=this.scrollContainer?.nativeElement;e&&(e.scrollTop=e.scrollHeight-this.scrollHeight,this.scrollHeight=0)}isComputerUseClick(e){return ty(e)}isComputerUseResponse(e){return NE(e)}getFunctionCallArgsTooltip(e){if(!e.functionCall||!e.functionCall.args)return\"\";try{return JSON.stringify(e.functionCall.args)}catch(A){return String(e.functionCall.args)}}getFunctionResponseTooltip(e){if(!e.functionResponse||!e.functionResponse.response)return\"\";try{return JSON.stringify(e.functionResponse.response)}catch(A){return String(e.functionResponse.response)}}getStateDeltaTooltip(e){let A=this.messages[e];if(!A.eventId)return\"\";let n=this.eventData.get(A.eventId)?.actions?.stateDelta;if(!n)return\"\";try{return JSON.stringify(n)}catch(o){return String(n)}}getArtifactDeltaTooltip(e){let A=this.messages[e];if(!A.eventId)return\"\";let n=this.eventData.get(A.eventId)?.actions?.artifactDelta;if(!n)return\"\";try{return JSON.stringify(n)}catch(o){return String(n)}}handleRowClick(e,A,i){let n=window.getSelection();n&&n.toString().length>0||this.clickEvent.emit(i)}handleKeyboardNavigation(e){if(!this.selectedEvent||e.key!==\"ArrowUp\"&&e.key!==\"ArrowDown\")return;e.preventDefault();let A=new Map;for(let a=0;a<this.messages.length;a++){let r=this.messages[a];r.eventId&&!A.has(r.eventId)&&A.set(r.eventId,a)}let i=Array.from(A.values());if(i.length===0)return;let n=i.findIndex(a=>this.messages[a].eventId===this.selectedEvent.id);if(n===-1)return;let o;e.key===\"ArrowDown\"?o=n+1>=i.length?0:n+1:o=n-1<0?i.length-1:n-1,this.clickEvent.emit(i[o]),setTimeout(()=>{if(!this.scrollContainer?.nativeElement)return;let a=this.scrollContainer.nativeElement.querySelectorAll(\".message-column-container\");a&&a[i[o]]&&a[i[o]].scrollIntoView({behavior:\"smooth\",block:\"nearest\",inline:\"nearest\"})},0)}static \\u0275fac=function(A){return new(A||t)};static \\u0275cmp=kA({type:t,selectors:[[\"app-chat-panel\"]],viewQuery:function(A,i){if(A&1&&ni(OkA,5,ge)(zkA,5)(PkA,5),A&2){let n;Ce(n=Ie())&&(i.videoContainer=n.first),Ce(n=Ie())&&(i.scrollContainer=n.first),Ce(n=Ie())&&(i.textarea=n.first)}},hostBindings:function(A,i){A&1&&$(\"keydown\",function(o){return i.handleKeyboardNavigation(o)},RC)},inputs:{appName:\"appName\",sessionName:[1,\"sessionName\"],messages:\"messages\",isChatMode:\"isChatMode\",evalCase:\"evalCase\",isEvalEditMode:\"isEvalEditMode\",isEvalCaseEditing:\"isEvalCaseEditing\",isEditFunctionArgsEnabled:\"isEditFunctionArgsEnabled\",userInput:\"userInput\",userEditEvalCaseMessage:\"userEditEvalCaseMessage\",selectedFiles:\"selectedFiles\",updatedSessionState:\"updatedSessionState\",eventData:\"eventData\",selectedEvent:\"selectedEvent\",isAudioRecording:\"isAudioRecording\",isVideoRecording:\"isVideoRecording\",hoveredEventMessageIndices:\"hoveredEventMessageIndices\",userId:\"userId\",sessionId:\"sessionId\"},outputs:{userInputChange:\"userInputChange\",userEditEvalCaseMessageChange:\"userEditEvalCaseMessageChange\",clickEvent:\"clickEvent\",handleKeydown:\"handleKeydown\",cancelEditMessage:\"cancelEditMessage\",saveEditMessage:\"saveEditMessage\",openViewImageDialog:\"openViewImageDialog\",openBase64InNewTab:\"openBase64InNewTab\",editEvalCaseMessage:\"editEvalCaseMessage\",deleteEvalCaseMessage:\"deleteEvalCaseMessage\",editFunctionArgs:\"editFunctionArgs\",fileSelect:\"fileSelect\",removeFile:\"removeFile\",removeStateUpdate:\"removeStateUpdate\",sendMessage:\"sendMessage\",updateState:\"updateState\",toggleAudioRecording:\"toggleAudioRecording\",toggleVideoRecording:\"toggleVideoRecording\",longRunningResponseComplete:\"longRunningResponseComplete\"},features:[ei],decls:5,vars:5,consts:[[\"autoScroll\",\"\"],[\"videoContainer\",\"\"],[\"messageTextarea\",\"\"],[\"fileInput\",\"\"],[\"moreMenu\",\"matMenu\"],[1,\"chat-messages\"],[1,\"loading-spinner-container\"],[1,\"chat-messages\",3,\"scroll\"],[1,\"messages-loading-container\"],[1,\"message-row-container\"],[\"mode\",\"indeterminate\"],[1,\"message-column-container\",3,\"click\",\"ngClass\"],[1,\"event-number-container\",\"user-event-number\"],[3,\"ngClass\"],[1,\"event-number-container\"],[\"mat-mini-fab\",\"\",3,\"disabled\",\"matTooltip\",\"class\",\"ngClass\"],[1,\"message-card\",3,\"landing-message\",\"ngClass\"],[\"mat-stroked-button\",\"\",1,\"function-event-button\",\"state-delta-button\",3,\"ngClass\",\"appJsonTooltip\"],[\"mat-stroked-button\",\"\",1,\"function-event-button\",\"artifact-delta-button\",3,\"ngClass\",\"appJsonTooltip\"],[1,\"material-symbols-outlined\"],[\"mat-mini-fab\",\"\"],[3,\"sessionName\",\"eventId\"],[1,\"event-number-label\"],[1,\"event-number-placeholder\"],[\"mat-mini-fab\",\"\",3,\"disabled\",\"matTooltip\",\"ngClass\"],[\"fontSet\",\"material-symbols-outlined\"],[1,\"message-card\",3,\"ngClass\"],[\"mode\",\"buffer\",1,\"loading-bar\"],[1,\"attachments\"],[1,\"thought-chip\"],[3,\"beginRendering\",\"surfaceUpdate\",\"dataModelUpdate\"],[1,\"eval-compare-container\"],[1,\"attachment\"],[\"alt\",\"attachment\",1,\"image-preview-chat\",3,\"src\"],[\"download\",\"\",3,\"href\"],[1,\"edit-message-container\"],[3,\"ngComponentOutlet\",\"ngComponentOutletInputs\"],[\"rows\",\"4\",\"cols\",\"80\",1,\"message-textarea\",3,\"ngModelChange\",\"keydown\",\"ngModel\"],[1,\"edit-message-buttons-container\"],[1,\"material-symbols-outlined\",\"cancel-edit-button\",3,\"click\",\"matTooltip\"],[1,\"material-symbols-outlined\",\"save-edit-button\",3,\"click\",\"matTooltip\"],[3,\"innerHTML\"],[1,\"generated-image-container\"],[\"alt\",\"image\",1,\"generated-image\",3,\"click\",\"src\"],[3,\"base64data\"],[1,\"html-artifact-container\"],[1,\"link-style-button\",3,\"click\"],[\"alt\",\"image\",1,\"image-preview-chat\",3,\"click\",\"src\"],[1,\"actual-expected-compare-container\"],[1,\"score-threshold-container\"],[1,\"actual-result\"],[1,\"eval-response-header\",\"header-actual\"],[3,\"json\"],[1,\"expected-result\"],[1,\"eval-response-header\",\"header-expected\"],[1,\"header-actual\"],[1,\"header-expected\"],[3,\"functionCall\",\"allMessages\",\"index\"],[\"mat-stroked-button\",\"\",1,\"function-event-button\",3,\"ngClass\",\"appJsonTooltip\"],[3,\"functionCall\",\"appName\",\"userId\",\"sessionId\"],[3,\"clickEvent\",\"functionCall\",\"allMessages\",\"index\"],[3,\"responseComplete\",\"functionCall\",\"appName\",\"userId\",\"sessionId\"],[3,\"functionResponse\",\"allMessages\",\"index\"],[3,\"clickEvent\",\"functionResponse\",\"allMessages\",\"index\"],[1,\"material-symbols-outlined\",\"eval-case-edit-button\",3,\"click\",\"ngClass\",\"matTooltip\"],[1,\"chat-input\"],[\"type\",\"file\",\"multiple\",\"\",\"hidden\",\"\",3,\"change\"],[\"appearance\",\"outline\",1,\"input-field\"],[1,\"file-preview\"],[\"matInput\",\"\",\"cdkTextareaAutosize\",\"\",\"cdkAutosizeMinRows\",\"1\",\"cdkAutosizeMaxRows\",\"10\",1,\"chat-input-box\",3,\"ngModelChange\",\"keydown.enter\",\"ngModel\",\"placeholder\"],[1,\"chat-input-actions\"],[\"mat-icon-button\",\"\",1,\"function-event-button\",3,\"click\",\"matTooltip\",\"disabled\"],[\"mat-icon-button\",\"\",1,\"function-event-button\",3,\"matMenuTriggerFor\",\"matTooltip\",\"disabled\"],[\"mat-menu-item\",\"\",3,\"click\",\"matTooltip\"],[\"mat-icon-button\",\"\",\"matSuffix\",\"\",1,\"audio-rec-btn\",3,\"click\",\"matTooltip\",\"disabled\"],[\"mat-icon-button\",\"\",\"matSuffix\",\"\",1,\"video-rec-btn\",3,\"click\",\"matTooltip\",\"disabled\"],[1,\"file-container\"],[1,\"image-container\"],[\"alt\",\"preview\",1,\"image-preview\",3,\"src\"],[\"mat-icon-button\",\"\",1,\"delete-button\",3,\"click\"],[\"color\",\"warn\"],[1,\"file-info\"],[\"mode\",\"indeterminate\",\"diameter\",\"50\"]],template:function(A,i){if(A&1&&(wr(0),oi(1,\"async\"),V(2,$SA,9,5,\"div\",5),V(3,axA,1,1),V(4,rxA,2,0,\"div\",6)),A&2){let n=li(1,3,i.uiStateService.isSessionLoading());p(2),W(i.appName!=\"\"&&!n?2:-1),p(),W(i.appName!=\"\"&&i.isChatMode&&!n?3:-1),p(),W(n?4:-1)}},dependencies:[oa,Rg,FC,yn,ro,so,Ca,Ug,In,UU,nB,ttA,ey,Cs,vn,em,Ia,Fg,wa,To,n7,nm,_d,vr,b$,E0,DC,fE,ntA,uI,Gc,XC,oy,wB,gy,WC,Ba,ny,ay,ry,Pr],styles:[\"[_nghost-%COMP%]{display:flex;flex-direction:column;height:100%}.generated-image-container[_ngcontent-%COMP%]{max-width:400px}.generated-image[_ngcontent-%COMP%]{max-width:100%;min-width:40px;border-radius:8px}.html-artifact-container[_ngcontent-%COMP%]{width:100%;display:flex;justify-content:flex-start;align-items:center}.loading-bar[_ngcontent-%COMP%]{width:100px;margin:15px}.chat-messages[_ngcontent-%COMP%]{flex-grow:1;overflow-y:auto;padding:20px;margin-top:16px}.message-card[_ngcontent-%COMP%]{padding:5px 20px;margin:5px;border-radius:20px;max-width:80%;font-size:14px;font-weight:400;position:relative;display:inline-block}.message-card.message-card--highlighted[_ngcontent-%COMP%]{background-color:var(--chat-panel-function-event-button-highlight-background-color)}.message-card.landing-message[_ngcontent-%COMP%]{border:2px solid var(--chat-panel-landing-message-border-color, #4285f4);background-color:var(--chat-panel-landing-message-background-color, #e8f0fe)}.function-event-button[_ngcontent-%COMP%]{background-color:var(--chat-panel-function-event-button-background-color);margin:5px;font-size:13px!important;padding:6px 12px!important;min-height:32px!important;height:32px!important}.function-event-button[_ngcontent-%COMP%]   mat-icon[_ngcontent-%COMP%]{font-size:18px!important;width:18px!important;height:18px!important}.state-delta-button[_ngcontent-%COMP%], .artifact-delta-button[_ngcontent-%COMP%]{background-color:var(--chat-panel-function-event-button-background-color)!important}.function-event-button-highlight[_ngcontent-%COMP%]{background-color:var(--chat-panel-function-event-button-highlight-background-color);border-color:var(--chat-panel-function-event-button-highlight-border-color)!important;color:var(--chat-panel-function-event-button-highlight-color)!important}.message-column-container[_ngcontent-%COMP%]{display:flex;flex-direction:row;margin-left:-20px;margin-right:-20px;padding:8px 20px;border:2px solid transparent;border-radius:4px;background-color:transparent;transition:background-color .2s ease;cursor:pointer}.message-column-container[_ngcontent-%COMP%]:hover{background-color:#4285f414}.message-column-container.selected[_ngcontent-%COMP%]{background-color:#4285f433!important;border:2px solid rgba(66,133,244,.6);border-radius:4px}.user-message[_ngcontent-%COMP%]{display:flex;justify-content:flex-end;align-items:center;flex-grow:1}.user-message[_ngcontent-%COMP%]   .message-card[_ngcontent-%COMP%]{background-color:var(--chat-panel-user-message-message-card-background-color);align-self:flex-end;color:var(--chat-panel-user-message-message-card-color);box-shadow:none}.bot-message[_ngcontent-%COMP%]{display:flex;flex-wrap:wrap;align-items:center;flex-grow:1}.bot-message[_ngcontent-%COMP%]   .message-card[_ngcontent-%COMP%]{background-color:var(--chat-panel-bot-message-message-card-background-color);align-self:flex-start;color:var(--chat-panel-bot-message-message-card-color);box-shadow:none}.bot-message[_ngcontent-%COMP%]:focus-within   .message-card[_ngcontent-%COMP%]{background-color:var(--chat-panel-bot-message-focus-within-message-card-background-color);border:1px solid var(--chat-panel-bot-message-focus-within-message-card-border-color)}.message-textarea[_ngcontent-%COMP%]{background-color:var(--chat-panel-message-textarea-background-color);max-width:100%;border:none;font-family:Google Sans,Helvetica Neue,sans-serif}.message-textarea[_ngcontent-%COMP%]:focus{background-color:var(--chat-panel-message-textarea-focus-background-color);outline:none}.edit-message-buttons-container[_ngcontent-%COMP%]{display:flex;justify-content:flex-end}.message-card[_ngcontent-%COMP%]   .eval-compare-container[_ngcontent-%COMP%]{visibility:hidden;position:absolute;left:10px;z-index:10;background-color:var(--chat-panel-eval-compare-container-background-color);overflow:hidden;border-radius:20px;padding:5px 20px;margin-bottom:10px;font-size:16px}.message-card[_ngcontent-%COMP%]   .eval-compare-container[_ngcontent-%COMP%]   .actual-result[_ngcontent-%COMP%]{border-right:2px solid var(--chat-panel-actual-result-border-right-color);padding-right:8px;min-width:350px;max-width:350px}.message-card[_ngcontent-%COMP%]   .eval-compare-container[_ngcontent-%COMP%]   .expected-result[_ngcontent-%COMP%]{padding-left:12px;min-width:350px;max-width:350px}.message-card[_ngcontent-%COMP%]:hover   .eval-compare-container[_ngcontent-%COMP%]{visibility:visible}.actual-expected-compare-container[_ngcontent-%COMP%]{display:flex}.score-threshold-container[_ngcontent-%COMP%]{display:flex;justify-content:center;gap:10px;align-items:center;margin-top:15px;font-size:14px;font-weight:600}.eval-response-header[_ngcontent-%COMP%]{padding-bottom:5px;border-bottom:2px solid var(--chat-panel-eval-response-header-border-bottom-color);font-style:italic;font-weight:700}.header-expected[_ngcontent-%COMP%]{color:var(--chat-panel-header-expected-color)}.header-actual[_ngcontent-%COMP%]{color:var(--chat-panel-header-actual-color)}.eval-case-edit-button[_ngcontent-%COMP%]{cursor:pointer;margin-left:4px;margin-right:4px}.eval-pass[_ngcontent-%COMP%]{display:flex;color:var(--chat-panel-eval-pass-color)}.eval-fail[_ngcontent-%COMP%]{display:flex;color:var(--chat-panel-eval-fail-color)}.hidden[_ngcontent-%COMP%]{visibility:hidden}.chat-input[_ngcontent-%COMP%]{display:flex;padding:10px;width:60%;margin:0 auto;position:relative;z-index:1}.input-field[_ngcontent-%COMP%]{flex-grow:1;position:relative;z-index:1}.input-field[_ngcontent-%COMP%]   textarea[_ngcontent-%COMP%]{color:var(--chat-panel-input-field-textarea-color);border:none;padding:10px;box-sizing:content-box;caret-color:var(--chat-panel-input-field-textarea-caret-color)}.input-field[_ngcontent-%COMP%]   textarea[_ngcontent-%COMP%]::placeholder{color:var(--chat-panel-input-field-textarea-placeholder-color)}.input-field[_ngcontent-%COMP%]   button[_ngcontent-%COMP%]{color:var(--chat-panel-input-field-button-color);background-color:var(--chat-panel-input-field-button-background-color)}.chat-input-actions[_ngcontent-%COMP%]{width:106%;margin-top:10px;display:flex;justify-content:space-between;align-items:center;max-width:100%}.chat-input-actions[_ngcontent-%COMP%]   button[_ngcontent-%COMP%]{margin-left:10px;margin-right:10px}.file-preview[_ngcontent-%COMP%]{display:flex;flex-wrap:wrap;gap:5px;margin-top:2px;margin-bottom:8px}.image-preview-chat[_ngcontent-%COMP%]{max-width:90%;max-height:70vh;width:auto;height:auto;border-radius:8px;cursor:pointer;transition:transform .2s ease-in-out}.attachment[_ngcontent-%COMP%]{display:flex;align-items:center}[_nghost-%COMP%]     .mat-mdc-mini-fab{background-color:var(--chat-panel-mat-mdc-mini-fab-background-color, #4285f4)}[_nghost-%COMP%]     .mat-mdc-mini-fab mat-icon{color:var(--chat-panel-mat-mdc-mini-fab-mat-icon-color, white)}[_nghost-%COMP%]     .mat-mdc-mini-fab.mat-mdc-button-disabled{background-color:#fff3!important}[_nghost-%COMP%]     .mat-mdc-mini-fab.mat-mdc-button-disabled mat-icon{color:#fff9!important}[_nghost-%COMP%]     .message-text p{white-space:pre-line;word-break:break-word;overflow-wrap:break-word}[_nghost-%COMP%]     .input-field .mat-mdc-text-field-wrapper{border:1px solid var(--chat-panel-input-field-mat-mdc-text-field-wrapper-border-color);border-radius:16px}.image-container[_ngcontent-%COMP%]{position:relative;display:inline-block;border-radius:12px;overflow:hidden}.image-preview[_ngcontent-%COMP%]{display:block;width:100%;height:auto;border-radius:12px;width:80px;height:80px}.delete-button[_ngcontent-%COMP%]{position:absolute;top:1px;right:1px;background-color:var(--chat-panel-delete-button-background-color);border:none;border-radius:50%;padding:8px;cursor:pointer;color:var(--chat-panel-delete-button-color);display:flex;align-items:center;justify-content:center;margin-right:0;scale:.7}.delete-button[_ngcontent-%COMP%]   mat-icon[_ngcontent-%COMP%]{font-size:20px}.file-container[_ngcontent-%COMP%]{position:relative;display:flex;flex-direction:column;gap:8px;height:80px;background-color:var(--chat-panel-file-container-background-color);border-radius:12px}.file-info[_ngcontent-%COMP%]{margin-right:60px;padding-top:20px;padding-left:16px}.thought-chip[_ngcontent-%COMP%]{border-radius:5px;background-color:var(--chat-panel-thought-chip-background-color);width:80px;text-align:center;margin-top:5px}.event-number-container[_ngcontent-%COMP%]{display:flex;flex-direction:column;align-self:center;min-width:30px}.bot-message[_ngcontent-%COMP%]   .event-number-container[_ngcontent-%COMP%]{margin-right:8px}.user-event-number[_ngcontent-%COMP%]{margin-right:8px;align-self:center}.event-number-label[_ngcontent-%COMP%], .event-number-placeholder[_ngcontent-%COMP%]{font-size:14px;font-weight:600;text-align:center;display:inline-block}.event-number-label[_ngcontent-%COMP%]{color:var(--chat-panel-event-number-label-color, #5f6368)}.event-number-placeholder[_ngcontent-%COMP%]{visibility:hidden}[_nghost-%COMP%]     pre{white-space:pre-wrap;word-break:break-word;overflow-x:auto;max-width:100%}.link-style-button[_ngcontent-%COMP%]{background:none;border:none;padding:0;font:inherit;color:var(--chat-panel-link-style-button-color)!important;text-decoration:underline;cursor:pointer;outline:none;font-size:14px}.cancel-edit-button[_ngcontent-%COMP%]{width:24px;height:24px;color:var(--chat-mat-mdc-text-field-wrapper-border-color);cursor:pointer;margin-right:16px}.save-edit-button[_ngcontent-%COMP%]{width:24px;height:24px;color:var(--mat-sys-primary);cursor:pointer;margin-right:16px}.chat-input-box[_ngcontent-%COMP%]{caret-color:#fff}button.audio-rec-btn[_ngcontent-%COMP%], button.video-rec-btn[_ngcontent-%COMP%]{background-color:var(--chat-card-background-color)}button.audio-rec-btn.recording[_ngcontent-%COMP%], button.video-rec-btn.recording[_ngcontent-%COMP%]{background-color:var(--chat-panel-eval-fail-color)}.loading-spinner-container[_ngcontent-%COMP%]{display:flex;justify-content:center;align-items:center;height:100%}.messages-loading-container[_ngcontent-%COMP%]{margin-top:1em;margin-bottom:1em}\"]})};var sxA={cancelButton:\"Cancel\",saveButton:\"Save\",invalidJsonAlert:\"Invalid JSON: \"},stA=new wA(\"Edit Json Dialog Messages\",{factory:()=>sxA});var Wu=class t{constructor(e,A){this.dialogRef=e;this.data=A;this.jsonString=JSON.stringify(A.jsonContent,null,2),this.functionName=A.functionName||\"\"}jsonEditorComponent=Xo(cc);jsonString=\"\";functionName=\"\";i18n=h(stA);ngOnInit(){}onSave(){try{this.jsonString=this.jsonEditorComponent().getJsonString();let e=JSON.parse(this.jsonString);this.dialogRef.close(e)}catch(e){alert(this.i18n.invalidJsonAlert+e)}}onCancel(){this.dialogRef.close(null)}static \\u0275fac=function(A){return new(A||t)(lt(Fo),lt(da))};static \\u0275cmp=kA({type:t,selectors:[[\"app-edit-json-dialog\"]],viewQuery:function(A,i){A&1&&Or(i.jsonEditorComponent,cc,5),A&2&&rr()},decls:11,vars:5,consts:[[1,\"dialog-container\"],[\"mat-dialog-title\",\"\"],[1,\"editor\"],[3,\"jsonString\"],[\"align\",\"end\"],[\"mat-button\",\"\",\"mat-dialog-close\",\"\"],[\"mat-button\",\"\",\"cdkFocusInitial\",\"\",3,\"click\"]],template:function(A,i){A&1&&(m(0,\"div\",0)(1,\"h2\",1),K(2),D(),m(3,\"mat-dialog-content\",2),K(4),GA(5,\"app-json-editor\",3),D(),m(6,\"mat-dialog-actions\",4)(7,\"button\",5),K(8),D(),m(9,\"button\",6),$(\"click\",function(){return i.onSave()}),K(10),D()()()),A&2&&(p(2),qA(i.data.dialogHeader),p(2),Fe(\" \",i.functionName,\" \"),p(),X(\"jsonString\",i.jsonString),p(3),qA(i.i18n.cancelButton),p(2),qA(i.i18n.saveButton))},dependencies:[ya,gr,cc,Ta,vn,VC],styles:[\".dialog-container[_ngcontent-%COMP%]{border-radius:12px;padding:18px;width:500px;box-shadow:0 8px 16px var(--edit-json-dialog-container-box-shadow-color)}.editor[_ngcontent-%COMP%]{padding-top:12px;height:300px}\"]})};var gxA=[[[\"caption\"]],[[\"colgroup\"],[\"col\"]],\"*\"],lxA=[\"caption\",\"colgroup, col\",\"*\"];function cxA(t,e){t&1&&He(0,2)}function CxA(t,e){t&1&&(m(0,\"thead\",0),$i(1,1),D(),m(2,\"tbody\",0),$i(3,2)(4,3),D(),m(5,\"tfoot\",0),$i(6,4),D())}function IxA(t,e){t&1&&$i(0,1)(1,2)(2,3)(3,4)}var Bc=new wA(\"CDK_TABLE\");var Iy=(()=>{class t{template=h(Fn);constructor(){}static \\u0275fac=function(i){return new(i||t)};static \\u0275dir=OA({type:t,selectors:[[\"\",\"cdkCellDef\",\"\"]]})}return t})(),dy=(()=>{class t{template=h(Fn);constructor(){}static \\u0275fac=function(i){return new(i||t)};static \\u0275dir=OA({type:t,selectors:[[\"\",\"cdkHeaderCellDef\",\"\"]]})}return t})(),ctA=(()=>{class t{template=h(Fn);constructor(){}static \\u0275fac=function(i){return new(i||t)};static \\u0275dir=OA({type:t,selectors:[[\"\",\"cdkFooterCellDef\",\"\"]]})}return t})(),LE=(()=>{class t{_table=h(Bc,{optional:!0});_hasStickyChanged=!1;get name(){return this._name}set name(A){this._setNameInput(A)}_name;get sticky(){return this._sticky}set sticky(A){A!==this._sticky&&(this._sticky=A,this._hasStickyChanged=!0)}_sticky=!1;get stickyEnd(){return this._stickyEnd}set stickyEnd(A){A!==this._stickyEnd&&(this._stickyEnd=A,this._hasStickyChanged=!0)}_stickyEnd=!1;cell;headerCell;footerCell;cssClassFriendlyName;_columnCssClassName;constructor(){}hasStickyChanged(){let A=this._hasStickyChanged;return this.resetStickyChanged(),A}resetStickyChanged(){this._hasStickyChanged=!1}_updateColumnCssClassName(){this._columnCssClassName=[`cdk-column-${this.cssClassFriendlyName}`]}_setNameInput(A){A&&(this._name=A,this.cssClassFriendlyName=A.replace(/[^a-z0-9_-]/gi,\"-\"),this._updateColumnCssClassName())}static \\u0275fac=function(i){return new(i||t)};static \\u0275dir=OA({type:t,selectors:[[\"\",\"cdkColumnDef\",\"\"]],contentQueries:function(i,n,o){if(i&1&&na(o,Iy,5)(o,dy,5)(o,ctA,5),i&2){let a;Ce(a=Ie())&&(n.cell=a.first),Ce(a=Ie())&&(n.headerCell=a.first),Ce(a=Ie())&&(n.footerCell=a.first)}},inputs:{name:[0,\"cdkColumnDef\",\"name\"],sticky:[2,\"sticky\",\"sticky\",he],stickyEnd:[2,\"stickyEnd\",\"stickyEnd\",he]}})}return t})(),Cy=class{constructor(e,A){A.nativeElement.classList.add(...e._columnCssClassName)}},CtA=(()=>{class t extends Cy{constructor(){super(h(LE),h(ge))}static \\u0275fac=function(i){return new(i||t)};static \\u0275dir=OA({type:t,selectors:[[\"cdk-header-cell\"],[\"th\",\"cdk-header-cell\",\"\"]],hostAttrs:[\"role\",\"columnheader\",1,\"cdk-header-cell\"],features:[Ct]})}return t})();var ItA=(()=>{class t extends Cy{constructor(){let A=h(LE),i=h(ge);super(A,i);let n=A._table?._getCellRole();n&&i.nativeElement.setAttribute(\"role\",n)}static \\u0275fac=function(i){return new(i||t)};static \\u0275dir=OA({type:t,selectors:[[\"cdk-cell\"],[\"td\",\"cdk-cell\",\"\"]],hostAttrs:[1,\"cdk-cell\"],features:[Ct]})}return t})();var aF=(()=>{class t{template=h(Fn);_differs=h(kI);columns;_columnsDiffer;constructor(){}ngOnChanges(A){if(!this._columnsDiffer){let i=A.columns&&A.columns.currentValue||[];this._columnsDiffer=this._differs.find(i).create(),this._columnsDiffer.diff(i)}}getColumnsDiff(){return this._columnsDiffer.diff(this.columns)}extractCellTemplate(A){return this instanceof Xu?A.headerCell.template:this instanceof rF?A.footerCell.template:A.cell.template}static \\u0275fac=function(i){return new(i||t)};static \\u0275dir=OA({type:t,features:[ei]})}return t})(),Xu=(()=>{class t extends aF{_table=h(Bc,{optional:!0});_hasStickyChanged=!1;get sticky(){return this._sticky}set sticky(A){A!==this._sticky&&(this._sticky=A,this._hasStickyChanged=!0)}_sticky=!1;constructor(){super(h(Fn),h(kI))}ngOnChanges(A){super.ngOnChanges(A)}hasStickyChanged(){let A=this._hasStickyChanged;return this.resetStickyChanged(),A}resetStickyChanged(){this._hasStickyChanged=!1}static \\u0275fac=function(i){return new(i||t)};static \\u0275dir=OA({type:t,selectors:[[\"\",\"cdkHeaderRowDef\",\"\"]],inputs:{columns:[0,\"cdkHeaderRowDef\",\"columns\"],sticky:[2,\"cdkHeaderRowDefSticky\",\"sticky\",he]},features:[Ct,ei]})}return t})(),rF=(()=>{class t extends aF{_table=h(Bc,{optional:!0});_hasStickyChanged=!1;get sticky(){return this._sticky}set sticky(A){A!==this._sticky&&(this._sticky=A,this._hasStickyChanged=!0)}_sticky=!1;constructor(){super(h(Fn),h(kI))}ngOnChanges(A){super.ngOnChanges(A)}hasStickyChanged(){let A=this._hasStickyChanged;return this.resetStickyChanged(),A}resetStickyChanged(){this._hasStickyChanged=!1}static \\u0275fac=function(i){return new(i||t)};static \\u0275dir=OA({type:t,selectors:[[\"\",\"cdkFooterRowDef\",\"\"]],inputs:{columns:[0,\"cdkFooterRowDef\",\"columns\"],sticky:[2,\"cdkFooterRowDefSticky\",\"sticky\",he]},features:[Ct,ei]})}return t})(),By=(()=>{class t extends aF{_table=h(Bc,{optional:!0});when;constructor(){super(h(Fn),h(kI))}static \\u0275fac=function(i){return new(i||t)};static \\u0275dir=OA({type:t,selectors:[[\"\",\"cdkRowDef\",\"\"]],inputs:{columns:[0,\"cdkRowDefColumns\",\"columns\"],when:[0,\"cdkRowDefWhen\",\"when\"]},features:[Ct]})}return t})(),Id=(()=>{class t{_viewContainer=h(Ro);cells;context;static mostRecentCellOutlet=null;constructor(){t.mostRecentCellOutlet=this}ngOnDestroy(){t.mostRecentCellOutlet===this&&(t.mostRecentCellOutlet=null)}static \\u0275fac=function(i){return new(i||t)};static \\u0275dir=OA({type:t,selectors:[[\"\",\"cdkCellOutlet\",\"\"]]})}return t})(),sF=(()=>{class t{static \\u0275fac=function(i){return new(i||t)};static \\u0275cmp=kA({type:t,selectors:[[\"cdk-header-row\"],[\"tr\",\"cdk-header-row\",\"\"]],hostAttrs:[\"role\",\"row\",1,\"cdk-header-row\"],decls:1,vars:0,consts:[[\"cdkCellOutlet\",\"\"]],template:function(i,n){i&1&&$i(0,0)},dependencies:[Id],encapsulation:2})}return t})();var gF=(()=>{class t{static \\u0275fac=function(i){return new(i||t)};static \\u0275cmp=kA({type:t,selectors:[[\"cdk-row\"],[\"tr\",\"cdk-row\",\"\"]],hostAttrs:[\"role\",\"row\",1,\"cdk-row\"],decls:1,vars:0,consts:[[\"cdkCellOutlet\",\"\"]],template:function(i,n){i&1&&$i(0,0)},dependencies:[Id],encapsulation:2})}return t})(),dtA=(()=>{class t{templateRef=h(Fn);_contentClassNames=[\"cdk-no-data-row\",\"cdk-row\"];_cellClassNames=[\"cdk-cell\",\"cdk-no-data-cell\"];_cellSelector=\"td, cdk-cell, [cdk-cell], .cdk-cell\";constructor(){}static \\u0275fac=function(i){return new(i||t)};static \\u0275dir=OA({type:t,selectors:[[\"ng-template\",\"cdkNoDataRow\",\"\"]]})}return t})(),gtA=[\"top\",\"bottom\",\"left\",\"right\"],oF=class{_isNativeHtmlTable;_stickCellCss;_isBrowser;_needsPositionStickyOnElement;direction;_positionListener;_tableInjector;_elemSizeCache=new WeakMap;_resizeObserver=globalThis?.ResizeObserver?new globalThis.ResizeObserver(e=>this._updateCachedSizes(e)):null;_updatedStickyColumnsParamsToReplay=[];_stickyColumnsReplayTimeout=null;_cachedCellWidths=[];_borderCellCss;_destroyed=!1;constructor(e,A,i=!0,n=!0,o,a,r){this._isNativeHtmlTable=e,this._stickCellCss=A,this._isBrowser=i,this._needsPositionStickyOnElement=n,this.direction=o,this._positionListener=a,this._tableInjector=r,this._borderCellCss={top:`${A}-border-elem-top`,bottom:`${A}-border-elem-bottom`,left:`${A}-border-elem-left`,right:`${A}-border-elem-right`}}clearStickyPositioning(e,A){(A.includes(\"left\")||A.includes(\"right\"))&&this._removeFromStickyColumnReplayQueue(e);let i=[];for(let n of e)n.nodeType===n.ELEMENT_NODE&&i.push(n,...Array.from(n.children));Nn({write:()=>{for(let n of i)this._removeStickyStyle(n,A)}},{injector:this._tableInjector})}updateStickyColumns(e,A,i,n=!0,o=!0){if(!e.length||!this._isBrowser||!(A.some(E=>E)||i.some(E=>E))){this._positionListener?.stickyColumnsUpdated({sizes:[]}),this._positionListener?.stickyEndColumnsUpdated({sizes:[]});return}let a=e[0],r=a.children.length,s=this.direction===\"rtl\",g=s?\"right\":\"left\",l=s?\"left\":\"right\",C=A.lastIndexOf(!0),I=i.indexOf(!0),d,B,Q;o&&this._updateStickyColumnReplayQueue({rows:[...e],stickyStartStates:[...A],stickyEndStates:[...i]}),Nn({earlyRead:()=>{d=this._getCellWidths(a,n),B=this._getStickyStartColumnPositions(d,A),Q=this._getStickyEndColumnPositions(d,i)},write:()=>{for(let E of e)for(let f=0;f<r;f++){let b=E.children[f];A[f]&&this._addStickyStyle(b,g,B[f],f===C),i[f]&&this._addStickyStyle(b,l,Q[f],f===I)}this._positionListener&&d.some(E=>!!E)&&(this._positionListener.stickyColumnsUpdated({sizes:C===-1?[]:d.slice(0,C+1).map((E,f)=>A[f]?E:null)}),this._positionListener.stickyEndColumnsUpdated({sizes:I===-1?[]:d.slice(I).map((E,f)=>i[f+I]?E:null).reverse()}))}},{injector:this._tableInjector})}stickRows(e,A,i){if(!this._isBrowser)return;let n=i===\"bottom\"?e.slice().reverse():e,o=i===\"bottom\"?A.slice().reverse():A,a=[],r=[],s=[];Nn({earlyRead:()=>{for(let g=0,l=0;g<n.length;g++){if(!o[g])continue;a[g]=l;let C=n[g];s[g]=this._isNativeHtmlTable?Array.from(C.children):[C];let I=this._retrieveElementSize(C).height;l+=I,r[g]=I}},write:()=>{let g=o.lastIndexOf(!0);for(let l=0;l<n.length;l++){if(!o[l])continue;let C=a[l],I=l===g;for(let d of s[l])this._addStickyStyle(d,i,C,I)}i===\"top\"?this._positionListener?.stickyHeaderRowsUpdated({sizes:r,offsets:a,elements:s}):this._positionListener?.stickyFooterRowsUpdated({sizes:r,offsets:a,elements:s})}},{injector:this._tableInjector})}updateStickyFooterContainer(e,A){this._isNativeHtmlTable&&Nn({write:()=>{let i=e.querySelector(\"tfoot\");i&&(A.some(n=>!n)?this._removeStickyStyle(i,[\"bottom\"]):this._addStickyStyle(i,\"bottom\",0,!1))}},{injector:this._tableInjector})}destroy(){this._stickyColumnsReplayTimeout&&clearTimeout(this._stickyColumnsReplayTimeout),this._resizeObserver?.disconnect(),this._destroyed=!0}_removeStickyStyle(e,A){if(!e.classList.contains(this._stickCellCss))return;for(let n of A)e.style[n]=\"\",e.classList.remove(this._borderCellCss[n]);gtA.some(n=>A.indexOf(n)===-1&&e.style[n])?e.style.zIndex=this._getCalculatedZIndex(e):(e.style.zIndex=\"\",this._needsPositionStickyOnElement&&(e.style.position=\"\"),e.classList.remove(this._stickCellCss))}_addStickyStyle(e,A,i,n){e.classList.add(this._stickCellCss),n&&e.classList.add(this._borderCellCss[A]),e.style[A]=`${i}px`,e.style.zIndex=this._getCalculatedZIndex(e),this._needsPositionStickyOnElement&&(e.style.cssText+=\"position: -webkit-sticky; position: sticky; \")}_getCalculatedZIndex(e){let A={top:100,bottom:10,left:1,right:1},i=0;for(let n of gtA)e.style[n]&&(i+=A[n]);return i?`${i}`:\"\"}_getCellWidths(e,A=!0){if(!A&&this._cachedCellWidths.length)return this._cachedCellWidths;let i=[],n=e.children;for(let o=0;o<n.length;o++){let a=n[o];i.push(this._retrieveElementSize(a).width)}return this._cachedCellWidths=i,i}_getStickyStartColumnPositions(e,A){let i=[],n=0;for(let o=0;o<e.length;o++)A[o]&&(i[o]=n,n+=e[o]);return i}_getStickyEndColumnPositions(e,A){let i=[],n=0;for(let o=e.length;o>0;o--)A[o]&&(i[o]=n,n+=e[o]);return i}_retrieveElementSize(e){let A=this._elemSizeCache.get(e);if(A)return A;let i=e.getBoundingClientRect(),n={width:i.width,height:i.height};return this._resizeObserver&&(this._elemSizeCache.set(e,n),this._resizeObserver.observe(e,{box:\"border-box\"})),n}_updateStickyColumnReplayQueue(e){this._removeFromStickyColumnReplayQueue(e.rows),this._stickyColumnsReplayTimeout||this._updatedStickyColumnsParamsToReplay.push(e)}_removeFromStickyColumnReplayQueue(e){let A=new Set(e);for(let i of this._updatedStickyColumnsParamsToReplay)i.rows=i.rows.filter(n=>!A.has(n));this._updatedStickyColumnsParamsToReplay=this._updatedStickyColumnsParamsToReplay.filter(i=>!!i.rows.length)}_updateCachedSizes(e){let A=!1;for(let i of e){let n=i.borderBoxSize?.length?{width:i.borderBoxSize[0].inlineSize,height:i.borderBoxSize[0].blockSize}:{width:i.contentRect.width,height:i.contentRect.height};n.width!==this._elemSizeCache.get(i.target)?.width&&dxA(i.target)&&(A=!0),this._elemSizeCache.set(i.target,n)}A&&this._updatedStickyColumnsParamsToReplay.length&&(this._stickyColumnsReplayTimeout&&clearTimeout(this._stickyColumnsReplayTimeout),this._stickyColumnsReplayTimeout=setTimeout(()=>{if(!this._destroyed){for(let i of this._updatedStickyColumnsParamsToReplay)this.updateStickyColumns(i.rows,i.stickyStartStates,i.stickyEndStates,!0,!1);this._updatedStickyColumnsParamsToReplay=[],this._stickyColumnsReplayTimeout=null}},0))}};function dxA(t){return[\"cdk-cell\",\"cdk-header-cell\",\"cdk-footer-cell\"].some(e=>t.classList.contains(e))}var Zu=new wA(\"STICKY_POSITIONING_LISTENER\");var lF=(()=>{class t{viewContainer=h(Ro);elementRef=h(ge);constructor(){let A=h(Bc);A._rowOutlet=this,A._outletAssigned()}static \\u0275fac=function(i){return new(i||t)};static \\u0275dir=OA({type:t,selectors:[[\"\",\"rowOutlet\",\"\"]]})}return t})(),cF=(()=>{class t{viewContainer=h(Ro);elementRef=h(ge);constructor(){let A=h(Bc);A._headerRowOutlet=this,A._outletAssigned()}static \\u0275fac=function(i){return new(i||t)};static \\u0275dir=OA({type:t,selectors:[[\"\",\"headerRowOutlet\",\"\"]]})}return t})(),CF=(()=>{class t{viewContainer=h(Ro);elementRef=h(ge);constructor(){let A=h(Bc);A._footerRowOutlet=this,A._outletAssigned()}static \\u0275fac=function(i){return new(i||t)};static \\u0275dir=OA({type:t,selectors:[[\"\",\"footerRowOutlet\",\"\"]]})}return t})(),IF=(()=>{class t{viewContainer=h(Ro);elementRef=h(ge);constructor(){let A=h(Bc);A._noDataRowOutlet=this,A._outletAssigned()}static \\u0275fac=function(i){return new(i||t)};static \\u0275dir=OA({type:t,selectors:[[\"\",\"noDataRowOutlet\",\"\"]]})}return t})(),dF=(()=>{class t{_differs=h(kI);_changeDetectorRef=h(ft);_elementRef=h(ge);_dir=h(wo,{optional:!0});_platform=h(ci);_viewRepeater;_viewportRuler=h(Bs);_injector=h(ut);_virtualScrollViewport=h(JU,{optional:!0,host:!0});_positionListener=h(Zu,{optional:!0})||h(Zu,{optional:!0,skipSelf:!0});_document=h(Zt);_data;_renderedRange;_onDestroy=new $A;_renderRows;_renderChangeSubscription=null;_columnDefsByName=new Map;_rowDefs;_headerRowDefs;_footerRowDefs;_dataDiffer;_defaultRowDef=null;_customColumnDefs=new Set;_customRowDefs=new Set;_customHeaderRowDefs=new Set;_customFooterRowDefs=new Set;_customNoDataRow=null;_headerRowDefChanged=!0;_footerRowDefChanged=!0;_stickyColumnStylesNeedReset=!0;_forceRecalculateCellWidths=!0;_cachedRenderRowsMap=new Map;_isNativeHtmlTable;_stickyStyler;stickyCssClass=\"cdk-table-sticky\";needsPositionStickyOnElement=!0;_isServer;_isShowingNoDataRow=!1;_hasAllOutlets=!1;_hasInitialized=!1;_headerRowStickyUpdates=new $A;_footerRowStickyUpdates=new $A;_disableVirtualScrolling=!1;_getCellRole(){if(this._cellRoleInternal===void 0){let A=this._elementRef.nativeElement.getAttribute(\"role\");return A===\"grid\"||A===\"treegrid\"?\"gridcell\":\"cell\"}return this._cellRoleInternal}_cellRoleInternal=void 0;get trackBy(){return this._trackByFn}set trackBy(A){this._trackByFn=A}_trackByFn;get dataSource(){return this._dataSource}set dataSource(A){this._dataSource!==A&&(this._switchDataSource(A),this._changeDetectorRef.markForCheck())}_dataSource;_dataSourceChanges=new $A;_dataStream=new $A;get multiTemplateDataRows(){return this._multiTemplateDataRows}set multiTemplateDataRows(A){this._multiTemplateDataRows=A,this._rowOutlet&&this._rowOutlet.viewContainer.length&&(this._forceRenderDataRows(),this.updateStickyColumnStyles())}_multiTemplateDataRows=!1;get fixedLayout(){return this._virtualScrollEnabled()?!0:this._fixedLayout}set fixedLayout(A){this._fixedLayout=A,this._forceRecalculateCellWidths=!0,this._stickyColumnStylesNeedReset=!0}_fixedLayout=!1;recycleRows=!1;contentChanged=new WA;viewChange=new Jt({start:0,end:Number.MAX_VALUE});_rowOutlet;_headerRowOutlet;_footerRowOutlet;_noDataRowOutlet;_contentColumnDefs;_contentRowDefs;_contentHeaderRowDefs;_contentFooterRowDefs;_noDataRow;constructor(){h(new bs(\"role\"),{optional:!0})||this._elementRef.nativeElement.setAttribute(\"role\",\"table\"),this._isServer=!this._platform.isBrowser,this._isNativeHtmlTable=this._elementRef.nativeElement.nodeName===\"TABLE\",this._dataDiffer=this._differs.find([]).create((i,n)=>this.trackBy?this.trackBy(n.dataIndex,n.data):n)}ngOnInit(){this._setupStickyStyler(),this._viewportRuler.change().pipe(Bt(this._onDestroy)).subscribe(()=>{this._forceRecalculateCellWidths=!0})}ngAfterContentInit(){this._viewRepeater=this.recycleRows||this._virtualScrollEnabled()?new ap:new yp,this._virtualScrollEnabled()&&this._setupVirtualScrolling(this._virtualScrollViewport),this._hasInitialized=!0}ngAfterContentChecked(){this._canRender()&&this._render()}ngOnDestroy(){this._stickyStyler?.destroy(),[this._rowOutlet?.viewContainer,this._headerRowOutlet?.viewContainer,this._footerRowOutlet?.viewContainer,this._cachedRenderRowsMap,this._customColumnDefs,this._customRowDefs,this._customHeaderRowDefs,this._customFooterRowDefs,this._columnDefsByName].forEach(A=>{A?.clear()}),this._headerRowDefs=[],this._footerRowDefs=[],this._defaultRowDef=null,this._headerRowStickyUpdates.complete(),this._footerRowStickyUpdates.complete(),this._onDestroy.next(),this._onDestroy.complete(),A4(this.dataSource)&&this.dataSource.disconnect(this)}renderRows(){this._renderRows=this._getAllRenderRows();let A=this._dataDiffer.diff(this._renderRows);if(!A){this._updateNoDataRow(),this.contentChanged.next();return}let i=this._rowOutlet.viewContainer;this._viewRepeater.applyChanges(A,i,(n,o,a)=>this._getEmbeddedViewArgs(n.item,a),n=>n.item.data,n=>{n.operation===kl.INSERTED&&n.context&&this._renderCellTemplateForItem(n.record.item.rowDef,n.context)}),this._updateRowIndexContext(),A.forEachIdentityChange(n=>{let o=i.get(n.currentIndex);o.context.$implicit=n.item.data}),this._updateNoDataRow(),this.contentChanged.next(),this.updateStickyColumnStyles()}addColumnDef(A){this._customColumnDefs.add(A)}removeColumnDef(A){this._customColumnDefs.delete(A)}addRowDef(A){this._customRowDefs.add(A)}removeRowDef(A){this._customRowDefs.delete(A)}addHeaderRowDef(A){this._customHeaderRowDefs.add(A),this._headerRowDefChanged=!0}removeHeaderRowDef(A){this._customHeaderRowDefs.delete(A),this._headerRowDefChanged=!0}addFooterRowDef(A){this._customFooterRowDefs.add(A),this._footerRowDefChanged=!0}removeFooterRowDef(A){this._customFooterRowDefs.delete(A),this._footerRowDefChanged=!0}setNoDataRow(A){this._customNoDataRow=A}updateStickyHeaderRowStyles(){let A=this._getRenderedRows(this._headerRowOutlet);if(this._isNativeHtmlTable){let n=ltA(this._headerRowOutlet,\"thead\");n&&(n.style.display=A.length?\"\":\"none\")}let i=this._headerRowDefs.map(n=>n.sticky);this._stickyStyler.clearStickyPositioning(A,[\"top\"]),this._stickyStyler.stickRows(A,i,\"top\"),this._headerRowDefs.forEach(n=>n.resetStickyChanged())}updateStickyFooterRowStyles(){let A=this._getRenderedRows(this._footerRowOutlet);if(this._isNativeHtmlTable){let n=ltA(this._footerRowOutlet,\"tfoot\");n&&(n.style.display=A.length?\"\":\"none\")}let i=this._footerRowDefs.map(n=>n.sticky);this._stickyStyler.clearStickyPositioning(A,[\"bottom\"]),this._stickyStyler.stickRows(A,i,\"bottom\"),this._stickyStyler.updateStickyFooterContainer(this._elementRef.nativeElement,i),this._footerRowDefs.forEach(n=>n.resetStickyChanged())}updateStickyColumnStyles(){let A=this._getRenderedRows(this._headerRowOutlet),i=this._getRenderedRows(this._rowOutlet),n=this._getRenderedRows(this._footerRowOutlet);(this._isNativeHtmlTable&&!this.fixedLayout||this._stickyColumnStylesNeedReset)&&(this._stickyStyler.clearStickyPositioning([...A,...i,...n],[\"left\",\"right\"]),this._stickyColumnStylesNeedReset=!1),A.forEach((o,a)=>{this._addStickyColumnStyles([o],this._headerRowDefs[a])}),this._rowDefs.forEach(o=>{let a=[];for(let r=0;r<i.length;r++)this._renderRows[r].rowDef===o&&a.push(i[r]);this._addStickyColumnStyles(a,o)}),n.forEach((o,a)=>{this._addStickyColumnStyles([o],this._footerRowDefs[a])}),Array.from(this._columnDefsByName.values()).forEach(o=>o.resetStickyChanged())}stickyColumnsUpdated(A){this._positionListener?.stickyColumnsUpdated(A)}stickyEndColumnsUpdated(A){this._positionListener?.stickyEndColumnsUpdated(A)}stickyHeaderRowsUpdated(A){this._headerRowStickyUpdates.next(A),this._positionListener?.stickyHeaderRowsUpdated(A)}stickyFooterRowsUpdated(A){this._footerRowStickyUpdates.next(A),this._positionListener?.stickyFooterRowsUpdated(A)}_outletAssigned(){!this._hasAllOutlets&&this._rowOutlet&&this._headerRowOutlet&&this._footerRowOutlet&&this._noDataRowOutlet&&(this._hasAllOutlets=!0,this._canRender()&&this._render())}_canRender(){return this._hasAllOutlets&&this._hasInitialized}_render(){this._cacheRowDefs(),this._cacheColumnDefs(),!this._headerRowDefs.length&&!this._footerRowDefs.length&&this._rowDefs.length;let i=this._renderUpdatedColumns()||this._headerRowDefChanged||this._footerRowDefChanged;this._stickyColumnStylesNeedReset=this._stickyColumnStylesNeedReset||i,this._forceRecalculateCellWidths=i,this._headerRowDefChanged&&(this._forceRenderHeaderRows(),this._headerRowDefChanged=!1),this._footerRowDefChanged&&(this._forceRenderFooterRows(),this._footerRowDefChanged=!1),this.dataSource&&this._rowDefs.length>0&&!this._renderChangeSubscription?this._observeRenderChanges():this._stickyColumnStylesNeedReset&&this.updateStickyColumnStyles(),this._checkStickyStates()}_getAllRenderRows(){if(!Array.isArray(this._data)||!this._renderedRange)return[];let A=[],i=Math.min(this._data.length,this._renderedRange.end),n=this._cachedRenderRowsMap;this._cachedRenderRowsMap=new Map;for(let o=this._renderedRange.start;o<i;o++){let a=this._data[o],r=this._getRenderRowsForData(a,o,n.get(a));this._cachedRenderRowsMap.has(a)||this._cachedRenderRowsMap.set(a,new WeakMap);for(let s=0;s<r.length;s++){let g=r[s],l=this._cachedRenderRowsMap.get(g.data);l.has(g.rowDef)?l.get(g.rowDef).push(g):l.set(g.rowDef,[g]),A.push(g)}}return A}_getRenderRowsForData(A,i,n){return this._getRowDefs(A,i).map(a=>{let r=n&&n.has(a)?n.get(a):[];if(r.length){let s=r.shift();return s.dataIndex=i,s}else return{data:A,rowDef:a,dataIndex:i}})}_cacheColumnDefs(){this._columnDefsByName.clear(),cy(this._getOwnDefs(this._contentColumnDefs),this._customColumnDefs).forEach(i=>{this._columnDefsByName.has(i.name),this._columnDefsByName.set(i.name,i)})}_cacheRowDefs(){this._headerRowDefs=cy(this._getOwnDefs(this._contentHeaderRowDefs),this._customHeaderRowDefs),this._footerRowDefs=cy(this._getOwnDefs(this._contentFooterRowDefs),this._customFooterRowDefs),this._rowDefs=cy(this._getOwnDefs(this._contentRowDefs),this._customRowDefs);let A=this._rowDefs.filter(i=>!i.when);this._defaultRowDef=A[0]}_renderUpdatedColumns(){let A=(a,r)=>{let s=!!r.getColumnsDiff();return a||s},i=this._rowDefs.reduce(A,!1);i&&this._forceRenderDataRows();let n=this._headerRowDefs.reduce(A,!1);n&&this._forceRenderHeaderRows();let o=this._footerRowDefs.reduce(A,!1);return o&&this._forceRenderFooterRows(),i||n||o}_switchDataSource(A){this._data=[],A4(this.dataSource)&&this.dataSource.disconnect(this),this._renderChangeSubscription&&(this._renderChangeSubscription.unsubscribe(),this._renderChangeSubscription=null),A||(this._dataDiffer&&this._dataDiffer.diff([]),this._rowOutlet&&this._rowOutlet.viewContainer.clear()),this._dataSource=A}_observeRenderChanges(){if(!this.dataSource)return;let A;A4(this.dataSource)?A=this.dataSource.connect(this):hd(this.dataSource)?A=this.dataSource:Array.isArray(this.dataSource)&&(A=oe(this.dataSource)),this._renderChangeSubscription=Va([A,this.viewChange]).pipe(Bt(this._onDestroy)).subscribe(([i,n])=>{this._data=i||[],this._renderedRange=n,this._dataStream.next(i),this.renderRows()})}_forceRenderHeaderRows(){this._headerRowOutlet.viewContainer.length>0&&this._headerRowOutlet.viewContainer.clear(),this._headerRowDefs.forEach((A,i)=>this._renderRow(this._headerRowOutlet,A,i)),this.updateStickyHeaderRowStyles()}_forceRenderFooterRows(){this._footerRowOutlet.viewContainer.length>0&&this._footerRowOutlet.viewContainer.clear(),this._footerRowDefs.forEach((A,i)=>this._renderRow(this._footerRowOutlet,A,i)),this.updateStickyFooterRowStyles()}_addStickyColumnStyles(A,i){let n=Array.from(i?.columns||[]).map(r=>{let s=this._columnDefsByName.get(r);return s}),o=n.map(r=>r.sticky),a=n.map(r=>r.stickyEnd);this._stickyStyler.updateStickyColumns(A,o,a,!this.fixedLayout||this._forceRecalculateCellWidths)}_getRenderedRows(A){let i=[];for(let n=0;n<A.viewContainer.length;n++){let o=A.viewContainer.get(n);i.push(o.rootNodes[0])}return i}_getRowDefs(A,i){if(this._rowDefs.length===1)return[this._rowDefs[0]];let n=[];if(this.multiTemplateDataRows)n=this._rowDefs.filter(o=>!o.when||o.when(i,A));else{let o=this._rowDefs.find(a=>a.when&&a.when(i,A))||this._defaultRowDef;o&&n.push(o)}return n.length,n}_getEmbeddedViewArgs(A,i){let n=A.rowDef,o={$implicit:A.data};return{templateRef:n.template,context:o,index:i}}_renderRow(A,i,n,o={}){let a=A.viewContainer.createEmbeddedView(i.template,o,n);return this._renderCellTemplateForItem(i,o),a}_renderCellTemplateForItem(A,i){for(let n of this._getCellTemplates(A))Id.mostRecentCellOutlet&&Id.mostRecentCellOutlet._viewContainer.createEmbeddedView(n,i);this._changeDetectorRef.markForCheck()}_updateRowIndexContext(){let A=this._rowOutlet.viewContainer;for(let i=0,n=A.length;i<n;i++){let a=A.get(i).context;a.count=n,a.first=i===0,a.last=i===n-1,a.even=i%2===0,a.odd=!a.even,this.multiTemplateDataRows?(a.dataIndex=this._renderRows[i].dataIndex,a.renderIndex=i):a.index=this._renderRows[i].dataIndex}}_getCellTemplates(A){return!A||!A.columns?[]:Array.from(A.columns,i=>{let n=this._columnDefsByName.get(i);return A.extractCellTemplate(n)})}_forceRenderDataRows(){this._dataDiffer.diff([]),this._rowOutlet.viewContainer.clear(),this.renderRows()}_checkStickyStates(){let A=(i,n)=>i||n.hasStickyChanged();this._headerRowDefs.reduce(A,!1)&&this.updateStickyHeaderRowStyles(),this._footerRowDefs.reduce(A,!1)&&this.updateStickyFooterRowStyles(),Array.from(this._columnDefsByName.values()).reduce(A,!1)&&(this._stickyColumnStylesNeedReset=!0,this.updateStickyColumnStyles())}_setupStickyStyler(){let A=this._dir?this._dir.value:\"ltr\",i=this._injector;this._stickyStyler=new oF(this._isNativeHtmlTable,this.stickyCssClass,this._platform.isBrowser,this.needsPositionStickyOnElement,A,this,i),(this._dir?this._dir.change:oe()).pipe(Bt(this._onDestroy)).subscribe(n=>{this._stickyStyler.direction=n,this.updateStickyColumnStyles()})}_setupVirtualScrolling(A){let i=typeof requestAnimationFrame<\"u\"?Qd:Iv;this.viewChange.next({start:0,end:0}),A.renderedRangeStream.pipe(yI(0,i),Bt(this._onDestroy)).subscribe(this.viewChange),A.attach({dataStream:this._dataStream,measureRangeSize:(n,o)=>this._measureRangeSize(n,o)}),Va([A.renderedContentOffset,this._headerRowStickyUpdates]).pipe(Bt(this._onDestroy)).subscribe(([n,o])=>{if(!(!o.sizes||!o.offsets||!o.elements))for(let a=0;a<o.elements.length;a++){let r=o.elements[a];if(r){let s=o.offsets[a],g=n!==0?Math.max(n-s,s):-s;for(let l of r)l.style.top=`${-g}px`}}}),Va([A.renderedContentOffset,this._footerRowStickyUpdates]).pipe(Bt(this._onDestroy)).subscribe(([n,o])=>{if(!(!o.sizes||!o.offsets||!o.elements))for(let a=0;a<o.elements.length;a++){let r=o.elements[a];if(r)for(let s of r)s.style.bottom=`${n+o.offsets[a]}px`}})}_getOwnDefs(A){return A.filter(i=>!i._table||i._table===this)}_updateNoDataRow(){let A=this._customNoDataRow||this._noDataRow;if(!A)return;let i=this._rowOutlet.viewContainer.length===0;if(i===this._isShowingNoDataRow)return;let n=this._noDataRowOutlet.viewContainer;if(i){let o=n.createEmbeddedView(A.templateRef),a=o.rootNodes[0];if(o.rootNodes.length===1&&a?.nodeType===this._document.ELEMENT_NODE){a.setAttribute(\"role\",\"row\"),a.classList.add(...A._contentClassNames);let r=a.querySelectorAll(A._cellSelector);for(let s=0;s<r.length;s++)r[s].classList.add(...A._cellClassNames)}}else n.clear();this._isShowingNoDataRow=i,this._changeDetectorRef.markForCheck()}_measureRangeSize(A,i){if(A.start>=A.end||i!==\"vertical\")return 0;let n=this.viewChange.value,o=this._rowOutlet.viewContainer;A.start<n.start||A.end>n.end;let a=A.start-n.start,r=A.end-A.start,s,g;for(let I=0;I<r;I++){let d=o.get(I+a);if(d&&d.rootNodes.length){s=g=d.rootNodes[0];break}}for(let I=r-1;I>-1;I--){let d=o.get(I+a);if(d&&d.rootNodes.length){g=d.rootNodes[d.rootNodes.length-1];break}}let l=s?.getBoundingClientRect?.(),C=g?.getBoundingClientRect?.();return l&&C?C.bottom-l.top:0}_virtualScrollEnabled(){return!this._disableVirtualScrolling&&this._virtualScrollViewport!=null}static \\u0275fac=function(i){return new(i||t)};static \\u0275cmp=kA({type:t,selectors:[[\"cdk-table\"],[\"table\",\"cdk-table\",\"\"]],contentQueries:function(i,n,o){if(i&1&&na(o,dtA,5)(o,LE,5)(o,By,5)(o,Xu,5)(o,rF,5),i&2){let a;Ce(a=Ie())&&(n._noDataRow=a.first),Ce(a=Ie())&&(n._contentColumnDefs=a),Ce(a=Ie())&&(n._contentRowDefs=a),Ce(a=Ie())&&(n._contentHeaderRowDefs=a),Ce(a=Ie())&&(n._contentFooterRowDefs=a)}},hostAttrs:[1,\"cdk-table\"],hostVars:2,hostBindings:function(i,n){i&2&&ae(\"cdk-table-fixed-layout\",n.fixedLayout)},inputs:{trackBy:\"trackBy\",dataSource:\"dataSource\",multiTemplateDataRows:[2,\"multiTemplateDataRows\",\"multiTemplateDataRows\",he],fixedLayout:[2,\"fixedLayout\",\"fixedLayout\",he],recycleRows:[2,\"recycleRows\",\"recycleRows\",he]},outputs:{contentChanged:\"contentChanged\"},exportAs:[\"cdkTable\"],features:[It([{provide:Bc,useExisting:t},{provide:Zu,useValue:null}])],ngContentSelectors:lxA,decls:5,vars:2,consts:[[\"role\",\"rowgroup\"],[\"headerRowOutlet\",\"\"],[\"rowOutlet\",\"\"],[\"noDataRowOutlet\",\"\"],[\"footerRowOutlet\",\"\"]],template:function(i,n){i&1&&(Yt(gxA),He(0),He(1,1),V(2,cxA,1,0),V(3,CxA,7,0)(4,IxA,4,0)),i&2&&(p(2),W(n._isServer?2:-1),p(),W(n._isNativeHtmlTable?3:4))},dependencies:[cF,lF,IF,CF],styles:[`.cdk-table-fixed-layout{table-layout:fixed}\n`],encapsulation:2})}return t})();function cy(t,e){return t.concat(Array.from(e))}function ltA(t,e){let A=e.toUpperCase(),i=t.viewContainer.element.nativeElement;for(;i;){let n=i.nodeType===1?i.nodeName:null;if(n===A)return i;if(n===\"TABLE\")break;i=i.parentNode}return null}var BxA=[[[\"caption\"]],[[\"colgroup\"],[\"col\"]],\"*\"],QxA=[\"caption\",\"colgroup, col\",\"*\"];function ExA(t,e){t&1&&He(0,2)}function hxA(t,e){t&1&&(m(0,\"thead\",0),$i(1,1),D(),m(2,\"tbody\",2),$i(3,3)(4,4),D(),m(5,\"tfoot\",0),$i(6,5),D())}function uxA(t,e){t&1&&$i(0,1)(1,3)(2,4)(3,5)}var BtA=(()=>{class t extends dF{stickyCssClass=\"mat-mdc-table-sticky\";needsPositionStickyOnElement=!1;static \\u0275fac=(()=>{let A;return function(n){return(A||(A=hi(t)))(n||t)}})();static \\u0275cmp=kA({type:t,selectors:[[\"mat-table\"],[\"table\",\"mat-table\",\"\"]],hostAttrs:[1,\"mat-mdc-table\",\"mdc-data-table__table\"],hostVars:2,hostBindings:function(i,n){i&2&&ae(\"mat-table-fixed-layout\",n.fixedLayout)},exportAs:[\"matTable\"],features:[It([{provide:dF,useExisting:t},{provide:Bc,useExisting:t},{provide:Zu,useValue:null}]),Ct],ngContentSelectors:QxA,decls:5,vars:2,consts:[[\"role\",\"rowgroup\"],[\"headerRowOutlet\",\"\"],[\"role\",\"rowgroup\",1,\"mdc-data-table__content\"],[\"rowOutlet\",\"\"],[\"noDataRowOutlet\",\"\"],[\"footerRowOutlet\",\"\"]],template:function(i,n){i&1&&(Yt(BxA),He(0),He(1,1),V(2,ExA,1,0),V(3,hxA,7,0)(4,uxA,4,0)),i&2&&(p(2),W(n._isServer?2:-1),p(),W(n._isNativeHtmlTable?3:4))},dependencies:[cF,lF,IF,CF],styles:[`.mat-mdc-table-sticky{position:sticky !important}mat-table{display:block}mat-header-row{min-height:var(--mat-table-header-container-height, 56px)}mat-row{min-height:var(--mat-table-row-item-container-height, 52px)}mat-footer-row{min-height:var(--mat-table-footer-container-height, 52px)}mat-row,mat-header-row,mat-footer-row{display:flex;border-width:0;border-bottom-width:1px;border-style:solid;align-items:center;box-sizing:border-box}mat-cell:first-of-type,mat-header-cell:first-of-type,mat-footer-cell:first-of-type{padding-left:24px}[dir=rtl] mat-cell:first-of-type:not(:only-of-type),[dir=rtl] mat-header-cell:first-of-type:not(:only-of-type),[dir=rtl] mat-footer-cell:first-of-type:not(:only-of-type){padding-left:0;padding-right:24px}mat-cell:last-of-type,mat-header-cell:last-of-type,mat-footer-cell:last-of-type{padding-right:24px}[dir=rtl] mat-cell:last-of-type:not(:only-of-type),[dir=rtl] mat-header-cell:last-of-type:not(:only-of-type),[dir=rtl] mat-footer-cell:last-of-type:not(:only-of-type){padding-right:0;padding-left:24px}mat-cell,mat-header-cell,mat-footer-cell{flex:1;display:flex;align-items:center;overflow:hidden;word-wrap:break-word;min-height:inherit}.mat-mdc-table{min-width:100%;border:0;border-spacing:0;table-layout:auto;white-space:normal;background-color:var(--mat-table-background-color, var(--mat-sys-surface))}.mat-table-fixed-layout{table-layout:fixed}.mdc-data-table__cell{box-sizing:border-box;overflow:hidden;text-align:start;text-overflow:ellipsis}.mdc-data-table__cell,.mdc-data-table__header-cell{padding:0 16px}.mat-mdc-header-row{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;height:var(--mat-table-header-container-height, 56px);color:var(--mat-table-header-headline-color, var(--mat-sys-on-surface, rgba(0, 0, 0, 0.87)));font-family:var(--mat-table-header-headline-font, var(--mat-sys-title-small-font, Roboto, sans-serif));line-height:var(--mat-table-header-headline-line-height, var(--mat-sys-title-small-line-height));font-size:var(--mat-table-header-headline-size, var(--mat-sys-title-small-size, 14px));font-weight:var(--mat-table-header-headline-weight, var(--mat-sys-title-small-weight, 500))}.mat-mdc-row{height:var(--mat-table-row-item-container-height, 52px);color:var(--mat-table-row-item-label-text-color, var(--mat-sys-on-surface, rgba(0, 0, 0, 0.87)))}.mat-mdc-row,.mdc-data-table__content{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:var(--mat-table-row-item-label-text-font, var(--mat-sys-body-medium-font, Roboto, sans-serif));line-height:var(--mat-table-row-item-label-text-line-height, var(--mat-sys-body-medium-line-height));font-size:var(--mat-table-row-item-label-text-size, var(--mat-sys-body-medium-size, 14px));font-weight:var(--mat-table-row-item-label-text-weight, var(--mat-sys-body-medium-weight))}.mat-mdc-footer-row{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;height:var(--mat-table-footer-container-height, 52px);color:var(--mat-table-row-item-label-text-color, var(--mat-sys-on-surface, rgba(0, 0, 0, 0.87)));font-family:var(--mat-table-footer-supporting-text-font, var(--mat-sys-body-medium-font, Roboto, sans-serif));line-height:var(--mat-table-footer-supporting-text-line-height, var(--mat-sys-body-medium-line-height));font-size:var(--mat-table-footer-supporting-text-size, var(--mat-sys-body-medium-size, 14px));font-weight:var(--mat-table-footer-supporting-text-weight, var(--mat-sys-body-medium-weight));letter-spacing:var(--mat-table-footer-supporting-text-tracking, var(--mat-sys-body-medium-tracking))}.mat-mdc-header-cell{border-bottom-color:var(--mat-table-row-item-outline-color, var(--mat-sys-outline, rgba(0, 0, 0, 0.12)));border-bottom-width:var(--mat-table-row-item-outline-width, 1px);border-bottom-style:solid;letter-spacing:var(--mat-table-header-headline-tracking, var(--mat-sys-title-small-tracking));font-weight:inherit;line-height:inherit;box-sizing:border-box;text-overflow:ellipsis;overflow:hidden;outline:none;text-align:start}.mdc-data-table__row:last-child>.mat-mdc-header-cell{border-bottom:none}.mat-mdc-cell{border-bottom-color:var(--mat-table-row-item-outline-color, var(--mat-sys-outline, rgba(0, 0, 0, 0.12)));border-bottom-width:var(--mat-table-row-item-outline-width, 1px);border-bottom-style:solid;letter-spacing:var(--mat-table-row-item-label-text-tracking, var(--mat-sys-body-medium-tracking));line-height:inherit}.mdc-data-table__row:last-child>.mat-mdc-cell{border-bottom:none}.mat-mdc-footer-cell{letter-spacing:var(--mat-table-row-item-label-text-tracking, var(--mat-sys-body-medium-tracking))}mat-row.mat-mdc-row,mat-header-row.mat-mdc-header-row,mat-footer-row.mat-mdc-footer-row{border-bottom:none}.mat-mdc-table tbody,.mat-mdc-table tfoot,.mat-mdc-table thead,.mat-mdc-cell,.mat-mdc-footer-cell,.mat-mdc-header-row,.mat-mdc-row,.mat-mdc-footer-row,.mat-mdc-table .mat-mdc-header-cell{background:inherit}.mat-mdc-table mat-header-row.mat-mdc-header-row,.mat-mdc-table mat-row.mat-mdc-row,.mat-mdc-table mat-footer-row.mat-mdc-footer-cell{height:unset}mat-header-cell.mat-mdc-header-cell,mat-cell.mat-mdc-cell,mat-footer-cell.mat-mdc-footer-cell{align-self:stretch}\n`],encapsulation:2})}return t})(),QtA=(()=>{class t extends Iy{static \\u0275fac=(()=>{let A;return function(n){return(A||(A=hi(t)))(n||t)}})();static \\u0275dir=OA({type:t,selectors:[[\"\",\"matCellDef\",\"\"]],features:[It([{provide:Iy,useExisting:t}]),Ct]})}return t})(),EtA=(()=>{class t extends dy{static \\u0275fac=(()=>{let A;return function(n){return(A||(A=hi(t)))(n||t)}})();static \\u0275dir=OA({type:t,selectors:[[\"\",\"matHeaderCellDef\",\"\"]],features:[It([{provide:dy,useExisting:t}]),Ct]})}return t})();var htA=(()=>{class t extends LE{get name(){return this._name}set name(A){this._setNameInput(A)}_updateColumnCssClassName(){super._updateColumnCssClassName(),this._columnCssClassName.push(`mat-column-${this.cssClassFriendlyName}`)}static \\u0275fac=(()=>{let A;return function(n){return(A||(A=hi(t)))(n||t)}})();static \\u0275dir=OA({type:t,selectors:[[\"\",\"matColumnDef\",\"\"]],inputs:{name:[0,\"matColumnDef\",\"name\"]},features:[It([{provide:LE,useExisting:t}]),Ct]})}return t})(),utA=(()=>{class t extends CtA{static \\u0275fac=(()=>{let A;return function(n){return(A||(A=hi(t)))(n||t)}})();static \\u0275dir=OA({type:t,selectors:[[\"mat-header-cell\"],[\"th\",\"mat-header-cell\",\"\"]],hostAttrs:[\"role\",\"columnheader\",1,\"mat-mdc-header-cell\",\"mdc-data-table__header-cell\"],features:[Ct]})}return t})();var ftA=(()=>{class t extends ItA{static \\u0275fac=(()=>{let A;return function(n){return(A||(A=hi(t)))(n||t)}})();static \\u0275dir=OA({type:t,selectors:[[\"mat-cell\"],[\"td\",\"mat-cell\",\"\"]],hostAttrs:[1,\"mat-mdc-cell\",\"mdc-data-table__cell\"],features:[Ct]})}return t})();var mtA=(()=>{class t extends Xu{static \\u0275fac=(()=>{let A;return function(n){return(A||(A=hi(t)))(n||t)}})();static \\u0275dir=OA({type:t,selectors:[[\"\",\"matHeaderRowDef\",\"\"]],inputs:{columns:[0,\"matHeaderRowDef\",\"columns\"],sticky:[2,\"matHeaderRowDefSticky\",\"sticky\",he]},features:[It([{provide:Xu,useExisting:t}]),Ct]})}return t})();var ptA=(()=>{class t extends By{static \\u0275fac=(()=>{let A;return function(n){return(A||(A=hi(t)))(n||t)}})();static \\u0275dir=OA({type:t,selectors:[[\"\",\"matRowDef\",\"\"]],inputs:{columns:[0,\"matRowDefColumns\",\"columns\"],when:[0,\"matRowDefWhen\",\"when\"]},features:[It([{provide:By,useExisting:t}]),Ct]})}return t})(),DtA=(()=>{class t extends sF{static \\u0275fac=(()=>{let A;return function(n){return(A||(A=hi(t)))(n||t)}})();static \\u0275cmp=kA({type:t,selectors:[[\"mat-header-row\"],[\"tr\",\"mat-header-row\",\"\"]],hostAttrs:[\"role\",\"row\",1,\"mat-mdc-header-row\",\"mdc-data-table__header-row\"],exportAs:[\"matHeaderRow\"],features:[It([{provide:sF,useExisting:t}]),Ct],decls:1,vars:0,consts:[[\"cdkCellOutlet\",\"\"]],template:function(i,n){i&1&&$i(0,0)},dependencies:[Id],encapsulation:2})}return t})();var wtA=(()=>{class t extends gF{static \\u0275fac=(()=>{let A;return function(n){return(A||(A=hi(t)))(n||t)}})();static \\u0275cmp=kA({type:t,selectors:[[\"mat-row\"],[\"tr\",\"mat-row\",\"\"]],hostAttrs:[\"role\",\"row\",1,\"mat-mdc-row\",\"mdc-data-table__row\"],exportAs:[\"matRow\"],features:[It([{provide:gF,useExisting:t}]),Ct],decls:1,vars:0,consts:[[\"cdkCellOutlet\",\"\"]],template:function(i,n){i&1&&$i(0,0)},dependencies:[Id],encapsulation:2})}return t})();var fxA=9007199254740991,$u=class extends $h{_data;_renderData=new Jt([]);_filter=new Jt(\"\");_internalPageChanges=new $A;_renderChangesSubscription=null;filteredData;get data(){return this._data.value}set data(e){e=Array.isArray(e)?e:[],this._data.next(e),this._renderChangesSubscription||this._filterData(e)}get filter(){return this._filter.value}set filter(e){this._filter.next(e),this._renderChangesSubscription||this._filterData(this.data)}get sort(){return this._sort}set sort(e){this._sort=e,this._updateChangeSubscription()}_sort;get paginator(){return this._paginator}set paginator(e){this._paginator=e,this._updateChangeSubscription()}_paginator;sortingDataAccessor=(e,A)=>{let i=e[A];if(Jf(i)){let n=Number(i);return n<fxA?n:i}return i};sortData=(e,A)=>{let i=A.active,n=A.direction;return!i||n==\"\"?e:e.sort((o,a)=>{let r=this.sortingDataAccessor(o,i),s=this.sortingDataAccessor(a,i),g=typeof r,l=typeof s;g!==l&&(g===\"number\"&&(r+=\"\"),l===\"number\"&&(s+=\"\"));let C=0;return r!=null&&s!=null?r>s?C=1:r<s&&(C=-1):r!=null?C=1:s!=null&&(C=-1),C*(n==\"asc\"?1:-1)})};filterPredicate=(e,A)=>{let i=A.trim().toLowerCase();return Object.values(e).some(n=>`${n}`.toLowerCase().includes(i))};constructor(e=[]){super(),this._data=new Jt(e),this._updateChangeSubscription()}_updateChangeSubscription(){let e=this._sort?Qi(this._sort.sortChange,this._sort.initialized):oe(null),A=this._paginator?Qi(this._paginator.page,this._internalPageChanges,this._paginator.initialized):oe(null),i=this._data,n=Va([i,this._filter]).pipe(fe(([r])=>this._filterData(r))),o=Va([n,e]).pipe(fe(([r])=>this._orderData(r))),a=Va([o,A]).pipe(fe(([r])=>this._pageData(r)));this._renderChangesSubscription?.unsubscribe(),this._renderChangesSubscription=a.subscribe(r=>this._renderData.next(r))}_filterData(e){return this.filteredData=this.filter==null||this.filter===\"\"?e:e.filter(A=>this.filterPredicate(A,this.filter)),this.paginator&&this._updatePaginator(this.filteredData.length),this.filteredData}_orderData(e){return this.sort?this.sortData(e.slice(),this.sort):e}_pageData(e){if(!this.paginator)return e;let A=this.paginator.pageIndex*this.paginator.pageSize;return e.slice(A,A+this.paginator.pageSize)}_updatePaginator(e){Promise.resolve().then(()=>{let A=this.paginator;if(A&&(A.length=e,A.pageIndex>0)){let i=Math.ceil(A.length/A.pageSize)-1||0,n=Math.min(A.pageIndex,i);n!==A.pageIndex&&(A.pageIndex=n,this._internalPageChanges.next())}})}connect(){return this._renderChangesSubscription||this._updateChangeSubscription(),this._renderData}disconnect(){this._renderChangesSubscription?.unsubscribe(),this._renderChangesSubscription=null}};var ytA=[{metricName:\"tool_trajectory_avg_score\",threshold:1},{metricName:\"response_match_score\",threshold:.7}];var Qy=\"0123456789abcdef\",Ey=class t{constructor(e){this.bytes=e}static ofInner(e){if(e.length!==16)throw new TypeError(\"not 128-bit length\");return new t(e)}static fromFieldsV7(e,A,i,n){if(!Number.isInteger(e)||!Number.isInteger(A)||!Number.isInteger(i)||!Number.isInteger(n)||e<0||A<0||i<0||n<0||e>0xffffffffffff||A>4095||i>1073741823||n>4294967295)throw new RangeError(\"invalid field value\");let o=new Uint8Array(16);return o[0]=e/2**40,o[1]=e/2**32,o[2]=e/2**24,o[3]=e/2**16,o[4]=e/2**8,o[5]=e,o[6]=112|A>>>8,o[7]=A,o[8]=128|i>>>24,o[9]=i>>>16,o[10]=i>>>8,o[11]=i,o[12]=n>>>24,o[13]=n>>>16,o[14]=n>>>8,o[15]=n,new t(o)}static parse(e){var A,i,n,o;let a;switch(e.length){case 32:a=(A=/^[0-9a-f]{32}$/i.exec(e))===null||A===void 0?void 0:A[0];break;case 36:a=(i=/^([0-9a-f]{8})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{12})$/i.exec(e))===null||i===void 0?void 0:i.slice(1,6).join(\"\");break;case 38:a=(n=/^\\{([0-9a-f]{8})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{12})\\}$/i.exec(e))===null||n===void 0?void 0:n.slice(1,6).join(\"\");break;case 45:a=(o=/^urn:uuid:([0-9a-f]{8})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{12})$/i.exec(e))===null||o===void 0?void 0:o.slice(1,6).join(\"\");break;default:break}if(a){let r=new Uint8Array(16);for(let s=0;s<16;s+=4){let g=parseInt(a.substring(2*s,2*s+8),16);r[s+0]=g>>>24,r[s+1]=g>>>16,r[s+2]=g>>>8,r[s+3]=g}return new t(r)}else throw new SyntaxError(\"could not parse UUID string\")}toString(){let e=\"\";for(let A=0;A<this.bytes.length;A++)e+=Qy.charAt(this.bytes[A]>>>4),e+=Qy.charAt(this.bytes[A]&15),(A===3||A===5||A===7||A===9)&&(e+=\"-\");return e}toHex(){let e=\"\";for(let A=0;A<this.bytes.length;A++)e+=Qy.charAt(this.bytes[A]>>>4),e+=Qy.charAt(this.bytes[A]&15);return e}toJSON(){return this.toString()}getVariant(){let e=this.bytes[8]>>>4;if(e<0)throw new Error(\"unreachable\");if(e<=7)return this.bytes.every(A=>A===0)?\"NIL\":\"VAR_0\";if(e<=11)return\"VAR_10\";if(e<=13)return\"VAR_110\";if(e<=15)return this.bytes.every(A=>A===255)?\"MAX\":\"VAR_RESERVED\";throw new Error(\"unreachable\")}getVersion(){return this.getVariant()===\"VAR_10\"?this.bytes[6]>>>4:void 0}clone(){return new t(this.bytes.slice(0))}equals(e){return this.compareTo(e)===0}compareTo(e){for(let A=0;A<16;A++){let i=this.bytes[A]-e.bytes[A];if(i!==0)return Math.sign(i)}return 0}},BF=class{constructor(e){this.timestamp_biased=0,this.counter=0,this.random=e??mxA()}generate(){return this.generateOrResetCore(Date.now(),1e4)}generateOrAbort(){return this.generateOrAbortCore(Date.now(),1e4)}generateOrResetCore(e,A){let i=this.generateOrAbortCore(e,A);return i===void 0&&(this.timestamp_biased=0,i=this.generateOrAbortCore(e,A)),i}generateOrAbortCore(e,A){if(!Number.isInteger(e)||e<0||e>0xffffffffffff)throw new RangeError(\"`unixTsMs` must be a 48-bit unsigned integer\");if(A<0||A>0xffffffffffff)throw new RangeError(\"`rollbackAllowance` out of reasonable range\");if(e++,e>this.timestamp_biased)this.timestamp_biased=e,this.resetCounter();else if(e+A>=this.timestamp_biased)this.counter++,this.counter>4398046511103&&(this.timestamp_biased++,this.resetCounter());else return;return Ey.fromFieldsV7(this.timestamp_biased-1,Math.trunc(this.counter/2**30),this.counter&2**30-1,this.random.nextUint32())}resetCounter(){this.counter=this.random.nextUint32()*1024+(this.random.nextUint32()&1023)}generateV4(){let e=new Uint8Array(Uint32Array.of(this.random.nextUint32(),this.random.nextUint32(),this.random.nextUint32(),this.random.nextUint32()).buffer);return e[6]=64|e[6]>>>4,e[8]=128|e[8]>>>2,Ey.ofInner(e)}},mxA=()=>{if(typeof crypto<\"u\"&&typeof crypto.getRandomValues<\"u\")return new QF;if(typeof UUIDV7_DENY_WEAK_RNG<\"u\"&&UUIDV7_DENY_WEAK_RNG)throw new Error(\"no cryptographically strong RNG available\");return{nextUint32:()=>Math.trunc(Math.random()*65536)*65536+Math.trunc(Math.random()*65536)}},QF=class{constructor(){this.buffer=new Uint32Array(8),this.cursor=65535}nextUint32(){return this.cursor>=this.buffer.length&&(crypto.getRandomValues(this.buffer),this.cursor=0),this.buffer[this.cursor++]}},vtA;var hy=()=>pxA().toString(),pxA=()=>(vtA||(vtA=new BF)).generateV4();var uy=class t{evalService=h(Uc);data=h(da);dialogRef=h(Fo);newCaseId=\"case\"+hy().slice(0,6);constructor(){}createNewEvalCase(){!this.newCaseId||this.newCaseId==\"\"?alert(\"Cannot create eval set with empty id!\"):this.evalService.addCurrentSession(this.data.appName,this.data.evalSetId,this.newCaseId,this.data.sessionId,this.data.userId).subscribe(e=>{this.dialogRef.close(!0)})}static \\u0275fac=function(A){return new(A||t)};static \\u0275cmp=kA({type:t,selectors:[[\"app-add-eval-session-dialog\"]],decls:11,vars:1,consts:[[\"mat-dialog-title\",\"\"],[2,\"padding-left\",\"20px\",\"padding-right\",\"24px\"],[\"matInput\",\"\",3,\"ngModelChange\",\"keydown.enter\",\"ngModel\"],[\"align\",\"end\"],[\"mat-button\",\"\",\"mat-dialog-close\",\"\"],[\"mat-button\",\"\",\"cdkFocusInitial\",\"\",3,\"click\"]],template:function(A,i){A&1&&(m(0,\"h2\",0),K(1,\"Add Current Session To Eval Set\"),D(),m(2,\"mat-dialog-content\"),K(3,` Please enter the eval case name\n`),D(),m(4,\"mat-form-field\",1)(5,\"input\",2),ao(\"ngModelChange\",function(o){return Vn(i.newCaseId,o)||(i.newCaseId=o),o}),$(\"keydown.enter\",function(){return i.createNewEvalCase()}),D()(),m(6,\"mat-dialog-actions\",3)(7,\"button\",4),K(8,\"Cancel\"),D(),m(9,\"button\",5),$(\"click\",function(){return i.createNewEvalCase()}),K(10,\"Create\"),D()()),A&2&&(p(5),oo(\"ngModel\",i.newCaseId))},dependencies:[ya,gr,To,wa,yn,ro,so,Ca,Ta,vn,VC],styles:[\"h2[mat-dialog-title][_ngcontent-%COMP%]{color:var(--mdc-dialog-supporting-text-color)!important}mat-dialog-content[_ngcontent-%COMP%]{color:var(--mdc-dialog-supporting-text-color)!important}button[mat-button][_ngcontent-%COMP%]{color:var(--mdc-dialog-supporting-text-color)!important}mat-form-field[_ngcontent-%COMP%]   input[_ngcontent-%COMP%]{color:var(--mdc-dialog-supporting-text-color)!important;caret-color:var(--mdc-dialog-supporting-text-color)!important;background-color:transparent!important}html.darkmode   [_nghost-%COMP%]     .mat-mdc-text-field-wrapper{background-color:#3f3f42}\"]})};var DxA={allEvalSetsHeader:\"All eval sets\",createNewEvalSetTooltip:\"Create new evaluation set\",createNewEvalSetTitle:\"Create New Evaluation Set\",evalSetDescription:\"An evaluation set is a curated collection of evaluation cases, where each case includes input-output examples for assessing agent performance.\",createEvalSetButton:\"Create Evaluation Set\",runEvaluationButton:\"Run Evaluation\",viewEvalRunHistoryTooltip:\"View eval run history\",caseIdHeader:\"Case ID\",resultHeader:\"Result\",viewEvalRunResultTooltip:\"View eval run result\",passStatus:\"Pass\",failStatus:\"Fail\",passStatusCaps:\"PASS\",failStatusCaps:\"FAIL\",passedSuffix:\"Passed\",failedSuffix:\"Failed\",addSessionToSetButtonPrefix:\"Add current session to\"},btA=new wA(\"Eval Tab Messages\",{factory:()=>DxA});var fy=class t{evalService=h(Uc);data=h(da);dialogRef=h(Fo);newSetId=\"evalset\"+hy().slice(0,6);constructor(){}createNewEvalSet(){!this.newSetId||this.newSetId==\"\"?alert(\"Cannot create eval set with empty id!\"):this.evalService.createNewEvalSet(this.data.appName,this.newSetId).subscribe(e=>{this.dialogRef.close(!0)})}static \\u0275fac=function(A){return new(A||t)};static \\u0275cmp=kA({type:t,selectors:[[\"app-new-eval-set-dialog-component\"]],decls:11,vars:1,consts:[[\"mat-dialog-title\",\"\"],[2,\"padding-left\",\"20px\",\"padding-right\",\"24px\"],[\"matInput\",\"\",3,\"ngModelChange\",\"keydown.enter\",\"ngModel\"],[\"align\",\"end\"],[\"mat-button\",\"\",\"mat-dialog-close\",\"\"],[\"mat-button\",\"\",\"cdkFocusInitial\",\"\",3,\"click\"]],template:function(A,i){A&1&&(m(0,\"h2\",0),K(1,\"Create New Eval Set\"),D(),m(2,\"mat-dialog-content\"),K(3,` Please enter the eval set name\n`),D(),m(4,\"mat-form-field\",1)(5,\"input\",2),ao(\"ngModelChange\",function(o){return Vn(i.newSetId,o)||(i.newSetId=o),o}),$(\"keydown.enter\",function(){return i.createNewEvalSet()}),D()(),m(6,\"mat-dialog-actions\",3)(7,\"button\",4),K(8,\"Cancel\"),D(),m(9,\"button\",5),$(\"click\",function(){return i.createNewEvalSet()}),K(10,\"Create\"),D()()),A&2&&(p(5),oo(\"ngModel\",i.newSetId))},dependencies:[ya,gr,To,wa,yn,ro,so,Ca,Ta,vn,VC],styles:[\"h2[mat-dialog-title][_ngcontent-%COMP%]{color:var(--mdc-dialog-supporting-text-color)!important}mat-dialog-content[_ngcontent-%COMP%]{color:var(--mdc-dialog-supporting-text-color)!important}button[mat-button][_ngcontent-%COMP%]{color:var(--mdc-dialog-supporting-text-color)!important}mat-form-field[_ngcontent-%COMP%]   input[_ngcontent-%COMP%]{color:var(--mdc-dialog-supporting-text-color)!important;caret-color:var(--mdc-dialog-supporting-text-color)!important;background-color:transparent!important}[_nghost-%COMP%]     .mat-mdc-text-field-wrapper{background-color:#3f3f42}\"]})};var wxA=[\"knob\"],yxA=[\"valueIndicatorContainer\"];function vxA(t,e){if(t&1&&(m(0,\"div\",2,1)(2,\"div\",5)(3,\"span\",6),K(4),D()()()),t&2){let A=y();p(4),qA(A.valueIndicatorText)}}var bxA=[\"trackActive\"],MxA=[\"*\"];function kxA(t,e){if(t&1&&GA(0,\"div\"),t&2){let A=e.$implicit,i=e.$index,n=y(3);Qo(A===0?\"mdc-slider__tick-mark--active\":\"mdc-slider__tick-mark--inactive\"),En(\"transform\",n._calcTickMarkTransform(i))}}function SxA(t,e){if(t&1&&Gt(0,kxA,1,4,\"div\",8,fd),t&2){let A=y(2);Kt(A._tickMarks)}}function xxA(t,e){if(t&1&&(m(0,\"div\",6,1),V(2,SxA,2,0),D()),t&2){let A=y();p(2),W(A._cachedWidth?2:-1)}}function RxA(t,e){if(t&1&&GA(0,\"mat-slider-visual-thumb\",7),t&2){let A=y();X(\"discrete\",A.discrete)(\"thumbPosition\",1)(\"valueIndicatorText\",A.startValueIndicatorText)}}var mi=(function(t){return t[t.START=1]=\"START\",t[t.END=2]=\"END\",t})(mi||{}),_E=(function(t){return t[t.ACTIVE=0]=\"ACTIVE\",t[t.INACTIVE=1]=\"INACTIVE\",t})(_E||{}),EF=new wA(\"_MatSlider\"),MtA=new wA(\"_MatSliderThumb\"),NxA=new wA(\"_MatSliderRangeThumb\"),ktA=new wA(\"_MatSliderVisualThumb\");var FxA=(()=>{class t{_cdr=h(ft);_ngZone=h(Oe);_slider=h(EF);_renderer=h(ui);_listenerCleanups;discrete=!1;thumbPosition;valueIndicatorText;_ripple;_knob;_valueIndicatorContainer;_sliderInput;_sliderInputEl;_hoverRippleRef;_focusRippleRef;_activeRippleRef;_isHovered=!1;_isActive=!1;_isValueIndicatorVisible=!1;_hostElement=h(ge).nativeElement;_platform=h(ci);constructor(){}ngAfterViewInit(){let A=this._slider._getInput(this.thumbPosition);A&&(this._ripple.radius=24,this._sliderInput=A,this._sliderInputEl=this._sliderInput._hostElement,this._ngZone.runOutsideAngular(()=>{let i=this._sliderInputEl,n=this._renderer;this._listenerCleanups=[n.listen(i,\"pointermove\",this._onPointerMove),n.listen(i,\"pointerdown\",this._onDragStart),n.listen(i,\"pointerup\",this._onDragEnd),n.listen(i,\"pointerleave\",this._onMouseLeave),n.listen(i,\"focus\",this._onFocus),n.listen(i,\"blur\",this._onBlur)]}))}ngOnDestroy(){this._listenerCleanups?.forEach(A=>A())}_onPointerMove=A=>{if(this._sliderInput._isFocused)return;let i=this._hostElement.getBoundingClientRect(),n=this._slider._isCursorOnSliderThumb(A,i);this._isHovered=n,n?this._showHoverRipple():this._hideRipple(this._hoverRippleRef)};_onMouseLeave=()=>{this._isHovered=!1,this._hideRipple(this._hoverRippleRef)};_onFocus=()=>{this._hideRipple(this._hoverRippleRef),this._showFocusRipple(),this._hostElement.classList.add(\"mdc-slider__thumb--focused\")};_onBlur=()=>{this._isActive||this._hideRipple(this._focusRippleRef),this._isHovered&&this._showHoverRipple(),this._hostElement.classList.remove(\"mdc-slider__thumb--focused\")};_onDragStart=A=>{A.button===0&&(this._isActive=!0,this._showActiveRipple())};_onDragEnd=()=>{this._isActive=!1,this._hideRipple(this._activeRippleRef),this._sliderInput._isFocused||this._hideRipple(this._focusRippleRef),this._platform.SAFARI&&this._showHoverRipple()};_showHoverRipple(){this._isShowingRipple(this._hoverRippleRef)||(this._hoverRippleRef=this._showRipple({enterDuration:0,exitDuration:0}),this._hoverRippleRef?.element.classList.add(\"mat-mdc-slider-hover-ripple\"))}_showFocusRipple(){this._isShowingRipple(this._focusRippleRef)||(this._focusRippleRef=this._showRipple({enterDuration:0,exitDuration:0},!0),this._focusRippleRef?.element.classList.add(\"mat-mdc-slider-focus-ripple\"))}_showActiveRipple(){this._isShowingRipple(this._activeRippleRef)||(this._activeRippleRef=this._showRipple({enterDuration:225,exitDuration:400}),this._activeRippleRef?.element.classList.add(\"mat-mdc-slider-active-ripple\"))}_isShowingRipple(A){return A?.state===cs.FADING_IN||A?.state===cs.VISIBLE}_showRipple(A,i){if(!this._slider.disabled&&(this._showValueIndicator(),this._slider._isRange&&this._slider._getThumb(this.thumbPosition===mi.START?mi.END:mi.START)._showValueIndicator(),!(this._slider._globalRippleOptions?.disabled&&!i)))return this._ripple.launch({animation:this._slider._noopAnimations?{enterDuration:0,exitDuration:0}:A,centered:!0,persistent:!0})}_hideRipple(A){if(A?.fadeOut(),this._isShowingAnyRipple())return;this._slider._isRange||this._hideValueIndicator();let i=this._getSibling();i._isShowingAnyRipple()||(this._hideValueIndicator(),i._hideValueIndicator())}_showValueIndicator(){this._hostElement.classList.add(\"mdc-slider__thumb--with-indicator\")}_hideValueIndicator(){this._hostElement.classList.remove(\"mdc-slider__thumb--with-indicator\")}_getSibling(){return this._slider._getThumb(this.thumbPosition===mi.START?mi.END:mi.START)}_getValueIndicatorContainer(){return this._valueIndicatorContainer?.nativeElement}_getKnob(){return this._knob.nativeElement}_isShowingAnyRipple(){return this._isShowingRipple(this._hoverRippleRef)||this._isShowingRipple(this._focusRippleRef)||this._isShowingRipple(this._activeRippleRef)}static \\u0275fac=function(i){return new(i||t)};static \\u0275cmp=kA({type:t,selectors:[[\"mat-slider-visual-thumb\"]],viewQuery:function(i,n){if(i&1&&ni(Ns,5)(wxA,5)(yxA,5),i&2){let o;Ce(o=Ie())&&(n._ripple=o.first),Ce(o=Ie())&&(n._knob=o.first),Ce(o=Ie())&&(n._valueIndicatorContainer=o.first)}},hostAttrs:[1,\"mdc-slider__thumb\",\"mat-mdc-slider-visual-thumb\"],inputs:{discrete:\"discrete\",thumbPosition:\"thumbPosition\",valueIndicatorText:\"valueIndicatorText\"},features:[It([{provide:ktA,useExisting:t}])],decls:4,vars:2,consts:[[\"knob\",\"\"],[\"valueIndicatorContainer\",\"\"],[1,\"mdc-slider__value-indicator-container\"],[1,\"mdc-slider__thumb-knob\"],[\"matRipple\",\"\",1,\"mat-focus-indicator\",3,\"matRippleDisabled\"],[1,\"mdc-slider__value-indicator\"],[1,\"mdc-slider__value-indicator-text\"]],template:function(i,n){i&1&&(V(0,vxA,5,1,\"div\",2),GA(1,\"div\",3,0)(3,\"div\",4)),i&2&&(W(n.discrete?0:-1),p(3),X(\"matRippleDisabled\",!0))},dependencies:[Ns],styles:[`.mat-mdc-slider-visual-thumb .mat-ripple{height:100%;width:100%}.mat-mdc-slider .mdc-slider__tick-marks{justify-content:start}.mat-mdc-slider .mdc-slider__tick-marks .mdc-slider__tick-mark--active,.mat-mdc-slider .mdc-slider__tick-marks .mdc-slider__tick-mark--inactive{position:absolute;left:2px}\n`],encapsulation:2,changeDetection:0})}return t})(),StA=(()=>{class t{_ngZone=h(Oe);_cdr=h(ft);_elementRef=h(ge);_dir=h(wo,{optional:!0});_globalRippleOptions=h(JC,{optional:!0});_trackActive;_thumbs;_input;_inputs;get disabled(){return this._disabled}set disabled(A){this._disabled=A;let i=this._getInput(mi.END),n=this._getInput(mi.START);i&&(i.disabled=this._disabled),n&&(n.disabled=this._disabled)}_disabled=!1;get discrete(){return this._discrete}set discrete(A){this._discrete=A,this._updateValueIndicatorUIs()}_discrete=!1;get showTickMarks(){return this._showTickMarks}set showTickMarks(A){this._showTickMarks=A,this._hasViewInitialized&&(this._updateTickMarkUI(),this._updateTickMarkTrackUI())}_showTickMarks=!1;get min(){return this._min}set min(A){let i=A==null||isNaN(A)?this._min:A;this._min!==i&&this._updateMin(i)}_min=0;color;disableRipple=!1;_updateMin(A){let i=this._min;this._min=A,this._isRange?this._updateMinRange({old:i,new:A}):this._updateMinNonRange(A),this._onMinMaxOrStepChange()}_updateMinRange(A){let i=this._getInput(mi.END),n=this._getInput(mi.START),o=i.value,a=n.value;n.min=A.new,i.min=Math.max(A.new,n.value),n.max=Math.min(i.max,i.value),n._updateWidthInactive(),i._updateWidthInactive(),A.new<A.old?this._onTranslateXChangeBySideEffect(i,n):this._onTranslateXChangeBySideEffect(n,i),o!==i.value&&this._onValueChange(i),a!==n.value&&this._onValueChange(n)}_updateMinNonRange(A){let i=this._getInput(mi.END);if(i){let n=i.value;i.min=A,i._updateThumbUIByValue(),this._updateTrackUI(i),n!==i.value&&this._onValueChange(i)}}get max(){return this._max}set max(A){let i=A==null||isNaN(A)?this._max:A;this._max!==i&&this._updateMax(i)}_max=100;_updateMax(A){let i=this._max;this._max=A,this._isRange?this._updateMaxRange({old:i,new:A}):this._updateMaxNonRange(A),this._onMinMaxOrStepChange()}_updateMaxRange(A){let i=this._getInput(mi.END),n=this._getInput(mi.START),o=i.value,a=n.value;i.max=A.new,n.max=Math.min(A.new,i.value),i.min=n.value,i._updateWidthInactive(),n._updateWidthInactive(),A.new>A.old?this._onTranslateXChangeBySideEffect(n,i):this._onTranslateXChangeBySideEffect(i,n),o!==i.value&&this._onValueChange(i),a!==n.value&&this._onValueChange(n)}_updateMaxNonRange(A){let i=this._getInput(mi.END);if(i){let n=i.value;i.max=A,i._updateThumbUIByValue(),this._updateTrackUI(i),n!==i.value&&this._onValueChange(i)}}get step(){return this._step}set step(A){let i=isNaN(A)?this._step:A;this._step!==i&&this._updateStep(i)}_step=1;_updateStep(A){this._step=A,this._isRange?this._updateStepRange():this._updateStepNonRange(),this._onMinMaxOrStepChange()}_updateStepRange(){let A=this._getInput(mi.END),i=this._getInput(mi.START),n=A.value,o=i.value,a=i.value;A.min=this._min,i.max=this._max,A.step=this._step,i.step=this._step,this._platform.SAFARI&&(A.value=A.value,i.value=i.value),A.min=Math.max(this._min,i.value),i.max=Math.min(this._max,A.value),i._updateWidthInactive(),A._updateWidthInactive(),A.value<a?this._onTranslateXChangeBySideEffect(i,A):this._onTranslateXChangeBySideEffect(A,i),n!==A.value&&this._onValueChange(A),o!==i.value&&this._onValueChange(i)}_updateStepNonRange(){let A=this._getInput(mi.END);if(A){let i=A.value;A.step=this._step,this._platform.SAFARI&&(A.value=A.value),A._updateThumbUIByValue(),i!==A.value&&this._onValueChange(A)}}displayWith=A=>`${A}`;_tickMarks;_noopAnimations=Oi();_dirChangeSubscription;_resizeObserver=null;_cachedWidth;_cachedLeft;_rippleRadius=24;startValueIndicatorText=\"\";endValueIndicatorText=\"\";_endThumbTransform;_startThumbTransform;_isRange=!1;_isRtl=!1;_hasViewInitialized=!1;_tickMarkTrackWidth=0;_hasAnimation=!1;_resizeTimer=null;_platform=h(ci);constructor(){h(Hn).load(Za),this._dir&&(this._dirChangeSubscription=this._dir.change.subscribe(()=>this._onDirChange()),this._isRtl=this._dir.value===\"rtl\")}_knobRadius=8;_inputPadding;ngAfterViewInit(){this._platform.isBrowser&&this._updateDimensions();let A=this._getInput(mi.END),i=this._getInput(mi.START);this._isRange=!!A&&!!i,this._cdr.detectChanges();let n=this._getThumb(mi.END);this._rippleRadius=n._ripple.radius,this._inputPadding=this._rippleRadius-this._knobRadius,this._isRange?this._initUIRange(A,i):this._initUINonRange(A),this._updateTrackUI(A),this._updateTickMarkUI(),this._updateTickMarkTrackUI(),this._observeHostResize(),this._cdr.detectChanges()}_initUINonRange(A){A.initProps(),A.initUI(),this._updateValueIndicatorUI(A),this._hasViewInitialized=!0,A._updateThumbUIByValue()}_initUIRange(A,i){A.initProps(),A.initUI(),i.initProps(),i.initUI(),A._updateMinMax(),i._updateMinMax(),A._updateStaticStyles(),i._updateStaticStyles(),this._updateValueIndicatorUIs(),this._hasViewInitialized=!0,A._updateThumbUIByValue(),i._updateThumbUIByValue()}ngOnDestroy(){this._dirChangeSubscription?.unsubscribe(),this._resizeObserver?.disconnect(),this._resizeObserver=null}_onDirChange(){this._isRtl=this._dir?.value===\"rtl\",this._isRange?this._onDirChangeRange():this._onDirChangeNonRange(),this._updateTickMarkUI()}_onDirChangeRange(){let A=this._getInput(mi.END),i=this._getInput(mi.START);A._setIsLeftThumb(),i._setIsLeftThumb(),A.translateX=A._calcTranslateXByValue(),i.translateX=i._calcTranslateXByValue(),A._updateStaticStyles(),i._updateStaticStyles(),A._updateWidthInactive(),i._updateWidthInactive(),A._updateThumbUIByValue(),i._updateThumbUIByValue()}_onDirChangeNonRange(){this._getInput(mi.END)._updateThumbUIByValue()}_observeHostResize(){typeof ResizeObserver>\"u\"||!ResizeObserver||this._ngZone.runOutsideAngular(()=>{this._resizeObserver=new ResizeObserver(()=>{this._isActive()||(this._resizeTimer&&clearTimeout(this._resizeTimer),this._onResize())}),this._resizeObserver.observe(this._elementRef.nativeElement)})}_isActive(){return this._getThumb(mi.START)._isActive||this._getThumb(mi.END)._isActive}_getValue(A=mi.END){let i=this._getInput(A);return i?i.value:this.min}_skipUpdate(){return!!(this._getInput(mi.START)?._skipUIUpdate||this._getInput(mi.END)?._skipUIUpdate)}_updateDimensions(){this._cachedWidth=this._elementRef.nativeElement.offsetWidth,this._cachedLeft=this._elementRef.nativeElement.getBoundingClientRect().left}_setTrackActiveStyles(A){let i=this._trackActive.nativeElement.style;i.left=A.left,i.right=A.right,i.transformOrigin=A.transformOrigin,i.transform=A.transform}_calcTickMarkTransform(A){let i=A*(this._tickMarkTrackWidth/(this._tickMarks.length-1));return`translateX(${this._isRtl?this._cachedWidth-6-i:i}px)`}_onTranslateXChange(A){this._hasViewInitialized&&(this._updateThumbUI(A),this._updateTrackUI(A),this._updateOverlappingThumbUI(A))}_onTranslateXChangeBySideEffect(A,i){this._hasViewInitialized&&(A._updateThumbUIByValue(),i._updateThumbUIByValue())}_onValueChange(A){this._hasViewInitialized&&(this._updateValueIndicatorUI(A),this._updateTickMarkUI(),this._cdr.detectChanges())}_onMinMaxOrStepChange(){this._hasViewInitialized&&(this._updateTickMarkUI(),this._updateTickMarkTrackUI(),this._cdr.markForCheck())}_onResize(){if(this._hasViewInitialized){if(this._updateDimensions(),this._isRange){let A=this._getInput(mi.END),i=this._getInput(mi.START);A._updateThumbUIByValue(),i._updateThumbUIByValue(),A._updateStaticStyles(),i._updateStaticStyles(),A._updateMinMax(),i._updateMinMax(),A._updateWidthInactive(),i._updateWidthInactive()}else{let A=this._getInput(mi.END);A&&A._updateThumbUIByValue()}this._updateTickMarkUI(),this._updateTickMarkTrackUI(),this._cdr.detectChanges()}}_thumbsOverlap=!1;_areThumbsOverlapping(){let A=this._getInput(mi.START),i=this._getInput(mi.END);return!A||!i?!1:i.translateX-A.translateX<20}_updateOverlappingThumbClassNames(A){let i=A.getSibling(),n=this._getThumb(A.thumbPosition);this._getThumb(i.thumbPosition)._hostElement.classList.remove(\"mdc-slider__thumb--top\"),n._hostElement.classList.toggle(\"mdc-slider__thumb--top\",this._thumbsOverlap)}_updateOverlappingThumbUI(A){!this._isRange||this._skipUpdate()||this._thumbsOverlap!==this._areThumbsOverlapping()&&(this._thumbsOverlap=!this._thumbsOverlap,this._updateOverlappingThumbClassNames(A))}_updateThumbUI(A){if(this._skipUpdate())return;let i=this._getThumb(A.thumbPosition===mi.END?mi.END:mi.START);i._hostElement.style.transform=`translateX(${A.translateX}px)`}_updateValueIndicatorUI(A){if(this._skipUpdate())return;let i=this.displayWith(A.value);if(this._hasViewInitialized?A._valuetext.set(i):A._hostElement.setAttribute(\"aria-valuetext\",i),this.discrete){A.thumbPosition===mi.START?this.startValueIndicatorText=i:this.endValueIndicatorText=i;let n=this._getThumb(A.thumbPosition);i.length<3?n._hostElement.classList.add(\"mdc-slider__thumb--short-value\"):n._hostElement.classList.remove(\"mdc-slider__thumb--short-value\")}}_updateValueIndicatorUIs(){let A=this._getInput(mi.END),i=this._getInput(mi.START);A&&this._updateValueIndicatorUI(A),i&&this._updateValueIndicatorUI(i)}_updateTickMarkTrackUI(){if(!this.showTickMarks||this._skipUpdate())return;let A=this._step&&this._step>0?this._step:1,n=(Math.floor(this.max/A)*A-this.min)/(this.max-this.min);this._tickMarkTrackWidth=(this._cachedWidth-6)*n}_updateTrackUI(A){this._skipUpdate()||(this._isRange?this._updateTrackUIRange(A):this._updateTrackUINonRange(A))}_updateTrackUIRange(A){let i=A.getSibling();if(!i||!this._cachedWidth)return;let n=Math.abs(i.translateX-A.translateX)/this._cachedWidth;A._isLeftThumb&&this._cachedWidth?this._setTrackActiveStyles({left:\"auto\",right:`${this._cachedWidth-i.translateX}px`,transformOrigin:\"right\",transform:`scaleX(${n})`}):this._setTrackActiveStyles({left:`${i.translateX}px`,right:\"auto\",transformOrigin:\"left\",transform:`scaleX(${n})`})}_updateTrackUINonRange(A){this._isRtl?this._setTrackActiveStyles({left:\"auto\",right:\"0px\",transformOrigin:\"right\",transform:`scaleX(${1-A.fillPercentage})`}):this._setTrackActiveStyles({left:\"0px\",right:\"auto\",transformOrigin:\"left\",transform:`scaleX(${A.fillPercentage})`})}_updateTickMarkUI(){if(!this.showTickMarks||this.step===void 0||this.min===void 0||this.max===void 0)return;let A=this.step>0?this.step:1;this._isRange?this._updateTickMarkUIRange(A):this._updateTickMarkUINonRange(A)}_updateTickMarkUINonRange(A){let i=this._getValue(),n=Math.max(Math.round((i-this.min)/A),0)+1,o=Math.max(Math.round((this.max-i)/A),0)-1;this._isRtl?n++:o++,this._tickMarks=Array(n).fill(_E.ACTIVE).concat(Array(o).fill(_E.INACTIVE))}_updateTickMarkUIRange(A){let i=this._getValue(),n=this._getValue(mi.START),o=Math.max(Math.round((n-this.min)/A),0),a=Math.max(Math.round((i-n)/A)+1,0),r=Math.max(Math.round((this.max-i)/A),0);this._tickMarks=Array(o).fill(_E.INACTIVE).concat(Array(a).fill(_E.ACTIVE),Array(r).fill(_E.INACTIVE))}_getInput(A){if(A===mi.END&&this._input)return this._input;if(this._inputs?.length)return A===mi.START?this._inputs.first:this._inputs.last}_getThumb(A){return A===mi.END?this._thumbs?.last:this._thumbs?.first}_setTransition(A){this._hasAnimation=!this._platform.IOS&&A&&!this._noopAnimations,this._elementRef.nativeElement.classList.toggle(\"mat-mdc-slider-with-animation\",this._hasAnimation)}_isCursorOnSliderThumb(A,i){let n=i.width/2,o=i.x+n,a=i.y+n,r=A.clientX-o,s=A.clientY-a;return Math.pow(r,2)+Math.pow(s,2)<Math.pow(n,2)}static \\u0275fac=function(i){return new(i||t)};static \\u0275cmp=kA({type:t,selectors:[[\"mat-slider\"]],contentQueries:function(i,n,o){if(i&1&&na(o,MtA,5)(o,NxA,4),i&2){let a;Ce(a=Ie())&&(n._input=a.first),Ce(a=Ie())&&(n._inputs=a)}},viewQuery:function(i,n){if(i&1&&ni(bxA,5)(ktA,5),i&2){let o;Ce(o=Ie())&&(n._trackActive=o.first),Ce(o=Ie())&&(n._thumbs=o)}},hostAttrs:[1,\"mat-mdc-slider\",\"mdc-slider\"],hostVars:12,hostBindings:function(i,n){i&2&&(Qo(\"mat-\"+(n.color||\"primary\")),ae(\"mdc-slider--range\",n._isRange)(\"mdc-slider--disabled\",n.disabled)(\"mdc-slider--discrete\",n.discrete)(\"mdc-slider--tick-marks\",n.showTickMarks)(\"_mat-animation-noopable\",n._noopAnimations))},inputs:{disabled:[2,\"disabled\",\"disabled\",he],discrete:[2,\"discrete\",\"discrete\",he],showTickMarks:[2,\"showTickMarks\",\"showTickMarks\",he],min:[2,\"min\",\"min\",Zi],color:\"color\",disableRipple:[2,\"disableRipple\",\"disableRipple\",he],max:[2,\"max\",\"max\",Zi],step:[2,\"step\",\"step\",Zi],displayWith:\"displayWith\"},exportAs:[\"matSlider\"],features:[It([{provide:EF,useExisting:t}])],ngContentSelectors:MxA,decls:9,vars:5,consts:[[\"trackActive\",\"\"],[\"tickMarkContainer\",\"\"],[1,\"mdc-slider__track\"],[1,\"mdc-slider__track--inactive\"],[1,\"mdc-slider__track--active\"],[1,\"mdc-slider__track--active_fill\"],[1,\"mdc-slider__tick-marks\"],[3,\"discrete\",\"thumbPosition\",\"valueIndicatorText\"],[3,\"class\",\"transform\"]],template:function(i,n){i&1&&(Yt(),He(0),m(1,\"div\",2),GA(2,\"div\",3),m(3,\"div\",4),GA(4,\"div\",5,0),D(),V(6,xxA,3,1,\"div\",6),D(),V(7,RxA,1,3,\"mat-slider-visual-thumb\",7),GA(8,\"mat-slider-visual-thumb\",7)),i&2&&(p(6),W(n.showTickMarks?6:-1),p(),W(n._isRange?7:-1),p(),X(\"discrete\",n.discrete)(\"thumbPosition\",2)(\"valueIndicatorText\",n.endValueIndicatorText))},dependencies:[FxA],styles:[`.mdc-slider__track{position:absolute;top:50%;transform:translateY(-50%);width:100%;pointer-events:none;height:var(--mat-slider-inactive-track-height, 4px)}.mdc-slider__track--active,.mdc-slider__track--inactive{display:flex;height:100%;position:absolute;width:100%}.mdc-slider__track--active{overflow:hidden;border-radius:var(--mat-slider-active-track-shape, var(--mat-sys-corner-full));height:var(--mat-slider-active-track-height, 4px);top:calc((var(--mat-slider-inactive-track-height, 4px) - var(--mat-slider-active-track-height, 4px))/2)}.mdc-slider__track--active_fill{border-top-style:solid;box-sizing:border-box;height:100%;width:100%;position:relative;transform-origin:left;transition:transform 80ms ease;border-color:var(--mat-slider-active-track-color, var(--mat-sys-primary));border-top-width:var(--mat-slider-active-track-height, 4px)}.mdc-slider--disabled .mdc-slider__track--active_fill{border-color:var(--mat-slider-disabled-active-track-color, var(--mat-sys-on-surface))}[dir=rtl] .mdc-slider__track--active_fill{-webkit-transform-origin:right;transform-origin:right}.mdc-slider__track--inactive{left:0;top:0;opacity:.24;background-color:var(--mat-slider-inactive-track-color, var(--mat-sys-surface-variant));height:var(--mat-slider-inactive-track-height, 4px);border-radius:var(--mat-slider-inactive-track-shape, var(--mat-sys-corner-full))}.mdc-slider--disabled .mdc-slider__track--inactive{background-color:var(--mat-slider-disabled-inactive-track-color, var(--mat-sys-on-surface));opacity:.24}.mdc-slider__track--inactive::before{position:absolute;box-sizing:border-box;width:100%;height:100%;top:0;left:0;border:1px solid rgba(0,0,0,0);border-radius:inherit;content:\"\";pointer-events:none}@media(forced-colors: active){.mdc-slider__track--inactive::before{border-color:CanvasText}}.mdc-slider__value-indicator-container{bottom:44px;left:50%;pointer-events:none;position:absolute;transform:var(--mat-slider-value-indicator-container-transform, translateX(-50%) rotate(-45deg))}.mdc-slider__thumb--with-indicator .mdc-slider__value-indicator-container{pointer-events:auto}.mdc-slider__value-indicator{display:flex;align-items:center;transform:scale(0);transform-origin:var(--mat-slider-value-indicator-transform-origin, 0 28px);transition:transform 100ms cubic-bezier(0.4, 0, 1, 1);word-break:normal;background-color:var(--mat-slider-label-container-color, var(--mat-sys-primary));color:var(--mat-slider-label-label-text-color, var(--mat-sys-on-primary));width:var(--mat-slider-value-indicator-width, 28px);height:var(--mat-slider-value-indicator-height, 28px);padding:var(--mat-slider-value-indicator-padding, 0);opacity:var(--mat-slider-value-indicator-opacity, 1);border-radius:var(--mat-slider-value-indicator-border-radius, 50% 50% 50% 0)}.mdc-slider__thumb--with-indicator .mdc-slider__value-indicator{transition:transform 100ms cubic-bezier(0, 0, 0.2, 1);transform:scale(1)}.mdc-slider__value-indicator::before{border-left:6px solid rgba(0,0,0,0);border-right:6px solid rgba(0,0,0,0);border-top:6px solid;bottom:-5px;content:\"\";height:0;left:50%;position:absolute;transform:translateX(-50%);width:0;display:var(--mat-slider-value-indicator-caret-display, none);border-top-color:var(--mat-slider-label-container-color, var(--mat-sys-primary))}.mdc-slider__value-indicator::after{position:absolute;box-sizing:border-box;width:100%;height:100%;top:0;left:0;border:1px solid rgba(0,0,0,0);border-radius:inherit;content:\"\";pointer-events:none}@media(forced-colors: active){.mdc-slider__value-indicator::after{border-color:CanvasText}}.mdc-slider__value-indicator-text{text-align:center;width:var(--mat-slider-value-indicator-width, 28px);transform:var(--mat-slider-value-indicator-text-transform, rotate(45deg));font-family:var(--mat-slider-label-label-text-font, var(--mat-sys-label-medium-font));font-size:var(--mat-slider-label-label-text-size, var(--mat-sys-label-medium-size));font-weight:var(--mat-slider-label-label-text-weight, var(--mat-sys-label-medium-weight));line-height:var(--mat-slider-label-label-text-line-height, var(--mat-sys-label-medium-line-height));letter-spacing:var(--mat-slider-label-label-text-tracking, var(--mat-sys-label-medium-tracking))}.mdc-slider__thumb{-webkit-user-select:none;user-select:none;display:flex;left:-24px;outline:none;position:absolute;height:48px;width:48px;pointer-events:none}.mdc-slider--discrete .mdc-slider__thumb{transition:transform 80ms ease}.mdc-slider--disabled .mdc-slider__thumb{pointer-events:none}.mdc-slider__thumb--top{z-index:1}.mdc-slider__thumb-knob{position:absolute;box-sizing:border-box;left:50%;top:50%;transform:translate(-50%, -50%);border-style:solid;width:var(--mat-slider-handle-width, 20px);height:var(--mat-slider-handle-height, 20px);border-width:calc(var(--mat-slider-handle-height, 20px)/2) calc(var(--mat-slider-handle-width, 20px)/2);box-shadow:var(--mat-slider-handle-elevation, var(--mat-sys-level1));background-color:var(--mat-slider-handle-color, var(--mat-sys-primary));border-color:var(--mat-slider-handle-color, var(--mat-sys-primary));border-radius:var(--mat-slider-handle-shape, var(--mat-sys-corner-full))}.mdc-slider__thumb:hover .mdc-slider__thumb-knob{background-color:var(--mat-slider-hover-handle-color, var(--mat-sys-primary));border-color:var(--mat-slider-hover-handle-color, var(--mat-sys-primary))}.mdc-slider__thumb--focused .mdc-slider__thumb-knob{background-color:var(--mat-slider-focus-handle-color, var(--mat-sys-primary));border-color:var(--mat-slider-focus-handle-color, var(--mat-sys-primary))}.mdc-slider--disabled .mdc-slider__thumb-knob{background-color:var(--mat-slider-disabled-handle-color, var(--mat-sys-on-surface));border-color:var(--mat-slider-disabled-handle-color, var(--mat-sys-on-surface))}.mdc-slider__thumb--top .mdc-slider__thumb-knob,.mdc-slider__thumb--top.mdc-slider__thumb:hover .mdc-slider__thumb-knob,.mdc-slider__thumb--top.mdc-slider__thumb--focused .mdc-slider__thumb-knob{border:solid 1px #fff;box-sizing:content-box;border-color:var(--mat-slider-with-overlap-handle-outline-color, var(--mat-sys-on-primary));border-width:var(--mat-slider-with-overlap-handle-outline-width, 1px)}.mdc-slider__tick-marks{align-items:center;box-sizing:border-box;display:flex;height:100%;justify-content:space-between;padding:0 1px;position:absolute;width:100%}.mdc-slider__tick-mark--active,.mdc-slider__tick-mark--inactive{width:var(--mat-slider-with-tick-marks-container-size, 2px);height:var(--mat-slider-with-tick-marks-container-size, 2px);border-radius:var(--mat-slider-with-tick-marks-container-shape, var(--mat-sys-corner-full))}.mdc-slider__tick-mark--inactive{opacity:var(--mat-slider-with-tick-marks-inactive-container-opacity, 0.38);background-color:var(--mat-slider-with-tick-marks-inactive-container-color, var(--mat-sys-on-surface-variant))}.mdc-slider--disabled .mdc-slider__tick-mark--inactive{opacity:var(--mat-slider-with-tick-marks-inactive-container-opacity, 0.38);background-color:var(--mat-slider-with-tick-marks-disabled-container-color, var(--mat-sys-on-surface))}.mdc-slider__tick-mark--active{opacity:var(--mat-slider-with-tick-marks-active-container-opacity, 0.38);background-color:var(--mat-slider-with-tick-marks-active-container-color, var(--mat-sys-on-primary))}.mdc-slider__input{cursor:pointer;left:2px;margin:0;height:44px;opacity:0;position:absolute;top:2px;width:44px;box-sizing:content-box}.mdc-slider__input.mat-mdc-slider-input-no-pointer-events{pointer-events:none}.mdc-slider__input.mat-slider__right-input{left:auto;right:0}.mat-mdc-slider{display:inline-block;box-sizing:border-box;outline:none;vertical-align:middle;cursor:pointer;height:48px;margin:0 8px;position:relative;touch-action:pan-y;width:auto;min-width:112px;-webkit-tap-highlight-color:rgba(0,0,0,0)}.mat-mdc-slider.mdc-slider--disabled{cursor:auto;opacity:.38}.mat-mdc-slider.mdc-slider--disabled .mdc-slider__input{cursor:auto}.mat-mdc-slider .mdc-slider__thumb,.mat-mdc-slider .mdc-slider__track--active_fill{transition-duration:0ms}.mat-mdc-slider.mat-mdc-slider-with-animation .mdc-slider__thumb,.mat-mdc-slider.mat-mdc-slider-with-animation .mdc-slider__track--active_fill{transition-duration:80ms}.mat-mdc-slider.mdc-slider--discrete .mdc-slider__thumb,.mat-mdc-slider.mdc-slider--discrete .mdc-slider__track--active_fill{transition-duration:0ms}.mat-mdc-slider.mat-mdc-slider-with-animation .mdc-slider__thumb,.mat-mdc-slider.mat-mdc-slider-with-animation .mdc-slider__track--active_fill{transition-duration:80ms}.mat-mdc-slider .mat-ripple .mat-ripple-element{background-color:var(--mat-slider-ripple-color, var(--mat-sys-primary))}.mat-mdc-slider .mat-ripple .mat-mdc-slider-hover-ripple{background-color:var(--mat-slider-hover-state-layer-color, color-mix(in srgb, var(--mat-sys-primary) 5%, transparent))}.mat-mdc-slider .mat-ripple .mat-mdc-slider-focus-ripple,.mat-mdc-slider .mat-ripple .mat-mdc-slider-active-ripple{background-color:var(--mat-slider-focus-state-layer-color, color-mix(in srgb, var(--mat-sys-primary) 20%, transparent))}.mat-mdc-slider._mat-animation-noopable.mdc-slider--discrete .mdc-slider__thumb,.mat-mdc-slider._mat-animation-noopable.mdc-slider--discrete .mdc-slider__track--active_fill,.mat-mdc-slider._mat-animation-noopable .mdc-slider__value-indicator{transition:none}.mat-mdc-slider .mat-focus-indicator::before{border-radius:50%}.mdc-slider__thumb--focused .mat-focus-indicator::before{content:\"\"}\n`],encapsulation:2,changeDetection:0})}return t})();var LxA={provide:gg,useExisting:ar(()=>hF),multi:!0};var hF=(()=>{class t{_ngZone=h(Oe);_elementRef=h(ge);_cdr=h(ft);_slider=h(EF);_platform=h(ci);_listenerCleanups;get value(){return Zi(this._hostElement.value,0)}set value(A){A===null&&(A=this._getDefaultValue()),A=isNaN(A)?0:A;let i=A+\"\";if(!this._hasSetInitialValue){this._initialValue=i;return}this._isActive||this._setValue(i)}_setValue(A){this._hostElement.value=A,this._updateThumbUIByValue(),this._slider._onValueChange(this),this._cdr.detectChanges(),this._slider._cdr.markForCheck()}valueChange=new WA;dragStart=new WA;dragEnd=new WA;get translateX(){return this._slider.min>=this._slider.max?(this._translateX=this._tickMarkOffset,this._translateX):(this._translateX===void 0&&(this._translateX=this._calcTranslateXByValue()),this._translateX)}set translateX(A){this._translateX=A}_translateX;thumbPosition=mi.END;get min(){return Zi(this._hostElement.min,0)}set min(A){this._hostElement.min=A+\"\",this._cdr.detectChanges()}get max(){return Zi(this._hostElement.max,0)}set max(A){this._hostElement.max=A+\"\",this._cdr.detectChanges()}get step(){return Zi(this._hostElement.step,0)}set step(A){this._hostElement.step=A+\"\",this._cdr.detectChanges()}get disabled(){return he(this._hostElement.disabled)}set disabled(A){this._hostElement.disabled=A,this._cdr.detectChanges(),this._slider.disabled!==this.disabled&&(this._slider.disabled=this.disabled)}get percentage(){return this._slider.min>=this._slider.max?this._slider._isRtl?1:0:(this.value-this._slider.min)/(this._slider.max-this._slider.min)}get fillPercentage(){return this._slider._cachedWidth?this._translateX===0?0:this.translateX/this._slider._cachedWidth:this._slider._isRtl?1:0}_hostElement=this._elementRef.nativeElement;_valuetext=jA(\"\");_knobRadius=8;_tickMarkOffset=3;_isActive=!1;_isFocused=!1;_setIsFocused(A){this._isFocused=A}_hasSetInitialValue=!1;_initialValue;_formControl;_destroyed=new $A;_skipUIUpdate=!1;_onChangeFn;_onTouchedFn=()=>{};_isControlInitialized=!1;constructor(){let A=h(ui);this._ngZone.runOutsideAngular(()=>{this._listenerCleanups=[A.listen(this._hostElement,\"pointerdown\",this._onPointerDown.bind(this)),A.listen(this._hostElement,\"pointermove\",this._onPointerMove.bind(this)),A.listen(this._hostElement,\"pointerup\",this._onPointerUp.bind(this))]})}ngOnDestroy(){this._listenerCleanups.forEach(A=>A()),this._destroyed.next(),this._destroyed.complete(),this.dragStart.complete(),this.dragEnd.complete()}initProps(){this._updateWidthInactive(),this.disabled!==this._slider.disabled&&(this._slider.disabled=!0),this.step=this._slider.step,this.min=this._slider.min,this.max=this._slider.max,this._initValue()}initUI(){this._updateThumbUIByValue()}_initValue(){this._hasSetInitialValue=!0,this._initialValue===void 0?this.value=this._getDefaultValue():(this._hostElement.value=this._initialValue,this._updateThumbUIByValue(),this._slider._onValueChange(this),this._cdr.detectChanges())}_getDefaultValue(){return this.min}_onBlur(){this._setIsFocused(!1),this._onTouchedFn()}_onFocus(){this._slider._setTransition(!1),this._slider._updateTrackUI(this),this._setIsFocused(!0)}_onChange(){this.valueChange.emit(this.value),this._isActive&&this._updateThumbUIByValue({withAnimation:!0})}_onInput(){this._onChangeFn?.(this.value),(this._slider.step||!this._isActive)&&this._updateThumbUIByValue({withAnimation:!0}),this._slider._onValueChange(this)}_onNgControlValueChange(){(!this._isActive||!this._isFocused)&&(this._slider._onValueChange(this),this._updateThumbUIByValue()),this._slider.disabled=this._formControl.disabled}_onPointerDown(A){if(!(this.disabled||A.button!==0)){if(this._platform.IOS){let i=this._slider._isCursorOnSliderThumb(A,this._slider._getThumb(this.thumbPosition)._hostElement.getBoundingClientRect());this._isActive=i,this._updateWidthActive(),this._slider._updateDimensions();return}this._isActive=!0,this._setIsFocused(!0),this._updateWidthActive(),this._slider._updateDimensions(),this._slider.step||this._updateThumbUIByPointerEvent(A,{withAnimation:!0}),this.disabled||(this._handleValueCorrection(A),this.dragStart.emit({source:this,parent:this._slider,value:this.value}))}}_handleValueCorrection(A){this._skipUIUpdate=!0,setTimeout(()=>{this._skipUIUpdate=!1,this._fixValue(A)},0)}_fixValue(A){let i=A.clientX-this._slider._cachedLeft,n=this._slider._cachedWidth,o=this._slider.step===0?1:this._slider.step,a=Math.floor((this._slider.max-this._slider.min)/o),r=this._slider._isRtl?1-i/n:i/n,g=Math.round(r*a)/a*(this._slider.max-this._slider.min)+this._slider.min,l=Math.round(g/o)*o,C=this.value;if(l===C){this._slider._onValueChange(this),this._slider.step>0?this._updateThumbUIByValue():this._updateThumbUIByPointerEvent(A,{withAnimation:this._slider._hasAnimation});return}this.value=l,this.valueChange.emit(this.value),this._onChangeFn?.(this.value),this._slider._onValueChange(this),this._slider.step>0?this._updateThumbUIByValue():this._updateThumbUIByPointerEvent(A,{withAnimation:this._slider._hasAnimation})}_onPointerMove(A){!this._slider.step&&this._isActive&&this._updateThumbUIByPointerEvent(A)}_onPointerUp(){this._isActive&&(this._isActive=!1,this._platform.SAFARI&&this._setIsFocused(!1),this.dragEnd.emit({source:this,parent:this._slider,value:this.value}),setTimeout(()=>this._updateWidthInactive(),this._platform.IOS?10:0))}_clamp(A){let i=this._tickMarkOffset,n=this._slider._cachedWidth-this._tickMarkOffset;return Math.max(Math.min(A,n),i)}_calcTranslateXByValue(){return this._slider._isRtl?(1-this.percentage)*(this._slider._cachedWidth-this._tickMarkOffset*2)+this._tickMarkOffset:this.percentage*(this._slider._cachedWidth-this._tickMarkOffset*2)+this._tickMarkOffset}_calcTranslateXByPointerEvent(A){return A.clientX-this._slider._cachedLeft}_updateWidthActive(){}_updateWidthInactive(){this._hostElement.style.padding=`0 ${this._slider._inputPadding}px`,this._hostElement.style.width=`calc(100% + ${this._slider._inputPadding-this._tickMarkOffset*2}px)`,this._hostElement.style.left=`-${this._slider._rippleRadius-this._tickMarkOffset}px`}_updateThumbUIByValue(A){this.translateX=this._clamp(this._calcTranslateXByValue()),this._updateThumbUI(A)}_updateThumbUIByPointerEvent(A,i){this.translateX=this._clamp(this._calcTranslateXByPointerEvent(A)),this._updateThumbUI(i)}_updateThumbUI(A){this._slider._setTransition(!!A?.withAnimation),this._slider._onTranslateXChange(this)}writeValue(A){(this._isControlInitialized||A!==null)&&(this.value=A)}registerOnChange(A){this._onChangeFn=A,this._isControlInitialized=!0}registerOnTouched(A){this._onTouchedFn=A}setDisabledState(A){this.disabled=A}focus(){this._hostElement.focus()}blur(){this._hostElement.blur()}static \\u0275fac=function(i){return new(i||t)};static \\u0275dir=OA({type:t,selectors:[[\"input\",\"matSliderThumb\",\"\"]],hostAttrs:[\"type\",\"range\",1,\"mdc-slider__input\"],hostVars:1,hostBindings:function(i,n){i&1&&$(\"change\",function(){return n._onChange()})(\"input\",function(){return n._onInput()})(\"blur\",function(){return n._onBlur()})(\"focus\",function(){return n._onFocus()}),i&2&&ie(\"aria-valuetext\",n._valuetext())},inputs:{value:[2,\"value\",\"value\",Zi]},outputs:{valueChange:\"valueChange\",dragStart:\"dragStart\",dragEnd:\"dragEnd\"},exportAs:[\"matSliderThumb\"],features:[It([LxA,{provide:MtA,useExisting:t}])]})}return t})();var my=class t{constructor(e,A,i){this.dialogRef=e;this.fb=A;this.data=i;this.evalMetrics=this.data.evalMetrics,this.evalForm=this.fb.group({tool_trajectory_avg_score_threshold:[this.getEvalMetricThresholdFromData(\"tool_trajectory_avg_score\"),[Ss.required,Ss.min(0),Ss.max(1)]],response_match_score_threshold:[this.getEvalMetricThresholdFromData(\"response_match_score\"),[Ss.required,Ss.min(0),Ss.max(1)]]})}evalForm;evalMetrics=[];getEvalMetricThresholdFromData(e){return this.evalMetrics.find(A=>A.metricName===e)?.threshold??0}onStart(){if(this.evalForm.valid){let{tool_trajectory_avg_score_threshold:e,response_match_score_threshold:A}=this.evalForm.value;for(let i of this.evalMetrics)i.metricName===\"tool_trajectory_avg_score\"?i.threshold=e:i.metricName===\"response_match_score\"&&(i.threshold=A);this.dialogRef.close(this.evalMetrics)}}onCancel(){this.dialogRef.close(null)}static \\u0275fac=function(A){return new(A||t)(lt(Fo),lt(d_),lt(da))};static \\u0275cmp=kA({type:t,selectors:[[\"app-run-eval-config-dialog\"]],decls:26,vars:3,consts:[[1,\"dialog-container\"],[\"mat-dialog-title\",\"\",1,\"dialog-title\"],[1,\"eval-form\",3,\"formGroup\"],[1,\"metric-row\"],[1,\"metric-name\"],[1,\"flex-1\",\"pl-4\"],[\"min\",\"0\",\"max\",\"1\",\"step\",\"0.1\",\"thumbLabel\",\"\",1,\"threshold-slider\"],[\"matSliderThumb\",\"\",\"formControlName\",\"tool_trajectory_avg_score_threshold\"],[1,\"threshold-value\"],[\"matSliderThumb\",\"\",\"formControlName\",\"response_match_score_threshold\"],[\"align\",\"end\",1,\"dialog-actions\"],[\"mat-button\",\"\",1,\"cancel-button\",3,\"click\"],[\"mat-button\",\"\",1,\"save-button\",3,\"click\"]],template:function(A,i){A&1&&(m(0,\"div\",0)(1,\"h2\",1),K(2,\"EVALUATION METRIC\"),D(),m(3,\"mat-dialog-content\")(4,\"form\",2)(5,\"div\",3)(6,\"div\",4),K(7,\"Tool trajectory avg score: \"),D(),m(8,\"div\",5)(9,\"mat-slider\",6),GA(10,\"input\",7),D(),m(11,\"span\",8),K(12),D()()(),m(13,\"div\",3)(14,\"div\",4),K(15,\"Response match score: \"),D(),m(16,\"div\",5)(17,\"mat-slider\",6),GA(18,\"input\",9),D(),m(19,\"span\",8),K(20),D()()()()(),m(21,\"mat-dialog-actions\",10)(22,\"button\",11),$(\"click\",function(){return i.onCancel()}),K(23,\"Cancel\"),D(),m(24,\"button\",12),$(\"click\",function(){return i.onStart()}),K(25,\"Start\"),D()()()),A&2&&(p(4),X(\"formGroup\",i.evalForm),p(8),Fe(\" \",i.evalForm.controls.tool_trajectory_avg_score_threshold.value,\" \"),p(8),Fe(\" \",i.evalForm.controls.response_match_score_threshold.value,\" \"))},dependencies:[ya,gr,yn,C_,ro,so,o_,bc,GC,_v,StA,hF,Ta,vn],styles:[\"build.dialog-container[_ngcontent-%COMP%]{border-radius:12px;padding:18px;width:500px;box-shadow:0 8px 16px var(--run-eval-config-dialog-container-box-shadow-color)}.threshold-slider[_ngcontent-%COMP%]{--mdc-slider-active-track-color: var(--run-eval-config-dialog-threshold-slider-active-track-color);--mdc-slider-inactive-track-color: var(--run-eval-config-dialog-threshold-slider-inactive-track-color);--mdc-slider-handle-color: var(--run-eval-config-dialog-threshold-slider-handle-color);--mdc-slider-ripple-color: var(--run-eval-config-dialog-threshold-slider-ripple-color);width:100px}.metric-row[_ngcontent-%COMP%]{display:flex;flex-direction:row;align-items:center}.metric-name[_ngcontent-%COMP%]{width:250px}.threshold-value[_ngcontent-%COMP%]{margin-left:20px}.mdc-slider__thumb--with-indicator[_ngcontent-%COMP%]{background-color:var(--mdc-slider-handle-color, var(--run-eval-config-dialog-mdc-slider-thumb-background-color));border:none!important;box-shadow:none!important}h2[mat-dialog-title][_ngcontent-%COMP%]{color:var(--mdc-dialog-supporting-text-color)!important}mat-dialog-content[_ngcontent-%COMP%]{color:var(--mdc-dialog-supporting-text-color)!important}button[mat-button][_ngcontent-%COMP%]{color:var(--mdc-dialog-supporting-text-color)!important}\"]})};function _xA(t,e){if(t&1){let A=zA();m(0,\"div\",1)(1,\"div\"),K(2),D(),m(3,\"mat-icon\",2),$(\"click\",function(){rA(A);let n=y();return sA(n.openNewEvalSetDialog())}),K(4,\"add\"),D()()}if(t&2){let A=y();p(2),qA(A.i18n.allEvalSetsHeader),p(),X(\"matTooltip\",A.i18n.createNewEvalSetTooltip)}}function GxA(t,e){if(t&1){let A=zA();m(0,\"div\")(1,\"div\",3)(2,\"div\",4),K(3),D(),m(4,\"div\",5),K(5),D(),m(6,\"div\",6),$(\"click\",function(){rA(A);let n=y();return sA(n.openNewEvalSetDialog())}),K(7),D()()()}if(t&2){let A=y();p(3),Fe(\" \",A.i18n.createNewEvalSetTitle,\" \"),p(2),Fe(\" \",A.i18n.evalSetDescription,\" \"),p(2),Fe(\" \",A.i18n.createEvalSetButton,\" \")}}function KxA(t,e){if(t&1){let A=zA();m(0,\"div\",8),$(\"click\",function(){let n=rA(A).$implicit,o=y(2);return sA(o.selectEvalSet(n))}),m(1,\"div\",9)(2,\"span\",10),K(3,\"folder\"),D(),m(4,\"div\",11),K(5),D()(),m(6,\"div\")(7,\"mat-icon\",12),K(8,\"chevron_right\"),D()()()}if(t&2){let A=e.$implicit;p(5),qA(A)}}function UxA(t,e){if(t&1&&(m(0,\"div\"),Gt(1,KxA,9,1,\"div\",7,Ri),D()),t&2){let A=y();p(),Kt(A.evalsets)}}function JxA(t,e){if(t&1){let A=zA();m(0,\"th\",29)(1,\"mat-checkbox\",30),$(\"change\",function(n){rA(A);let o=y(4);return sA(n?o.toggleAllRows():null)}),D()()}if(t&2){let A=y(4);p(),X(\"checked\",A.selection.hasValue()&&A.isAllSelected())(\"indeterminate\",A.selection.hasValue()&&!A.isAllSelected())}}function YxA(t,e){if(t&1){let A=zA();m(0,\"td\",31)(1,\"mat-checkbox\",32),$(\"click\",function(n){return n.stopPropagation()})(\"change\",function(n){let o=rA(A).$implicit,a=y(4);return sA(n?a.selection.toggle(o):null)}),D()()}if(t&2){let A=e.$implicit,i=y(4);p(),X(\"checked\",i.selection.isSelected(A))}}function HxA(t,e){if(t&1&&(m(0,\"th\",29),K(1),D()),t&2){let A=y(4);p(),Fe(\" \",A.i18n.caseIdHeader,\" \")}}function TxA(t,e){if(t&1){let A=zA();m(0,\"td\",33),$(\"click\",function(){let n=rA(A).$implicit,o=y(4);return sA(o.getEvalCase(n))}),K(1),D()}if(t&2){let A,i=e.$implicit,n=y(4);ae(\"selected-eval-case\",i===((A=n.selectedEvalCase())==null?null:A.evalId)),p(),Fe(\" \",i,\" \")}}function OxA(t,e){if(t&1&&(m(0,\"th\",29),K(1),D()),t&2){let A=y(4);p(),Fe(\" \",A.i18n.resultHeader,\" \")}}function zxA(t,e){if(t&1){let A=zA();m(0,\"button\",35),$(\"click\",function(){rA(A);let n=y().$implicit,o=y(4);return sA(o.getSession(n))}),m(1,\"span\",36),K(2),D(),m(3,\"div\",37),K(4),D()()}if(t&2){let A=y().$implicit,i=y(4);X(\"ngClass\",i.getEvalResultForCase(A)==1?\"result-btn pass\":\"result-btn fail\")(\"matTooltip\",i.i18n.viewEvalRunResultTooltip),p(2),Fe(\" \",i.getEvalResultForCase(A)==1?\"check\":\"close\",\" \"),p(2),Fe(\"\",i.getEvalResultForCase(A)==1?i.i18n.passStatus:i.i18n.failStatus,\" \")}}function PxA(t,e){if(t&1&&(m(0,\"td\",31),V(1,zxA,5,4,\"button\",34),D()),t&2){let A=e.$implicit,i=y(4);p(),W(i.getEvalResultForCase(A)?1:-1)}}function jxA(t,e){t&1&&GA(0,\"tr\",38)}function qxA(t,e){t&1&&GA(0,\"tr\",39)}function VxA(t,e){if(t&1){let A=zA();m(0,\"div\")(1,\"div\",16)(2,\"button\",17),$(\"click\",function(){rA(A);let n=y(3);return sA(n.openEvalConfigDialog())}),K(3),D(),m(4,\"mat-icon\",18),$(\"click\",function(){rA(A);let n=y(3);return sA(n.toggleEvalHistoryButton())}),K(5,\"history\"),D()(),m(6,\"div\",19)(7,\"table\",20),ws(8,21),yt(9,JxA,2,2,\"th\",22)(10,YxA,2,1,\"td\",23),ys(),ws(11,24),yt(12,HxA,2,1,\"th\",22)(13,TxA,2,3,\"td\",25),ys(),ws(14,26),yt(15,OxA,2,1,\"th\",22)(16,PxA,2,1,\"td\",23),ys(),yt(17,jxA,1,0,\"tr\",27)(18,qxA,1,0,\"tr\",28),D()()()}if(t&2){let A=y(3);p(3),qA(A.i18n.runEvaluationButton),p(),X(\"matTooltip\",A.i18n.viewEvalRunHistoryTooltip),p(3),X(\"dataSource\",A.dataSource),p(10),X(\"matHeaderRowDef\",A.displayedColumns),p(),X(\"matRowDefColumns\",A.displayedColumns)}}function WxA(t,e){if(t&1&&(m(0,\"div\")(1,\"span\",50),K(2,\"|\"),D(),m(3,\"span\",51),K(4),D()()),t&2){let A=y().$implicit,i=y(4);p(4),Dc(\"\",i.getFailCountForCurrentResult(A.evaluationResults.evaluationResults),\" \",i.i18n.failedSuffix)}}function ZxA(t,e){if(t&1&&(m(0,\"span\",52),K(1),D()),t&2){let A=e.$implicit;p(),Dc(\" \",A.metricName,\": \",A.threshold,\" \")}}function XxA(t,e){if(t&1&&(m(0,\"div\",46),Gt(1,ZxA,2,2,\"span\",52,Ri),D()),t&2){let A=y().$implicit,i=y(4);p(),Kt(i.getEvalMetrics(A))}}function $xA(t,e){if(t&1){let A=zA();m(0,\"div\")(1,\"div\",53)(2,\"span\"),K(3),D(),m(4,\"button\",54),$(\"click\",function(){let n=rA(A).$implicit,o=y(6);return sA(o.getHistorySession(n))}),m(5,\"span\",36),K(6),D(),m(7,\"div\",37),K(8),D()()()()}if(t&2){let A=e.$implicit,i=y(6);p(3),Fe(\" \",A.evalId,\" \"),p(),X(\"ngClass\",A.finalEvalStatus==1?\"result-btn pass\":\"result-btn fail\"),p(2),Fe(\" \",A.finalEvalStatus==1?\"check\":\"close\",\" \"),p(2),Fe(\"\",A.finalEvalStatus==1?i.i18n.passStatusCaps:i.i18n.failStatusCaps,\" \")}}function ARA(t,e){if(t&1&&(m(0,\"div\",49),Gt(1,$xA,9,4,\"div\",null,Ri),D()),t&2){let A=y().$implicit,i=y(4);p(),Kt(i.generateHistoryEvaluationDatasource(A.timestamp))}}function eRA(t,e){if(t&1){let A=zA();m(0,\"div\")(1,\"div\",40)(2,\"div\",41)(3,\"div\",42)(4,\"div\",43),K(5),D(),m(6,\"div\",44)(7,\"span\",45),K(8),D(),V(9,WxA,5,2,\"div\"),D(),V(10,XxA,3,0,\"div\",46),D(),m(11,\"div\",47)(12,\"mat-icon\",48),$(\"click\",function(){let n=rA(A).$implicit,o=y(4);return sA(o.toggleHistoryStatusCard(n.timestamp))}),K(13),D()()(),V(14,ARA,3,0,\"div\",49),D()()}if(t&2){let A=e.$implicit,i=y(4);p(5),qA(i.formatTimestamp(A.timestamp)),p(3),Dc(\"\",i.getPassCountForCurrentResult(A.evaluationResults.evaluationResults),\" \",i.i18n.passedSuffix),p(),W(i.getFailCountForCurrentResult(A.evaluationResults.evaluationResults)>0?9:-1),p(),W(i.getEvalMetrics(A)?10:-1),p(3),qA(i.getEvaluationStatusCardActionButtonIcon(A.timestamp)),p(),W(i.isEvaluationStatusCardToggled(A.timestamp)?14:-1)}}function tRA(t,e){if(t&1&&(m(0,\"div\"),Gt(1,eRA,15,7,\"div\",null,Ri),D()),t&2){let A=y(3);p(),Kt(A.getEvalHistoryOfCurrentSetSorted())}}function iRA(t,e){if(t&1&&(m(0,\"div\"),V(1,VxA,19,5,\"div\"),V(2,tRA,3,0,\"div\"),D()),t&2){let A=y(2);p(),W(A.showEvalHistory()?-1:1),p(),W(A.showEvalHistory()?2:-1)}}function nRA(t,e){if(t&1){let A=zA();m(0,\"button\",55),$(\"click\",function(){rA(A);let n=y(2);return sA(n.openNewEvalCaseDialog())}),m(1,\"div\",56)(2,\"mat-icon\"),K(3,\"add\"),D(),m(4,\"div\",57),K(5),D()()()}if(t&2){let A=y(2);p(5),Dc(\" \",A.i18n.addSessionToSetButtonPrefix,\" \",A.selectedEvalSet,\" \")}}function oRA(t,e){t&1&&(m(0,\"div\"),GA(1,\"mat-spinner\",58),D()),t&2&&(p(),X(\"diameter\",28)(\"strokeWidth\",3))}function aRA(t,e){if(t&1){let A=zA();m(0,\"div\")(1,\"div\",9)(2,\"mat-icon\",13),$(\"click\",function(){rA(A);let n=y();return sA(n.clearSelectedEvalSet())}),K(3,\"chevron_left\"),D(),m(4,\"div\",14),$(\"click\",function(){rA(A);let n=y();return sA(n.clearSelectedEvalSet())}),K(5),D()(),V(6,iRA,3,2,\"div\"),V(7,nRA,6,2,\"button\",15),V(8,oRA,2,2,\"div\"),D()}if(t&2){let A=y();p(5),Fe(\" \",A.selectedEvalSet,\" \"),p(),W(A.evalCases.length>0&&!A.evalRunning()?6:-1),p(),W(!A.evalRunning()&&!A.showEvalHistory()?7:-1),p(),W(A.evalRunning()?8:-1)}}var py=new wA(\"EVAL_TAB_COMPONENT\"),Qc=class t{checkboxes=wL(yB);appName=nt(\"\");userId=nt(\"\");sessionId=nt(\"\");sessionSelected=No();shouldShowTab=No();evalNotInstalledMsg=No();evalCaseSelected=No();evalSetIdSelected=No();shouldReturnToSession=No();evalCasesSubject=new Jt([]);changeDetectorRef=h(ft);flagService=h(lr);i18n=h(btA);displayedColumns=[\"select\",\"evalId\",\"finalEvalStatus\"];evalsets=[];selectedEvalSet=\"\";evalCases=[];selectedEvalCase=jA(null);deletedEvalCaseIndex=-1;dataSource=new $u(this.evalCases);selection=new $I(!0,[]);showEvalHistory=jA(!1);evalRunning=jA(!1);evalMetrics=ytA;currentEvalResultBySet=new Map;dialog=h(Qs);appEvaluationResults={};evalService=h(Uc);sessionService=h(Hg);constructor(){this.evalCasesSubject.subscribe(e=>{!this.selectedEvalCase()&&this.deletedEvalCaseIndex>=0&&e.length>0?(this.selectNewEvalCase(e),this.deletedEvalCaseIndex=-1):e.length===0&&this.shouldReturnToSession.emit(!0)})}ngOnChanges(e){e.appName&&(this.selectedEvalSet=\"\",this.evalCases=[],this.getEvalSet(),this.getEvaluationResult())}ngOnInit(){}selectNewEvalCase(e){let A=this.deletedEvalCaseIndex;this.deletedEvalCaseIndex===e.length&&(A=0),this.getEvalCase(e[A])}getEvalSet(){this.appName()!==\"\"&&this.evalService.getEvalSets(this.appName()).pipe(Ho(e=>e.status===404&&e.statusText===\"Not Found\"?(this.shouldShowTab.emit(!1),oe(null)):oe([]))).subscribe(e=>{e!==null&&(this.shouldShowTab.emit(!0),this.evalsets=e,this.changeDetectorRef.detectChanges())})}openNewEvalSetDialog(){this.dialog.open(fy,{width:\"600px\",data:{appName:this.appName()}}).afterClosed().subscribe(A=>{A&&(this.getEvalSet(),this.changeDetectorRef.detectChanges())})}openNewEvalCaseDialog(){this.dialog.open(uy,{width:\"600px\",data:{appName:this.appName(),userId:this.userId(),sessionId:this.sessionId(),evalSetId:this.selectedEvalSet}}).afterClosed().subscribe(A=>{A&&(this.listEvalCases(),this.changeDetectorRef.detectChanges())})}listEvalCases(){this.evalCases=[],this.evalService.listEvalCases(this.appName(),this.selectedEvalSet).subscribe(e=>{this.evalCases=e,this.dataSource=new $u(this.evalCases),this.evalCasesSubject.next(this.evalCases),this.changeDetectorRef.detectChanges()})}runEval(){if(this.evalRunning.set(!0),this.selection.selected.length==0){alert(\"No case selected!\"),this.evalRunning.set(!1);return}this.evalService.runEval(this.appName(),this.selectedEvalSet,this.selection.selected,this.evalMetrics).pipe(Ho(e=>(e.error?.detail?.includes(\"not installed\")&&this.evalNotInstalledMsg.emit(e.error.detail),oe([])))).subscribe(e=>{this.evalRunning.set(!1),this.currentEvalResultBySet.set(this.selectedEvalSet,e),this.getEvaluationResult(),this.changeDetectorRef.detectChanges()})}selectEvalSet(e){this.selectedEvalSet=e,this.listEvalCases()}clearSelectedEvalSet(){if(this.showEvalHistory()){this.toggleEvalHistoryButton();return}this.selectedEvalSet=\"\"}isAllSelected(){let e=this.selection.selected.length,A=this.dataSource.data.length;return e===A}toggleAllRows(){if(this.isAllSelected()){this.selection.clear();return}this.selection.select(...this.dataSource.data)}getEvalResultForCase(e){let A=this.currentEvalResultBySet.get(this.selectedEvalSet)?.filter(i=>i.evalId==e);if(!(!A||A.length==0))return A[0].finalEvalStatus}formatToolUses(e){let A=[];for(let i of e)A.push({name:i.name,args:i.args});return A}addEvalCaseResultToEvents(e,A){let i=A.evalMetricResultPerInvocation,n=-1;if(i)for(let o=0;o<e.events.length;o++){let a=e.events[o];if(a.author===\"user\")n++;else{let r=i[n],s=1,g=\"\",l=1,C=1;for(let I of r.evalMetricResults)if(I.evalStatus===2){s=2,g=I.metricName,l=I.score,C=I.threshold;break}a.evalStatus=s,(o===e.events.length-1||e.events[o+1].author===\"user\")&&this.addEvalFieldsToBotEvent(a,r,g,l,C)}}return e}addEvalFieldsToBotEvent(e,A,i,n,o){e.failedMetric=i,e.evalScore=n,e.evalThreshold=o,e.failedMetric===\"tool_trajectory_avg_score\"?(e.actualInvocationToolUses=this.formatToolUses(A.actualInvocation.intermediateData.toolUses),e.expectedInvocationToolUses=this.formatToolUses(A.expectedInvocation.intermediateData.toolUses)):e.failedMetric===\"response_match_score\"&&(e.actualFinalResponse=A.actualInvocation.finalResponse.parts[0].text,e.expectedFinalResponse=A.expectedInvocation.finalResponse.parts[0]?.text)}fromApiResultToSession(e){return{id:e?.id??\"\",appName:e?.appName??\"\",userId:e?.userId??\"\",state:e?.state??[],events:e?.events??[]}}getSession(e){let A=this.currentEvalResultBySet.get(this.selectedEvalSet)?.filter(n=>n.evalId==e)[0],i=A.sessionId;this.sessionService.getSession(this.userId(),this.appName(),i).subscribe(n=>{this.addEvalCaseResultToEvents(n,A);let o=this.fromApiResultToSession(n);this.sessionSelected.emit(o)})}toggleEvalHistoryButton(){this.showEvalHistory.set(!this.showEvalHistory())}getEvalHistoryOfCurrentSet(){return this.appEvaluationResults[this.appName()][this.selectedEvalSet]}getEvalHistoryOfCurrentSetSorted(){let e=this.getEvalHistoryOfCurrentSet();return Object.keys(e).sort((n,o)=>o.localeCompare(n)).map(n=>({timestamp:n,evaluationResults:e[n]}))}getPassCountForCurrentResult(e){return e.filter(A=>A.finalEvalStatus==1).length}getFailCountForCurrentResult(e){return e.filter(A=>A.finalEvalStatus==2).length}formatTimestamp(e){let A=Number(e);if(isNaN(A))return\"Invalid timestamp provided\";let i=new Date(A*1e3);if(isNaN(i.getTime()))return\"Invalid date created from timestamp\";let n={month:\"short\",day:\"numeric\",year:\"numeric\",hour:\"numeric\",minute:\"2-digit\",hour12:!0};return new Intl.DateTimeFormat(\"en-US\",n).format(i)}getEvaluationStatusCardActionButtonIcon(e){return this.getEvalHistoryOfCurrentSet()[e].isToggled?\"keyboard_arrow_up\":\"keyboard_arrow_down\"}toggleHistoryStatusCard(e){this.getEvalHistoryOfCurrentSet()[e].isToggled=!this.getEvalHistoryOfCurrentSet()[e].isToggled}isEvaluationStatusCardToggled(e){return this.getEvalHistoryOfCurrentSet()[e].isToggled}generateHistoryEvaluationDatasource(e){return this.getEvalHistoryOfCurrentSet()[e].evaluationResults}getHistorySession(e){this.addEvalCaseResultToEvents(e.sessionDetails,e);let A=this.fromApiResultToSession(e.sessionDetails);this.sessionSelected.emit(A)}getEvalCase(e){this.evalService.getEvalCase(this.appName(),this.selectedEvalSet,e).subscribe(A=>{this.selectedEvalCase.set(A),this.evalCaseSelected.emit(A),this.evalSetIdSelected.emit(this.selectedEvalSet)})}resetEvalCase(){this.selectedEvalCase.set(null)}resetEvalResults(){this.currentEvalResultBySet.clear()}deleteEvalCase(e){this.evalService.deleteEvalCase(this.appName(),this.selectedEvalSet,e).subscribe(A=>{this.deletedEvalCaseIndex=this.evalCases.indexOf(e),this.selectedEvalCase.set(null),this.listEvalCases(),this.changeDetectorRef.detectChanges()})}getEvaluationResult(){this.evalService.listEvalResults(this.appName()).pipe(Ho(e=>e.status===404&&e.statusText===\"Not Found\"?(this.shouldShowTab.emit(!1),oe(null)):oe([]))).subscribe(e=>{for(let A of e)this.evalService.getEvalResult(this.appName(),A).subscribe(i=>{this.appEvaluationResults[this.appName()]||(this.appEvaluationResults[this.appName()]={}),this.appEvaluationResults[this.appName()][i.evalSetId]||(this.appEvaluationResults[this.appName()][i.evalSetId]={});let n=i.creationTimestamp;this.appEvaluationResults[this.appName()][i.evalSetId][n]||(this.appEvaluationResults[this.appName()][i.evalSetId][n]={isToggled:!1,evaluationResults:[]});let o={isToggled:!1,evaluationResults:i.evalCaseResults.map(a=>({setId:a.id,evalId:a.evalId,finalEvalStatus:a.finalEvalStatus,evalMetricResults:a.evalMetricResults,evalMetricResultPerInvocation:a.evalMetricResultPerInvocation,sessionId:a.sessionId,sessionDetails:a.sessionDetails,overallEvalMetricResults:a.overallEvalMetricResults??[]}))};this.appEvaluationResults[this.appName()][i.evalSetId][n]=o,this.changeDetectorRef.detectChanges()})})}openEvalConfigDialog(){if(this.selection.selected.length==0){alert(\"No case selected!\");return}this.dialog.open(my,{maxWidth:\"90vw\",maxHeight:\"90vh\",data:{evalMetrics:this.evalMetrics}}).afterClosed().subscribe(A=>{A&&(this.evalMetrics=A,this.runEval())})}getEvalMetrics(e){if(!e||!e.evaluationResults||!e.evaluationResults.evaluationResults)return this.evalMetrics;let A=e.evaluationResults.evaluationResults;return A.length===0?this.evalMetrics:typeof A[0].overallEvalMetricResults>\"u\"||!A[0].overallEvalMetricResults||A[0].overallEvalMetricResults.length===0?this.evalMetrics:A[0].overallEvalMetricResults.map(n=>({metricName:n.metricName,threshold:n.threshold}))}static \\u0275fac=function(A){return new(A||t)};static \\u0275cmp=kA({type:t,selectors:[[\"app-eval-tab\"]],viewQuery:function(A,i){A&1&&Or(i.checkboxes,yB,5),A&2&&rr()},inputs:{appName:[1,\"appName\"],userId:[1,\"userId\"],sessionId:[1,\"sessionId\"]},outputs:{sessionSelected:\"sessionSelected\",shouldShowTab:\"shouldShowTab\",evalNotInstalledMsg:\"evalNotInstalledMsg\",evalCaseSelected:\"evalCaseSelected\",evalSetIdSelected:\"evalSetIdSelected\",shouldReturnToSession:\"shouldReturnToSession\"},features:[ei],decls:5,vars:4,consts:[[1,\"eval-container\"],[1,\"eval-set-actions\"],[2,\"cursor\",\"pointer\",3,\"click\",\"matTooltip\"],[1,\"empty-eval-info\"],[1,\"info-title\"],[1,\"info-detail\"],[1,\"info-create\",3,\"click\"],[1,\"eval-set-row\"],[1,\"eval-set-row\",3,\"click\"],[2,\"display\",\"flex\"],[1,\"material-symbols-outlined\",2,\"margin-right\",\"10px\",\"padding-top\",\"16px\"],[2,\"font-family\",\"Roboto\",\"font-size\",\"14px\",\"padding\",\"16px\",\"padding-top\",\"20px\"],[2,\"padding-top\",\"20px\",\"color\",\"#9AA0A6\"],[2,\"color\",\"white\",\"cursor\",\"pointer\",3,\"click\"],[2,\"color\",\"#9AA0A6\",\"padding-top\",\"2px\",\"cursor\",\"pointer\",3,\"click\"],[1,\"save-session-btn\"],[1,\"evaluation-tab-header\"],[1,\"run-eval-btn\",3,\"click\"],[1,\"evaluation-history-icon\",3,\"click\",\"matTooltip\"],[1,\"mat-table-container\",2,\"margin-top\",\"16px\"],[\"mat-table\",\"\",3,\"dataSource\"],[\"matColumnDef\",\"select\"],[\"mat-header-cell\",\"\",4,\"matHeaderCellDef\"],[\"mat-cell\",\"\",4,\"matCellDef\"],[\"matColumnDef\",\"evalId\"],[\"mat-cell\",\"\",\"class\",\"eval-case-id\",3,\"selected-eval-case\",\"click\",4,\"matCellDef\"],[\"matColumnDef\",\"finalEvalStatus\"],[\"mat-header-row\",\"\",4,\"matHeaderRowDef\"],[\"mat-row\",\"\",4,\"matRowDef\",\"matRowDefColumns\"],[\"mat-header-cell\",\"\"],[3,\"change\",\"checked\",\"indeterminate\"],[\"mat-cell\",\"\"],[3,\"click\",\"change\",\"checked\"],[\"mat-cell\",\"\",1,\"eval-case-id\",3,\"click\"],[3,\"ngClass\",\"matTooltip\"],[3,\"click\",\"ngClass\",\"matTooltip\"],[1,\"material-symbols-outlined\"],[2,\"padding-top\",\"4px\"],[\"mat-header-row\",\"\"],[\"mat-row\",\"\"],[1,\"status-card\"],[1,\"status-card__overview\"],[1,\"status-card__info\"],[1,\"status-card__timestamp\"],[1,\"status-card__summary\"],[1,\"status-card__passed\"],[1,\"status-card__metrics\"],[1,\"status-card__action\"],[3,\"click\"],[1,\"status-card__history-cases\"],[1,\"status-card__separator\"],[1,\"status-card__failed\"],[1,\"status-card__metric\"],[1,\"status-card__history-case\"],[3,\"click\",\"ngClass\"],[1,\"save-session-btn\",3,\"click\"],[1,\"save-session-btn-detail\"],[1,\"save-session-btn-text\"],[1,\"eval-spinner\",3,\"diameter\",\"strokeWidth\"]],template:function(A,i){A&1&&(m(0,\"div\",0),V(1,_xA,5,2,\"div\",1),V(2,GxA,8,3,\"div\"),V(3,UxA,3,0,\"div\"),V(4,aRA,9,4,\"div\"),D()),A&2&&(p(),W(i.selectedEvalSet==\"\"?1:-1),p(),W(i.evalsets.length==0?2:-1),p(),W(i.evalsets.length>0&&i.selectedEvalSet==\"\"?3:-1),p(),W(i.selectedEvalSet!=\"\"?4:-1))},dependencies:[In,Ba,BtA,htA,EtA,utA,yB,QtA,ftA,Rg,mtA,DtA,ptA,wtA,uI],styles:[\".eval-container[_ngcontent-%COMP%]{margin-top:20px;padding-left:25px;padding-right:25px}.eval-case-id[_ngcontent-%COMP%]{cursor:pointer}.eval-set-actions[_ngcontent-%COMP%]{display:flex;justify-content:space-between;color:var(--eval-tab-eval-set-actions-color);font-style:normal;font-weight:700;font-size:14px}.empty-eval-info[_ngcontent-%COMP%]{margin-top:12px;background-color:var(--eval-tab-empty-eval-info-background-color);border-radius:8px;box-shadow:0 2px 6px 2px var(--eval-tab-empty-eval-info-box-shadow-color1),0 1px 2px 0 var(--eval-tab-empty-eval-info-box-shadow-color2)}.info-title[_ngcontent-%COMP%]{color:var(--eval-tab-info-title-color);font-family:Roboto;font-size:14px;font-weight:500;padding-top:13px;padding-right:16px;padding-left:16px}.info-detail[_ngcontent-%COMP%]{color:var(--eval-tab-info-detail-color);font-family:Roboto;font-size:14px;font-weight:400;padding-top:13px;padding-right:16px;padding-left:16px;letter-spacing:.2px}.info-create[_ngcontent-%COMP%]{color:var(--eval-tab-info-create-color);font-size:14px;font-style:normal;font-weight:500;padding-right:16px;padding-left:16px;margin-top:19px;padding-bottom:16px;cursor:pointer}.eval-set-row[_ngcontent-%COMP%]{display:flex;justify-content:space-between;cursor:pointer}.selected-eval-case[_ngcontent-%COMP%]{font-weight:900;color:var(--eval-tab-selected-eval-case-color)}.save-session-btn[_ngcontent-%COMP%]{width:100%;background:linear-gradient(0deg,var(--eval-tab-save-session-btn-background-color1) 0%,var(--eval-tab-save-session-btn-background-color1) 100%),var(--eval-tab-save-session-btn-background-color2);border:none;border-radius:4px;margin-top:12px;cursor:pointer}.save-session-btn-detail[_ngcontent-%COMP%]{display:flex;padding:8px 16px 8px 12px;justify-content:center}.save-session-btn-text[_ngcontent-%COMP%]{padding-top:2px;color:var(--eval-tab-save-session-btn-text-color);font-family:Google Sans;font-size:14px;font-style:normal;font-weight:500;line-height:20px;letter-spacing:.25px}.run-eval-btn[_ngcontent-%COMP%]{border-radius:4px;border:1px solid var(--eval-tab-run-eval-btn-border-color);background-color:transparent;padding:8px 24px;margin-top:16px;color:var(--eval-tab-run-eval-btn-color);cursor:pointer}.run-eval-btn[_ngcontent-%COMP%]:hover{background-color:var(--eval-tab-run-eval-btn-hover-background-color)}.result-btn[_ngcontent-%COMP%]{display:flex;background-color:transparent;border-radius:4px;border:1px solid var(--eval-tab-result-btn-border-color);margin-top:4px;cursor:pointer}.result-btn[_ngcontent-%COMP%]:hover{background-color:var(--eval-tab-result-btn-hover-background-color)}.result-btn.pass[_ngcontent-%COMP%]{color:var(--eval-tab-result-btn-pass-color)}.result-btn.fail[_ngcontent-%COMP%]{color:var(--eval-tab-result-btn-fail-color)}.evaluation-tab-header[_ngcontent-%COMP%]{display:flex;justify-content:space-between;align-items:center;width:100%}.evaluation-history-icon[_ngcontent-%COMP%]{cursor:pointer;margin-top:4px}.status-card[_ngcontent-%COMP%]{display:flex;flex-direction:column;align-items:center;border-radius:8px;background-color:var(--eval-tab-status-card-background-color);padding:12px 16px;margin-top:12px}.status-card__overview[_ngcontent-%COMP%]{display:flex;justify-content:space-between;align-items:center;width:100%}.status-card__info[_ngcontent-%COMP%]{display:flex;flex-direction:column}.status-card__timestamp[_ngcontent-%COMP%]{font-size:.9em;color:var(--eval-tab-status-card-timestamp-color);margin-bottom:5px}.status-card__summary[_ngcontent-%COMP%]{display:flex;align-items:center;font-size:.95em;font-weight:500}.status-card__metrics[_ngcontent-%COMP%]{display:flex;align-items:center;font-size:.75em;font-weight:300;margin-top:3px}.status-card__metric[_ngcontent-%COMP%]{width:180px;color:var(--eval-tab-status-card-metric-color)}.status-card__failed[_ngcontent-%COMP%]{color:var(--eval-tab-status-card-failed-color)}.status-card__separator[_ngcontent-%COMP%]{color:var(--eval-tab-status-card-separator-color);margin:0 8px}.status-card__passed[_ngcontent-%COMP%]{color:var(--eval-tab-status-card-passed-color)}.status-card__action[_ngcontent-%COMP%]{display:flex;align-items:center}.status-card__action[_ngcontent-%COMP%]   mat-icon[_ngcontent-%COMP%]{color:var(--eval-tab-status-card-action-mat-icon-color);cursor:pointer;transition:transform .2s ease-in-out}.status-card__action[_ngcontent-%COMP%]   mat-icon[_ngcontent-%COMP%]:hover{opacity:.8}.status-card__action[_ngcontent-%COMP%]   .status-card__icon[_ngcontent-%COMP%]{color:var(--eval-tab-status-card-icon-color);font-size:1.2em;cursor:pointer}.status-card__action[_ngcontent-%COMP%]   .status-card__icon[_ngcontent-%COMP%]:hover{opacity:.8}.status-card__history-cases[_ngcontent-%COMP%]{display:flex;flex-direction:column;margin-top:3px;justify-content:flex-start;width:100%}.status-card__history-case[_ngcontent-%COMP%]{display:flex;justify-content:space-between;align-items:center;width:100%;margin-top:15px}.eval-spinner[_ngcontent-%COMP%]{margin-top:12px}\"]})};var Af=class t{constructor(e,A){this.dialogRef=e;this.data=A}onConfirm(){this.dialogRef.close(!0)}onCancel(){this.dialogRef.close(!1)}static \\u0275fac=function(A){return new(A||t)(lt(Fo),lt(da))};static \\u0275cmp=kA({type:t,selectors:[[\"app-delete-session-dialog\"]],decls:11,vars:4,consts:[[1,\"confirm-delete-wrapper\"],[\"mat-dialog-title\",\"\"],[\"align\",\"end\"],[\"mat-button\",\"\",3,\"click\"],[\"mat-button\",\"\",\"cdkFocusInitial\",\"\",3,\"click\"]],template:function(A,i){A&1&&(m(0,\"div\",0)(1,\"h2\",1),K(2),D(),m(3,\"mat-dialog-content\")(4,\"p\"),K(5),D()(),m(6,\"mat-dialog-actions\",2)(7,\"button\",3),$(\"click\",function(){return i.onCancel()}),K(8),D(),m(9,\"button\",4),$(\"click\",function(){return i.onConfirm()}),K(10),D()()()),A&2&&(p(2),qA(i.data.title),p(3),qA(i.data.message),p(3),qA(i.data.cancelButtonText),p(2),qA(i.data.confirmButtonText))},dependencies:[ya,gr,Ta,vn],encapsulation:2})};var DF=[\"*\"];function rRA(t,e){t&1&&He(0)}var sRA=[\"tabListContainer\"],gRA=[\"tabList\"],lRA=[\"tabListInner\"],cRA=[\"nextPaginator\"],CRA=[\"previousPaginator\"],IRA=[\"content\"];function dRA(t,e){}var BRA=[\"tabBodyWrapper\"],QRA=[\"tabHeader\"];function ERA(t,e){}function hRA(t,e){if(t&1&&yt(0,ERA,0,0,\"ng-template\",12),t&2){let A=y().$implicit;X(\"cdkPortalOutlet\",A.templateLabel)}}function uRA(t,e){if(t&1&&K(0),t&2){let A=y().$implicit;qA(A.textLabel)}}function fRA(t,e){if(t&1){let A=zA();m(0,\"div\",7,2),$(\"click\",function(){let n=rA(A),o=n.$implicit,a=n.$index,r=y(),s=Wi(1);return sA(r._handleClick(o,s,a))})(\"cdkFocusChange\",function(n){let o=rA(A).$index,a=y();return sA(a._tabFocusChanged(n,o))}),GA(2,\"span\",8)(3,\"div\",9),m(4,\"span\",10)(5,\"span\",11),V(6,hRA,1,1,null,12)(7,uRA,1,1),D()()()}if(t&2){let A=e.$implicit,i=e.$index,n=Wi(1),o=y();Qo(A.labelClass),ae(\"mdc-tab--active\",o.selectedIndex===i),X(\"id\",o._getTabLabelId(A,i))(\"disabled\",A.disabled)(\"fitInkBarToContent\",o.fitInkBarToContent),ie(\"tabIndex\",o._getTabIndex(i))(\"aria-posinset\",i+1)(\"aria-setsize\",o._tabs.length)(\"aria-controls\",o._getTabContentId(i))(\"aria-selected\",o.selectedIndex===i)(\"aria-label\",A.ariaLabel||null)(\"aria-labelledby\",!A.ariaLabel&&A.ariaLabelledby?A.ariaLabelledby:null),p(3),X(\"matRippleTrigger\",n)(\"matRippleDisabled\",A.disabled||o.disableRipple),p(3),W(A.templateLabel?6:7)}}function mRA(t,e){t&1&&He(0)}function pRA(t,e){if(t&1){let A=zA();m(0,\"mat-tab-body\",13),$(\"_onCentered\",function(){rA(A);let n=y();return sA(n._removeTabBodyWrapperHeight())})(\"_onCentering\",function(n){rA(A);let o=y();return sA(o._setTabBodyWrapperHeight(n))})(\"_beforeCentering\",function(n){rA(A);let o=y();return sA(o._bodyCentered(n))}),D()}if(t&2){let A=e.$implicit,i=e.$index,n=y();Qo(A.bodyClass),X(\"id\",n._getTabContentId(i))(\"content\",A.content)(\"position\",A.position)(\"animationDuration\",n.animationDuration)(\"preserveContent\",n.preserveContent),ie(\"tabindex\",n.contentTabIndex!=null&&n.selectedIndex===i?n.contentTabIndex:null)(\"aria-labelledby\",n._getTabLabelId(A,i))(\"aria-hidden\",n.selectedIndex!==i)}}var DRA=new wA(\"MatTabContent\"),wRA=(()=>{class t{template=h(Fn);constructor(){}static \\u0275fac=function(i){return new(i||t)};static \\u0275dir=OA({type:t,selectors:[[\"\",\"matTabContent\",\"\"]],features:[It([{provide:DRA,useExisting:t}])]})}return t})(),yRA=new wA(\"MatTabLabel\"),FtA=new wA(\"MAT_TAB\"),wF=(()=>{class t extends YU{_closestTab=h(FtA,{optional:!0});static \\u0275fac=(()=>{let A;return function(n){return(A||(A=hi(t)))(n||t)}})();static \\u0275dir=OA({type:t,selectors:[[\"\",\"mat-tab-label\",\"\"],[\"\",\"matTabLabel\",\"\"]],features:[It([{provide:yRA,useExisting:t}]),Ct]})}return t})(),LtA=new wA(\"MAT_TAB_GROUP\"),ef=(()=>{class t{_viewContainerRef=h(Ro);_closestTabGroup=h(LtA,{optional:!0});disabled=!1;get templateLabel(){return this._templateLabel}set templateLabel(A){this._setTemplateLabelInput(A)}_templateLabel;_explicitContent=void 0;_implicitContent;textLabel=\"\";ariaLabel;ariaLabelledby;labelClass;bodyClass;id=null;_contentPortal=null;get content(){return this._contentPortal}_stateChanges=new $A;position=null;origin=null;isActive=!1;constructor(){h(Hn).load(Za)}ngOnChanges(A){(A.hasOwnProperty(\"textLabel\")||A.hasOwnProperty(\"disabled\"))&&this._stateChanges.next()}ngOnDestroy(){this._stateChanges.complete()}ngOnInit(){this._contentPortal=new Vr(this._explicitContent||this._implicitContent,this._viewContainerRef)}_setTemplateLabelInput(A){A&&A._closestTab===this&&(this._templateLabel=A)}static \\u0275fac=function(i){return new(i||t)};static \\u0275cmp=kA({type:t,selectors:[[\"mat-tab\"]],contentQueries:function(i,n,o){if(i&1&&na(o,wF,5)(o,wRA,7,Fn),i&2){let a;Ce(a=Ie())&&(n.templateLabel=a.first),Ce(a=Ie())&&(n._explicitContent=a.first)}},viewQuery:function(i,n){if(i&1&&ni(Fn,7),i&2){let o;Ce(o=Ie())&&(n._implicitContent=o.first)}},hostAttrs:[\"hidden\",\"\"],hostVars:1,hostBindings:function(i,n){i&2&&ie(\"id\",null)},inputs:{disabled:[2,\"disabled\",\"disabled\",he],textLabel:[0,\"label\",\"textLabel\"],ariaLabel:[0,\"aria-label\",\"ariaLabel\"],ariaLabelledby:[0,\"aria-labelledby\",\"ariaLabelledby\"],labelClass:\"labelClass\",bodyClass:\"bodyClass\",id:\"id\"},exportAs:[\"matTab\"],features:[It([{provide:FtA,useExisting:t}]),ei],ngContentSelectors:DF,decls:1,vars:0,template:function(i,n){i&1&&(Yt(),mf(0,rRA,1,0,\"ng-template\"))},encapsulation:2})}return t})(),uF=\"mdc-tab-indicator--active\",xtA=\"mdc-tab-indicator--no-transition\",fF=class{_items;_currentItem;constructor(e){this._items=e}hide(){this._items.forEach(e=>e.deactivateInkBar()),this._currentItem=void 0}alignToElement(e){let A=this._items.find(n=>n.elementRef.nativeElement===e),i=this._currentItem;if(A!==i&&(i?.deactivateInkBar(),A)){let n=i?.elementRef.nativeElement.getBoundingClientRect?.();A.activateInkBar(n),this._currentItem=A}}},vRA=(()=>{class t{_elementRef=h(ge);_inkBarElement=null;_inkBarContentElement=null;_fitToContent=!1;get fitInkBarToContent(){return this._fitToContent}set fitInkBarToContent(A){this._fitToContent!==A&&(this._fitToContent=A,this._inkBarElement&&this._appendInkBarElement())}activateInkBar(A){let i=this._elementRef.nativeElement;if(!A||!i.getBoundingClientRect||!this._inkBarContentElement){i.classList.add(uF);return}let n=i.getBoundingClientRect(),o=A.width/n.width,a=A.left-n.left;i.classList.add(xtA),this._inkBarContentElement.style.setProperty(\"transform\",`translateX(${a}px) scaleX(${o})`),i.getBoundingClientRect(),i.classList.remove(xtA),i.classList.add(uF),this._inkBarContentElement.style.setProperty(\"transform\",\"\")}deactivateInkBar(){this._elementRef.nativeElement.classList.remove(uF)}ngOnInit(){this._createInkBarElement()}ngOnDestroy(){this._inkBarElement?.remove(),this._inkBarElement=this._inkBarContentElement=null}_createInkBarElement(){let A=this._elementRef.nativeElement.ownerDocument||document,i=this._inkBarElement=A.createElement(\"span\"),n=this._inkBarContentElement=A.createElement(\"span\");i.className=\"mdc-tab-indicator\",n.className=\"mdc-tab-indicator__content mdc-tab-indicator__content--underline\",i.appendChild(this._inkBarContentElement),this._appendInkBarElement()}_appendInkBarElement(){this._inkBarElement;let A=this._fitToContent?this._elementRef.nativeElement.querySelector(\".mdc-tab__content\"):this._elementRef.nativeElement;A.appendChild(this._inkBarElement)}static \\u0275fac=function(i){return new(i||t)};static \\u0275dir=OA({type:t,inputs:{fitInkBarToContent:[2,\"fitInkBarToContent\",\"fitInkBarToContent\",he]}})}return t})();var _tA=(()=>{class t extends vRA{elementRef=h(ge);disabled=!1;focus(){this.elementRef.nativeElement.focus()}getOffsetLeft(){return this.elementRef.nativeElement.offsetLeft}getOffsetWidth(){return this.elementRef.nativeElement.offsetWidth}static \\u0275fac=(()=>{let A;return function(n){return(A||(A=hi(t)))(n||t)}})();static \\u0275dir=OA({type:t,selectors:[[\"\",\"matTabLabelWrapper\",\"\"]],hostVars:3,hostBindings:function(i,n){i&2&&(ie(\"aria-disabled\",!!n.disabled),ae(\"mat-mdc-tab-disabled\",n.disabled))},inputs:{disabled:[2,\"disabled\",\"disabled\",he]},features:[Ct]})}return t})(),RtA={passive:!0},bRA=650,MRA=100,kRA=(()=>{class t{_elementRef=h(ge);_changeDetectorRef=h(ft);_viewportRuler=h(Bs);_dir=h(wo,{optional:!0});_ngZone=h(Oe);_platform=h(ci);_sharedResizeObserver=h(tm);_injector=h(ut);_renderer=h(ui);_animationsDisabled=Oi();_eventCleanups;_scrollDistance=0;_selectedIndexChanged=!1;_destroyed=new $A;_showPaginationControls=!1;_disableScrollAfter=!0;_disableScrollBefore=!0;_tabLabelCount;_scrollDistanceChanged=!1;_keyManager;_currentTextContent;_stopScrolling=new $A;disablePagination=!1;get selectedIndex(){return this._selectedIndex}set selectedIndex(A){let i=isNaN(A)?0:A;this._selectedIndex!=i&&(this._selectedIndexChanged=!0,this._selectedIndex=i,this._keyManager&&this._keyManager.updateActiveItem(i))}_selectedIndex=0;selectFocusedIndex=new WA;indexFocused=new WA;constructor(){this._eventCleanups=this._ngZone.runOutsideAngular(()=>[this._renderer.listen(this._elementRef.nativeElement,\"mouseleave\",()=>this._stopInterval())])}ngAfterViewInit(){this._eventCleanups.push(this._renderer.listen(this._previousPaginator.nativeElement,\"touchstart\",()=>this._handlePaginatorPress(\"before\"),RtA),this._renderer.listen(this._nextPaginator.nativeElement,\"touchstart\",()=>this._handlePaginatorPress(\"after\"),RtA))}ngAfterContentInit(){let A=this._dir?this._dir.change:oe(\"ltr\"),i=this._sharedResizeObserver.observe(this._elementRef.nativeElement).pipe(ps(32),Bt(this._destroyed)),n=this._viewportRuler.change(150).pipe(Bt(this._destroyed)),o=()=>{this.updatePagination(),this._alignInkBarToSelectedTab()};this._keyManager=new Mc(this._items).withHorizontalOrientation(this._getLayoutDirection()).withHomeAndEnd().withWrap().skipPredicate(()=>!1),this._keyManager.updateActiveItem(Math.max(this._selectedIndex,0)),Nn(o,{injector:this._injector}),Qi(A,n,i,this._items.changes,this._itemsResized()).pipe(Bt(this._destroyed)).subscribe(()=>{this._ngZone.run(()=>{Promise.resolve().then(()=>{this._scrollDistance=Math.max(0,Math.min(this._getMaxScrollDistance(),this._scrollDistance)),o()})}),this._keyManager?.withHorizontalOrientation(this._getLayoutDirection())}),this._keyManager.change.subscribe(a=>{this.indexFocused.emit(a),this._setTabFocus(a)})}_itemsResized(){return typeof ResizeObserver!=\"function\"?xa:this._items.changes.pipe(nn(this._items),Ei(A=>new Ti(i=>this._ngZone.runOutsideAngular(()=>{let n=new ResizeObserver(o=>i.next(o));return A.forEach(o=>n.observe(o.elementRef.nativeElement)),()=>{n.disconnect()}}))),rg(1),We(A=>A.some(i=>i.contentRect.width>0&&i.contentRect.height>0)))}ngAfterContentChecked(){this._tabLabelCount!=this._items.length&&(this.updatePagination(),this._tabLabelCount=this._items.length,this._changeDetectorRef.markForCheck()),this._selectedIndexChanged&&(this._scrollToLabel(this._selectedIndex),this._checkScrollingControls(),this._alignInkBarToSelectedTab(),this._selectedIndexChanged=!1,this._changeDetectorRef.markForCheck()),this._scrollDistanceChanged&&(this._updateTabScrollPosition(),this._scrollDistanceChanged=!1,this._changeDetectorRef.markForCheck())}ngOnDestroy(){this._eventCleanups.forEach(A=>A()),this._keyManager?.destroy(),this._destroyed.next(),this._destroyed.complete(),this._stopScrolling.complete()}_handleKeydown(A){if(!aa(A))switch(A.keyCode){case 13:case 32:if(this.focusIndex!==this.selectedIndex){let i=this._items.get(this.focusIndex);i&&!i.disabled&&(this.selectFocusedIndex.emit(this.focusIndex),this._itemSelected(A))}break;default:this._keyManager?.onKeydown(A)}}_onContentChanges(){let A=this._elementRef.nativeElement.textContent;A!==this._currentTextContent&&(this._currentTextContent=A||\"\",this._ngZone.run(()=>{this.updatePagination(),this._alignInkBarToSelectedTab(),this._changeDetectorRef.markForCheck()}))}updatePagination(){this._checkPaginationEnabled(),this._checkScrollingControls(),this._updateTabScrollPosition()}get focusIndex(){return this._keyManager?this._keyManager.activeItemIndex:0}set focusIndex(A){!this._isValidIndex(A)||this.focusIndex===A||!this._keyManager||this._keyManager.setActiveItem(A)}_isValidIndex(A){return this._items?!!this._items.toArray()[A]:!0}_setTabFocus(A){if(this._showPaginationControls&&this._scrollToLabel(A),this._items&&this._items.length){this._items.toArray()[A].focus();let i=this._tabListContainer.nativeElement;this._getLayoutDirection()==\"ltr\"?i.scrollLeft=0:i.scrollLeft=i.scrollWidth-i.offsetWidth}}_getLayoutDirection(){return this._dir&&this._dir.value===\"rtl\"?\"rtl\":\"ltr\"}_updateTabScrollPosition(){if(this.disablePagination)return;let A=this.scrollDistance,i=this._getLayoutDirection()===\"ltr\"?-A:A;this._tabList.nativeElement.style.transform=`translateX(${Math.round(i)}px)`,(this._platform.TRIDENT||this._platform.EDGE)&&(this._tabListContainer.nativeElement.scrollLeft=0)}get scrollDistance(){return this._scrollDistance}set scrollDistance(A){this._scrollTo(A)}_scrollHeader(A){let i=this._tabListContainer.nativeElement.offsetWidth,n=(A==\"before\"?-1:1)*i/3;return this._scrollTo(this._scrollDistance+n)}_handlePaginatorClick(A){this._stopInterval(),this._scrollHeader(A)}_scrollToLabel(A){if(this.disablePagination)return;let i=this._items?this._items.toArray()[A]:null;if(!i)return;let n=this._tabListContainer.nativeElement.offsetWidth,{offsetLeft:o,offsetWidth:a}=i.elementRef.nativeElement,r,s;this._getLayoutDirection()==\"ltr\"?(r=o,s=r+a):(s=this._tabListInner.nativeElement.offsetWidth-o,r=s-a);let g=this.scrollDistance,l=this.scrollDistance+n;r<g?this.scrollDistance-=g-r:s>l&&(this.scrollDistance+=Math.min(s-l,r-g))}_checkPaginationEnabled(){if(this.disablePagination)this._showPaginationControls=!1;else{let A=this._tabListInner.nativeElement.scrollWidth,i=this._elementRef.nativeElement.offsetWidth,n=A-i>=5;n||(this.scrollDistance=0),n!==this._showPaginationControls&&(this._showPaginationControls=n,this._changeDetectorRef.markForCheck())}}_checkScrollingControls(){this.disablePagination?this._disableScrollAfter=this._disableScrollBefore=!0:(this._disableScrollBefore=this.scrollDistance==0,this._disableScrollAfter=this.scrollDistance==this._getMaxScrollDistance(),this._changeDetectorRef.markForCheck())}_getMaxScrollDistance(){let A=this._tabListInner.nativeElement.scrollWidth,i=this._tabListContainer.nativeElement.offsetWidth;return A-i||0}_alignInkBarToSelectedTab(){let A=this._items&&this._items.length?this._items.toArray()[this.selectedIndex]:null,i=A?A.elementRef.nativeElement:null;i?this._inkBar.alignToElement(i):this._inkBar.hide()}_stopInterval(){this._stopScrolling.next()}_handlePaginatorPress(A,i){i&&i.button!=null&&i.button!==0||(this._stopInterval(),Cf(bRA,MRA).pipe(Bt(Qi(this._stopScrolling,this._destroyed))).subscribe(()=>{let{maxScrollDistance:n,distance:o}=this._scrollHeader(A);(o===0||o>=n)&&this._stopInterval()}))}_scrollTo(A){if(this.disablePagination)return{maxScrollDistance:0,distance:0};let i=this._getMaxScrollDistance();return this._scrollDistance=Math.max(0,Math.min(i,A)),this._scrollDistanceChanged=!0,this._checkScrollingControls(),{maxScrollDistance:i,distance:this._scrollDistance}}static \\u0275fac=function(i){return new(i||t)};static \\u0275dir=OA({type:t,inputs:{disablePagination:[2,\"disablePagination\",\"disablePagination\",he],selectedIndex:[2,\"selectedIndex\",\"selectedIndex\",Zi]},outputs:{selectFocusedIndex:\"selectFocusedIndex\",indexFocused:\"indexFocused\"}})}return t})(),SRA=(()=>{class t extends kRA{_items;_tabListContainer;_tabList;_tabListInner;_nextPaginator;_previousPaginator;_inkBar;ariaLabel;ariaLabelledby;disableRipple=!1;ngAfterContentInit(){this._inkBar=new fF(this._items),super.ngAfterContentInit()}_itemSelected(A){A.preventDefault()}static \\u0275fac=(()=>{let A;return function(n){return(A||(A=hi(t)))(n||t)}})();static \\u0275cmp=kA({type:t,selectors:[[\"mat-tab-header\"]],contentQueries:function(i,n,o){if(i&1&&na(o,_tA,4),i&2){let a;Ce(a=Ie())&&(n._items=a)}},viewQuery:function(i,n){if(i&1&&ni(sRA,7)(gRA,7)(lRA,7)(cRA,5)(CRA,5),i&2){let o;Ce(o=Ie())&&(n._tabListContainer=o.first),Ce(o=Ie())&&(n._tabList=o.first),Ce(o=Ie())&&(n._tabListInner=o.first),Ce(o=Ie())&&(n._nextPaginator=o.first),Ce(o=Ie())&&(n._previousPaginator=o.first)}},hostAttrs:[1,\"mat-mdc-tab-header\"],hostVars:4,hostBindings:function(i,n){i&2&&ae(\"mat-mdc-tab-header-pagination-controls-enabled\",n._showPaginationControls)(\"mat-mdc-tab-header-rtl\",n._getLayoutDirection()==\"rtl\")},inputs:{ariaLabel:[0,\"aria-label\",\"ariaLabel\"],ariaLabelledby:[0,\"aria-labelledby\",\"ariaLabelledby\"],disableRipple:[2,\"disableRipple\",\"disableRipple\",he]},features:[Ct],ngContentSelectors:DF,decls:13,vars:10,consts:[[\"previousPaginator\",\"\"],[\"tabListContainer\",\"\"],[\"tabList\",\"\"],[\"tabListInner\",\"\"],[\"nextPaginator\",\"\"],[\"mat-ripple\",\"\",1,\"mat-mdc-tab-header-pagination\",\"mat-mdc-tab-header-pagination-before\",3,\"click\",\"mousedown\",\"touchend\",\"matRippleDisabled\"],[1,\"mat-mdc-tab-header-pagination-chevron\"],[1,\"mat-mdc-tab-label-container\",3,\"keydown\"],[\"role\",\"tablist\",1,\"mat-mdc-tab-list\",3,\"cdkObserveContent\"],[1,\"mat-mdc-tab-labels\"],[\"mat-ripple\",\"\",1,\"mat-mdc-tab-header-pagination\",\"mat-mdc-tab-header-pagination-after\",3,\"mousedown\",\"click\",\"touchend\",\"matRippleDisabled\"]],template:function(i,n){i&1&&(Yt(),m(0,\"div\",5,0),$(\"click\",function(){return n._handlePaginatorClick(\"before\")})(\"mousedown\",function(a){return n._handlePaginatorPress(\"before\",a)})(\"touchend\",function(){return n._stopInterval()}),GA(2,\"div\",6),D(),m(3,\"div\",7,1),$(\"keydown\",function(a){return n._handleKeydown(a)}),m(5,\"div\",8,2),$(\"cdkObserveContent\",function(){return n._onContentChanges()}),m(7,\"div\",9,3),He(9),D()()(),m(10,\"div\",10,4),$(\"mousedown\",function(a){return n._handlePaginatorPress(\"after\",a)})(\"click\",function(){return n._handlePaginatorClick(\"after\")})(\"touchend\",function(){return n._stopInterval()}),GA(12,\"div\",6),D()),i&2&&(ae(\"mat-mdc-tab-header-pagination-disabled\",n._disableScrollBefore),X(\"matRippleDisabled\",n._disableScrollBefore||n.disableRipple),p(3),ae(\"_mat-animation-noopable\",n._animationsDisabled),p(2),ie(\"aria-label\",n.ariaLabel||null)(\"aria-labelledby\",n.ariaLabelledby||null),p(5),ae(\"mat-mdc-tab-header-pagination-disabled\",n._disableScrollAfter),X(\"matRippleDisabled\",n._disableScrollAfter||n.disableRipple))},dependencies:[Ns,b_],styles:[`.mat-mdc-tab-header{display:flex;overflow:hidden;position:relative;flex-shrink:0}.mdc-tab-indicator .mdc-tab-indicator__content{transition-duration:var(--mat-tab-animation-duration, 250ms)}.mat-mdc-tab-header-pagination{-webkit-user-select:none;user-select:none;position:relative;display:none;justify-content:center;align-items:center;min-width:32px;cursor:pointer;z-index:2;-webkit-tap-highlight-color:rgba(0,0,0,0);touch-action:none;box-sizing:content-box;outline:0}.mat-mdc-tab-header-pagination::-moz-focus-inner{border:0}.mat-mdc-tab-header-pagination .mat-ripple-element{opacity:.12;background-color:var(--mat-tab-inactive-ripple-color, var(--mat-sys-on-surface))}.mat-mdc-tab-header-pagination-controls-enabled .mat-mdc-tab-header-pagination{display:flex}.mat-mdc-tab-header-pagination-before,.mat-mdc-tab-header-rtl .mat-mdc-tab-header-pagination-after{padding-left:4px}.mat-mdc-tab-header-pagination-before .mat-mdc-tab-header-pagination-chevron,.mat-mdc-tab-header-rtl .mat-mdc-tab-header-pagination-after .mat-mdc-tab-header-pagination-chevron{transform:rotate(-135deg)}.mat-mdc-tab-header-rtl .mat-mdc-tab-header-pagination-before,.mat-mdc-tab-header-pagination-after{padding-right:4px}.mat-mdc-tab-header-rtl .mat-mdc-tab-header-pagination-before .mat-mdc-tab-header-pagination-chevron,.mat-mdc-tab-header-pagination-after .mat-mdc-tab-header-pagination-chevron{transform:rotate(45deg)}.mat-mdc-tab-header-pagination-chevron{border-style:solid;border-width:2px 2px 0 0;height:8px;width:8px;border-color:var(--mat-tab-pagination-icon-color, var(--mat-sys-on-surface))}.mat-mdc-tab-header-pagination-disabled{box-shadow:none;cursor:default;pointer-events:none}.mat-mdc-tab-header-pagination-disabled .mat-mdc-tab-header-pagination-chevron{opacity:.4}.mat-mdc-tab-list{flex-grow:1;position:relative;transition:transform 500ms cubic-bezier(0.35, 0, 0.25, 1)}._mat-animation-noopable .mat-mdc-tab-list{transition:none}.mat-mdc-tab-label-container{display:flex;flex-grow:1;overflow:hidden;z-index:1;border-bottom-style:solid;border-bottom-width:var(--mat-tab-divider-height, 1px);border-bottom-color:var(--mat-tab-divider-color, var(--mat-sys-surface-variant))}.mat-mdc-tab-group-inverted-header .mat-mdc-tab-label-container{border-bottom:none;border-top-style:solid;border-top-width:var(--mat-tab-divider-height, 1px);border-top-color:var(--mat-tab-divider-color, var(--mat-sys-surface-variant))}.mat-mdc-tab-labels{display:flex;flex:1 0 auto}[mat-align-tabs=center]>.mat-mdc-tab-header .mat-mdc-tab-labels{justify-content:center}[mat-align-tabs=end]>.mat-mdc-tab-header .mat-mdc-tab-labels{justify-content:flex-end}.cdk-drop-list .mat-mdc-tab-labels,.mat-mdc-tab-labels.cdk-drop-list{min-height:var(--mat-tab-container-height, 48px)}.mat-mdc-tab::before{margin:5px}@media(forced-colors: active){.mat-mdc-tab[aria-disabled=true]{color:GrayText}}\n`],encapsulation:2})}return t})(),xRA=new wA(\"MAT_TABS_CONFIG\"),NtA=(()=>{class t extends Ig{_host=h(mF);_ngZone=h(Oe);_centeringSub=Rn.EMPTY;_leavingSub=Rn.EMPTY;constructor(){super()}ngOnInit(){super.ngOnInit(),this._centeringSub=this._host._beforeCentering.pipe(nn(this._host._isCenterPosition())).subscribe(A=>{this._host._content&&A&&!this.hasAttached()&&this._ngZone.run(()=>{Promise.resolve().then(),this.attach(this._host._content)})}),this._leavingSub=this._host._afterLeavingCenter.subscribe(()=>{this._host.preserveContent||this._ngZone.run(()=>this.detach())})}ngOnDestroy(){super.ngOnDestroy(),this._centeringSub.unsubscribe(),this._leavingSub.unsubscribe()}static \\u0275fac=function(i){return new(i||t)};static \\u0275dir=OA({type:t,selectors:[[\"\",\"matTabBodyHost\",\"\"]],features:[Ct]})}return t})(),mF=(()=>{class t{_elementRef=h(ge);_dir=h(wo,{optional:!0});_ngZone=h(Oe);_injector=h(ut);_renderer=h(ui);_diAnimationsDisabled=Oi();_eventCleanups;_initialized=!1;_fallbackTimer;_positionIndex;_dirChangeSubscription=Rn.EMPTY;_position;_previousPosition;_onCentering=new WA;_beforeCentering=new WA;_afterLeavingCenter=new WA;_onCentered=new WA(!0);_portalHost;_contentElement;_content;animationDuration=\"500ms\";preserveContent=!1;set position(A){this._positionIndex=A,this._computePositionAnimationState()}constructor(){if(this._dir){let A=h(ft);this._dirChangeSubscription=this._dir.change.subscribe(i=>{this._computePositionAnimationState(i),A.markForCheck()})}}ngOnInit(){this._bindTransitionEvents(),this._position===\"center\"&&(this._setActiveClass(!0),Nn(()=>this._onCentering.emit(this._elementRef.nativeElement.clientHeight),{injector:this._injector})),this._initialized=!0}ngOnDestroy(){clearTimeout(this._fallbackTimer),this._eventCleanups?.forEach(A=>A()),this._dirChangeSubscription.unsubscribe()}_bindTransitionEvents(){this._ngZone.runOutsideAngular(()=>{let A=this._elementRef.nativeElement,i=n=>{n.target===this._contentElement?.nativeElement&&(this._elementRef.nativeElement.classList.remove(\"mat-tab-body-animating\"),n.type===\"transitionend\"&&this._transitionDone())};this._eventCleanups=[this._renderer.listen(A,\"transitionstart\",n=>{n.target===this._contentElement?.nativeElement&&(this._elementRef.nativeElement.classList.add(\"mat-tab-body-animating\"),this._transitionStarted())}),this._renderer.listen(A,\"transitionend\",i),this._renderer.listen(A,\"transitioncancel\",i)]})}_transitionStarted(){clearTimeout(this._fallbackTimer);let A=this._position===\"center\";this._beforeCentering.emit(A),A&&this._onCentering.emit(this._elementRef.nativeElement.clientHeight)}_transitionDone(){this._position===\"center\"?this._onCentered.emit():this._previousPosition===\"center\"&&this._afterLeavingCenter.emit()}_setActiveClass(A){this._elementRef.nativeElement.classList.toggle(\"mat-mdc-tab-body-active\",A)}_getLayoutDirection(){return this._dir&&this._dir.value===\"rtl\"?\"rtl\":\"ltr\"}_isCenterPosition(){return this._positionIndex===0}_computePositionAnimationState(A=this._getLayoutDirection()){this._previousPosition=this._position,this._positionIndex<0?this._position=A==\"ltr\"?\"left\":\"right\":this._positionIndex>0?this._position=A==\"ltr\"?\"right\":\"left\":this._position=\"center\",this._animationsDisabled()?this._simulateTransitionEvents():this._initialized&&(this._position===\"center\"||this._previousPosition===\"center\")&&(clearTimeout(this._fallbackTimer),this._fallbackTimer=this._ngZone.runOutsideAngular(()=>setTimeout(()=>this._simulateTransitionEvents(),100)))}_simulateTransitionEvents(){this._transitionStarted(),Nn(()=>this._transitionDone(),{injector:this._injector})}_animationsDisabled(){return this._diAnimationsDisabled||this.animationDuration===\"0ms\"||this.animationDuration===\"0s\"}static \\u0275fac=function(i){return new(i||t)};static \\u0275cmp=kA({type:t,selectors:[[\"mat-tab-body\"]],viewQuery:function(i,n){if(i&1&&ni(NtA,5)(IRA,5),i&2){let o;Ce(o=Ie())&&(n._portalHost=o.first),Ce(o=Ie())&&(n._contentElement=o.first)}},hostAttrs:[1,\"mat-mdc-tab-body\"],hostVars:1,hostBindings:function(i,n){i&2&&ie(\"inert\",n._position===\"center\"?null:\"\")},inputs:{_content:[0,\"content\",\"_content\"],animationDuration:\"animationDuration\",preserveContent:\"preserveContent\",position:\"position\"},outputs:{_onCentering:\"_onCentering\",_beforeCentering:\"_beforeCentering\",_onCentered:\"_onCentered\"},decls:3,vars:6,consts:[[\"content\",\"\"],[\"cdkScrollable\",\"\",1,\"mat-mdc-tab-body-content\"],[\"matTabBodyHost\",\"\"]],template:function(i,n){i&1&&(m(0,\"div\",1,0),yt(2,dRA,0,0,\"ng-template\",2),D()),i&2&&ae(\"mat-tab-body-content-left\",n._position===\"left\")(\"mat-tab-body-content-right\",n._position===\"right\")(\"mat-tab-body-content-can-animate\",n._position===\"center\"||n._previousPosition===\"center\")},dependencies:[NtA,x0],styles:[`.mat-mdc-tab-body{top:0;left:0;right:0;bottom:0;position:absolute;display:block;overflow:hidden;outline:0;flex-basis:100%}.mat-mdc-tab-body.mat-mdc-tab-body-active{position:relative;overflow-x:hidden;overflow-y:auto;z-index:1;flex-grow:1}.mat-mdc-tab-group.mat-mdc-tab-group-dynamic-height .mat-mdc-tab-body.mat-mdc-tab-body-active{overflow-y:hidden}.mat-mdc-tab-body-content{height:100%;overflow:auto;transform:none;visibility:hidden}.mat-tab-body-animating>.mat-mdc-tab-body-content,.mat-mdc-tab-body-active>.mat-mdc-tab-body-content{visibility:visible}.mat-tab-body-animating>.mat-mdc-tab-body-content{min-height:1px}.mat-mdc-tab-group-dynamic-height .mat-mdc-tab-body-content{overflow:hidden}.mat-tab-body-content-can-animate{transition:transform var(--mat-tab-animation-duration) 1ms cubic-bezier(0.35, 0, 0.25, 1)}.mat-mdc-tab-body-wrapper._mat-animation-noopable .mat-tab-body-content-can-animate{transition:none}.mat-tab-body-content-left{transform:translate3d(-100%, 0, 0)}.mat-tab-body-content-right{transform:translate3d(100%, 0, 0)}\n`],encapsulation:2})}return t})(),Dy=(()=>{class t{_elementRef=h(ge);_changeDetectorRef=h(ft);_ngZone=h(Oe);_tabsSubscription=Rn.EMPTY;_tabLabelSubscription=Rn.EMPTY;_tabBodySubscription=Rn.EMPTY;_diAnimationsDisabled=Oi();_allTabs;_tabBodies;_tabBodyWrapper;_tabHeader;_tabs=new Sg;_indexToSelect=0;_lastFocusedTabIndex=null;_tabBodyWrapperHeight=0;color;get fitInkBarToContent(){return this._fitInkBarToContent}set fitInkBarToContent(A){this._fitInkBarToContent=A,this._changeDetectorRef.markForCheck()}_fitInkBarToContent=!1;stretchTabs=!0;alignTabs=null;dynamicHeight=!1;get selectedIndex(){return this._selectedIndex}set selectedIndex(A){this._indexToSelect=isNaN(A)?null:A}_selectedIndex=null;headerPosition=\"above\";get animationDuration(){return this._animationDuration}set animationDuration(A){let i=A+\"\";this._animationDuration=/^\\d+$/.test(i)?A+\"ms\":i}_animationDuration;get contentTabIndex(){return this._contentTabIndex}set contentTabIndex(A){this._contentTabIndex=isNaN(A)?null:A}_contentTabIndex=null;disablePagination=!1;disableRipple=!1;preserveContent=!1;get backgroundColor(){return this._backgroundColor}set backgroundColor(A){let i=this._elementRef.nativeElement.classList;i.remove(\"mat-tabs-with-background\",`mat-background-${this.backgroundColor}`),A&&i.add(\"mat-tabs-with-background\",`mat-background-${A}`),this._backgroundColor=A}_backgroundColor;ariaLabel;ariaLabelledby;selectedIndexChange=new WA;focusChange=new WA;animationDone=new WA;selectedTabChange=new WA(!0);_groupId;_isServer=!h(ci).isBrowser;constructor(){let A=h(xRA,{optional:!0});this._groupId=h(An).getId(\"mat-tab-group-\"),this.animationDuration=A&&A.animationDuration?A.animationDuration:\"500ms\",this.disablePagination=A&&A.disablePagination!=null?A.disablePagination:!1,this.dynamicHeight=A&&A.dynamicHeight!=null?A.dynamicHeight:!1,A?.contentTabIndex!=null&&(this.contentTabIndex=A.contentTabIndex),this.preserveContent=!!A?.preserveContent,this.fitInkBarToContent=A&&A.fitInkBarToContent!=null?A.fitInkBarToContent:!1,this.stretchTabs=A&&A.stretchTabs!=null?A.stretchTabs:!0,this.alignTabs=A&&A.alignTabs!=null?A.alignTabs:null}ngAfterContentChecked(){let A=this._indexToSelect=this._clampTabIndex(this._indexToSelect);if(this._selectedIndex!=A){let i=this._selectedIndex==null;if(!i){this.selectedTabChange.emit(this._createChangeEvent(A));let n=this._tabBodyWrapper.nativeElement;n.style.minHeight=n.clientHeight+\"px\"}Promise.resolve().then(()=>{this._tabs.forEach((n,o)=>n.isActive=o===A),i||(this.selectedIndexChange.emit(A),this._tabBodyWrapper.nativeElement.style.minHeight=\"\")})}this._tabs.forEach((i,n)=>{i.position=n-A,this._selectedIndex!=null&&i.position==0&&!i.origin&&(i.origin=A-this._selectedIndex)}),this._selectedIndex!==A&&(this._selectedIndex=A,this._lastFocusedTabIndex=null,this._changeDetectorRef.markForCheck())}ngAfterContentInit(){this._subscribeToAllTabChanges(),this._subscribeToTabLabels(),this._tabsSubscription=this._tabs.changes.subscribe(()=>{let A=this._clampTabIndex(this._indexToSelect);if(A===this._selectedIndex){let i=this._tabs.toArray(),n;for(let o=0;o<i.length;o++)if(i[o].isActive){this._indexToSelect=this._selectedIndex=o,this._lastFocusedTabIndex=null,n=i[o];break}!n&&i[A]&&Promise.resolve().then(()=>{i[A].isActive=!0,this.selectedTabChange.emit(this._createChangeEvent(A))})}this._changeDetectorRef.markForCheck()})}ngAfterViewInit(){this._tabBodySubscription=this._tabBodies.changes.subscribe(()=>this._bodyCentered(!0))}_subscribeToAllTabChanges(){this._allTabs.changes.pipe(nn(this._allTabs)).subscribe(A=>{this._tabs.reset(A.filter(i=>i._closestTabGroup===this||!i._closestTabGroup)),this._tabs.notifyOnChanges()})}ngOnDestroy(){this._tabs.destroy(),this._tabsSubscription.unsubscribe(),this._tabLabelSubscription.unsubscribe(),this._tabBodySubscription.unsubscribe()}realignInkBar(){this._tabHeader&&this._tabHeader._alignInkBarToSelectedTab()}updatePagination(){this._tabHeader&&this._tabHeader.updatePagination()}focusTab(A){let i=this._tabHeader;i&&(i.focusIndex=A)}_focusChanged(A){this._lastFocusedTabIndex=A,this.focusChange.emit(this._createChangeEvent(A))}_createChangeEvent(A){let i=new pF;return i.index=A,this._tabs&&this._tabs.length&&(i.tab=this._tabs.toArray()[A]),i}_subscribeToTabLabels(){this._tabLabelSubscription&&this._tabLabelSubscription.unsubscribe(),this._tabLabelSubscription=Qi(...this._tabs.map(A=>A._stateChanges)).subscribe(()=>this._changeDetectorRef.markForCheck())}_clampTabIndex(A){return Math.min(this._tabs.length-1,Math.max(A||0,0))}_getTabLabelId(A,i){return A.id||`${this._groupId}-label-${i}`}_getTabContentId(A){return`${this._groupId}-content-${A}`}_setTabBodyWrapperHeight(A){if(!this.dynamicHeight||!this._tabBodyWrapperHeight){this._tabBodyWrapperHeight=A;return}let i=this._tabBodyWrapper.nativeElement;i.style.height=this._tabBodyWrapperHeight+\"px\",this._tabBodyWrapper.nativeElement.offsetHeight&&(i.style.height=A+\"px\")}_removeTabBodyWrapperHeight(){let A=this._tabBodyWrapper.nativeElement;this._tabBodyWrapperHeight=A.clientHeight,A.style.height=\"\",this._ngZone.run(()=>this.animationDone.emit())}_handleClick(A,i,n){i.focusIndex=n,A.disabled||(this.selectedIndex=n)}_getTabIndex(A){let i=this._lastFocusedTabIndex??this.selectedIndex;return A===i?0:-1}_tabFocusChanged(A,i){A&&A!==\"mouse\"&&A!==\"touch\"&&(this._tabHeader.focusIndex=i)}_bodyCentered(A){A&&this._tabBodies?.forEach((i,n)=>i._setActiveClass(n===this._selectedIndex))}_animationsDisabled(){return this._diAnimationsDisabled||this.animationDuration===\"0\"||this.animationDuration===\"0ms\"}static \\u0275fac=function(i){return new(i||t)};static \\u0275cmp=kA({type:t,selectors:[[\"mat-tab-group\"]],contentQueries:function(i,n,o){if(i&1&&na(o,ef,5),i&2){let a;Ce(a=Ie())&&(n._allTabs=a)}},viewQuery:function(i,n){if(i&1&&ni(BRA,5)(QRA,5)(mF,5),i&2){let o;Ce(o=Ie())&&(n._tabBodyWrapper=o.first),Ce(o=Ie())&&(n._tabHeader=o.first),Ce(o=Ie())&&(n._tabBodies=o)}},hostAttrs:[1,\"mat-mdc-tab-group\"],hostVars:11,hostBindings:function(i,n){i&2&&(ie(\"mat-align-tabs\",n.alignTabs),Qo(\"mat-\"+(n.color||\"primary\")),En(\"--mat-tab-animation-duration\",n.animationDuration),ae(\"mat-mdc-tab-group-dynamic-height\",n.dynamicHeight)(\"mat-mdc-tab-group-inverted-header\",n.headerPosition===\"below\")(\"mat-mdc-tab-group-stretch-tabs\",n.stretchTabs))},inputs:{color:\"color\",fitInkBarToContent:[2,\"fitInkBarToContent\",\"fitInkBarToContent\",he],stretchTabs:[2,\"mat-stretch-tabs\",\"stretchTabs\",he],alignTabs:[0,\"mat-align-tabs\",\"alignTabs\"],dynamicHeight:[2,\"dynamicHeight\",\"dynamicHeight\",he],selectedIndex:[2,\"selectedIndex\",\"selectedIndex\",Zi],headerPosition:\"headerPosition\",animationDuration:\"animationDuration\",contentTabIndex:[2,\"contentTabIndex\",\"contentTabIndex\",Zi],disablePagination:[2,\"disablePagination\",\"disablePagination\",he],disableRipple:[2,\"disableRipple\",\"disableRipple\",he],preserveContent:[2,\"preserveContent\",\"preserveContent\",he],backgroundColor:\"backgroundColor\",ariaLabel:[0,\"aria-label\",\"ariaLabel\"],ariaLabelledby:[0,\"aria-labelledby\",\"ariaLabelledby\"]},outputs:{selectedIndexChange:\"selectedIndexChange\",focusChange:\"focusChange\",animationDone:\"animationDone\",selectedTabChange:\"selectedTabChange\"},exportAs:[\"matTabGroup\"],features:[It([{provide:LtA,useExisting:t}])],ngContentSelectors:DF,decls:9,vars:8,consts:[[\"tabHeader\",\"\"],[\"tabBodyWrapper\",\"\"],[\"tabNode\",\"\"],[3,\"indexFocused\",\"selectFocusedIndex\",\"selectedIndex\",\"disableRipple\",\"disablePagination\",\"aria-label\",\"aria-labelledby\"],[\"role\",\"tab\",\"matTabLabelWrapper\",\"\",\"cdkMonitorElementFocus\",\"\",1,\"mdc-tab\",\"mat-mdc-tab\",\"mat-focus-indicator\",3,\"id\",\"mdc-tab--active\",\"class\",\"disabled\",\"fitInkBarToContent\"],[1,\"mat-mdc-tab-body-wrapper\"],[\"role\",\"tabpanel\",3,\"id\",\"class\",\"content\",\"position\",\"animationDuration\",\"preserveContent\"],[\"role\",\"tab\",\"matTabLabelWrapper\",\"\",\"cdkMonitorElementFocus\",\"\",1,\"mdc-tab\",\"mat-mdc-tab\",\"mat-focus-indicator\",3,\"click\",\"cdkFocusChange\",\"id\",\"disabled\",\"fitInkBarToContent\"],[1,\"mdc-tab__ripple\"],[\"mat-ripple\",\"\",1,\"mat-mdc-tab-ripple\",3,\"matRippleTrigger\",\"matRippleDisabled\"],[1,\"mdc-tab__content\"],[1,\"mdc-tab__text-label\"],[3,\"cdkPortalOutlet\"],[\"role\",\"tabpanel\",3,\"_onCentered\",\"_onCentering\",\"_beforeCentering\",\"id\",\"content\",\"position\",\"animationDuration\",\"preserveContent\"]],template:function(i,n){i&1&&(Yt(),m(0,\"mat-tab-header\",3,0),$(\"indexFocused\",function(a){return n._focusChanged(a)})(\"selectFocusedIndex\",function(a){return n.selectedIndex=a}),Gt(2,fRA,8,17,\"div\",4,Ri),D(),V(4,mRA,1,0),m(5,\"div\",5,1),Gt(7,pRA,1,10,\"mat-tab-body\",6,Ri),D()),i&2&&(X(\"selectedIndex\",n.selectedIndex||0)(\"disableRipple\",n.disableRipple)(\"disablePagination\",n.disablePagination),Df(\"aria-label\",n.ariaLabel)(\"aria-labelledby\",n.ariaLabelledby),p(2),Kt(n._tabs),p(2),W(n._isServer?4:-1),p(),ae(\"_mat-animation-noopable\",n._animationsDisabled()),p(2),Kt(n._tabs))},dependencies:[SRA,_tA,Hv,Ns,Ig,mF],styles:[`.mdc-tab{min-width:90px;padding:0 24px;display:flex;flex:1 0 auto;justify-content:center;box-sizing:border-box;border:none;outline:none;text-align:center;white-space:nowrap;cursor:pointer;z-index:1;touch-action:manipulation}.mdc-tab__content{display:flex;align-items:center;justify-content:center;height:inherit;pointer-events:none}.mdc-tab__text-label{transition:150ms color linear;display:inline-block;line-height:1;z-index:2}.mdc-tab--active .mdc-tab__text-label{transition-delay:100ms}._mat-animation-noopable .mdc-tab__text-label{transition:none}.mdc-tab-indicator{display:flex;position:absolute;top:0;left:0;justify-content:center;width:100%;height:100%;pointer-events:none;z-index:1}.mdc-tab-indicator__content{transition:var(--mat-tab-animation-duration, 250ms) transform cubic-bezier(0.4, 0, 0.2, 1);transform-origin:left;opacity:0}.mdc-tab-indicator__content--underline{align-self:flex-end;box-sizing:border-box;width:100%;border-top-style:solid}.mdc-tab-indicator--active .mdc-tab-indicator__content{opacity:1}._mat-animation-noopable .mdc-tab-indicator__content,.mdc-tab-indicator--no-transition .mdc-tab-indicator__content{transition:none}.mat-mdc-tab-ripple.mat-mdc-tab-ripple{position:absolute;top:0;left:0;bottom:0;right:0;pointer-events:none}.mat-mdc-tab{-webkit-tap-highlight-color:rgba(0,0,0,0);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-decoration:none;background:none;height:var(--mat-tab-container-height, 48px);font-family:var(--mat-tab-label-text-font, var(--mat-sys-title-small-font));font-size:var(--mat-tab-label-text-size, var(--mat-sys-title-small-size));letter-spacing:var(--mat-tab-label-text-tracking, var(--mat-sys-title-small-tracking));line-height:var(--mat-tab-label-text-line-height, var(--mat-sys-title-small-line-height));font-weight:var(--mat-tab-label-text-weight, var(--mat-sys-title-small-weight))}.mat-mdc-tab.mdc-tab{flex-grow:0}.mat-mdc-tab .mdc-tab-indicator__content--underline{border-color:var(--mat-tab-active-indicator-color, var(--mat-sys-primary));border-top-width:var(--mat-tab-active-indicator-height, 2px);border-radius:var(--mat-tab-active-indicator-shape, 0)}.mat-mdc-tab:hover .mdc-tab__text-label{color:var(--mat-tab-inactive-hover-label-text-color, var(--mat-sys-on-surface))}.mat-mdc-tab:focus .mdc-tab__text-label{color:var(--mat-tab-inactive-focus-label-text-color, var(--mat-sys-on-surface))}.mat-mdc-tab.mdc-tab--active .mdc-tab__text-label{color:var(--mat-tab-active-label-text-color, var(--mat-sys-on-surface))}.mat-mdc-tab.mdc-tab--active .mdc-tab__ripple::before,.mat-mdc-tab.mdc-tab--active .mat-ripple-element{background-color:var(--mat-tab-active-ripple-color, var(--mat-sys-on-surface))}.mat-mdc-tab.mdc-tab--active:hover .mdc-tab__text-label{color:var(--mat-tab-active-hover-label-text-color, var(--mat-sys-on-surface))}.mat-mdc-tab.mdc-tab--active:hover .mdc-tab-indicator__content--underline{border-color:var(--mat-tab-active-hover-indicator-color, var(--mat-sys-primary))}.mat-mdc-tab.mdc-tab--active:focus .mdc-tab__text-label{color:var(--mat-tab-active-focus-label-text-color, var(--mat-sys-on-surface))}.mat-mdc-tab.mdc-tab--active:focus .mdc-tab-indicator__content--underline{border-color:var(--mat-tab-active-focus-indicator-color, var(--mat-sys-primary))}.mat-mdc-tab.mat-mdc-tab-disabled{opacity:.4;pointer-events:none}.mat-mdc-tab.mat-mdc-tab-disabled .mdc-tab__content{pointer-events:none}.mat-mdc-tab.mat-mdc-tab-disabled .mdc-tab__ripple::before,.mat-mdc-tab.mat-mdc-tab-disabled .mat-ripple-element{background-color:var(--mat-tab-disabled-ripple-color, var(--mat-sys-on-surface-variant))}.mat-mdc-tab .mdc-tab__ripple::before{content:\"\";display:block;position:absolute;top:0;left:0;right:0;bottom:0;opacity:0;pointer-events:none;background-color:var(--mat-tab-inactive-ripple-color, var(--mat-sys-on-surface))}.mat-mdc-tab .mdc-tab__text-label{color:var(--mat-tab-inactive-label-text-color, var(--mat-sys-on-surface));display:inline-flex;align-items:center}.mat-mdc-tab .mdc-tab__content{position:relative;pointer-events:auto}.mat-mdc-tab:hover .mdc-tab__ripple::before{opacity:.04}.mat-mdc-tab.cdk-program-focused .mdc-tab__ripple::before,.mat-mdc-tab.cdk-keyboard-focused .mdc-tab__ripple::before{opacity:.12}.mat-mdc-tab .mat-ripple-element{opacity:.12;background-color:var(--mat-tab-inactive-ripple-color, var(--mat-sys-on-surface))}.mat-mdc-tab-group.mat-mdc-tab-group-stretch-tabs>.mat-mdc-tab-header .mat-mdc-tab{flex-grow:1}.mat-mdc-tab-group{display:flex;flex-direction:column;max-width:100%}.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header,.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header-pagination{background-color:var(--mat-tab-background-color)}.mat-mdc-tab-group.mat-tabs-with-background.mat-primary>.mat-mdc-tab-header .mat-mdc-tab .mdc-tab__text-label{color:var(--mat-tab-foreground-color)}.mat-mdc-tab-group.mat-tabs-with-background.mat-primary>.mat-mdc-tab-header .mdc-tab-indicator__content--underline{border-color:var(--mat-tab-foreground-color)}.mat-mdc-tab-group.mat-tabs-with-background:not(.mat-primary)>.mat-mdc-tab-header .mat-mdc-tab:not(.mdc-tab--active) .mdc-tab__text-label{color:var(--mat-tab-foreground-color)}.mat-mdc-tab-group.mat-tabs-with-background:not(.mat-primary)>.mat-mdc-tab-header .mat-mdc-tab:not(.mdc-tab--active) .mdc-tab-indicator__content--underline{border-color:var(--mat-tab-foreground-color)}.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header .mat-mdc-tab-header-pagination-chevron,.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header .mat-focus-indicator::before,.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header-pagination .mat-mdc-tab-header-pagination-chevron,.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header-pagination .mat-focus-indicator::before{border-color:var(--mat-tab-foreground-color)}.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header .mat-ripple-element,.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header .mdc-tab__ripple::before,.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header-pagination .mat-ripple-element,.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header-pagination .mdc-tab__ripple::before{background-color:var(--mat-tab-foreground-color)}.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header .mat-mdc-tab-header-pagination-chevron,.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header-pagination .mat-mdc-tab-header-pagination-chevron{color:var(--mat-tab-foreground-color)}.mat-mdc-tab-group.mat-mdc-tab-group-inverted-header{flex-direction:column-reverse}.mat-mdc-tab-group.mat-mdc-tab-group-inverted-header .mdc-tab-indicator__content--underline{align-self:flex-start}.mat-mdc-tab-body-wrapper{position:relative;overflow:hidden;display:flex;transition:height 500ms cubic-bezier(0.35, 0, 0.25, 1)}.mat-mdc-tab-body-wrapper._mat-animation-noopable{transition:none !important;animation:none !important}\n`],encapsulation:2})}return t})(),pF=class{index;tab};var wy=new wA(\"LOGO_COMPONENT\");var RRA={noSessionsFound:\"No sessions found\",readonlyChip:\"Read-only\",filterSessionsLabel:\"Search using session ID\"},GtA=new wA(\"Session Tab Messages\",{factory:()=>RRA});function NRA(t,e){if(t&1&&(m(0,\"div\",1)(1,\"mat-form-field\",4)(2,\"mat-label\"),K(3),D(),m(4,\"mat-icon\",5),K(5,\"filter_list\"),D(),GA(6,\"input\",6),D()()),t&2){let A=y();p(3),qA(A.i18n.filterSessionsLabel),p(3),X(\"formControl\",A.filterControl)}}function FRA(t,e){t&1&&(m(0,\"div\",2),GA(1,\"mat-progress-bar\",7),D())}function LRA(t,e){if(t&1&&(m(0,\"div\",3),K(1),D()),t&2){let A=y();p(),qA(A.i18n.noSessionsFound)}}function _RA(t,e){if(t&1&&(m(0,\"div\",14)(1,\"mat-icon\"),K(2,\"visibility\"),D(),K(3),D()),t&2){let A=y(3);p(3),Fe(\" \",A.i18n.readonlyChip,\" \")}}function GRA(t,e){if(t&1){let A=zA();m(0,\"div\",10),$(\"click\",function(){let n=rA(A).$implicit,o=y(2);return sA(o.getSession(n.id))}),m(1,\"div\",11)(2,\"div\",12),K(3),D(),m(4,\"div\",13),K(5),D()(),V(6,_RA,4,1,\"div\",14),oi(7,\"async\"),D()}if(t&2){let A=e.$implicit,i=y(2);X(\"ngClass\",A.id===i.sessionId?\"session-item current\":\"session-item\"),p(3),qA(A.id),p(2),qA(i.getDate(A)),p(),W(li(7,4,i.sessionService.canEdit(i.userId,A))===!1?6:-1)}}function KRA(t,e){t&1&&(m(0,\"div\",2),GA(1,\"mat-progress-bar\",7),D())}function URA(t,e){if(t&1){let A=zA();V(0,KRA,2,0,\"div\",2),m(1,\"div\",15)(2,\"button\",16),$(\"click\",function(){rA(A);let n=y(2);return sA(n.loadMoreSessions())}),K(3,\"Load more\"),D()()}if(t&2){y(2);let A=vs(3);W(A?0:-1)}}function JRA(t,e){if(t&1&&(m(0,\"div\",8),Gt(1,GRA,8,6,\"div\",9,Ri),D(),V(3,URA,4,1),oi(4,\"async\")),t&2){let A=y();p(),Kt(A.sessionList),p(2),W(li(4,1,A.isSessionFilteringEnabled)&&A.canLoadMoreSessions?3:-1)}}var GE=class t{userId=\"\";appName=\"\";sessionId=\"\";sessionSelected=new WA;sessionReloaded=new WA;SESSIONS_PAGE_LIMIT=100;sessionList=[];canLoadMoreSessions=!1;pageToken=\"\";filterControl=new ss(\"\");refreshSessionsSubject=new $A;getSessionSubject=new $A;reloadSessionSubject=new $A;route=h(_s);changeDetectorRef=h(ft);sessionService=h(Hg);uiStateService=h(Tg);i18n=h(GtA);featureFlagService=h(lr);isSessionFilteringEnabled=this.featureFlagService.isSessionFilteringEnabled();isLoadingMoreInProgress=jA(!1);constructor(){this.filterControl.valueChanges.pipe(ps(300)).subscribe(()=>{this.pageToken=\"\",this.sessionList=[],this.refreshSessionsSubject.next()}),this.refreshSessionsSubject.pipe(Wt(()=>{this.uiStateService.setIsSessionListLoading(!0)}),Ei(()=>{let e=this.filterControl.value||void 0;return this.isSessionFilteringEnabled?this.sessionService.listSessions(this.userId,this.appName,{filter:e,pageToken:this.pageToken,pageSize:this.SESSIONS_PAGE_LIMIT}).pipe(Ho(()=>oe({items:[],nextPageToken:\"\"}))):this.sessionService.listSessions(this.userId,this.appName).pipe(Ho(()=>oe({items:[],nextPageToken:\"\"})))}),Wt(({items:e,nextPageToken:A})=>{this.sessionList=Array.from(new Map([...this.sessionList,...e].map(i=>[i.id,i])).values()).sort((i,n)=>Number(n.lastUpdateTime)-Number(i.lastUpdateTime)),this.pageToken=A??\"\",this.canLoadMoreSessions=!!A,this.changeDetectorRef.markForCheck()})).subscribe(()=>{this.isLoadingMoreInProgress.set(!1),this.uiStateService.setIsSessionListLoading(!1)},()=>{this.isLoadingMoreInProgress.set(!1),this.uiStateService.setIsSessionListLoading(!1)}),this.getSessionSubject.pipe(Wt(()=>{this.uiStateService.setIsSessionLoading(!0)}),xC(this.featureFlagService.isInfinityMessageScrollingEnabled()),Ei(([e,A])=>this.sessionService.getSession(this.userId,this.appName,e).pipe(fe(i=>({response:i,isInfinityScrollingEnabled:A}))).pipe(Ho(()=>oe(null)))),Wt(e=>{if(!e)return;let A=this.fromApiResultToSession(e.response);e.isInfinityScrollingEnabled&&A.id&&this.uiStateService.lazyLoadMessages(A.id,{pageSize:100,pageToken:\"\"}).pipe(po()).subscribe(),this.sessionSelected.emit(A),this.changeDetectorRef.markForCheck()})).subscribe(e=>{this.uiStateService.setIsSessionLoading(!1)},e=>{this.uiStateService.setIsSessionLoading(!1)}),this.reloadSessionSubject.pipe(xC(this.featureFlagService.isInfinityMessageScrollingEnabled()),Ei(([e,A])=>this.sessionService.getSession(this.userId,this.appName,e).pipe(fe(i=>({response:i,isInfinityScrollingEnabled:A}))).pipe(Ho(()=>oe(null)))),Wt(e=>{if(!e)return;let A=this.fromApiResultToSession(e.response);e.isInfinityScrollingEnabled&&A.id&&this.uiStateService.lazyLoadMessages(A.id,{pageSize:100,pageToken:\"\"},!0).pipe(po()).subscribe(),this.sessionReloaded.emit(A),this.changeDetectorRef.markForCheck()})).subscribe()}ngOnInit(){this.featureFlagService.isSessionFilteringEnabled().subscribe(e=>{if(e){let A=this.route.snapshot.queryParams.session;A&&this.filterControl.setValue(A)}}),setTimeout(()=>{this.refreshSessionsSubject.next()},500)}getSession(e){e&&this.getSessionSubject.next(e)}loadMoreSessions(){this.isLoadingMoreInProgress.set(!0),this.refreshSessionsSubject.next()}getDate(e){let A=e.lastUpdateTime||0;return new Date(A*1e3).toLocaleString()}fromApiResultToSession(e){return{id:e.id??\"\",appName:e.appName??\"\",userId:e.userId??\"\",state:e.state??{},events:e.events??[]}}reloadSession(e){this.reloadSessionSubject.next(e)}refreshSession(e){let A=null;if(this.sessionList.length>0){let i=this.sessionList.findIndex(n=>n.id===e);i===this.sessionList.length-1&&(i=-1),A=this.sessionList[i+1]}return this.isSessionFilteringEnabled?this.filterControl.setValue(\"\"):(this.sessionList=[],this.refreshSessionsSubject.next()),A}static \\u0275fac=function(A){return new(A||t)};static \\u0275cmp=kA({type:t,selectors:[[\"app-session-tab\"]],inputs:{userId:\"userId\",appName:\"appName\",sessionId:\"sessionId\"},outputs:{sessionSelected:\"sessionSelected\",sessionReloaded:\"sessionReloaded\"},decls:8,vars:7,consts:[[1,\"session-wrapper\"],[1,\"session-filter-container\"],[1,\"loading-spinner-container\"],[1,\"empty-state\"],[\"appearance\",\"outline\",1,\"session-filter\"],[\"matPrefix\",\"\"],[\"matInput\",\"\",3,\"formControl\"],[\"mode\",\"indeterminate\"],[1,\"session-tab-container\",2,\"margin-top\",\"16px\"],[3,\"ngClass\"],[3,\"click\",\"ngClass\"],[1,\"session-info\"],[1,\"session-id\"],[1,\"session-date\"],[1,\"readonly-badge\"],[1,\"load-more\"],[\"mat-button\",\"\",\"color\",\"primary\",3,\"click\"]],template:function(A,i){if(A&1&&(m(0,\"div\",0),V(1,NRA,7,2,\"div\",1),oi(2,\"async\"),wr(3),oi(4,\"async\"),V(5,FRA,2,0,\"div\",2)(6,LRA,2,1,\"div\",3)(7,JRA,5,3),D()),A&2){p(),W(li(2,2,i.isSessionFilteringEnabled)?1:-1),p(2);let n=sg(li(4,4,i.uiStateService.isSessionListLoading()));p(2),W(n&&!i.isLoadingMoreInProgress()?5:!n&&i.sessionList.length===0?6:7)}},dependencies:[Rg,ey,In,vr,To,pl,i7,Fg,wa,yn,ro,so,bc,SI,Cs,vn,Ug,Pr],styles:[\".session-wrapper[_ngcontent-%COMP%]{padding-left:25px;padding-right:25px;font-size:14px;font-weight:700;color:var(--session-tab-session-wrapper-color);display:flex;flex-direction:column;overflow:hidden;height:100%}.session-wrapper[_ngcontent-%COMP%]   .empty-state[_ngcontent-%COMP%]{color:initial;padding-top:1em;text-align:center;font-weight:400;font-style:italic}.session-wrapper[_ngcontent-%COMP%]   .session-filter-container[_ngcontent-%COMP%]{background-color:var(--session-tab-session-filter-container-background-color);border-radius:8px;padding:16px;margin-bottom:16px;margin-top:16px}.session-wrapper[_ngcontent-%COMP%]   .session-filter[_ngcontent-%COMP%]{width:100%}.session-wrapper[_ngcontent-%COMP%]   .session-filter[_ngcontent-%COMP%]     .mdc-floating-label--float-above{background-color:var(--session-tab-session-filter-container-background-color)}.session-tab-container[_ngcontent-%COMP%]{flex:1;overflow-y:auto}.session-item[_ngcontent-%COMP%]{display:flex;justify-content:space-between;align-items:center;border:none;background-color:var(--session-tab-session-item-background-color);border-radius:8px;margin-bottom:4px;cursor:pointer}.session-item[_ngcontent-%COMP%]:hover{background-color:var(--session-tab-session-item-hover-background-color)}.session-item.current[_ngcontent-%COMP%]{background-color:var(--session-tab-session-item-current-background-color)}.session-item[_ngcontent-%COMP%]   mat-chip[_ngcontent-%COMP%]{margin-right:11px}.session-id[_ngcontent-%COMP%]{color:var(--session-tab-session-id-color);font-family:Google Sans Mono,monospace;font-size:14px;font-style:normal;font-weight:500;line-height:20px;letter-spacing:.25px}.session-date[_ngcontent-%COMP%]{color:var(--session-tab-session-date-color);font-family:Roboto;font-size:12px;font-style:normal;font-weight:400;line-height:16px;letter-spacing:.3px}.session-info[_ngcontent-%COMP%]{padding:11px}.loading-spinner-container[_ngcontent-%COMP%]{margin-left:auto;margin-right:auto;margin-top:2em;width:100%}.load-more[_ngcontent-%COMP%]{display:flex;justify-content:center;margin-top:1em}.readonly-badge[_ngcontent-%COMP%]{color:var(--chat-readonly-badge-color);background-color:var(--chat-readonly-badge-background-color);border-radius:4px;padding:1px 6px;display:flex;align-items:center;margin-right:8px;font-size:12px;line-height:16px;gap:4px;white-space:nowrap}.readonly-badge[_ngcontent-%COMP%]   mat-icon[_ngcontent-%COMP%]{font-size:14px;width:14px;height:14px;padding-top:1px;flex-shrink:0}\"]})};var YRA={stateIsEmpty:\"State is empty\"},KtA=new wA(\"State Tab Messages\",{factory:()=>YRA});function HRA(t,e){if(t&1&&(m(0,\"div\",1),K(1),D()),t&2){let A=y();p(),qA(A.i18n.stateIsEmpty)}}function TRA(t,e){if(t&1&&(m(0,\"div\"),GA(1,\"ngx-json-viewer\",2),D()),t&2){let A=y();p(),X(\"json\",A.sessionState)}}var yy=class t{sessionState;i18n=h(KtA);get isEmptyState(){return!this.sessionState||Object.keys(this.sessionState).length===0}static \\u0275fac=function(A){return new(A||t)};static \\u0275cmp=kA({type:t,selectors:[[\"app-state-tab\"]],inputs:{sessionState:\"sessionState\"},decls:3,vars:1,consts:[[1,\"state-wrapper\"],[1,\"empty-state\"],[3,\"json\"]],template:function(A,i){A&1&&(m(0,\"div\",0),V(1,HRA,2,1,\"div\",1)(2,TRA,2,1,\"div\"),D()),A&2&&(p(),W(i.isEmptyState?1:2))},dependencies:[Gc,XC],styles:[\".state-wrapper[_ngcontent-%COMP%]{padding-left:25px;padding-right:25px;margin-top:16px}.state-wrapper[_ngcontent-%COMP%]   .empty-state[_ngcontent-%COMP%]{text-align:center;font-style:italic}\"]})};var ORA={noInvocationsFound:\"No invocations found\",invocationsTitle:\"Invocations\"},UtA=new wA(\"Trace Tab Messages\",{factory:()=>ORA});function zRA(t,e){t&1&&Ni(0,\"div\",8)}function PRA(t,e){if(t&1&&(ti(0,\"span\",14),K(1),Ii()),t&2){let A=y().$implicit,i=y();En(\"left\",i.getRelativeStart(A.span)+5,\"%\"),p(),Fe(\"\",(i.toMs(A.span.end_time)-i.toMs(A.span.start_time)).toFixed(2),\"ms\")}}function jRA(t,e){if(t&1){let A=zA();ti(0,\"div\",5),pc(\"click\",function(){let n=rA(A).$implicit,o=y();return sA(o.selectRow(n))})(\"mouseenter\",function(){let n=rA(A).$implicit,o=y();return sA(o.onHover(n))})(\"mouseleave\",function(){rA(A);let n=y();return sA(n.onHoverOut())}),ti(1,\"div\",6)(2,\"div\",7),Gt(3,zRA,1,0,\"div\",8,fd),Ii(),ti(5,\"span\",9),K(6),Ii(),ti(7,\"div\",10),K(8),Ii()(),ti(9,\"div\",11)(10,\"div\",12),K(11),Ii(),V(12,PRA,2,3,\"span\",13),Ii()()}if(t&2){let A=e.$implicit,i=y();ae(\"selected\",i.rowSelected(A)),p(3),Kt(i.getArray(A.level)),p(2),ae(\"is-event-row\",i.isEventRow(A)),p(),Fe(\" \",i.getSpanIcon(A.span.name),\" \"),p(),En(\"width\",400-A.level*20,\"px\"),ae(\"is-event-row\",i.isEventRow(A)),p(),Fe(\" \",A.span.name,\" \"),p(2),En(\"left\",i.getRelativeStart(A.span),\"%\")(\"width\",i.getRelativeWidth(A.span),\"%\"),p(),Fe(\" \",(i.toMs(A.span.end_time)-i.toMs(A.span.start_time)).toFixed(2),\"ms \"),p(),W(i.getRelativeWidth(A.span)<10?12:-1)}}var vy=class t{spans=[];invocationId=\"\";tree=[];eventData;baseStartTimeMs=0;totalDurationMs=1;flatTree=[];traceLabelIconMap=new Map([[\"Invocation\",\"start\"],[\"agent_run\",\"robot\"],[\"invoke_agent\",\"robot_2\"],[\"tool\",\"build\"],[\"execute_tool\",\"build\"],[\"call_llm\",\"chat\"]]);selectedRow=void 0;traceService=h($C);constructor(){}ngOnInit(){this.tree=this.buildSpanTree(this.spans),this.flatTree=this.flattenTree(this.tree);let e=this.getGlobalTimes(this.spans);this.baseStartTimeMs=e.start,this.totalDurationMs=e.duration,this.traceService.selectedTraceRow$.subscribe(A=>this.selectedRow=A),this.traceService.eventData$.subscribe(A=>this.eventData=A)}buildSpanTree(e){let A=e.map(o=>BA({},o)),i=new Map,n=[];return A.forEach(o=>i.set(o.span_id,o)),A.forEach(o=>{if(o.parent_span_id&&i.has(o.parent_span_id)){let a=i.get(o.parent_span_id);a.children=a.children||[],a.children.push(o)}else n.push(o)}),n}getGlobalTimes(e){let A=Math.min(...e.map(n=>this.toMs(n.start_time))),i=Math.max(...e.map(n=>this.toMs(n.end_time)));return{start:A,duration:i-A}}toMs(e){return e/1e6}getRelativeStart(e){return(this.toMs(e.start_time)-this.baseStartTimeMs)/this.totalDurationMs*100}getRelativeWidth(e){return(this.toMs(e.end_time)-this.toMs(e.start_time))/this.totalDurationMs*100}flattenTree(e,A=0){return e.flatMap(n=>[{span:n,level:A},...n.children?this.flattenTree(n.children,A+1):[]])}getSpanIcon(e){for(let[A,i]of this.traceLabelIconMap.entries())if(e.startsWith(A))return i;return\"start\"}getArray(e){return Array.from({length:e})}selectRow(e){if(this.selectedRow&&this.selectedRow.span_id==e.span.span_id){this.traceService.selectedRow(void 0),this.traceService.setHoveredMessages(void 0,this.invocationId);return}this.traceService.selectedRow(e.span),this.traceService.setHoveredMessages(e.span,this.invocationId)}rowSelected(e){return this.selectedRow==e.span}isEventRow(e){if(!e.span.attributes)return!1;let A=e?.span.attributes[\"gcp.vertex.agent.event_id\"];return!!(A&&this.eventData&&this.eventData.has(A))}onHover(e){this.traceService.setHoveredMessages(e.span,this.invocationId)}onHoverOut(){this.traceService.setHoveredMessages(void 0,this.invocationId),this.selectedRow&&this.traceService.setHoveredMessages(this.selectedRow,this.invocationId)}static \\u0275fac=function(A){return new(A||t)};static \\u0275cmp=kA({type:t,selectors:[[\"app-trace-tree\"]],inputs:{spans:\"spans\",invocationId:\"invocationId\"},decls:8,vars:1,consts:[[2,\"margin-top\",\"15px\"],[1,\"invocation-id-container\"],[1,\"invocation-id\"],[1,\"trace-container\"],[1,\"trace-row\",3,\"selected\"],[1,\"trace-row\",3,\"click\",\"mouseenter\",\"mouseleave\"],[1,\"trace-row-left\"],[1,\"trace-indent\"],[1,\"indent-connector\"],[1,\"material-symbols-outlined\",2,\"margin-right\",\"8px\"],[1,\"trace-label\"],[1,\"trace-bar-container\"],[1,\"trace-bar\"],[1,\"short-trace-bar-duration\",3,\"left\"],[1,\"short-trace-bar-duration\"]],template:function(A,i){A&1&&(ti(0,\"div\",0)(1,\"div\",1),K(2,\"Invocation ID: \"),ti(3,\"div\",2),K(4),Ii()(),ti(5,\"div\",3),Gt(6,jRA,13,16,\"div\",4,Ri),Ii()()),A&2&&(p(4),qA(i.invocationId),p(2),Kt(i.flatTree))},styles:[\".trace-container[_ngcontent-%COMP%]{width:100%;white-space:nowrap;font-size:12px}.trace-label[_ngcontent-%COMP%]{width:400px;color:var(--trace-tree-trace-label-color);font-family:Google Sans Mono,monospace;font-size:13px;font-style:normal;font-weight:500;line-height:20px;letter-spacing:0px;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.trace-bar-container[_ngcontent-%COMP%]{width:100%;position:relative;height:16px}.trace-bar[_ngcontent-%COMP%]{position:absolute;height:18px;background-color:var(--trace-tree-trace-bar-background-color);border-radius:4px;padding-left:4px;overflow:hidden;font-size:11px;line-height:16px;color:var(--trace-tree-trace-bar-color);font-family:Google Sans}.short-trace-bar-duration[_ngcontent-%COMP%]{position:absolute;color:var(--trace-tree-short-trace-bar-duration-color)}.trace-duration[_ngcontent-%COMP%]{color:var(--trace-tree-trace-duration-color);font-weight:400;margin-left:4px}.trace-row[_ngcontent-%COMP%]{display:flex;align-items:stretch;position:relative;height:32px;align-items:center;cursor:pointer}.trace-row[_ngcontent-%COMP%]:hover{background-color:var(--trace-tree-trace-row-hover-background-color)}.trace-row.selected[_ngcontent-%COMP%]{background-color:var(--trace-tree-trace-row-selected-background-color)}.trace-indent[_ngcontent-%COMP%]{display:flex;flex-shrink:0;height:100%}.indent-connector[_ngcontent-%COMP%]{width:20px;position:relative;height:100%}.vertical-line[_ngcontent-%COMP%]{position:absolute;top:0;bottom:0;left:9px;width:1px;background-color:var(--trace-tree-vertical-line-background-color)}.horizontal-line[_ngcontent-%COMP%]{position:absolute;top:50%;left:9px;width:10px;height:1px;background-color:var(--trace-tree-horizontal-line-background-color)}.trace-row-left[_ngcontent-%COMP%]{display:flex;width:50%}.invocation-id-container[_ngcontent-%COMP%]{color:var(--trace-tree-invocation-id-container-color);font-size:14px;font-style:normal;font-weight:700;line-height:20px;letter-spacing:0px;margin-bottom:5px}.invocation-id[_ngcontent-%COMP%]{font-family:Google Sans Mono,monospace}.trace-row-left[_ngcontent-%COMP%]   span[_ngcontent-%COMP%], .trace-row-left[_ngcontent-%COMP%]   div[_ngcontent-%COMP%]{color:var(--trace-tree-trace-row-left-span-div-color)}.trace-row-left[_ngcontent-%COMP%]   .is-event-row[_ngcontent-%COMP%]{color:var(--trace-tree-trace-row-left-is-event-row-color)}\"]})};function qRA(t,e){if(t&1&&(m(0,\"div\",1),K(1),D()),t&2){let A=y();p(),qA(A.i18n.noInvocationsFound)}}function VRA(t,e){if(t&1&&(m(0,\"div\",4)(1,\"mat-expansion-panel\")(2,\"mat-expansion-panel-header\")(3,\"mat-panel-title\"),K(4),D()(),GA(5,\"app-trace-tree\",5),D()()),t&2){let A=e.$implicit,i=y(2);p(4),Fe(\" \",i.invocToUserMsg.get(A.key),\" \"),p(),X(\"spans\",A.value)(\"invocationId\",i.findInvocIdFromTraceId(A.key))}}function WRA(t,e){if(t&1&&(m(0,\"h2\",2),K(1),D(),m(2,\"div\",3),Gt(3,VRA,6,3,\"div\",4,Ri),oi(5,\"keyvalue\"),D()),t&2){let A=y();p(),qA(A.i18n.invocationsTitle),p(2),Kt(hL(5,1,A.invocTraces,A.mapOrderPreservingSort))}}var by=class t{traceData=[];invocTraces=new Map;invocToUserMsg=new Map;i18n=h(UtA);constructor(){}ngOnInit(){}ngOnChanges(e){\"traceData\"in e&&this.rebuildTrace()}rebuildTrace(){this.invocTraces=this.traceData.reduce((e,A)=>{let i=A.trace_id,n=e.get(i);return n?(n.push(A),n.sort((o,a)=>o.start_time-a.start_time)):e.set(i,[A]),e},new Map);for(let[e,A]of this.invocTraces)this.invocToUserMsg.set(e,this.findUserMsgFromInvocGroup(A))}getArray(e){return Array.from({length:e})}findUserMsgFromInvocGroup(e){let A=e?.find(i=>i.attributes!==void 0&&\"gcp.vertex.agent.invocation_id\"in i.attributes&&\"gcp.vertex.agent.llm_request\"in i.attributes);if(!A)return\"[no invocation id found]\";try{return JSON.parse(A.attributes[\"gcp.vertex.agent.llm_request\"]).contents.filter(o=>o.role==\"user\").at(-1)?.parts[0]?.text??\"[attachment]\"}catch(i){return\"[error parsing request]\"}}findInvocIdFromTraceId(e){return this.invocTraces.get(e)?.find(i=>i.attributes!==void 0&&\"gcp.vertex.agent.invocation_id\"in i.attributes).attributes[\"gcp.vertex.agent.invocation_id\"]}mapOrderPreservingSort=(e,A)=>0;static \\u0275fac=function(A){return new(A||t)};static \\u0275cmp=kA({type:t,selectors:[[\"app-trace-tab\"]],inputs:{traceData:\"traceData\"},features:[ei],decls:3,vars:1,consts:[[1,\"trace-wrapper\"],[1,\"empty-state\"],[\"mat-dialog-title\",\"\",1,\"trace-title\"],[1,\"trace-list-wrapper\"],[1,\"trace-item\"],[3,\"spans\",\"invocationId\"]],template:function(A,i){A&1&&(m(0,\"div\",0),V(1,qRA,2,1,\"div\",1)(2,WRA,6,4),D()),A&2&&(p(),W(i.invocTraces.size===0?1:2))},dependencies:[ya,y9,bY,MY,vy,bf],styles:[\".trace-wrapper[_ngcontent-%COMP%]{padding-left:25px;padding-right:25px}.trace-wrapper[_ngcontent-%COMP%]   .empty-state[_ngcontent-%COMP%]{padding-top:1em;text-align:center;font-style:italic}.trace-container[_ngcontent-%COMP%]{width:100%;white-space:nowrap;font-size:12px}.trace-title[_ngcontent-%COMP%]{color:var(--trace-tab-trace-title-color);font-size:14px;font-style:normal;font-weight:700;line-height:20px;letter-spacing:0px}.trace-label[_ngcontent-%COMP%]{width:400px;color:var(--trace-tab-trace-label-color);text-overflow:ellipsis;font-family:Google Sans Mono,monospace;font-size:14px;font-style:normal;font-weight:500;line-height:20px;letter-spacing:0px}.trace-bar-container[_ngcontent-%COMP%]{width:50vw;position:relative;height:16px}.trace-bar[_ngcontent-%COMP%]{position:absolute;height:18px;background-color:var(--trace-tab-trace-bar-background-color);border-radius:4px;padding-left:4px;overflow:hidden;font-size:11px;line-height:16px;color:var(--trace-tab-trace-bar-color);font-family:Google Sans}.trace-duration[_ngcontent-%COMP%]{color:var(--trace-tab-trace-duration-color);font-weight:400;margin-left:4px}.trace-row[_ngcontent-%COMP%]{display:flex;align-items:stretch;position:relative;height:32px}.trace-indent[_ngcontent-%COMP%]{display:flex;flex-shrink:0;height:100%}.indent-connector[_ngcontent-%COMP%]{width:20px;position:relative;height:100%}.vertical-line[_ngcontent-%COMP%]{position:absolute;top:0;bottom:0;left:9px;width:1px;background-color:var(--trace-tab-vertical-line-background-color)}.horizontal-line[_ngcontent-%COMP%]{position:absolute;top:50%;left:9px;width:10px;height:1px;background-color:var(--trace-tab-horizontal-line-background-color)}.trace-item[_ngcontent-%COMP%]{margin-top:5px;--mat-expansion-container-background-color: var(--trace-tab-trace-item-container-background-color);--mat-expansion-header-focus-state-layer-color: var(--trace-tab-trace-item-header-focus-state-layer-color);--mat-expansion-header-description-color: var(--trace-tab-trace-item-header-description-color);--mat-expansion-header-text-size: 15}.trace-item[_ngcontent-%COMP%]     .mat-expansion-panel-header.mat-expanded:focus{background-color:var(--trace-tab-mat-expansion-panel-header-focus-background-color)}.trace-item[_ngcontent-%COMP%]     .mat-expansion-panel-header.mat-expanded{background-color:var(--trace-tab-mat-expansion-panel-header-background-color)}.trace-item[_ngcontent-%COMP%]     .mat-expansion-panel-header.mat-expanded:hover{background-color:var(--trace-tab-mat-expansion-panel-header-hover-background-color)}  .mat-expansion-panel-header-title{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}  .mat-expansion-panel-header-description{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}\"]})};var ZRA={agentDevelopmentKitLabel:\"Agent Development Kit\",collapsePanelTooltip:\"Collapse panel\",traceTabLabel:\"Trace\",eventsTabLabel:\"Events\",stateTabLabel:\"State\",artifactsTabLabel:\"Artifacts\",sessionsTabLabel:\"Sessions\",evalTabLabel:\"Eval\",selectEventAriaLabel:\"Select event\",eventDetailsTabLabel:\"Event\",requestDetailsTabLabel:\"Request\",responseDetailsTabLabel:\"Response\",responseIsNotAvailable:\"Response is not available\",requestIsNotAvailable:\"Request is not available\"},JtA=new wA(\"Side Panel Messages\",{factory:()=>ZRA});var XRA=[\"evalTabContainer\"];function $RA(t,e){t&1&&$i(0)}function ANA(t,e){if(t&1&&(m(0,\"div\"),yt(1,$RA,1,0,\"ng-container\",13),m(2,\"div\",14),K(3,\"Powered by Agent Development Kit\"),D()()),t&2){let A=y(2);p(),X(\"ngComponentOutlet\",A.logoComponent)}}function eNA(t,e){if(t&1&&(GA(0,\"img\",15),K(1)),t&2){let A=y(2);p(),Fe(\" \",A.i18n.agentDevelopmentKitLabel,\" \")}}function tNA(t,e){if(t&1&&(m(0,\"mat-option\",21),K(1),D()),t&2){let A=e.$implicit;X(\"value\",A),p(),qA(A)}}function iNA(t,e){t&1&&Gt(0,tNA,2,2,\"mat-option\",21,Ri),t&2&&Kt(e)}function nNA(t,e){if(t&1&&(m(0,\"mat-option\",21),K(1),D()),t&2){let A=y(3);X(\"value\",A.selectedAppControl().value),p(),qA(A.selectedAppControl().value)}}function oNA(t,e){if(t&1){let A=zA();m(0,\"div\",22)(1,\"mat-icon\",23),$(\"click\",function(){rA(A);let n=y(3);return sA(n.openAddItemDialog.emit(!0))}),K(2,\"add\"),D(),m(3,\"mat-icon\",24),$(\"click\",function(){rA(A);let n=y(3);return sA(!n.disableBuilderIcon()&&n.enterBuilderMode.emit(!0))}),K(4,\"edit\"),D()()}if(t&2){let A=y(3);p(3),En(\"cursor\",A.disableBuilderIcon()?\"not-allowed\":\"pointer\")(\"opacity\",A.disableBuilderIcon()?\"0.5\":\"1\")(\"margin-right\",32,\"px\"),X(\"matTooltip\",A.disableBuilderIcon()?\"This agent was not built by builder\":\"Edit in Builder Mode\")}}function aNA(t,e){if(t&1){let A=zA();m(0,\"div\",12)(1,\"div\",16)(2,\"mat-select\",17),$(\"selectionChange\",function(n){rA(A);let o=y(2);return sA(o.appSelectionChange.emit(n))})(\"openedChange\",function(){rA(A);let n=y(2);return sA(n.agentSearchControl.setValue(\"\"))}),m(3,\"mat-option\",18),$(\"click\",function(n){return n.stopPropagation()}),m(4,\"mat-form-field\",19),$(\"click\",function(n){return n.stopPropagation()}),m(5,\"input\",20),$(\"click\",function(n){return n.stopPropagation()})(\"keydown\",function(n){return n.stopPropagation()}),D()()(),V(6,iNA,2,0),oi(7,\"async\"),V(8,nNA,2,2,\"mat-option\",21),D()(),V(9,oNA,5,7,\"div\",22),D()}if(t&2){let A,i=y(2);p(2),X(\"placeholder\",i.isLoadingApps()()?\"Loading...\":\"Select an agent\")(\"formControl\",i.selectedAppControl()),p(),X(\"value\",null),p(2),X(\"formControl\",i.agentSearchControl),p(),W((A=li(7,7,i.filteredApps$))?6:-1,A),p(2),W(i.selectedAppControl().value&&i.isLoadingApps()()?8:-1),p(),W(i.isBuilderMode()?-1:9)}}function rNA(t,e){if(t&1){let A=zA();m(0,\"div\",6)(1,\"div\",7)(2,\"div\",8)(3,\"div\",9),V(4,ANA,4,1,\"div\")(5,eNA,2,1),D(),m(6,\"div\",10),GA(7,\"app-theme-toggle\"),m(8,\"span\",11),$(\"click\",function(){rA(A);let n=y();return sA(n.closePanel.emit())}),K(9,\"left_panel_close\"),D()()()()(),V(10,aNA,10,9,\"div\",12),oi(11,\"async\")}if(t&2){let A=y();p(4),W(A.logoComponent?4:5),p(4),X(\"matTooltip\",MI(A.i18n.collapsePanelTooltip)),p(2),W(li(11,4,A.isApplicationSelectorEnabledObs())?10:-1)}}function sNA(t,e){t&1&&(m(0,\"div\",2),GA(1,\"mat-progress-spinner\",25),D())}function gNA(t,e){if(t&1&&(m(0,\"span\",31),K(1),D()),t&2){let A=y(3);p(),qA(A.i18n.sessionsTabLabel)}}function lNA(t,e){t&1&&$i(0)}function cNA(t,e){if(t&1&&(m(0,\"mat-tab\",27),yt(1,gNA,2,1,\"ng-template\",28)(2,lNA,1,0,\"ng-container\",30),D()),t&2){y();let A=Wi(16);p(2),X(\"ngTemplateOutlet\",A)}}function CNA(t,e){if(t&1&&(m(0,\"span\",31),K(1),D()),t&2){let A=y(3);p(),qA(A.i18n.traceTabLabel)}}function INA(t,e){if(t&1&&(m(0,\"mat-tab\",27),yt(1,CNA,2,1,\"ng-template\",28),GA(2,\"app-trace-tab\",32),D()),t&2){let A=y(2);p(2),X(\"traceData\",A.traceData())}}function dNA(t,e){if(t&1&&(m(0,\"span\",31),K(1),D()),t&2){let A=y(2);p(),qA(A.i18n.stateTabLabel)}}function BNA(t,e){if(t&1&&(m(0,\"span\",31),K(1),D()),t&2){let A=y(3);p(),qA(A.i18n.artifactsTabLabel)}}function QNA(t,e){if(t&1&&(m(0,\"mat-tab\"),yt(1,BNA,2,1,\"ng-template\",28),GA(2,\"app-artifact-tab\",33),D()),t&2){let A=y(2);p(2),X(\"artifacts\",A.artifacts())}}function ENA(t,e){if(t&1&&(m(0,\"span\",31),K(1),D()),t&2){let A=y(3);p(),qA(A.i18n.sessionsTabLabel)}}function hNA(t,e){t&1&&$i(0)}function uNA(t,e){if(t&1&&(m(0,\"mat-tab\",27),yt(1,ENA,2,1,\"ng-template\",28)(2,hNA,1,0,\"ng-container\",30),D()),t&2){y();let A=Wi(16);p(2),X(\"ngTemplateOutlet\",A)}}function fNA(t,e){if(t&1&&(m(0,\"span\",31),K(1),D()),t&2){let A=y(3);p(),qA(A.i18n.evalTabLabel)}}function mNA(t,e){t&1&&(m(0,\"mat-tab\"),yt(1,fNA,2,1,\"ng-template\",28),$i(2,null,1),D())}function pNA(t,e){if(t&1){let A=zA();m(0,\"app-session-tab\",34),$(\"sessionSelected\",function(n){rA(A);let o=y(2);return sA(o.sessionSelected.emit(n))})(\"sessionReloaded\",function(n){rA(A);let o=y(2);return sA(o.sessionReloaded.emit(n))}),D()}if(t&2){let A=y(2);X(\"userId\",A.userId())(\"appName\",A.appName())(\"sessionId\",A.sessionId())}}function DNA(t,e){if(t&1){let A=zA();m(0,\"div\",3)(1,\"mat-tab-group\",26),$(\"selectedTabChange\",function(n){rA(A);let o=y();return sA(o.tabChange.emit(n))}),wr(2),oi(3,\"async\"),V(4,cNA,3,1,\"mat-tab\",27),V(5,INA,3,1,\"mat-tab\",27),oi(6,\"async\"),m(7,\"mat-tab\"),yt(8,dNA,2,1,\"ng-template\",28),GA(9,\"app-state-tab\",29),D(),V(10,QNA,3,1,\"mat-tab\"),oi(11,\"async\"),V(12,uNA,3,1,\"mat-tab\",27),V(13,mNA,4,0,\"mat-tab\"),oi(14,\"async\"),D(),yt(15,pNA,1,3,\"ng-template\",null,0,NC),D()}if(t&2){let A=y(),i=vs(2);X(\"hidden\",i);let n=li(3,7,A.isSessionsTabReorderingEnabledObs);p(4),W(n?4:-1),p(),W(li(6,9,A.isTraceEnabledObs)?5:-1),p(4),X(\"sessionState\",A.currentSessionState()),p(),W(li(11,11,A.isArtifactsTabEnabledObs)?10:-1),p(2),W(n?-1:12),p(),W(li(14,13,A.isEvalEnabledObs)?13:-1)}}function wNA(t,e){if(t&1){let A=zA();m(0,\"div\",47),$(\"click\",function(){rA(A);let n=y(3);return sA(n.openImageDialog.emit(n.rawSvgString()))}),D()}if(t&2){let A=y(3);X(\"innerHtml\",A.renderedEventGraph(),xg)}}function yNA(t,e){if(t&1&&(m(0,\"div\",41),V(1,wNA,1,1,\"div\",46),D()),t&2){let A=y(2);p(),W(A.renderedEventGraph()?1:-1)}}function vNA(t,e){t&1&&(m(0,\"div\",48),GA(1,\"mat-progress-spinner\",25),D())}function bNA(t,e){if(t&1&&(m(0,\"div\",49),K(1),D()),t&2){let A=y(3);p(),qA(A.i18n.requestIsNotAvailable)}}function MNA(t,e){if(t&1&&(m(0,\"div\",42),GA(1,\"ngx-json-viewer\",43),D()),t&2){let A=y(3);p(),X(\"json\",A.llmRequest())}}function kNA(t,e){if(t&1&&(m(0,\"mat-tab\",40),V(1,vNA,2,0,\"div\",48),oi(2,\"async\"),D0(3,bNA,2,1,\"div\",49)(4,MNA,2,1,\"div\",42),D()),t&2){let A=y(2);X(\"label\",MI(A.i18n.requestDetailsTabLabel)),p(),W(li(2,3,A.uiStateService.isEventRequestResponseLoading())===!0?1:A.llmRequest()?4:3)}}function SNA(t,e){t&1&&(m(0,\"div\",48),GA(1,\"mat-progress-spinner\",25),D())}function xNA(t,e){if(t&1&&(m(0,\"div\",49),K(1),D()),t&2){let A=y(3);p(),qA(A.i18n.responseIsNotAvailable)}}function RNA(t,e){if(t&1&&(m(0,\"div\",42),GA(1,\"ngx-json-viewer\",43),D()),t&2){let A=y(3);p(),X(\"json\",A.llmResponse())}}function NNA(t,e){if(t&1&&(m(0,\"mat-tab\",40),V(1,SNA,2,0,\"div\",48),oi(2,\"async\"),D0(3,xNA,2,1,\"div\",49)(4,RNA,2,1,\"div\",42),D()),t&2){let A=y(2);X(\"label\",MI(A.i18n.responseDetailsTabLabel)),p(),W(li(2,3,A.uiStateService.isEventRequestResponseLoading())===!0?1:A.llmResponse()?4:3)}}function FNA(t,e){if(t&1&&(m(0,\"mat-tab\",44)(1,\"div\",42),GA(2,\"ngx-json-viewer\",43),D()()),t&2){let A,i=y(2);p(2),X(\"json\",(A=i.selectedEvent())==null||A.actions==null?null:A.actions.stateDelta)}}function LNA(t,e){if(t&1&&(m(0,\"mat-tab\",45),GA(1,\"app-artifact-tab\",33),D()),t&2){let A=y(2);p(),X(\"artifacts\",A.artifactDeltaArray())}}function _NA(t,e){if(t&1){let A=zA();m(0,\"div\",4)(1,\"div\",35)(2,\"div\",36)(3,\"mat-paginator\",37),$(\"page\",function(n){rA(A);let o=y();return sA(o.page.emit(n))}),D(),m(4,\"button\",38)(5,\"mat-icon\",39),$(\"click\",function(){rA(A);let n=y();return sA(n.closeSelectedEvent.emit())}),K(6,\"close\"),D()()()(),m(7,\"div\")(8,\"mat-tab-group\")(9,\"mat-tab\",40),V(10,yNA,2,1,\"div\",41),m(11,\"div\",42),GA(12,\"ngx-json-viewer\",43),D()(),V(13,kNA,5,5,\"mat-tab\",40),oi(14,\"async\"),V(15,NNA,5,5,\"mat-tab\",40),oi(16,\"async\"),V(17,FNA,3,1,\"mat-tab\",44),V(18,LNA,2,1,\"mat-tab\",45),D()()()}if(t&2){let A,i,n,o=y(),a=vs(2);X(\"hidden\",a),p(3),X(\"length\",o.eventData().size)(\"pageSize\",1)(\"pageIndex\",o.selectedEventIndex()),ie(\"aria-label\",o.i18n.selectEventAriaLabel),p(6),X(\"label\",MI(o.i18n.eventDetailsTabLabel)),p(),W(((A=o.selectedEvent())==null?null:A.author)!==\"user\"?10:-1),p(2),X(\"json\",o.selectedEvent()),p(),W(li(14,13,o.uiStateService.isEventRequestResponseLoading())===!0||o.llmRequest()&&o.Object.keys(o.llmRequest()).length>0?13:-1),p(2),W(li(16,15,o.uiStateService.isEventRequestResponseLoading())===!0||o.llmResponse()&&o.Object.keys(o.llmResponse()).length>0?15:-1),p(2),W(!((i=o.selectedEvent())==null||i.actions==null)&&i.actions.stateDelta&&o.Object.keys((i=o.selectedEvent())==null||i.actions==null?null:i.actions.stateDelta).length>0?17:-1),p(),W(!((n=o.selectedEvent())==null||n.actions==null)&&n.actions.artifactDelta&&o.Object.keys((n=o.selectedEvent())==null||n.actions==null?null:n.actions.artifactDelta).length>0?18:-1)}}var KE=class t{Object=Object;appName=nt(\"\");userId=nt(\"\");sessionId=nt(\"\");traceData=nt([]);eventData=nt(new Map);currentSessionState=nt();artifacts=nt([]);selectedEvent=nt();selectedEventIndex=nt();renderedEventGraph=nt();rawSvgString=nt(null);llmRequest=nt();llmResponse=nt();showSidePanel=nt(!1);isApplicationSelectorEnabledObs=nt(oe(!1));apps$=nt(oe([]));isLoadingApps=nt(jA(!1));selectedAppControl=nt(new ss(\"\",{nonNullable:!0}));isBuilderMode=nt(!1);disableBuilderIcon=nt(!1);closePanel=No();appSelectionChange=No();tabChange=No();sessionSelected=No();sessionReloaded=No();evalCaseSelected=No();evalSetIdSelected=No();returnToSession=No();evalNotInstalled=No();page=No();closeSelectedEvent=No();openImageDialog=No();openAddItemDialog=No();enterBuilderMode=No();sessionTabComponent=Xo(GE);evalTabComponent=Xo(Qc);evalTabContainer=Xo(\"evalTabContainer\",{read:Ro});logoComponent=h(wy,{optional:!0});i18n=h(JtA);featureFlagService=h(lr);evalTabComponentClass=h(py,{optional:!0});environmentInjector=h(pr);uiStateService=h(Tg);isAlwaysOnSidePanelEnabledObs=this.featureFlagService.isAlwaysOnSidePanelEnabled();isTraceEnabledObs=this.featureFlagService.isTraceEnabled();isArtifactsTabEnabledObs=this.featureFlagService.isArtifactsTabEnabled();isEvalEnabledObs=this.featureFlagService.isEvalEnabled();isTokenStreamingEnabledObs=this.featureFlagService.isTokenStreamingEnabled();isMessageFileUploadEnabledObs=this.featureFlagService.isMessageFileUploadEnabled();isManualStateUpdateEnabledObs=this.featureFlagService.isManualStateUpdateEnabled();isBidiStreamingEnabledObs=this.featureFlagService.isBidiStreamingEnabled;isSessionsTabReorderingEnabledObs=this.featureFlagService.isSessionsTabReorderingEnabled();agentSearchControl=new ss(\"\",{nonNullable:!0});filteredApps$=Tn(this.apps$).pipe(Ei(e=>Va([e,this.agentSearchControl.valueChanges.pipe(nn(\"\"))])),fe(([e,A])=>{if(!e||!A||A.trim()===\"\")return e;let i=A.toLowerCase().trim();return e.filter(n=>n.toLowerCase().startsWith(i))}));artifactDeltaArray=_e(()=>{let e=this.selectedEvent()?.actions?.artifactDelta;if(!e||Object.keys(e).length===0)return[];let A=[];for(let[i,n]of Object.entries(e)){let o=n;A.push({id:i,versionId:1,data:o.data||\"\",mimeType:o.mimeType||\"\",mediaType:M4(o.mimeType||\"\")})}return A});ngAfterViewInit(){setTimeout(()=>{this.initEvalTab()},500)}initEvalTab(){this.isEvalEnabledObs.pipe(po()).subscribe(e=>{if(e){let A=this.evalTabContainer()?.createComponent(this.evalTabComponentClass??Qc,{environmentInjector:this.environmentInjector});if(!A)return;Ya(this.environmentInjector,()=>{pa(()=>{A.setInput(\"appName\",this.appName()),A.setInput(\"userId\",this.userId()),A.setInput(\"sessionId\",this.sessionId())})}),A.instance.sessionSelected.subscribe(i=>{this.sessionSelected.emit(i)}),A.instance.evalCaseSelected.subscribe(i=>{this.evalCaseSelected.emit(i)}),A.instance.evalSetIdSelected.subscribe(i=>{this.evalSetIdSelected.emit(i)}),A.instance.shouldReturnToSession.subscribe(i=>{this.returnToSession.emit(i)}),A.instance.evalNotInstalledMsg.subscribe(i=>{this.evalNotInstalled.emit(i)})}})}static \\u0275fac=function(A){return new(A||t)};static \\u0275cmp=kA({type:t,selectors:[[\"app-side-panel\"]],viewQuery:function(A,i){A&1&&Or(i.sessionTabComponent,GE,5)(i.evalTabComponent,Qc,5)(i.evalTabContainer,XRA,5,Ro),A&2&&rr(3)},inputs:{appName:[1,\"appName\"],userId:[1,\"userId\"],sessionId:[1,\"sessionId\"],traceData:[1,\"traceData\"],eventData:[1,\"eventData\"],currentSessionState:[1,\"currentSessionState\"],artifacts:[1,\"artifacts\"],selectedEvent:[1,\"selectedEvent\"],selectedEventIndex:[1,\"selectedEventIndex\"],renderedEventGraph:[1,\"renderedEventGraph\"],rawSvgString:[1,\"rawSvgString\"],llmRequest:[1,\"llmRequest\"],llmResponse:[1,\"llmResponse\"],showSidePanel:[1,\"showSidePanel\"],isApplicationSelectorEnabledObs:[1,\"isApplicationSelectorEnabledObs\"],apps$:[1,\"apps$\"],isLoadingApps:[1,\"isLoadingApps\"],selectedAppControl:[1,\"selectedAppControl\"],isBuilderMode:[1,\"isBuilderMode\"],disableBuilderIcon:[1,\"disableBuilderIcon\"]},outputs:{closePanel:\"closePanel\",appSelectionChange:\"appSelectionChange\",tabChange:\"tabChange\",sessionSelected:\"sessionSelected\",sessionReloaded:\"sessionReloaded\",evalCaseSelected:\"evalCaseSelected\",evalSetIdSelected:\"evalSetIdSelected\",returnToSession:\"returnToSession\",evalNotInstalled:\"evalNotInstalled\",page:\"page\",closeSelectedEvent:\"closeSelectedEvent\",openImageDialog:\"openImageDialog\",openAddItemDialog:\"openAddItemDialog\",enterBuilderMode:\"enterBuilderMode\"},decls:8,vars:9,consts:[[\"sessionsTabBody\",\"\"],[\"evalTabContainer\",\"\"],[1,\"loading-spinner-container\"],[1,\"tabs-container\",3,\"hidden\"],[1,\"details-panel-container\",3,\"hidden\"],[1,\"resize-handler\"],[2,\"margin-top\",\"20px\",\"margin-left\",\"20px\",\"display\",\"flex\"],[2,\"width\",\"100%\"],[1,\"drawer-header\"],[1,\"drawer-logo\"],[2,\"display\",\"flex\",\"align-items\",\"center\",\"gap\",\"8px\"],[1,\"material-symbols-outlined\",2,\"color\",\"#c4c7c5\",\"cursor\",\"pointer\",\"margin-right\",\"15px\",3,\"click\",\"matTooltip\"],[1,\"app-actions\"],[4,\"ngComponentOutlet\"],[1,\"powered-by-adk\"],[\"src\",\"assets/ADK-512-color.svg\",\"width\",\"32px\",\"height\",\"32px\"],[1,\"app-select-container\"],[\"panelClass\",\"wide-agent-dropdown-panel\",1,\"app-select\",3,\"selectionChange\",\"openedChange\",\"placeholder\",\"formControl\"],[1,\"search-option\",3,\"click\",\"value\"],[\"subscriptSizing\",\"dynamic\",1,\"agent-search-field\",3,\"click\"],[\"matInput\",\"\",\"placeholder\",\"Search agents...\",3,\"click\",\"keydown\",\"formControl\"],[1,\"app-name-option\",3,\"value\"],[1,\"mode-toggle-container\"],[\"matTooltip\",\"Create new agent\",\"matTooltipPosition\",\"below\",2,\"cursor\",\"pointer\",\"margin-right\",\"16px\",3,\"click\"],[3,\"click\",\"matTooltip\"],[\"mode\",\"indeterminate\",\"diameter\",\"50\"],[3,\"selectedTabChange\"],[1,\"tabs-header\"],[\"mat-tab-label\",\"\"],[3,\"sessionState\"],[4,\"ngTemplateOutlet\"],[1,\"tab-label\"],[3,\"traceData\"],[3,\"artifacts\"],[3,\"sessionSelected\",\"sessionReloaded\",\"userId\",\"appName\",\"sessionId\"],[1,\"details-content\"],[2,\"display\",\"flex\",\"justify-content\",\"flex-end\",\"margin-top\",\"10px\"],[1,\"event-paginator\",3,\"page\",\"length\",\"pageSize\",\"pageIndex\"],[\"mat-mini-fab\",\"\"],[3,\"click\"],[3,\"label\"],[1,\"event-graph-container\"],[1,\"json-viewer-container\"],[3,\"json\"],[\"label\",\"State\"],[\"label\",\"Artifact\"],[3,\"innerHtml\"],[3,\"click\",\"innerHtml\"],[1,\"request-response-loading-spinner-container\"],[1,\"request-response-empty-state\"]],template:function(A,i){if(A&1&&(V(0,rNA,12,6),oi(1,\"async\"),wr(2),oi(3,\"async\"),V(4,sNA,2,0,\"div\",2),V(5,DNA,17,15,\"div\",3),V(6,_NA,19,17,\"div\",4),GA(7,\"div\",5)),A&2){W(li(1,4,i.isAlwaysOnSidePanelEnabledObs)===!1?0:-1),p(2);let n=sg(li(3,6,i.uiStateService.isSessionLoading()));p(2),W(n?4:-1),p(),W(i.appName()!=\"\"&&i.showSidePanel()?5:-1),p(),W(i.selectedEvent()&&i.showSidePanel()?6:-1)}},dependencies:[yn,ro,so,FC,Ng,Ba,Dy,ef,wF,mE,by,yy,f6,GE,DJ,em,In,Gc,XC,Mr,Yg,bc,SI,uI,To,wa,Pr],styles:[\".drawer-header[_ngcontent-%COMP%]{width:100%;display:flex;justify-content:space-between;align-items:center;--mat-button-filled-container-color: var(--side-panel-button-filled-container-color);--mat-button-filled-label-text-color: var(--side-panel-button-filled-label-text-color)}.drawer-header[_ngcontent-%COMP%]   .mat-icon[_ngcontent-%COMP%]{width:36px;height:36px;color:var(--side-panel-mat-icon-color);cursor:pointer;display:flex;align-items:center;justify-content:center}.tabs-container[_ngcontent-%COMP%]{width:100%;margin-top:20px}.tab-label[_ngcontent-%COMP%]{font-size:14px}.resize-handler[_ngcontent-%COMP%]{background:var(--side-panel-resize-handler-background-color);width:4px;border-radius:4px;position:absolute;display:block;height:20%;top:40%;right:0;z-index:9999;cursor:ew-resize}.json-viewer-container[_ngcontent-%COMP%]{margin:10px}.event-paginator[_ngcontent-%COMP%]{margin-top:-8px;margin-right:auto;background-color:inherit;display:flex;justify-content:center}[_nghost-%COMP%]     .mat-mdc-paginator-page-size{display:none}.details-panel-container[_ngcontent-%COMP%]{position:absolute;width:100%;height:98%;left:0;right:0;bottom:0;background:var(--side-panel-details-panel-container-background-color);display:inline-block;justify-content:center;align-items:center;z-index:10}.details-content[_ngcontent-%COMP%]{color:var(--side-panel-details-content-color);font-size:14px}.event-graph-container[_ngcontent-%COMP%]{margin-top:16px;margin-bottom:16px;display:flex;justify-content:center;max-height:33%;cursor:pointer}.event-graph-container[_ngcontent-%COMP%]     svg{width:100%;height:100%;display:block;object-fit:contain}.event-graph-container[_ngcontent-%COMP%]     svg text{font-family:Google Sans Mono,monospace;font-size:11px}.drawer-logo[_ngcontent-%COMP%]{margin-left:9px;display:flex;align-items:center}.drawer-logo[_ngcontent-%COMP%]   img[_ngcontent-%COMP%]{margin-right:9px}.drawer-logo[_ngcontent-%COMP%]{font-size:16px;font-style:normal;font-weight:500;line-height:24px;letter-spacing:.1px}.powered-by-adk[_ngcontent-%COMP%]{font-size:10px;color:var(--side-panel-powered-by-adk-color);text-align:right;margin-top:-5px}.app-select[_ngcontent-%COMP%]{width:100%}.app-select-container[_ngcontent-%COMP%]{width:60%;margin-top:12px;background-color:var(--side-panel-app-select-container-background-color);margin-left:10px;height:30px;display:flex;justify-content:space-between;padding-left:20px;padding-right:20px;border-radius:10px;padding-top:5px}.app-select-container[_ngcontent-%COMP%]{--mat-select-placeholder-text-color: var(--side-panel-select-placeholder-text-color);--mat-select-enabled-trigger-text-color: var(--side-panel-select-enabled-trigger-text-color);--mat-select-enabled-arrow-color: var(--side-panel-select-enabled-arrow-color)}.app-name-option[_ngcontent-%COMP%]{color:var(--side-panel-app-name-option-color);font-family:Google Sans Mono,monospace;font-style:normal;font-weight:400;padding-left:12px;padding-right:12px}.app-select[_ngcontent-%COMP%]{color:var(--side-panel-app-name-option-color);font-family:Google Sans Mono,monospace;font-style:normal;font-weight:400;padding-left:unset}.mode-toggle-container[_ngcontent-%COMP%]{display:flex;align-items:center;margin-right:20px}.build-mode-button[_ngcontent-%COMP%]{margin:0 4px}.build-mode-button.mat-mdc-unelevated-button[_ngcontent-%COMP%]{height:30px}.app-actions[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:space-between;margin-top:12px;margin-left:10px}.loading-spinner-container[_ngcontent-%COMP%]{display:flex;justify-content:center;align-items:center;height:100%}.request-response-loading-spinner-container[_ngcontent-%COMP%]{display:flex;justify-content:center;align-items:center;margin-top:2em}.request-response-empty-state[_ngcontent-%COMP%]{display:flex;justify-content:center;align-items:center;margin-top:2em;font-style:italic}[_nghost-%COMP%]     .mat-mdc-tooltip .mdc-tooltip__surface{max-width:250px;white-space:wrap;font-size:11px}[_nghost-%COMP%]     .wide-agent-dropdown-panel{min-width:300px;max-width:600px;max-height:400px}[_nghost-%COMP%]     .wide-agent-dropdown-panel .mat-mdc-option{white-space:normal;line-height:1.4;height:auto;min-height:48px;padding:8px 16px}[_nghost-%COMP%]     .wide-agent-dropdown-panel .search-option{position:sticky!important;top:0!important;z-index:1000!important;background-color:var(--mat-select-panel-background-color, white)!important;padding:8px 16px!important;border-bottom:1px solid var(--mat-divider-color, rgba(0, 0, 0, .12));min-height:auto!important;height:auto!important;box-shadow:0 2px 4px #0000001a;opacity:1!important}[_nghost-%COMP%]     .wide-agent-dropdown-panel .search-option:hover{background-color:var(--mat-select-panel-background-color, white)!important}[_nghost-%COMP%]     .wide-agent-dropdown-panel .search-option.mat-mdc-option.mat-mdc-option-active{background-color:var(--mat-select-panel-background-color, white)!important}.agent-search-field[_ngcontent-%COMP%]{width:100%}.agent-search-field[_ngcontent-%COMP%]   .mat-mdc-form-field-subscript-wrapper[_ngcontent-%COMP%]{display:none}\"]})};function GNA(t,e){t&1&&GA(0,\"mat-progress-spinner\",6)}function KNA(t,e){t&1&&(m(0,\"div\"),K(1,\"Request is not available.\"),D())}function UNA(t,e){if(t&1&&(m(0,\"div\",3),GA(1,\"ngx-json-viewer\",4),D()),t&2){let A=y();p(),X(\"json\",A.llmRequest)}}function JNA(t,e){t&1&&GA(0,\"mat-progress-spinner\",6)}function YNA(t,e){t&1&&(m(0,\"div\"),K(1,\"Response is not available.\"),D())}function HNA(t,e){if(t&1&&(m(0,\"div\",3),GA(1,\"ngx-json-viewer\",4),D()),t&2){let A=y();p(),X(\"json\",A.llmResponse)}}function TNA(t,e){if(t&1){let A=zA();m(0,\"div\",12),$(\"click\",function(){rA(A);let n=y();return sA(n.openViewImageDialog(n.rawSvgString))}),D()}if(t&2){let A=y();X(\"innerHtml\",A.renderedEventGraph,xg)}}var My=class t{userId=\"\";sessionId=\"\";appName=\"\";panelClosed=new WA;renderedEventGraph;eventData;selectedRow=void 0;rawSvgString=null;llmRequest=void 0;llmResponse=void 0;llmRequestKey=\"gcp.vertex.agent.llm_request\";llmResponseKey=\"gcp.vertex.agent.llm_response\";dialog=h(Qs);traceService=h($C);eventService=h(lB);graphService=h(cB);featureFlagService=h(lr);sanitizer=h(Wr);uiStateService=h(Tg);isEventFilteringEnabled=Is(this.featureFlagService.isEventFilteringEnabled());constructor(){}ngOnInit(){this.traceService.selectedTraceRow$.subscribe(e=>{this.selectedRow=e;let A=this.getEventIdFromSpan();if(A){let i;this.isEventFilteringEnabled()&&this.selectedRow?.invoc_id&&this.selectedRow?.start_time&&(i={invocationId:this.selectedRow.invoc_id,timestamp:this.selectedRow.start_time/1e6});let n=BA({id:A},i);this.eventService.getEventTrace(n).pipe(Wt(()=>{this.uiStateService.setIsEventRequestResponseLoading(!0)})).subscribe(o=>{this.llmRequest=JSON.parse(o[this.llmRequestKey]),this.llmResponse=JSON.parse(o[this.llmResponseKey]),this.uiStateService.setIsEventRequestResponseLoading(!1)},()=>{this.uiStateService.setIsEventRequestResponseLoading(!1)}),this.getEventGraph(A)}}),this.traceService.eventData$.subscribe(e=>this.eventData=e)}openViewImageDialog(e){let A=this.dialog.open(a2,{maxWidth:\"90vw\",maxHeight:\"90vh\",data:{imageData:e}})}getEventDetails(){if(this.eventData&&this.selectedRow)return this.eventData.get(this.getEventIdFromSpan())}getEventIdFromSpan(){if(this.selectedRow)return this.selectedRow.attributes[\"gcp.vertex.agent.event_id\"]}getEventGraph(e){this.eventService.getEvent(this.userId,this.appName,this.sessionId,e).subscribe(A=>ct(this,null,function*(){if(!A.dotSrc){this.renderedEventGraph=void 0;return}let i=A.dotSrc,n=yield this.graphService.render(i);this.rawSvgString=n,this.renderedEventGraph=this.sanitizer.bypassSecurityTrustHtml(n)}))}closePanel(){this.panelClosed.emit(!0)}static \\u0275fac=function(A){return new(A||t)};static \\u0275cmp=kA({type:t,selectors:[[\"app-trace-event\"]],inputs:{userId:\"userId\",sessionId:\"sessionId\",appName:\"appName\"},outputs:{panelClosed:\"panelClosed\"},decls:21,vars:8,consts:[[1,\"wrapper\"],[\"mat-stretch-tabs\",\"false\",\"mat-align-tabs\",\"start\"],[\"label\",\"Event\"],[1,\"json-viewer-container\"],[3,\"json\"],[\"label\",\"Request\"],[\"mode\",\"indeterminate\"],[\"label\",\"Response\"],[\"label\",\"Graph\"],[1,\"event-graph-container\"],[3,\"innerHtml\"],[\"mat-icon-button\",\"\",1,\"tab-header-action\",3,\"click\"],[3,\"click\",\"innerHtml\"]],template:function(A,i){A&1&&(m(0,\"div\",0)(1,\"mat-tab-group\",1)(2,\"mat-tab\",2)(3,\"div\",3),GA(4,\"ngx-json-viewer\",4),D()(),m(5,\"mat-tab\",5),V(6,GNA,1,0,\"mat-progress-spinner\",6),oi(7,\"async\"),D0(8,KNA,2,0,\"div\")(9,UNA,2,1,\"div\",3),D(),m(10,\"mat-tab\",7),V(11,JNA,1,0,\"mat-progress-spinner\",6),oi(12,\"async\"),D0(13,YNA,2,0,\"div\")(14,HNA,2,1,\"div\",3),D(),m(15,\"mat-tab\",8)(16,\"div\",9),V(17,TNA,1,1,\"div\",10),D()()(),m(18,\"button\",11),$(\"click\",function(){return i.closePanel()}),m(19,\"mat-icon\"),K(20,\"close\"),D()()()),A&2&&(p(4),X(\"json\",i.getEventDetails()),p(2),W(li(7,4,i.uiStateService.isEventRequestResponseLoading())===!0?6:i.llmRequest?9:8),p(5),W(li(12,6,i.uiStateService.isEventRequestResponseLoading())===!0?11:i.llmResponse?14:13),p(6),W(i.renderedEventGraph?17:-1))},dependencies:[Dy,ef,Gc,XC,Ia,In,uI,Pr],styles:[\".json-viewer-container[_ngcontent-%COMP%]{padding-top:8px;padding-left:12px;padding-right:12px;background-color:var(--trace-event-json-viewer-container-background-color)}.event-graph-container[_ngcontent-%COMP%]{text-align:center;padding-top:20px}.event-graph-container[_ngcontent-%COMP%]     svg text{font-family:Google Sans Mono,monospace;font-size:11px}.wrapper[_ngcontent-%COMP%]{position:relative}.tab-header-action[_ngcontent-%COMP%]{position:absolute;top:0;right:0;height:48px;z-index:2;margin-right:10px}\"]})};var ONA={openPanelTooltip:\"Open panel\",evalCaseIdLabel:\"Eval Case ID\",cancelButton:\"Cancel\",saveButton:\"Save\",editEvalCaseTooltip:\"Edit current eval case\",deleteEvalCaseTooltip:\"Delete current eval case\",sessionIdLabel:\"Session ID\",userIdLabel:\"User ID\",loadingSessionLabel:\"Loading session...\",tokenStreamingLabel:\"Token Streaming\",createNewSessionTooltip:\"Create a new Session\",newSessionButton:\"New Session\",deleteSessionTooltip:\"Delete current session\",exportSessionTooltip:\"Export current session\",importSessionTooltip:\"Import session\",loadingAgentsLabel:\"Loading agents, please wait...\",welcomeMessage:\"Welcome to ADK!\",selectAgentMessage:\"Select an agent on the left to begin with.\",failedToLoadAgentsMessage:\"Failed to load agents. To get started, run\",errorMessageLabel:\"Error message:\",noAgentsFoundWarning:\"Warning: No agents found in current folder.\",cannotEditSessionMessage:\"Chat is disabled to prevent changes to the end user's session.\",readOnlyBadgeLabel:\"Read-only\",disclosureTooltip:\"ADK Web is for development purposes. It has access to all the data and should not be used in production.\",adkWebDeveloperUiMessage:\"ADK Web Developer UI\"},YtA=new wA(\"Chat Messages\",{factory:()=>ONA});var zNA=[\"sideDrawer\"],PNA=[\"bottomPanel\"],jNA=[[[\"\",\"adk-web-chat-container-top\",\"\"]]],qNA=[\"[adk-web-chat-container-top]\"],VNA=t=>({\"edit-mode\":t}),WNA=()=>[];function ZNA(t,e){if(t&1){let A=zA();m(0,\"span\",8),$(\"click\",function(){rA(A);let n=y();return sA(n.toggleSidePanel())}),K(1,\"left_panel_open\"),D()}if(t&2){let A=y();X(\"matTooltip\",A.i18n.openPanelTooltip)}}function XNA(t,e){if(t&1){let A=zA();m(0,\"app-side-panel\",9),$(\"closePanel\",function(){rA(A);let n=y();return sA(n.toggleSidePanel())})(\"tabChange\",function(n){rA(A);let o=y();return sA(o.handleTabChange(n))})(\"sessionSelected\",function(n){rA(A);let o=y();return sA(o.updateWithSelectedSession(n))})(\"sessionReloaded\",function(n){rA(A);let o=y();return sA(o.updateWithSelectedSession(n))})(\"evalCaseSelected\",function(n){rA(A);let o=y();return sA(o.updateWithSelectedEvalCase(n))})(\"evalSetIdSelected\",function(n){rA(A);let o=y();return sA(o.updateSelectedEvalSetId(n))})(\"returnToSession\",function(n){rA(A);let o=y();return sA(o.handleReturnToSession(n))})(\"evalNotInstalled\",function(n){rA(A);let o=y();return sA(o.handleEvalNotInstalled(n))})(\"page\",function(n){rA(A);let o=y();return sA(o.handlePageEvent(n))})(\"closeSelectedEvent\",function(){rA(A);let n=y();return sA(n.closeSelectedEvent())})(\"openImageDialog\",function(n){rA(A);let o=y();return sA(o.openViewImageDialog(n))})(\"appSelectionChange\",function(n){rA(A);let o=y();return sA(o.onAppSelection(n))})(\"openAddItemDialog\",function(){rA(A);let n=y();return sA(n.openAddItemDialog())})(\"enterBuilderMode\",function(){rA(A);let n=y();return sA(n.enterBuilderMode())}),D()}if(t&2){let A=y();X(\"isApplicationSelectorEnabledObs\",A.isApplicationSelectorEnabledObs)(\"apps$\",A.apps$)(\"isLoadingApps\",A.isLoadingApps)(\"selectedAppControl\",A.selectedAppControl)(\"showSidePanel\",A.showSidePanel)(\"appName\",A.appName)(\"userId\",A.userId)(\"sessionId\",A.sessionId)(\"traceData\",A.traceData)(\"eventData\",A.eventData)(\"currentSessionState\",A.currentSessionState)(\"artifacts\",A.artifacts)(\"selectedEvent\",A.selectedEvent)(\"selectedEventIndex\",A.selectedEventIndex)(\"renderedEventGraph\",A.renderedEventGraph)(\"rawSvgString\",A.rawSvgString)(\"llmRequest\",A.llmRequest)(\"llmResponse\",A.llmResponse)(\"disableBuilderIcon\",A.disableBuilderSwitch)}}function $NA(t,e){if(t&1){let A=zA();m(0,\"app-builder-tabs\",10),$(\"exitBuilderMode\",function(){rA(A);let n=y();return sA(n.exitBuilderMode())})(\"closePanel\",function(){rA(A);let n=y();return sA(n.toggleSidePanel())}),D(),GA(1,\"div\",11)}if(t&2){let A=y();X(\"appNameInput\",A.appName)}}function AFA(t,e){if(t&1){let A=zA();m(0,\"div\",6)(1,\"div\",12)(2,\"button\",13),$(\"click\",function(){rA(A);let n=y();return sA(n.saveAgentBuilder())}),m(3,\"mat-icon\"),K(4,\"check\"),D()(),m(5,\"button\",14),$(\"click\",function(){rA(A);let n=y();return sA(n.exitBuilderMode())}),m(6,\"mat-icon\"),K(7,\"close\"),D()(),m(8,\"button\",15),$(\"click\",function(){rA(A);let n=y();return sA(n.toggleBuilderAssistant())}),m(9,\"mat-icon\"),K(10,\"assistant\"),D()()(),m(11,\"app-canvas\",16),$(\"toggleSidePanelRequest\",function(){rA(A);let n=y();return sA(n.toggleSidePanel())})(\"builderAssistantCloseRequest\",function(){rA(A);let n=y();return sA(n.toggleBuilderAssistant())}),D()()}if(t&2){let A=y();p(8),ae(\"active\",A.showBuilderAssistant),p(3),X(\"showSidePanel\",A.showSidePanel)(\"showBuilderAssistant\",A.showBuilderAssistant)(\"appNameInput\",A.appName)}}function eFA(t,e){if(t&1){let A=zA();m(0,\"span\",23),$(\"click\",function(){rA(A);let n=y(3);return sA(n.toggleSidePanel())}),K(1,\"left_panel_open\"),D()}if(t&2){let A=y(3);X(\"matTooltip\",A.i18n.openPanelTooltip)}}function tFA(t,e){if(t&1){let A=zA();m(0,\"button\",28),$(\"click\",function(){rA(A);let n=y(4);return sA(n.cancelEditEvalCase())}),K(1),D(),m(2,\"button\",29),$(\"click\",function(){rA(A);let n=y(4);return sA(n.saveEvalCase())}),K(3),D()}if(t&2){let A=y(4);p(),Fe(\" \",A.i18n.cancelButton,\" \"),p(),X(\"disabled\",!A.hasEvalCaseChanged()||A.isEvalCaseEditing()),p(),Fe(\" \",A.i18n.saveButton,\" \")}}function iFA(t,e){if(t&1){let A=zA();m(0,\"span\",30),$(\"click\",function(){rA(A);let n=y(4);return sA(n.editEvalCase())}),K(1,\" edit \"),D(),m(2,\"span\",30),$(\"click\",function(){rA(A);let n=y(4);return sA(n.deleteEvalCase())}),K(3,\" delete \"),D()}if(t&2){let A=y(4);X(\"matTooltip\",A.i18n.editEvalCaseTooltip),p(2),X(\"matTooltip\",A.i18n.deleteEvalCaseTooltip)}}function nFA(t,e){if(t&1&&(m(0,\"div\",24)(1,\"div\",25),K(2),D(),m(3,\"div\",26),K(4),D()(),m(5,\"div\",27),V(6,tFA,4,3)(7,iFA,4,2),D()),t&2){let A=y(3);p(2),qA(A.i18n.evalCaseIdLabel),p(2),qA(A.evalCase.evalId),p(2),W(A.isEvalEditMode()?6:7)}}function oFA(t,e){if(t&1&&(m(0,\"div\",32),K(1),D(),m(2,\"div\",26),K(3),D()),t&2){let A=y(5);p(),qA(A.i18n.userIdLabel),p(2),qA(A.userId)}}function aFA(t,e){if(t&1&&(m(0,\"div\",33)(1,\"mat-icon\"),K(2,\"visibility\"),D(),K(3),D(),m(4,\"div\",34),K(5),D()),t&2){let A=y(5);p(3),Fe(\" \",A.i18n.readOnlyBadgeLabel,\" \"),p(2),qA(A.i18n.cannotEditSessionMessage)}}function rFA(t,e){if(t&1&&(m(0,\"div\",25),K(1),D(),m(2,\"div\",26),K(3),D(),V(4,oFA,4,2),oi(5,\"async\"),V(6,aFA,6,2)),t&2){let A=y(4);p(),qA(A.i18n.sessionIdLabel),p(2),qA(A.sessionId),p(),W(li(5,4,A.isUserIdOnToolbarEnabledObs)?4:-1),p(2),W(A.canEditSession()?-1:6)}}function sFA(t,e){if(t&1&&(m(0,\"div\",25),K(1),D()),t&2){let A=y(4);p(),qA(A.i18n.loadingSessionLabel)}}function gFA(t,e){if(t&1){let A=zA();m(0,\"span\",42),$(\"click\",function(){rA(A);let n=y(5);return sA(n.deleteSession(n.sessionId))}),K(1,\" delete \"),D()}if(t&2){let A=y(5);X(\"matTooltip\",A.i18n.deleteSessionTooltip)}}function lFA(t,e){if(t&1){let A=zA();m(0,\"span\",43),$(\"click\",function(){rA(A);let n=y(5);return sA(n.exportSession())}),K(1,\" download \"),D()}if(t&2){let A=y(5);X(\"matTooltip\",A.i18n.exportSessionTooltip)}}function cFA(t,e){if(t&1){let A=zA();m(0,\"span\",44),$(\"click\",function(){rA(A);let n=y(5);return sA(n.importSession())}),K(1,\" upload \"),D()}if(t&2){let A=y(5);X(\"matTooltip\",A.i18n.importSessionTooltip)}}function CFA(t,e){if(t&1){let A=zA();m(0,\"div\",27)(1,\"div\",35)(2,\"mat-slide-toggle\",36),oi(3,\"async\"),$(\"change\",function(){rA(A);let n=y(4);return sA(n.toggleSse())}),K(4),D()(),GA(5,\"mat-divider\",37),m(6,\"div\",31)(7,\"div\",38),$(\"click\",function(){rA(A);let n=y(4);return sA(n.onNewSessionClick())}),m(8,\"mat-icon\"),K(9,\"add\"),D(),K(10),D(),V(11,gFA,2,1,\"span\",39),oi(12,\"async\"),V(13,lFA,2,1,\"span\",40),oi(14,\"async\"),V(15,cFA,2,1,\"span\",41),oi(16,\"async\"),D()()}if(t&2){let A=y(4);p(2),X(\"checked\",A.enableSseIndicator())(\"disabled\",!li(3,9,A.isTokenStreamingEnabledObs)),p(2),Fe(\" \",A.i18n.tokenStreamingLabel,\" \"),p(),X(\"vertical\",!0),p(2),X(\"matTooltip\",A.i18n.createNewSessionTooltip),p(3),Fe(\" \",A.i18n.newSessionButton,\" \"),p(),W(li(12,11,A.isDeleteSessionEnabledObs)?11:-1),p(2),W(li(14,13,A.isExportSessionEnabledObs)?13:-1),p(2),W(li(16,15,A.importSessionEnabledObs)?15:-1)}}function IFA(t,e){if(t&1&&(m(0,\"div\",31),wr(1),oi(2,\"async\"),V(3,rFA,7,6)(4,sFA,2,1,\"div\",25),D(),V(5,CFA,17,17,\"div\",27)),t&2){let A=li(2,2,y(3).uiStateService.isSessionLoading());p(3),W(A===!1?3:4),p(2),W(A===!1?5:-1)}}function dFA(t,e){if(t&1&&(m(0,\"div\",17),V(1,eFA,2,1,\"span\",22),V(2,nFA,8,3)(3,IFA,6,4),D()),t&2){let A=y(2);X(\"ngClass\",zr(3,VNA,A.isEvalEditMode())),p(),W(A.showSidePanel?-1:1),p(),W(A.evalCase?2:3)}}function BFA(t,e){if(t&1&&(m(0,\"div\",45)(1,\"span\"),K(2),D()()),t&2){let A=y(3);p(2),qA(A.i18n.loadingAgentsLabel)}}function QFA(t,e){if(t&1&&(m(0,\"span\"),K(1),GA(2,\"br\"),K(3),D()),t&2){let A=y(4);p(),qA(A.i18n.welcomeMessage),p(2),Fe(\" \",A.i18n.selectAgentMessage)}}function EFA(t,e){if(t&1&&(K(0),GA(1,\"br\"),m(2,\"pre\",47),K(3),D()),t&2){let A=y(5);Fe(\" \",A.i18n.errorMessageLabel,\" \"),p(3),qA(A.loadingError())}}function hFA(t,e){if(t&1&&(m(0,\"pre\",46),K(1),D()),t&2){let A=y(5);p(),qA(A.i18n.noAgentsFoundWarning)}}function uFA(t,e){if(t&1&&(m(0,\"div\"),K(1),m(2,\"pre\"),K(3,\"adk web\"),D(),K(4,\" in the folder that contains the agents.\"),GA(5,\"br\"),V(6,EFA,4,2)(7,hFA,2,1,\"pre\",46),D()),t&2){let A=y(4);p(),Fe(\" \",A.i18n.failedToLoadAgentsMessage,\" \"),p(5),W(A.loadingError()?6:7)}}function fFA(t,e){if(t&1&&(m(0,\"div\",45),V(1,QFA,4,2,\"span\"),oi(2,\"async\"),D0(3,uFA,8,2,\"div\"),D()),t&2){let A=y(3);p(),W((li(2,1,A.apps$)||WE(3,WNA)).length>0?1:3)}}function mFA(t,e){if(t&1&&(V(0,BFA,3,1,\"div\",45),oi(1,\"async\"),D0(2,fFA,4,4,\"div\",45)),t&2){let A=y(2);W(A.isLoadingApps()?0:li(1,1,A.isApplicationSelectorEnabledObs)?2:-1)}}function pFA(t,e){if(t&1){let A=zA();m(0,\"app-chat-panel\",48),oi(1,\"async\"),ao(\"userInputChange\",function(n){rA(A);let o=y(2);return Vn(o.userInput,n)||(o.userInput=n),sA(n)})(\"userEditEvalCaseMessageChange\",function(n){rA(A);let o=y(2);return Vn(o.userEditEvalCaseMessage,n)||(o.userEditEvalCaseMessage=n),sA(n)}),$(\"clickEvent\",function(n){rA(A);let o=y(2);return sA(o.clickEvent(n))})(\"handleKeydown\",function(n){rA(A);let o=y(2);return sA(o.handleKeydown(n.event,n.message))})(\"cancelEditMessage\",function(n){rA(A);let o=y(2);return sA(o.cancelEditMessage(n))})(\"saveEditMessage\",function(n){rA(A);let o=y(2);return sA(o.saveEditMessage(n))})(\"openViewImageDialog\",function(n){rA(A);let o=y(2);return sA(o.openViewImageDialog(n))})(\"openBase64InNewTab\",function(n){rA(A);let o=y(2);return sA(o.openBase64InNewTab(n.data,n.mimeType))})(\"editEvalCaseMessage\",function(n){rA(A);let o=y(2);return sA(o.editEvalCaseMessage(n))})(\"deleteEvalCaseMessage\",function(n){rA(A);let o=y(2);return sA(o.deleteEvalCaseMessage(n.message,n.index))})(\"editFunctionArgs\",function(n){rA(A);let o=y(2);return sA(o.editFunctionArgs(n))})(\"fileSelect\",function(n){rA(A);let o=y(2);return sA(o.onFileSelect(n))})(\"removeFile\",function(n){rA(A);let o=y(2);return sA(o.removeFile(n))})(\"removeStateUpdate\",function(){rA(A);let n=y(2);return sA(n.removeStateUpdate())})(\"sendMessage\",function(n){rA(A);let o=y(2);return sA(o.sendMessage(n))})(\"updateState\",function(){rA(A);let n=y(2);return sA(n.updateState())})(\"toggleAudioRecording\",function(){rA(A);let n=y(2);return sA(n.toggleAudioRecording())})(\"toggleVideoRecording\",function(){rA(A);let n=y(2);return sA(n.toggleVideoRecording())})(\"longRunningResponseComplete\",function(n){rA(A);let o=y(2);return sA(o.processRunSseResponse(n))}),D()}if(t&2){let A=y(2);X(\"appName\",A.appName)(\"messages\",A.messages())(\"isChatMode\",A.isChatMode())(\"evalCase\",A.evalCase)(\"isEvalEditMode\",A.isEvalEditMode())(\"isEvalCaseEditing\",A.isEvalCaseEditing())(\"isEditFunctionArgsEnabled\",li(1,19,A.isEditFunctionArgsEnabledObs)??!1),oo(\"userInput\",A.userInput)(\"userEditEvalCaseMessage\",A.userEditEvalCaseMessage),X(\"selectedFiles\",A.selectedFiles)(\"updatedSessionState\",A.updatedSessionState())(\"eventData\",A.eventData)(\"selectedEvent\",A.selectedEvent)(\"isAudioRecording\",A.isAudioRecording)(\"isVideoRecording\",A.isVideoRecording)(\"hoveredEventMessageIndices\",A.hoveredEventMessageIndices)(\"userId\",A.userId)(\"sessionId\",A.sessionId)(\"sessionName\",A.sessionId)}}function DFA(t,e){if(t&1){let A=zA();m(0,\"div\",20,1),GA(2,\"div\",49),m(3,\"app-trace-event\",50),$(\"panelClosed\",function(){rA(A);let n=y(2);return sA(n.closeTraceEventDetailPanel())}),D()()}if(t&2){let A=y(2);p(3),X(\"userId\",A.userId)(\"appName\",A.appName)(\"sessionId\",A.sessionId)}}function wFA(t,e){if(t&1&&(m(0,\"div\",21),K(1),D()),t&2){let A=y(2);X(\"matTooltip\",A.i18n.disclosureTooltip),p(),Fe(\" \",A.i18n.adkWebDeveloperUiMessage,\" \")}}function yFA(t,e){if(t&1&&(m(0,\"div\",7),He(1),V(2,dFA,4,5,\"div\",17),m(3,\"mat-card\",18),V(4,mFA,3,3),V(5,pFA,2,21,\"app-chat-panel\",19),D(),V(6,DFA,4,3,\"div\",20),V(7,wFA,2,2,\"div\",21),oi(8,\"async\"),D()),t&2){let A=y();p(2),W(A.appName!=\"\"?2:-1),p(2),W(A.selectedAppControl.value?-1:4),p(),W(A.appName!=\"\"?5:-1),p(),W(A.bottomPanelVisible?6:-1),p(),W(li(8,5,A.isDeveloperUiDisclaimerEnabledObs)?7:-1)}}var vFA=\"root_agent\",ky=\"q\",bFA=\"hideSidePanel\",MFA=\"landing\",yF=\"<a2a_datapart_json>\",vF=\"</a2a_datapart_json>\",bF=\"application/json+a2ui\";function MF(t){for(t=t.replace(/-/g,\"+\").replace(/_/g,\"/\");t.length%4!==0;)t+=\"=\";return t}var kF=class t extends bp{nextPageLabel=\"Next Event\";previousPageLabel=\"Previous Event\";firstPageLabel=\"First Event\";lastPageLabel=\"Last Event\";getRangeLabel=(e,A,i)=>i===0?`Event 0 of ${i}`:(i=Math.max(i,0),`Event ${e*A+1} of ${i}`);static \\u0275fac=(()=>{let e;return function(i){return(e||(e=hi(t)))(i||t)}})();static \\u0275prov=TA({token:t,factory:t.\\u0275fac})},HtA=\"Restarting bidirectional streaming is not currently supported. Please refresh the page or start a new session.\",Sy=class t{i18n=h(YtA);_snackBar=h(ZC);activatedRoute=h(_s);agentService=h(Ks);artifactService=h(xp);changeDetectorRef=h(ft);dialog=h(Qs);document=h(Zt);downloadService=h(gB);evalService=h(Uc);eventService=h(lB);featureFlagService=h(lr);graphService=h(cB);localFileService=h(Rp);location=h(Lp);renderer=h(ui);router=h(qr);safeValuesService=h(Wr);sessionService=h(Hg);streamChatService=h(Fp);stringToColorService=h(CB);traceService=h($C);uiStateService=h(Tg);agentBuilderService=h(Kc);chatPanel=Xo.required(FE);canvasComponent=Xo.required(RE);sideDrawer=Xo.required(\"sideDrawer\");sidePanel=Xo.required(KE);evalTab=Xo(Qc);bottomPanelRef=Xo.required(\"bottomPanel\");enableSseIndicator=jA(!1);isChatMode=jA(!0);isEvalCaseEditing=jA(!1);hasEvalCaseChanged=jA(!1);isEvalEditMode=jA(!1);isBuilderMode=jA(!1);videoElement;currentMessage=\"\";messages=jA([]);lastTextChunk=\"\";streamingTextMessage=null;latestThought=\"\";artifacts=[];userInput=\"\";userEditEvalCaseMessage=\"\";userId=\"user\";appName=\"\";sessionId=\"\";sessionIdOfLoadedMessages=\"\";evalCase=null;updatedEvalCase=null;evalSetId=\"\";isAudioRecording=!1;isVideoRecording=!1;longRunningEvents=[];functionCallEventId=\"\";redirectUri=kr.getBaseUrlWithoutPath();showSidePanel=!0;showBuilderAssistant=!0;useSse=!1;currentSessionState={};root_agent=vFA;updatedSessionState=jA(null);isModelThinkingSubject=new Jt(!1);canEditSession=jA(!0);sessionHasUsedBidi=new Set;eventData=new Map;traceData=[];renderedEventGraph;rawSvgString=null;selectedEvent=void 0;selectedEventIndex=void 0;llmRequest=void 0;llmResponse=void 0;llmRequestKey=\"gcp.vertex.agent.llm_request\";llmResponseKey=\"gcp.vertex.agent.llm_response\";getMediaTypeFromMimetype=M4;selectedFiles=[];MediaType=i1;selectedAppControl=new ss(\"\",{nonNullable:!0});openBase64InNewTab(e,A){this.safeValuesService.openBase64InNewTab(e,A)}isLoadingApps=jA(!1);loadingError=jA(\"\");apps$=oe([]).pipe(Wt(()=>{this.isLoadingApps.set(!0),this.selectedAppControl.disable()}),Ei(()=>this.agentService.listApps().pipe(Ho(e=>(this.loadingError.set(e.message),oe(void 0))))),qn(1),Wt(e=>{this.isLoadingApps.set(!1),this.selectedAppControl.enable(),e?.length==1&&this.router.navigate([],{relativeTo:this.activatedRoute,queryParams:{app:e[0]},queryParamsHandling:\"merge\"})}),Ds());importSessionEnabledObs=this.featureFlagService.isImportSessionEnabled();isEditFunctionArgsEnabledObs=this.featureFlagService.isEditFunctionArgsEnabled();isSessionUrlEnabledObs=this.featureFlagService.isSessionUrlEnabled();isApplicationSelectorEnabledObs=this.featureFlagService.isApplicationSelectorEnabled();isTokenStreamingEnabledObs=this.featureFlagService.isTokenStreamingEnabled();isExportSessionEnabledObs=this.featureFlagService.isExportSessionEnabled();isEventFilteringEnabled=Is(this.featureFlagService.isEventFilteringEnabled());isApplicationSelectorEnabled=Is(this.featureFlagService.isApplicationSelectorEnabled());isDeleteSessionEnabledObs=this.featureFlagService.isDeleteSessionEnabled();isUserIdOnToolbarEnabledObs=this.featureFlagService.isUserIdOnToolbarEnabled();isDeveloperUiDisclaimerEnabledObs=this.featureFlagService.isDeveloperUiDisclaimerEnabled();bottomPanelVisible=!1;hoveredEventMessageIndices=[];disableBuilderSwitch=!1;constructor(){}ngOnInit(){if(this.syncSelectedAppFromUrl(),this.updateSelectedAppUrl(),this.hideSidePanelIfNeeded(),Va([this.agentService.getApp(),this.activatedRoute.queryParams]).pipe(We(([i,n])=>!!i&&!!n[ky]),po(),fe(([,i])=>i[ky])).subscribe(i=>{setTimeout(()=>{this.userInput=i})}),this.streamChatService.onStreamClose().subscribe(i=>{let n=`Please check server log for full details: \n`+i;this.openSnackBar(n,\"OK\")}),new URL(window.location.href).searchParams.has(\"code\")){let i=window.location.href;window.opener?.postMessage({authResponseUrl:i},window.origin),window.close()}this.agentService.getApp().subscribe(i=>{this.appName=i}),Va([this.agentService.getLoadingState(),this.isModelThinkingSubject]).subscribe(([i,n])=>{let o=this.messages()[this.messages().length-1];i?!o?.isLoading&&!this.streamingTextMessage&&this.messages.update(a=>[...a,{role:\"bot\",isLoading:!0}]):o?.isLoading&&!n&&(this.messages.update(a=>a.slice(0,-1)),this.changeDetectorRef.detectChanges())}),this.traceService.selectedTraceRow$.subscribe(i=>{let n=i?.attributes[\"gcp.vertex.agent.event_id\"];n&&this.eventData.has(n)?this.bottomPanelVisible=!0:this.bottomPanelVisible=!1}),this.traceService.hoveredMessageIndices$.subscribe(i=>this.hoveredEventMessageIndices=i),this.featureFlagService.isInfinityMessageScrollingEnabled().pipe(po()).subscribe(i=>{i&&(this.uiStateService.onNewMessagesLoaded().subscribe(n=>{this.populateMessages(n.items,!0,!n.isBackground),this.loadTraceData()}),this.uiStateService.onNewMessagesLoadingFailed().subscribe(n=>{this.openSnackBar(n.message,\"OK\")}))})}get sessionTab(){return this.sidePanel().sessionTabComponent()}ngAfterViewInit(){this.showSidePanel&&this.sideDrawer()?.open(),this.isApplicationSelectorEnabled()||this.loadSessionByUrlOrReset()}selectApp(e){e!=this.appName&&(this.agentService.setApp(e),this.loadSessionByUrlOrReset())}loadSessionByUrlOrReset(){this.isSessionUrlEnabledObs.subscribe(e=>{let A=this.activatedRoute.snapshot.queryParams,i=A.session,n=A.userId;if(n&&(this.userId=n),!e||!i){this.createSessionAndReset();return}i&&this.sessionService.getSession(this.userId,this.appName,i).pipe(qn(1),Ho(o=>(this.openSnackBar(\"Cannot find specified session. Creating a new one.\",\"OK\"),this.createSessionAndReset(),oe(null)))).subscribe(o=>{o&&this.updateWithSelectedSession(o)})})}displayLandingPageContent(){this.activatedRoute.queryParams.pipe(po()).subscribe(e=>{let A=e[MFA];if(A)try{let i=decodeURIComponent(A);this.messages().some(n=>n.isLanding)||this.messages.update(n=>[{role:\"bot\",text:i,isLanding:!0},...n])}catch(i){console.error(\"Error decoding landing page content:\",i)}})}hideSidePanelIfNeeded(){this.activatedRoute.queryParams.pipe(We(e=>e[bFA]===\"true\"),qn(1)).subscribe(()=>{this.showSidePanel=!1,this.sideDrawer()?.close()})}createSessionAndReset(){this.createSession(),this.eventData=new Map,this.messages.set([]),this.artifacts=[],this.userInput=\"\",this.longRunningEvents=[],this.displayLandingPageContent()}createSession(){this.uiStateService.setIsSessionListLoading(!0),this.sessionService.createSession(this.userId,this.appName).subscribe(e=>{this.currentSessionState=e.state,this.sessionId=e.id??\"\",this.sessionTab?.refreshSession(),this.sessionTab?.reloadSession(this.sessionId),this.isSessionUrlEnabledObs.subscribe(A=>{A&&this.updateSelectedSessionUrl()})},()=>{this.uiStateService.setIsSessionListLoading(!1)})}sendMessage(e){return ct(this,null,function*(){if(e.preventDefault(),!this.userInput.trim()&&this.selectedFiles.length<=0||e instanceof KeyboardEvent&&(e.isComposing||e.keyCode===229))return;let A=`user_${Date.now()}_${Math.random().toString(36).substr(2,9)}`,i=[],n={role:\"user\",eventId:A};if(this.userInput.trim()&&(i.push({text:this.userInput}),n.text=this.userInput),this.selectedFiles.length>0){let s=this.selectedFiles.map(g=>({file:g.file,url:g.url}));for(let g of this.selectedFiles){let l=yield this.localFileService.createMessagePartFromFile(g.file);i.push(l)}n.attachments=s}this.messages.update(s=>[...s,n]);let o={id:A,author:\"user\",content:{parts:i}};this.eventData.set(A,o),this.eventData=new Map(this.eventData);let a={appName:this.appName,userId:this.userId,sessionId:this.sessionId,newMessage:{role:\"user\",parts:yield this.getUserMessageParts()},streaming:this.useSse,stateDelta:this.updatedSessionState()};this.selectedFiles=[],this.streamingTextMessage=null,this.agentService.runSse(a).subscribe({next:s=>ct(this,null,function*(){if(s.error){this.openSnackBar(s.error,\"OK\");return}if(s.content){let g=this.combineTextParts(s.content.parts);this.isEventA2aResponse(s)&&(g=this.combineA2uiDataParts(g));for(let l of g)this.processPart(s,l),this.traceService.setEventData(this.eventData)}else s.errorMessage&&this.processErrorMessage(s);s.actions&&(this.processActionArtifact(s),this.processActionStateDelta(s)),this.changeDetectorRef.detectChanges()}),error:s=>{console.error(\"Send message error:\",s),this.openSnackBar(s,\"OK\")},complete:()=>{this.updatedSessionState()&&(this.currentSessionState=this.updatedSessionState(),this.updatedSessionState.set(null)),this.streamingTextMessage=null,this.featureFlagService.isSessionReloadOnNewMessageEnabled().pipe(po()).subscribe(s=>{s&&this.sessionTab?.reloadSession(this.sessionId)}),this.eventService.getTrace(this.sessionId).pipe(po(),Ho(s=>oe([]))).subscribe(s=>{this.traceData=s,this.changeDetectorRef.detectChanges()}),this.traceService.setMessages(this.messages()),this.changeDetectorRef.detectChanges()}}),this.userInput=\"\";let r=this.router.parseUrl(this.location.path());r.queryParams[ky]&&(delete r.queryParams[ky],this.location.replaceState(r.toString())),this.changeDetectorRef.detectChanges()})}processErrorMessage(e){this.storeEvents(e,e),this.insertMessageBeforeLoadingMessage({text:e.errorMessage,role:\"bot\"})}processPart(e,A){let i=e.groundingMetadata?.searchEntryPoint?.renderedContent;if(A.text){this.isModelThinkingSubject.next(!1);let n=A.text;if(A.thought){if(n!==this.latestThought){this.storeEvents(A,e);let o={role:\"bot\",text:this.processThoughtText(n),thought:!0,eventId:e.id};this.insertMessageBeforeLoadingMessage(o)}this.latestThought=n}else if(this.streamingTextMessage){if(i&&(this.streamingTextMessage.renderedContent=e.groundingMetadata.searchEntryPoint.renderedContent),n==this.streamingTextMessage.text){let o=this.streamingTextMessage.eventId;this.messages.update(a=>a.map(r=>r.eventId===o&&r.role===\"bot\"?Ve(BA({},r),{eventId:e.id}):r)),this.storeEvents(A,e),this.streamingTextMessage=null;return}this.streamingTextMessage.text+=n,this.insertMessageBeforeLoadingMessage(this.streamingTextMessage)}else if(this.streamingTextMessage={role:\"bot\",text:this.processThoughtText(n),thought:!!A.thought,eventId:e.id},i&&(this.streamingTextMessage.renderedContent=e.groundingMetadata.searchEntryPoint.renderedContent),this.useSse)this.insertMessageBeforeLoadingMessage(this.streamingTextMessage);else{this.insertMessageBeforeLoadingMessage(this.streamingTextMessage),this.storeEvents(A,e),this.streamingTextMessage=null;return}}else if(A.thought)this.isModelThinkingSubject.next(!0);else{if(this.useSse&&e.partial)return;if(this.isA2aDataPart(A)){let a=this.extractA2aDataPartJson(A),s=a&&a.kind===\"data\"&&a.metadata?.mimeType===bF?{a2ui:a.data}:{text:a};this.isModelThinkingSubject.next(!1),this.storeEvents(A,e),this.storeMessage(s,e,e.author===\"user\"?\"user\":\"bot\");return}this.isModelThinkingSubject.next(!1),this.storeEvents(A,e);let o=this.messages().findIndex(a=>a.eventId===e.id&&a.role===\"bot\");o!==-1?this.messages.update(a=>{let r=[...a];return this.processPartIntoMessage(A,e,r[o]),r}):this.storeMessage(A,e,e.author===\"user\"?\"user\":\"bot\")}}getUserMessageParts(){return ct(this,null,function*(){let e=[];if(this.userInput.trim()&&e.push({text:`${this.userInput}`}),this.selectedFiles.length>0)for(let A of this.selectedFiles)e.push(yield this.localFileService.createMessagePartFromFile(A.file));return e})}processActionArtifact(e){e.actions&&e.actions.artifactDelta&&Object.keys(e.actions.artifactDelta).length>0&&(this.storeEvents(null,e),this.storeMessage(null,e,\"bot\"))}processActionStateDelta(e){e.actions&&e.actions.stateDelta&&Object.keys(e.actions.stateDelta).length>0&&(this.currentSessionState=e.actions.stateDelta)}combineTextParts(e){let A=[],i;for(let n of e)n.text&&!n.thought?i?i.text+=n.text:(i={text:n.text},A.push(i)):(i=void 0,A.push(n));return A}isEventA2aResponse(e){return!!e?.customMetadata?.[\"a2a:response\"]}isA2aDataPart(e){if(!e.inlineData||e.inlineData.mimeType!==\"text/plain\")return!1;let A=atob(MF(e.inlineData.data));return A.startsWith(yF)&&A.endsWith(vF)}isA2uiDataPart(e){let A=this.extractA2aDataPartJson(e);return A&&A.kind===\"data\"&&A.metadata?.mimeType===bF}extractA2aDataPartJson(e){if(!this.isA2aDataPart(e))return null;let A=atob(MF(e.inlineData.data)),i=A.substring(yF.length,A.length-vF.length),n;try{n=JSON.parse(i)}catch(o){return null}return n}combineA2uiDataParts(e){let A=[],i=[],n;for(let o of e)this.isA2uiDataPart(o)?(i.push(this.extractA2aDataPartJson(o)),n||(n={inlineData:{mimeType:\"text/plain\",data:o.inlineData.data}},A.push(n))):A.push(o);if(n?.inlineData){let a=yF+JSON.stringify({kind:\"data\",metadata:{mimeType:bF},data:i})+vF;n.inlineData.data=btoa(a)}return A}processA2uiPartIntoMessage(e){let A={};return e.a2ui.forEach(i=>{i.data.beginRendering?A.beginRendering=i.data:i.data.surfaceUpdate?A.surfaceUpdate=i.data:i.data.dataModelUpdate&&(A.dataModelUpdate=i.data)}),A}updateRedirectUri(e,A){try{let i=new URL(e);return i.searchParams.set(\"redirect_uri\",A),i.toString()}catch(i){return console.warn(\"Failed to update redirect URI: \",i),e}}storeMessage(e,A,i,n,o,a=!1){if(A?.author&&this.createAgentIconColorClass(A.author),A?.longRunningToolIds&&A.longRunningToolIds.length>0){let s=this.longRunningEvents.length;this.getAsyncFunctionsFromParts(A.longRunningToolIds,A.content.parts,A.invocationId),this.functionCallEventId=A.id;for(let g=s;g<this.longRunningEvents.length;g++){let l=this.longRunningEvents[g].function;if(l.args.authConfig&&l.args.authConfig.exchangedAuthCredential&&l.args.authConfig.exchangedAuthCredential.oauth2){let C=l.args.authConfig.exchangedAuthCredential.oauth2.authUri,I=this.updateRedirectUri(C,this.redirectUri);this.openOAuthPopup(I).then(d=>{this.sendOAuthResponse(l,d,this.redirectUri)}).catch(d=>{console.error(\"OAuth Error:\",d)});break}}}if(A?.actions&&A.actions.artifactDelta)for(let s in A.actions.artifactDelta)A.actions.artifactDelta.hasOwnProperty(s)&&this.renderArtifact(s,A.actions.artifactDelta[s],a);A?.evalStatus&&this.isChatMode.set(!1);let r={role:i,evalStatus:A?.evalStatus,failedMetric:A?.failedMetric,evalScore:A?.evalScore,evalThreshold:A?.evalThreshold,actualInvocationToolUses:A?.actualInvocationToolUses,expectedInvocationToolUses:A?.expectedInvocationToolUses,actualFinalResponse:A?.actualFinalResponse,expectedFinalResponse:A?.expectedFinalResponse,invocationIndex:n!==void 0?n:void 0,finalResponsePartIndex:o?.finalResponsePartIndex!==void 0?o.finalResponsePartIndex:void 0,toolUseIndex:o?.toolUseIndex!==void 0?o.toolUseIndex:void 0};if(e){if(e.inlineData){let s=this.formatBase64Data(e.inlineData.data,e.inlineData.mimeType);r.inlineData={displayName:e.inlineData.displayName,data:s,mimeType:e.inlineData.mimeType}}else if(e.a2ui)r.a2uiData=this.processA2uiPartIntoMessage(e);else if(e.text)r.text=e.text,r.thought=!!e.thought,A?.groundingMetadata&&A.groundingMetadata.searchEntryPoint&&A.groundingMetadata.searchEntryPoint.renderedContent&&(r.renderedContent=A.groundingMetadata.searchEntryPoint.renderedContent),r.eventId=A?.id;else if(e.functionCall){let s=A?.longRunningToolIds?.includes(e.functionCall.id),g=BA(BA({},e.functionCall),s&&{isLongRunning:!0,invocationId:A.invocationId,functionCallEventId:A.id,needsResponse:!0,responseStatus:\"pending\",userResponse:\"\"});r.functionCalls=[g],r.eventId=A?.id}else if(e.functionResponse)r.functionResponses=[e.functionResponse],r.eventId=A?.id;else if(e.executableCode)r.executableCode=e.executableCode;else if(e.codeExecutionResult&&(r.codeExecutionResult=e.codeExecutionResult,A.actions&&A.actions.artifact_delta))for(let s in A.actions.artifact_delta)A.actions.artifact_delta.hasOwnProperty(s)&&this.renderArtifact(s,A.actions.artifact_delta[s],a)}e&&Object.keys(e).length>0&&(a?this.messages.update(s=>[r,...s]):this.insertMessageBeforeLoadingMessage(r))}insertMessageBeforeLoadingMessage(e){this.messages.update(A=>{if(this.useSse&&e.text&&e.eventId&&e.role===\"bot\"){let n=A.findIndex(o=>o.eventId===e.eventId&&o.role===\"bot\"&&!o.isLoading);if(n!==-1){let o=[...A];return o[n]=Ve(BA({},o[n]),{text:e.text,renderedContent:e.renderedContent||o[n].renderedContent}),o}}let i=A[A.length-1];return i?.isLoading?[...A.slice(0,-1),e,i]:[...A,e]})}formatBase64Data(e,A){let i=MF(e);return`data:${A};base64,${i}`}processPartIntoMessage(e,A,i){if(e)if(e.text)i.text=e.text,i.thought=!!e.thought,A?.groundingMetadata&&A.groundingMetadata.searchEntryPoint&&A.groundingMetadata.searchEntryPoint.renderedContent&&(i.renderedContent=A.groundingMetadata.searchEntryPoint.renderedContent),A?.id&&(i.eventId=A.id);else if(e.inlineData){let n=this.formatBase64Data(e.inlineData.data,e.inlineData.mimeType);i.inlineData={displayName:e.inlineData.displayName,data:n,mimeType:e.inlineData.mimeType},i.role===\"user\"&&A?.id&&(i.eventId=A.id)}else e.functionCall?(i.functionCalls||(i.functionCalls=[]),i.functionCalls.push(e.functionCall),A?.id&&(i.eventId=A.id)):e.functionResponse?(i.functionResponses||(i.functionResponses=[]),i.functionResponses.push(e.functionResponse),A?.id&&(i.eventId=A.id)):e.executableCode?i.executableCode=e.executableCode:e.codeExecutionResult?i.codeExecutionResult=e.codeExecutionResult:e.a2ui&&(i.a2uiData=this.processA2uiPartIntoMessage(e))}handleArtifactFetchFailure(e,A,i){this.openSnackBar(\"Failed to fetch artifact data\",\"OK\"),this.messages.update(n=>n.filter(o=>o!==e)),this.artifacts=this.artifacts.filter(n=>n.id!==A||n.versionId!==i)}renderArtifact(e,A,i=!1){if(this.artifacts.some(r=>r.id===e&&r.versionId===A))return;let o={role:\"bot\",inlineData:{data:\"\",mimeType:\"image/png\"}};i?this.messages.update(r=>[o,...r]):this.insertMessageBeforeLoadingMessage(o);let a={id:e,versionId:A,data:\"\",mimeType:\"image/png\",mediaType:\"image\"};this.artifacts=[...this.artifacts,a],this.artifactService.getArtifactVersion(this.userId,this.appName,this.sessionId,e,A).subscribe({next:r=>{let{mimeType:s,data:g}=r.inlineData??{};if(!s||!g){this.handleArtifactFetchFailure(o,e,A);return}let l=this.formatBase64Data(g,s),C=M4(s),I={name:this.createDefaultArtifactName(s),data:l,mimeType:s,mediaType:C};this.messages.update(d=>d.map(B=>B===o?{role:\"bot\",inlineData:I}:B)),this.artifacts=this.artifacts.map(d=>d.id===e&&d.versionId===A?{id:e,versionId:A,data:l,mimeType:s,mediaType:C}:d)},error:r=>{this.handleArtifactFetchFailure(o,e,A)}})}storeEvents(e,A){let i=\"\";e==null&&A.actions.artifactDelta?i+=\"eventAction: artifact\":e&&(e.text?i+=\"text:\"+e.text:e.functionCall?i+=\"functionCall:\"+e.functionCall.name:e.functionResponse?i+=\"functionResponse:\"+e.functionResponse.name:e.executableCode?i+=\"executableCode:\"+e.executableCode.code.slice(0,10):e.codeExecutionResult?i+=\"codeExecutionResult:\"+e.codeExecutionResult.outcome:e.errorMessage&&(i+=\"errorMessage:\"+e.errorMessage)),A.title=i,this.eventData.set(A.id,A),this.eventData=new Map(this.eventData)}sendOAuthResponse(e,A,i){this.longRunningEvents.pop();let n={appName:this.appName,userId:this.userId,sessionId:this.sessionId,newMessage:{role:\"user\",parts:[]}};var o=structuredClone(e.args.authConfig);o.exchangedAuthCredential.oauth2.authResponseUri=A,o.exchangedAuthCredential.oauth2.redirectUri=i,n.functionCallEventId=this.functionCallEventId,n.newMessage.parts.push({functionResponse:{id:e.id,name:e.name,response:o}});let a=[];this.agentService.runSse(n).subscribe({next:r=>ct(this,null,function*(){a.push(r)}),error:r=>console.error(\"SSE error:\",r),complete:()=>{this.processRunSseResponse(a)}})}processRunSseResponse(e){for(let A of e)if(A.content)for(let i of A.content.parts)this.processPart(A,i)}createAgentIconColorClass(e){let A=this.stringToColorService.stc(e),i=`custom-icon-color-${A.replace(\"#\",\"\")}`;this.injectCustomIconColorStyle(i,A)}clickEvent(e){let A=this.messages()[e],i=A.eventId;if(i){if(this.selectedEvent&&this.selectedEvent.id===i){this.selectedEvent=void 0,this.selectedEventIndex=void 0;return}if(A.role===\"user\"){this.selectedEvent=this.eventData.get(i),this.selectedEventIndex=this.getIndexOfKeyInMap(i),this.llmRequest=void 0,this.llmResponse=void 0,this.sideDrawer()?.open(),this.showSidePanel=!0;return}this.sideDrawer()?.open(),this.showSidePanel=!0,this.selectEvent(i)}}ngOnDestroy(){this.streamChatService.closeStream()}onAppSelection(e){this.isAudioRecording&&(this.stopAudioRecording(),this.isAudioRecording=!1),this.isVideoRecording&&(this.stopVideoRecording(),this.isVideoRecording=!1),this.evalTab()?.resetEvalResults(),this.traceData=[],this.bottomPanelVisible=!1}toggleAudioRecording(){this.isAudioRecording?this.stopAudioRecording():this.startAudioRecording()}startAudioRecording(){if(this.sessionHasUsedBidi.has(this.sessionId)){this.openSnackBar(HtA,\"OK\");return}this.isAudioRecording=!0,this.streamChatService.startAudioChat({appName:this.appName,userId:this.userId,sessionId:this.sessionId}),this.messages.update(e=>[...e,{role:\"user\",text:\"Speaking...\"},{role:\"bot\",text:\"Speaking...\"}]),this.sessionHasUsedBidi.add(this.sessionId)}stopAudioRecording(){this.streamChatService.stopAudioChat(),this.isAudioRecording=!1}toggleVideoRecording(){this.isVideoRecording?this.stopVideoRecording():this.startVideoRecording()}startVideoRecording(){if(this.sessionHasUsedBidi.has(this.sessionId)){this.openSnackBar(HtA,\"OK\");return}let e=this.chatPanel()?.videoContainer;e&&(this.isVideoRecording=!0,this.streamChatService.startVideoChat({appName:this.appName,userId:this.userId,sessionId:this.sessionId,videoContainer:e}),this.messages.update(A=>[...A,{role:\"user\",text:\"Speaking...\"}]),this.sessionHasUsedBidi.add(this.sessionId))}stopVideoRecording(){let e=this.chatPanel()?.videoContainer;e&&(this.streamChatService.stopVideoChat(e),this.isVideoRecording=!1)}getAsyncFunctionsFromParts(e,A,i){for(let n of A)n.functionCall&&e.includes(n.functionCall.id)&&this.longRunningEvents.push({function:n.functionCall,invocationId:i})}openOAuthPopup(e){return new Promise((A,i)=>{if(!this.safeValuesService.windowOpen(window,e,\"oauthPopup\",\"width=600,height=700\")){i(\"Popup blocked!\");return}let o=a=>{if(a.origin!==window.location.origin)return;let{authResponseUrl:r}=a.data;r?(A(r),window.removeEventListener(\"message\",o)):console.log(\"OAuth failed\",a)};window.addEventListener(\"message\",o)})}toggleSidePanel(){this.showSidePanel?(this.sideDrawer()?.close(),this.selectedEvent=void 0,this.selectedEventIndex=void 0):this.sideDrawer()?.open(),this.showSidePanel=!this.showSidePanel}handleTabChange(e){this.isChatMode()||(this.resetEditEvalCaseVars(),this.handleReturnToSession(!0))}handleReturnToSession(e){this.sessionTab?.getSession(this.sessionId),this.evalTab()?.resetEvalCase(),this.isChatMode.set(!0)}handleEvalNotInstalled(e){e&&this.openSnackBar(e,\"OK\")}resetEventsAndMessages({keepMessages:e}={}){e||(this.eventData.clear(),this.messages.set([])),this.artifacts=[]}loadTraceData(){this.eventService.getTrace(this.sessionId).pipe(po(),Ho(()=>oe([]))).subscribe(e=>{this.traceData=e,this.traceService.setEventData(this.eventData),this.traceService.setMessages(this.messages())}),this.bottomPanelVisible=!1,this.changeDetectorRef.detectChanges()}populateMessages(e,A=!1,i=!1){this.resetEventsAndMessages({keepMessages:i&&this.sessionIdOfLoadedMessages===this.sessionId}),e.forEach(n=>{let o=this.isEventA2aResponse(n),a=o?this.combineA2uiDataParts(n.content?.parts):n.content?.parts||[],r=A?[...a].reverse():a;if(n.author===\"user\"){let s={role:\"user\",eventId:n.id};r.forEach(g=>{this.processPartIntoMessage(g,n,s)}),A?this.messages.update(g=>[s,...g]):this.messages.update(g=>[...g,s]),this.eventData.has(n.id)||(this.eventData.set(n.id,n),this.eventData=new Map(this.eventData))}else{let s={role:\"bot\",eventId:n.id};if(r.forEach(g=>{o&&this.isA2uiDataPart(g)&&(g={a2ui:this.extractA2aDataPartJson(g).data}),this.processPartIntoMessage(g,n,s)}),A?this.messages.update(g=>[s,...g]):this.messages.update(g=>[...g,s]),n.actions?.artifactDelta)for(let g in n.actions.artifactDelta)n.actions.artifactDelta.hasOwnProperty(g)&&this.renderArtifact(g,n.actions.artifactDelta[g],A);this.eventData.has(n.id)||(this.eventData.set(n.id,n),this.eventData=new Map(this.eventData))}}),this.sessionIdOfLoadedMessages=this.sessionId}updateWithSelectedSession(e){!e||!e.id||!e.events||!e.state||(this.traceService.resetTraceService(),this.sessionId=e.id,this.currentSessionState=e.state,this.evalCase=null,this.isChatMode.set(!0),this.isSessionUrlEnabledObs.subscribe(A=>{A&&this.updateSelectedSessionUrl()}),this.resetEventsAndMessages(),e.events.forEach(A=>{if(A.author===\"user\"){let i={role:\"user\",eventId:A.id};A.content?.parts?.forEach(n=>{this.processPartIntoMessage(n,A,i)}),this.messages.update(n=>[...n,i]),this.eventData.has(A.id)||(this.eventData.set(A.id,A),this.eventData=new Map(this.eventData))}else{let i={role:\"bot\",eventId:A.id};if(A.content?.parts?.forEach(n=>{this.processPartIntoMessage(n,A,i)}),this.messages.update(n=>[...n,i]),A.actions?.artifactDelta)for(let n in A.actions.artifactDelta)A.actions.artifactDelta.hasOwnProperty(n)&&this.renderArtifact(n,A.actions.artifactDelta[n]);this.eventData.has(A.id)||(this.eventData.set(A.id,A),this.eventData=new Map(this.eventData))}}),this.eventService.getTrace(this.sessionId).pipe(po(),Ho(()=>oe([]))).subscribe(A=>{this.traceData=A,this.traceService.setEventData(this.eventData),this.traceService.setMessages(this.messages())}),this.sessionService.canEdit(this.userId,e).pipe(po(),Ho(()=>oe(!0))).subscribe(A=>{this.chatPanel()?.canEditSession.set(A),this.canEditSession.set(A)}),this.featureFlagService.isInfinityMessageScrollingEnabled().pipe(po()).subscribe(A=>{A||this.populateMessages(e.events||[]),this.loadTraceData()}),this.displayLandingPageContent())}updateWithSelectedEvalCase(e){this.evalCase=e,this.isChatMode.set(!1),this.resetEventsAndMessages();let A=0;for(let i of e.conversation){if(i.userContent?.parts)for(let n of i.userContent.parts)this.storeMessage(n,null,\"user\");if(i.intermediateData?.toolUses){let n=0;for(let o of i.intermediateData.toolUses){let a={functionCall:{name:o.name,args:o.args}};this.storeMessage(a,null,\"bot\",A,{toolUseIndex:n}),n++;let r={functionResponse:{name:o.name}};this.storeMessage(r,null,\"bot\")}}if(i.finalResponse?.parts){let n=0;for(let o of i.finalResponse.parts)this.storeMessage(o,null,\"bot\",A,{finalResponsePartIndex:n}),n++}A++}}updateSelectedEvalSetId(e){this.evalSetId=e}editEvalCaseMessage(e){this.isEvalCaseEditing.set(!0),this.userEditEvalCaseMessage=e.text,e.isEditing=!0,setTimeout(()=>{let A=this.chatPanel()?.textarea?.nativeElement;if(!A)return;A.focus();let i=A.value.length;e.text.charAt(i-1)===`\n`&&i--,A.setSelectionRange(i,i)},0)}editFunctionArgs(e){this.isEvalCaseEditing.set(!0),this.dialog.open(Wu,{maxWidth:\"90vw\",maxHeight:\"90vh\",data:{dialogHeader:\"Edit function arguments\",functionName:e.functionCall.name,jsonContent:e.functionCall.args}}).afterClosed().subscribe(i=>{this.isEvalCaseEditing.set(!1),i&&(this.hasEvalCaseChanged.set(!0),e.functionCall.args=i,this.updatedEvalCase=structuredClone(this.evalCase),this.updatedEvalCase.conversation[e.invocationIndex].intermediateData.toolUses[e.toolUseIndex].args=i)})}saveEvalCase(){this.evalService.updateEvalCase(this.appName,this.evalSetId,this.updatedEvalCase.evalId,this.updatedEvalCase).subscribe(e=>{this.openSnackBar(\"Eval case updated\",\"OK\"),this.resetEditEvalCaseVars()})}cancelEditEvalCase(){this.resetEditEvalCaseVars(),this.updateWithSelectedEvalCase(this.evalCase)}resetEditEvalCaseVars(){this.hasEvalCaseChanged.set(!1),this.isEvalCaseEditing.set(!1),this.isEvalEditMode.set(!1),this.updatedEvalCase=null}cancelEditMessage(e){e.isEditing=!1,this.isEvalCaseEditing.set(!1)}saveEditMessage(e){this.hasEvalCaseChanged.set(!0),this.isEvalCaseEditing.set(!1),e.isEditing=!1,e.text=this.userEditEvalCaseMessage?this.userEditEvalCaseMessage:\" \",this.updatedEvalCase=structuredClone(this.evalCase),this.updatedEvalCase.conversation[e.invocationIndex].finalResponse.parts[e.finalResponsePartIndex]={text:this.userEditEvalCaseMessage},this.userEditEvalCaseMessage=\"\"}handleKeydown(e,A){e.key===\"Enter\"&&!e.shiftKey?(e.preventDefault(),this.saveEditMessage(A)):e.key===\"Escape\"&&this.cancelEditMessage(A)}deleteEvalCaseMessage(e,A){this.hasEvalCaseChanged.set(!0),this.messages.update(i=>i.filter((n,o)=>o!==A)),this.updatedEvalCase=structuredClone(this.evalCase),this.updatedEvalCase.conversation[e.invocationIndex].finalResponse.parts.splice(e.finalResponsePartIndex,1)}editEvalCase(){this.isEvalEditMode.set(!0)}deleteEvalCase(){let e={title:\"Confirm delete\",message:`Are you sure you want to delete ${this.evalCase.evalId}?`,confirmButtonText:\"Delete\",cancelButtonText:\"Cancel\"};this.dialog.open(Af,{width:\"600px\",data:e}).afterClosed().subscribe(i=>{i&&(this.evalTab()?.deleteEvalCase(this.evalCase.evalId),this.openSnackBar(\"Eval case deleted\",\"OK\"))})}onNewSessionClick(){this.createSession(),this.eventData.clear(),this.messages.set([]),this.artifacts=[],this.traceData=[],this.bottomPanelVisible=!1,this.selectedEvent=void 0,this.selectedEventIndex=void 0,this.evalTab()?.showEvalHistory&&this.evalTab()?.toggleEvalHistoryButton()}onFileSelect(e){let A=e.target;if(A.files)for(let i=0;i<A.files.length;i++){let n=A.files[i],o=this.safeValuesService.createObjectUrl(n);this.selectedFiles.push({file:n,url:o})}A.value=\"\"}removeFile(e){URL.revokeObjectURL(this.selectedFiles[e].url),this.selectedFiles.splice(e,1)}toggleSse(){this.useSse=!this.useSse}enterBuilderMode(){let e=this.router.createUrlTree([],{queryParams:{mode:\"builder\"},queryParamsHandling:\"merge\"}).toString();this.location.replaceState(e),this.isBuilderMode.set(!0),this.appName&&this.loadExistingAgentConfiguration()}loadExistingAgentConfiguration(){this.agentService.getAgentBuilderTmp(this.appName).subscribe({next:e=>{e&&this.canvasComponent()?.loadFromYaml(e,this.appName)},error:e=>{console.error(\"Error loading agent configuration:\",e),this._snackBar.open(\"Error loading agent configuration\",\"OK\")}})}exitBuilderMode(){let e=this.router.createUrlTree([],{queryParams:{mode:null},queryParamsHandling:\"merge\"}).toString();this.location.replaceState(e),this.isBuilderMode.set(!1),this.agentBuilderService.clear()}toggleBuilderAssistant(){this.showBuilderAssistant=!this.showBuilderAssistant}openAddItemDialog(){this.apps$.pipe(qn(1)).subscribe(e=>{let A=this.dialog.open(u6,{width:\"600px\",data:{existingAppNames:e??[]}})})}saveAgentBuilder(){this.canvasComponent()?.saveAgent(this.appName)}selectEvent(e){this.selectedEvent=this.eventData.get(e),this.selectedEventIndex=this.getIndexOfKeyInMap(e);let A;this.isEventFilteringEnabled()&&this.selectedEvent.invocationId&&(this.selectedEvent.timestamp||this.selectedEvent.timestampInMillis)&&(A={invocationId:this.selectedEvent.invocationId,timestamp:this.selectedEvent.timestamp??this.selectedEvent.timestampInMillis});let i=BA({id:this.selectedEvent.id},A);this.uiStateService.setIsEventRequestResponseLoading(!0),this.eventService.getEventTrace(i).subscribe(n=>{n[this.llmRequestKey]&&(this.llmRequest=JSON.parse(n[this.llmRequestKey])),n[this.llmResponseKey]&&(this.llmResponse=JSON.parse(n[this.llmResponseKey])),this.uiStateService.setIsEventRequestResponseLoading(!1)},()=>{this.uiStateService.setIsEventRequestResponseLoading(!1)}),this.eventService.getEvent(this.userId,this.appName,this.sessionId,this.selectedEvent.id).subscribe(n=>ct(this,null,function*(){if(!n.dotSrc){this.renderedEventGraph=void 0;return}let o=yield this.graphService.render(n.dotSrc);this.rawSvgString=o,this.renderedEventGraph=this.safeValuesService.bypassSecurityTrustHtml(o)}))}deleteSession(e){let A={title:\"Confirm delete\",message:`Are you sure you want to delete this session ${this.sessionId}?`,confirmButtonText:\"Delete\",cancelButtonText:\"Cancel\"};this.dialog.open(Af,{width:\"600px\",data:A}).afterClosed().subscribe(n=>{n&&this.sessionService.deleteSession(this.userId,this.appName,e).subscribe(o=>{let a=this.sessionTab?.refreshSession(e);a?this.sessionTab?.getSession(a.id):window.location.reload()})})}syncSelectedAppFromUrl(){Va([this.activatedRoute.queryParams,this.apps$]).subscribe(([e,A])=>{let i=e.app;if(A&&A.length&&i){if(!A.includes(i)){this.openSnackBar(`Agent '${i}' not found`,\"OK\");return}this.selectedAppControl.setValue(i,{emitEvent:!1}),this.selectApp(i),this.agentService.getAgentBuilder(i).subscribe(n=>{!n||n==\"\"?(this.disableBuilderSwitch=!0,this.agentBuilderService.setLoadedAgentData(void 0)):(this.disableBuilderSwitch=!1,this.agentBuilderService.setLoadedAgentData(n))}),this.isBuilderMode.set(!1)}e.mode===\"builder\"&&this.enterBuilderMode()})}updateSelectedAppUrl(){this.selectedAppControl.valueChanges.pipe(hl(),We(Boolean)).subscribe(e=>{this.selectApp(e);let A=this.activatedRoute.snapshot.queryParams.app;e!==A&&this.router.navigate([],{queryParams:{app:e,mode:null},queryParamsHandling:\"merge\"})})}updateSelectedSessionUrl(){let e=this.router.createUrlTree([],{queryParams:{session:this.sessionId,userId:this.userId},queryParamsHandling:\"merge\"}).toString();this.location.replaceState(e)}handlePageEvent(e){if(e.pageIndex>=0){let A=this.getKeyAtIndexInMap(e.pageIndex);A&&(this.selectEvent(A),setTimeout(()=>{let i=this.messages().findIndex(n=>n.eventId===A);if(i!==-1){let n=this.chatPanel()?.scrollContainer?.nativeElement;if(!n)return;let o=n.querySelectorAll(\".message-column-container\");o&&o[i]&&o[i].scrollIntoView({behavior:\"smooth\",block:\"nearest\",inline:\"nearest\"})}},0))}}closeSelectedEvent(){this.selectedEvent=void 0,this.selectedEventIndex=void 0}handleEscapeKey(e){e.key===\"Escape\"&&this.selectedEvent&&(e.preventDefault(),this.selectedEvent=void 0,this.selectedEventIndex=void 0)}getIndexOfKeyInMap(e){let A=0,i=(o,a)=>0,n=Array.from(this.eventData.keys()).sort(i);for(let o of n){if(o===e)return A;A++}}getKeyAtIndexInMap(e){let A=(n,o)=>0,i=Array.from(this.eventData.keys()).sort(A);if(e>=0&&e<i.length)return i[e]}openSnackBar(e,A){this._snackBar.open(e,A)}processThoughtText(e){return e.replace(\"/*PLANNING*/\",\"\").replace(\"/*ACTION*/\",\"\")}openLink(e){this.safeValuesService.windowOpen(window,e,\"_blank\")}openViewImageDialog(e){let A=this.dialog.open(a2,{maxWidth:\"90vw\",maxHeight:\"90vh\",data:{imageData:e}})}createDefaultArtifactName(e){return!e||!e.includes(\"/\")?\"\":e.replace(\"/\",\".\")}exportSession(){this.sessionService.getSession(this.userId,this.appName,this.sessionId).subscribe(e=>{console.log(e),this.downloadService.downloadObjectAsJson(e,`session-${this.sessionId}.json`)})}updateState(){this.dialog.open(Wu,{maxWidth:\"90vw\",maxHeight:\"90vh\",data:{dialogHeader:\"Update state\",jsonContent:this.currentSessionState}}).afterClosed().subscribe(A=>{A&&this.updatedSessionState.set(A)})}removeStateUpdate(){this.updatedSessionState.set(null)}closeTraceEventDetailPanel(){this.bottomPanelVisible=!1,this.traceService.selectedRow(void 0),this.traceService.setHoveredMessages(void 0,\"\")}importSession(){let e=document.createElement(\"input\");e.type=\"file\",e.accept=\"application/json\",e.onchange=()=>{if(!e.files||e.files.length===0)return;let A=e.files[0],i=new FileReader;i.onload=n=>{if(n.target?.result)try{let o=JSON.parse(n.target.result);if(!o.userId||!o.appName||!o.events){this.openSnackBar(\"Invalid session file format\",\"OK\");return}this.sessionService.importSession(o.userId,o.appName,o.events).subscribe(a=>{this.openSnackBar(\"Session imported\",\"OK\"),this.sessionTab?.refreshSession()})}catch(o){this.openSnackBar(\"Error parsing session file\",\"OK\")}},i.readAsText(A)},e.click()}injectCustomIconColorStyle(e,A){if(this.document.getElementById(e))return;let i=this.renderer.createElement(\"style\");this.renderer.setAttribute(i,\"id\",e),this.renderer.setAttribute(i,\"type\",\"text/css\");let n=`\n      .${e} {\n        background-color: ${A} !important;\n      }\n    `;this.renderer.appendChild(i,this.renderer.createText(n)),this.renderer.appendChild(this.document.head,i)}static \\u0275fac=function(A){return new(A||t)};static \\u0275cmp=kA({type:t,selectors:[[\"app-chat\"]],viewQuery:function(A,i){A&1&&Or(i.chatPanel,FE,5)(i.canvasComponent,RE,5)(i.sideDrawer,zNA,5)(i.sidePanel,KE,5)(i.evalTab,Qc,5)(i.bottomPanelRef,PNA,5),A&2&&rr(6)},hostBindings:function(A,i){A&1&&$(\"keydown\",function(o){return i.handleEscapeKey(o)},RC)},features:[It([{provide:bp,useClass:kF}])],ngContentSelectors:qNA,decls:8,vars:3,consts:[[\"sideDrawer\",\"\"],[\"bottomPanel\",\"\"],[\"autosize\",\"\",1,\"drawer-container\"],[1,\"material-symbols-outlined\",2,\"position\",\"absolute\",\"width\",\"24px\",\"height\",\"24px\",\"color\",\"#c4c7c5\",\"cursor\",\"pointer\",\"margin-left\",\"20px\",\"margin-top\",\"20px\",\"z-index\",\"9999\",3,\"matTooltip\"],[\"mode\",\"side\",\"appResizableDrawer\",\"\",1,\"side-drawer\"],[3,\"isApplicationSelectorEnabledObs\",\"apps$\",\"isLoadingApps\",\"selectedAppControl\",\"showSidePanel\",\"appName\",\"userId\",\"sessionId\",\"traceData\",\"eventData\",\"currentSessionState\",\"artifacts\",\"selectedEvent\",\"selectedEventIndex\",\"renderedEventGraph\",\"rawSvgString\",\"llmRequest\",\"llmResponse\",\"disableBuilderIcon\"],[1,\"builder-mode-container\"],[1,\"chat-container\"],[1,\"material-symbols-outlined\",2,\"position\",\"absolute\",\"width\",\"24px\",\"height\",\"24px\",\"color\",\"#c4c7c5\",\"cursor\",\"pointer\",\"margin-left\",\"20px\",\"margin-top\",\"20px\",\"z-index\",\"9999\",3,\"click\",\"matTooltip\"],[3,\"closePanel\",\"tabChange\",\"sessionSelected\",\"sessionReloaded\",\"evalCaseSelected\",\"evalSetIdSelected\",\"returnToSession\",\"evalNotInstalled\",\"page\",\"closeSelectedEvent\",\"openImageDialog\",\"appSelectionChange\",\"openAddItemDialog\",\"enterBuilderMode\",\"isApplicationSelectorEnabledObs\",\"apps$\",\"isLoadingApps\",\"selectedAppControl\",\"showSidePanel\",\"appName\",\"userId\",\"sessionId\",\"traceData\",\"eventData\",\"currentSessionState\",\"artifacts\",\"selectedEvent\",\"selectedEventIndex\",\"renderedEventGraph\",\"rawSvgString\",\"llmRequest\",\"llmResponse\",\"disableBuilderIcon\"],[3,\"exitBuilderMode\",\"closePanel\",\"appNameInput\"],[1,\"resize-handler\"],[1,\"builder-exit-button\"],[\"mat-icon-button\",\"\",\"matTooltip\",\"Accept\",1,\"builder-mode-action-button\",3,\"click\"],[\"mat-icon-button\",\"\",\"matTooltip\",\"Exit Builder Mode\",1,\"builder-mode-action-button\",3,\"click\"],[\"mat-icon-button\",\"\",\"matTooltip\",\"Builder Assistant\",1,\"builder-mode-action-button\",3,\"click\"],[3,\"toggleSidePanelRequest\",\"builderAssistantCloseRequest\",\"showSidePanel\",\"showBuilderAssistant\",\"appNameInput\"],[1,\"chat-toolbar\",3,\"ngClass\"],[1,\"chat-card\"],[3,\"appName\",\"messages\",\"isChatMode\",\"evalCase\",\"isEvalEditMode\",\"isEvalCaseEditing\",\"isEditFunctionArgsEnabled\",\"userInput\",\"userEditEvalCaseMessage\",\"selectedFiles\",\"updatedSessionState\",\"eventData\",\"selectedEvent\",\"isAudioRecording\",\"isVideoRecording\",\"hoveredEventMessageIndices\",\"userId\",\"sessionId\",\"sessionName\"],[\"appResizableBottomPanel\",\"\",1,\"trace-detail-container\"],[\"matTooltipPosition\",\"left\",1,\"adk-web-developer-ui-disclaimer\",2,\"align-self\",\"flex-end\",3,\"matTooltip\"],[1,\"material-symbols-outlined\",2,\"width\",\"24px\",\"height\",\"24px\",\"color\",\"#c4c7c5\",\"cursor\",\"pointer\",\"margin-left\",\"20px\",\"margin-top\",\"-2px\",\"z-index\",\"9999\",3,\"matTooltip\"],[1,\"material-symbols-outlined\",2,\"width\",\"24px\",\"height\",\"24px\",\"color\",\"#c4c7c5\",\"cursor\",\"pointer\",\"margin-left\",\"20px\",\"margin-top\",\"-2px\",\"z-index\",\"9999\",3,\"click\",\"matTooltip\"],[2,\"display\",\"flex\"],[1,\"toolbar-session-text\"],[1,\"toolbar-session-id\"],[1,\"toolbar-actions\"],[\"mat-button\",\"\",2,\"height\",\"30px\",3,\"click\"],[\"mat-flat-button\",\"\",2,\"height\",\"30px\",3,\"click\",\"disabled\"],[1,\"material-symbols-outlined\",\"toolbar-icon\",3,\"click\",\"matTooltip\"],[2,\"display\",\"flex\",\"align-items\",\"center\"],[1,\"toolbar-session-text\",2,\"margin-left\",\"16px\"],[1,\"readonly-badge\"],[1,\"readonly-session-message\"],[1,\"toolbar-sse-toggle\"],[1,\"example-margin\",3,\"change\",\"checked\",\"disabled\"],[2,\"margin-left\",\"8px\",\"margin-right\",\"8px\",\"height\",\"22px\",3,\"vertical\"],[\"id\",\"toolbar-new-session-button\",3,\"click\",\"matTooltip\"],[\"id\",\"toolbar-delete-session-button\",1,\"material-symbols-outlined\",\"toolbar-icon\",3,\"matTooltip\"],[\"id\",\"toolbar-export-session-button\",1,\"material-symbols-outlined\",\"toolbar-icon\",3,\"matTooltip\"],[\"id\",\"toolbar-import-session-button\",1,\"material-symbols-outlined\",\"toolbar-icon\",3,\"matTooltip\"],[\"id\",\"toolbar-delete-session-button\",1,\"material-symbols-outlined\",\"toolbar-icon\",3,\"click\",\"matTooltip\"],[\"id\",\"toolbar-export-session-button\",1,\"material-symbols-outlined\",\"toolbar-icon\",3,\"click\",\"matTooltip\"],[\"id\",\"toolbar-import-session-button\",1,\"material-symbols-outlined\",\"toolbar-icon\",3,\"click\",\"matTooltip\"],[1,\"empty-state-container\"],[1,\"warning\"],[1,\"error\"],[3,\"userInputChange\",\"userEditEvalCaseMessageChange\",\"clickEvent\",\"handleKeydown\",\"cancelEditMessage\",\"saveEditMessage\",\"openViewImageDialog\",\"openBase64InNewTab\",\"editEvalCaseMessage\",\"deleteEvalCaseMessage\",\"editFunctionArgs\",\"fileSelect\",\"removeFile\",\"removeStateUpdate\",\"sendMessage\",\"updateState\",\"toggleAudioRecording\",\"toggleVideoRecording\",\"longRunningResponseComplete\",\"appName\",\"messages\",\"isChatMode\",\"evalCase\",\"isEvalEditMode\",\"isEvalCaseEditing\",\"isEditFunctionArgsEnabled\",\"userInput\",\"userEditEvalCaseMessage\",\"selectedFiles\",\"updatedSessionState\",\"eventData\",\"selectedEvent\",\"isAudioRecording\",\"isVideoRecording\",\"hoveredEventMessageIndices\",\"userId\",\"sessionId\",\"sessionName\"],[1,\"bottom-resize-handler\"],[3,\"panelClosed\",\"userId\",\"appName\",\"sessionId\"]],template:function(A,i){A&1&&(Yt(jNA),m(0,\"mat-drawer-container\",2),V(1,ZNA,2,1,\"span\",3),m(2,\"mat-drawer\",4,0),V(4,XNA,1,19,\"app-side-panel\",5)(5,$NA,2,1),D(),V(6,AFA,12,5,\"div\",6)(7,yFA,9,7,\"div\",7),D()),A&2&&(p(),W(!i.showSidePanel&&i.appName===\"\"?1:-1),p(3),W(i.isBuilderMode()?5:4),p(2),W(i.isBuilderMode()?6:7))},dependencies:[Hb,Ba,Yb,Gp,yn,bc,In,Gc,Rg,vn,vJ,up,nB,_p,My,FE,KE,RE,lw,Pr],styles:[\".expand-side-drawer[_ngcontent-%COMP%]{position:relative;top:4%;left:1%}.drawer-container[_ngcontent-%COMP%]{height:100%;background-color:var(--chat-drawer-container-background-color)}.drawer-header[_ngcontent-%COMP%]{width:100%;display:flex;justify-content:space-between;align-items:center;--mat-button-filled-container-color: #89b4f8;--mat-button-filled-label-text-color: black}.drawer-header[_ngcontent-%COMP%]   .mat-icon[_ngcontent-%COMP%]{width:36px;height:36px;color:#bdc1c6;cursor:pointer;display:flex;align-items:center;justify-content:center}.drawer-header[_ngcontent-%COMP%]   .drawer-logo[_ngcontent-%COMP%]{margin-left:9px;display:flex;align-items:center}.drawer-header[_ngcontent-%COMP%]   .drawer-logo[_ngcontent-%COMP%]   img[_ngcontent-%COMP%]{margin-right:9px}.drawer-header[_ngcontent-%COMP%]   .drawer-logo[_ngcontent-%COMP%]{font-size:16px;font-style:normal;font-weight:500;line-height:24px;letter-spacing:.1px}.chat-container[_ngcontent-%COMP%]{width:100%;height:100%;max-width:100%;margin:auto;display:flex;flex-direction:column;flex:1}.event-container[_ngcontent-%COMP%]{color:var(--chat-event-container-color)}.chat-card[_ngcontent-%COMP%]{display:flex;flex-direction:column;overflow:hidden;flex:1;min-height:12%;box-shadow:none;background-color:var(--chat-card-background-color)}.function-event-button[_ngcontent-%COMP%]   .mdc-button__label[_ngcontent-%COMP%]{font-family:Google Sans Mono,monospace}.loading-bar[_ngcontent-%COMP%]{width:100px;margin:15px}.chat-messages[_ngcontent-%COMP%]{flex-grow:1;overflow-y:auto;padding:20px;margin-top:16px}.message-card[_ngcontent-%COMP%]{padding:5px 20px;margin:5px;border-radius:20px;max-width:80%;font-size:14px;font-weight:400;position:relative;display:inline-block}.function-event-button[_ngcontent-%COMP%]{background-color:var(--chat-function-event-button-background-color);margin:5px 5px 10px}.function-event-button-highlight[_ngcontent-%COMP%]{background-color:var(--chat-function-event-button-highlight-background-color);border-color:var(--chat-function-event-button-highlight-border-color)!important;color:var(--chat-function-event-button-highlight-color)!important}.user-message[_ngcontent-%COMP%]{display:flex;justify-content:flex-end;align-items:center}.user-message[_ngcontent-%COMP%]   .message-card[_ngcontent-%COMP%]{background-color:var(--chat-user-message-message-card-background-color);align-self:flex-end;color:var(--chat-user-message-message-card-color);box-shadow:none}.bot-message[_ngcontent-%COMP%]{display:flex;align-items:center}.bot-message[_ngcontent-%COMP%]   .message-card[_ngcontent-%COMP%]{background-color:var(--chat-bot-message-message-card-background-color);align-self:flex-start;color:var(--chat-bot-message-message-card-color);box-shadow:none}.bot-message[_ngcontent-%COMP%]:focus-within   .message-card[_ngcontent-%COMP%]{background-color:var(--chat-bot-message-focus-within-message-card-background-color);border:1px solid var(--chat-bot-message-focus-within-message-card-border-color)}.message-textarea[_ngcontent-%COMP%]{background-color:var(--chat-message-textarea-background-color);max-width:100%;border:none;font-family:Google Sans,Helvetica Neue,sans-serif}.message-textarea[_ngcontent-%COMP%]:focus{background-color:var(--chat-message-textarea-focus-background-color);outline:none}.edit-message-buttons-container[_ngcontent-%COMP%]{display:flex;justify-content:flex-end}.message-card[_ngcontent-%COMP%]   .eval-compare-container[_ngcontent-%COMP%]{visibility:hidden;position:absolute;left:10px;z-index:10;background-color:var(--chat-eval-compare-container-background-color);overflow:hidden;border-radius:20px;padding:5px 20px;margin-bottom:10px;font-size:16px}.message-card[_ngcontent-%COMP%]   .eval-compare-container[_ngcontent-%COMP%]   .actual-result[_ngcontent-%COMP%]{border-right:2px solid var(--chat-actual-result-border-right-color);padding-right:8px;min-width:350px;max-width:350px}.message-card[_ngcontent-%COMP%]   .eval-compare-container[_ngcontent-%COMP%]   .expected-result[_ngcontent-%COMP%]{padding-left:12px;min-width:350px;max-width:350px}.message-card[_ngcontent-%COMP%]:hover   .eval-compare-container[_ngcontent-%COMP%]{visibility:visible}.actual-expected-compare-container[_ngcontent-%COMP%]{display:flex}.score-threshold-container[_ngcontent-%COMP%]{display:flex;justify-content:center;gap:10px;align-items:center;margin-top:15px;font-size:14px;font-weight:600}.eval-response-header[_ngcontent-%COMP%]{padding-bottom:5px;border-bottom:2px solid var(--chat-eval-response-header-border-bottom-color);font-style:italic;font-weight:700}.header-expected[_ngcontent-%COMP%]{color:var(--chat-header-expected-color)}.header-actual[_ngcontent-%COMP%]{color:var(--chat-header-actual-color)}.eval-case-edit-button[_ngcontent-%COMP%]{cursor:pointer;margin-left:4px;margin-right:4px}.eval-pass[_ngcontent-%COMP%]{display:flex;color:var(--chat-eval-pass-color)}.eval-fail[_ngcontent-%COMP%]{display:flex;color:var(--chat-eval-fail-color)}.navigation-button-sidepanel[_ngcontent-%COMP%]{margin-left:auto;margin-right:20px}.fab-button[_ngcontent-%COMP%]{position:fixed;bottom:200px;right:100px;z-index:1000}.sidepanel-toggle[_ngcontent-%COMP%]{position:relative;top:100px;z-index:1000}.side-drawer[_ngcontent-%COMP%]{background-color:var(--chat-side-drawer-background-color);color:var(--chat-side-drawer-color);border-radius:0}.file-preview[_ngcontent-%COMP%]{display:flex;flex-wrap:wrap;gap:5px;margin-top:2px;margin-bottom:8px}.file-item[_ngcontent-%COMP%]{display:flex;align-items:center;gap:5px;background:var(--chat-file-item-background-color);padding:5px;border-radius:4px}button[_ngcontent-%COMP%]{margin-left:20px;margin-right:20px}.empty-state-container[_ngcontent-%COMP%]{color:var(--chat-empty-state-container-color);height:100%;display:flex;flex-direction:column;justify-content:center;align-items:center;font-family:Google Sans,sans-serif;font-weight:400;letter-spacing:normal;line-height:24px;font-size:18px}.empty-state-container[_ngcontent-%COMP%]   pre.warning[_ngcontent-%COMP%]{color:var(--chat-warning-color)}.empty-state-container[_ngcontent-%COMP%]   pre.error[_ngcontent-%COMP%]{color:var(--chat-error-color)}[_nghost-%COMP%]     .mat-mdc-unelevated-button:not(:disabled){color:var(--chat-mat-mdc-unelevated-button-color);background-color:var(--chat-mat-mdc-unelevated-button-background-color)}[_nghost-%COMP%]     .mdc-linear-progress__buffer-dots{background-image:radial-gradient(circle,var(--chat-mdc-linear-progress-buffer-dots-background-color, var(--mat-sys-surface-variant)) calc(var(--mat-progress-bar-track-height, 4px) / 2),transparent 0)}[_nghost-%COMP%]     .mat-mdc-select-arrow-wrapper{margin-left:4px}[_nghost-%COMP%]     .mat-mdc-text-field-wrapper{border:1px solid var(--chat-mat-mdc-text-field-wrapper-border-color)}[_nghost-%COMP%]     .mdc-notched-outline__leading, [_nghost-%COMP%]     .mdc-notched-outline__notch, [_nghost-%COMP%]     .mdc-notched-outline__trailing{border:none}[_nghost-%COMP%]     .mat-mdc-form-field-icon-suffix{padding:0 10px 0 40px}[_nghost-%COMP%]     .segment-key{color:var(--chat-segment-key-color)!important}.mat-mdc-select-placeholder[_ngcontent-%COMP%]{margin-left:20px}.bottom-resize-handler[_ngcontent-%COMP%]{background:var(--chat-bottom-resize-handler-background-color);height:5px;border-radius:4px;position:absolute;display:block;width:20%;left:40%;top:0;right:0;z-index:9999;cursor:ns-resize}.trace-detail-container[_ngcontent-%COMP%]{position:relative;background-color:var(--chat-trace-detail-container-background-color)}.trace-detail-container[_ngcontent-%COMP%]   app-trace-event[_ngcontent-%COMP%]{padding-top:8px}.new-session-button[_ngcontent-%COMP%]{margin-top:0;margin-left:50px;width:130px;height:28px;font-size:14px}.app-select-container[_ngcontent-%COMP%]{width:35%;background-color:#212123;height:30px;display:flex;justify-content:space-between;padding-left:20px;padding-right:20px;border-radius:10px;padding-top:5px}.app-select-container[_ngcontent-%COMP%]{--mat-select-placeholder-text-color: #8ab4f8;--mat-select-enabled-trigger-text-color: #8ab4f8;--mat-select-enabled-arrow-color: #8ab4f8}.adk-checkbox[_ngcontent-%COMP%]{position:fixed;bottom:0;left:0;right:0;margin-bottom:20px;margin-left:20px}.chat-toolbar[_ngcontent-%COMP%]{position:sticky;top:0;height:48px;background:var(--chat-toolbar-background-color);display:flex;align-items:center;z-index:10}.chat-toolbar.edit-mode[_ngcontent-%COMP%]{background:var(--chat-toolbar-edit-mode-background-color)}.toolbar-actions[_ngcontent-%COMP%]{margin-left:auto;display:flex;align-items:center;flex-shrink:0}.toolbar-session-text[_ngcontent-%COMP%]{color:var(--chat-toolbar-session-text-color);font-family:Roboto;font-size:12px;font-style:normal;font-weight:500;line-height:12px;letter-spacing:.8px;text-transform:uppercase;margin-left:20px;padding-top:4px;flex-shrink:0}.toolbar-session-id[_ngcontent-%COMP%]{color:var(--chat-toolbar-session-id-color);font-family:Google Sans Mono,monospace;font-size:14px;font-style:normal;font-weight:400;line-height:20px;letter-spacing:.25px;margin-left:5px;flex-shrink:0}.toolbar-icon[_ngcontent-%COMP%]{width:24px;height:24px;color:var(--chat-toolbar-icon-color);cursor:pointer;margin-right:16px}#toolbar-new-session-button[_ngcontent-%COMP%]{font-size:14px;margin-right:16px;color:var(--chat-toolbar-new-session-color);cursor:pointer;display:flex;align-items:center}.toolbar-sse-toggle[_ngcontent-%COMP%]{--mat-slide-toggle-label-text-size: 14px;--mat-slide-toggle-label-text-color: var(--chat-toolbar-sse-toggle-label-text-color);--mat-slide-toggle-unselected-track-color: var(--chat-toolbar-sse-toggle-unselected-track-color);--mat-slide-toggle-unselected-focus-track-color: var(--chat-toolbar-sse-toggle-unselected-track-color);--mat-slide-toggle-unselected-hover-track-color: var(--chat-toolbar-sse-toggle-unselected-track-color);--mat-slide-toggle-unselected-handle-color: var(--chat-toolbar-sse-toggle-unselected-handle-color);--mat-slide-toggle-unselected-focus-handle-color: var(--chat-toolbar-sse-toggle-unselected-handle-color);--mat-slide-toggle-unselected-hover-handle-color: var(--chat-toolbar-sse-toggle-unselected-handle-color);--mat-slide-toggle-selected-track-color: var(--chat-toolbar-sse-toggle-selected-track-color);--mat-slide-toggle-selected-focus-track-color: var(--chat-toolbar-sse-toggle-selected-track-color);--mat-slide-toggle-selected-hover-track-color: var(--chat-toolbar-sse-toggle-selected-track-color);--mat-slide-toggle-selected-handle-color: var(--chat-toolbar-sse-toggle-selected-handle-color);--mat-slide-toggle-selected-focus-handle-color: var(--chat-toolbar-sse-toggle-selected-handle-color);--mat-slide-toggle-selected-hover-handle-color: var(--chat-toolbar-sse-toggle-selected-handle-color);--mat-slide-toggle-track-height: 24px;--mat-slide-toggle-track-width: 46px;--mat-slide-toggle-track-outline-color: var(--chat-toolbar-sse-toggle-track-outline-color);--mat-slide-toggle-with-icon-handle-size: 20px}[_nghost-%COMP%]     pre{white-space:pre-wrap;word-break:break-word;overflow-x:auto;max-width:100%}.readonly-badge[_ngcontent-%COMP%]{color:var(--chat-readonly-badge-color);background-color:var(--chat-readonly-badge-background-color);border-radius:4px;padding:1px 6px;display:flex;align-items:center;margin-left:8px;font-size:12px;line-height:16px;gap:4px;white-space:nowrap}.readonly-badge[_ngcontent-%COMP%]   mat-icon[_ngcontent-%COMP%]{font-size:14px;width:14px;height:14px;padding-top:1px;flex-shrink:0}.readonly-session-message[_ngcontent-%COMP%]{display:block;color:var(--chat-toolbar-session-text-color);margin-left:1em;font-weight:400;line-height:16px;letter-spacing:.3px;flex-shrink:1}  .mat-drawer-content{display:flex!important}  .mat-drawer{border-right:1px solid var(--chat-mat-drawer-border-right-color)!important}.builder-mode-container[_ngcontent-%COMP%]{position:relative;width:100%;height:100vh;display:flex;flex-direction:column;background-color:var(--builder-container-background-color)}.builder-exit-button[_ngcontent-%COMP%]{position:absolute;top:20px;right:20px;z-index:1000;display:flex;gap:8px}.builder-mode-action-button[_ngcontent-%COMP%]{background-color:var(--builder-secondary-background-color)!important;color:var(--builder-text-tertiary-color)!important;border-radius:50%!important;transition:all .2s ease!important;margin:0!important;padding:0!important;width:40px!important;height:40px!important;min-width:40px!important;min-height:40px!important;border:1px solid var(--builder-tool-item-border-color)!important;box-shadow:0 2px 4px #0000001a!important;display:flex!important;align-items:center!important;justify-content:center!important}.builder-mode-action-button[_ngcontent-%COMP%]:hover{background-color:var(--builder-tool-item-hover-background-color)!important;box-shadow:0 4px 8px #00000026!important}.builder-mode-action-button.active[_ngcontent-%COMP%]{background-color:var(--builder-button-primary-background-color)!important;color:#fff!important;border-color:var(--builder-button-primary-background-color)!important}.builder-mode-action-button[_ngcontent-%COMP%]   .mat-mdc-button-touch-target[_ngcontent-%COMP%]{display:none!important}.builder-mode-action-button[_ngcontent-%COMP%]   mat-icon[_ngcontent-%COMP%]{font-size:20px;width:20px;height:20px}app-canvas[_ngcontent-%COMP%]{width:100%!important;height:100%!important;flex:1!important;display:flex!important;flex-direction:column!important;min-height:0!important}.build-mode-container[_ngcontent-%COMP%]{display:flex;width:100%;height:100%;background-color:var(--builder-container-background-color)}.build-left-panel[_ngcontent-%COMP%], .build-right-panel[_ngcontent-%COMP%]{flex:1;display:flex;flex-direction:column;background-color:var(--builder-tertiary-background-color);border:1px solid var(--builder-border-color);margin:10px;border-radius:8px}.build-panel-header[_ngcontent-%COMP%]{background-color:var(--builder-secondary-background-color);padding:16px 20px;border-bottom:1px solid var(--builder-border-color);border-radius:8px 8px 0 0}.build-panel-header[_ngcontent-%COMP%]   h3[_ngcontent-%COMP%]{margin:0;color:var(--builder-text-primary-color);font-size:16px;font-weight:500;font-family:Google Sans,Helvetica Neue,sans-serif}.build-panel-content[_ngcontent-%COMP%]{flex:1;padding:20px;color:var(--builder-text-secondary-color);overflow-y:auto}.build-panel-content[_ngcontent-%COMP%]   p[_ngcontent-%COMP%]{margin:0;font-size:14px;line-height:1.5}.app-name-option[_ngcontent-%COMP%], .app-select[_ngcontent-%COMP%]{color:var(--builder-text-secondary-color);font-family:Google Sans Mono,monospace;font-style:normal;font-weight:400;padding-left:unset}.adk-web-developer-ui-disclaimer[_ngcontent-%COMP%]{padding-left:4px;padding-bottom:4px;font-size:10px;color:var(--adk-web-text-color-light-gray)}\"]})};var UE=class t{static \\u0275fac=function(A){return new(A||t)};static \\u0275cmp=kA({type:t,selectors:[[\"app-root\"]],decls:1,vars:0,template:function(A,i){A&1&&GA(0,\"app-chat\")},dependencies:[Sy],encapsulation:2})};var kFA=[{path:\"\",component:UE}],xy=class t{static \\u0275fac=function(A){return new(A||t)};static \\u0275mod=Xe({type:t});static \\u0275inj=Ze({imports:[op.forRoot(kFA),op]})};var Ry=class{static getRuntimeConfig(){return window.runtimeConfig}};function SFA(t,e){if(t&1&&(ti(0,\"a\",0),Ni(1,\"img\",1),K(2),Ii()),t&2){y();let A=vs(0),i=vs(1);p(),Bo(\"src\",MI(A),Da),p(),Fe(\" \",i,\" \")}}function xFA(t,e){t&1&&(ti(0,\"div\"),K(1,\" Invalid custom logo config. Make sure that your runtime config specifies both imgUrl and text in the logo field. \"),Ii())}var Ny=class t{logoConfig=Ry.getRuntimeConfig().logo;static \\u0275fac=function(A){return new(A||t)};static \\u0275cmp=kA({type:t,selectors:[[\"app-custom-logo\"]],decls:4,vars:3,consts:[[\"href\",\"/\"],[\"width\",\"32px\",\"height\",\"32px\",1,\"orcas-logo\",3,\"src\"]],template:function(A,i){if(A&1&&(wr(0)(1),V(2,SFA,3,3,\"a\",0)(3,xFA,2,0,\"div\")),A&2){let n=sg(i.logoConfig==null?null:i.logoConfig.imageUrl);p();let o=sg(i.logoConfig==null?null:i.logoConfig.text);p(),W(n&&o?2:3)}},styles:[`a[_ngcontent-%COMP%]{color:inherit;text-decoration:none;display:flex;align-items:center;gap:8px}\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n`]})};var RFA=(t,e)=>({\"font-style\":t,color:e}),Fy=class t{text=nt(\"\");thought=nt(!1);static \\u0275fac=function(A){return new(A||t)};static \\u0275cmp=kA({type:t,selectors:[[\"app-markdown\"]],inputs:{text:[1,\"text\"],thought:[1,\"thought\"]},features:[It([_h()])],decls:1,vars:5,consts:[[3,\"data\",\"ngStyle\"]],template:function(A,i){A&1&&GA(0,\"markdown\",0),A&2&&X(\"data\",i.text())(\"ngStyle\",fl(2,RFA,i.thought()?\"italic\":\"normal\",i.thought()?\"#9aa0a6\":\"inherit\"))},dependencies:[oa,vf,LK,FK],encapsulation:2})};var NFA={\"typography-f-sf\":!0,\"typography-fs-n\":!0,\"typography-w-500\":!0,\"layout-as-n\":!0,\"layout-dis-iflx\":!0,\"layout-al-c\":!0},FFA={\"layout-w-100\":!0},LFA={\"typography-f-s\":!0,\"typography-fs-n\":!0,\"typography-w-400\":!0,\"layout-mt-0\":!0,\"layout-mb-2\":!0,\"typography-sz-bm\":!0,\"color-c-n10\":!0},_FA={\"typography-f-sf\":!0,\"typography-fs-n\":!0,\"typography-w-500\":!0,\"layout-pt-3\":!0,\"layout-pb-3\":!0,\"layout-pl-5\":!0,\"layout-pr-5\":!0,\"layout-mb-1\":!0,\"border-br-16\":!0,\"border-bw-0\":!0,\"border-c-n70\":!0,\"border-bs-s\":!0,\"color-bgc-s30\":!0,\"color-c-n100\":!0,\"behavior-ho-80\":!0},SF={\"typography-f-sf\":!0,\"typography-fs-n\":!0,\"typography-w-500\":!0,\"layout-mt-0\":!0,\"layout-mb-2\":!0,\"color-c-n10\":!0},GFA=Ve(BA({},SF),{\"typography-sz-tl\":!0}),KFA=Ve(BA({},SF),{\"typography-sz-tm\":!0}),UFA=Ve(BA({},SF),{\"typography-sz-ts\":!0}),JFA={\"behavior-sw-n\":!0},qtA={\"typography-f-sf\":!0,\"typography-fs-n\":!0,\"typography-w-400\":!0,\"layout-pl-4\":!0,\"layout-pr-4\":!0,\"layout-pt-2\":!0,\"layout-pb-2\":!0,\"border-br-6\":!0,\"border-bw-1\":!0,\"color-bc-s70\":!0,\"border-bs-s\":!0,\"layout-as-n\":!0,\"color-c-n10\":!0},YFA={\"typography-f-s\":!0,\"typography-fs-n\":!0,\"typography-w-400\":!0,\"layout-m-0\":!0,\"typography-sz-bm\":!0,\"layout-as-n\":!0,\"color-c-n10\":!0},HFA={\"typography-f-s\":!0,\"typography-fs-n\":!0,\"typography-w-400\":!0,\"layout-m-0\":!0,\"typography-sz-bm\":!0,\"layout-as-n\":!0},TFA={\"typography-f-s\":!0,\"typography-fs-n\":!0,\"typography-w-400\":!0,\"layout-m-0\":!0,\"typography-sz-bm\":!0,\"layout-as-n\":!0},OFA={\"typography-f-s\":!0,\"typography-fs-n\":!0,\"typography-w-400\":!0,\"layout-m-0\":!0,\"typography-sz-bm\":!0,\"layout-as-n\":!0},zFA={\"typography-f-c\":!0,\"typography-fs-n\":!0,\"typography-w-400\":!0,\"typography-sz-bm\":!0,\"typography-ws-p\":!0,\"layout-as-n\":!0},PFA=Ve(BA({},qtA),{\"layout-r-none\":!0,\"layout-fs-c\":!0}),jFA={\"layout-el-cv\":!0},TtA=Ms.merge(NFA,{\"color-c-p30\":!0}),qFA=Ms.merge(qtA,{\"color-c-n5\":!0}),VFA=Ms.merge(PFA,{\"color-c-n5\":!0}),WFA=Ms.merge(_FA,{\"color-c-n100\":!0}),OtA=Ms.merge(GFA,{\"color-c-n5\":!0}),ztA=Ms.merge(KFA,{\"color-c-n5\":!0}),PtA=Ms.merge(UFA,{\"color-c-n5\":!0}),ZFA=Ms.merge(LFA,{\"color-c-n5\":!0}),jtA=Ms.merge(YFA,{\"color-c-n60\":!0}),XFA=Ms.merge(zFA,{\"color-c-n35\":!0}),$FA=Ms.merge(HFA,{\"color-c-n35\":!0}),ALA=Ms.merge(TFA,{\"color-c-n35\":!0}),eLA=Ms.merge(OFA,{\"color-c-n35\":!0}),VtA={additionalStyles:{Card:{},Button:{\"--n-60\":\"var(--n-100)\"},Image:{\"max-width\":\"120px\",\"max-height\":\"120px\",marginLeft:\"auto\",marginRight:\"auto\"}},components:{AudioPlayer:{},Button:{\"layout-pt-2\":!0,\"layout-pb-2\":!0,\"layout-pl-5\":!0,\"layout-pr-5\":!0,\"border-br-2\":!0,\"border-bw-0\":!0,\"border-bs-s\":!0,\"color-bgc-p30\":!0,\"color-c-n100\":!0,\"behavior-ho-70\":!0},Card:{\"border-br-4\":!0,\"color-bgc-p100\":!0,\"color-bc-n90\":!0,\"border-bw-1\":!0,\"border-bs-s\":!0,\"layout-pt-4\":!0,\"layout-pb-4\":!0,\"layout-pl-4\":!0,\"layout-pr-4\":!0},CheckBox:{element:{\"layout-m-0\":!0,\"layout-mr-2\":!0,\"layout-p-2\":!0,\"border-br-12\":!0,\"border-bw-1\":!0,\"border-bs-s\":!0,\"color-bgc-p100\":!0,\"color-bc-p60\":!0,\"color-c-n30\":!0,\"color-c-p30\":!0},label:{\"color-c-p30\":!0,\"typography-f-sf\":!0,\"typography-v-r\":!0,\"typography-w-400\":!0,\"layout-flx-1\":!0,\"typography-sz-ll\":!0},container:{\"layout-dsp-iflex\":!0,\"layout-al-c\":!0}},Column:{},DateTimeInput:{container:{},label:{},element:{\"layout-pt-2\":!0,\"layout-pb-2\":!0,\"layout-pl-3\":!0,\"layout-pr-3\":!0,\"border-br-12\":!0,\"border-bw-1\":!0,\"border-bs-s\":!0,\"color-bgc-p100\":!0,\"color-bc-p60\":!0,\"color-c-n30\":!0}},Divider:{\"color-bgc-n90\":!0,\"layout-mt-6\":!0,\"layout-mb-6\":!0},Image:{all:{\"border-br-50pc\":!0,\"layout-el-cv\":!0,\"layout-w-100\":!0,\"layout-h-100\":!0,\"layout-dsp-flexhor\":!0,\"layout-al-c\":!0,\"layout-sp-c\":!0,\"layout-mb-3\":!0},avatar:{},header:{},icon:{},largeFeature:{},mediumFeature:{},smallFeature:{}},Icon:{\"border-br-1\":!0,\"layout-p-2\":!0,\"color-bgc-n98\":!0,\"layout-dsp-flexhor\":!0,\"layout-al-c\":!0,\"layout-sp-c\":!0},List:{\"layout-g-4\":!0,\"layout-p-2\":!0},Modal:{backdrop:{\"color-bbgc-p60_20\":!0},element:{\"border-br-2\":!0,\"color-bgc-p100\":!0,\"layout-p-4\":!0,\"border-bw-1\":!0,\"border-bs-s\":!0,\"color-bc-p80\":!0}},MultipleChoice:{container:{},label:{},element:{}},Row:{\"layout-g-4\":!0},Slider:{container:{},label:{},element:{}},Tabs:{container:{},controls:{all:{},selected:{}},element:{}},Text:{all:{\"layout-w-100\":!0,\"layout-g-2\":!0,\"color-c-p30\":!0},h1:{\"typography-f-sf\":!0,\"typography-ta-c\":!0,\"typography-v-r\":!0,\"typography-w-500\":!0,\"layout-mt-0\":!0,\"layout-mr-0\":!0,\"layout-ml-0\":!0,\"layout-mb-2\":!0,\"layout-p-0\":!0,\"typography-sz-tl\":!0},h2:{\"typography-f-sf\":!0,\"typography-ta-c\":!0,\"typography-v-r\":!0,\"typography-w-500\":!0,\"layout-mt-0\":!0,\"layout-mr-0\":!0,\"layout-ml-0\":!0,\"layout-mb-2\":!0,\"layout-p-0\":!0,\"typography-sz-tl\":!0},h3:{\"typography-f-sf\":!0,\"typography-ta-c\":!0,\"typography-v-r\":!0,\"typography-w-500\":!0,\"layout-mt-0\":!0,\"layout-mr-0\":!0,\"layout-ml-0\":!0,\"layout-mb-0\":!0,\"layout-p-0\":!0,\"typography-sz-ts\":!0},h4:{\"typography-f-sf\":!0,\"typography-ta-c\":!0,\"typography-v-r\":!0,\"typography-w-500\":!0,\"layout-mt-0\":!0,\"layout-mr-0\":!0,\"layout-ml-0\":!0,\"layout-mb-0\":!0,\"layout-p-0\":!0,\"typography-sz-bl\":!0},h5:{\"typography-f-sf\":!0,\"typography-ta-c\":!0,\"typography-v-r\":!0,\"typography-w-500\":!0,\"layout-mt-0\":!0,\"layout-mr-0\":!0,\"layout-ml-0\":!0,\"layout-mb-0\":!0,\"layout-p-0\":!0,\"color-c-n30\":!0,\"typography-sz-bm\":!0,\"layout-mb-1\":!0},body:{},caption:{}},TextField:{container:{\"typography-sz-bm\":!0,\"layout-w-100\":!0,\"layout-g-2\":!0,\"layout-dsp-flexhor\":!0,\"layout-al-c\":!0},label:{\"layout-flx-0\":!0},element:{\"typography-sz-bm\":!0,\"layout-pt-2\":!0,\"layout-pb-2\":!0,\"layout-pl-3\":!0,\"layout-pr-3\":!0,\"border-br-12\":!0,\"border-bw-1\":!0,\"border-bs-s\":!0,\"color-bgc-p100\":!0,\"color-bc-p60\":!0,\"color-c-n30\":!0,\"color-c-p30\":!0}},Video:{\"border-br-5\":!0,\"layout-el-cv\":!0}},elements:{a:TtA,audio:FFA,body:ZFA,button:WFA,h1:OtA,h2:ztA,h3:PtA,h4:{},h5:{},iframe:JFA,input:qFA,p:jtA,pre:XFA,textarea:VFA,video:jFA},markdown:{p:[...Object.keys(jtA)],h1:[...Object.keys(OtA)],h2:[...Object.keys(ztA)],h3:[...Object.keys(PtA)],h4:[],h5:[],ul:[...Object.keys(ALA)],ol:[...Object.keys($FA)],li:[...Object.keys(eLA)],a:[...Object.keys(TtA)],strong:[],em:[]}};var Ly=class t{nodes=[];subAgentIdCounter=1;selectedToolSubject=new Jt(void 0);selectedNodeSubject=new Jt(void 0);selectedCallbackSubject=new Jt(void 0);loadedAgentDataSubject=new Jt(void 0);agentToolsMapSubject=new Jt(new Map);agentToolsSubject=new Jt(void 0);newAgentToolBoardSubject=new Jt(void 0);agentCallbacksMapSubject=new Jt(new Map);agentCallbacksSubject=new Jt(void 0);agentToolDeletionSubject=new Jt(void 0);deleteSubAgentSubject=new Jt(\"\");addSubAgentSubject=new Jt({parentAgentName:\"\"});tabChangeSubject=new Jt(void 0);agentToolBoardsSubject=new Jt(new Map);constructor(){}getNode(e){return this.nodes.find(i=>i.name===e)}getRootNode(){return this.nodes.find(A=>!!A.isRoot)}addNode(e){let A=this.nodes.findIndex(g=>g.name===e.name);A!==-1?this.nodes[A]=e:this.nodes.push(e);let i=/^sub_agent_(\\d+)$/,n=e.name.match(i);if(n){let g=parseInt(n[1],10);g>=this.subAgentIdCounter&&(this.subAgentIdCounter=g+1)}let o=this.agentToolsMapSubject.value,a=new Map(o);a.set(e.name,e.tools||[]),this.agentToolsMapSubject.next(a);let r=this.agentCallbacksMapSubject.value,s=new Map(r);s.set(e.name,e.callbacks||[]),this.agentCallbacksMapSubject.next(s),this.setSelectedNode(this.selectedNodeSubject.value)}getNodes(){return this.nodes}clear(){this.nodes=[],this.subAgentIdCounter=1,this.setSelectedNode(void 0),this.setSelectedTool(void 0),this.agentToolsMapSubject.next(new Map),this.agentCallbacksMapSubject.next(new Map),this.setSelectedCallback(void 0),this.setAgentTools(),this.setAgentCallbacks()}getSelectedNode(){return this.selectedNodeSubject.asObservable()}setSelectedNode(e){this.selectedNodeSubject.next(e)}getSelectedTool(){return this.selectedToolSubject.asObservable()}setSelectedTool(e){this.selectedToolSubject.next(e)}getSelectedCallback(){return this.selectedCallbackSubject.asObservable()}setSelectedCallback(e){this.selectedCallbackSubject.next(e)}getNextSubAgentName(){return`sub_agent_${this.subAgentIdCounter++}`}addTool(e,A){let i=this.getNode(e);if(i){let n=i.tools||[];i.tools=[A,...n];let o=this.agentToolsMapSubject.value,a=new Map(o);a.set(e,i.tools),this.agentToolsMapSubject.next(a)}}deleteTool(e,A){let i=this.getNode(e);if(i&&i.tools){let n=i.tools.length;if(i.tools=i.tools.filter(o=>o.name!==A.name),i.tools.length<n){let o=this.agentToolsMapSubject.value,a=new Map(o);a.set(e,i.tools),this.agentToolsMapSubject.next(a),this.selectedToolSubject.value?.name===A.name&&this.setSelectedTool(void 0)}}}addCallback(e,A){try{let i=this.getNode(e);if(!i)return{success:!1,error:\"Agent not found\"};if(i.callbacks||(i.callbacks=[]),i.callbacks.find(r=>r.name===A.name))return{success:!1,error:`Callback with name '${A.name}' already exists`};i.callbacks.push(A),this.agentCallbacksSubject.next({agentName:e,callbacks:i.callbacks});let o=this.agentCallbacksMapSubject.value,a=new Map(o);return a.set(e,i.callbacks),this.agentCallbacksMapSubject.next(a),{success:!0}}catch(i){return{success:!1,error:\"Failed to add callback: \"+i.message}}}updateCallback(e,A,i){try{let n=this.getNode(e);if(!n)return{success:!1,error:\"Agent not found\"};if(!n.callbacks)return{success:!1,error:\"No callbacks found for this agent\"};let o=n.callbacks.findIndex(l=>l.name===A);if(o===-1)return{success:!1,error:\"Callback not found\"};if(n.callbacks.some((l,C)=>C!==o&&l.name===i.name))return{success:!1,error:`Callback with name '${i.name}' already exists`};let r=BA(BA({},n.callbacks[o]),i);n.callbacks[o]=r,this.agentCallbacksSubject.next({agentName:e,callbacks:n.callbacks});let s=this.agentCallbacksMapSubject.value,g=new Map(s);return g.set(e,n.callbacks),this.agentCallbacksMapSubject.next(g),this.selectedCallbackSubject.value?.name===A&&this.setSelectedCallback(r),{success:!0}}catch(n){return{success:!1,error:\"Failed to update callback: \"+n.message}}}deleteCallback(e,A){try{let i=this.getNode(e);if(!i)return{success:!1,error:\"Agent not found\"};if(!i.callbacks)return{success:!1,error:\"No callbacks found for this agent\"};let n=i.callbacks.findIndex(r=>r.name===A.name);if(n===-1)return{success:!1,error:\"Callback not found\"};i.callbacks.splice(n,1),this.agentCallbacksSubject.next({agentName:e,callbacks:i.callbacks});let o=this.agentCallbacksMapSubject.value,a=new Map(o);return a.set(e,i.callbacks),this.agentCallbacksMapSubject.next(a),this.selectedCallbackSubject.value?.name===A.name&&this.setSelectedCallback(void 0),{success:!0}}catch(i){return{success:!1,error:\"Failed to delete callback: \"+i.message}}}setLoadedAgentData(e){this.loadedAgentDataSubject.next(e)}getLoadedAgentData(){return this.loadedAgentDataSubject.asObservable()}getAgentToolsMap(){return this.agentToolsMapSubject.asObservable()}getAgentCallbacksMap(){return this.agentCallbacksMapSubject.asObservable()}requestSideTabChange(e){this.tabChangeSubject.next(e)}getSideTabChangeRequest(){return this.tabChangeSubject.asObservable()}requestNewTab(e,A){this.newAgentToolBoardSubject.next({toolName:e,currentAgentName:A})}getNewTabRequest(){return this.newAgentToolBoardSubject.asObservable().pipe(fe(A=>A?{tabName:A.toolName,currentAgentName:A.currentAgentName}:void 0))}requestTabDeletion(e){this.agentToolDeletionSubject.next(e)}getTabDeletionRequest(){return this.agentToolDeletionSubject.asObservable()}setAgentToolBoards(e){this.agentToolBoardsSubject.next(e)}getAgentToolBoards(){return this.agentToolBoardsSubject.asObservable()}getCurrentAgentToolBoards(){return this.agentToolBoardsSubject.value}getAgentTools(){return this.agentToolsSubject.asObservable()}getDeleteSubAgentSubject(){return this.deleteSubAgentSubject.asObservable()}setDeleteSubAgentSubject(e){this.deleteSubAgentSubject.next(e)}getAddSubAgentSubject(){return this.addSubAgentSubject.asObservable()}setAddSubAgentSubject(e,A,i){this.addSubAgentSubject.next({parentAgentName:e,agentClass:A,isFromEmptyGroup:i})}setAgentTools(e,A){if(e&&A){this.agentToolsSubject.next({agentName:e,tools:A});let i=this.agentToolsMapSubject.value,n=new Map(i);n.set(e,A),this.agentToolsMapSubject.next(n)}else this.agentToolsSubject.next(void 0)}getAgentCallbacks(){return this.agentCallbacksSubject.asObservable()}setAgentCallbacks(e,A){e&&A?this.agentCallbacksSubject.next({agentName:e,callbacks:A}):this.agentCallbacksSubject.next(void 0)}getParentNode(e,A,i,n){if(e){if(e.name===A.name)return i;for(let o of e.sub_agents){let a=this.getParentNode(o,A,e,n);if(a)return a}if(e.tools){for(let o of e.tools)if(o.toolType===\"Agent Tool\"){let a=n.get(o.toolAgentName||o.name);if(a){let r=this.getParentNode(a,A,e,n);if(r)return r}}}}}deleteNode(e){this.nodes=this.nodes.filter(A=>A.name!==e.name),this.setSelectedNode(this.selectedNodeSubject.value)}static \\u0275fac=function(A){return new(A||t)};static \\u0275prov=TA({token:t,factory:t.\\u0275fac,providedIn:\"root\"})};var _y=class t{constructor(e){this.http=e}apiServerDomain=kr.getApiServerBaseUrl();getLatestArtifact(e,A,i,n){let o=this.apiServerDomain+`/apps/${A}/users/${e}/sessions/${i}/artifacts/${n}`;return this.http.get(o)}getArtifactVersion(e,A,i,n,o){let a=this.apiServerDomain+`/apps/${A}/users/${e}/sessions/${i}/artifacts/${n}/versions/${o}`;return this.http.get(a)}static \\u0275fac=function(A){return new(A||t)(Do(ks))};static \\u0275prov=TA({token:t,factory:t.\\u0275fac,providedIn:\"root\"})};var Gy=class t{audioContext=new AudioContext({sampleRate:22e3});lastAudioTime=0;scheduledAudioSources=new Set;playAudio(e){let A=this.combineAudioBuffer(e);A&&this.playPCM(A)}stopAudio(){for(let e of this.scheduledAudioSources)e.onended=null,e.stop();this.scheduledAudioSources.clear(),this.lastAudioTime=this.audioContext.currentTime}combineAudioBuffer(e){if(e.length===0)return;let A=e.reduce((o,a)=>o+a.length,0),i=new Uint8Array(A),n=0;for(let o of e)i.set(o,n),n+=o.length;return i}playPCM(e){let A=new Float32Array(e.length/2);for(let r=0;r<A.length;r++){let s=e[r*2]|e[r*2+1]<<8;s>=32768&&(s-=65536),A[r]=s/32768}let i=this.audioContext.createBuffer(1,A.length,22e3);i.copyToChannel(A,0);let n=this.audioContext.createBufferSource();n.buffer=i,n.connect(this.audioContext.destination),n.onended=()=>{this.scheduledAudioSources.delete(n)},this.scheduledAudioSources.add(n);let o=this.audioContext.currentTime,a=Math.max(this.lastAudioTime,o);n.start(a),this.lastAudioTime=a+i.duration}static \\u0275fac=function(A){return new(A||t)};static \\u0275prov=TA({token:t,factory:t.\\u0275fac,providedIn:\"root\"})};var Ky=new wA(\"AudioRecordingService\"),Uy=new wA(\"AudioWorkletModulePath\");var Jy=class t{audioWorkletModulePath=h(Uy);stream;audioContext;source;audioBuffer=[];startRecording(){return ct(this,null,function*(){try{this.stream=yield navigator.mediaDevices.getUserMedia({audio:!0}),this.audioContext=new AudioContext,yield this.audioContext.audioWorklet.addModule(this.audioWorkletModulePath),this.source=this.audioContext.createMediaStreamSource(this.stream);let e=new AudioWorkletNode(this.audioContext,\"audio-processor\");e.port.onmessage=A=>{let i=A.data,n=this.float32ToPCM(i);this.audioBuffer.push(n)},this.source.connect(e),e.connect(this.audioContext.destination)}catch(e){console.error(\"Error accessing microphone:\",e)}})}stopRecording(){this.source&&this.source.disconnect(),this.audioContext&&this.audioContext.close(),this.stream&&this.stream.getTracks().forEach(e=>e.stop())}getCombinedAudioBuffer(){if(this.audioBuffer.length===0)return;let e=this.audioBuffer.reduce((n,o)=>n+o.length,0),A=new Uint8Array(e),i=0;for(let n of this.audioBuffer)A.set(n,i),i+=n.length;return A}cleanAudioBuffer(){this.audioBuffer=[]}float32ToPCM(e){let A=new ArrayBuffer(e.length*2),i=new DataView(A);for(let n=0;n<e.length;n++){let o=Math.max(-1,Math.min(1,e[n]));o=o<0?o*32768:o*32767,i.setInt16(n*2,o,!0)}return new Uint8Array(A)}static \\u0275fac=function(A){return new(A||t)};static \\u0275prov=TA({token:t,factory:t.\\u0275fac,providedIn:\"root\"})};var Yy=class t{safeValuesService=h(Wr);downloadBase64Data(e,A,i=\"image.png\"){try{let n=document.createElement(\"a\");this.safeValuesService.setAnchorHref(n,e),n.download=i,document.body.appendChild(n),n.click(),document.body.removeChild(n)}catch(n){throw console.error(\"Error downloading base64 data:\",n),n}}downloadObjectAsJson(e,A=\"session.json\"){let i=JSON.stringify(e,null,2),n=new Blob([i],{type:\"application/octet-stream\"}),o=this.safeValuesService.createObjectUrl(n),a=document.createElement(\"a\");this.safeValuesService.setAnchorHref(a,o),a.download=A,document.body.appendChild(a),a.click(),document.body.removeChild(a),URL.revokeObjectURL(o.toString())}static \\u0275fac=function(A){return new(A||t)};static \\u0275prov=TA({token:t,factory:t.\\u0275fac,providedIn:\"root\"})};var Hy=class t{http=h(ks);apiServerDomain=kr.getApiServerBaseUrl();getEvalSets(e){if(this.apiServerDomain!=null){let A=this.apiServerDomain+`/apps/${e}/eval_sets`;return this.http.get(A)}return new Ti}createNewEvalSet(e,A){if(this.apiServerDomain!=null){let i=this.apiServerDomain+`/apps/${e}/eval_sets/${A}`;return this.http.post(i,{})}return new Ti}listEvalCases(e,A){if(this.apiServerDomain!=null){let i=this.apiServerDomain+`/apps/${e}/eval_sets/${A}/evals`;return this.http.get(i,{})}return new Ti}addCurrentSession(e,A,i,n,o){let a=this.apiServerDomain+`/apps/${e}/eval_sets/${A}/add_session`;return this.http.post(a,{evalId:i,sessionId:n,userId:o})}runEval(e,A,i,n){let o=this.apiServerDomain+`/apps/${e}/eval_sets/${A}/run_eval`;return this.http.post(o,{evalIds:i,evalMetrics:n})}listEvalResults(e){if(this.apiServerDomain!=null){let A=this.apiServerDomain+`/apps/${e}/eval_results`;return this.http.get(A,{})}return new Ti}getEvalResult(e,A){if(this.apiServerDomain!=null){let i=this.apiServerDomain+`/apps/${e}/eval_results/${A}`;return this.http.get(i,{})}return new Ti}getEvalCase(e,A,i){if(this.apiServerDomain!=null){let n=this.apiServerDomain+`/apps/${e}/eval_sets/${A}/evals/${i}`;return this.http.get(n,{})}return new Ti}updateEvalCase(e,A,i,n){let o=this.apiServerDomain+`/apps/${e}/eval_sets/${A}/evals/${i}`;return this.http.put(o,{evalId:i,conversation:n.conversation,sessionInput:n.sessionInput,creationTimestamp:n.creationTimestamp})}deleteEvalCase(e,A,i){let n=this.apiServerDomain+`/apps/${e}/eval_sets/${A}/evals/${i}`;return this.http.delete(n,{})}static \\u0275fac=function(A){return new(A||t)};static \\u0275prov=TA({token:t,factory:t.\\u0275fac,providedIn:\"root\"})};var xF=\"gcp.vertex.agent.tool_call_args\",RF=\"gcp.vertex.agent.tool_response\",Ty=\"gcp.vertex.agent.llm_request\",Oy=\"gcp.vertex.agent.llm_response\",WtA=\"execute_tool\",ZtA=\"generate_content\",tLA=\"content\",iLA=\"parts\",nLA=\"functionResponse\",XtA=t=>{let e=Ve(BA({},t),{attributes:BA({},t.attributes)}),A=t?.attributes?.[Ty]??oLA(t),i=t?.attributes?.[Oy]??gLA(t);return A!==void 0&&(e.attributes[Ty]=A),i!==void 0&&(e.attributes[Oy]=i),e},oLA=t=>t.name.startsWith(WtA)?t.attributes?.[xF]:t.name.startsWith(ZtA)?$tA(t.logs):void 0,aLA=t=>{let e=rLA(t),A=$tA(t);return JSON.stringify({system_message:e,user_message:NF(A)})},$tA=t=>{if(!t)return;let e=t.reverse().find(sLA);if(!e)return;let A=typeof e.body==\"string\"?NF(e.body):e.body;return typeof A==\"string\"?A:(A.content.role=\"user\",A.contents=[A.content],delete A.content,JSON.stringify(A))},rLA=t=>{if(!t)return;let e=t.reverse().find(A=>A.event_name===\"gen_ai.system.message\");if(e)return typeof e.body==\"string\"?NF(e.body):e.body},sLA=t=>{if(t.event_name!==\"gen_ai.user.message\")return!1;try{let A=(typeof t.body==\"string\"?JSON.parse(t.body):t.body)[tLA]?.[iLA];return Array.isArray(A)?A.every(i=>!i[nLA]):!1}catch(e){return!1}},gLA=t=>t.name.startsWith(WtA)?t.attributes?.[RF]:t.name.startsWith(ZtA)?AiA(t.logs):void 0,AiA=t=>{if(!t)return;let e=t.reverse().find(A=>A.event_name===\"gen_ai.choice\");if(e)return lLA(e)},NF=t=>{try{return JSON.parse(t)}catch(e){return t}},lLA=t=>typeof t.body==\"string\"?t.body:JSON.stringify(t.body),eiA=t=>{let e=t[Ty]??cLA(t),A=t[Oy]??CLA(t),i=BA({},t);return e!==void 0&&(i[Ty]=e),A!==void 0&&(i[Oy]=A),i},cLA=t=>{if(xF in t)return`${t[xF]}`;if(t.logs)return aLA(t.logs)},CLA=t=>{if(RF in t)return`${t[RF]}`;if(t.logs)return AiA(t.logs)};var zy=class t{constructor(e){this.http=e}apiServerDomain=kr.getApiServerBaseUrl();getEventTrace(e){let A=this.apiServerDomain+`/debug/trace/${e.id}`;return this.http.get(A).pipe(fe(n=>eiA(n)))}getTrace(e){let A=this.apiServerDomain+`/debug/trace/session/${e}`;return this.http.get(A).pipe(fe(n=>Array.isArray(n)?n.map(XtA):n))}getEvent(e,A,i,n){let o=this.apiServerDomain+`/apps/${A}/users/${e}/sessions/${i}/events/${n}/graph`;return this.http.get(o)}static \\u0275fac=function(A){return new(A||t)(Do(ks))};static \\u0275prov=TA({token:t,factory:t.\\u0275fac,providedIn:\"root\"})};var Py=class t{route=h(_s);constructor(){}isImportSessionEnabled(){return this.route.queryParams.pipe(fe(e=>e[MJ]===\"true\"))}isEditFunctionArgsEnabled(){return this.route.queryParams.pipe(fe(e=>e[kJ]===\"true\"))}isSessionUrlEnabled(){return oe(!0)}isA2ACardEnabled(){return this.route.queryParams.pipe(fe(e=>e[SJ]===\"true\"))}isApplicationSelectorEnabled(){return oe(!0)}isAlwaysOnSidePanelEnabled(){return oe(!1)}isTraceEnabled(){return oe(!0)}isArtifactsTabEnabled(){return oe(!0)}isEvalEnabled(){return oe(!0)}isTokenStreamingEnabled(){return oe(!0)}isMessageFileUploadEnabled(){return oe(!0)}isManualStateUpdateEnabled(){return oe(!0)}isBidiStreamingEnabled(){return oe(!0)}isExportSessionEnabled(){return oe(!0)}isEventFilteringEnabled(){return oe(!1)}isDeleteSessionEnabled(){return oe(!0)}isLoadingAnimationsEnabled(){return oe(!0)}isSessionsTabReorderingEnabled(){return oe(!1)}isSessionFilteringEnabled(){return oe(!1)}isSessionReloadOnNewMessageEnabled(){return oe(!1)}isUserIdOnToolbarEnabled(){return oe(!0)}isDeveloperUiDisclaimerEnabled(){return oe(!0)}isFeedbackServiceEnabled(){return oe(!1)}isInfinityMessageScrollingEnabled(){return oe(!1)}static \\u0275fac=function(A){return new(A||t)};static \\u0275prov=TA({token:t,factory:t.\\u0275fac,providedIn:\"root\"})};var jy=class t{sendFeedback(e,A,i){return oe(void 0)}getFeedback(e,A){return oe(void 0)}deleteFeedback(e,A){return oe(void 0)}getPositiveFeedbackReasons(){return oe([])}getNegativeFeedbackReasons(){return oe([])}static \\u0275fac=function(A){return new(A||t)};static \\u0275prov=TA({token:t,factory:t.\\u0275fac,providedIn:\"root\"})};var ILA=(()=>{var t=import.meta.url;return function(e={}){var A,i=e,n,o,a=new Promise((u,w)=>{n=u,o=w});i.agerrMessages=[],i.stderrMessages=[],B=u=>i.stderrMessages.push(u);var r=Object.assign({},i),s=\"./this.program\",g=(u,w)=>{throw w},l=\"\",C,I;typeof document<\"u\"&&document.currentScript&&(l=document.currentScript.src),t&&(l=t),l.startsWith(\"blob:\")?l=\"\":l=l.substr(0,l.replace(/[?#].*/,\"\").lastIndexOf(\"/\")+1),C=u=>fetch(u,{credentials:\"same-origin\"}).then(w=>w.ok?w.arrayBuffer():Promise.reject(new Error(w.status+\" : \"+w.url)));var d=console.log.bind(console),B=console.error.bind(console);Object.assign(i,r),r=null;var Q;function E(u){for(var w=atob(u),S=new Uint8Array(w.length),T=0;T<w.length;++T)S[T]=w.charCodeAt(T);return S}function f(u){if(Ke(u))return E(u.slice(ze.length))}var b,R=!1,M,v,F,G,U,Y,j,AA;function z(){var u=b.buffer;i.HEAP8=M=new Int8Array(u),i.HEAP16=F=new Int16Array(u),i.HEAPU8=v=new Uint8Array(u),i.HEAPU16=new Uint16Array(u),i.HEAP32=G=new Int32Array(u),i.HEAPU32=U=new Uint32Array(u),i.HEAPF32=Y=new Float32Array(u),i.HEAPF64=AA=new Float64Array(u),i.HEAP64=j=new BigInt64Array(u),i.HEAPU64=new BigUint64Array(u)}var yA=[],P=[],nA=[];function eA(){Et(yA)}function dA(){!i.noFSInit&&!L.initialized&&L.init(),L.ignorePermissions=!1,Et(P)}function iA(){Et(nA)}function aA(u){P.unshift(u)}var hA=0,JA=null;function ee(u){return u}function UA(u){hA++}function mA(u){if(hA--,hA==0&&JA){var w=JA;JA=null,w()}}function KA(u){u=\"Aborted(\"+u+\")\",B(u),R=!0,u+=\". Build with -sASSERTIONS for more info.\";var w=new WebAssembly.RuntimeError(u);throw o(w),w}var ze=\"data:application/octet-stream;base64,\",Ke=u=>u.startsWith(ze);function HA(){var u=\"data:application/octet-stream;base64,AGFzbQEAAAABmAd0YAJ/fwF/YAF/AGABfwF/YAN/f38Bf2ACf38AYAN/f38AYAR/f39/AX9gBH9/f38AYAV/f39/fwF/YAZ/f39/f38Bf2AFf39/f38AYAZ/f39/f38AYAh/f39/f39/fwF/YAAAYAABf2AHf39/f39/fwF/YAF8AXxgAn9/AXxgAX8BfGAHf39/f39/fwBgA39/fwF8YAd/f39/fHx/AGACf3wAYAR8fHx/AXxgAnx8AXxgA398fABgBX9+fn5+AGAEf39/fABgCn9/f39/f39/f38Bf2ADf35/AX5gBH9/fHwBf2ADfHx8AXxgCX9/f39/f39/fwBgA39/fgBgAAF8YAR/f39/AXxgAn9/AX5gBX9/f39+AX9gA39/fgF/YAp/f39/f39/f39/AGAEf35+fwBgBH9/fH8AYAJ/fgBgAnx/AXxgBH9/f3wBf2ABfwF+YAJ/fgF/YAJ/fAF/YAN8fH8BfGADf3x/AGAIf39/f39/f38AYAV/f39/fAF/YAt/f39/f39/f39/fwF/YAN/f3wAYAV/f35/fwBgBH9/fH8Bf2AAAX5gB39/f398f38Bf2AFf39/f3wAYAN/f3wBf2ADf35/AX9gAn19AX1gBH9/fX8AYAZ/fHx8fHwBfGADf39/AX5gDH9/f39/f39/f39/fwF/YAV/f3x/fwF/YAd/f398fH9/AGAGf39/fH9/AGAGf39/f35/AX9gD39/f39/f39/f39/f39/fwBgBH9/f38BfmAGf3x/f39/AX9gB39/f39/fn4Bf2AGf39/f35+AX9gB39/f39+f38Bf2AGf39/f39+AX9gAn5/AGAEf35/fwF/YAR/f3x8AXxgBX9/fH9/AGAJf39/f39/f39/AX9gBH9/fHwAYAR+fn5+AX9gAn99AX9gAn5/AX9gCH9/f398fHx/AGADf31/AGAGf39+fn5/AGABfAF/YAJ+fgF9YAJ/fQBgBH9/f34BfmAGf31/f39/AGADf3x8AX9gBX9/f3x/AGAFf398fH8AYAZ8fHx/f38AYAJ+fgF8YAJ8fwF/YAR/fHx8AGAGf39/f398AGAEf3x/fwBgBnx8f3x8fwBgB398fHx8fHwAYAV/fHx8fAF/YAF/AX1gA39/fwF9YAN+fn4Bf2AEf35+fgBgBH98f38Bf2AKf3x/f39/f39/fwBg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AgBB9ekDIAJBEGoQIBoQLwALFwBBAUF/IAAgASABEEAiABChAiAARhsLJQEBfyAAKAIsIgBBAEGAASAAKAIAEQMAIgAEfyAAKAIQBUEACws0AQF/AkAgACABEOYBIgFFDQAgACgCLCIAIAFBCCAAKAIAEQMAIgBFDQAgACgCECECCyACC28BAX8jAEEgayIDJAAgA0IANwMYIANCADcDECADIAI2AgwCQCADQRBqIAEgAhCzCiIBQQBIBEAgA0H8gAsoAgAQswU2AgBBioAEIAMQNwwBCyAAIANBEGoiABCNBSABEKECGiAAEFwLIANBIGokAAszAQF/IAIEQCAAIQMDQCADIAEtAAA6AAAgA0EBaiEDIAFBAWohASACQQFrIgINAAsLIAALJAEBfyMAQRBrIgMkACADIAI2AgwgACABIAIQzQsgA0EQaiQAC6QBAQN/IwBBEGsiAiQAAkAgABAtIgMgACgCAEEDcSAAKQMIEOgJIgEEfyABKAIYBUEACyIBDQAgAygCTCIBKAIAKAIMIgMEQCABKAIIIAAoAgBBA3EgACkDCCADESYAIgENAQtBACEBIAAoAgBBA3FBAkYNACACIAApAwg3AwggAkElNgIAQfDdCiEBQfDdCkEgQeAXIAIQtAEaCyACQRBqJAAgAQsPACAAIAEgAiADQQAQ8QsLQwAgACAAIAGlIAG9Qv///////////wCDQoCAgICAgID4/wBWGyABIAC9Qv///////////wCDQoCAgICAgID4/wBYGwsUACAAECgEQCAALQAPDwsgACgCBAsVACAAEKMBBEAgACgCBA8LIAAQpQMLowEBAn8CQAJAIAAEQCAAKAIIIgMgACgCDCICRgRAIAAgA0EBdEEBIAMbIAEQ/AEgACgCDCECCyACRQ0BIAAoAggiAyACTw0CIAAgACgCBCADaiACcCICIAEQ3wEaIAAgACgCCEEBajYCCCACDwtB0dMBQYm4AUE7QdbDARAAAAtBr5UDQYm4AUHDAEHWwwEQAAALQZoMQYm4AUHEAEHWwwEQAAALJgAgACABEK4HIgFFBEBBAA8LIAAQ7AEoAgwgASgCEEECdGooAgALLgAgAC0ADyIAQQFqQf8BcUERTwRAQbS7A0Gg/ABB3ABB6ZcBEAAACyAAQf8BRwtDACAAIAAgAaQgAb1C////////////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AkHYmQshASAAQdiZC0EYEM4BRQ0CQRgQTyIBRQ0BCyABIAIpAgg3AgAgASACKQIYNwIQIAEgAikCEDcCCAwBC0EAIQELIAJBIGokAEHkmwtBAToAAEHgmwsgATYCACABC60BAgF/An4CQAJAIAAEQCABBEAgAEEAEL8CIgMoAvQDDQIgAykDsAQiBCABQQhrIgEoAgBBCGqtIgVUDQMgAyAEIAV9IgQ3A7AEIAMoAsAEQQJPBEAgA0EtIAUgBCADKQO4BCACEJEECyABIAAoAhQRAQALDwtBsdQBQZ+9AUGKB0GonwEQAAALQbDSAUGfvQFBkQdBqJ8BEAAAC0HjqAFBn70BQZoHQaifARAAAAsJACAAQQAQ2AYLvwoCBX8PfiMAQeAAayIFJAAgBEL///////8/gyEMIAIgBIVCgICAgICAgICAf4MhCiACQv///////z+DIg1CIIghDiAEQjCIp0H//wFxIQcCQAJAIAJCMIinQf//AXEiCUH//wFrQYKAfk8EQCAHQf//AWtBgYB+Sw0BCyABUCACQv///////////wCDIgtCgICAgICAwP//AFQgC0KAgICAgIDA//8AURtFBEAgAkKAgICAgIAghCEKDAILIANQIARC////////////AIMiAkKAgICAgIDA//8AVCACQoCAgICAgMD//wBRG0UEQCAEQoCAgICAgCCEIQogAyEBDAILIAEgC0KAgICAgIDA//8AhYRQBEAgAiADhFAEQEKAgICAgIDg//8AIQpCACEBDAMLIApCgICAgICAwP//AIQhCkIAIQEMAgsgAyACQoCAgICAgMD//wCFhFAEQCABIAuEQgAhAVAEQEKAgICAgIDg//8AIQoMAwsgCkKAgICAgIDA//8AhCEKDAILIAEgC4RQBEBCACEBDAILIAIgA4RQBEBCACEBDAILIAtC////////P1gEQCAFQdAAaiABIA0gASANIA1QIgYbeSAGQQZ0rXynIgZBD2sQsQFBECAGayEGIAUpA1giDUIgiCEOIAUpA1AhAQsgAkL///////8/Vg0AIAVBQGsgAyAMIAMgDCAMUCIIG3kgCEEGdK18pyIIQQ9rELEBIAYgCGtBEGohBiAFKQNIIQwgBSkDQCEDCyADQg+GIgtCgID+/w+DIgIgAUIgiCIEfiIQIAtCIIgiEyABQv////8P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AQRAIAEoAgQiAkUNAQNAIAEgAigCADYCBCACIAE2AgAgAiIBKAIEIgINAAsgBCABNgIADAELCyAAKAIIIQULIAAgAzYCDCAAIAVBgCByNgIIIAMLoQEBAn8CQCAAECVFIAIgAWtBBUhyDQAgASACEJYFIAJBBGshBCAAEEYiAiAAECVqIQUCQANAAkAgAiwAACEAIAEgBE8NACAAQQBMIABB/wBOckUEQCABKAIAIAIsAABHDQMLIAFBBGohASACIAUgAmtBAUpqIQIMAQsLIABBAEwgAEH/AE5yDQEgAiwAACAEKAIAQQFrSw0BCyADQQQ2AgALC4QBAQJ/IwBBEGsiAiQAIAAQowEEQCAAKAIAIAAQ9gIaEKEFCyABECUaIAEQowEhAyAAIAEoAgg2AgggACABKQIANwIAIAFBABDTASACQQA6AA8gASACQQ9qENIBAkAgACABRiIBIANyRQ0ACyAAEKMBIAFyRQRAIAAQpQMaCyACQRBqJAALUAEBfgJAIANBwABxBEAgASADQUBqrYYhAkIAIQEMAQsgA0UNACACIAOtIgSGIAFBwAAgA2utiIQhAiABIASGIQELIAAgATcDACAAIAI3AwgLzgkCBH8EfiMAQfAAayIGJAAgBEL///////////8AgyEJAkACQCABUCIFIAJC////////////AIMiCkKAgICAgIDA//8AfUKAgICAgIDAgIB/VCAKUBtFBEAgA0IAUiAJQoCAgICAgMD//wB9IgtCgICAgICAwICAf1YgC0KAgICAgIDAgIB/URsNAQsgBSAKQoCAgICAgMD//wBUIApCgICAgICAwP//AFEbRQRAIAJCgICAgICAIIQhBCABIQMMAgsgA1AgCUKAgICAgIDA//8AVCAJQoCAgICAgMD//wBRG0UEQCAEQoCAgICAgCCEIQQMAgsgASAKQoCAgICAgMD//wCFhFAEQEKAgICAgIDg//8AIAIgASADhSACIASFQoCAgICAgICAgH+FhFAiBRshBEIAIAEgBRshAwwCCyADIAlCgICAgICAwP//AIWEUA0BIAEgCoRQBEAgAyAJhEIAUg0CIAEgA4MhAyACIASDIQQMAgsgAyAJhFBFDQAgASEDIAIhBAwBCyADIAEgASADVCAJIApWIAkgClEbIggbIQogBCACIAgbIgxC////////P4Mh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9ANFBEAgAykDsAQiIkKAgICAEH1CkHtaDQEgAyAiQvAEfCIiNwOwBCADKALABEECTwRAIANBK0LwBCAiIAMpA7gEIiMgIlQEfiADICI3A7gEICIFICMLQZ8LEJEECyACQRA2ApwDIAJBADYCKCACQQA2AhAgAiABQYACQakLEJgBIgM2AqgDIANFBEAgASABQasLEGdBAAwFCyACIAFBgAhBtgsQmAEiAzYCQCADRQRAIAEgAigCqANBuAsQZyABIAFBvAsQZwwECyACIANBgAhqNgJEQQAiBkUEQCABQbwBQcw6EJgBIgZFDQMgBkIANwJQIAZCADcCaCAGIAE2AmQgBiABNgJ8IAZCADcCCCAGQQA6AAQgBkIANwIcIAZBADoAGCAGIAE2AhAgBkEANgIAIAZCADcCMCAGQQA6ACwgBiABNgIkIAZBADYCFCAGQQA2AmAgBkIANwJYIAZCADcCcCAGQQA2AnggBkIANwJEIAZBADoAQCAGIAE2AjggBkEANgIoIAZBADYCPCAGIAE2AkwgBkIANwKMASAGQQA6AIgBIAZCATcCgAEgBiABNgKUASAGQgA3ApgBIAZBADoAoAEgBkIANwKkASAGQgA3AqwBIAZCADcCtAELIAJBADYCmAMgAiAGNgKEAyACQQA2ApADIAJBADYC0AIgAkEANgLIAiACQQA2AsACIAJCADcD8AMgAkEhOgD4AyACQQA2AogCIAJBADYCkAEgAkEAOwH8ASACQgA3AsADIAJBADYC+AEgAkIANwKsAyACIAE2AtQDIAJCADcCyAMgAkEANgLQAyACQQA6ALQDIAJBADYC6AMgAkIANwLgAyACQgA3AtgDIAIgATYC7AMgAUHPATYCoAIgAUGbATYCiAIgAUEANgKcAiABQoCAgIAQNwKUAiAFBEBBACEGA0AgBSAGaiAGQQFqIQYtAAANAAsgASAGQYjCABCYASIDBEAgAyAFIAYQHxoLIAEgAzYC8AELIAFBADYCgAMgAUGgAWogAUGcAWpBABDBBhogAUIANwMAIAFBQGtBAEHAABA4GiABQgA3AowBIAFBADYChAEgAUIANwKUASABQgA3A7ADIAFBADYCNCABQQE6ADAgAUEANgIsIAFCADcCJCABQQA2AsQCIAFBADYCvAIgAUIANwKkAiABQgA3AqwCIAFBADYCtAIg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akECED0MGgUgESADQQR0IhJqIhQgASASaiISKQMANwMAIBQgEikDCDcDCCADQQFqIQMMAQsACwALIAJBAmoiA0EQEBoiAiABKQMINwMIIAIgASkDADcDACACIBApAyA3AxAgAiAQKQMoNwMYIAIgECsDICAQKwMwIgYgECsDQKFEAAAAAAAACECjIgegOQMgIBArAyghCCAQKwNIIQkgECsDOCEFIAIgBiAHoDkDMCACIAUgBSAJoUQAAAAAAAAIQKMiBaA5AzggAiAIIAWgOQMoQQQgAyADQQRNGyERIAFBIGshE0EEIQEDQCABIBFGBEAgACACIAMgBBBIIAIQGCAPIBApAzg3AyggDyAQKQMwNwMgIA8gECkDKDcDOCAPIBApAyA3AzAgACAPQSBqQQIQPQwZBSACIAFBBHQiEmoiFCASIBNqIhIpAwA3AwAgFCASKQMINwMIIAFBAWohAQwBCwALAAsgAkEDaiIDQRAQGiICIAFBCGopAwA3AwggAiABKQMANwMAIAIgASsDACIFIAUgECsDEKEiBkQAAAAAAADQv6KgOQMQIAErAwghCCAQKwNIIQkgAiAQKwM4Igc5AzggAiAFIAZEAAAAAAAAAsCioDkDMCACIAUgBiAGoKE5AyAgAiAIIAcgCaFEAAAAAAAACECjoCIFOQMoIAIgBTkDGCAQKwMwIQUgAiAHOQNIIAIgBTkDQEEEIAMgA0EETRshESABQTBrIRNBBCEBA0AgASARRgRAIAAgAiADIAQQSCACEBgMGAUgAiABQQR0IhJqIhQgEiATaiISKQMANwMAIBQgEikDCDcDCCABQQFqIQEMAQsACwALIAJBBEcNG0EGQRAQGiICIAEpAwg3AwggAiABKQMANwMAIAIgECkDKDcDGCACIBApAyA3AxAgAiAQKQNINwMoIAIgECkDQDcDICACIAEpAyg3AzggAiABKQMgNwMwIAIgECkDgAE3A0AgAiAQKQOIATcDSCACIBApA6ABNwNQIAIgECkDqAE3A1ggACACQQYgBBBIIAIQGCAPIBArAxAgECsDsAEgECsDAKGgOQMgIA8gECsDGCAQKwO4ASAQKwMIoaA5AyggDyAQKQNINwM4IA8gECkDQDcDMCAAIA9BIGoiAUECED0gDyAQKQOIATcDOCAPIBApA4ABNwMwIAAgAUECED0gDyAQ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AgsgACABNwMAIAAgAjcDCAvbAQIBfwJ+QQEhBAJAIABCAFIgAUL///////////8AgyIFQoCAgICAgMD//wBWIAVCgICAgICAwP//AFEbDQAgAkIAUiADQv///////////wCDIgZCgICAgICAwP//AFYgBkKAgICAgIDA//8AURsNACAAIAKEIAUgBoSEUARAQQAPCyABIAODQgBZBEAgACACVCABIANTIAEgA1EbBEBBfw8LIAAgAoUgASADhYRCAFIPCyAAIAJWIAEgA1UgASADURsEQEF/DwsgACAChSABIAOFhEIAUiEECyAECxYAIABFBEBBAA8LQfyACyAANgIAQX8LCwAgACABIAIRAAALZAECfyMAQRBrIgMkAAJAIABBABCxAiIARQ0AAkACQAJAAkAgAQ4EAAECAgMLIAAoAhAhAgwDCyAAKAIIIQIMAgsgACgCDCECDAELIAMgATYCAEHExQQgAxA3CyADQRBqJAAgAgukAQIDfwJ8IwBBEGsiAiQAIAAQwQIgACgCECIBKwMYRAAAAAAAAFJAoyEEIAErAxBEAAAAAAAAUkCjIQUgABAcIQEDQCABBEAgASgCECgClAEiAyADKwMAIAWhOQMAIAMgAysDCCAEoTkDCCAAIAEQHSEBDAELCyACIAAoAhAiASkDGDcDCCACIAEpAxA3AwAgACACEMAMIABBARDKBSACQRBqJAALDwAgAUEBaiAAIAAQqgGfC6gBAgR/AnwgASgCACECIABBBGoiAyEAIAMhAQNAIAAoAgAiAARAIAAoAhAiBCsDCCIGIAIrAwgiB2MEQCAAQQRqIQAMAgUgACABIAAgAiAESyIEGyAGIAdkIgUbIQEgACAAIARBAnRqIAUbIQAMAgsACwsCQAJAIAEgA0YNACACKwMIIgYgASgCECIAKwMIIgdjDQAgACACTSAGIAdkcg0BCyADIQELIAELZAEBfyMAQRBrIgQkACAAQQA7ARwgAEEANgIYIAAgAzkDCCAAIAI2AgQgACABNgIAIAQgADYCDCABQTRqIARBDGoQwAEgACgCBCAEIAA2AghBKGogBEEIahDAASAEQRBqJAAgAAs8ACAAIAEQ0gIEQCAAEMMEDwsgABD9ByIBRQRAQQAPCyAAIAEQ/AchACABEG0gACAALQAkQQNyOgAkIAALrAEBAX8CQCAAECgE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IAUgBCsDCDkDECAFQShqIAMgFiAUIAsRHgBFBEAgBUIANwNYIAUgAzYCACAFIAc2AhggB0EBaiEHIAAgAxAdIQMMAQsLQZj/CigCABAYQZj/CkEANgIAENcMDAILQQAhByACQbADakEAQdAAEDgaIAUEQEGY/wooAgAhBET////////vfyEURP///////+//IRhE////////7/8hG0T////////vfyEZA0AgBSAHRgRARJqZmZmZmak/IRYCQCAAQdLkABAnIgBFDQAgAC0AAEUNACAAEK4CIRYLQbD/CiAbIBsgGaEgFqIiE6AiFzkDAEG4/wogGSAToSIVOQMAQaj/CiAUIBggFKEgFqIiE6EiFDkDAEGg/wogGCAToCITOQMAIAIgFTkD2AMgAiAXOQPoAyACIBU5A7gDIAIgEzkD0AMgAiAXOQPIAyACIBQ5A/ADIAIgEzkDwAMgAiAUOQPgAyABKAIAIQBBABDQByELAkACQCAAQQJGBEAgC0UNAiACQbADahDWDEEAIQMDQEGY/wooAgAhAUHk/gooAgAhAEEAIQQDQCAAIARHBEAgASAEQeAAbGoiCyALKwMIRM3MzMzMzPA/ojkDCCALIAsrAxBEzczMzMzM8D+iOQMQIARBAWohBAwBCwsgA0EBaiIDENAHDQALQezaCi0AAEUNASACIAM2AhBBiPYIKAIAQezdAyACQRBqECAaDAELIAtFDQEgAkGwA2oQ1gxBACEHQQAhBANAIAJBsANqIgEhACAHBEAgABDUDAtB+P4KQv////////93NwMAQfD+CkL/////////9/8ANwMAAkBB5P4KKAIAIgUEQCAAKAIAIQZE////////738hFET////////v/yEWQQAhAANAIAAgBUYNAkHw/gogFCAGIABBAnRqKAIAIgMrAwAQKSIUOQMAQfj+CiAWIAMrAwAQIyIWOQMAIABBAWohAAwACwALQeGVA0H8twFBzwFBzJIBEAAAC0GA/wogBigCACsDCDkDACAGIAVBAnRqQQRrKAIAKwMIIRNBkP8KIBYgFKE5AwBBiP8KIBM5AwBEAAAAAAAAAAAhFUQAAAAAAAAAACEUIwBBMGsiDiQAQQFBEBAaIg9B6P4KKAIAQQJ0IgA2AgQgDyAAQSgQGjYCAEHA/wogARDNBTYCACAOQgA3AyggDkIANwMgIA5CADcDGCMAQSBrIgUkAAJAAkACQCAOQRhqIgYEQCAGQgA3AgAgBkIANwIQIAZCADcCCCAGQej+CigCACIDQQF0IgA2AgggAEGAgICABE8NAUEAIAMgAEEEEE4iABsNAiAGIAA2AgwgBiAGQQBBABC3BDYCECAGIAZBAEEAELcEIgM2AhQgBigCECIAIAM2AgQgAEEANgIAIANBADYCBCADIAA2AgAgBigCDCAANgIAIAYoAgwgBigCCEECdGpBBGsgBigCFDYCACAFQSBqJAAMAwtB09MBQZK6AUEdQfaIARAAAAsgBUEENgIEIAUgADYCAEGI9ggoAgBBpuoDIAUQIBoQLwALIAUgA0EDdDYCEEGI9ggoAgBB9ekDIAVBEGoQIBoQLwALIAEQzQUhEANAIA8Q1AdFBEAgDygCDCEGIA8oAgAhAANAIAAgBkEobGooAiAiA0UEQCAPIAZBAWoiBjYCDAwBCwsgDiADKAIQKwMAOQMIIA4gAysDGDkDECAOKwMQIRUgDisDCCEUCwJAIBBFDQACQCAPENQHDQAgECsDCCITIBVjDQAgEyAVYg0BIBArAwAgFGNFDQELAn9BACEFAkAgDkEYaiIIBEAgCCgCCCIAQQBMDQECQCAQKwMAQfD+CisDAKFBkP8KKwMAoyAAt6IiE0QAAAAAAAAAAGMNACATIABBAWsiBbhkDQAgE5lEAAAAAAAA4EFjBEAgE6ohBQwBC0GAgICAeCEFCwJAIAggBRDSByIGDQBBASEDA0AgCCAFIANrENIHIgYNASADIAVqIQAgA0EBaiEDIAggABDSByIGRQ0ACwsgCCgCFCEDAkACQCAIKAIQIgAgBkcEQCADIAZGDQEgBiAQENEHRQ0BCwNAIAMgBigCBCIGRwRAIAYgEBDRBw0BCwsgBigCACEGDAELA0AgBigCACIGIABGDQEgBiAQENEHRQ0ACwsCQCAFQQBMDQAgBSAIKAIIQQFrTg0AIAgoAgwgBUECdGogBjYCAAsgBgwCC0HT0wFBkroBQbcBQZClARAAAAtBvTdBkroBQawBQdTZABAAAAsiDSgCBCEFIA0gCCANEN0MIBAgCBDjDCIDQQAQtwQiBhDTByANIAYgCBDOBSIABEAgDyANENUHIA8gDSAAIAAgEBDPBRDQBQsgBiAOQRhqIgAgA0EBELcEIgMQ0wcgAyAFIAAQzgUiAARAIA8gAyAAIAAgEBDPBRDQBQsgARDNBSEQDAELIA8Q1AdFBEAgDygCACAPKAIMQShsaiIAIAAoAiAiCCgCIDYCICAPIA8oAghBAWs2AgggCCgCACEKIAgoAgQiBSgCBCEDIAgoAggiAAR/IABBJEEgIAgtAAwbagVBwP8KCygCACENIAUQ3QwhACAIKAIIIAgsAAwgCCgCECIGIA5BGGoiBxDWByAFKAIIIAUsAAwgBiAHENYHIAgQ3wwgDyAFENUHIAUQ3wwgCiAHIAAgDSANKwMIIAArAwhkIggbIgUgDSAAIAgbIAcQ4wwiACAIELcEIg0Q0wcgACAIRSAGIAcQ1gcgCiANIAcQzgUiAARAIA8gChDVByAPIAogACAAIAUQzwUQ0AULIA0gAyAOQRhqEM4FIgBFDQEgDyANIAAgACAFEM8FENAFDAELCyAOKAIoKAIEIQADQCAOKAIsIABHBEAgACgCCBDiDCAAKAIEIQAMAQsLAkAgDkEYagRAIA4oAhghAQNAIAEEQCABKAIAIQAgARAYIA4gADYCGCAAIQEMAQsLIA5CADcCGAwBC0HQ1gFB4b4BQacBQckhEAAACyAOKAIkEBggDxCOCCAOQTBqJAAgAkGY/wooAgAiACkDEDcD+AIgAiAAKQMINwPwAiACIAIpA+ADNwPoAiACIAIpA9gDNwPgAiACQfACaiACQeACahD/AiEWIAIgACkDEDcD2AIgAiAAKQMINwPQAiACIAIpA8ADNwPIAiACIAIpA7gDNwPAAiACQdACaiACQcACahD/AiEUIAIgACkDEDcDuAIgAiAAKQMINwOwAiACIAIpA/ADNwOoAiACIAIpA+gDNwOgAiACQbACaiACQaACahD/AiEZIAIgACkDEDcDmAIgAiAAKQMINwOQAiACIAIpA9ADNwOIAiACIAIpA8gDNwOAAkEBIQcgAkGQAmogAkGAAmoQ/wIhGCAAIgMiCiEBA0BB5P4KKAIAIAdLBEAgAkGY/wooAgAgB0HgAGxqIgUpAxA3A5gBIAIgBSkDCDcDkAEgAiACKQPgAzcDiAEgAiACKQPYAzcDgAEgAkGQAWogAkGAAWoQ/wIhGiACIAUpAxA3A3ggAiAFKQMINwNwIAIgAikD8AM3A2ggAiACKQPoAzcDYCACQfAAaiACQeAAahD/AiEXIAIgBSkDEDcDWCACIAUpAwg3A1AgAiACKQPAAzcDSCACIAIpA7gDNwNAIAJB0ABqIAJBQGsQ/wIhFSACIAUpAxA3AzggAiAFKQMINwMwIAIgAikD0AM3AyggAiACKQPIAzcDICAFIAAgFiAaZCIIGyEAIAUgCiAXIBljIg0bIQogBSADIBQgFWQiBhshAyAFIAEgAkEwaiACQSBqEP8CIhMgGGMiBRshASAaIBYgCBshFiAXIBkgDRshGSAVIBQgBhshFCATIBggBRshGCAHQQFqIQcMAQsLIABBCGogAisD2AMgAisD4AMQ/gIgCkEIaiACKwPoAyACKwPwAxD+AiADQQhqIAIrA7gDIAIrA8ADEP4CIAFBCGogAisDyAMgAisD0AMQ/gJBACEBQZj/CigCACEIQeT+CigCACENIAQhAwNAIAEgDUcEQCAIIAFB4ABsaiEHAkAgA0UEQCAHLQAgQQFHDQELQQIgBygCXCIAIABBAk0bQQFrIQYgBygCWCIKKwMIIRkgCisDACEcQQEhBEQAAAAAAAAAACEWRAAAAAAAAAAAIRhEAAAAAAAAAAAhGwNAIAQgBkcEQCAbIAogBEEBaiIAQQR0aiIFKwMAIhQgGSAKIARBBHRqIgQrAwgiGqGiIBwgGiAFKwMIIhehoiAEKwMAIhMgFyAZoaKgoJlEAAAAAAAA4D+iIhWgIRsgFSAZIBqgIBegRAAAAAAAAAhAo6IgGKAhGCAVIBwgE6AgFKBEAAAAAAAACECjoiAWoCEWIAAhBAwBCwsgByAYIBujOQMQIAcgFiAbozkDCAsgAUEBaiEBDAELCyAMQQFqIgwQ0AciAARAIAAgC0khAUEBIQdBASEEIAAhC0EAIAlBAWogARsiCUUNAUG4/wpBuP8KKwMAIhNBsP8KKwMAIhQgE6FEmpmZmZmZqT+iIhOhIho5AwBBsP8KIBQgE6AiFzkDAEGo/wpBqP8KKwMAIhNBoP8KKwMAIhQgE6FEmpmZmZmZqT+iIhOhIhU5AwBBoP8KIBQgE6AiEzkDACACIBo5A9gDIAIgFzkD6AMgAiAaOQO4AyACIBM5A9ADIAIgFzkDyAMgAiAVOQPwAyACIBM5A8ADIAIgFTkD4AMgEUEBaiERDAELC0Hs2gotAABFDQBBiPYIKAIAIgYQ1QEgAhDWATcDgAQgAkGABGoiCRDrASIFKAIUIQsgBSgCECEDIAUoAgwhBCAFKAIIIQEgBSgCBCEAIAIgBSgCADYC/AEgAiAANgL4ASACIAE2AvQBIAIgBDYC8AEgAkHIAzYC5AEgAkH8twE2AuABIAIgA0EBajYC7AEgAiALQewOajYC6AEgBkHGygMgAkHgAWoQIBogAiAMNgLQASAGQY8YIAJB0AFqECAaQQogBhCnARogBhDUAUHs2gotAABFDQAgBhDVASACENYBNwOABCAJEOsBIgkoAhQhCyAJKAIQIQMgCSgCDCEEIAkoAgghASAJKAIEIQAgAiAJKAIANgLMASACIAA2AsgBIAIgATYCxAEgAiAENgLAASACQckDNgK0ASACQfy3ATYCsAEgAiADQQFqNgK8ASACIAtB7A5qNgK4ASAGQcbKAyACQbABahAgGiACIBE2AqABIAZBqRggAkGgAWoQIBpBCiAGEKcBGiAGENQBC0EAIQRBmP8KKAIAIQNB5P4KKAIAIQFBASEKA0AgASAERg0BIAMgBEHgAGxqIgsoAgAoAhAoApQBIgAgCysDCDkDACAAIAsrAxA5AwggBEEBaiEEDAALAAsQ1wwgAigCsAMQGCAKIBJqIRIMBAUgBCAHQeAAbGoiAysDKCEaIAMrAwghHCADKwMwIRcgAysDOCEVIAdBAWohByAYIAMrAxAiEyADKwNAoBAjIRggGyAcIBWgECMhGyAUIBMgF6AQKSEUIBkgHCAaoBApIRkMAQsACwALQeGVA0H8twFB3gBBphIQAAALQYuaA0H8twFB/QBBj98AEAAACyACQaAEaiQAIBILsgMCB38BfSMAQSBrIgQkACACQQAgAkEAShshBwNAIAUgB0YEQCADIABBAnRqQQA2AgAgBEEANgIYIARCADcDECAEQgA3AwggBCAANgIcIARBCGpBBBAmIQAgBCgCCCAAQQJ0aiAEKAIcNgIAIARBHGohCEH/////ByEAA0ACQCAEKAIQRQRAIABBCmohAEEAIQUDQCAFIAdGDQIgAyAFQQJ0aiIBKAIAQQBIBEAgASAANgIACyAFQQFqIQUMAAsACyAEQQhqIAgQoQQgASAEKAIcIgBBFGxqIQIgAyAAQQJ0aigCACEAQQEhBQNAIAUgAigCAE8NAiADIAVBAnQiBiACKAIEaigCACIJQQJ0aiIKKAIAQQBIBEAgCgJ/QQEgASgCCEUNABogAigCCCAGaioCACILi0MAAABPXQRAIAuoDAELQYCAgIB4CyAAajYCACAEIAk2AhwgBEEIakEEECYhBiAEKAIIIAZBAnRqIAQoAhw2AgALIAVBAWohBQwACwALCyAEQQhqIgBBBBAxIAAQNCAEQSBqJAAFIAMgBUECdGpBfzYCACAFQQFqIQUMAQsLCzIBAX8gAEEAIABBAEobIQADQCAAIANGRQRAIAIgA0ECdGogATgCACADQQFqIQMMAQsLC0gBAn8gAEEAIABBAEobIQMDQCACIANGBEAgAQRAIAEQGAsPCyABIAJBAnRqKAIAIgAEQCAAELUNCyAAEBggAkEBaiECDAALAAsQAEEgEIkBIAAgASACEK8DCwoAIAAoAgQQvQQLhAIBBn8jAEEQayIEJAAjAEEQayIDJAAgASIHQQRqIQUCQCABKAIEIgZFBEAgBSEBDAELIAIoAgAhCANAIAYiASgCECIGIAhLBEAgASEFIAEoAgAiBg0BDAILIAYgCE8NASABQQRqIQUgASgCBCIGDQALCyADIAE2AgwgBCAFKAIAIgEEf0EABUEUEIkBIQEgAyAHQQRqNgIEIAEgAigCADYCECADQQE6AAggByADKAIMIAUgARDdBSADQQA2AgAgAygCACECIANBADYCACACBEAgAhAYC0EBCzoADCAEIAE2AgggA0EQaiQAIAAgBCgCCDYCACAAIAQtAAw6AAQgBEEQaiQAC5QQAQh/IwBBQGoiCyQAAkACQAJAAkACQCABQQBMIAJBAExyRQRAIAEgAiAAIAYgB0EAEL8NIgkoAhghDCAJKAIUIQggAUEBaiEKQQAhBwNAIAcgCkYEQAJAIAZBBGsOBQAFBQUGBAsFIAggB0ECdGpBADYCACAHQQFqIQcMAQsLIAhBBGohCiAJKAIcIQ1BACEHQQAhBgNAIAAgBkYEQANAIAEgB0YEQEEAIQcDQCAAIAdGBEADQCABQQBMDQwgCCABQQJ0aiICIAJBBGsoAgA2AgAgAUEBayEBDAALAAUgDSAIIAMgB0ECdCICaiIGKAIAQQJ0aigCAEECdGogAiAFaigCADYCACACIARqKAIAIQIgCCAGKAIAQQJ0aiIGIAYoAgAiBkEBajYCACAMIAZBAnRqIAI2AgAgB0EBaiEHDAELAAsABSAHQQJ0IQIgCCAHQQFqIgdBAnRqIgYgBigCACACIAhqKAIAajYCAAwBCwALAAsCQCADIAZBAnQiDmooAgAiDyABTw0AIAQgDmooAgAgAk8NACAKIA9BAnRqIg4gDigCAEEBajYCACAGQQFqIQYMAQsLIAtB1wM2AiQgC0GWtwE2AiBBiPYIKAIAQdi/BCALQSBqECAaEDsAC0HOlgNBlrcBQbQDQYXxABAAAAsgBkEBRg0CCyALQfMDNgIEIAtBlrcBNgIAQYj2CCgCAEHYvwQgCxAgGhA7AAsgCEEEaiEFQQAhB0EAIQYDQCAAIAZGBEADQCABIAdGBEBBACEHA0AgACAHRgRAA0AgAUEATA0IIAggAUECdGoiAiACQQRrKAIANgIAIAFBAWshAQwACwAFIAQgB0ECdCICaigCACEFIAggAiADaigCAEECdGoiAiACKAIAIgJBAWo2AgAgDCACQQJ0aiAFNgIAIAdBAWohBwwBCwALAAUgB0ECdCECIAggB0EBaiIHQQJ0aiIFIAUoAgAgAiAIaigCAGo2AgAMAQsACwALAkAgAyAGQQJ0IgpqKAIAIg0gAU8NACAEIApqKAIAIAJPDQAgBSANQQJ0aiIKIAooAgBBAWo2AgAgBkEBaiEGDAELCyALQecDNgI0IAtBlrcBNgIwQYj2CCgCAEHYvwQgC0EwahAgGhA7AAsgCEEEaiEKIAkoAhwhDUEAIQdBACEGA0AgACAGRgRAA0AgASAHRgRAQQAhBwNAIAAgB0YEQANAIAFBAEwNByAIIAFBAnRqIgIgAkEEaygCADYCACABQQFrIQEMAAsABSANIAggAyAHQQJ0IgZqKAIAQQJ0aiIKKAIAIgJBA3RqIAUgB0EDdGorAwA5AwAgBCAGaigCACEGIAogAkEBajYCACAMIAJBAnRqIAY2AgAgB0EBaiEHDAELAAsABSAHQQJ0IQIgCCAHQQFqIgdBAnRqIgYgBigCACACIAhqKAIAajYCAAwBCwALAAsCQCADIAZBAnQiDmooAgAiDyABTw0AIAQgDmooAgAgAk8NACAKIA9BAnRqIg4gDigCAEEBajYCACAGQQFqIQYMAQsLIAtBxQM2AhQgC0GWtwE2AhBBiPYIKAIAQdi/BCALQRBqECAaEDsACyAIQQA2AgAgCSAANgIIAn9BACEDQQAhBiAJIgEoAgQiAEEAIABBAEobIQkgASgCECECIAEoAhghBCABKAIUIQUgAEEEED8hBwJAAkACQAJAAkACQAJAA0AgAyAJRgRAAkBBACEDIAJBBGsOBQMGBgYEAAsFIAcgA0ECdGpBfzYCACADQQFqIQMMAQsLIAJBAUcNAyAFKAIAIQAgASgCHCEJA0AgBiABKAIATg0DIAUgBkECdGohCiAFIAZBAWoiBkECdGohCANAIAgoAgAiAiAASgRAAkAgByAEIABBAnRqIg0oAgAiAkECdGooAgAiDCAKKAIASARAIAQgA0ECdGogAjYCACAJIANBA3RqIAkgAEEDdGorAwA5AwAgByANKAIAQQJ0aiADNgIAIANBAWohAwwBCyAEIAxBAnRqKAIAIAJHDQggCSAMQQN0aiICIAkgAEEDdGorAwAgAisDAKA5AwALIABBAWohAAwBCwsgCCADNgIAIAIhAAwACwALIAUoAgAhACABKAIcIQkDQCAGIAEoAgBODQIgBSAGQQJ0aiEKIAUgBkEBaiIGQQJ0aiEIA0AgCCgCACICIABKBEACQCAHIAQgAEECdCICaiINKAIAIgxBAnRqKAIAIg4gCigCAEgEQCAEIANBAnQiDmogDDYCACAJIA5qIAIgCWooAgA2AgAgByANKAIAQQJ0aiADNgIAIANBAWohAwwBCyAMIAQgDkECdCINaigCAEcNCCAJIA1qIgwgDCgCACACIAlqKAIAajYCAAsgAEEBaiEADAELCyAIIAM2AgAgAiEADAALAAsgBSgCACEAA0AgBiABKAIATg0BIAUgBkECdGohCCAFIAZBAWoiBkECdGohCQNAIAkoAgAiAiAASgRAAkAgByAEIABBAnRqIgwoAgAiAkECdGooAgAiCiAIKAIASARAIAQgA0ECdGogAjYCACAHIAwoAgBBAnRqIAM2AgAgA0EBaiEDDAELIAQgCkECdGooAgAgAkcNCAsgAEEBaiEADAELCyAJIAM2AgAgAiEADAALAAsgASADNgIIIAEhAwsgBxAYIAMMAwtBtscBQZa3AUG4B0G8LxAAAAtBtscBQZa3AUHMB0G8LxAAAAtBtscBQZa3AUHeB0G8LxAAAAsgC0FAayQACzwBAn8jAEEQayIBJABBASAAEE4iAkUEQCABIAA2AgBBiPYIKAIAQfXpAyABECAaEC8ACyABQRBqJAAgAgt6AQF/IwBBEGsiBCQAIAMEQCADIAAgAiACEOoFIgI2AghB7NoKLQAABEAgBCACNgIAQYj2CCgCAEHf3QMgBBAgGgsgA0EANgIUIANBADoADCAAIAEgAxCFCBogAygCECAEQRBqJAAPC0HY3gBBo7wBQYYKQYPfABAAAAspAQF/A0AgACIBKAIQKAKwASIADQALA0AgASIAKAIQKAJ4IgENAAsgAAtJAQF8IAEoAhQgABC1AyEBRAAAAAAAAPA/IAAoAiy3IAEoACC4RAAAAAAAAPA/oKOhIAEoAjQiACsDQCAAKwMwIgKhoiACoBAyCz0BAXwgASgCGCAAELUDIQEgACgCLLcgASgAILhEAAAAAAAA8D+goyABKAI0IgArADggACsAKCICoaIgAqALdwECfyMAQRBrIgMkAAJAAkAgAkEATgRAIAIgASgACEkNAQsgAEIANwIAIABCADcCCAwBCyABKAIAIQQgAyABKQIINwMIIAMgASkCADcDACAAIAQgAyACEBlBBHRqIgEpAgA3AgAgACABKQIINwIICyADQRBqJAAL4AECCHwBfyABQSBBGEGE/gotAAAiDBtqKwMAIQQgAiABQRhBICAMG2orAwAiBTkDGCACIAQ5AxAgAiABKQM4NwMAIAIgAUFAaykDADcDCCACIAIrAwAgBEQAAAAAAADgP6KhIgY5AwAgAiACKwMIIAVEAAAAAAAA4D+ioSIHOQMIIAMrAwAhCCADKwMIIQkgAysDECEKIAAgAysDGCILIAUgB6AiBSAFIAtjGzkDGCAAIAogBCAGoCIEIAQgCmMbOQMQIAAgCSAHIAcgCWQbOQMIIAAgCCAGIAYgCGQbOQMAC3wBAXwgAEEATgRAIAFEAAAAAAAAAABjBEBBAA8LIAFEAAAAAAAA8D9kRSAAuCICRAAAwP///99BIAGjZEVyRQRAQf////8HDwsgASACoiIBmUQAAAAAAADgQWMEQCABqg8LQYCAgIB4DwtBz5gDQYf8AEHNAEHO2QAQAAALUQECfEECQQFBAyAAKwMIIAErAwgiA6EgAisDACABKwMAIgShoiACKwMIIAOhIAArAwAgBKGioSIDRAAAAAAAAAAAYxsgA0QAAAAAAAAAAGQbCwsAIABBgdMEEBsaC3EBAX8jAEEQayIFJAAgAEG1xQMQGxogACABEIoBIAIEQCAAQd8AEGUgACACEIoBCyAFIAM2AgAgAEHbMyAFEB4CQCAEQf0oECciAUUNACABLQAARQ0AIABBIBBlIAAgARCKAQsgAEEiEGUgBUEQaiQAC9IBAQZ/IwBBIGsiAiQAIAAoAhAiASgCqAEhAyAAIAErA6ABEHsgAEH0kwQQGxoDQAJAIANFDQAgAygCACIFRQ0AIANBBGohAyAFIgFB8fcAEE1FDQEDQCABIgRBAWohASAELQAADQALA0AgBC0AAQRAIAIgBEEBaiIBNgIQIABBvMgDIAJBEGoQHgNAIAEtAAAgASIEQQFqIQENAAsMAQsLIAVBsy0QTUUEQCAAKAIQQgA3A6ABCyACIAU2AgAgAEGsgwQgAhAeDAELCyACQSBqJAALEABBASAAEEBBAXRBA2oQPwsxAQF/AkAgAUUNACABLQAARQ0AIAAoAjwiAkUNACACKAJwIgJFDQAgACABIAIRBAALC60BAgJ/AnwjAEEgayIDJAACQCAAKAI8IgRFDQAgBCgCYCIERQ0AIAAoAhAoApgBRQ0AIAErABghBSABKwAIIQYgAyABKwAQIAErAACgRAAAAAAAAOA/ojkDACADIAUgBqBEAAAAAAAA4D+iOQMIIAMgASkDGDcDGCADIAEpAxA3AxAgAC0AmQFBIHFFBEAgACADIANBAhCYAhoLIAAgAyACIAQRBQALIANBIGokAAsxAQF/AkAgACgCPCIBRQ0AIAEoAgQiAUUNACAAIAERAQALIAAoAgBBADYCGCAAELEKC68BAQN/An8gARA5IgEoAhAtAHNBAUYEQCAAEJoEDAELIAAgARDSBgsiACIDIQEDQEEAIQICQAJAA0AgAS0AACIERQ0BIAFBAWohASACQQFxBEBBCiECAkACQAJAIARB7ABrDgcCAQIBAQEAAQtBDSECDAELIAQhAgsgAyACOgAADAMLQQEhAiAEQdwARg0ACyADIAQ6AAAMAQsgA0EAOgAAIAAPCyADQQFqIQMMAAsACxgAIAAoAgAgACgCoAEgACgCnAEgARDfCAviawIZfw98IwBB4BVrIgIkACACQbgOaiAAKQCYAjcDACACQbAOaiAAKQCQAjcDACACQagOaiAAKQCIAjcDACACIAApAIACNwOgDgJAAkACQAJAIAEoAhAiBCgCCCIDRQ0AIAMrABggAisDoA5mRQ0AIAIrA7AOIAMrAAhmRQ0AIAMrACAgAisDqA5mRQ0AIAIrA7gOIAMrABBmDQELIAQoAmAiAwR/IAIgAkG4DmopAwA3A9AHIAIgAkGwDmopAwA3A8gHIAIgAkGoDmopAwA3A8AHIAIgAikDoA43A7gHIAMgAkG4B2oQ7wkNASABKAIQBSAECygCbCIDRQ0BIAMtAFFBAUcNASACIAJBuA5qKQMANwOwByACIAJBsA5qKQMANwOoByACIAJBqA5qKQMANwOgByACIAIpA6AONwOYByADIAJBmAdqEO8JRQ0BCwJAIAAoApwBQQJIDQAgACABQYDdCigCAEHx/wQQeiIDEIkEDQAgA0Hx/wQQPkUNASABQShqIQlBACEDA0BBMCEFQQMhCAJAAkAgAw4DAQAEAAtBUCEFQQIhCAsgCSAFQQAgASgCAEEDcSAIRxtqKAIAQajcCigCAEHx/wQQeiIEQfH/BBA+DQEgA0EBaiEDIAAgBBCJBEUNAAsLIAJCADcD4AcgAkIANwPYByACQdgHaiIEIAFBMEEAIAEoAgBBA3FBA0cbaigCKBAhEMUDIARByuABQbagAyABIAFBMGsiAyABKAIAQQNxQQJGGygCKBAtEIICGxDFAyAEIAEgAyABKAIAQQNxQQJGGygCKBAhEMUDIAAgBBDEAxCFBCAEEFwgAUGE3QooAgBB8f8EEHoiAy0AAARAIAAgAxCFBAsCQCABQezcCigCAEHx/wQQeiIDLQAAIhdFDQAgAxDDAxpBsOAKIQ1BsOAKIQMDQCADKAIAIgRFDQEgA0EEaiEDIARBsy0QPkUNAAsMAQsgAUGimAEQJxDsAiEaIAAoApgBIQ8gABCNBCIGQQk2AgwgBiABNgIIIAZBAzYCBAJAIAEoAhAoAmAiA0UNACADLQBSDQAgAUHerAEQJxBoRQ0AIAYgBi8BjAJBgARyOwGMAgsCQCAXRQ0AIAEoAhAoAghFDQAgACANEOUBCwJAQbjdCigCACIDRQ0AIAEgAxBFIgNFDQAgAy0AAEUNACAAIAFBuN0KKAIARAAAAAAAAPA/RAAAAAAAAAAAEEwQhwILAkAgD0GAgIAIcUUNACABIAFBMGoiAyABKAIAQQNxQQNGGygCKBAtKAIQLwGyAUEDTwRAIAYCfyABIAMgASgCAEEDcUEDRhsoAigoAhAoApQBKwMQRAAAAAAAAFJAoiIbRAAAAAAAAOA/RAAAAAAAAOC/IBtEAAAAAAAAAABmG6AiG5lEAAAAAAAA4EFjBEAgG6oMAQtBgICAgHgLtzkDuAEgBgJ/IAFBUEEAIAEoAgBBA3FBAkcbaigCKCgCECgClAErAxBEAAAAAAAAUkCiIhtEAAAAAAAA4D9EAAAAAAAA4L8gG0QAAAAAAAAAAGYboCIbmUQAAAAAAADgQWMEQCAbqgwBC0GAgICAeAu3OQPAAQwBCyAGQgA3A7gBIAZCADcDwAELAkAgD0GAgAJxRQ0AAkAgASgCECIEKAJgIgNFBEAgBigCyAEhBQwBCyAGIAMoAgAiBTYCyAELIAYgBTYC1AEgBiAFNgLMASAGIAU2AtABIAQoAmwiAwRAIAYgAygCADYCzAELIAQoAmgiAwRAIAYgAygCADYC0AELIAQoAmQiA0UNACAGIAMoAgA2AtQBC0EAIQNBACEFAkAgD0GAgARxRQ0AIAJBqA5qQgA3AwAgAkIANwOgDiAGIAAgASACQaAOaiIEEKcGIAEQgQE2AtwBIAQQXAJAAkAgAUGuhQEQJyIIBEAgCC0AAA0BCyABQZ/SARAnIghFDQEgCC0AAEUNAQsgCCABEIEBIQULAkAgBgJ/AkACQCABQaGFARAnIggEQCAILQAADQELIAFBk9IBECciCEUNASAILQAARQ0BCyAIIAEQgQEMAQsgBUUNASAFEGQLNgLYAQsCQCAGAn8CQAJAIAFBl4UBECciCARAIAgtAAANAQsgAUGK0gEQJyIIRQ0BIAgtAABFDQELIAggARCBAQwBCyAFRQ0BIAUQZAs2AuABCwJAAkACQCABQY6FARAnIggEQCAILQAADQELIAFBgtIBECciCEUNASAILQAARQ0BCyAGIAggARCBATYC5AEgBiAGLwGMAkGAAXI7AYwCDAELIAVFDQAgBiAFEGQ2AuQBCwJAAkAgAUGqhQEQJyIIBEAgCC0AAA0BCyABQZvSARAnIghFDQEgCC0AAEUNAQsgBiAIIAEQgQE2AugBIAYgBi8BjAJBgAJyOwGMAgwBCyAFRQ0AIAYgBRBkNgLoAQsCQCAPQYCAgARxRQ0AAkAgAUHiIhAnIgRFDQAgBC0AAEUNACAEIAEQgQEhAwsCQCAGAn8CQCABQdMiECciBEUNACAELQAARQ0AIAYgBi8BjAJBwAByOwGMAiAEIAEQgQEMAQsgA0UNASADEGQLNgL8AQsCQCAGAn8CQCABQcciECciBEUNACAELQAARQ0AIAQgARCBAQwBCyADRQ0BIAMQZAs2AoACCwJAAkAgAUG8IhAnIgRFDQAgBC0AAEUNACAGIAQgARCBATYChAIgBiAGLwGMAkEQcjsBjAIMAQsgA0UNACAGIAMQZDYChAILIAYCfwJAIAFB3iIQJyIERQ0AIAQtAABFDQAgBiAGLwGMAkEgcjsBjAIgBCABEIEBDAELIANFBEBBACEDDAILIAMQZAs2AogCCwJAIA9BgICAAnFFDQACQAJAAkAgAUGh2gAQJyIIBEAgCC0AAA0BCyABQZHaABAnIghFDQEgCC0AAEUNAQsgBiAIIAEQiAQiBCABEIEBNgLsASAEEBggBiAGLwGMAkEBcjsBjAIMAQsgBigCyAEiBEUNACAGIAQQZDYC7AELAkACQCABQYTaABAnIgRFDQAgBC0AAEUNACAGIAQgARCIBCIEIAEQgQE2AvABIAQQGCAGIAYvAYwCQQhyOwGMAgwBCyAGKALIASIERQ0AIAYgBBBkNgLwAQsCQAJAIAFB+NkAECciBEUNACAELQAARQ0AIAYgBCABEIgEIgQgARCBATYC9AEgBBAYIAYgBi8BjAJBAnI7AYwCDAELIAYoAtABIgRFDQAgBiAEEGQ2AvQBCwJAIAFBndoAECciBEUNACAELQAARQ0AIAYgBCABEIgEIgQgARCBATYC+AEgBBAYIAYgBi8BjAJBBHI7AYwCDAELIAYoAtQBIgRFDQAgBiAEEGQ2AvgBCyAFEBggAxAYAkAgD0GAgIQCcUUNACABKAIQKAIIIhFFDQACQCAGKALYAUUEQCAGKALsAUUNAiAPQYCAIHENAQwCCyAPQYCAIHFFDQELIBEoAgQhEiAAKAIQKwOgASACQYAVakEAQSgQOBogAkIANwP4ByACQgA3A/AHIAJCADcD6AcgAkGYFWohCkQAAAAAAADgP6JEAAAAAAAAAEAQIyElAkADQAJAIBAgEkYEQCAPQYDAAHENA0EAIQVBACEDDAELIBEoAgBBACEEIAJBsBVqQQBBKBA4GiAQQTBsaiIOKAIEQQFrQQNuIQhBACEMA0AgCCAMRgRAQQAhAwNAIAIoArgVIgggA00EQEEAIQMDQCADIAhJBEAgAiACQbgVaikDADcDkAcgAiACKQOwFTcDiAcgAkGIB2ogAxAZIQQCQAJAIAIoAsAVIgUOAgENAAsgAiACKAKwFSAEQQR0aiIEKQMINwOAByACIAQpAwA3A/gGIAJB+AZqIAURAQALIANBAWohAyACKAK4FSEIDAELCyACQbAVaiIDQRAQMSAQQQFqIRAgAxA0DAULQQAhByACKAKwFSELAkAgA0UEQEEAIQUMAQsgAiACQbgVaiIJKQMANwPwBiACIAIpA7AVNwPoBiALIAJB6AZqIANBAWsQGUEEdGohBSAJKAIAIQggAigCsBUhCwsgCCADQQFqIglLBEAgAiACQbgVaikDADcD4AYgAiACKQOwFTcD2AYgCyACQdgGaiAJEBlBBHRqIQcgAigCsBUhCwsgAiACQbgVaikDADcD0AYgAiACKQOwFTcDyAYgBEEEdCIIIAJBgAhqaiEOIAJBoA5qIAhqIQggCyACQcgGaiADEBlBBHRqIgMrAAghJCADKwAAISICQCAFBEAgBSsDCCEdIAUrAwAhISAHBEAgBysDCCEeIAcrAwAhIAwCCyAkIB2hIhsgG6AhHiAiICGhIhsgG6AhIAwBCyAkIAcrAwgiHqEiGyAboCEdICIgBysDACIgoSIbIBugISELIB4gJKEgICAioRCoASEcIAggJCAlIB0gJKEgISAioRCoASIbIBwgG6EiG0QYLURU+yEZwKAgGyAbRAAAAAAAAAAAZBtEAAAAAAAA4D+ioCIbEFeiIhygOQMIIAggIiAlIBsQSqIiG6A5AwAgDiAkIByhOQMIIA4gIiAboTkDACAEQQFqIQQgAigCuBUgCUcEQCAJIQMgBEEyRw0BCyACIARBAXQ2AvwHIAJB6AdqQQQQJiEDIAIoAugHIANBAnRqIAIoAvwHNgIAQQAhAwNAIAMgBEYEQCACQYAIaiAEQQR0aiEHQQAhAwNAIAMgBEcEQCAKIAcgA0F/c0EEdGoiBSkDADcDACAKIAUpAwg3AwggAkGAFWpBEBAmIQUgAigCgBUgBUEEdGoiBSAKKQMANwMAIAUgCikDCDcDCCADQQFqIQMMAQsLIAIgCCkDADcDoA4gAiAIKQMINwOoDiACIA4pAwA3A4AIIAIgDikDCDcDiAhBASEEIAkhAwwCBSAKIAJBoA5qIANBBHRqIgUpAwg3AwggCiAFKQMANwMAIAJBgBVqQRAQJiEFIAIoAoAVIAVBBHRqIgUgCikDADcDACAFIAopAwg3AwggA0EBaiEDDAELAAsACwALIA4oAgAgDEEwbGohB0EAIQMDQCADQQRGBEAgDEEBaiEMIAJBwBRqIAJBsBVqEKAGDAIFIANBBHQiBSACQcAUamoiCSAFIAdqIgUpAwA3AwAgCSAFKQMINwMIIANBAWohAwwBCwALAAsACwsDQCACKALwByADSwRAIAIgAikD8Ac3A4AGIAIgAikD6Ac3A/gFIAIoAugHIAJB+AVqIAMQGUECdGooAgAgBWohBSADQQFqIQMMAQsLIAIgAkGIFWoiCSkDADcDwAYgAiACKQOAFTcDuAYgAigCgBUhBCACQbgGakEAEBkhAyACIAkpAwA3A7AGIAIgAikDgBU3A6gGIAAgBCADQQR0aiACKAKAFSACQagGakEAEBlBBHRqIAUQmAIaCyACIAJBiBVqKQMANwOgBiACIAIpA4AVNwOYBiACKAKAFSEEIAJBmAZqQQAQGSEDIAZBAjYCkAIgBiAEIANBBHRqNgKkAiACQYAVaiAGQZgCakEAQRAQxwEgAiACKQPwBzcDkAYgAiACKQPoBzcDiAYgBiACKALoByACQYgGakEAEBlBAnRqKAIANgKUAiACQegHaiAGQaACaiAGQZwCakEEEMcBCwJAIAAoAjwiA0UNACADKAJAIgNFDQAgACADEQEACwJAIAYoAtgBIgNFBEAgBi0AjAJBAXFFDQELIAAgAyAGKALsASAGKAL8ASAGKALcARDEAQsgACgCECsDoAEhJSACQgA3A/AHIAJCADcD6AcCQCABKAIQKAIIRQ0AQQAhCCABQfjcCigCAEQAAAAAAADwP0QAAAAAAAAAABBMISggAUHM3AooAgBB8f8EEHohB0EAIQQCQCAXRQ0AIA0hAwNAIAMoAgAiBUEARyEEIAVFDQEgA0EEaiEDIAVB0asBED5FDQALCyAHIQNBACELAkACQAJAA0ACQAJAAkACQAJAIAMtAAAiBUE6aw4CAQIACyAFDQIgC0UgCEVyDQcgByACQYAVahDeBCIJQQJJDQMgASABQTBqIgUgASgCAEEDcUEDRhsoAigQLSABIAUgASgCAEEDcUEDRhsoAigQISEFEIICIQMgAiABQVBBACABKAIAQQNxQQJHG2ooAigQITYC6AUgAkHBywNBn80DIAMbNgLkBSACIAU2AuAFQfLvAyACQeAFahCAASAJQQJHDQUMBgsgCEEBaiEIDAELIAtBAWohCwsgA0EBaiEDDAELCyAJQQFGDQELIAJBwA5qIQ4gAkGwDmohCEEAIQdBACEFA0AgASgCECgCCCIDKAIEIAdNBEBBACEDA0AgAigCiBUgA0sEQCACIAJBiBVqKQMANwPYBSACIAIpA4AVNwPQBSACQdAFaiADEBkhBAJAAkAgAigCkBUiAQ4CAQoACyACIAIoAoAVIARBGGxqIgQpAwg3A8AFIAIgBCkDEDcDyAUgAiAEKQMANwO4BSACQbgFaiABEQEACyADQQFqIQMMAQsLIAJBgBVqIgFBGBAxIAEQNAwECyACQaAOaiADKAIAIAdBMGxqQTAQHxpEAAAAAAAA8D8hHEEBIQtBACEDIAUhBAJAAkADQCADIAIoAogVTw0BIAIgAkGIFWopAwA3A7AFIAIgAikDgBU3A6gFIAIoAoAVIAJBqAVqIAMQGUEYbGoiCSgCACIFRQ0BAkAgCSsDCCIbmUTxaOOItfjkPmNFBEAgACAFEEkgHCAboSEcAn8gCwRAIAJBoA5qIBsgAkHAFGogAkGwFWoQ4gggACACKALAFCIEIAIoAsQUQQAQ8AEgBBAYQQAgHJlE8WjjiLX45D5jRQ0BGiACKAKwFSEDDAMLIByZRPFo44i1+OQ+YwRAIAAgAigCsBUiAyACKAK0FUEAEPABDAMLIAJBgAhqIgkgAkGwFWoiBEEwEB8aIAkgGyAbIBygoyACQcAUaiAEEOIIIAIoAoAIEBggACACKALAFCIEIAIoAsQUQQAQ8AEgBBAYQQALIQsgBSEECyADQQFqIQMMAQsLIAMQGAwBCyAEIQULIAIoAqgOBEAgAiACQYgVaiIDKQMANwOgBSACIAIpA4AVNwOYBSAAIAIoAoAVIAJBmAVqQQAQGUEYbGooAgAQSSACIAMpAwA3A5AFIAIgAikDgBU3A4gFIAAgAigCgBUgAkGIBWpBABAZQRhsaigCABBdIAIgCCkDCDcDgAUgAiAIKQMANwP4BCACIAIoAqAOIgMpAwg3A/AEIAIgAykDADcD6AQgAEECIAJB+ARqIAJB6ARqICggJSACKAKoDhDqAgsgAigCrA4iBARAIAAgBRBJIAAgBRBdIAIgDikDCDcD4AQgAiAOKQMANwPYBCACIAIoAqAOIAIoAqQOQQR0akEQayIDKQMINwPQBCACIAMpAwA3A8gEIABBAyACQdgEaiACQcgEaiAoICUgBBDqAgsCQCAXRSABKAIQKAIIKAIEQQJJcg0AIAIoAqgOIAIoAqwOckUNACAAIA0Q5QELIAdBAWohBwwACwALQYX1ACEHCwJAAkACfyABKAIQLQB0IgNBAXEEQEHPkAMhC0GBtgEMAQsgA0ECcQRAQaSSAyELQZjpAQwBCyADQQhxBEBB2o8DIQtB0o8DDAELIANBBHFFDQFBzZIDIQtBkOkBCyEMIAJB6AdqIAsQxQMgByEDA0ACQCADLQAAIgVBOkcEQCAFDQEgAkHoB2oQxAMiCSAHRg0EIAAgCRBJDAQLIAIgCzYCwAQgAkHoB2pBnjMgAkHABGoQfgsgA0EBaiEDDAALAAsgAUHQ3AooAgAgBxCPASEMIAchCQsgByAMRwRAIAAgDBBdCwJAAkAgBARAIAwtAAAhEiAJLQAAIQMgAEG7HxBJIAAgCUGF9QAgAxsiERBdIAJBwBRqIgQgASgCECgCCCgCAEEwEB8aIAJBoA5qIQ8CfwJAQejcCigCACIDRQ0AIAEgAxBFIgMtAABFDQBBmAIgA0HLogEQPg0BGkGZAiADQZH1ABA+DQEaQZoCIANBmfcAED4NARogA0HAlgEQPkUNAEGbAgwBC0GYAkGbAiABQVBBACABKAIAQQNxQQJHG2ooAigQLRCCAhsLIQ5EAAAAAAAAAAAhHSMAQbABayIGJAAgBkIANwMYIAZCADcDECAGQgA3AwggBCgCBCEIIAQoAgAiCisAACEbIAYgCisACDkDKCAGIBs5AyAgBkEwakEAQTAQOBogBkEIakHAABAmIQEgBigCCCABQQZ0aiAGQSBqIg1BwAAQHxogBiAKKQMINwOoASAGIAopAwA3A6ABIAZBOGohB0EAIQMDQCAIIANBA2oiAUsEQCAGIAYpA6ABNwNwIAYgBikDqAE3A3ggCiADQQR0aiEJQQEhAwNAIANBBEYEQEEBIQMgBisDeCEbIAYrA3AhHgNAIANBFUYEQCABIQMMBQUgBkHgAGogBkHwAGogA7hEAAAAAAAANECjQQBBABChASAGKwNgISAgBiAGKwNoIhw5AyggBiAgOQMgIAYgHSAeICChIBsgHKEQR6AiHTkDMCAHQQBBKBA4GiAGQQhqQcAAECYhBCAGKAIIIARBBnRqIA1BwAAQHxogA0EBaiEDICAhHiAcIRsMAQsACwAFIANBBHQiBCAGQfAAamoiBSAEIAlqIgQpAwA3AwAgBSAEKQMINwMIIANBAWohAwwBCwALAAsLIAZBCGogBkHgAGogBkHwAGpBwAAQxwEgBigCYCIHIAYoAnAiDUEGdGpBMGsrAwAhJEQAAAAAAAAAACEeRAAAAAAAAAAAIRxBACEBRAAAAAAAAAAAIRsDQCANIAEiA00EQCAPQgA3AgBBACEHA0ACQCAHIA1PBEAgG0QYLURU+yEJQKAiIBBXIRsgDyAgEEogHKIgHqAgGyAcoiAmoBDhBCAGKAJwIgENAUHLlQNBvroBQacCQfo4EAAACyAGKAJgIAdBBnRqIgMrAyghHCADKwMgIhsQVyEdIAMrAwghJiAbEEohHiADKwM4ISAgAy0AMCAPIB4gHKIgAysDACIeoCAmIB0gHKKgEOEEQQFxBEAgHiAcQQEgGyAgIA8Q8QgLIAdBAWohByAGKAJwIQ0MAQsLIAFBAmshDQNAAkAgBigCYCEBIA1Bf0YNACABIA1BBnRqIgMrAyghIiADKwM4RBgtRFT7IQlAoCIdEFchHiADKwMIISAgHRBKIRsgAysDICEcIAMtADAgDyAbICKiIAMrAwAiG6AgICAeICKioBDhBEEBcQRAIBsgIkEAIBxEGC1EVPshCUCgIB0gDxDxCAsgDUEBayENDAELCyABEBggBkGwAWokAAUgByADQQFqIgFBACABIA1HG0EGdGoiBCsDCCAHIANBBnQiBWoiCSsDCCImoSAEKwMAIAkrAwAiHqEQ8AghGyAHIAMgDSADG0EGdGoiBEE4aysDACAmoSAEQUBqKwMAIB6hEPAIIScgCSsDECIiICQgJSAOER8AIRwCQAJ/AkACfCADBEAgAyAGKAJwQQFrRw0CICdEGC1EVPsh+b+gDAELIBtEGC1EVPsh+T+gCyEdQQAMAQsgG0QYLURU+yH5P6AhHUQAAAAAAAAAACAcIBsgJ6EiG0QYLURU+yEZQKAgGyAbRAAAAAAAAAAAYxtEAAAAAAAA4L+iRBgtRFT7Ifk/oCIgEEoiG6MgG0QAAAAAAAAAAGEbIhsgHEQAAAAAAAAkQKJkBEAgJ0QYLURU+yH5v6AiG0QAAAAAAAAAAGMgG0QYLURU+yEZQGZyBEAgGyAbRBgtRFT7IRlAo5xEGC1EVPshGUCioSEbC0EBIQ0gHUQAAAAAAAAAAGMgHUQYLURU+yEZQGZyRQ0CIB0gHUQYLURU+yEZQKOcRBgtRFT7IRlAoqEhHQwCCyAdICCgIR0gGyEcQQALIQ0gHSEbCyAGKAJgIgcgBWoiAyAdOQM4IAMgDToAMCADIBw5AyggAyAbOQMgIANB7AA6ABggAyAiOQMQIAMgJjkDCCADIB45AwAgBigCcCENDAELCyACKAKgDiIBQQBIDQEgACACKAKkDiABQQEQSCACKAKkDhAYIAAgERBJIBEgDEGF9QAgEhsiAUcEQCAAIAEQXQsgAigCyBQiAwRAIAIgAkHYFGopAwA3A2AgAiACKQPQFDcDWCACIAIoAsAUIgEpAwg3A1AgAiABKQMANwNIIABBAiACQdgAaiACQcgAaiAoICUgAxDqAgsgAigCzBQiA0UNAyACQUBrIAJB6BRqKQMANwMAIAIgAikD4BQ3AzggAiACKALAFCACKALEFEEEdGpBEGsiASkDCDcDMCACIAEpAwA3AyggAEEDIAJBOGogAkEoaiAoICUgAxDqAgwDCyABKAIQIQMgCEUNASAIuEQAAAAAAAAAQKBEAAAAAAAA4L+iIR9BACEMIAMoAggoAgQiFUEwED8hBiAVQTAQPyEPA0AgDCAVRgRAIAkQZCIIIQMgCSIFIRADQCADQfviARCxBSIDBEACQCADQYX1ACADLQAAGyIEIAlGDQAgBCEJIAEoAhAtAHRBA3ENACAAIAQQSSAAIAQQXQtBACEMA0AgDCAVRgRAIBAgBCAWGyEQIAQgBSAWQQJJGyEFIBZBAWohFkEAIQMMAwsgDyAMQTBsIgdqIgMoAgQhEiAGIAdqKAIAIQ0gAygCACEOQQAhAwNAIAMgEkYEQCAAIA4gEkEAEPABIAxBAWohDAwCBSAOIANBBHQiB2oiESAHIA1qIgcrAwAgESsDAKA5AwAgESAHKwMIIBErAwigOQMIIANBAWohAwwBCwALAAsACwsCQCACKALIFCIDRQRAQQAhBQwBCwJAIAVFDQAgASgCEC0AdEEDcQ0AIAAgBRBJIAAgBRBdIAIoAsgUIQMLIAIgAkHYFGopAwA3A6ABIAIgAikD0BQ3A5gBIAIgAigCwBQiBCkDCDcDkAEgAiAEKQMANwOIASAAQQIgAkGYAWogAkGIAWogKCAlIAMQ6gILIAIoAswUIgMEQAJAIAUgEEYNACABKAIQLQB0QQNxDQAgACAQEEkgACAQEF0gAigCzBQhAwsgAiACQegUaikDADcDgAEgAiACKQPgFDcDeCACIAIoAsAUIAIoAsQUQQR0akEQayIBKQMINwNwIAIgASkDADcDaCAAQQMgAkH4AGogAkHoAGogKCAlIAMQ6gILIAgQGEEAIQMDQCADIBVGBEAgBhAYIA8QGAwGBSAGIANBMGwiAWooAgAQGCABIA9qKAIAEBggA0EBaiEDDAELAAsABSACQcAUaiAMQTBsIgMgASgCECgCCCgCAGpBMBAfGiADIAZqIgQgAigCxBQiBTYCBCADIA9qIgMgBTYCBCAEIAVBEBA/IhA2AgAgAyACKALEFEEQED8iCjYCACACKALEFEEBayEHIAIoAsAUIhErAwghHiARKwMAISBBACEDA0AgAyAHSQRAIBEgA0EBakEEdCIIaiIEKwMIISMgBCsDACEpAkAgA0UEQCAQRAAAAAAAAABAICAgKaEiHSAdoiAeICOhIhwgHKKgRC1DHOviNho/oJ+jIhsgHZqiOQMIIBAgHCAbojkDAAwBCyAQIANBBHRqIgREAAAAAAAAAEAgJiApoSIdIB2iICcgI6EiHCAcoqBELUMc6+I2Gj+gn6MiGyAdmqI5AwggBCAcIBuiOQMACyARIANBA2oiBEEEdGoiBSsDCCEcIAUrAwAhGyAQIANBAmpBBHQiDWoiEkQAAAAAAAAAQCApIA0gEWoiBSsDACImoSIhICMgBSsDCCInoSIkEEciHUQtQxzr4jYaP2MEfCAgIBuhIiEgIaIgHiAcoSIkICSioEQtQxzr4jYaP6CfBSAdC6MiHSAhmqIiIjkDCCASIB0gJKIiHTkDACAIIBBqIg4gEikDCDcDCCAOIBIpAwA3AwAgCiADQQR0IgNqIgUgHyADIBBqIgMrAwCiICCgOQMAIAUgHyADKwMIoiAeoDkDCCAIIApqIgMgHyAOKwMAoiApoDkDACADIB8gDisDCKIgI6A5AwggCiANaiIDIB8gIqIgJ6A5AwggAyAfIB2iICagOQMAIBshICAcIR4gBCEDDAELCyAQIANBBHQiBGoiA0QAAAAAAAAAQCAmICChIhwgHKIgJyAeoSIdIB2ioEQtQxzr4jYaP6CfoyIbIByaoiIcOQMIIAMgHSAboiIbOQMAIAQgCmoiAyAfIByiIB6gOQMIIAMgHyAboiAgoDkDACAMQQFqIQwMAQsACwALQZ/LAUGEuQFB/BJB2TEQAAALIAMtAHRBA3FFBEACQCAJLQAABEAgACAJEEkMAQsgAEGF9QAQSSAMQYX1ACAMLQAAGyEMCyAAIAwQXQsgAUEoaiERIAJB4BRqIRAgAkHQFGohFSACQcgVaiEYIAJBqAhqIQYgAkGYCGohEyACQbgOaiESICVEAAAAAAAAIECiRAAAAAAAAChAECMhHQNAIBkgASgCECgCCCIDKAIETw0BIAJBwBRqIAMoAgAgGUEwbGpBMBAfGkEAIQhBACELIBFBUEEAIAEoAgBBA3FBAkcbaigCABAtQb4uECciAwRAIANBvt4AED4hCwsgDSEDAkAgF0UNAANAIAMoAgAiBEEARyEIIARFDQEgA0EEaiEDIARB2a4BED5FDQALC0QAAAAAAAAAACEbAkAgAUGoJhAnIgNFDQAgAy0AAEUNACADEK4CIhtEAAAAAAAAAABkIQgLAkACQAJAAkAgCCALcUEBRw0AIB0gGyAbRAAAAAAAAAAAYRsgGyAIGyIfRAAAAAAAAAAAZEUNAEEAIQQgAkGgDmoiA0EAQeAAEDgaIAMgAigCxBRByAAQ/AEgAigCxBQhDiACKALAFCEKA0AgBCAORwRAIAogBEEEdGohByAEIQUDQAJAIAVFBEBBfyEFDAELIAogBUEBayIFQQR0aiIDKwMAIAcrAwChIAMrAwggBysDCKEQR0R7FK5H4XqEP2RFDQELCyAEIQgCQANAIAhBAWoiCCAOTw0BIAogCEEEdGoiAysDACAHKwMAIiGhIikgAysDCCAHKwMIIiOhIiYQRyInRHsUrkfheoQ/ZEUNAAsgBUF/Rg0AQQAhAyApmSIeRJqZmZmZmbk/YyAmmSIgRJqZmZmZmbk/ZHEgIyAKIAVBBHRqIgUrAwihIiSZIhxEmpmZmZmZuT9jICEgBSsDAKEiIpkiG0SamZmZmZm5P2RxcSIIIBtEmpmZmZmZuT9jICBEmpmZmZmZuT9jcSAcRJqZmZmZmbk/ZHEgHkSamZmZmZm5P2RxckUNAANAIAIoAqgOIANLBEAgAiACQagOaikDADcDqAQgAiACKQOgDjcDoAQgAigCoA4hByACQaAEaiADEBkhBSADQQFqIQMgISAKIAcgBUHIAGxqKAIAQQR0aiIFKwMAoSAjIAUrAwihEEdEexSuR+F6hD9jRQ0BDAILCyASQQBByAAQOCEFIAJBoA5qQcgAECYhAyACKAKgDiADQcgAbGogBUHIABAfGiACIAJBqA5qIgMpAwA3A7gEIAIgAikDoA43A7AEIAIoAqAOIAJBsARqIAMoAgBBAWsQGUHIAGxqIgUgBDYCACAFICYgJ6MiICAfoiAjoDkDICAFICkgJ6MiHCAfoiAhoDkDGCAFICMgJCAiICQQRyIboyIeIB+ioTkDECAFICEgIiAboyIbIB+ioTkDCCAIBEAgIEQAAAAAAAAAAGMiA0UgG0QAAAAAAAAAAGRFckUEQCAFQpjakKK1v8j8PzcDQCAFQgA3AzggBSAjIB+hOQMwIAUgISAfoTkDKAwCCyAgRAAAAAAAAAAAZEUgG0QAAAAAAAAAAGRFckUEQCAFQgA3A0AgBUKY2pCitb/I/L9/NwM4IAUgHyAjoDkDMCAFICEgH6E5AygMAgsgBSAfICGgOQMoIANFIBtEAAAAAAAAAABjRXJFBEAgBUKY2pCitb/IhMAANwNAIAVCmNqQorW/yPw/NwM4IAUgIyAfoTkDMAwCCyAFQtLDzPnHr7aJwAA3A0AgBUKY2pCitb/IhMAANwM4IAUgHyAjoDkDMAwBCyAcRAAAAAAAAAAAZCIDRSAeRAAAAAAAAAAAY0VyRQRAIAVC0sPM+cevtonAADcDQCAFQpjakKK1v8iEwAA3AzggBSAfICOgOQMwIAUgHyAhoDkDKAwBCyAcRAAAAAAAAAAAY0UgHkQAAAAAAAAAAGNFckUEQCAFQpjakKK1v8iMwAA3A0AgBULSw8z5x6+2icAANwM4IAUgHyAjoDkDMCAFICEgH6E5AygMAQsgIyAfoSEbIANFIB5EAAAAAAAAAABkRXJFBEAgBUKY2pCitb/IhMAANwNAIAVCmNqQorW/yPw/NwM4IAUgGzkDMCAFIB8gIaA5AygMAQsgBUKY2pCitb/I/D83A0AgBUIANwM4IAUgGzkDMCAFICEgH6E5AygLIARBAWohBAwBCwsgAigCqA5FDQEgAkGgDmpBnAJByAAQogMgAkGIFWoiDyACKALAFCIDKQMINwMAIAIgAykDADcDgBVBACEMQQAhBUEAIRQDQCACKAKoDiIDIBRJBEADQCADIAxNDQUgAiACQagOaikDADcDiAMgAiACKQOgDjcDgAMgAkGACGogAigCoA4gAkGAA2ogDBAZQcgAbGpByAAQHxogAiAGKQMINwP4AiACIAYpAwA3A/ACAkAgAkHwAmogHyAfIAIrA7gIIAIrA8AIEPQIIghFDQAgCCgCBCIDQQVJDQAgA0EGa0EAIANBB2tBfUkbIgVBAk8EQEEAIQMgAkGwFWoiBEEAQSgQOBogBCAFQRAQ/AEDQCADIAVGBEACQCAJBEAgCSIDLQAADQELQYX1ACEDCyAAIAMQSSACIAJBuBVqIgcpAwA3A+gCIAIgAikDsBU3A+ACQQAhAyAAIAIoArAVIAJB4AJqQQAQGUEEdGogBRA9A0AgAigCuBUgA0sEQCACIAcpAwA3A9gCIAIgAikDsBU3A9ACIAJB0AJqIAMQGSEEAkACQCACKALAFSIFDgIBEgALIAIgAigCsBUgBEEEdGoiBCkDCDcDyAIgAiAEKQMANwPAAiACQcACaiAFEQEACyADQQFqIQMMAQsLIAJBsBVqIgNBEBAxIAMQNAUgGCAIKAIAIANBBHRqIgQpAzg3AwggGCAEKQMwNwMAIAJBsBVqQRAQJiEEIAIoArAVIARBBHRqIgQgGCkDADcDACAEIBgpAwg3AwggA0EBaiEDDAELCwsgCCgCABAYIAgQGAsgDEEBaiEMIAIoAqgOIQMMAAsABSACQbgVaiIOAn8gAyAUSwRAIAIgAkGoDmoiAykDADcDmAQgAiACKQOgDjcDkAQgAigCoA4gAkGQBGogFBAZQcgAbGooAgAhFiACIAMpAwA3A4gEIAIgAikDoA43A4AEIAIoAqAOIAJBgARqIBQQGUHIAGxqQQhqDAELIAIoAsAUIAIoAsQUQQFrIhZBBHRqCyIDKQMINwMAIAIgAykDADcDsBUgAkGQCGpCADcDACACQYgIaiILQgA3AwAgAkIANwOACCATIA8pAwA3AwggEyACKQOAFTcDACACQYAIakEQECYhAyACKAKACCADQQR0aiIDIBMpAwA3AwAgAyATKQMINwMIIAUhBANAIBYgBEEBaiIESwRAQQAhAyACKALAFCEIA0AgAigCqA4gA0sEQCACIAJBqA5qKQMANwOYAyACIAIpA6AONwOQAyAIIAIoAqAOIAJBkANqIAMQGUHIAGxqKAIAQQR0aiEKIANBAWohAyACKALAFCIHIQggByAEQQR0aiIHKwMAIAorAwChIAcrAwggCisDCKEQR0R7FK5H4XqEP2NFDQEMAwsLIBMgCCAEQQR0aiIDKQMANwMAIBMgAykDCDcDCCACQYAIakEQECYhAyACKAKACCADQQR0aiIDIBMpAwA3AwAgAyATKQMINwMIDAELCyATIAIpA7AVNwMAIBMgDikDADcDCCACQYAIakEQECYhAyACKAKACCADQQR0aiIDIBMpAwA3AwAgAyATKQMINwMIIAIgCykDADcD+AMgAiACKQOACDcD8ANBACEDIAAgAigCgAggAkHwA2pBABAZQQR0aiALKAIAED0CQANAAkAgAigCiAggA00EQCACQYAIaiIDQRAQMSADEDQgFCACKAKoDk8NAyACIAJBqA5qIgopAwA3A+gDIAIgAikDoA43A+ADIAIoAqAOIAJB4ANqIBQQGUHIAGxqKAIAIQUDQEEAIQMgBUEBaiIFIAIoAsQUTw0CA0AgAyACKAKoDk8NAyACIAopAwA3A8gDIAIgAikDoA43A8ADIAIoAsAUIQ4gAigCoA4hCCACQcADaiADEBkhBCADQQFqIQMgAigCwBQgBUEEdGoiBysDACAOIAggBEHIAGxqKAIAQQR0aiIEKwMAoSAHKwMIIAQrAwihEEdEexSuR+F6hD9jRQ0ACwwACwALIAIgCykDADcDuAMgAiACKQOACDcDsAMgAkGwA2ogAxAZIQQCQAJAIAIoApAIIgcOAgEOAAsgAiACKAKACCAEQQR0aiIEKQMINwOoAyACIAQpAwA3A6ADIAJBoANqIAcRAQALIANBAWohAwwBCwsgAiAKKQMANwPYAyACIAIpA6AONwPQAyAPIAIoAqAOIAJB0ANqIBQQGUHIAGxqIgMpAyA3AwAgAiADKQMYNwOAFQsgFEEBaiEUDAELAAsACyAAIAIoAsAUIAIoAsQUQQAQ8AEMAgsgACACKALAFCACKALEFEEAEPABC0EAIQMDQCACKAKoDiADTQRAIAJBoA5qIgNByAAQMSADEDQFIAIgAkGoDmopAwA3A/gBIAIgAikDoA43A/ABIAJB8AFqIAMQGSEHAkACQCACKAKwDiIFDgIBCAALIAJBqAFqIgQgAigCoA4gB0HIAGxqQcgAEB8aIAQgBREBAAsgA0EBaiEDDAELCwsgAigCyBQiBARAIAIgFSkDCDcDuAIgAiAVKQMANwOwAiACIAIoAsAUIgMpAwg3A6gCIAIgAykDADcDoAIgAEECIAJBsAJqIAJBoAJqICggJSAEEOoCCyACKALMFCIEBEAgAiAQKQMINwOYAiACIBApAwA3A5ACIAIgAigCwBQgAigCxBRBBHRqQRBrIgMpAwg3A4gCIAIgAykDADcDgAIgAEEDIAJBkAJqIAJBgAJqICggJSAEEOoCCwJAIBdFIAEoAhAoAggoAgRBAklyDQAgAigCyBQgAigCzBRyRQ0AIAAgDRDlAQsgGUEBaiEZDAALAAsgAkHoB2oQXCAAKAIQIgcoAgghCQJAIAcoAtgBRQRAIActAIwCQQFxRQ0BCyAAEJcCIAcoApwCIgtFDQAgBygCoAIiBCgCACEIQQEhBQNAIAUgC08NASAHIAQgBUECdCIBaigCADYClAIgByAHKAKkAiAIQQR0ajYCmAIgACAHKALYASAHKALsASAHKAL8ASAHKALcARDEASAAEJcCIAVBAWohBSABIAcoAqACIgRqKAIAIAhqIQggBygCnAIhCwwACwALIAdCADcClAIgACAJKAIQIgMoAggiAQR/IAcoAuQBIQMgBy8BjAIhBCACIAEoAgAiAUEQaiABKAIAIAEoAggbIgEpAwg3AyAgAiABKQMANwMYIAAgAkEYaiAEQYABcUEHdiADIARBAnFBAXYQ4QggBygC6AEhAyAHLwGMAiEEIAIgCSgCECgCCCIBKAIAIAEoAgRBMGxqIgEgAUEwaygCACABQSxrKAIAQQR0aiABQSRrKAIAG0EQayIBKQMINwMQIAIgASkDADcDCCAAIAJBCGogBEGAAnFBCHYgAyAEQQRxQQJ2EOEIIAkoAhAFIAMLKAJgQQsgBy8BjAJBA3ZBAXEgBygC4AEgBygC8AEgBygCgAIgBygC3AEgCUHw3AooAgBB+pMBEHoQaAR/IAkoAhAoAggFQQALENoEIAAgCSgCECgCbEELIAcvAYwCQQN2QQFxIAcoAuABIAcoAvABIAcoAoACIAcoAtwBIAlB8NwKKAIAQfqTARB6EGgEfyAJKAIQKAIIBUEACxDaBCAAIAkoAhAoAmRBByAHLwGMAkECdkEBcSAHKALoASAHKAL4ASAHKAKIAiAHKALcAUEAENoEIAAgCSgCECgCaEEGIAcvAYwCQQF2QQFxIAcoAuQBIAcoAvQBIAcoAoQCIAcoAtwBQQAQ2gQCQCAAKAI8IgFFDQAgASgCRCIBRQ0AIAAgAREBAAsgABCMBCAaEOwCIBoQGBAYCyACQeAVaiQADwtBsIMEQcIAQQFBiPYIKAIAEDoaEDsAC84GAQJ/IwBBgAJrIgMkACADQdABaiIEQYi/CEEwEB8aIAFCADcCAAJAAkACQAJAIAAgBBDeBA0AIAMoAtgBQQJJDQAgAyADKQPYATcDyAEgAyADKQPQATcDwAEgAygC0AEgA0HAAWpBABAZQRhsaigCAA0BC0EAIQBBACEBA0AgASADKALYAU8NAiADIAMpA9gBNwMgIAMgAykD0AE3AxggA0EYaiABEBkhAgJAAkAgAygC4AEiBA4CAQUACyADIAMoAtABIAJBGGxqIgIpAwg3AwggAyACKQMQNwMQIAMgAikDADcDACADIAQRAQALIAFBAWohAQwACwALIAMoAtgBQQNPBEBB95gEQQAQKgsgAyADKQPYATcDuAEgAyADKQPQATcDsAEgASADKALQASADQbABakEAEBlBGGxqKAIAEGQ2AgAgAyADKQPYATcDqAEgAyADKQPQATcDoAEgAygC0AEgA0GgAWpBARAZQRhsaigCAARAIAMgAykD2AE3A5gBIAMgAykD0AE3A5ABIAEgAygC0AEgA0GQAWpBARAZQRhsaigCABBkNgIECyADIAMpA9gBNwOIASADIAMpA9ABNwOAASADKALQASEBIANBgAFqQQAQGSEEIAMoAtABIQAgAgJ8IAEgBEEYbGotABBBAUYEQCADIAMpA9gBNwNYIAMgAykD0AE3A1AgACADQdAAakEAEBlBGGxqKwMIDAELIAMgAykD2AE3A3ggAyADKQPQATcDcEQAAAAAAAAAACAAIANB8ABqQQEQGUEYbGotABBBAUcNABogAyADKQPYATcDaCADIAMpA9ABNwNgRAAAAAAAAPA/IAMoAtABIANB4ABqQQEQGUEYbGorAwihCzkDAEEAIQFBASEAA0AgASADKALYAU8NASADIAMpA9gBNwNIIAMgAykD0AE3A0AgA0FAayABEBkhAgJAAkAgAygC4AEiBA4CAQQACyADIAMoAtABIAJBGGxqIgIpAwg3AzAgAyACKQMQNwM4IAMgAikDADcDKCADQShqIAQRAQALIAFBAWohAQwACwALIANB0AFqIgFBGBAxIAEQNCADQYACaiQAIAAPC0GwgwRBwgBBAUGI9ggoAgAQOhoQOwALrwEBAX8gACgCECIBRQRAQaT1AEGEuQFBiAFB0pEBEAAACyABKALcARAYIAEoAtgBEBggASgC4AEQGCABKALkARAYIAEoAugBEBggASgC7AEQGCABKALwARAYIAEoAvQBEBggASgC+AEQGCABKAL8ARAYIAEoAoACEBggASgChAIQGCABKAKIAhAYIAEoApgCEBggASgCpAIQGCABKAKgAhAYIAAgASgCADYCECABEBgLngEBAn9BuAIQxgMiASAAKAIQIgI2AgAgACABNgIQIAIEQCABQRBqIAJBEGpBKBAfGiABQThqIAJBOGpBKBAfGiABIAIoApgBNgKYASABIAIoApwBNgKcASABIAIrA6ABOQOgASABIAIoAogBNgKIASABQeAAaiACQeAAakEoEB8aIAEPCyABQoCAgICAgID4PzcDoAEgAUIDNwOYASABC6AGAQV/IwBBMGsiAyQAA0BBgOAKKAIAIAJNBEACQEH43wpBEBAxQZDgCiAAKAIAIgQpAwA3AwBBmOAKIAQpAwg3AwBB+N8KQRAQJiECQfjfCigCACACQQR0aiICQZDgCikDADcDACACQZjgCikDADcDCEGQ4AogBCkDADcDAEGY4AogBCkDCDcDAEH43wpBEBAmIQJB+N8KKAIAIAJBBHRqIgJBkOAKKQMANwMAIAJBmOAKKQMANwMIQQIgACgCBCIAIABBAk0bQQFrIQZBASECA0AgAiAGRg0BQZDgCiAEIAJBBHRqIgApAwA3AwBBmOAKIAApAwg3AwBB+N8KQRAQJiEFQfjfCigCACAFQQR0aiIFQZDgCikDADcDACAFQZjgCikDADcDCEGQ4AogACkDADcDAEGY4AogACkDCDcDAEH43wpBEBAmIQVB+N8KKAIAIAVBBHRqIgVBkOAKKQMANwMAIAVBmOAKKQMANwMIQZDgCiAAKQMANwMAQZjgCiAAKQMINwMAQfjfCkEQECYhAEH43wooAgAgAEEEdGoiAEGQ4AopAwA3AwAgAEGY4AopAwA3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qgIgA0EAOgAHIAIgBGogA0EHahDSASADQRBqJAAMAQsQygEACyAFQRBqJAALFwAgACADNgIQIAAgAjYCDCAAIAE2AggLDQAgACABIAJBARCiBwsSACAAIAEgAkL/////DxCwBacLzAEBA38jAEEgayIDQgA3AxggA0IANwMQIANCADcDCCADQgA3AwAgAS0AACICRQRAQQAPCyABLQABRQRAIAAhAQNAIAEiA0EBaiEBIAMtAAAgAkYNAAsgAyAAaw8LA0AgAyACQQN2QRxxaiIEIAQoAgBBASACdHI2AgAgAS0AASECIAFBAWohASACDQALAkAgACIBLQAAIgJFDQADQCADIAJBA3ZBHHFqKAIAIAJ2QQFxRQ0BIAEtAAEhAiABQQFqIQEgAg0ACwsgASAAawuAAQEEfyAAIABBPRC0BSIBRgRAQQAPCwJAIAAgASAAayIEai0AAA0AQYiBCygCACIBRQ0AIAEoAgAiAkUNAANAAkAgACACIAQQ6gFFBEAgASgCACAEaiICLQAAQT1GDQELIAEoAgQhAiABQQRqIQEgAg0BDAILCyACQQFqIQMLIAMLTgEBf0EBQRwQGiIGIAU6ABQgBiAAIAEQrAE2AggCfyADBEAgACACENUCDAELIAAgAhCsAQshBSAGIAA2AhggBiAENgIQIAYgBTYCDCAGCwkAIAC9QjSIpwuZAQEDfCAAIACiIgMgAyADoqIgA0R81c9aOtnlPaJE65wriublWr6goiADIANEff6xV+Mdxz6iRNVhwRmgASq/oKJEpvgQERERgT+goCEFIAAgA6IhBCACRQRAIAQgAyAFokRJVVVVVVXFv6CiIACgDwsgACADIAFEAAAAAAAA4D+iIAQgBaKhoiABoSAERElVVVVVVcU/oqChC5IBAQN8RAAAAAAAAPA/IAAgAKIiAkQAAAAAAADgP6IiA6EiBEQAAAAAAADwPyAEoSADoSACIAIgAiACRJAVyxmgAfo+okR3UcEWbMFWv6CiRExVVVVVVaU/oKIgAiACoiIDIAOiIAIgAkTUOIi+6fqovaJExLG0vZ7uIT6gokStUpyAT36SvqCioKIgACABoqGgoAuNAQAgACAAIAAgACAAIABECff9DeE9Aj+iRIiyAXXg70k/oKJEO49otSiCpL+gokRVRIgOVcHJP6CiRH1v6wMS1tS/oKJE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EC4BmgFsrHwhEAwBCwsgAkEBaiECDAALAAtBACEAA0AgDCAAQQJ0aigCACICBEAgCCACQVBBACACKAIAQQNxQQJHG2ooAigoAhAoAvgBIgVBAnRqIgogCigCACACKAIQLgGaAWo2AgAgBSABIAEgBUgbIQEgAEEBaiEADAELCyADQQFqIQMMAQsACwALIAZBEGokACARDwsgECARfCERDAALAAuDAQECfyAAIAFBARCNASIBKAIQQQA2AsQBQQUQnwghAiABKAIQIgNBADYCzAEgAyACNgLAAUEFEJ8IIQIgASgCECIDIAI2AsgBQdz9CigCACICIAAgAhsoAhBBuAFBwAEgAhtqIAE2AgAgAyACNgK8AUHc/QogATYCACADQQA2ArgBIAELuQEBA38gACAAQTBqIgIgACgCAEEDcUEDRhsoAigoAhAiASgC4AEgASgC5AEiAUEBaiABQQJqENoBIQEgACACIAAoAgBBA3FBA0YbKAIoKAIQIAE2AuABIAAgAiAAKAIAQQNxQQNGGygCKCgCECIBIAEoAuQBIgNBAWo2AuQBIAEoAuABIANBAnRqIAA2AgAgACACIAAoAgBBA3FBA0YbKAIoKAIQIgAoAuABIAAoAuQBQQJ0akEANgIACyAAIAAgASACIABBp4cBECciAAR/IAAQkQIFQR4LEP8OC00AIAEoAhBBwAFqIQEDQCABKAIAIgEEQCABKAIQKAKYAhAYIAEoAhAoAqACEBggASgCECIBQQA2ArABIAFBuAFqIQEMAQUgABD4DgsLCz8BAn8gACgCECgCqAIhAANAIAAiASgCDCIARSAAIAFGckUEQCAAKAIMIgJFDQEgASACNgIMIAIhAAwBCwsgAQsLACAAIAFBARCFDwsLACAAIAFBABCFDwuGAQECfwJAIAAgASkDCBC/A0UNACAAEDkgAEYEQCAAIAEQbiECA0AgAgRAIAAgAiABEHIgACACEI0GIQIMAQsLIAAtABhBIHEEQCABEMcLCyAAIAEQzwcgARCzByAAQQEgASkDCBC/BgsgACABQRJBAEEAEMgDDQAgABA5IABGBEAgARAYCwsLgwEBA38jAEEgayIBJAAgACgCECICKAIMIgNBDE8EQCABQeQANgIUIAFBibwBNgIQQYj2CCgCAEHYvwQgAUEQahAgGhA7AAsgASACKAIINgII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ACAAIAEQRSIBRQ0AIAEtAABFDQAgACABIAEQdkEAR0EAIAcgAiADENsCIQEgACgCECABNgJ8IAAQLSgCECIBIAEtAHFBEHI6AHELIABBgNwKKAIAQQBBABBiIQEgACgCECICQf8BIAEgAUH/AU4bOgCgASAAIAIoAggoAgQoAgARAQALRAACQCAAECgEQCAAECRBD0YNAQsgAEEAEH8LAkAgABAoBEAgAEEAOgAPDAELIABBADYCBAsgABAoBH8gAAUgACgCAAsLlAYBBH8jAEGQAWsiASQAAkACQCAARQ0AIAAtAABFDQBB8NoKKAIAIgMEQEG+3gotAAANASABIAM2AnBB/vkEIAFB8ABqECpBvt4KQQE6AAAMAQtBwN4KKAIAIQMCQEHk2gooAgAEQCADDQEDQEHM3gooAgAgAk0EQEHE3gpBCBAxQcTeChA0QcDeCkHk2gooAgAiAjYCACABQfQAaiACEP4JQdzeCiABKAKMATYCAEHU3gogASkChAE3AgBBzN4KIAEpAnw3AgBBxN4KIAEpAnQ3AgAMAwUgAUHM3gopAgA3A0ggAUHE3gopAgA3A0AgAUFAayACEBkhAwJAAkBB1N4KKAIAIgQOAgEHAAsgAUHE3gooAgAgA0EDdGopAgA3AzggAUE4aiAEEQEACyACQQFqIQIMAQsACwALAkAgA0Ho2gooAgBGDQADQEHM3gooAgAgAk0EQEHE3gpBCBAxQcTeChA0QcDeCkHo2gooAgAiAjYCACACRQ0CIAItAABFDQIgAUH0AGogAhD+CUHc3gogASgCjAE2AgBB1N4KIAEpAoQBNwIAQczeCiABKQJ8NwIAQcTeCiABKQJ0NwIABSABQczeCikCADcDMCABQcTeCikCADcDKCABQShqIAIQGSEDAkACQEHU3gooAgAiBA4CAQcACyABQcTeCigCACADQQN0aikCADcDICABQSBqIAQRAQALIAJBAWohAgwBCwsLAkAgAC0AAEEvRg0AQczeCigCAEUNACABQdzeCigCADYCGCABQdTeCikCADcDECABQczeCikCADcDCCABQcTeCikCADcDACABIAAQ/QkhAgwCCyAAIQIMAQtBACECA0AgAkEDRwRAIAAgAkH54gFqLAAAIAAQQEEBahDkCyIDQQFqIAAgAxshACACQQFqIQIMAQsLIAFB3N4K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AUEHcXRyOgAADwtBl7IDQe/6AEHRAEHfIRAAAAtQAQF/IAEoAhAoApwBRQRAQQAPCyAAIAFBMEEAIAEoAgBBA3FBA0cbaigCKBDDDgR/IAAgAUFQQQAgASgCAEEDcUECRxtqKAIoEMMOBUEACws1AQJ/AkAgABAcIgFFBEAMAQsgARCGAiECA0AgACABEB0iAUUNASACIAEQnggaDAALAAsgAguGAwEDfyABIAFBMGoiAyABKAIAQQNxQQNGGygCKCgCECICKALQASACKALUASICQQFqIAJBAmoQ2gEhAiABIAMgASgCAEEDcUEDRhsoAigoAhAgAjYC0AEgASADIAEoAgBBA3FBA0YbKAIoKAIQIgIgAigC1AEiBEEBajYC1AEgAigC0AEgBEECdGogATYCACABIAMgASgCAEEDcUEDRhsoAigoAhAiAygC0AEgAygC1AFBAnRqQQA2AgAgASABQTBrIgMgASgCAEEDcUECRhsoAigoAhAiAigC2AEgAigC3AEiAkEBaiACQQJqENoBIQIgASADIAEoAgBBA3FBAkYbKAIoKAIQIAI2AtgBIAEgAyABKAIAQQNxQQJGGygCKCgCECICIAIoAtwBIgRBAWo2AtwBIAIoAtgBIARBAnRqIAE2AgAgASADIAEoAgBBA3FBAkYbKAIoKAIQIgEoAtgBIAEoAtwBQQJ0akEANgIAIAAoAhBBAToA8AEgABBhKAIQQQE6APABC4ABAQJ/QcABIQMgACECA0AgAigCECADaigCACICBEBBuAEhAyABIAJHDQELCyACBEAgASgCECICKAK8ASEBIAIoArgBIgIEQCACKAIQIAE2ArwBCyABIAAgARsoAhBBuAFBwAEgARtqIAI2AgAPC0GbpANBq7oBQb8BQdyfARAAAAsJAEEBIAAQ1AILYQEEfyAAKAIEIQQCQANAIAIgBEYNASACQQJ0IAJBAWohAiAAKAIAIgVqIgMoAgAgAUcNAAsgACAEQQFrIgE2AgQgAyAFIAFBAnQiAWooAgA2AgAgACgCACABakEANgIACwtDAAJAIAAQKARAIAAQJEEPRg0BCyAAEI4PCwJAIAAQKARAIABBADoADwwBCyAAQQA2AgQLIAAQKAR/IAAFIAAoAgALC3QBAn8jAEEgayICJAACQCAArSABrX5CIIhQBEAgACABEE4iA0UNASACQSBqJAAgAw8LIAIgATYCBCACIAA2AgBBiPYIKAIAQabqAyACECAaEC8ACyACIAAgAWw2AhBBiPYIKAIAQfXpAyACQRBqECAaEC8AC7cNAgh/A3wjAEHAAmsiBCQAAkAgABA5IgkgACgCAEEDcSIKQQAQ5QMiBUUNAANAIAVFDQECQCAAIAUQRSIDRQ0AIAMtAABFBEAgBSgCCEHC8AAQPkUNAQsgAUG57QQQGxogASACKAIAEEQgBSgCCCACIAEQuwIgAUGTzQMQGxoCQCACLQAFQQFHDQACQCAFKAIIIgNBwcMBED4NACADQbHDARA+DQAgA0G5wwEQPg0AIANBl8MBED4NACADQajDARA+DQAgA0GfwwEQPkUNAQsgACAFEEUiA0UNASADLQAARQ0BIANBABCQCiIIRQRAIAQgAzYCAEHK+gQgBBAqDAILIAFB7v8EEBsaIAIgAigCACIDQQFqNgIAIAEgAxBEIAFB/s0EEBsaQQAhBwNAIAgoAgAgB00EQCACIAIoAgBBAWs2AgAgAUHu/wQQGxogASACKAIAEEQgAUH+yAEQGxogCBCOCgwDCyAHBEAgAUG57QQQGxoLIAgoAgghAyACIAIoAgAiBkEBajYCACABIAYQRCABQfDYAxAbGiABIAIoAgAQRAJAAkACQAJAAkACQAJAAkACQAJAAkACQCADIAdB0ABsaiIDKAIAIgYOEAoKAAABAQIDBAQGBwsFBQgJCyAEQdAAQfAAIAZBAkYbNgJQIAFB7+wEIARB0ABqEB4gASACKAIAEEQgASADQQhqELQIDAoLIARBwgBB4gAgBkEERhs2AmAgAUHv7AQgBEHgAGoQHiABIAIoAgAQRCABIANBCGoQtAgMCQsgAUGk7QRBABAeIAEgAigCABBEIAEgA0EIahC0CAwICyABQYztBEEAEB4gASACKAIAEEQgAysDCCELIAQgAysDEDkDmAEgBCALOQOQASABQffqBCAEQZABahAeIAEgAigCABBEIARB4wBB8gAgAygCGCIGQQFGG0HsACAGGzYCgAEgAUH87AQgBEGAAWoQHiABIAIoAgAQRCAEIAMrAyA5A3AgAUG76gQgBEHwAGoQHiABIAIoAgAQRCABQdfMAxAbGiADKAIoIAIgARC7AiABQQoQZQwHCyAEQcMAQeMAIAZBCEYbNgKgASABQe/sBCAEQaABahAeIAEgAigCABBEIAFBo+wEQQAQHiABIAIoAgAQRCABQfDMAxAbGiADKAIIIAIgARC7AiABQQoQZQwGCyAEQcMAQeMAIAZBDUYbNgKQAiABQe/sBCAEQZACahAeIAEgAigCABBEAkACQAJAIAMoAggOAgABAgsgAUGj7ARBABAeIAEgAigCABBEIAFB8MwDEBsaIAMoAhAgAiABELsCIAFBChBlDAcLIAFB/esEQQAQHiABIAIoAgAQRCABIAIoAgAQRCADKwMQIQsgBCADKwMYOQOIAiAEIAs5A4ACIAFBo+sEIARBgAJqEB4gASACKAIAEEQgAysDICELIAQgAysDKDkD+AEgBCALOQPwASABQY3rBCAEQfABahAeIAEgAigCABBEIAEgAygCMCADKAI0IAIQkA8MBgsgAUGQ7ARBABAeIAEgAigCABBEIAEgAigCABBEIAMrAxAhCyADKwMYIQwgBCADKwMgOQPgASAEIAw5A9gBIAQgCzkD0AEgAUHV6wQgBEHQAWoQHiABIAIoAgAQRCADKwMoIQsgAysDMCEMIAQgAysDODkDwAEgBCAMOQO4ASAEIAs5A7ABIAFBuesEIARBsAFqEB4gASACKAIAEEQgASADKAJAIAMoAkQgAhCQDwwFCyABQbDtBEEAEB4gASACKAIAEEQgBCADKwMIOQOgAiABQczqBCAEQaACahAeIAEgAigCABBEIAFBjc0DEBsaIAMoAhAgAiABELsCIAFBChBlDAQLIAFBmO0EQQAQHiABIAIoAgAQRCABQYPNAxAbGiADKAIIIAIgARC7AiABQQoQZQwDCyABQfHrBEEAEB4gASACKAIAEEQgBCADKAIINgKwAiABQe7HBCAEQbACahAeDAILIARBsgI2AhQgBEGFuwE2AhBBiPYIKAIAQdi/BCAEQRBqECAaEDsACyAEQeUAQcUAIAYbNgJAIAFB7+wEIARBQGsQHiABIAIoAgAQRCADKwMIIQsgAysDECEMIAMrAxghDSAEIAMrAyA5AzggBCANOQMwIAQgDDkDKCAEIAs5AyAgAUHJygQgBEEgahAeCyACIAIoAgBBAWsiAzYCACABIAMQRCABQa8IEBsaIAdBAWohBwwACwALIAAgBRBFIAIgARC7AgsgCSAKIAUQ5QMhBQwACwALIARBwAJqJAAL/AIBA38jAEFAaiIDJAACQCABmUT8qfHSTWJAP2MEQCAAQcbiARAbGgwBCyABRAAAAAAAAPC/oJlE/Knx0k1iQD9jBEAgAEGi4gEQGxoMAQsgAyABOQMwIABB+uEBIANBMGoQHgsgAigCACEEAkACQAJAAkACQCACKAIgIgJBAWsOBAECAgACCyAEQYnBCBBNDQIgAEHwwAgQGxoMAwsgAyAEQf8BcTYCICADIARBEHZB/wFxNgIoIAMgBEEIdkH/AXE2AiQgAEGdEyADQSBqEB4MAgsgA0GhATYCBCADQb68ATYCAEGI9ggoAgBB2L8EIAMQIBoQOwALIAAgBBAbGgsgAEGk4QEQGxoCQAJAIAJBAUcNACAEQRh2IgVB/wFGDQAgAyAFuEQAAAAAAOBvQKM5AxAgAEGFhwEgA0EQahAeDAELAkAgAkEERw0AIARBicEIEE0NACAAQfSeAxAbGgwBCyAAQZugAxAbGgsgAEHL1AQQGxogA0FAayQAC9gDAQJ/IwBBkAFrIgMkACAAKAIQIQQgAEGCxAMQGxoCQAJAAkACQAJAIAEOBAMCAAECCyAAQbytAxAbGiAEKALcASIBBEAgACABEIoBIABB3wAQZQsgAyACNgJwIABBxKcDIANB8ABqEB4MAwsgAEG8rQMQGxogBCgC3AEiAQRAIAAgARCKASAAQd8AEGULIAMgAjYCgAEgAEG+pwMgA0GAAWoQHgwCCyADQcgAaiIBIARBOGpBKBAfGiAAIAEQlw8gBCgCWEEBRw0BIAQtADsiAUUgAUH/AUZyDQEgAyABuEQAAAAAAOBvQKM5A0AgAEHShgEgA0FAaxAeDAELIABB/MAIEBsaCyAAQejEAxAbGiADQRhqIgEgBEEQakEoEB8aIAAgARCXDyAEKwOgAUQAAAAAAADwv6CZRHsUrkfhenQ/Y0UEQCAAQYrEAxAbGiAAIAQrA6ABEHsLQYHBCCEBAkACQAJAIAQoApgBQQFrDgIBAAILQYXBCCEBCyADIAE2AhAgAEHEMyADQRBqEB4LAkAgBCgCMEEBRw0AIAQtABMiAUUgAUH/AUZyDQAgAyABuEQAAAAAAOBvQKM5AwAgAEHlhgEgAxAeCyAAQSIQZSADQZABaiQAC4ADAgR/AXwjAEGAAWsiAyQAQbj8CkG4/AooAgAiBUEBajYCACAAKAIQIgQoAogBIQYgA0IANwN4IANCADcDcCADQgA3A2ggA0IANwNgIAEgA0HgAGogAiAGt0QYLURU+yEJQKJEAAAAAACAZkCjQQAQ0AYgAEHzxAMQGxogBCgC3AEiAQRAIAAgARCKASAAQd8AEGULIAMgBTYCUCAAQazNAyADQdAAahAeIABB18UDEBsaIAAgAysDYBB7IABB0MUDEBsaIAAgAysDaBB7IABBycUDEBsaIAAgAysDcBB7IABBwsUDEBsaIAAgAysDeBB7IABBldYEEBsaIAQrA5ABIQcgA0EoaiIBIARBOGpBKBAfGiAAIAdE/Knx0k1iUL+gRAAAAAAAAAAAIAdEAAAAAAAAAABkGyABEIIGIAAgBCsDkAEiB0QAAAAAAADwPyAHRAAAAAAAAAAAZBsgAyAEQeAAakEoEB8iARCCBiAAQbbSBBAbGiABQYABaiQAIAULCwAgAEHurwQQGxoLqAgCAn8EfCMAQbACayIIJAACQAJAIAJFIANFcg0AIAAoAkAiCSAERXJFBEAgBC0AAEUNAQJAAkACQAJAIAEOAwABAgMLIAIrAwAhCiACKwMYIQsgAisDECEMIAggAisDCDkDMCAIIAw5AyggCCALOQMgIAggCjkDGCAIIAQ2AhAgAEHmpgQgCEEQahAeDAQLIAIrAxAhCyACKwMAIQogCCACKwMIOQNQIAggCyAKoTkDWCAIIAo5A0ggCCAENgJAIABBzKYEIAhBQGsQHgwDCyAIIAQ2AnAgAEHnMyAIQfAAahAeQQAhBANAIAMgBEYEQCAAQe7/BBAbGgwEBSACIARBBHRqIgErAwAhCiAIIAErAwg5A2ggCCAKOQNgIABBs4YBIAhB4ABqEB4gBEEBaiEEDAELAAsACyAIQTs2AgQgCEHiugE2AgBBiPYIKAIAQdi/BCAIECAaEDsACyAERSAJQQFHckUEQCAELQAARQ0BIAFFBEAgAisDACEKIAIrAxghCyACKwMQIQwgAisDCCENIAggBTYCpAEgCCAENgKgASAIIA05A5gBIAggDDkDkAEgCCALOQOIASAIIAo5A4ABIABBxfIDIAhBgAFqEB4MAgsgCEHGADYCtAEgCEHiugE2ArABQYj2CCgCAEHYvwQgCEGwAWoQIBoQOwALIAlBfnFBAkcNACABQQNPDQEgACABQQJ0QdTACGooAgAQGxoCQCAHRQ0AIActAABFDQAgAEG3xQMQGxogACAHELkIIABBj8cDEBsaCwJAIARFDQAgBC0AAEUNACAAQb/EAxAbGiAAIAQQuQggAEGPxwMQGxoLAkAgBkUNACAGLQAARQ0AIABB0cMDEBsaIAAgBhCKASAAQY/HAxAbGgsCQCAFRQ0AIAUtAABFDQAgAEHfxAMQGxogACAFEIoBIABBj8cDEBsaCyAAQYnHAxAbGiAAQeXDAxAbGiACKwMAIQoCQAJAAkACQCABQQFrDgICAQALIAIrAxghCyACKwMQIQwgCCACKwMIOQP4ASAIIAw5A/ABIAggCzkD6AEgCCAKOQPgASAAQZ+GASAIQeABahAeDAILIAggAisDCDkDmAIgCCAKOQOQAiAAQbSGASAIQZACahAeQQEhBANAIAMgBEYNAiACIARBBHRqIgErAwAhCiAIIAErAwg5A4gCIAggCjkDgAIgAEGohgEgCEGAAmoQHiAEQQFqIQQMAAsACyACKwMIIQsgAisDECEMIAggCjkDwAEgCCAMIAqhOQPQASAIIAs5A8gBIABBpIYBIAhBwAFqEB4LIAAoAkBBA0YEQCAAQczUBBAbGgwBCyAAQZHWBBAbGgsgCEGwAmokAA8LIAhB1QA2AqQCIAhB4roBNgKgAkGI9ggoAgBB2L8EIAhBoAJqECAaEDsACwsAQaDkCkECNgIACzwBAX8jAEEQayIDJAAgAyABOQMAIABB1oUBIAMQhAEgABCMBiAAQSAQfyAAQfH/BCACEL0IIANBEGokAAsTACAAQb7LAyAAKAIQQThqEL4IC/oCAgV/AXwjAEEwayIBJAAgAUIANwMoIAFCADcDIAJAIAAoAhAiAisDoAEiBiACKAIMQQN0QbCkCmoiAysDAKGZRPyp8dJNYkA/ZgR/IAMgBjkDACABQSBqIgJBj6wDEPIBIAEgACgCECsDoAE5AxAgAkGPhgEgAUEQahCEASACEIwGIAJBKRB/IABBrMsDIAIQwgEQwAMgACgCEAUgAgsoAqgBIgRFDQADQCAEKAIAIgNFDQEgBEEEaiEEIANBrq0BEGMNACADQcmlARBjDQAgA0Hx9wAQYw0AIAFBIGogAxDyAQNAIAMtAAAgA0EBaiICIQMNAAsgAi0AAARAIAFBIGpBKBB/QfH/BCEDA0AgAi0AAARAIAEgAjYCBCABIAM2AgAgAUEgakG4MiABEIQBA0AgAi0AACACQQFqIQINAAtBuqADIQMMAQUgAUEgakEpEH8LCwsgAEGsywMgAUEgahDCARDAAwwACwALIAFBIGoQXCABQTBqJAALaQECfyMAQRBrIgMkACADQgA3AwggA0IANwMAA0ACQCACLQAAIgRB3ABHBEAgBA0BIAAgASADEMIBEHEgAxBcIANBEGokAA8LIANB3AAQfyACLQAAIQQLIAMgBMAQfyACQQFqIQIMAAsAC5ICAQV/IAAQhwUhAyAAECQhAQJAAkACQANAIAEiAkUNASADIAFBAWsiAWotAABBLkcNAAsgABAkIQEDQCABQQFrIQUgASACRwRAIAMgBWotAABBMEcNAgsCQCAAECgEQCAALQAPIgRFDQQgACAEQQFrOgAPDAELIAAgACgCBEEBazYCBAsgASACRyAFIQENAAsgABAkIgFBAkkNACABIANqIgFBAmsiAi0AAEEtRw0AIAFBAWstAABBMEcNACACQTA6AAAgABAoBEAgAC0ADyIBRQ0DIAAgAUEBazoADw8LIAAgACgCBEEBazYCBAsPC0HijwNBoPwAQZIDQegqEAAAC0HijwNBoPwAQagDQegqEAAAC8cBAQN/IwBBEGsiAiQAIAFBUEEAIAEoAgBBA3FBAkcbaiIBQVBBACABKAIAQQNxIgNBAkcbaigCKCEEIAFBMEEAIANBA0cbaigCKCEDIAIgASkDCDcDCCACIAEpAwA3AwACQCAAIAMgBCACENkCRQ0AIAAQOSAARgRAIAAtABhBIHEEQCABEMcLCyAAIAEQzwcgARCzByAAQQIgASkDCBC/BgsgACABQQ9BAEEAEMgDDQAgABA5IABGBEAgARAYCwsgAkEQaiQACxoAIAAgARCsASIBIAIQwQMgACABQQAQjAEaC0UAIAAgAUG+zgMgAisDAEQAAAAAAABSQKMQjQMgACABQb7OAyADIAIrAwgiA6EgA0G42wotAAAbRAAAAAAAAFJAoxCNAwt9AQN/IwBBMGsiAiQAIAAQISEDIAAQLSEEAkACQCADBEBBfyEAIAQgASADEJIGQX9HDQEMAgsgAiAAKQMINwMAIAJBEGoiA0EeQdTPASACELQBGkF/IQAgASADIAQoAkwoAgQoAgQRAABBf0YNAQtBACEACyACQTBqJAAgAAvN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ABCPATYCuAJBAEHk2wooAgBEAAAAAAAALEBEAAAAAAAA8D8QTCEOIABBnKAKNgLIAiAAIA45A8ACIAAgARAhNgK0ASAAKAKoAhAYIABBADYCqAIgACgCrAIQGCAAQQA2AqwCIAAoArQCEBggAEEANgK0AgJAAkAgAUGqKRAnIgUEQCAAIAFB/doAECciAkG8zgMgAhs2AqACIAAgAUHw2gAQJyICQbqgAyACGyIENgKkAiAAKAKgAiICIAQQyQIgAmoiAkEAIAItAAAbIgIEQCADIAIsAAA2AtACQYLkBCADQdACahAqIABB8f8ENgKkAgsgACAFEGQ2AqgCIANCADcD0AQgA0IANwPIBCADQgA3A8AEIANBwARqQQQQJiECIAMoAsAEIAJBAnRqIAMoAtQENgIAIAAoAqgCIQIDQCACIAAoAqACELEFIgIEQCADIAI2AtQEIANBwARqQQQQJiECIAMoAsAEIAJBAnRqIAMoAtQENgIAQQAhAgwBCwsgAygCyAQiAkEBayIFQQBIDQIgAkECTwRAIANBADYC1AQgA0HABGoiBEEEECYhAiADKALABCACQQJ0aiADKALUBDYCACAEIABBrAJqQQBBBBDHAQtBACECA0AgAygCyAQgAksEQCADIAMpA8gENwO4AiADIAMpA8AENwOwAiADQbACaiACEBkhCQJAAkACQCADKALQBCIEDgICAAELIAMoAsAEIAlBAnRqKAIAEBgMAQsgAygCwAQgCUECdGooAgAgBBEBAAsgAkEBaiECDAELCyADQcAEaiICQQQQMSACEDQgACAFNgKwAiABQZEkECciBUUNASAFLQAARQ0BQQAhBiAAKAKwAkECakEEED8hB0EBIQIDQCAAKAKwAiIEIAJOBEAgACACIAQgBRDfCARAIAcgBkEBaiIGQQJ0aiACNgIACyACQQFqIQIMAQsLAkAgBgRAIAcgBjYCACAHIAZBAnRqIARBAWo2AgQMAQsgAyAFNgLAAkHA5QQgA0HAAmoQKiAHEBhBACEHCyAAIAc2ArQCDAELIABBATYCsAILQQEQ2gIgA0GoBGohDCADQcgEaiENQYC/CCgCACEIIAAgACgCmAEiAjYCnAEDQAJAAkACQCACBEACfyAAKAI8IgRFBEBBACEGQQAMAQsgBCgCDCEGIAQoAggLIQQgAiAGNgIYIAIg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/////////w+DhCICQoGAgICAgICACFoEQCAAQgF8IQAMAQsgAkKAgICAgICAgAhSDQAgAEIBgyAAfCEACyAAQoCAgICAgIAIhSAAIABC/////////wdWIgQbIQAgBK0LIQIgBUEgaiQAIAFCgICAgICAgICAf4MgAkI0hoQgAIS/C4kCAAJAIAAEfyABQf8ATQ0BAkBBxIMLKAIAKAIARQRAIAFBgH9xQYC/A0YNAwwBCyABQf8PTQRAIAAgAUE/cUGAAXI6AAEgACABQQZ2QcABcjoAAEECDwsgAUGAQHFBgMADRyABQYCwA09xRQRAIAAgAUE/cUGAAXI6AAIgACABQQx2QeABcjoAACAAIAFBBnZBP3FBgAFyOgABQQMPCyABQYCABGtB//8/TQRAIAAgAUE/cUGAAXI6AAMgACABQRJ2QfABcjoAACAAIAFBBnZBP3FBgAFyOgACIAAgAUEMdkE/cUGAAXI6AAFBBA8LC0H8gAtBGTYCAEF/BUEBCw8LIAAgAToAAEEBC8ICAQR/IwBB0AFrIgUkACAFIAI2AswBIAVBoAFqIgJBAEEoEDgaIAUgBSgCzAE2AsgBAkBBACABIAVByAFqIAVB0ABqIAIgAyAEENELQQBIBEBBfyEEDAELIAAoAkxBAEggACAAKAIAIghBX3E2AgACfwJAAkAgACgCMEUEQCAAQdAANgIwIABBADYCHCAAQgA3AxAgACgCLCEGIAAgBTYCLAwBCyAAKAIQDQELQX8gABCmBw0BGgsgACABIAVByAFqIAVB0ABqIAVBoAFqIAMgBBDRCwshAiAGBEAgAEEAQQAgACgCJBEDABogAEEANgIwIAAgBjYCLCAAQQA2AhwgACgCFCEBIABCADcDECACQX8gARshAgsgACAAKAIAIgAgCEEgcXI2AgBBfyACIABBIHEbIQQNAAsgBUHQAWokACAECxIAIAAgAUEKQoCAgIAIELAFpwthAAJAIAANACACKAIAIgANAEEADwsgACABEKoEIABqIgAtAABFBEAgAkEANgIAQQAPCyAAIAEQyQIgAGoiAS0AAARAIAIgAUEBajYCACABQQA6AAAgAA8LIAJBADYCACAAC38CAn8CfiMAQaABayIEJAAgBCABNgI8IAQgATYCFCAEQX82AhggBEEQaiIFQgAQjwIgBCAFIANBARDYCyAE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IABCADcCBCAAIAAoAiwiATYCHCAAIAE2AhQgACABIAAoAjBqNgIQQQALlAMCA34CfwJAIAC9IgJCNIinQf8PcSIEQf8PRw0AIABEAAAAAACAVkCiIgAgAKMPCyACQgGGIgFCgICAgICAwNaAf1gEQCAARAAAAAAAAAAAoiAAIAFCgICAgICAwNaAf1EbDwsCfiAERQRAQQAhBCACQgyGIgFCAFkEQANAIARBAWshBCABQgGGIgFCAFkNAAsLIAJBASAEa62GDAELIAJC/////////weDQoCAgICAgIAIhAshASAEQYUISgRAA0ACQCABQoCAgICAgKALfSIDQgBTDQAgAyIBQgBSDQAgAEQAAAAAAAAAAKIPCyABQgGGIQEgBEEBayIEQYUISg0AC0GFCCEECwJAIAFCgICAgICAoAt9IgNCAFMNACADIgFCAFINACAARAAAAAAAAAAAog8LIAFC/////////wdYBEADQCAEQQFrIQQgAUKAgICAgICABFQgAUIBhiEBDQALCyACQoCAgICAgICAgH+DIAFCgICAgICAgAh9IAStQjSGhCABQQEgBGutiCAEQQBKG4S/C+ICAQV/AkACQAJAIAIoAkxBAE4EQCABQQJIDQEMAgtBASEGIAFBAUoNAQsgAiACKAJIIgJBAWsgAnI2AkggAUEBRw0BIABBADoAACAADwsgAUEBayEEIAAhAQJAA0ACQAJAAkAgAigCBCIDIAIoAggiBUYNAAJ/IANBCiAFIANrEPoCIgcEQCAHIAIoAgQiA2tBAWoMAQsgAigCCCACKAIEIgNrCyEFIAEgAyAFIAQgBCAFSxsiAxAfGiACIAIoAgQgA2oiBTYCBCABIANqIQEgBw0CIAQgA2siBEUNAiAFIAIoAghGDQAgAiAFQQFqNgIEIAUtAAAhAwwBCyACEL0FIgNBAE4NAEEAIQQgACABRg0DIAItAABBEHENAQwDCyABIAM6AAAgAUEBaiEBIANB/wFxQQpGDQAgBEEBayIEDQELCyAARQRAQQAhBAwBCyABQQA6AAAgACEECyAGDQALIAQLpBgDE38EfAF+IwBBMGsiCSQAAkACQAJAIAC9IhlCIIinIgNB/////wdxIgZB+tS9gARNBEAgA0H//z9xQfvDJEYNASAGQfyyi4AETQRAIBlCAFkEQCABIABEAABAVPsh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IABEAAAAAAAA4D+ioiIDob1CgICAgHCDvyIERAAAIGVHFfc/oiIBIAkgCEEUdmq3IgKgIgUgASACIAWhoCAAIABEAAAAAAAAAECgoyIBIAMgASABoiICIAKiIgEgASABRJ/GeNAJmsM/okSveI4dxXHMP6CiRAT6l5mZmdk/oKIgAiABIAEgAUREUj7fEvHCP6JE3gPLlmRGxz+gokRZkyKUJEnSP6CiRJNVVVVVVeU/oKKgoKIgACAEoSADoaAiACAEoEQAou8u/AXnPaIgAEQAACBlRxX3P6KgoKAhAAsgAAtZAQF/IwBBIGsiAiQAIAAQ7AEiAAR/IAAoAgghACACQgA3AwggAkEANgIYIAJCADcDECACIAE2AgggAkIANwMAIAAgAkEEIAAoAgARAwAFQQALIAJBIGokAAuVAQIDfwV8IAMQVyIImiEJIAAoAgghBiADEEohByAGEBwhBANAIAQEQCAEKAIQKAKUASIFIAIgBSsDACIKIAiiIAcgBSsDCCILoqCgOQMIIAUgASAKIAeiIAsgCaKgoDkDACAGIAQQHSEEDAELCyAAQThqIQQDQCAEKAIAIgAEQCAAIAEgAiADEK8HIABBBGohBAwBCwsLtQIBBX8jAEEwayIDJAAgACgACCABTwRAIABBADYCFCAAQQQQJiEEIAAoAgAgBEECdGogACgCFDYCACAAQQQQjAIgACgACCABQX9zakECdCIEBEAgACgCACADIAApAgg3AyggAyAAKQIANwMgIANBIGogAUEBahAZIAAoAgAhByADIAApAgg3AxggAyAAKQIANwMQQQJ0aiAHIANBEGogARAZQQJ0aiAEELYBGgsgACACNgIUIAMgACkCCDcDCCADIAApAgA3AwAgAyABEBkhAQJAAkACQCAAKAIQIgIOAgIAAQsgACgCACABQQJ0aigCABAYDAELIAAoAgAgAUECdGooAgAgAhEBAAsgACgCACABQQJ0aiAAKAIUNgIAIANBMGokAA8LQfGhA0GFuAFBFkGhGhAAAAsdACAAKAIIIAFBARCFARogASgCECgCgAEgADYCDAtEAQF/IAAEQCAAKAIEIgEEQCABEG0LIAAoAggiAQRAIAEQbQsgACgCDBAYIAAoAhQiAQRAIAEgACgCEBEBAAsgABAYCws+AQN/IAAQLSECIAAoAhAiAQRAA0Ag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/wotAABB1P8KQQE6AABBAXFFBEAgCkEwQQAgCigCAEEDcUEDRxtqKAIoECEhACAEIApBUEEAIAooAgBBA3FBAkcbaigCKBAhNgIEIAQgADYCAEHo7QQgBBAqCyAGEBggChCZBAwFBSAEKAKMASENIAQrA1ghEyAFIAQrA4ABOQMIIAUgEzkDACABQQFrIQEgBUEQaiEFIAIgDWohAgwCCwALCwNAIAItAAAiBUEJayIBQRdLQQEgAXRBn4CABHFFckUEQCACQQFqIQIMAQsLIAogABDeBiEJIBIEQCAEKAJ8IQEgCSAVOQMYIAkgFjkDECAJIAE2AggLIAgEQCAEKAJ4IQEgCSAXOQMoIAkgFDkDICAJIAE2AgwLIAIgBUEARyIRaiECQQAhBQNAIAAgBUcEQCAFQQR0IgEgCSgCAGoiDSABIAZqIgEpAwA3AwAgDSABKQMINwMIIAVBAWohBQwBCwsgBhAYDAELCyAKKAIQIgUoAmAiAARAIAogAEH12QAQsQQgCigCECEFCyAFKAJsIgAEQCAKIABB2tkAELEEIAooAhAhBQsgBSgCZCIABH8gCiAAQfDZABCxBCAKKAIQBSAFCygCaCIABEAgCiAAQejZABCxBAsgC0EBaiELCyADIAoQMCEKDAELCyADIA8QHSEPDAELCyALRQRAQQAhAQwBC0ECQQEgAxC0AiALRhshAQtBACEAQQAhCiADKAIQKAIIIgIoAlgiCARAIAJBADYCVEEBIQoLAkAgCA0AQfjaCigCAEEBRw0AIAMQtgRFDQBBASEAIAMoAhAoAgwiAkUNACACQQA6AFELIAMQwQIgCARAIAMoAhAhD0QAAAAAAAAAACEVRAAAAAAAAAAAIRZBACERQQAhEkEAIQ4jAEFAaiILJAAgAygCECICKAKQASENIARB2ABqIgkgAikDEDcDACAJIAIpAyg3AxggCSACKQMgNwMQIAkgAikDGDcDCAJAIAIoAggoAlgiBkUNAAJAIAkrAwAgCSsDEGINACAJKwMIIAkrAxhiDQAgCUL/////////dzcDGCAJQv/////////3/wA3AwAgCUL/////////9/8ANwMIIAlC/////////3c3AxALIAYoAgghBwNAIBEgBigCAE8NASALQgA3AzggC0IANwMwIAtCADcDKCALQgA3AyACQAJAAkACQAJA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AisDAKEiGyAboiACKwMYIAIrAwihIhsgG6KgIAUrAxAgBSsDAKEgBCsDOKAgBCsDKKEiGyAbokQAAAAAAADQP6JlIQMMAQsgBSgCICEDIAUoAiQgASACKQMYNwPIAiABIAIpAxA3A8ACIAMgAUHAAmoQ5gwhBiAEKAJIIQMgBCgCTCABIAIpAwg3A7gCIAEgAikDADcDsAIgAyABQbACahDmDCEHIAQoAkgiEUEBdCEXIAUoAiAiDkEBdCEYIBFBAWshGSAOQQFrIRpBACEDQQAhCAJAA0AgASAGIAhBBHRqIgkpAwg3A6gCIAEgCSkDADcDoAIgASAGIAggGmogDm9BBHRqIhIpAwg3A5gCIAEgEikDADcDkAIgAUHABGogAUGgAmogAUGQAmoQ6wwgASAHIAxBBHRqIgspAwg3A4gCIAEgCykDADcDgAIgASAHIAwgGWogEW9BBHRqIhMpAwg3A/gBIAEgEykDADcD8AEgAUGwBGogAUGAAmogAUHwAWoQ6wwgAUIANwOYBCABQgA3A+gBIAEgASkDyAQ3A9gBIAEgASkDuAQ3A8gBIAFCADcDkAQgAUIANwPgASABIAEpA8AENwPQASABIAEpA7AENwPAASABKwPoASABKwPYASIboSABKwPAASABKwPQASIcoaIgASsDyAEgG6EgASsD4AEgHKGioSEfIAEgEikDCDcDuAEgASASKQMANwOwASABIAkpAwg3A6gBIAEgCSkDADcDoAEgASALKQMINwOYASABIAspAwA3A5ABIAFBsAFqIAFBoAFqIAFBkAFqEOoMIRUgASATKQMINwOIASABIBMpAwA3A4ABIAEgCykDCDcDeCABIAspAwA3A3AgASAJKQMINwNoIAEgCSkDADcDYCABQYABaiABQfAAaiABQeAAahDqDCEWIAEgEikDCDcDWCABIBIpAwA3A1AgASAJKQMINwNIIAEgCSkDADcDQCABIBMpAwg3AzggASATKQMANwMwIAEgCykDCDcDKCABIAspAwA3AyAgASsDMCIgIAErA1giGyABQUBrIgkrAwgiIaGiIAErAyAiJSAhIBuhIiKiIAErA1AiHiABKwMoIh0gASsDOCIcoaIiJiAJKwMAIiMgHCAdoaKgoKAiJEQAAAAAAAAAAGIEfyABICUgHCAboaIgJiAgIBsgHaGioKAgJKMi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AgAiESAKKAIASARAIBAgAkECdCIRaiAMNgIAIAMgEWogBCAFaigCADYCACACQQFqIQIMAQsgAyARQQJ0aiIMIAwoAgAgBCAFaigCAGo2AgALIABBAWohAAwBCwsgByAJaiACNgIAIAEhAAwACwALIANBACADQQBKGyEJQQAhAANAIAAgCUYNByAPIABBAWoiAUECdCIDaiEEIA8gAEECdCIFaigCACEAA0AgACAEKAIATkUEQCAGIBQgAEECdGooAgAiCEECdGogAjYCACAQIAJBAnRqIAg2AgAgAEEBaiEAIAJBAWohAgwBCwsgBSAHaiEEIAMgDmohCCAFIA5qKAIAIQADQCAAIAgoAgBORQRAIAYgEyAAQQJ0aigCACIFQQJ0aigCACAEKAIASARAIBAgAkECdGogBTYCACACQQFqIQILIABBAWohAAwBCwsgAyAHaiACNgIAIAEhAAwACwALIAVBAUYNBAsgEkHqBDYCBCASQZa3ATYCAEGI9ggoAgBB2L8EIBIQIBoQOwALQcLeAUGWtwFBlQRBr7ABEAAAC0GH0AFBlrcBQZYEQa+wARAAAAtB2pUBQZa3AUGXBEGvsAEQAAALIANBACADQQBKGyEIIA0oAhwhAyABKAIcIQUgACgCHCEVQQAhAANAIAAgCEYNASAPIABBAWoiAUECdCIJaiEKIA8gAEECdCIEaigCACEAA0AgACAKKAIATkUEQCAGIBQgAEECdGooAgAiC0ECdGogAjYCACAQIAJBAnRqIAs2AgAgAyACQQN0aiAVIABBA3RqKwMAOQMAIABBAWohACACQQFqIQIMAQsLIAQgB2ohCiAJIA5qIQsgBCAOaigCACEAA0AgACALKAIATkUEQAJAIAYgEyAAQQJ0aigCACIEQQJ0aigCACIMIAooAgBIBEAgECACQQJ0aiAENgIAIAMgAkEDdGogBSAAQQN0aisDADkDACACQQFqIQIMAQsgAyAMQQN0aiIEIAUgAEEDdGorAwAgBCsDAKA5AwALIABBAWohAAwBCwsgByAJaiACNgIAIAEhAAwACwALIA0gAjYCCCAGEBgLIBJBEGokACANC8sHAg9/AXwjAEEQayINJAACQCAARQRADAELAkACQCAAKAIgRQRAIAAoAhghDiAAKAIUIQcgACgCBCIIIAAoAgAiAiAAKAIIIgEgACgCEEEAELYCIgkgATYCCCAJKAIYIQ8gCSgCFCEDQX8gCCAIQQBIG0EBaiEKQQAhAQNAIAEgCkYEQEEAIQEgAkEAIAJBAEobIQogA0EEaiEFA0ACQCABIApGBEBBACEBIAhBACAIQQBKGyECDAELIAcgAUEBaiICQQJ0aiEEIAcgAUECdGooAgAhAQNAIAQoAgAgAUwEQCACIQEMAwUgBSAOIAFBAnRqKAIAQQJ0aiILIAsoAgBBAWo2AgAgAUEBaiEBDAELAAsACwsDQCABIAJGRQRAIAFBAnQhBSADIAFBAWoiAUECdGoiBCAEKAIAIAMgBWooAgBqNgIADAELC0EAIQICQAJAAkACQCAAKAIQIgFBBGsOBQADAwMBAgsgCSgCHCEFIAAoAhwhBEEAIQADQCAAIApGDQggByAAQQFqIgJBAnRqIQsgByAAQQJ0aigCACEBA0AgCygCACABTARAIAIhAAwCBSAPIAMgDiABQQJ0IgZqIgwoAgBBAnRqKAIAQQJ0aiAANgIAIAQgBmooAgAhBiADIAwoAgBBAnRqIgwgDCgCACIMQQFqNgIAIAUgDEECdGogBjYCACABQQFqIQEMAQsACwALAAsDQCACIApGDQcgByACQQFqIgBBAnRqIQUgByACQQJ0aigCACEBA0AgBSgCACABTARAIAAhAgwCBSADIA4gAUECdGooAgBBAnRqIgQgBCgCACIEQQFqNgIAIA8gBEECdGogAjYCACABQQFqIQEMAQsACwALAAsgAUEBRg0ECyANQfQANgIEIA1BlrcBNgIAQYj2CCgCAEHYvwQgDRAgGhA7AAUgAyABQQJ0akEANgIAIAFBAWohAQwBCwALAAtBodABQZa3AUHFAEGckwEQAAALIAkoAhwhBSAAKAIcIQQDQCACIApGDQEgByACQQFqIgBBAnRqIQsgByACQQJ0aigCACEBA0AgCygCACABTARAIAAhAgwCBSAPIAMgDiABQQJ0aiIGKAIAQQJ0aigCAEECdGogAjYCACAEIAFBA3RqKwMAIRAgAyAGKAIAQQJ0aiIGIAYoAgAiBkEBajYCACAFIAZBA3RqIBA5AwAgAUEBaiEBDAELAAsACwALA0AgCEEATEUEQCADIAhBAnRqIAMgCEEBayIIQQJ0aigCADYCAAwBCwsgA0EANgIACyANQRBqJAAgCQsLACAAIAFBAhD/Bws+AQJ8IAG3IQMDQEGc2wovAQAgAkoEQBDXASEEIAAoAhAoApQBIAJBA3RqIAQgA6I5AwAgAkEBaiECDAELCwv3AQICfwJ8IwBBMGsiAyQAIAAgARAsIQEDQCABBEACQAJAIAJFDQAgASACEEUiBC0AAEUNACADIANBKGo2AiACQCAEQfCDASADQSBqEFFBAEwNACADKwMoIgVEAAAAAAAAAABjDQAgBUQAAAAAAAAAAGINAkH42gooAgANAgsgAyAENgIQQem1AyADQRBqECogABAhIQQgA0KAgICAgICA+D83AwggAyAENgIAQbGmBCADEIABCyADQoCAgICAgID4PzcDKEQAAAAAAADwPyEFCyABKAIQIAU5A4gBIAYgBaAhBiAAIAEQMCEBDAELCyADQTBqJAAgBguQAQEFfyMAQeAAayIDJAAgAEEBQab0AEHx/wQQIiEFIABBAUHlOUHx/wQQIiEGIAAQHCECIAFBAkkhAQNAIAIEQCADQTdqIgQgAigCEDQC9AEQzA0gAiAFIAQQcSABRQRAIANBDmoiBCACKAIQNAL4ARDMDSACIAYgBBBxCyAAIAIQHSECDAELCyADQeAAaiQAC9gBAQJ/IAAQeSEBA0AgAQRAIAEQggggARB4IQEMAQsLAkAgAEHiJUEAQQEQNkUNACAAKAIQKAIIEBggACgCECIBQQA2AgggASgCuAEQGCAAKAIQKAKMAhAYIAAoAhAoAtgBEBggACgCECICKALEAQRAIAIoAugBIQEDQCABIAIoAuwBSkUEQCACKALEASABQcgAbGooAgwQGCABQQFqIQEgACgCECECDAELCyACKALEAUG4f0EAIAIoAugBQX9GG2oQGAsgABA5IABGDQAgACgCECgCDBC8AQsLzgIBA38jAEHQAGsiAiQAIAJCADcDSCACQgA3A0ACfyAAEDxFBEAgAUEANgIAQQAMAQsgAkIANwM4IAJCADcDMCACQgA3AyggAkIANwMYIAJCADcDECACQgA3AwggAkG6AzYCJCACQbsDNgIgIAAQHCEDA0AgAwRAIAMoAhBBADYCsAEgACADEB0hAwwBCwsgABAcIQMDQCADBEAgA0F/IAIoAiQRAABFBEAgAkFAayIEQQAQ6AUgAiACKAIwNgIAIAQgAhDnBSAAIAQQsQNBARCSASIEQeIl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AigCACAFIAIpAgg3A7gGIAUgAikCADcDsAYgBUGwBmogAxAZQcgAbGooAixBAWtBfUsNACACKAIAIAUgAikCCDcD+AMgBSACKQIANwPwAyAFQfADaiADEBlByABsaigCPCACKAIAIQAgBSACKQIINwPoAyAFIAIpAgA3A+ADIAVB4ANqIAMQGSEBQQFrQX1NBEAgAigCACEGAn8gACABQcgAbGooAkBBAUYEQCAFIAIpAgg3A8gBIAUgAikCADcDwAEgBiAFQcABaiADEBlByABsaigCLCEAIAIoAgAgBSACKQIINwO4ASAFIAIpAgA3A7ABIAVBsAFqIAQQGUHIAGxqIAA2AiggAigCACAFIAIpAgg3A6gBIAUgAikCADcDoAEgBUGgAWogAxAZQcgAbGpBfzYCLCACKAIAIAUgAikCCDcDmAEgBSACKQIANwOQASAFQZABaiADEBlByABsaigCPCEAIAIoAgAgBSACKQIINwOIASAFIAIpAgA3A4ABIAVBgAFqIAQQGUHIAGxqIAA2AiwgAigCACEAIAUgAikCCDcDeCAFIAIpAgA3A3AgACAFQfAAaiADEBlByABsaigCKCEBIAUgAikCCDcDaCAFIAIpAgA3A2AgACAFQeAAaiABEBlByABsaiADNgIwIAIoAgAhACAFIAIpAgg3A1ggBSACKQIANwNQIAAgBUHQAGogBBAZQcgAbGooAighASAFIAIpAgg3A0ggBSACKQIANwNAIAAgBUFAayABEBlByABsaiAENgIwIAIoAgAhACAFIAIpAgg3AzggBSACKQIANwMwIAAgBUEwaiAEEBlByABsakEsagwBCyAFIAIpAgg3A4gDIAUgAikCADcDgAMgBiAFQYADaiAEEBlByABsakF/NgIsIAIoAgAgBSACKQIINwP4AiAFIAIpAgA3A/ACIAVB8AJqIAMQGUHIAGxqKAIsIQAgAigCACAFIAIpAgg3A+gCIAUgAikCADcD4AIgBUHgAmogBBAZQcgAbGogADYCKCACKAIAIAUgAikCCDcD2AIgBSACKQIANwPQAiAFQdACaiADEBlByABsaigCKCEAIAIoAgAgBSACKQIINwPIAiAFIAIpAgA3A8ACIAVBwAJqIAMQGUHIAGxqIAA2AiwgAigCACAFIAIpAgg3A7gCIAUgAikCADcDsAIgBUGwAmogAxAZQcgAbGooAjwhACACKAIAIAUgAikCCDcDqAIgBSACKQIANwOgAiAFQaACaiADEBlByABsaiAANgIoIAIoAgAhACAFIAIpAgg3A5gCIAUgAikCADcDkAIgACAFQZACaiADEBlByABsaigCKCEBIAUgAikCCDcDiAIgBSACKQIANwOAAiAAIAVBgAJqIAEQGUHIAGxqIAM2AjAgAigCACEAIAUgAikCCDcD+AEgBSACKQIANwPwASAAIAVB8AFqIAMQGUHIAGxqKAIsIQEgBSACKQIINwPoASAFIAIpAgA3A+ABIAAgBUHgAWogARAZQcgAbGogAzYCMCACKAIAIQAgBSACKQIINwPYASAFIAIpAgA3A9ABIAAgBUHQAWogBBAZQcgAbGpBKGoLKAIAIQEgBSACKQIINwMoIAUgAikCADcDICAAIAVBIGogARAZQcgAbGogBDYCMCACKAIAIAUgAikCCDcDGCAFIAIpAgA3AxAgBUEQaiADEBlByABsakEANgI8IAIoAgAgBSACKQIINwMIIAUgAikCADcDACAFIAQQGUHIAGxqQQA2AjwMAgsgACABQcgAbGooAiwhACACKAIAIAUgAikCCDcD2AMgBSACKQIANwPQAyAFQdADaiAEEBlByABsaiAANgIoIAIoAgAgBSACKQIINwPIAyAFIAIpAgA3A8ADIAVBwANqIAMQGUHIAGxqQX82AiwgAigCACAFIAIpAgg3A7gDIAUgAikCADcDsAMgBUGwA2ogBBAZQcgAbGpBfzYCLCACKAIAIQAgBSACKQIINwOoAyAFIAIpAgA3A6ADIAAgBUGgA2ogBBAZQcgAbGooAighASAFIAIpAgg3A5gDIAUgAikCADcDkAMgACAFQZADaiABEBlByABsaiAENgIwDAELIAIoAgAgBSACKQIINwOoBiAFIAIpAgA3A6AGIAVBoAZqIAMQGUHIAGxqKAIoIQYgAigCACEHIAUgAikCCDcDmAYgBSACKQIANwOQBgJAIAcgBUGQBmogBhAZQcgAbGooAjAiB0EBa0F9Sw0AIAIoAgAgBSACKQIINwOIBiAFIAIpAgA3A4AGIAVBgAZqIAYQGUHIAGxqKAI0QQFrQX1LDQAgAigCACEGIAUgAikCCDcDuAUgBSACKQIANwOwBQJAIAYgBUGwBWogBxAZQcgAbGooAgRBAEwNACACKAIAIAUgAikCCDcDqAUgBSACKQIANwOgBSAFQaAFaiAHEBlByABsaigCBCABIABBEGoQxwQNACACKAIAIAUgAikCCDcDmAUgBSACKQIANwOQBSAFQZAFaiADEBlByABsakF/NgIoIAIoAgAgBSACKQIINwOIBSAFIAIpAgA3A4AFIAVBgAVqIAMQGUHIAGxqQX82AiwgAigCACAFIAIpAgg3A/gEIAUgAikCADcD8AQgBUHwBGogBBAZQcgAbGpBfzYCLCACKAIAIQAgBSACKQIINwPoBCAFIAIpAgA3A+AEIAAgBUHgBGogBBAZQcgAbGooAighASAFIAIpAgg3A9gEIAUgAikCADcD0AQgACAFQdAEaiABEBlByABsaiAENgI0DAILIAIoAgAgBSACKQIINwPIBCAFIAIpAgA3A8AEIAVBwARqIAQQGUHIAGxqQX82AiggAigCACAFIAIpAgg3A7gEIAUgAikCADcDsAQgBUGwBGogBBAZQcgAbGpBfzYCLCACKAIAIAUgAikCCDcDqAQgBSACKQIANwOgBCAFQaAEaiADEBlByABsakF/NgIsIAIoAgAhACAFIAIpAgg3A5gEIAUgAikCADcDkAQgACAFQZAEaiADEBlByABsaigCKCEBIAUgAikCCDcDiAQgBSACKQIANwOABCAAIAVBgARqIAEQGUHIAGxqIAM2AjAMAQsgAigCACEAIAUgAikCCDcD+AUgBSACKQIANwPwBSAAIAVB8AVqIAMQGUHIAGxqKAIoIQEgBSACKQIINwPoBSAFIAIpAgA3A+AFIAAgBUHgBWogARAZQcgAbGogAzYCMCACKAIAIQAgBSACKQIINwPYBSAFIAIpAgA3A9AFIAAgBUHQBWogAxAZQcgAbGooAighASAFIAIpAgg3A8gFIAUgAikCADcDwAUgACAFQcAFaiABEBlByABsaiAENgI0CyAFQdAGaiQAC1UCAnwBfyABQQAgAUEAShshASAAtyIDIQIDfyABIARGBH8gAyACo5siAplEAAAAAAAA4EFjBEAgAqoPC0GAgICAeAUgBEEBaiEEIAIQrQchAgwBCwsLPgECfCAAIAErAwAiAhAyOQMAIAAgASsDCCIDEDI5AwggACACIAErAxCgEDI5AxAgACADIAErAxigEDI5AxgLLAEBfyAAKAIEIgIE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RQRAAkAgASADKAK4ASACQQJ0aigCACIDECEiBUGABCABKAIAEQMABEAgBCAFNgIAQaG4BCAEECoMAQtBEBBSIgYgAzYCDCAGIAU2AgggASAGQQEgASgCABEDABoLIAMgARD0CSACQQFqIQIMAQsLIARBEGokAAsoAQF/A38gAAR/IAAoAgQQ9QkgAWpBAWohASAAKAIAIQAMAQUgAQsLC00BAn8gARAhIgMEQAJAIANB4jdBBxDqAQ0AIAAgARAhQYAEIAAoAgARAwAiAEUNACAAKAIMIQILIAIPC0GI1AFB6/sAQQxBnvcAEAAACxkAIABB5PwJQZTuCSgCABCTASIAEPQJIAAL8gECA38GfCAAIAEoAiwgASgCCCIDIAEoAgQiAUEBayICQQAgASACTxtsQQR0aiICKQMANwMQIAAgAikDCDcDGCAAIAIpAwg3AwggACACKQMANwMAQQEgAyADQQFNGyEDIAArAxghBSAAKwMIIQYgACsDECEHIAArAwAhCEEBIQEDQCABIANGBEAgACAFOQMYIAAgBjkDCCAAIAc5AxAgACAIOQMABSAFIAIgAUEEdGoiBCsDCCIJIAUgCWQbIQUgByAEKwMAIgogByAKZBshByAGIAkgBiAJYxshBiAIIAogCCAKYxshCCABQQFqIQEMAQsLCyoBAX8CQCABRQ0AIAAgARBFIgBFDQAgAC0AAEUNACAAEGhBAXMhAgsgAgtRAQF/AkACQCADRQ0AIANBOhDNASIERQ0AIARBADoAACAAIAIgAyAEQQFqIgMgAREHACAEQTo6AAAMAQsgACACIANBACABEQcACyAAIAM2AiQLXAAgASgCCEUEQCAAIAEQ1QYLIAIgAEGc3QooAgAgASsDAEQAAAAAAADwPxBMOQMAIAIgAEGg3QooAgAgASgCCBCPATYCCCACIABBpN0KKAIAIAEoAgwQjwE2AgwLlwQCCHwIfyMAQUBqIgwkACABKAIAIQ8gAisDCCEGIAIrAwAhByABKAIEIRBE////////738hA0F/IQ1BfyECA0ACQCALIBBGBEAgDyANQTBsaiIBKAIAIAIgAiABKAIEQQFrRmsiASABQQNwa0EEdGohAkEAIQEMAQsgDyALQTBsaiIBKAIEIREgASgCACESQQAhAQNAIAEgEUYEQCALQQFqIQsMAwUgEiABQQR0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dSAGQRBqJAAgBUHomws2AghBhJ0LIAUoAggQogIaQYidC0EBOgAACyAFQRBqJABBjJ0LQYSdCxDcCkGQnQtBAToAAAsgAEGMnQsoAgAiADYCACAAENsKCxEAIABB6JsLRwRAIAAQ3goLCxMAIAAgASgCACIANgIAIAAQ2woLnQEBBH8gAEG4swk2AgAgAEEIaiEBA0AgARDEAiACSwRAIAEgAhCdAygCAARAIAEgAhCdAygCABCRBQsgAkEBaiECDAELCyAAQZABahA1GiMAQRBrIgIkACACQQxqIAEQogIiASgCACIDKAIABEAgAxDfCiABKAIAGiABKAIAEJwDIAEoAgAiASgCACABEL8KGhC+CgsgAkEQaiQAIAALDwAgACAAKAIEQQFqNgIECwwAIAAgACgCABDACgt7AQN/IwBBEGsiBCQAIARBBGoiAiAANgIAIAIgACgCBCIDNgIEIAIgAyABQQJ0ajYCCCACIgMoAgQhASACKAIIIQIDQCABIAJGBEAgAygCACADKAIENgIEIARBEGokAAUgABCcAxogARDBCiADIAFBBGoiATYCBAwBCwsLIAAgAEGIvAk2AgAgACgCCBBmRwRAIAAoAggQmwsLIAALBABBfwumAQEDfyMAQRBrIgQkACMAQSBrIgMkACADQRhqIAAgARDGCiADQRBqIAMoAhggAygCHCACEKsLIAMoAhAhBSMAQRBrIgEkACABIAA2AgwgAUEMaiIAIAUgABD1BmtBAnUQ+wYhACABQRBqJAAgAyAANgIMIAMgAiADKAIUEKQDNgIIIARBCGogA0EMaiADQQhqEPsBIANBIGokACAEKAIMIARBEGokAAuBBgEKfyMAQRBrIhMkACACIAA2AgBBBEEAIAcbIRUgA0GABHEhFgNAIBRBBEYEQCANECVBAUsEQCATIA0Q3gE2AgwgAiATQQxqQQEQ+wYgDRDyAiACKAIAEOMKNgIACyADQbABcSIDQRBHBEAgASADQSBGBH8gAigCAAUgAAs2AgALIBNBEGokAAUCQAJAAkACQAJAAkAgCCAUai0AAA4FAAEDAgQFCyABIAIoAgA2AgAMBAsgASACKAIANgIAIAZBIBDRASEHIAIgAigCACIPQQRqNgIAIA8gBzYCAAwDCyANEPYBDQIgDUEAEJoFKAIAIQcgAiACKAIAIg9BBGo2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QQFqIQUgAUEBaiEBDAELCyADQQA6AAcgBSADQQdqENIBIANBEGokAAwBCxDKAQALCw8AIAAgACgCGCABajYCGAsXACAAIAI2AhwgACABNgIUIAAgATYCGAtXAQJ/AkAgACgCACICRQ0AAn8gAigCGCIDIAIoAhxGBEAgAiABIAIoAgAoAjQRAAAMAQsgAiADQQRqNgIYIAMgATYCACABC0F/EMgCRQ0AIABBADYCAAsLMQEBfyAAKAIMIgEgACgCEEYEQCAAIAAoAgAoAigRAgAPCyAAIAFBBGo2AgwgASgCAAsnAQF/IAAoAgwiASAAKAIQRgRAIAAgACgCACgCJBECAA8LIAEoAgALJwEBfwJAIAAoAgAiAkUNACACIAEQvQtBfxDIAkUNACAAQQA2AgALC1MBA38CQEF/IAAoAkwQyAJFBEAgACgCTCEADAELIAAjAEEQayIBJAAgAUEMaiICIAAQUyACEMwBQSAQmwEhACACEFAgAUEQaiQAIAA2AkwLIADACxoAIAAgASABKAIAQQxrKAIAaigCGDYCACAACwsAIABB4JoLEKkCCw0AIAAgASACQQAQogcLCQAgABCSBxAYCz0BAX8gACgCGCICIAAoAhxGBEAgACABEKYDIAAoAgAoAjQRAAAPCyAAIAJBAWo2AhggAiABOgAAIAEQpgMLNAEBfyAAKAIMIgEgACgCEEYEQCAAIAAoAgAoAigRAgAPCyAAIAFBAWo2AgwgASwAABCmAwsqAQF/IAAoAgwiASAAKAIQRgRAIAAgACgCACgCJBECAA8LIAEsAAAQpgMLDwAgACAAKAIAKAIYEQIACwgAIAAoAhBFCwQAQX8LLAAgACABEK4HIgFFBEAPCwJAIAMEQCAAIAEgAhCoBAwBCyAAIAEgAhC7CwsLCAAgABCLBxoLvg8CBX8PfiMAQdACayIFJAAgBEL///////8/gyEKIAJC////////P4MhCyACIASFQoCAgICAgICAgH+DIQwgBEIwiKdB//8BcSEIAkACQCACQjCIp0H//wFxIglB//8Ba0GCgH5PBEAgCEH//wFrQYGAfksNAQsgAVAgAkL///////////8AgyINQoCAgICAgMD//wBUIA1CgICAgICAwP//AFEbRQRAIAJCgICAgICAIIQhDAwCCyADUCAEQv///////////wCDIgJCgICAgICAwP//AFQgAkKAgICAgIDA//8AURtFBEAgBEKAgICAgIAghCEMIAMhAQwCCyABIA1CgICAgICAwP//AIWEUARAIAMgAkKAgICAgIDA//8AhYRQBEBCACEBQoCAgICAgOD//wAhDAwDCyAMQoCAgICAgMD//wCEIQxCACEBDAILIAMgAkKAgICAgIDA//8AhYRQBEBCACEBDAILIAEgDYRQBEBCgICAgICA4P//ACAMIAIgA4RQGyEMQgAhAQwCCyACIAOEUARAIAxCgICAgICAwP//AIQhDEIAIQEMAgsgDUL///////8/WARAIAVBwAJqIAEgCyABIAsgC1AiBht5IAZBBnStfKciBkEPaxCxAUEQIAZrIQYgBSkDyAIhCyAFKQPAAiEBCyACQv///////z9WDQAgBUGwAmogAyAKIAMgCiAKUCIHG3kgB0EGdK18pyIHQQ9rELEBIAYgB2pBEGshBiAFKQO4AiEKIAUpA7ACIQMLIAVBoAJqIApCgICAgICAwACEIhJCD4YgA0IxiIQiAkIAQoCAgICw5ryC9QAgAn0iBEIAEJwBIAVBkAJqQgAgBSkDqAJ9QgAgBEIAEJwBIAVBgAJqIAUpA5gCQgGGIAUpA5ACQj+IhCIEQgAgAkIAEJwBIAVB8AFqIARCAEIAIAUpA4gCfUIAEJwBIAVB4AFqIAUpA/gBQgGGIAUpA/ABQj+IhCIEQgAgAkIAEJwBIAVB0AFqIARCAEIAIAUpA+gBfUIAEJwBIAVBwAFqIAUpA9gBQgGGIAUpA9ABQj+IhCIEQgAgAkIAEJwBIAVBsAFqIARCAEIAIAUpA8gBfUIAEJwBIAVBoAFqIAJCACAFKQO4AUIBhiAFKQOwAUI/iIRCAX0iAkIAEJwBIAVBkAFqIANCD4ZCACACQgAQnAEgBUHwAGogAkIAQgAgBSkDqAEgBSkDoAEiDSAFKQOYAXwiBCANVK18IARCAVatfH1CABCcASAFQYABakIBIAR9QgAgAkIAEJwBIAYgCSAIa2ohBgJ/IAUpA3AiE0IBhiIOIAUpA4gBIg9CAYYgBSkDgAFCP4iEfCIQQufsAH0iFEIgiCICIAtCgICAgICAwACEIhVCAYYiFkIgiCIEfiIRIAFCAYYiDUIgiCIKIBAgFFatIA4gEFatIAUpA3hCAYYgE0I/iIQgD0I/iHx8fEIBfSITQiCIIhB+fCIOIBFUrSAOIA4gE0L/////D4MiEyABQj+IIhcgC0IBhoRC/////w+DIgt+fCIOVq18IAQgEH58IAQgE34iESALIBB+fCIPIBFUrUIghiAPQiCIhHwgDiAOIA9CIIZ8Ig5WrXwgDiAOIBRC/////w+DIhQgC34iESACIAp+fCIPIBFUrSAPIA8gEyANQv7///8PgyIRfnwiD1atfHwiDlatfCAOIAQgFH4iGCAQIBF+fCIEIAIgC358IgsgCiATfnwiEEIgiCALIBBWrSAEIBhUrSAEIAtWrXx8QiCGhHwiBCAOVK18IAQgDyACIBF+IgIgCiAUfnwiCkIgiCACIApWrUIghoR8IgIgD1StIAIgEEIghnwgAlStfHwiAiAEVK18IgRC/////////wBYBEAgFiAXhCEVIAVB0ABqIAIgBCADIBIQnAEgAUIxhiAFKQNYfSAFKQNQIgFCAFKtfSEKQgAgAX0hCyAGQf7/AGoMAQsgBUHgAGogBEI/hiACQgGIhCICIARCAYgiBCADIBIQnAEgAUIwhiAFKQNofSAFKQNgIg1CAFKtfSEKQgAgDX0hCyABIQ0gBkH//wBqCyIGQf//AU4EQCAMQoCAgICAgMD//wCEIQxCACEBDAELAn4gBkEASgRAIApCAYYgC0I/iIQhASAEQv///////z+DIAatQjCGhCEKIAtCAYYMAQsgBkGPf0wEQEIAIQEMAgsgBUFAayACIARBASAGaxCnAyAFQTBqIA0gFSAGQfAAahCxASAFQSBqIAMgEiAFKQNAIgIgBSkDSCIKEJwBIAUpAzggBSkDKEIBhiAFKQMgIgFCP4iEfSAFKQMwIgQgAUIBhiINVK19IQEgBCANfQshBCAFQRBqIAMgEkIDQgAQnAEgBSADIBJCBUIAEJwBIAogAiACIAMgBCACQgGDIgR8IgNUIAEgAyAEVK18IgEgElYgASASURutfCICVq18IgQgAiACIARCgICAgICAwP//AFQgAyAFKQMQViABIAUpAxgiBFYgASAEURtxrXwiAlatfCIEIAIgBEKAgICAgIDA//8AVCADIAUpAwBWIAEgBSkDCCIDViABIANRG3GtfCIBIAJUrXwgDIQhDAsgACABNwMAIAAgDDcDCCAFQdACaiQAC8ABAgF/An5BfyEDAkAgAEIAUiABQv///////////wCDIgRCgICAgICAwP//AFYgBEKAgICAgIDA//8AURsNACACQv///////////wCDIgVCgICAgICAwP//AFYgBUKAgICAgIDA//8AUnENACAAIAQgBYSEUARAQQAPCyABIAKDQgBZBEAgASACUiABIAJTcQ0BIAAgASAChYRCAFIPCyAAQgBSIAEgAlUgASACURsNACAAIAEgAoWEQgBSIQMLIAMLHgEBfyAAEOwBIgEEQCAAIAEQygsgAEGVlgUQ4gELC58DAQV/QRAhAgJAQRAgACAAQRBNGyIDIANBAWtxRQRAIAMhAAwBCwNAIAIiAEEBdCECIAAgA0kNAAsLQUAgAGsgAU0EQEH8gAtBMDYCAEEADwtBECABQQtqQXhxIAFBC0kbIgMgAGpBDGoQTyICRQRAQQAPCyACQQhrIQECQCAAQQFrIAJxRQRAIAEhAAwBCyACQQRrIgUoAgAiBkF4cSAAIAJqQQFrQQAgAGtxQQhrIgIgAEEAIAIgAWtBD00baiIAIAFrIgJrIQQgBkEDcUUEQCABKAIAIQEgACAENgIEIAAgASACajYCAAwBCyAAIAQgACgCBEEBcXJBAnI2AgQgACAEaiIEIAQoAgRBAXI2AgQgBSACIAUoAgBBAXFyQQJyNgIAIAEgAmoiBCAEKAIEQQFyNgIEIAEgAhCtBQsCQCAAKAIEIgFBA3FFDQAgAUF4cSICIANBEGpNDQAgACADIAFBAXFyQQJyNgIEIAAgA2oiASACIANrIgNBA3I2AgQgACACaiICIAIoAgRBAXI2AgQgASADEK0FCyAAQQhqCxIAIABFBEBBAA8LIAAgARCYBwtZAQN/IAAQLSEDIAAQrwUiAEEAIABBAEobIQRBACEAA0AgASgCDCECIAAgBEYEQCACEBgFIAMgAiAAQQJ0aigCACICIAIQdkEARxCMARogAEEBaiEADAELCwvlHgIPfwV+IwBBkAFrIgUkACAFQQBBkAEQOCIFQX82AkwgBSAANgIsIAVBjAQ2AiAgBSAANgJUIAEhBCACIRBBACEAIwBBsAJrIgYkACAFIgMoAkwaAkACQCADKAIERQRAIAMQvgUaIAMoAgRFDQELIAQtAAAiAUUNAQJAAkACQAJAAkADQAJAAkAgAUH/AXEiARDKAgRAA0AgBCIBQQFqIQQgAS0AARDKAg0ACyADQgAQjwIDQAJ/IAMoAgQiAiADKAJoRwRAIAMgAkEBajYCBCACLQAADAELIAMQVgsQygINAAsgAygCBCEEIAMpA3BCAFkEQCADIARBAWsiBDYCBAsgBCADKAIsa6wgAykDeCAVfHwhFQwBCwJ/AkACQCABQSVGBEAgBC0AASIBQSpGDQEgAUElRw0CCyADQgAQjwICQCAELQAAQSVGBEADQAJ/IAMoAgQiASADKAJoRwRAIAMgAUEBajYCBCABLQAADAELIAMQVgsiARDKAg0ACyAEQQFqIQQMAQsgAygCBCIBIAMoAmhHBEAgAyABQQFqNgIEIAEtAAAhAQwBCyADEFYhAQsgBC0AACABRwRAIAMpA3BCAFkEQCADIAMoAgRBAWs2AgQLIAFBAE4gDnINDQwMCyADKAIEIAMoAixrrCADKQN4IBV8fCEVIAQhAQwDC0EAIQggBEECagwBCwJAIAFBMGsiAkEJSw0AIAQtAAJBJEcNACMAQRBrIgEgEDYCDCABIBAgAkECdGpBBGsgECACQQFLGyIBQQRqNgIIIAEoAgAhCCAEQQNqDAELIBAoAgAhCCAQQQRqIRAgBEEBagshAUEAIQ9BACEHIAEtAAAiBEEwa0EJTQRAA0AgB0EKbCAEakEwayEHIAEtAAEhBCABQQFqIQEgBEEwa0EKSQ0ACwsgBEHtAEcEfyABBUEAIQwgCEEARyEPIAEtAAEhBEEAIQAgAUEBagsiCUEBaiEBQQMhAiAPIQUCQAJAAkACQAJAAkAgBEH/AXFBwQBrDjoEDAQMBAQEDAwMDAMMDAwMDAwEDAwMDAQMDAQMDAwMDAQMBAQEBAQABAUMAQwEBAQMDAQCBAwMBAwCDAsgCUECaiABIAktAAFB6ABGIgIbIQFBfkF/IAIbIQIMBAsgCUECaiABIAktAAFB7ABGIgIbIQFBA0EBIAIbIQIMAwtBASECDAILQQIhAgwBC0EAIQIgCSEBC0EBIAIgAS0AACIFQS9xQQNGIgIbIRECQCAFQSByIAUgAhsiDUHbAEYNAAJAIA1B7gBHBEAgDUHjAEcNAUEBIAcgB0EBTBshBwwCCyAIIBEgFRDMCwwCCyADQgAQjwIDQAJ/IAMoAgQiAiADKAJoRwRAIAMgAkEBajYCBCACLQAADAELIAMQVgsQygINAAsgAygCBCEEIAMpA3BCAFkEQCADIARBAWsiBDYCBAsgBCADKAIsa6wgAykDeCAVfHwhFQsgAyAHrCIUEI8CAkAgAygCBCICIAMoAmhHBEAgAyACQQFqNgIEDAELIAMQVkEASA0GCyADKQNwQgBZBEAgAyADKAIEQQFrNgIEC0EQIQQCQAJAAkACQAJAAkACQAJAAkACQCANQdgAaw4hBgkJAgkJCQkJAQkCBAEBAQkFCQkJCQkDBgkJAgkECQkGAAsgDUHBAGsiAkEGS0EBIAJ0QfEAcUVyDQgLIAZBCGogAyARQQAQ2AsgAykDeEIAIAMoAgQgAygCLGusfVINBQwMCyANQRByQfMARgRAIAZBIGpBf0GBAhA4GiAGQQA6ACAgDUHzAEcNBiAGQQA6AEEgBkEAOgAuIAZBADYBKgwGCyAGQSBqIAEtAAEiBEHeAEYiBUGBAhA4GiAGQQA6ACAgAUECaiABQQFqIAUbIQICfwJAAkAgAUECQQEgBRtqLQAAIgFBLUcEQCABQd0ARg0BIARB3gBHIQogAgwDCyAGIARB3gBHIgo6AE4MAQsgBiAEQd4ARyIKOgB+CyACQQFqCyEBA0ACQCABLQAAIgJBLUcEQCACRQ0PIAJB3QBGDQgMAQtBLSECIAEtAAEiCUUgCUHdAEZyDQAgAUEBaiEFAkAgCSABQQFrLQAAIgRNBEAgCSECDAELA0AgBEEBaiIEIAZBIGpqIAo6AAAgBCAFLQAAIgJJDQALCyAFIQELIAIgBmogCjoAISABQQFqIQEMAAsAC0EIIQQMAgtBCiEEDAELQQAhBAtCACESQQAhC0EAIQpBACEJIwBBEGsiByQAAkAgBEEBRyAEQSRNcUUEQEH8gAtBHDYCAAwBCwNAAn8gAygCBCICIAMoAmhHBEAgAyACQQFqNgIEIAItAAAMAQsgAxBWCyICEMoCDQALAkACQCACQStrDgMAAQABC0F/QQAgAkEtRhshCSADKAIEIgIgAygCaEcEQCADIAJBAWo2AgQgAi0AACECDAELIAMQViECCwJAAkACQAJAIARBAEcgBEEQR3EgAkEwR3JFBEACfyADKAIEIgIgAygCaEcEQCADIAJBAWo2AgQgAi0AAAwBCyADEFYLIgJBX3FB2ABGBEBBECEEAn8gAygCBCICIAMoAmhHBEAgAyACQQFqNgIEIAItAAAMAQsgAxBWCyICQZGNCWotAABBEEkNAyADKQNwQgBZBEAgAyADKAIEQQFrNgIECyADQgAQjwIMBgsgBA0BQQghBAwCCyAEQQogBBsiBCACQZGNCWotAABLDQAgAykDcEIAWQRAIAMgAygCBEEBazYCBAsgA0IAEI8CQfyAC0EcNgIADAQLIARBCkcNACACQTBrIgtBCU0EQEEAIQIDQCACQQpsIAtqIgJBmbPmzAFJAn8gAygCBCIFIAMoAmhHBEAgAyAFQQFqNgIEIAUtAAAMAQsgAxBWC0EwayILQQlNcQ0ACyACrSESCyALQQlLDQIgEkIKfiEUIAutIRMDQAJAAn8gAygCBCICIAMoAmhHBEAgAyACQQFqNgIEIAItAAAMAQsgAxBWCyICQTBrIgVBCU0gEyAUfCISQpqz5syZs+bMGVRxRQRAIAVBCU0NAQwFCyASQgp+IhQgBa0iE0J/hVgNAQsLQQohBAwBCyAEIARBAWtxBEAgAkGRjQlqLQAAIgogBEkEQANAIAogBCALbGoiC0HH4/E4SQJ/IAMoAgQiAiADKAJoRwRAIAMgAkEBajYCBCACLQAADAELIAMQVgsiAkGRjQlqLQAAIgogBElxDQALIAutIRILIAQgCk0NASAErSEWA0AgEiAWfiIUIAqtQv8BgyITQn+FVg0CIBMgFHwhEiAEAn8gAygCBCICIAMoAmhHBEAgAyACQQFqNgIEIAItAAAMAQsgAxBWCyICQZGNCWotAAAiCk0NAiAHIBZCACASQgAQnAEgBykDCFANAAsMAQsgBEEXbEEFdkEHcUGRjwlqLAAAIQUgAkGRjQlqLQAAIgsgBEkEQANAIAsgCiAFdCICciEKIAJBgICAwABJAn8gAygCBCICIAMoAmhHBEAgAyACQQFqNgIEIAItAAAMAQsgAxBWCyICQZGNCWotAAAiCyAESXENAAsgCq0hEgsgBCALTQ0AQn8gBa0iFIgiEyASVA0AA0AgC61C/wGDIBIgFIaEIRIgBAJ/IAMoAgQiAiADKAJoRwRAIAMgAkEBajYCBCACLQAADAELIAMQVgsiAkGRjQlqLQAAIgtNDQEgEiATWA0ACwsgBCACQZGNCWotAABNDQADQCAEAn8gAygCBCICIAMoAmhHBEAgAyACQQFqNgIEIAItAAAMAQsgAxBWC0GRjQlqLQAASw0AC0H8gAtBxAA2AgBBACEJQn8hEgsgAykDcEIAWQRAIAMgAygCBEEBazYCBAsgCUEBckUgEkJ/UXEEQEH8gAtBxAA2AgBCfiESDAELIBIgCawiE4UgE30hEgsgB0EQaiQAIAMpA3hCACADKAIEIAMoAixrrH1RDQcgCEUgDUHwAEdyRQRAIAggEj4CAAwDCyAIIBEgEhDMCwwCCyAIRQ0BIAYpAxAhFCAGKQMIIRMCQAJAAkAgEQ4DAAECBAsgCCATIBQQqwU4AgAMAwsgCCATIBQQlwc5AwAMAgsgCCATNwMAIAggFDcDCAwBC0EfIAdBAWogDUHjAEciCRshAgJAIBFBAUYEQCAIIQcgDwRAIAJBAnQQTyIHRQ0HCyAGQgA3AqgCQQAhBANAIAchAAJAA0ACfyADKAIEIgUgAygCaEcEQCADIAVBAWo2AgQgBS0AAAwBCyADEFYLIgUgBmotACFFDQEgBiAFOgAbIAZBHGogBkEbakEBIAZBqAJqEK4FIgVBfkYNACAFQX9GBEBBACEMDAwLIAAEQCAAIARBAnRqIAYoAhw2AgAgBEEBaiEECyAPRSACIARHcg0AC0EBIQVBACEMIAAgAkEBdEEBciICQQJ0EGoiBw0BDAsLC0EAIQwgACECIAZBqAJqBH8gBigCqAIFQQALDQgMAQsgDwRAQQAhBCACEE8iB0UNBgNAIAchAANAAn8gAygCBCIFIAMoAmhHBEAgAyAFQQFqNgIEIAUtAAAMAQsgAxBWCyIFIAZqLQAhRQRAQQAhAiAAIQwMBAsgACAEaiAFOgAAIARBAWoiBCACRw0AC0EBIQUgACACQQF0QQFyIgIQaiIHDQALIAAhDEEAIQAMCQtBACEEIAgEQANAAn8gAygCBCIAIAMoAmhHBEAgAyAAQQFqNgIEIAAtAAAMAQsgAxBWCyIAIAZqLQAhBEAgBCAIaiAAOgAAIARBAWohBAwBBUEAIQIgCCIAIQwMAwsACwALA0ACfyADKAIEIgAgAygCaEcEQCADIABBAWo2AgQgAC0AAAwBCyADEFYLIAZqLQAhDQALQQAhAEEAIQxBACECCyADKAIEIQcgAykDcEIAWQRAIAMgB0EBayIHNgIECyADKQN4IAcgAygCLGusfCITUCAJIBMgFFFyRXINAiAPBEAgCCAANgIACwJAIA1B4wBGDQAgAgRAIAIgBEECdGpBADYCAAsgDEUEQEEAIQwMAQsgBCAMakEAOgAACyACIQALIAMoAgQgAygCLGusIAMpA3ggFXx8IRUgDiAIQQBHaiEOCyABQQFqIQQgAS0AASIBDQEMCAsLIAIhAAwBC0EBIQVBACEMQQAhAAwCCyAPIQUMAgsgDyEFCyAOQX8gDhshDgsgBUUNASAMEBggABAYDAELQX8hDgsgBkGwAmokACADQZABaiQAIA4LQwACQCAARQ0AAkACQAJAAkAgAUECag4GAAECAgQDBAsgACACPAAADwsgACACPQEADwsgACACPgIADwsgACACNwMACwsPACAAIAEgAkEAQQAQmQcLFQEBfxDtAyEAQQ9B0N0KKAIAIAAbC7wCAAJAAkACQAJAAkACQAJAAkACQAJAAkAgAUEJaw4SAAgJCggJAQIDBAoJCgoICQUGBwsgAiACKAIAIgFBBGo2AgAgACABKAIANgIADwsgAiACKAIAIgFBBGo2AgAgACABMgEANwMADwsgAiACKAIAIgFBBGo2AgAgACABMwEANwMADwsgAiACKAIAIgFBBGo2AgAgACABMAAANwMADwsgAiACKAIAIgFBBGo2AgAgACABMQAANwMADwsgAiACKAIAQQdqQXhxIgFBCGo2AgAgACABKwMAOQMADwsgACACIAMRBAALDwsgAiACKAIAIgFBBGo2AgAgACABNAIANwMADwsgAiACKAIAIgFBBGo2AgAgACABNQIANwMADwsgAiACKAIAQQdqQXhxIgFBCGo2AgAgACABKQMANwMAC28BBX8gACgCACIDLAAAQTBrIgFBCUsEQEEADwsDQEF/IQQgAkHMmbPmAE0EQEF/IAEgAkEKbCIFaiABIAVB/////wdzSxshBAsgACADQQFqIgU2AgAgAywAASAEIQIgBSEDQTBrIgFBCkkNAAsgAgv1EgISfwJ+IwBBQGoiCCQAIAggATYCPCAIQSdqIRYgCEEoaiERAkACQAJAAkADQEEAIQcDQCABIQ0gByAOQf////8Hc0oNAiAHIA5qIQ4CQAJAAkACQCABIgctAAAiCwRAA0ACQAJAIAtB/wFxIgFFBEAgByEBDAELIAFBJUcNASAHIQsDQCALLQABQSVHBEAgCyEBDAILIAdBAWohByALLQACIAtBAmoiASELQSVGDQALCyAHIA1rIgcgDkH/////B3MiF0oNCSAABEAgACANIAcQpAELIAcNByAIIAE2AjwgAUEBaiEHQX8hEAJAIAEsAAFBMGsiCkEJSw0AIAEtAAJBJEcNACABQQNqIQdBASESIAohEAsgCCAHNgI8QQAhDAJAIAcsAAAiC0EgayIBQR9LBEAgByEKDAELIAchCkEBIAF0IgFBidEEcUUNAANAIAggB0EBaiIKNgI8IAEgDHIhDCAHLAABIgtBIGsiAUEgTw0BIAohB0EBIAF0IgFBidEEcQ0ACwsCQCALQSpGBEACfwJAIAosAAFBMGsiAUEJSw0AIAotAAJBJEcNAAJ/IABFBEAgBCABQQJ0akEKNgIAQQAMAQsgAyABQQN0aigCAAshDyAKQQNqIQFBAQwBCyASDQYgCkEBaiEBIABFBEAgCCABNgI8QQAhEkEAIQ8MAwsgAiACKAIAIgdBBGo2AgAgBygCACEPQQALIRIgCCABNgI8IA9BAE4NAUEAIA9rIQ8gDEGAwAByIQwMAQsgCEE8ahDQCyIPQQBIDQogCCgCPCEBC0EAIQdBfyEJAn9BACABLQAAQS5HDQAaIAEtAAFBKkYEQAJ/AkAgASwAAkEwayIKQQlLDQAgAS0AA0EkRw0AIAFBBGohAQJ/IABFBEAgBCAKQQJ0akEKNgIAQQAMAQsgAyAKQQN0aigCAAsMAQsgEg0GIAFBAmohAUEAIABFDQAaIAIgAigCACIKQQRqNgIAIAooAgALIQkgCCABNgI8IAlBAE4MAQsgCCABQQFqNgI8IAhBPGoQ0AshCSAIKAI8IQFBAQshEwNAIAchFEEcIQogASIYLAAAIgdB+wBrQUZJDQsgAUEBaiEBIAcgFEE6bGpB34cJai0AACIHQQFrQQhJDQALIAggATYCPAJAIAdBG0cEQCAHRQ0MIBBBAE4EQCAARQRAIAQgEEECdGogBzYCAAwMCyAIIAMgEEEDdGopAwA3AzAMAgsgAEUNCCAIQTBqIAcgAiAGEM8LDAELIBBBAE4NC0EAIQcgAEUNCAsgAC0AAEEgcQ0LIAxB//97cSILIAwgDEGAwABxGyEMQQAhEEHEEyEVIBEhCgJAAkACfwJAAkACQAJAAkACQAJ/AkACQAJAAkACQAJAAkAgGCwAACIHQVNxIAcgB0EPcUEDRhsgByAUGyIHQdgAaw4hBBYWFhYWFhYWEBYJBhAQEBYGFhYWFgIFAxYWChYBFhYEAAsCQCAHQcEAaw4HEBYLFhAQEAALIAdB0wBGDQsMFQsgCCkDMCEaQcQTDAULQQAhBwJAAkACQAJAAkACQAJAIBRB/wFxDggAAQIDBBwFBhwLIAgoAjAgDjYCAAwbCyAIKAIwIA42AgAMGgsgCCgCMCAOrDcDAAwZCyAIKAIwIA47AQAMGAsgCCgCMCAOOgAADBcLIAgoAjAgDjYCAAwWCyAIKAIwIA6sNwMADBULQQggCSAJQQhNGyEJIAxBCHIhDEH4ACEHCyARIQEgB0EgcSELIAgpAzAiGiIZUEUEQANAIAFBAWsiASAZp0EPcUHwiwlqLQAAIAtyOgAAIBlCD1YgGUIEiCEZDQALCyABIQ0gDEEIcUUgGlByDQMgB0EEdkHEE2ohFUECIRAMAwsgESEBIAgpAzAiGiIZUEUEQANAIAFBAWsiASAZp0EHcUEwcjoAACAZQgdWIBlCA4ghGQ0ACwsgASENIAxBCHFFDQIgCSARIAFrIgFBAWogASAJSBshCQwCCyAIKQMwIhpCAFMEQCAIQgAgGn0iGjcDMEEBIRBBxBMMAQsgDEGAEHEEQEEBIRBBxRMMAQtBxhNBxBMgDEEBcSIQGwshFSAaIBEQ4wMhDQsgEyAJQQBIcQ0RIAxB//97cSAMIBMbIQwgGkIAUiAJckUEQCARIQ1BACEJDA4LIAkgGlAgESANa2oiASABIAlIGyEJDA0LIAgtADAhBwwLCyAIKAIwIgFBsKQDIAEbIg1B/////wcgCSAJQf////8HTxsQ3AsiASANaiEKIAlBAE4EQCALIQwgASEJDAwLIAshDCABIQkgCi0AAA0PDAsLIAgpAzAiGVBFDQFBACEHDAkLIAkEQCAIKAIwDAILQQAhByAAQSAgD0EAIAwQswEMAgsgCEEANgIMIAggGT4CCCAIIAhBCGoiBzYCMEF/IQkgBwshC0EAIQcDQAJAIAsoAgAiDUUNACAIQQRqIA0QyQsiDUEASA0PIA0gCSAHa0sNACALQQRqIQsgByANaiIHIAlJDQELC0E9IQogB0EASA0MIABBICAPIAcgDBCzASAHRQRAQQAhBwwBC0EAIQogCCgCMCELA0AgCygCACINRQ0BIAhBBGoiCSANEMkLIg0gCmoiCiAHSw0BIAAgCSANEKQBIAtBBGohCyAHIApLDQALCyAAQSAgDyAHIAxBgMAAcxCzASAPIAcgByAPSBshBwwICyATIAlBAEhxDQlBPSEKIAAgCCsDMCAPIAkgDCAHIAURSAAiB0EATg0HDAoLIActAAEhCyAHQQFqIQcMAAsACyAADQkgEkUNA0EBIQcDQCAEIAdBAnRqKAIAIgAEQCADIAdBA3RqIAAgAiAGEM8LQQEhDiAHQQFqIgdBCkcNAQwLCwsgB0EKTwRAQQEhDgwKCwNAIAQgB0ECdGooAgANAUEBIQ4gB0EBaiIHQQpHDQALDAkLQRwhCgwGCyAIIAc6ACdBASEJIBYhDSALIQwLIAkgCiANayILIAkgC0obIgEgEEH/////B3NKDQNBPSEKIA8gASAQaiIJIAkgD0gbIgcgF0oNBCAAQSAgByAJIAwQswEgACAVIBAQpAEgAEEwIAcgCSAMQYCABHMQswEgAEEwIAEgC0EAELMBIAAgDSALEKQBIABBICAHIAkgDEGAwABzELMBIAgoAjwhAQwBCwsLQQAhDgwDC0E9IQoLQfyACyAKNgIAC0F/IQ4LIAhBQGskACAOC38CAX8BfiAAvSIDQjSIp0H/D3EiAkH/D0cEfCACRQRAIAEgAEQAAAAAAAAAAGEEf0EABSAARAAAAAAAAPBDoiABENILIQAgASgCAEFAags2AgAgAA8LIAEgAkH+B2s2AgAgA0L/////////h4B/g0KAgICAgICA8D+EvwUgAAsLawECfwJAIABBf0YNACABKAJMQQBIIQMCQAJAIAEoAgQiAkUEQCABEL4FGiABKAIEIgJFDQELIAIgASgCLEEIa0sNAQsgAw0BDwsgASACQQFrIgI2AgQgAiAAOgAAIAEgASgCAEFvcTYCAAsLhAEBAn8jAEEQayIBJAACQCAAvUIgiKdB/////wdxIgJB+8Ok/wNNBEAgAkGAgIDyA0kNASAARAAAAAAAAAAAQQAQ1gshAAwBCyACQYCAwP8HTwRAIAAgAKEhAAwBCyAAIAEQqQchAiABKwMAIAErAwggAkEBcRDWCyEACyABQRBqJAAgAAvuAQEFfyABQZWWBUEQQQAQNiEEAkAgACABKAIAQQNxEKsDIgMEQAJAIAQoAggiAkUEQCAEIAAQOSABKAIAQQNxEKsDNgIIIAQgARCvBUEEEBo2AgwgA0EAQYABIAMoAgARAwAhAANAIABFDQIgACgCDBB2IQYgARAtIQIgACgCDCEFAn8gBgRAIAIgBRDVAgwBCyACIAUQrAELIQIgBCgCDCAAKAIQQQJ0aiACNgIAIAMgAEEIIAMoAgARAwAhAAwACwALIAIgA0cNAgsPC0GvI0GbugFBqgFBjikQAAALQaIjQZu6AUG4AUGOKRAAAAufAwMCfAF+An8gAL0iBUKAgICAgP////8Ag0KBgICA8ITl8j9UIgZFBEBEGC1EVPsh6T8gAJmhRAdcFDMmpoE8IAEgAZogBUIAWSIHG6GgIQBEAAAAAAAAAAAhAQsgACAAIAAgAKIiBKIiA0RjVVVVVVXVP6IgBCADIAQgBKIiAyADIAMgAyADRHNTYNvLdfO+okSmkjegiH4UP6CiRAFl8vLYREM/oKJEKANWySJtbT+gokQ31gaE9GSWP6CiRHr+EBEREcE/oCAEIAMgAyADIAMgA0TUer90cCr7PqJE6afwMg+4Ej+gokRoEI0a9yYwP6CiRBWD4P7I21c/oKJEk4Ru6eMmgj+gokT+QbMbuqGrP6CioKIgAaCiIAGgoCIDoCEBIAZFBEBBASACQQF0a7ciBCAAIAMgASABoiABIASgo6GgIgAgAKChIgAgAJogBxsPCyACBHxEAAAAAAAA8L8gAaMiBCAEvUKAgICAcIO/IgQgAyABvUKAgICAcIO/IgEgAKGhoiAEIAGiRAAAAAAAAPA/oKCiIASgBSABCwuJBAIDfwF+AkACQAJ/AkACQAJ/IAAoAgQiAiAAKAJoRwRAIAAgAkEBajYCBCACLQAADAELIAAQVgsiAkEraw4DAAEAAQsgAkEtRiABRQJ/IAAoAgQiAyAAKAJoRwRAIAAgA0EBajYCBCADLQAADAELIAAQVgsiA0E6ayIBQXVLcg0BGiAAKQNwQgBTDQIgACAAKAIEQQFrNgIEDAILIAJBOmshASACIQNBAAshBCABQXZJDQACQCADQTBrQQpPDQBBACECA0AgAyACQQpsagJ/IAAoAgQiAiAAKAJoRwRAIAAgAkEBajYCBCACLQAADAELIAAQVgshA0EwayECIAJBzJmz5gBIIANBMGsiAUEJTXENAAsgAqwhBSABQQpPDQADQCADrSAFQgp+fCEFAn8gACgCBCIBIAAoAmhHBEAgACABQQFqNgIEIAEtAAAMAQsgABBWCyIDQTBrIgFBCU0gBUIwfSIFQq6PhdfHwuujAVNxDQALIAFBCk8NAANAAn8gACgCBCIBIAAoAmhHBEAgACABQQFqNgIEIAEtAAAMAQsgABBWC0Ewa0EKSQ0ACwsgACkDcEIAWQRAIAAgACgCBEEBazYCBAtCACAFfSAFIAQbIQUMAQtCgICAgICAgICAfyEFIAApA3BCAFMNACAAIAAoAgRBAWs2AgRCgICAgICAgICAfw8LIAULnTEDEX8HfgF8IwBBMGsiDiQAAkACQCACQQJLDQAgAkECdCICQYyICWooAgAhESACQYCICWooAgAhEANAAn8gASgCBCICIAEoAmhHBEAgASACQQFqNgIEIAItAAAMAQsgARBWCyICEMoCDQALQQEhCQJAAkAgAkEraw4DAAEAAQtBf0EBIAJBLUYbIQkgASgCBCICIAEoAmhHBEAgASACQQFqNgIEIAItAAAhAgwBCyABEFYhAgsCQAJAIAJBX3FByQBGBEADQCAGQQdGDQICfyABKAIEIgIgASgCaEcEQCABIAJBAWo2AgQgAi0AAAwBCyABEFYLIQIgBkGSDGogBkEBaiEGLAAAIAJBIHJGDQALCyAGQQNHBEAgBkEIRiIHDQEgA0UgBkEESXINAiAHDQELIAEpA3AiFUIAWQRAIAEgASgCBEEBazYCBAsgA0UgBkEESXINACAVQgBTIQIDQCACRQRAIAEgASgCBEEBazYCBAsgBkEBayIGQQNLDQALCyAOIAmyQwAAgH+UEKwFIA4pAwghFSAOKQMAIRYMAgsCQAJAAkACQAJAIAYNAEEAIQYgAkFfcUHOAEcNAANAIAZBAkYNAgJ/IAEoAgQiAiABKAJoRwRAIAEgAkEBajYCBCACLQAADAELIAEQVgshAiAGQcLpAGogBkEBaiEGLAAAIAJBIHJGDQALCyAGDgQDAQEAAQsCQAJ/IAEoAgQiAiABKAJoRwRAIAEgAkEBajYCBCACLQAADAELIAEQVgtBKEYEQEEBIQYMAQtCgICAgICA4P//ACEVIAEpA3BCAFMNBSABIAEoAgRBAWs2AgQMBQsDQAJ/IAEoAgQiAiABKAJoRwRAIAEgAkEBajYCBCACLQAADAELIAEQVgsiAkEwa0EKSSACQcEAa0EaSXIgAkHfAEZyRSACQeEAa0EaT3FFBEAgBkEBaiEGDAELC0KAgICAgIDg//8AIRUgAkEpRg0EIAEpA3AiGEIAWQRAIAEgASgCBEEBazYCBAsCQCADBEAgBg0BDAYLDAILA0AgGEIAWQRAIAEgASgCBEEBazYCBAsgBkEBayIGDQALDAQLIAEpA3BCAFkEQCABIAEoAgRBAWs2AgQLC0H8gAtBHDYCACABQgAQjwIMAQsCQCACQTBHDQACfyABKAIEIgcgASgCaEcEQCABIAdBAWo2AgQgBy0AAAwBCyABEFYLQV9xQdgARgRAIwBBsANrIgUkAAJ/IAEoAgQiAiABKAJoRwRAIAEgAkEBajYCBCACLQAADAELIAEQVgshAgJAAn8DQCACQTBHBEACQCACQS5HDQQgASgCBCICIAEoAmhGDQAgASACQQFqNgIEIAItAAAMAwsFIAEoAgQiAiABKAJoRwR/QQEhDyABIAJBAWo2AgQgAi0AAAVBASEPIAEQVgshAgwBCwsgARBWCyICQTBHBEBBASELDAELA0AgGEIBfSEYAn8gASgCBCICIAEoAmhHBEAgASACQQFqNgIEIAItAAAMAQsgARBWCyICQTBGDQALQQEhC0EBIQ8LQoCAgICAgMD/PyEWA0ACQCACIQYCQAJAIAJBMGsiDEEKSQ0AIAJBLkciByACQSByIgZB4QBrQQVLcQ0CIAcNACALDQJBASELIBUhGAwBCyAGQdcAayAMIAJBOUobIQICQCAVQgdXBEAgAiAIQQR0aiEIDAELIBVCHFgEQCAFQTBqIAIQ4AEgBUEgaiAaIBZCAEKAgICAgIDA/T8QaSAFQRBqIAUpAzAgBSkDOCAFKQMgIhogBSkDKCIWEGkgBSAFKQMQIAUpAxggFyAZELIBIAUpAwghGSAFKQMAIRcMAQsgAkUgCnINACAFQdAAaiAaIBZCAEKAgICAgICA/z8QaSAFQUBrIAUpA1AgBSkDWCAXIBkQsgEgBSkDSCEZQQEhCiAFKQNAIRcLIBVCAXwhFUEBIQ8LIAEoAgQiAiABKAJoRwR/IAEgAkEBajYCBCACLQAABSABEFYLIQIMAQsLAn4gD0UEQAJAAkAgASkDcEIAWQRAIAEgASgCBCICQQFrNgIEIANFDQEgASACQQJrNgIEIAtFDQIgASACQQNrNgIEDAILIAMNAQsgAUIAEI8CCyAFQeAAakQAAAAAAAAAACAJt6YQqwIgBSkDYCEXIAUpA2gMAQsgFUIHVwRAIBUhFgNAIAhBBHQhCCAWQgF8IhZCCFINAAsLAkACQAJAIAJBX3FB0ABGBEAgASADENcLIhZCgICAgICAgICAf1INAyADBEAgASkDcEIAWQ0CDAMLQgAhFyABQgAQjwJCAAwEC0IAIRYgASkDcEIAUw0CCyABIAEoAgRBAWs2AgQLQgAhFgsgCEUEQCAFQfAAakQAAAAAAAAAACAJt6YQqwIgBSkDcCEXIAUpA3gMAQsgGCAVIAsbQgKGIBZ8QiB9IhVBACARa61VBEBB/IALQcQANgIAIAVBoAFqIAkQ4AEgBUGQAWogBSkDoAEgBSkDqAFCf0L///////+///8AEGkgBUGAAWogBSkDkAEgBSkDmAFCf0L///////+///8AEGkgBSkDgAEhFyAFKQOIAQwBCyARQeIBa6wgFVcEQCAIQQBOBEADQCAFQaADaiAXIBlCAEKAgICAgIDA/79/ELIBIBcgGUKAgICAgICA/z8QxgshASAFQZADaiAXIBkgBSkDoAMgFyABQQBOIgIbIAUpA6gDIBkgAhsQsgEgAiAIQQF0IgFyIQggFUIBfSEVIAUpA5gDIRkgBSkDkAMhFyABQQBODQALCwJ+IBVBICARa618IhanIgFBACABQQBKGyAQIBYgEK1TGyIBQfEATwRAIAVBgANqIAkQ4AEgBSkDiAMhGCAFKQOAAyEaQgAMAQsgBUHgAmpEAAAAAAAA8D9BkAEgAWsQ+QIQqwIgBUHQAmogCRDgASAFKQPQAiEaIAVB8AJqIAUpA+ACIAUpA+gCIAUpA9gCIhgQ2wsgBSkD+AIhGyAFKQPwAgshFiAFQcACaiAIIAhBAXFFIBcgGUIAQgAQqANBAEcgAUEgSXFxIgFyEOEDIAVBsAJqIBogGCAFKQPAAiAFKQPIAhBpIAVBkAJqIAUpA7ACIAUpA7gCIBYgGxCyASAFQaACaiAaIBhCACAXIAEbQgAgGSABGxBpIAVBgAJqIAUpA6ACIAUpA6gCIAUpA5ACIAUpA5gCELIBIAVB8AFqIAUpA4ACIAUpA4gCIBYgGxD4AiAFKQPwASIYIAUpA/gBIhZCAEIAEKgDRQRAQfyAC0HEADYCAAsgBUHgAWogGCAWIBWnENoLIAUpA+ABIRcgBSkD6AEMAQtB/IALQcQANgIAIAVB0AFqIAkQ4AEgBUHAAWogBSkD0AEgBSkD2AFCAEKAgICAgIDAABBpIAVBsAFqIAUpA8ABIAUpA8gBQgBCgICAgICAwAAQaSAFKQOwASEXIAUpA7gBCyEVIA4gFzcDECAOIBU3AxggBUGwA2okACAOKQMYIRUgDikDECEWDAMLIAEpA3BCAFMNACABIAEoAgRBAWs2AgQLIAEhBiACIQcgCSEMIAMhCUEAIQMjAEGQxgBrIgQkAEEAIBFrIg8gEGshFAJAAn8DQAJAIAdBMEcEQCAHQS5HDQQgBigCBCIBIAYoAmhGDQEgBiABQQFqNgIEIAEtAAAMAwsgBigCBCIBIAYoAmhHBEAgBiABQQFqNgIEIAEtAAAhBwUgBhBWIQcLQQEhAwwBCwsgBhBWCyIHQTBGBEADQCAVQgF9IRUCfyAGKAIEIgEgBigCaEcEQCAGIAFBAWo2AgQgAS0AAAwBCyAGEFYLIgdBMEYNAAtBASEDC0EBIQsLIARBADYCkAYCfgJAAkACQAJAIAdBLkYiASAHQTBrIgJBCU1yBEADQAJAIAFBAXEEQCALRQRAIBYhFUEBIQsMAgsgA0UhAQwECyAWQgF8IRYgCEH8D0wEQCANIBanIAdBMEYbIQ0gBEGQBmogCEECdGoiASAKBH8gByABKAIAQQpsakEwawUgAgs2AgBBASEDQQAgCkEBaiIBIAFBCUYiARshCiABIAhqIQgMAQsgB0EwRg0AIAQgBCgCgEZBAXI2AoBGQdyPASENCwJ/IAYoAgQiASAGKAJoRwRAIAYgAUEBajYCBCABLQAADAELIAYQVgsiB0EuRiIBIAdBMGsiAkEKSXINAAsLIBUgFiALGyEVIANFIAdBX3FBxQBHckUEQAJAIAYgCRDXCyIXQoCAgICAgICAgH9SDQAgCUUNBEIAIRcgBikDcEIAUw0AIAYgBigCBEEBazYCBAsgFSAXfCEVDAQLIANFIQEgB0EASA0BCyAGKQNwQgBTDQAgBiAGKAIEQQFrNgIECyABRQ0BQfyAC0EcNgIACyAGQgAQjwJCACEVQgAMAQsgBCgCkAYiAUUEQCAERAAAAAAAAAAAIAy3phCrAiAEKQMIIRUgBCkDAAwBCyAVIBZSIBZCCVVyIBBBHk1BACABIBB2G3JFBEAgBEEwaiAMEOABIARBIGogARDhAyAEQRBqIAQpAzAgBCkDOCAEKQMgIAQpAygQaSAEKQMYIRUgBCkDEAwBCyAPQQF2rSAVUwRAQfyAC0HEADYCACAEQeAAaiAMEOABIARB0ABqIAQpA2AgBCkDaEJ/Qv///////7///wAQaSAEQUBrIAQpA1AgBCkDWEJ/Qv///////7///wAQaSAEKQNIIRUgBCkDQAwBCyARQeIBa6wgFVUEQEH8gAtBxAA2AgAgBEGQAWogDBDgASAEQYABaiAEKQOQASAEKQOYAUIAQoCAgICAgMAAEGkgBEHwAGogBCkDgAEgBCkDiAFCAEKAgICAgIDAABBpIAQpA3ghFSAEKQNwDAELIAoEQCAKQQhMBEAgBEGQBmogCEECdGoiASgCACEGA0AgBkEKbCEGIApBAWoiCkEJRw0ACyABIAY2AgALIAhBAWohCAsCQCANQQlOIBVCEVVyIBWnIgogDUhyDQAgFUIJUQRAIARBwAFqIAwQ4AEgBEGwAWogBCgCkAYQ4QMgBEGgAWogBCkDwAEgBCkDyAEgBCkDsAEgBCkDuAEQaSAEKQOoASEVIAQpA6ABDAILIBVCCFcEQCAEQZACaiAMEOABIARBgAJqIAQoApAGEOEDIARB8AFqIAQpA5ACIAQpA5gCIAQpA4ACIAQpA4gCEGkgBEHgAWpBACAKa0ECdEGAiAlqKAIAEOABIARB0AFqIAQpA/ABIAQpA/gBIAQpA+ABIAQpA+gBEMULIAQpA9gBIRUgBCkD0AEMAgsgECAKQX1sakEbaiICQR5MQQAgBCgCkAYiASACdhsNACAEQeACaiAMEOABIARB0AJqIAEQ4QMgBEHAAmogBCkD4AIgBCkD6AIgBCkD0AIgBCkD2AIQaSAEQbACaiAKQQJ0QbiHCWooAgAQ4AEgBEGgAmogBCkDwAIgBCkDyAIgBCkDsAIgBCkDuAIQaSAEKQOoAiEVIAQpA6ACDAELA0AgBEGQBmogCCIBQQFrIghBAnRqKAIARQ0AC0EAIQ0CQCAKQQlvIgJFBEBBACECDAELIAJBCWogAiAVQgBTGyESAkAgAUUEQEEAIQJBACEBDAELQYCU69wDQQAgEmtBAnRBgIgJaigCACIFbSELQQAhB0EAIQZBACECA0AgBEGQBmoiDyAGQQJ0aiIDIAcgAygCACIIIAVuIglqIgM2AgAgAkEBakH/D3EgAiADRSACIAZGcSIDGyECIApBCWsgCiADGyEKIAsgCCAFIAlsa2whByAGQQFqIgYgAUcNAAsgB0UNACABQQJ0IA9qIAc2AgAgAUEBaiEBCyAKIBJrQQlqIQoLA0AgBEGQBmogAkECdGohDyAKQSRIIQYCQANAIAZFBEAgCkEkRw0CIA8oAgBB0en5BE8NAgsgAUH/D2ohCEEAIQMDQCABIQkgA60gBEGQBmogCEH/D3EiC0ECdGoiATUCAEIdhnwiFUKBlOvcA1QEf0EABSAVIBVCgJTr3AOAIhZCgJTr3AN+fSEVIBanCyEDIAEgFT4CACAJIAkgCyAJIBVQGyACIAtGGyALIAlBAWtB/w9xIgdHGyEBIAtBAWshCCACIAtHDQALIA1BHWshDSAJIQEgA0UNAAsgAkEBa0H/D3EiAiABRgRAIARBkAZqIgkgAUH+D2pB/w9xQQJ0aiIBIAEoAgAgB0ECdCAJaigCAHI2AgAgByEBCyAKQQlqIQogBEGQBmogAkECdGogAzYCAAwBCwsCQANAIAFBAWpB/w9xIQkgBEGQBmogAUEBa0H/D3FBAnRqIRIDQEEJQQEgCkEtShshEwJAA0AgAiEDQQAhBgJAA0ACQCADIAZqQf8PcSICIAFGDQAgBEGQBmogAkECdGooAgAiByAGQQJ0QdCHCWooAgAiAkkNACACIAdJDQIgBkEBaiIGQQRHDQELCyAKQSRHDQBCACEVQQAhBkIAIRYDQCABIAMgBmpB/w9xIgJGBEAgAUEBakH/D3EiAUECdCAEakEANgKMBgsgBEGABmogBEGQBmogAkECdGooAgAQ4QMgBEHwBWogFSAWQgBCgICAgOWat47AABBpIARB4AVqIAQpA/AFIAQpA/gFIAQpA4AGIAQpA4gGELIBIAQpA+gFIRYgBCkD4AUhFSAGQQFqIgZBBEcNAAsgBEHQBWogDBDgASAEQcAFaiAVIBYgBCkD0AUgBCkD2AUQaSAEKQPIBSEWQgAhFSAEKQPABSEXIA1B8QBqIgcgEWsiCEEAIAhBAEobIBAgCCAQSCIJGyIGQfAATQ0CDAULIA0gE2ohDSABIQIgASADRg0AC0GAlOvcAyATdiEFQX8gE3RBf3MhC0EAIQYgAyECA0AgBEGQBmoiDyADQQJ0aiIHIAYgBygCACIIIBN2aiIHNgIAIAJBAWpB/w9xIAIgB0UgAiADRnEiBxshAiAKQQlrIAogBxshCiAIIAtxIAVsIQYgA0EBakH/D3EiAyABRw0ACyAGRQ0BIAIgCUcEQCABQQJ0IA9qIAY2AgAgCSEBDAMLIBIgEigCAEEBcjYCAAwBCwsLIARBkAVqRAAAAAAAAPA/QeEBIAZrEPkCEKsCIARBsAVqIAQpA5AFIAQpA5gFIBYQ2wsgBCkDuAUhGiAEKQOwBSEZIARBgAVqRAAAAAAAAPA/QfEAIAZrEPkCEKsCIARBoAVqIBcgFiAEKQOABSAEKQOIBRDZCyAEQfAEaiAXIBYgBCkDoAUiFSAEKQOoBSIYEPgCIARB4ARqIBkgGiAEKQPwBCAEKQP4BBCyASAEKQPoBCEWIAQpA+AEIRcLAkAgA0EEakH/D3EiAiABRg0AAkAgBEGQBmogAkECdGooAgAiAkH/ybXuAU0EQCACRSADQQVqQf8PcSABRnENASAEQfADaiAMt0QAAAAAAADQP6IQqwIgBEHgA2ogFSAYIAQpA/ADIAQpA/gDELIBIAQpA+gDIRggBCkD4AMhFQwBCyACQYDKte4BRwRAIARB0ARqIAy3RAAAAAAAAOg/ohCrAiAEQcAEaiAVIBggBCkD0AQgBCkD2AQQsgEgBCkDyAQhGCAEKQPABCEVDAELIAy3IRwgASADQQVqQf8PcUYEQCAEQZAEaiAcRAAAAAAAAOA/ohCrAiAEQYAEaiAVIBggBCkDkAQgBCkDmAQQsgEgBCkDiAQhGCAEKQOABCEVDAELIARBsARqIBxEAAAAAAAA6D+iEKsCIARBoARqIBUgGCAEKQOwBCAEKQO4BBCyASAEKQOoBCEYIAQpA6AEIRULIAZB7wBLDQAgBEHQA2ogFSAYQgBCgICAgICAwP8/ENkLIAQpA9ADIAQpA9gDQgBCABCoAw0AIARBwANqIBUgGEIAQoCAgICAgMD/PxCyASAEKQPIAyEYIAQpA8ADIRULIARBsANqIBcgFiAVIBgQsgEgBEGgA2ogBCkDsAMgBCkDuAMgGSAaEPgCIAQpA6gDIRYgBCkDoAMhFwJAIBRBAmsgB0H/////B3FODQAgBCAWQv///////////wCDNwOYAyAEIBc3A5ADIARBgANqIBcgFkIAQoCAgICAgID/PxBpIAQpA5ADIAQpA5gDQoCAgICAgIC4wAAQxgshAiAEKQOIAyAWIAJBAE4iARshFiAEKQOAAyAXIAEbIRcgCSAGIAhHIAJBAEhycSAVIBhCAEIAEKgDQQBHcUUgFCABIA1qIg1B7gBqTnENAEH8gAtBxAA2AgALIARB8AJqIBcgFiANENoLIAQpA/gCIRUgBCkD8AILIRYgDiAVNwMoIA4gFjcDICAEQZDGAGokACAOKQMoIRUgDikDICEWDAELQgAhFQsgACAWNwMAIAAgFTcDCCAOQTBqJAALwwYCBH8DfiMAQYABayIFJAACQAJAAkAgAyAEQgBCABCoA0UNAAJ/IARC////////P4MhCgJ/IARCMIinQf//AXEiB0H//wFHBEBBBCAHDQEaQQJBAyADIAqEUBsMAgsgAyAKhFALC0UNACACQjCIpyIIQf//AXEiBkH//wFHDQELIAVBEGogASACIAMgBBBpIAUgBSkDECICIAUpAxgiASACIAEQxQsgBSkDCCECIAUpAwAhBAwBCyABIAJC////////////AIMiCiADIARC////////////AIMiCRCoA0EATARAIAEgCiADIAkQqAMEQCABIQQMAgsgBUHwAGogASACQgBCABBpIAUpA3ghAiAFKQNwIQQMAQsgBEIwiKdB//8BcSEHIAYEfiABBSAFQeAAaiABIApCAEKAgICAgIDAu8AAEGkgBSkDaCIKQjCIp0H4AGshBiAFKQNgCyEEIAdFBEAgBUHQAGogAyAJQgBCgICAgICAwLvAABBpIAUpA1giCUIwiKdB+ABrIQcgBSkDUCEDCyAJQv///////z+DQoCAgICAgMAAhCELIApC////////P4NCgICAgICAwACEIQogBiAHSgRAA0ACfiAKIAt9IAMgBFatfSIJQgBZBEAgCSAEIAN9IgSEUARAIAVBIGogASACQgBCABBpIAUpAyghAiAFKQMgIQQMBQsgCUIBhiAEQj+IhAwBCyAKQgGGIARCP4iECyEKIARCAYYhBCAGQQFrIgYgB0oNAAsgByEGCwJAIAogC30gAyAEVq19IglCAFMEQCAKIQkMAQsgCSAEIAN9IgSEQgBSDQAgBUEwaiABIAJCAEIAEGkgBSkDOCECIAUpAzAhBAwBCyAJQv///////z9YBEADQCAEQj+IIAZBAWshBiAEQgGGIQQgCUIBhoQiCUKAgICAgIDAAFQNAAsLIAhB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QfWrBCADQTBqEDMLIAAgAhAdIQIMAAsACyABQQFqIQdBASEEA0AgACgCECICKAK0ASAETgRAIAIoArgBIARBAnRqKAIAIQUgAQRAIAkgBSgCECICKwMooCEIIAogAisDIKAhCyAJIAIrAxigIQwgCiACKwMQoCENQezaCi0AAEECTwRAIAEQsAIgBRAhIQIgAyAIOQMgIAMgCzkDGCADIAw5AxAgAyANOQMIIAMgAjYCACAGQeOrBCADEDMgBSgCECECCyACIAg5AyggAiALOQMgIAIgDDkDGCACIA05AxALIAUgBxDzCyAEQQFqIQQMAQsLIANB4ABqJAALyhoDD38LfAF+IwBBwARrIgIkACAAKAJIIQpB7NoKLQAAQQJPBEAgARCwAiACIAAQITYCsANBiPYIKAIAQfDwAyACQbADahAgGgsgAUEBaiEJQQEhBANAIAAoAhAiAygCtAEgBEgEQAJAAkAgABA8IAdrIhBBACAAKAIQIgMoArQBayILRw0AIAMoAgwNACADQgA3AxAgA0KAgICAgICAmcAANwMoIANCgICAgICAgJnAADcDICADQgA3AxgMAQsCQAJ/AkAgAEEEQQQgAkGgBGoQ+QNBAk0EQCACQQM2ArAEDAELQQAgAigCsARBBEcNARpBACEJIAItALwEQQJxRQ0CIApBAEHwFkEAECIiCSAKQQFB8BZBABAiIgZyDQIgAiAAECE2AqADQcifAyACQaADahAqC0EACyEGQQAhCQsgAkHoA2pBAEE4EDgaIAJCADcD4AMgAkIANwPYAyACQgA3A9ADIAJCADcDyAMgAkIANwPAAyACQgA3A7gDQQEhBwNAAkAgACgCECIDKAK0ASAHSARAIBBBAEwNASAAEBwhBwNAIAdFDQIgBygCECIDKAKAAUUEQCADIAA2AoABIAJCADcDiAQgAkIANwOABCADKwNgIRIgAysDWCERIAIgAysDUDkDmAQgAiARIBKgOQOQBCACQegDakEgECYhAyACKALoAyADQQV0aiIDIAIpA4AENwMAIAMgAikDmAQ3AxggAyACKQOQBDcDECADIAIpA4gENwMIIAYEQCACIAcgBkEAQQAQYjYCzAMgAkG4A2pBBBAmIQMgAigCuAMgA0ECdGogAigCzAM2AgALIAIgBzYC5AMgAkHQA2pBBBAmIQMgAigC0AMg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EBwhAwNAIAMEQCADKAIQQQA2ArgBIAAgAxAdIQMMAQsLQezaCi0AAEECTwRAIAEoAhAhAyAFIAAQITYC5AEgBSADNgLgAUGI9ggoAgBBjfkDIAVB4AFqECAaCyABIAEoAhBBAWo2AhAgBUG88AkoAgA2AtwBQdKnASAFQdwBakEAEOMBIgpB4iVBmAJBARA2GkE4EFIhAyAKKAIQIAM2AowBIAAQOSEDIAooAhAgAygCEC8BsAE7AbABIAAgCkHa3AAQuQcgACAKQZjbABC5ByAAIApBsNgBELkHIAVBqAJqIQggBUGgAmohDCAFQZgCaiELQQEhDwNAIAAoAhAiAygCtAEgD04EQCADKAK4ASAPQQJ0aigCACIEEJQEIAogBBAhELgHIgYoAhAiAyAJNgKIASADIAQ2AugBAkACQCABKAIEIgdFBEBE////////738hG0T////////v/yEaDAELRP///////+9/IRtE////////7/8hGiAEIAcQRSIDLQAARQ0AIAEoAgAgBEcEQCADIAQoAkQgBxBFEE1FDQELIAVBADoA+AEgBSALNgLEASAFIAw2AsgBIAUgCDYCzAEgBSAFQfgBajYC0AEgBSAFQZACajYCwAEgA0H4vgEgBUHAAWoQUUEETgRAIAUrA6gCIRogBSsDoAIhHSAFKwOYAiEbIAUrA5ACIRxBgNsKKwMAIh5EAAAAAAAAAABkBEAgGyAeoyEbIBwgHqMhHCAdIB6jIR0gGiAeoyEaCyAGKAIQQQNBAkEBIAUtAPgBIgNBP0YbIANBIUYbOgCHAQwCCyAEECEhByAFIAM2ArQBIAUgBzYCsAFBh+sDIAVBsAFqECoLRP///////+//IR1E////////738hHAsgCUEBaiEJIAQQHCEDA0AgAwRAIAMoAhAgBjYCuAEgBCADEB0hAwwBCwsgBigCECIDLQCHAQRAIAMoApQBIgMgGiAboEQAAAAAAADgP6I5AwggAyAdIBygRAAAAAAAAOA/ojkDAAsgD0EBaiEPDAELCyAAEBwhAwJ/AkADQCADBEACQCADKAIQIgQoArgBDQACQCAEKALoASIGRQ0AIAYgACgCECgCjAEoAjBGDQAgAxAhIQEgABAhIQAgBSADKAIQKALoARAhNgKoASAFIAA2AqQBIAUgATYCoAFBiv0EIAVBoAFqEDcM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QRhqCyILKwMIIQggCysDACEHAn8gASgCECIAKAIEIAFGBEAgACgCAAwBCyABQRhqCyIAKwMIIQkgACsDACEKIAJBfyAHIAShIgcgBSADoaIgCCADoSIFIAYgBKGioSIGRAAAAAAAAAAAZCAGRAAAAAAAAAAAYxsiADYCACACQX8gByAJIAOhoiAFIAogBKGioSIDRAAAAAAAAAAAZCADRAAAAAAAAAAAYxsiATYCBCACIAAgAWw2AggLTQECfAJ/QQEgACgCACIAKwMAIgIgASgCACIBKwMAIgNkDQAaQX8gAiADYw0AGkEBIAArAwgiAiABKwMIIgNkDQAaQX9BACACIANjGwsLzg8DEH8KfAF+IwBBsAFrIgIkACABQQAgAUEAShshDyABQSgQGiENA0AgAyAPRkUEQCAAIANBAnRqKAIAKAIEIApqIQogA0EBaiEDDAELCyAKQRgQGiIOQRhrIQYDQCAIIA9HBEAgDSAIQShsaiIEIA4gB0EYbGo2AgAgACAIQQJ0aigCACILKAIEIQxBACEDRP///////+9/IRJE////////7/8hE0T////////v/yEVRP///////+9/IRQDQCADIAxGBEAgBCATOQMgIAQgFTkDGCAEIBI5AxAgBCAUOQMIIAQgBiAHQRhsajYCBCAIQQFqIQgMAwUgCygCACADQQR0aiIFKwMAIRYgBSsDCCEXIA4gB0EYbGoiBUEANgIUIAUgBDYCECAFIBc5AwggBSAWOQMAIANBAWohAyAHQQFqIQcgEyAXECMhEyAVIBYQIyEVIBIgFxApIRIgFCAWECkhFAwBCwALAAsLIAJCADcDiAEgAkIANwOAASACQgA3A3hBACEDIApBBBAaIQwCQANAIAMgCkYEQAJAIAwgCkEEQeADELUBIAJBjAFqIRBBACELA0AgCiALRg0BIAIgDCALQQJ0aiIRKAIAIgM2AnQgAgJ/IAMoAhAiBCgCACADRgRAIAQoAgQMAQsgA0EYawsiBTYCcEEAIQgDQAJAAkAgCEECRwRAAkAgAkH0AGogAkHwAGoQzQxBAWoOAwADAgMLIAVBGGohB0EAIQMDQAJAIAIoAoABIANLBEAgAiACKQOAATcDWCACIAIpA3g3A1AgAigCeCACQdAAaiADEBlBAnRqKAIAIgYgBSACQZQBaiIJEMwMIAIoApwB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dGohBAJAIAZBAkgNACAGQQJrQQF2IgkgBCAFayIAQQJ1SA0AIAUgAEEBdSIBQQFyIgJBAnRqIQAgBiABQQJqIgFKBEAgASACIAAoAgAgACgCBCADKAIMEQAAIgEbIQIgAEEEaiAAIAEbIQALIAAoAgAgBCgCACADKAIMEQAADQAgBCgCACEBA0ACQCAEIAAiBCgCADYCACACIAlKDQAgBSACQQF0IgdBAXIiAkECdGohACAGIAdBAmoiB0oEQCAHIAIgACgCACAAKAIEIAMoAgwRAAAiBxshAiAAQQRqIAAgBxshAAsgACgCACABIAMoAgwRAABFDQELCyAEIAE2AgALIAhBAWshCAwACwALIANBEGokAAtGAgF8An8gACgCBCEDIAAoAgAhAAN8IAAgA0YEfCABBSAAKAIAIgIrAwggAisDGKEgAisDEKIgAaAhASAAQQRqIQAMAQsLC2wCAX8CfCMAQRBrIgIkACACIAE2AgwgASAANgIgIAAgAkEMahDAASAAIAIoAgwiASsDECIDIAArAxigIgQ5AxggACADIAErAwggASsDGKGiIAArAyCgIgM5AyAgACADIASjOQMQIAJBEGokAAsnACAAIAAoAhhFIAAoAhAgAXJyIgE2AhAgACgCFCABcQRAEJEBAAsLMQEDfyAAKAIEIgQgAUEEaiICayEDIAIgBEcEQCABIAIgAxC2ARoLIAAgASADajYCBAt+AQN/IAAoAgAiAUE0aiABKAI4IQMgASgCNCEBA0ACQCABIANGDQAgASgCACAARg0AIAFBBGohAQwBCwsgARC0DSAAKAIEIgFBKGogASgCLCEDIAEoAighAQNAAkAgASADRg0AIAEoAgAgAEYNACABQQRqIQEMAQsLIAEQtA0L6gEBCH8gAEHTrAMQ0QIhAiABKAIAIQYjAEEQayIDJAAgA0EIaiIEIAIQqQUaAkAgBC0AAEUNACACIAIoAgBBDGsoAgBqIgUoAgQaIANBBGoiBCAFEFMgBBC6CyEFIAQQUCADIAIQuQshByACIAIoAgBBDGsoAgBqIggQuAshCSADIAUgBygCACAIIAkgBiAFKAIAKAIQEQgANgIEIAQQpwVFDQAgAiACKAIAQQxrKAIAakEFEKoFCyADQQhqEKgFIANBEGokACACQdjgARDRAiABKAIgKwMQIAErAxigEJEH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EiACQQJ0akF/NgIAIAJBAWohAgwBCwtBhscBQZa3AUGLBkGBDhAAAAtBhscBQZa3AUGkBkGBDhAAAAtBhscBQZa3AUG4BkGBDhAAAAtBh9ABQZa3AUHQBUGBDhAAAAsgFEEQaiQAIA8L2AYCCn8BfCMAQRBrIgokACAAKAIgRQRAAkACQCAAKAIQQQFrIgQOBAEAAAEAC0HU0AFBlrcBQZAFQcg1EAAACyACKAIAIQUgACgCACEDIAAoAhghBiAAKAIUIQcCQAJAAkACQCAEDgQAAgIBAgsgACgCHCEJIAEEQCAFRQRAIANBCBA/IQULQQAhBCADQQAgA0EAShshAwNAIAMgBEYNBCAFIARBA3RqIgtCADcDACAHIARBAnRqKAIAIgAgByAEQQFqIgRBAnRqKAIAIgggACAIShshCEQAAAAAAAAAACENA0AgACAIRgRADAIFIAsgCSAAQQN0aisDACABIAYgAEECdGooAgBBA3RqKwMAoiANoCINOQMAIABBAWohAAwBCwALAAsACyAFRQRAIANBCBA/IQULQQAhASADQQAgA0EAShshBANAIAEgBEYNAyAFIAFBA3RqIgNCADcDACAHIAFBAnRqKAIAIgAgByABQQFqIgFBAnRqKAIAIgYgACAGShshBkQAAAAAAAAAACENA0AgACAGRgRADAIFIAMgCSAAQQN0aisDACANoCINOQMAIABBAWohAAwBCwALAAsACyAAKAIcIQkgAQRAIAVFBEAgA0EIED8hBQtBACEEIANBACADQQBKGyEDA0AgAyAERg0DIAUgBEEDdGoiC0IANwMAIAcgBEECdGooAgAiACAHIARBAWoiBEECdGooAgAiCCAAIAhKGyEIRAAAAAAAAAAAIQ0DQCAAIAhGBEAMAgUgCyAJIABBAnQiDGooAgC3IAEgBiAMaigCAEEDdGorAwCiIA2gIg05AwAgAEEBaiEADAELAAsACwALIAVFBEAgA0EIED8hBQtBACEBIANBACADQQBKGyEEA0AgASAERg0CIAUgAUEDdGoiA0IANwMAIAcgAUECdGooAgAiACAHIAFBAWoiAUECdGooAgAiBiAAIAZKGyEGRAAAAAAAAAAAIQ0DQCAAIAZGBEAMAgUgAyANIAkgAEECdGooAgC3oCINOQMAIABBAWohAAwBCwALAAsACyAKQcMFNgIE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AxggBiAAKALsAUHIAGxqIgEgASsDECAAKwN4ECM5AxALC4kDAgZ/BHwgABBhKAIQKALEASEFIAAQYSAARgR8RAAAAAAAACBABSAAQczbCigCAEEIQQAQYrcLIQkgACgCECIBKwOAASEHIAErA3ghCEEBIQIDQCACIAEoArQBSkUEQCABKAK4ASACQQJ0aigCACIBEO0NIQYgASgCECIEKALsASAAKAIQIgEoAuwBRgRAIAggCSAEKwN4oCIKIAggCmQbIQgLIAQoAugBIAEoAugBRgRAIAcgCSAEKwOAAaAiCiAHIApkGyEHCyADIAZyIQMgAkEBaiECDAELCyAAEGEhAiAAKAIQIQECQCAAIAJGDQAgASgCDEUNACAAEDlBASEDIAAoAhAhASgCEC0AdEEBcQ0AIAcgASsDWKAhByAIIAErAzigIQgLIAEgBzkDgAEgASAIOQN4IAAQYSAARwRAIAUgACgCECIAKALoAUHIAGxqIgEgASsDGCIJIAcgByAJYxs5AxggBSAAKALsAUHIAGxqIgAgACsDECIHIAggByAIZBs5AxALIAMLcAECf0EBIQQDQCAEIAAoAhAiAygCtAFKRQRAIAMoArgBIARBAnRqKAIAIAEgAhDuDSAEQQFqIQQMAQsLIAMgASADKwMQojkDECADIAIgAysDGKI5AxggAyABIAMrAyCiOQMgIAMgAiADKwMoojkDKAvlBAIIfwR8QQEhAgNAIAIgACgCECIDKAK0AUpFBEAgAygCuAEgAkECdGooAgAgARDvDSACQQFqIQIMAQsLIAAQYSECIAAoAhAhAwJAIAAgAkYEQCADKALsASEFRAAAwP///9/BIQpEAADA////30EhCyADKALoASIIIQQDQCAEIAVKBEAgAygCtAEiAEEAIABBAEobQQFqIQBBASECA0AgACACRg0EIAogAygCuAEgAkECdGooAgAoAhAiBCsDIEQAAAAAAAAgQKAiDCAKIAxkGyEKIAsgBCsDEEQAAAAAAAAgwKAiDCALIAxjGyELIAJBAWohAgwACwAFAkAgAygCxAEgBEHIAGxqIgAoAgAiBkUNAEEBIQIgACgCBCIHKAIAIgBFDQADQCAAKAIQIgAtAKwBIglFIAIgBk5yRQRAIAcgAkECdGooAgAhACACQQFqIQIMAQsLIAkNACAGQQJrIQIgACsDECAAKwNYoSEMIAcgBkECdGpBBGshAANAIAAoAgAoAhAiAC0ArAEEQCAHIAJBAnRqIQAgAkEBayECDAELCyAKIAArAxAgACsDYKAiDSAKIA1kGyEKIAsgDCALIAxjGyELCyAEQQFqIQQMAQsACwALIAMoAugBIQggAygC7AEhBSADKAKEAigCECgC9AG3IQogAygCgAIoAhAoAvQBtyELCyABKAIQKALEASIAIAVByABsaigCBCgCACgCECsDGCEMIAAgCEHIAGxqKAIEKAIAKAIQKwMYIQ0gAyAKOQMgIAMgCzkDECADIA0gAysDgAGgOQMoIAMgDCADKwN4oTkDGAuiAQICfAF/AkACf0H/////ByAAQdQgECciA0UNABogABA8IQAgAxCuAiEBIABBAEgNAUEAIAFEAAAAAAAAAABjDQAaIAC4IQIgAUQAAAAAAADwP2QEQEH/////B0QAAMD////fQSABoyACYw0BGgsgASACoiIBmUQAAAAAAADgQWMEQCABqg8LQYCAgIB4Cw8LQc+YA0GH/ABBzQBBztkAEAAAC4gCAgd/AXwjAEEQayIEJAAgAEHM2wooAgBBCEEAEGIgABDtBbchCCAAKAIQIgEoAugBIQMgASgChAIhBSABKAKAAiEGA0AgAyABKALsAUpFBEACQCADQcgAbCIHIAEoAsQBaiICKAIARQ0AIAIoAgQoAgAiAkUEQCAAECEhASAEIAM2AgQgBCABNgIAQdu0BCAEEDcMAQsgBiACIAIoAhArA1ggCKAgASsDYKBBABCfARogACgCECIBKALEASAHaiICKAIEIAIoAgBBAnRqQQRrKAIAIgIgBSACKAIQKwNgIAigIAErA0CgQQAQnwEaCyADQQFqIQMgACgCECEBDAELCyAEQRBqJAAL2wICCn8BfCAAQczbCigCAEEIQQAQYiEHQQEhAQNAIAAoAhAiBSgCtAEiBCABSARAIAe3IQtBASEBA0AgASAESkUEQCABQQJ0IQkgAUEBaiIHIQEDQCAFKAK4ASICIAlqKAIAIQMgASAESkUEQCACIAFBAnRqKAIAIgYgAyADKAIQKALoASAGKAIQKALoAUoiAhsiCCgCECIKKALsASADIAYgAhsiAygCECIGKALoASICTgRAIAggAyACQcgAbCICIAooAsQBaigCBCgCACgCECgC+AEg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P2UNACAAEPENIAAoAhAiASgCgAIgASgChAIgEiARIAEoAnRBAXEbIhFEAAAAAOD/70AgEUQAAAAA4P/vQGMbQegHEJ8BGgsCQCAAQQIgABDwDRDMBEUNACAAKAIQIgIoAugBIQUDQAJAAkAgAigC7AEiCiAFTgRAQQAhCCACKALEASAFQcgAbGoiBygCACIJQQAgCUEAShshA0EAIQEDQCABIANGDQNBACEEAkAgBygCBCABQQJ0aigCACIIKAIQIgsoApACIg1FDQADQCANIARBAnRqKAIAIgZFDQEgBkFQQQAgBigCAEEDcSIMQQJHG2ooAigoAhAoAvQBIAVKDQQgBEEBaiEEIAZBMEEAIAxBA0cbaigCKCgCECgC9AEgBUwNAAsMAwtBACEEAkAgCygCiAIiC0UNAANAIAsgBEECdGooAgAiBkUNASAGQTBBACAGKAIAQQNxIg1BA0cbaigCKCgCECgC9AEgBUoNBCAEQQFqIQQgBSAGQVBBACANQQJHG2ooAigoAhAoAvQBTg0ACwwDCyABQQFqIQEMAAsACyAAQQIgABDwDRDMBEUNA0GImwNBprsBQY0BQbHiABAAAAsgASEDCwJAIAhFIAMgCUhyRQRAIAdBzABBvH8gBSAKSBtqKAIAKAIAIgJFDQEgBygCBCgCACEDIAAQugIiASgCEEECOgCsASABIANEAAAAAAAAAABBABCfARogASACRAAAAAAAAAAAQQAQnwEaIAEoAhAgAygCECgC9AEiASACKAIQKAL0ASICIAEgAkgbNgL0ASAAKAIQIQILIAVBAWohBQwBCwtB0toAQaa7AUH2AEGO+gAQAAALIAAoAhAiASgC7AEhBSABKALoASECIAEoAsQBIQQDQCACIAVMBEBBACEBIAQgAkHIAGxqIgcoAgAiA0EAIANBAEobIQYDQCABIAZHBEAgBygCBCABQQJ0aigCACgCECIDKAL0ASEIIAMgAjYC9AEgAyAItzkDECABQQFqIQEMAQsLIAJBAWohAgwBCwsgACAAEO8NAkAgACgCECIBKALsAUEATA0AIAEoAggiAigCVCIFRQ0AIAErACgiESABKwAYoSIUIAErACAiEiABKwAQoSIVIAEoAnRBAXEiAxshEyAVIBQgAxshFAJAAnwCQAJAAkACQAJAIAVBAWsOBQQABwEDBwsgAisDQCESDAELIAIrAzAiFUT8qfHSTWJQP2MNBSACKwM4IhZE/Knx0k1iUD9jDQUgFSACKwMgIhWhIBWhIhUgEqMiF0QAAAAAAADwP2YgFiACKwMoIhahIBahIhYgEaMiGEQAAAAAAADwP2ZxDQUgAiARIBYgESAXIBggFyAYYxsiF0QAAAAAAADgPyAXRAAAAAAAAOA/ZBsiF6IgFqOboiARo6I5A0ggAiASIBUgEiAXoiAVo5uiIBKjoiISOQNACyASRAAAAAAAAAAAZQ0EIBIgE6MiEkQAAAAAAADwP2MgAisDSCAUoyIRRAAAAAAAAPA/Y3JFDQMgESASZARAIBEgEqMhEUQAAAAAAADwPyESDAQLIBIgEaMMAgsgAisDQCITRAAAAAAAAAAAZQ0DIBMgEqMiEkQAAAAAAADwP2RFDQMgAisDSCARoyIRRAAAAAAAAPA/ZEUNAyASIBEQKSIRIRIMAgsgFCAToyIRIAIrAxAiEmMEQCASIBGjIRFEAAAAAAAA8D8hEgwCCyARIBKjCyESRAAAAAAAAPA/IRELIBEgEiADGyETIBIgESADGyERIAFBwAFqIQEDQCABKAIAIgEEQCABKAIQIgEgEyABKwMQohAyOQMQIAEgESABKwMYohAyOQMYIAFBuAFqIQEMAQsLIAAgEyAREO4NIAAoAhAhAQsgAUHAAWohAQNAIAEoAgAiAgRAQQAhAQNAIAIoAhAoAsgBIgUgAUECdGooAgAiAwRAIAMoAhAQGCADEBggAUEBaiEBDAELCyAFEBggAigCECgCwAEQGCACKAIQIgEgASkDkAI3A8gBIAIoAhAiASABKQOIAjcDwAEgAigCEEG4AWohAQwBCwsgACgCECgCwAEhAUEAIQIDQCABIgNFDQEgASgCECIFKAK4ASEBIAUtAKwBQQJHBEAgAyECDAELAkAgAgRAIAIoAhAgATYCuAEMAQsgACgCECABNgLAAQsgAQRAIAEoAhAgAjYCvAELIAUQGCADEBgMAAsACyAPQRBqJAALPgAgACgCACEAIAMEQCABIAAoAhAoAgBBAiACQQAQIiIBBH8gAQUgACgCECgCAEECIAJB8f8EECILIAMQcQsLtgMBBX8CQAJAIAAoAhAiAC0ArAFBAUcNACAAKAL4ASEGAkACQCAAKALEAQRAIAAoAsgBIQhBACEAA0AgCCAFQQJ0aigCACIHRQ0CIAAgACAHQVBBACAHKAIAQQNxQQJHG2ooAigoAhAoAvgBIgAgA05yIAAgAkwiBxshACAFQQFqIQUgBCAHciEEDAALAAsgACgCzAFBAkcNAyACIAAoAsgBIgQoAgAiAEFQQQAgACgCAEEDcUECRxtqKAIoKAIQKAL4ASIAIAQoAgQiBEFQQQAgBCgCAEEDcUECRxtqKAIoKAIQKAL4ASIFIAAgBUobIgROBEAgASAGNgIAQQghAAwCCyADIAAgBSAAIAVIGyIFTARAIAEgBjYCBEEMIQAMAgsgAyAESCACIAVKcQ0CIAIgBUcgAyAETHIgAiAFTHFFBEAgASAGNgIIC0EMIQAgAyAESA0BIAMgBEcNAiACIAVIDQEMAgsgBEF/cyAAckEBcUUEQCABIAZBAWo2AgALIABBf3MgBHJBAXENASAGQQFrIQZBBCEACyAAIAFqIAY2AgALDwtB8e4CQYu5AUHCAEG6MRAAAAuaCAILfwR8IwBBEGsiBiQAAkAgACgCECgCYARAIAAgAEEwaiIJIAAoAgBBA3FBA0YbKAIoEGEhByAAIAkgACgCAEEDcSIEQQNGIgIbKAIoKAIQKAL0ASEFIAcoAhAoAsQBIABBAEEwIAIbaigCKCgCECIDKAL0AUHIAGxqIgJBxABrKAIAIQggBiACQcgAaygCACICNgIMIAZBfzYCACAGQX82AgggBiACNgIEIAMoAvgBIgMgAEFQQQAgBEECRxtqKAIoKAIQKAL4ASIEIAMgBEgbIQogAyAEIAMgBEobIQtBfyEEIAIhAwNAIAEgA0gEQCAIIAFBAnRqKAIAIAYgCiALEPkNIANBAWsiAyABRwRAIAggA0ECdGooAgAgBiAKIAsQ+Q0LIAFBAWohASAGKAIEIgIgBigCACIEa0EBSg0BCwsgBigCDCAGKAIIaiACIARqIAIgBEgbQQFqQQJtIQMCfCAHKAIQIgEoAsQBIgggBUEBayIEQcgAbGoiAigCBCIKKAIAIgsEQCALKAIQKwMYIAIrAxChDAELIAggBUHIAGxqIgUoAgQoAgAoAhArAxggBSsDGKAgASgC/AG3oAshDSACKAIMIgEgCkcNASABIAIoAgAiAkEBaiACQQJqQQQQ8QEhAiAHKAIQKALEASAEQcgAbGoiASACNgIEIAEgAjYCDCABKAIAIQEDQCABIANMRQRAIAIgAUECdGoiBSAFQQRrKAIAIgU2AgAgBSgCECIFIAUoAvgBQQFqNgL4ASABQQFrIQEMAQsLIAIgA0ECdGoiBSAHELoCIgE2AgAgASgCECIBIAQ2AvQBIAEgAzYC+AEgBEHIAGwiBCAHKAIQIgMoAsQBaiIBIAEoAgBBAWoiATYCACACIAFBAnRqQQA2AgAgACgCECgCYCIBKwMgIQwgASsDGCEOIAMoAnQhCCAFKAIAIgIoAhAiAyABNgJ4IAMgDiAMIAhBAXEiARsiDzkDUCADIAwgDiABG0QAAAAAAADgP6IiDDkDYCADIAw5A1ggAyANIA9EAAAAAAAA4D+iIg2gOQMYIAIgACAJIAAoAgBBA3FBA0YbKAIoIAAQ5AEoAhAiAyACKAIQKwNYmjkDECAAIAkgACgCAEEDcUEDRhsoAigoAhArA2AhDCADQQQ6AHAgAyAMOQM4IAIgACAAQTBrIgEgACgCAEEDcUECRhsoAiggABDkASgCECIDIAIoAhAiCSsDYDkDECAAIAEgACgCAEEDcUECRhsoAigoAhArA1ghDCADQQQ6AHAgAyAMOQM4IA0gBygCECgCxAEgBGoiAisDEGQEQCACIA05AxALIA0gAisDGGQEQCACIA05AxgLIAkgADYCgAELIAZBEGokAA8LQZoXQYu5AUEZQfEcEAAAC8kBAQR/IABBMEEAIAAoAgBBA3EiAkEDRxtqKAIoIgMoAhAoAvgBIgEgAEFQQQAgAkECRxtqKAIoKAIQKAL4ASICIAEgAkobIQQgASACIAEgAkgbIQEgAxBhKAIQKALEASADKAIQKAL0AUHIAGxqIQIDQAJAIAFBAWoiASAETg0AAkAgAigCBCABQQJ0aigCACgCECIDLQCsAQ4CAQACCyADKAJ4RQ0BCwsgASAERgRAA0AgACgCECIAQQE6AHIgACgCsAEiAA0ACwsLQgECfwJAIAAoAhAoAowCIAEoAhAiACgC9AFBAnRqIgIoAgAiAwRAIAMoAhAoAvgBIAAoAvgBTA0BCyACIAE2AgALCzcBAX8CQCAAKAIQIgAtAKwBQQFHDQAgACgCzAFBAUcNACAAKALEAUEBRw0AIAAoAnhFIQELIAEL3AYBCH8jAEEwayIFJAAgACgCECIBKALoASECA0AgAiABKALsAUpFBEAgASgCjAIgAkECdGpBADYCACACQQFqIQIgACgCECEBDAELCyAAEO8OIAAQHCEDA0AgAwRAIAAgAxD8DSAAIAMQLCEEA0AgBCIBBEADQCABIgIoAhAoArABIgENAAsgBEEoaiEBA0ACQCACRQ0AIAIgAkEwayIGIAIoAgBBA3FBAkYbKAIoIgcoAhAoAvQBIAFBUEEAIAQoAgBBA3FBAkcbaigCACgCECgC9AFODQAgACAHEPwNIAIgBiACKAIAQQNxQQJGGygCKCgCECgCyAEoAgAhAgwBCwsgACAEEDAhBAwBBSAAIAMQHSEDDAMLAAsACwsgACgCECICKALoASEDQQEhBwJ/A0ACQCACKALsASADSARAA0BBACAAKAIQIgEoArQBIAdIDQQaIAdBAnQgB0EBaiEHIAEoArgBaigCABD+DUUNAAwCCwALIANBAnQiBCACKAKMAmooAgAiAUUEQCAFIAM2AgBB+MIEIAUQNwwBCyABIANByABsIgggABBhKAIQKALEAWooAgQgASgCECgC+AFBAnRqKAIARwRAIAEQISEAIAEoAhAoAvgBIQEgBSADNgIoIAUgATYCJCAFIAA2AiBBosMEIAVBIGoQNwwBCyAAEGEhASAAKAIQIgYoAsQBIgIgCGogASgCECgCxAEgCGooAgQgBigCjAIgBGooAgAoAhAoAvgBQQJ0ajYCBEF/IQFBACEGA0AgASEEAn8CQAJAIAYgAiAIaiIBKAIATg0AIAEoAgQgBkECdGooAgAiAkUNACACKAIQIgEtAKwBDQEgBiAAIAIQqQENAhoLIARBf0YEQCAAECEhASAFIAM2AhQgBSABNgIQQcfBBCAFQRBqECoLIAAoAhAiAigCxAEgCGogBEEBajYCACADQQFqIQMMBAsgASgCwAEoAgAhAQJAA0AgASICRQ0BIAIoAhAoAngiAQ0ACyAAIAJBMEEAIAIoAgBBA3FBA0cbaigCKBCpAUUNACAGIAQgACACQVBBACACKAIAQQNxQQJHG2ooAigQqQEbDAELIAQLIQEgBkEBaiEGIAAoAhAoAsQBIQIMAAsACwtBfwsgBUEwaiQAC5EFAQl/IAFByABsIg0gACgCECgCxAFqKAIEIAJBAnRqKAIAIQkgAkEBaiIHIQoDQAJAAkAgAyAKSARAIAFByABsIQQDQCADQQFqIgMgACgCECgCxAEiBiAEaiICKAIATg0CIAIoAgQiAiAHQQJ0aiACIANBAnRqKAIAIgI2AgAgAigCECAHNgL4ASAHQQFqIQcMAAsACyAAKAIQKALEASANaigCBCAKQQJ0aigCACEIIAQEQANAIAgoAhAiAigCyAEoAgAiBUUNAyAFQShqIQsgCSgCECgCyAEhDEEAIQICQANAIAwgAkECdGooAgAiBgRAIAJBAWohAiAGQVBBACAGKAIAQQNxQQJHG2ooAiggC0FQQQAgBSgCAEEDcUECRxtqKAIARw0BDAILCyAJIAVBUEEAIAUoAgBBA3FBAkcbaigCKCAFEOQBIQYLA0AgCCgCECgCwAEoAgAiAgRAIAIgBhCMAyACEJQCDAELCyAFEJQCDAALAAsDQCAIKAIQIgIoAsABKAIAIgVFDQIgBUEoaiELIAkoAhAoAsABIQxBACECAkADQCAMIAJBAnRqKAIAIgYEQCACQQFqIQIgBkEwQQAgBigCAEEDcUEDRxtqKAIoIAtBMEEAIAUoAgBBA3FBA0cbaigCAEcNAQwCCwsgBUEwQQAgBSgCAEEDcUEDRxtqKAIoIAkgBRDkASEGCwNAIAgoAhAoAsgBKAIAIgIEQCACIAYQjAMgAhCUAgwBCwsgBRCUAgwACwALIAIgBzYCACAGIAFByABsaigCBCAHQQJ0akEANgIADwsgAigCxAFBACACKALMAWtGBEAgACAIEPwFIApBAWohCgwBCwtBtpsDQcm+AUHzAEHd8AAQAAALyQEBA38CQANAIABFDQEgACgCECIDLQBwBEAgAygCeCEADAELCwNAIAFFDQEgASgCECIELQBwBEAgBCgCeCEBDAELCyADLQCZAQ0AIAQtAJkBDQAgAEEwQQAgACgCAEEDcSICQQNHG2ooAigoAhAoAvQBIABBUEEAIAJBAkcbaigCKCgCECgC9AFrIAFBMEEAIAEoAgBBA3EiAEEDRxtqKAIoKAIQKAL0ASABQVBBACAAQQJHG2ooAigoAhAoAvQBa2xBAEohAgsgAgs3AQF/AkAgACgCECIALQCsAUEBRw0AIAAoAsQBQQFHDQAgACgCzAFBAUcNACAAKAJ4RSEBCyABC+EBAQZ/IABBMEEAIAAoAgBBA3EiAkEDRxtqIQUgAEFQQQAgAkECRxtqKAIoKAIQKALAASEGQQAhAANAIAYgA0ECdGooAgAiAgRAAkAgAkEwQQAgAigCAEEDcUEDRxtqKAIoKAIQKAL4ASIHIAUoAigoAhAoAvgBayABbEEATA0AIAIoAhAiBCgCCEUEQCAEKAJ4IgRFDQEgBCgCECgCCEUNAQsgAARAIABBMEEAIAAoAgBBA3FBA0cbaigCKCgCECgC+AEgB2sgAWxBAEwNAQsgAiEACyADQQFqIQMMAQsLIAALegEBfyAAKAIAIgYoAhAoAgAgASADIAVBARBeIgMEQCAAIANB0xsgBCACIANBMEEAIAMoAgBBA3EiBUEDRxtqKAIoIANBUEEAIAVBAkcbaigCKCIFRyABIAVGcSIBGxD4DSAAIANBjxwgAiAEIAEbEPgNIAYgAxDYDgsL4QEBBn8gAEFQQQAgACgCAEEDcSICQQJHG2ohBSAAQTBBACACQQNHG2ooAigoAhAoAsgBIQZBACEAA0AgBiADQQJ0aigCACICBEACQCACQVBBACACKAIAQQNxQQJHG2ooAigoAhAoAvgBIgcgBSgCKCgCECgC+AFrIAFsQQBMDQAgAigCECIEKAIIRQRAIAQoAngiBEUNASAEKAIQKAIIRQ0BCyAABEAgAEFQQQAgACgCAEEDcUECRxtqKAIoKAIQKAL4ASAHayABbEEATA0BCyACIQALIANBAWohAwwBCwsgAAtKAgF8AX8CQCABKAIQIgErAxAiAiAAKAIQIgArAxBmRQ0AIAIgACsDIGVFDQAgASsDGCICIAArAxhmRQ0AIAIgACsDKGUhAwsgAwvGAgEFfwJAIAEoAhAiAS0ArAFFBEAgASgC6AEiAyEEDAELIAEoAsgBKAIAKAIQKAJ4IgFBUEEAIAEoAgBBA3EiA0ECRxtqKAIoKAIQKALoASEEIAFBMEEAIANBA0cbaigCKCgCECgC6AEhAwsgAigCECIBLQCsAUUEQCABKALoASIBQQAgACABRxsiAEEAIAAgBEcbQQAgACADRxtBACAAGw8LAkACQCABKALIASgCACgCECgCeCIGQTBBACAGKAIAQQNxIgdBA0cbaigCKCgCECgC6AEiAUEAIAAgAUcbIgVFIAMgBUZyIAQgBUZyRQRAIAUgAhCFDg0BCyAGQVBBACAHQQJHG2ooAigoAhAoAugBIgFBACAAIAFHGyIARSAAIANGcg0BQQAhASAAIARGDQAgAEEAIAAgAhCFDhshAQsgAQ8LQQALoAQBCH8gACgCECgCxAEgASgCECIIKAL0AUHIAGxqIQkgCCgC+AEiCiEHAkADQAJAIAQgB2oiB0EASA0AIAcgCSgCAE4NAAJAAkAgCSgCBCAHQQJ0aigCACILKAIQIgEtAKwBDgIEAAELIAEoAngNAwsgASgC+AEhDAJAIAEoAswBQQFHBEAgCCgCzAFBAUcNBAwBCyADRQ0AIAEoAsgBKAIAIQBBACEGIAMhBQNAIAZBAkYNASAAQVBBACAAKAIAQQNxQQJHG2ooAigiACAFQVBBACAFKAIAQQNxQQJHG2ooAigiBUYNASAKIAxIIAAoAhAiACgC+AEgBSgCECIFKAL4AUxGDQMgACgCzAFBAUcNASAALQCsAUUNASAFKALMAUEBRw0BIAUtAKwBRQ0BIAAoAsgBKAIAIQAgBkEBaiEGIAUoAsgBKAIAIQUMAAsACyACRQ0CIAEoAsQBQQFHDQIgASgCwAEoAgAhAUEAIQUgAiEAA0AgBUECRg0DIAFBMEEAIAEoAgBBA3FBA0cbaigCKCIBIABBMEEAIAAoAgBBA3FBA0cbaigCKCIGRg0DIAogDEggASgCECIAKAL4ASAGKAIQIgYoAvgBTEYNAiAAKALEAUEBRw0DIAAtAKwBRQ0DIAYoAsQBQQFHDQMgBi0ArAFFDQMgACgCwAEoAgAhASAFQQFqIQUgBigCwAEoAgAhAAwACwALC0EAIQsLIAsLlwICAn8EfCMAQdAAayIHJAAgB0EIaiIIIAFBKBAfGiAHQTBqIAAgCCADQQAgBBCzAyAFIAcpA0g3AxggBSAHQUBrKQMANwMQIAUgBykDODcDCCAFIAcpAzA3AwAgBUEBNgIwIAUrAxAhCSAFKwMAIQoCQCAGBEAgAiAEQQIgBUEAEIEFDAELIAIgBEECIAVBABCABQsCQCAJIApkRQ0AIAMoAhAiASsDGCAAKAIQKALEASABKAL0AUHIAGxqKwMYoSILIAVBOGoiASAFKAI0IgBBBXRqQRhrKwMAIgxjRQ0AIAUgAEEBajYCNCABIABBBXRqIgAgDDkDGCAAIAk5AxAgACALOQMIIAAgCjkDAAsgB0HQAGokAAuaAgIEfwN8IABBUEEAIAAoAgBBA3FBAkcbaiECQQAhAANAAkAgAigCKCIEKAIQLQCsAUEBRw0AIARB4NAKKAIAEQIADQAgACABKAJQIgIgACACSxshBQNAIAAgBUYNASAEKAIQIgIrAxgiBiABKAJUIABBBXRqIgMrAwhjBEAgAEEBaiEADAELCwJAIAMrAxggBmMNACADKwMQIQYgAysDACEHIAIoAngEQCACIAY5AxAgAiAGIAehOQNYIAIgBiACKwNgoCAGoTkDYAwBCyACIAcgBqBEAAAAAAAA4D+iIgg5AxAgAiAGIAihOQNgIAIgCCAHoTkDWAsgAigCyAEoAgAiAkFQQQAgAigCAEEDcUECRxtqIQIMAQsLC6oHAgR/AnwjAEHwAGsiBiQAIAFBfxCEDiEHIAFBARCEDiEBAkAgBwRAIAcQmQNFDQELIAEEQCABEJkDRQ0BCyACQX8Qgg4hASACQQEQgg4hAiABBEAgARCZA0UNAQsgAgRAIAIQmQNFDQELIANBOGohB0EAIQEDQCADKAI0IAFMBEAgACgCUCIDQQFqIgcgBSgACCICaiEIQQAhAQNAIAEgAk8EQCAEQThqIQUgBCgCNCECA0AgAkEATARAIAMgCEECayIBIAEgA0kbIQQgAyEBA0AgASAERgRAIAhBA2shCEEBIAAoAlAiASABQQFNG0EBayEJQQAhAgNAIAIiASAJRg0JIAAoAlQiBSABQQFqIgJBBXRqIQQgBSABQQV0aiEFIAEgB2tBAXEgASAHSSABIAhLcnJFBEAgBSsDAEQAAAAAAAAwQKAiCiAEKwMQZARAIAQgCjkDEAsgBSsDEEQAAAAAAAAwwKAiCiAEKwMAY0UNASAEIAo5AwAMAQsgASADa0EBcSACIAdJIAEgCE9ycg0AIAQrAxAiCiAFKwMARAAAAAAAADBAoGMEQCAFIApEAAAAAAAAMMCgOQMACyAEKwMAIgogBSsDEEQAAAAAAAAwwKBkRQ0AIAUgCkQAAAAAAAAwQKA5AxAMAAsABSAAKAJUIAFBBXRqIgIrAwAhCgJAIAEgB2tBAXFFBEAgCiACKwMQIgtmRQ0BIAIgCiALoEQAAAAAAADgP6IiCkQAAAAAAAAgQKA5AxAgAiAKRAAAAAAAACDAoDkDAAwBCyACKwMQIgsgCkQAAAAAAAAwQKBjRQ0AIAIgCiALoEQAAAAAAADgP6IiCkQAAAAAAAAgQKA5AxAgAiAKRAAAAAAAACDAoDkDAAsgAUEBaiEBDAELAAsABSAGIAUgAkEBayICQQV0aiIBKQMYNwNoIAYgASkDEDcDYCAGIAEpAwg3A1ggBiABKQMANwNQIAAgBkHQAGoQ8wEMAQsACwAFIAUoAgAhAiAGIAUpAgg3A0ggBiAFKQIANwNAIAYgAiAGQUBrIAEQGUEFdGoiAikDGDcDOCAGIAIpAxA3AzAgBiACKQMINwMoIAYgAikDADcDICAAIAZBIGoQ8wEgAUEBaiEBIAUoAAghAgwBCwALAAUgBiAHIAFBBXRqIgIpAxg3AxggBiACKQMQNwMQIAYgAikDCDcDCCAGIAIpAwA3AwAgACAGEPMBIAFBAWohAQwBCwALAAsgBkHwAGokAAvOAQECfyAAIAEoAiAgA0EFdGoiBEEQaikDADcDECAAIAQpAwA3AwAgACAEKQMYNwMYIAAgBCkDCDcDCCAAKwMAIAArAxBhBEAgAigCECgCxAEgA0HIAGxqIgIoAgQoAgAhAyACKAJMKAIAIQUgACABKwMAOQMAIAAgBSgCECsDGCACKwNgoDkDCCAAIAErAwg5AxAgACADKAIQKwMYIAIrAxChOQMYIAQgACkDEDcDECAEIAApAwg3AwggBCAAKQMANwMAIAQgACkDGDcDGAsL3AMCAn8IfCMAQaABayIFJAAgASgCECIGKwAYIQggAigCACgCECIBKwBAIAErADggBisAEKAhCiABKwAYIAAoAhAiACsAGKAhDSABKwAQIAArABCgIQsgA0ECTwRAIAArA1AiDEQAAAAAAADgP6IhByAMIANBAWu4oyEOCyAIoCEMIA0gB6EhByAKIAqgIAugRAAAAAAAAAhAoyEIIAsgC6AgCqBEAAAAAAAACECjIQkgBEEHcUECRyEGQQAhAQNAIAEgA0ZFBEAgAiABQQJ0aigCACEAIAUgDTkDCCAFIAs5AwACfyAGRQRAIAUgDDkDOCAFIAo5AzAgBSAHOQMoIAUgCDkDICAFIAc5AxggBSAJOQMQQQQMAQsgBSAMOQOYASAFIAo5A5ABIAUgDDkDiAEgBSAKOQOAASAFIAc5A3ggBSAIOQNwIAUgBzkDaCAFIAg5A2AgBSAHOQNYIAUgCDkDUCAFIAc5A0ggBSAJOQNAIAUgBzkDOCAFIAk5AzAgBSAHOQMoIAUgCTkDICAFIA05AxggBSALOQMQQQoLIQQgACAAQVBBACAAKAIAQQNxQQJHG2ooAiggBSAEQdzQChCUASABQQFqIQEgDiAHoCEHDAELCyAFQaABaiQACyQAIAAgASACQQBBARBeIgBB7yVBuAFBARA2GiADIAAQpQUgAAuvBQEGfyMAQSBrIgIkACAAIAEQIUEBEI0BIgdB/CVBwAJBARA2GiABIAcQpQUCQCABEOUCQQJHDQAgAkIANwMYIAJCADcDECACIAEoAhAoAngoAgA2AgAgAkEQaiEAIwBBMGsiASQAIAEgAjYCDCABIAI2AiwgASACNgIQAkACQAJAAkACQAJAQQBBAEGLCCACEGAiBkEASA0AIAZBAWohAwJAIAAQSyAAECRrIgUgBksNACADIAVrIQUgABAoBEBBASEEIAVBAUYNAQsgACAFELcCQQAhBAsgAUIANwMYIAFCADcDECAEIAZBEE9xDQEgAUEQaiEFIAYgBAR/IAUFIAAQcwsgA0GLCCABKAIsEGAiA0cgA0EATnENAiADQQBMDQAgABAoBEAgA0GAAk8NBCAEBEAgABBzIAFBEGogAxAfGgsgACAALQAPIANqOgAPIAAQJEEQSQ0BQZO2A0Gg/ABB6gFB+B4QAAALIAQNBCAAIAAoAgQgA2o2AgQLIAFBMGokAAwEC0HGpgNBoPwAQd0BQfgeEAAAC0GtngNBoPwAQeIBQfgeEAAAC0H5zQFBoPwAQeUBQfgeEAAAC0GjngFBoPwAQewBQfgeEAAACwJAIAAQKARAIAAQJEEPRg0BCyACQRBqIgAQJCAAEEtPBEAgAEEBELcCCyACQRBqIgAQJCEBIAAQKARAIAAgAWpBADoAACACIAItAB9BAWo6AB8gABAkQRBJDQFBk7YDQaD8AEGvAkHEsgEQAAALIAIoAhAgAWpBADoAACACIAIoAhRBAWo2AhQLAkAgAkEQahAoBEAgAkEAOgAfDAELIAJBADYCFAsgAkEQaiIAECghASAHQcLwACAAIAIoAhAgARsQ6QEgAi0AH0H/AUcNACACKAIQEBgLIAJBIGokACAHC5oCAQF/AkAgAQ0AIABBMEEAIAAoAgBBA3EiAUEDRxtqKAIoIgIgAEFQQQAgAUECRxtqKAIoIgFGBEBBBCEBIAAoAhAiAi0ALA0BQQRBCCACLQBUGyEBDAELQQJBASACKAIQKAL0ASABKAIQKAL0AUYbIQELQRAhAgJAAkACQCABQQFrDgIAAQILQRBBICAAQTBBACAAKAIAQQNxIgJBA0cbaigCKCgCECgC9AEgAEFQQQAgAkECRxtqKAIoKAIQKAL0AUgbIQIMAQtBEEEgIABBMEEAIAAoAgBBA3EiAkEDRxtqKAIoKAIQKAL4ASAAQVBBACACQQJHG2ooAigoAhAoAvgBSBshAgsgACgCECACQYABciABcjYCpAELVAECfwNAIAEEQCABKAIMIAEoAgAiAkGJAkYEfyAAIAEoAgQQkA4gASgCAAUgAgtBiwJGBEAgACABKAIIIgIgAhB2QQBHEIwBGgsgARAYIQEMAQsLC0YCAn8BfCAAEBwhAQNAIAEEQCABKAIQIgIoAuABBEAgAisDgAIhAyACIAIpA2A3A4ACIAIgAzkDYAsgACABEB0hAQwBCwsL8ZkBA1N/EHwCfiMAQYAtayICJAAgAkHoDGpBAEHgABA4GiAAKAIQLwGIASEFIAIgAkGID2o2AtgNIAIgAkHAEGo2ArgOAkACQCAFQQ5xIhJFDQACQCASQQRHDQAgABCRDiAAKAJIKAIQLQBxQQFxRQ0AQcfoA0EAECoLIAJBwAxqQQBBKBA4GiACQbgMakIANwMAIAJBsAxqQgA3AwAgAkIANwOoDAJAAkACQCASQQhGBEAgABCRDiAAKAJIKAIQLQBxQQFxIgVFDQIgACgCEEHAAWohAwNAIAMoAgAiAUUNAwJAIAEoAhAiAy0ArAFBAUcNAAJAIAMoAoABIgQEQCAEKAIQKAJgIgZFDQUgBiADKQMQNwM4IAZBQGsgAykDGDcDACAGQQE6AFEMAQsgAygCeCIGRQ0BIAEQiggLIAAgBhCKAiABKAIQIQMLIANBuAFqIQMMAAsACyAAEIgIQcj9CkHI/QooAgAiA0EBajYCAAJAIANBAEoNAEHQ/QpBADYCAEHM/QpBADYCAEHs2gotAABFDQAQrQELIAAoAhAiBigC+AEhAyACQQA2AuQMIAIgA7c5A9gMIAIgA0EEbbc5A9AMIAYoAugBIQcCQANAIAYoAuwBIAdOBEAgBigCxAEiBCAHQcgAbCIJaiIDKAIEIgUoAgAiCARAIFcgCCgCECIIKwMQIAgrA1ihIlUgVSBXZBshVwsCQCADKAIAIgNFDQAgBSADQQJ0akEEaygCACIFRQ0AIFYgBSgCECIFKwMQIAUrA2CgIlUgVSBWYxshVgsgAyAQaiEQIFZEAAAAAAAAMECgIVYgV0QAAAAAAAAwwKAhV0EAIQgDQCADIAhKBEACQCAEIAlqKAIEIAhBAnRqKAIAIgUoAhAiAygCgAEiBAR/IAQoAhAoAmAiBkUNBiAGIAMpAxA3AzggBkFAayADKQMYNwMAIAQoAhAoAmBBAToAUSAFKAIQBSADCy0ArAEEQCAFQeDQCigCABECAEUNAQtBACEDA0AgBSgCECIEKALIASADQQJ0aigCACIGBEACQAJAIAYoAhAiBC0AcEEEaw4DAQABAAsgBEHRADYCpAEgAiAGNgK8DCACQagMakEEECYhBCACKAKoDCAEQQJ0aiACKAK8DDYCAAsgA0EBaiEDDAEFAkBBACEDIAQoAtABIgZFDQADQCAGIANBAnRqKAIAIgZFDQEgBkECEI8OIAIgBjYCvAwgAkGoDGpBBBAmIQQgAigCqAwgBEECdGogAigCvAw2AgAgA0EBaiEDIAUoAhAiBCgC0AEhBgwACwALCwsgBCgC4AFFDQAgBC0ArAFFBEAgBCsDgAIhVSAEIAQpA2A3A4ACIAQgVTkDYAtBACEDA0AgBSgCECgC4AEgA0ECdGooAgAiBEUNASAEQQAQjw4gAiAENgK8DCACQagMakEEECYhBCACKAKoDCAEQQJ0aiACKAK8DDYCACADQQFqIQMMAAsACyAIQQFqIQggACgCECIGKALEASIEIAlqKAIAIQMMAQsLIAdBAWohBwwBCwsgAiBWOQPIDCACIFc5A8AMIAJBqAxqQbIDQQQQogMgAiAQQegCakEgEBo2ArwNIAIgB0EgEBo2AuAMAkAgEkECRyIaDQAgACgCEEHAAWohAwNAIAMoAgAiBUUNAQJAIAUoAhAiAy0ArAFBAUcNACADKAJ4RQ0AIAUQigggBSgCECEDCyADQbgBaiEDDAALAAsgEkEGRiEkIAJB4CdqIRsgAkHQJ2ohFSACQZAoaiEcIAJB8CdqIRYgAkGwImohKyACQcAiaiEYIAJB+CdqIRkgAkGgEmohLCACQbASaiElIAJB6BdqISYgAkHwIWohJyACQeAhaiEoIAJB0CFqIR0gAkHAIWohHyACQbAhaiEpIAJBoCFqISogAkHgHWohFCACQbgiaiEtIAJBiB5qIQwgAkGoHWohDSACQeAgaiEuIBJBBEchLyASQQpHIR5BACEQA0ACQAJAIBAiBiACKAKwDEkEQCACQaAMaiACQbAMaiIJKQMANwMAIAIgAikDqAw3A5gMIAIoAqgMIAJBmAxqIAYQGUECdGooAgAiBBD6AyEKAkAgBCgCECIDLQAsBEAgBCEFDAELIAQgCiADLQBUGyIFKAIQIQMLIAMtAKQBQSBxBEAgAkGoDmoiAyAFEIcDIAMhBQtBASELA0ACQCAQQQFqIhAgAigCsAxPDQAgAkGQDGogCSkDADcDACACIAIpA6gMNwOIDCAKIAIoAqgMIAJBiAxqIBAQGUECdGooAgAiBxD6AyIIRw0AIAQoAhAtAHJFBEACQCAHKAIQIgMtACwEQCAHIQgMAQsgByAIIAMtAFQbIggoAhAhAwsgAy0ApAFBIHEEQCACQcgNaiAIEIcDIAIoAtgNIQMLIAUoAhAiCC0ALCEOIAMtACxBAXEEfyAOQQFxRQ0CIAgrABAiVSADKwAQIlZkIFUgVmNyDQIgCCsAGCJVIAMrABgiVmMNAiBVIFZkBSAOCw0BIAgtAFQhDiADLQBUQQFxBH8gDkEBcUUNAiAIKwA4IlUgAysAOCJWZCBVIFZjcg0CIAgrAEAiVSADKwBAIlZjDQIgVSBWZAUgDgsNASAEKAIQIgMoAqQBQQ9xQQJGBEAgAygCYCAHKAIQKAJgRw0CCyACQYAMaiAJKQMANwMAIAIgAikDqAw3A/gLIAIoAqgMIAJB+AtqIBAQGUECdGooAgAoAhAtAKQBQcAAcQ0BCyALQQFqIQsMAQsLIC9FBEAgC0EEEBohBSACIAkpAwA3AyggAiACKQOoDDcDICAFIAIoAqgMIAJBIGogBhAZQQJ0aigCABD6AzYCAEEBIQNBASALIAtBAU0bIQQDQCADIARGBEAgACAFIAsgEkHc0AoQgg8gBRAYDAYFIAIgCSkDADcDGCACIAIpA6gMNwMQIAUgA0ECdGogAigCqAwgAkEQaiADIAZqEBlBAnRqKAIANgIAIANBAWohAwwBCwALAAsgBEEwQQAgBCgCAEEDcSIHQQNHG2ooAigiCCgCECIFKAL0ASEDIARBUEEAIAdBAkcbaigCKCIEIAhGBEACfCAAKAIQIgQoAuwBIANGBEAgA0EASgRAIAQoAsQBIANByABsakHEAGsoAgAoAgAoAhArAxggBSsDGKEMAgsgBSsDUAwBCyAEKALoASADRgRAIAUrAxggBCgCxAEgA0HIAGxqKAJMKAIAKAIQKwMYoQwBCyAEKALEASADQcgAbGoiA0HEAGsoAgAoAgAoAhArAxggBSsDGCJVoSBVIAMoAkwoAgAoAhArAxihECkLIVUgAiAJKQMANwNIIAIgAikDqAw3A0AgAigCqAwgAkFAayAGEBlBAnRqIAsgAisD2AwgVUQAAAAAAADgP6JB3NAKEN0GQQAhAwNAIAMgC0YNBSACIAkpAwA3AzggAiACKQOoDDcDMCACKAKoDCACQTBqIAMgBmoQGUECdGooAgAoAhAoAmAiBQRAIAAgBRCKAgsgA0EBaiEDDAALAAsgBCgCECgC9AEhBSACQfALaiAJKQMANwMAIAIgAikDqAw3A+gLIAIoAqgMIAJB6AtqIAYQGUECdGohDiADIAVHDQEgAisD2AwhVSACIAJB+B5qNgKoHiAOKAIAIgkoAhAiAy0AciEFIAMtAKQBQSBxBEAgAkGYHmoiAyAJEIcDIAMhCQtBASEDQQEgCyALQQFNGyEEAkADQCADIARHBEAgA0ECdCADQQFqIQMgDmooAgAoAhAtAHJFDQEMAgsLIAVFDQMLIAlBKEF4IAkoAgBBA3EiA0ECRhtqKAIAIQgCQCAJQShB2AAgA0EDRhtqKAIAIgUQ5QJBAkcEQEEAIQZBACEHQQAhAyAIEOUCQQJHDQELQaz+Ci0AAEGs/gpBAToAAEEBcQ0EQYvpA0EAECogBRAhIQMgABCCAiEFIAIgCBAhNgLoBCACQcrgAUG2oAMgBRs2AuQEIAIgAzYC4ARBifIDIAJB4ARqEIABDAQLA0AgAyALRgRAIAdBAXEEQCACQbjwCUHA8AkgABCCAhsoAgA2AowFQQAhA0Hp/AAgAkGMBWpBABDjASIHQeIlQZgCQQEQNhogB0EAQab0AEHx/wQQIhpBAUHgABAaIQkgBygCECIEIAk2AgggCSAAKAIQIgYoAggiCisDADkDACAJIAorAxg5AxggBCAGLQBzOgBzIAQgBigCdEF/c0EBcTYCdCAEIAYoAvgBNgL4ASAEIAYoAvwBNgL8AUEAIQYDQCAAEDlBASAGEOUDIgYEQCAGKAIMEHYgBigCDCEEIAYoAgghCQR/IAdBASAJIAQQ5wMFIAdBASAJIAQQIgsaDAELCwNAIAAQOUECIAMQ5QMiAwRAIAMoAgwQdiADKAIMIQQgAygCCCEGBH8gB0ECIAYgBBDnAwUgB0ECIAYgBBAiCxoMAQsLIAdBAkGPHEEAECJFBEAgB0ECQY8cQfH/BBAiGgsgB0ECQdMbQQAQIkUEQCAHQQJB0xtB8f8EECIaC0G82wooAgAhIEGg2wooAgAhIUGs3AooAgAhIkH42wooAgAhF0Gc3AooAgAhMEGY3AooAgAhMUGQ3AooAgAhMkGU3AooAgAhM0GI3AooAgAhNEGE3AooAgAhNUGM3AooAgAhNkGA3AooAgAhN0H02wooAgAhOEHw2wooAgAhOUHs2wooAgAhOkHo2wooAgAhO0Hk2wooAgAhPEH82wooAgAhPUHY2wooAgAhPkHU2wooAgAhP0HQ2wooAgAhQEHk3AooAgAhQUGY3QooAgAhQkGw3QooAgAhQ0Gc3QooAgAhREGg3QooAgAhRUGk3QooAgAhRkGI3QooAgAhR0Hg3AooAgAhSEGU3QooAgAhSUG03QooAgAhSkHU3AooAgAhS0HY3AooAgAhTEHc3AooAgAhTUHI3AooAgAhTkHE3AooAgAhT0GQ3QooAgAhUEGM3QooAgAhUUHo3AooAgAhUkH83AooAgAhU0H83ApBADYCAEHo3AogB0ECQbM3QQAQIjYCAEGM3QogB0ECQZ+xAUEAECI2AgBBkN0KIAdBAkGE7wBBABAiNgIAQcTcCiAHQQJB+yBBABAiIgM2AgAgA0UEQEHE3AogB0ECQfsgQfH/BBAiNgIAC0EAIQRB3NwKQQA2AgBByNwKQQA2AgBB2NwKIAdBAkHFmAFBABAiNgIAQdTcCiAHQQJBnocBQQAQIjYCAEG03QogB0ECQbnaAEEAECI2AgBBlN0KQQA2AgBB4NwKIAdBAkHC8ABBABAiNgIAQYjdCiAHQQJBliVBABAiNgIAQaTdCkEANgIAQaDdCiAHQQJBwJgBQQAQIjYCAEGc3QogB0ECQZmHAUEAECI2AgBBsN0KIAdBAkGw2gBBABAiNgIAQZjdCkEANgIAQeTcCkEANgIAQdDbCiAHQQFBgyFBABAiNgIAQdTbCiAHQQFB+PcAQQAQIjYCAEHY2wogB0EBQaGWAUEAECI2AgBB/NsKQQA2AgBB5NsKIAdBAUGehwFBABAiNgIAQejbCiAHQQFBxZgBQQAQIjYCAEHs2wpBADYCAEHw2wogB0EBQcLwAEEAECI2AgBB9NsKQQA2AgBBgNwKQQA2AgBBjNwKIAdBAUHt/gBBABAiNgIAQYTcCiAHQQFBnTFBABAiNgIAQYjcCiAHQQFB3C9BABAiNgIAQZTcCiAHQQFByhZBABAiNgIAQZDcCiAHQQFBhOMAQQAQIjYCAEGY3AogB0EBQY3iAEEAECI2AgBBnNwKIAdBAUHFpwFBABAiNgIAQfjbCkEANgIAQazcCkEANgIAQbzbCiAHQQBB7f4AQQAQIjYCACAHQZMSQQEQkgEiA0HiJUGYAkEBEDYaIANBpvQAQcygARDpASAFKAIQKwMQIVYgCCgCECsDECFYIAMgCCAFIAAoAhAoAnRBAXEiAxsiDxCODiEKIAcgBSAIIAMbIhMQjg4hCEEAIQkDQCAJIAtGBEAgBEUEQCAHIAogCEEAQQEQXiEECyAEQcTcCigCAEGTlQMQcSAAKAIQKAKQASEDIAcoAhAiBSAHNgK8ASAFIAM2ApABIAcgEhCJAiAHENENIAcQ7g4CQCAHEN8OIgMNACAHEPcNIAcoAhBBwAFqIQMgCigCECsDECAIKAIQKwMQoEQAAAAAAADgP6IhVSAPKAIQIgUrAxAgBSsDYKEgEygCECIFKwMQoCAFKwNYoEQAAAAAAADgP6IhVwNAIAMoAgAiAwRAAkAgAyAKRgRAIAMoAhAiBiBVOQMQIAYgWDkDGAwBCyADKAIQIQYgAyAIRgRAIAYgVTkDECAGIFY5AxgMAQsgBiBXOQMYCyAGQbgBaiEDDAELCyAHEMIOIAdBABCSDiIDDQAgBxC4AyAKKAIQIQMgDygCECIFKwMYIVUgBSsDEAJ/IAAoAhAtAHRBAXEEQCBVIAMrAxCgIVUgA0EYagwBCyBVIAMrAxihIVUgA0EQagsrAwChIVZBACEFA0AgBSALRgRAQejcCiBSNgIAQfzcCiBTNgIAQYzdCiBRNgIAQZDdCiBQNgIAQcTcCiBPNgIAQcjcCiBONgIAQdzcCiBNNgIAQdjcCiBMNgIAQdTcCiBLNgIAQbTdCiBKNgIAQZTdCiBJNgIAQeDcCiBINgIAQYjdCiBHNgIAQaTdCiBGNgIAQaDdCiBFNgIAQZzdCiBENgIAQbDdCiBDNgIAQZjdCiBCNgIAQeTcCiBBNgIAQdDbCiBANgIAQdTbCiA/NgIAQdjbCiA+NgIAQfzbCiA9NgIAQeTbCiA8NgIAQejbCiA7NgIAQezbCiA6NgIAQfDbCiA5NgIAQfTbCiA4NgIAQYDcCiA3NgIAQYzcCiA2NgIAQYTcCiA1NgIAQYjcCiA0NgIAQZTcCiAzNgIAQZDcCiAyNgIAQZjcCiAxNgIAQZzcCiAwNgIAQfjbCiAXNgIAQazcCiAiNgIAQbzbCiAgNgIAQaDbCiAhNgIAIAcQ0A0gBxC5AQwLBSAOIAVBAnRqIQMDQCADKAIAIg8oAhAiBkH4AGohAyAGLQBwDQALIAYoAnwiEygCECEDAkAgBCATRgRAIAMoAnxFDQELIA8gAygCCCgCACIDKAIEEN4GIgYgAygCCDYCCCAGIFUgAysAECJYmiADKwAYIlcgACgCECgCdEEBcSIIG6A5AxggBiBWIFcgWCAIG6A5AxAgBiADKAIMNgIMIAYgViADKwAoIlggAysAICJXIAgboDkDICAGIFUgV5ogWCAIG6A5AyhBACEIA0ACQCAIIAMoAgRPDQAgCEEEdCIRIAYoAgBqIgogViADKAIAIBFqIgkrAAgiWCAJKwAAIlcgACgCECJUKAJ0QQFxIgkboDkDACAKIFUgV5ogWCAJG6A5AwggAiAKKQMANwPAJyACIAopAwg3A8gnIAhBAWoiCiADKAIETw0AIApBBHQiIyAGKAIAaiIKIFYgAygCACAjaiIjKwAIIlggIysAACJXIAkboDkDACAKIFUgV5ogWCAJG6A5AwggFSAKKQMANwMAIBUgCikDCDcDCCARQSBqIhEgBigCAGoiCiBWIAMoAgAgEWoiESsACCJYIBErAAAiVyAJG6A5AwAgCiBVIFeaIFggCRugOQMIIBsgCikDADcDACAbIAopAwg3AwggAiBWIAMoAgAgCEEDaiIIQQR0aiIKKwAIIlggCisAACJXIAkboDkD8CcgAiBVIFeaIFggCRugOQP4JyBUQRBqIAJBwCdqENwEDAELCyAPKAIQKAJgIgNFDQAgEygCECgCYCIGKwBAIVggBisAOCFXIAAoAhAoAnQhBiADQQE6AFEgAyBWIFggVyAGQQFxIgYboDkDOCADIFUgV5ogWCAGG6A5A0AgACADEIoCCyAFQQFqIQUMAQsACwALIAIoAuAMEBhBACEEA0AgAigCsAwgBEsEQCACIAJBsAxqKQMANwOABSACIAIpA6gMNwP4BCACQfgEaiAEEBkhAAJAAkACQCACKAK4DCIBDgICAAELIAIoAqgMIABBAnRqKAIAEBgMAQsgAigCqAwgAEECdGooAgAgAREBAAsgBEEBaiEEDAELCyACQagMaiIAQQQQMSAAEDQgAigCvA0QGAwNBSAOIAlBAnRqIQMDQCADKAIAIgUoAhAiBkH4AGohAyAGLQBwDQALAn8gDyAFQTBBACAFKAIAQQNxQQNHG2ooAihGBEAgByAKIAggBRCNDgwBCyAHIAggCiAFEI0OCyEDIAUoAhAiBiADNgJ8AkAgBA0AQQAhBCAGLQAsDQAgBi0AVA0AIAMoAhAgBTYCfCADIQQLIAlBAWohCQwBCwALAAsgBkUEQCAFIAggDiALIBIQjA4MBgsgDigCACEEQQAhAyALQQQQGiEHA0AgAyALRgRAIAcgC0EEQbMDELUBIAUoAhAiCSsAECFWIAQoAhAiBCsAECFYIAJBkCJqIgUgBCsAGCAJKwAYoCJVOQMAIAIgWCBWoCJWOQOIIiAEKwA4IVggCCgCECIIKwAQIVcgAkGYIWoiAyAEKwBAIAgrABigOQMAIAIgWCBXoCJYOQOQISAJKwNgIVcgCCsDWCFZIAcoAgAhBCACIAUpAwAiZTcDyCcgAiACKQOIIiJmNwPAJyAVIGY3AwAgFSBlNwMIIBsgAykDADcDCCAbIAIpA5AhNwMAIBYgAykDADcDCCAWIAIpA5AhNwMAIAQgBEFQQQAgBCgCAEEDcUECRxtqKAIoIAJBwCdqQQRB3NAKEJQBIAQoAhAoAmAiBCBWIFegIlsgWCBZoSJeoEQAAAAAAADgP6IiWDkDOEEBIQggBEEBOgBRIAQgVSAEKwMgIlZEAAAAAAAAGECgRAAAAAAAAOA/oqA5A0AgWCAEKwMYRAAAAAAAAOA/oiJXoCFcIFggV6EhXSBWIFVEAAAAAAAACECgIlegIVVEAAAAAAAAAAAhWUQAAAAAAAAAACFaAkADQAJAIAYgCEYEQCAGIAsgBiALSxshCSBeIF6gIFugRAAAAAAAAAhAoyFjIFsgW6AgXqBEAAAAAAAACECjIWQMAQsgByAIQQJ0aigCACEEAkAgCEEBcQRAIAQoAhAoAmAhCSAIQQFGBEAgWCAJKwMYRAAAAAAAAOA/oiJWoCFZIFggVqEhWgsgCSsDICFWIAIgAikDiCI3A8AnIAIgAisDiCI5A9AnIAIgAisDkCE5A+AnIAIgBSkDADcDyCcgAiBXIFZEAAAAAAAAGECgoSJXRAAAAAAAABjAoCJWOQPYJyACIFY5A+gnIBYgAykDADcDCCAWIAIpA5AhNwMAIAIgVzkDqCggAiBaOQOgKCACIFc5A5goIAIgWTkDkCggAiBZOQOAKCACIFo5A7AoIAIgAysDADkDiCggAiAFKwMAOQO4KCBXIAQoAhAoAmArAyBEAAAAAAAA4D+ioCFWDAELIAIgAikDiCI3A8AnIAIgVTkD+CcgAiBcOQPwJyACIFU5A+gnIAIgXTkD4CcgAiBdOQPQJyACIFw5A4AoIAIgBSkDADcDyCcgAiAFKwMAOQPYJyACIAMrAwA5A4goIBwgAykDADcDCCAcIAIpA5AhNwMAIAIgVUQAAAAAAAAYQKAiVjkDqCggAiBWOQO4KCACIAIrA5AhOQOgKCACIAIrA4giOQOwKCBVIAQoAhAoAmArAyAiX0QAAAAAAADgP6KgRAAAAAAAABhAoCFWIFUgX0QAAAAAAAAYQKCgIVULIAJBCDYCtCAgAiAFKQMANwPYBSACIAMpAwA3A8gFIAIgAikDiCI3A9AFIAIgAikDkCE3A8AFIAIgAkHAJ2o2ArAgIAIgAikCsCA3A7gFAkAgAkHQBWogAkHABWogAkG4BWogAkGQHWogJBCGDyIJBEAgAigCkB0iDg0BCyAJEBgMAwsgBCgCECgCYCIKQQE6AFEgCiBWOQNAIAogWDkDOCAEIARBUEEAIAQoAgBBA3FBAkcbaigCKCAJIA5B3NAKEJQBIAkQGCAIQQFqIQgMAQsLA0AgBiAJRg0BIAcgBkECdGoCQCAGQQFxBEAgAiACKQOIIjcDwCcgAiACKwOIIjkD0CcgAiAFKQMANwPIJyACIFdEAAAAAAAAGMCgIlZEAAAAAAAAGMCgIl45A9gnIAIrA5AhIV8gFiADKQMANwMIIBYgAikDkCE3AwAgAiBWOQOYKCACIGMgWSAGQQFGIggbIlg5A5AoIAUrAwAhYCADKwMAIWEgZCBaIAgbIlshYiBYIVkgWyFaIFYhVwwBCyACIAIpA4giNwPAJyACIFw5A/AnIAIgXTkD0CcgAiAFKQMANwPIJyACIAUrAwA5A9gnIAMrAwAhYSACIFU5A/gnIBwgAykDADcDCCAcIAIpA5AhNwMAIAIrA4giIWIgAisDkCEhWyBdIV8gXCFYIFUiXkQAAAAAAAAYQKAiViFgIFYhVQsoAgAhBCACQQg2ArQgIAIgBSkDADcDsAUgAiADKQMANwOgBSACIGA5A7goIAIgYjkDsCggAiBWOQOoKCACIFs5A6AoIAIgYTkDiCggAiBYOQOAKCACIF45A+gnIAIgXzkD4CcgAiACKQOIIjcDqAUgAiACKQOQITcDmAUgAiACQcAnajYCsCAgAiACKQKwIDcDkAUCQCACQagFaiACQZgFaiACQZAFaiACQZAdaiAkEIYPIghFDQAgAigCkB0iCkUNACAEIARBUEEAIAQoAgBBA3FBAkcbaigCKCAIIApB3NAKEJQBIAgQGCAGQQFqIQYMAQsLIAgQGAsgBxAYDAcFIAcgA0ECdCIJaiAJIA5qKAIANgIAIANBAWohAwwBCwALAAUgDiADQQJ0aigCACgCECIEKAJgQQBHIQkCQCAELQAsRQRAIAQtAFRBAUcNAQtBASEHCyAGIAlqIQYgA0EBaiEDDAELAAsACyAAKAIQQcABaiEDA0AgAygCACIDBEACQCADKAIQIgQtAKwBQQFHDQAgBCgCeEUNACADEIoIIAAgAygCECgCeBCKAiADKAIQIQQLIARBuAFqIQMMAQsLIAFFDQYgABAcIQYDQCAGRQ0HIAAgBhAsIQgDQCAIBEACQCAIQdzQCigCABECAEUNACAIKAIQKAIIIgVFDQAgBSgCBCIHQQF2IQFBACELQQAhAwNAIAEgA0cEQCACQcAnaiIEIAUoAgAiCSADQTBsaiIQQTAQHxogECAJIAcgA0F/c2pBMGwiEGpBMBAfGiAFKAIAIBBqIARBMBAfGiADQQFqIQMMAQsLA0AgByALRg0BIAUoAgAgC0EwbGoiASgCBCIJQQF2IRBBACEDA0AgAyAQRwRAIAIgASgCACIKIANBBHRqIgQpAwA3A8AnIAIgBCkDCDcDyCcgBCAKIAkgA0F/c2pBBHQiDGoiCikDADcDACAEIAopAwg3AwggASgCACAMaiIEIAIpA8AnNwMAIAQgAikDyCc3AwggA0EBaiEDDAELCyABIAEpAwhCIIk3AwggAiABKQMYNwPIJyACIAEpAxA3A8AnIAEgASkDIDcDECABIAEpAyg3AxggASACKQPAJzcDICABIAIpA8gnNwMoIAtBAWohCwwACwALIAAgCBAwIQgMAQUgACAGEB0hBgwCCwALAAsACyACQfAdakEAQSgQOBogAkHIHWpBAEEoEDgaIAIgAkH4EWo2AsAgIAIgAkGwF2oiBDYCoCEgAiACQfgeajYCqB4gDigCACIFKAIQIQYCQCAFIAVBMGoiAyAFKAIAQQNxIgdBA0YbKAIoKAIQKAL0ASAFIAVBMGsiCSAHQQJGGygCKCgCECgC9AFrIgcgB0EfdSIHcyAHayIgQQJPBEAgBCAGQbgBEB8aIAJBkCFqIgYgBUEwEB8aIB8gA0EwEB8aIAIgBDYCoCECQCAFKAIQIgQtAKQBQSBxBEAgAkGwIGogBRCHA0EoQdgAIAIoApAhIghBA3FBA0YbIAZqIAUgCSAFKAIAQQNxQQJGGygCKDYCACACKAKgIUEQaiAFKAIQQThqQSgQHxoMAQsgAkH4EWoiBiAEQbgBEB8aIAJBsCBqIAVBMBAfGiACIAY2AsAgIAJBkCFqQShB2AAgAigCkCEiCEEDcUEDRhtqIAUgAyAFKAIAQQNxQQNGGygCKDYCACAuIANBMBAfGgsgBRD6AyEDA0AgAyIEKAIQKAKwASIDDQALIAJBkCFqIgNBKEF4IAhBA3FBAkYbaiAEQVBBACAEKAIAQQNxQQJHG2ooAig2AgAgAigCoCEiBEEBOgBwIARBADoAVCAEQgA3AzggBCAFNgJ4IARBQGtCADcDACADIQUMAQsgBi0ApAFBIHFFDQAgAkGQIWoiAyAFEIcDIAMhBQsgBSEDAn8CQCAaDQADQCADKAIQIgQtAHAEQCAEKAJ4IQMMAQsLAkACQCADQShBeCADKAIAQQNxIgZBAkYbaigCACIHKAIQIggoAvQBIANBKEHYACAGQQNGG2ooAgAiCSgCECIKKAL0AWsiBkEfdSIPQX9zIAYgD3NqDgICAAELIAAoAkgoAhAtAHFBAXENAQsgBEHAAEEYIAVBKEHYACAFKAIAQQNxQQNGG2ooAgAgCUYiBhtqKwAAIAggCiAGGyIPKwAYoCFWIARBOEEQIAYbaisAACAPKwAQoCFYIARBGEHAACAGG2orAAAgCiAIIAYbIggrABigIVUgBEEQQTggBhtqKwAAIAgrABCgIVcgBCgCYCIEBEAgBCsDICFZIAQrAxghWiAHEC0oAhAoAnQhBCADKAIQKAJgIgMrAzghXCADKwNAIV0gAiBVOQOQHiACIFc5A4geIAJB8B1qIgNBEBAmIQggAigC8B0gCEEEdGoiCCAMKQMANwMAIAggDCkDCDcDCCACIFU5A5AeIAIgVzkDiB4gA0EQECYhCCACKALwHSAIQQR0aiIIIAwpAwA3AwAgCCAMKQMINwMIIAIgXSBaIFkgBEEBcSIEG0QAAAAAAADgP6IiW5ogWyBWIFWhIFwgV6GiIF0gVaEgWCBXoaKhRAAAAAAAAAAAZCIIG6AiVTkDkB4gAiBcIFkgWiAEG0QAAAAAAADgP6IiVyBXmiAIG6AiVzkDiB4gA0EQECYhAyACKALwHSADQQR0aiIDIAwpAwA3AwAgAyAMKQMINwMICyACIFU5A5AeIAIgVzkDiB4gAkHwHWoiA0EQECYhBCACKALwHSAEQQR0aiIEIAwpAwA3AwAgBCAMKQMINwMIIAIgVTkDkB4gAiBXOQOIHiADQRAQJiEEIAIoAvAdIARBBHRqIgQgDCkDADcDACAEIAwpAwg3AwggAiBWOQOQHiACIFg5A4geIANBEBAmIQQgAigC8B0gBEEEdGoiBCAMKQMANwMAIAQgDCkDCDcDCCACIFY5A5AeIAIgWDkDiB4gA0EQECYhAyACKALwHSADQQR0aiIDIAwpAwA3AwAgAyAMKQMINwMIIAcgCSAGGwwBCyACQZAdakEAQTgQOBogBUEoQXggBSgCAEEDcSIDQQJGG2ooAgAhByAFQShB2AAgA0EDRhtqKAIAIQggAkHAC2oiAyACQcAMakEoEB8aIAJB8BxqIAAgAyAIQQAgBRCzAyACQdgnaiIhIAJBiB1qIg8pAwA3AwAgFSACQYAdaiITKQMANwMAIAJByCdqIiIgAkH4HGoiESkDADcDACACIAIpA/AcNwPAJyAVKwMAIVUgAisDwCchViACQegMaiAFQQEgAkHAJ2ogCBDGBBCBBQJAIFUgVmRFDQAgCCgCECIDKwMYIAAoAhAoAsQBIAMoAvQBQcgAbGorAxChIlggGyACKAL0JyIDQQV0IgRqKwMAIldjRQ0AIAIgA0EBajYC9CcgBCAZaiIDIFc5AxggAyBVOQMQIAMgWDkDCCADIFY5AwALQQAhCUEAIQogBSIEIQYCQANAIAcoAhAtAKwBQQFHBEAgCCgCECEDDAILIAdB4NAKKAIAEQIAIAgoAhAhAw0BIAdBEGohCCACQfAcaiACQcAMaiAAIAMoAvQBEIsOIA0gDykDADcDGCANIBMpAwA3AxAgDSARKQMANwMIIA0gAikD8Bw3AwAgAkGQHWpBIBAmIQMgAigCkB0gA0EFdGoiAyANKQMANwMAIAMgDSkDGDcDGCADIA0pAxA3AxAgAyANKQMINwMIIAlBAXFFBEBBACEKIAcoAhAiCCEDA0ACQCADKALIASgCACIDQVBBACADKAIAQQNxQQJHG2ooAigoAhAiAy0ArAFBAUcNACADKALMAUEBRw0AIAMoAsQBQQFHDQAgAysDECAIKwMQYg0AIApBAWohCgwBCwsgACgCSCgCEC0AcSEJIAgoAsgBKAIAIQMgAkGYC2oiCCACQcAMakEoEB8aIAJB8BxqIAAgCCAHIAYgAxCzAyANIA8pAwA3AxggDSATKQMANwMQIA0gESkDADcDCCANIAIpA/AcNwMAIAJBkB1qQSAQJiEDIAIoApAdIANBBXRqIgMgDSkDADcDACADIA0pAxg3AxggAyANKQMQNwMQIAMgDSkDCDcDCCAKQQJrIAogCkEFQQMgCUEBcRtPIgkbIQogBygCECgCyAEoAgAiBkFQQQAgBigCAEEDcSIDQQJHG2ooAighByAGQTBBACADQQNHG2ooAighCAwBCyAHKAIQKALIASgCACEDIAJB8ApqIgkgAkHADGpBKBAfGiACQfAcaiAAIAkgByAGIAMQswMgAkGgImogDykDADcDACACQZgiaiATKQMANwMAIAJBkCJqIBEpAwA3AwAgAiACKQPwHDcDiCIgAkHoDGogBkEBIAJBiCJqIAZBKEF4IAYoAgBBA3FBAkYbaigCABDGBBCABQJAIAIoArwiIhdBBXQgGGoiA0EgayIJKwMAIlUgCSsDECJWY0UNACAJKwMYIlggBygCECIHKwMYIAAoAhAoAsQBIAcoAvQBQcgAbGorAxigIldjRQ0AIAIgF0EBajYCvCIgAyBXOQMYIAMgVjkDECADIFg5AwggAyBVOQMACyACQQE6AK0NIAJCmNqQorW/yPw/NwOgDSACQegMaiIDIAQgBiACQcAnaiACQYgiaiACQZAdahCKDiACQQA2AuwcAkACQAJ/AkAgHkUEQCADIAJB7BxqENAEIQcgAigC7BwhAwwBCyACQegMaiACQewcahDPBCEHIBogAigC7BwiA0EFSXINACAHIAcpAwA3AxAgByAHKQMINwMYIAcgByADQQR0akEQayIDKQMANwMgIAcgAykDCDcDKCADKQMAIWUgByADKQMINwM4IAcgZTcDMCACQQQ2AuwcQQQMAQsgA0UNASADCyEGQQAhAwwBCyAHEBhBACEDA0AgAigCmB0gA00EQCACQZAdaiIDQSAQMSADEDRBACEDA0AgAigC+B0gA00EQCACQfAdaiIDQRAQMSADEDRBACEDA0AgAigC0B0gA00EQCACQcgdaiIDQRAQMSADEDQMCwUgAkHwCWogAkHQHWopAwA3AwAgAiACKQPIHTcD6AkgAkHoCWogAxAZIQUCQAJAIAIoAtgdIgQOAgETAAsgAkHgCWogAigCyB0gBUEEdGoiBSkDCDcDACACIAUpAwA3A9gJIAJB2AlqIAQRAQALIANBAWohAwwBCwALAAUgAkHQCWogAkH4HWopAwA3AwAgAiACKQPwHTcDyAkgAkHICWogAxAZIQUCQAJAIAIoAoAeIgQOAgERAAsgAkHACWogAigC8B0gBUEEdGoiBSkDCDcDACACIAUpAwA3A7gJIAJBuAlqIAQRAQALIANBAWohAwwBCwALAAUgAkGwCWogAkGYHWopAwA3AwAgAiACKQOQHTcDqAkgAkGoCWogAxAZIQUCQAJAIAIoAqAdIgQOAgEPAAsgAkGQCWogAigCkB0gBUEFdGoiBSkDCDcDACACQZgJaiAFKQMQNwMAIAJBoAlqIAUpAxg3AwAgAiAFKQMANwOICSACQYgJaiAEEQEACyADQQFqIQMMAQsACwALA0AgAyAGSQRAIAwgByADQQR0aiIGKQMANwMAIAwgBikDCDcDCCACQfAdakEQECYhBiACKALwHSAGQQR0aiIGIAwpAwA3AwAgBiAMKQMINwMIIANBAWohAyACKALsHCEGDAELCyAHEBggCiEDA0AgCCgCACgCyAEoAgAhBiADBEAgA0EBayEDIAZBUEEAIAYoAgBBA3FBAkcbaigCKEEQaiEIDAELCyACKAL4HSIHBEAgAkHoCmogAkH4HWoiAykDADcDACACIAIpA/AdNwPgCiAMIAIoAvAdIAJB4ApqIAdBAWsQGUEEdGoiBykD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Dg0FIAIoAqwEIQggAigCqAQhCwJAAkACQCAJQQFqDgMAAQIDCyADKAIAIAIgAykCCDcDYCACIAMpAgA3A1ggAkHYAGogABAZQQJ0aigCACADKAIAIAIgAykCCDcDUCACIAMpAgA3A0ggAkHIAGogBRAZQQJ0aigCACAEQQAgBiABELgCIAMoAgAgAkFAayADKQIINwMAIAIgAykCADcDOCACQThqIAAQGUECdGooAgAgAygCACACIAMpAgg3AzAgAiADKQIANwMoIAJBKGogBRAZQQJ0aigCACAHQQEgCyABELgCIAhBAUcNAiADKAIAIAIgAykCCDcDICACIAMpAgA3AxggAkEYaiAFEBlBAnRqKAIAIAMoAgAgAiADKQIINwMQIAIgAykCADcDCCACQQhqIAAQGUECdGooAgAgByABEJcODAILAkACQAJAIAhBAWoOAwABAgQLIAMoAgAgAiADKQIINwOgASACIAMpAgA3A5gBIAJBmAFqIAAQGUECdGooAgAgAygCACACIAMpAgg3A5ABIAIgAykCADcDiAEgAkGIAWogBRAZQQJ0aigCACAEQQAgBiABELgCIAMoAgAgAiADKQIINwOAASACIAMpAgA3A3ggAkH4AGogABAZQQJ0aigCACADKAIAIAIgAykCCDcDcCACIAMpAgA3A2ggAkHoAGogBRAZQQJ0aigCACAHQQEgCyABELgCDAMLIAMoAgAgAiADKQIINwPgASACIAMpAgA3A9gBIAJB2AFqIAUQGUECdGooAgAgAygCACACIAMpAgg3A9ABIAIgAykCADcDyAEgAkHIAWogABAZQQJ0aigCAEEAIAQgBiABELgCIAMoAgAgAiADKQIINwPAASACIAMpAgA3A7gBIAJBuAFqIAUQGUECdGooAgAgAygCACACIAMpAgg3A7ABIAIgAykCADcDqAEgAkGoAWogABAZQQJ0aigCAEEBIAcgCyABELgCDAILIAMoAgAgAiADKQIINwOgAiACIAMpAgA3A5gCIAJBmAJqIAUQGUECdGooAgAgAygCACACIAMpAgg3A5ACIAIgAykCADcDiAIgAkGIAmogABAZQQJ0aigCAEEAIAQgBiABELgCIAMoAgAgAiADKQIINwOAAiACIAMpAgA3A/gBIAJB+AFqIAUQGUECdGooAgAgAygCACACIAMpAgg3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QbgCakEEECYhCiAEKAK4AiAKQQJ0aiAEKALMAjYCACACKAIAIAE2AhggCSACQQggCSgCABEDACECDAELCyAIIARB0AJqQYAEIAgoAgARAwAhAgNAAkAgASsDQCEbIAJFDQAgAisDECAbY0UNACAEIAIoAgA2AswCIARBuAJqQQQQJiEKIAQoArgCIApBAnRqIAQoAswCNgIAIAIoAgAgATYCGCAIIAJBCCAIKAIAEQMAIQIMAQsLIAQgGzkD2AIgCSAEQdACakGABCAJKAIAEQMAIQIDQAJAIAErAzghGyACRQ0AIAIrAwggG2NFDQAgBCACKAIANgLMAiAEQbgCakEEECYhCiAEKAK4AiAKQQJ0aiAEKALMAjYCACACKAIAIAE2AhQgCSACQQggCSgCABEDACECDAELCyAEIBs5A9ACIAQgASsDMDkD2AIgCCAEQdACakGABCAIKAIAEQMAIQIDQAJAIAJFDQAgAisDECABKwNAY0UNACAEIAIoAgA2AswCIARBuAJqQQQQJiEKIAQoArgCIApBAnRqIAQoAswCNgIAIAIoAgAgATYCFCAIIAJBCCAIKAIAEQMAIQIMAQsLIARBuAJqIAFBJGogAUEgakEEEMcBIAEoAiAiASAMIAEgDEsbIQwgBkEBaiEGDAELCwNAIBAgEUYEQCAAKAIQIAAoAgAiAUEobGoiAyABNgIgIAMgAUEBajYCSEEAIQMgACgCAEEGbCAMQQF0akEEEBohAiAAIAAoAgBBA2wgDGpBGBAaNgIUIAAoAgAiBkEAIAZBAEobIQEDQCABIANGBEAgBkECaiEDA0AgASADSARAIAAoAhAgAUEobGogAjYCHCABQQFqIQEgAiAMQQJ0aiECDAELCwUgACgCECADQShsaiACNgIcIANBAWohAyACQRhqIQIMAQsLQQAhBgJAAkADQCAGIA9GBEACQCAIEJkBGiAJEJkBGiALEBhBACEBQYj2CCgCACECA0AgASAAKAIATg0BIAAoAhAgAUEobGoiAygCFEUEQCAEIAE2AhAgAkH4zAQgBEEQahAgGiADKAIURQ0FCyADKAIYRQRAIAQgATYCACACQeLMBCAEECAaIAMoAhhFDQYLIAFBAWohAQwACwALBSASIAZByABsaiIBKwM4IAErAyihIhsgASsDQCABKwMwoSIfoEQAAAAAAADg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EmogBhAZQcgAbGogBTYCKAsgAigCACEGIARBkBJqIAIpAgg3AwAgBCACKQIANwOIEgJAIAYgBEGIEmogBRAZQcgAbGooAjQiBkEBa0F9Sw0AIAIoAgAgBEGAEmogAikCCDcDACAEIAIpAgA3A/gRIARB+BFqIAYQGUHIAGxqKAIsIAlHDQAgAigCACAEQfARaiACKQIINwMAIAQgAikCADcD6BEgBEHoEWogBhAZQcgAbGogBTYCLAsgAxDvASEHIAMQ7wEhCiACKAIAIARB4BFqIAIpAgg3AwAgBCACKQIANwPYESAEQdgRaiAJEBlByABsaigCOCEGIAMoAgAgBEHQEWogAykCCDcDACAEIAMpAgA3A8gRIARByBFqIAYQGUEobGpBAjYCACADKAIAIARBwBFqIAMpAgg3AwAgBCADKQIANwO4ESAEQbgRaiAGEBlBKGxqIg4gCCkDADcDCCAOIAgpAwg3AxAgAygCACAEQbARaiADKQIINwMAIAQgAykCADcDqBEgBEGoEWogBhAZQShsaiAANgIEIAMoAgAgBEGgEWogAykCCDcDACAEIAMpAgA3A5gRIARBmBFqIAYQGUEobGogCjYCICADKAIAIARBkBFqIAMpAgg3AwAgBCADKQIANwOIESAEQYgRaiAGEBlBKGxqIAc2AiQgAygCACAEQYARaiADKQIINwMAIAQgAykCADcD+BAgBEH4EGogBxAZQShsakEDNgIAIAMoAgAgBEHwEGogAykCCDcDACAEIAMpAgA3A+gQIARB6BBqIAcQGUEobGogCTYCGCADKAIAIARB4BBqIAMpAgg3AwAgBCADKQIANwPYECAEQdgQaiAHEBlBKGxqIAY2AhwgAygCACAEQdAQaiADKQIINwMAIAQgAykCADcDyBAgBEHIEGogChAZQShsakEDNgIAIAMoAgAgBEHAEGogAykCCDcDACAEIAMpAgA3A7gQIARBuBBqIAoQGUEobGogBTYCGCADKAIAIARBsBBqIAMpAgg3AwAgBCADKQIANwOoECAEQagQaiAKEBlBKGxqIAY2AhwgAigCACAEQaAQaiACKQIINwMAIAQgAikCADcDmBAgBEGYEGogCRAZQcgAbGogBzYCOCACKAIAIARBkBBqIAIpAgg3AwAgBCACKQIANwOIECAEQYgQaiAFEBlByABsaiAK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IAIoAgAgBEGIDGogAikCCDcDACAEIAIpAgA3A4AMIARBgAxqIAkQGUHIAGxqKwMYoZlESK+8mvLXej5lRSALRXINAAJAIBMoAgAiBUEATA0AIAUgASAHEMcERQ0AIAIoAgAhBSAEQbgLaiACKQIINwMAIAQgAikCADcDsAsgBSAEQbALaiAIEBlByABsaigCMCEHIARBqAtqIAIpAgg3AwAgBCACKQIANwOgCyAFIARBoAtqIAcQGUHIAGxqIAg2AiggAigCACAEQZgLaiACKQIINwMAIAQgAikCADcDkAsgBEGQC2ogBhAZQcgAbGpBfzYCMCACKAIAIARBiAtqIAIpAgg3AwAgBCACKQIANwOACyAEQYALaiAGEBlByABsakF/NgI0DAILIAIoAgAhBSAEQfgLaiACKQIINwMAIAQgAikCADcD8AsgBSAEQfALaiAGEBlByABsaigCMCEHIARB6AtqIAIpAgg3AwAgBCACKQIANwPgCyAFIARB4AtqIAcQGUHIAGxqIAY2AiwgAigCACAEQdgLaiACKQIINwMAIAQgAikCADcD0AsgBEHQC2ogCBAZQcgAbGpBfzYCMCACKAIAIARByAtqIAIpAgg3AwAgBCACKQIANwPACyAEQcALaiAIEBlByABsakF/NgI0DAELIAIoAgAhBSAEQfgKaiACKQIINwMAIAQgAikCADcD8AogBSAEQfAKaiAIEBlByABsaigCMCEHIARB6ApqIAIpAgg3AwAgBCACKQIANwPgCgJAIAUgBEHgCmogBxAZQcgAbGooAihBAWtBfUsNACACKAIAIQUgBEHYCmogAikCCDcDACAEIAIpAgA3A9AKIAUgBEHQCmogCBAZQcgAbGooAjAhByAEQcgKaiACKQIINwMAIAQgAikCADcDwAogBSAEQcAKaiAHEBlByABsaigCLEEBa0F9Sw0AIAIoAgAhBSAEQbgKaiACKQIINwMAIAQgAikCADcDsAogBSAEQbAKaiAIEBlByABsaigCMCEHIARBqApqIAIpAgg3AwAgBCACKQIANwOgCiAFIARBoApqIAcQGUHIAGxqKAIoIQcgAigCACEFIARBmApqIAIpAgg3AwAgBCACKQIANwOQCiAFIARBkApqIAgQGUHIAGxqKAIwIQogBEGICmogAikCCDcDACAEIAIpAgA3A4AKIAUg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aCAEIAIpAgA3A2AgBSAEQeAAaiAHEBlByABsaiAGNgIoIAIoAgAhBSAEIAIpAgg3A1ggBCACKQIANwNQIAUgBEHQAGogCBAZQcgAbGooAjQhByAEIAIpAgg3A0ggBCACKQIANwNAIAUgBEFAayAHEBlByABsakF/NgIsIAIoAgAgBCACKQIINwM4IAQgAikCADcDMCAEQTBqIAgQGUHIAGxqQX82AjQgAigCACAEIAIpAgg3AyggBCACKQIANwMgIARBIGogCBAZQcgAbGpBMGoMAQsgB0F/NgIsIAIoAgAhBSAEIAIpAgg3A/gBIAQgAikCADcD8AEgBSAEQfABaiAIEBlByABsaigCNCEHIAQgAikCCDcD6AEgBCACKQIANwPgASAFIARB4AFqIAcQGUHIAGxqIAg2AiggAigCACEFIAQgAikCCDcD2AEgBCACKQIANwPQASAFIARB0AFqIAgQGUHIAGxqKAI0IQcgBCACKQIINwPIASAEIAIpAgA3A8ABIAUgBEHAAWogBxAZQcgAbGogBjYCLCACKAIAIAQgAikCCDcDuAEgBCACKQIANwOwASAEQbABaiAIEBlByABsaigCNCEFIAIoAgAgBCACKQIINwOoASAEIAIpAgA3A6ABIARBoAFqIAYQGUHIAGxqIAU2AjAgAigCACAEIAIpAgg3A5gBIAQgAikCADcDkAEgBEGQAWogBhAZQcgAbGpBfzYCNCACKAIAIAQgAikCCDcDiAEgBCACKQIANwOAASAEQYABaiAIEBlByABsakE0agsoAgAhBSACKAIAIAQgAikCCDcDGCAEIAIpAgA3AxAgBEEQaiAIEBlByABsaiAANgIEIAIoAgAgBCACKQIINwMIIAQgAikCADcDACAEIAYQGUHIAGxqIAA2AgAMAAsAC0GwgwRBwgBBAUGI9ggoAgAQOhoQOwALySADEH8CfAJ+IwBBkAlrIgQkACAEQaAIaiIJQQBBwAAQOBogAEEAQeAAEDgiBUHIABAmIQAgBSgCACAAQcgAbGogBUEYakHIABAfGiADKAIAIRMgCRDvASEJIARBmAhqIARBqAhqIgApAwA3AwAgBCAEKQOgCDcDkAggBCgCoAggBEGQCGogCRAZQShsakECNgIAIARBiAhqIAApAwA3AwAgBCAEKQOgCDcDgAggBCgCoAggBEGACGog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AiACKAIAQQNxIQMLIAIgBiADQQNGGygCKCAFRw0CQZDdCigCACIDRQ0CIAIgAxBFIgMtAABFDQIgAUGwAmogAiADEMAODAILA0ACQCADIARPBEAgAUHgAmpBHBAxQQAhA0EAIQIDQCACIAEoArgCIgRPDQIgASABKQK4AjcD+AEgASABKQKwAjcD8AEgASgCsAIgAUHwAWogAhAZQRxsaigADEECTwRAIAEgASkCuAI3A+gBIAEgASkCsAI3A+ABIAEgASgCsAIgAUHgAWogAhAZQRxsaiIEKQIUNwPYASABIAQpAgw3A9ABIAEgBCkCBDcDyAEgBSABQcgBahDBDgsgAkEBaiECDAALAAsgASABKQLoAjcDwAEgASABKQLgAjcDuAEgAUG4AWogAxAZIQICQAJAIAEoAvACIgQOAgEJAAsgASABKALgAiACQRxsaiICKQIINwOgASABIAIpAhA3A6gBIAEgAigCGDYCsAEgASACKQIANwOYASABQZgBaiAEEQEACyADQQFqIQMgASgC6AIhBAwBCwsDQCADIARPBEAgAUGwAmpBHBAxIAAgBRAdIQUMBQUgASABKQK4AjcDqAIgASABKQKwAjcDoAIgAUGgAmogAxAZIQICQAJAIAEoAsACIgQOAgEJAAsgASABKAKwAiACQRxsaiICKQIINwOIAiABIAIpAhA3A5ACIAEgAigCGDYCmAIgASACKQIANwOAAiABQYACaiAEEQEACyADQQFqIQMgASgCuAIhBAwBCwALAAsgAUHgAmogAiADEMAOCyAAIAIgBRByIQIMAAsACwALIAFBkANqJAAPC0GwgwRBwgBBAUGI9ggoAgAQOhoQOwALHAEBf0EBIQIgACABENIOBH9BAQUgACABENEOCwtAAQJ/AkAgASAAKAIATw0AIAIgACgCBCIETw0AIAAoAgggASAEbCACaiIAQQN2ai0AACAAQQdxdkEBcSEDCyADC84CAQp/AkACQCAABEAgACgCACIFIAFLIAAoAgQiBCACS3FFBEAgBCACQQFqIgMgAyAESRsiBCAFIAFBAWoiAyADIAVJGyIFbCIDQQN2IANBB3FBAEdqEMYDIQcgACgCACEIA0AgBiAIRwRAIAQgBmwhCSAAKAIEIQpBACEDA0AgAyAKRgRAIAZBAWohBgwDCyAAIAYgAxDEDgRAIAcg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A0HMAGohCgJAA0AgAgRAAkAgAigCECIEIAhqKAIAKAIADQAgBCgCsAENACAEQQE2ArABIAMgAjYCTCADQThqQQQQJiEEIAMoAjggBEECdGogAygCTDYCAANAIAMoAkBFDQEgA0E4aiAKEKEEIAMoAkwiBSgCEC0AtQFBB0cEQCAAIAUQ0A4EQEEAIQIDQCADKAJAIAJNBEBBfyEEDAgFIAMgA0FAaykDADcDMCADIAMpAzg3AyggA0EoaiACEBkhAAJAAkACQCADKAJIIgEOAgIAAQsgAygCOCAAQQJ0aigCABAYDAELIAMoAjggAEECdGooAgAgAREBAAsgAkEBaiECDAELAAsACyADQThqIAUgARDPDgwBCyADQThqIQtBACEEAkAgAUEBaiIMIAUoAhAoAugBIgYoAhAiBSwAkQJGDQAgBSgC6AEhBQNAIAYoAhAiBCgC7AEiByAFTgRAIAVBAnQhByAFQQFqIQUgACAHIAQoAowCaigCABDQDiIERQ0BDAILCyAEKALoASEFA0AgBSAHTARAIAsgBCgCjAIgBUECdGooAgAgARDPDiAFQQFqIQUgBigCECIEKALsASEHDAELCyAEIAw6AJECQQAhBAsgBEUNAAtBACECA0AgAiADKAJATw0EIAMgA0FAaykDADcDICADIAMpAzg3AxggA0EYaiACEBkhAAJAAkACQCADKAJIIgEOAgIAAQsgAygCOCAAQQJ0aigCABAYDAELIAMoAjggAEECdGooAgAgAREBAAsgAkEBaiECDAALAAsgAigCECAJaigCACECDAELC0Ho/QooAgAhBSAAKAIQIgIoAugBIQQDQCACKALsASAETgRAIARByABsIgEgBSgCECgCxAFqQQA6ADECQCACLQB0QQFxRQ0AIAIoAsQBIAFqIgEoAgAiBkEATA0AIAZBAWsiBkEBdkEBaiEHIAEoAgQhAUEAIQIDQCACIAdHBEAgASACQQJ0aigCACABIAYgAmtBAnRqKAIAEJcIIAJBAWohAgwBCwsgACgCECECCyAEQQFqIQQMAQsLAkAgABBhIABHDQAQyQRCAFcNACAAQQAQlggLQQAhBEEAIQIDQCACIAMoAkBPDQEgAyADQUBrKQMANwMQIAMgAykDODcDCCADQQhqIAIQGSEAAkACQAJAIAMoAkgiAQ4CAgABCyADKAI4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IQILIAMgASACIAYQ6w4gASECCyAAIAYQMCEGDAALAAsACyAAEOoODAELIAAgA0EAQQAQ6Q4gAxAcIQEDQCABBEAgASgCECICQQA6ALQBIAJBADYCsAEgAyABEB0hAQwBCwsgAxAcIQEDQCABBEAgAyABEOgOIAMgARAdIQEMAQsLIAMQHCEBA0AgAQRAIAEoAhBBADYCkAEgAyABEB0hAQwBCwtBACEJIAMQHCEBA0AgAQRAIAEoAhAoApABRQRAIAMgASAJQQFqIgkQoAgLIAMgARAdIQEMAQsLAkAgCUECSA0AIANB5xwQygQhAiADEBwhAUEBIQgDQCABRQ0BIAggASgCECgCkAFGBEAgAyACIAFBAEEBEF4aIAhBAWohCAsgAyABEB0hAQwACwALIAMQHCEHA0AgBwRAIAMgBxAsIQEDQCABBEAgBygCECICKALIASACKALMASICQQFqIAJBAmoQ2gEhBCAHKAIQIgIgBDYCyAEgAiACKALMASICQQFqNgLMASAEIAJBAnRqIAE2AgAgBygCECICKALIASACKALMAUECdGpBADYCACABIAFBMGsiBSABKAIAQQNxQQJGGygCKCgCECICKALAASACKALEASICQQFqIAJBAmoQ2gEhAiABIAUgASgCAEEDcUECRhsoAigoAhAgAjYCwAEgASAFIAEoAgBBA3FBAkYbKAIoKAIQIgQgBCgCxAEiAkEBajYCxAEgBCgCwAEgAkECdGogATYCACABIAUgASgCAEEDcUECRhsoAigoAhAiAigCwAEgAigCxAFBAnRqQQA2AgAgAyABEDAhAQwBCwsgAyAHEB0hBwwBCwsgA0EBIBAgAEGnhwEQJyICBH8gAhCRAgVBfwsQ/w4aIAAoAhBC/////3c3A+gBQQAhBwJAIAlBAkgNACAJQQFqIgIQnwghB0EBIQEDQCABIAJGDQEgByABQQJ0akH/////BzYCACABQQFqIQEMAAsACyAAEBwhCANAIAgEQCAIEIYCIQIgCCgCECIBIAIoAhAoAqQBKAIQIgIoAvQBIgU2AvQBIAUgACgCECIEKALsAUoEQCAEIAU2AuwBCyAFIAQoAugBSARAIAQgBTYC6AELIAcEQCABIAIoApABIgI2ApABIAcgAkECdGoiAiACKAIAIgIgBSACIAVIGzYCAAsgACAIEB0hCAwB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IAFCADcDECABQgA3AwggASAANgIcIAFBCGpBBBAmIQAgASgCCCAAQQJ0aiABKAIcNgIAIAFBHGohCkH/////ByEEA0AgASgCEARAIAFBCGogCkEEEL4BQQAhACABKAIcIQcDQCAHKAIQIgIoAsgBIABBAnRqKAIAIgMEQCADQVBBACADKAIAQQNxIgtBAkcbaigCKCIMKAIQIg0oArACIQYCQCADKAIQIg4oAqQBQQBIBEAgBiAITCAGIAlOcQ0BIA0oAvQBIANBMEEAIAtBA0cbaigCKCgCECgC9AEgDigCrAFqayICIAQgBUUgAiAESHIiAhshBCADIAUgAhshBQwBCyAGIAIoArACTg0AIAEgDDYCHCABQQhqQQQQJiECIAEoAgggAkECdGogASgCHDYCAAsgAEEBaiEADAEFQQAhACAEQQBMDQMDQCACKAKYAiAAQQJ0aigCACIDRQ0EIANBMEEAIAMoAgBBA3FBA0cbaigCKCIDKAIQKAKwAiACKAKwAkgEQCABIAM2AhwgAUEIakEEECYhAiABKAIIIAJBAnRqIAEoAhw2AgAgBygCECECCyAAQQFqIQAMAAsACwALAAsLDAELIAQoAhAiACgCsAIhCCAAKAKsAiEJIAFBADYCGCABQgA3AxAgAUIANwMIIAEgBDYCHCABQQhqQQQQJiEAIAEoAgggAEECdGogASgCHDYCACABQRxqIQpB/////wchBANAIAEoAhAEQCABQQhqIApBBBC+AUEAIQAgASgCHCEHA0AgBygCECICKALAASAAQQJ0aigCACIDBEAgA0EwQQAgAygCAEEDcSILQQNHG2ooAigiDCgCECINKAKwAiEGAkAgAygCECIOKAKkAUEASARAIAYgCEwgBiAJTnENASADQVBBACALQQJHG2ooAigoAhAoAvQBIA0oAvQBIA4oAqwBamsiAiAEIAVFIAIgBEhyIgIbIQQgAyAFIAIbIQUMAQsgBiACKAKwAk4NACABIAw2AhwgAUEIakEEECYhAiABKAIIIAJBAnRqIAEoAhw2AgALIABBAWohAAwBBUEAIQAgBEEATA0DA0AgAigCoAIgAEECdGooAgAiA0UNBCADQVBBACADKAIAQQNxQQJHG2ooAigiAygCECgCsAIgAigCsAJIBEAgASADNgIcIAFBCGpBBBAmIQIgASgCCCAC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4woQwgEQcQtBkOMKECQEQCAAQeDjCigCACgCFEGQ4woQwgEQcQtBsOMKECQEQCAAQeDjCigCACgCHEGw4woQwgEQiwYLQcDjChAkBEAgAEHg4wooAgAoAiRBwOMKEMIBEHELQdDjChAkBEAgAEHg4wooAgAoAiBB0OMKEMIBEHELQYilCkKAgICAgICA+D83AwBB+KQKQoCAgICAgID4PzcDAEHopApCgICAgICAgPg/NwMAQeCkCkKAgICAgICA+D83AwBByKQKQoCAgICAgID4PzcDAEHApApCgICAgICAgPg/NwMAQYjkCkIANwMAQfjjCkIANwMAQZzkCkEANgIAQZTkCkEANgIAC30AIAAoAhAoAgghAEHw4goQJARAIABB4OMKKAIAKAIIQfDiChDCARBxC0Gw4woQJARAIABB4OMKKAIAKAIMQbDjChDCARCLBgtBgKUKQoCAgICAgID4PzcDAEHwpApCgICAgICAgPg/NwMAQZjkCkEANgIAQZDkCkEANgIAC3MAIAAoAhAoAggiAEHg4wooAgAoAgBB8OIKEMIBEHEgACgCECgCDARAIABB4OMKKAIAKAIEQbDjChDCARBxC0HYpApCgICAgICAgPg/NwMAQbikCkKAgICAgICA+D83AwBBhOQKQQA2AgBB9OMKQQA2AgALxAMBBH8jAEEQayIDJAAgACgCECgCCCEBQeTjCigCAEUEQEHs4wpBoAI2AgBB6OMKQaECNgIAQeTjCkHw7wkoAgA2AgALIAEoAkwiAigCBCEEIAJB5OMKNgIEAkACQAJAAkACQAJAIAAoAkAOBwEBBAACAgIDCyAAIAEgAEEBEMcIDAQLIAAtAJsBQQhxDQMgASAAENUIDAMLQeDiChAkBEBB4OMKKAIAKAIAIgJFBEAgAUEAQcHDARCIASECQeDjCigCACACNgIACyABIAJB4OIKEMIBEHELIAEoAhAoAgwEQCABQeDjCigCACgCBEGg4woQwgEQiwYLQQAhAiABQb7jAEHg4wooAgAoAiwQkAcDQCACQQhGRQRAIAJBBHRB4OIKahBcIAJBAWohAgwBCwtB4OMKKAIAEBhB0KQKQoCAgICAgID4PzcDAEGwpApCgICAgICAgPg/NwMAQYDkCkEANgIAQfDjCkEANgIAIAAtAJsBQQhxDQIgASAAENUIDAILIANB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IAUoAggoAghB4IYKRwRAIAQgATYCGCAGIQMLIAFBACAEQegAaiACIAQtAGcgAxCWBEUNASABIAIQ3wkMAQsgASAGIARB6ABqIANB6cUBIAMbIgMgBC0AZ0EAEJYERQ0AIAEQISEBIAQgAzYCCCAEIAI2AgQgBCABNgIAQd+9BCAEECoLIARBADYCjAEgACAEQegAakEoEB8aCyAEQZABaiQACxoAIAAoAhAoAgwiAARAIAAoAiwQGCAAEBgLC6kFAgR8CH9BMBBSIQYgACgCECgCCCgCCCgCBCEKAnwgAEHU2wooAgBE////////739EexSuR+F6hD8QTCAAQdDbCigCAET////////vf0R7FK5H4XqUPxBMIgEQKSICvUL/////////9/8AUiABvUL/////////9/8AUnJFBEAgACgCECIFQpqz5syZs+bUPzcDICAFQpqz5syZs+bUPzcDKETNzMzMzMwMQAwBCyACRGEyVTAqqTM/ECMhASAAKAIQIgUgASACIAJEAAAAAAAAAABkGyIBOQMgIAUgATkDKCABRAAAAAAAAFJAogshA0EBIQtBASAAQYjcCigCACAKQQAQYiIHIAdBAU0bIAdBAEcgAEG83AooAgBEAAAAAAAA8D9EAAAAAAAAAAAQTCIERAAAAAAAAAAAZHEiCmoiBUEBdEEQEBoiCCADRAAAAAAAAOA/oiICOQMYIAggAjkDECAIIAKaIgE5AwggCCABOQMAQQIhCQJAIAdBAkkEQCACIQEMAQsgAiEBA0AgByALRkUEQCAIIAlBBHRqIgwgAUQAAAAAAAAQQKAiAZo5AwggDCACRAAAAAAAABBAoCICmjkDACAMIAI5AxAgDCABOQMYIAtBAWohCyAJQQJqIQkMAQsLIAIgAqAhAwsgCkUgBSAHTXJFBEAgCCAJQQR0aiIFIAREAAAAAAAA4D+iIgQgAaAiATkDGCAFIAQgAqAiAjkDECAFIAGaOQMIIAUgApo5AwALIAZCADcDECAGQQI2AgggBiAHNgIEIAZBATYCACAGIAg2AiwgBkIANwMYIAZCADcDICAAKAIQIgAgAiACoEQAAAAAAABSQKMiATkDcCAAIAE5A2ggACADRAAAAAAAAFJAoyIBOQMoIAAgATkDICAAIAY2AgwLwQMCBH8CfCMAQdAAayIBJAAgABAtKAIQKAJ0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IAMgBBCIBSAFQQhqIgUgBkkNAAwDCwALA0AgAS0ANg0CIAEoAiRBAUYEQCABKAIYQQFGDQMLIAUgASACIAMgBBCIBSAFQQhqIgUgBkkNAAsMAQsgASACNgIUIAEgASgCKEEBajYCKCABKAIkQQFHDQAgASgCGEECRw0AIAFBAToANgsLcAECfyAAIAEoAghBABDbAQRAIAEgAiADEO8GDwsgACgCDCEEIABBEGoiBSABIAIgAxCyCgJAIARBAkkNACAFIARBA3RqIQQgAEEYaiEAA0AgACABIAIgAxCyCiABLQA2DQEgAEEIaiIAIARJDQALCwszACAAIAEoAghBABDbAQRAIAEgAiADEO8GDwsgACgCCCIAIAEgAiADIAAoAgAoAhwRBwALGgAgACABKAIIQQAQ2wEEQCABIAIgAxDvBgsLgwUBBn8jAEFAaiIEJAACf0EBIAAgAUEAENsBDQAaQQAgAUUNABojAEEQayIGJAAgBiABKAIAIgNBCGsoAgAiBTYCDCAGIAEgBWo2AgQgBiADQQRrKAIANgIIIAYoAggiA0Ho6AlBABDbASEFIAYoAgQhBwJAIAUEQCAGKAIMIQEjAEFAaiIDJAAgA0FAayQAQQAgByABGyEDDAELIAMhBSMAQUBqIgMkACABIAdOBEAgA0IANwIcIANCADcCJCADQgA3AiwgA0IANwIUIANBADYCECADQejoCTYCDCADIAU2AgQgA0EANgI8IANCgYCAgICAgIABNwI0IAMgATYCCCAFIANBBGogByAHQQFBACAFKAIAKAIUEQsAIAFBACADKAIcGyEICyADQUBrJAAgCCIDDQAjAEFAaiIDJAAgA0EANgIQIANBuOgJNgIMIAMgATYCCCADQejoCTYCBEEAIQEgA0EUakEAQScQOBogA0EANgI8IANBAToAOyAFIANBBGogB0EBQQAgBSgCACgCGBEKAAJAAkACQCADKAIoDgIAAQILIAMoAhhBACADKAIkQQFGG0EAIAMoAiBBAUYbQQAgAygCLEEBRhshAQwBCyADKAIcQQFHBEAgAygCLA0BIAMoAiBBAUcNASADKAIkQQFHDQELIAMoAhQhAQsgA0FAayQAIAEhAwsgBkEQaiQAQQAgA0UNABogBEEIakEAQTgQOBogBEEBOgA7IARBfzYCECAEIAA2AgwgBCADNgIE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KAIIEPgGIghBf0YNBCAGIAcoAgBrIAhJDQYDQCAIBEAgAi0AACEFIAcgBygCACIJQQFqNgIAIAkgBToAACAIQQFrIQggAkEBaiECDAELCyAEIAQoAgBBBGoiAjYCACACIQgDQCADIAhGBEAgAyEIDAULIAgoAgBFDQQgCEEEaiEIDAALAAsgBCACNgIADAMLIAQoAgALIANHIRAMAwsgBygCACEFDAELC0ECIRALIA9BEGokACAQCwkAIAAQ4QoQGAszACMAQRBrIgAkACAAIAQ2AgwgACADIAJrNgIIIABBDGogAEEIahCvCygCACAAQRBqJAALNAADQCABIAJGRQRAIAQgAyABLAAAIgAgAEEASBs6AAAgBEEBaiEEIAFBAWohAQwBCwsgAQsMACACIAEgAUEASBsLKgADQCABIAJGRQRAIAMgAS0AADoAACADQQFqIQMgAUEBaiEBDAELCyABCw8AIAAgASACQbClCRCgCgseACABQQBOBH9BsKUJKAIAIAFBAnRqKAIABSABC8ALDwAgACABIAJBpJkJEKAKCx4AIAFBAE4Ef0GkmQkoAgAgAUECdGooAgAFIAELwAsJACAAENcKEBgLNQADQCABIAJGRQRAIAQgASgCACIAIAMgAEGAAUkbOgAAIARBAWohBCABQQRqIQEMAQsLIAELDgAgASACIAFBgAFJG8ALKgADQCABIAJGRQRAIAMgASwAADYCACADQQRqIQMgAUEBaiEBDAELCyABCw8AIAAgASACQbClCRCfCgseACABQf8ATQR/QbClCSgCACABQQJ0aigCAAUgAQsLDwAgACABIAJBpJkJEJ8KCx4AIAFB/wBNBH9BpJkJKAIAIAFBAnRqKAIABSABCws6AANAAkAgAiADRg0AIAIoAgAiAEH/AEsNACAAQQJ0QYC0CWooAgAgAXFFDQAgAkEEaiECDAELCyACCzoAA0ACQCACIANGDQAgAigCACIAQf8ATQRAIABBAnRBgLQJaigCACABcQ0BCyACQQRqIQIMAQsLIAILSQEBfwNAIAEgAkZFBEBBACEAIAMgASgCACIEQf8ATQR/IARBAnRBgLQJaigCAAVBAAs2AgAgA0EEaiEDIAFBBGohAQwBCwsgAQslAEEAIQAgAkH/AE0EfyACQQJ0QYC0CWooAgAgAXFBAEcFQQALCwkAIAAQ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AkAgAEH8AWogAEH4AWoQWw0AIAAoArABIAEQJSACakYEQCABECUhAyABIAEQJUEBdBBBIAEgARBVEEEgACADIAFBABBDIgJqNgKwAQsgAEH8AWoiAxCDASAAQQdqIABBBmogAiAAQbABaiAALADPASAALADOASAAQcABaiAAQRBqIABBDGogAEEIaiAAQdABahCIBw0AIAMQlgEaDAELCwJAIABBwAFqECVFDQAgAC0AB0EBRw0AIAAoAgwiAyAAQRBqa0GfAUoNACAAIANBBGo2AgwgAyAAKAIINgIACyAFIAIgACgCsAEgBBCPCzgCACAAQcABaiAAQRBqIAAoAgwgBBCvASAAQfwBaiAAQfgBahBbBEAgBCAEKAIAQQJyNgIACyAAKAL8ASABEDUaIABBwAFqEDUaIABBgAJqJAALjwMBAX8jAEGAAmsiACQAIAAgAjYC+AEgACABNgL8ASADEKgCIQYgAEHEAWogAyAAQfcBahClBCAAQbgBahBUIgEgARBVEEEgACABQQAQQyICNgK0ASAAIABBEGo2AgwgAEEANgIIA0ACQCAAQfwBaiAAQfgBahBbDQAgACgCtAEgARAlIAJqRgRAIAEQJSEDIAEgARAlQQF0EEEgASABEFUQQSAAIAMgAUEAEEMiAmo2ArQBCyAAQfwBaiIDEIMBIAYgAiAAQbQBaiAAQQhqIAAsAPcBIABBxAFqIABBEGogAEEMakHAsQkQ2QMNACADEJYBGgwBCwsCQCAAQcQBahAlRQ0AIAAoAgwiAyAAQRBqa0GfAUoNACAAIANBBGo2AgwgAyAAKAIINgIACyAFIAIgACgCtAEgBCAGEJALNwMAIABBxAFqIABBEGogACgCDCAEEK8BIABB/AFqIABB+AFqEFsEQCAEIAQoAgBBAnI2AgALIAAoAvwBIAEQNRogAEHEAWoQNRogAEGAAmokAAuPAwEBfyMAQYACayIAJAAgACACNgL4ASAAIAE2AvwBIAMQqAIhBiAAQcQBaiADIABB9wFqEKUEIABBuAFqEFQiASABEFUQQSAAIAFBABBDIgI2ArQBIAAgAEEQajYCDCAAQQA2AggDQAJAIABB/AFqIABB+AFqEFsNACAAKAK0ASABECUgAmpGBEAgARAlIQMgASABECVBAXQQQSABIAEQVRBBIAAgAyABQQAQQyICajYC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AjgCQCABQeIlQQBBARA2BEAgASgCECgCCA0BCyACLQCbAUEEcQ0AQZqwBEEAEDdBfyEBDAELAkAgBQRAIAVBgCAQTyIGNgIAIAYNAQtBwf4AQQAQN0F/IQEMAQsgAkKAIDcCLCACIAY2AiggACABEJ8GIQEgAhCHBCABRQRAIAUgAigCKDYCACADIAIoAjA2AggLIAAQlQQLIARBEGokACADKAIMIQACQCABRQRAIAAhBwwBCyAAEBgLIANBEGokACAHCwsAEPYMELwMEJMKCzUAIAFB4iVBAEEBEDYEQCABKAIQKAKUASIABEAgASAAEQEAIAEoAhBBADYClAELIAEQ0wkLCwsAIAAgASACEJQGCwwAIAAQlwYgABCWBgsFABCVBgsHACAAELkBCwsAIAAgASACEJAHCw0AIAAgASACQQIQ4wYLDQAgACABIAJBARDjBgsNACAAIAEgAkEAEOMGCwsAIAAgAUEBEJIBCxwAIAAgACABQQEQjQEgACACQQEQjQFBAEEBEF4LCwAgACABQQEQjQELCwAgACABQQEQjAELCwAgACABQQAQjAELCQAgACABENUCCwkAIAAgARCsAQs2AQF/QQBBAUHC8ABBvdEBELUFGhD2DBC8DBCTCiAAENwNA0BBABDcDSIBBEAgARC5AQwBCwsLRwEBfyMAQRBrIgMkACADQQA7AA0gA0EAOgAPIANBAkEAIAIbIAFyOgAMIAMgAygCDDYCCCAAIANBCGpBABDjASADQRBqJAALsAMCBX8BfiMAQRBrIgMkACADQQA2AgwCfxCVBiEEIwBB4ABrIgEkACABQgA3A1ggAUIANwNQIAFCADcDSAJAAkACf0EAIABFDQAaAkADQCACQQVHBEAgACACQQJ0QbCWBWooAgAQLkUNAiACQQFqIQIMAQsLIAEgADYCAEHu+wQgARA3QQAMAQsgBCACQQJ0aigCQCECIAFCADcDQEEAIQADQCACBEAgAUE4aiACKAIEQToQ0AECQCAABEAgASABKQNANwMoIAEgASkDODcDICABQShqIAFBIGoQ+gYNAQsgASgCOCIARQ0EIAAgASgCPCIAEJACIgVFDQUgASAFNgJcIAFByABqQQQQJiEAIAEoAkggAEECdGogASgCXDYCAAsgASABKQM4IgY3A0AgBqchACACKAIAIQIMAQsLIAFB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iAFqQQAQGUECdGogAygCuAEQzgwEQCADIAMpA7gBNwOAASADIAMpA7ABNwN4IAchAiADKAKwASADQfgAakEAEBlBAnRqIAMoArgBENAMIgsNAUEAIQtBouwDQQAQKkEAIQIDQCACIAMoArgBTw0FIAMgAykDuAE3A1AgAyADKQOwATcDSCADQcgAaiACEBkhBAJAAkACQCADKALAASIFDgICAAELIAMoArABIARBAnRqKAIAEBgMAQsgAygCsAEgBEECdGooAgAgBREBAAsgAkEBaiECDAALAAsCQCAMDQAgA0GYAWogABD9AiAAQQhBCBDqBSECQcTtA0EAECogASsDACINIAK3Ig5mIA4gASsDCCIPZXIEQCADQUBrIA85AwAgAyANOQM4IAMgAjYCMEHj8AQgA0EwahCAAQwBCyADKwOYASIOIA1lIAMrA6ABIhAgD2VyRQ0AIAMgDzkDKCADIA05AyAgAyAQOQMYIAMgDjkDEEGV8QQgA0EQahCAAQtBACECA0AgAiADKAK4AU8NBCADIAMpA7gBNwMIIAMgAykDsAE3AwAgAyACEBkhBAJAAkACQCADKALAASIFDgICAAELIAMoArABIARBAnRqKAIAEBgMAQsgAygCsAEgBEECdGooAgAgBREBAAsgAkEBaiECDAALAAsDQCACRQRAQQAhAgNAIAIgAygCuAFPDQYgAyADKQO4ATcDYCADIAMpA7ABNwNYIANB2ABqIAIQGSEEAkACQAJAIAMoAsABIgUOAgIAAQsgAygCsAEgBEECdGooAgAQGAwBCyADKAKwASAEQQJ0aigCACAFEQEACyACQQFqIQIMAAsACyACKAIQIANBmAFqIAIgC0EAEMUMIAMpA5gBNwOQASADKAK4AUEATgRAIANBsAFqQQQQjAIgAyADKQO4ATcDcCADIAMpA7ABNwNoIAIgAygCsAEgA0HoAGpBABAZQQJ0aiADKAK4AUEAEMQMIAIoAhAoArABIQIMAQsLQYnNAUGDugFBggJBzDAQAAALQYnNAUGDugFB4QFBzDAQAAALIAAgChAdIQoMBQtBASEMCyADQbABaiICQQQQMSACEDQLIAAgBxAwIQcMAAsACwsgCwRAIAsQzwwLIANB0AFqJAAgDAtbAQJ/IAAQHCEBA0AgAQRAIAAgARAsIQIDQCACBEAgAhDAAiAA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AAAAUkCjoDkDMCAEIAUrAzhEAAAAAAAAUkCjIAOhOQM4CyAAIAQ2AiQgACAGKAIMIgE2AiAgBCABIAAgAEEQahDnDEEACyAGQRBqJAALEQAgACABQeD+CkHc/goQ5QYLLQECfUF/IAIgACgCAEECdGoqAgAiAyACIAEoAgBBAnRqKgIAIgReIAMgBF0bCxIAIABBNGoQ9QMgAEEoahD1AwsJACAAEJINEBgLGQECfiAAKQMIIgIgASkDCCIDViACIANUawsdACAAKAIAQQR2IgAgASgCAEEEdiIBSyAAIAFJawtEAgF/AnwgACgCBCgCBCABKAIEKAIERgRAIAAoAgBFIAEoAgBBAEdxDwsgACsDECIDIAErAxAiBGQEf0EABSADIARjCwsJACAAEKENEBgLCQAgABDsBxAYC4kIAgl/AnwjAEGgAWsiAyQAIAAQog0gA0EANgKcASAAQQRqIQcgAEEkaiEEAkACQAJAA0AgBCgCACECRP///////+9/IQogBCgCBCIFIQEDfCACIAVGBHwgCkRIr7ya8td6vmNFIAEgBUZyRQRAIAEgBCgCBEEEaygCADYCACAEIAQoAgRBBGs2AgQLIAoFIAogAigCACIGELUCIgtkBEAgAyAGNgKcASALIQogAiEBCyACQQRqIQIMAQsLREivvJry13q+YwRAIAMoApwBIgItABxBAUYNAiADIAIoAgAoAiAiATYCBCADIAIoAgQiBigCICIFNgKYASABIAVHBEAgASAFIAIQrw0MAgsgCEGRzgBODQMgAigCACEJIwBBEGsiBSQAIAEgASgCACgCAEEAEOAFIAUgASAGIAlBAEEAQQAQ8AcgBSgCCCEGIAVBEGokACABIANBBGoiBSADQZgBaiAGEO8HIAFBAToAKCADIAY2AhAgBCADQRBqIgEQwAEgAygCBCADKAKYASACEK8NIAEgByAFEPYDIAhBAWohCAwBCwsgBxDeBUEAIQEDQCABIAAoAhxPDQMgAUECdCABQQFqIQEgACgCGGooAgAiBBC1AkRIr7ya8td6vmNFDQALIANBEGoiAUHIlAk2AjggAUG0lAk2AgAgAUHUlAkoAgAiADYCACABIABBDGsoAgBqQdiUCSgCADYCACABIAEoAgBBDGsoAgBqIgJBADYCFCACIAFBBGoiADYCGCACQQA2AgwgAkKC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ACxBAXEEQCACQQFxRQ0CIAErABAiESADKwAQIhJjDQIgESASZA0BIAErABgiESADKwAYIhJjDQIgESASZCECCyACDQIgAS0AVCECIAMtAFRBAXEEQCACQQFxRQ0CIAErADgiESADKwA4IhJjDQIgESASZA0BIAErAEAiESADKwBAIhJjDQIgESASZCECCyACDQIgBygCECgCpAFBwAFxIgEgACgCECgCpAFBwAFxIgJJDQEgASACSw0AQX8hAiAHKAIAQQR2IgEgACgCAEEEdiIASQ0CIAAgAUkhAgwCC0EBIQIMAQtBfyECCyAFQbAEaiQAIAILQAICfAF/IAArAwAiAiABKwMAIgNkBEAgACsDCCABKwMIZUUPCyACIANjBH9BAEF/IAArAwggASsDCGYbBUEACwv0AgEJfyMAQRBrIgYkACAAKAIwIQEjAEEQayIDJAADQAJAQQAhByACIAEoAgBPDQADQCACQQV0IgUgASgCBGoiCEEIaiEEIAgoABAgB00EQCAEQQQQMSABKAIEIAVqQQhqEDQgAkEBaiECDAMFIAMgBCkCCDcDCCADIAQpAgA3AwAgAyAHEBkhBAJAAkACQCABKAIEIAVqIgUoAhgiCA4CAgABCyAFKAIIIARBAnRqKAIAEBgMAQsgBSgCCCAEQQJ0aigCACAIEQEACyAHQQFqIQcMAQsACwALCyABKAIEEBggARAYIANBEGokACAAQRhqIQEDQCAAKAAgIAlLBEAgBiABKQIINwMIIAYgASkCADcDACAGIAkQGSECAkACQAJAIAAoAigiAw4CAgABCyABKAIAIAJBAnRqKAIAEBgMAQsgASgCACACQQJ0aigCACADEQEACyAJQQFqIQkMAQsLIAFBBBAxIAEQNCAAEBggBkEQaiQACxsBAnxBfyAAKwMAIgIgASsDACIDZCACIANjGwsPACAAKAIQEJkBGiAAEBgLIAECfEEBQX9BACAAKwMAIgIgASsDACIDYxsgAiADZBsLWgIBfAF/QX8gACsDCCABKwMIoSICREivvJry13o+ZCACREivvJry13q+YxsiAwR/IAMFQX8gACsDACABKwMAoSICREivvJry13o+ZCACREivvJry13q+YxsLC1oCAXwBf0F/IAArAwAgASsDAKEiAkRIr7ya8td6PmQgAkRIr7ya8td6vmMbIgMEfyADBUF/IAArAwggASsDCKEiAkRIr7ya8td6PmQgAkRIr7ya8td6vmMbCwuTAQEFfyMAQRBrIgIkACAAQQRqIQEDQCADIAAoAgxPRQRAIAIgASkCCDcDCCACIAEpAgA3AwAgAiADEBkhBAJAAkACQCAAKAIUIgUOAgIAAQsgASgCACAEQQJ0aigCABAYDAELIAEoAgAgBEECdGooAgAgBREBAAsgA0EBaiEDDAELCyABQQQQMSABEDQgAkEQaiQACyUAIAAoAgAoAhAoAvgBIgAgASgCACgCECgC+AEiAUogACABSGsLEgAgAUHatgEgAigCCEEBEDYaCxIAIAFB6bYBIAIoAgRBARA2GgsSACABQcq2ASACKAIAQQEQNhoLGQBBfyAAKAIAIgAgASgCACIBSyAAIAFJGwslACAAKAIAKAIQKAL0ASIAIAEoAgAoAhAoAvQBIgFKIAAgAUhrCyUAIAEoAgAoAhAoAvQBIgEgACgCACgCECgC9AEiAEogACABSmsLIwAgACgCECgCAEEEdiIAIAEoAhAoAgBBBHYiAUsgACABSWsLlQEBBH8jAEEQayIBJAAgAARAA0AgACgACCACTQRAIABBBBAxIAAQNAUgASAAKQIINwMIIAEgACkCADcDACABIAIQGSEDAkACQAJAIAAoAhAiBA4CAgABCyAAKAIAIANBAnRqKAIAEBgMAQsgACgCACADQQJ0aigCACAEEQEACyACQQFqIQIMAQsLCyAAEBggAUEQaiQACxQAIAAoAhBBHGogAEcEQCAAEBgLC44BAgF/BHwjAEEwayIDJAAgAyABKAIIIgQ2AiQgAyAENgIgIABBivwEIANBIGoQHiACKwMAIQUgAisDECEGIAIrAwghByACKwMYIQggAyABKAIINgIQIAMgCCAHoEQAAAAAAADgP6I5AwggAyAGIAWgRAAAAAAAAOA/ojkDACAAQbH5BCADEB4gA0EwaiQACwIAC90DAgF/AnwjAEGgAWsiBCQAAkACQCAABEAgAUUNASABKAIIRQ0CIAEoAkQEQCAEIAIpAwA3A2AgBCACKQMINwNoIAQgAikDGDcDiAEgBCACKQMQNwOAASAEIAQrA2giBTkDmAEgBCAEKwNgIgY5A3AgBCAEKwOAATkDkAEgBCAEKwOIATkDeCADBEBBACECIABBpssDQQAQHgNA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AzggBEIANwMwIABBh9MEIARBMGoQHiAEQfT8CigCAEECazYCICAEQgA3AxAgBEIANwMYIABBptQEIARBEGoQHiAEIAM2AgAgAEHAzgMgBBAeIAMQGAUgASAFQQR0aiIGKwMAIQggBisDCCEJIAArA/gDIQogACsDgAQhCyAEQgA3A4ABIAQgCSALoDkDeCAEIAggCqA5A3AgAEGZ3wEgBEHwAGoQHiAFQQFqIQUMAQsLCwUgASAFQQR0aiIHKwMAIQggBysDCCEJIAArA/gDIQogACsDgAQhCyAEIAAoAhArA6ABOQPoAiAEQgA3A+ACIAQgCSALoDkD2AIgBCAIIAqgOQPQAiAAQZCmBCAEQdACahAeIAVBAWohBQwBCwsgBEGgA2okAAupBQICfwl8IwBB8AJrIgMkACAAQe2uBBAbGkH0/ApB8PwKKAIAQQZrNgIAIAArA4AEIQwgACsD+AMhDSAAKAIQIgQrA6ABIQUgACsD6AMhBiABKwMAIQcgASsDECEIIAArA/ADIQogASsDCCELIAErAxghCSADQbgCaiIBIARBEGpBKBAfGiABQwAAAAAQvAMhASADQgA3A+gCIANCgICAgICAgPg/NwOgAiADQgA3A+ACIAMgBSAGIAggB6GiIgUgCiAJIAuhoiIIoCIJo0QAAAAAAADgP6JEAAAAAAAAFECiOQOoAiADQeACaiIEQfylBCADQaACahB0IAMgCDkDkAIgAyAJRAAAAAAAANA/ojkDiAIgAyAFOQOAAiAEQavTBCADQYACahB0IAMgACgC6AKyuzkD8AEgA0IANwPoASADQoCAgICAgKCrwAA3A+ABIARBh9MEIANB4AFqEHQgA0H0/AooAgA2AtABIAMgBiAHIA2goiIGOQPAASADIAogCyAMoKIiBzkDyAEgBEGm1AQgA0HAAWoQdCADIAE2ArABIARBwM4DIANBsAFqEHQgACAEEP8FEBsaIAEQGCACBEAgA0GIAWoiASAAKAIQQThqQSgQHxogAUMAAAAAELwDIQEgA0IANwOAASADQgA3A3ggA0IANwNwIABBs90EIANB8ABqEB4gA0KAgICAgICA+D83A2AgAyAIOQNYIAMgBTkDUCAAQavTBCADQdAAahAeIANBQGsgACgC6AKyuzkDACADQgA3AzggA0IANwMwIABBh9MEIANBMGoQHiADQfT8CigCADYCICADIAY5AxAgAyAHOQMYIABBptQEIANBEGoQHiADIAE2AgAgAEHAzgMgAxAeIAEQGAsgA0HgAmoQXCADQfACaiQAC+gDAgN/BnwjAEHQAWsiAyQAIAIoAgAhBCACKAIEIgUrAxAhBiADIAUoAgA2ArABIAMgBjkDqAEgAyAENgKgASAAQY/+AyADQaABahAeQfT8CkHw/AooAgBBCWs2AgACfCABKwMAIgYgAi0AMCIEQewARg0AGiAEQfIARgRAIAYgAisDIKEMAQsgBiACKwMgRAAAAAAAAOC/oqALIQYgACsD8AMhByAAKwOABCEIIAErAwghCSAAKwPoAyEKIAArA/gDIQsgA0H4AGoiASAAKAIQQRBqQSgQHxogAUMAAAAAELwDIQEgA0IANwPIASADQgA3A8ABIAIoAgQoAgAhBCACKAIAIQUgA0IANwNwIANCgICAgICAgOg/NwNoIAMgBTYCZCADIAQ2AmAgA0HAAWoiBEGX3AMgA0HgAGoQdCADIAIoAgQrAxAgACsD6AOiOQNQIARB7KUEIANB0ABqEHQgA0FAayAAKALoArK7OQMAIANCADcDOCADQgA3AzAgBEGH0wQgA0EwahB0IANB9PwKKAIANgIgIAMgCiAGIAugojkDECADIAcgCSAIoKI5AxggBEGm1AQgA0EQahB0IAMgATYCACAEQcDOAyADEHQgACAEEP8FEBsaIAQQXCABEBggA0HQAWokAAscACAAQYmyBBAbGkHw/ApB8PwKKAIAQQVqNgIACxwAIABB97EEEBsaQfD8CkHw/AooAgBBBWs2AgALCwAgAEGitAQQGxoLLQEBfyMAQRBrIgEkACABIAAoAhAoAggQITYCACAAQZyBBCABEB4gAUEQaiQACwsAIABB84cEEBsaCxwAIABB3ocEEBsaQfD8CkHw/AooAgBBAms2AgALCwAgAEHYswQQGxoLCwAgAEHGswQQGxoLpgICB38BfiMAQTBrIgQkACAEQQxqQQBBJBA4GiAEIAE2AhwgACABEG4hAgNAIAIEQCAAIAIgARByIAAgAkEAEM4IIQIMAQsLIAEpAwghCkEAIQFBACEDAkAgACgCMCICBEAgCqchBSACKAIAIgYEQEEBIAIoAgh0IQMLIANBAWshBwNAIAEgA0YNAgJAAkAgBiABIAVq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b3BlbkF0dHJpYnV0ZUVudGl0aWVzID09IG9wZW5FbnRpdHkAaW5maW5pdHkAbGlzdC0+c2l6ZSA8IGxpc3QtPmNhcGFjaXR5AHJldC5zaXplIDwgcmV0LmNhcGFjaXR5AGZhbnRhc3kAL3N2Zy9pdm9yeQBvdXQgb2YgbWVtb3J5AEZlYnJ1YXJ5AEphbnVhcnkAZ3ZwbHVnaW5fZG90X2xheW91dF9MVFhfbGlicmFyeQBndnBsdWdpbl9uZWF0b19sYXlvdXRfTFRYX2xpYnJhcnkAZ3ZwbHVnaW5fY29yZV9MVFhfbGlicmFyeQBnYXRoZXJfdGltZV9lbnRyb3B5AGNvcHkAYWxiYW55AEp1bHkAU3BhcnNlTWF0cml4X211bHRpcGx5AGVxdWFsbHkAYXNzZW1ibHkAc3VtbWVyc2t5AHNoeQBzYXRpc2Z5AGJlYXV0aWZ5AG5vanVzdGlmeQBDbGFzc2lmeQAvc3ZnL2xpZ2h0Z3JleQAvc3ZnL2RpbWdyZXkAL3N2Zy9kYXJrZ3JleQAvc3ZnL2xpZ2h0c2xhdGVncmV5AC9zdmcvZGFya3NsYXRlZ3JleQAvc3ZnL3NsYXRlZ3JleQB3ZWJncmV5AHgxMWdyZXkAL3N2Zy9ncmV5AG1vdmUgdG8gZnJvbnQgbG9jayBpbmNvbnNpc3RlbmN5AGV4dHJhY3RfYWRqYWNlbmN5AG1lcmdlX29uZXdheQBhcnJheQBhbGxvY0FycmF5AC9zdmcvbGlnaHRncmF5AC9zdmcvZGltZ3JheQAvc3ZnL2RhcmtncmF5AC9zdmcvbGlnaHRzbGF0ZWdyYXkAL3N2Zy9kYXJrc2xhdGVncmF5AC9zdmcvc2xhdGVncmF5AHdlYmdyYXkAeDExZ3JheQAvc3ZnL2dyYXkAVGh1cnNkYXkAVHVlc2RheQBXZWRuZXNkYXkAU2F0dXJkYXkAU3VuZGF5AE1vbmRheQBGcmlkYXkATWF5AC4uLy4uL2xpYi9jZ3JhcGgvZ3JhbW1hci55ACVtLyVkLyV5AHBvcnRob3l4AHBvcnRob195eAB4eHgAcHgAYm94AHZpZXdCb3gAY2hrQm91bmRCb3gAL01lZGlhQm94AGdldF9lZGdlX2xhYmVsX21hdHJpeABpZGVhbF9kaXN0YW5jZV9tYXRyaXgAbXVzdCBub3QgdW5kZWNsYXJlIHByZWZpeAB1bmJvdW5kIHByZWZpeABodG1sbGV4AG1heAAjJTAyeCUwMnglMDJ4ACMlMnglMnglMnglMngAIyUxeCUxeCUxeAAtKyAgIDBYMHgALTBYKzBYIDBYLTB4KzB4IDB4AHJhcnJvdwBsYXJyb3cASGVsdmV0aWNhLU5hcnJvdwBhcnJvd19sZW5ndGhfY3JvdwAvc3ZnL3Nub3cAc3ByaW5nX2VsZWN0cmljYWxfZW1iZWRkaW5nX3Nsb3cAL3N2Zy9saWdodHllbGxvdwAvc3ZnL2dyZWVueWVsbG93AC9zdmcvbGlnaHRnb2xkZW5yb2R5ZWxsb3cAL3N2Zy95ZWxsb3cAZmF0YWwgZXJyb3IgLSBzY2FubmVyIGlucHV0IGJ1ZmZlciBvdmVyZmxvdwBmbGV4IHNjYW5uZXIgcHVzaC1iYWNrIG92ZXJmbG93AGNvdXJpZXJuZXcAU3ByaW5nU21vb3RoZXJfbmV3AFRyaWFuZ2xlU21vb3RoZXJfbmV3AGRpYWdfcHJlY29uX25ldwBRdWFkVHJlZV9uZXcAU3RyZXNzTWFqb3JpemF0aW9uU21vb3RoZXIyX25ldwBuICYmIG5ldwBza2V3AHN0cnZpZXcAL3N2Zy9ob25leWRldwAgLWFuY2hvciB3AHNvcnR2AHBvdjpwb3YATm92AGludgBlcXVpdgBwaXYAbm9uYW1lLmd2AEdEX3JhbmsoZylbcl0uYXYgPT0gR0RfcmFuayhnKVtyXS52AGNjJXNfJXp1AGNjJXMrJXp1AC9zdmcvcGVydQBudQBtdQAlYyVsbHUAVGh1AHRhdQBUYXUATnUATXUAX3BvcnRfJXNfKCVkKV8oJWQpXyV1AE51bWJlciBvZiBpdGVyYXRpb25zID0gJXUATnVtYmVyIG9mIGluY3JlYXNlcyA9ICV1AHBsYWludGV4dABzdHJlc3N3dABpbnB1dAB0ZXh0bGF5b3V0AGRvdF9sYXlvdXQAbmVhdG9fbGF5b3V0AGluaXRMYXlvdXQAY2x1c3QAbWFwQ2x1c3QAbGFiZWxqdXN0AHNjQWRqdXN0AEF1Z3VzdABlZGdlc2ZpcnN0AG5vZGVzZmlyc3QAbWF4aW1hbF9pbmRlcGVuZGVudF9lZGdlX3NldF9oZWF2ZXN0X2VkZ2VfcGVybm9kZV9zdXBlcm5vZGVzX2ZpcnN0AGV4aXN0AHJlYWxpZ25Ob2RlbGlzdABhcHBlbmROb2RlbGlzdABzbG90X2Zyb21fY29uc3RfbGlzdABzbG90X2Zyb21fbGlzdABkZWZhdWx0ZGlzdABtaW5kaXN0AHBvd2VyX2Rpc3QAZ3JhcGhfZGlzdABhdmdfZGlzdABnZXRFZGdlTGlzdABpcXVlc3QAbG93YXN0AHNwcmluZ19lbGVjdHJpY2FsX2VtYmVkZGluZ19mYXN0AGd2X3NvcnQAdmlld3BvcnQAdGFpbHBvcnQAdW5leHBlY3RlZCBwYXJzZXIgc3RhdGUgLSBwbGVhc2Ugc2VuZCBhIGJ1ZyByZXBvcnQAaGVhZHBvcnQAaHRtbF9wb3J0AGluc2VydABSVHJlZUluc2VydABmaW5kU1ZlcnQAc3RhcnQAcGFydABlc3RpbWF0ZV90ZXh0X3dpZHRoXzFwdABxdW90AH9yb290AG5vdABtYWtlX3ZuX3Nsb3QAZW1pdF94ZG90AHhkb3Q6eGRvdABlcHM6eGRvdABzdmc6eGRvdABqcGc6eGRvdABwbmc6eGRvdABqcGVnOnhkb3QAZ2lmOnhkb3QAanBlOnhkb3QAeGRvdDEuNDp4ZG90AHhkb3QxLjI6eGRvdABzZG90AG1pZGRvdABndjpkb3QAcGxhaW4tZXh0OmRvdABkb3Q6ZG90AGVwczpkb3QAY2Fub246ZG90AHBsYWluOmRvdABzdmc6ZG90AGpwZzpkb3QAcG5nOmRvdABqcGVnOmRvdABnaWY6ZG90AGpwZTpkb3QAf2JvdABkb0RvdABzcGFuLT5mb250AHZhZ3hicHJpbnQAZW5kcG9pbnQAeGRvdF9wb2ludABkZWNpZGVfcG9pbnQAVW5zYXRpc2ZpZWQgY29uc3RyYWludAB0cmFuc3BhcmVudABjb21wb25lbnQAaW52YWxpZCBhcmd1bWVudABjb21tZW50AGp1bmsgYWZ0ZXIgZG9jdW1lbnQgZWxlbWVudABjZW50AGkgPT0gZWNudABhcmlhbG10AGdldF9oYXNoX3NlY3JldF9zYWx0AGNpcmN1aXQAcG9seV9pbml0AE11bHRpbGV2ZWxfaW5pdABuc2xpbWl0AG1jbGltaXQAUG9ydHJhaXQAbGlnaHQAdmlydHVhbF93ZWlnaHQAbGhlaWdodABLUF9SaWdodABCb29rbWFuLUxpZ2h0AGd0AEtQX0xlZnQAY2hhcnNldABpbnNldABiaXRhcnJheV9yZXNldABndl9hcmVuYV9yZXNldABzdWJzZXQAYml0YXJyYXlfc2V0AG1hdHJpeF9zZXQAc2NhcmxldAAvc3ZnL2Rhcmt2aW9sZXQAL3N2Zy9ibHVldmlvbGV0AC9zdmcvdmlvbGV0AFRyZWJ1Y2hldABhZ3hnZXQAdGFpbHRhcmdldABsYWJlbHRhcmdldABlZGdldGFyZ2V0AGhlYWR0YXJnZXQAYml0YXJyYXlfZ2V0AHN0eWxlc2hlZXQAc3RyaWN0AGFnY29weWRpY3QAYWdtYWtlZGF0YWRpY3QAcmVjLT5kaWN0ID09IGRhdGFkaWN0AHdyaXRlX2RpY3QAaGludGVyc2VjdABndmJpc2VjdABlbmNvZGluZyBzcGVjaWZpZWQgaW4gWE1MIGRlY2xhcmF0aW9uIGlzIGluY29ycmVjdABhc3BlY3QAbGF5ZXJzZWxlY3QAS1BfU3VidHJhY3QAUXVhZFRyZWVfcmVwdWxzaXZlX2ZvcmNlX2ludGVyYWN0AGNvbXBhY3QAT2N0AHJlcXVlc3RlZCBmZWF0dXJlIHJlcXVpcmVzIFhNTF9EVEQgc3VwcG9ydCBpbiBFeHBhdABsYWJlbGZsb2F0AGxhYmVsX2Zsb2F0AFNwYXJzZU1hdHJpeF9mcm9tX2Nvb3JkaW5hdGVfZm9ybWF0AC9zdmcvd2hlYXQAbW9uY2hhaW5zX2F0AFNhdABBZ3JhcGhpbmZvX3QAQWdlZGdlaW5mb190AEFnbm9kZWluZm9fdABcdAByb3cgPCBtZS0+bnJvd3MAbWludXMAb3BsdXMAcmFkaXVzAGhlYXJ0cwBzYW1wbGVwb2ludHMAZGlyZWRnZWNvbnN0cmFpbnRzAGxldmVsIGFzc2lnbm1lbnQgY29uc3RyYWludHMAeHkgcHNldWRvLW9ydGhvZ29uYWwgY29uc3RyYWludHMAeXggcHNldWRvLW9ydGhvZ29uYWwgY29uc3RyYWludHMAeHkgb3J0aG9nb25hbCBjb25zdHJhaW50cwB5eCBvcnRob2dvbmFsIGNvbnN0cmFpbnRzAGxpbmUgc2VnbWVudHMAc2V0X2NlbGxfaGVpZ2h0cwByZWN0cwBhY2NvdW50aW5nUmVwb3J0U3RhdHMAZW50aXR5VHJhY2tpbmdSZXBvcnRTdGF0cwBaYXBmRGluZ2JhdHMAcmVtaW5jcm9zcwBjb21wcmVzcwBndnVzZXJzaGFwZV9maWxlX2FjY2VzcwBicmFzcwBjbGFzcwBhcHBseWF0dHJzAGFnbWFrZWF0dHJzAGJpbmRhdHRycwBwYXJzZV9sYXllcnMAbWtDbHVzdGVycwByb3VuZF9jb3JuZXJzAG1ha2VfYmFycmllcnMAY2RhdGEubnRvcGxldmVsID09IGFnbm5vZGVzKGcpIC0gY2RhdGEubnZhcnMAY2Fubm90IHJlYWxsb2Mgb3BzAGNhbm5vdCByZWFsbG9jIHBubHBzAGVwcwBjb3JlX2xvYWRpbWFnZV9wcwBlcHM6cHMAcHMyOnBzAChsaWIpOnBzAGd2X3RyaW1femVyb3MAYWd4YnVmX3RyaW1femVyb3MAdGV4Z3lyZWhlcm9zAGltYWdlcG9zAHRpbm9zAHNldEVkZ2VMYWJlbFBvcwBTZXR0aW5nIGluaXRpYWwgcG9zaXRpb25zAHhsaW50ZXJzZWN0aW9ucwBjb2x1bW5zAGRlamF2dXNhbnMAbmltYnVzc2FucwBsaWJlcmF0aW9uc2FucwBmcmVlc2FucwBzZXRDaGlsZFN1YnRyZWVTcGFucwBPcGVuU2FucwBvZmZzZXQgPT0gbl90ZXJtcwBkaXRlbXMAZGlhbXMAY29sIDwgbWUtPm5jb2xzAGNhbm5vdCByZWFsbG9jIGRxLnBubHMAY2Fubm90IHJlYWxsb2MgcG5scwBsZXZlbHMAZm9yY2VsYWJlbHMAZGlhZ29uYWxzAG1lcmdlX3JhbmtzAHNwbGl0QmxvY2tzAGludmlzAGNhbm5vdCByZWFsbG9jIHRyaXMAc2V0X2NlbGxfd2lkdGhzAENhbGN1bGF0aW5nIHNob3J0ZXN0IHBhdGhzAHllcwBzaG93Ym94ZXMAYmVhdXRpZnlfbGVhdmVzAGF0dGFjaF9lZGdlX2xhYmVsX2Nvb3JkaW5hdGVzAHBvbHlsaW5lcwBzcGxpbmVzAG9ydGhvZ29uYWwgbGluZXMAdGV4Z3lyZXRlcm1lcwBvdGltZXMAVGltZXMAZm9udG5hbWVzAHByZWZpeCBtdXN0IG5vdCBiZSBib3VuZCB0byBvbmUgb2YgdGhlIHJlc2VydmVkIG5hbWVzcGFjZSBuYW1lcwBTcGFyc2VNYXRyaXhfc3VtX3JlcGVhdF9lbnRyaWVzAHBlcmlwaGVyaWVzAEdldEJyYW5jaGVzAGYgPCBncmFwaFtqXS5uZWRnZXMAbWlubWF4X2VkZ2VzAGV4Y2hhbmdlX3RyZWVfZWRnZXMAbWFrZVN0cmFpZ2h0RWRnZXMAdW5kb0NsdXN0ZXJFZGdlcwBjb21wb3VuZEVkZ2VzAG1lcmdlX3RyZWVzAF9fY2x1c3Rlcm5vZGVzAGFnbm5vZGVzAE5EX2lkKG5wKSA9PSBuX25vZGVzAExvYWROb2RlcwBzaWRlcwBzcGFkZXMAdmVydGljZXMAY29vcmRzAHNldGJvdW5kcwBtZHMAY2RzAG1ha2VTZWxmQXJjcwBlbWl0X2VkZ2VfZ3JhcGhpY3MAY2x1YnMAY29uc29sYXMAJWxmJTJzAApTdHJpbmcgc3RhcnRpbmc6PCUuODBzAApTdHJpbmcgc3RhcnRpbmc6IiUuODBzACAlLipzACVzJXMAZXhwYXQ6IEFjY291bnRpbmcoJXApOiBEaXJlY3QgJTEwbGx1LCBpbmRpcmVjdCAlMTBsbHUsIGFtcGxpZmljYXRpb24gJTguMmYlcwAlLipzJWMlcwAgJXM6JXMAX18lZDolcwAvJXMvJXMAJXMtJXMALCVzACBmb250LWZhbWlseT0iJXMAIiBzdHJva2UtZGFzaGFycmF5PSIlcwAiIGNsYXNzPSIlcwBwb2x5ICVzACgoJWYsJWYpLCglZiwlZikpICVzICVzAGNvbG9yICVzAHJvb3QgPSAlcwAgVGl0bGU6ICVzACJzdHJpY3QiOiAlcwBjb3VyAHV0cgBhcHBlbmRhdHRyAGFkZGF0dHIAYmVnaW5zdHIAZnN0cgBzdHJ2aWV3X3N0cgBwb3ZfY29sb3JfYXNfc3RyAHZwc2MhPW51bGxwdHIAYmVuZFRvU3RyAHVhcnIAY3JhcnIAbGFycgBoYXJyAGRhcnIAdUFycgByQXJyAGxBcnIAaEFycgBkQXJyAEFwcgBTcGFyc2VNYXRyaXhfbXVsdGlwbHlfdmVjdG9yAHRlcm1pbmF0b3IAaW5zdWxhdG9yAGludGVybmFsRW50aXR5UHJvY2Vzc29yAHRleGd5cmVjdXJzb3IAc3ludGF4IGVycm9yAG1vbmV5X2dldCBlcnJvcgBFcnJvcgByZmxvb3IAbGZsb29yAGxhYmVsZm9udGNvbG9yAHBlbmNvbG9yAGZpbGxjb2xvcgBiZ2NvbG9yAHJvdyBtYWpvcgBjb2x1bW4gbWFqb3IAbmVpZ2hib3IAc3R5bGVfb3IAbXIAcmFua2RpcgBwYWdlZGlyAGxheWVyAHVwcGVyID49IGxvd2VyAE5vZGVDb3ZlcgAvc3ZnL3NpbHZlcgBjbHVzdGVyAGV4cGFuZENsdXN0ZXIAcnByb21vdGVyAGxwcm9tb3RlcgBjZW50ZXIAbWF4aXRlcgBwYXJ0aWFsIGNoYXJhY3RlcgAhIHJvb3RQYXJzZXItPm1fcGFyZW50UGFyc2VyAGRrZ3JlZW5jb3BwZXIAY29vbGNvcHBlcgBndl9zb3J0X2NvbXBhcl93cmFwcGVyAHRhcGVyAG92ZXJsYXBfYmV6aWVyAGZpZ19iZXppZXIAY291cmllcgBDb3VyaWVyAGhpZXIAZGFnZ2VyAERhZ2dlcgBvdXRwdXRvcmRlcgBwb3N0b3JkZXIAZmxhdF9yZW9yZGVyAGNlbGxib3JkZXIAZml4TGFiZWxPcmRlcgBjeWxpbmRlcgAvc3ZnL2xhdmVuZGVyAHJlbmRlcgBmb2xkZXIAY2x1c3Rlcl9sZWFkZXIATkRfVUZfc2l6ZShuKSA8PSAxIHx8IG4gPT0gbGVhZGVyAE9jdG9iZXIAcmVmZXJlbmNlIHRvIGludmFsaWQgY2hhcmFjdGVyIG51bWJlcgBOb3ZlbWJlcgBTZXB0ZW1iZXIARGVjZW1iZXIAbWFjcgBicgBzdGFyAGZlbGRzcGFyAHJlZ3VsYXIAaW9zX2Jhc2U6OmNsZWFyAGJydmJhcgBNYXIAXHIATkRfcmFuayh2KSA9PSByAHN0cmVxAHN0cnZpZXdfZXEAc3Rydmlld19zdHJfZXEAc3Rydmlld19jYXNlX3N0cl9lcQBzdHJ2aWV3X2Nhc2VfZXEAdnAAJSVCZWdpblByb2xvZwovRG90RGljdCAyMDAgZGljdCBkZWYKRG90RGljdCBiZWdpbgoKL3NldHVwTGF0aW4xIHsKbWFyawovRW5jb2RpbmdWZWN0b3IgMjU2IGFycmF5IGRlZgogRW5jb2RpbmdWZWN0b3IgMAoKSVNPTGF0aW4xRW5jb2RpbmcgMCAyNTUgZ2V0aW50ZXJ2YWwgcHV0aW50ZXJ2YWwKRW5jb2RpbmdWZWN0b3IgNDUgL2h5cGhlbiBwdXQKCiUgU2V0IHVwIElTTyBMYXRpbiAxIGNoYXJhY3RlciBlbmNvZGluZwovc3Rhcm5ldElTTyB7CiAgICAgICAgZHVwIGR1cCBmaW5kZm9udCBkdXAgbGVuZ3RoIGRpY3QgYmVnaW4KICAgICAgICB7IDEgaW5kZXggL0ZJRCBuZSB7IGRlZiB9eyBwb3AgcG9wIH0gaWZlbHNlCiAgICAgICAgfSBmb3JhbGwKICAgICAgICAvRW5jb2RpbmcgRW5jb2RpbmdWZWN0b3IgZGVmCiAgICAgICAgY3VycmVudGRpY3QgZW5kIGRlZmluZWZvbnQKfSBkZWYKL1RpbWVzLVJvbWFuIHN0YXJuZXRJU08gZGVmCi9UaW1lcy1JdGFsaWMgc3Rhcm5ldElTTyBkZWYKL1RpbWVzLUJvbGQgc3Rhcm5ldElTTyBkZWYKL1RpbWVzLUJvbGRJdGFsaWMgc3Rhcm5ldElTTyBkZWYKL0hlbHZldGljYSBzdGFybmV0SVNPIGRlZgovSGVsdmV0aWNhLU9ibGlxdWUgc3Rhcm5ldElTTyBkZWYKL0hlbHZldGljYS1Cb2xkIHN0YXJuZXRJU08gZGVmCi9IZWx2ZXRpY2EtQm9sZE9ibGlxdWUgc3Rhcm5ldElTTyBkZWYKL0NvdXJpZXIgc3Rhcm5ldElTTyBkZWYKL0NvdXJpZXItT2JsaXF1ZSBzdGFybmV0SVNPIGRlZgovQ291cmllci1Cb2xkIHN0YXJuZXRJU08gZGVmCi9Db3VyaWVyLUJvbGRPYmxpcXVlIHN0YXJuZXRJU08gZGVmCmNsZWFydG9tYXJrCn0gYmluZCBkZWYKCiUlQmVnaW5SZXNvdXJjZTogcHJvY3NldCBncmFwaHZpeiAwIDAKL2Nvb3JkLWZvbnQtZmFtaWx5IC9UaW1lcy1Sb21hbiBkZWYKL2RlZmF1bHQtZm9udC1mYW1pbHkgL1RpbWVzLVJvbWFuIGRlZgovY29vcmRmb250IGNvb3JkLWZvbnQtZmFtaWx5IGZpbmRmb250IDggc2NhbGVmb250IGRlZgoKL0ludlNjYWxlRmFjdG9yIDEuMCBkZWYKL3NldF9zY2FsZSB7CiAgICAgICBkdXAgMSBleGNoIGRpdiAvSW52U2NhbGVGYWN0b3IgZXhjaCBkZWYKICAgICAgIHNjYWxlCn0gYmluZCBkZWYKCiUgc3R5bGVzCi9zb2xpZCB7IFtdIDAgc2V0ZGFzaCB9IGJpbmQgZGVmCi9kYXNoZWQgeyBbOSBJbnZTY2FsZUZhY3RvciBtdWwgZHVwIF0gMCBzZXRkYXNoIH0gYmluZCBkZWYKL2RvdHRlZCB7IFsxIEludlNjYWxlRmFjdG9yIG11bCA2IEludlNjYWxlRmFjdG9yIG11bF0gMCBzZXRkYXNoIH0gYmluZCBkZWYKL2ludmlzIHsvZmlsbCB7bmV3cGF0aH0gZGVmIC9zdHJva2Uge25ld3BhdGh9IGRlZiAvc2hvdyB7cG9wIG5ld3BhdGh9IGRlZn0gYmluZCBkZWYKL2JvbGQgeyAyIHNldGxpbmV3aWR0aCB9IGJpbmQgZGVmCi9maWxsZWQgeyB9IGJpbmQgZGVmCi91bmZpbGxlZCB7IH0gYmluZCBkZWYKL3JvdW5kZWQgeyB9IGJpbmQgZGVmCi9kaWFnb25hbHMgeyB9IGJpbmQgZGVmCi90YXBlcmVkIHsgfSBiaW5kIGRlZgoKJSBob29rcyBmb3Igc2V0dGluZyBjb2xvciAKL25vZGVjb2xvciB7IHNldGhzYmNvbG9yIH0gYmluZCBkZWYKL2VkZ2Vjb2xvciB7IHNldGhzYmNvbG9yIH0gYmluZCBkZWYKL2dyYXBoY29sb3IgeyBzZXRoc2Jjb2xvciB9IGJpbmQgZGVmCi9ub3Bjb2xvciB7cG9wIHBvcCBwb3B9IGJpbmQgZGVmCgovYmVnaW5wYWdlIHsJJSBpIGogbnBhZ2VzCgkvbnBhZ2VzIGV4Y2ggZGVmCgkvaiBleGNoIGRlZgoJL2kgZXhjaCBkZWYKCS9zdHIgMTAgc3RyaW5nIGRlZgoJbnBhZ2VzIDEgZ3QgewoJCWdzYXZlCgkJCWNvb3JkZm9udCBzZXRmb250CgkJCTAgMCBtb3ZldG8KCQkJKFwoKSBzaG93IGkgc3RyIGN2cyBzaG93ICgsKSBzaG93IGogc3RyIGN2cyBzaG93IChcKSkgc2hvdwoJCWdyZXN0b3JlCgl9IGlmCn0gYmluZCBkZWYKCi9zZXRfZm9udCB7CglmaW5kZm9udCBleGNoCglzY2FsZWZvbnQgc2V0Zm9udAp9IGRlZgoKJSBkcmF3IHRleHQgZml0dGVkIHRvIGl0cyBleHBlY3RlZCB3aWR0aAovYWxpZ25lZHRleHQgewkJCSUgd2lkdGggdGV4dAoJL3RleHQgZXhjaCBkZWYKCS93aWR0aCBleGNoIGRlZgoJZ3NhdmUKCQl3aWR0aCAwIGd0IHsKCQkJW10gMCBzZXRkYXNoCgkJCXRleHQgc3RyaW5nd2lkdGggcG9wIHdpZHRoIGV4Y2ggc3ViIHRleHQgbGVuZ3RoIGRpdiAwIHRleHQgYXNob3cKCQl9IGlmCglncmVzdG9yZQp9IGRlZgoKL2JveHByaW0gewkJCQklIHhjb3JuZXIgeWNvcm5lciB4c2l6ZSB5c2l6ZQoJCTQgMiByb2xsCgkJbW92ZXRvCgkJMiBjb3B5CgkJZXhjaCAwIHJsaW5ldG8KCQkwIGV4Y2ggcmxpbmV0bwoJCXBvcCBuZWcgMCBybGluZXRvCgkJY2xvc2VwYXRoCn0gYmluZCBkZWYKCi9lbGxpcHNlX3BhdGggewoJL3J5IGV4Y2ggZGVmCgkvcnggZXhjaCBkZWYKCS95IGV4Y2ggZGVmCgkveCBleGNoIGRlZgoJbWF0cml4IGN1cnJlbnRtYXRyaXgKCW5ld3BhdGgKCXggeSB0cmFuc2xhdGUKCXJ4IHJ5IHNjYWxlCgkwIDAgMSAwIDM2MCBhcmMKCXNldG1hdHJpeAp9IGJpbmQgZGVmCgovZW5kcGFnZSB7IHNob3dwYWdlIH0gYmluZCBkZWYKL3Nob3dwYWdlIHsgfSBkZWYKCi9sYXllcmNvbG9yc2VxCglbCSUgbGF5ZXIgY29sb3Igc2VxdWVuY2UgLSBkYXJrZXN0IHRvIGxpZ2h0ZXN0CgkJWzAgMCAwXQoJCVsuMiAuOCAuOF0KCQlbLjQgLjggLjhdCgkJWy42IC44IC44XQoJCVsuOCAuOCAuOF0KCV0KZGVmCgovbGF5ZXJsZW4gbGF5ZXJjb2xvcnNlcSBsZW5ndGggZGVmCgovc2V0bGF5ZXIgey9tYXhsYXllciBleGNoIGRlZiAvY3VybGF5ZXIgZXhjaCBkZWYKCWxheWVyY29sb3JzZXEgY3VybGF5ZXIgMSBzdWIgbGF5ZXJsZW4gbW9kIGdldAoJYWxvYWQgcG9wIHNldGhzYmNvbG9yCgkvbm9kZWNvbG9yIHtub3Bjb2xvcn0gZGVmCgkvZWRnZWNvbG9yIHtub3Bjb2xvcn0gZGVmCgkvZ3JhcGhjb2xvciB7bm9wY29sb3J9IGRlZgp9IGJpbmQgZGVmCgovb25sYXllciB7IGN1cmxheWVyIG5lIHtpbnZpc30gaWYgfSBkZWYKCi9vbmxheWVycyB7CgkvbXl1cHBlciBleGNoIGRlZgoJL215bG93ZXIgZXhjaCBkZWYKCWN1cmxheWVyIG15bG93ZXIgbHQKCWN1cmxheWVyIG15dXBwZXIgZ3QKCW9yCgl7aW52aXN9IGlmCn0gZGVmCgovY3VybGF5ZXIgMCBkZWYKCiUlRW5kUmVzb3VyY2UKJSVFbmRQcm9sb2cKJSVCZWdpblNldHVwCjE0IGRlZmF1bHQtZm9udC1mYW1pbHkgc2V0X2ZvbnQKJSAvYXJyb3dsZW5ndGggMTAgZGVmCiUgL2Fycm93d2lkdGggNSBkZWYKCiUgbWFrZSBzdXJlIHBkZm1hcmsgaXMgaGFybWxlc3MgZm9yIFBTLWludGVycHJldGVycyBvdGhlciB0aGFuIERpc3RpbGxlcgovcGRmbWFyayB3aGVyZSB7cG9wfSB7dXNlcmRpY3QgL3BkZm1hcmsgL2NsZWFydG9tYXJrIGxvYWQgcHV0fSBpZmVsc2UKJSBtYWtlICc8PCcgYW5kICc+Picgc2FmZSBvbiBQUyBMZXZlbCAxIGRldmljZXMKL2xhbmd1YWdlbGV2ZWwgd2hlcmUge3BvcCBsYW5ndWFnZWxldmVsfXsxfSBpZmVsc2UKMiBsdCB7CiAgICB1c2VyZGljdCAoPDwpIGN2biAoWykgY3ZuIGxvYWQgcHV0CiAgICB1c2VyZGljdCAoPj4pIGN2biAoWykgY3ZuIGxvYWQgcHV0Cn0gaWYKCiUlRW5kU2V0dXAAc3VwAGdyb3VwAGN1cAB0aGluc3AAZW5zcABlbXNwAG5ic3AAcGVycAB3ZWllcnAAZ2VuZXJhdGUtY29uc3RyYWludHMuY3BwAGJsb2NrLmNwcABjc29sdmVfVlBTQy5jcHAAf3RvcABwcm9wAGFneGJwb3AAbm9wAGFzeW1wAGNvbXAAZmluZENDb21wAGJtcABzY2FsZV9jbGFtcAB4bHAAbHAgIT0gY2xwAHRhaWxfbHAAaGVhZF9scAB0YWlsdG9vbHRpcABsYWJlbHRvb2x0aXAAZWRnZXRvb2x0aXAAaGVhZHRvb2x0aXAAaGVsbGlwAHRhaWxjbGlwAGhlYWRjbGlwAC9zdmcvcGFwYXlhd2hpcABocAB0cmFuc3Bvc2Vfc3RlcABjb21wdXRlU3RlcABsYXllcmxpc3RzZXAAbGF5ZXJzZXAAaXBzZXAAcmFua3NlcABub2Rlc2VwAHN1YmdyYXBocyBuZXN0ZWQgbW9yZSB0aGFuICVkIGRlZXAAU2VwAHNmZHAAY3AAd2VicABpZG1hcABjbHVzdGVyX21hcABjbWFweDptYXAAZXBzOm1hcABjbWFweF9ucDptYXAAaW1hcF9ucDptYXAAaXNtYXA6bWFwAGltYXA6bWFwAGNtYXA6bWFwAHN2ZzptYXAAanBnOm1hcABwbmc6bWFwAGpwZWc6bWFwAGdpZjptYXAAanBlOm1hcABvdmVybGFwAGxldmVsc2dhcABjYXAAS1BfVXAAJUk6JU06JVMgJXAAc3RhcnQgPD0gcAByc3F1bwBsc3F1bwByZHF1bwBsZHF1bwBiZHF1bwBzYnF1bwByc2FxdW8AbHNhcXVvAHJhcXVvAGxhcXVvAGF1dG8ATnVuaXRvAC9zdmcvdG9tYXRvAG5lYXRvAGV1cm8AL3N2Zy9nYWluc2Jvcm8ATWV0aG9kWmVybwBtaWNybwBuaW1idXNtb25vAGxpYmVyYXRpb25tb25vAGZyZWVtb25vAGFyaW1vAHJhdGlvAHBvcnRobwByaG8AUmhvAC9zdmcvaW5kaWdvAHBpbmZvAGNjZ3JhcGhpbmZvAGNjZ25vZGVpbmZvAGNsX2VkZ2VfaW5mbwBnZXRQYWNrSW5mbwBtYWtlSW5mbwBwYXJzZVBhY2tNb2RlSW5mbwBjaXJjbwBpY28AXCUwM28AL3N2Zy9yb3N5YnJvd24AL3N2Zy9zYW5keWJyb3duAHZlcnlkYXJrYnJvd24AL3N2Zy9zYWRkbGVicm93bgAvc3ZnL2Jyb3duAEtQX0Rvd24AY2Fubm90IGNoYW5nZSBzZXR0aW5nIG9uY2UgcGFyc2luZyBoYXMgYmVndW4AU3VuAEp1bgB0aG9ybgAvc3ZnL2NyaW1zb24AeGRvdF9qc29uAHhkb3RfanNvbjpqc29uAGpzb24wOmpzb24Ab21pY3JvbgBPbWljcm9uAHNjYXJvbgBTY2Fyb24Ad2VibWFyb29uAHgxMW1hcm9vbgAvc3ZnL21hcm9vbgAvc3ZnL2xpZ2h0c2FsbW9uAC9zdmcvZGFya3NhbG1vbgAvc3ZnL3NhbG1vbgB1cHNpbG9uAGVwc2lsb24AVXBzaWxvbgBFcHNpbG9uAHJlc29sdXRpb24AZGlzdG9ydGlvbgBzdGQ6OmV4Y2VwdGlvbgBwYXJ0aXRpb24AZG90X3Bvc2l0aW9uAFNldHRpbmcgdXAgc3RyZXNzIGZ1bmN0aW9uAHVuY2xvc2VkIENEQVRBIHNlY3Rpb24AcG9zdGFjdGlvbgByb3RhdGlvbgBvcmllbnRhdGlvbgBhYm9taW5hdGlvbgBhY2NvdW50aW5nR2V0Q3VycmVudEFtcGxpZmljYXRpb24AeGRvdHZlcnNpb24AU1RzZXRVbmlvbgA8cG9seWdvbgBoZXhhZ29uAHNlcHRhZ29uAHBlbnRhZ29uAHRyaXBsZW9jdGFnb24AZG91Ymxlb2N0YWdvbgAvc3ZnL2xlbW9uY2hpZmZvbgBNb24AcGx1c21uAG5vdGluAGlzaW4AL3N2Zy9tb2NjYXNpbgBwaW4AbWluAHZvcm9fbWFyZ2luAGluZmluAG9uZWRfb3B0aW1pemVyX3RyYWluAHBsYWluAG1ha2VfY2hhaW4AbWVyZ2VfY2hhaW4AZGVsZXRlTWluAGZpbmRNaW4AdmFsaWduAGJhbGlnbgB5ZW4ATXVsdGlsZXZlbF9jb2Fyc2VuAGN1cnJlbgBQb2Jzb3BlbgBndl9mb3BlbgBndnVzZXJzaGFwZV9vcGVuAGVudGl0eVRyYWNraW5nT25PcGVuAC9zdmcvbGluZW4AZGltZW4AbWlubGVuAHN0eWxlX3Rva2VuAHVuY2xvc2VkIHRva2VuAC9zdmcveWVsbG93Z3JlZW4AbWVkaXVtZm9yZXN0Z3JlZW4AL3N2Zy9mb3Jlc3RncmVlbgAvc3ZnL2xpZ2h0Z3JlZW4AaHVudGVyc2dyZWVuAC9zdmcvbGF3bmdyZWVuAC9zdmcvZGFya2dyZWVuAC9zdmcvbWVkaXVtc3ByaW5nZ3JlZW4AL3N2Zy9zcHJpbmdncmVlbgAvc3ZnL2RhcmtvbGl2ZWdyZWVuAC9zdmcvbGltZWdyZWVuAC9zdmcvcGFsZWdyZWVuAHdlYmdyZWVuAC9zdmcvbGlnaHRzZWFncmVlbgAvc3ZnL21lZGl1bXNlYWdyZWVuAC9zdmcvZGFya3NlYWdyZWVuAC9zdmcvc2VhZ3JlZW4AeDExZ3JlZW4AL3N2Zy9ncmVlbgBHcmVlbgAvc3ZnL2xpZ2h0Y3lhbgAvc3ZnL2RhcmtjeWFuAC9zdmcvY3lhbgBuZXd0YW4AZGFya3RhbgAvc3ZnL3RhbgByb3dzcGFuAGNvbHNwYW4AbmFuAHRpbWVzbmV3cm9tYW4AbmltYnVzcm9tYW4AdGltZXNyb21hbgBUaW1lcy1Sb21hbgBQYWxhdGluby1Sb21hbgBOZXdDZW50dXJ5U2NobGJrLVJvbWFuAEphbgBHRF9yYW5rKGcpW3JdLm4gPD0gR0RfcmFuayhnKVtyXS5hbgBhZ3hicHV0X24AXG4Abl9ub2RlcyA9PSBncmFwaC0+bgBBLT5tID09IEEtPm4Aam9iLT5vYmotPnUubgBuemMgPT0gKHNpemVfdCluAHMsJWxmLCVsZiVuACBlLCVsZiwlbGYlbgAlZCAlMVsiXSVuAHYgPT0gbgBiID09IG4AbmNsdXN0ZXIgPD0gbgBwc3ltAGFsZWZzeW0AdGhldGFzeW0AcXVhbnR1bQBzdW0AL3N2Zy9wbHVtAGludnRyYXBleml1bQBtZWRpdW0AOTpwcmlzbQBscm0AY3VzdG9tAGFwdHItPnRhZyA9PSBUX2F0b20AL2Rldi91cmFuZG9tAGd2X3JhbmRvbQBtbQBybG0Ac2ltAElNRFNfZ2l2ZW5fZGltAG9yZG0AY20AcGFyYWxsZWxvZ3JhbQAvc3ZnL21pbnRjcmVhbQBKdWwAdGwAZnJhc2wAU3ltYm9sAGZpbmRDb2wAPD94bWwAeXVtbAB1dW1sAG91bWwAaXVtbABldW1sAGF1bWwAWXVtbABVdW1sAE91bWwASXVtbABFdW1sAEF1bWwAY29yZV9sb2FkaW1hZ2VfdnJtbABqcGc6dnJtbABwbmc6dnJtbABqcGVnOnZybWwAZ2lmOnZybWwAanBlOnZybWwAYnVsbABmaWxsAC9zdmcvc2Vhc2hlbGwAZm9yYWxsAEFwcmlsAHBlcm1pbAByY2VpbABsY2VpbABjY2VkaWwAQ2NlZGlsAGFycm93dGFpbABsdGFpbABzYW1ldGFpbABsZXZlbCA+PSAwICYmIGxldmVsIDw9IG4tPmxldmVsAHN0cmVzc19tYWpvcml6YXRpb25fa0RfbWtlcm5lbABpc19wYXJhbGxlbABDYWxjdWxhdGluZyBjaXJjdWl0IG1vZGVsAENhbGN1bGF0aW5nIHN1YnNldCBtb2RlbABDYWxjdWxhdGluZyBNRFMgbW9kZWwAeGxhYmVsAHRhaWxsYWJlbABoZWFkbGFiZWwAZ3JhcGggbGFiZWwAaWV4Y2wAb2JqcC0+bGJsAG92YWwAbWVyZ2V2aXJ0dWFsAC9zdmcvbGlnaHRjb3JhbAAvc3ZnL2NvcmFsAFNwYXJzZU1hdHJpeF9mcm9tX2Nvb3JkaW5hdGVfYXJyYXlzX2ludGVybmFsAE11bHRpbGV2ZWxfY29hcnNlbl9pbnRlcm5hbABRdWFkVHJlZV9hZGRfaW50ZXJuYWwAYXJyb3dfbGVuZ3RoX25vcm1hbABhcmlhbAByYWRpYWwAL3N2Zy90ZWFsAHJlYWwAbG9jYWwAZXN0aW1hdGVfY2hhcmFjdGVyX3dpZHRoX2Nhbm9uaWNhbABnbG9iYWwAcS0+bAAuLi8uLi9saWIvY2dyYXBoL3NjYW4ubAB0azp0awBnaWY6dGsAcGF0Y2h3b3JrAHRvawBib29rAEF2YW50R2FyZGUtQm9vawBzaW5rAG92ZXJsYXBfc2hyaW5rAHNwaWN5cGluawAvc3ZnL2hvdHBpbmsAL3N2Zy9saWdodHBpbmsAL3N2Zy9kZWVwcGluawBuZW9ucGluawAvc3ZnL3BpbmsAbmV3cmFuawBjbHVzdGVycmFuawBfbmV3X3JhbmsAaW5zdGFsbF9pbl9yYW5rAHJlbW92ZV9mcm9tX3JhbmsAL3N2Zy9jb3Juc2lsawBvbmVibG9jawB2LT5sZWZ0LT5ibG9jayA9PSB2LT5yaWdodC0+YmxvY2sAL3N2Zy9maXJlYnJpY2sAUFFjaGVjawBwYWNrAC9zdmcvYmxhY2sAQmxhY2sAYmFjawB6d2oAenduagBqb2ItPm9iagBnZXRpbnRyc3hpAHBzaQBQc2kAQ2FsaWJyaQBGcmkAdHdvcGkAZHBpAHZvcm9ub2kAVm9yb25vaQBjaGFuaQBkZW1pAEJvb2ttYW4tRGVtaQBBdmFudEdhcmRlLURlbWkAL3N2Zy9kYXJra2hha2kAL3N2Zy9raGFraQBwaGkAY2hpAFBoaQBDaGkAZGkAWGkAUGkATkRfaWQobnApID09IGkATl9JRFgocHEtPnBxW2ldKSA9PSBpAFN0cmVzc01ham9yaXphdGlvblNtb290aGVyX3Ntb290aABTcHJpbmdTbW9vdGhlcl9zbW9vdGgAYm90aABzdGFydHN3aXRoAGxpbmVsZW5ndGgAYmFkX2FycmF5X25ld19sZW5ndGgAYXZlcmFnZV9lZGdlX2xlbmd0aABldGgAcGVud2lkdGgAbHdpZHRoAHNldGxpbmV3aWR0aABzaG9ydHBhdGgAZm9udHBhdGgAUG9ic3BhdGgAYmVnaW5wYXRoAGltYWdlcGF0aABlbmRwYXRoAHN0cmFpZ2h0X3BhdGgAbWFwX3BhdGgAPHBhdGgAY2Fubm90IGZpbmQgdHJpYW5nbGUgcGF0aAAvc3ZnL2xhdmVuZGVyYmx1c2gAZmxlc2gAb3NsYXNoAE9zbGFzaABkdHN0cmhhc2gAc3RyZGljdF9oYXNoAG5kYXNoAG1kYXNoAGRpZ3JhcGgAc3ViZ3JhcGgAY29uc3RydWN0X2dyYXBoAGNoa1NncmFwaABjbG9zZXN0X3BhaXJzMmdyYXBoAGFnZGVsZXRlIG9uIHdyb25nIGdyYXBoAGNvbm5lY3RHcmFwaAB1cHNpaAAlc2xpbmUtdGhyb3VnaABjaGFuU2VhcmNoAFJUcmVlU2VhcmNoAE1hcmNoAERpc2NvbkJyYW5jaABQaWNrQnJhbmNoAEFkZEJyYW5jaAAuLi8uLi9saWIvdXRpbC9iaXRhcnJheS5oAC4uLy4uL2xpYi91dGlsL3N0cnZpZXcuaAAuLi8uLi9saWIvdXRpbC9zb3J0LmgALi4vLi4vbGliL2NncmFwaC9ub2RlX3NldC5oAC4uLy4uL2xpYi91dGlsL3N0cmVxLmgALi4vLi4vbGliL3V0aWwvc3RhcnRzd2l0aC5oAC4uLy4uL2xpYi91dGlsL2d2X21hdGguaAAuLi8uLi9saWIvdXRpbC9hZ3hidWYuaAAuLi8uLi9saWIvdXRpbC90b2tlbml6ZS5oAC4uLy4uL2xpYi91dGlsL2FsbG9jLmgAYXV4ZwBjb3JlX2xvYWRpbWFnZV9zdmcAc3ZnOnN2ZwBqcGc6c3ZnAHBuZzpzdmcAanBlZzpzdmcAZ2lmOnN2ZwBqcGU6c3ZnAHN2Z19pbmxpbmU6c3ZnAEF1ZwBkb1Byb2xvZwBwb3dlcl9pdGVyYXRpb25fb3J0aG9nAHBuZwBpZGVhbF9kaXN0X3NjaGVtZSB2YWx1ZSB3cm9uZwB4ZG90IHZlcnNpb24gIiVzIiB0b28gbG9uZwBjb25nAGxibGVuY2xvc2luZwBiYXNpY19zdHJpbmcAZmFpbHVyZSBtYWxsb2MnaW5nIGZvciByZXN1bHQgc3RyaW5nAHNwcmluZwBvcmRlcmluZwBnZW5lcmF0ZVJhbmRvbU9yZGVyaW5nAGFyaW5nAEFyaW5nAERhbXBpbmcAV2FybmluZwBvdmVybGFwX3NjYWxpbmcAeCBhbmQgeSBzY2FsaW5nAG9sZCBzY2FsaW5nAHNtb290aGluZwB1bmtub3duIGVuY29kaW5nAG11bHRpbGV2ZWxfc3ByaW5nX2VsZWN0cmljYWxfZW1iZWRkaW5nAHNwcmluZ19lbGVjdHJpY2FsX3NwcmluZ19lbWJlZGRpbmcAY2VsbHBhZGRpbmcAY2VsbHNwYWNpbmcAcmFuZwBsYW5nAGZpdmVwb3ZlcmhhbmcAdGhyZWVwb3ZlcmhhbmcAbm92ZXJoYW5nAGVtaXRfaHRtbF9pbWcAbGcAb3JpZwBzemxpZwBvZWxpZwBhZWxpZwBPRWxpZwBBRWxpZwBjb3JlX2xvYWRpbWFnZV9maWcAanBnOmZpZwBwbmc6ZmlnAGZpZzpmaWcAanBlZzpmaWcAZ2lmOmZpZwBqcGU6ZmlnAGVnZwBuZXh0X3NlZwByZWcAanBlZwBpID09IGRlZwBkZwBjZwBjbG9zZXN1YmcAbWlzbWF0Y2hlZCB0YWcAYmV6LT5zZmxhZwBiZXotPmVmbGFnACEqZmxhZwAhZmxhZwA8ZwAlLjVnLCUuNWcsJS41ZywlLjVnACUuNWcgJS41ZwAlZyAlZwBib3hJbnRlcnNlY3RmAGVwc2YAYWdlZGdlc2VxY21wZgBjY3dyb3RhdGVwZgBmbm9mAGluZgBzZWxmAGhhbGYAJWxmJWxmJWxmJWxmACVsZiwlbGYsJWxmLCVsZiwlbGYAJSpmICUqZiAlbGYgJWxmAGxpYmVyYXRpb25zZXJpZgBmcmVlc2VyaWYAc2Fucy1TZXJpZgBnaWYAL3N2Zy9wZWFjaHB1ZmYAcmlmZgBhY2NvdW50aW5nUmVwb3J0RGlmZgAoWG1sQmlnQ291bnQpLTEgLSByb290UGFyc2VyLT5tX2FsbG9jX3RyYWNrZXIuYnl0ZXNBbGxvY2F0ZWQgPj0gYWJzRGlmZgB0YWlsaHJlZgBsYWJlbGhyZWYAZWRnZWhyZWYAaGVhZGhyZWYAb3JkZgBwZGYAc2lnbWFmAFxmACUuMExmACVMZgB1cy0+ZgAlLjAzZgAlcyB0cmFuc21pdCAlLjNmAHJnYjwlOS4zZiwgJTkuM2YsICU5LjNmPiB0cmFuc21pdCAlLjNmACUuMDJmACUuMmYAJS4wZiwlLjBmLCUuMGYsJS4wZgAgJS4wZiwlLjBmACUuMGYgJS4wZiAlLjBmICUuMGYAIiBmaWxsLW9wYWNpdHk9IiVmACIgc3Ryb2tlLW9wYWNpdHk9IiVmAApmaW5hbCBlID0gJWYAYnJvbnplAGFycm93c2l6ZQBsYWJlbGZvbnRzaXplAHNlYXJjaHNpemUAZml4ZWRzaXplAG5vZGVfc2V0X3NpemUAdGV4dHNwYW5fc2l6ZQBzdmdfc2l6ZQBpbmRleCA8IGxpc3QtPnNpemUAY2FwYWNpdHkgPiBkaWN0LT5zaXplAGNhcGFjaXR5ID4gc2VsZi0+c2l6ZQBiei5zaXplAHBvaW50LXNpemUAU0laRV9NQVggLSBzaXplb2Yoc2l6ZV90KSAtIEVYUEFUX01BTExPQ19QQURESU5HID49IHNpemUAbm9ybWFsaXplAEVMaW5pdGlhbGl6ZQBta01hemUAaWN1cnZlAHRyeV9yZXNlcnZlAG5vZGVfc2V0X3JlbW92ZQBzdHJkaWN0X3JlbW92ZQBzb2x2ZQAhdi0+YWN0aXZlAC1hY3RpdmUAZm9udF9pbl9saXN0X3Blcm1pc3NpdmUAL3N2Zy9vbGl2ZQB1Z3JhdmUAb2dyYXZlAGlncmF2ZQBlZ3JhdmUAYWdyYXZlAFVncmF2ZQBPZ3JhdmUASWdyYXZlAEVncmF2ZQBBZ3JhdmUAdHJ1ZQAvc3ZnL2Jpc3F1ZQBvYmxpcXVlAEF2YW50R2FyZGUtQm9va09ibGlxdWUAQXZhbnRHYXJkZS1EZW1pT2JsaXF1ZQBIZWx2ZXRpY2EtTmFycm93LUJvbGRPYmxpcXVlAENvdXJpZXItQm9sZE9ibGlxdWUASGVsdmV0aWNhLUJvbGRPYmxpcXVlAEhlbHZldGljYS1OYXJyb3ctT2JsaXF1ZQBDb3VyaWVyLU9ibGlxdWUASGVsdmV0aWNhLU9ibGlxdWUAbmF2eWJsdWUAL3N2Zy9saWdodHNreWJsdWUAL3N2Zy9kZWVwc2t5Ymx1ZQAvc3ZnL3NreWJsdWUAbmV3bWlkbmlnaHRibHVlAC9zdmcvbWlkbmlnaHRibHVlAC9zdmcvbGlnaHRibHVlAC9zdmcvY2FkZXRibHVlAC9zdmcvY29ybmZsb3dlcmJsdWUAL3N2Zy9kb2RnZXJibHVlAC9zdmcvcG93ZGVyYmx1ZQBuZW9uYmx1ZQAvc3ZnL21lZGl1bWJsdWUAL3N2Zy9saWdodHN0ZWVsYmx1ZQAvc3ZnL3N0ZWVsYmx1ZQAvc3ZnL3JveWFsYmx1ZQAvc3ZnL2RhcmtibHVlAHJpY2hibHVlAGxpZ2h0c2xhdGVibHVlAC9zdmcvbWVkaXVtc2xhdGVibHVlAC9zdmcvZGFya3NsYXRlYmx1ZQAvc3ZnL3NsYXRlYmx1ZQAvc3ZnL2FsaWNlYmx1ZQAvc3ZnL2JsdWUAY2FsbFN0b3JlRW50aXR5VmFsdWUAc3RvcmVBdHRyaWJ1dGVWYWx1ZQBCbHVlAG5lYXRvX2VucXVldWUAVHVlAHlhY3V0ZQB1YWN1dGUAb2FjdXRlAGlhY3V0ZQBlYWN1dGUAYWFjdXRlAFlhY3V0ZQBVYWN1dGUAT2FjdXRlAElhY3V0ZQBFYWN1dGUAQWFjdXRlAHJlZmVyZW5jZSB0byBleHRlcm5hbCBlbnRpdHkgaW4gYXR0cmlidXRlAGR1cGxpY2F0ZSBhdHRyaWJ1dGUAbm90ZQBwcmltZXJzaXRlAHJpYm9zaXRlAHJlc3RyaWN0aW9uc2l0ZQBwcm90ZWFzZXNpdGUAL3N2Zy9naG9zdHdoaXRlAC9zdmcvbmF2YWpvd2hpdGUAL3N2Zy9mbG9yYWx3aGl0ZQAvc3ZnL2FudGlxdWV3aGl0ZQAvc3ZnL3doaXRlAFdoaXRlAHBvcF9vYmpfc3RhdGUAcGNwX3JvdGF0ZQBjb25jZW50cmF0ZQBkZWNvcmF0ZQBRdWFkVHJlZV9yZXB1bHNpdmVfZm9yY2VfYWNjdW11bGF0ZQBub3RyYW5zbGF0ZQAvc3ZnL2Nob2NvbGF0ZQBwYXJzZXJDcmVhdGUAZ2VvbVVwZGF0ZQBpbnZob3VzZQAvc3ZnL2NoYXJ0cmV1c2UAWE1MX1BhcnNlADxlbGxpcHNlAGR1c3R5cm9zZQAvc3ZnL21pc3R5cm9zZQBTcGFyc2VNYXRyaXhfdHJhbnNwb3NlAGx1X2RlY29tcG9zZQBhZ2Nsb3NlAGVudGl0eVRyYWNraW5nT25DbG9zZQBTcGFyc2VNYXRyaXhfbXVsdGlwbHlfZGVuc2UAZmFsc2UAL3N2Zy9tZWRpdW10dXJxdW9pc2UAL3N2Zy9kYXJrdHVycXVvaXNlAC9zdmcvcGFsZXR1cnF1b2lzZQAvc3ZnL3R1cnF1b2lzZQBwaGFzZQBTSVpFX01BWCAtIHJvb3RQYXJzZXItPm1fYWxsb2NfdHJhY2tlci5ieXRlc0FsbG9jYXRlZCA+PSBpbmNyZWFzZQBzbG90X2Zyb21fYmFzZQAvc3ZnL2F6dXJlAHNpZ25hdHVyZQBtb3JlX2NvcmUATXNxdWFyZQBQYWxhdGlubyBMaW5vdHlwZQBBLT50eXBlID09IEItPnR5cGUAc3VwZQBlbGxpcHNlX3RhbmdlbnRfc2xvcGUAZ3ZyZW5kZXJfdXNlcnNoYXBlAG1pdGVyX3NoYXBlAGxhbmRzY2FwZQBMYW5kc2NhcGUASnVuZQBub25lAGRvY3VtZW50IGlzIG5vdCBzdGFuZGFsb25lAGNvdXNpbmUAL3N2Zy9tZWRpdW1hcXVhbWFyaW5lAC9zdmcvYXF1YW1hcmluZQA8cG9seWxpbmUAJXNvdmVybGluZQB1bmRlcmxpbmUAcmVhbGx5cm91dGVzcGxpbmUAUHJvdXRlc3BsaW5lAGxpbmVhcl9zcGxpbmUAYl9zcGxpbmUAb2xpbmUAYWd4YnVmX2lzX2lubGluZQBzdmdfaW5saW5lAHJlZmluZQBwcmltZQBQcmltZQAvc3ZnL2xpbWUAY29sb3JzY2hlbWUAbGFiZWxfc2NoZW1lAHNhbWUAbGFiZWxmb250bmFtZQBVRl9zZXRuYW1lAGZvbnRfbmFtZQBmb250LT5uYW1lAHVzLT5uYW1lAHJlc2VydmVkIHByZWZpeCAoeG1sKSBtdXN0IG5vdCBiZSB1bmRlY2xhcmVkIG9yIGJvdW5kIHRvIGFub3RoZXIgbmFtZXNwYWNlIG5hbWUAc3R5bGUAL3N2Zy90aGlzdGxlAHRpdGxlAC9zdmcvbWVkaXVtcHVycGxlAGRhcmtwdXJwbGUAd2VicHVycGxlAHJlYmVjY2FwdXJwbGUAdmVyeV9saWdodF9wdXJwbGUAbWVkX3B1cnBsZQB4MTFwdXJwbGUAL3N2Zy9wdXJwbGUAc2hhcGVmaWxlAGdyYWRpZW50YW5nbGUAcmVjdGFuZ2xlAFJlY3RhbmdsZQBsYWJlbGFuZ2xlAGludnRyaWFuZ2xlAGRlc3RpbmF0aW9uIHBvaW50IG5vdCBpbiBhbnkgdHJpYW5nbGUAc291cmNlIHBvaW50IG5vdCBpbiBhbnkgdHJpYW5nbGUAZGZzQ3ljbGUAZG91YmxlY2lyY2xlAE1jaXJjbGUAaW52aXNpYmxlAGV4cGF0X2hlYXBfaW5jcmVhc2VfdG9sZXJhYmxlAHRob3JuZGFsZQBpbnB1dHNjYWxlAG9zY2FsZQBpbWFnZXNjYWxlAC9zdmcvd2hpdGVzbW9rZQBtYW5kYXJpbm9yYW5nZQAvc3ZnL2RhcmtvcmFuZ2UAL3N2Zy9vcmFuZ2UAZXhjaGFuZ2UAL3N2Zy9iZWlnZQBuZXdlZGdlAGRlbGV0ZV9mYXN0X2VkZ2UAZGVsZXRlX2ZsYXRfZWRnZQBhZGRfdHJlZV9lZGdlAHBhdGNod29ya19pbml0X25vZGVfZWRnZQB0d29waV9pbml0X25vZGVfZWRnZQBtYWtlU3RyYWlnaHRFZGdlAG1ha2VTZWxmRWRnZQBtYWtlQ29tcG91bmRFZGdlACF1c2Vfc3RhZ2UAb3NhZ2UAcGFnZQBndmxvYWRpbWFnZQB2ZWUAdGVlAFFVQURfVFJFRV9IWUJSSUQsIHNpemUgbGFyZ2VyIHRoYW4gJWQsIHN3aXRjaCB0byBmYXN0IHF1YWR0cmVlAGZlYXNpYmxlX3RyZWUAbm9kZV9zZXRfZnJlZQBleHBhdF9mcmVlAGd2X2FyZW5hX2ZyZWUAbmV3bm9kZQBpbnN0YWxsbm9kZQBhZ25vZGUAZGVsZXRlX2Zhc3Rfbm9kZQBwYWNrbW9kZQBTcGxpdE5vZGUAb3RpbGRlAG50aWxkZQBhdGlsZGUAT3RpbGRlAE50aWxkZQBBdGlsZGUAZGl2aWRlAHRyYWRlAGdyYXBodml6X25vZGVfaW5kdWNlAHNvdXJjZQByZXB1bHNpdmVmb3JjZQBpbGxlZ2FsIHBhcmFtZXRlciBlbnRpdHkgcmVmZXJlbmNlAGVycm9yIGluIHByb2Nlc3NpbmcgZXh0ZXJuYWwgZW50aXR5IHJlZmVyZW5jZQByZWN1cnNpdmUgZW50aXR5IHJlZmVyZW5jZQBsYWJlbGRpc3RhbmNlAFRCX2JhbGFuY2UAVEJiYWxhbmNlAGRldmljZQBtb25vc3BhY2UAL3N2Zy9vbGRsYWNlAGZhY2UAc3ViZQAgLWFuY2hvciBlAHMxLT5jb21tX2Nvb3JkPT1zMi0+Y29tbV9jb29yZABNcmVjb3JkAGZvcndhcmQAcHJvZABsaWdodGdvbGRlbnJvZABtZWRpdW1nb2xkZW5yb2QAL3N2Zy9kYXJrZ29sZGVucm9kAC9zdmcvcGFsZWdvbGRlbnJvZAAvc3ZnL2dvbGRlbnJvZAAvc3ZnL2J1cmx5d29vZABsaWdodHdvb2QAbWVkaXVtd29vZABkYXJrd29vZABfYmFja2dyb3VuZABjb21wb3VuZABubyBlbGVtZW50IGZvdW5kAGZhdGFsIGZsZXggc2Nhbm5lciBpbnRlcm5hbCBlcnJvci0tbm8gYWN0aW9uIGZvdW5kAC9zdmcvYmxhbmNoZWRhbG1vbmQAYXJyb3dfbGVuZ3RoX2RpYW1vbmQATWRpYW1vbmQAbm9kZV9zZXRfZmluZABzdHJkaWN0X2ZpbmQAZ3Z1c2Vyc2hhcGVfZmluZABFTGxlZnRibmQAZXhwYW5kAGN1bWJlcmxhbmQAYnJpZ2h0Z29sZABvbGRnb2xkAC9zdmcvZ29sZABib2xkAEhlbHZldGljYS1OYXJyb3ctQm9sZABUaW1lcy1Cb2xkAENvdXJpZXItQm9sZABQYWxhdGluby1Cb2xkAE5ld0NlbnR1cnlTY2hsYmstQm9sZABIZWx2ZXRpY2EtQm9sZAAlMCpsbGQAJSpsbGQAKyVsbGQAbi0+YnJhbmNoW2ldLmNoaWxkACUrLjRsZAAlcyVsZABzb2xpZAAvc3ZnL21lZGl1bW9yY2hpZAAvc3ZnL2RhcmtvcmNoaWQAL3N2Zy9vcmNoaWQAaWxsZWdhbCBjaGFyYWN0ZXIocykgaW4gcHVibGljIGlkAGRpamtzdHJhX3NnZABmaXhlZABjdXJ2ZWQAZGVyaXZlZABkb3R0ZWQAbWVtb3J5IGV4aGF1c3RlZABsb2NhbGUgbm90IHN1cHBvcnRlZABwYXJzaW5nIGFib3J0ZWQAcGFyc2VyIG5vdCBzdGFydGVkAGF0dHJpYnV0ZSBtYWNyb3Mgbm90IGltcGxlbWVudGVkAGFjY291bnRpbmdEaWZmVG9sZXJhdGVkAHJvb3RQYXJzZXItPm1fYWxsb2NfdHJhY2tlci5ieXRlc0FsbG9jYXRlZCA+PSBieXRlc0FsbG9jYXRlZABmYXRhbCBmbGV4IHNjYW5uZXIgaW50ZXJuYWwgZXJyb3ItLWVuZCBvZiBidWZmZXIgbWlzc2VkAGNvbmRlbnNlZAAvc3ZnL21lZGl1bXZpb2xldHJlZAAvc3ZnL3BhbGV2aW9sZXRyZWQASW1wcm9wZXIgJXMgdmFsdWUgJXMgLSBpZ25vcmVkACVzIHZhbHVlICVzIDwgJWQgLSB0b28gc21hbGwgLSBpZ25vcmVkACVzIHZhbHVlICVzID4gJWQgLSB0b28gbGFyZ2UgLSBpZ25vcmVkAC9zdmcvaW5kaWFucmVkAC9zdmcvZGFya3JlZABhIHN1Y2Nlc3NmdWwgcHJpb3IgY2FsbCB0byBmdW5jdGlvbiBYTUxfR2V0QnVmZmVyIGlzIHJlcXVpcmVkAHRhcGVyZWQAL3N2Zy9vcmFuZ2VyZWQAcmVzZXJ2ZWQgcHJlZml4ICh4bWxucykgbXVzdCBub3QgYmUgZGVjbGFyZWQgb3IgdW5kZWNsYXJlZAAvc3ZnL3JlZABzdHJpcGVkAGlsbC1jb25kaXRpb25lZAB1bmRlZmluZWQAbm90IGNvbnN0cmFpbmVkAGxhYmVsYWxpZ25lZAB0ZXh0IGRlY2xhcmF0aW9uIG5vdCB3ZWxsLWZvcm1lZABYTUwgZGVjbGFyYXRpb24gbm90IHdlbGwtZm9ybWVkAHVuZmlsbGVkAGlucHV0IGluIGZsZXggc2Nhbm5lciBmYWlsZWQAdHJpYW5ndWxhdGlvbiBmYWlsZWQAcGFyc2luZyBmaW5pc2hlZABkYXNoZWQAbGltaXQgb24gaW5wdXQgYW1wbGlmaWNhdGlvbiBmYWN0b3IgKGZyb20gRFREIGFuZCBlbnRpdGllcykgYnJlYWNoZWQAd2VkZ2VkAHNpemUgPT0gZnJlZWQAcm91bmRlZABzcGxpbmUgWyUuMDNmLCAlLjAzZl0gLS0gWyUuMDNmLCAlLjAzZl0gaXMgaG9yaXpvbnRhbDsgd2lsbCBiZSB0cml2aWFsbHkgYm91bmRlZABzcGxpbmUgWyUuMDNmLCAlLjAzZl0gLS0gWyUuMDNmLCAlLjAzZl0gaXMgdmVydGljYWw7IHdpbGwgYmUgdHJpdmlhbGx5IGJvdW5kZWQAcGFyc2VyIG5vdCBzdXNwZW5kZWQAcGFyc2VyIHN1c3BlbmRlZABXZWQAUmVkAFNwYXJzZU1hdHJpeF9hZGQAbm9kZV9zZXRfYWRkAHN0cmRpY3RfYWRkAGRkICE9IHBhcmVudF9kZABLUF9BZGQAcGFkAHhsaGR4bG9hZAB4bGhkeHVubG9hZAByZWFkAGFycm93aGVhZABsaGVhZABzYW1laGVhZABib3gzZAAlc18lZABfc3Bhbl8lZABfYmxvY2tfJWQAX3dlYWtfJWQAX2Nsb25lXyVkAC4lZAAlWS0lbS0lZAAlbGYsJWQAJXMgaW4gbGluZSAlZAAlJSUlQm91bmRpbmdCb3g6ICVkICVkICVkICVkACJfc3ViZ3JhcGhfY250IjogJWQAIl9ndmlkIjogJWQAImhlYWQiOiAlZABhZ3hicHV0YwB2cHNjAGNwLT5zcmMAdWNpcmMAb2NpcmMAaWNpcmMAZWNpcmMAYWNpcmMAVWNpcmMAT2NpcmMASWNpcmMARWNpcmMAQWNpcmMAcGMAbGFiZWxsb2MAZXhwYXRfbWFsbG9jAGV4cGF0X3JlYWxsb2MAZ3ZfcmVjYWxsb2MAc3RkOjpiYWRfYWxsb2MAZ3ZfYXJlbmFfYWxsb2MAYmFrZXJzY2hvYwBzZW1pU3dlZXRDaG9jAG1jAFNwYXJzZU1hdHJpeF9pc19zeW1tZXRyaWMAQS0+aXNfcGF0dGVybl9zeW1tZXRyaWMAcGljOnBpYwBpdGFsaWMAQm9va21hbi1MaWdodEl0YWxpYwBaYXBmQ2hhbmNlcnktTWVkaXVtSXRhbGljAEJvb2ttYW4tRGVtaUl0YWxpYwBUaW1lcy1Cb2xkSXRhbGljAFBhbGF0aW5vLUJvbGRJdGFsaWMATmV3Q2VudHVyeVNjaGxiay1Cb2xkSXRhbGljAFRpbWVzLUl0YWxpYwBQYWxhdGluby1JdGFsaWMATmV3Q2VudHVyeVNjaGxiay1JdGFsaWMAcmFkaWMAI2ZjZmNmYwByb3V0ZXNwbGluZXM6ICVkIGVkZ2VzLCAlenUgYm94ZXMgJS4yZiBzZWMAOiAlLjJmIHNlYwBsaXN0ZGVscmVjAGxldmVsIGdyYXBoIHJlYwBsZXZlbCBlZGdlIHJlYwBsZXZlbCBub2RlIHJlYwBEZWMAX25lYXRvX2NjAGJjAHZpc2liaWxpdHkuYwBTcGFyc2VNYXRyaXguYwBodG1sbGV4LmMAaW5kZXguYwBzbWFydF9pbmlfeC5jAGd2cmVuZGVyX2NvcmVfcG92LmMAbHUuYwBjdnQuYwBsYXlvdXQuYwB0ZXh0c3Bhbl9sdXQuYwBhZGp1c3QuYwBub2RlbGlzdC5jAHNob3J0ZXN0LmMAY2xvc2VzdC5jAGd2cmVuZGVyX2NvcmVfZG90LmMAY29uc3RyYWludC5jAGRvdGluaXQuYwBuZWF0b2luaXQuYwBwYXRjaHdvcmtpbml0LmMAdHdvcGlpbml0LmMAb3NhZ2Vpbml0LmMAZW1pdC5jAGZsYXQuYwBhcnJvd3MuYwBtaW5jcm9zcy5jAHN0cmVzcy5jAHBvc3RfcHJvY2Vzcy5jAGNjb21wcy5jAG5zLmMAdXRpbHMuYwB4bGFiZWxzLmMAc2hhcGVzLmMAZG90c3BsaW5lcy5jAG5lYXRvc3BsaW5lcy5jAGNsdXN0ZXJlZGdlcy5jAGhlZGdlcy5jAGF0dHIuYwByZWZzdHIuYwBmYXN0Z3IuYwBjbHVzdGVyLmMAdGFwZXIuYwBndnJlbmRlci5jAHNwbGl0LnEuYwBjb21wLmMAZ3ZyZW5kZXJfY29yZV9tYXAuYwBoZWFwLmMAb3J0aG8uYwBndnJlbmRlcl9jb3JlX2pzb24uYwBwYXJ0aXRpb24uYwBwb3NpdGlvbi5jAGd2X2ZvcGVuLmMAdGV4dHNwYW4uYwBnZW9tLmMAcmFuZG9tLmMAcm91dGVzcGwuYwB4bWwuYwBNdWx0aWxldmVsLmMAc3ByaW5nX2VsZWN0cmljYWwuYwBndnJlbmRlcl9jb3JlX3RrLmMAcmFuay5jAHBhY2suYwBkdHN0cmhhc2guYwBncmFwaC5jAGd2cmVuZGVyX2NvcmVfc3ZnLmMAZ3ZyZW5kZXJfY29yZV9maWcuYwBzdHVmZi5jAG1hemUuYwBzcGFyc2Vfc29sdmUuYwByb3V0ZS5jAHdyaXRlLmMAY29seGxhdGUuYwB4bWxwYXJzZS5jAGd2bG9hZGltYWdlX2NvcmUuYwBndnVzZXJzaGFwZS5jAGNpcmNsZS5jAGh0bWx0YWJsZS5jAGVkZ2UuYwBndmxvYWRpbWFnZS5jAGJsb2NrdHJlZS5jAFF1YWRUcmVlLmMAbm9kZS5jAG5vZGVfaW5kdWNlLmMAZ3ZkZXZpY2UuYwBjb21wb3VuZC5jAHRyYXBlem9pZC5jAHNnZC5jAGNvbmMuYwByZWMuYwBkaWprc3RyYS5jAGFyZW5hLmMAZlBRLmMAY2xhc3MyLmMAJWxmLCVsZiwlbGYsJWxmJWMAJWxmLCVsZiwlbGYsJVteLF0lYwBcJWMAJGMAd2IAbnN1YgBzZXRoc2IAcmIAcHJvdGVjdF9yc3FiAGpvYgBjb3JlX2xvYWRpbWFnZV9wc2xpYgBGZWIAb2RiAGluaXRfc3BsaW5lc19iYgBiZXppZXJfYmIAcHJvdGVpbnN0YWIAcm5hc3RhYgAvc3ZnL29saXZlZHJhYgBcYgByd2EAL3N2Zy9hcXVhAGlvdGEASW90YQAvc3ZnL2RhcmttYWdlbnRhAC9zdmcvbWFnZW50YQBkZWx0YQBEZWx0YQB6ZXRhAHRoZXRhAFRoZXRhAGJldGEAWmV0YQBCZXRhAHByZXYgIT0gb2JqLT5kYXRhAG1ha2VHcmFwaERhdGEARXRhAG5pbWJ1c3NhbnNhAHBhcmEAa2FwcGEAS2FwcGEAL3N2Zy9zaWVubmEAVmVyZGFuYQBnYW1tYQBHYW1tYQBzaWdtYQBTaWdtYQBjb25zb2xhAG5hYmxhAC9zdmcvZnVjaHNpYQBHZW9yZ2lhAGFscGhhAEFscGhhAG9tZWdhAE9tZWdhAGFyZWEAbGFtYmRhAExhbWJkYQBoZWx2ZXRpY2EASGVsdmV0aWNhAG1pY2EAPjxhAGAAU3BhcnNlTWF0cml4X2Nvb3JkaW5hdGVfZm9ybV9hZGRfZW50cnlfAGd2X2xpc3RfY29weV8AX3RkcmF3XwBfdGxkcmF3XwBfaGxkcmF3XwBfbGRyYXdfAF9oZHJhd18AX2RyYXdfAGd2X2xpc3Rfc29ydF8AZ3ZfbGlzdF9hcHBlbmRfc2xvdF8AZ3ZfbGlzdF9wcmVwZW5kX3Nsb3RfAGd2X2xpc3RfcG9wX2Zyb250XwBndl9saXN0X3Nocmlua190b19maXRfAGFneHNldF8AZ3ZfbGlzdF9nZXRfAGRvdF9zcGxpbmVzXwAlc18AZ3ZfbGlzdF9jbGVhcl8AZ3ZfbGlzdF9wb3BfYmFja18AZ3ZfbGlzdF9kZXRhY2hfAGd2X2xpc3RfcmVtb3ZlXwBndl9saXN0X3JldmVyc2VfAGd2X2xpc3RfZnJlZV8AZ3ZfbGlzdF90cnlfYXBwZW5kXwBwYWdlJWQsJWRfAGd2X2xpc3Rfc3luY18AX2NjXwAgaWQ9ImFfAF4AU3RhcnRpbmcgcGhhc2UgMiBbZG90X21pbmNyb3NzXQBTdGFydGluZyBwaGFzZSAzIFtkb3RfcG9zaXRpb25dAG5fZWRnZXMgPT0gZ3JhcGgtPnNvdXJjZXNbZ3JhcGgtPm5dAFN0YXJ0aW5nIHBoYXNlIDEgW2RvdF9yYW5rXQBqZFttYXNrW2pjW2tdXV0gPT0gamNba10AamNbbWFza1tqYltrXV1dID09IGpiW2tdAG5lZWRsZVtpXSAhPSBuZWVkbGVbal0AamFbbWFza1tqYVtqXV1dID09IGphW2pdAHEtPnF0c1tpaV0AIXJ0cC0+c3BsaXQuUGFydGl0aW9uc1swXS50YWtlbltpXQByLmJvdW5kYXJ5W2ldIDw9IHIuYm91bmRhcnlbTlVNRElNUyArIGldAFslLjAzZiwlLjAzZl0AW2ludGVybmFsIGhhcmQtY29kZWRdAG5wLT5jZWxsc1sxXQBucC0+Y2VsbHNbMF0AdXMtPm5hbWVbMF0AY3AtPnNyY1swXQBbLi5dAFxcACJwb2ludHMiOiBbACJzdG9wcyI6IFsACVsAWgBjb21wdXRlU2NhbGVYWQB5PD1ZACVhICViICVkICVIOiVNOiVTICVZAFBPU0lYAG56IDw9IElOVF9NQVgAeSA+PSBJTlRfTUlOICYmIHkgPD0gSU5UX01BWAB4ID49IElOVF9NSU4gJiYgeCA8PSBJTlRfTUFYAHcgPj0gMCAmJiB3IDw9IElOVF9NQVgAZV9jbnQgPD0gSU5UX01BWABwYWlyLnJpZ2h0IDw9IElOVF9NQVgAcGFpci5sZWZ0IDw9IElOVF9NQVgAdGFyZ2V0IDw9IElOVF9NQVgAbnNlZ3MgPD0gSU5UX01BWABuX2VkZ2VzIDw9IElOVF9NQVgAc3RwLm52ZXJ0aWNlcyA8PSBJTlRfTUFYAG9ic1twb2x5X2ldLT5wbiA8PSBJTlRfTUFYAGlucHV0X3JvdXRlLnBuIDw9IElOVF9NQVgAZ3JhcGgtPm4gPD0gSU5UX01BWABoID49IDAgJiYgaCA8PSBJTlRfTUFYAGVfY250IC0gMSA8PSBJTlRfTUFYAExJU1RfU0laRSgmbGlzdCkgLSAxIDw9IElOVF9NQVgATElTVF9TSVpFKCZsYXllcklEcykgLSAxIDw9IElOVF9NQVgAc3RybGVuKGFyZ3MpIDw9IElOVF9NQVgATElTVF9TSVpFKCZvYmpsKSA8PSBJTlRfTUFYAExJU1RfU0laRSgmY3R4LT5UcmVlX2VkZ2UpIDw9IElOVF9NQVgAbm9kZV9zZXRfc2l6ZShnLT5uX2lkKSA8PSBJTlRfTUFYAGkgPCBJTlRfTUFYAHJlc3VsdCA8PSAoaW50KVVDSEFSX01BWABzc3ogPD0gVUNIQVJfTUFYAGNvbCA+PSAwICYmIGNvbCA8PSBVSU5UMTZfTUFYAHg8PVgAVwBWAFUAXFQAVEVYVABTVFJFU1NfTUFKT1JJWkFUSU9OX1BPV0VSX0RJU1QAU1RSRVNTX01BSk9SSVpBVElPTl9HUkFQSF9ESVNUAFNUUkVTU19NQUpPUklaQVRJT05fQVZHX0RJU1QARkFTVABGT05UAGIgPT0gQl9SSUdIVABIRUlHSFQAQl9MRUZUAF8lbGx1X1NVU1BFQ1QAQlQAVHJlYnVjaGV0IE1TAElOVklTACVIOiVNOiVTAFZSAFRSAEEtPmZvcm1hdCA9PSBCLT5mb3JtYXQgJiYgQS0+Zm9ybWF0ID09IEZPUk1BVF9DU1IATFIARElSAEhSAENFTlRFUgAlJVRSQUlMRVIAQS0+dHlwZSA9PSBNQVRSSVhfVFlQRV9SRUFMIHx8IEEtPnR5cGUgPT0gTUFUUklYX1RZUEVfSU5URUdFUgBDRUxMQk9SREVSAEJSACpSAFEARVhQAEJfVVAAU1VQAFRPUABPAG1hcE4AXE4AQl9ET1dOAFRIT1JOACUlQkVHSU4AUk9XU1BBTgBDT0xTUEFOAE5BTgBQTQBCT1RUT00AQk0AQU0AJUg6JU0AXEwAdGFpbFVSTABsYWJlbFVSTABlZGdlVVJMAGhlYWRVUkwASFRNTAB4IT1OVUxMAHJvb3RQYXJzZXItPm1fcGFyZW50UGFyc2VyID09IE5VTEwARURfdG9fdmlydChvcmlnKSA9PSBOVUxMAEVEX3RvX3ZpcnQoZSkgPT0gTlVMTABwcmVmaXggIT0gTlVMTABkdGQtPnNjYWZmSW5kZXggIT0gTlVMTABzbS0+THcgIT0gTlVMTABsdSAhPSBOVUxMAGlucHV0ICE9IE5VTEwAbGlzdCAhPSBOVUxMAHJlZmVyZW50ICE9IE5VTEwAZGljdCAhPSBOVUxMAGRpY3QtPmJ1Y2tldHMgIT0gTlVMTABhdHRyICE9IE5VTEwAYWxsb2NhdG9yICE9IE5VTEwAcGFyc2VyICE9IE5VTEwAcm9vdFBhcnNlciAhPSBOVUxMAGxlYWRlciAhPSBOVUxMAGNtcCAhPSBOVUxMAGRhdGFwICE9IE5VTEwAaW50byAhPSBOVUxMAGl0ZW0gIT0gTlVMTABvcnRob2cgIT0gTlVMTABzZWxmICE9IE5VTEwAdmFsdWUgIT0gTlVMTABmaWxlbmFtZSAhPSBOVUxMAGpvYi0+b3V0cHV0X2ZpbGUgIT0gTlVMTABtb2RlICE9IE5VTEwAeGQgIT0gTlVMTABzbS0+THdkICE9IE5VTEwAam9iICE9IE5VTEwAc291cmNlLmRhdGEgIT0gTlVMTABiLmRhdGEgIT0gTlVMTABhLmRhdGEgIT0gTlVMTABhcmVuYSAhPSBOVUxMAGxpc3QgJiYgbGlzdFswXSAhPSBOVUxMAEFGICE9IE5VTEwAc20tPkQgIT0gTlVMTABFRF90b192aXJ0KG9yaWcpICE9IE5VTEwATENfQUxMAEJMAGJlc3Rjb3N0IDwgSFVHRV9WQUwATk9STUFMAFJBRElBTABBLT50eXBlID09IE1BVFJJWF9UWVBFX1JFQUwAVVJXIENoYW5jZXJ5IEwAVVJXIEJvb2ttYW4gTABDZW50dXJ5IFNjaG9vbGJvb2sgTABVUlcgR290aGljIEwAS0sASgBpIDwgTUFYX0kAUC0+ZW5kLnRoZXRhIDwgMiAqIE1fUEkAQVNDSUkAXEgARVRIAFdJRFRIAERPVEZPTlRQQVRIAEdERk9OVFBBVEgAbWtOQ29uc3RyYWludEcAXEcARVhQQVRfRU5USVRZX0RFQlVHAEVYUEFUX0VOVFJPUFlfREVCVUcARVhQQVRfQUNDT1VOVElOR19ERUJVRwBFWFBBVF9NQUxMT0NfREVCVUcAUk5HAFNQUklORwBDRUxMUEFERElORwBDRUxMU1BBQ0lORwBMQU5HAElNRwBceEYAJSVFT0YASU5GAFx4RkYAUklGRgBkZWx0YSA8PSAweEZGRkYAXHhFRgBceERGAFx4Q0YAXHhCRgBceEFGAFx4OUYAXHg4RgBceDdGAFx4MUYAXHhFAFxFAFBPSU5ULVNJWkUAVFJVRQBDTE9TRQBGQUxTRQBrZXkgIT0gVE9NQlNUT05FAHIgIT0gVE9NQlNUT05FAE5PTkUAR1JBRElFTlRBTkdMRQBUUklBTkdMRQBNSURETEUASU5WSVNJQkxFAFRBQkxFAEFHVFlQRShvYmopID09IEFHSU5FREdFIHx8IEFHVFlQRShvYmopID09IEFHT1VURURHRQBceEZFAFx4RUUAXHhERQBCX05PREUAXHhDRQBceEJFAFx4QUUAXHg5RQBceDhFAFx4MUUAVEQAQS0+Zm9ybWF0ID09IEZPUk1BVF9DT09SRABuICYmIGkgPj0gMCAmJiBpIDwgTk9ERUNBUkQAJSVFTkQASFlCUklEAFNPTElEAFx4RkQAXHhFRABET1RURUQAREFTSEVEAFJPVU5ERUQAXHhERABceENEAFx4QkQAXHhBRABceDlEAFx4OEQAXHgxRABceEMAZGVsZXRlVlBTQwBceEZDAFx4RUMAXHhEQwBceENDAFx4QkMAXHhBQwBceDlDAFx4OEMAXHgxQwBceEIAU1VCAFx4RkIAXHhFQgBceERCAFx4Q0IAXHhCQgBceEFCAFx4OUIAXHg4QgBceDFCAEEgJiYgQgBceEZBAFx4RUEAXHhEQQBceENBAFx4QkEAXHhBQQBceDlBAFx4OEEAXHgxQQBAAD8APCVzPgA8bmlsPgA8L3RzcGFuPjwvdGV4dFBhdGg+AAogICAgPCU5LjNmLCAlOS4zZiwgJTkuM2Y+AD4KPHRpdGxlPgA8Rk9OVD4APEJSPgA8SFRNTD4APC9IVE1MPgA8SU1HPgBTeW50YXggZXJyb3I6IG5vbi1zcGFjZSBzdHJpbmcgdXNlZCBiZWZvcmUgPFRBQkxFPgBTeW50YXggZXJyb3I6IG5vbi1zcGFjZSBzdHJpbmcgdXNlZCBhZnRlciA8L1RBQkxFPgA8VEQ+AC0+ACI+AAlba2V5PQA8PQA8ACYjeCV4OwAmcXVvdDsAJmx0OwAmZ3Q7ACZhbXA7ACMlZDsAJiMzOTsAJiM0NTsAJiM5MzsAJiMxMzsAJiMxNjA7ACYjMTA7ADtzdG9wLW9wYWNpdHk6ACUlQm91bmRpbmdCb3g6AGNhbGN1bGF0aW5nIHNob3J0ZXN0IHBhdGhzIGFuZCBzZXR0aW5nIHVwIHN0cmVzcyB0ZXJtczoAPHN0b3Agb2Zmc2V0PSIlLjAzZiIgc3R5bGU9InN0b3AtY29sb3I6ADxzdG9wIG9mZnNldD0iMSIgc3R5bGU9InN0b3AtY29sb3I6ADxzdG9wIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6AHNvbHZpbmcgbW9kZWw6AC9cOgBncmV5OQBncmF5OQBceEY5AFx4RTkAXHhEOQBceEM5AFx4QjkAXHhBOQBncmV5OTkAZ3JheTk5AFx4OTkAZ3JleTg5AGdyYXk4OQBceDg5ADAxMjM0NTY3ODkAZ3JleTc5AGdyYXk3OQBncmV5NjkAZ3JheTY5AGdyZXk1OQBncmF5NTkAZ3JleTQ5AGdyYXk0OQBncmV5MzkAZ3JheTM5AGdyZXkyOQBncmF5MjkAZ3JleTE5AGdyYXkxOQBceDE5AC9yZGd5OS85AC9idXB1OS85AC9yZHB1OS85AC9wdWJ1OS85AC95bGduYnU5LzkAL2duYnU5LzkAL3JkeWxidTkvOQAvcmRidTkvOQAvZ3JleXM5LzkAL2dyZWVuczkvOQAvYmx1ZXM5LzkAL3B1cnBsZXM5LzkAL29yYW5nZXM5LzkAL3JlZHM5LzkAL3B1b3I5LzkAL3lsb3JicjkvOQAvcHVidWduOS85AC9idWduOS85AC9wcmduOS85AC9yZHlsZ245LzkAL3lsZ245LzkAL3NwZWN0cmFsOS85AC9waXlnOS85AC9icmJnOS85AC9wdXJkOS85AC95bG9ycmQ5LzkAL29ycmQ5LzkAL3BhaXJlZDkvOQAvc2V0MzkvOQAvc2V0MTkvOQAvcGFzdGVsMTkvOQAvcGFpcmVkMTIvOQAvc2V0MzEyLzkAL3JkZ3kxMS85AC9yZHlsYnUxMS85AC9yZGJ1MTEvOQAvcHVvcjExLzkAL3ByZ24xMS85AC9yZHlsZ24xMS85AC9zcGVjdHJhbDExLzkAL3BpeWcxMS85AC9icmJnMTEvOQAvcGFpcmVkMTEvOQAvc2V0MzExLzkAL3JkZ3kxMC85AC9yZHlsYnUxMC85AC9yZGJ1MTAvOQAvcHVvcjEwLzkAL3ByZ24xMC85AC9yZHlsZ24xMC85AC9zcGVjdHJhbDEwLzkAL3BpeWcxMC85AC9icmJnMTAvOQAvcGFpcmVkMTAvOQAvc2V0MzEwLzkAZ3JleTgAZ3JheTgAXHg4AHV0ZjgAI2Y4ZjhmOAAjZThlOGU4AFx4RjgAR0lGOABceEU4AFx4RDgAXHhDOABceEI4AFx4QTgAZ3JleTk4AGdyYXk5OABceDk4AGdyZXk4OABncmF5ODgAXHg4OABncmV5NzgAZ3JheTc4AGdyZXk2OABncmF5NjgAZ3JleTU4AGdyYXk1OABncmV5NDgAZ3JheTQ4AGdyZXkzOABncmF5MzgAZ3JleTI4AGdyYXkyOABncmV5MTgAZ3JheTE4AFx4MTgAL3JkZ3k5LzgAL2J1cHU5LzgAL3JkcHU5LzgAL3B1YnU5LzgAL3lsZ25idTkvOAAvZ25idTkvOAAvcmR5bGJ1OS84AC9yZGJ1OS84AC9ncmV5czkvOAAvZ3JlZW5zOS84AC9ibHVlczkvOAAvcHVycGxlczkvOAAvb3JhbmdlczkvOAAvcmVkczkvOAAvcHVvcjkvOAAveWxvcmJyOS84AC9wdWJ1Z245LzgAL2J1Z245LzgAL3ByZ245LzgAL3JkeWxnbjkvOAAveWxnbjkvOAAvc3BlY3RyYWw5LzgAL3BpeWc5LzgAL2JyYmc5LzgAL3B1cmQ5LzgAL3lsb3JyZDkvOAAvb3JyZDkvOAAvcGFpcmVkOS84AC9zZXQzOS84AC9zZXQxOS84AC9wYXN0ZWwxOS84AC9yZGd5OC84AC9idXB1OC84AC9yZHB1OC84AC9wdWJ1OC84AC95bGduYnU4LzgAL2duYnU4LzgAL3JkeWxidTgvOAAvcmRidTgvOAAvYWNjZW50OC84AC9ncmV5czgvOAAvZ3JlZW5zOC84AC9ibHVlczgvOAAvcHVycGxlczgvOAAvb3JhbmdlczgvOAAvcmVkczgvOAAvcHVvcjgvOAAveWxvcmJyOC84AC9wdWJ1Z244LzgAL2J1Z244LzgAL3ByZ244LzgAL3JkeWxnbjgvOAAveWxnbjgvOAAvc3BlY3RyYWw4LzgAL3BpeWc4LzgAL2JyYmc4LzgAL3B1cmQ4LzgAL3lsb3JyZDgvOAAvb3JyZDgvOAAvcGFpcmVkOC84AC9zZXQzOC84AC9zZXQyOC84AC9wYXN0ZWwyOC84AC9kYXJrMjgvOAAvc2V0MTgvOAAvcGFzdGVsMTgvOAAvcGFpcmVkMTIvOAAvc2V0MzEyLzgAL3JkZ3kxMS84AC9yZHlsYnUxMS84AC9yZGJ1MTEvOAAvcHVvcjExLzgAL3ByZ24xMS84AC9yZHlsZ24xMS84AC9zcGVjdHJhbDExLzgAL3BpeWcxMS84AC9icmJnMTEvOAAvcGFpcmVkMTEvOAAvc2V0MzExLzgAL3JkZ3kxMC84AC9yZHlsYnUxMC84AC9yZGJ1MTAvOAAvcHVvcjEwLzgAL3ByZ24xMC84AC9yZHlsZ24xMC84AC9zcGVjdHJhbDEwLzgAL3BpeWcxMC84AC9icmJnMTAvOAAvcGFpcmVkMTAvOAAvc2V0MzEwLzgAdXRmLTgAQy5VVEYtOABncmV5NwBncmF5NwBceDcAXHhGNwBceEU3AFx4RDcAXHhDNwBceEI3AFx4QTcAZ3JleTk3AGdyYXk5NwBceDk3AGdyZXk4NwBncmF5ODcAXHg4NwBncmV5NzcAZ3JheTc3AGdyZXk2NwBncmF5NjcAZ3JleTU3AGdyYXk1NwBncmV5NDcAZ3JheTQ3AGdyZXkzNwBncmF5MzcAZ3JleTI3AGdyYXkyNwBncmV5MTcAZ3JheTE3AFx4MTcAL3JkZ3k5LzcAL2J1cHU5LzcAL3JkcHU5LzcAL3B1YnU5LzcAL3lsZ25idTkvNwAvZ25idTkvNwAvcmR5bGJ1OS83AC9yZGJ1OS83AC9ncmV5czkvNwAvZ3JlZW5zOS83AC9ibHVlczkvNwAvcHVycGxlczkvNwAvb3JhbmdlczkvNwAvcmVkczkvNwAvcHVvcjkvNwAveWxvcmJyOS83AC9wdWJ1Z245LzcAL2J1Z245LzcAL3ByZ245LzcAL3JkeWxnbjkvNwAveWxnbjkvNwAvc3BlY3RyYWw5LzcAL3BpeWc5LzcAL2JyYmc5LzcAL3B1cmQ5LzcAL3lsb3JyZDkvNwAvb3JyZDkvNwAvcGFpcmVkOS83AC9zZXQzOS83AC9zZXQxOS83AC9wYXN0ZWwxOS83AC9yZGd5OC83AC9idXB1OC83AC9yZHB1OC83AC9wdWJ1OC83AC95bGduYnU4LzcAL2duYnU4LzcAL3JkeWxidTgvNwAvcmRidTgvNwAvYWNjZW50OC83AC9ncmV5czgvNwAvZ3JlZW5zOC83AC9ibHVlczgvNwAvcHVycGxlczgvNwAvb3JhbmdlczgvNwAvcmVkczgvNwAvcHVvcjgvNwAveWxvcmJyOC83AC9wdWJ1Z244LzcAL2J1Z244LzcAL3ByZ244LzcAL3JkeWxnbjgvNwAveWxnbjgvNwAvc3BlY3RyYWw4LzcAL3BpeWc4LzcAL2JyYmc4LzcAL3B1cmQ4LzcAL3lsb3JyZDgvNwAvb3JyZDgvNwAvcGFpcmVkOC83AC9zZXQzOC83AC9zZXQyOC83AC9wYXN0ZWwyOC83AC9kYXJrMjgvNwAvc2V0MTgvNwAvcGFzdGVsMTgvNwAvcmRneTcvNwAvYnVwdTcvNwAvcmRwdTcvNwAvcHVidTcvNwAveWxnbmJ1Ny83AC9nbmJ1Ny83AC9yZHlsYnU3LzcAL3JkYnU3LzcAL2FjY2VudDcvNwAvZ3JleXM3LzcAL2dyZWVuczcvNwAvYmx1ZXM3LzcAL3B1cnBsZXM3LzcAL29yYW5nZXM3LzcAL3JlZHM3LzcAL3B1b3I3LzcAL3lsb3JicjcvNwAvcHVidWduNy83AC9idWduNy83AC9wcmduNy83AC9yZHlsZ243LzcAL3lsZ243LzcAL3NwZWN0cmFsNy83AC9waXlnNy83AC9icmJnNy83AC9wdXJkNy83AC95bG9ycmQ3LzcAL29ycmQ3LzcAL3BhaXJlZDcvNwAvc2V0MzcvNwAvc2V0MjcvNwAvcGFzdGVsMjcvNwAvZGFyazI3LzcAL3NldDE3LzcAL3Bhc3RlbDE3LzcAL3BhaXJlZDEyLzcAL3NldDMxMi83AC9yZGd5MTEvNwAvcmR5bGJ1MTEvNwAvcmRidTExLzcAL3B1b3IxMS83AC9wcmduMTEvNwAvcmR5bGduMTEvNwAvc3BlY3RyYWwxMS83AC9waXlnMTEvNwAvYnJiZzExLzcAL3BhaXJlZDExLzcAL3NldDMxMS83AC9yZGd5MTAvNwAvcmR5bGJ1MTAvNwAvcmRidTEwLzcAL3B1b3IxMC83AC9wcmduMTAvNwAvcmR5bGduMTAvNwAvc3BlY3RyYWwxMC83AC9waXlnMTAvNwAvYnJiZzEwLzcAL3BhaXJlZDEwLzcAL3NldDMxMC83ADEuNwBncmV5NgBncmF5NgBceDYAXHhGNgBceEU2AFx4RDYAXHhDNgBceEI2AFx4QTYAZ3JleTk2AGdyYXk5NgBceDk2AGdyZXk4NgBncmF5ODYAXHg4NgBncmV5NzYAZ3JheTc2AGdyZXk2NgBncmF5NjYAZ3JleTU2AGdyYXk1NgBncmV5NDYAZ3JheTQ2AGdyZXkzNgBncmF5MzYAZ3JleTI2AGdyYXkyNgBncmV5MTYAZ3JheTE2AFx4MTYAL3JkZ3k5LzYAL2J1cHU5LzYAL3JkcHU5LzYAL3B1YnU5LzYAL3lsZ25idTkvNgAvZ25idTkvNgAvcmR5bGJ1OS82AC9yZGJ1OS82AC9ncmV5czkvNgAvZ3JlZW5zOS82AC9ibHVlczkvNgAvcHVycGxlczkvNgAvb3JhbmdlczkvNgAvcmVkczkvNgAvcHVvcjkvNgAveWxvcmJyOS82AC9wdWJ1Z245LzYAL2J1Z245LzYAL3ByZ245LzYAL3JkeWxnbjkvNgAveWxnbjkvNgAvc3BlY3RyYWw5LzYAL3BpeWc5LzYAL2JyYmc5LzYAL3B1cmQ5LzYAL3lsb3JyZDkvNgAvb3JyZDkvNgAvcGFpcmVkOS82AC9zZXQzOS82AC9zZXQxOS82AC9wYXN0ZWwxOS82AC9yZGd5OC82AC9idXB1OC82AC9yZHB1OC82AC9wdWJ1OC82AC95bGduYnU4LzYAL2duYnU4LzYAL3JkeWxidTgvNgAvcmRidTgvNgAvYWNjZW50OC82AC9ncmV5czgvNgAvZ3JlZW5zOC82AC9ibHVlczgvNgAvcHVycGxlczgvNgAvb3JhbmdlczgvNgAvcmVkczgvNgAvcHVvcjgvNgAveWxvcmJyOC82AC9wdWJ1Z244LzYAL2J1Z244LzYAL3ByZ244LzYAL3JkeWxnbjgvNgAveWxnbjgvNgAvc3BlY3RyYWw4LzYAL3BpeWc4LzYAL2JyYmc4LzYAL3B1cmQ4LzYAL3lsb3JyZDgvNgAvb3JyZDgvNgAvcGFpcmVkOC82AC9zZXQzOC82AC9zZXQyOC82AC9wYXN0ZWwyOC82AC9kYXJrMjgvNgAvc2V0MTgvNgAvcGFzdGVsMTgvNgAvcmRneTcvNgAvYnVwdTcvNgAvcmRwdTcvNgAvcHVidTcvNgAveWxnbmJ1Ny82AC9nbmJ1Ny82AC9yZHlsYnU3LzYAL3JkYnU3LzYAL2FjY2VudDcvNgAvZ3JleXM3LzYAL2dyZWVuczcvNgAvYmx1ZXM3LzYAL3B1cnBsZXM3LzYAL29yYW5nZXM3LzYAL3JlZHM3LzYAL3B1b3I3LzYAL3lsb3JicjcvNgAvcHVidWduNy82AC9idWduNy82AC9wcmduNy82AC9yZHlsZ243LzYAL3lsZ243LzYAL3NwZWN0cmFsNy82AC9waXlnNy82AC9icmJnNy82AC9wdXJkNy82AC95bG9ycmQ3LzYAL29ycmQ3LzYAL3BhaXJlZDcvNgAvc2V0MzcvNgAvc2V0MjcvNgAvcGFzdGVsMjcvNgAvZGFyazI3LzYAL3NldDE3LzYAL3Bhc3RlbDE3LzYAL3JkZ3k2LzYAL2J1cHU2LzYAL3JkcHU2LzYAL3B1YnU2LzYAL3lsZ25idTYvNgAvZ25idTYvNgAvcmR5bGJ1Ni82AC9yZGJ1Ni82AC9hY2NlbnQ2LzYAL2dyZXlzNi82AC9ncmVlbnM2LzYAL2JsdWVzNi82AC9wdXJwbGVzNi82AC9vcmFuZ2VzNi82AC9yZWRzNi82AC9wdW9yNi82AC95bG9yYnI2LzYAL3B1YnVnbjYvNgAvYnVnbjYvNgAvcHJnbjYvNgAvcmR5bGduNi82AC95bGduNi82AC9zcGVjdHJhbDYvNgAvcGl5ZzYvNgAvYnJiZzYvNgAvcHVyZDYvNgAveWxvcnJkNi82AC9vcnJkNi82AC9wYWlyZWQ2LzYAL3NldDM2LzYAL3NldDI2LzYAL3Bhc3RlbDI2LzYAL2RhcmsyNi82AC9zZXQxNi82AC9wYXN0ZWwxNi82AC9wYWlyZWQxMi82AC9zZXQzMTIvNgAvcmRneTExLzYAL3JkeWxidTExLzYAL3JkYnUxMS82AC9wdW9yMTEvNgAvcHJnbjExLzYAL3JkeWxnbjExLzYAL3NwZWN0cmFsMTEvNgAvcGl5ZzExLzYAL2JyYmcxMS82AC9wYWlyZWQxMS82AC9zZXQzMTEvNgAvcmRneTEwLzYAL3JkeWxidTEwLzYAL3JkYnUxMC82AC9wdW9yMTAvNgAvcHJnbjEwLzYAL3JkeWxnbjEwLzYAL3NwZWN0cmFsMTAvNgAvcGl5ZzEwLzYAL2JyYmcxMC82AC9wYWlyZWQxMC82AC9zZXQzMTAvNgBncmV5NQBncmF5NQBceDUAYmlnNQBceEY1AFx4RTUAXHhENQBceEM1AFx4QjUAXHhBNQBncmV5OTUAZ3JheTk1AFx4OTUAZ3JleTg1AGdyYXk4NQBceDg1AGdyZXk3NQBncmF5NzUAZ3JleTY1AGdyYXk2NQBncmV5NTUAZ3JheTU1AGdyZXk0NQBncmF5NDUAZ3JleTM1AGdyYXkzNQBncmV5MjUAZ3JheTI1AGdyZXkxNQBncmF5MTUAXHgxNQBncmF5MDUAL3JkZ3k5LzUAL2J1cHU5LzUAL3JkcHU5LzUAL3B1YnU5LzUAL3lsZ25idTkvNQAvZ25idTkvNQAvcmR5bGJ1OS81AC9yZGJ1OS81AC9ncmV5czkvNQAvZ3JlZW5zOS81AC9ibHVlczkvNQAvcHVycGxlczkvNQAvb3JhbmdlczkvNQAvcmVkczkvNQAvcHVvcjkvNQAveWxvcmJyOS81AC9wdWJ1Z245LzUAL2J1Z245LzUAL3ByZ245LzUAL3JkeWxnbjkvNQAveWxnbjkvNQAvc3BlY3RyYWw5LzUAL3BpeWc5LzUAL2JyYmc5LzUAL3B1cmQ5LzUAL3lsb3JyZDkvNQAvb3JyZDkvNQAvcGFpcmVkOS81AC9zZXQzOS81AC9zZXQxOS81AC9wYXN0ZWwxOS81AC9yZGd5OC81AC9idXB1OC81AC9yZHB1OC81AC9wdWJ1OC81AC95bGduYnU4LzUAL2duYnU4LzUAL3JkeWxidTgvNQAvcmRidTgvNQAvYWNjZW50OC81AC9ncmV5czgvNQAvZ3JlZW5zOC81AC9ibHVlczgvNQAvcHVycGxlczgvNQAvb3JhbmdlczgvNQAvcmVkczgvNQAvcHVvcjgvNQAveWxvcmJyOC81AC9wdWJ1Z244LzUAL2J1Z244LzUAL3ByZ244LzUAL3JkeWxnbjgvNQAveWxnbjgvNQAvc3BlY3RyYWw4LzUAL3BpeWc4LzUAL2JyYmc4LzUAL3B1cmQ4LzUAL3lsb3JyZDgvNQAvb3JyZDgvNQAvcGFpcmVkOC81AC9zZXQzOC81AC9zZXQyOC81AC9wYXN0ZWwyOC81AC9kYXJrMjgvNQAvc2V0MTgvNQAvcGFzdGVsMTgvNQAvcmRneTcvNQAvYnVwdTcvNQAvcmRwdTcvNQAvcHVidTcvNQAveWxnbmJ1Ny81AC9nbmJ1Ny81AC9yZHlsYnU3LzUAL3JkYnU3LzUAL2FjY2VudDcvNQAvZ3JleXM3LzUAL2dyZWVuczcvNQAvYmx1ZXM3LzUAL3B1cnBsZXM3LzUAL29yYW5nZXM3LzUAL3JlZHM3LzUAL3B1b3I3LzUAL3lsb3JicjcvNQAvcHVidWduNy81AC9idWduNy81AC9wcmduNy81AC9yZHlsZ243LzUAL3lsZ243LzUAL3NwZWN0cmFsNy81AC9waXlnNy81AC9icmJnNy81AC9wdXJkNy81AC95bG9ycmQ3LzUAL29ycmQ3LzUAL3BhaXJlZDcvNQAvc2V0MzcvNQAvc2V0MjcvNQAvcGFzdGVsMjcvNQAvZGFyazI3LzUAL3NldDE3LzUAL3Bhc3RlbDE3LzUAL3JkZ3k2LzUAL2J1cHU2LzUAL3JkcHU2LzUAL3B1YnU2LzUAL3lsZ25idTYvNQAvZ25idTYvNQAvcmR5bGJ1Ni81AC9yZGJ1Ni81AC9hY2NlbnQ2LzUAL2dyZXlzNi81AC9ncmVlbnM2LzUAL2JsdWVzNi81AC9wdXJwbGVzNi81AC9vcmFuZ2VzNi81AC9yZWRzNi81AC9wdW9yNi81AC95bG9yYnI2LzUAL3B1YnVnbjYvNQAvYnVnbjYvNQAvcHJnbjYvNQAvcmR5bGduNi81AC95bGduNi81AC9zcGVjdHJhbDYvNQAvcGl5ZzYvNQAvYnJiZzYvNQAvcHVyZDYvNQAveWxvcnJkNi81AC9vcnJkNi81AC9wYWlyZWQ2LzUAL3NldDM2LzUAL3NldDI2LzUAL3Bhc3RlbDI2LzUAL2RhcmsyNi81AC9zZXQxNi81AC9wYXN0ZWwxNi81AC9yZGd5NS81AC9idXB1NS81AC9yZHB1NS81AC9wdWJ1NS81AC95bGduYnU1LzUAL2duYnU1LzUAL3JkeWxidTUvNQAvcmRidTUvNQAvYWNjZW50NS81AC9ncmV5czUvNQAvZ3JlZW5zNS81AC9ibHVlczUvNQAvcHVycGxlczUvNQAvb3JhbmdlczUvNQAvcmVkczUvNQAvcHVvcjUvNQAveWxvcmJyNS81AC9wdWJ1Z241LzUAL2J1Z241LzUAL3ByZ241LzUAL3JkeWxnbjUvNQAveWxnbjUvNQAvc3BlY3RyYWw1LzUAL3BpeWc1LzUAL2JyYmc1LzUAL3B1cmQ1LzUAL3lsb3JyZDUvNQAvb3JyZDUvNQAvcGFpcmVkNS81AC9zZXQzNS81AC9zZXQyNS81AC9wYXN0ZWwyNS81AC9kYXJrMjUvNQAvc2V0MTUvNQAvcGFzdGVsMTUvNQAvcGFpcmVkMTIvNQAvc2V0MzEyLzUAL3JkZ3kxMS81AC9yZHlsYnUxMS81AC9yZGJ1MTEvNQAvcHVvcjExLzUAL3ByZ24xMS81AC9yZHlsZ24xMS81AC9zcGVjdHJhbDExLzUAL3BpeWcxMS81AC9icmJnMTEvNQAvcGFpcmVkMTEvNQAvc2V0MzExLzUAL3JkZ3kxMC81AC9yZHlsYnUxMC81AC9yZGJ1MTAvNQAvcHVvcjEwLzUAL3ByZ24xMC81AC9yZHlsZ24xMC81AC9zcGVjdHJhbDEwLzUAL3BpeWcxMC81AC9icmJnMTAvNQAvcGFpcmVkMTAvNQAvc2V0MzEwLzUAYmlnLTUAQklHLTUAIC1kYXNoIDUAaXZvcnk0AGdyZXk0AGRhcmtzbGF0ZWdyYXk0AFx4NABzbm93NABsaWdodHllbGxvdzQAaG9uZXlkZXc0AHdoZWF0NAB0b21hdG80AHJvc3licm93bjQAbWFyb29uNABsaWdodHNhbG1vbjQAbGVtb25jaGlmZm9uNABzcHJpbmdncmVlbjQAZGFya29saXZlZ3JlZW40AHBhbGVncmVlbjQAZGFya3NlYWdyZWVuNABsaWdodGN5YW40AHRhbjQAcGx1bTQAc2Vhc2hlbGw0AGNvcmFsNABob3RwaW5rNABsaWdodHBpbms0AGRlZXBwaW5rNABjb3Juc2lsazQAZmlyZWJyaWNrNABraGFraTQAbGF2ZW5kZXJibHVzaDQAcGVhY2hwdWZmNABiaXNxdWU0AGxpZ2h0c2t5Ymx1ZTQAZGVlcHNreWJsdWU0AGxpZ2h0Ymx1ZTQAY2FkZXRibHVlNABkb2RnZXJibHVlNABsaWdodHN0ZWVsYmx1ZTQAcm95YWxibHVlNABzbGF0ZWJsdWU0AG5hdmFqb3doaXRlNABhbnRpcXVld2hpdGU0AGNob2NvbGF0ZTQAY2hhcnRyZXVzZTQAbWlzdHlyb3NlNABwYWxldHVycXVvaXNlNABhenVyZTQAdGhlcmU0AGFxdWFtYXJpbmU0AHRoaXN0bGU0AG1lZGl1bXB1cnBsZTQAZGFya29yYW5nZTQAbGlnaHRnb2xkZW5yb2Q0AGRhcmtnb2xkZW5yb2Q0AGJ1cmx5d29vZDQAZ29sZDQAbWVkaXVtb3JjaGlkNABkYXJrb3JjaGlkNABwYWxldmlvbGV0cmVkNABpbmRpYW5yZWQ0AG9yYW5nZXJlZDQAb2xpdmVkcmFiNABtYWdlbnRhNABzaWVubmE0AFx4RjQAXHhFNABceEQ0AFx4QzQAXHhCNABceEE0AGdyZXk5NABncmF5OTQAXHg5NABncmV5ODQAZ3JheTg0AFx4ODQAZ3JleTc0AGdyYXk3NABncmV5NjQAZ3JheTY0AGdyZXk1NABncmF5NTQAMjAyNjAzMDMuMDQ1NABncmV5NDQAZ3JheTQ0AGdyZXkzNABncmF5MzQAZnJhYzM0AGdyZXkyNABncmF5MjQAZ3JleTE0AGdyYXkxNABceDE0AGZyYWMxNAAvcmRneTkvNAAvYnVwdTkvNAAvcmRwdTkvNAAvcHVidTkvNAAveWxnbmJ1OS80AC9nbmJ1OS80AC9yZHlsYnU5LzQAL3JkYnU5LzQAL2dyZXlzOS80AC9ncmVlbnM5LzQAL2JsdWVzOS80AC9wdXJwbGVzOS80AC9vcmFuZ2VzOS80AC9yZWRzOS80AC9wdW9yOS80AC95bG9yYnI5LzQAL3B1YnVnbjkvNAAvYnVnbjkvNAAvcHJnbjkvNAAvcmR5bGduOS80AC95bGduOS80AC9zcGVjdHJhbDkvNAAvcGl5ZzkvNAAvYnJiZzkvNAAvcHVyZDkvNAAveWxvcnJkOS80AC9vcnJkOS80AC9wYWlyZWQ5LzQAL3NldDM5LzQAL3NldDE5LzQAL3Bhc3RlbDE5LzQAL3JkZ3k4LzQAL2J1cHU4LzQAL3JkcHU4LzQAL3B1YnU4LzQAL3lsZ25idTgvNAAvZ25idTgvNAAvcmR5bGJ1OC80AC9yZGJ1OC80AC9hY2NlbnQ4LzQAL2dyZXlzOC80AC9ncmVlbnM4LzQAL2JsdWVzOC80AC9wdXJwbGVzOC80AC9vcmFuZ2VzOC80AC9yZWRzOC80AC9wdW9yOC80AC95bG9yYnI4LzQAL3B1YnVnbjgvNAAvYnVnbjgvNAAvcHJnbjgvNAAvcmR5bGduOC80AC95bGduOC80AC9zcGVjdHJhbDgvNAAvcGl5ZzgvNAAvYnJiZzgvNAAvcHVyZDgvNAAveWxvcnJkOC80AC9vcnJkOC80AC9wYWlyZWQ4LzQAL3NldDM4LzQAL3NldDI4LzQAL3Bhc3RlbDI4LzQAL2RhcmsyOC80AC9zZXQxOC80AC9wYXN0ZWwxOC80AC9yZGd5Ny80AC9idXB1Ny80AC9yZHB1Ny80AC9wdWJ1Ny80AC95bGduYnU3LzQAL2duYnU3LzQAL3JkeWxidTcvNAAvcmRidTcvNAAvYWNjZW50Ny80AC9ncmV5czcvNAAvZ3JlZW5zNy80AC9ibHVlczcvNAAvcHVycGxlczcvNAAvb3JhbmdlczcvNAAvcmVkczcvNAAvcHVvcjcvNAAveWxvcmJyNy80AC9wdWJ1Z243LzQAL2J1Z243LzQAL3ByZ243LzQAL3JkeWxnbjcvNAAveWxnbjcvNAAvc3BlY3RyYWw3LzQAL3BpeWc3LzQAL2JyYmc3LzQAL3B1cmQ3LzQAL3lsb3JyZDcvNAAvb3JyZDcvNAAvcGFpcmVkNy80AC9zZXQzNy80AC9zZXQyNy80AC9wYXN0ZWwyNy80AC9kYXJrMjcvNAAvc2V0MTcvNAAvcGFzdGVsMTcvNAAvcmRneTYvNAAvYnVwdTYvNAAvcmRwdTYvNAAvcHVidTYvNAAveWxnbmJ1Ni80AC9nbmJ1Ni80AC9yZHlsYnU2LzQAL3JkYnU2LzQAL2FjY2VudDYvNAAvZ3JleXM2LzQAL2dyZWVuczYvNAAvYmx1ZXM2LzQAL3B1cnBsZXM2LzQAL29yYW5nZXM2LzQAL3JlZHM2LzQAL3B1b3I2LzQAL3lsb3JicjYvNAAvcHVidWduNi80AC9idWduNi80AC9wcmduNi80AC9yZHlsZ242LzQAL3lsZ242LzQAL3NwZWN0cmFsNi80AC9waXlnNi80AC9icmJnNi80AC9wdXJkNi80AC95bG9ycmQ2LzQAL29ycmQ2LzQAL3BhaXJlZDYvNAAvc2V0MzYvNAAvc2V0MjYvNAAvcGFzdGVsMjYvNAAvZGFyazI2LzQAL3NldDE2LzQAL3Bhc3RlbDE2LzQAL3JkZ3k1LzQAL2J1cHU1LzQAL3JkcHU1LzQAL3B1YnU1LzQAL3lsZ25idTUvNAAvZ25idTUvNAAvcmR5bGJ1NS80AC9yZGJ1NS80AC9hY2NlbnQ1LzQAL2dyZXlzNS80AC9ncmVlbnM1LzQAL2JsdWVzNS80AC9wdXJwbGVzNS80AC9vcmFuZ2VzNS80AC9yZWRzNS80AC9wdW9yNS80AC95bG9yYnI1LzQAL3B1YnVnbjUvNAAvYnVnbjUvNAAvcHJnbjUvNAAvcmR5bGduNS80AC95bGduNS80AC9zcGVjdHJhbDUvNAAvcGl5ZzUvNAAvYnJiZzUvNAAvcHVyZDUvNAAveWxvcnJkNS80AC9vcnJkNS80AC9wYWlyZWQ1LzQAL3NldDM1LzQAL3NldDI1LzQAL3Bhc3RlbDI1LzQAL2RhcmsyNS80AC9zZXQxNS80AC9wYXN0ZWwxNS80AC9yZGd5NC80AC9idXB1NC80AC9yZHB1NC80AC9wdWJ1NC80AC95bGduYnU0LzQAL2duYnU0LzQAL3JkeWxidTQvNAAvcmRidTQvNAAvYWNjZW50NC80AC9ncmV5czQvNAAvZ3JlZW5zNC80AC9ibHVlczQvNAAvcHVycGxlczQvNAAvb3JhbmdlczQvNAAvcmVkczQvNAAvcHVvcjQvNAAveWxvcmJyNC80AC9wdWJ1Z240LzQAL2J1Z240LzQAL3ByZ240LzQAL3JkeWxnbjQvNAAveWxnbjQvNAAvc3BlY3RyYWw0LzQAL3BpeWc0LzQAL2JyYmc0LzQAL3B1cmQ0LzQAL3lsb3JyZDQvNAAvb3JyZDQvNAAvcGFpcmVkNC80AC9zZXQzNC80AC9zZXQyNC80AC9wYXN0ZWwyNC80AC9kYXJrMjQvNAAvc2V0MTQvNAAvcGFzdGVsMTQvNAAvcGFpcmVkMTIvNAAvc2V0MzEyLzQAL3JkZ3kxMS80AC9yZHlsYnUxMS80AC9yZGJ1MTEvNAAvcHVvcjExLzQAL3ByZ24xMS80AC9yZHlsZ24xMS80AC9zcGVjdHJhbDExLzQAL3BpeWcxMS80AC9icmJnMTEvNAAvcGFpcmVkMTEvNAAvc2V0MzExLzQAL3JkZ3kxMC80AC9yZHlsYnUxMC80AC9yZGJ1MTAvNAAvcHVvcjEwLzQAL3ByZ24xMC80AC9yZHlsZ24xMC80AC9zcGVjdHJhbDEwLzQAL3BpeWcxMC80AC9icmJnMTAvNAAvcGFpcmVkMTAvNAAvc2V0MzEwLzQAMS40AG4gPj0gNABzaWRlcyA9PSA0AGl2b3J5MwBTcGFyc2VNYXRyaXhfbXVsdGlwbHkzAGdyZXkzAGRhcmtzbGF0ZWdyYXkzAFx4MwBzbm93MwBsaWdodHllbGxvdzMAaG9uZXlkZXczAHdoZWF0MwBzdXAzAHRvbWF0bzMAcm9zeWJyb3duMwBtYXJvb24zAGxpZ2h0c2FsbW9uMwBsZW1vbmNoaWZmb24zAHNwcmluZ2dyZWVuMwBkYXJrb2xpdmVncmVlbjMAcGFsZWdyZWVuMwBkYXJrc2VhZ3JlZW4zAGxpZ2h0Y3lhbjMAdGFuMwBwbHVtMwBzZWFzaGVsbDMAY29yYWwzAGhvdHBpbmszAGxpZ2h0cGluazMAZGVlcHBpbmszAGNvcm5zaWxrMwBmaXJlYnJpY2szAGtoYWtpMwBsYXZlbmRlcmJsdXNoMwBwZWFjaHB1ZmYzAGJpc3F1ZTMAbGlnaHRza3libHVlMwBkZWVwc2t5Ymx1ZTMAbGlnaHRibHVlMwBjYWRldGJsdWUzAGRvZGdlcmJsdWUzAGxpZ2h0c3RlZWxibHVlMwByb3lhbGJsdWUzAHNsYXRlYmx1ZTMAbmF2YWpvd2hpdGUzAGFudGlxdWV3aGl0ZTMAY2hvY29sYXRlMwBjaGFydHJldXNlMwBtaXN0eXJvc2UzAHBhbGV0dXJxdW9pc2UzAGF6dXJlMwBhcXVhbWFyaW5lMwB0aGlzdGxlMwBtZWRpdW1wdXJwbGUzAGRhcmtvcmFuZ2UzAGxpZ2h0Z29sZGVucm9kMwBkYXJrZ29sZGVucm9kMwBidXJseXdvb2QzAGdvbGQzAG1lZGl1bW9yY2hpZDMAZGFya29yY2hpZDMAcGFsZXZpb2xldHJlZDMAaW5kaWFucmVkMwBvcmFuZ2VyZWQzAG9saXZlZHJhYjMAbWFnZW50YTMAc2llbm5hMwBceEYzAFx4RTMAXHhEMwBceEMzAFx4QjMAXHhBMwBncmV5OTMAZ3JheTkzAFx4OTMAZ3JleTgzAGdyYXk4MwBceDgzAGdyZXk3MwBncmF5NzMAZ3JleTYzAGdyYXk2MwBncmV5NTMAZ3JheTUzAFNUU0laRShuZXh0KSA8PSBVSU5UNjRfQygxKSA8PCA1MwBTVFNJWkUobikgPD0gVUlOVDY0X0MoMSkgPDwgNTMAZ3JleTQzAGdyYXk0MwBncmV5MzMAZ3JheTMzAGdyZXkyMwBncmF5MjMAZ3JleTEzAGdyYXkxMwBceDEzAC9yZGd5OS8zAC9idXB1OS8zAC9yZHB1OS8zAC9wdWJ1OS8zAC95bGduYnU5LzMAL2duYnU5LzMAL3JkeWxidTkvMwAvcmRidTkvMwAvZ3JleXM5LzMAL2dyZWVuczkvMwAvYmx1ZXM5LzMAL3B1cnBsZXM5LzMAL29yYW5nZXM5LzMAL3JlZHM5LzMAL3B1b3I5LzMAL3lsb3JicjkvMwAvcHVidWduOS8zAC9idWduOS8zAC9wcmduOS8zAC9yZHlsZ245LzMAL3lsZ245LzMAL3NwZWN0cmFsOS8zAC9waXlnOS8zAC9icmJnOS8zAC9wdXJkOS8zAC95bG9ycmQ5LzMAL29ycmQ5LzMAL3BhaXJlZDkvMwAvc2V0MzkvMwAvc2V0MTkvMwAvcGFzdGVsMTkvMwAvcmRneTgvMwAvYnVwdTgvMwAvcmRwdTgvMwAvcHVidTgvMwAveWxnbmJ1OC8zAC9nbmJ1OC8zAC9yZHlsYnU4LzMAL3JkYnU4LzMAL2FjY2VudDgvMwAvZ3JleXM4LzMAL2dyZWVuczgvMwAvYmx1ZXM4LzMAL3B1cnBsZXM4LzMAL29yYW5nZXM4LzMAL3JlZHM4LzMAL3B1b3I4LzMAL3lsb3JicjgvMwAvcHVidWduOC8zAC9idWduOC8zAC9wcmduOC8zAC9yZHlsZ244LzMAL3lsZ244LzMAL3NwZWN0cmFsOC8zAC9waXlnOC8zAC9icmJnOC8zAC9wdXJkOC8zAC95bG9ycmQ4LzMAL29ycmQ4LzMAL3BhaXJlZDgvMwAvc2V0MzgvMwAvc2V0MjgvMwAvcGFzdGVsMjgvMwAvZGFyazI4LzMAL3NldDE4LzMAL3Bhc3RlbDE4LzMAL3JkZ3k3LzMAL2J1cHU3LzMAL3JkcHU3LzMAL3B1YnU3LzMAL3lsZ25idTcvMwAvZ25idTcvMwAvcmR5bGJ1Ny8zAC9yZGJ1Ny8zAC9hY2NlbnQ3LzMAL2dyZXlzNy8zAC9ncmVlbnM3LzMAL2JsdWVzNy8zAC9wdXJwbGVzNy8zAC9vcmFuZ2VzNy8zAC9yZWRzNy8zAC9wdW9yNy8zAC95bG9yYnI3LzMAL3B1YnVnbjcvMwAvYnVnbjcvMwAvcHJnbjcvMwAvcmR5bGduNy8zAC95bGduNy8zAC9zcGVjdHJhbDcvMwAvcGl5ZzcvMwAvYnJiZzcvMwAvcHVyZDcvMwAveWxvcnJkNy8zAC9vcnJkNy8zAC9wYWlyZWQ3LzMAL3NldDM3LzMAL3NldDI3LzMAL3Bhc3RlbDI3LzMAL2RhcmsyNy8zAC9zZXQxNy8zAC9wYXN0ZWwxNy8zAC9yZGd5Ni8zAC9idXB1Ni8zAC9yZHB1Ni8zAC9wdWJ1Ni8zAC95bGduYnU2LzMAL2duYnU2LzMAL3JkeWxidTYvMwAvcmRidTYvMwAvYWNjZW50Ni8zAC9ncmV5czYvMwAvZ3JlZW5zNi8zAC9ibHVlczYvMwAvcHVycGxlczYvMwAvb3JhbmdlczYvMwAvcmVkczYvMwAvcHVvcjYvMwAveWxvcmJyNi8zAC9wdWJ1Z242LzMAL2J1Z242LzMAL3ByZ242LzMAL3JkeWxnbjYvMwAveWxnbjYvMwAvc3BlY3RyYWw2LzMAL3BpeWc2LzMAL2JyYmc2LzMAL3B1cmQ2LzMAL3lsb3JyZDYvMwAvb3JyZDYvMwAvcGFpcmVkNi8zAC9zZXQzNi8zAC9zZXQyNi8zAC9wYXN0ZWwyNi8zAC9kYXJrMjYvMwAvc2V0MTYvMwAvcGFzdGVsMTYvMwAvcmRneTUvMwAvYnVwdTUvMwAvcmRwdTUvMwAvcHVidTUvMwAveWxnbmJ1NS8zAC9nbmJ1NS8zAC9yZHlsYnU1LzMAL3JkYnU1LzMAL2FjY2VudDUvMwAvZ3JleXM1LzMAL2dyZWVuczUvMwAvYmx1ZXM1LzMAL3B1cnBsZXM1LzMAL29yYW5nZXM1LzMAL3JlZHM1LzMAL3B1b3I1LzMAL3lsb3JicjUvMwAvcHVidWduNS8zAC9idWduNS8zAC9wcmduNS8zAC9yZHlsZ241LzMAL3lsZ241LzMAL3NwZWN0cmFsNS8zAC9waXlnNS8zAC9icmJnNS8zAC9wdXJkNS8zAC95bG9ycmQ1LzMAL29ycmQ1LzMAL3BhaXJlZDUvMwAvc2V0MzUvMwAvc2V0MjUvMwAvcGFzdGVsMjUvMwAvZGFyazI1LzMAL3NldDE1LzMAL3Bhc3RlbDE1LzMAL3JkZ3k0LzMAL2J1cHU0LzMAL3JkcHU0LzMAL3B1YnU0LzMAL3lsZ25idTQvMwAvZ25idTQvMwAvcmR5bGJ1NC8zAC9yZGJ1NC8zAC9hY2NlbnQ0LzMAL2dyZXlzNC8zAC9ncmVlbnM0LzMAL2JsdWVzNC8zAC9wdXJwbGVzNC8zAC9vcmFuZ2VzNC8zAC9yZWRzNC8zAC9wdW9yNC8zAC95bG9yYnI0LzMAL3B1YnVnbjQvMwAvYnVnbjQvMwAvcHJnbjQvMwAvcmR5bGduNC8zAC95bGduNC8zAC9zcGVjdHJhbDQvMwAvcGl5ZzQvMwAvYnJiZzQvMwAvcHVyZDQvMwAveWxvcnJkNC8zAC9vcnJkNC8zAC9wYWlyZWQ0LzMAL3NldDM0LzMAL3NldDI0LzMAL3Bhc3RlbDI0LzMAL2RhcmsyNC8zAC9zZXQxNC8zAC9wYXN0ZWwxNC8zAC9yZGd5My8zAC9idXB1My8zAC9yZHB1My8zAC9wdWJ1My8zAC95bGduYnUzLzMAL2duYnUzLzMAL3JkeWxidTMvMwAvcmRidTMvMwAvYWNjZW50My8zAC9ncmV5czMvMwAvZ3JlZW5zMy8zAC9ibHVlczMvMwAvcHVycGxlczMvMwAvb3JhbmdlczMvMwAvcmVkczMvMwAvcHVvcjMvMwAveWxvcmJyMy8zAC9wdWJ1Z24zLzMAL2J1Z24zLzMAL3ByZ24zLzMAL3JkeWxnbjMvMwAveWxnbjMvMwAvc3BlY3RyYWwzLzMAL3BpeWczLzMAL2JyYmczLzMAL3B1cmQzLzMAL3lsb3JyZDMvMwAvb3JyZDMvMwAvcGFpcmVkMy8zAC9zZXQzMy8zAC9zZXQyMy8zAC9wYXN0ZWwyMy8zAC9kYXJrMjMvMwAvc2V0MTMvMwAvcGFzdGVsMTMvMwAvcGFpcmVkMTIvMwAvc2V0MzEyLzMAL3JkZ3kxMS8zAC9yZHlsYnUxMS8zAC9yZGJ1MTEvMwAvcHVvcjExLzMAL3ByZ24xMS8zAC9yZHlsZ24xMS8zAC9zcGVjdHJhbDExLzMAL3BpeWcxMS8zAC9icmJnMTEvMwAvcGFpcmVkMTEvMwAvc2V0MzExLzMAL3JkZ3kxMC8zAC9yZHlsYnUxMC8zAC9yZGJ1MTAvMwAvcHVvcjEwLzMAL3ByZ24xMC8zAC9yZHlsZ24xMC8zAC9zcGVjdHJhbDEwLzMAL3BpeWcxMC8zAC9icmJnMTAvMwAvcGFpcmVkMTAvMwAvc2V0MzEwLzMAMTQuMS4zAGl2b3J5MgBncmV5MgBkYXJrc2xhdGVncmF5MgBceDIAc25vdzIAbGlnaHR5ZWxsb3cyAGhvbmV5ZGV3MgBSVHJlZUluc2VydDIAd2hlYXQyAHN1cDIAbm9wMgB0b21hdG8yAHJvc3licm93bjIAbWFyb29uMgBsaWdodHNhbG1vbjIAbGVtb25jaGlmZm9uMgBzcHJpbmdncmVlbjIAZGFya29saXZlZ3JlZW4yAHBhbGVncmVlbjIAZGFya3NlYWdyZWVuMgBsaWdodGN5YW4yAHRhbjIAcGx1bTIAc2Vhc2hlbGwyAGNvcmFsMgBob3RwaW5rMgBsaWdodHBpbmsyAGRlZXBwaW5rMgBjb3Juc2lsazIAZmlyZWJyaWNrMgBraGFraTIAbGF2ZW5kZXJibHVzaDIAcGVhY2hwdWZmMgBicm9uemUyAGJpc3F1ZTIAbGlnaHRza3libHVlMgBkZWVwc2t5Ymx1ZTIAbGlnaHRibHVlMgBjYWRldGJsdWUyAGRvZGdlcmJsdWUyAGxpZ2h0c3RlZWxibHVlMgByb3lhbGJsdWUyAHNsYXRlYmx1ZTIAbmF2YWpvd2hpdGUyAGFudGlxdWV3aGl0ZTIAY2hvY29sYXRlMgBjaGFydHJldXNlMgBtaXN0eXJvc2UyAHBhbGV0dXJxdW9pc2UyAGF6dXJlMgBhcXVhbWFyaW5lMgB0aGlzdGxlMgBtZWRpdW1wdXJwbGUyAGRhcmtvcmFuZ2UyAGxpZ2h0Z29sZGVucm9kMgBkYXJrZ29sZGVucm9kMgBidXJseXdvb2QyAGdvbGQyAG1lZGl1bW9yY2hpZDIAZGFya29yY2hpZDIAcGFsZXZpb2xldHJlZDIAaW5kaWFucmVkMgBvcmFuZ2VyZWQyAG9saXZlZHJhYjIAbWFnZW50YTIAc2llbm5hMgBceEYyAFx4RTIAXHhEMgBceEMyAFx4QjIAXHhBMgBncmV5OTIAZ3JheTkyAFx4OTIAZ3JleTgyAGdyYXk4MgBceDgyAGdyZXk3MgBncmF5NzIAZ3JleTYyAGdyYXk2MgBncmV5NTIAZ3JheTUyAGdyZXk0MgBncmF5NDIAZ3JleTMyAGdyYXkzMgBncmV5MjIAZ3JheTIyAGdyZXkxMgBncmF5MTIAXHgxMgBmcmFjMTIAL3BhaXJlZDEyLzEyAC9zZXQzMTIvMTIAL3JkZ3k5LzIAL2J1cHU5LzIAL3JkcHU5LzIAL3B1YnU5LzIAL3lsZ25idTkvMgAvZ25idTkvMgAvcmR5bGJ1OS8yAC9yZGJ1OS8yAC9ncmV5czkvMgAvZ3JlZW5zOS8yAC9ibHVlczkvMgAvcHVycGxlczkvMgAvb3JhbmdlczkvMgAvcmVkczkvMgAvcHVvcjkvMgAveWxvcmJyOS8yAC9wdWJ1Z245LzIAL2J1Z245LzIAL3ByZ245LzIAL3JkeWxnbjkvMgAveWxnbjkvMgAvc3BlY3RyYWw5LzIAL3BpeWc5LzIAL2JyYmc5LzIAL3B1cmQ5LzIAL3lsb3JyZDkvMgAvb3JyZDkvMgAvcGFpcmVkOS8yAC9zZXQzOS8yAC9zZXQxOS8yAC9wYXN0ZWwxOS8yAC9yZGd5OC8yAC9idXB1OC8yAC9yZHB1OC8yAC9wdWJ1OC8yAC95bGduYnU4LzIAL2duYnU4LzIAL3JkeWxidTgvMgAvcmRidTgvMgAvYWNjZW50OC8yAC9ncmV5czgvMgAvZ3JlZW5zOC8yAC9ibHVlczgvMgAvcHVycGxlczgvMgAvb3JhbmdlczgvMgAvcmVkczgvMgAvcHVvcjgvMgAveWxvcmJyOC8yAC9wdWJ1Z244LzIAL2J1Z244LzIAL3ByZ244LzIAL3JkeWxnbjgvMgAveWxnbjgvMgAvc3BlY3RyYWw4LzIAL3BpeWc4LzIAL2JyYmc4LzIAL3B1cmQ4LzIAL3lsb3JyZDgvMgAvb3JyZDgvMgAvcGFpcmVkOC8yAC9zZXQzOC8yAC9zZXQyOC8yAC9wYXN0ZWwyOC8yAC9kYXJrMjgvMgAvc2V0MTgvMgAvcGFzdGVsMTgvMgAvcmRneTcvMgAvYnVwdTcvMgAvcmRwdTcvMgAvcHVidTcvMgAveWxnbmJ1Ny8yAC9nbmJ1Ny8yAC9yZHlsYnU3LzIAL3JkYnU3LzIAL2FjY2VudDcvMgAvZ3JleXM3LzIAL2dyZWVuczcvMgAvYmx1ZXM3LzIAL3B1cnBsZXM3LzIAL29yYW5nZXM3LzIAL3JlZHM3LzIAL3B1b3I3LzIAL3lsb3JicjcvMgAvcHVidWduNy8yAC9idWduNy8yAC9wcmduNy8yAC9yZHlsZ243LzIAL3lsZ243LzIAL3NwZWN0cmFsNy8yAC9waXlnNy8yAC9icmJnNy8yAC9wdXJkNy8yAC95bG9ycmQ3LzIAL29ycmQ3LzIAL3BhaXJlZDcvMgAvc2V0MzcvMgAvc2V0MjcvMgAvcGFzdGVsMjcvMgAvZGFyazI3LzIAL3NldDE3LzIAL3Bhc3RlbDE3LzIAL3JkZ3k2LzIAL2J1cHU2LzIAL3JkcHU2LzIAL3B1YnU2LzIAL3lsZ25idTYvMgAvZ25idTYvMgAvcmR5bGJ1Ni8yAC9yZGJ1Ni8yAC9hY2NlbnQ2LzIAL2dyZXlzNi8yAC9ncmVlbnM2LzIAL2JsdWVzNi8yAC9wdXJwbGVzNi8yAC9vcmFuZ2VzNi8yAC9yZWRzNi8yAC9wdW9yNi8yAC95bG9yYnI2LzIAL3B1YnVnbjYvMgAvYnVnbjYvMgAvcHJnbjYvMgAvcmR5bGduNi8yAC95bGduNi8yAC9zcGVjdHJhbDYvMgAvcGl5ZzYvMgAvYnJiZzYvMgAvcHVyZDYvMgAveWxvcnJkNi8yAC9vcnJkNi8yAC9wYWlyZWQ2LzIAL3NldDM2LzIAL3NldDI2LzIAL3Bhc3RlbDI2LzIAL2RhcmsyNi8yAC9zZXQxNi8yAC9wYXN0ZWwxNi8yAC9yZGd5NS8yAC9idXB1NS8yAC9yZHB1NS8yAC9wdWJ1NS8yAC95bGduYnU1LzIAL2duYnU1LzIAL3JkeWxidTUvMgAvcmRidTUvMgAvYWNjZW50NS8yAC9ncmV5czUvMgAvZ3JlZW5zNS8yAC9ibHVlczUvMgAvcHVycGxlczUvMgAvb3JhbmdlczUvMgAvcmVkczUvMgAvcHVvcjUvMgAveWxvcmJyNS8yAC9wdWJ1Z241LzIAL2J1Z241LzIAL3ByZ241LzIAL3JkeWxnbjUvMgAveWxnbjUvMgAvc3BlY3RyYWw1LzIAL3BpeWc1LzIAL2JyYmc1LzIAL3B1cmQ1LzIAL3lsb3JyZDUvMgAvb3JyZDUvMgAvcGFpcmVkNS8yAC9zZXQzNS8yAC9zZXQyNS8yAC9wYXN0ZWwyNS8yAC9kYXJrMjUvMgAvc2V0MTUvMgAvcGFzdGVsMTUvMgAvcmRneTQvMgAvYnVwdTQvMgAvcmRwdTQvMgAvcHVidTQvMgAveWxnbmJ1NC8yAC9nbmJ1NC8yAC9yZHlsYnU0LzIAL3JkYnU0LzIAL2FjY2VudDQvMgAvZ3JleXM0LzIAL2dyZWVuczQvMgAvYmx1ZXM0LzIAL3B1cnBsZXM0LzIAL29yYW5nZXM0LzIAL3JlZHM0LzIAL3B1b3I0LzIAL3lsb3JicjQvMgAvcHVidWduNC8yAC9idWduNC8yAC9wcmduNC8yAC9yZHlsZ240LzIAL3lsZ240LzIAL3NwZWN0cmFsNC8yAC9waXlnNC8yAC9icmJnNC8yAC9wdXJkNC8yAC95bG9ycmQ0LzIAL29ycmQ0LzIAL3BhaXJlZDQvMgAvc2V0MzQvMgAvc2V0MjQvMgAvcGFzdGVsMjQvMgAvZGFyazI0LzIAL3NldDE0LzIAL3Bhc3RlbDE0LzIAL3JkZ3kzLzIAL2J1cHUzLzIAL3JkcHUzLzIAL3B1YnUzLzIAL3lsZ25idTMvMgAvZ25idTMvMgAvcmR5bGJ1My8yAC9yZGJ1My8yAC9hY2NlbnQzLzIAL2dyZXlzMy8yAC9ncmVlbnMzLzIAL2JsdWVzMy8yAC9wdXJwbGVzMy8yAC9vcmFuZ2VzMy8yAC9yZWRzMy8yAC9wdW9yMy8yAC95bG9yYnIzLzIAL3B1YnVnbjMvMgAvYnVnbjMvMgAvcHJnbjMvMgAvcmR5bGduMy8yAC95bGduMy8yAC9zcGVjdHJhbDMvMgAvcGl5ZzMvMgAvYnJiZzMvMgAvcHVyZDMvMgAveWxvcnJkMy8yAC9vcnJkMy8yAC9wYWlyZWQzLzIAL3NldDMzLzIAL3NldDIzLzIAL3Bhc3RlbDIzLzIAL2RhcmsyMy8yAC9zZXQxMy8yAC9wYXN0ZWwxMy8yAC9wYWlyZWQxMi8yAC9zZXQzMTIvMgAvcmRneTExLzIAL3JkeWxidTExLzIAL3JkYnUxMS8yAC9wdW9yMTEvMgAvcHJnbjExLzIAL3JkeWxnbjExLzIAL3NwZWN0cmFsMTEvMgAvcGl5ZzExLzIAL2JyYmcxMS8yAC9wYWlyZWQxMS8yAC9zZXQzMTEvMgAvcmRneTEwLzIAL3JkeWxidTEwLzIAL3JkYnUxMC8yAC9wdW9yMTAvMgAvcHJnbjEwLzIAL3JkeWxnbjEwLzIAL3NwZWN0cmFsMTAvMgAvcGl5ZzEwLzIAL2JyYmcxMC8yAC9wYWlyZWQxMC8yAC9zZXQzMTAvMgAxLjIAIC1kYXNoIDIAbGVuID49IDIAZXhwID09IDEgfHwgZXhwID09IDIAZGltID09IDIATkRfb3V0KHYpLnNpemUgPT0gMgBpdm9yeTEAZ3JleTEAZGFya3NsYXRlZ3JheTEAXHgxAHNub3cxAGxpZ2h0eWVsbG93MQBob25leWRldzEAbnNsaW1pdDEAd2hlYXQxAHN1cDEAbm9wMQB0b21hdG8xAHJvc3licm93bjEAbWFyb29uMQBsaWdodHNhbG1vbjEAbGVtb25jaGlmZm9uMQBsYXRpbjEAYWdvcGVuMQBzcHJpbmdncmVlbjEAZGFya29saXZlZ3JlZW4xAHBhbGVncmVlbjEAZGFya3NlYWdyZWVuMQBsaWdodGN5YW4xAHRhbjEAcGx1bTEAc2Vhc2hlbGwxAGNvcmFsMQBob3RwaW5rMQBsaWdodHBpbmsxAGRlZXBwaW5rMQBjb3Juc2lsazEAZmlyZWJyaWNrMQBqMCA8PSBpMSAmJiBpMSA8PSBqMQBraGFraTEAbGF2ZW5kZXJibHVzaDEAcGVhY2hwdWZmMQBiaXNxdWUxAGxpZ2h0c2t5Ymx1ZTEAZGVlcHNreWJsdWUxAGxpZ2h0Ymx1ZTEAY2FkZXRibHVlMQBkb2RnZXJibHVlMQBsaWdodHN0ZWVsYmx1ZTEAcm95YWxibHVlMQBzbGF0ZWJsdWUxAG5hdmFqb3doaXRlMQBhbnRpcXVld2hpdGUxAGNob2NvbGF0ZTEAY2hhcnRyZXVzZTEAbWlzdHlyb3NlMQBwYWxldHVycXVvaXNlMQBhenVyZTEAYXF1YW1hcmluZTEAdGhpc3RsZTEAbWVkaXVtcHVycGxlMQBkYXJrb3JhbmdlMQBhcmdfZTAgJiYgYXJnX2UxAGxpZ2h0Z29sZGVucm9kMQBkYXJrZ29sZGVucm9kMQBidXJseXdvb2QxAGdvbGQxAG1lZGl1bW9yY2hpZDEAZGFya29yY2hpZDEAcGFsZXZpb2xldHJlZDEAaW5kaWFucmVkMQBvcmFuZ2VyZWQxAG9saXZlZHJhYjEAbWFnZW50YTEAc2llbm5hMQBceEYxAFx4RTEAXHhEMQBceEMxAFx4QjEAXHhBMQBncmV5OTEAZ3JheTkxAFx4OTEAZ3JleTgxAGdyYXk4MQBceDgxAGdyZXk3MQBncmF5NzEAZ3JleTYxAGdyYXk2MQBncmV5NTEAZ3JheTUxAGdyZXk0MQBncmF5NDEAZ3JleTMxAGdyYXkzMQBncmV5MjEAZ3JheTIxAGdyZXkxMQBncmF5MTEAXHgxMQAvcGFpcmVkMTIvMTEAL3NldDMxMi8xMQAvcmRneTExLzExAC9yZHlsYnUxMS8xMQAvcmRidTExLzExAC9wdW9yMTEvMTEAL3ByZ24xMS8xMQAvcmR5bGduMTEvMTEAL3NwZWN0cmFsMTEvMTEAL3BpeWcxMS8xMQAvYnJiZzExLzExAC9wYWlyZWQxMS8xMQAvc2V0MzExLzExAGNzW2ldLT5zbGFjaygpPi0wLjAwMDAwMDEAL3JkZ3k5LzEAL2J1cHU5LzEAL3JkcHU5LzEAL3B1YnU5LzEAL3lsZ25idTkvMQAvZ25idTkvMQAvcmR5bGJ1OS8xAC9yZGJ1OS8xAC9ncmV5czkvMQAvZ3JlZW5zOS8xAC9ibHVlczkvMQAvcHVycGxlczkvMQAvb3JhbmdlczkvMQAvcmVkczkvMQAvcHVvcjkvMQAveWxvcmJyOS8xAC9wdWJ1Z245LzEAL2J1Z245LzEAL3ByZ245LzEAL3JkeWxnbjkvMQAveWxnbjkvMQAvc3BlY3RyYWw5LzEAL3BpeWc5LzEAL2JyYmc5LzEAL3B1cmQ5LzEAL3lsb3JyZDkvMQAvb3JyZDkvMQAvcGFpcmVkOS8xAC9zZXQzOS8xAC9zZXQxOS8xAC9wYXN0ZWwxOS8xAC9yZGd5OC8xAC9idXB1OC8xAC9yZHB1OC8xAC9wdWJ1OC8xAC95bGduYnU4LzEAL2duYnU4LzEAL3JkeWxidTgvMQAvcmRidTgvMQAvYWNjZW50OC8xAC9ncmV5czgvMQAvZ3JlZW5zOC8xAC9ibHVlczgvMQAvcHVycGxlczgvMQAvb3JhbmdlczgvMQAvcmVkczgvMQAvcHVvcjgvMQAveWxvcmJyOC8xAC9wdWJ1Z244LzEAL2J1Z244LzEAL3ByZ244LzEAL3JkeWxnbjgvMQAveWxnbjgvMQAvc3BlY3RyYWw4LzEAL3BpeWc4LzEAL2JyYmc4LzEAL3B1cmQ4LzEAL3lsb3JyZDgvMQAvb3JyZDgvMQAvcGFpcmVkOC8xAC9zZXQzOC8xAC9zZXQyOC8xAC9wYXN0ZWwyOC8xAC9kYXJrMjgvMQAvc2V0MTgvMQAvcGFzdGVsMTgvMQAvcmRneTcvMQAvYnVwdTcvMQAvcmRwdTcvMQAvcHVidTcvMQAveWxnbmJ1Ny8xAC9nbmJ1Ny8xAC9yZHlsYnU3LzEAL3JkYnU3LzEAL2FjY2VudDcvMQAvZ3JleXM3LzEAL2dyZWVuczcvMQAvYmx1ZXM3LzEAL3B1cnBsZXM3LzEAL29yYW5nZXM3LzEAL3JlZHM3LzEAL3B1b3I3LzEAL3lsb3JicjcvMQAvcHVidWduNy8xAC9idWduNy8xAC9wcmduNy8xAC9yZHlsZ243LzEAL3lsZ243LzEAL3NwZWN0cmFsNy8xAC9waXlnNy8xAC9icmJnNy8xAC9wdXJkNy8xAC95bG9ycmQ3LzEAL29ycmQ3LzEAL3BhaXJlZDcvMQAvc2V0MzcvMQAvc2V0MjcvMQAvcGFzdGVsMjcvMQAvZGFyazI3LzEAL3NldDE3LzEAL3Bhc3RlbDE3LzEAL3JkZ3k2LzEAL2J1cHU2LzEAL3JkcHU2LzEAL3B1YnU2LzEAL3lsZ25idTYvMQAvZ25idTYvMQAvcmR5bGJ1Ni8xAC9yZGJ1Ni8xAC9hY2NlbnQ2LzEAL2dyZXlzNi8xAC9ncmVlbnM2LzEAL2JsdWVzNi8xAC9wdXJwbGVzNi8xAC9vcmFuZ2VzNi8xAC9yZWRzNi8xAC9wdW9yNi8xAC95bG9yYnI2LzEAL3B1YnVnbjYvMQAvYnVnbjYvMQAvcHJnbjYvMQAvcmR5bGduNi8xAC95bGduNi8xAC9zcGVjdHJhbDYvMQAvcGl5ZzYvMQAvYnJiZzYvMQAvcHVyZDYvMQAveWxvcnJkNi8xAC9vcnJkNi8xAC9wYWlyZWQ2LzEAL3NldDM2LzEAL3NldDI2LzEAL3Bhc3RlbDI2LzEAL2RhcmsyNi8xAC9zZXQxNi8xAC9wYXN0ZWwxNi8xAC9yZGd5NS8xAC9idXB1NS8xAC9yZHB1NS8xAC9wdWJ1NS8xAC95bGduYnU1LzEAL2duYnU1LzEAL3JkeWxidTUvMQAvcmRidTUvMQAvYWNjZW50NS8xAC9ncmV5czUvMQAvZ3JlZW5zNS8xAC9ibHVlczUvMQAvcHVycGxlczUvMQAvb3JhbmdlczUvMQAvcmVkczUvMQAvcHVvcjUvMQAveWxvcmJyNS8xAC9wdWJ1Z241LzEAL2J1Z241LzEAL3ByZ241LzEAL3JkeWxnbjUvMQAveWxnbjUvMQAvc3BlY3RyYWw1LzEAL3BpeWc1LzEAL2JyYmc1LzEAL3B1cmQ1LzEAL3lsb3JyZDUvMQAvb3JyZDUvMQAvcGFpcmVkNS8xAC9zZXQzNS8xAC9zZXQyNS8xAC9wYXN0ZWwyNS8xAC9kYXJrMjUvMQAvc2V0MTUvMQAvcGFzdGVsMTUvMQAvcmRneTQvMQAvYnVwdTQvMQAvcmRwdTQvMQAvcHVidTQvMQAveWxnbmJ1NC8xAC9nbmJ1NC8xAC9yZHlsYnU0LzEAL3JkYnU0LzEAL2FjY2VudDQvMQAvZ3JleXM0LzEAL2dyZWVuczQvMQAvYmx1ZXM0LzEAL3B1cnBsZXM0LzEAL29yYW5nZXM0LzEAL3JlZHM0LzEAL3B1b3I0LzEAL3lsb3JicjQvMQAvcHVidWduNC8xAC9idWduNC8xAC9wcmduNC8xAC9yZHlsZ240LzEAL3lsZ240LzEAL3NwZWN0cmFsNC8xAC9waXlnNC8xAC9icmJnNC8xAC9wdXJkNC8xAC95bG9ycmQ0LzEAL29ycmQ0LzEAL3BhaXJlZDQvMQAvc2V0MzQvMQAvc2V0MjQvMQAvcGFzdGVsMjQvMQAvZGFyazI0LzEAL3NldDE0LzEAL3Bhc3RlbDE0LzEAL3JkZ3kzLzEAL2J1cHUzLzEAL3JkcHUzLzEAL3B1YnUzLzEAL3lsZ25idTMvMQAvZ25idTMvMQAvcmR5bGJ1My8xAC9yZGJ1My8xAC9hY2NlbnQzLzEAL2dyZXlzMy8xAC9ncmVlbnMzLzEAL2JsdWVzMy8xAC9wdXJwbGVzMy8xAC9vcmFuZ2VzMy8xAC9yZWRzMy8xAC9wdW9yMy8xAC95bG9yYnIzLzEAL3B1YnVnbjMvMQAvYnVnbjMvMQAvcHJnbjMvMQAvcmR5bGduMy8xAC95bGduMy8xAC9zcGVjdHJhbDMvMQAvcGl5ZzMvMQAvYnJiZzMvMQAvcHVyZDMvMQAveWxvcnJkMy8xAC9vcnJkMy8xAC9wYWlyZWQzLzEAL3NldDMzLzEAL3NldDIzLzEAL3Bhc3RlbDIzLzEAL2RhcmsyMy8xAC9zZXQxMy8xAC9wYXN0ZWwxMy8xAC9wYWlyZWQxMi8xAC9zZXQzMTIvMQAvcmRneTExLzEAL3JkeWxidTExLzEAL3JkYnUxMS8xAC9wdW9yMTEvMQAvcHJnbjExLzEAL3JkeWxnbjExLzEAL3NwZWN0cmFsMTEvMQAvcGl5ZzExLzEAL2JyYmcxMS8xAC9wYWlyZWQxMS8xAC9zZXQzMTEvMQAvcmRneTEwLzEAL3JkeWxidTEwLzEAL3JkYnUxMC8xAC9wdW9yMTAvMQAvcHJnbjEwLzEAL3JkeWxnbjEwLzEAL3NwZWN0cmFsMTAvMQAvcGl5ZzEwLzEAL2JyYmcxMC8xAC9wYWlyZWQxMC8xAC9zZXQzMTAvMQBsYXRpbi0xAElTT184ODU5LTEASVNPODg1OS0xAElTTy04ODU5LTEAaSA+PSAxAHEtPm4gPT0gMQBydHAtPnNwbGl0LlBhcnRpdGlvbnNbMF0ucGFydGl0aW9uW2ldID09IDAgfHwgcnRwLT5zcGxpdC5QYXJ0aXRpb25zWzBdLnBhcnRpdGlvbltpXSA9PSAxAGJ6LnNpemUgJSAzID09IDEATElTVF9TSVpFKCZjdHgtPlRyZWVfZWRnZSkgPT0gY3R4LT5OX25vZGVzIC0gMQBub2RlX3NldF9zaXplKGctPm5faWQpID09IG9zaXplICsgMQBuLT5jb3VudCArICgqbm4pLT5jb3VudCA9PSBOT0RFQ0FSRCArIDEAcnRwLT5zcGxpdC5QYXJ0aXRpb25zWzBdLmNvdW50WzBdICsgcnRwLT5zcGxpdC5QYXJ0aXRpb25zWzBdLmNvdW50WzFdID09IE5PREVDQVJEICsgMQBncmV5MABncmF5MABqc29uMAAjZjBmMGYwACNlMGUwZTAAeGItPmxvY2F0ZWQgPiBBR1hCVUZfSU5MSU5FX1NJWkVfMABcMABUMABceEYwAFx4RTAAXHhEMABceEMwAFx4QjAAXHhBMABncmV5OTAAZ3JheTkwAFx4OTAAZ3JleTgwAGdyYXk4MABceDgwACM4MDgwODAAZ3JleTcwAGdyYXk3MABjY3dyb3QgPT0gMCB8fCBjY3dyb3QgPT0gOTAgfHwgY2N3cm90ID09IDE4MCB8fCBjY3dyb3QgPT0gMjcwAGN3cm90ID09IDAgfHwgY3dyb3QgPT0gOTAgfHwgY3dyb3QgPT0gMTgwIHx8IGN3cm90ID09IDI3MABncmV5NjAAZ3JheTYwAGdyZXk1MABncmF5NTAAZ3JleTQwAGdyYXk0MAByLndpZHRoKCk8MWU0MABncmV5MzAAZ3JheTMwACMzMDMwMzAAZ3JleTIwAGdyYXkyMABncmV5MTAAZ3JheTEwAFx4MTAAIzEwMTAxMAAvcGFpcmVkMTIvMTAAL3NldDMxMi8xMAAvcmRneTExLzEwAC9yZHlsYnUxMS8xMAAvcmRidTExLzEwAC9wdW9yMTEvMTAAL3ByZ24xMS8xMAAvcmR5bGduMTEvMTAAL3NwZWN0cmFsMTEvMTAAL3BpeWcxMS8xMAAvYnJiZzExLzEwAC9wYWlyZWQxMS8xMAAvc2V0MzExLzEwAC9yZGd5MTAvMTAAL3JkeWxidTEwLzEwAC9yZGJ1MTAvMTAAL3B1b3IxMC8xMAAvcHJnbjEwLzEwAC9yZHlsZ24xMC8xMAAvc3BlY3RyYWwxMC8xMAAvcGl5ZzEwLzEwAC9icmJnMTAvMTAAL3BhaXJlZDEwLzEwAC9zZXQzMTAvMTAAMTIwMABncmV5MTAwAGdyYXkxMDAASVNPLUlSLTEwMAAxMDAwMAAlIVBTLUFkb2JlLTMuMABueiA+IDAAbGlzdC0+Y2FwYWNpdHkgPiAwAGRpc3QgPiAwAHBhdGhjb3VudCA+IDAAd2d0ID4gMABuc2l0ZXMgPiAwAHNpZGVzID4gMABydiA9PSAwIHx8IChORF9vcmRlcihydiktTkRfb3JkZXIodikpKmRpciA+IDAAaW5wbiA+IDAAbGVuID4gMABxdDEtPm4gPiAwICYmIHF0Mi0+biA+IDAAbSA+IDAgJiYgbiA+IDAAbmV3VG90YWwgPiAwAHdpZHRoID4gMABsaXN0LT5zaXplID4gMABkaWN0LT5zaXplID4gMABzcGwtPnNpemUgPiAwAHNlbGYtPnNpemUgPiAwAGJ6LnNpemUgPiAwAGluY3JlYXNlID4gMABib3VuZCA+IDAAZ3JhcGgtPndlaWdodHNbeF0gPiAwAGdyYXBoLT53ZWlnaHRzW25fZWRnZXNdID4gMABpbmRleCA+PSAwAHQgPj0gMABubm9kZXMgPj0gMABuX25vZGVzID49IDAAbl9vYnMgPj0gMABuID49IDAAbi0+bGV2ZWwgPj0gMABvcmlnaW5hbCA+PSAwAE1heHJhbmsgPj0gMABQYWNrID49IDAAaWkgPCAxPDxkaW0gJiYgaWkgPj0gMAB3aWR0aCA+PSAwAGpkaWFnID49IDAAaWRpYWcgPj0gMABkID49IDAAcnRwLT5zcGxpdC5QYXJ0aXRpb25zWzBdLmNvdW50WzBdID49IDAgJiYgcnRwLT5zcGxpdC5QYXJ0aXRpb25zWzBdLmNvdW50WzFdID49IDAAViA+PSAwAGFnbm5vZGVzKGdyYXBoKSA+PSAwAGFnbm5vZGVzKGcpID49IDAARURfdHJlZV9pbmRleChlKSA+PSAwAEVEX2NvdW50KGUpID49IDAAb2JqcDEtPnN6LnggPT0gMCAmJiBvYmpwMS0+c3oueSA9PSAwAGNfY250ID09IDAAcmFua19yZXN1bHQgPT0gMABnZXR0aW1lb2ZkYXlfcmVzID09IDAAaiA9PSAwAE5EX2luKHJpZ2h0KS5zaXplICsgTkRfb3V0KHJpZ2h0KS5zaXplID09IDAAYS5zaGFwZSA9PSAwIHx8IGIuc2hhcGUgPT0gMABsaXN0LT5iYXNlICE9IE5VTEwgfHwgaW5kZXggPT0gMCB8fCBzdHJpZGUgPT0gMABkdHNpemUoZGVzdCkgPT0gMABkdHNpemUoZy0+bl9zZXEpID09IDAAZHRzaXplKGctPmdfc2VxKSA9PSAwAGR0c2l6ZShnLT5lX3NlcSkgPT0gMABHRF9taW5yYW5rKGcpID09IDAAZHRzaXplKGctPmdfaWQpID09IDAAZHRzaXplKGctPmVfaWQpID09IDAAY29zeCAhPSAwIHx8IHNpbnggIT0gMAByZXFfYWxpZ25tZW50ICE9IDAAbWVtY21wKCZzdHlsZSwgJihncmFwaHZpel9wb2x5Z29uX3N0eWxlX3QpezB9LCBzaXplb2Yoc3R5bGUpKSAhPSAwAHJlc3VsdCA9PSAoaW50KShzaXplIC0gMSkgfHwgcmVzdWx0IDwgMABtYXNrW2lpXSA8IDAATkRfaGVhcGluZGV4KHYpIDwgMABcLwBYMTEvAGd2UmVuZGVySm9icyAlczogJS4yZiBzZWNzLgAlLipzLgBzcGVjaWZpZWQgcm9vdCBub2RlICIlcyIgd2FzIG5vdCBmb3VuZC4AR3JhcGggJXMgaGFzIGFycmF5IHBhY2tpbmcgd2l0aCB1c2VyIHZhbHVlcyBidXQgbm8gInNvcnR2IiBhdHRyaWJ1dGVzIGFyZSBkZWZpbmVkLgAxLgAtMC4AJSFQUy1BZG9iZS0AJVBERi0APCEtLQAgLAArACoAc3RyZXEoYXB0ci0+dS5uYW1lLEtleSkAIWlzX2V4YWN0bHlfZXF1YWwoUi54LCBRLngpIHx8ICFpc19leGFjdGx5X2VxdWFsKFIueSwgUS55KQBORF9vcmRlcih2KSA8IE5EX29yZGVyKHcpAHUgPT0gVUZfZmluZCh1KQAhTElTVF9JU19FTVBUWShwbGlzdCkAZ3ZfbGlzdF9pc19jb250aWd1b3VzXygqbGlzdCkAb25lIDw9IExJU1RfU0laRShsaXN0KQBucCA8IExJU1RfU0laRShsaXN0KQBpc19wb3dlcl9vZl8yKGFsaWdubWVudCkAc3RkOjppc19oZWFwKGhlYXAuYmVnaW4oKSwgaGVhcC5lbmQoKSwgZ3QpACEocS0+cXRzKQAhTElTVF9JU19FTVBUWSgmbGVhdmVzKQBvbl9oZWFwKHIpAG5vZGVfc2V0X3NpemUoZy0+bl9pZCkgPT0gKHNpemVfdClkdHNpemUoZy0+bl9zZXEpAE5EX3JhbmsoZnJvbSkgPCBORF9yYW5rKHRvKQBub3Qgd2VsbC1mb3JtZWQgKGludmFsaWQgdG9rZW4pAGFnc3VicmVwKGcsbikAbiAhPSBORF9uZXh0KG4pAGZpbmRfZmFzdF9ub2RlKGcsIG4pAChudWxsKQAoIWpjbikgJiYgKCF2YWwpACEocS0+bCkAc3ltLT5pZCA+PSAwICYmIHN5bS0+aWQgPCB0b3BkaWN0c2l6ZShvYmopAExJU1RfU0laRSgmYXJyKSA9PSAoc2l6ZV90KWFnbm5vZGVzKHNnKQBtb3ZlIHRvICglLjBmLCAlLjBmKQA7IHNwbGluZSB0byAoJS4wZiwgJS4wZikAOyBsaW5lIHRvICglLjBmLCAlLjBmKQBTcGFyc2VNYXRyaXhfaXNfc3ltbWV0cmljKEEsIHRydWUpAHZhbHVlICYmIHN0cmxlbih2YWx1ZSkAU3BhcnNlTWF0cml4X2lzX3N5bW1ldHJpYyhBLCBmYWxzZSkAIXVzZV9zdGFnZSB8fCBzaXplIDw9IHNpemVvZihzdGFnZSkARURfbGFiZWwoZmUpACFUUkVFX0VER0UoZSkAIWNvbnN0cmFpbmluZ19mbGF0X2VkZ2UoZywgZSkAbm9kZV9zZXRfaXNfZW1wdHkoZy0+bl9pZCkAcl8lZCkAbF8lZCkAKGxpYikAIVNwYXJzZU1hdHJpeF9oYXNfZGlhZ29uYWwoQSkAIHNjYW5uaW5nIGEgSFRNTCBzdHJpbmcgKG1pc3NpbmcgJz4nPyBiYWQgbmVzdGluZz8gbG9uZ2VyIHRoYW4gJWQ/KQAgc2Nhbm5pbmcgYSBxdW90ZWQgc3RyaW5nIChtaXNzaW5nIGVuZHF1b3RlPyBsb25nZXIgdGhhbiAlZD8pACBzY2FubmluZyBhIC8qLi4uKi8gY29tbWVudCAobWlzc2luZyAnKi8/IGxvbmdlciB0aGFuICVkPykAZmFsbGJhY2soNCkAb25faGVhcChyMCkgfHwgb25faGVhcChyMSkAYWd0YWlsKGUpID09IFVGX2ZpbmQoYWd0YWlsKGUpKQBhZ2hlYWQoZSkgPT0gVUZfZmluZChhZ2hlYWQoZSkpAG91dCBvZiBkeW5hbWljIG1lbW9yeSBpbiB5eV9nZXRfbmV4dF9idWZmZXIoKQBvdXQgb2YgZHluYW1pYyBtZW1vcnkgaW4geXlfY3JlYXRlX2J1ZmZlcigpAG91dCBvZiBkeW5hbWljIG1lbW9yeSBpbiB5eWVuc3VyZV9idWZmZXJfc3RhY2soKQBzdHJlcShtb2RlLCAiciIpIHx8IHN0cmVxKG1vZGUsICJyYiIpIHx8IHN0cmVxKG1vZGUsICJ3IikgfHwgc3RyZXEobW9kZSwgIndiIikAcG5hbWUgIT0gTlVMTCAmJiAhc3RyZXEocG5hbWUsICIiKQBzZXRsaW5ld2lkdGgoACkgcm90YXRlKCVkKSB0cmFuc2xhdGUoACB0cmFuc2Zvcm09InNjYWxlKABOT1RBVElPTigAICgAIG5lYXIgJyVzJwAlbGYsJWxmLCVsZiwnJVteJ10nAGlzZGlnaXQoKGludClkb3RwWzFdKSAmJiBpc2RpZ2l0KChpbnQpZG90cFsyXSkgJiYgZG90cFszXSA9PSAnXDAnACYAJQAkAHVybCgjADx0ZXh0UGF0aCB4bGluazpocmVmPSIjADxhcmVhIHNoYXBlPSJwb2x5IgAgZmlsbD0iIyUwMnglMDJ4JTAyeCIAKHNlcSAmIFNFUV9NQVNLKSA9PSBzZXEgJiYgInNlcXVlbmNlIElEIG92ZXJmbG93IgBndl9zb3J0X2NvbXBhciA9PSBOVUxMICYmIGd2X3NvcnRfYXJnID09IE5VTEwgJiYgInVuc3VwcG9ydGVkIHJlY3Vyc2l2ZSBjYWxsIHRvIGd2X3NvcnQiAGd2X3NvcnRfY29tcGFyICE9IE5VTEwgJiYgIm5vIGNvbXBhcmF0b3Igc2V0IGluIGd2X3NvcnQiAG9wLT5vcC51LnBvbHlnb24uY250IDw9IElOVF9NQVggJiYgInBvbHlnb24gY291bnQgZXhjZWVkcyBndnJlbmRlcl9wb2x5Z29uIHN1cHBvcnQiACB0ZXh0LWFuY2hvcj0ic3RhcnQiAHAueCAhPSBhICYmICJjYW5ub3QgaGFuZGxlIGVsbGlwc2UgdGFuZ2VudCBzbG9wZSBpbiBob3Jpem9udGFsIGV4dHJlbWUgcG9pbnQiAGZ1bGxfbGVuZ3RoX3dpdGhvdXRfc2hhZnQgPiAwICYmICJub24tcG9zaXRpdmUgZnVsbCBsZW5ndGggd2l0aG91dCBzaGFmdCIAPGFyZWEgc2hhcGU9InJlY3QiAHNpemUgPiAwICYmICJhdHRlbXB0IHRvIGFsbG9jYXRlIGFycmF5IG9mIDAtc2l6ZWQgZWxlbWVudHMiAGluZGV4IDwgc2VsZi0+c2l6ZV9iaXRzICYmICJvdXQgb2YgYm91bmRzIGFjY2VzcyIAaW5kZXggPCBzZWxmLnNpemVfYml0cyAmJiAib3V0IG9mIGJvdW5kcyBhY2Nlc3MiACpzMSAhPSAqczIgJiYgImR1cGxpY2F0ZSBzZXBhcmF0b3IgY2hhcmFjdGVycyIAR0RfbWlucmFuayhzdWJnKSA8PSBHRF9tYXhyYW5rKHN1YmcpICYmICJjb3JydXB0ZWQgcmFuayBib3VuZHMiAGluZGV4IDwgbGlzdC5zaXplICYmICJpbmRleCBvdXQgb2YgYm91bmRzIgAodWludHB0cl90KXMgJSAyID09IDAgJiYgImhlYXAgcG9pbnRlciB3aXRoIGxvdyBiaXQgc2V0IHdpbGwgY29sbGlkZSB3aXRoIGFub255bW91cyBJRHMiACAoKyU2bGQgYnl0ZXMgJXN8JXUsIHhtbHBhcnNlLmM6JWQpICUqcyIAIGZvbnQtZmFtaWx5PSIlcyIAIGZvbnQtd2VpZ2h0PSIlcyIAIGZpbGw9IiVzIgAgZm9udC1zdHJldGNoPSIlcyIAIGZvbnQtc3R5bGU9IiVzIgBiYWQgZWRnZSBsZW4gIiVzIgAgYmFzZWxpbmUtc2hpZnQ9InN1cGVyIgBhZ3hibGVuKHhiKSA8PSBzaXplb2YoeGItPnN0b3JlKSAmJiAiYWd4YnVmIGNvcnJ1cHRpb24iAGNlbGwucm93IDwgdGFibGUtPnJvd19jb3VudCAmJiAib3V0IG9mIHJhbmdlIGNlbGwiAGNlbGwuY29sIDwgdGFibGUtPmNvbHVtbl9jb3VudCAmJiAib3V0IG9mIHJhbmdlIGNlbGwiACB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIgBmdWxsX2xlbmd0aCA+IDAgJiYgIm5vbi1wb3NpdGl2ZSBmdWxsIGxlbmd0aCIAZnVsbF9iYXNlX3dpZHRoID4gMCAmJiAibm9uLXBvc2l0aXZlIGZ1bGwgYmFzZSB3aWR0aCIAbm9taW5hbF9iYXNlX3dpZHRoID4gMCAmJiAibm9uLXBvc2l0aXZlIG5vbWluYWwgYmFzZSB3aWR0aCIAIiB3aWR0aD0iJWdweCIgaGVpZ2h0PSIlZ3B4IiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWluWU1pbiBtZWV0IiB4PSIlZyIgeT0iJWciACIgd2lkdGg9IiVncHgiIGhlaWdodD0iJWdweCIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQgbWVldCIgeD0iJWciIHk9IiVnIgAgZm9udC1zaXplPSIlLjJmIgAgZmlsbC1vcGFjaXR5PSIlZiIAPHRleHQgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIAaXNmaW5pdGUobSkgJiYgImVsbGlwc2UgdGFuZ2VudCBzbG9wZSBpcyBpbmZpbml0ZSIAKHhiLT5sb2NhdGVkID09IEFHWEJVRl9PTl9IRUFQIHx8IHhiLT5sb2NhdGVkIDw9IHNpemVvZih4Yi0+c3RvcmUpKSAmJiAiY29ycnVwdGVkIGFneGJ1ZiB0eXBlIgBBLT50eXBlID09IHR5cGUgJiYgImNhbGwgdG8gU3BhcnNlTWF0cml4X2Nvb3JkaW5hdGVfZm9ybV9hZGRfZW50cnkgIiAid2l0aCBpbmNvbXBhdGlibGUgdmFsdWUgdHlwZSIAIHRleHQtYW5jaG9yPSJtaWRkbGUiADxhcmVhIHNoYXBlPSJjaXJjbGUiAGNlbGwtPnJvdyArIGNlbGwtPnJvd3NwYW4gPD0gdGFibGUtPnJvd19jb3VudCAmJiAiY2VsbCBzcGFucyBoaWdoZXIgdGhhbiBjb250YWluaW5nIHRhYmxlIgBjZWxsLnJvdyArIGNlbGwucm93c3BhbiA8PSB0YWJsZS0+cm93X2NvdW50ICYmICJjZWxsIHNwYW5zIGhpZ2hlciB0aGFuIGNvbnRhaW5pbmcgdGFibGUiAGNlbGwtPmNvbCArIGNlbGwtPmNvbHNwYW4gPD0gdGFibGUtPmNvbHVtbl9jb3VudCAmJiAiY2VsbCBzcGFucyB3aWRlciB0aGFuIGNvbnRhaW5pbmcgdGFibGUiAGNlbGwuY29sICsgY2VsbC5jb2xzcGFuIDw9IHRhYmxlLT5jb2x1bW5fY291bnQgJiYgImNlbGwgc3BhbnMgd2lkZXIgdGhhbiBjb250YWluaW5nIHRhYmxlIgBvbGRfbm1lbWIgPCBTSVpFX01BWCAvIHNpemUgJiYgImNsYWltZWQgcHJldmlvdXMgZXh0ZW50IGlzIHRvbyBsYXJnZSIAdGhldGEgPj0gMCAmJiB0aGV0YSA8PSBNX1BJICYmICJ0aGV0YSBvdXQgb2YgcmFuZ2UiAHRhYmxlLT5oZWlnaHRzID09IE5VTEwgJiYgInRhYmxlIGhlaWdodHMgY29tcHV0ZWQgdHdpY2UiAHRhYmxlLT53aWR0aHMgPT0gTlVMTCAmJiAidGFibGUgd2lkdGhzIGNvbXB1dGVkIHR3aWNlIgAgdGV4dC1hbmNob3I9ImVuZCIAIGZvbnQtd2VpZ2h0PSJib2xkIgAgZm9udC1zdHlsZT0iaXRhbGljIgAgYmFzZWxpbmUtc2hpZnQ9InN1YiIAXCIAbGxlbiA8PSBJTlRfTUFYICYmICJYTUwgdG9rZW4gdG9vIGxvbmcgZm9yIGV4cGF0IEFQSSIAIiByeT0iAF9wIiBzdGFydE9mZnNldD0iNTAlIj48dHNwYW4geD0iMCIgZHk9IgAiIGN5PSIAIiB5PSIAIiByeD0iACBjeD0iACB4PSIAIHRhcmdldD0iACBwb2ludHM9IgAgY29vcmRzPSIAIHRleHQtZGVjb3JhdGlvbj0iACBmaWxsPSIAIiBzdHJva2Utd2lkdGg9IgA8aW1hZ2UgeGxpbms6aHJlZj0iADw/eG1sLXN0eWxlc2hlZXQgaHJlZj0iACIgbmFtZT0iACB4bGluazp0aXRsZT0iACB0aXRsZT0iACIgc3Ryb2tlPSIAPGRlZnM+CjxsaW5lYXJHcmFkaWVudCBpZD0iADxkZWZzPgo8cmFkaWFsR3JhZGllbnQgaWQ9IgA8bWFwIGlkPSIAPGcgaWQ9IgAgZD0iACIgeTI9IgAiIHgyPSIAIiB5MT0iAHgxPSIAIHZpZXdCb3g9IiVkLjAwICVkLjAwICVkLjAwICVkLjAwIgAgdHJhbnNmb3JtPSJyb3RhdGUoJWQgJWcgJWcpIgBhZ3hibGVuKCZjdHgtPlNidWYpID09IDAgJiYgInBlbmRpbmcgc3RyaW5nIGRhdGEgdGhhdCB3YXMgbm90IGNvbnN1bWVkIChtaXNzaW5nICIgImVuZHN0cigpL2VuZGh0bWxzdHIoKT8pIgAgYWx0PSIiAEN5Y2xlIEVycm9yIQBQdXJlIHZpcnR1YWwgZnVuY3Rpb24gY2FsbGVkIQA8IS0tIEdlbmVyYXRlZCBieSAAJXMlenUgLSMlMDJ4JTAyeCUwMnglMDJ4IAAlcyV6dSAtIyUwMnglMDJ4JTAyeCAAJWMgJXp1IAB0ICV1IAAgY3JlYXRlIHRleHQgAHhMYXlvdXQgAGRlZmF1bHQgAHN0cmljdCAAJXMlenUgLSVzIAAgLXNtb290aCBiZXppZXIgACBtb3ZldG8gACB2ZXJzaW9uIAAgY3JlYXRlIHBvbHlnb24gACAtdGV4dCB7JXN9IC1maWxsIAAgY3JlYXRlIG92YWwgACAtd2lkdGggAG5ld3BhdGggAGdyYXBoIABzLCUuNWcsJS41ZyAAJS41ZywlLjVnLCUuNWcsJS41ZyAAZSwlLjVnLCUuNWcgACVnICVnIAAlLjAzbGYgACUuM2YgACVkICVkICVkICVkICVkICVkICUuMWYgJS40ZiAlZCAlLjFmICUuMWYgJS4wZiAlLjBmIAAgLW91dGxpbmUgACBjcmVhdGUgbGluZSAAbm9kZSAAW0dyYXBodml6XSAlczolZDogJTA0ZC0lMDJkLSUwMmQgJTAyZDolMDJkOiUwMmQgACVkIABUb3RhbCBzaXplID4gMSBpbiAiJXMiIGNvbG9yIHNwZWMgAFsgL1JlY3QgWyAAVCAAUyAAT1BFTiAASSAARiAARSAAQyAAIC0+IABSYW5rIHNlcGFyYXRpb24gPSAAVW5zYXRpc2ZpZWQgY29uc3RyYWludDogAENhbGN1bGF0aW5nIHNob3J0ZXN0IHBhdGhzOiAAJXM6IABTb2x2aW5nIG1vZGVsOiAAU2V0dGluZyB1cCBzcHJpbmcgbW9kZWw6IABjb252ZXJ0IGdyYXBoOiAAIFRpdGxlOiAAInRleHQiOiAAeyJmcmFjIjogJS4wM2YsICJjb2xvciI6IAAibmFtZSI6IAAic3R5bGUiOiAAImZhY2UiOiAAMiAAPCEtLSAAIC0tIAAlIABfcCIgAGxfJWQiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAADSAgICAgICAgICAgICAgICBpdGVyID0gJWQsIHN0ZXAgPSAlZiBGbm9ybSA9ICVmIG56ID0gJXp1ICBLID0gJWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgAAogICAgADoJIAAgICAgJXN9CgB0cnlpbmcgdG8gYWRkIHRvIHJlY3QgeyVmICsvLSAlZiwgJWYgKy8tICVmfQoAI2RlZmF1bHQgeyBmaW5pc2ggeyBhbWJpZW50IDAuMSBkaWZmdXNlIDAuOSB9IH0KAHBpZ21lbnQgeyBjb2xvciAlcyB9CgBsaWdodF9zb3VyY2UgeyA8MTUwMCwzMDAwLC0yNTAwPiBjb2xvciBXaGl0ZSB9CgBnbG9iYWxfc2V0dGluZ3MgeyBhc3N1bWVkX2dhbW1hIDEuMCB9CgAgICAgdGV4dHVyZSBJbWFnZVRleHR1cmUgeyB1cmwgIiVzIiB9CgAgICAgfQoALy9za3kKcGxhbmUgeyA8MCwgMSwgMD4sIDEgaG9sbG93CiAgICB0ZXh0dXJlIHsKICAgICAgICBwaWdtZW50IHsgYm96byB0dXJidWxlbmNlIDAuOTUKICAgICAgICAgICAgY29sb3JfbWFwIHsKICAgICAgICAgICAgICAgIFswLjAwIHJnYiA8MC4wNSwgMC4yMCwgMC41MD5dCiAgICAgICAgICAgICAgICBbMC41MCByZ2IgPDAuMDUsIDAuMjAsIDAuNTA+XQogICAgICAgICAgICAgICAgWzAuNzUgcmdiIDwxLjAwLCAxLjAwLCAxLjAwPl0KICAgICAgICAgICAgICAgIFswLjc1IHJnYiA8MC4yNSwgMC4yNSwgMC4yNT5dCiAgICAgICAgICAgICAgICBbMS4wMCByZ2IgPDAuNTAsIDAuNTAsIDAuNTA+XQogICAgICAgICAgICB9CiAgICAgICAgICAgIHNjYWxlIDwxLjAwLCAxLjAwLCAxLjUwPiAqIDIuNTAKICAgICAgICAgICAgdHJhbnNsYXRlIDwwLjAwLCAwLjAwLCAwLjAwPgogICAgICAgIH0KICAgICAgICBmaW5pc2ggeyBhbWJpZW50IDEgZGlmZnVzZSAwIH0KICAgIH0KICAgIHNjYWxlIDEwMDAwCn0KLy9taXN0CmZvZyB7IGZvZ190eXBlIDIKICAgIGRpc3RhbmNlIDUwCiAgICBj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ZCBjZWxsIHNpemUgd2l0aCB1bnNwZWNpZmllZCB3aWR0aCBvciBoZWlnaHQKAGZpeGVkIHRhYmxlIHNpemUgd2l0aCB1bnNwZWNpZmllZCB3aWR0aCBvciBoZWlnaHQKAHBvcyBhdHRyaWJ1dGUgZm9yIGVkZ2UgKCVzLCVzKSBkb2Vzbid0IGhhdmUgM24rMSBwb2ludHMKACAgZ2VuZXJhdGVkICVkIGNvbnN0cmFpbnRzCgBzcGxpbmVzIGFuZCBjbHVzdGVyIGVkZ2VzIG5vdCBzdXBwb3J0ZWQgLSB1c2luZyBsaW5lIHNlZ21lbnRzCgBvYmplY3RzCgBXYXJuaW5nOiBub2RlICVzLCBwb3NpdGlvbiAlcywgZXhwZWN0ZWQgdHdvIGZsb2F0cwoAZm9udCBuYW1lICVzIGNvbnRhaW5zIGNoYXJhY3RlcnMgdGhhdCBtYXkgbm90IGJlIGFjY2VwdGVkIGJ5IHNvbWUgUFMgdmlld2VycwoAZm9udCBuYW1lICVzIGlzIGxvbmdlciB0aGFuIDI5IGNoYXJhY3RlcnMgd2hpY2ggbWF5IGJlIHJlamVjdGVkIGJ5IHNvbWUgUFMgdmlld2VycwoAY2Fubm90IGFsbG9jYXRlIHBzCgBzY2FsZT0xLjAgJXMgcmVxdWlyZWQgZm9yIGNvbXBhcmlzb25zCgBTZXR0aW5nIGluaXRpYWwgcG9zaXRpb25zCgAlcyBEV0IgMiBjb21wYXRpYmlsaXR5IGRlZmluaXRpb25zCgBhcnJheSBwYWNraW5nOiAlcyAlenUgcm93cyAlenUgY29sdW1ucwoAc3ludGF4IGFtYmlndWl0eSAtIGJhZGx5IGRlbGltaXRlZCBudW1iZXIgJyVzJyBpbiBsaW5lICVkIG9mICVzIHNwbGl0cyBpbnRvIHR3byB0b2tlbnMKAGVkZ2UgbGFiZWxzIHdpdGggc3BsaW5lcz1jdXJ2ZWQgbm90IHN1cHBvcnRlZCBpbiBkb3QgLSB1c2UgeGxhYmVscwoAZmxhdCBlZGdlIGJldHdlZW4gYWRqYWNlbnQgbm9kZXMgb25lIG9mIHdoaWNoIGhhcyBhIHJlY29yZCBzaGFwZSAtIHJlcGxhY2UgcmVjb3JkcyB3aXRoIEhUTUwtbGlrZSBsYWJlbHMKAG91dCBvZiBtZW1vcnkgd2hlbiB0cnlpbmcgdG8gYWxsb2NhdGUgJXp1IGJ5dGVzCgBpbnRlZ2VyIG92ZXJmbG93IHdoZW4gdHJ5aW5nIHRvIGFsbG9jYXRlICV6dSAqICV6dSBieXRlcwoAdXBkYXRlOiBtaXNtYXRjaGVkIGxjYSBpbiB0cmVldXBkYXRlcwoAZ3JhcGggJXMsIGNvb3JkICVzLCBleHBlY3RlZCBmb3VyIGRvdWJsZXMKAG5vZGUgJXMsIHBvc2l0aW9uICVzLCBleHBlY3RlZCB0d28gZG91YmxlcwoARm91bmQgJWQgRGlHLUNvTGEgYm91bmRhcmllcwoASW5jaGVzCgAoJTR6dSkgJTd6dSBub2RlcyAlN3p1IGVkZ2VzCgBjb21wb3VuZEVkZ2VzOiBjb3VsZCBub3QgY29uc3RydWN0IG9ic3RhY2xlcyAtIGZhbGxpbmcgYmFjayB0byBzdHJhaWdodCBsaW5lIGVkZ2VzCgB0aGUgYm91bmRpbmcgYm94ZXMgb2Ygc29tZSBub2RlcyB0b3VjaCAtIGZhbGxpbmcgYmFjayB0byBzdHJhaWdodCBsaW5lIGVkZ2VzCgBjb21wb3VuZEVkZ2VzOiBub2RlcyB0b3VjaCAtIGZhbGxpbmcgYmFjayB0byBzdHJhaWdodCBsaW5lIGVkZ2VzCgBzb21lIG5vZGVzIHdpdGggbWFyZ2luICglLjAyZiwlLjAyZikgdG91Y2ggLSBmYWxsaW5nIGJhY2sgdG8gc3RyYWlnaHQgbGluZSBlZGdlcwoAbWVyZ2UyOiBncmFwaCAlcywgcmFuayAlZCBoYXMgb25seSAlZCA8ICVkIG5vZGVzCgBTY2FubmluZyBncmFwaCAlcywgJWQgbm9kZXMKAFdhcm5pbmc6IG5vIGhhcmQtY29kZWQgbWV0cmljcyBmb3IgJyVzJy4gIEZhbGxpbmcgYmFjayB0byAnVGltZXMnIG1ldHJpY3MKAGluIGVkZ2UgJXMlcyVzCgBVc2luZyAlczogJXM6JXMKAEZvcm1hdDogIiVzIiBub3QgcmVjb2duaXplZC4gVXNlIG9uZSBvZjolcwoATGF5b3V0IHR5cGU6ICIlcyIgbm90IHJlY29nbml6ZWQuIFVzZSBvbmUgb2Y6JXMKAGxheW91dCAlcwoALmZ0ICVzCgBiYWQgbGFiZWwgZm9ybWF0ICVzCgBpbiByb3V0ZXNwbGluZXMsIGVkZ2UgaXMgYSBsb29wIGF0ICVzCgAgICAgICAgJTdkIG5vZGVzICU3ZCBlZGdlcyAlN3p1IGNvbXBvbmVudHMgJXMKAGluIGxhYmVsIG9mIGVkZ2UgJXMgJXMgJXMKACAgRWRnZSAlcyAlcyAlcwoAb3J0aG8gJXMgJXMKAHBvbHlsaW5lICVzICVzCgBzcGxpbmUgJXMgJXMKAHJlY3RhbmdsZSAoJS4wZiwlLjBmKSAoJS4wZiwlLjBmKSAlcyAlcwoAaW4gY2x1c3RlciAlcwoAJXMgd2FzIGFscmVhZHkgaW4gYSByYW5rc2V0LCBkZWxldGVkIGZyb20gY2x1c3RlciAlcwoAJXMgLT4gJXM6IHRhaWwgbm90IGluc2lkZSB0YWlsIGNsdXN0ZXIgJXMKACVzIC0+ICVzOiBoZWFkIGlzIGluc2lkZSB0YWlsIGNsdXN0ZXIgJXMKAGhlYWQgY2x1c3RlciAlcyBpbnNpZGUgdGFpbCBjbHVzdGVyICVzCgBoZWFkIG5vZGUgJXMgaW5zaWRlIHRhaWwgY2x1c3RlciAlcwoAJXMgLT4gJXM6IGhlYWQgbm90IGluc2lkZSBoZWFkIGNsdXN0ZXIgJXMKACVzIC0+ICVzOiB0YWlsIGlzIGluc2lkZSBoZWFkIGNsdXN0ZXIgJXMKAHRhaWwgY2x1c3RlciAlcyBpbnNpZGUgaGVhZCBjbHVzdGVyICVzCgB0YWlsIG5vZGUgJXMgaW5zaWRlIGhlYWQgY2x1c3RlciAlcwoAVW5oYW5kbGVkIGFkanVzdCBvcHRpb24gJXMKAHJlcG9zaXRpb24gJXMKAG5vIHBvc2l0aW9uIGZvciBlZGdlIHdpdGggeGxhYmVsICVzCgBubyBwb3NpdGlvbiBmb3IgZWRnZSB3aXRoIHRhaWwgbGFiZWwgJXMKAG5vIHBvc2l0aW9uIGZvciBlZGdlIHdpdGggbGFiZWwgJXMKAG5vIHBvc2l0aW9uIGZvciBlZGdlIHdpdGggaGVhZCBsYWJlbCAlcwoALy8qKiogYmVnaW5fZ3JhcGggJXMKAE1heC4gaXRlcmF0aW9ucyAoJWQpIHJlYWNoZWQgb24gZ3JhcGggJXMKAENvdWxkIG5vdCBwYXJzZSAiX2JhY2tncm91bmQiIGF0dHJpYnV0ZSBpbiBncmFwaCAlcwoAaW4gbGFiZWwgb2YgZ3JhcGggJXMKAENyZWF0aW5nIGVkZ2VzIHVzaW5nICVzCgBBZGp1c3RpbmcgJXMgdXNpbmcgJXMKACVzIHdoaWxlIG9wZW5pbmcgJXMKAGRlcml2ZSBncmFwaCBfZGdfJWQgb2YgJXMKACBdICAlenUgdHJ1ZSAlcwoAXSAgJWQgdHJ1ZSAlcwoAIF0gICV6dSBmYWxzZSAlcwoAXSAgJWQgZmFsc2UgJXMKAG1ha2VQb2x5OiB1bmtub3duIHNoYXBlIHR5cGUgJXMKAG1ha2VBZGRQb2x5OiB1bmtub3duIHNoYXBlIHR5cGUgJXMKAHVzaW5nICVzIGZvciB1bmtub3duIHNoYXBlICVzCgAgIG9jdHJlZSBzY2hlbWUgJXMKAGNhbid0IG9wZW4gbGlicmFyeSBmaWxlICVzCgBjYW4ndCBmaW5kIGxpYnJhcnkgZmlsZSAlcwoAQm91bmRpbmdCb3ggbm90IGZvdW5kIGluIGVwc2YgZmlsZSAlcwoAY291bGRuJ3Qgb3BlbiBlcHNmIGZpbGUgJXMKAGNvdWxkbid0IHJlYWQgZnJvbSBlcHNmIGZpbGUgJXMKAGluIG5vZGUgJXMKAHNoYXBlZmlsZSBub3Qgc2V0IG9yIG5vdCBmb3VuZCBmb3IgZXBzZiBub2RlICVzCgBpbiBsYWJlbCBvZiBub2RlICVzCgBlbmQgJXMKAHJhbmtpbmc6IGZhaWx1cmUgdG8gY3JlYXRlIHN0cm9uZyBjb25zdHJhaW50IGVkZ2UgYmV0d2VlbiBub2RlcyAlcyBhbmQgJXMKAG9vcHMsIGludGVybmFsIGVycm9yOiB1bmhhbmRsZWQgY29sb3IgdHlwZT0lZCAlcwoAJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJS4xZiAlZCAlZCAlZCAlZCAlZCAlZAogJWQgJXMKAC8vKioqIHRleHRzcGFuOiAlcywgZm9udHNpemUgPSAlLjNmLCBmb250bmFtZSA9ICVzCgB0cmllcyA9ICVkLCBtb2RlID0gJXMKAC8vKioqIGNvbW1lbnQ6ICVzCgBmYWlsZWQgdG8gcmVzZXJ2ZSAlenUgZWxlbWVudHMgb2Ygc2l6ZSAlenUgYnl0ZXM6ICVzCgBmb250bmFtZTogIiVzIiByZXNvbHZlZCB0bzogJXMKACUlJSVQYWdlT3JpZW50YXRpb246ICVzCgBkZWxhdW5heV90cmlhbmd1bGF0aW9uOiAlcwoAZGVsYXVuYXlfdHJpOiAlcwoAZ3ZwcmludGY6ICVzCgBuZXN0aW5nIG5vdCBhbGxvd2VkIGluIHN0eWxlOiAlcwoAdW5tYXRjaGVkICcpJyBpbiBzdHlsZTogJXMKAHVubWF0Y2hlZCAnKCcgaW4gc3R5bGU6ICVzCgAlJSUlVGl0bGU6ICVzCgAlcyBUaXRsZTogJXMKACMgVGl0bGU6ICVzCgAvLyoqKiBiZWdpbl9ub2RlOiAlcwoAbGliL3BhdGhwbGFuLyVzOiVkOiAlcwoAZ3JpZCglZCwlZCk6ICVzCgBDb3VsZCBub3Qgb3BlbiAiJXMiIGZvciB3cml0aW5nIDogJXMKAHN0YXJ0IHBvcnQ6ICglLjVnLCAlLjVnKSwgdGFuZ2VudCBhbmdsZTogJS41ZywgJXMKAGVuZCBwb3J0OiAoJS41ZywgJS41ZyksIHRhbmdlbnQgYW5nbGU6ICUuNWcsICVzCgAgWyV6dV0gJXAgc2V0ICVkICglLjAyZiwlLjAyZikgKCUuMDJmLCUuMDJmKSAlcwoAJSUgJXMKACMgJXMKACAgbW9kZSAgICVzCgBsaXN0IGVsZW1lbnQgdHlwZSBpcyBub3QgYSBwb2ludGVyLCBidXQgYGZyZWVgIHVzZWQgYXMgZGVzdHJ1Y3RvcgoAY29uanVnYXRlX2dyYWRpZW50OiB1bmV4cGVjdGVkIGxlbmd0aCAwIHZlY3RvcgoAJXMgdG8gY2hhbmdlIGRyYXdpbmcgc2l6ZSwgbXVsdGlwbHkgdGhlIHdpZHRoIGFuZCBoZWlnaHQgb24gdGhlIC5QUyBsaW5lIGFib3ZlIGFuZCB0aGUgbnVtYmVyIG9uIHRoZSB0d28gbGluZXMgYmVsb3cgKHJvdW5kZWQgdG8gdGhlIG5lYXJlc3QgaW50ZWdlcikgYnkgYSBzY2FsZSBmYWN0b3IKAGFkZF9zZWdtZW50OiBlcnJvcgoAJS41ZyAlLjVnICUuNWcgJXNjb2xvcgoAMCAwIDAgZWRnZWNvbG9yCgAwLjggMC44IDAuOCBzZXRyZ2Jjb2xvcgoAMCAwIDEgc2V0cmdiY29sb3IKADEgMCAwIHNldHJnYmNvbG9yCgAwIDAgMCBzZXRyZ2Jjb2xvcgoAJWQgJWQgc2V0bGF5ZXIKAC8vKioqIGVuZF9sYXllcgoAVVRGLTggaW5wdXQgdXNlcyBub24tTGF0aW4xIGNoYXJhY3RlcnMgd2hpY2ggY2Fubm90IGJlIGhhbmRsZWQgYnkgdGhpcyBQb3N0U2NyaXB0IGRyaXZlcgoATGV0dGVyCgAvLyoqKiBiZWdpbl9jbHVzdGVyCgAvLyoqKiBlbmRfY2x1c3RlcgoAcmVtb3ZpbmcgZW1wdHkgY2x1c3RlcgoAQ2VudGVyCgBXYXJuaW5nOiBubyB2YWx1ZSBmb3Igd2lkdGggb2Ygbm9uLUFTQ0lJIGNoYXJhY3RlciAldS4gRmFsbGluZyBiYWNrIHRvIHdpZHRoIG9mIHNwYWNlIGNoYXJhY3RlcgoAYmFzZSByZWZlcmVyCgAlJVBhZ2VUcmFpbGVyCgAlJVRyYWlsZXIKAC8vKioqIGJlemllcgoAIiVzIiB3YXMgbm90IGZvdW5kIGFzIGEgZmlsZSBvciBhcyBhIHNoYXBlIGxpYnJhcnkgbWVtYmVyCgBzdG9wCgAgY3VydmV0bwoAbmV3cGF0aCAlLjBmICUuMGYgbW92ZXRvCgAlLjBmICUuMGYgbGluZXRvCgAgbGF5b3V0PW5lYXRvCgBub2RlICVzIGluIGdyYXBoICVzIGhhcyBubyBwb3NpdGlvbgoAJXMgbWF4cHNodCBhbmQgbWF4cHN3aWQgaGF2ZSBubyBtZWFuaW5nIGluIERXQiAyLjAsIHNldCBwYWdlIGJvdW5kYXJpZXMgaW4gZ3BpYyBhbmQgaW4gMTB0aCBFZGl0aW9uCgAlcyBhcnJvd2hlYWQgaGFzIG5vIG1lYW5pbmcgaW4gRFdCIDIsIGFycm93aGVhZCA9IDcgbWFrZXMgZmlsbGVkIGFycm93aGVhZHMgaW4gZ3BpYyBhbmQgaW4gMTB0aCBFZGl0aW9uCgAlcyBhcnJvd2hlYWQgaXMgdW5kZWZpbmVkIGluIERXQiAyLCBpbml0aWFsbHkgMSBpbiBncGljLCAyIGluIDEwdGggRWRpdGlvbgoAbWFqb3JpemF0aW9uCgAvLyoqKiBwb2x5Z29uCgBvdmVyZmxvdyB3aGVuIGNvbXB1dGluZyBlZGdlIHdlaWdodCBzdW0KAHNmZHAgb25seSBzdXBwb3J0cyBzdGFydD1yYW5kb20KAG5vZGUgcG9zaXRpb25zIGFyZSBpZ25vcmVkIHVubGVzcyBzdGFydD1yYW5kb20KAGNsb3NlcGF0aCBmaWxsCgAgZWxsaXBzZV9wYXRoIGZpbGwKACAgJS4wZiAlLjBmIGNlbGwKACVmICVmICVmICVmIGNlbGwKAGdyYXBoICVzIGlzIGRpc2Nvbm5lY3RlZC4gSGVuY2UsIHRoZSBjaXJjdWl0IG1vZGVsCgBncmFwaCBpcyBkaXNjb25uZWN0ZWQuIEhlbmNlLCB0aGUgY2lyY3VpdCBtb2RlbAoAZWRnZXMgaW4gZ3JhcGggJXMgaGF2ZSBubyBsZW4gYXR0cmlidXRlLiBIZW5jZSwgdGhlIG1kcyBtb2RlbAoAY2lyY3VpdCBtb2RlbCBub3QgeWV0IHN1cHBvcnRlZCBpbiBHbW9kZT1zZ2QsIHJldmVydGluZyB0byBzaG9ydHBhdGggbW9kZWwKAG1kcyBtb2RlbCBub3QgeWV0IHN1cHBvcnRlZCBpbiBHbW9kZT1zZ2QsIHJldmVydGluZyB0byBzaG9ydHBhdGggbW9kZWwKAG5vZGUgJyVzJywgZ3JhcGggJyVzJyBzaXplIHRvbyBzbWFsbCBmb3IgbGFiZWwKACVzIERXQiAyIGRvZXNuJ3QgdXNlIGZpbGwgYW5kIGRvZXNuJ3QgZGVmaW5lIGZpbGx2YWwKAFsge0NhdGFsb2d9IDw8IC9VUkkgPDwgL0Jhc2UgJXMgPj4gPj4KL1BVVCBwZGZtYXJrCgBbIC9Dcm9wQm94IFslZCAlZCAlZCAlZF0gL1BBR0VTIHBkZm1hcmsKACAgL0JvcmRlciBbIDAgMCAwIF0KICAvQWN0aW9uIDw8IC9TdWJ0eXBlIC9VUkkgL1VSSSAlcyA+PgogIC9TdWJ0eXBlIC9MaW5rCi9BTk4gcGRmbWFyawoAdHJvdWJsZSBpbiBpbml0X3JhbmsKAGxpbmV0aGljayA9IDA7IG9sZGxpbmV0aGljayA9IGxpbmV0aGljawoAIHNldGxpbmV3aWR0aAoAZ3NhdmUKJWQgJWQgJWQgJWQgYm94cHJpbSBjbGlwIG5ld3BhdGgKAGdzYXZlICVnICVnIHRyYW5zbGF0ZSBuZXdwYXRoCgAvLyoqKiBlbmRfZ3JhcGgKAGxheW91dCBhdHRyaWJ1dGUgaXMgaW52YWxpZCBleGNlcHQgb24gdGhlIHJvb3QgZ3JhcGgKAGluIGNoZWNrcGF0aCwgYm94ZXMgJXp1IGFuZCAlenUgZG9uJ3QgdG91Y2gKAG1lcmdlX29uZXdheSBnbGl0Y2gKACVzIGRvbid0IGNoYW5nZSBhbnl0aGluZyBiZWxvdyB0aGlzIGxpbmUgaW4gdGhpcyBkcmF3aW5nCgBOb2RlIG5vdCBhZGphY2VudCB0byBjZWxsIC0tIEFib3J0aW5nCgBpbmNvbXBhcmFibGUgc2VnbWVudHMgISEgLS0gQWJvcnRpbmcKAEFsdGVybmF0aXZlbHksIGNvbnNpZGVyIHJ1bm5pbmcgbmVhdG8gdXNpbmcgLUdwYWNrPXRydWUgb3IgZGVjb21wb3NpbmcKAGxhYmVsX3NjaGVtZSA9ICVkID4gNCA6IGlnbm9yaW5nCgBndnJlbmRlcl9zZXRfc3R5bGU6IHVuc3VwcG9ydGVkIHN0eWxlICVzIC0gaWdub3JpbmcKAEFycm93IHR5cGUgIiVzIiB1bmtub3duIC0gaWdub3JpbmcKAGZkcCBkb2VzIG5vdCBzdXBwb3J0IHN0YXJ0PXNlbGYgLSBpZ25vcmluZwoAJXMgYXR0cmlidXRlIHZhbHVlIG11c3QgYmUgMSBvciAyIC0gaWdub3JpbmcKAE1vcmUgdGhhbiAyIGNvbG9ycyBzcGVjaWZpZWQgZm9yIGEgZ3JhZGllbnQgLSBpZ25vcmluZyByZW1haW5pbmcKAGFzIHJlcXVpcmVkIGJ5IHRoZSAtbiBmbGFnCgBiYlslc10gJS41ZyAlLjVnICUuNWcgJS41ZwoAL3BhdGhib3ggewogICAgL1kgZXhjaCAlLjVnIHN1YiBkZWYKICAgIC9YIGV4Y2ggJS41ZyBzdWIgZGVmCiAgICAveSBleGNoICUuNWcgc3ViIGRlZgogICAgL3ggZXhjaCAlLjVnIHN1YiBkZWYKICAgIG5ld3BhdGggeCB5IG1vdmV0bwogICAgWCB5IGxpbmV0bwogICAgWCBZIGxpbmV0bwogICAgeCBZIGxpbmV0bwogICAgY2xvc2VwYXRoIHN0cm9rZQogfSBkZWYKL2RiZ3N0YXJ0IHsgZ3NhdmUgJS41ZyAlLjVnIHRyYW5zbGF0ZSB9IGRlZgovYXJyb3dsZW5ndGggMTAgZGVmCi9hcnJvd3dpZHRoIGFycm93bGVuZ3RoIDIgZGl2IGRlZgovYXJyb3doZWFkIHsKICAgIGdzYXZlCiAgICByb3RhdGUKICAgIGN1cnJlbnRwb2ludAogICAgbmV3cGF0aAogICAgbW92ZXRvCiAgICBhcnJvd2xlbmd0aCBhcnJvd3dpZHRoIDIgZGl2IHJsaW5ldG8KICAgIDAgYXJyb3d3aWR0aCBuZWcgcmxpbmV0bwogICAgY2xvc2VwYXRoIGZpbGwKICAgIGdyZXN0b3JlCn0gYmluZCBkZWYKL21ha2VhcnJvdyB7CiAgICBjdXJyZW50cG9pbnQgZXhjaCBwb3Agc3ViIGV4Y2ggY3VycmVudHBvaW50IHBvcCBzdWIgYXRhbgogICAgYXJyb3doZWFkCn0gYmluZCBkZWYKL3BvaW50IHsgICAgbmV3cGF0aCAgICAyIDAgMzYwIGFyYyBmaWxsfSBkZWYvbWFrZXZlYyB7CiAgICAvWSBleGNoIGRlZgogICAgL1ggZXhjaCBkZWYKICAgIC95IGV4Y2ggZGVmCiAgICAveCBleGNoIGRlZgogICAgbmV3cGF0aCB4IHkgbW92ZXRvCiAgICBYIFkgbGluZXRvIHN0cm9rZQogICAgWCBZIG1vdmV0bwogICAgeCB5IG1ha2VhcnJvdwp9IGRlZgoAL3BhdGhib3ggewogICAgL1ggZXhjaCBuZWcgJS41ZyBzdWIgZGVmCiAgICAvWSBleGNoICUuNWcgc3ViIGRlZgogICAgL3ggZXhjaCBuZWcgJS41ZyBzdWIgZGVmCiAgICAveSBleGNoICUuNWcgc3ViIGRlZgogICAgbmV3cGF0aCB4IHkgbW92ZXRvCiAgICBYIHkgbGluZXRvCiAgICBYIFkgbGluZXRvCiAgICB4IFkgbGluZXRvCiAgICBjbG9zZXBhdGggc3Ryb2tlCn0gZGVmCgAlIVBTLUFkb2JlLTIuMAovbm9kZSB7CiAgL1kgZXhjaCBkZWYKICAvWCBleGNoIGRlZgogIC95IGV4Y2ggZGVmCiAgL3ggZXhjaCBkZWYKICBuZXdwYXRoCiAgeCB5IG1vdmV0bwogIHggWSBsaW5ldG8KICBYIFkgbGluZXRvCiAgWCB5IGxpbmV0bwogIGNsb3NlcGF0aCBmaWxsCn0gZGVmCi9jZWxsIHsKICAvWSBleGNoIGRlZgogIC9YIGV4Y2ggZGVmCiAgL3kgZXhjaCBkZWYKICAveCBleGNoIGRlZgogIG5ld3BhdGgKICB4IHkgbW92ZXRvCiAgeCBZIGxpbmV0bwogIFggWSBsaW5ldG8KICBYIHkgbGluZXRvCiAgY2xvc2VwYXRoIHN0cm9rZQp9IGRlZgoAfSBiaW5kIGRlZgoALlBTICUuNWYgJS41ZgoAb3ZlcmxhcDogJXMgdmFsdWUgJWQgc2NhbGluZyAlLjA0ZgoAICBiZWF1dGlmeV9sZWF2ZXMgJWQgbm9kZSB3ZWlnaHRzICVkIHJvdGF0aW9uICUuMDNmCgAgIHJlcHVsc2l2ZSBleHBvbmVudDogJS4wM2YKACAgSyA6ICUuMDNmIEMgOiAlLjAzZgoAJXMgJS4zZgoACmludGVyc2VjdGlvbiBhdCAlLjNmICUuM2YKACAgICBzY2FsZSAlLjNmCgB0b3J1cyB7ICUuM2YsICUuM2YKACAgICA8JTkuM2YsICU5LjNmLCAlOS4zZj4sICUuM2YKACBpbiAlcyAtIHNldHRpbmcgdG8gJS4wMmYKAGNpcmNsZSAlcyAlLjBmLCUuMGYsJS4wZgoAcmVjdCAlcyAlLjBmLCUuMGYgJS4wZiwlLjBmCgAlZCAlZCAlZCAlLjBmICVkICVkICVkICVkICVkICUuM2YgJWQgJS40ZiAlLjBmICUuMGYgJS4wZiAlLjBmICUuMGYgJS4wZiAlLjBmICUuMGYKACAlLjBmICUuMGYgJS4wZiAlLjBmICUuMGYgJS4wZiAlLjBmICUuMGYgJS4wZiAlLjBmCgAlJSUlUGFnZTogMSAxCiUlJSVQYWdlQm91bmRpbmdCb3g6ICUuMGYgJS4wZiAlLjBmICUuMGYKAHBvc1slenVdICUuMGYgJS4wZgoALm5yIFNGICUuMGYKc2NhbGV0aGlja25lc3MgPSAlLjBmCgAlcyBzYXZlIHBvaW50IHNpemUgYW5kIGZvbnQKLm5yIC5TIFxuKC5zCi5uciBERiBcbiguZgoAc2hvd3BhZ2UKJSUlJVRyYWlsZXIKJSUlJUJvdW5kaW5nQm94OiAlLmYgJS5mICUuZiAlLmYKAGFkZGluZyAlenUgaXRlbXMsIHRvdGFsIGFyZWEgPSAlZiwgdyA9ICVmLCBhcmVhL3c9JWYKAGdhcD0lZiwlZgoAICBhc3BlY3QgJWYKAGEgJWYgYiAlZiBjICVmIGQgJWYgciAlZgoAbW9kZWwgJWQgc21hcnRfaW5pdCAlZCBzdHJlc3N3dCAlZCBpdGVyYXRpb25zICVkIHRvbCAlZgoAU29sdmluZyBtb2RlbCAlZCBpdGVyYXRpb25zICVkIHRvbCAlZgoAJXMgY29vcmQgJS41ZyAlLjVnIGh0ICVmIHdpZHRoICVmCgByZWMgJWYgJWYgJWYgJWYKACVzIDogJWYgJWYgJWYgJWYKACVzIDogJWYgJWYKAG1heHBzaHQgPSAlZgptYXhwc3dpZCA9ICVmCgBtZHNNb2RlbDogZGVsdGEgPSAlZgoAIHIxICVmIHIyICVmCgBQYWNraW5nOiBjb21wdXRlIGdyaWQgc2l6ZQoAZ3NhdmUKACUlRW5kQ29tbWVudHMKc2F2ZQoAVW5yZWNvZ25pemVkIGNoYXJhY3RlciAnJWMnICglZCkgaW4gc2lkZXMgYXR0cmlidXRlCgBJbWFnZXMgdW5zdXBwb3J0ZWQgaW4gImJhY2tncm91bmQiIGF0dHJpYnV0ZQoAJXMgR05VIHBpYyB2cy4gMTB0aCBFZGl0aW9uIGRcKGUndGVudGUKAHJlc2V0ICVzIHNldCB0byBrbm93biBzdGF0ZQoAJWcgJWcgc2V0X3NjYWxlICVkIHJvdGF0ZSAlZyAlZyB0cmFuc2xhdGUKACVmICVmIHRyYW5zbGF0ZQoAJWQgJWQgdHJhbnNsYXRlCgAvLyoqKiBlbGxpcHNlCgBVbnJlY29nbml6ZWQgb3ZlcmxhcCB2YWx1ZSAiJXMiIC0gdXNpbmcgZmFsc2UKAG1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUKACVzOiB2c25wcmludGYgZmFpbHVyZQoAZW5kcGFnZQpzaG93cGFnZQpncmVzdG9yZQoAZW5kCnJlc3RvcmUKAGxheW91dCB3YXMgbm90IGRvbmUKAExheW91dCB3YXMgbm90IGRvbmUKAC8vKioqIHBvbHlsaW5lCgB0cnlpbmcgdG8gZGVsZXRlIGEgbm9uLWxpbmUKACMgZW5kIG9mIEZJRyBmaWxlCgBTaW5nbGUKAHJlbmRlcmVyIGZvciAlcyBpcyB1bmF2YWlsYWJsZQoAZHluYW1pYyBsb2FkaW5nIG5vdCBhdmFpbGFibGUKACUuMGYgJS4wZiBsaW5ldG8gc3Ryb2tlCgBjbG9zZXBhdGggc3Ryb2tlCgAgZWxsaXBzZV9wYXRoIHN0cm9rZQoALy8qKiogYmVnaW5fZWRnZQoALy8qKiogZW5kX2VkZ2UKAGxvc3QgJXMgJXMgZWRnZQoAb3ZlcmZsb3cgd2hlbiBjYWxjdWxhdGluZyB2aXJ0dWFsIHdlaWdodCBvZiBlZGdlCgBhZGRfdHJlZV9lZGdlOiBtaXNzaW5nIHRyZWUgZWRnZQoAaW4gcm91dGVzcGxpbmVzLCBjYW5ub3QgZmluZCBOT1JNQUwgZWRnZQoAc2hvd3BhZ2UKACVkICVkICVkIGJlZ2lucGFnZQoALy8qKiogYmVnaW5fcGFnZQoALy8qKiogZW5kX3BhZ2UKAEZpbGVuYW1lICIlcyIgaXMgdW5zYWZlCgBsYWJlbDogYXJlYSB0b28gbGFyZ2UgZm9yIHJ0cmVlCgAvLyoqKiBlbmRfbm9kZQoAVXNpbmcgZGVmYXVsdCBjYWxjdWxhdGlvbiBmb3Igcm9vdCBub2RlCgBjb250YWluX25vZGVzIGNsdXN0ICVzIHJhbmsgJWQgbWlzc2luZyBub2RlCgAlZiAlZiAlZiAlZiBub2RlCgA8PCAvUGFnZVNpemUgWyVkICVkXSA+PiBzZXRwYWdlZGV2aWNlCgBpbiBjaGVja3BhdGgsIGJveCAlenUgaGFzIExMIGNvb3JkID4gVVIgY29vcmQKAGluIGNoZWNrcGF0aCwgYm94IDAgaGFzIExMIGNvb3JkID4gVVIgY29vcmQKAGNsdXN0ZXIgbmFtZWQgJXMgbm90IGZvdW5kCgBtaW5jcm9zczogcGFzcyAlZCBpdGVyICVkIHRyeWluZyAlZCBjdXJfY3Jvc3MgJWxsZCBiZXN0X2Nyb3NzICVsbGQKAG5vZGUgJXMsIHBvcnQgJXMgdW5yZWNvZ25pemVkCgAlcyVzIHVuc3VwcG9ydGVkCgBjbHVzdGVyIGN5Y2xlICVzIC0tICVzIG5vdCBzdXBwb3J0ZWQKACVzIC0+ICVzOiBzcGxpbmUgc2l6ZSA+IDEgbm90IHN1cHBvcnRlZAoAbGF5b3V0IGFib3J0ZWQKAHBhZ2VkaXI9JXMgaWdub3JlZAoAVHdvIGNsdXN0ZXJzIG5hbWVkICVzIC0gdGhlIHNlY29uZCB3aWxsIGJlIGlnbm9yZWQKAElsbGVnYWwgYXR0cmlidXRlICVzIGluICVzIC0gaWdub3JlZAoAVW5rbm93biB2YWx1ZSAlcyBmb3IgYXR0cmlidXRlICJtb2RlbCIgaW4gZ3JhcGggJXMgLSBpZ25vcmVkCgBJbGxlZ2FsIHZhbHVlICVzIGZvciBhdHRyaWJ1dGUgIm1vZGUiIGluIGdyYXBoICVzIC0gaWdub3JlZAoAc3RhcnQ9MCBub3Qgc3VwcG9ydGVkIHdpdGggbW9kZT1zZWxmIC0gaWdub3JlZAoAT3ZlcmxhcCB2YWx1ZSAiJXMiIHVuc3VwcG9ydGVkIC0gaWdub3JlZAoAVW5rbm93biB2YWx1ZSAlcyBmb3IgUk9XUyAtIGlnbm9yZWQKAFVua25vd24gdmFsdWUgJXMgZm9yIENPTFVNTlMgLSBpZ25vcmVkCgBJbGxlZ2FsIHZhbHVlICVzIGZvciBWQUxJR04gLSBpZ25vcmVkCgBJbGxlZ2FsIHZhbHVlICVzIGZvciBBTElHTiAtIGlnbm9yZWQKAElsbGVnYWwgdmFsdWUgJXMgZm9yIEZJWEVEU0laRSAtIGlnbm9yZWQKAElsbGVnYWwgdmFsdWUgJS4qcyBmb3IgU1RZTEUgLSBpZ25vcmVkCgBJbGxlZ2FsIHZhbHVlICVzIGZvciBCQUxJR04gaW4gVEQgLSBpZ25vcmVkCgBJbGxlZ2FsIHZhbHVlICVzIGZvciBBTElHTiBpbiBURCAtIGlnbm9yZWQKAFJPV1NQQU4gdmFsdWUgY2Fubm90IGJlIDAgLSBpZ25vcmVkCgBDT0xTUEFOIHZhbHVlIGNhbm5vdCBiZSAwIC0gaWdub3JlZAoAbm9kZSAlcywgcG9ydCAlcywgdW5yZWNvZ25pemVkIGNvbXBhc3MgcG9pbnQgJyVzJyAtIGlnbm9yZWQKAFVua25vd24gInNwbGluZXMiIHZhbHVlOiAiJXMiIC0gaWdub3JlZAoAaW4gcm91dGVzcGxpbmVzLCBQc2hvcnRlc3RwYXRoIGZhaWxlZAoAaW4gcm91dGVzcGxpbmVzLCBQcm91dGVzcGxpbmUgZmFpbGVkCgAjIHBsdWdpbiBsb2FkaW5nIG9mIGRlcGVuZGVuY3kgIiUuKnMiIGZhaWxlZAoAUGFyc2luZyBvZiAiJXMiIGZhaWxlZAoAJXM6JWQ6IGNsYWltZWQgdW5yZWFjaGFibGUgY29kZSB3YXMgcmVhY2hlZAoAIyB1bnN1Y2Nlc3NmdWwgcGx1Z2luIGxvYWQKACUuNWcgJS41ZyB0cmFuc2xhdGUgbmV3cGF0aCB1c2VyX3NoYXBlXyVkCgBuc2l6ZXNjYWxlPSVmLGl0ZXJhdGlvbnM9JWQKAGN0cmwtPm92ZXJsYXA9JWQKACVzICV6dSBub2RlcyAlenUgZWRnZXMgbWF4aXRlcj0lZCBiYWxhbmNlPSVkCgAvLyoqKiBiZWdpbl9sYXllcjogJXMsICVkLyVkCgBkZWdlbmVyYXRlIGNvbmNlbnRyYXRlZCByYW5rICVzLCVkCgAgIG1heCBsZXZlbHMgJWQKAAklcyAlZAoAICBCYXJuZXMtSHV0dCBjb25zdGFudCAlLjAzZiB0b2xlcmFuY2UgICUuMDNmIG1heGl0ZXIgJWQKAGd2d3JpdGVfbm9feiBwcm9ibGVtICVkCgAgIHF1YWR0cmVlIHNpemUgJWQgbWF4X2xldmVsICVkCgByZWJ1aWxkX3ZsaXN0czogbGVhZCBpcyBudWxsIGZvciByYW5rICVkCgByZWJ1aWxkX3ZsaXN0czogcmFuayBsZWFkICVzIG5vdCBpbiBvcmRlciAlZCBvZiByYW5rICVkCgAgIHNtb290aGluZyAlcyBvdmVybGFwICVkIGluaXRpYWxfc2NhbGluZyAlLjAzZiBkb19zaHJpbmtpbmcgJWQKACAgY29vbGluZyAlLjAzZiBzdGVwIHNpemUgICUuMDNmIGFkYXB0aXZlICVkCgBVbnN1cHBvcnRlZCBjaGFyc2V0IHZhbHVlICVkCgBpbiByb3V0ZXNwbGluZXMsIGlsbGVnYWwgdmFsdWVzIG9mIHByZXYgJWQgYW5kIG5leHQgJWQsIGxpbmUgJWQKACAgZWRnZV9sYWJlbGluZ19zY2hlbWUgJWQKAGFnZGljdG9mOiB1bmtub3duIGtpbmQgJWQKACAgcmFuZG9tIHN0YXJ0ICVkIHNlZWQgJWQKACVkICVkICVkICUuMGYgJWQgJWQgJWQgJWQgJWQgJS4xZiAlZCAlZCAlZCAlZAoAJSUlJVBhZ2VCb3VuZGluZ0JveDogJWQgJWQgJWQgJWQKACUlJSVCb3VuZGluZ0JveDogJWQgJWQgJWQgJWQKACUlJSVQYWdlOiAlZCAlZAoAJXMgbm8uIGNlbGxzICVkIFcgJWQgSCAlZAoATWF4cmFuayA9ICVkLCBtaW5yYW5rID0gJWQKAHN0ZXAgc2l6ZSA9ICVkCgAlJSUlUGFnZXM6ICVkCgAjIFBhZ2VzOiAlZAoAJSUlJUVuZFBhZ2U6ICVkCgAiZm9udGNoYXIiOiAlZAoAICBmbGFncyAgJWQKACAgc2l6ZSAgICVkCgAlcyBkYXNod2lkIGlzIDAuMSBpbiAxMHRoIEVkaXRpb24sIDAuMDUgaW4gRFdCIDIgYW5kIGluIGdwaWMKACVzIG1heHBzaHQgYW5kIG1heHBzd2lkIGFyZSBwcmVkZWZpbmVkIHRvIDExLjAgYW5kIDguNSBpbiBncGljCgAgJWQlcyBpdGVyYXRpb25zICUuMmYgc2VjCgAKZmluYWwgZSA9ICVmICVkIGl0ZXJhdGlvbnMgJS4yZiBzZWMKACVkIG5vZGVzICUuMmYgc2VjCgAlcyV6dSBub2RlcyAlenUgZWRnZXMgJWQgaXRlciAlLjJmIHNlYwoACmZpbmlzaGVkIGluICUuMmYgc2VjCgA6ICUuMmYgc2VjCgAgbm9kZVtzaGFwZT1wb2ludF0KACJyZWN0IjogWyUuMDNmLCUuMDNmLCUuMDNmLCUuMDNmXQoAaW5zdGFsbF9pbl9yYW5rLCBsaW5lICVkOiBORF9vcmRlciglcykgWyVkXSA+IEdEX3JhbmsoUm9vdClbJWRdLmFuIFslZF0KAGluc3RhbGxfaW5fcmFuaywgbGluZSAlZDogR0RfcmFuayhnKVslZF0udiArIE5EX29yZGVyKCVzKSBbJWRdID4gR0RfcmFuayhnKVslZF0uYXYgKyBHRF9yYW5rKFJvb3QpWyVkXS5hbiBbJWRdCgBpbnN0YWxsX2luX3JhbmssIGxpbmUgJWQ6IHJhbmsgJWQgbm90IGluIHJhbmsgcmFuZ2UgWyVkLCVkXQoAZmFpbGVkIGF0IG5vZGUgJWRbMV0KAGZhaWxlZCBhdCBub2RlICVkWzBdCgAgICVkIC0tICVkW2xhYmVsPSIlZiJdCgAgICVkIFtwb3M9IiUuMGYsJS4wZiEiXQoAIF0KAERvdDogWwoAIm9iamVjdHMiOiBbCgAic3ViZ3JhcGhzIjogWwoAImVkZ2VzIjogWwoAIm5vZGVzIjogWwoAWCBlbHNlIFoKCWRlZmluZSBzZXRmaWxsdmFsIFkgZmlsbHZhbCA9IFk7CglkZWZpbmUgYm9sZCBZIFk7CglkZWZpbmUgZmlsbGVkIFkgZmlsbCBZOwpaCgBpZiBib3hyYWQgPiAxLjAgJiYgZGFzaHdpZCA8IDAuMDc1IHRoZW4gWAoJZmlsbHZhbCA9IDE7CglkZWZpbmUgZmlsbCBZIFk7CglkZWZpbmUgc29saWQgWSBZOwoJZGVmaW5lIHJlc2V0IFkgc2NhbGU9MS4wIFk7ClgKACBBQk9SVElORwoAJSVFT0YKACVzIHJlc3RvcmUgcG9pbnQgc2l6ZSBhbmQgZm9udAoucHMgXG4oLlMKLmZ0IFxuKERGCgBdCi5QRQoAaW52YWxpZGF0ZV9wYXRoOiBza2lwcGVkIG92ZXIgTENBCgBJbnZhbGlkICVkLWJ5dGUgVVRGOCBmb3VuZCBpbiBpbnB1dCBvZiBncmFwaCAlcyAtIHRyZWF0ZWQgYXMgTGF0aW4tMS4gUGVyaGFwcyAiLUdjaGFyc2V0PWxhdGluMSIgaXMgbmVlZGVkPwoAVVRGOCBjb2RlcyA+IDQgYnl0ZXMgYXJlIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkIChncmFwaCAlcykgLSB0cmVhdGVkIGFzIExhdGluLTEuIFBlcmhhcHMgIi1HY2hhcnNldD1sYXRpbjEiIGlzIG5lZWRlZD8KADwvdGV4dD4KADwvbGluZWFyR3JhZGllbnQ+CjwvZGVmcz4KADwvcmFkaWFsR3JhZGllbnQ+CjwvZGVmcz4KADwvbWFwPgoAPC9zdmc+CgA8L2E+CjwvZz4KACAgICByb3RhdGUgICA8JTkuM2YsICU5LjNmLCAlOS4zZj4KACAgICBzY2FsZSAgICA8JTkuM2YsICU5LjNmLCAlOS4zZj4KADwvdGl0bGU+CgAiIHR5cGU9InRleHQvY3NzIj8+CgA8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ibm8iPz4KACAgICB0cmFuc2xhdGU8JTkuM2YsICU5LjNmLCAlZC4wMDA+CgA7Ii8+CgAgUGFnZXM6ICVkIC0tPgoAKQogLS0+CgAgLT4KADwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIKICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPgoAKSI+CgByXyVkIiBjeD0iNTAlJSIgY3k9IjUwJSUiIHI9Ijc1JSUiIGZ4PSIlLjBmJSUiIGZ5PSIlLjBmJSUiPgoAIiA+CgAjZGVjbGFyZSAlcyA9ICVzOwoACSVzCXNvcnJ5LCB0aGUgZ3JvZmYgZm9sa3MgY2hhbmdlZCBncGljOyBzZW5kIGFueSBjb21wbGFpbnQgdG8gdGhlbTsKAAklcwlpbnN0YWxsIGEgbW9yZSByZWNlbnQgdmVyc2lvbiBvZiBncGljIG9yIHN3aXRjaCB0byBEV0Igb3IgMTB0aCBFZGl0aW9uIHBpYzsKAF07CgBpZiBmaWxsdmFsID4gMC40IHRoZW4gWAoJZGVmaW5lIHNldGZpbGx2YWwgWSBmaWxsdmFsID0gMSAtIFk7CglkZWZpbmUgYm9sZCBZIHRoaWNrbmVzcyAyIFk7CgAjdmVyc2lvbiAzLjY7CgBlbGxpcHNlIGF0dHJzMCAlc3dpZCAlLjVmIGh0ICUuNWYgYXQgKCUuNWYsJS41Zik7CgAiIGF0ICglLjVmLCUuNWYpOwoAJSVCZWdpbkRvY3VtZW50OgoAJXp1IGJveGVzOgoAcGFjayBpbmZvOgoAc3ByaW5nX2VsZWN0cmljYWxfY29udHJvbDoKAFVuc3VwcG9ydGVkIGNoYXJzZXQgIiVzIiAtIGFzc3VtaW5nIHV0Zi04CgAgICAgICBhbWJpZW50SW50ZW5zaXR5IDAuMzMKACNGSUcgMy4yCgAtMgoAJXMgbm9uLWZhdGFsIHJ1bi10aW1lIHBpYyB2ZXJzaW9uIGRldGVybWluYXRpb24sIHZlcnNpb24gMgoAJXMgZmlsbHZhbCBpcyAwLjMgaW4gMTB0aCBFZGl0aW9uIChmaWxsIDAgbWVhbnMgYmxhY2spLCAwLjUgaW4gZ3BpYyAoZmlsbCAwIG1lYW5zIHdoaXRlKSwgdW5kZWZpbmVkIGluIERXQiAyCgAlcyByZXNldCB3b3JrcyBpbiBncGljIGFuZCAxMHRoIGVkaXRpb24sIGJ1dCBpc24ndCBkZWZpbmVkIGluIERXQiAyCgBzZXR1cExhdGluMQoAXDAwMQoAJXMgICAgICAgIHRvbGVyYW5jZSAwLjAxCgAgICAgdG9sZXJhbmNlIDAuMQoAJSVQYWdlczogMQoAICAgICAgICBkaWZmdXNlQ29sb3IgMSAxIDEKADEwMC4wMAoAIEVQU0YtMy4wCgAlcyBib3hyYWQgaXMgbm93IDAuMCBpbiBncGljLCBlbHNlIGl0IHJlbWFpbnMgMi4wCgBzcGhlcmUgezwlOS4zZiwgJTkuM2YsICU5LjNmPiwgMS4wCgBXYXJuaW5nOiBubyB2YWx1ZSBmb3Igd2lkdGggb2YgQVNDSUkgY2hhcmFjdGVyICV1LiBGYWxsaW5nIGJhY2sgdG8gMAoAaW5zdGFsbF9pbl9yYW5rLCBsaW5lICVkOiAlcyAlcyByYW5rICVkIGkgPSAlZCBhbiA9IDAKAGNvbmNlbnRyYXRlPXRydWUgbWF5IG5vdCB3b3JrIGNvcnJlY3RseS4KAE5vIGxpYnogc3VwcG9ydC4KAHR3b3BpOiB1c2Ugb2Ygd2VpZ2h0PTAgY3JlYXRlcyBkaXNjb25uZWN0ZWQgY29tcG9uZW50LgoAdGhlIGdyYXBoIGludG8gY29ubmVjdGVkIGNvbXBvbmVudHMuCgBPcnRob2dvbmFsIGVkZ2VzIGRvIG5vdCBjdXJyZW50bHkgaGFuZGxlIGVkZ2UgbGFiZWxzLiBUcnkgdXNpbmcgeGxhYmVscy4KAG1pbmNyb3NzICVzOiAlbGxkIGNyb3NzaW5ncywgJS4yZiBzZWNzLgoAJXMgaXMgbm90IGEga25vd24gY29sb3IuCgBpcyBpbmFwcHJvcHJpYXRlLiBSZXZlcnRpbmcgdG8gdGhlIHNob3J0ZXN0IHBhdGggbW9kZWwuCgBpcyB1bmRlZmluZWQuIFJldmVydGluZyB0byB0aGUgc2hvcnRlc3QgcGF0aCBtb2RlbC4KAFVuYWJsZSB0byByZWNsYWltIGJveCBzcGFjZSBpbiBzcGxpbmUgcm91dGluZyBmb3IgZWRnZSAiJXMiIC0+ICIlcyIuIFNvbWV0aGluZyBpcyBwcm9iYWJseSBzZXJpb3VzbHkgd3JvbmcuCgBFcnJvciBkdXJpbmcgY29udmVyc2lvbiB0byAiVVRGLTgiLiBRdWl0aW5nLgoAb3JkZXJpbmcgJyVzJyBub3QgcmVjb2duaXplZC4KAGdyYWRpZW50IHBlbiBjb2xvcnMgbm90IHlldCBzdXBwb3J0ZWQuCgAgIGluaXRDTWFqVlBTQyBkb25lOiAlZCBnbG9iYWwgY29uc3RyYWludHMgZ2VuZXJhdGVkLgoAVGhlIGNoYXJhY3RlciAnJWMnIGFwcGVhcnMgaW4gYm90aCB0aGUgbGF5ZXJzZXAgYW5kIGxheWVybGlzdHNlcCBhdHRyaWJ1dGVzIC0gbGF5ZXJsaXN0c2VwIGlnbm9yZWQuCgB0aGUgYXNwZWN0IGF0dHJpYnV0ZSBoYXMgYmVlbiBkaXNhYmxlZCBkdWUgdG8gaW1wbGVtZW50YXRpb24gZmxhd3MgLSBhdHRyaWJ1dGUgaWdub3JlZC4KAFRoZSBsYXllcnNlbGVjdCBhdHRyaWJ1dGUgIiVzIiBkb2VzIG5vdCBtYXRjaCBhbnkgbGF5ZXIgc3BlY2lmZWQgYnkgdGhlIGxheWVycyBhdHRyaWJ1dGUgLSBpZ25vcmVkLgoAZWRnZSAlcyAtPiAlcyA6IHNldCBtb3JlIHRoYW4gb25lIHNwbGluZS4gRmlyc3QgdXNlZCwgb3RoZXIgZHJvcHBlZC4KACV6dSBvdXQgb2YgJXp1IGxhYmVscyBwb3NpdGlvbmVkLgoAJXp1IG91dCBvZiAlenUgZXh0ZXJpb3IgbGFiZWxzIHBvc2l0aW9uZWQuCgAgIGdlbmVyYXRlIGVkZ2UgY29uc3RyYWludHMuLi4KAEdlbmVyYXRpbmcgTm9uLW92ZXJsYXAgQ29uc3RyYWludHMuLi4KAEdlbmVyYXRpbmcgRWRnZSBDb25zdHJhaW50cy4uLgoAR2VuZXJhdGluZyBEaUctQ29MYSBFZGdlIENvbnN0cmFpbnRz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c2V0dGluZyBhIGJvdW5kaW5nIGJveCBzaXplLCBzZWUgZG90KDEpKQoAZXJyb3IgaW4gY29sb3J4bGF0ZSgpCgB0cnVuY2F0aW5nIHN0eWxlICclcycKAElsbGVnYWwgdmFsdWUgaW4gIiVzIiBjb2xvciBhdHRyaWJ1dGU7IGZsb2F0IGV4cGVjdGVkIGFmdGVyICc7JwoAZGVmaW5lIGF0dHJzMCAlJSAlJTsgZGVmaW5lIHVuZmlsbGVkICUlICUlOyBkZWZpbmUgcm91bmRlZCAlJSAlJTsgZGVmaW5lIGRpYWdvbmFscyAlJSAlJQoAPHN2ZyB3aWR0aD0iJWRwdCIgaGVpZ2h0PSIlZHB0IgoAIyBkZXBlbmRlbmNpZXMgIiUuKnMiIGRpZCBub3QgbWF0Y2ggIiUuKnMiCgAjIHR5cGUgIiUuKnMiIGRpZCBub3QgbWF0Y2ggIiUuKnMiCgAkYyBjcmVhdGUgaW1hZ2UgJS4yZiAlLjJmIC1pbWFnZSAicGhvdG9fJXMiCgBObyBvciBpbXByb3BlciBpbWFnZSBmaWxlPSIlcyIKAGZpbGUgbG9hZGluZyBpcyBkaXNhYmxlZCBiZWNhdXNlIHRoZSBlbnZpcm9ubWVudCBjb250YWlucyBTRVJWRVJfTkFNRT0iJXMiCgBDb3VsZCBub3QgcGFyc2UgeGRvdCAiJXMiCgBObyBsb2FkaW1hZ2UgcGx1Z2luIGZvciAiJXMiCgAgWyV6dV0gKCUuMDJmLCUuMDJmKSAoJS4wMmYsJS4wMmYpICVwICIlcyIKAGZvbnRuYW1lOiB1bmFibGUgdG8gcmVzb2x2ZSAiJXMiCgBEdXBsaWNhdGUgY2x1c3RlciBuYW1lICIlcyIKAHVucmVjb2duaXplZCBhcGkgbmFtZSAiJXMiCgBpbWFnZSBjcmVhdGUgcGhvdG8gInBob3RvXyVzIiAtZmlsZSAiJXMiCgBObyBvciBpbXByb3BlciBzaGFwZWZpbGU9IiVzIiBmb3Igbm9kZSAiJXMiCgBObyBvciBpbXByb3BlciBpbWFnZT0iJXMiIGZvciBub2RlICIlcyIKAG5vZGUgIiVzIiBpcyBjb250YWluZWQgaW4gdHdvIG5vbi1jb21wYXJhYmxlIGNsdXN0ZXJzICIlcyIgYW5kICIlcyIKAEVycm9yOiBub2RlICIlcyIgYmVsb25ncyB0byB0d28gbm9uLW5lc3RlZCBjbHVzdGVycyAiJXMiIGFuZCAiJXMiCgAgICIlcyIKACNpbmNsdWRlICJjb2xvcnMuaW5jIgojaW5jbHVkZSAidGV4dHVyZXMuaW5jIgojaW5jbHVkZSAic2hhcGVzLmluYyIKAFVua25vd24gSFRNTCBlbGVtZW50IDwlcz4gb24gbGluZSAlbHUgCgAlcyBpbiBsaW5lICVsdSAKAHNjYWxlIGJ5ICVnLCVnIAoAY29tcHJlc3MgJWcgCgBMYXlvdXQgd2FzIG5vdCBkb25lLiAgTWlzc2luZyBsYXlvdXQgcGx1Z2lucz8gCgCJUE5HDQoaCgAJAEGBgAULtgMBAQEBAQEBAQIDAQECAQEBAQEBAQEBAQEBAQEBAQEBAgEEBQEBAQEBAQYBAQcICQoKCgoKCgoKCgoBAQsBDAENDg8QERITFBUWExMTExcYGRMaGxwdExMTExMBHgEBEwEfICEiIxMkJSYTExMTJygpEyorLC0TExMTEwEBAQEBExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMuExMTLxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTMBMTExMTExMTExMTExMTExMAAAAAAAAEAAQAHAAcACEAIQAkACIACgACABYACQAiACIAIgAVAB0AAQAUABQAFAAUABQAFAAUAAgABAAFABwAGwAXABwAIQAgAB8AHgAJABMAAAAVABIAFQADAAcAFQAVABQAFAAUABQAFAAUABQAFAAIAAQABQAFAAYAHAAaABgAGQAhAAcAFQAUABQAFAAUABQAFAALABQADQAUAAwAFAAUABQADgAUABQAFAAQABQADwAUABEAQcKDBQuVBAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAMABAAHAAMABAAFAAUABgAGAAgABwAHABEAFgASABEAEgAIAAgADwAPABcADwAYAA8AGQAaABoAHgAWADQAHgAFADIABgAiACIAMwAXABgANQAZABoAGgAqADYAKgA0ADcAMgBFADsAPAAzADsAPABGADUARwBIAEwANgAiAEkASgA3AEUATgBQAGIAUQBSAFQARgBHAFUASABMAFYASQBKAFgAWgBOAEQAUABRAFIAVAA4AC8ALABVACkAVgAbABAAWABaAF0AXQBdAF0AXQBdAF0AXgBeAF4AXgBeAF4AXgBfAF8AXwBfAF8AXwBfAGAACQBgAGAAYABgAGAAYQBhAGMAAgBjAGMAYwBjAGMAZAAAAGQAAABkAGQAZABlAAAAZQBlAGUAZQBlAGYAAAAAAGYAZgBmAGYAZwAAAGcAZwBnAGcAaAAAAGgAaABoAGgAaABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAEHkhwULzQGuAC4ALwAzADUAMAA3AKoA2wDbANsA2wAAAD0AhwA3ADcA2wDbAAAAKAA1AC4AMgAvAGIAAAAAAEcAAADbANsAUQAAANsA2wDbAAAA2wCEAFUA2wCCANsAAACBANsAAAA+AEIAQQBIAEQAUgBbAAAAAABeAF8A2wAAANsA2wDbAAAAAAB7AEkAVwBSAFoAWgBdAAAAXwAAAF8AAABlAF0AXwAAAF0AbgBqAAAAaQAAAG4AAADbAJMAmgChAKgAqwBwALEAuAC/AMYAzQDTAEHCiQULzwFcAAEAXQBdAF4AXgBfAF8AXABcAFwAXABcAGAAXABcAFwAYQBcAFwAYgBiAGIAYgBiAGIAYgBjAGQAZQBmAFwAXABcAGcAXABcAFwAYABcAFwAYQBcAGEAXABoAGEAXABiAGIAYgBiAGIAYgBiAGIAYwBkAGUAZQBcAGYAXABcAFwAZwBoAGEAYgBiAGIAYgBiAGIAYgBiAGIAYgBiAGIAYgBiAGIAYgBiAGIAYgBiAGIAYgBiAAAAXABcAFwAXABcAFwAXABcAFwAXABcAFwAQaGLBQswAQECAwEEAQUBBgcHAQYGBgYGBgYGBgYGBgYGBgYDBgYGBgYGBgYGBgYGBgYGBgYGAEHiiwULowQKAAsADAANAA4ACgAPABAAEQASABMACgAUABUAFQAVABYAFwAVABgAFQAVABkAFQAVABUAGgAVABUACgAVABUAFQAWABcAGAAVABUAGQAVABUAFQAaABUAFQAVABUAGwAMAAwAJAAeAB4AIAAhACAAIQAkACUAJgAtADIALwAuACoAJQAmACgAKQAzACoANAArADUANgA3ADwAMgBHAD0AIgBFACIAPwBAAEYAMwA0AEgANQA2ADcALwBJACoARwBKAEUATABcADwARgBcAD0ATQBIAE4ATwBSAEkAQQBQAFEASgBMAFMAVAAxAFUAVgBXAE0ATgBYAE8AUgBZAFAAUQBaAFsAUwBEAFQAVQBWAFcASwBEACwAWAAsAFkAOAAsAFoAWwAdAB0AHQAdAB0AHQAdAB8AHwAfAB8AHwAfAB8AIwAjACMAIwAjACMAIwAnAFwAJwAnACcAJwAnADAAMAA5ABwAOQA5ADkAOQA5ADoAXAA6AFwAOgA6ADoAOwBcADsAOwA7ADsAOwA+AFwAXAA+AD4APgA+AEIAXABCAEIAQgBCAEMAXABDAEMAQwBDAEMACQBcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXAAMAAAADQAAAA4AAAAOAEGQkAUL0QUR7u4TCAPu/u7u7gHu7u4B7u4J/u4SFRfuEgHu7u7uCg3u7u7u7u7u7u4B7u4WCAEBGQ4Y7u4bGBru7h3u7u7uARX77u7u7hAe7u7uAAAAAAACAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWEQICAgICAgICAgICAgISEAITAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIUAhUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAg4CDwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIBAgMEBQYHCAkKCwwNAAAACwMEBQ8HAwwNBgwNDgwNGhUAAQADBw4GDwgM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ADekAAB7Zcx7zMT/AFqXAACMqspDosr/ABiMAACR86wIaKz/APW/AABBEfnw+ej/AOawAABNKevM68X/ANeiAABfPd2o3bX/APqVAAB7Zcx7zMT/ALiKAACMqspDosr/AJWDAACR86wIaKz/AJW+AABBEfnw+ej/AIavAABNKevM68X/AHehAABfPd2o3bX/AJqUAAB7Zcx7zMT/AFiJAACJoNNOs9P/ADWCAACNxb4rjL7/AHp8AACT8p4IWJ7/ADW9AAA8DPz3/PD/ACauAABMGfPg89v/ABegAABNKevM68X/ADqTAABfPd2o3bX/APiHAAB7Zcx7zMT/ANWAAACJoNNOs9P/ABp7AACNxb4rjL7/ALV2AACT8p4IWJ7/AP+7AAA8DPz3/PD/APCsAABMGfPg89v/AOGeAABNKevM68X/AASSAABfPd2o3bX/AMKGAAB7Zcx7zMT/AJ9/AACJoNNOs9P/AOR5AACNxb4rjL7/AH91AACR86wIaKz/AG5yAACW74EIQIH/AEfEAABKFfXl9eD/ADi1AABQSNmh2Zv/ACmnAABisqMxo1T/AOfCAABJD/jt+On/ANizAABONuS65LP/AMmlAABWaMR0xHb/AOyYAABivosji0X/AIfBAABJD/jt+On/AHiyAABONuS65LP/AGmkAABWaMR0xHb/AIyXAABisqMxo1T/AEqMAABm/20AbSz/ACfAAABJD/jt+On/ABixAABNLOnH6cD/AAmjAABQSNmh2Zv/ACyWAABWaMR0xHb/AOqKAABisqMxo1T/AMeDAABm/20AbSz/AMe+AABJD/jt+On/ALivAABNLOnH6cD/AKmhAABQSNmh2Zv/AMyUAABWaMR0xHb/AIqJAABgnqtBq13/AGeCAABivosji0X/AKx8AABs/1oAWjL/AGe9AABIB/z3/PX/AFiuAABKFfXl9eD/AEmgAABNLOnH6cD/AGyTAABQSNmh2Zv/ACqIAABWaMR0xHb/AAeBAABgnqtBq13/AEx7AABivosji0X/AOd2AABs/1oAWjL/ACa8AABIB/z3/PX/ABetAABKFfXl9eD/AAifAABNLOnH6cD/ACuSAABQSNmh2Zv/AOmGAABWaMR0xHb/AMZ/AABgnqtBq13/AAt6AABivosji0X/AKZ1AABm/20AbSz/AJVyAABl/0QARBv/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AG/DAADk3NDQHIv/AGC0AADlPvHxttr/AFGmAAA9Z+G44Yb/AHSZAABIxqxNrCb/AA/CAADk3NDQHIv/AACzAADlPvHxttr/APGkAAAAAPf39/f/ABSYAAA9Z+G44Yb/ANKMAABIxqxNrCb/AK/AAADm3MXFG33/AKCxAADnTOnpo8n/AJGjAADpHf394O//ALSWAAA7JvXm9dD/AHKLAAA/gdeh12r/AE+EAABExZJNkiH/AE+/AADm3MXFG33/AECwAADnTOnpo8n/ADGiAADpHf394O//AFSVAAAAAPf39/f/ABKKAAA7JvXm9dD/AO+CAAA/gdeh12r/ADR9AABExZJNkiH/AO+9AADm3MXFG33/AOCuAADodt7ed67/ANGgAADlPvHxttr/APSTAADpHf394O//ALKIAAA7JvXm9dD/AI+BAAA9Z+G44Yb/ANR7AAA/prx/vEH/AG93AABExZJNkiH/AK68AADm3MXFG33/AJ+tAADodt7ed67/AJCfAADlPvHxttr/ALOSAADpHf394O//AHGHAAAAAPf39/f/AE6AAAA7JvXm9dD/AJN6AAA9Z+G44Yb/AC52AAA/prx/vEH/AB1zAABExZJNkiH/AP7FAADO/0tAAEv/AB7KAABl/0QARBv/AO+2AADOrYN2KoP/AOCoAADHV6uZcKv/AKOaAADHM8/Cpc//AAGOAADSFejn1Oj/AH6FAABMHvDZ8NP/AGN+AABQRNum26D/AJ54AABYe65armH/AC10AABhxXgbeDf/AIbFAADO/0tAAEv/AJvJAABhxXgbeDf/AGG7AABl/0QARBv/AHe2AADOrYN2KoP/AGioAADHV6uZcKv/ACuaAADHM8/Cpc//AImNAADSFejn1Oj/AAaFAAAAAPf39/f/AOt9AABMHvDZ8NP/ACZ4AABQRNum26D/ALVzAABYe65armH/AKXEAADERsOvjcP/AJa1AAAAAPf39/f/AIenAABSWr9/v3v/AEXDAADJqJR7MpT/ADa0AADHM8/Cpc//ACemAABQRNum26D/AEqZAABm/4gAiDf/AOXBAADJqJR7MpT/ANayAADHM8/Cpc//AMekAAAAAPf39/f/AOqXAABQRNum26D/AKiMAABm/4gAiDf/AIXAAADOrYN2KoP/AHaxAADERsOvjcP/AGejAADSFejn1Oj/AIqWAABMHvDZ8NP/AEiLAABSWr9/v3v/ACWEAABhxXgbeDf/ACW/AADOrYN2KoP/ABawAADERsOvjcP/AAeiAADSFejn1Oj/ACqVAAAAAPf39/f/AOiJAABMHvDZ8NP/AMWCAABSWr9/v3v/AAp9AABhxXgbeDf/AMW9AADOrYN2KoP/ALauAADHV6uZcKv/AKegAADHM8/Cpc//AMqTAADSFejn1Oj/AIiIAABMHvDZ8NP/AGWBAABQRNum26D/AKp7AABYe65armH/AEV3AABhxXgbeDf/AIS8AADOrYN2KoP/AHWtAADHV6uZcKv/AGafAADHM8/Cpc//AImSAADSFejn1Oj/AEeHAAAAAPf39/f/ACSAAABMHvDZ8NP/AGl6AABQRNum26D/AAR2AABYe65armH/APNyAABhxXgbeDf/AAHEAAC9C/Ls5/L/APK0AACXPdumvdv/AOOmAACNxb4rjL7/AKHCAAC5CPbx7vb/AJKzAACbKOG9yeH/AIOlAACRcM90qc//AKaYAACP97AFcLD/AEHBAAC5CPbx7vb/ADKyAACbKOG9yeH/ACOkAACRcM90qc//AEaXAACNxb4rjL7/AASMAACP940EWo3/AOG/AAC5CPbx7vb/ANKwAACoGObQ0eb/AMOiAACXPdumvdv/AOaVAACRcM90qc//AKSKAACNxb4rjL7/AIGDAACP940EWo3/AIG+AAC5CPbx7vb/AHKvAACoGObQ0eb/AGOhAACXPdumvdv/AIaUAACRcM90qc//AESJAACOt8A2kMD/ACGCAACP97AFcLD/AGZ8AACP+HsDTnv/ACG9AADpCP//9/v/ABKuAAC9C/Ls5/L/AAOgAACoGObQ0eb/ACaTAACXPdumvdv/AOSHAACRcM90qc//AMGAAACOt8A2kMD/AAZ7AACP97AFcLD/AKF2AACP+HsDTnv/AOu7AADpCP//9/v/ANysAAC9C/Ls5/L/AM2eAACoGObQ0eb/APCRAACXPdumvdv/AK6GAACRcM90qc//AIt/AACOt8A2kMD/ANB5AACP97AFcLD/AGt1AACP940EWo3/AFpyAACP+VgCOFj/AJHEAADIDvDs4vD/AIK1AACXPdumvdv/AHOnAACC0JkckJn/ADHDAADPCPf27/f/ACK0AACbKOG9yeH/ABOmAACPgM9nqc//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ANaZAADPhKOYTqP/AHHCAAD+4eTkGhz/AGKzAACSsrg3frj/AFOlAABTk69Nr0r/AHaYAADPhKOYTqP/ADSNAAAV////fwD/ABHBAAD+4eTkGhz/AAKyAACSsrg3frj/APOjAABTk69Nr0r/ABaXAADPhKOYTqP/ANSLAAAV////fwD/ALGEAAAqzP///zP/ALG/AAD+4eTkGhz/AKKwAACSsrg3frj/AJOiAABTk69Nr0r/ALaVAADPhKOYTqP/AHSKAAAV////fwD/AFGDAAAqzP///zP/AJZ9AAAPwaamVij/AFG+AAD+4eTkGhz/AEKvAACSsrg3frj/ADOhAABTk69Nr0r/AFaUAADPhKOYTqP/ABSJAAAV////fwD/APGBAAAqzP///zP/ADZ8AAAPwaamVij/ANF3AADoeff3gb//APG8AAD+4eTkGhz/AOKtAACSsrg3frj/ANOfAABTk69Nr0r/APaSAADPhKOYTqP/ALSHAAAV////fwD/AJGAAAAqzP///zP/ANZ6AAAPwaamVij/AHF2AADoeff3gb//AGBzAAAAAJmZmZn/ABLFAAByeMJmwqX/AAO2AAALm/z8jWL/APSnAACcTcuNoMv/ALLDAAByeMJmwqX/AKO0AAALm/z8jWL/AJSmAACcTcuNoMv/ALeZAADkZufnisP/AFLCAAByeMJmwqX/AEOzAAALm/z8jWL/ADSlAACcTcuNoMv/AFeYAADkZufnisP/ABWNAAA6m9im2FT/APLAAAByeMJmwqX/AOOxAAALm/z8jWL/ANSjAACcTcuNoMv/APeWAADkZufnisP/ALWLAAA6m9im2FT/AJKEAAAi0P//2S//AJK/AAByeMJmwqX/AIOwAAALm/z8jWL/AHSiAACcTcuNoMv/AJeVAADkZufnisP/AFWKAAA6m9im2FT/ADKDAAAi0P//2S//AHd9AAAZWuXlxJT/ADK+AAByeMJmwqX/ACOvAAALm/z8jWL/ABShAACcTcuNoMv/ADeUAADkZufnisP/APWIAAA6m9im2FT/ANKBAAAi0P//2S//ABd8AAAZWuXlxJT/ALJ3AAAAALOzs7P/AELGAAB4VNON08f/AGjKAADTUr28gL3/ADO3AAAqTP///7P/ACSpAACvJdq+utr/AOeaAAAEi/v7gHL/AEWOAACQZNOAsdP/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ACs6AAAhIv//+Nz/AEYwAAD259zcFDz/AI80AAB///8A////AP9GAACq/4sAAIv/AIE0AAB//4sAi4v/AHdRAAAe77i4hgv/AEEIAAAAAKmpqan/AJ8zAABV/2QAZAD/AHYHAAAAAKmpqan/AAk7AAAnbr29t2v/AD1gAADU/4uLAIv/ANYzAAA6jmtVay//AF5OAAAX////jAD/AHpTAADGwMyZMsz/AIZVAAAA/4uLAAD/AMYwAAAKeenplnr/ADg0AABVPbyPvI//ADpHAACvj4tIPYv/AGMIAAB/Z08vT0//AJgHAAB/Z08vT0//ABVKAACA/9EAztH/AP8QAADH/9OUANP/AMs5AADo6///FJP/ACJGAACK//8Av///ADQIAAAAAGlpaWn/AGkHAAAAAGlpaWn/AJRGAACU4f8ekP//AGQ6AAAAzrKyIiL/AJ5IAAAcD///+vD/AGIzAABVwIsiiyL/AAJhAADU////AP//AO4uAAAAANzc3Nz/AH1IAACqB//4+P//AL9SAAAj////1wD/AJ1RAAAe2drapSD/AJUIAAAAAICAgID/AGE0AABV/4AAgAD/AE4KAAA70P+t/y//AMoHAAAAAICAgID/AFcLAABVD//w//D/AK85AADplv//abT/AHdVAAAAjM3NXFz/AEwvAADC/4JLAIL/AFYGAAAqD/////D/ABg7AAAmavDw5oz/AAIdAACqFPrm5vr/AG08AADwD///8PX/AJAzAABA//x8/AD/ABQyAAAmMf//+s3/AGJGAACJP+at2Ob/AGo4AAAAd/DwgID/AHI0AAB/H//g////AF8KAAAqKPr6+tL/ACUIAAAAANPT09P/AHMzAABVZO6Q7pD/AFoHAAAAANPT09P/ALw5AAD4Sf//tsH/ALUwAAAMhP//oHr/ABE0AAB90bIgsqr/ABBGAACPdfqHzvr/AE8IAACUOJl3iJn/AIQHAACUOJl3iJn/AM1GAACXNN6wxN7/AD0KAAAqH////+D/ABhMAABV//8A/wD/AOozAABVwM0yzTL/AAwzAAAVFPr68Ob/AE5gAADU////AP//AKkwAAAA/4CAAAD/AGhLAABxgM1mzar/AL1GAACq/80AAM3/AGhTAADMmNO6VdP/AOBMAAC3fNuTcNv/ACQ0AABnqbM8s3H/ACVHAACwj+57aO7/AK4zAABv//oA+pr/AABKAAB9p9FI0cz/AOJUAADk5MfHFYX/AFBGAACqxnAZGXD/AH82AABqCf/1//r/AI1JAAAEHv//5OH/ADwyAAAaSf//5LX/AI1IAAAZUf//3q3/AIIEAACq/4AAAID/AAJRAAAbF/399eb/AO1EAAAq/4CAgAD/ABNgAAA4wI5rjiP/AG5OAAAb////pQD/ANlVAAAL////RQD/AIpTAADWe9racNb/AIpRAAAmSO7u6Kr/APkzAABVZPuY+5j/AChKAAB/Q+6v7u7/APdUAADxfNvbcJP/AEItAAAaKf//79X/AB1CAAAURv//2rn/ANALAAAUsM3NhT//AOI5AAD3P///wMv/APM1AADURt3doN3/AKRGAACEO+aw4Ob/ADxNAADU/4CAAID/ACNWAAAA////AAD/ALovAAAAPby8j4//APBGAACfteFBaeH/AOcvAAAR3IuLRRP/ANYwAAAEivr6gHL/AMkvAAATmvT0pGD/AEo0AABnqosui1f/ADg3AAAREP//9e7/AMhgAAANt6CgUi3/ANYbAAAAAMDAwMD/ADNGAACLbOuHzuv/AE1HAACvj81qWs3/AHYIAACUOJBwgJD/AKsHAACUOJBwgJD/ABIKAAAABf//+vr/AMUzAABq//8A/3//AOFGAACSm7RGgrT/AKg0AAAYVNLStIz/AAU5AAB//4AAgID/AM1MAADUHdjYv9j/ANcuAAAGuP//Y0f/ADtKAAB7tuBA4ND/AB8RAADUc+7ugu7/AMYSAAAbRPX13rP/AMFIAAAAAP//////AD9OAAAAAPX19fX/AHkKAAAq/////wD/AD8zAAA4wM2azTL/ALnEAAAtQ/z3/Ln/AKq1AABEW92t3Y7/AJunAABisqMxo1T/AFnDAAAqMv///8z/AEq0AAA+VebC5pn/ADumAABVZMZ4xnn/AF6ZAABju4QjhEP/APnBAAAqMv///8z/AOqyAAA+VebC5pn/ANukAABVZMZ4xnn/AP6XAABisqMxo1T/ALyMAABr/2gAaDf/AJnAAAAqMv///8z/AIqxAAA3UfDZ8KP/AHujAABEW92t3Y7/AJ6WAABVZMZ4xnn/AFyLAABisqMxo1T/ADmEAABr/2gAaDf/ADm/AAAqMv///8z/ACqwAAA3UfDZ8KP/ABuiAABEW92t3Y7/AD6VAABVZMZ4xnn/APyJAABgnqtBq13/ANmCAABju4QjhEP/AB59AABs/1oAWjL/ANm9AAAqGf///+X/AMquAAAtQ/z3/Ln/ALugAAA3UfDZ8KP/AN6TAABEW92t3Y7/AJyIAABVZMZ4xnn/AHmBAABgnqtBq13/AL57AABju4QjhEP/AFl3AABs/1oAWjL/AJi8AAAqGf///+X/AImtAAAtQ/z3/Ln/AHqfAAA3UfDZ8KP/AJ2SAABEW92t3Y7/AFuHAABVZMZ4xnn/ADiAAABgnqtBq13/AH16AABju4QjhEP/ABh2AABr/2gAaDf/AAdzAABu/0UARSn/AArEAAAxSfjt+LH/APu0AAB1Yc1/zbv/AOymAACQwrgsf7j/AKrCAAAqMv///8z/AJuzAABjQtqh2rT/AIylAACEqsRBtsT/AK+YAACWy6giXqj/AErBAAAqMv///8z/ADuyAABjQtqh2rT/ACykAACEqsRBtsT/AE+XAACQwrgsf7j/AA2MAACkv5QlNJT/AOq/AAAqMv///8z/ANuwAABFOunH6bT/AMyiAAB1Yc1/zbv/AO+VAACEqsRBtsT/AK2KAACQwrgsf7j/AIqDAACkv5QlNJT/AIq+AAAqMv///8z/AHuvAABFOunH6bT/AGyhAAB1Yc1/zbv/AI+UAACEqsRBtsT/AE2JAACL2MAdkcD/ACqCAACWy6giXqj/AG98AACe54QMLIT/ACq9AAAqJv///9n/ABuuAAAxSfjt+LH/AAygAABFOunH6bT/AC+TAAB1Yc1/zbv/AO2HAACEqsRBtsT/AMqAAACL2MAdkcD/AA97AACWy6giXqj/AKp2AACe54QMLIT/APS7AAAqJv///9n/AOWsAAAxSfjt+LH/ANaeAABFOunH6bT/APmRAAB1Yc1/zbv/ALeGAACEqsRBtsT/AJR/AACL2MAdkcD/ANl5AACWy6giXqj/AHR1AACkv5QlNJT/AGNyAACe51gIHVj/AIbEAAAlQv//97z/AHe1AAAcr/7+xE//AGinAAAQ7tnZXw7/ACbDAAAqKv///9T/ABe0AAAccP7+2Y7/AAimAAAW1f7+mSn/ACuZAAAP/MzMTAL/AMbBAAAqKv///9T/ALeyAAAccP7+2Y7/AKikAAAW1f7+mSn/AMuXAAAQ7tnZXw7/AImMAAAN+JmZNAT/AGbAAAAqKv///9T/AFexAAAfbf7+45H/AEijAAAcr/7+xE//AGuWAAAW1f7+mSn/ACmLAAAQ7tnZXw7/AAaEAAAN+JmZNAT/AAa/AAAqKv///9T/APevAAAfbf7+45H/AOihAAAcr/7+xE//AAuVAAAW1f7+mSn/AMmJAAAS6ezscBT/AKaCAAAP/MzMTAL/AOt8AAAM94yMLQT/AKa9AAAqGf///+X/AJeuAAAlQv//97z/AIigAAAfbf7+45H/AKuTAAAcr/7+xE//AGmIAAAW1f7+mSn/AEaBAAAS6ezscBT/AIt7AAAP/MzMTAL/ACZ3AAAM94yMLQT/AGW8AAAqGf///+X/AFatAAAlQv//97z/AEefAAAfbf7+45H/AGqSAAAcr/7+xE//ACiHAAAW1f7+mSn/AAWAAAAS6ezscBT/AEp6AAAP/MzMTAL/AOV1AAAN+JmZNAT/ANRyAAAN8GZmJQb/AOrEAAAiX///7aD/ANu1AAAYsv7+skz/AMynAAAF3fDwOyD/AIrDAAAqTf///7L/AHu0AAAdov7+zFz/AGymAAARwv39jTz/AI+ZAAD+4ePjGhz/ACrCAAAqTf///7L/ABuzAAAdov7+zFz/AAylAAARwv39jTz/AC+YAAAF3fDwOyD/AO2MAAD2/729ACb/AMrAAAAqTf///7L/ALuxAAAeiP7+2Xb/AKyjAAAYsv7+skz/AM+WAAARwv39jTz/AI2LAAAF3fDwOyD/AGqEAAD2/729ACb/AGq/AAAqTf///7L/AFuwAAAeiP7+2Xb/AEyiAAAYsv7+skz/AG+VAAARwv39jTz/AC2KAAAH1Pz8Tir/AAqDAAD+4ePjGhz/AE99AAD1/7GxACb/AAq+AAAqMv///8z/APuuAAAiX///7aD/AOygAAAeiP7+2Xb/AA+UAAAYsv7+skz/AM2IAAARwv39jTz/AKqBAAAH1Pz8Tir/AO97AAD+4ePjGhz/AIp3AAD1/7GxACb/AMm8AAAqMv///8z/ALqtAAAiX///7aD/AKufAAAeiP7+2Xb/AM6SAAAYsv7+skz/AIyHAAARwv39jTz/AGmAAAAH1Pz8Tir/AK56AAD+4ePjGhz/AEl2AAD2/729ACb/ADhzAADy/4CAACb/AGFHAACTD//w+P//ALRIAAAYI/r669f/AF+5AAAXJP//79v/APeqAAAXJO7u38z/AMacAAAXJM3NwLD/AAeQAAAYIouLg3j/AC5gAAB///8A////AINLAABxgP9//9T/AKW5AABxgP9//9T/AD2rAABxgO527sb/AAydAABxgM1mzar/AFSQAABxgItFi3T/AKZKAAB/D//w////AJ65AAB/D//w////ADarAAB/D+7g7u7/AAWdAAB/Ds3Bzc3/AEaQAAB/DouDi4v/AIhOAAAqGvX19dz/AEhFAAAXOv//5MT/AOe4AAAXOv//5MT/AH+qAAAXOu7u1bf/AE6cAAAWOs3Nt57/AI+PAAAXOouLfWv/AIU6AAAAAAAAAAD/ADdSAAAZMf//683/AHBHAACq//8AAP//AEy5AACq//8AAP//AOSqAACq/+4AAO7/ALOcAACq/80AAM3/APSPAACq/4sAAIv/ABQRAADAzuKKK+L/AP0vAAAAvqWlKir/AOi3AAAAv///QED/AJypAAAAv+7uOzv/AHObAAAAv83NMzP/ALSOAAAAvouLIyP/ALFRAAAXY97euIf/AAS6AAAXZP//05v/AIurAAAXY+7uxZH/AFqdAAAXY83Nqn3/AKKQAAAXY4uLc1X/AHZGAACAZ6BfnqD/ABW5AACDZ/+Y9f//AK2qAACDZu6O5e7/AHycAACDZ816xc3/AL2PAACDZotThov/AGVJAAA///9//wD/AHi5AAA///9//wD/ABCrAAA//+527gD/AN+cAAA//81mzQD/ACCQAAA//4tFiwD/ADVJAAAR2tLSaR7/AG25AAAR2///fyT/AAWrAAAR2+7udiH/ANScAAAR2s3NZh3/ABWQAAAR3IuLRRP/AH84AAALr///f1D/AHe4AAAHqf//clb/AByqAAAGqe7ualD/APObAAAGqc3NW0X/ADSPAAAGqIuLPi//AIVGAACak+1kle3/ADA6AAAhIv//+Nz/AJy4AAAhIv//+Nz/AEGqAAAiI+7u6M3/ABicAAAiIs3NyLH/AFmPAAAjIouLiHj/AEswAAD259zcFDz/AJQ0AAB///8A////AFy4AAB///8A////AAGqAAB//+4A7u7/ANibAAB//80Azc3/ABmPAAB//4sAi4v/AARHAACq/4sAAIv/AIY0AAB//4sAi4v/AHxRAAAe77i4hgv/APW5AAAe8P//uQ//AHyrAAAe8O7urQ7/AEudAAAe8M3NlQz/AJOQAAAe8IuLZQj/AEYIAAAAAKmpqan/AKQzAABV/2QAZAD/AHsHAAAAAKmpqan/AA47AAAnbr29t2v/AEJgAADU/4uLAIv/ANszAAA6jmtVay//AC64AAA6j//K/3D/ANOpAAA6j+687mj/AKqbAAA6j82izVr/AOuOAAA6j4tuiz3/AGNOAAAX////jAD/AMi5AAAV////fwD/AGCrAAAV/+7udgD/AC+dAAAV/83NZgD/AHeQAAAV/4uLRQD/AH9TAADGwMyZMsz/ACO6AADGwf+/Pv//AKqrAADGwO6yOu7/AHmdAADGwM2aMs3/AMGQAADGwItoIov/AItVAAAA/4uLAAD/AMswAAAKeenplnr/AD00AABVPbyPvI//AEm4AABVPv/B/8H/AO6pAABVPu607rT/AMWbAABVPs2bzZv/AAaPAABVPotpi2n/AD9HAACvj4tIPYv/AGgIAAB/Z08vT0//AJK3AAB/aP+X////AEKpAAB/Z+6N7u7/ACubAAB/aM15zc3/AHGOAAB/aItSi4v/AJ0HAAB/Z08vT0//ABpKAACA/9EAztH/AAQRAADH/9OUANP/ANA5AADo6///FJP/AJK4AADo6///FJP/ADeqAADo6+7uEon/AA6cAADo683NEHb/AE+PAADn7IuLClD/ACdGAACK//8Av///AP24AACK//8Av///AJWqAACK/+4Asu7/AGScAACK/80Ams3/AKWPAACK/4sAaIv/ADkIAAAAAGlpaWn/AG4HAAAAAGlpaWn/AJlGAACU4f8ekP//ACC5AACU4f8ekP//ALiqAACU4e4chu7/AIecAACU4c0YdM3/AMiPAACU4YsQTov/AGk6AAAAzrKyIiL/AKa4AAAAz///MDD/AEuqAAAAz+7uLCz/ACKcAAAAz83NJib/AGOPAAAAz4uLGhr/AKNIAAAcD///+vD/AGczAABVwIsiiyL/AAdhAADU////AP//APMuAAAAANzc3Nz/AIJIAACqB//4+P//AMRSAAAj////1wD/AA+6AAAj////1wD/AJarAAAj/+7uyQD/AGWdAAAj/83NrQD/AK2QAAAj/4uLdQD/AKJRAAAe2drapSD/APm5AAAe2v//wSX/AICrAAAe2u7utCL/AE+dAAAe2s3Nmx3/AJeQAAAe2ouLaRT/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AFEvAADC/4JLAIL/ALMWAAAqAP////4AAFsGAAAqD/////D/AIW3AAAqD/////D/ADWpAAAqD+7u7uD/AAebAAAqDs3NzcH/AGSOAAAqDouLi4P/AB07AAAmavDw5oz/AMa4AAAncP//9o//AFaqAAAncO7u5oX/AC2cAAAnb83NxnP/AG6PAAAnb4uLhk7/AAcdAACqFPrm5vr/AHI8AADwD///8PX/AM24AADwD///8PX/AF2qAADvD+7u4OX/ADScAADwDs3NwcX/AHWPAADvDouLg4b/AJUzAABA//x8/AD/ABkyAAAmMf//+s3/AAS4AAAmMf//+s3/ALipAAAlMu7u6b//AI+bAAAmMc3NyaX/ANCOAAAnMYuLiXD/AGdGAACJP+at2Ob/AAq5AACKQP+/7///AKKqAACKQO6y3+7/AHGcAACKP82awM3/ALKPAACJQItog4v/AG84AAAAd/DwgID/AHc0AAB/H//g////AFe4AAB/H//g////APypAAB/H+7R7u7/ANObAAB/H820zc3/ABSPAAB/H4t6i4v/AFhRAAAjc+7u3YL/AOW5AAAjdP//7Iv/AGyrAAAjc+7u3IL/ADudAAAjc83NvnD/AIOQAAAjc4uLgUz/AGQKAAAqKPr6+tL/ACoIAAAAANPT09P/AHgzAABVZO6Q7pD/AF8HAAAAANPT09P/AME5AAD4Sf//tsH/AIe4AAD5Uf//rrn/ACyqAAD4Ue7uoq3/AAOcAAD5UM3NjJX/AESPAAD5UIuLX2X/ALowAAAMhP//oHr/APe3AAAMhP//oHr/AKupAAALhO7ulXL/AIKbAAAMhc3NgWL/AMOOAAAMhYuLV0L/ABY0AAB90bIgsqr/ABVGAACPdfqHzvr/AO+4AACPT/+w4v//AIeqAACPT+6k0+7/AFacAACOT82Nts3/AJePAACPTotge4v/ABZHAACvj/+EcP//AFQIAACUOJl3iJn/AIkHAACUOJl3iJn/ANJGAACXNN6wxN7/ACy5AACXNf/K4f//AMSqAACXNe680u7/AJOcAACXNc2itc3/ANSPAACWNYtue4v/AEIKAAAqH////+D/AKu3AAAqH////+D/AFupAAAqH+7u7tH/AESbAAAqH83NzbT/AIqOAAAqH4uLi3r/AB1MAABV//8A/wD/AO8zAABVwM0yzTL/ABEzAAAVFPr68Ob/AFNgAADU////AP//AF+6AADU////AP//AOarAADU/+7uAO7/ALWdAADU/83NAM3/AP2QAADU/4uLAIv/AK4wAADvubCwMGD/AO+3AADky///NLP/AKOpAADky+7uMKf/AHqbAADkzM3NKZD/ALuOAADky4uLHGL/AG1LAABxgM1mzar/AMJGAACq/80AAM3/AG1TAADMmNO6VdP/ABW6AADLmf/gZv//AJyrAADLme7RX+7/AGudAADLmc20Us3/ALOQAADLmot6N4v/AOVMAAC3fNuTcNv/ALq5AAC3ff+rgv//AFKrAAC3fe6fee7/ACGdAAC3fc2JaM3/AGmQAAC3fItdR4v/ACk0AABnqbM8s3H/ACpHAACwj+57aO7/ALMzAABv//oA+pr/AAVKAAB9p9FI0cz/AOdUAADk5MfHFYX/AFVGAACqxnAZGXD/AIQ2AABqCf/1//r/AJJJAAAEHv//5OH/AIS5AAAEHv//5OH/AByrAAAEHu7u1dL/AOucAAADHc3Nt7X/ACyQAAAFHYuLfXv/AEEyAAAaSf//5LX/AJJIAAAZUf//3q3/AFK5AAAZUf//3q3/AOqqAAAZUu7uz6H/ALmcAAAZUs3Ns4v/APqPAAAZUouLeV7/AIcEAACq/4AAAID/AAdGAACq/4AAAID/AEBLAAAqAP////4AAAdRAAAbF/399eb/APJEAAAq/4CAgAD/ABhgAAA4wI5rjiP/AFS6AAA4wf/A/z7/ANurAAA4wO6z7jr/AKqdAAA4wM2azTL/APKQAAA4wItpiyL/AHNOAAAb////pQD/AMy5AAAb////pQD/AGSrAAAb/+7umgD/ADOdAAAb/83NhQD/AHuQAAAb/4uLWgD/AN5VAAAL////RQD/AEm6AAAL////RQD/ANCrAAAL/+7uQAD/AJ+dAAAL/83NNwD/AOeQAAAL/4uLJQD/AI9TAADWe9racNb/ACe6AADWfP//g/r/AK6rAADWfO7ueun/AH2dAADWfM3Nacn/AMWQAADVfIuLR4n/AI9RAAAmSO7u6Kr/AP4zAABVZPuY+5j/AD64AABVZf+a/5r/AOOpAABVZO6Q7pD/ALqbAABVZM18zXz/APuOAABVZItUi1T/AC1KAAB/Q+6v7u7/AI+5AAB/RP+7////ACerAAB/RO6u7u7/APacAAB/RM2Wzc3/ADeQAAB/Q4tmi4v/APxUAADxfNvbcJP/AC+6AADxff//gqv/ALarAADxfe7ueZ//AIWdAADxfc3NaIn/AM2QAADxfIuLR13/AEctAAAaKf//79X/ACJCAAAURv//2rn/ANy4AAAURv//2rn/AGyqAAATRe7uy63/AEOcAAATRc3Nr5X/AISPAAAURYuLd2X/ANULAAAUsM3NhT//AOc5AAD3P///wMv/AJa4AAD1Sf//tcX/ADuqAAD1Se7uqbj/ABKcAAD1Ss3NkZ7/AFOPAAD1SYuLY2z/APg1AADURt3doN3/AGe4AADURP//u///AAyqAADURO7uru7/AOObAADURM3Nls3/ACSPAADUQ4uLZov/AKlGAACEO+aw4Ob/AEFNAADE3fCgIPD/AMC5AAC/z/+bMP//AFirAADAz+6RLO7/ACedAADAz819Js3/AG+QAADAz4tVGov/AAdNAAC/qplmM5n/AChWAAAA////AAD/AE+6AAAA////AAD/ANarAAAA/+7uAAD/AKWdAAAA/83NAAD/AO2QAAAA/4uLAAD/AL8vAAAAPby8j4//AOS3AAAAPv//wcH/AJipAAAAPu7utLT/AG+bAAAAPs3Nm5v/ALCOAAAAPouLaWn/APVGAACfteFBaeH/ADy5AACft/9Idv//ANSqAACft+5Dbu7/AKOcAACfts06X83/AOSPAACft4snQIv/AOwvAAAR3IuLRRP/ANswAAAEivr6gHL/APy3AAAJlv//jGn/ALCpAAAJlu7ugmL/AIebAAAJls3NcFT/AMiOAAAJlouLTDn/AM4vAAATmvT0pGD/AE80AABnqosui1f/AE24AABnq/9U/5//APKpAABnq+5O7pT/AMmbAABnq81DzYD/AAqPAABnqosui1f/AD03AAAREP//9e7/AG24AAAREP//9e7/ABKqAAASEe7u5d7/AOmbAAASEc3Nxb//ACqPAAASEIuLhoL/AM1gAAANt6CgUi3/AGi6AAANuP//gkf/AO+rAAANuO7ueUL/AL6dAAANuM3NaDn/AAaRAAANuYuLRyb/ANsbAAAAAMDAwMD/ADhGAACLbOuHzuv/AAG5AACQeP+Hzv//AJmqAACQeO5+wO7/AGicAACQeM1sps3/AKmPAACRd4tKcIv/AFJHAACvj81qWs3/AEe5AACvkP+Db///AN+qAACvkO56Z+7/AK6cAACvkM1pWc3/AO+PAACvkItHPIv/AHsIAACUOJBwgJD/AJa3AACVOP/G4v//AEapAACVOO650+7/AC+bAACUOc2fts3/AHWOAACVOItse4v/ALAHAACUOJBwgJD/ABcKAAAABf//+vr/AKW3AAAABf//+vr/AFWpAAAABe7u6en/AD6bAAAABM3Nycn/AISOAAAAA4uLiYn/AMozAABq//8A/3//ACG4AABq//8A/3//AMapAABq/+4A7nb/AJ2bAABq/80AzWb/AN6OAABq/4sAi0X/AOZGAACSm7RGgrT/ADG5AACSnP9juP//AMmqAACSnO5crO7/AJicAACSnM1PlM3/ANmPAACTm4s2ZIv/AK00AAAYVNLStIz/AGK4AAAUsP//pU//AAeqAAAUsO7umkn/AN6bAAAUsM3NhT//AB+PAAAUsIuLWiv/AAo5AAB//4AAgID/ANJMAADUHdjYv9j/ALG5AADUHv//4f//AEmrAADUHu7u0u7/ABidAADUHc3Ntc3/AGCQAADUHYuLe4v/ANwuAAAGuP//Y0f/ANy3AAAGuP//Y0f/AJCpAAAGuO7uXEL/AGebAAAGuM3NTzn/AKiOAAAGuYuLNib/ALsPAAAqAP////4AAEBKAAB7tuBA4ND/AJO5AACB//8A9f//ACurAACB/+4A5e7/APqcAACB/80Axc3/ADuQAACB/4sAhov/ACQRAADUc+7ugu7/AABVAADj19DQIJD/ADO6AADrwf//Ppb/ALqrAADrwO7uOoz/AImdAADrwM3NMnj/ANGQAADrwIuLIlL/AIUIAAAAAICAgID/AAg0AABV/4AAgAD/ALoHAAAAAICAgID/AJUwAAAA/4CAAAD/AP1MAADU/4CAAID/AMsSAAAbRPX13rP/AMu3AAAbRf//57r/AH+pAAAbRO7u2K7/AFubAAAbRM3Nupb/AKGOAAAbQ4uLfmb/AMZIAAAAAP//////AEROAAAAAPX19fX/AI0IAAAAAL6+vr7/AFg0AABV//8A/wD/AMIHAAAAAL6+vr7/AJ8wAADvubCwMGD/ADJNAADE3fCgIPD/AH4KAAAq/////wD/ALC3AAAq/////wD/AGCpAAAq/+7u7gD/AEmbAAAq/83NzQD/AI+OAAAq/4uLiwD/AEQzAAA4wM2azTL/AEHAggcLA5R4AgBBzoIHC4UIoED/////////////////////////////////////////////////////////////////////////////////////AAKqAkQDAAQABKoGOQZxAaoCqgIABIMEAAKqAgACOQIABAAEAAQABAAEAAQABAAEAAQABDkCOQKDBIMEgwSNA14HxwVWBVYFxwXjBHMExwXHBaoCHQPHBeMEHQfHBccFcwTHBVYFcwTjBMcFxwWNB8cFxwXjBKoCOQKqAsEDAASqAo0DAASNAwAEjQOqAgAEAAQ5AjkCAAQ5AjkGAAQABAAEAASqAh0DOQIABAAExwUABAAEjQPXA5oB1wNUBP///////////////////////////////////////////////////////////////////////////////////////wACqgJxBAAEAAQACKoGOQKqAqoCAASPBAACqgIAAjkCAAQABAAEAAQABAAEAAQABAAEAASqAqoCjwSPBI8EAARxB8cFVgXHBccFVgXjBDkGOQYdAwAEOQZWBY0HxwU5BuMEOQbHBXMEVgXHBccFAAjHBccFVgWqAjkCqgKmBAAEqgIABHMEjQNzBI0DqgIABHMEOQKqAnMEOQKqBnMEAARzBHMEjQMdA6oCcwQABMcFAAQABI0DJwPDAScDKQT///////////////////////////////////////////////////////////////////////////////////////8AAqoCXAMABAAEqgY5BrYBqgKqAgAEZgUAAqoCAAI5AgAEAAQABAAEAAQABAAEAAQABAAEqgKqAmYFZgVmBQAEXAfjBOMEVgXHBeME4wTHBccFqgKNA1YFcwSqBlYFxwXjBMcF4wQABHMExwXjBKoG4wRzBHMEHQM5Ah0DYAMABKoCAAQABI0DAASNAzkCAAQABDkCOQKNAzkCxwUABAAEAAQABB0DHQM5AgAEjQNWBY0DjQMdAzMDMwIzA1QE////////////////////////////////////////////////////////////////////////////////////////AAIdA3EEAAQABKoGOQY5AqoCqgIABI8EAAKqAgACOQIABAAEAAQABAAEAAQABAAEAAQABKoCqgKPBI8EjwQABKgGVgVWBVYFxwVWBVYFxwU5Bh0DAARWBeMEHQfHBccF4wTHBVYFcwTjBMcFVgUdB1YF4wTjBKoCOQKqAo8EAASqAgAEAASNAwAEjQOqAgAEcwQ5AjkCAAQ5AjkGcwQABAAEAAQdAx0DOQJzBI0DVgUABI0DHQPJAsMByQKPBP//vHgCAEHeigcLhQigQP////////////////////////////////////////////////////////////////////////////////////85AjkC1wJzBHMEHQdWBYcBqgKqAh0DrAQ5AqoCOQI5AnMEcwRzBHMEcwRzBHMEcwRzBHMEOQI5AqwErASsBHMEHwhWBVYFxwXHBVYF4wQ5BscFOQIABFYFcwSqBscFOQZWBTkGxwVWBeMExwVWBY0HVgVWBeMEOQI5AjkCwQNzBKoCcwRzBAAEcwRzBDkCcwRzBMcBxwEABMcBqgZzBHMEcwRzBKoCAAQ5AnMEAATHBQAEAAQABKwCFAKsAqwE////////////////////////////////////////////////////////////////////////////////////////OQKqAssDcwRzBB0HxwXnAaoCqgIdA6wEOQKqAjkCOQJzBHMEcwRzBHMEcwRzBHMEcwRzBKoCqgKsBKwErATjBM0HxwXHBccFxwVWBeMEOQbHBTkCcwTHBeMEqgbHBTkGVgU5BscFVgXjBMcFVgWNB1YFVgXjBKoCOQKqAqwEcwSqAnME4wRzBOMEcwSqAuME4wQ5AjkCcwQ5Ah0H4wTjBOME4wQdA3MEqgLjBHMEOQZzBHMEAAQdAz0CHQOsBP///////////////////////////////////////////////////////////////////////////////////////zkCOQLXAnMEcwQdB1YFhwGqAqoCHQOsBDkCqgI5AjkCcwRzBHMEcwRzBHMEcwRzBHMEcwQ5AjkCrASsBKwEcwQfCFYFVgXHBccFVgXjBDkGxwU5AgAEVgVzBKoGxwU5BlYFOQbHBVYF4wTHBVYFjQdWBVYF4wQ5AjkCOQLBA3MEqgJzBHMEAARzBHMEOQJzBHMExwHHAQAExwGqBnMEcwRzBHMEqgIABDkCcwQABMcFAAQABAAErAIUAqwCrAT///////////////////////////////////////////////////////////////////////////////////////85AqoCywNzBHMEHQfHBecBqgKqAh0DrAQ5AqoCOQI5AnMEcwRzBHMEcwRzBHMEcwRzBHMEqgKqAqwErASsBOMEzQfHBccFxwXHBVYF4wQ5BscFOQJzBMcF4wSqBscFOQZWBTkGxwVWBeMExwVWBY0HVgVWBeMEqgI5AqoCrARzBKoCcwTjBHME4wRzBKoC4wTjBDkCOQJzBDkCHQfjBOME4wTjBB0DcwSqAuMEcwQ5BnMEcwQABB0DPQIdA6wE///weAIAQe6SBwuFCKBA/////////////////////////////////////////////////////////////////////////////////////80EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQT////////////////////////////////////////////////////////////////////////////////////////NBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0E////////////////////////////////////////////////////////////////////////////////////////zQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBP///////////////////////////////////////////////////////////////////////////////////////80EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQT//xh5AgBB/ZoHC4YIQI9AAAD///////////////////////////////8CAf///////////////////////////////////////////////wIB5ACIAVgCWAKiA7UC3QA9AT0BwgFYAuQAqAHkABsBWAJYAlgCWAJYAlgCWAJYAlgCWALkAOQAWAJYAlgCuwGyA9kCpAKhAuYCRwIkAtYC+QIBAUQBcQIfAlcD5AL/AnkC/wKdAmcCWgLYArECTQSKAlQCTQI7ARsBOwFYAvQB9AESAkcCzwFHAhQCTQFKAjgC6ADsAPQBKAFYAzgCLAJHAkcCZgHhAV4BMQIDAkkDDQICAs8BYAEJAWABWAL//wAA////////////////////////////////DwH///////////////////////////////////////////////8PAfgAwAFYAlgCsQPWAvMAZgFmAcUBWAL4ALIB+AA5AVgCWAJYAlgCWAJYAlgCWAJYAlgC+AD4AFgCWAJYAssBtgPoArACqAL6AlUCMgLgAgUDGgFiAZkCMgJkA+wCEQOMAhEDrgJ3Am0C4gLJAlkEoAJqAl0CYgE5AWIBWAL0AfQBIwJYAtgBWAIeAmwBXAJJAv8AAwEYAj8BbQNJAkACWAJYAogB6AGAAUMCDwJVAyICDgLaAYcBIAGHAVgC//8AAP///////////////////////////////wIB////////////////////////////////////////////////AgHkAIgBWAJYAqIDtQLdAD0BPQHCAVgC5ACoAeQAGwFYAlgCWAJYAlgCWAJYAlgCWAJYAuQA5ABYAlgCWAK7AbID2QKkAqEC5gJHAiQC1gL5AgEBRAFxAh8CWAPjAv8CeQL/Ap0CZwJaAtgCsAJNBIoCVAJNAjsBGwE7AVgC9AH0ARICRwLPAUcCFAJNAUoCOALoAOwA9AEoAVgDOAIsAkcCRwJmAeEBXgExAgMCSQMNAgICzwFgAQkBYAFYAv//AAD///////////////////////////////8PAf///////////////////////////////////////////////w8B+ADAAVgCWAKxA9YC8wBmAWYBxQFYAvgAsgH4ADkBWAJYAlgCWAJYAlgCWAJYAlgCWAL4APgAWAJYAlgCywG2A+gCsAKoAvoCVQIyAuACBQMaAWIBmAIyAmUD6wIRA4wCEQOuAncCbQLiAskCWQSgAmoCXQJiATkBYgFYAvQB9AEjAlgC2AFYAh4CbAFcAkkC/wADARgCPwFtA0kCQAJYAlgCiAHoAYABQwIPAlUDIgIOAtoBhwEgAYcBWAL//yB5AgBBjqMHC4UIoED/////////////////////////////////////////////////////////////////////////////////////iwI1A64DtAYXBZoHPQYzAh8DHwMABLQGiwLjAosCsgIXBRcFFwUXBRcFFwUXBRcFFwUXBbICsgK0BrQGtAY/BAAIeQV9BZYFKQYOBZoEMwYEBlwCXAI/BXUE5wb8BUwG0wRMBo8FFAXjBNsFeQXpB3sF4wR7BR8DsgIfA7QGAAQABOcEFAVmBBQF7ATRAhQFEgU5AjkCogQ5AssHEgXlBBQFFAVKAysEIwMSBbwEiwa8BLwEMwQXBbICFwW0Bv///////////////////////////////////////////////////////////////////////////////////////8kCpgMrBLQGkQUECPoGcwKoA6gDLwS0BgoDUgMKA+wCkQWRBZEFkQWRBZEFkQWRBZEFkQUzAzMDtAa0BrQGpAQACDEGGQbfBaQGdwV3BZEGsgb6AvoCMwYZBfYHsgbNBt0FzQYpBsMFdQV/BjEG0wgrBssFzQWoA+wCqAO0BgAEAARmBboFvgS6BW0FewO6BbIFvgK+AlIFvgJWCLIFfwW6BboF8gPDBNMDsgU3BWQHKQU3BagEsgXsArIFtAb///////////////////////////////////////////////////////////////////////////////////////+LAjUDrgO0BhcFmgc9BjMCHwMfAwAEtAaLAuMCiwKyAhcFFwUXBRcFFwUXBRcFFwUXBRcFsgKyArQGtAa0Bj8EAAh5BX0FlgUpBg4FmgQzBgQGXAJcAj8FdQTnBvwFTAbTBEwGjwUUBeME2wV5BekHewXjBHsFHwOyAh8DtAYABAAE5wQUBWYEFAXsBNECFAUSBTkCOQKiBDkCywcSBeUEFAUUBUoDKwQjAxIFvASLBrwEvAQzBBcFsgIXBbQG////////////////////////////////////////////////////////////////////////////////////////yQKmAysEkQWRBQQI+gZzAqgDqAMvBLQGCgNSAwoD7AKRBZEFkQWRBZEFkQWRBZEFkQWRBTMDMwO0BrQGtAakBAAIMQYZBt8FpAZ3BXcFkQayBvoC+gIzBhkF9geyBs0G3QXNBikGwwV1BX8GMQbTCCsGywXNBagD7AKoA7QGAAQABGYFugW+BLoFbQV7A7oFsgW+Ar4CUgW+AlYIsgV/BboFugXyA8ME0wOyBTcFZAcpBTcFqASyBewCsgW0Bv//KHkCAEGeqwcLhQigQGYE////////////////////////////////AAD///////////////////////////////////////////////9mBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYE//9mBP///////////////////////////////wAA////////////////////////////////////////////////ZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBP//ZgT///////////////////////////////8AAP///////////////////////////////////////////////2YEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgT///////////////////////////////////////////////////////////////////////////////////////9mBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYE//80eQIAQa6zBwuFCKBA/////////////////////////////////////////////////////////////////////////////////////2kC8AKZAjIEMgTNBKYFRwHwAvAC8AIyBPAC8ALwAjIEMgQyBDIEMgQyBDIEMgQyBDIEMgTwAvACMgQyBDIE8AIqBrgEhwTJBOgESQQzBGkFPAU6AtADmwQNBK0FGwVkBXYEaAWoBNkDpQQwBbME0QZ0BJAEZwTwAtgC8AIyBDIEMgQ0BHUE9gN1BF0E9QIEBF8ESALvAgkEXAKkBl8ESwR1BHUEHAM9AywDXwTrA/QFAgTyA8wD8AIyBPACMgT///////////////////////////////////////////////////////////////////////////////////////9pAvAC7wKwBLAEeQWmBdYB8ALwAnUDsATwAvAC8AIfA7AEsASwBLAEsASwBLAEsASwBLAE8ALwArAEsASwBIEDKgYRBcME5QQkBY0EqwRfBXgFOgJDBPAEbAT2BVcFoAWyBKwF4wQXBOUEbAX5BBIHzgToBHsENwPYAjcDsASwBLAEQwSnBBgEpQSZBPUCBAS+BGMC7wJiBFwC4Aa5BIcEqQSsBGsDcgMsA7oEOARFBmsERQQ6BHgDsAR4A7AE////////////////////////////////////////////////////////////////////////////////////////aQLwApkCMgTZA80EpgVHAfAC8ALwAjIE8ALwAvACMgQyBDIEMgQyBDIEMgQyBDIEMgQyBPAC8AIyBDIEMgTwAioG4wSHBMkE6ARJBDMEaQU8BToC0AObBA0EFwYbBWQFWQRkBagE2QOlBDAFswTRBnQEkARnBPAC2ALwAjIEMgQyBDQEdQSuA3UETAQ2AwQEdQR0Au8CCQSQAqQGXwRLBHUEdQRVAz0DXAN0BOsD9AUCBPIDzAPwAjIE8AIyBP///////////////////////////////////////////////////////////////////////////////////////2kC8AIgA7AEsATcBaYFaQLwAvACdQOwBPAC8ALwAi0DsASwBLAEsASwBLAEsASwBLAEsATwAvACsASwBLAELQMqBukEuATnBA8FvwSvBGkFbQU6Av0DMwU6BEoGSAWeBasEKAb9BAMEewVLBXcFaQdBBXgF5ATiA9ID4gOwBLAEsAS+BL8E8QO/BGoESANIBH8EnQIaA1EEjwKkBn8EjwTKBMoEkwOsA4EDdQRrBDAGmwSDBEME4gOwBOIDsAT//0B5AgBBvrsHC4UIoED/////////////////////////////////////////////////////////////////////////////////////0AImA6wDjAYWBZwI0AUmAqIDogMWBYwG6QKiA+kCogMWBRYFFgUWBRYFFgUWBRYFFgUWBaIDogOMBowGjAZdBAAIeAV8BZYFKgYPBZkENAYDBl4DowOLBXQEvgb8BUwG0wRMBpAFeAXuBNsFeAXpB3sF7AR7BaIDogOiA4wGFgUWBc4E/AQrBPwExATQAvwEEAUyAsECvAQyAsgHEAXbBPwE/ARqAysEJwMQBbwEjAa8BLwENAQUBaIDFAWMBv///////////////////////////////////////////////////////////////////////////////////////7wCOAOzBPAGsAUtCuYGqAJZBFkEsAXwBuQC1wPkAoQFsAWwBbAFsAWwBbAFsAWwBbAFsAU4AzgD8AbwBvAG7wS2BzYGGAbKBaQGdwU0BX0GswZeBHEEKwYZBZUHxgbNBt0FzQZCBq8FdAV/BhwGBwkcBuUFiQVZBIQFWQTwBrAFsAVYBZgFtQSYBVAFYQOYBbMFvAI5A14FvAJ3CLMFfgWYBZgF+gO/BKUDswUzBdYHWgU1BcYEsAVZBLAF8Ab////////////////////////////////////////////////////////////////////////////////////////QAiYDrAOMBhYFnAjQBSYCogOiAxYFjAbpAqID6QKiAxYFFgUWBRYFFgUWBRYFFgUWBRYFogOiA4wGjAaMBl0EAAh2BXwFlgUgBg8FmQQ0BgMGXgOjA4sFdAS+BvwFTAbTBEwGkAV4Be4E2wV2BewHewXsBHsFogOiA6IDjAYWBRYFzgT8BCsE/ATEBNAC+QQQBTICwQKyBDICyQcQBdsE/AT8BGoDKwQnAxAFugSMBrwEugQ0BBQFogMUBYwG////////////////////////////////////////////////////////////////////////////////////////vAI4A7ME8AawBS0K5gaoAlkEWQSwBfAG5ALXA+QChAWwBbAFsAWwBbAFsAWwBbAFsAWwBTgDOAPwBvAG8AbvBLYHNgYYBsoFpAZ3BTQFfQazBl4EcQQrBhkFlQfGBs0G3QXNBkIGrwV0BX8GHAYHCRwG5QWJBVkEhAVZBPAGsAWwBVgFmAW1BJgFUAVhA5gFswW8AjkDXgW8AncIswV8BZgFmAX6A78EpQOzBTEF1gdaBTUFxgSwBVkEsAXwBv//SHkCAEHOwwcLhQigQP////////////////////////////////////////////////////////////////////////////////////8UAiMCNQMrBZMElgbXBcUBXgJeAmoEkwT2AZMCIQLwApMEkwSTBJMEkwSTBJMEkwSTBJMEIQIhApMEkwSTBG8DMQcQBS8FDAXVBXMEIQTTBecFOwIjAukEJwQ5BwgGOwbRBDsG8gRkBG0E0wXDBGgHngR7BJEEogLwAqICVgSWA54EcwTnBM8D5wR9BLYCYgTpBAYCBgIzBAYCcQfpBNUE5wTnBEQD0QPTAukEAgQ5BjEECAS+AwgDaAQIA5ME////////////////////////////////////////////////////////////////////////////////////////FAJKAscDKwWRBDUHAAYhArYCtgJcBJEEUgKTAkgCTgORBJEEkQSRBJEEkQSRBJEEkQSRBEgCUgKRBJEEkQTRAy0HhQVgBRkF7AV7BGQEywUfBqYCpgJQBYUEiweBBl4GBgVeBkgFaASiBAwGMwW8B1YF/gSiBKYCTgOmAkIESgPbBNUEEAUdBBAFugQZA4UEQgVxAnEC9gRxAtsHQgX0BBAFEAWiA/oDeQNCBY0E2QagBI0E5wMnA2gEJwORBP///////////////////////////////////////////////////////////////////////////////////////xQCEgIXAysFaARYBlwFvAFIAkgCagRoBOwBfwIGAs0CaARoBGgEaARoBGgEaARoBGgEaAQGAgYCaARoBGgEagPHBnEEyQSuBFQFFwTHA2oFbQUvAiMCdQTLA7IGngXDBYcEwwWNBAQE/ANoBWIE0QYnBAYEPwRKAs0CSgIjBCcDbwSFBJ4EmgOeBPIDgQICBJ4ECAIIAucDCAL6Bp4EfQSeBJ4EKwNtA5gCngSyA7wF0wOyA40DywJoBMsCaAT///////////////////////////////////////////////////////////////////////////////////////8UAkoCoAMrBWgE2QaqBQoCtgK2AlwEaAQ5ApMCSAJeA2gEaARoBGgEaARoBGgEaARoBGgESAJIAmgEaARoBKwD2QYGBfYE5QRqBVYEPwSFBZoFkwKmAucEJQQKBwoG1wWkBNcF3wQ9BD8EhwW4BCcH2QSDBEoEpgJeA6YCOQQzA28EwQTDBN0DwQR1BPwCVATVBGACYAKLBGACPQfVBK4EwwTBBF4DyQNIA9UEGQROBj8EJwSkA9cCaATXAmgE//9QeQIAQd7LBwuFCKBA/////////////////////////////////////////////////////////////////////////////////////+4BpgJLAyUF4QSKBq8FuQEAAwADxwMlBSgC/gIoAsAD6QRwA3gEagSFBDoEhwQFBMUEhwSAAoACJQUlBSUF1ANuB14FOwUjBf4FOgXLBM0FhQYeAyQEjgXUBGsHIwb0BeEE9AWdBX0E8wQNBlUFzgevBewE0AQAA8ADAAMlBSUFAAQIBHsEogOYBN4DmgITBKgEWAJWAkkESgIMB7oEUASSBHoERwN1A8MCmgT5A+YFCgTwA40DcQMAA3EDJQX///////////////////////////////////////////////////////////////////////////////////////8IAgMDFASgBSAFCQdlBicCkwOTA9sDoAWgAggDoALGA5wF6wMDBf8EMgXLBC8FbwRpBS8F8ALwAqAFoAWgBWMEvAcRBg8GuQWsBsUFXwV1Bk4HkQPDBIkGfAUwCLcGjwacBY8GYQYxBXkFqwYZBgMJeAbbBYQFkwPGA5MDoAWgBQAExAQqBUAETgWTBCUDnQRwBdQCxQIOBcECIAiFBRYFQwUwBSkEGgQuA2oFiQToBrQEfwQ0BAAEGgMABKAF////////////////////////////////////////////////////////////////////////////////////////7gGmAksDJQXhBIoGrwW5AQADAAPHAyUFKAL+AigCwAPpBHADeARqBIUEOgSHBPkDxQSHBBIDEgMlBSUFJQXUA24HXgU7BSMF/gU6BcsEzQWFBh4DJASOBdQEawcjBtgF4QTYBZ0FfQTzBA0GVQXOB68F7ATQBAADwAMAAyUFJQUABJUEbgShA5oExgOhApUEgARhAlQCOQRIAgkHuARMBKAEcQSxA3MDxwKaBE4ElAYCBHoEjQNxAwADcQMlBf///////////////////////////////////////////////////////////////////////////////////////wgCAwMUBKAFIAUJB2UGJwKTA5MD2wOgBaACCAOgAsYDnAXrAwMF/wQyBcsELwWIBGkFLwXwAvACoAWgBaAFYwS8BxEGEwa5BawGxQVfBXUGTgebA8MEiQZ8BUQIowaPBqYFjwZhBjkFeQWrBhkGAwlrBtsFhAWTA8YDkwOgBaAFAARIBTEFSQRNBXUEDAMyBWcF7QLrAiEF1gIECIUFFgVNBTMFRQQjBFYDewXmBHgHqwRbBSMEAAQaAwAEoAX//1h5AgBB7tMHC8gKoED/////////////////////////////////////////////////////////////////////////////////////zwGbAjUD/AMOBLgFdQXEAW0CbQL8A/wD/wFzAgUCFwMOBA4EDgQOBA4EDgQOBA4EDgQOBCQCJAL8A/wD/AO1AycHoQRaBEQE7AToA60DDAX8BAQCjQIoBF0D1wYqBUwFIgRiBVgErQPmAyIFigQeBycE5gO/A3QCFwN0AvwD/ANUAtUDNARiAzQE+wNxAsQDNATWAeoBowPWAWQGNAQ4BDQENATKAiEDrgI0BJ0DuAV3A58DKQOEAq8DhAL8A///AAD///////////////////////////////8AAP///////////////////////////////////////////////88BmwKCA/wDDgTVBaMF3gF+An4C/AP8AxACcwIjAnADDgQOBA4EDgQOBA4EDgQOBA4EDgQ1AjUC/AP8A/wDtQMwB9kEfAQ8BAsF5wOsAxkFDAUiAqYCYARiA/4GRQVpBUIEfQWBBMgD9gM5BbsEQAdoBCgE0wOZAnADmQL8A/wDZwLzA0sEWQNLBAcEiALLA0sE9wELAtcD9wGCBksETQRLBEsE2AIxA8YCSwTJA/YFrQPKAy4DwALNA8AC/AP////////////////////////////////////////////////////////////////////////////////////////PAZsCNQP8Aw4EuAV1BcQBbQJtAvwD/AP/AXMCBQIaAw4EDgQOBA4EDgQOBA4EDgQOBA4EJAIkAvwD/AP8A7UDJwehBFoELgTsBOgDrQMMBfwEBAKNAigEXQPXBigFPAUiBFAFWASeA+YDIgWKBB8HJwTmA78DdAITA3QC/AP8A1QCHQQdBFQDHQTSA3ECHQQdBNYB6gGjA9YBVAYdBBsEHQQdBL4CHQOuAh0EkQO4BXcDlAMpA4QCrwOEAvwD////////////////////////////////////////////////////////////////////////////////////////zwGbAoID/AMOBNUFowXeAX4CfgL8A/wDEAJzAiMCeQMOBA4EDgQOBA4EDgQOBA4EDgQOBDUCNQL8A/wD/AO1AzAH2QR8BCYECwXnA6wDGQUMBSICpgJgBGID/gZABVkFQgRrBYEEuQP2AzkFuwRBB2gEKATTA5kCZgOZAvwD/ANnAjkEOQRLAzkE7gOIAjkEOAT3AQsC1wP3AW4GOAQ4BDkEOQTRAicDxgI4BMED9gWtA8MDLgPAAs0DwAL8A///DAAAAAQAAAAGAAAAAgAAAAMAAAABAAAACQAAAAgAAAALAAAADAAAAA0AAAAOAAAADwAAABAAAAARAAAAEgAAABUAAAAWAAAAFwAAABgAAAAZAAAAGgAAABsAAAAcAAAAHwAAACAAAAAhAAAAIgAAACMAAAAkAAAAJQAAACYAAAApAAAAKgAAACsAAAAsAAAALQAAAC4AAAAvAAAAMAAAADMAAAA0AAAANQAAADYAAAA3AAAAOAAAADkAAAA6AAAAPQAAAD4AAAA/AAAAQAAAAEEAAABCAAAAQwAAAEQAAABHAAAASAAAAEkAAABKAAAASwAAAEwAAABNAAAATgAAAFEAAABSAAAAUwAAAFQAAABV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APUAAABlFwAAlyIAALo2AAD2AAAAt2AAALYAAABFDgAAAiIAAFM3AAAwIAAAYCwAAKUiAAAjOwAAxgMAAM46AADAAwAAjAsAANYDAAAqMgAAsQAAAOhRAACjAAAADEwAADIgAABTUQAADyIAAKQsAAAdIgAAszoAAMgDAABiDgAAIgAAALAaAADSIQAA+1oAABoiAABSQAAAKiMAAL8uAAC7AAAAlxoAAJIhAABaNwAACSMAAJkuAAAdIAAADzkAABwhAAAIQQAArgAAAEMbAAALIwAARC8AAMEDAABSNgAADyAAALEuAAA6IAAAjS4AABkgAACrLgAAGiAAAIcwAABhAQAA7A4AAMUiAADSEQAApwAAADIHAACtAAAA6GAAAMMDAAC8QgAAwgMAAFY2AAA8IgAAoxgAAGAmAACpXwAAgiIAABRRAACGIgAA7zUAABEiAAA8LAAAgyIAANK3AAC5AAAAhqkAALIAAABimwAAswAAAO1KAACHIgAAmUAAAN8AAADrCwAAxAMAAE2QAAA0IgAAbGAAALgDAADeNQAA0QMAAEosAAAJIAAAQDAAAP4AAAAkUAAA3AIAAGYXAADXAAAAMVAAACIhAACrGgAA0SEAALxHAAD6AAAAkRoAAJEhAABaWQAA+wAAAPhEAAD5AAAA6DYAAKgAAAAbPQAA0gMAAOIwAADFAwAAtTYAAPwAAABlLAAAGCEAALA6AAC+AwAAtUcAAP0AAAC2MgAApQAAALA2AAD/AAAAZ2AAALYDAACWOgAADSAAAJo6AAAMIAAA5z8BAAgAAAADAAAA5T4AACLQAAALAAAABgAAAFcVAADzaAAAAgAAAAEAAADKLAAApXQAAAQAAAACAAAAGUIAAAAEAAADAAAABAAAAAxBAAAu0AAABQAAAAUAAAC4QgAABAQAAAQAAAAHAAAALRUAAKo2AAAFAAAACQAAAKw2AAAibQAABAAAAAoAAAAsQgAAQPkBAAQAAAAMAAAAsC8AAAAAAQAAAdDR0tPU1dbX2NkAQebyBwsJ8L8AAAAAAAABAEH48gcLDWludmlzAABmaWxsZWQAQZDzBwsaMBoAACJRAADPNQAAbgsAAPR4AABpxgAAVY4AQdDzBwt5//////////////////////////////////////////8AAAAAAAAABP7//4f+//8HAAAAAAAAAAD//3////9///////////N//v3//////3///////////w/g/////zH8////AAAAAAAAAP//////////////AQD4AwBB4PQHC0FA1///+/////9/f1T9/w8A/t////////////7f/////wMA////////nxn////PPwMAAAAAAAD+////fwL+////fwBBqvUHC7MB////BwcAAAAAAP7//wf+BwAAAAD+//////////98/38vAGAAAADg////////IwAAAP8DAAAA4J/5///9xQMAAACwAwADAOCH+f///W0DAAAAXgAAHADgr/v///3tIwAAAAABAAAA4J/5///9zSMAAACwAwAAAODHPdYYx78DAAAAAAAAAADg3/3///3vAwAAAAADAAAA4N/9///97wMAAABAAwAAAODf/f///f8DAAAAAAMAQfD2BwsZ/v////9/DQA/AAAAAAAAAJYl8P6ubA0gHwBBmPcHCwb//v///wMAQcT3Bwty/////z8A/////38A7doHAAAAAFABUDGCq2IsAAAAAEAAyYD1BwAAAAAIAQL/////////////////////////D///////////////A///Pz//////Pz//qv///z/////////fX9wfzw//H9wfAAAAAEBMAEHA+AcLAQcAQdD4BwsmgAAAAP4DAAD+////////////HwD+/////////////wfg/////x8AQZD5BwsV//////////////////////////8/AEGw+QcLFf//////////////////////////DwBB1fkHC8kCYP8H/v//h/7//wcAAAAAAACAAP//f////3//////AAAAAAAAAP//////////////AQD4AwADAAAAAAD//////////z8AAAADAAAAwNf///v/////f39U/f8PAP7f///////////+3/////97AP///////58Z////zz8DAAAAAAAA/v///38C/v///38A/v/7//+7FgD///8HBwAAAAAA/v//B///BwD/A////////////3z/f+///z3/A+7////////z/z8e/8//AADun/n///3F0585gLDP/wMA5If5///9bdOHOQBewP8fAO6v+////e3zvzsAAMH/AADun/n///3N8485wLDD/wAA7Mc91hjHv8PHPYAAgP8AAO7f/f//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rv+u/67/rv+u/67/rv+u/67/rv+u/67/rv+u/xcArv93AK7/BwAuAK7/JgCu/xcAEQAjAK7/DQCu/67/rv+u/zoArv+u/zUArv+u/67/KACu/wcArv87AEUArv9IAK7/rv+u/67/rv8AQYG1CAvBBgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygAAAAAAAAAAAICAgICAhAMWQEAH1AIAwcSExRXFhcIC2kMHwoFDA4pESsPLRAvMCAyBjQ1GxwdHgsMISIjJCUmJygMGBkXBAobHBogKgohIiMkJSYnKAwKDlMKLFgxWFhYWFhYDBscDy5YMyEiIyQlJicoGxz/U///ISIjJCUmJygM//8F////CRT//////wwbHP8QFRYhIiMkJSYnKBsc/////yEiIyQlJicoDP8SExQRFhf///////8MGxz///8SISIjJCUmJygbHP////8hIiMkJSYnKAz///////8T////////DBsc/////yEiIyQlJicoGxz/////ISIjJCUmJygSExQVFhcYGf///////////yMkJSYnGxITFBYXIjZoAR84ViEgAhsbG14bGzc5cDbSwk8EPCJHIj8iRCIiWCJlIiIFBl9gOQQHCAkKCwwNDgRmZ11qbQUGb1g7cQcICQoLDA0OBHI8W3M+YUYbEhMUFhcEBQY/QWJJBwgJCgsMDQ4FBgBcAAAHCAkKCwwNDgQAAE8AAABTQgAAAAAABAUGAERUVQcICQoLDA0OBQYAAAAABwgJCgsMDQ4EACosLkcxMwAAAAAAAAQFBgAAAEoHCAkKCwwNDgUGAAAAAAcICQoLDA0OBAAAAAAA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X0NUWVBFAAAAAExDX05VTUVSSUMAAExDX1RJTUUAAAAAAExDX0NPTExBVEUAAExDX01PTkVUQVJZAExDX01FU1NBR0VTAEHw9QgLB0MuVVRGLTgAQYj2CAugEDCrAgDIqwIAWKwCAE5vIGVycm9yIGluZm9ybWF0aW9uAElsbGVnYWwgYnl0ZSBzZXF1ZW5jZQBEb21haW4gZXJyb3IAUmVzdWx0IG5vdCByZXByZXNlbnRhYmxlAE5vdCBhIHR0eQBQZXJtaXNzaW9uIGRlbmllZABPcGVyYXRpb24gbm90IHBlcm1pdHRlZABObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5AE5vIHN1Y2ggcHJvY2VzcwBGaWxlIGV4aXN0cwBWYWx1ZSB0b28gbGFyZ2UgZm9yIGRhdGEgdHlwZQBObyBzcGFjZSBsZWZ0IG9uIGRldmljZQBPdXQgb2YgbWVtb3J5AFJlc291cmNlIGJ1c3kASW50ZXJydXB0ZWQgc3lzdGVtIGNhbGwAUmVzb3VyY2UgdGVtcG9yYXJpbHkgdW5hdmFpbGFibGUASW52YWxpZCBzZWVrAENyb3NzLWRldmljZSBsaW5rAFJlYWQtb25seSBmaWxlIHN5c3RlbQBEaXJlY3Rvcnkgbm90IGVtcHR5AENvbm5lY3Rpb24gcmVzZXQgYnkgcGVlcgBPcGVyYXRpb24gdGltZWQgb3V0AENvbm5lY3Rpb24gcmVmdXNlZABIb3N0IGlzIGRvd24ASG9zdCBpcyB1bnJlYWNoYWJsZQBBZGRyZXNzIGluIHVzZQBCcm9rZW4gcGlwZQBJL08gZXJyb3IATm8gc3VjaCBkZXZpY2Ugb3IgYWRkcmVzcwBCbG9jayBkZXZpY2UgcmVxdWlyZWQATm8gc3VjaCBkZXZpY2UATm90IGEgZGlyZWN0b3J5AElzIGEgZGlyZWN0b3J5AFRleHQgZmlsZSBidXN5AEV4ZWMgZm9ybWF0IGVycm9yAEludmFsaWQgYXJndW1lbnQAQXJndW1lbnQgbGlzdCB0b28gbG9uZwBTeW1ib2xpYyBsaW5rIGxvb3AARmlsZW5hbWUgdG9vIGxvbmcAVG9vIG1hbnkgb3BlbiBmaWxlcyBpbiBzeXN0ZW0ATm8gZmlsZSBkZXNjcmlwdG9ycyBhdmFpbGFibGUAQmFkIGZpbGUgZGVzY3JpcHRvcgBObyBjaGlsZCBwcm9jZXNzAEJhZCBhZGRyZXNzAEZpbGUgdG9vIGxhcmdlAFRvbyBtYW55IGxpbmtzAE5vIGxvY2tzIGF2YWlsYWJsZQBSZXNvdXJjZSBkZWFkbG9jayB3b3VsZCBvY2N1cgBTdGF0ZSBub3QgcmVjb3ZlcmFibGUAUHJldmlvdXMgb3duZXIgZGllZABPcGVyYXRpb24gY2FuY2VsZWQARnVuY3Rpb24gbm90IGltcGxlbWVudGVkAE5vIG1lc3NhZ2Ugb2YgZGVzaXJlZCB0eXBlAElkZW50aWZpZXIgcmVtb3ZlZABEZXZpY2Ugbm90IGEgc3RyZWFtAE5vIGRhdGEgYXZhaWxhYmxlAERldmljZSB0aW1lb3V0AE91dCBvZiBzdHJlYW1zIHJlc291cmNlcwBMaW5rIGhhcyBiZWVuIHNldmVyZWQAUHJvdG9jb2wgZXJyb3IAQmFkIG1lc3NhZ2UARmlsZSBkZXNjcmlwdG9yIGluIGJhZCBzdGF0ZQBOb3QgYSBzb2NrZXQARGVzdGluYXRpb24gYWRkcmVzcyByZXF1aXJlZABNZXNzYWdlIHRvbyBsYXJnZQBQcm90b2NvbCB3cm9uZyB0eXBlIGZvciBzb2NrZXQAUHJvdG9jb2wgbm90IGF2YWlsYWJsZQBQcm90b2NvbCBub3Qgc3VwcG9ydGVkAFNvY2tldCB0eXBlIG5vdCBzdXBwb3J0ZWQATm90IHN1cHBvcnRlZABQcm90b2NvbCBmYW1pbHkgbm90IHN1cHBvcnRlZABBZGRyZXNzIGZhbWlseSBub3Qgc3VwcG9ydGVkIGJ5IHByb3RvY29sAEFkZHJlc3Mgbm90IGF2YWlsYWJsZQBOZXR3b3JrIGlzIGRvd24ATmV0d29yayB1bnJlYWNoYWJsZQBDb25uZWN0aW9uIHJlc2V0IGJ5IG5ldHdvcmsAQ29ubmVjdGlvbiBhYm9ydGVkAE5vIGJ1ZmZlciBzcGFjZSBhdmFpbGFibGUAU29ja2V0IGlzIGNvbm5lY3RlZABTb2NrZXQgbm90IGNvbm5lY3RlZABDYW5ub3Qgc2VuZCBhZnRlciBzb2NrZXQgc2h1dGRvd24AT3BlcmF0aW9uIGFscmVhZHkgaW4gcHJvZ3Jlc3MAT3BlcmF0aW9uIGluIHByb2dyZXNzAFN0YWxlIGZpbGUgaGFuZGxlAFJlbW90ZSBJL08gZXJyb3IAUXVvdGEgZXhjZWVkZWQATm8gbWVkaXVtIGZvdW5kAFdyb25nIG1lZGl1bSB0eXBlAE11bHRpaG9wIGF0dGVtcHRlZABSZXF1aXJlZCBrZXkgbm90IGF2YWlsYWJsZQBLZXkgaGFzIGV4cGlyZWQAS2V5IGhhcyBiZWVuIHJldm9rZWQAS2V5IHdhcyByZWplY3RlZCBieSBzZXJ2aWNlAAAAAAClAlsA8AG1BYwFJQGDBh0DlAT/AMcDMQMLBrwBjwF/A8oEKwDaBq8AQgNOA9wBDgQVAKEGDQGUAgsCOAZkArwC/wJdA+cECwfPAssF7wXbBeECHgZFAoUAggJsA28E8QDzAxgF2QDaA0wGVAJ7AZ0DvQQAAFEAFQK7ALMDbQD/AYUELwX5BDgAZQFGAZ8AtwaoAXMCUwEAQdiGCQsMIQQAAAAAAAAAAC8CAEH4hgkLBjUERwRWBABBjocJCwKgBABBoocJCyJGBWAFbgVhBgAAzwEAAAAAAAAAAMkG6Qb5Bh4HOQdJB14HAEHQhwkLkQHRdJ4AV529KoBwUg///z4nCgAAAGQAAADoAwAAECcAAKCGAQBAQg8AgJaYAADh9QUYAAAANQAAAHEAAABr////zvv//5K///8AAAAAAAAAABkACwAZGRkAAAAABQAAAAAAAAkAAAAACwAAAAAAAAAAGQAKChkZGQMKBwABAAkLGAAACQYLAAALAAYZAAAAGRkZAEHxiAkLIQ4AAAAAAAAAABkACw0ZGRkADQAAAgAJDgAAAAkADgAADgBBq4kJCwEMAEG3iQkLFRMAAAAAEwAAAAAJDAAAAAAADAAADABB5YkJCwEQAEHxiQkLFQ8AAAAEDwAAAAAJEAAAAAAAEAAAEABBn4oJCwESAEGrigkLHhEAAAAAEQAAAAAJEgAAAAAAEgAAEgAAGgAAABoaGgBB4ooJCw4aAAAAGhoaAAAAAAAACQBBk4sJCwEUAEGfiwkLFRcAAAAAFwAAAAAJFAAAAAAAFAAAFABBzYsJCwEWAEHZiwkLJxUAAAAAFQAAAAAJFgAAAAAAFgAAFgAAMDEyMzQ1Njc4OUFCQ0RFRgBBpIwJCwILAgBBzIwJCwj//////////wBBkI0JC/UI/////////////////////////////////////////////////////////////////wABAgMEBQYHCAn/////////CgsMDQ4PEBESExQVFhcYGRobHB0eHyAhIiP///////8KCwwNDg8QERITFBUWFxgZGhscHR4fICEiI/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AAQIEBwMGBQAAAAAAAAACAADAAwAAwAQAAMAFAADABgAAwAcAAMAIAADACQAAwAoAAMALAADADAAAwA0AAMAOAADADwAAwBAAAMARAADAEgAAwBMAAMAUAADAFQAAwBYAAMAXAADAGAAAwBkAAMAaAADAGwAAwBwAAMAdAADAHgAAwB8AAMAAAACzAQAAwwIAAMMDAADDBAAAwwUAAMMGAADDBwAAwwgAAMMJAADDCgAAwwsAAMMMAADDDQAA0w4AAMMPAADDAAAMuwEADMMCAAzDAwAMwwQADNsAAAAAVEkCAA0CAAAOAgAADwIAABACAAARAgAAEgIAABMCAAAUAgAAFQIAABYCAAAXAgAAGAIAABkCAAAaAgAABAAAAAAAAACQSQIAGwIAABwCAAD8/////P///5BJAgAdAgAAHgIAALhIAgDMSAIAAAAAANhJAgAfAgAAIAIAAA8CAAAQAgAAIQIAACICAAATAgAAFAIAABUCAAAjAgAAFwIAACQCAAAZAgAAJQIAAMh0AgAoSQIA7EoCAE5TdDNfXzI5YmFzaWNfaW9zSWNOU18xMWNoYXJfdHJhaXRzSWNFRUVFAAAAoHQCAFxJAgBOU3QzX18yMTViYXNpY19zdHJlYW1idWZJY05TXzExY2hhcl90cmFpdHNJY0VFRUUAAAAAJHUCAKhJAgAAAAAAAQAAABxJAgAD9P//TlN0M19fMjEzYmFzaWNfb3N0cmVhbUljTlNfMTFjaGFyX3RyYWl0c0ljRUVFRQAAyHQCAORJAgBUSQIATlN0M19fMjE1YmFzaWNfc3RyaW5nYnVmSWNOU18xMWNoYXJfdHJhaXRz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\";return u}var uA;function XA(u){if(u==uA&&Q)return new Uint8Array(Q);var w=f(u);if(w)return w;throw\"both async and sync fetching of the wasm failed\"}function EA(u){return Promise.resolve().then(()=>XA(u))}function ZA(u,w,S){return EA(u).then(T=>WebAssembly.instantiate(T,w)).then(S,T=>{B(`failed to asynchronously prepare wasm: ${T}`),KA(T)})}function MA(u,w,S,T){return ZA(w,S,T)}function be(){return{a:Ft}}function _A(){var u=be();function w(T,k){return rt=T.exports,b=rt.y,z(),aA(rt.z),mA(),rt}UA();function S(T){w(T.instance)}return uA??=HA(),MA(Q,uA,u,S).catch(o),{}}function pA(u){return i.agerrMessages.push(Me(u)),0}function Rt(u){this.name=\"ExitStatus\",this.message=`Program terminated with exit(${u})`,this.status=u}var Et=u=>{u.forEach(w=>w(i))};function Qe(u,w=\"i8\"){switch(w.endsWith(\"*\")&&(w=\"*\"),w){case\"i1\":return M[u];case\"i8\":return M[u];case\"i16\":return F[u>>1];case\"i32\":return G[u>>2];case\"i64\":return j[u>>3];case\"float\":return Y[u>>2];case\"double\":return AA[u>>3];case\"*\":return U[u>>2];default:KA(`invalid type for getValue: ${w}`)}}var _t=u=>Yi(u),Ue=()=>cn(),Te=typeof TextDecoder<\"u\"?new TextDecoder:void 0,ht=(u,w=0,S=NaN)=>{for(var T=w+S,k=w;u[k]&&!(k>=T);)++k;if(k-w>16&&u.buffer&&Te)return Te.decode(u.subarray(w,k));for(var H=\"\";w<k;){var Z=u[w++];if(!(Z&128)){H+=String.fromCharCode(Z);continue}var gA=u[w++]&63;if((Z&224)==192){H+=String.fromCharCode((Z&31)<<6|gA);continue}var DA=u[w++]&63;if((Z&240)==224?Z=(Z&15)<<12|gA<<6|DA:Z=(Z&7)<<18|gA<<12|DA<<6|u[w++]&63,Z<65536)H+=String.fromCharCode(Z);else{var Ae=Z-65536;H+=String.fromCharCode(55296|Ae>>10,56320|Ae&1023)}}return H},Me=(u,w)=>u?ht(v,u,w):\"\",Ai=(u,w,S,T)=>{KA(`Assertion failed: ${Me(u)}, at: `+[w?Me(w):\"unknown filename\",S,T?Me(T):\"unknown function\"])};class J{constructor(w){this.excPtr=w,this.ptr=w-24}set_type(w){U[this.ptr+4>>2]=w}get_type(){return U[this.ptr+4>>2]}set_destructor(w){U[this.ptr+8>>2]=w}get_destructor(){return U[this.ptr+8>>2]}set_caught(w){w=w?1:0,M[this.ptr+12]=w}get_caught(){return M[this.ptr+12]!=0}set_rethrown(w){w=w?1:0,M[this.ptr+13]=w}get_rethrown(){return M[this.ptr+13]!=0}init(w,S){this.set_adjusted_ptr(0),this.set_type(w),this.set_destructor(S)}set_adjusted_ptr(w){U[this.ptr+16>>2]=w}get_adjusted_ptr(){return U[this.ptr+16>>2]}}var O=0,tA=(u,w,S)=>{var T=new J(u);throw T.init(w,S),O=u,O},oA={isAbs:u=>u.charAt(0)===\"/\",splitPath:u=>{var w=/^(\\/?|)([\\s\\S]*?)((?:\\.{1,2}|[^\\/]+?|)(\\.[^.\\/]*|))(?:[\\/]*)$/;return w.exec(u).slice(1)},normalizeArray:(u,w)=>{for(var S=0,T=u.length-1;T>=0;T--){var k=u[T];k===\".\"?u.splice(T,1):k===\"..\"?(u.splice(T,1),S++):S&&(u.splice(T,1),S--)}if(w)for(;S;S--)u.unshift(\"..\");return u},normalize:u=>{var w=oA.isAbs(u),S=u.substr(-1)===\"/\";return u=oA.normalizeArray(u.split(\"/\").filter(T=>!!T),!w).join(\"/\"),!u&&!w&&(u=\".\"),u&&S&&(u+=\"/\"),(w?\"/\":\"\")+u},dirname:u=>{var w=oA.splitPath(u),S=w[0],T=w[1];return!S&&!T?\".\":(T&&(T=T.substr(0,T.length-1)),S+T)},basename:u=>{if(u===\"/\")return\"/\";u=oA.normalize(u),u=u.replace(/\\/$/,\"\");var w=u.lastIndexOf(\"/\");return w===-1?u:u.substr(w+1)},join:(...u)=>oA.normalize(u.join(\"/\")),join2:(u,w)=>oA.normalize(u+\"/\"+w)},NA=()=>{if(typeof crypto==\"object\"&&typeof crypto.getRandomValues==\"function\")return u=>crypto.getRandomValues(u);KA(\"initRandomDevice\")},de=u=>(de=NA())(u),Ee={resolve:(...u)=>{for(var w=\"\",S=!1,T=u.length-1;T>=-1&&!S;T--){var k=T>=0?u[T]:L.cwd();if(typeof k!=\"string\")throw new TypeError(\"Arguments to path.resolve must be strings\");if(!k)return\"\";w=k+\"/\"+w,S=oA.isAbs(k)}return w=oA.normalizeArray(w.split(\"/\").filter(H=>!!H),!S).join(\"/\"),(S?\"/\":\"\")+w||\".\"},relative:(u,w)=>{u=Ee.resolve(u).substr(1),w=Ee.resolve(w).substr(1);function S(Ae){for(var ne=0;ne<Ae.length&&Ae[ne]===\"\";ne++);for(var Be=Ae.length-1;Be>=0&&Ae[Be]===\"\";Be--);return ne>Be?[]:Ae.slice(ne,Be-ne+1)}for(var T=S(u.split(\"/\")),k=S(w.split(\"/\")),H=Math.min(T.length,k.length),Z=H,gA=0;gA<H;gA++)if(T[gA]!==k[gA]){Z=gA;break}for(var DA=[],gA=Z;gA<T.length;gA++)DA.push(\"..\");return DA=DA.concat(k.slice(Z)),DA.join(\"/\")}},xA=[],LA=u=>{for(var w=0,S=0;S<u.length;++S){var T=u.charCodeAt(S);T<=127?w++:T<=2047?w+=2:T>=55296&&T<=57343?(w+=4,++S):w+=3}return w},dt=(u,w,S,T)=>{if(!(T>0))return 0;for(var k=S,H=S+T-1,Z=0;Z<u.length;++Z){var gA=u.charCodeAt(Z);if(gA>=55296&&gA<=57343){var DA=u.charCodeAt(++Z);gA=65536+((gA&1023)<<10)|DA&1023}if(gA<=127){if(S>=H)break;w[S++]=gA}else if(gA<=2047){if(S+1>=H)break;w[S++]=192|gA>>6,w[S++]=128|gA&63}else if(gA<=65535){if(S+2>=H)break;w[S++]=224|gA>>12,w[S++]=128|gA>>6&63,w[S++]=128|gA&63}else{if(S+3>=H)break;w[S++]=240|gA>>18,w[S++]=128|gA>>12&63,w[S++]=128|gA>>6&63,w[S++]=128|gA&63}}return w[S]=0,S-k};function At(u,w,S){var T=S>0?S:LA(u)+1,k=new Array(T),H=dt(u,k,0,k.length);return w&&(k.length=H),k}var Je=()=>{if(!xA.length){var u=null;if(typeof window<\"u\"&&typeof window.prompt==\"function\"&&(u=window.prompt(\"Input: \"),u!==null&&(u+=`\n`)),!u)return null;xA=At(u,!0)}return xA.shift()},Ge={ttys:[],init(){},shutdown(){},register(u,w){Ge.ttys[u]={input:[],output:[],ops:w},L.registerDevice(u,Ge.stream_ops)},stream_ops:{open(u){var w=Ge.ttys[u.node.rdev];if(!w)throw new L.ErrnoError(43);u.tty=w,u.seekable=!1},close(u){u.tty.ops.fsync(u.tty)},fsync(u){u.tty.ops.fsync(u.tty)},read(u,w,S,T,k){if(!u.tty||!u.tty.ops.get_char)throw new L.ErrnoError(60);for(var H=0,Z=0;Z<T;Z++){var gA;try{gA=u.tty.ops.get_char(u.tty)}catch(DA){throw new L.ErrnoError(29)}if(gA===void 0&&H===0)throw new L.ErrnoError(6);if(gA==null)break;H++,w[S+Z]=gA}return H&&(u.node.timestamp=Date.now()),H},write(u,w,S,T,k){if(!u.tty||!u.tty.ops.put_char)throw new L.ErrnoError(60);try{for(var H=0;H<T;H++)u.tty.ops.put_char(u.tty,w[S+H])}catch(Z){throw new L.ErrnoError(29)}return T&&(u.node.timestamp=Date.now()),H}},default_tty_ops:{get_char(u){return Je()},put_char(u,w){w===null||w===10?(d(ht(u.output)),u.output=[]):w!=0&&u.output.push(w)},fsync(u){u.output&&u.output.length>0&&(d(ht(u.output)),u.output=[])},ioctl_tcgets(u){return{c_iflag:25856,c_oflag:5,c_cflag:191,c_lflag:35387,c_cc:[3,28,127,21,4,0,1,0,17,19,26,0,18,15,23,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}},ioctl_tcsets(u,w,S){return 0},ioctl_tiocgwinsz(u){return[24,80]}},default_tty1_ops:{put_char(u,w){w===null||w===10?(B(ht(u.output)),u.output=[]):w!=0&&u.output.push(w)},fsync(u){u.output&&u.output.length>0&&(B(ht(u.output)),u.output=[])}}},ri=(u,w)=>{v.fill(0,u,u+w)},en=(u,w)=>Math.ceil(u/w)*w,rn=u=>{u=en(u,65536);var w=xi(65536,u);return w&&ri(w,u),w},Le={ops_table:null,mount(u){return Le.createNode(null,\"/\",16895,0)},createNode(u,w,S,T){if(L.isBlkdev(S)||L.isFIFO(S))throw new L.ErrnoError(63);Le.ops_table||={dir:{node:{getattr:Le.node_ops.getattr,setattr:Le.node_ops.setattr,lookup:Le.node_ops.lookup,mknod:Le.node_ops.mknod,rename:Le.node_ops.rename,unlink:Le.node_ops.unlink,rmdir:Le.node_ops.rmdir,readdir:Le.node_ops.readdir,symlink:Le.node_ops.symlink},stream:{llseek:Le.stream_ops.llseek}},file:{node:{getattr:Le.node_ops.getattr,setattr:Le.node_ops.setattr},stream:{llseek:Le.stream_ops.llseek,read:Le.stream_ops.read,write:Le.stream_ops.write,allocate:Le.stream_ops.allocate,mmap:Le.stream_ops.mmap,msync:Le.stream_ops.msync}},link:{node:{getattr:Le.node_ops.getattr,setattr:Le.node_ops.setattr,readlink:Le.node_ops.readlink},stream:{}},chrdev:{node:{getattr:Le.node_ops.getattr,setattr:Le.node_ops.setattr},stream:L.chrdev_stream_ops}};var k=L.createNode(u,w,S,T);return L.isDir(k.mode)?(k.node_ops=Le.ops_table.dir.node,k.stream_ops=Le.ops_table.dir.stream,k.contents={}):L.isFile(k.mode)?(k.node_ops=Le.ops_table.file.node,k.stream_ops=Le.ops_table.file.stream,k.usedBytes=0,k.contents=null):L.isLink(k.mode)?(k.node_ops=Le.ops_table.link.node,k.stream_ops=Le.ops_table.link.stream):L.isChrdev(k.mode)&&(k.node_ops=Le.ops_table.chrdev.node,k.stream_ops=Le.ops_table.chrdev.stream),k.timestamp=Date.now(),u&&(u.contents[w]=k,u.timestamp=k.timestamp),k},getFileDataAsTypedArray(u){return u.contents?u.contents.subarray?u.contents.subarray(0,u.usedBytes):new Uint8Array(u.contents):new Uint8Array(0)},expandFileStorage(u,w){var S=u.contents?u.contents.length:0;if(!(S>=w)){var T=1024*1024;w=Math.max(w,S*(S<T?2:1.125)>>>0),S!=0&&(w=Math.max(w,256));var k=u.contents;u.contents=new Uint8Array(w),u.usedBytes>0&&u.contents.set(k.subarray(0,u.usedBytes),0)}},resizeFileStorage(u,w){if(u.usedBytes!=w)if(w==0)u.contents=null,u.usedBytes=0;else{var S=u.contents;u.contents=new Uint8Array(w),S&&u.contents.set(S.subarray(0,Math.min(w,u.usedBytes))),u.usedBytes=w}},node_ops:{getattr(u){var w={};return w.dev=L.isChrdev(u.mode)?u.id:1,w.ino=u.id,w.mode=u.mode,w.nlink=1,w.uid=0,w.gid=0,w.rdev=u.rdev,L.isDir(u.mode)?w.size=4096:L.isFile(u.mode)?w.size=u.usedBytes:L.isLink(u.mode)?w.size=u.link.length:w.size=0,w.atime=new Date(u.timestamp),w.mtime=new Date(u.timestamp),w.ctime=new Date(u.timestamp),w.blksize=4096,w.blocks=Math.ceil(w.size/w.blksize),w},setattr(u,w){w.mode!==void 0&&(u.mode=w.mode),w.timestamp!==void 0&&(u.timestamp=w.timestamp),w.size!==void 0&&Le.resizeFileStorage(u,w.size)},lookup(u,w){throw L.genericErrors[44]},mknod(u,w,S,T){return Le.createNode(u,w,S,T)},rename(u,w,S){if(L.isDir(u.mode)){var T;try{T=L.lookupNode(w,S)}catch(H){}if(T)for(var k in T.contents)throw new L.ErrnoError(55)}delete u.parent.contents[u.name],u.parent.timestamp=Date.now(),u.name=S,w.contents[S]=u,w.timestamp=u.parent.timestamp},unlink(u,w){delete u.contents[w],u.timestamp=Date.now()},rmdir(u,w){var S=L.lookupNode(u,w);for(var T in S.contents)throw new L.ErrnoError(55);delete u.contents[w],u.timestamp=Date.now()},readdir(u){var w=[\".\",\"..\"];for(var S of Object.keys(u.contents))w.push(S);return w},symlink(u,w,S){var T=Le.createNode(u,w,41471,0);return T.link=S,T},readlink(u){if(!L.isLink(u.mode))throw new L.ErrnoError(28);return u.link}},stream_ops:{read(u,w,S,T,k){var H=u.node.contents;if(k>=u.node.usedBytes)return 0;var Z=Math.min(u.node.usedBytes-k,T);if(Z>8&&H.subarray)w.set(H.subarray(k,k+Z),S);else for(var gA=0;gA<Z;gA++)w[S+gA]=H[k+gA];return Z},write(u,w,S,T,k,H){if(w.buffer===M.buffer&&(H=!1),!T)return 0;var Z=u.node;if(Z.timestamp=Date.now(),w.subarray&&(!Z.contents||Z.contents.subarray)){if(H)return Z.contents=w.subarray(S,S+T),Z.usedBytes=T,T;if(Z.usedBytes===0&&k===0)return Z.contents=w.slice(S,S+T),Z.usedBytes=T,T;if(k+T<=Z.usedBytes)return Z.contents.set(w.subarray(S,S+T),k),T}if(Le.expandFileStorage(Z,k+T),Z.contents.subarray&&w.subarray)Z.contents.set(w.subarray(S,S+T),k);else for(var gA=0;gA<T;gA++)Z.contents[k+gA]=w[S+gA];return Z.usedBytes=Math.max(Z.usedBytes,k+T),T},llseek(u,w,S){var T=w;if(S===1?T+=u.position:S===2&&L.isFile(u.node.mode)&&(T+=u.node.usedBytes),T<0)throw new L.ErrnoError(28);return T},allocate(u,w,S){Le.expandFileStorage(u.node,w+S),u.node.usedBytes=Math.max(u.node.usedBytes,w+S)},mmap(u,w,S,T,k){if(!L.isFile(u.node.mode))throw new L.ErrnoError(43);var H,Z,gA=u.node.contents;if(!(k&2)&&gA&&gA.buffer===M.buffer)Z=!1,H=gA.byteOffset;else{if(Z=!0,H=rn(w),!H)throw new L.ErrnoError(48);gA&&((S>0||S+w<gA.length)&&(gA.subarray?gA=gA.subarray(S,S+w):gA=Array.prototype.slice.call(gA,S,S+w)),M.set(gA,H))}return{ptr:H,allocated:Z}},msync(u,w,S,T,k){return Le.stream_ops.write(u,w,0,T,S,!1),0}}},ji=(u,w,S,T)=>{var k=T?\"\":`al ${u}`;C(u).then(H=>{w(new Uint8Array(H)),k&&mA()},H=>{if(S)S();else throw`Loading data file \"${u}\" failed.`}),k&&UA()},Bi=(u,w,S,T,k,H)=>{L.createDataFile(u,w,S,T,k,H)},vi=[],Ji=(u,w,S,T)=>{typeof Browser<\"u\"&&Browser.init();var k=!1;return vi.forEach(H=>{k||H.canHandle(w)&&(H.handle(u,w,S,T),k=!0)}),k},Dt=(u,w,S,T,k,H,Z,gA,DA,Ae)=>{var ne=w?Ee.resolve(oA.join2(u,w)):u;function Be(Ye){function ke(Re){Ae?.(),gA||Bi(u,w,Re,T,k,DA),H?.(),mA()}Ji(Ye,ne,ke,()=>{Z?.(),mA()})||ke(Ye)}UA(),typeof S==\"string\"?ji(S,Be,Z):Be(S)},qi=u=>{var w={r:0,\"r+\":2,w:577,\"w+\":578,a:1089,\"a+\":1090},S=w[u];if(typeof S>\"u\")throw new Error(`Unknown file open mode: ${u}`);return S},Nt=(u,w)=>{var S=0;return u&&(S|=365),w&&(S|=146),S},L={root:null,mounts:[],devices:{},streams:[],nextInode:1,nameTable:null,currentPath:\"/\",initialized:!1,ignorePermissions:!0,ErrnoError:class{constructor(u){this.name=\"ErrnoError\",this.errno=u}},genericErrors:{},filesystems:null,syncFSRequests:0,FSStream:class{constructor(){this.shared={}}get object(){return this.node}set object(u){this.node=u}get isRead(){return(this.flags&2097155)!==1}get isWrite(){return(this.flags&2097155)!==0}get isAppend(){return this.flags&1024}get flags(){return this.shared.flags}set flags(u){this.shared.flags=u}get position(){return this.shared.position}set position(u){this.shared.position=u}},FSNode:class{constructor(u,w,S,T){u||(u=this),this.parent=u,this.mount=u.mount,this.mounted=null,this.id=L.nextInode++,this.name=w,this.mode=S,this.node_ops={},this.stream_ops={},this.rdev=T,this.readMode=365,this.writeMode=146}get read(){return(this.mode&this.readMode)===this.readMode}set read(u){u?this.mode|=this.readMode:this.mode&=~this.readMode}get write(){return(this.mode&this.writeMode)===this.writeMode}set write(u){u?this.mode|=this.writeMode:this.mode&=~this.writeMode}get isFolder(){return L.isDir(this.mode)}get isDevice(){return L.isChrdev(this.mode)}},lookupPath(u,w={}){if(u=Ee.resolve(u),!u)return{path:\"\",node:null};var S={follow_mount:!0,recurse_count:0};if(w=Object.assign(S,w),w.recurse_count>8)throw new L.ErrnoError(32);for(var T=u.split(\"/\").filter(Be=>!!Be),k=L.root,H=\"/\",Z=0;Z<T.length;Z++){var gA=Z===T.length-1;if(gA&&w.parent)break;if(k=L.lookupNode(k,T[Z]),H=oA.join2(H,T[Z]),L.isMountpoint(k)&&(!gA||gA&&w.follow_mount)&&(k=k.mounted.root),!gA||w.follow)for(var DA=0;L.isLink(k.mode);){var Ae=L.readlink(H);H=Ee.resolve(oA.dirname(H),Ae);var ne=L.lookupPath(H,{recurse_count:w.recurse_count+1});if(k=ne.node,DA++>40)throw new L.ErrnoError(32)}}return{path:H,node:k}},getPath(u){for(var w;;){if(L.isRoot(u)){var S=u.mount.mountpoint;return w?S[S.length-1]!==\"/\"?`${S}/${w}`:S+w:S}w=w?`${u.name}/${w}`:u.name,u=u.parent}},hashName(u,w){for(var S=0,T=0;T<w.length;T++)S=(S<<5)-S+w.charCodeAt(T)|0;return(u+S>>>0)%L.nameTable.length},hashAddNode(u){var w=L.hashName(u.parent.id,u.name);u.name_next=L.nameTable[w],L.nameTable[w]=u},hashRemoveNode(u){var w=L.hashName(u.parent.id,u.name);if(L.nameTable[w]===u)L.nameTable[w]=u.name_next;else for(var S=L.nameTable[w];S;){if(S.name_next===u){S.name_next=u.name_next;break}S=S.name_next}},lookupNode(u,w){var S=L.mayLookup(u);if(S)throw new L.ErrnoError(S);for(var T=L.hashName(u.id,w),k=L.nameTable[T];k;k=k.name_next){var H=k.name;if(k.parent.id===u.id&&H===w)return k}return L.lookup(u,w)},createNode(u,w,S,T){var k=new L.FSNode(u,w,S,T);return L.hashAddNode(k),k},destroyNode(u){L.hashRemoveNode(u)},isRoot(u){return u===u.parent},isMountpoint(u){return!!u.mounted},isFile(u){return(u&61440)===32768},isDir(u){return(u&61440)===16384},isLink(u){return(u&61440)===40960},isChrdev(u){return(u&61440)===8192},isBlkdev(u){return(u&61440)===24576},isFIFO(u){return(u&61440)===4096},isSocket(u){return(u&49152)===49152},flagsToPermissionString(u){var w=[\"r\",\"w\",\"rw\"][u&3];return u&512&&(w+=\"w\"),w},nodePermissions(u,w){return L.ignorePermissions?0:w.includes(\"r\")&&!(u.mode&292)||w.includes(\"w\")&&!(u.mode&146)||w.includes(\"x\")&&!(u.mode&73)?2:0},mayLookup(u){if(!L.isDir(u.mode))return 54;var w=L.nodePermissions(u,\"x\");return w||(u.node_ops.lookup?0:2)},mayCreate(u,w){try{var S=L.lookupNode(u,w);return 20}catch(T){}return L.nodePermissions(u,\"wx\")},mayDelete(u,w,S){var T;try{T=L.lookupNode(u,w)}catch(H){return H.errno}var k=L.nodePermissions(u,\"wx\");if(k)return k;if(S){if(!L.isDir(T.mode))return 54;if(L.isRoot(T)||L.getPath(T)===L.cwd())return 10}else if(L.isDir(T.mode))return 31;return 0},mayOpen(u,w){return u?L.isLink(u.mode)?32:L.isDir(u.mode)&&(L.flagsToPermissionString(w)!==\"r\"||w&512)?31:L.nodePermissions(u,L.flagsToPermissionString(w)):44},MAX_OPEN_FDS:4096,nextfd(){for(var u=0;u<=L.MAX_OPEN_FDS;u++)if(!L.streams[u])return u;throw new L.ErrnoError(33)},getStreamChecked(u){var w=L.getStream(u);if(!w)throw new L.ErrnoError(8);return w},getStream:u=>L.streams[u],createStream(u,w=-1){return u=Object.assign(new L.FSStream,u),w==-1&&(w=L.nextfd()),u.fd=w,L.streams[w]=u,u},closeStream(u){L.streams[u]=null},dupStream(u,w=-1){var S=L.createStream(u,w);return S.stream_ops?.dup?.(S),S},chrdev_stream_ops:{open(u){var w=L.getDevice(u.node.rdev);u.stream_ops=w.stream_ops,u.stream_ops.open?.(u)},llseek(){throw new L.ErrnoError(70)}},major:u=>u>>8,minor:u=>u&255,makedev:(u,w)=>u<<8|w,registerDevice(u,w){L.devices[u]={stream_ops:w}},getDevice:u=>L.devices[u],getMounts(u){for(var w=[],S=[u];S.length;){var T=S.pop();w.push(T),S.push(...T.mounts)}return w},syncfs(u,w){typeof u==\"function\"&&(w=u,u=!1),L.syncFSRequests++,L.syncFSRequests>1&&B(`warning: ${L.syncFSRequests} FS.syncfs operations in flight at once, probably just doing extra work`);var S=L.getMounts(L.root.mount),T=0;function k(Z){return L.syncFSRequests--,w(Z)}function H(Z){if(Z)return H.errored?void 0:(H.errored=!0,k(Z));++T>=S.length&&k(null)}S.forEach(Z=>{if(!Z.type.syncfs)return H(null);Z.type.syncfs(Z,u,H)})},mount(u,w,S){var T=S===\"/\",k=!S,H;if(T&&L.root)throw new L.ErrnoError(10);if(!T&&!k){var Z=L.lookupPath(S,{follow_mount:!1});if(S=Z.path,H=Z.node,L.isMountpoint(H))throw new L.ErrnoError(10);if(!L.isDir(H.mode))throw new L.ErrnoError(54)}var gA={type:u,opts:w,mountpoint:S,mounts:[]},DA=u.mount(gA);return DA.mount=gA,gA.root=DA,T?L.root=DA:H&&(H.mounted=gA,H.mount&&H.mount.mounts.push(gA)),DA},unmount(u){var w=L.lookupPath(u,{follow_mount:!1});if(!L.isMountpoint(w.node))throw new L.ErrnoError(28);var S=w.node,T=S.mounted,k=L.getMounts(T);Object.keys(L.nameTable).forEach(Z=>{for(var gA=L.nameTable[Z];gA;){var DA=gA.name_next;k.includes(gA.mount)&&L.destroyNode(gA),gA=DA}}),S.mounted=null;var H=S.mount.mounts.indexOf(T);S.mount.mounts.splice(H,1)},lookup(u,w){return u.node_ops.lookup(u,w)},mknod(u,w,S){var T=L.lookupPath(u,{parent:!0}),k=T.node,H=oA.basename(u);if(!H||H===\".\"||H===\"..\")throw new L.ErrnoError(28);var Z=L.mayCreate(k,H);if(Z)throw new L.ErrnoError(Z);if(!k.node_ops.mknod)throw new L.ErrnoError(63);return k.node_ops.mknod(k,H,w,S)},create(u,w){return w=w!==void 0?w:438,w&=4095,w|=32768,L.mknod(u,w,0)},mkdir(u,w){return w=w!==void 0?w:511,w&=1023,w|=16384,L.mknod(u,w,0)},mkdirTree(u,w){for(var S=u.split(\"/\"),T=\"\",k=0;k<S.length;++k)if(S[k]){T+=\"/\"+S[k];try{L.mkdir(T,w)}catch(H){if(H.errno!=20)throw H}}},mkdev(u,w,S){return typeof S>\"u\"&&(S=w,w=438),w|=8192,L.mknod(u,w,S)},symlink(u,w){if(!Ee.resolve(u))throw new L.ErrnoError(44);var S=L.lookupPath(w,{parent:!0}),T=S.node;if(!T)throw new L.ErrnoError(44);var k=oA.basename(w),H=L.mayCreate(T,k);if(H)throw new L.ErrnoError(H);if(!T.node_ops.symlink)throw new L.ErrnoError(63);return T.node_ops.symlink(T,k,u)},rename(u,w){var S=oA.dirname(u),T=oA.dirname(w),k=oA.basename(u),H=oA.basename(w),Z,gA,DA;if(Z=L.lookupPath(u,{parent:!0}),gA=Z.node,Z=L.lookupPath(w,{parent:!0}),DA=Z.node,!gA||!DA)throw new L.ErrnoError(44);if(gA.mount!==DA.mount)throw new L.ErrnoError(75);var Ae=L.lookupNode(gA,k),ne=Ee.relative(u,T);if(ne.charAt(0)!==\".\")throw new L.ErrnoError(28);if(ne=Ee.relative(w,S),ne.charAt(0)!==\".\")throw new L.ErrnoError(55);var Be;try{Be=L.lookupNode(DA,H)}catch(Re){}if(Ae!==Be){var Ye=L.isDir(Ae.mode),ke=L.mayDelete(gA,k,Ye);if(ke)throw new L.ErrnoError(ke);if(ke=Be?L.mayDelete(DA,H,Ye):L.mayCreate(DA,H),ke)throw new L.ErrnoError(ke);if(!gA.node_ops.rename)throw new L.ErrnoError(63);if(L.isMountpoint(Ae)||Be&&L.isMountpoint(Be))throw new L.ErrnoError(10);if(DA!==gA&&(ke=L.nodePermissions(gA,\"w\"),ke))throw new L.ErrnoError(ke);L.hashRemoveNode(Ae);try{gA.node_ops.rename(Ae,DA,H),Ae.parent=DA}catch(Re){throw Re}finally{L.hashAddNode(Ae)}}},rmdir(u){var w=L.lookupPath(u,{parent:!0}),S=w.node,T=oA.basename(u),k=L.lookupNode(S,T),H=L.mayDelete(S,T,!0);if(H)throw new L.ErrnoError(H);if(!S.node_ops.rmdir)throw new L.ErrnoError(63);if(L.isMountpoint(k))throw new L.ErrnoError(10);S.node_ops.rmdir(S,T),L.destroyNode(k)},readdir(u){var w=L.lookupPath(u,{follow:!0}),S=w.node;if(!S.node_ops.readdir)throw new L.ErrnoError(54);return S.node_ops.readdir(S)},unlink(u){var w=L.lookupPath(u,{parent:!0}),S=w.node;if(!S)throw new L.ErrnoError(44);var T=oA.basename(u),k=L.lookupNode(S,T),H=L.mayDelete(S,T,!1);if(H)throw new L.ErrnoError(H);if(!S.node_ops.unlink)throw new L.ErrnoError(63);if(L.isMountpoint(k))throw new L.ErrnoError(10);S.node_ops.unlink(S,T),L.destroyNode(k)},readlink(u){var w=L.lookupPath(u),S=w.node;if(!S)throw new L.ErrnoError(44);if(!S.node_ops.readlink)throw new L.ErrnoError(28);return Ee.resolve(L.getPath(S.parent),S.node_ops.readlink(S))},stat(u,w){var S=L.lookupPath(u,{follow:!w}),T=S.node;if(!T)throw new L.ErrnoError(44);if(!T.node_ops.getattr)throw new L.ErrnoError(63);return T.node_ops.getattr(T)},lstat(u){return L.stat(u,!0)},chmod(u,w,S){var T;if(typeof u==\"string\"){var k=L.lookupPath(u,{follow:!S});T=k.node}else T=u;if(!T.node_ops.setattr)throw new L.ErrnoError(63);T.node_ops.setattr(T,{mode:w&4095|T.mode&-4096,timestamp:Date.now()})},lchmod(u,w){L.chmod(u,w,!0)},fchmod(u,w){var S=L.getStreamChecked(u);L.chmod(S.node,w)},chown(u,w,S,T){var k;if(typeof u==\"string\"){var H=L.lookupPath(u,{follow:!T});k=H.node}else k=u;if(!k.node_ops.setattr)throw new L.ErrnoError(63);k.node_ops.setattr(k,{timestamp:Date.now()})},lchown(u,w,S){L.chown(u,w,S,!0)},fchown(u,w,S){var T=L.getStreamChecked(u);L.chown(T.node,w,S)},truncate(u,w){if(w<0)throw new L.ErrnoError(28);var S;if(typeof u==\"string\"){var T=L.lookupPath(u,{follow:!0});S=T.node}else S=u;if(!S.node_ops.setattr)throw new L.ErrnoError(63);if(L.isDir(S.mode))throw new L.ErrnoError(31);if(!L.isFile(S.mode))throw new L.ErrnoError(28);var k=L.nodePermissions(S,\"w\");if(k)throw new L.ErrnoError(k);S.node_ops.setattr(S,{size:w,timestamp:Date.now()})},ftruncate(u,w){var S=L.getStreamChecked(u);if((S.flags&2097155)===0)throw new L.ErrnoError(28);L.truncate(S.node,w)},utime(u,w,S){var T=L.lookupPath(u,{follow:!0}),k=T.node;k.node_ops.setattr(k,{timestamp:Math.max(w,S)})},open(u,w,S){if(u===\"\")throw new L.ErrnoError(44);w=typeof w==\"string\"?qi(w):w,w&64?(S=typeof S>\"u\"?438:S,S=S&4095|32768):S=0;var T;if(typeof u==\"object\")T=u;else{u=oA.normalize(u);try{var k=L.lookupPath(u,{follow:!(w&131072)});T=k.node}catch(DA){}}var H=!1;if(w&64)if(T){if(w&128)throw new L.ErrnoError(20)}else T=L.mknod(u,S,0),H=!0;if(!T)throw new L.ErrnoError(44);if(L.isChrdev(T.mode)&&(w&=-513),w&65536&&!L.isDir(T.mode))throw new L.ErrnoError(54);if(!H){var Z=L.mayOpen(T,w);if(Z)throw new L.ErrnoError(Z)}w&512&&!H&&L.truncate(T,0),w&=-131713;var gA=L.createStream({node:T,path:L.getPath(T),flags:w,seekable:!0,position:0,stream_ops:T.stream_ops,ungotten:[],error:!1});return gA.stream_ops.open&&gA.stream_ops.open(gA),gA},close(u){if(L.isClosed(u))throw new L.ErrnoError(8);u.getdents&&(u.getdents=null);try{u.stream_ops.close&&u.stream_ops.close(u)}catch(w){throw w}finally{L.closeStream(u.fd)}u.fd=null},isClosed(u){return u.fd===null},llseek(u,w,S){if(L.isClosed(u))throw new L.ErrnoError(8);if(!u.seekable||!u.stream_ops.llseek)throw new L.ErrnoError(70);if(S!=0&&S!=1&&S!=2)throw new L.ErrnoError(28);return u.position=u.stream_ops.llseek(u,w,S),u.ungotten=[],u.position},read(u,w,S,T,k){if(T<0||k<0)throw new L.ErrnoError(28);if(L.isClosed(u))throw new L.ErrnoError(8);if((u.flags&2097155)===1)throw new L.ErrnoError(8);if(L.isDir(u.node.mode))throw new L.ErrnoError(31);if(!u.stream_ops.read)throw new L.ErrnoError(28);var H=typeof k<\"u\";if(!H)k=u.position;else if(!u.seekable)throw new L.ErrnoError(70);var Z=u.stream_ops.read(u,w,S,T,k);return H||(u.position+=Z),Z},write(u,w,S,T,k,H){if(T<0||k<0)throw new L.ErrnoError(28);if(L.isClosed(u))throw new L.ErrnoError(8);if((u.flags&2097155)===0)throw new L.ErrnoError(8);if(L.isDir(u.node.mode))throw new L.ErrnoError(31);if(!u.stream_ops.write)throw new L.ErrnoError(28);u.seekable&&u.flags&1024&&L.llseek(u,0,2);var Z=typeof k<\"u\";if(!Z)k=u.position;else if(!u.seekable)throw new L.ErrnoError(70);var gA=u.stream_ops.write(u,w,S,T,k,H);return Z||(u.position+=gA),gA},allocate(u,w,S){if(L.isClosed(u))throw new L.ErrnoError(8);if(w<0||S<=0)throw new L.ErrnoError(28);if((u.flags&2097155)===0)throw new L.ErrnoError(8);if(!L.isFile(u.node.mode)&&!L.isDir(u.node.mode))throw new L.ErrnoError(43);if(!u.stream_ops.allocate)throw new L.ErrnoError(138);u.stream_ops.allocate(u,w,S)},mmap(u,w,S,T,k){if((T&2)!==0&&(k&2)===0&&(u.flags&2097155)!==2)throw new L.ErrnoError(2);if((u.flags&2097155)===1)throw new L.ErrnoError(2);if(!u.stream_ops.mmap)throw new L.ErrnoError(43);if(!w)throw new L.ErrnoError(28);return u.stream_ops.mmap(u,w,S,T,k)},msync(u,w,S,T,k){return u.stream_ops.msync?u.stream_ops.msync(u,w,S,T,k):0},ioctl(u,w,S){if(!u.stream_ops.ioctl)throw new L.ErrnoError(59);return u.stream_ops.ioctl(u,w,S)},readFile(u,w={}){if(w.flags=w.flags||0,w.encoding=w.encoding||\"binary\",w.encoding!==\"utf8\"&&w.encoding!==\"binary\")throw new Error(`Invalid encoding type \"${w.encoding}\"`);var S,T=L.open(u,w.flags),k=L.stat(u),H=k.size,Z=new Uint8Array(H);return L.read(T,Z,0,H,0),w.encoding===\"utf8\"?S=ht(Z):w.encoding===\"binary\"&&(S=Z),L.close(T),S},writeFile(u,w,S={}){S.flags=S.flags||577;var T=L.open(u,S.flags,S.mode);if(typeof w==\"string\"){var k=new Uint8Array(LA(w)+1),H=dt(w,k,0,k.length);L.write(T,k,0,H,void 0,S.canOwn)}else if(ArrayBuffer.isView(w))L.write(T,w,0,w.byteLength,void 0,S.canOwn);else throw new Error(\"Unsupported data type\");L.close(T)},cwd:()=>L.currentPath,chdir(u){var w=L.lookupPath(u,{follow:!0});if(w.node===null)throw new L.ErrnoError(44);if(!L.isDir(w.node.mode))throw new L.ErrnoError(54);var S=L.nodePermissions(w.node,\"x\");if(S)throw new L.ErrnoError(S);L.currentPath=w.path},createDefaultDirectories(){L.mkdir(\"/tmp\"),L.mkdir(\"/home\"),L.mkdir(\"/home/web_user\")},createDefaultDevices(){L.mkdir(\"/dev\"),L.registerDevice(L.makedev(1,3),{read:()=>0,write:(T,k,H,Z,gA)=>Z}),L.mkdev(\"/dev/null\",L.makedev(1,3)),Ge.register(L.makedev(5,0),Ge.default_tty_ops),Ge.register(L.makedev(6,0),Ge.default_tty1_ops),L.mkdev(\"/dev/tty\",L.makedev(5,0)),L.mkdev(\"/dev/tty1\",L.makedev(6,0));var u=new Uint8Array(1024),w=0,S=()=>(w===0&&(w=de(u).byteLength),u[--w]);L.createDevice(\"/dev\",\"random\",S),L.createDevice(\"/dev\",\"urandom\",S),L.mkdir(\"/dev/shm\"),L.mkdir(\"/dev/shm/tmp\")},createSpecialDirectories(){L.mkdir(\"/proc\");var u=L.mkdir(\"/proc/self\");L.mkdir(\"/proc/self/fd\"),L.mount({mount(){var w=L.createNode(u,\"fd\",16895,73);return w.node_ops={lookup(S,T){var k=+T,H=L.getStreamChecked(k),Z={parent:null,mount:{mountpoint:\"fake\"},node_ops:{readlink:()=>H.path}};return Z.parent=Z,Z}},w}},{},\"/proc/self/fd\")},createStandardStreams(u,w,S){u?L.createDevice(\"/dev\",\"stdin\",u):L.symlink(\"/dev/tty\",\"/dev/stdin\"),w?L.createDevice(\"/dev\",\"stdout\",null,w):L.symlink(\"/dev/tty\",\"/dev/stdout\"),S?L.createDevice(\"/dev\",\"stderr\",null,S):L.symlink(\"/dev/tty1\",\"/dev/stderr\"),L.open(\"/dev/stdin\",0),L.open(\"/dev/stdout\",1),L.open(\"/dev/stderr\",1)},staticInit(){[44].forEach(u=>{L.genericErrors[u]=new L.ErrnoError(u),L.genericErrors[u].stack=\"<generic error, no stack>\"}),L.nameTable=new Array(4096),L.mount(Le,{},\"/\"),L.createDefaultDirectories(),L.createDefaultDevices(),L.createSpecialDirectories(),L.filesystems={MEMFS:Le}},init(u,w,S){L.initialized=!0,L.createStandardStreams(u,w,S)},quit(){L.initialized=!1;for(var u=0;u<L.streams.length;u++){var w=L.streams[u];w&&L.close(w)}},findObject(u,w){var S=L.analyzePath(u,w);return S.exists?S.object:null},analyzePath(u,w){try{var S=L.lookupPath(u,{follow:!w});u=S.path}catch(k){}var T={isRoot:!1,exists:!1,error:0,name:null,path:null,object:null,parentExists:!1,parentPath:null,parentObject:null};try{var S=L.lookupPath(u,{parent:!0});T.parentExists=!0,T.parentPath=S.path,T.parentObject=S.node,T.name=oA.basename(u),S=L.lookupPath(u,{follow:!w}),T.exists=!0,T.path=S.path,T.object=S.node,T.name=S.node.name,T.isRoot=S.path===\"/\"}catch(k){T.error=k.errno}return T},createPath(u,w,S,T){u=typeof u==\"string\"?u:L.getPath(u);for(var k=w.split(\"/\").reverse();k.length;){var H=k.pop();if(H){var Z=oA.join2(u,H);try{L.mkdir(Z)}catch(gA){}u=Z}}return Z},createFile(u,w,S,T,k){var H=oA.join2(typeof u==\"string\"?u:L.getPath(u),w),Z=Nt(T,k);return L.create(H,Z)},createDataFile(u,w,S,T,k,H){var Z=w;u&&(u=typeof u==\"string\"?u:L.getPath(u),Z=w?oA.join2(u,w):u);var gA=Nt(T,k),DA=L.create(Z,gA);if(S){if(typeof S==\"string\"){for(var Ae=new Array(S.length),ne=0,Be=S.length;ne<Be;++ne)Ae[ne]=S.charCodeAt(ne);S=Ae}L.chmod(DA,gA|146);var Ye=L.open(DA,577);L.write(Ye,S,0,S.length,0,H),L.close(Ye),L.chmod(DA,gA)}},createDevice(u,w,S,T){var k=oA.join2(typeof u==\"string\"?u:L.getPath(u),w),H=Nt(!!S,!!T);L.createDevice.major??=64;var Z=L.makedev(L.createDevice.major++,0);return L.registerDevice(Z,{open(gA){gA.seekable=!1},close(gA){T?.buffer?.length&&T(10)},read(gA,DA,Ae,ne,Be){for(var Ye=0,ke=0;ke<ne;ke++){var Re;try{Re=S()}catch(ii){throw new L.ErrnoError(29)}if(Re===void 0&&Ye===0)throw new L.ErrnoError(6);if(Re==null)break;Ye++,DA[Ae+ke]=Re}return Ye&&(gA.node.timestamp=Date.now()),Ye},write(gA,DA,Ae,ne,Be){for(var Ye=0;Ye<ne;Ye++)try{T(DA[Ae+Ye])}catch(ke){throw new L.ErrnoError(29)}return ne&&(gA.node.timestamp=Date.now()),Ye}}),L.mkdev(k,H,Z)},forceLoadFile(u){if(u.isDevice||u.isFolder||u.link||u.contents)return!0;if(typeof XMLHttpRequest<\"u\")throw new Error(\"Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread.\");try{u.contents=I(u.url),u.usedBytes=u.contents.length}catch(w){throw new L.ErrnoError(29)}},createLazyFile(u,w,S,T,k){class H{constructor(){this.lengthKnown=!1,this.chunks=[]}get(ke){if(!(ke>this.length-1||ke<0)){var Re=ke%this.chunkSize,ii=ke/this.chunkSize|0;return this.getter(ii)[Re]}}setDataGetter(ke){this.getter=ke}cacheLength(){var ke=new XMLHttpRequest;if(ke.open(\"HEAD\",S,!1),ke.send(null),!(ke.status>=200&&ke.status<300||ke.status===304))throw new Error(\"Couldn't load \"+S+\". Status: \"+ke.status);var Re=Number(ke.getResponseHeader(\"Content-length\")),ii,xn=(ii=ke.getResponseHeader(\"Accept-Ranges\"))&&ii===\"bytes\",q=(ii=ke.getResponseHeader(\"Content-Encoding\"))&&ii===\"gzip\",fA=1024*1024;xn||(fA=Re);var PA=(pe,we)=>{if(pe>we)throw new Error(\"invalid range (\"+pe+\", \"+we+\") or no bytes requested!\");if(we>Re-1)throw new Error(\"only \"+Re+\" bytes available! programmer error!\");var it=new XMLHttpRequest;if(it.open(\"GET\",S,!1),Re!==fA&&it.setRequestHeader(\"Range\",\"bytes=\"+pe+\"-\"+we),it.responseType=\"arraybuffer\",it.overrideMimeType&&it.overrideMimeType(\"text/plain; charset=x-user-defined\"),it.send(null),!(it.status>=200&&it.status<300||it.status===304))throw new Error(\"Couldn't load \"+S+\". Status: \"+it.status);return it.response!==void 0?new Uint8Array(it.response||[]):At(it.responseText||\"\",!0)},Ne=this;Ne.setDataGetter(pe=>{var we=pe*fA,it=(pe+1)*fA-1;if(it=Math.min(it,Re-1),typeof Ne.chunks[pe]>\"u\"&&(Ne.chunks[pe]=PA(we,it)),typeof Ne.chunks[pe]>\"u\")throw new Error(\"doXHR failed!\");return Ne.chunks[pe]}),(q||!Re)&&(fA=Re=1,Re=this.getter(0).length,fA=Re,d(\"LazyFiles on gzip forces download of the whole file when length is accessed\")),this._length=Re,this._chunkSize=fA,this.lengthKnown=!0}get length(){return this.lengthKnown||this.cacheLength(),this._length}get chunkSize(){return this.lengthKnown||this.cacheLength(),this._chunkSize}}if(typeof XMLHttpRequest<\"u\"){throw\"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc\";var Z,gA}else var gA={isDevice:!1,url:S};var DA=L.createFile(u,w,gA,T,k);gA.contents?DA.contents=gA.contents:gA.url&&(DA.contents=null,DA.url=gA.url),Object.defineProperties(DA,{usedBytes:{get:function(){return this.contents.length}}});var Ae={},ne=Object.keys(DA.stream_ops);ne.forEach(Ye=>{var ke=DA.stream_ops[Ye];Ae[Ye]=(...Re)=>(L.forceLoadFile(DA),ke(...Re))});function Be(Ye,ke,Re,ii,xn){var q=Ye.node.contents;if(xn>=q.length)return 0;var fA=Math.min(q.length-xn,ii);if(q.slice)for(var PA=0;PA<fA;PA++)ke[Re+PA]=q[xn+PA];else for(var PA=0;PA<fA;PA++)ke[Re+PA]=q.get(xn+PA);return fA}return Ae.read=(Ye,ke,Re,ii,xn)=>(L.forceLoadFile(DA),Be(Ye,ke,Re,ii,xn)),Ae.mmap=(Ye,ke,Re,ii,xn)=>{L.forceLoadFile(DA);var q=rn(ke);if(!q)throw new L.ErrnoError(48);return Be(Ye,M,q,ke,Re),{ptr:q,allocated:!0}},DA.stream_ops=Ae,DA}},gt={DEFAULT_POLLMASK:5,calculateAt(u,w,S){if(oA.isAbs(w))return w;var T;if(u===-100)T=L.cwd();else{var k=gt.getStreamFromFD(u);T=k.path}if(w.length==0){if(!S)throw new L.ErrnoError(44);return T}return oA.join2(T,w)},doStat(u,w,S){var T=u(w);G[S>>2]=T.dev,G[S+4>>2]=T.mode,U[S+8>>2]=T.nlink,G[S+12>>2]=T.uid,G[S+16>>2]=T.gid,G[S+20>>2]=T.rdev,j[S+24>>3]=BigInt(T.size),G[S+32>>2]=4096,G[S+36>>2]=T.blocks;var k=T.atime.getTime(),H=T.mtime.getTime(),Z=T.ctime.getTime();return j[S+40>>3]=BigInt(Math.floor(k/1e3)),U[S+48>>2]=k%1e3*1e3*1e3,j[S+56>>3]=BigInt(Math.floor(H/1e3)),U[S+64>>2]=H%1e3*1e3*1e3,j[S+72>>3]=BigInt(Math.floor(Z/1e3)),U[S+80>>2]=Z%1e3*1e3*1e3,j[S+88>>3]=BigInt(T.ino),0},doMsync(u,w,S,T,k){if(!L.isFile(w.node.mode))throw new L.ErrnoError(43);if(T&2)return 0;var H=v.slice(u,u+S);L.msync(w,H,k,S,T)},getStreamFromFD(u){var w=L.getStreamChecked(u);return w},varargs:void 0,getStr(u){var w=Me(u);return w}};function gi(u,w,S,T){try{if(w=gt.getStr(w),w=gt.calculateAt(u,w),S&-8)return-28;var k=L.lookupPath(w,{follow:!0}),H=k.node;if(!H)return-44;var Z=\"\";return S&4&&(Z+=\"r\"),S&2&&(Z+=\"w\"),S&1&&(Z+=\"x\"),Z&&L.nodePermissions(H,Z)?-2:0}catch(gA){if(typeof L>\"u\"||gA.name!==\"ErrnoError\")throw gA;return-gA.errno}}function sn(){var u=G[+gt.varargs>>2];return gt.varargs+=4,u}var gn=sn;function Kn(u,w,S){gt.varargs=S;try{var T=gt.getStreamFromFD(u);switch(w){case 0:{var k=sn();if(k<0)return-28;for(;L.streams[k];)k++;var H;return H=L.dupStream(T,k),H.fd}case 1:case 2:return 0;case 3:return T.flags;case 4:{var k=sn();return T.flags|=k,0}case 12:{var k=gn(),Z=0;return F[k+Z>>1]=2,0}case 13:case 14:return 0}return-28}catch(gA){if(typeof L>\"u\"||gA.name!==\"ErrnoError\")throw gA;return-gA.errno}}function ko(u,w){try{var S=gt.getStreamFromFD(u);return gt.doStat(L.stat,S.path,w)}catch(T){if(typeof L>\"u\"||T.name!==\"ErrnoError\")throw T;return-T.errno}}function eo(u,w,S){gt.varargs=S;try{var T=gt.getStreamFromFD(u);switch(w){case 21509:return T.tty?0:-59;case 21505:{if(!T.tty)return-59;if(T.tty.ops.ioctl_tcgets){var k=T.tty.ops.ioctl_tcgets(T),H=gn();G[H>>2]=k.c_iflag||0,G[H+4>>2]=k.c_oflag||0,G[H+8>>2]=k.c_cflag||0,G[H+12>>2]=k.c_lflag||0;for(var Z=0;Z<32;Z++)M[H+Z+17]=k.c_cc[Z]||0;return 0}return 0}case 21510:case 21511:case 21512:return T.tty?0:-59;case 21506:case 21507:case 21508:{if(!T.tty)return-59;if(T.tty.ops.ioctl_tcsets){for(var H=gn(),gA=G[H>>2],DA=G[H+4>>2],Ae=G[H+8>>2],ne=G[H+12>>2],Be=[],Z=0;Z<32;Z++)Be.push(M[H+Z+17]);return T.tty.ops.ioctl_tcsets(T.tty,w,{c_iflag:gA,c_oflag:DA,c_cflag:Ae,c_lflag:ne,c_cc:Be})}return 0}case 21519:{if(!T.tty)return-59;var H=gn();return G[H>>2]=0,0}case 21520:return T.tty?-28:-59;case 21531:{var H=gn();return L.ioctl(T,w,H)}case 21523:{if(!T.tty)return-59;if(T.tty.ops.ioctl_tiocgwinsz){var Ye=T.tty.ops.ioctl_tiocgwinsz(T.tty),H=gn();F[H>>1]=Ye[0],F[H+2>>1]=Ye[1]}return 0}case 21524:return T.tty?0:-59;case 21515:return T.tty?0:-59;default:return-28}}catch(ke){if(typeof L>\"u\"||ke.name!==\"ErrnoError\")throw ke;return-ke.errno}}function fo(u,w,S,T){try{w=gt.getStr(w);var k=T&256,H=T&4096;return T=T&-6401,w=gt.calculateAt(u,w,H),gt.doStat(k?L.lstat:L.stat,w,S)}catch(Z){if(typeof L>\"u\"||Z.name!==\"ErrnoError\")throw Z;return-Z.errno}}function Go(u,w,S,T){gt.varargs=T;try{w=gt.getStr(w),w=gt.calculateAt(u,w);var k=T?sn():0;return L.open(w,S,k).fd}catch(H){if(typeof L>\"u\"||H.name!==\"ErrnoError\")throw H;return-H.errno}}function co(u,w){try{return u=gt.getStr(u),gt.doStat(L.stat,u,w)}catch(S){if(typeof L>\"u\"||S.name!==\"ErrnoError\")throw S;return-S.errno}}var ta=()=>{KA(\"\")},Ko=u=>u%4===0&&(u%100!==0||u%400===0),qo=[0,31,60,91,121,152,182,213,244,274,305,335],Co=[0,31,59,90,120,151,181,212,243,273,304,334],se=u=>{var w=Ko(u.getFullYear()),S=w?qo:Co,T=S[u.getMonth()]+u.getDate()-1;return T},Ci=9007199254740992,tn=-9007199254740992,ln=u=>u<tn||u>Ci?NaN:Number(u);function So(u,w){u=ln(u);var S=new Date(u*1e3);G[w>>2]=S.getSeconds(),G[w+4>>2]=S.getMinutes(),G[w+8>>2]=S.getHours(),G[w+12>>2]=S.getDate(),G[w+16>>2]=S.getMonth(),G[w+20>>2]=S.getFullYear()-1900,G[w+24>>2]=S.getDay();var T=se(S)|0;G[w+28>>2]=T,G[w+36>>2]=-(S.getTimezoneOffset()*60);var k=new Date(S.getFullYear(),0,1),H=new Date(S.getFullYear(),6,1).getTimezoneOffset(),Z=k.getTimezoneOffset(),gA=(H!=Z&&S.getTimezoneOffset()==Math.min(Z,H))|0;G[w+32>>2]=gA}function la(u,w,S,T,k,H,Z){k=ln(k);try{if(isNaN(k))return 61;var gA=gt.getStreamFromFD(T),DA=L.mmap(gA,u,k,w,S),Ae=DA.ptr;return G[H>>2]=DA.allocated,U[Z>>2]=Ae,0}catch(ne){if(typeof L>\"u\"||ne.name!==\"ErrnoError\")throw ne;return-ne.errno}}function pi(u,w,S,T,k,H){H=ln(H);try{var Z=gt.getStreamFromFD(k);S&2&&gt.doMsync(u,Z,w,T,H)}catch(gA){if(typeof L>\"u\"||gA.name!==\"ErrnoError\")throw gA;return-gA.errno}}var to=(u,w,S)=>dt(u,v,w,S),Ja=(u,w,S,T)=>{var k=new Date().getFullYear(),H=new Date(k,0,1),Z=new Date(k,6,1),gA=H.getTimezoneOffset(),DA=Z.getTimezoneOffset(),Ae=Math.max(gA,DA);U[u>>2]=Ae*60,G[w>>2]=+(gA!=DA);var ne=ke=>{var Re=ke>=0?\"-\":\"+\",ii=Math.abs(ke),xn=String(Math.floor(ii/60)).padStart(2,\"0\"),q=String(ii%60).padStart(2,\"0\");return`UTC${Re}${xn}${q}`},Be=ne(gA),Ye=ne(DA);DA<gA?(to(Be,S,17),to(Ye,T,17)):(to(Be,T,17),to(Ye,S,17))},Io=()=>Date.now(),Sa=()=>2147483648,kn=u=>{var w=b.buffer,S=(u-w.byteLength+65535)/65536|0;try{return b.grow(S),z(),1}catch(T){}},Mi=u=>{var w=v.length;u>>>=0;var S=Sa();if(u>S)return!1;for(var T=1;T<=4;T*=2){var k=w*(1+.2/T);k=Math.min(k,u+100663296);var H=Math.min(S,en(Math.max(u,k),65536)),Z=kn(H);if(Z)return!0}return!1},Ot={},pn=()=>s,io=()=>{if(!io.strings){var u=(typeof navigator==\"object\"&&navigator.languages&&navigator.languages[0]||\"C\").replace(\"-\",\"_\")+\".UTF-8\",w={USER:\"web_user\",LOGNAME:\"web_user\",PATH:\"/\",PWD:\"/\",HOME:\"/home/web_user\",LANG:u,_:pn()};for(var S in Ot)Ot[S]===void 0?delete w[S]:w[S]=Ot[S];var T=[];for(var S in w)T.push(`${S}=${w[S]}`);io.strings=T}return io.strings},mo=(u,w)=>{for(var S=0;S<u.length;++S)M[w++]=u.charCodeAt(S);M[w]=0},vA=(u,w)=>{var S=0;return io().forEach((T,k)=>{var H=w+S;U[u+k*4>>2]=H,mo(T,H),S+=T.length+1}),0},VA=(u,w)=>{var S=io();U[u>>2]=S.length;var T=0;return S.forEach(k=>T+=k.length+1),U[w>>2]=T,0},me=u=>{g(u,new Rt(u))},IA=(u,w)=>{me(u)},SA=IA;function re(u){try{var w=gt.getStreamFromFD(u);return L.close(w),0}catch(S){if(typeof L>\"u\"||S.name!==\"ErrnoError\")throw S;return S.errno}}var Se=(u,w,S,T)=>{for(var k=0,H=0;H<S;H++){var Z=U[w>>2],gA=U[w+4>>2];w+=8;var DA=L.read(u,M,Z,gA,T);if(DA<0)return-1;if(k+=DA,DA<gA)break;typeof T<\"u\"&&(T+=DA)}return k};function tt(u,w,S,T){try{var k=gt.getStreamFromFD(u),H=Se(k,w,S);return U[T>>2]=H,0}catch(Z){if(typeof L>\"u\"||Z.name!==\"ErrnoError\")throw Z;return Z.errno}}function at(u,w,S,T){w=ln(w);try{if(isNaN(w))return 61;var k=gt.getStreamFromFD(u);return L.llseek(k,w,S),j[T>>3]=BigInt(k.position),k.getdents&&w===0&&S===0&&(k.getdents=null),0}catch(H){if(typeof L>\"u\"||H.name!==\"ErrnoError\")throw H;return H.errno}}var bt=(u,w,S,T)=>{for(var k=0,H=0;H<S;H++){var Z=U[w>>2],gA=U[w+4>>2];w+=8;var DA=L.write(u,M,Z,gA,T);if(DA<0)return-1;if(k+=DA,DA<gA)break;typeof T<\"u\"&&(T+=DA)}return k};function Sn(u,w,S,T){try{var k=gt.getStreamFromFD(u),H=bt(k,w,S);return U[T>>2]=H,0}catch(Z){if(typeof L>\"u\"||Z.name!==\"ErrnoError\")throw Z;return Z.errno}}var ki=u=>{var w=i[\"_\"+u];return w},Gi=(u,w)=>{M.set(u,w)},jt=u=>Un(u),Si=u=>{var w=LA(u)+1,S=jt(w);return to(u,S,w),S},ca=(u,w,S,T,k)=>{var H={string:Re=>{var ii=0;return Re!=null&&Re!==0&&(ii=Si(Re)),ii},array:Re=>{var ii=jt(Re.length);return Gi(Re,ii),ii}};function Z(Re){return w===\"string\"?Me(Re):w===\"boolean\"?!!Re:Re}var gA=ki(u),DA=[],Ae=0;if(T)for(var ne=0;ne<T.length;ne++){var Be=H[S[ne]];Be?(Ae===0&&(Ae=Ue()),DA[ne]=Be(T[ne])):DA[ne]=T[ne]}var Ye=gA(...DA);function ke(Re){return Ae!==0&&_t(Ae),Z(Re)}return Ye=ke(Ye),Ye};L.createPreloadedFile=Dt,L.staticInit();var Ft={a:Ai,b:tA,x:gi,g:Kn,w:ko,j:eo,u:fo,l:Go,v:co,i:ta,p:So,m:la,n:pi,q:Ja,c:Io,k:Mi,s:vA,t:VA,h:SA,f:re,e:tt,r:at,d:Sn,o:pA},rt=_A();i._viz_set_y_invert=u=>(i._viz_set_y_invert=rt.A)(u),i._viz_set_reduce=u=>(i._viz_set_reduce=rt.B)(u),i._viz_get_graphviz_version=()=>(i._viz_get_graphviz_version=rt.C)(),i._free=u=>(i._free=rt.D)(u),i._malloc=u=>(i._malloc=rt.E)(u),i._viz_get_plugin_list=u=>(i._viz_get_plugin_list=rt.G)(u),i._viz_create_graph=(u,w,S)=>(i._viz_create_graph=rt.H)(u,w,S),i._viz_read_one_graph=u=>(i._viz_read_one_graph=rt.I)(u),i._viz_string_dup=(u,w)=>(i._viz_string_dup=rt.J)(u,w),i._viz_string_dup_html=(u,w)=>(i._viz_string_dup_html=rt.K)(u,w),i._viz_string_free=(u,w)=>(i._viz_string_free=rt.L)(u,w),i._viz_string_free_html=(u,w)=>(i._viz_string_free_html=rt.M)(u,w),i._viz_add_node=(u,w)=>(i._viz_add_node=rt.N)(u,w),i._viz_add_edge=(u,w,S)=>(i._viz_add_edge=rt.O)(u,w,S),i._viz_add_subgraph=(u,w)=>(i._viz_add_subgraph=rt.P)(u,w),i._viz_set_default_graph_attribute=(u,w,S)=>(i._viz_set_default_graph_attribute=rt.Q)(u,w,S),i._viz_set_default_node_attribute=(u,w,S)=>(i._viz_set_default_node_attribute=rt.R)(u,w,S),i._viz_set_default_edge_attribute=(u,w,S)=>(i._viz_set_default_edge_attribute=rt.S)(u,w,S),i._viz_set_attribute=(u,w,S)=>(i._viz_set_attribute=rt.T)(u,w,S),i._viz_free_graph=u=>(i._viz_free_graph=rt.U)(u),i._viz_create_context=()=>(i._viz_create_context=rt.V)(),i._viz_free_context=u=>(i._viz_free_context=rt.W)(u),i._viz_layout=(u,w,S)=>(i._viz_layout=rt.X)(u,w,S),i._viz_free_layout=(u,w)=>(i._viz_free_layout=rt.Y)(u,w),i._viz_reset_errors=()=>(i._viz_reset_errors=rt.Z)(),i._viz_render=(u,w,S)=>(i._viz_render=rt._)(u,w,S);var xi=(u,w)=>(xi=rt.$)(u,w),Yi=u=>(Yi=rt.aa)(u),Un=u=>(Un=rt.ba)(u),cn=()=>(cn=rt.ca)();i.ccall=ca,i.getValue=Qe,i.PATH=oA,i.UTF8ToString=Me,i.stringToUTF8=to,i.lengthBytesUTF8=LA,i.FS=L;var Mt,Vo;JA=function u(){Mt||xo(),Mt||(JA=u)};function xo(){if(hA>0||!Vo&&(Vo=1,eA(),hA>0))return;function u(){Mt||(Mt=1,i.calledRun=1,!R&&(dA(),n(i),iA()))}u()}return xo(),A=a,A}})(),tiA=[[/^Error: (.*)/,\"error\"],[/^Warning: (.*)/,\"warning\"]];function dLA(t){return t.map(e=>{for(let A=0;A<tiA.length;A++){let[i,n]=tiA[A],o;if((o=i.exec(e))!==null)return{message:o[1].trimEnd(),level:n}}return{message:e.trimEnd()}})}function BLA(t){let e=[],A;for(let i=0;i<t.length;i++)t[i]==\"Error\"&&t[i+1]==\": \"?(A=\"error\",i+=1):t[i]==\"Warning\"&&t[i+1]==\": \"?(A=\"warning\",i+=1):e.push({message:t[i].trimEnd(),level:A});return e}function QLA(t){let e=t.ccall(\"viz_get_graphviz_version\",\"number\",[],[]);return t.UTF8ToString(e)}function iiA(t,e){let A=t.ccall(\"viz_get_plugin_list\",\"number\",[\"string\"],[e]);if(A==0)throw new Error(`couldn't get plugin list: ${e}`);let i=[],n=A,o;for(;o=t.getValue(n,\"*\");)i.push(t.UTF8ToString(o)),t.ccall(\"free\",\"number\",[\"number\"],[o]),n+=4;return t.ccall(\"free\",\"number\",[\"number\"],[A]),i}function niA(t,e,A,i){let n,o,a,r;try{if(t.agerrMessages=[],t.stderrMessages=[],r=ELA(t,i.images),typeof e==\"string\")n=uLA(t,e,i);else if(typeof e==\"object\")n=fLA(t,e,i);else throw new Error(\"input must be a string or object\");if(n===0)return{status:\"failure\",output:void 0,errors:tf(t)};if(riA(t,n,i),t.ccall(\"viz_set_y_invert\",\"number\",[\"number\"],[i.yInvert?1:0]),t.ccall(\"viz_set_reduce\",\"number\",[\"number\"],[i.reduce?1:0]),o=t.ccall(\"viz_create_context\"),t.ccall(\"viz_reset_errors\"),t.ccall(\"viz_layout\",\"number\",[\"number\",\"number\",\"string\"],[o,n,i.engine])!==0)return{status:\"failure\",output:void 0,errors:tf(t)};let g={};for(let l of A){if(a=t.ccall(\"viz_render\",\"number\",[\"number\",\"number\",\"string\"],[o,n,l]),a===0)return{status:\"failure\",output:void 0,errors:tf(t)};g[l]=t.UTF8ToString(a),t.ccall(\"free\",\"number\",[\"number\"],[a]),a=0}return{status:\"success\",output:g,errors:tf(t)}}catch(s){if(/^exit\\(\\d+\\)/.test(s))return{status:\"failure\",output:void 0,errors:tf(t)};throw s}finally{o&&n&&t.ccall(\"viz_free_layout\",\"number\",[\"number\"],[o,n]),n&&t.ccall(\"viz_free_graph\",\"number\",[\"number\"],[n]),o&&t.ccall(\"viz_free_context\",\"number\",[\"number\"],[o]),a&&t.ccall(\"free\",\"number\",[\"number\"],[a]),r&&hLA(t,r)}}function tf(t){return BLA(t.agerrMessages).concat(dLA(t.stderrMessages))}function ELA(t,e){return e?e.map(A=>{if(typeof A.name!=\"string\")throw new Error(\"image name must be a string\");if(typeof A.width!=\"number\"&&typeof A.width!=\"string\")throw new Error(\"image width must be a number or string\");if(typeof A.height!=\"number\"&&typeof A.height!=\"string\")throw new Error(\"image height must be a number or string\");let i=t.PATH.join(\"/\",A.name),n=`<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${A.width}\" height=\"${A.height}\"></svg>\n`;return t.FS.createPath(\"/\",t.PATH.dirname(i)),t.FS.writeFile(i,n),i}):[]}function hLA(t,e){for(let A of e)t.FS.analyzePath(A).exists&&t.FS.unlink(A)}function uLA(t,e,A){let i;try{let n=t.lengthBytesUTF8(e);return i=t.ccall(\"malloc\",\"number\",[\"number\"],[n+1]),t.stringToUTF8(e,i,n+1),t.ccall(\"viz_read_one_graph\",\"number\",[\"number\"],[i])}finally{i&&t.ccall(\"free\",\"number\",[\"number\"],[i])}}function fLA(t,e,A){let i=t.ccall(\"viz_create_graph\",\"number\",[\"string\",\"number\",\"number\"],[e.name,typeof e.directed<\"u\"?e.directed:!0,typeof e.strict<\"u\"?e.strict:!1]);return aiA(t,i,e),i}function aiA(t,e,A){riA(t,e,A),A.nodes&&A.nodes.forEach(i=>{if(typeof i.name>\"u\")throw new Error(\"nodes must have a name\");let n=t.ccall(\"viz_add_node\",\"number\",[\"number\",\"string\"],[e,String(i.name)]);i.attributes&&oiA(t,e,n,i.attributes)}),A.edges&&A.edges.forEach(i=>{if(typeof i.tail>\"u\")throw new Error(\"edges must have a tail\");if(typeof i.head>\"u\")throw new Error(\"edges must have a head\");let n=t.ccall(\"viz_add_edge\",\"number\",[\"number\",\"string\",\"string\"],[e,String(i.tail),String(i.head)]);i.attributes&&oiA(t,e,n,i.attributes)}),A.subgraphs&&A.subgraphs.forEach(i=>{let n=t.ccall(\"viz_add_subgraph\",\"number\",[\"number\",\"string\"],[e,typeof i.name<\"u\"?String(i.name):0]);aiA(t,n,i)})}function riA(t,e,A){if(A.graphAttributes)for(let[i,n]of Object.entries(A.graphAttributes))qy(t,e,n,o=>{t.ccall(\"viz_set_default_graph_attribute\",\"number\",[\"number\",\"string\",\"number\"],[e,i,o])});if(A.nodeAttributes)for(let[i,n]of Object.entries(A.nodeAttributes))qy(t,e,n,o=>{t.ccall(\"viz_set_default_node_attribute\",\"number\",[\"number\",\"string\",\"number\"],[e,i,o])});if(A.edgeAttributes)for(let[i,n]of Object.entries(A.edgeAttributes))qy(t,e,n,o=>{t.ccall(\"viz_set_default_edge_attribute\",\"number\",[\"number\",\"string\",\"number\"],[e,i,o])})}function oiA(t,e,A,i){for(let[n,o]of Object.entries(i))qy(t,e,o,a=>{t.ccall(\"viz_set_attribute\",\"number\",[\"number\",\"string\",\"number\"],[A,n,a])})}function qy(t,e,A,i){let n;if(typeof A==\"object\"&&\"html\"in A?n=t.ccall(\"viz_string_dup_html\",\"number\",[\"number\",\"string\"],[e,String(A.html)]):n=t.ccall(\"viz_string_dup\",\"number\",[\"number\",\"string\"],[e,String(A)]),n==0)throw new Error(\"couldn't dup string\");i(n),typeof A==\"object\"&&\"html\"in A?t.ccall(\"viz_string_free_html\",\"number\",[\"number\",\"number\"],[e,n]):t.ccall(\"viz_string_free\",\"number\",[\"number\",\"number\"],[e,n])}var FF=class{constructor(e){this.module=e}get graphvizVersion(){return QLA(this.module)}get formats(){return iiA(this.module,\"device\")}get engines(){return iiA(this.module,\"layout\")}renderFormats(e,A,i={}){return niA(this.module,e,A,BA({engine:\"dot\"},i))}render(e,A={}){let i;A.format===void 0?i=\"dot\":i=A.format;let n=niA(this.module,e,[i],BA({engine:\"dot\"},A));return n.status===\"success\"&&(n.output=n.output[i]),n}renderString(e,A={}){let i=this.render(e,A);if(i.status!==\"success\")throw new Error(i.errors.find(n=>n.level==\"error\")?.message||\"render failed\");return i.output}renderSVGElement(e,A={}){let i=this.renderString(e,Ve(BA({},A),{format:\"svg\"})),n;return typeof A.trustedTypePolicy<\"u\"?n=A.trustedTypePolicy.createHTML(i):n=i,new DOMParser().parseFromString(n,\"image/svg+xml\").documentElement}renderJSON(e,A={}){let i=this.renderString(e,Ve(BA({},A),{format:\"json\"}));return JSON.parse(i)}};function siA(){return ILA().then(t=>new FF(t))}var Vy=class t{render(e){return ct(this,null,function*(){let A={format:\"svg\",engine:\"dot\"};return(yield siA()).renderString(e,A)})}static \\u0275fac=function(A){return new(A||t)};static \\u0275prov=TA({token:t,factory:t.\\u0275fac,providedIn:\"root\"})};var Wy=new wA(\"AudioPlayingService\");var Zy=new wA(\"VideoService\");var Xy=new wA(\"WebSocketService\");var $y=class t{createMessagePartFromFile(e){return ct(this,null,function*(){return{inlineData:{displayName:e.name,data:yield this.readFileAsBytes(e),mimeType:e.type}}})}readFileAsBytes(e){return new Promise((A,i)=>{let n=new FileReader;n.onload=o=>{let a=o.target.result.split(\",\")[1];A(a)},n.onerror=i,n.readAsDataURL(e)})}static \\u0275fac=function(A){return new(A||t)};static \\u0275prov=TA({token:t,factory:t.\\u0275fac,providedIn:\"root\"})};var Av=class t extends Np{sanitizer=h(LC);windowOpen(e,A,i,n){return e.open(A,i,n)}createObjectUrl(e){return URL.createObjectURL(e)}openBlobUrl(e){let A=this.createObjectUrl(e);return this.windowOpen(window,A,\"_blank\")}setAnchorHref(e,A){e.href=A}bypassSecurityTrustHtml(e){return this.sanitizer.bypassSecurityTrustHtml(e)}bypassSecurityTrustUrl(e){return this.sanitizer.bypassSecurityTrustUrl(e)}static \\u0275fac=(()=>{let e;return function(i){return(e||(e=hi(t)))(i||t)}})();static \\u0275prov=TA({token:t,factory:t.\\u0275fac,providedIn:\"root\"})};var ev=class t{constructor(e){this.http=e}apiServerDomain=kr.getApiServerBaseUrl();createSession(e,A){if(this.apiServerDomain!=null){let i=this.apiServerDomain+`/apps/${A}/users/${e}/sessions`;return this.http.post(i,null)}return new Ti}listSessions(e,A){if(this.apiServerDomain!=null){let i=this.apiServerDomain+`/apps/${A}/users/${e}/sessions`;return this.http.get(i).pipe(fe(n=>({items:n,nextPageToken:\"\"})))}return oe({items:[],nextPageToken:\"\"})}deleteSession(e,A,i){let n=this.apiServerDomain+`/apps/${A}/users/${e}/sessions/${i}`;return this.http.delete(n)}getSession(e,A,i){let n=this.apiServerDomain+`/apps/${A}/users/${e}/sessions/${i}`;return this.http.get(n)}importSession(e,A,i){if(this.apiServerDomain!=null){let n=this.apiServerDomain+`/apps/${A}/users/${e}/sessions`;return this.http.post(n,{appName:A,userId:e,events:i})}return new Ti}canEdit(e,A){return oe(!0)}static \\u0275fac=function(A){return new(A||t)(Do(ks))};static \\u0275prov=TA({token:t,factory:t.\\u0275fac,providedIn:\"root\"})};var tv=class t{audioRecordingService=h(Ky);videoService=h(Zy);webSocketService=h(Xy);audioIntervalId=void 0;videoIntervalId=void 0;constructor(){}startAudioChat(n){return ct(this,arguments,function*({appName:e,userId:A,sessionId:i}){let o=window.location.protocol===\"https:\"?\"wss\":\"ws\";this.webSocketService.connect(`${o}://${kr.getWSServerUrl()}/run_live?app_name=${e}&user_id=${A}&session_id=${i}`),yield this.startAudioStreaming()})}stopAudioChat(){this.stopAudioStreaming(),this.webSocketService.closeConnection()}startAudioStreaming(){return ct(this,null,function*(){try{yield this.audioRecordingService.startRecording(),this.audioIntervalId=setInterval(()=>this.sendBufferedAudio(),250)}catch(e){console.error(\"Error accessing microphone:\",e)}})}stopAudioStreaming(){clearInterval(this.audioIntervalId),this.audioIntervalId=void 0,this.audioRecordingService.stopRecording()}sendBufferedAudio(){let e=this.audioRecordingService.getCombinedAudioBuffer();if(!e)return;let A={blob:{mime_type:\"audio/pcm\",data:e}};this.webSocketService.sendMessage(A),this.audioRecordingService.cleanAudioBuffer()}startVideoChat(o){return ct(this,arguments,function*({appName:e,userId:A,sessionId:i,videoContainer:n}){let a=window.location.protocol===\"https:\"?\"wss\":\"ws\";this.webSocketService.connect(`${a}://${kr.getWSServerUrl()}/run_live?app_name=${e}&user_id=${A}&session_id=${i}`),yield this.startAudioStreaming(),yield this.startVideoStreaming(n)})}stopVideoChat(e){this.stopAudioStreaming(),this.stopVideoStreaming(e),this.webSocketService.closeConnection()}startVideoStreaming(e){return ct(this,null,function*(){try{yield this.videoService.startRecording(e),this.videoIntervalId=setInterval(()=>ct(this,null,function*(){return yield this.sendCapturedFrame()}),1e3)}catch(A){console.error(\"Error accessing camera:\",A)}})}sendCapturedFrame(){return ct(this,null,function*(){let e=yield this.videoService.getCapturedFrame();if(!e)return;let A={blob:{mime_type:\"image/jpeg\",data:e}};this.webSocketService.sendMessage(A)})}stopVideoStreaming(e){clearInterval(this.videoIntervalId),this.videoIntervalId=void 0,this.videoService.stopRecording(e)}onStreamClose(){return this.webSocketService.onCloseReason()}closeStream(){this.webSocketService.closeConnection()}static \\u0275fac=function(A){return new(A||t)};static \\u0275prov=TA({token:t,factory:t.\\u0275fac,providedIn:\"root\"})};var ynA=rf(wnA());var nv=class t{stc(e){return(0,ynA.default)(e)}static \\u0275fac=function(A){return new(A||t)};static \\u0275prov=TA({token:t,factory:t.\\u0275fac,providedIn:\"root\"})};var ov=class t{THEME_STORAGE_KEY=\"adk-theme-preference\";currentTheme=jA(this.getInitialTheme());constructor(){pa(()=>{this.applyTheme(this.currentTheme())})}getInitialTheme(){let e=window.localStorage.getItem(this.THEME_STORAGE_KEY);return e===\"light\"||e===\"dark\"?e:\"dark\"}applyTheme(e){let A=document.documentElement;A.classList.remove(\"light-theme\",\"dark-theme\"),A.classList.add(`${e}-theme`),A.style.colorScheme=e,window.localStorage.setItem(this.THEME_STORAGE_KEY,e)}toggleTheme(){this.currentTheme.update(e=>e===\"light\"?\"dark\":\"light\")}setTheme(e){this.currentTheme.set(e)}static \\u0275fac=function(A){return new(A||t)};static \\u0275prov=TA({token:t,factory:t.\\u0275fac,providedIn:\"root\"})};var av=class t{selectedTraceRowSource=new Jt(void 0);selectedTraceRow$=this.selectedTraceRowSource.asObservable();eventDataSource=new Jt(void 0);eventData$=this.eventDataSource.asObservable();hoveredMessageIndicesSource=new Jt([]);hoveredMessageIndices$=this.hoveredMessageIndicesSource.asObservable();messagesSource=new Jt([]);messages$=this.messagesSource.asObservable();selectedRow(e){this.selectedTraceRowSource.next(e)}setEventData(e){this.eventDataSource.next(e)}setMessages(e){this.messagesSource.next(e)}setHoveredMessages(e,A){if(!e){this.hoveredMessageIndicesSource.next([]);return}let i=e.attributes,n=i&&i[\"gcp.vertex.agent.event_id\"],o=[];for(let[a,r]of this.messagesSource.value.entries())r.role!==\"user\"&&this.eventDataSource.value?.get(r.eventId)?.invocationId===A&&(!n||i[\"gcp.vertex.agent.event_id\"]===r.eventId)&&o.push(a);this.hoveredMessageIndicesSource.next(o)}resetTraceService(){this.eventDataSource.next(void 0),this.messagesSource.next([]),this.hoveredMessageIndicesSource.next([])}static \\u0275fac=function(A){return new(A||t)};static \\u0275prov=TA({token:t,factory:t.\\u0275fac,providedIn:\"root\"})};var rv=class t{_isSessionLoading=new Jt(!1);_isSessionListLoading=new Jt(!1);_isEventRequestResponseLoading=new Jt(!1);_isMessagesLoading=new Jt(!1);_newMessagesLoadedResponse=new $A;_newMessagesLoadingFailedResponse=new $A;featureFlagService=h(lr);isSessionLoading(){return this._isSessionLoading.pipe(xC(this.featureFlagService.isLoadingAnimationsEnabled()),fe(([e,A])=>e&&A),Ds({bufferSize:1,refCount:!0}))}setIsSessionLoading(e){this._isSessionLoading.next(e)}isSessionListLoading(){return this._isSessionListLoading.pipe(xC(this.featureFlagService.isLoadingAnimationsEnabled()),fe(([e,A])=>e&&A),Ds({bufferSize:1,refCount:!0}))}setIsSessionListLoading(e){this._isSessionListLoading.next(e)}isEventRequestResponseLoading(){return this._isEventRequestResponseLoading.pipe(xC(this.featureFlagService.isLoadingAnimationsEnabled()),fe(([e,A])=>e&&A),Ds({bufferSize:1,refCount:!0}))}setIsEventRequestResponseLoading(e){this._isEventRequestResponseLoading.next(e)}setIsMessagesLoading(e){this._isMessagesLoading.next(e)}isMessagesLoading(){return this._isMessagesLoading.pipe(xC(this.featureFlagService.isLoadingAnimationsEnabled()),fe(([e,A])=>e&&A),Ds({bufferSize:1,refCount:!0}))}lazyLoadMessages(e,A,i){throw new Error(\"Not implemented\")}onNewMessagesLoaded(){return this._newMessagesLoadedResponse}onNewMessagesLoadingFailed(){return this._newMessagesLoadingFailedResponse}static \\u0275fac=function(A){return new(A||t)};static \\u0275prov=TA({token:t,factory:t.\\u0275fac,providedIn:\"root\"})};var sv=class t{mediaRecorder;stream;renderer;videoElement;videoBuffer=[];constructor(e){this.renderer=e.createRenderer(null,null)}createVideoElement(e){e?.nativeElement&&(this.clearVideoElement(e),this.videoElement=this.renderer.createElement(\"video\"),this.renderer.setAttribute(this.videoElement,\"width\",\"400\"),this.renderer.setAttribute(this.videoElement,\"height\",\"300\"),this.renderer.setAttribute(this.videoElement,\"autoplay\",\"true\"),this.renderer.setAttribute(this.videoElement,\"muted\",\"true\"),this.renderer.appendChild(e.nativeElement,this.videoElement))}startRecording(e){return ct(this,null,function*(){this.createVideoElement(e);try{this.stream=yield navigator.mediaDevices.getUserMedia({video:!0}),this.videoElement&&(this.videoElement.srcObject=this.stream),this.mediaRecorder=new MediaRecorder(this.stream,{mimeType:\"video/webm\"}),this.mediaRecorder.start(1e3)}catch(A){console.error(\"Error accessing camera/microphone:\",A)}})}getCapturedFrame(){return ct(this,null,function*(){try{let e=yield this.captureFrame();return this.blobToUint8Array(e)}catch(e){console.error(\"Error capturing frame:\",e);return}})}blobToUint8Array(e){return ct(this,null,function*(){let A=yield e.arrayBuffer();return new Uint8Array(A)})}captureFrame(){return ct(this,null,function*(){return new Promise((e,A)=>{try{if(!this.videoElement){A(new Error(\"Video element not available\"));return}let i=document.createElement(\"canvas\");i.width=this.videoElement.videoWidth,i.height=this.videoElement.videoHeight;let n=i.getContext(\"2d\");if(!n){A(new Error(\"Canvas context not supported\"));return}n.drawImage(this.videoElement,0,0,i.width,i.height),i.toBlob(o=>{o?e(o):A(new Error(\"Failed to create image blob\"))},\"image/png\")}catch(i){A(i)}})})}stopRecording(e){this.mediaRecorder&&this.mediaRecorder.stop(),this.stream&&this.stream.getTracks().forEach(A=>A.stop()),this.clearVideoElement(e)}clearVideoElement(e){let A=e.nativeElement.querySelector(\"video\");A&&this.renderer.removeChild(e.nativeElement,A)}static \\u0275fac=function(A){return new(A||t)(Do(Dr))};static \\u0275prov=TA({token:t,factory:t.\\u0275fac,providedIn:\"root\"})};var yGA={url:\"\",deserializer:t=>JSON.parse(t.data),serializer:t=>JSON.stringify(t)},vGA=\"WebSocketSubject.error must be called with an object with an error code, and an optional reason: { code: number, reason: string }\",of=class t extends AL{constructor(e,A){if(super(),this._socket=null,e instanceof Ti)this.destination=A,this.source=e;else{let i=this._config=Object.assign({},yGA);if(this._output=new $A,typeof e==\"string\")i.url=e;else for(let n in e)e.hasOwnProperty(n)&&(i[n]=e[n]);if(!i.WebSocketCtor&&WebSocket)i.WebSocketCtor=WebSocket;else if(!i.WebSocketCtor)throw new Error(\"no WebSocket constructor can be found\");this.destination=new El}}lift(e){let A=new t(this._config,this.destination);return A.operator=e,A.source=this,A}_resetState(){this._socket=null,this.source||(this.destination=new El),this._output=new $A}multiplex(e,A,i){let n=this;return new Ti(o=>{try{n.next(e())}catch(r){o.error(r)}let a=n.subscribe({next:r=>{try{i(r)&&o.next(r)}catch(s){o.error(s)}},error:r=>o.error(r),complete:()=>o.complete()});return()=>{try{n.next(A())}catch(r){o.error(r)}a.unsubscribe()}})}_connectSocket(){let{WebSocketCtor:e,protocol:A,url:i,binaryType:n}=this._config,o=this._output,a=null;try{a=A?new e(i,A):new e(i),this._socket=a,n&&(this._socket.binaryType=n)}catch(s){o.error(s);return}let r=new Rn(()=>{this._socket=null,a&&a.readyState===1&&a.close()});a.onopen=s=>{let{_socket:g}=this;if(!g){a.close(),this._resetState();return}let{openObserver:l}=this._config;l&&l.next(s);let C=this.destination;this.destination=ZF.create(I=>{if(a.readyState===1)try{let{serializer:d}=this._config;a.send(d(I))}catch(d){this.destination.error(d)}},I=>{let{closingObserver:d}=this._config;d&&d.next(void 0),I&&I.code?a.close(I.code,I.reason):o.error(new TypeError(vGA)),this._resetState()},()=>{let{closingObserver:I}=this._config;I&&I.next(void 0),a.close(),this._resetState()}),C&&C instanceof El&&r.add(C.subscribe(this.destination))},a.onerror=s=>{this._resetState(),o.error(s)},a.onclose=s=>{a===this._socket&&this._resetState();let{closeObserver:g}=this._config;g&&g.next(s),s.wasClean?o.complete():o.error(s)},a.onmessage=s=>{try{let{deserializer:g}=this._config;o.next(g(s))}catch(g){o.error(g)}}}_subscribe(e){let{source:A}=this;return A?A.subscribe(e):(this._socket||this._connectSocket(),this._output.subscribe(e),e.add(()=>{let{_socket:i}=this;this._output.observers.length===0&&(i&&(i.readyState===1||i.readyState===0)&&i.close(),this._resetState())}),e)}unsubscribe(){let{_socket:e}=this;e&&(e.readyState===1||e.readyState===0)&&e.close(),this._resetState(),super.unsubscribe()}};var gv=class t{audioPlayingService=h(Wy);socket$;messages$=new Jt(\"\");audioBuffer=[];audioIntervalId=null;closeReasonSubject=new $A;connect(e){this.socket$=new of({url:e,serializer:A=>JSON.stringify(A),deserializer:A=>A.data,closeObserver:{next:A=>{this.emitWsCloseReason(A.reason)}}}),this.socket$.subscribe(A=>{this.handleIncomingAudio(A),this.messages$.next(A)},A=>{console.error(\"WebSocket error:\",A)}),this.audioIntervalId=setInterval(()=>this.playIncomingAudio(),250)}playIncomingAudio(){this.audioPlayingService.playAudio(this.audioBuffer),this.audioBuffer=[]}sendMessage(e){if(e.blob.data=this.arrayBufferToBase64(e.blob.data.buffer),!this.socket$||this.socket$.closed){console.error(\"WebSocket is not open.\");return}this.socket$.next(e)}closeConnection(){clearInterval(this.audioIntervalId),this.audioIntervalId=null,this.socket$&&this.socket$.complete()}getMessages(){return this.messages$.asObservable()}arrayBufferToBase64(e){let A=\"\",i=new Uint8Array(e),n=i.byteLength;for(let o=0;o<n;o++)A+=String.fromCharCode(i[o]);return btoa(A)}handleIncomingAudio(e){let A=JSON.parse(e);if(A.content&&A.content.parts&&A.content.parts[0].inlineData){let i=this.base64ToUint8Array(A.content.parts[0].inlineData.data);this.audioBuffer.push(i)}}base64ToUint8Array(e){let A=atob(this.urlSafeBase64ToBase64(e)),i=A.length,n=new Uint8Array(i);for(let o=0;o<i;o++)n[o]=A.charCodeAt(o);return n}urlSafeBase64ToBase64(e){let A=e.replace(/_/g,\"/\").replace(/-/g,\"+\");for(;A.length%4!==0;)A+=\"=\";return A}emitWsCloseReason(e){this.closeReasonSubject.next(e)}onCloseReason(){return this.closeReasonSubject.asObservable()}static \\u0275fac=function(A){return new(A||t)};static \\u0275prov=TA({token:t,factory:t.\\u0275fac,providedIn:\"root\"})};fetch(\"./assets/config/runtime-config.json\").then(t=>t.json()).then(t=>{window.runtimeConfig=t,xL(UE,{providers:[sL(RL,yn,NL,xy,Fg,vr,Cs),{provide:Hg,useClass:ev},{provide:Ks,useClass:DE},{provide:sy,useClass:jy},{provide:Xy,useClass:gv},{provide:Uy,useValue:\"./assets/audio-processor.js\"},{provide:Ky,useClass:Jy},{provide:Wy,useClass:Gy},{provide:Zy,useClass:sv},{provide:Fp,useClass:tv},{provide:lB,useClass:zy},{provide:Uc,useClass:Hy},{provide:xp,useClass:_y},{provide:gB,useClass:Yy},{provide:$C,useClass:av},{provide:lr,useClass:Py},{provide:cB,useClass:Vy},{provide:CB,useClass:nv},{provide:Wr,useClass:Av},{provide:Rp,useClass:$y},{provide:LL,useValue:KL},{provide:GL,useValue:VtA},{provide:pE,useValue:Fy},...t.logo?[{provide:wy,useValue:Ny}]:[],{provide:Kc,useClass:Ly},{provide:py,useValue:Qc},dK(),_h(),{provide:Lp,useClass:wc},{provide:Tg,useClass:rv},{provide:gw,useClass:ov}]}).catch(e=>console.error(e))});\n"
  },
  {
    "path": "cmd/launcher/web/webui/distr/polyfills-5CFQRCPP.js",
    "content": "var ce=globalThis;function te(t){return(ce.__Zone_symbol_prefix||\"__zone_symbol__\")+t}function ht(){let t=ce.performance;function n(I){t&&t.mark&&t.mark(I)}function a(I,s){t&&t.measure&&t.measure(I,s)}n(\"Zone\");class e{static __symbol__=te;static assertZonePatched(){if(ce.Promise!==S.ZoneAwarePromise)throw new Error(\"Zone.js has detected that ZoneAwarePromise `(window|global).Promise` has been overwritten.\\nMost likely cause is that a Promise polyfill has been loaded after Zone.js (Polyfilling Promise api is not necessary when zone.js is loaded. If you must load one, do so before loading zone.js.)\")}static get root(){let s=e.current;for(;s.parent;)s=s.parent;return s}static get current(){return b.zone}static get currentTask(){return D}static __load_patch(s,i,r=!1){if(S.hasOwnProperty(s)){let E=ce[te(\"forceDuplicateZoneCheck\")]===!0;if(!r&&E)throw Error(\"Already loaded patch: \"+s)}else if(!ce[\"__Zone_disable_\"+s]){let E=\"Zone:\"+s;n(E),S[s]=i(ce,e,R),a(E,E)}}get parent(){return this._parent}get name(){return this._name}_parent;_name;_properties;_zoneDelegate;constructor(s,i){this._parent=s,this._name=i?i.name||\"unnamed\":\"<root>\",this._properties=i&&i.properties||{},this._zoneDelegate=new f(this,this._parent&&this._parent._zoneDelegate,i)}get(s){let i=this.getZoneWith(s);if(i)return i._properties[s]}getZoneWith(s){let i=this;for(;i;){if(i._properties.hasOwnProperty(s))return i;i=i._parent}return null}fork(s){if(!s)throw new Error(\"ZoneSpec required!\");return this._zoneDelegate.fork(this,s)}wrap(s,i){if(typeof s!=\"function\")throw new Error(\"Expecting function got: \"+s);let r=this._zoneDelegate.intercept(this,s,i),E=this;return function(){return E.runGuarded(r,this,arguments,i)}}run(s,i,r,E){b={parent:b,zone:this};try{return this._zoneDelegate.invoke(this,s,i,r,E)}finally{b=b.parent}}runGuarded(s,i=null,r,E){b={parent:b,zone:this};try{try{return this._zoneDelegate.invoke(this,s,i,r,E)}catch(x){if(this._zoneDelegate.handleError(this,x))throw x}}finally{b=b.parent}}runTask(s,i,r){if(s.zone!=this)throw new Error(\"A task can only be run in the zone of creation! (Creation: \"+(s.zone||J).name+\"; Execution: \"+this.name+\")\");let E=s,{type:x,data:{isPeriodic:ee=!1,isRefreshable:M=!1}={}}=s;if(s.state===q&&(x===U||x===k))return;let he=s.state!=A;he&&E._transitionTo(A,d);let _e=D;D=E,b={parent:b,zone:this};try{x==k&&s.data&&!ee&&!M&&(s.cancelFn=void 0);try{return this._zoneDelegate.invokeTask(this,E,i,r)}catch(Q){if(this._zoneDelegate.handleError(this,Q))throw Q}}finally{let Q=s.state;if(Q!==q&&Q!==X)if(x==U||ee||M&&Q===p)he&&E._transitionTo(d,A,p);else{let Te=E._zoneDelegates;this._updateTaskCount(E,-1),he&&E._transitionTo(q,A,q),M&&(E._zoneDelegates=Te)}b=b.parent,D=_e}}scheduleTask(s){if(s.zone&&s.zone!==this){let r=this;for(;r;){if(r===s.zone)throw Error(`can not reschedule task to ${this.name} which is descendants of the original zone ${s.zone.name}`);r=r.parent}}s._transitionTo(p,q);let i=[];s._zoneDelegates=i,s._zone=this;try{s=this._zoneDelegate.scheduleTask(this,s)}catch(r){throw s._transitionTo(X,p,q),this._zoneDelegate.handleError(this,r),r}return s._zoneDelegates===i&&this._updateTaskCount(s,1),s.state==p&&s._transitionTo(d,p),s}scheduleMicroTask(s,i,r,E){return this.scheduleTask(new g(F,s,i,r,E,void 0))}scheduleMacroTask(s,i,r,E,x){return this.scheduleTask(new g(k,s,i,r,E,x))}scheduleEventTask(s,i,r,E,x){return this.scheduleTask(new g(U,s,i,r,E,x))}cancelTask(s){if(s.zone!=this)throw new Error(\"A task can only be cancelled in the zone of creation! (Creation: \"+(s.zone||J).name+\"; Execution: \"+this.name+\")\");if(!(s.state!==d&&s.state!==A)){s._transitionTo(V,d,A);try{this._zoneDelegate.cancelTask(this,s)}catch(i){throw s._transitionTo(X,V),this._zoneDelegate.handleError(this,i),i}return this._updateTaskCount(s,-1),s._transitionTo(q,V),s.runCount=-1,s}}_updateTaskCount(s,i){let r=s._zoneDelegates;i==-1&&(s._zoneDelegates=null);for(let E=0;E<r.length;E++)r[E]._updateTaskCount(s.type,i)}}let c={name:\"\",onHasTask:(I,s,i,r)=>I.hasTask(i,r),onScheduleTask:(I,s,i,r)=>I.scheduleTask(i,r),onInvokeTask:(I,s,i,r,E,x)=>I.invokeTask(i,r,E,x),onCancelTask:(I,s,i,r)=>I.cancelTask(i,r)};class f{get zone(){return this._zone}_zone;_taskCounts={microTask:0,macroTask:0,eventTask:0};_parentDelegate;_forkDlgt;_forkZS;_forkCurrZone;_interceptDlgt;_interceptZS;_interceptCurrZone;_invokeDlgt;_invokeZS;_invokeCurrZone;_handleErrorDlgt;_handleErrorZS;_handleErrorCurrZone;_scheduleTaskDlgt;_scheduleTaskZS;_scheduleTaskCurrZone;_invokeTaskDlgt;_invokeTaskZS;_invokeTaskCurrZone;_cancelTaskDlgt;_cancelTaskZS;_cancelTaskCurrZone;_hasTaskDlgt;_hasTaskDlgtOwner;_hasTaskZS;_hasTaskCurrZone;constructor(s,i,r){this._zone=s,this._parentDelegate=i,this._forkZS=r&&(r&&r.onFork?r:i._forkZS),this._forkDlgt=r&&(r.onFork?i:i._forkDlgt),this._forkCurrZone=r&&(r.onFork?this._zone:i._forkCurrZone),this._interceptZS=r&&(r.onIntercept?r:i._interceptZS),this._interceptDlgt=r&&(r.onIntercept?i:i._interceptDlgt),this._interceptCurrZone=r&&(r.onIntercept?this._zone:i._interceptCurrZone),this._invokeZS=r&&(r.onInvoke?r:i._invokeZS),this._invokeDlgt=r&&(r.onInvoke?i:i._invokeDlgt),this._invokeCurrZone=r&&(r.onInvoke?this._zone:i._invokeCurrZone),this._handleErrorZS=r&&(r.onHandleError?r:i._handleErrorZS),this._handleErrorDlgt=r&&(r.onHandleError?i:i._handleErrorDlgt),this._handleErrorCurrZone=r&&(r.onHandleError?this._zone:i._handleErrorCurrZone),this._scheduleTaskZS=r&&(r.onScheduleTask?r:i._scheduleTaskZS),this._scheduleTaskDlgt=r&&(r.onScheduleTask?i:i._scheduleTaskDlgt),this._scheduleTaskCurrZone=r&&(r.onScheduleTask?this._zone:i._scheduleTaskCurrZone),this._invokeTaskZS=r&&(r.onInvokeTask?r:i._invokeTaskZS),this._invokeTaskDlgt=r&&(r.onInvokeTask?i:i._invokeTaskDlgt),this._invokeTaskCurrZone=r&&(r.onInvokeTask?this._zone:i._invokeTaskCurrZone),this._cancelTaskZS=r&&(r.onCancelTask?r:i._cancelTaskZS),this._cancelTaskDlgt=r&&(r.onCancelTask?i:i._cancelTaskDlgt),this._cancelTaskCurrZone=r&&(r.onCancelTask?this._zone:i._cancelTaskCurrZone),this._hasTaskZS=null,this._hasTaskDlgt=null,this._hasTaskDlgtOwner=null,this._hasTaskCurrZone=null;let E=r&&r.onHasTask,x=i&&i._hasTaskZS;(E||x)&&(this._hasTaskZS=E?r:c,this._hasTaskDlgt=i,this._hasTaskDlgtOwner=this,this._hasTaskCurrZone=this._zone,r.onScheduleTask||(this._scheduleTaskZS=c,this._scheduleTaskDlgt=i,this._scheduleTaskCurrZone=this._zone),r.onInvokeTask||(this._invokeTaskZS=c,this._invokeTaskDlgt=i,this._invokeTaskCurrZone=this._zone),r.onCancelTask||(this._cancelTaskZS=c,this._cancelTaskDlgt=i,this._cancelTaskCurrZone=this._zone))}fork(s,i){return this._forkZS?this._forkZS.onFork(this._forkDlgt,this.zone,s,i):new e(s,i)}intercept(s,i,r){return this._interceptZS?this._interceptZS.onIntercept(this._interceptDlgt,this._interceptCurrZone,s,i,r):i}invoke(s,i,r,E,x){return this._invokeZS?this._invokeZS.onInvoke(this._invokeDlgt,this._invokeCurrZone,s,i,r,E,x):i.apply(r,E)}handleError(s,i){return this._handleErrorZS?this._handleErrorZS.onHandleError(this._handleErrorDlgt,this._handleErrorCurrZone,s,i):!0}scheduleTask(s,i){let r=i;if(this._scheduleTaskZS)this._hasTaskZS&&r._zoneDelegates.push(this._hasTaskDlgtOwner),r=this._scheduleTaskZS.onScheduleTask(this._scheduleTaskDlgt,this._scheduleTaskCurrZone,s,i),r||(r=i);else if(i.scheduleFn)i.scheduleFn(i);else if(i.type==F)z(i);else throw new Error(\"Task is missing scheduleFn.\");return r}invokeTask(s,i,r,E){return this._invokeTaskZS?this._invokeTaskZS.onInvokeTask(this._invokeTaskDlgt,this._invokeTaskCurrZone,s,i,r,E):i.callback.apply(r,E)}cancelTask(s,i){let r;if(this._cancelTaskZS)r=this._cancelTaskZS.onCancelTask(this._cancelTaskDlgt,this._cancelTaskCurrZone,s,i);else{if(!i.cancelFn)throw Error(\"Task is not cancelable\");r=i.cancelFn(i)}return r}hasTask(s,i){try{this._hasTaskZS&&this._hasTaskZS.onHasTask(this._hasTaskDlgt,this._hasTaskCurrZone,s,i)}catch(r){this.handleError(s,r)}}_updateTaskCount(s,i){let r=this._taskCounts,E=r[s],x=r[s]=E+i;if(x<0)throw new Error(\"More tasks executed then were scheduled.\");if(E==0||x==0){let ee={microTask:r.microTask>0,macroTask:r.macroTask>0,eventTask:r.eventTask>0,change:s};this.hasTask(this._zone,ee)}}}class g{type;source;invoke;callback;data;scheduleFn;cancelFn;_zone=null;runCount=0;_zoneDelegates=null;_state=\"notScheduled\";constructor(s,i,r,E,x,ee){if(this.type=s,this.source=i,this.data=E,this.scheduleFn=x,this.cancelFn=ee,!r)throw new Error(\"callback is not defined\");this.callback=r;let M=this;s===U&&E&&E.useG?this.invoke=g.invokeTask:this.invoke=function(){return g.invokeTask.call(ce,M,this,arguments)}}static invokeTask(s,i,r){s||(s=this),K++;try{return s.runCount++,s.zone.runTask(s,i,r)}finally{K==1&&$(),K--}}get zone(){return this._zone}get state(){return this._state}cancelScheduleRequest(){this._transitionTo(q,p)}_transitionTo(s,i,r){if(this._state===i||this._state===r)this._state=s,s==q&&(this._zoneDelegates=null);else throw new Error(`${this.type} '${this.source}': can not transition to '${s}', expecting state '${i}'${r?\" or '\"+r+\"'\":\"\"}, was '${this._state}'.`)}toString(){return this.data&&typeof this.data.handleId<\"u\"?this.data.handleId.toString():Object.prototype.toString.call(this)}toJSON(){return{type:this.type,state:this.state,source:this.source,zone:this.zone.name,runCount:this.runCount}}}let T=te(\"setTimeout\"),y=te(\"Promise\"),w=te(\"then\"),_=[],P=!1,L;function H(I){if(L||ce[y]&&(L=ce[y].resolve(0)),L){let s=L[w];s||(s=L.then),s.call(L,I)}else ce[T](I,0)}function z(I){K===0&&_.length===0&&H($),I&&_.push(I)}function $(){if(!P){for(P=!0;_.length;){let I=_;_=[];for(let s=0;s<I.length;s++){let i=I[s];try{i.zone.runTask(i,null,null)}catch(r){R.onUnhandledError(r)}}}R.microtaskDrainDone(),P=!1}}let J={name:\"NO ZONE\"},q=\"notScheduled\",p=\"scheduling\",d=\"scheduled\",A=\"running\",V=\"canceling\",X=\"unknown\",F=\"microTask\",k=\"macroTask\",U=\"eventTask\",S={},R={symbol:te,currentZoneFrame:()=>b,onUnhandledError:W,microtaskDrainDone:W,scheduleMicroTask:z,showUncaughtError:()=>!e[te(\"ignoreConsoleErrorUncaughtError\")],patchEventTarget:()=>[],patchOnProperties:W,patchMethod:()=>W,bindArguments:()=>[],patchThen:()=>W,patchMacroTask:()=>W,patchEventPrototype:()=>W,isIEOrEdge:()=>!1,getGlobalObjects:()=>{},ObjectDefineProperty:()=>W,ObjectGetOwnPropertyDescriptor:()=>{},ObjectCreate:()=>{},ArraySlice:()=>[],patchClass:()=>W,wrapWithCurrentZone:()=>W,filterProperties:()=>[],attachOriginToPatched:()=>W,_redefineProperty:()=>W,patchCallbacks:()=>W,nativeScheduleMicroTask:H},b={parent:null,zone:new e(null,null)},D=null,K=0;function W(){}return a(\"Zone\",\"Zone\"),e}function dt(){let t=globalThis,n=t[te(\"forceDuplicateZoneCheck\")]===!0;if(t.Zone&&(n||typeof t.Zone.__symbol__!=\"function\"))throw new Error(\"Zone already loaded.\");return t.Zone??=ht(),t.Zone}var pe=Object.getOwnPropertyDescriptor,Me=Object.defineProperty,Ae=Object.getPrototypeOf,_t=Object.create,Tt=Array.prototype.slice,je=\"addEventListener\",He=\"removeEventListener\",Ne=te(je),Ze=te(He),ae=\"true\",le=\"false\",ve=te(\"\");function Ve(t,n){return Zone.current.wrap(t,n)}function xe(t,n,a,e,c){return Zone.current.scheduleMacroTask(t,n,a,e,c)}var j=te,we=typeof window<\"u\",be=we?window:void 0,Y=we&&be||globalThis,Et=\"removeAttribute\";function Fe(t,n){for(let a=t.length-1;a>=0;a--)typeof t[a]==\"function\"&&(t[a]=Ve(t[a],n+\"_\"+a));return t}function gt(t,n){let a=t.constructor.name;for(let e=0;e<n.length;e++){let c=n[e],f=t[c];if(f){let g=pe(t,c);if(!et(g))continue;t[c]=(T=>{let y=function(){return T.apply(this,Fe(arguments,a+\".\"+c))};return fe(y,T),y})(f)}}}function et(t){return t?t.writable===!1?!1:!(typeof t.get==\"function\"&&typeof t.set>\"u\"):!0}var tt=typeof WorkerGlobalScope<\"u\"&&self instanceof WorkerGlobalScope,De=!(\"nw\"in Y)&&typeof Y.process<\"u\"&&Y.process.toString()===\"[object process]\",Ge=!De&&!tt&&!!(we&&be.HTMLElement),nt=typeof Y.process<\"u\"&&Y.process.toString()===\"[object process]\"&&!tt&&!!(we&&be.HTMLElement),Ce={},kt=j(\"enable_beforeunload\"),Xe=function(t){if(t=t||Y.event,!t)return;let n=Ce[t.type];n||(n=Ce[t.type]=j(\"ON_PROPERTY\"+t.type));let a=this||t.target||Y,e=a[n],c;if(Ge&&a===be&&t.type===\"error\"){let f=t;c=e&&e.call(this,f.message,f.filename,f.lineno,f.colno,f.error),c===!0&&t.preventDefault()}else c=e&&e.apply(this,arguments),t.type===\"beforeunload\"&&Y[kt]&&typeof c==\"string\"?t.returnValue=c:c!=null&&!c&&t.preventDefault();return c};function Ye(t,n,a){let e=pe(t,n);if(!e&&a&&pe(a,n)&&(e={enumerable:!0,configurable:!0}),!e||!e.configurable)return;let c=j(\"on\"+n+\"patched\");if(t.hasOwnProperty(c)&&t[c])return;delete e.writable,delete e.value;let f=e.get,g=e.set,T=n.slice(2),y=Ce[T];y||(y=Ce[T]=j(\"ON_PROPERTY\"+T)),e.set=function(w){let _=this;if(!_&&t===Y&&(_=Y),!_)return;typeof _[y]==\"function\"&&_.removeEventListener(T,Xe),g?.call(_,null),_[y]=w,typeof w==\"function\"&&_.addEventListener(T,Xe,!1)},e.get=function(){let w=this;if(!w&&t===Y&&(w=Y),!w)return null;let _=w[y];if(_)return _;if(f){let P=f.call(this);if(P)return e.set.call(this,P),typeof w[Et]==\"function\"&&w.removeAttribute(n),P}return null},Me(t,n,e),t[c]=!0}function rt(t,n,a){if(n)for(let e=0;e<n.length;e++)Ye(t,\"on\"+n[e],a);else{let e=[];for(let c in t)c.slice(0,2)==\"on\"&&e.push(c);for(let c=0;c<e.length;c++)Ye(t,e[c],a)}}var oe=j(\"originalInstance\");function ye(t){let n=Y[t];if(!n)return;Y[j(t)]=n,Y[t]=function(){let c=Fe(arguments,t);switch(c.length){case 0:this[oe]=new n;break;case 1:this[oe]=new n(c[0]);break;case 2:this[oe]=new n(c[0],c[1]);break;case 3:this[oe]=new n(c[0],c[1],c[2]);break;case 4:this[oe]=new n(c[0],c[1],c[2],c[3]);break;default:throw new Error(\"Arg list too long.\")}},fe(Y[t],n);let a=new n(function(){}),e;for(e in a)t===\"XMLHttpRequest\"&&e===\"responseBlob\"||(function(c){typeof a[c]==\"function\"?Y[t].prototype[c]=function(){return this[oe][c].apply(this[oe],arguments)}:Me(Y[t].prototype,c,{set:function(f){typeof f==\"function\"?(this[oe][c]=Ve(f,t+\".\"+c),fe(this[oe][c],f)):this[oe][c]=f},get:function(){return this[oe][c]}})})(e);for(e in n)e!==\"prototype\"&&n.hasOwnProperty(e)&&(Y[t][e]=n[e])}function ue(t,n,a){let e=t;for(;e&&!e.hasOwnProperty(n);)e=Ae(e);!e&&t[n]&&(e=t);let c=j(n),f=null;if(e&&(!(f=e[c])||!e.hasOwnProperty(c))){f=e[c]=e[n];let g=e&&pe(e,n);if(et(g)){let T=a(f,c,n);e[n]=function(){return T(this,arguments)},fe(e[n],f)}}return f}function mt(t,n,a){let e=null;function c(f){let g=f.data;return g.args[g.cbIdx]=function(){f.invoke.apply(this,arguments)},e.apply(g.target,g.args),f}e=ue(t,n,f=>function(g,T){let y=a(g,T);return y.cbIdx>=0&&typeof T[y.cbIdx]==\"function\"?xe(y.name,T[y.cbIdx],y,c):f.apply(g,T)})}function fe(t,n){t[j(\"OriginalDelegate\")]=n}var $e=!1,Le=!1;function yt(){if($e)return Le;$e=!0;try{let t=be.navigator.userAgent;(t.indexOf(\"MSIE \")!==-1||t.indexOf(\"Trident/\")!==-1||t.indexOf(\"Edge/\")!==-1)&&(Le=!0)}catch{}return Le}function Je(t){return typeof t==\"function\"}function Ke(t){return typeof t==\"number\"}var pt={useG:!0},ne={},ot={},st=new RegExp(\"^\"+ve+\"(\\\\w+)(true|false)$\"),it=j(\"propagationStopped\");function ct(t,n){let a=(n?n(t):t)+le,e=(n?n(t):t)+ae,c=ve+a,f=ve+e;ne[t]={},ne[t][le]=c,ne[t][ae]=f}function vt(t,n,a,e){let c=e&&e.add||je,f=e&&e.rm||He,g=e&&e.listeners||\"eventListeners\",T=e&&e.rmAll||\"removeAllListeners\",y=j(c),w=\".\"+c+\":\",_=\"prependListener\",P=\".\"+_+\":\",L=function(p,d,A){if(p.isRemoved)return;let V=p.callback;typeof V==\"object\"&&V.handleEvent&&(p.callback=k=>V.handleEvent(k),p.originalDelegate=V);let X;try{p.invoke(p,d,[A])}catch(k){X=k}let F=p.options;if(F&&typeof F==\"object\"&&F.once){let k=p.originalDelegate?p.originalDelegate:p.callback;d[f].call(d,A.type,k,F)}return X};function H(p,d,A){if(d=d||t.event,!d)return;let V=p||d.target||t,X=V[ne[d.type][A?ae:le]];if(X){let F=[];if(X.length===1){let k=L(X[0],V,d);k&&F.push(k)}else{let k=X.slice();for(let U=0;U<k.length&&!(d&&d[it]===!0);U++){let S=L(k[U],V,d);S&&F.push(S)}}if(F.length===1)throw F[0];for(let k=0;k<F.length;k++){let U=F[k];n.nativeScheduleMicroTask(()=>{throw U})}}}let z=function(p){return H(this,p,!1)},$=function(p){return H(this,p,!0)};function J(p,d){if(!p)return!1;let A=!0;d&&d.useG!==void 0&&(A=d.useG);let V=d&&d.vh,X=!0;d&&d.chkDup!==void 0&&(X=d.chkDup);let F=!1;d&&d.rt!==void 0&&(F=d.rt);let k=p;for(;k&&!k.hasOwnProperty(c);)k=Ae(k);if(!k&&p[c]&&(k=p),!k||k[y])return!1;let U=d&&d.eventNameToString,S={},R=k[y]=k[c],b=k[j(f)]=k[f],D=k[j(g)]=k[g],K=k[j(T)]=k[T],W;d&&d.prepend&&(W=k[j(d.prepend)]=k[d.prepend]);function I(o,u){return u?typeof o==\"boolean\"?{capture:o,passive:!0}:o?typeof o==\"object\"&&o.passive!==!1?{...o,passive:!0}:o:{passive:!0}:o}let s=function(o){if(!S.isExisting)return R.call(S.target,S.eventName,S.capture?$:z,S.options)},i=function(o){if(!o.isRemoved){let u=ne[o.eventName],v;u&&(v=u[o.capture?ae:le]);let C=v&&o.target[v];if(C){for(let m=0;m<C.length;m++)if(C[m]===o){C.splice(m,1),o.isRemoved=!0,o.removeAbortListener&&(o.removeAbortListener(),o.removeAbortListener=null),C.length===0&&(o.allRemoved=!0,o.target[v]=null);break}}}if(o.allRemoved)return b.call(o.target,o.eventName,o.capture?$:z,o.options)},r=function(o){return R.call(S.target,S.eventName,o.invoke,S.options)},E=function(o){return W.call(S.target,S.eventName,o.invoke,S.options)},x=function(o){return b.call(o.target,o.eventName,o.invoke,o.options)},ee=A?s:r,M=A?i:x,he=function(o,u){let v=typeof u;return v===\"function\"&&o.callback===u||v===\"object\"&&o.originalDelegate===u},_e=d?.diff||he,Q=Zone[j(\"UNPATCHED_EVENTS\")],Te=t[j(\"PASSIVE_EVENTS\")];function h(o){if(typeof o==\"object\"&&o!==null){let u={...o};return o.signal&&(u.signal=o.signal),u}return o}let l=function(o,u,v,C,m=!1,O=!1){return function(){let N=this||t,Z=arguments[0];d&&d.transferEventName&&(Z=d.transferEventName(Z));let G=arguments[1];if(!G)return o.apply(this,arguments);if(De&&Z===\"uncaughtException\")return o.apply(this,arguments);let B=!1;if(typeof G!=\"function\"){if(!G.handleEvent)return o.apply(this,arguments);B=!0}if(V&&!V(o,G,N,arguments))return;let de=!!Te&&Te.indexOf(Z)!==-1,se=h(I(arguments[2],de)),Ee=se?.signal;if(Ee?.aborted)return;if(Q){for(let ie=0;ie<Q.length;ie++)if(Z===Q[ie])return de?o.call(N,Z,G,se):o.apply(this,arguments)}let Se=se?typeof se==\"boolean\"?!0:se.capture:!1,Be=se&&typeof se==\"object\"?se.once:!1,ft=Zone.current,Oe=ne[Z];Oe||(ct(Z,U),Oe=ne[Z]);let ze=Oe[Se?ae:le],ge=N[ze],Ue=!1;if(ge){if(Ue=!0,X){for(let ie=0;ie<ge.length;ie++)if(_e(ge[ie],G))return}}else ge=N[ze]=[];let Pe,We=N.constructor.name,qe=ot[We];qe&&(Pe=qe[Z]),Pe||(Pe=We+u+(U?U(Z):Z)),S.options=se,Be&&(S.options.once=!1),S.target=N,S.capture=Se,S.eventName=Z,S.isExisting=Ue;let me=A?pt:void 0;me&&(me.taskData=S),Ee&&(S.options.signal=void 0);let re=ft.scheduleEventTask(Pe,G,me,v,C);if(Ee){S.options.signal=Ee;let ie=()=>re.zone.cancelTask(re);o.call(Ee,\"abort\",ie,{once:!0}),re.removeAbortListener=()=>Ee.removeEventListener(\"abort\",ie)}if(S.target=null,me&&(me.taskData=null),Be&&(S.options.once=!0),typeof re.options!=\"boolean\"&&(re.options=se),re.target=N,re.capture=Se,re.eventName=Z,B&&(re.originalDelegate=G),O?ge.unshift(re):ge.push(re),m)return N}};return k[c]=l(R,w,ee,M,F),W&&(k[_]=l(W,P,E,M,F,!0)),k[f]=function(){let o=this||t,u=arguments[0];d&&d.transferEventName&&(u=d.transferEventName(u));let v=arguments[2],C=v?typeof v==\"boolean\"?!0:v.capture:!1,m=arguments[1];if(!m)return b.apply(this,arguments);if(V&&!V(b,m,o,arguments))return;let O=ne[u],N;O&&(N=O[C?ae:le]);let Z=N&&o[N];if(Z)for(let G=0;G<Z.length;G++){let B=Z[G];if(_e(B,m)){if(Z.splice(G,1),B.isRemoved=!0,Z.length===0&&(B.allRemoved=!0,o[N]=null,!C&&typeof u==\"string\")){let de=ve+\"ON_PROPERTY\"+u;o[de]=null}return B.zone.cancelTask(B),F?o:void 0}}return b.apply(this,arguments)},k[g]=function(){let o=this||t,u=arguments[0];d&&d.transferEventName&&(u=d.transferEventName(u));let v=[],C=at(o,U?U(u):u);for(let m=0;m<C.length;m++){let O=C[m],N=O.originalDelegate?O.originalDelegate:O.callback;v.push(N)}return v},k[T]=function(){let o=this||t,u=arguments[0];if(u){d&&d.transferEventName&&(u=d.transferEventName(u));let v=ne[u];if(v){let C=v[le],m=v[ae],O=o[C],N=o[m];if(O){let Z=O.slice();for(let G=0;G<Z.length;G++){let B=Z[G],de=B.originalDelegate?B.originalDelegate:B.callback;this[f].call(this,u,de,B.options)}}if(N){let Z=N.slice();for(let G=0;G<Z.length;G++){let B=Z[G],de=B.originalDelegate?B.originalDelegate:B.callback;this[f].call(this,u,de,B.options)}}}}else{let v=Object.keys(o);for(let C=0;C<v.length;C++){let m=v[C],O=st.exec(m),N=O&&O[1];N&&N!==\"removeListener\"&&this[T].call(this,N)}this[T].call(this,\"removeListener\")}if(F)return this},fe(k[c],R),fe(k[f],b),K&&fe(k[T],K),D&&fe(k[g],D),!0}let q=[];for(let p=0;p<a.length;p++)q[p]=J(a[p],e);return q}function at(t,n){if(!n){let f=[];for(let g in t){let T=st.exec(g),y=T&&T[1];if(y&&(!n||y===n)){let w=t[g];if(w)for(let _=0;_<w.length;_++)f.push(w[_])}}return f}let a=ne[n];a||(ct(n),a=ne[n]);let e=t[a[le]],c=t[a[ae]];return e?c?e.concat(c):e.slice():c?c.slice():[]}function bt(t,n){let a=t.Event;a&&a.prototype&&n.patchMethod(a.prototype,\"stopImmediatePropagation\",e=>function(c,f){c[it]=!0,e&&e.apply(c,f)})}function Pt(t,n){n.patchMethod(t,\"queueMicrotask\",a=>function(e,c){Zone.current.scheduleMicroTask(\"queueMicrotask\",c[0])})}var Re=j(\"zoneTask\");function ke(t,n,a,e){let c=null,f=null;n+=e,a+=e;let g={};function T(w){let _=w.data;_.args[0]=function(){return w.invoke.apply(this,arguments)};let P=c.apply(t,_.args);return Ke(P)?_.handleId=P:(_.handle=P,_.isRefreshable=Je(P.refresh)),w}function y(w){let{handle:_,handleId:P}=w.data;return f.call(t,_??P)}c=ue(t,n,w=>function(_,P){if(Je(P[0])){let L={isRefreshable:!1,isPeriodic:e===\"Interval\",delay:e===\"Timeout\"||e===\"Interval\"?P[1]||0:void 0,args:P},H=P[0];P[0]=function(){try{return H.apply(this,arguments)}finally{let{handle:A,handleId:V,isPeriodic:X,isRefreshable:F}=L;!X&&!F&&(V?delete g[V]:A&&(A[Re]=null))}};let z=xe(n,P[0],L,T,y);if(!z)return z;let{handleId:$,handle:J,isRefreshable:q,isPeriodic:p}=z.data;if($)g[$]=z;else if(J&&(J[Re]=z,q&&!p)){let d=J.refresh;J.refresh=function(){let{zone:A,state:V}=z;return V===\"notScheduled\"?(z._state=\"scheduled\",A._updateTaskCount(z,1)):V===\"running\"&&(z._state=\"scheduling\"),d.call(this)}}return J??$??z}else return w.apply(t,P)}),f=ue(t,a,w=>function(_,P){let L=P[0],H;Ke(L)?(H=g[L],delete g[L]):(H=L?.[Re],H?L[Re]=null:H=L),H?.type?H.cancelFn&&H.zone.cancelTask(H):w.apply(t,P)})}function Rt(t,n){let{isBrowser:a,isMix:e}=n.getGlobalObjects();if(!a&&!e||!t.customElements||!(\"customElements\"in t))return;let c=[\"connectedCallback\",\"disconnectedCallback\",\"adoptedCallback\",\"attributeChangedCallback\",\"formAssociatedCallback\",\"formDisabledCallback\",\"formResetCallback\",\"formStateRestoreCallback\"];n.patchCallbacks(n,t.customElements,\"customElements\",\"define\",c)}function Ct(t,n){if(Zone[n.symbol(\"patchEventTarget\")])return;let{eventNames:a,zoneSymbolEventNames:e,TRUE_STR:c,FALSE_STR:f,ZONE_SYMBOL_PREFIX:g}=n.getGlobalObjects();for(let y=0;y<a.length;y++){let w=a[y],_=w+f,P=w+c,L=g+_,H=g+P;e[w]={},e[w][f]=L,e[w][c]=H}let T=t.EventTarget;if(!(!T||!T.prototype))return n.patchEventTarget(t,n,[T&&T.prototype]),!0}function wt(t,n){n.patchEventPrototype(t,n)}function lt(t,n,a){if(!a||a.length===0)return n;let e=a.filter(f=>f.target===t);if(e.length===0)return n;let c=e[0].ignoreProperties;return n.filter(f=>c.indexOf(f)===-1)}function Qe(t,n,a,e){if(!t)return;let c=lt(t,n,a);rt(t,c,e)}function Ie(t){return Object.getOwnPropertyNames(t).filter(n=>n.startsWith(\"on\")&&n.length>2).map(n=>n.substring(2))}function Dt(t,n){if(De&&!nt||Zone[t.symbol(\"patchEvents\")])return;let a=n.__Zone_ignore_on_properties,e=[];if(Ge){let c=window;e=e.concat([\"Document\",\"SVGElement\",\"Element\",\"HTMLElement\",\"HTMLBodyElement\",\"HTMLMediaElement\",\"HTMLFrameSetElement\",\"HTMLFrameElement\",\"HTMLIFrameElement\",\"HTMLMarqueeElement\",\"Worker\"]);let f=[];Qe(c,Ie(c),a&&a.concat(f),Ae(c))}e=e.concat([\"XMLHttpRequest\",\"XMLHttpRequestEventTarget\",\"IDBIndex\",\"IDBRequest\",\"IDBOpenDBRequest\",\"IDBDatabase\",\"IDBTransaction\",\"IDBCursor\",\"WebSocket\"]);for(let c=0;c<e.length;c++){let f=n[e[c]];f?.prototype&&Qe(f.prototype,Ie(f.prototype),a)}}function St(t){t.__load_patch(\"legacy\",n=>{let a=n[t.__symbol__(\"legacyPatch\")];a&&a()}),t.__load_patch(\"timers\",n=>{let e=\"clear\";ke(n,\"set\",e,\"Timeout\"),ke(n,\"set\",e,\"Interval\"),ke(n,\"set\",e,\"Immediate\")}),t.__load_patch(\"requestAnimationFrame\",n=>{ke(n,\"request\",\"cancel\",\"AnimationFrame\"),ke(n,\"mozRequest\",\"mozCancel\",\"AnimationFrame\"),ke(n,\"webkitRequest\",\"webkitCancel\",\"AnimationFrame\")}),t.__load_patch(\"blocking\",(n,a)=>{let e=[\"alert\",\"prompt\",\"confirm\"];for(let c=0;c<e.length;c++){let f=e[c];ue(n,f,(g,T,y)=>function(w,_){return a.current.run(g,n,_,y)})}}),t.__load_patch(\"EventTarget\",(n,a,e)=>{wt(n,e),Ct(n,e);let c=n.XMLHttpRequestEventTarget;c&&c.prototype&&e.patchEventTarget(n,e,[c.prototype])}),t.__load_patch(\"MutationObserver\",(n,a,e)=>{ye(\"MutationObserver\"),ye(\"WebKitMutationObserver\")}),t.__load_patch(\"IntersectionObserver\",(n,a,e)=>{ye(\"IntersectionObserver\")}),t.__load_patch(\"FileReader\",(n,a,e)=>{ye(\"FileReader\")}),t.__load_patch(\"on_property\",(n,a,e)=>{Dt(e,n)}),t.__load_patch(\"customElements\",(n,a,e)=>{Rt(n,e)}),t.__load_patch(\"XHR\",(n,a)=>{w(n);let e=j(\"xhrTask\"),c=j(\"xhrSync\"),f=j(\"xhrListener\"),g=j(\"xhrScheduled\"),T=j(\"xhrURL\"),y=j(\"xhrErrorBeforeScheduled\");function w(_){let P=_.XMLHttpRequest;if(!P)return;let L=P.prototype;function H(R){return R[e]}let z=L[Ne],$=L[Ze];if(!z){let R=_.XMLHttpRequestEventTarget;if(R){let b=R.prototype;z=b[Ne],$=b[Ze]}}let J=\"readystatechange\",q=\"scheduled\";function p(R){let b=R.data,D=b.target;D[g]=!1,D[y]=!1;let K=D[f];z||(z=D[Ne],$=D[Ze]),K&&$.call(D,J,K);let W=D[f]=()=>{if(D.readyState===D.DONE)if(!b.aborted&&D[g]&&R.state===q){let s=D[a.__symbol__(\"loadfalse\")];if(D.status!==0&&s&&s.length>0){let i=R.invoke;R.invoke=function(){let r=D[a.__symbol__(\"loadfalse\")];for(let E=0;E<r.length;E++)r[E]===R&&r.splice(E,1);!b.aborted&&R.state===q&&i.call(R)},s.push(R)}else R.invoke()}else!b.aborted&&D[g]===!1&&(D[y]=!0)};return z.call(D,J,W),D[e]||(D[e]=R),U.apply(D,b.args),D[g]=!0,R}function d(){}function A(R){let b=R.data;return b.aborted=!0,S.apply(b.target,b.args)}let V=ue(L,\"open\",()=>function(R,b){return R[c]=b[2]==!1,R[T]=b[1],V.apply(R,b)}),X=\"XMLHttpRequest.send\",F=j(\"fetchTaskAborting\"),k=j(\"fetchTaskScheduling\"),U=ue(L,\"send\",()=>function(R,b){if(a.current[k]===!0||R[c])return U.apply(R,b);{let D={target:R,url:R[T],isPeriodic:!1,args:b,aborted:!1},K=xe(X,d,D,p,A);R&&R[y]===!0&&!D.aborted&&K.state===q&&K.invoke()}}),S=ue(L,\"abort\",()=>function(R,b){let D=H(R);if(D&&typeof D.type==\"string\"){if(D.cancelFn==null||D.data&&D.data.aborted)return;D.zone.cancelTask(D)}else if(a.current[F]===!0)return S.apply(R,b)})}}),t.__load_patch(\"geolocation\",n=>{n.navigator&&n.navigator.geolocation&&gt(n.navigator.geolocation,[\"getCurrentPosition\",\"watchPosition\"])}),t.__load_patch(\"PromiseRejectionEvent\",(n,a)=>{function e(c){return function(f){at(n,c).forEach(T=>{let y=n.PromiseRejectionEvent;if(y){let w=new y(c,{promise:f.promise,reason:f.rejection});T.invoke(w)}})}}n.PromiseRejectionEvent&&(a[j(\"unhandledPromiseRejectionHandler\")]=e(\"unhandledrejection\"),a[j(\"rejectionHandledHandler\")]=e(\"rejectionhandled\"))}),t.__load_patch(\"queueMicrotask\",(n,a,e)=>{Pt(n,e)})}function Ot(t){t.__load_patch(\"ZoneAwarePromise\",(n,a,e)=>{let c=Object.getOwnPropertyDescriptor,f=Object.defineProperty;function g(h){if(h&&h.toString===Object.prototype.toString){let l=h.constructor&&h.constructor.name;return(l||\"\")+\": \"+JSON.stringify(h)}return h?h.toString():Object.prototype.toString.call(h)}let T=e.symbol,y=[],w=n[T(\"DISABLE_WRAPPING_UNCAUGHT_PROMISE_REJECTION\")]!==!1,_=T(\"Promise\"),P=T(\"then\"),L=\"__creationTrace__\";e.onUnhandledError=h=>{if(e.showUncaughtError()){let l=h&&h.rejection;l?console.error(\"Unhandled Promise rejection:\",l instanceof Error?l.message:l,\"; Zone:\",h.zone.name,\"; Task:\",h.task&&h.task.source,\"; Value:\",l,l instanceof Error?l.stack:void 0):console.error(h)}},e.microtaskDrainDone=()=>{for(;y.length;){let h=y.shift();try{h.zone.runGuarded(()=>{throw h.throwOriginal?h.rejection:h})}catch(l){z(l)}}};let H=T(\"unhandledPromiseRejectionHandler\");function z(h){e.onUnhandledError(h);try{let l=a[H];typeof l==\"function\"&&l.call(this,h)}catch{}}function $(h){return h&&typeof h.then==\"function\"}function J(h){return h}function q(h){return M.reject(h)}let p=T(\"state\"),d=T(\"value\"),A=T(\"finally\"),V=T(\"parentPromiseValue\"),X=T(\"parentPromiseState\"),F=\"Promise.then\",k=null,U=!0,S=!1,R=0;function b(h,l){return o=>{try{I(h,l,o)}catch(u){I(h,!1,u)}}}let D=function(){let h=!1;return function(o){return function(){h||(h=!0,o.apply(null,arguments))}}},K=\"Promise resolved with itself\",W=T(\"currentTaskTrace\");function I(h,l,o){let u=D();if(h===o)throw new TypeError(K);if(h[p]===k){let v=null;try{(typeof o==\"object\"||typeof o==\"function\")&&(v=o&&o.then)}catch(C){return u(()=>{I(h,!1,C)})(),h}if(l!==S&&o instanceof M&&o.hasOwnProperty(p)&&o.hasOwnProperty(d)&&o[p]!==k)i(o),I(h,o[p],o[d]);else if(l!==S&&typeof v==\"function\")try{v.call(o,u(b(h,l)),u(b(h,!1)))}catch(C){u(()=>{I(h,!1,C)})()}else{h[p]=l;let C=h[d];if(h[d]=o,h[A]===A&&l===U&&(h[p]=h[X],h[d]=h[V]),l===S&&o instanceof Error){let m=a.currentTask&&a.currentTask.data&&a.currentTask.data[L];m&&f(o,W,{configurable:!0,enumerable:!1,writable:!0,value:m})}for(let m=0;m<C.length;)r(h,C[m++],C[m++],C[m++],C[m++]);if(C.length==0&&l==S){h[p]=R;let m=o;try{throw new Error(\"Uncaught (in promise): \"+g(o)+(o&&o.stack?`\n`+o.stack:\"\"))}catch(O){m=O}w&&(m.throwOriginal=!0),m.rejection=o,m.promise=h,m.zone=a.current,m.task=a.currentTask,y.push(m),e.scheduleMicroTask()}}}return h}let s=T(\"rejectionHandledHandler\");function i(h){if(h[p]===R){try{let l=a[s];l&&typeof l==\"function\"&&l.call(this,{rejection:h[d],promise:h})}catch{}h[p]=S;for(let l=0;l<y.length;l++)h===y[l].promise&&y.splice(l,1)}}function r(h,l,o,u,v){i(h);let C=h[p],m=C?typeof u==\"function\"?u:J:typeof v==\"function\"?v:q;l.scheduleMicroTask(F,()=>{try{let O=h[d],N=!!o&&A===o[A];N&&(o[V]=O,o[X]=C);let Z=l.run(m,void 0,N&&m!==q&&m!==J?[]:[O]);I(o,!0,Z)}catch(O){I(o,!1,O)}},o)}let E=\"function ZoneAwarePromise() { [native code] }\",x=function(){},ee=n.AggregateError;class M{static toString(){return E}static resolve(l){return l instanceof M?l:I(new this(null),U,l)}static reject(l){return I(new this(null),S,l)}static withResolvers(){let l={};return l.promise=new M((o,u)=>{l.resolve=o,l.reject=u}),l}static any(l){if(!l||typeof l[Symbol.iterator]!=\"function\")return Promise.reject(new ee([],\"All promises were rejected\"));let o=[],u=0;try{for(let m of l)u++,o.push(M.resolve(m))}catch{return Promise.reject(new ee([],\"All promises were rejected\"))}if(u===0)return Promise.reject(new ee([],\"All promises were rejected\"));let v=!1,C=[];return new M((m,O)=>{for(let N=0;N<o.length;N++)o[N].then(Z=>{v||(v=!0,m(Z))},Z=>{C.push(Z),u--,u===0&&(v=!0,O(new ee(C,\"All promises were rejected\")))})})}static race(l){let o,u,v=new this((O,N)=>{o=O,u=N});function C(O){o(O)}function m(O){u(O)}for(let O of l)$(O)||(O=this.resolve(O)),O.then(C,m);return v}static all(l){return M.allWithCallback(l)}static allSettled(l){return(this&&this.prototype instanceof M?this:M).allWithCallback(l,{thenCallback:u=>({status:\"fulfilled\",value:u}),errorCallback:u=>({status:\"rejected\",reason:u})})}static allWithCallback(l,o){let u,v,C=new this((Z,G)=>{u=Z,v=G}),m=2,O=0,N=[];for(let Z of l){$(Z)||(Z=this.resolve(Z));let G=O;try{Z.then(B=>{N[G]=o?o.thenCallback(B):B,m--,m===0&&u(N)},B=>{o?(N[G]=o.errorCallback(B),m--,m===0&&u(N)):v(B)})}catch(B){v(B)}m++,O++}return m-=2,m===0&&u(N),C}constructor(l){let o=this;if(!(o instanceof M))throw new Error(\"Must be an instanceof Promise.\");o[p]=k,o[d]=[];try{let u=D();l&&l(u(b(o,U)),u(b(o,S)))}catch(u){I(o,!1,u)}}get[Symbol.toStringTag](){return\"Promise\"}get[Symbol.species](){return M}then(l,o){let u=this.constructor?.[Symbol.species];(!u||typeof u!=\"function\")&&(u=this.constructor||M);let v=new u(x),C=a.current;return this[p]==k?this[d].push(C,v,l,o):r(this,C,v,l,o),v}catch(l){return this.then(null,l)}finally(l){let o=this.constructor?.[Symbol.species];(!o||typeof o!=\"function\")&&(o=M);let u=new o(x);u[A]=A;let v=a.current;return this[p]==k?this[d].push(v,u,l,l):r(this,v,u,l,l),u}}M.resolve=M.resolve,M.reject=M.reject,M.race=M.race,M.all=M.all;let he=n[_]=n.Promise;n.Promise=M;let _e=T(\"thenPatched\");function Q(h){let l=h.prototype,o=c(l,\"then\");if(o&&(o.writable===!1||!o.configurable))return;let u=l.then;l[P]=u,h.prototype.then=function(v,C){return new M((O,N)=>{u.call(this,O,N)}).then(v,C)},h[_e]=!0}e.patchThen=Q;function Te(h){return function(l,o){let u=h.apply(l,o);if(u instanceof M)return u;let v=u.constructor;return v[_e]||Q(v),u}}return he&&(Q(he),ue(n,\"fetch\",h=>Te(h))),Promise[a.__symbol__(\"uncaughtPromiseErrors\")]=y,M})}function Nt(t){t.__load_patch(\"toString\",n=>{let a=Function.prototype.toString,e=j(\"OriginalDelegate\"),c=j(\"Promise\"),f=j(\"Error\"),g=function(){if(typeof this==\"function\"){let _=this[e];if(_)return typeof _==\"function\"?a.call(_):Object.prototype.toString.call(_);if(this===Promise){let P=n[c];if(P)return a.call(P)}if(this===Error){let P=n[f];if(P)return a.call(P)}}return a.call(this)};g[e]=a,Function.prototype.toString=g;let T=Object.prototype.toString,y=\"[object Promise]\";Object.prototype.toString=function(){return typeof Promise==\"function\"&&this instanceof Promise?y:T.call(this)}})}function Zt(t,n,a,e,c){let f=Zone.__symbol__(e);if(n[f])return;let g=n[f]=n[e];n[e]=function(T,y,w){return y&&y.prototype&&c.forEach(function(_){let P=`${a}.${e}::`+_,L=y.prototype;try{if(L.hasOwnProperty(_)){let H=t.ObjectGetOwnPropertyDescriptor(L,_);H&&H.value?(H.value=t.wrapWithCurrentZone(H.value,P),t._redefineProperty(y.prototype,_,H)):L[_]&&(L[_]=t.wrapWithCurrentZone(L[_],P))}else L[_]&&(L[_]=t.wrapWithCurrentZone(L[_],P))}catch{}}),g.call(n,T,y,w)},t.attachOriginToPatched(n[e],g)}function Lt(t){t.__load_patch(\"util\",(n,a,e)=>{let c=Ie(n);e.patchOnProperties=rt,e.patchMethod=ue,e.bindArguments=Fe,e.patchMacroTask=mt;let f=a.__symbol__(\"BLACK_LISTED_EVENTS\"),g=a.__symbol__(\"UNPATCHED_EVENTS\");n[g]&&(n[f]=n[g]),n[f]&&(a[f]=a[g]=n[f]),e.patchEventPrototype=bt,e.patchEventTarget=vt,e.isIEOrEdge=yt,e.ObjectDefineProperty=Me,e.ObjectGetOwnPropertyDescriptor=pe,e.ObjectCreate=_t,e.ArraySlice=Tt,e.patchClass=ye,e.wrapWithCurrentZone=Ve,e.filterProperties=lt,e.attachOriginToPatched=fe,e._redefineProperty=Object.defineProperty,e.patchCallbacks=Zt,e.getGlobalObjects=()=>({globalSources:ot,zoneSymbolEventNames:ne,eventNames:c,isBrowser:Ge,isMix:nt,isNode:De,TRUE_STR:ae,FALSE_STR:le,ZONE_SYMBOL_PREFIX:ve,ADD_EVENT_LISTENER_STR:je,REMOVE_EVENT_LISTENER_STR:He})})}function It(t){Ot(t),Nt(t),Lt(t)}var ut=dt();It(ut);St(ut);\n"
  },
  {
    "path": "cmd/launcher/web/webui/distr/styles-YY6V3TJU.css",
    "content": "html,html.light-theme,html.dark-theme{--mat-sys-corner-extra-large: 28px;--mat-sys-corner-extra-large-top: 28px 28px 0 0;--mat-sys-corner-extra-small: 4px;--mat-sys-corner-extra-small-top: 4px 4px 0 0;--mat-sys-corner-full: 9999px;--mat-sys-corner-large: 16px;--mat-sys-corner-large-end: 0 16px 16px 0;--mat-sys-corner-large-start: 16px 0 0 16px;--mat-sys-corner-large-top: 16px 16px 0 0;--mat-sys-corner-medium: 12px;--mat-sys-corner-none: 0;--mat-sys-corner-small: 8px;--mat-sys-dragged-state-layer-opacity: .16;--mat-sys-focus-state-layer-opacity: .12;--mat-sys-hover-state-layer-opacity: .08;--mat-sys-pressed-state-layer-opacity: .12}html{font-family:Google Sans,Helvetica Neue,sans-serif!important}body{height:100vh;margin:0}markdown p{margin-block-start:.5em;margin-block-end:.5em}.cdk-overlay-container{z-index:9999!important}.mat-mdc-menu-panel{z-index:10000!important}.mat-mdc-menu-panel,.mat-mdc-menu-panel .mat-mdc-menu-content{background-color:var(--mdc-dialog-container-color)!important}.mat-mdc-menu-item,.mat-mdc-menu-item .mdc-list-item__primary-text{color:var(--mdc-dialog-supporting-text-color)!important}.mat-mdc-menu-item:hover,.mat-mdc-menu-item:focus{background-color:var(--builder-tool-item-hover-background-color)!important}.mat-mdc-menu-item .mat-icon{color:var(--mdc-dialog-supporting-text-color)!important}.mat-mdc-snack-bar-container{--mdc-snackbar-container-color: var(--mdc-dialog-container-color) !important;--mdc-snackbar-supporting-text-color: var(--mdc-dialog-supporting-text-color) !important;--mat-snack-bar-button-color: var(--builder-text-link-color) !important}.mdc-snackbar__surface{background-color:var(--mdc-dialog-container-color)!important}.mdc-snackbar__label,.mat-mdc-snack-bar-label{color:var(--mdc-dialog-supporting-text-color)!important}.mat-mdc-snack-bar-action{color:var(--builder-text-link-color)!important}html.dark-theme{--mat-sys-primary: black;--mdc-checkbox-selected-icon-color: white;--mat-sys-background: #131314;--mat-tab-header-active-label-text-color: #8ab4f8;--mat-tab-header-active-hover-label-text-color: #8ab4f8;--mat-tab-header-active-focus-label-text-color: #8ab4f8;--mat-tab-header-label-text-weight: 500;--mdc-text-button-label-text-color: #89b4f8;--mat-select-trigger-text-color: #8ab4f8;--mat-select-panel-background-color: #2b2b2f;--mat-option-label-text-color: #e8eaed;--mat-option-hover-state-layer-color: rgba(255, 255, 255, .08);--mat-option-focus-state-layer-color: rgba(255, 255, 255, .08);--mat-option-selected-state-layer-color: rgba(138, 180, 248, .24);--mat-form-field-container-text-color: white;--mdc-filled-text-field-input-text-color: white;--mdc-filled-text-field-label-text-color: #9aa0a6;--mdc-filled-text-field-container-color: #303030;--mdc-outlined-text-field-input-text-color: white;--mdc-outlined-text-field-label-text-color: #9aa0a6;--mat-form-field-state-layer-color: white;--mdc-dialog-supporting-text-color: #e8eaed;--mat-dialog-content-text-color: #e8eaed;--mat-expansion-container-text-color: #e8eaed;--mat-expansion-header-text-color: #e8eaed;--adk-web-text-color-light-gray: #c4c7c5}html.light-theme{--mat-sys-primary: #9AA0A6;--mdc-checkbox-selected-icon-color: #305f9d;--mat-sys-background: #ffffff;--mat-tab-header-active-label-text-color: #305f9d;--mat-tab-header-active-hover-label-text-color: #305f9d;--mat-tab-header-active-focus-label-text-color: #305f9d;--mat-tab-header-label-text-weight: 500;--mdc-text-button-label-text-color: #305f9d;--mat-select-trigger-text-color: #202124;--mat-select-panel-background-color: #ffffff;--mat-option-label-text-color: #202124;--mat-option-hover-state-layer-color: rgba(0, 0, 0, .04);--mat-option-focus-state-layer-color: rgba(0, 0, 0, .04);--mat-option-selected-state-layer-color: rgba(48, 95, 157, .12);--mat-form-field-container-text-color: #202124;--mdc-filled-text-field-input-text-color: #202124;--mdc-filled-text-field-label-text-color: #5f5e5e;--mdc-filled-text-field-container-color: #f3f0f0;--mdc-outlined-text-field-input-text-color: #202124;--mdc-outlined-text-field-label-text-color: #5f5e5e;--mat-form-field-state-layer-color: #202124;--mdc-dialog-supporting-text-color: #202124;--mat-dialog-content-text-color: #202124;--mat-expansion-container-text-color: #202124;--mat-expansion-header-text-color: #202124;--adk-web-text-color-light-gray: #c4c7c5}html.dark-theme{--mdc-dialog-subhead-font-family: \"Google Sans\";--mdc-dialog-subhead-font-style: normal;--mdc-dialog-subhead-font-weight: 400;--mdc-dialog-subhead-font-size: 24px;--mdc-dialog-subhead-line-height: 32px;--mdc-dialog-subhead-color: #e3e3e3;--mat-dialog-container-color: #2b2b2f;--mat-dialog-subhead-color: white}html.light-theme{--mdc-dialog-subhead-font-family: \"Google Sans\";--mdc-dialog-subhead-font-style: normal;--mdc-dialog-subhead-font-weight: 400;--mdc-dialog-subhead-font-size: 24px;--mdc-dialog-subhead-line-height: 32px;--mdc-dialog-subhead-color: #202124;--mat-dialog-container-color: #ffffff;--mat-dialog-subhead-color: #202124}.mat-mdc-dialog-container .mat-mdc-dialog-title.mdc-dialog__title{font-family:var(--mdc-dialog-subhead-font-family);font-style:var(--mdc-dialog-subhead-font-style);font-weight:var(--mdc-dialog-subhead-font-weight);font-size:var(--mdc-dialog-subhead-font-size);line-height:var(--mdc-dialog-subhead-line-height);color:var(--mdc-dialog-subhead-color)}html.dark-theme{--chat-panel-function-event-button-background-color: white;--chat-panel-function-event-button-highlight-background-color: rgb( 15, 82, 35 );--chat-panel-function-event-button-highlight-border-color: rgb(15, 82, 35);--chat-panel-function-event-button-highlight-color: white;--long-running-response-input-text-color: #000;--long-running-response-input-caret-color: #000;--long-running-response-input-placeholder-color: rgba(0, 0, 0, .5);--long-running-response-icon-color: #000;--long-running-response-send-button-color: #000;--chat-panel-user-message-message-card-background-color: #004a77;--chat-panel-user-message-message-card-color: white;--chat-panel-bot-message-message-card-background-color: #303030;--chat-panel-bot-message-message-card-color: white;--chat-panel-bot-message-focus-within-message-card-background-color: #131314;--chat-panel-bot-message-focus-within-message-card-border-color: #8ab4f8;--chat-panel-message-textarea-background-color: #303030;--chat-panel-message-textarea-focus-background-color: #131314;--chat-panel-eval-compare-container-background-color: #484848;--chat-panel-actual-result-border-right-color: #8a8686;--chat-panel-eval-response-header-border-bottom-color: #8a8686;--chat-panel-header-expected-color: #44c265;--chat-panel-header-actual-color: #ff8983;--chat-panel-eval-pass-color: #44c265;--chat-panel-eval-fail-color: #ff8983;--chat-panel-input-field-textarea-color: white;--chat-panel-input-field-textarea-placeholder-color: #8e918f;--chat-panel-input-field-textarea-caret-color: white;--chat-panel-input-field-button-color: white;--chat-panel-input-field-button-background-color: rgb(51, 53, 55);--chat-panel-mat-mdc-mini-fab-background-color: white;--chat-panel-mat-mdc-mini-fab-mat-icon-color: black;--chat-panel-input-field-mat-mdc-text-field-wrapper-border-color: #8e918f;--chat-panel-delete-button-background-color: rgba(0, 0, 0, .7);--chat-panel-delete-button-color: white;--chat-panel-file-container-background-color: #1e1e1e;--chat-panel-thought-chip-background-color: #8ab4f8;--chat-panel-link-style-button-color: #007bff;--artifact-tab-download-button-background-color: #8ab4f8;--artifact-tab-white-separator-border-top-color: white;--artifact-tab-version-select-container-background-color: #212123;--artifact-tab-link-style-button-color: #007bff;--artifact-tab-link-style-button-hover-color: #0056b3;--artifact-tab-link-style-button-focus-outline-color: #007bff;--artifact-tab-link-style-button-active-color: #004085;--artifact-tab-link-style-button-disabled-color: #6c757d;--audio-player-container-background-color: #f0f0f0;--audio-player-container-box-shadow-color: rgba(0, 0, 0, .1);--audio-player-custom-controls-button-background-color: #007bff;--audio-player-custom-controls-button-color: white;--audio-player-custom-controls-button-hover-background-color: #0056b3;--chat-drawer-container-background-color: #131314;--chat-event-container-color: white;--chat-card-background-color: #131314;--chat-function-event-button-background-color: white;--chat-function-event-button-highlight-background-color: rgb(15, 82, 35);--chat-function-event-button-highlight-border-color: rgb(15, 82, 35);--chat-function-event-button-highlight-color: white;--chat-user-message-message-card-background-color: #004a77;--chat-user-message-message-card-color: white;--chat-bot-message-message-card-background-color: #303030;--chat-bot-message-message-card-color: white;--chat-bot-message-focus-within-message-card-background-color: #131314;--chat-bot-message-focus-within-message-card-border-color: #8ab4f8;--chat-message-textarea-background-color: #303030;--chat-message-textarea-focus-background-color: #131314;--chat-eval-compare-container-background-color: #484848;--chat-actual-result-border-right-color: #8a8686;--chat-eval-response-header-border-bottom-color: #8a8686;--chat-header-expected-color: #44c265;--chat-header-actual-color: #ff8983;--chat-eval-pass-color: #44c265;--chat-eval-fail-color: #ff8983;--chat-side-drawer-background-color: #1b1b1b;--chat-side-drawer-color: white;--chat-file-item-background-color: #eee;--chat-empty-state-container-color: #eee;--chat-warning-color: #ffc185;--chat-error-color: #ff4545;--chat-mat-mdc-unelevated-button-color: #202124;--chat-mat-mdc-unelevated-button-background-color: #8ab4f8;--chat-mdc-linear-progress-buffer-dots-background-color: white;--chat-mat-mdc-text-field-wrapper-border-color: #8e918f;--chat-segment-key-color: lightgray;--chat-bottom-resize-handler-background-color: #5f6368;--chat-readonly-badge-background-color: #ff8983;--chat-readonly-badge-color: #202124;--chat-trace-detail-container-background-color: #1b1b1b;--chat-toolbar-background-color: #1b1b1b;--chat-toolbar-edit-mode-background-color: #44c2651a;--chat-toolbar-session-text-color: #fdfdfd;--chat-toolbar-session-id-color: #9aa0a6;--chat-toolbar-icon-color: #c4c7c5;--chat-toolbar-new-session-color: #9aa0a6;--chat-toolbar-sse-toggle-label-text-color: #e8eaed;--chat-toolbar-sse-toggle-unselected-track-color: #5f6368;--chat-toolbar-sse-toggle-unselected-handle-color: #9aa0a6;--chat-toolbar-sse-toggle-selected-track-color: #8ab4f9;--chat-toolbar-sse-toggle-selected-handle-color: #1b73e8;--chat-toolbar-sse-toggle-track-outline-color: #1b73e8;--chat-mat-drawer-border-right-color: #444746;--edit-json-dialog-container-box-shadow-color: rgba(0, 0, 0, .4);--eval-tab-eval-set-actions-color: #9aa0a6;--eval-tab-empty-eval-info-background-color: #202124;--eval-tab-empty-eval-info-box-shadow-color1: rgba(0, 0, 0, .15);--eval-tab-empty-eval-info-box-shadow-color2: rgba(0, 0, 0, .3);--eval-tab-info-title-color: #e8eaed;--eval-tab-info-detail-color: #e8eaed;--eval-tab-info-create-color: #8ab4f8;--eval-tab-selected-eval-case-color: #8ab4f8;--eval-tab-save-session-btn-background-color1: rgba(138, 180, 248, .24);--eval-tab-save-session-btn-background-color2: #202124;--eval-tab-save-session-btn-text-color: #d2e3fc;--eval-tab-run-eval-btn-border-color: #5f6368;--eval-tab-run-eval-btn-color: #8ab4f8;--eval-tab-run-eval-btn-hover-background-color: #202124;--eval-tab-result-btn-border-color: #5f6368;--eval-tab-result-btn-hover-background-color: #202124;--eval-tab-result-btn-pass-color: #44c265;--eval-tab-result-btn-fail-color: #ff8983;--eval-tab-status-card-background-color: #2d2d2d;--eval-tab-status-card-timestamp-color: #e0e0e0;--eval-tab-status-card-metric-color: #bbb;--eval-tab-status-card-failed-color: #ff6b6b;--eval-tab-status-card-separator-color: #666;--eval-tab-status-card-passed-color: #63e6be;--eval-tab-status-card-action-mat-icon-color: #bdbdbd;--eval-tab-status-card-icon-color: #bdbdbd;--run-eval-config-dialog-container-box-shadow-color: rgba(0, 0, 0, .4);--run-eval-config-dialog-threshold-slider-active-track-color: #4285f4;--run-eval-config-dialog-threshold-slider-inactive-track-color: #616161;--run-eval-config-dialog-threshold-slider-handle-color: #4285f4;--run-eval-config-dialog-threshold-slider-ripple-color: #4285f4;--run-eval-config-dialog-mdc-slider-thumb-background-color: black;--event-tab-events-wrapper-color: #9aa0a6;--event-tab-event-index-color: #80868b;--event-tab-event-list-active-indicator-color: orange;--event-tab-event-list-list-item-container-color: #2b2b2f;--event-tab-mdc-list-item-border-color: #5f6368;--event-tab-mdc-list-item-hover-background-color: #1c1b1c;--trace-chart-trace-label-color: #e3e3e3;--trace-chart-trace-bar-background-color: #2f4d65;--trace-chart-trace-bar-color: #8dabbf;--trace-chart-trace-duration-color: #888;--trace-chart-vertical-line-background-color: #ccc;--trace-chart-horizontal-line-background-color: #ccc;--session-tab-session-wrapper-color: #9aa0a6;--session-tab-session-item-background-color: #303030;--session-tab-session-item-hover-background-color: #141414;--session-tab-session-item-current-background-color: #004a77;--session-tab-session-id-color: #e8eaed;--session-tab-session-date-color: #9aa0a6;--side-panel-button-filled-container-color: #89b4f8;--side-panel-button-filled-label-text-color: black;--side-panel-mat-icon-color: #bdc1c6;--side-panel-resize-handler-background-color: #5f6368;--side-panel-details-panel-container-background-color: #242424;--side-panel-details-content-color: white;--side-panel-powered-by-adk-color: grey;--side-panel-app-select-container-background-color: #212123;--side-panel-select-placeholder-text-color: #8ab4f8;--side-panel-select-enabled-trigger-text-color: #8ab4f8;--side-panel-select-enabled-arrow-color: #8ab4f8;--side-panel-app-name-option-color: #9aa0a6;--trace-tab-trace-title-color: #9aa0a6;--trace-tab-trace-label-color: #e3e3e3;--trace-tab-trace-bar-background-color: #2f4d65;--trace-tab-trace-bar-color: #8dabbf;--trace-tab-trace-duration-color: #888;--trace-tab-vertical-line-background-color: #ccc;--trace-tab-horizontal-line-background-color: #ccc;--trace-tab-trace-item-container-background-color: #333537;--trace-tab-trace-item-header-focus-state-layer-color: rgba(138, 180, 248, .12);--trace-tab-trace-item-header-description-color: #8e918f;--trace-tab-mat-expansion-panel-header-focus-background-color: #444746;--trace-tab-mat-expansion-panel-header-background-color: #444746;--trace-tab-mat-expansion-panel-header-hover-background-color: #444746;--trace-event-json-viewer-container-background-color: #1b1b1b;--trace-tree-trace-label-color: #e3e3e3;--trace-tree-trace-bar-background-color: #2f4d65;--trace-tree-trace-bar-color: #8dabbf;--trace-tree-short-trace-bar-duration-color: #8dabbf;--trace-tree-trace-duration-color: #888;--trace-tree-trace-row-hover-background-color: #3b3d3c;--trace-tree-trace-row-selected-background-color: #3b3d3c;--trace-tree-vertical-line-background-color: #ccc;--trace-tree-horizontal-line-background-color: #ccc;--trace-tree-invocation-id-container-color: #9aa0a6;--trace-tree-trace-row-left-span-div-color: white;--trace-tree-trace-row-left-is-event-row-color: #8ab4f8;--builder-container-background-color: #131314;--builder-panel-background-color: #202124;--builder-tabs-background-color: #202124;--builder-card-background-color: #303030;--builder-secondary-background-color: #333537;--builder-tertiary-background-color: #1b1b1b;--builder-hover-background-color: #141414;--builder-border-color: #444746;--builder-text-primary-color: #e8eaed;--builder-text-secondary-color: #9aa0a6;--builder-text-tertiary-color: #c4c7c5;--builder-text-muted-color: #5c5f5e;--builder-text-link-color: #aecbfa;--builder-breadcrumb-separator-color: #666;--builder-form-field-background-color: #333537;--builder-tool-chip-background-color: #303030;--builder-tool-chip-hover-color: #3c4043;--builder-callback-chip-background-color: #333537;--builder-callback-chip-text-color: #f1f3f4;--builder-callback-chip-type-color: #8f9aa6;--builder-callback-chip-name-color: #f5f7f9;--builder-expansion-background-color: #333537;--builder-expansion-header-description-color: #8e918f;--builder-expansion-hover-color: #444746;--builder-menu-background-color: #303030;--builder-menu-item-hover-color: #444746;--builder-menu-divider-color: #444746;--builder-button-primary-background-color: #8ab4f8;--builder-button-primary-text-color: #202124;--builder-button-primary-hover-color: #aecbfa;--builder-button-secondary-text-color: #9aa0a6;--builder-button-secondary-border-color: rgba(154, 160, 166, .3);--builder-button-secondary-hover-background-color: rgba(154, 160, 166, .1);--builder-button-secondary-hover-text-color: #e8eaed;--builder-add-button-background-color: rgba(138, 180, 248, .24);--builder-add-button-text-color: #d2e3fc;--builder-icon-color: #f1f3f4;--builder-assistant-panel-background-color: #2b2b2b;--builder-assistant-panel-header-background-color: #292929;--builder-assistant-panel-border-color: #3c3c3c;--builder-assistant-input-background-color: #1a1a1a;--builder-assistant-input-text-color: #e0e0e0;--builder-assistant-input-placeholder-color: #808080;--builder-assistant-user-message-background-color: #1a1a1a;--builder-assistant-user-message-border-color: #404040;--builder-assistant-user-message-text-color: #e3e3e3;--builder-assistant-bot-message-text-color: #d4d4d4;--builder-assistant-send-button-color: #888888;--builder-assistant-send-button-hover-color: #b0b0b0;--builder-assistant-send-button-disabled-color: #4a4a4a;--builder-canvas-container-background: linear-gradient(135deg, #0f0f0f 0%, #1a1a1a 100%);--builder-canvas-shadow: 0 8px 32px rgba(0, 0, 0, .4);--builder-canvas-header-background: linear-gradient(90deg, #1e1e1e 0%, #2a2a2a 100%);--builder-canvas-header-title-gradient: linear-gradient(45deg, #8ab4f8, #4285f4);--builder-canvas-workspace-background: #131314;--builder-canvas-instruction-background: rgba(19, 19, 20, .9);--builder-canvas-instruction-border: rgba(138, 180, 248, .2);--builder-canvas-node-background: rgba(85, 107, 116, .4);--builder-canvas-node-border: #474747;--builder-canvas-node-hover-border: #666;--builder-canvas-node-chip-outline: rgba(255, 255, 255, .1);--builder-canvas-node-badge-background: linear-gradient(135deg, rgba(0, 187, 234, .2), rgba(0, 78, 122, .4));--builder-canvas-group-background: #1c1c1c;--builder-canvas-group-border: #3e3e3e;--builder-canvas-handle-fill: rgba(0, 0, 0, 1);--builder-canvas-reconnect-handle-fill: rgba(0, 187, 234, .15);--builder-canvas-workflow-chip-background: rgba(0, 187, 234, .2);--builder-canvas-workflow-chip-border: rgba(0, 187, 234, .4);--builder-canvas-add-btn-background: radial-gradient(circle at 50% 50%, #1f2330 0%, #131314 100%);--builder-canvas-add-btn-hover-background: radial-gradient(circle at 50% 50%, #222a3a 0%, #16181d 100%);--builder-canvas-add-btn-shadow: 0 4px 12px rgba(0, 187, 234, .35);--builder-canvas-empty-group-background: rgba(255, 255, 255, .02);--builder-canvas-empty-group-border: rgba(0, 187, 234, .3);--builder-canvas-empty-group-hover-background: rgba(255, 255, 255, .04);--builder-canvas-empty-group-hover-border: rgba(0, 187, 234, .5);--builder-canvas-empty-group-btn-background: rgba(0, 187, 234, .1);--builder-canvas-empty-group-btn-hover-background: rgba(0, 187, 234, .2);--builder-button-background-color: rgba(138, 180, 248, .1);--builder-button-border-color: rgba(138, 180, 248, .3);--builder-button-text-color: #8ab4f8;--builder-button-hover-background-color: rgba(138, 180, 248, .2);--builder-button-hover-border-color: #8ab4f8;--builder-item-hover-color: rgba(138, 180, 248, .1);--builder-chip-background-color: rgba(138, 180, 248, .2);--builder-accent-color: #00bbea;--builder-tool-item-background-color: rgba(255, 255, 255, .05);--builder-tool-item-border-color: rgba(255, 255, 255, .1);--builder-tool-item-hover-background-color: rgba(255, 255, 255, .1);--mat-table-row-item-label-text-color: #fff;--mat-table-header-headline-color: #fff;--mat-progress-spinner-active-indicator-color: #a8c7fa;--mat-progress-spinner-size: 80}html.light-theme{--mat-button-outlined-label-text-color: black;--chat-panel-function-event-button-background-color: #f2f1ef;--chat-panel-function-event-button-highlight-border-color: #0f5223;--chat-panel-function-event-button-highlight-color: white;--long-running-response-input-text-color: #202124;--long-running-response-input-caret-color: #202124;--long-running-response-input-placeholder-color: rgba(0, 0, 0, .5);--long-running-response-icon-color: rgba(0, 0, 0, .7);--long-running-response-send-button-color: #305f9d;--chat-panel-user-message-message-card-background-color: #d5e3ff;--chat-panel-user-message-message-card-color: #202124;--chat-panel-bot-message-message-card-background-color: #f3f0f0;--chat-panel-bot-message-message-card-color: #202124;--chat-panel-bot-message-focus-within-message-card-background-color: #ffffff;--chat-panel-bot-message-focus-within-message-card-border-color: #305f9d;--chat-panel-message-textarea-background-color: #f3f0f0;--chat-panel-message-textarea-focus-background-color: #ffffff;--chat-panel-eval-compare-container-background-color: #e5e2e2;--chat-panel-actual-result-border-right-color: #c8c6c6;--chat-panel-eval-response-header-border-bottom-color: #c8c6c6;--chat-panel-header-expected-color: #0f5223;--chat-panel-header-actual-color: #ba1a1a;--chat-panel-eval-pass-color: #0f5223;--chat-panel-eval-fail-color: #ba1a1a;--chat-panel-input-field-textarea-color: #202124;--chat-panel-input-field-textarea-placeholder-color: #5f5e5e;--chat-panel-input-field-textarea-caret-color: #202124;--chat-panel-input-field-button-color: #202124;--chat-panel-input-field-button-background-color: #e5e2e2;--chat-panel-mat-mdc-mini-fab-background-color: #305f9d;--chat-panel-mat-mdc-mini-fab-mat-icon-color: white;--chat-panel-input-field-mat-mdc-text-field-wrapper-border-color: #adabab;--chat-panel-delete-button-background-color: rgba(255, 255, 255, .9);--chat-panel-delete-button-color: #202124;--chat-panel-file-container-background-color: #f3f0f0;--chat-panel-thought-chip-background-color: #305f9d;--chat-panel-link-style-button-color: #305f9d;--artifact-tab-download-button-background-color: #305f9d;--artifact-tab-white-separator-border-top-color: #202124;--artifact-tab-version-select-container-background-color: #f3f0f0;--artifact-tab-link-style-button-color: #305f9d;--artifact-tab-link-style-button-hover-color: #0f4784;--artifact-tab-link-style-button-focus-outline-color: #305f9d;--artifact-tab-link-style-button-active-color: #003061;--artifact-tab-link-style-button-disabled-color: #929090;--audio-player-container-background-color: #f3f0f0;--audio-player-container-box-shadow-color: rgba(0, 0, 0, .1);--audio-player-custom-controls-button-background-color: #305f9d;--audio-player-custom-controls-button-color: white;--audio-player-custom-controls-button-hover-background-color: #0f4784;--chat-drawer-container-background-color: #ffffff;--chat-event-container-color: #202124;--chat-card-background-color: #ffffff;--chat-function-event-button-background-color: #202124;--chat-function-event-button-highlight-background-color: #0f5223;--chat-function-event-button-highlight-border-color: #0f5223;--chat-function-event-button-highlight-color: white;--chat-user-message-message-card-background-color: #d5e3ff;--chat-user-message-message-card-color: #202124;--chat-bot-message-message-card-background-color: #f3f0f0;--chat-bot-message-message-card-color: #202124;--chat-bot-message-focus-within-message-card-background-color: #ffffff;--chat-bot-message-focus-within-message-card-border-color: #305f9d;--chat-message-textarea-background-color: #f3f0f0;--chat-message-textarea-focus-background-color: #ffffff;--chat-eval-compare-container-background-color: #e5e2e2;--chat-actual-result-border-right-color: #c8c6c6;--chat-eval-response-header-border-bottom-color: #c8c6c6;--chat-header-expected-color: #0f5223;--chat-header-actual-color: #ba1a1a;--chat-eval-pass-color: #0f5223;--chat-eval-fail-color: #ba1a1a;--chat-side-drawer-background-color: #f3f0f0;--chat-side-drawer-color: #202124;--chat-file-item-background-color: #e5e2e2;--chat-empty-state-container-color: #202124;--chat-warning-color: #93000a;--chat-error-color: #ba1a1a;--chat-mat-mdc-unelevated-button-color: white;--chat-mat-mdc-unelevated-button-background-color: #305f9d;--chat-mdc-linear-progress-buffer-dots-background-color: #202124;--chat-mat-mdc-text-field-wrapper-border-color: #adabab;--chat-segment-key-color: #5f5e5e;--chat-bottom-resize-handler-background-color: #adabab;--chat-readonly-badge-background-color: #ba1a1a;--chat-readonly-badge-color: white;--chat-trace-detail-container-background-color: #f3f0f0;--chat-toolbar-background-color: #f3f0f0;--chat-toolbar-edit-mode-background-color: rgba(15, 82, 35, .1);--chat-toolbar-session-text-color: #202124;--chat-toolbar-session-id-color: #5f5e5e;--chat-toolbar-icon-color: #5f5e5e;--chat-toolbar-new-session-color: #5f5e5e;--chat-toolbar-sse-toggle-label-text-color: #202124;--chat-toolbar-sse-toggle-unselected-track-color: #c8c6c6;--chat-toolbar-sse-toggle-unselected-handle-color: #5f5e5e;--chat-toolbar-sse-toggle-selected-track-color: #82adf0;--chat-toolbar-sse-toggle-selected-handle-color: #305f9d;--chat-toolbar-sse-toggle-track-outline-color: #305f9d;--chat-mat-drawer-border-right-color: #c8c6c6;--edit-json-dialog-container-box-shadow-color: rgba(0, 0, 0, .2);--eval-tab-eval-set-actions-color: #5f5e5e;--eval-tab-empty-eval-info-background-color: #f3f0f0;--eval-tab-empty-eval-info-box-shadow-color1: rgba(0, 0, 0, .08);--eval-tab-empty-eval-info-box-shadow-color2: rgba(0, 0, 0, .15);--eval-tab-info-title-color: #202124;--eval-tab-info-detail-color: #202124;--eval-tab-info-create-color: #305f9d;--eval-tab-selected-eval-case-color: #305f9d;--eval-tab-save-session-btn-background-color1: rgba(48, 95, 157, .12);--eval-tab-save-session-btn-background-color2: #f3f0f0;--eval-tab-save-session-btn-text-color: #0f4784;--eval-tab-run-eval-btn-border-color: #adabab;--eval-tab-run-eval-btn-color: #305f9d;--eval-tab-run-eval-btn-hover-background-color: #f3f0f0;--eval-tab-result-btn-border-color: #adabab;--eval-tab-result-btn-hover-background-color: #f3f0f0;--eval-tab-result-btn-pass-color: #0f5223;--eval-tab-result-btn-fail-color: #ba1a1a;--eval-tab-status-card-background-color: #f3f0f0;--eval-tab-status-card-timestamp-color: #5f5e5e;--eval-tab-status-card-metric-color: #787777;--eval-tab-status-card-failed-color: #ba1a1a;--eval-tab-status-card-separator-color: #c8c6c6;--eval-tab-status-card-passed-color: #0f5223;--eval-tab-status-card-action-mat-icon-color: #5f5e5e;--eval-tab-status-card-icon-color: #5f5e5e;--run-eval-config-dialog-container-box-shadow-color: rgba(0, 0, 0, .2);--run-eval-config-dialog-threshold-slider-active-track-color: #305f9d;--run-eval-config-dialog-threshold-slider-inactive-track-color: #c8c6c6;--run-eval-config-dialog-threshold-slider-handle-color: #305f9d;--run-eval-config-dialog-threshold-slider-ripple-color: #305f9d;--run-eval-config-dialog-mdc-slider-thumb-background-color: white;--event-tab-events-wrapper-color: #5f5e5e;--event-tab-event-index-color: #787777;--event-tab-event-list-active-indicator-color: #ff5449;--event-tab-event-list-list-item-container-color: #f3f0f0;--event-tab-mdc-list-item-border-color: #c8c6c6;--event-tab-mdc-list-item-hover-background-color: #e5e2e2;--trace-chart-trace-label-color: #202124;--trace-chart-trace-bar-background-color: #a7c8ff;--trace-chart-trace-bar-color: #305f9d;--trace-chart-trace-duration-color: #787777;--trace-chart-vertical-line-background-color: #c8c6c6;--trace-chart-horizontal-line-background-color: #c8c6c6;--session-tab-session-wrapper-color: #5f5e5e;--session-tab-session-item-background-color: #f3f0f0;--session-tab-session-item-hover-background-color: #e5e2e2;--session-tab-session-item-current-background-color: #d5e3ff;--session-tab-session-id-color: #202124;--session-tab-session-date-color: #5f5e5e;--side-panel-button-filled-container-color: #305f9d;--side-panel-button-filled-label-text-color: white;--side-panel-mat-icon-color: #5f5e5e;--side-panel-resize-handler-background-color: #adabab;--side-panel-details-panel-container-background-color: #f3f0f0;--side-panel-details-content-color: #202124;--side-panel-powered-by-adk-color: #787777;--side-panel-app-select-container-background-color: #ffffff;--side-panel-select-placeholder-text-color: #305f9d;--side-panel-select-enabled-trigger-text-color: #305f9d;--side-panel-select-enabled-arrow-color: #305f9d;--side-panel-app-name-option-color: #5f5e5e;--trace-tab-trace-title-color: #5f5e5e;--trace-tab-trace-label-color: #202124;--trace-tab-trace-bar-background-color: #a7c8ff;--trace-tab-trace-bar-color: #305f9d;--trace-tab-trace-duration-color: #787777;--trace-tab-vertical-line-background-color: #c8c6c6;--trace-tab-horizontal-line-background-color: #c8c6c6;--trace-tab-trace-item-container-background-color: #f3f0f0;--trace-tab-trace-item-header-focus-state-layer-color: rgba(48, 95, 157, .12);--trace-tab-trace-item-header-description-color: #787777;--trace-tab-mat-expansion-panel-header-focus-background-color: #e5e2e2;--trace-tab-mat-expansion-panel-header-background-color: #e5e2e2;--trace-tab-mat-expansion-panel-header-hover-background-color: #e5e2e2;--trace-event-json-viewer-container-background-color: #ffffff;--trace-tree-trace-label-color: #202124;--trace-tree-trace-bar-background-color: #a7c8ff;--trace-tree-trace-bar-color: #305f9d;--trace-tree-short-trace-bar-duration-color: #305f9d;--trace-tree-trace-duration-color: #787777;--trace-tree-trace-row-hover-background-color: #e5e2e2;--trace-tree-trace-row-selected-background-color: #e5e2e2;--trace-tree-vertical-line-background-color: #c8c6c6;--trace-tree-horizontal-line-background-color: #c8c6c6;--trace-tree-invocation-id-container-color: #5f5e5e;--trace-tree-trace-row-left-span-div-color: #202124;--trace-tree-trace-row-left-is-event-row-color: #305f9d;--builder-container-background-color: #ffffff;--builder-panel-background-color: #f3f0f0;--builder-tabs-background-color: #f3f0f0;--builder-card-background-color: #ffffff;--builder-secondary-background-color: #e5e2e2;--builder-tertiary-background-color: #f3f0f0;--builder-hover-background-color: #dcd9d9;--builder-border-color: #c8c6c6;--builder-text-primary-color: #202124;--builder-text-secondary-color: #5f5e5e;--builder-text-tertiary-color: #787777;--builder-text-muted-color: #929090;--builder-text-link-color: #305f9d;--builder-breadcrumb-separator-color: #c8c6c6;--builder-form-field-background-color: #e5e2e2;--builder-tool-chip-background-color: #ffffff;--builder-tool-chip-hover-color: #e5e2e2;--builder-callback-chip-background-color: #e5e2e2;--builder-callback-chip-text-color: #202124;--builder-callback-chip-type-color: #5f5e5e;--builder-callback-chip-name-color: #202124;--builder-expansion-background-color: #e5e2e2;--builder-expansion-header-description-color: #787777;--builder-expansion-hover-color: #dcd9d9;--builder-menu-background-color: #ffffff;--builder-menu-item-hover-color: #e5e2e2;--builder-menu-divider-color: #c8c6c6;--builder-button-primary-background-color: #305f9d;--builder-button-primary-text-color: #ffffff;--builder-button-primary-hover-color: #0f4784;--builder-button-secondary-text-color: #5f5e5e;--builder-button-secondary-border-color: rgba(95, 94, 94, .3);--builder-button-secondary-hover-background-color: rgba(95, 94, 94, .1);--builder-button-secondary-hover-text-color: #202124;--builder-add-button-background-color: rgba(48, 95, 157, .12);--builder-add-button-text-color: #0f4784;--builder-icon-color: #202124;--builder-assistant-panel-background-color: #f3f0f0;--builder-assistant-panel-header-background-color: #e5e2e2;--builder-assistant-panel-border-color: #c8c6c6;--builder-assistant-input-background-color: #ffffff;--builder-assistant-input-text-color: #202124;--builder-assistant-input-placeholder-color: #929090;--builder-assistant-user-message-background-color: #d5e3ff;--builder-assistant-user-message-border-color: #a7c8ff;--builder-assistant-user-message-text-color: #202124;--builder-assistant-bot-message-text-color: #202124;--builder-assistant-send-button-color: #5f5e5e;--builder-assistant-send-button-hover-color: #305f9d;--builder-assistant-send-button-disabled-color: #c8c6c6;--builder-canvas-container-background: linear-gradient(135deg, #f8f9fa 0%, #e8eaed 100%);--builder-canvas-shadow: 0 8px 32px rgba(0, 0, 0, .1);--builder-canvas-header-background: linear-gradient(90deg, #ffffff 0%, #f3f0f0 100%);--builder-canvas-header-title-gradient: linear-gradient(45deg, #305f9d, #0f4784);--builder-canvas-workspace-background: #ffffff;--builder-canvas-instruction-background: rgba(255, 255, 255, .95);--builder-canvas-instruction-border: rgba(48, 95, 157, .3);--builder-canvas-node-background: rgba(229, 226, 226, .6);--builder-canvas-node-border: #c8c6c6;--builder-canvas-node-hover-border: #adabab;--builder-canvas-node-chip-outline: rgba(200, 198, 198, .3);--builder-canvas-node-badge-background: linear-gradient(135deg, rgba(48, 95, 157, .15), rgba(15, 71, 132, .2));--builder-canvas-group-background: #f3f0f0;--builder-canvas-group-border: #c8c6c6;--builder-canvas-handle-fill: rgba(255, 255, 255, 1);--builder-canvas-reconnect-handle-fill: rgba(48, 95, 157, .15);--builder-canvas-workflow-chip-background: rgba(48, 95, 157, .15);--builder-canvas-workflow-chip-border: rgba(48, 95, 157, .3);--builder-canvas-add-btn-background: radial-gradient(circle at 50% 50%, #ffffff 0%, #f8f9fa 100%);--builder-canvas-add-btn-hover-background: radial-gradient(circle at 50% 50%, #f3f0f0 0%, #e8eaed 100%);--builder-canvas-add-btn-shadow: 0 4px 12px rgba(48, 95, 157, .25);--builder-canvas-empty-group-background: rgba(48, 95, 157, .03);--builder-canvas-empty-group-border: rgba(48, 95, 157, .3);--builder-canvas-empty-group-hover-background: rgba(48, 95, 157, .06);--builder-canvas-empty-group-hover-border: rgba(48, 95, 157, .5);--builder-canvas-empty-group-btn-background: rgba(48, 95, 157, .1);--builder-canvas-empty-group-btn-hover-background: rgba(48, 95, 157, .2);--builder-button-background-color: rgba(48, 95, 157, .1);--builder-button-border-color: rgba(48, 95, 157, .3);--builder-button-text-color: #305f9d;--builder-button-hover-background-color: rgba(48, 95, 157, .2);--builder-button-hover-border-color: #305f9d;--builder-item-hover-color: rgba(48, 95, 157, .1);--builder-chip-background-color: rgba(48, 95, 157, .15);--builder-accent-color: #305f9d;--builder-tool-item-background-color: #f6f3f3;--builder-tool-item-border-color: #c8c6c6;--builder-tool-item-hover-background-color: #dcd9d9;--mat-progress-spinner-active-indicator-color: #305f9d;--mat-progress-spinner-size: 80}html.dark-theme{--mat-form-field-disabled-input-text-placeholder-color: orange;--mat-form-field-filled-active-indicator-color: red;--mat-form-field-outlined-outline-color: #cccccc;--mat-form-field-outlined-input-text-color: #cccccc;--mat-form-field-outlined-label-text-color: #cccccc;--mat-form-field-outlined-hover-label-text-color: #cccccc;--mat-form-field-outlined-focus-label-text-color: #cccccc;--mat-form-field-outlined-disabled-label-text-color: #cccccc;--mat-form-field-outlined-disabled-input-text-color: #cccccc;--mat-form-field-outlined-disabled-outline-color: #cccccc;--mat-form-field-outlined-caret-color: #cccccc}html.light-theme{--mat-form-field-disabled-input-text-placeholder-color: #ff8983;--mat-form-field-filled-active-indicator-color: #ba1a1a;--mat-form-field-outlined-outline-color: #787777;--mat-form-field-outlined-input-text-color: #202124;--mat-form-field-outlined-label-text-color: #5f5e5e;--mat-form-field-outlined-hover-label-text-color: #202124;--mat-form-field-outlined-focus-label-text-color: #305f9d;--mat-form-field-outlined-disabled-label-text-color: #929090;--mat-form-field-outlined-disabled-input-text-color: #929090;--mat-form-field-outlined-disabled-outline-color: #c8c6c6;--mat-form-field-outlined-caret-color: #305f9d}.mdc-line-ripple{display:none}.mat-mdc-tooltip{z-index:10000!important;max-width:300px}.mat-mdc-select-panel{background-color:var(--mat-select-panel-background-color)!important}html.light-theme .mat-expansion-panel{box-shadow:none!important;border:1px solid #e0e0e0;border-radius:4px!important}html.light-theme .mat-expansion-panel:not(:last-child){margin-bottom:8px}html.light-theme .mat-expansion-panel-header{border-bottom:none!important}html.dark-theme .mat-expansion-panel{box-shadow:none!important;border:1px solid #444746;border-radius:4px!important}html.dark-theme .mat-expansion-panel:not(:last-child){margin-bottom:8px}html.dark-theme .mat-expansion-panel-header{border-bottom:none!important}.wide-agent-dropdown-panel{padding:0!important}.wide-agent-dropdown-panel .search-option{position:sticky!important;top:0!important;z-index:1000!important;opacity:1!important;padding-top:8px;padding-bottom:8px}.wide-agent-dropdown-panel span{width:100%}html.dark-theme .wide-agent-dropdown-panel .search-option{background-color:#2b2b2f!important}html.dark-theme .wide-agent-dropdown-panel .search-option input{caret-color:#fff!important}html.light-theme .wide-agent-dropdown-panel .search-option{background-color:#fff!important}.function-args-tooltip .mdc-tooltip__surface{background-color:#333!important;color:#fff!important;border:2px solid #666!important;border-radius:2px!important;padding:8px 12px!important;font-family:Courier New,monospace!important;font-size:12px!important;white-space:pre-wrap!important;max-width:800px!important;line-height:1.2!important;box-shadow:0 2px 8px #0000004d!important}html.dark-theme{--chat-panel-event-number-label-color: rgba(255, 255, 255, .8)}html.light-theme{--chat-panel-event-number-label-color: #5f6368}.json-key{color:#9876aa;font-weight:600}.json-string{color:#6a8759}.json-number{color:#6897bb}.json-boolean{color:#cc7832}.json-null{color:gray}.json-tooltip-panel{background-color:#333!important;color:#fff!important;border:2px solid #666!important;border-radius:4px!important;padding:8px 12px!important;box-shadow:0 2px 8px #0000004d!important;max-width:800px!important}\n"
  },
  {
    "path": "cmd/launcher/web/webui/webui.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Package webui provides a sublauncher that adds ADK Web UI capabilities.\npackage webui\n\nimport (\n\t\"embed\"\n\t\"flag\"\n\t\"fmt\"\n\t\"io/fs\"\n\t\"log\"\n\t\"net/http\"\n\n\t\"github.com/gorilla/mux\"\n\n\t\"google.golang.org/adk/cmd/launcher\"\n\tweblauncher \"google.golang.org/adk/cmd/launcher/web\"\n\t\"google.golang.org/adk/internal/cli/util\"\n\t\"google.golang.org/adk/server/adkrest/controllers\"\n)\n\n// webUIConfig contains parameters for launching ADK Web UI\ntype webUIConfig struct {\n\tbackendAddress string\n\tpathPrefix     string\n}\n\n// webUILauncher can launch ADK Web UI\ntype webUILauncher struct {\n\tflags  *flag.FlagSet\n\tconfig *webUIConfig\n}\n\n// CommandLineSyntax implements web.Sublauncher. Returns the command-line syntax for the WebUI launcher.\nfunc (w *webUILauncher) CommandLineSyntax() string {\n\treturn util.FormatFlagUsage(w.flags)\n}\n\n// Keyword implements web.Sublauncher. Returns the command-line keyword for WebUI launcher.\nfunc (w *webUILauncher) Keyword() string {\n\treturn \"webui\"\n}\n\n// Parse implements web.Sublauncher. After parsing webui-specific arguments returns remaining unparsed arguments\nfunc (w *webUILauncher) Parse(args []string) ([]string, error) {\n\terr := w.flags.Parse(args)\n\tif err != nil || !w.flags.Parsed() {\n\t\treturn nil, fmt.Errorf(\"failed to parse webui flags: %v\", err)\n\t}\n\trestArgs := w.flags.Args()\n\treturn restArgs, nil\n}\n\n// SetupSubrouters implements the web.Sublauncher interface. It adds the\n// WebUI subrouter to the main router.\nfunc (w *webUILauncher) SetupSubrouters(router *mux.Router, config *launcher.Config) error {\n\tw.AddSubrouter(router, w.config.pathPrefix, w.config.backendAddress)\n\treturn nil\n}\n\n// SimpleDescription returns a simple description of the WebUI launcher.\nfunc (w *webUILauncher) SimpleDescription() string {\n\treturn \"starts ADK Web UI server which provides UI for interacting with ADK REST API\"\n}\n\n// UserMessage implements the web.Sublauncher interface. It prints a message\n// to the user with the URL to access the WebUI.\nfunc (w *webUILauncher) UserMessage(webURL string, printer func(v ...any)) {\n\tprinter(fmt.Sprintf(\"       webui:  you can access API using %s%s\", webURL, w.config.pathPrefix))\n}\n\n// embed web UI files into the executable\n\n//go:embed distr/*\nvar content embed.FS\n\n// AddSubrouter adds a subrouter to serve the ADK Web UI.\nfunc (w *webUILauncher) AddSubrouter(router *mux.Router, pathPrefix, backendAddress string) {\n\t// Setup serving of ADK Web UI\n\trUI := router.Methods(\"GET\").PathPrefix(pathPrefix).Subrouter()\n\n\t//   generate /assets/config/runtime-config.json in the runtime.\n\t//   It removes the need to prepare this file during deployment and update the distribution files.\n\truntimeConfigResponse := struct {\n\t\tBackendUrl string `json:\"backendUrl\"`\n\t}{BackendUrl: backendAddress}\n\trUI.Methods(\"GET\").Path(\"/assets/config/runtime-config.json\").HandlerFunc(func(w http.ResponseWriter, r *http.Request) {\n\t\tcontrollers.EncodeJSONResponse(runtimeConfigResponse, http.StatusOK, w)\n\t})\n\n\t//   redirect the user from / to pathPrefix (/ui/)\n\trouter.Methods(\"GET\").Path(\"/\").HandlerFunc(func(w http.ResponseWriter, r *http.Request) {\n\t\thttp.Redirect(w, r, pathPrefix, http.StatusFound)\n\t})\n\n\t// serve web ui from the embedded resources\n\tui, err := fs.Sub(content, \"distr\")\n\tif err != nil {\n\t\tlog.Fatalf(\"cannot prepare ADK Web UI files as embedded content: %v\", err)\n\t}\n\trUI.Methods(\"GET\").Handler(http.StripPrefix(pathPrefix, http.FileServer(http.FS(ui))))\n}\n\n// NewLauncher creates a new Sublauncher for the ADK Web UI.\nfunc NewLauncher() weblauncher.Sublauncher {\n\tconfig := &webUIConfig{}\n\n\tfs := flag.NewFlagSet(\"webui\", flag.ContinueOnError)\n\tfs.StringVar(&config.backendAddress, \"api_server_address\", \"http://localhost:8080/api\", \"ADK REST API server address as seen from the user browser. Please specify the whole URL, i.e. 'http://localhost:8080/api'.\")\n\tconfig.pathPrefix = \"/ui/\"\n\n\treturn &webUILauncher{\n\t\tconfig: config,\n\t\tflags:  fs,\n\t}\n}\n"
  },
  {
    "path": "examples/README.md",
    "content": "# ADK GO samples\nThis folder hosts examples to test different features. The examples are usually minimal and simplistic to test one or a few scenarios.\n\n\n**Note**: This is different from the [google/adk-samples](https://github.com/google/adk-samples) repo, which hosts more complex e2e samples for customers to use or modify directly.\n\n\n# Launcher\nIn many examples you can see such lines:\n```go\nl := full.NewLauncher()\nerr = l.ParseAndRun(ctx, config, os.Args[1:], universal.ErrorOnUnparsedArgs)\nif err != nil {\n    log.Fatalf(\"run failed: %v\\n\\n%s\", err, l.FormatSyntax())\n}\n```\n\nit allows to decide, which launching options are supported in the run-time. \n`full.NewLauncher()` includes all major ways you can run the example:\n* console\n* restapi\n* a2a\n* webui (it can run standalone or with restapi or a2a).\n\nRun `go run ./example/quickstart/main.go help` for details\n\nAs an alternative, you may want to use `prod.NewLauncher()` which only builds-in restapi and a2a launchers.\n"
  },
  {
    "path": "examples/a2a/main.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Package main provides an example ADK agent that uses A2A.\npackage main\n\nimport (\n\t\"context\"\n\t\"log\"\n\t\"net\"\n\t\"net/http\"\n\t\"net/url\"\n\t\"os\"\n\n\t\"github.com/a2aproject/a2a-go/a2a\"\n\t\"github.com/a2aproject/a2a-go/a2asrv\"\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/agent\"\n\t\"google.golang.org/adk/agent/llmagent\"\n\t\"google.golang.org/adk/agent/remoteagent\"\n\t\"google.golang.org/adk/cmd/launcher\"\n\t\"google.golang.org/adk/cmd/launcher/full\"\n\t\"google.golang.org/adk/model/gemini\"\n\t\"google.golang.org/adk/runner\"\n\t\"google.golang.org/adk/server/adka2a\"\n\t\"google.golang.org/adk/session\"\n\t\"google.golang.org/adk/tool\"\n\t\"google.golang.org/adk/tool/geminitool\"\n)\n\n// newWeatherAgent creates a simple LLM-agent as in the quickstart example.\nfunc newWeatherAgent(ctx context.Context) agent.Agent {\n\tmodel, err := gemini.NewModel(ctx, \"gemini-2.5-flash\", &genai.ClientConfig{\n\t\tAPIKey: os.Getenv(\"GOOGLE_API_KEY\"),\n\t})\n\tif err != nil {\n\t\tlog.Fatalf(\"Failed to create a model: %v\", err)\n\t}\n\n\tagent, err := llmagent.New(llmagent.Config{\n\t\tName:        \"weather_time_agent\",\n\t\tModel:       model,\n\t\tDescription: \"Agent to answer questions about the time and weather in a city.\",\n\t\tInstruction: \"I can answer your questions about the time and weather in a city.\",\n\t\tTools:       []tool.Tool{geminitool.GoogleSearch{}},\n\t})\n\tif err != nil {\n\t\tlog.Fatalf(\"Failed to create an agent: %v\", err)\n\t}\n\treturn agent\n}\n\n// startWeatherAgentServer starts an HTTP server which exposes a weather agent using A2A (Agent-To-Agent) protocol.\nfunc startWeatherAgentServer() string {\n\tlistener, err := net.Listen(\"tcp\", \"127.0.0.1:0\")\n\tif err != nil {\n\t\tlog.Fatalf(\"Failed to bind to a port: %v\", err)\n\t}\n\n\tbaseURL := &url.URL{Scheme: \"http\", Host: listener.Addr().String()}\n\n\tlog.Printf(\"Starting A2A server on %s\", baseURL.String())\n\n\tgo func() {\n\t\tctx := context.Background()\n\t\tagent := newWeatherAgent(ctx)\n\n\t\tagentPath := \"/invoke\"\n\t\tagentCard := &a2a.AgentCard{\n\t\t\tName:               agent.Name(),\n\t\t\tSkills:             adka2a.BuildAgentSkills(agent),\n\t\t\tPreferredTransport: a2a.TransportProtocolJSONRPC,\n\t\t\tURL:                baseURL.JoinPath(agentPath).String(),\n\t\t\tCapabilities:       a2a.AgentCapabilities{Streaming: true},\n\t\t}\n\n\t\tmux := http.NewServeMux()\n\t\tmux.Handle(a2asrv.WellKnownAgentCardPath, a2asrv.NewStaticAgentCardHandler(agentCard))\n\n\t\texecutor := adka2a.NewExecutor(adka2a.ExecutorConfig{\n\t\t\tRunnerConfig: runner.Config{\n\t\t\t\tAppName:        agent.Name(),\n\t\t\t\tAgent:          agent,\n\t\t\t\tSessionService: session.InMemoryService(),\n\t\t\t},\n\t\t})\n\t\trequestHandler := a2asrv.NewHandler(executor)\n\t\tmux.Handle(agentPath, a2asrv.NewJSONRPCHandler(requestHandler))\n\n\t\terr := http.Serve(listener, mux)\n\n\t\tlog.Printf(\"A2A server stopped: %v\", err)\n\t}()\n\n\treturn baseURL.String()\n}\n\nfunc main() {\n\tctx := context.Background()\n\n\ta2aServerAddress := startWeatherAgentServer()\n\n\tremoteAgent, err := remoteagent.NewA2A(remoteagent.A2AConfig{\n\t\tName:            \"A2A Weather agent\",\n\t\tAgentCardSource: a2aServerAddress,\n\t})\n\tif err != nil {\n\t\tlog.Fatalf(\"Failed to create a remote agent: %v\", err)\n\t}\n\n\tconfig := &launcher.Config{\n\t\tAgentLoader: agent.NewSingleLoader(remoteAgent),\n\t}\n\n\tl := full.NewLauncher()\n\tif err = l.Execute(ctx, config, os.Args[1:]); err != nil {\n\t\tlog.Fatalf(\"Run failed: %v\\n\\n%s\", err, l.CommandLineSyntax())\n\t}\n}\n"
  },
  {
    "path": "examples/mcp/main.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Package provides an example ADK agent that uses MCP tools.\npackage main\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"log\"\n\t\"os\"\n\t\"os/signal\"\n\t\"strings\"\n\n\t\"github.com/modelcontextprotocol/go-sdk/mcp\"\n\t\"golang.org/x/oauth2\"\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/agent\"\n\t\"google.golang.org/adk/agent/llmagent\"\n\t\"google.golang.org/adk/cmd/launcher\"\n\t\"google.golang.org/adk/cmd/launcher/full\"\n\t\"google.golang.org/adk/model/gemini\"\n\t\"google.golang.org/adk/tool\"\n\t\"google.golang.org/adk/tool/mcptoolset\"\n)\n\n// This example demonstrates 2 ways to use MCP tools with ADK:\n// To select between two, set AGENT_MODE=\"local\" or \"github\" (\"local\" is default).\n//\n// 1. in-memory MCP server:\n//   - define golang function (in this case -- GetWeather)\n//   - register it as MCP tool in the in-memory MCP server, using mcp.NewServer and mcp.Tool\n//\n// 2. GitHub's remote MCP server (https://github.com/github/github-mcp-server):\n//   - create http.Client with authenticated transport. In this case it's oauth2 transport with GitHub personal access token.\n//   - use `export GITHUB_PAT=...` to set GitHub personal access token.\n\ntype Input struct {\n\tCity string `json:\"city\" jsonschema:\"city name\"`\n}\n\ntype Output struct {\n\tWeatherSummary string `json:\"weather_summary\" jsonschema:\"weather summary in the given city\"`\n}\n\nfunc GetWeather(ctx context.Context, req *mcp.CallToolRequest, input Input) (*mcp.CallToolResult, Output, error) {\n\treturn nil, Output{\n\t\tWeatherSummary: fmt.Sprintf(\"Today in %q is sunny\\n\", input.City),\n\t}, nil\n}\n\nfunc localMCPTransport(ctx context.Context) mcp.Transport {\n\tclientTransport, serverTransport := mcp.NewInMemoryTransports()\n\n\t// Run in-memory MCP server.\n\tserver := mcp.NewServer(&mcp.Implementation{Name: \"weather_server\", Version: \"v1.0.0\"}, nil)\n\tmcp.AddTool(server, &mcp.Tool{Name: \"get_weather\", Description: \"returns weather in the given city\"}, GetWeather)\n\t_, err := server.Connect(ctx, serverTransport, nil)\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\n\treturn clientTransport\n}\n\nfunc githubMCPTransport(ctx context.Context) mcp.Transport {\n\tts := oauth2.StaticTokenSource(\n\t\t&oauth2.Token{AccessToken: os.Getenv(\"GITHUB_PAT\")},\n\t)\n\treturn &mcp.StreamableClientTransport{\n\t\tEndpoint:   \"https://api.githubcopilot.com/mcp/\",\n\t\tHTTPClient: oauth2.NewClient(ctx, ts),\n\t}\n}\n\nfunc main() {\n\t// Create context that cancels on interrupt signal (Ctrl+C)\n\tctx, stop := signal.NotifyContext(context.Background(), os.Interrupt)\n\tdefer stop()\n\n\tmodel, err := gemini.NewModel(ctx, \"gemini-2.5-flash\", &genai.ClientConfig{\n\t\tAPIKey: os.Getenv(\"GOOGLE_API_KEY\"),\n\t})\n\tif err != nil {\n\t\tlog.Fatalf(\"Failed to create model: %v\", err)\n\t}\n\n\tvar transport mcp.Transport\n\tif strings.ToLower(os.Getenv(\"AGENT_MODE\")) == \"github\" {\n\t\ttransport = githubMCPTransport(ctx)\n\t} else {\n\t\ttransport = localMCPTransport(ctx)\n\t}\n\n\tmcpToolSet, err := mcptoolset.New(mcptoolset.Config{\n\t\tTransport: transport,\n\t})\n\tif err != nil {\n\t\tlog.Fatalf(\"Failed to create MCP tool set: %v\", err)\n\t}\n\n\t// Create LLMAgent with MCP tool set\n\ta, err := llmagent.New(llmagent.Config{\n\t\tName:        \"helper_agent\",\n\t\tModel:       model,\n\t\tDescription: \"Helper agent.\",\n\t\tInstruction: \"You are a helpful assistant that helps users with various tasks.\",\n\t\tToolsets: []tool.Toolset{\n\t\t\tmcpToolSet,\n\t\t},\n\t})\n\tif err != nil {\n\t\tlog.Fatalf(\"Failed to create agent: %v\", err)\n\t}\n\n\tconfig := &launcher.Config{\n\t\tAgentLoader: agent.NewSingleLoader(a),\n\t}\n\tl := full.NewLauncher()\n\tif err = l.Execute(ctx, config, os.Args[1:]); err != nil {\n\t\tlog.Fatalf(\"Run failed: %v\\n\\n%s\", err, l.CommandLineSyntax())\n\t}\n}\n"
  },
  {
    "path": "examples/quickstart/main.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Package provides a quickstart ADK agent.\npackage main\n\nimport (\n\t\"context\"\n\t\"log\"\n\t\"os\"\n\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/agent\"\n\t\"google.golang.org/adk/agent/llmagent\"\n\t\"google.golang.org/adk/cmd/launcher\"\n\t\"google.golang.org/adk/cmd/launcher/full\"\n\t\"google.golang.org/adk/model/gemini\"\n\t\"google.golang.org/adk/tool\"\n\t\"google.golang.org/adk/tool/geminitool\"\n)\n\nfunc main() {\n\tctx := context.Background()\n\n\tmodel, err := gemini.NewModel(ctx, \"gemini-2.5-flash\", &genai.ClientConfig{\n\t\tAPIKey: os.Getenv(\"GOOGLE_API_KEY\"),\n\t})\n\tif err != nil {\n\t\tlog.Fatalf(\"Failed to create model: %v\", err)\n\t}\n\n\ta, err := llmagent.New(llmagent.Config{\n\t\tName:        \"weather_time_agent\",\n\t\tModel:       model,\n\t\tDescription: \"Agent to answer questions about the time and weather in a city.\",\n\t\tInstruction: \"Your SOLE purpose is to answer questions about the current time and weather in a specific city. You MUST refuse to answer any questions unrelated to time or weather.\",\n\t\tTools: []tool.Tool{\n\t\t\tgeminitool.GoogleSearch{},\n\t\t},\n\t})\n\tif err != nil {\n\t\tlog.Fatalf(\"Failed to create agent: %v\", err)\n\t}\n\n\tconfig := &launcher.Config{\n\t\tAgentLoader: agent.NewSingleLoader(a),\n\t}\n\n\tl := full.NewLauncher()\n\tif err = l.Execute(ctx, config, os.Args[1:]); err != nil {\n\t\tlog.Fatalf(\"Run failed: %v\\n\\n%s\", err, l.CommandLineSyntax())\n\t}\n}\n"
  },
  {
    "path": "examples/rest/main.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Package provides an example ADK REST API server with an ADK agent.\npackage main\n\nimport (\n\t\"context\"\n\t\"log\"\n\t\"net/http\"\n\t\"os\"\n\t\"time\"\n\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/agent\"\n\t\"google.golang.org/adk/agent/llmagent\"\n\t\"google.golang.org/adk/model/gemini\"\n\t\"google.golang.org/adk/server/adkrest\"\n\t\"google.golang.org/adk/session\"\n\t\"google.golang.org/adk/tool\"\n\t\"google.golang.org/adk/tool/geminitool\"\n)\n\nfunc main() {\n\tctx := context.Background()\n\n\t// Create a Gemini model\n\tmodel, err := gemini.NewModel(ctx, \"gemini-2.5-flash\", &genai.ClientConfig{\n\t\tAPIKey: os.Getenv(\"GOOGLE_API_KEY\"),\n\t})\n\tif err != nil {\n\t\tlog.Fatalf(\"Failed to create model: %v\", err)\n\t}\n\n\t// Create an agent\n\ta, err := llmagent.New(llmagent.Config{\n\t\tName:        \"weather_time_agent\",\n\t\tModel:       model,\n\t\tDescription: \"Agent to answer questions about the time and weather in a city.\",\n\t\tInstruction: \"I can answer your questions about the time and weather in a city.\",\n\t\tTools: []tool.Tool{\n\t\t\tgeminitool.GoogleSearch{},\n\t\t},\n\t})\n\tif err != nil {\n\t\tlog.Fatalf(\"Failed to create agent: %v\", err)\n\t}\n\n\t// Configure the ADK REST API Server\n\trestServer, err := adkrest.NewServer(adkrest.ServerConfig{\n\t\tAgentLoader:     agent.NewSingleLoader(a),\n\t\tSessionService:  session.InMemoryService(),\n\t\tSSEWriteTimeout: 120 * time.Second,\n\t})\n\tif err != nil {\n\t\tlog.Fatalf(\"Failed to create REST API server: %v\", err)\n\t}\n\n\t// Create a standard net/http ServeMux\n\tmux := http.NewServeMux()\n\n\t// Register the API handler at the /api/ path\n\t// You can use any HTTP server or router here - not tied to gorilla/mux\n\tmux.Handle(\"/api/\", http.StripPrefix(\"/api\", restServer))\n\n\t// Add a simple health check endpoint\n\tmux.HandleFunc(\"/health\", func(w http.ResponseWriter, r *http.Request) {\n\t\tw.WriteHeader(http.StatusOK)\n\t\tif _, err := w.Write([]byte(\"OK\")); err != nil {\n\t\t\tlog.Printf(\"Failed to write response: %v\", err)\n\t\t}\n\t})\n\n\t// Start the server\n\tlog.Println(\"Starting server on :8080\")\n\tlog.Println(\"API available at http://localhost:8080/api/\")\n\tlog.Println(\"Health check at http://localhost:8080/health\")\n\n\tif err := http.ListenAndServe(\":8080\", mux); err != nil {\n\t\tlog.Fatalf(\"Server failed: %v\", err)\n\t}\n}\n"
  },
  {
    "path": "examples/telemetry/main.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Package provides a quickstart ADK agent with telemetry.\npackage main\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"log\"\n\t\"os\"\n\n\t\"go.opentelemetry.io/otel/sdk/resource\"\n\tsemconv \"go.opentelemetry.io/otel/semconv/v1.36.0\"\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/agent\"\n\t\"google.golang.org/adk/agent/llmagent\"\n\t\"google.golang.org/adk/cmd/launcher\"\n\t\"google.golang.org/adk/cmd/launcher/full\"\n\t\"google.golang.org/adk/model/gemini\"\n\t\"google.golang.org/adk/telemetry\"\n\t\"google.golang.org/adk/tool\"\n\t\"google.golang.org/adk/tool/geminitool\"\n)\n\nfunc main() {\n\tif err := run(); err != nil {\n\t\tlog.Fatal(err)\n\t}\n}\n\nfunc run() error {\n\tctx := context.Background()\n\n\tmodel, err := gemini.NewModel(ctx, \"gemini-2.5-flash\", &genai.ClientConfig{\n\t\tAPIKey: os.Getenv(\"GOOGLE_API_KEY\"),\n\t})\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to create model: %w\", err)\n\t}\n\n\tcfg := llmagent.Config{\n\t\tName:        \"weather_time_agent\",\n\t\tModel:       model,\n\t\tDescription: \"Agent to answer questions about the time and weather in a city.\",\n\t\tInstruction: \"Your SOLE purpose is to answer questions about the current time and weather in a specific city. You MUST refuse to answer any questions unrelated to time or weather.\",\n\t\tTools: []tool.Tool{\n\t\t\tgeminitool.GoogleSearch{},\n\t\t},\n\t}\n\n\ta, err := llmagent.New(cfg)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to create agent: %w\", err)\n\t}\n\n\tr, err := resource.New(ctx, resource.WithAttributes(\n\t\tsemconv.ServiceNameKey.String(\"weather-time-agent\"),\n\t\tsemconv.ServiceVersionKey.String(\"1.0.0\"),\n\t))\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to create resource: %w\", err)\n\t}\n\tconfig := &launcher.Config{\n\t\tAgentLoader: agent.NewSingleLoader(a),\n\t\tTelemetryOptions: []telemetry.Option{\n\t\t\ttelemetry.WithResource(r),\n\t\t\t// Other telemetry options can be added here.\n\t\t},\n\t}\n\n\t// Launcher automatically starts the telemetry.\n\tl := full.NewLauncher()\n\tif err = l.Execute(ctx, config, os.Args[1:]); err != nil {\n\t\treturn fmt.Errorf(\"run failed: %v\\n\\n%s\", err, l.CommandLineSyntax())\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "examples/toolconfirmation/main.go",
    "content": "// Copyright 2026 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Package provides an example console app for tool confirmation.\n// The example shows requestVacationDays func which requires user confirmation. It uses ctx.ToolConfirmation() and ctx.RequestConfirmation() to define the confimation process.\n// This is the example for most advanced scenario which gives the full control how to define confirmation flow.\n// For simpler setup use `RequireConfirmation` or `RequireConfirmationProvider` in [functiontool.Config].\npackage main\n\nimport (\n\t\"bufio\"\n\t\"context\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"log\"\n\t\"os\"\n\t\"strconv\"\n\t\"strings\"\n\n\t\"google.golang.org/adk/agent\"\n\t\"google.golang.org/adk/agent/llmagent\"\n\t\"google.golang.org/adk/model\"\n\t\"google.golang.org/adk/model/gemini\"\n\t\"google.golang.org/adk/runner\"\n\t\"google.golang.org/adk/session\"\n\t\"google.golang.org/adk/tool\"\n\t\"google.golang.org/adk/tool/functiontool\"\n\t\"google.golang.org/adk/tool/toolconfirmation\"\n\n\t\"google.golang.org/genai\"\n)\n\n// RequestVacationArgs defines the arguments for our long-running tool.\ntype RequestVacationArgs struct {\n\tDays   int    `json:\"days\"`\n\tUserID string `json:\"user_id\"`\n}\n\ntype ConfirmationPayload struct {\n\tDaysApproved int `json:\"days_approved\"`\n}\n\n// RequestVacationResults defines the *initial* output of our long-running tool.\ntype RequestVacationResults struct {\n\tStatus       string `json:\"status\"`\n\tDaysApproved int    `json:\"days_approved\"`\n\tRequestID    string `json:\"request_id\"`\n}\n\ntype VacationRequest struct {\n\tID           string\n\tUserID       string\n\tDays         int\n\tStatus       string // PENDING, APPROVED, REJECTED\n\tCallID       string\n\tDaysApproved int\n\tConfirmation *toolconfirmation.ToolConfirmation\n}\n\nvar (\n\t// Stores the requests with a reqID key\n\trequestsByReqID = make(map[string]*VacationRequest)\n\t// Stores the requests with a callID key\n\trequestsByCallID = make(map[string]*VacationRequest)\n\trequestCounter   = 0\n)\n\nfunc main() {\n\tctx := context.Background()\n\n\tmodel, err := gemini.NewModel(ctx, \"gemini-2.5-flash\", &genai.ClientConfig{})\n\tif err != nil {\n\t\tlog.Fatalf(\"Failed to create model: %v\", err)\n\t}\n\n\tvacationAgent, err := createRequestVacationDaysAgent(model)\n\tif err != nil {\n\t\tlog.Fatalf(\"Failed to create vacation agent: %v\", err)\n\t}\n\n\tsessionService := session.InMemoryService()\n\tsession, err := sessionService.Create(ctx, &session.CreateRequest{AppName: appName, UserID: userID})\n\tif err != nil {\n\t\tlog.Fatalf(\"Failed to create session: %v\", err)\n\t}\n\n\treader := bufio.NewReader(os.Stdin)\n\n\tfor {\n\t\tfmt.Println(\"\\n--- Menu ---\")\n\t\tfmt.Println(\"1: Chat with LLM\")\n\t\tfmt.Println(\"2: Manage Vacation Requests\")\n\t\tfmt.Println(\"3: Exit\")\n\t\tfmt.Print(\"Choose an option: \")\n\n\t\tinput, err := reader.ReadString('\\n')\n\t\tif err != nil {\n\t\t\tfmt.Printf(\"Error reading input: %v\\n\", err)\n\t\t\treturn\n\t\t}\n\t\tinput = strings.TrimSpace(input)\n\n\t\tswitch input {\n\t\tcase \"1\":\n\t\t\trunChatSession(ctx, vacationAgent, sessionService, reader, session.Session.ID())\n\t\tcase \"2\":\n\t\t\trunVacationSession(ctx, vacationAgent, sessionService, reader, session.Session.ID())\n\t\tcase \"3\":\n\t\t\tfmt.Println(\"Exiting.\")\n\t\t\treturn\n\t\tdefault:\n\t\t\tfmt.Println(\"Invalid option. Please try again.\")\n\t\t}\n\t}\n}\n\n// requestVacationDays simulates the *initiation* of a long-running ticket creation task.\nfunc requestVacationDays(ctx tool.Context, args RequestVacationArgs) (*RequestVacationResults, error) {\n\tlog.Printf(\"TOOL_EXEC: 'requestVacationDays' called with days: %d for user %s (Call ID: %s)\\n\", args.Days, args.UserID, ctx.FunctionCallID())\n\n\tif args.Days <= 0 {\n\t\treturn nil, fmt.Errorf(\"invalid days to request %d\", args.Days)\n\t}\n\n\tconfirmation := ctx.ToolConfirmation()\n\tif confirmation == nil {\n\t\trequestID := fmt.Sprintf(\"req-%d\", requestCounter)\n\t\trequestCounter++\n\n\t\treq := &VacationRequest{\n\t\t\tID:     requestID,\n\t\t\tUserID: args.UserID,\n\t\t\tDays:   args.Days,\n\t\t\tStatus: \"PENDING\",\n\t\t}\n\n\t\t// Store the pending request\n\t\trequestsByReqID[requestID] = req\n\t\trequestsByCallID[ctx.FunctionCallID()] = req\n\n\t\terr := ctx.RequestConfirmation(\n\t\t\t\"Please approve or reject the tool call request_time_off() by responding with a FunctionResponse with an expected ToolConfirmation payload.\",\n\t\t\tConfirmationPayload{\n\t\t\t\tDaysApproved: 0,\n\t\t\t})\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\treturn &RequestVacationResults{\n\t\t\tStatus:    \"Manager approval is required.\",\n\t\t\tRequestID: requestID,\n\t\t}, nil\n\t}\n\n\t// This part normally wouldn't be reached in the first call\n\treq, ok := requestsByCallID[ctx.FunctionCallID()]\n\tif !ok {\n\t\treturn nil, fmt.Errorf(\"unable to get request using payload %s and function call id %s\", confirmation.Payload, ctx.FunctionCallID())\n\t}\n\treq.Confirmation = confirmation\n\tif confirmation.Confirmed {\n\t\tjsonBytes, err := json.Marshal(confirmation.Payload)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"error marshalling payload %s: %w\", confirmation.Payload, err)\n\t\t}\n\t\tvar payload ConfirmationPayload\n\t\tif err := json.Unmarshal(jsonBytes, &payload); err != nil {\n\t\t\treturn nil, fmt.Errorf(\"error unmarshalling payload %s: %w\", confirmation.Payload, err)\n\t\t}\n\t\tapprovedDays := min(payload.DaysApproved, args.Days)\n\t\treq.Status = \"APPROVED\"\n\t\treq.DaysApproved = payload.DaysApproved\n\t\trequestsByReqID[req.ID] = req // Update status\n\t\treturn &RequestVacationResults{\n\t\t\tStatus:       \"The time off request is accepted.\",\n\t\t\tDaysApproved: approvedDays,\n\t\t\tRequestID:    req.ID,\n\t\t}, nil\n\t} else {\n\t\treq.Status = \"REJECTED\"\n\t\trequestsByReqID[req.ID] = req // Update status\n\t\treq.DaysApproved = 0\n\t\treturn &RequestVacationResults{\n\t\t\tStatus:       \"The time off request is rejected.\",\n\t\t\tDaysApproved: 0,\n\t\t\tRequestID:    req.ID,\n\t\t}, nil\n\t}\n}\n\nfunc createRequestVacationDaysAgent(model model.LLM) (agent.Agent, error) {\n\tvacationTool, err := functiontool.New(\n\t\tfunctiontool.Config{\n\t\t\tName:        \"request_vacation_days\",\n\t\t\tDescription: \"Request vacation days for a user. Returns a request ID for tracking.\",\n\t\t},\n\t\trequestVacationDays,\n\t)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to create vacation tool: %w\", err)\n\t}\n\n\treturn llmagent.New(llmagent.Config{\n\t\tName:        \"vacation_agent\",\n\t\tModel:       model,\n\t\tInstruction: \"You are a helpful assistant for requesting vacation days. When a user asks for time off, call the request_vacation_days tool, making sure to include the user's ID.\",\n\t\tTools:       []tool.Tool{vacationTool},\n\t})\n}\n\nconst (\n\tuserID  = \"user\" // Default user for interactions\n\tappName = \"console_app\"\n)\n\n// runTurn executes a single turn with the agent.\nfunc runTurn(ctx context.Context, r *runner.Runner, sessionID string, content *genai.Content) {\n\tfmt.Printf(\"\\n--- Sending to Agent ---\\n\")\n\tfor event, err := range r.Run(ctx, userID, sessionID, content, agent.RunConfig{\n\t\tStreamingMode: agent.StreamingModeNone,\n\t}) {\n\t\tif err != nil {\n\t\t\tfmt.Printf(\"\\nAGENT_ERROR: %v\\n\", err)\n\t\t\tcontinue\n\t\t}\n\t\tprintEventSummary(event)\n\t\tif event.Content != nil {\n\t\t\tfor _, part := range event.Content.Parts {\n\t\t\t\tfc := part.FunctionCall\n\t\t\t\tif fc != nil && fc.Name == toolconfirmation.FunctionCallName {\n\t\t\t\t\toriginalFunctionCall, err := toolconfirmation.OriginalCallFrom(fc)\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\t\t\t\t\treq, ok := requestsByCallID[originalFunctionCall.ID]\n\t\t\t\t\tif !ok {\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\t\t\t\t\tfmt.Printf(\"Updating %s call id %s to %s\\n\", req.ID, req.CallID, fc.ID)\n\t\t\t\t\treq.CallID = fc.ID\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc runChatSession(ctx context.Context, chatAgent agent.Agent, sessionService session.Service, reader *bufio.Reader, sessionID string) {\n\tfmt.Println(\"\\n--- LLM Chat Mode ---\")\n\tfmt.Println(\"Type 'back' to return to the main menu.\")\n\n\tr, err := runner.New(runner.Config{AppName: appName, Agent: chatAgent, SessionService: sessionService})\n\tif err != nil {\n\t\tlog.Fatalf(\"Failed to create runner: %v\", err)\n\t}\n\n\tfor {\n\t\tfmt.Print(\"You: \")\n\t\tuserInput, _ := reader.ReadString('\\n')\n\t\tuserInput = strings.TrimSpace(userInput)\n\n\t\tif strings.ToLower(userInput) == \"back\" {\n\t\t\tbreak\n\t\t}\n\n\t\tif userInput != \"\" {\n\t\t\tuserMessage := genai.NewContentFromText(userInput, genai.RoleUser)\n\t\t\trunTurn(ctx, r, sessionID, userMessage)\n\t\t}\n\t}\n\tfmt.Println(\"Exiting LLM Chat Mode.\")\n}\n\nfunc runVacationSession(ctx context.Context, vacationAgent agent.Agent, sessionService session.Service, reader *bufio.Reader, sessionID string) {\n\tfmt.Println(\"\\n--- Vacation Request Mode ---\")\n\tfmt.Println(\"Type 'back' to return to the main menu.\")\n\tfmt.Println(\"Commands: 'approve <ID>', 'reject <ID>'\")\n\tdisplayVacationRequests()\n\n\tr, err := runner.New(runner.Config{AppName: appName, Agent: vacationAgent, SessionService: sessionService})\n\tif err != nil {\n\t\tlog.Fatalf(\"Failed to create runner: %v\", err)\n\t}\n\n\tfor {\n\t\tfmt.Print(\"Vacation Command: \")\n\t\tuserInput, _ := reader.ReadString('\\n')\n\t\tuserInput = strings.TrimSpace(userInput)\n\t\tinputLower := strings.ToLower(userInput)\n\n\t\tif inputLower == \"back\" {\n\t\t\tbreak\n\t\t}\n\n\t\tif after, ok := strings.CutPrefix(inputLower, \"approve \"); ok {\n\t\t\trequestID := strings.TrimSpace(after)\n\t\t\tprocessApproval(ctx, r, sessionID, requestID, true, reader)\n\t\t} else if after, ok := strings.CutPrefix(inputLower, \"reject \"); ok {\n\t\t\trequestID := strings.TrimSpace(after)\n\t\t\tprocessApproval(ctx, r, sessionID, requestID, false, reader)\n\t\t} else if userInput != \"\" {\n\t\t\t// Allow free text to interact with the vacation agent\n\t\t\tuserMessage := genai.NewContentFromText(userInput, genai.RoleUser)\n\t\t\trunTurn(ctx, r, sessionID, userMessage)\n\t\t}\n\t}\n\tfmt.Println(\"Exiting Vacation Request Mode.\")\n}\n\nfunc displayVacationRequests() {\n\tfmt.Println(\"\\n--- Pending Vacation Requests ---\")\n\tif len(requestsByReqID) == 0 {\n\t\tfmt.Println(\"No pending requests.\")\n\t\treturn\n\t}\n\tfor _, req := range requestsByReqID {\n\t\tfmt.Printf(\"ID: %s, Call ID: %s, User: %s, Days: %d, Status: %s, Days Approved: %d\\n\", req.ID, req.CallID, req.UserID, req.Days, req.Status, req.DaysApproved)\n\t}\n\tfmt.Println(\"-------------------------------\")\n}\n\nfunc processApproval(ctx context.Context, r *runner.Runner, sessionID, requestID string, approved bool, reader *bufio.Reader) {\n\treq, exists := requestsByReqID[requestID]\n\tif !exists || req.Status != \"PENDING\" {\n\t\tfmt.Printf(\"Request ID %s not found or not pending.\\n\", requestID)\n\t\treturn\n\t}\n\n\tdaysApproved := 0\n\tif approved {\n\t\tfmt.Printf(\"How many days to approve for %s (requested %d)? \", requestID, req.Days)\n\t\tdaysInput, _ := reader.ReadString('\\n')\n\t\tdays, err := strconv.Atoi(strings.TrimSpace(daysInput))\n\t\tif err != nil || days < 0 || days > req.Days {\n\t\t\tfmt.Println(\"Invalid number of days. Approval cancelled.\")\n\t\t\treturn\n\t\t}\n\t\tdaysApproved = days\n\t\tfmt.Printf(\"Approving %d days for request %s.\\n\", daysApproved, requestID)\n\t} else {\n\t\tfmt.Printf(\"Rejecting request %s.\\n\", requestID)\n\t}\n\n\tpayload := ConfirmationPayload{DaysApproved: daysApproved}\n\tfuncResponse := &genai.FunctionResponse{\n\t\tName: toolconfirmation.FunctionCallName,\n\t\tID:   req.CallID,\n\t\tResponse: map[string]any{\n\t\t\t\"confirmed\": approved,\n\t\t\t\"payload\":   payload,\n\t\t},\n\t}\n\n\tappResponse := &genai.Content{\n\t\tRole:  string(genai.RoleUser), // Response comes from the app/user\n\t\tParts: []*genai.Part{{FunctionResponse: funcResponse}},\n\t}\n\trunTurn(ctx, r, sessionID, appResponse)\n\n\tfmt.Println(\"Processing complete.\")\n\tdisplayVacationRequests()\n}\n\n// printEventSummary provides a readable log of agent and LLM interactions.\nfunc printEventSummary(event *session.Event) {\n\tif event.LLMResponse.Content != nil {\n\t\tfor _, part := range event.LLMResponse.Content.Parts {\n\t\t\tauthor := event.Author\n\t\t\tif author == \"\" {\n\t\t\t\tauthor = \"AGENT\"\n\t\t\t}\n\t\t\t// Check for a text part.\n\t\t\tif part.Text != \"\" {\n\t\t\t\tfmt.Printf(\"[%s_TEXT]: %s\\n\", author, part.Text)\n\t\t\t}\n\t\t\t// Check for a function call part.\n\t\t\tif fc := part.FunctionCall; fc != nil {\n\t\t\t\tfmt.Printf(\"[%s_CALL]: %s(%v) Call ID: %s\\n\", author, fc.Name, fc.Args, fc.ID)\n\t\t\t}\n\t\t\t// Check for a function response part.\n\t\t\tif fr := part.FunctionResponse; fr != nil {\n\t\t\t\tfmt.Printf(\"[%s_RESPONSE]: %s(%v) Call ID: %s\\n\", author, fr.Name, fr.Response, fr.ID)\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "examples/tools/loadartifacts/main.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Package provides an example ADK agent that loads and describes artifacts.\npackage main\n\nimport (\n\t\"bufio\"\n\t\"context\"\n\t\"fmt\"\n\t\"log\"\n\t\"os\"\n\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/agent\"\n\t\"google.golang.org/adk/agent/llmagent\"\n\t\"google.golang.org/adk/artifact\"\n\t\"google.golang.org/adk/model/gemini\"\n\t\"google.golang.org/adk/runner\"\n\t\"google.golang.org/adk/session\"\n\t\"google.golang.org/adk/tool\"\n\t\"google.golang.org/adk/tool/loadartifactstool\"\n)\n\n// Note: you need to run the program from the loadartifacts directory\n// to fetch the image successfully.\nfunc main() {\n\tctx := context.Background()\n\n\tmodel, err := gemini.NewModel(ctx, \"gemini-2.5-flash\", &genai.ClientConfig{\n\t\tAPIKey: os.Getenv(\"GOOGLE_API_KEY\"),\n\t})\n\tif err != nil {\n\t\tlog.Fatalf(\"Failed to create model: %v\", err)\n\t}\n\n\tllmagent, err := llmagent.New(llmagent.Config{\n\t\tName:        \"artifact_describer\",\n\t\tModel:       model,\n\t\tDescription: \"Agent to answer questions about artifacts.\",\n\t\tInstruction: \"When user asks about the artifact, load them and describe them.\",\n\t\tTools: []tool.Tool{\n\t\t\tloadartifactstool.New(),\n\t\t},\n\t})\n\tif err != nil {\n\t\tlog.Fatalf(\"Failed to create agent: %v\", err)\n\t}\n\n\tuserID, appName := \"test_user\", \"test_app\"\n\tsessionService := session.InMemoryService()\n\t// Create session.\n\tresp, err := sessionService.Create(ctx, &session.CreateRequest{\n\t\tAppName: appName,\n\t\tUserID:  userID,\n\t})\n\tif err != nil {\n\t\tlog.Fatalf(\"Failed to create the session service: %v\", err)\n\t}\n\n\tsession := resp.Session\n\tartifactService := artifact.InMemoryService()\n\t// Populate artifacts that can be described later.\n\timageBytes, err := os.ReadFile(\"animal_picture.png\")\n\tif err != nil {\n\t\tlog.Fatalf(\"Failed to read image file: %v\", err)\n\t}\n\tgenai.NewPartFromBytes(imageBytes, \"image/png\")\n\n\t_, err = artifactService.Save(ctx, &artifact.SaveRequest{\n\t\tAppName:   appName,\n\t\tUserID:    userID,\n\t\tSessionID: session.ID(),\n\t\tFileName:  \"animal_picture.png\",\n\t\tPart:      genai.NewPartFromBytes(imageBytes, \"image/png\"),\n\t})\n\tif err != nil {\n\t\tlog.Fatalf(\"Failed to save artifact: %v\", err)\n\t}\n\n\t_, err = artifactService.Save(ctx, &artifact.SaveRequest{\n\t\tAppName:   appName,\n\t\tUserID:    userID,\n\t\tSessionID: session.ID(),\n\t\tFileName:  \"haiku.txt\",\n\t\tPart: genai.NewPartFromText(\n\t\t\t\"An old silent pond...\" +\n\t\t\t\t\"A frog jumps into the pond,\" +\n\t\t\t\t\"splash! Silence again.\"),\n\t})\n\tif err != nil {\n\t\tlog.Fatalf(\"Failed to save artifact: %v\", err)\n\t}\n\n\tr, err := runner.New(runner.Config{\n\t\tAppName:         appName,\n\t\tAgent:           llmagent,\n\t\tSessionService:  sessionService,\n\t\tArtifactService: artifactService,\n\t})\n\tif err != nil {\n\t\tlog.Fatalf(\"Failed to create runner: %v\", err)\n\t}\n\n\treader := bufio.NewReader(os.Stdin)\n\tfor {\n\t\tfmt.Print(\"\\nUser -> \")\n\n\t\tuserInput, err := reader.ReadString('\\n')\n\t\tif err != nil {\n\t\t\tlog.Fatal(err)\n\t\t}\n\n\t\tuserMsg := genai.NewContentFromText(userInput, genai.RoleUser)\n\n\t\tfmt.Print(\"\\nAgent -> \")\n\t\tstreamingMode := agent.StreamingModeSSE\n\t\tfor event, err := range r.Run(ctx, userID, session.ID(), userMsg, agent.RunConfig{\n\t\t\tStreamingMode: streamingMode,\n\t\t}) {\n\t\t\tif err != nil {\n\t\t\t\tfmt.Printf(\"\\nAGENT_ERROR: %v\\n\", err)\n\t\t\t} else {\n\t\t\t\tif event.LLMResponse.Content == nil {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tfor _, p := range event.LLMResponse.Content.Parts {\n\t\t\t\t\t// if its running in streaming mode, don't print the non partial llmResponses\n\t\t\t\t\tif streamingMode != agent.StreamingModeSSE || event.LLMResponse.Partial {\n\t\t\t\t\t\tfmt.Print(p.Text)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "examples/tools/loadmemory/main.go",
    "content": "// Copyright 2026 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Package main provides an example ADK agent that uses the load_memory and\n// preload_memory tools to retrieve memories from previous conversations.\npackage main\n\nimport (\n\t\"bufio\"\n\t\"context\"\n\t\"fmt\"\n\t\"log\"\n\t\"os\"\n\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/agent\"\n\t\"google.golang.org/adk/agent/llmagent\"\n\t\"google.golang.org/adk/memory\"\n\t\"google.golang.org/adk/model\"\n\t\"google.golang.org/adk/model/gemini\"\n\t\"google.golang.org/adk/runner\"\n\t\"google.golang.org/adk/session\"\n\t\"google.golang.org/adk/tool\"\n\t\"google.golang.org/adk/tool/loadmemorytool\"\n\t\"google.golang.org/adk/tool/preloadmemorytool\"\n)\n\nfunc main() {\n\tctx := context.Background()\n\n\tmodel, err := gemini.NewModel(ctx, \"gemini-2.5-flash\", &genai.ClientConfig{\n\t\tAPIKey: os.Getenv(\"GOOGLE_API_KEY\"),\n\t})\n\tif err != nil {\n\t\tlog.Fatalf(\"Failed to create model: %v\", err)\n\t}\n\n\tllmAgent, err := llmagent.New(llmagent.Config{\n\t\tName:        \"memory_assistant\",\n\t\tModel:       model,\n\t\tDescription: \"Agent that can recall information from memory.\",\n\t\tInstruction: \"You are a helpful assistant with access to memory. \" +\n\t\t\t\"Relevant memory may be preloaded automatically for each request. \" +\n\t\t\t\"If the preloaded context is not enough, use the load_memory tool \" +\n\t\t\t\"to search for additional relevant information. \" +\n\t\t\t\"If you find relevant memories, use them to provide informed responses.\",\n\t\tTools: []tool.Tool{\n\t\t\tpreloadmemorytool.New(),\n\t\t\tloadmemorytool.New(),\n\t\t},\n\t})\n\tif err != nil {\n\t\tlog.Fatalf(\"Failed to create agent: %v\", err)\n\t}\n\n\tuserID, appName := \"test_user\", \"memory_app\"\n\tsessionService := session.InMemoryService()\n\tmemoryService := memory.InMemoryService()\n\n\t// Create a previous session with some conversation history to populate memory.\n\tpreviousSession, err := createPreviousSessionWithHistory(ctx, sessionService, appName, userID)\n\tif err != nil {\n\t\tlog.Fatalf(\"Failed to create previous session: %v\", err)\n\t}\n\n\t// Add the previous session to memory so it can be searched.\n\tif err := memoryService.AddSessionToMemory(ctx, previousSession); err != nil {\n\t\tlog.Fatalf(\"Failed to add session to memory: %v\", err)\n\t}\n\n\tfmt.Println(\"Memory populated with previous conversation about a trip to Tokyo.\")\n\tfmt.Println(\"Memories will be preloaded automatically for each request.\")\n\tfmt.Println(\"Try asking: 'What do you remember about my trip?'\")\n\n\t// Create a new session for the current conversation.\n\tresp, err := sessionService.Create(ctx, &session.CreateRequest{\n\t\tAppName: appName,\n\t\tUserID:  userID,\n\t})\n\tif err != nil {\n\t\tlog.Fatalf(\"Failed to create session: %v\", err)\n\t}\n\tcurrentSession := resp.Session\n\n\tr, err := runner.New(runner.Config{\n\t\tAppName:        appName,\n\t\tAgent:          llmAgent,\n\t\tSessionService: sessionService,\n\t\tMemoryService:  memoryService,\n\t})\n\tif err != nil {\n\t\tlog.Fatalf(\"Failed to create runner: %v\", err)\n\t}\n\n\treader := bufio.NewReader(os.Stdin)\n\tfor {\n\t\tfmt.Print(\"\\nUser -> \")\n\n\t\tuserInput, err := reader.ReadString('\\n')\n\t\tif err != nil {\n\t\t\tlog.Fatal(err)\n\t\t}\n\n\t\tuserMsg := genai.NewContentFromText(userInput, genai.RoleUser)\n\n\t\tfmt.Print(\"\\nAgent -> \")\n\t\tstreamingMode := agent.StreamingModeSSE\n\t\tfor event, err := range r.Run(ctx, userID, currentSession.ID(), userMsg, agent.RunConfig{\n\t\t\tStreamingMode: streamingMode,\n\t\t}) {\n\t\t\tif err != nil {\n\t\t\t\tfmt.Printf(\"\\nAGENT_ERROR: %v\\n\", err)\n\t\t\t} else {\n\t\t\t\tif event.LLMResponse.Content == nil {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tfor _, p := range event.LLMResponse.Content.Parts {\n\t\t\t\t\t// If running in streaming mode, only print partial responses.\n\t\t\t\t\tif streamingMode != agent.StreamingModeSSE || event.LLMResponse.Partial {\n\t\t\t\t\t\tfmt.Print(p.Text)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\n// createPreviousSessionWithHistory creates a session with pre-populated\n// conversation history that will be added to memory.\nfunc createPreviousSessionWithHistory(\n\tctx context.Context,\n\tsessionService session.Service,\n\tappName, userID string,\n) (session.Session, error) {\n\tresp, err := sessionService.Create(ctx, &session.CreateRequest{\n\t\tAppName: appName,\n\t\tUserID:  userID,\n\t})\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to create session: %w\", err)\n\t}\n\n\ts := resp.Session\n\n\t// Add some conversation history about a trip to Tokyo.\n\tevents := []struct {\n\t\tauthor  string\n\t\tcontent string\n\t}{\n\t\t{\"user\", \"I just got back from an amazing trip to Tokyo!\"},\n\t\t{\"model\", \"That sounds wonderful! Tokyo is such a vibrant city. What were the highlights of your trip?\"},\n\t\t{\"user\", \"I visited the Senso-ji temple in Asakusa, it was beautiful. I also tried authentic ramen at a small shop in Shinjuku.\"},\n\t\t{\"model\", \"Senso-ji is one of Tokyo's oldest and most significant temples. The ramen in Shinjuku is legendary! Did you try any other Japanese cuisine?\"},\n\t\t{\"user\", \"Yes! I had sushi at Tsukiji outer market and tried takoyaki in Shibuya. The food was incredible.\"},\n\t\t{\"model\", \"You really experienced the best of Tokyo's food scene! Tsukiji is famous for its fresh seafood. Did you get to see any other sights?\"},\n\t\t{\"user\", \"I went to the top of Tokyo Skytree and saw Mount Fuji in the distance. The view was breathtaking.\"},\n\t\t{\"model\", \"Seeing Mount Fuji from Tokyo Skytree is a special experience, especially on a clear day. It sounds like you had an unforgettable trip!\"},\n\t}\n\n\tfor _, e := range events {\n\t\tevent := session.NewEvent(\"previous-session\")\n\t\tevent.Author = e.author\n\t\tevent.LLMResponse = model.LLMResponse{\n\t\t\tContent: genai.NewContentFromText(e.content, genai.Role(e.author)),\n\t\t}\n\t\tif err := sessionService.AppendEvent(ctx, s, event); err != nil {\n\t\t\treturn nil, fmt.Errorf(\"failed to append event: %w\", err)\n\t\t}\n\t}\n\n\treturn s, nil\n}\n"
  },
  {
    "path": "examples/tools/multipletools/main.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Package demonstrates a workaround for using Google Search tool with other tools.\npackage main\n\nimport (\n\t\"context\"\n\t\"log\"\n\t\"os\"\n\t\"strings\"\n\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/agent\"\n\t\"google.golang.org/adk/agent/llmagent\"\n\t\"google.golang.org/adk/cmd/launcher\"\n\t\"google.golang.org/adk/cmd/launcher/full\"\n\t\"google.golang.org/adk/model/gemini\"\n\t\"google.golang.org/adk/telemetry\"\n\t\"google.golang.org/adk/tool\"\n\t\"google.golang.org/adk/tool/agenttool\"\n\t\"google.golang.org/adk/tool/functiontool\"\n\t\"google.golang.org/adk/tool/geminitool\"\n)\n\n// Package main demonstrates a workaround for using multiple tool types (e.g.,\n// Google Search and custom functions) in a single agent. This is necessary\n// due to limitations in the genai API. The approach is to wrap agents with\n// different tool types into sub-agents, which are then managed by a root agent.\nfunc main() {\n\tctx := context.Background()\n\n\tmodel, err := gemini.NewModel(ctx, \"gemini-2.5-flash\", &genai.ClientConfig{\n\t\tAPIKey: os.Getenv(\"GOOGLE_API_KEY\"),\n\t})\n\tif err != nil {\n\t\tlog.Fatalf(\"Failed to create model: %v\", err)\n\t}\n\n\tsearchAgent, err := llmagent.New(llmagent.Config{\n\t\tName:        \"search_agent\",\n\t\tModel:       model,\n\t\tDescription: \"Does google search.\",\n\t\tInstruction: \"You're a specialist in Google Search.\",\n\t\tTools: []tool.Tool{\n\t\t\tgeminitool.GoogleSearch{},\n\t\t},\n\t})\n\tif err != nil {\n\t\tlog.Fatalf(\"Failed to create agent: %v\", err)\n\t}\n\n\ttype Input struct {\n\t\tLineCount int `json:\"lineCount\"`\n\t}\n\ttype Output struct {\n\t\tPoem string `json:\"poem\"`\n\t}\n\thandler := func(ctx tool.Context, input Input) (Output, error) {\n\t\treturn Output{\n\t\t\tPoem: strings.Repeat(\"A line of a poem,\", input.LineCount) + \"\\n\",\n\t\t}, nil\n\t}\n\tpoemTool, err := functiontool.New(functiontool.Config{\n\t\tName:        \"poem\",\n\t\tDescription: \"Returns poem\",\n\t}, handler)\n\tif err != nil {\n\t\tlog.Fatalf(\"Failed to create tool: %v\", err)\n\t}\n\tpoemAgent, err := llmagent.New(llmagent.Config{\n\t\tName:        \"poem_agent\",\n\t\tModel:       model,\n\t\tDescription: \"returns poem\",\n\t\tInstruction: \"You return poems.\",\n\t\tTools: []tool.Tool{\n\t\t\tpoemTool,\n\t\t},\n\t})\n\tif err != nil {\n\t\tlog.Fatalf(\"Failed to create agent: %v\", err)\n\t}\n\n\ta, err := llmagent.New(llmagent.Config{\n\t\tName:        \"root_agent\",\n\t\tModel:       model,\n\t\tDescription: \"You can do a google search and generate poems.\",\n\t\tInstruction: \"Answer questions about weather based on google search unless asked for a poem,\" +\n\t\t\t\" for a poem generate it with a tool.\",\n\t\tTools: []tool.Tool{\n\t\t\tagenttool.New(searchAgent, nil), agenttool.New(poemAgent, nil),\n\t\t},\n\t})\n\tif err != nil {\n\t\tlog.Fatalf(\"Failed to create agent: %v\", err)\n\t}\n\n\tconfig := &launcher.Config{\n\t\tAgentLoader: agent.NewSingleLoader(a),\n\t\tTelemetryOptions: []telemetry.Option{\n\t\t\ttelemetry.WithGenAICaptureMessageContent(true),\n\t\t},\n\t}\n\n\tl := full.NewLauncher()\n\tif err = l.Execute(ctx, config, os.Args[1:]); err != nil {\n\t\tlog.Fatalf(\"Run failed: %v\\n\\n%s\", err, l.CommandLineSyntax())\n\t}\n}\n"
  },
  {
    "path": "examples/vertexai/agent.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\t\"log\"\n\t\"os\"\n\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/agent\"\n\t\"google.golang.org/adk/agent/llmagent\"\n\t\"google.golang.org/adk/cmd/launcher\"\n\t\"google.golang.org/adk/cmd/launcher/full\"\n\t\"google.golang.org/adk/model/gemini\"\n\t\"google.golang.org/adk/session/vertexai\"\n\t\"google.golang.org/adk/tool\"\n\t\"google.golang.org/adk/tool/geminitool\"\n)\n\nconst (\n\tmodelName = \"gemini-2.5-flash\"\n)\n\nfunc main() {\n\tctx := context.Background()\n\n\tprojectID := os.Getenv(\"GOOGLE_CLOUD_PROJECT\")\n\tif projectID == \"\" {\n\t\tlog.Fatalf(\"Env var GOOGLE_CLOUD_PROJECT is not set\")\n\t}\n\tlocation := os.Getenv(\"GOOGLE_CLOUD_LOCATION\")\n\tif location == \"\" {\n\t\tlog.Fatalf(\"Env var GOOGLE_CLOUD_LOCATION is not set\")\n\t}\n\tengineID := os.Getenv(\"VERTEX_ENGINE_ID\")\n\tif engineID == \"\" {\n\t\tlog.Fatalf(\"Env var VERTEX_ENGINE_ID is not set\")\n\t}\n\n\trootAgent, err := createAgent()\n\tif err != nil {\n\t\tlog.Fatalf(\"Failed to create agent: %v\", err)\n\t}\n\tsrvs, err := vertexai.NewSessionService(ctx, vertexai.VertexAIServiceConfig{\n\t\tLocation:        location,\n\t\tProjectID:       projectID,\n\t\tReasoningEngine: engineID,\n\t})\n\tif err != nil {\n\t\tlog.Fatalf(\"Failed to create session service: %v\", err)\n\t}\n\n\tconfig := &launcher.Config{\n\t\tSessionService: srvs,\n\t\tAgentLoader:    agent.NewSingleLoader(rootAgent),\n\t}\n\n\tl := full.NewLauncher()\n\terr = l.Execute(ctx, config, os.Args[1:])\n\tif err != nil {\n\t\tlog.Fatalf(\"run failed: %v\\n\\n%s\", err, l.CommandLineSyntax())\n\t}\n}\n\nfunc createAgent() (agent.Agent, error) {\n\tctx := context.Background()\n\n\tmodel, err := gemini.NewModel(ctx, modelName, &genai.ClientConfig{})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tagent, err := llmagent.New(llmagent.Config{\n\t\tName:        \"weather_time_agent\",\n\t\tModel:       model,\n\t\tDescription: \"Agent to answer questions about the time and weather in a city.\",\n\t\tInstruction: \"I can answer your questions about the time and weather in a city.\",\n\t\tTools: []tool.Tool{\n\t\t\tgeminitool.GoogleSearch{},\n\t\t},\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn agent, nil\n}\n"
  },
  {
    "path": "examples/vertexai/imagegenerator/main.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Package main demonstrates how to create an agent that can generate images\n// using Vertex AI's Imagen model, save them as artifacts, and then save them\n// to the local filesystem.\npackage main\n\nimport (\n\t\"context\"\n\t\"log\"\n\t\"os\"\n\t\"path/filepath\"\n\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/agent\"\n\t\"google.golang.org/adk/agent/llmagent\"\n\t\"google.golang.org/adk/artifact\"\n\t\"google.golang.org/adk/cmd/launcher\"\n\t\"google.golang.org/adk/cmd/launcher/full\"\n\t\"google.golang.org/adk/model/gemini\"\n\t\"google.golang.org/adk/tool\"\n\t\"google.golang.org/adk/tool/functiontool\"\n\t\"google.golang.org/adk/tool/loadartifactstool\"\n)\n\nfunc main() {\n\tctx := context.Background()\n\n\tmodel, err := gemini.NewModel(ctx, \"gemini-2.0-flash-001\", nil)\n\tif err != nil {\n\t\tlog.Fatalf(\"Failed to create model: %v\", err)\n\t}\n\n\tgenerateImageTool, err := functiontool.New(\n\t\tfunctiontool.Config{\n\t\t\tName:        \"generate_image\",\n\t\t\tDescription: \"Generates image and saves in artifact service.\",\n\t\t},\n\t\tgenerateImage)\n\tif err != nil {\n\t\tlog.Fatalf(\"Failed to create generate image tool: %v\", err)\n\t}\n\n\tsaveImageTool, err := functiontool.New(\n\t\tfunctiontool.Config{\n\t\t\tName:        \"save_image_locally\",\n\t\t\tDescription: \"Saves images locally based on the filename.\",\n\t\t},\n\t\tsaveImage)\n\tif err != nil {\n\t\tlog.Fatalf(\"Failed to create generate image tool: %v\", err)\n\t}\n\n\ta, err := llmagent.New(llmagent.Config{\n\t\tName:        \"image_generator\",\n\t\tModel:       model,\n\t\tDescription: \"Agent to generate pictures, answers questions about it and saves it locally if asked.\",\n\t\tInstruction: \"You are an agent whose job is to generate an image, describe it and save it locally if asked.\" +\n\t\t\t\" Also user will provide the filename and you should save it in the artifacts with that filename.\" +\n\t\t\t\" When user ask to save image locally you can call save_image_locally to do it.\",\n\t\tTools: []tool.Tool{\n\t\t\tloadartifactstool.New(), generateImageTool, saveImageTool,\n\t\t},\n\t})\n\tif err != nil {\n\t\tlog.Fatalf(\"Failed to create agent: %v\", err)\n\t}\n\n\tconfig := &launcher.Config{\n\t\tArtifactService: artifact.InMemoryService(),\n\t\tAgentLoader:     agent.NewSingleLoader(a),\n\t}\n\n\tl := full.NewLauncher()\n\tif err = l.Execute(ctx, config, os.Args[1:]); err != nil {\n\t\tlog.Fatalf(\"Run failed: %v\\n\\n%s\", err, l.CommandLineSyntax())\n\t}\n}\n\n// This is a function tool to generate images using Vertex AI's Imagen model.\nfunc generateImage(ctx tool.Context, input generateImageInput) (generateImageResult, error) {\n\tclient, err := genai.NewClient(ctx, &genai.ClientConfig{\n\t\tProject:  os.Getenv(\"GOOGLE_CLOUD_PROJECT\"),\n\t\tLocation: os.Getenv(\"GOOGLE_CLOUD_LOCATION\"),\n\t\tBackend:  genai.BackendVertexAI,\n\t})\n\tif err != nil {\n\t\treturn generateImageResult{}, err\n\t}\n\n\tresponse, err := client.Models.GenerateImages(\n\t\tctx,\n\t\t\"imagen-3.0-generate-002\",\n\t\tinput.Prompt,\n\t\t&genai.GenerateImagesConfig{NumberOfImages: 1})\n\tif err != nil {\n\t\treturn generateImageResult{}, err\n\t}\n\n\t_, err = ctx.Artifacts().Save(ctx, input.Filename, genai.NewPartFromBytes(response.GeneratedImages[0].Image.ImageBytes, \"image/png\"))\n\tif err != nil {\n\t\treturn generateImageResult{}, err\n\t}\n\treturn generateImageResult{Filename: input.Filename, Status: \"success\"}, nil\n}\n\ntype generateImageInput struct {\n\tPrompt   string `json:\"prompt\"`\n\tFilename string `json:\"filename\"`\n}\n\ntype generateImageResult struct {\n\tFilename string `json:\"filename\"`\n\tStatus   string `json:\"Status\"`\n}\n\n// This is function tool that loads image from the artifacts service and\n// saves is to the local filesystem.\nfunc saveImage(ctx tool.Context, input saveImageInput) (saveImageResult, error) {\n\tfilename := input.Filename\n\tresp, err := ctx.Artifacts().Load(ctx, filename)\n\tif err != nil {\n\t\tlog.Printf(\"Failed to load artifact '%s': %v\", filename, err)\n\t\treturn saveImageResult{}, err\n\t}\n\n\tif resp.Part.InlineData == nil || len(resp.Part.InlineData.Data) == 0 {\n\t\tlog.Printf(\"Artifact '%s' has no inline data\", filename)\n\t\treturn saveImageResult{}, err\n\t}\n\n\t// Ensure the filename has a .png extension for the local file.\n\tlocalFilename := filename\n\tif filepath.Ext(localFilename) != \".png\" {\n\t\tlocalFilename += \".png\"\n\t}\n\n\t// Create an \"output\" directory in the current working directory if it doesn't exist.\n\toutputDir := \"output\"\n\tif err := os.MkdirAll(outputDir, 0o755); err != nil {\n\t\tlog.Printf(\"Failed to create output directory '%s': %v\", outputDir, err)\n\t\treturn saveImageResult{}, err\n\t}\n\n\tlocalPath := filepath.Join(outputDir, localFilename)\n\terr = os.WriteFile(localPath, resp.Part.InlineData.Data, 0o644)\n\tif err != nil {\n\t\tlog.Printf(\"Failed to write image to local file '%s': %v\", localPath, err)\n\t\treturn saveImageResult{}, err\n\t}\n\n\tlog.Printf(\"Successfully saved image to %s\", localPath)\n\treturn saveImageResult{Status: \"success\"}, nil\n}\n\ntype saveImageInput struct {\n\tFilename string `json:\"filename\"`\n}\n\ntype saveImageResult struct {\n\tStatus string `json:\"Status\"`\n}\n"
  },
  {
    "path": "examples/vertexai/vertexengine/create_engine.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"log\"\n\t\"os\"\n\n\taiplatform \"cloud.google.com/go/aiplatform/apiv1\"\n\t\"cloud.google.com/go/aiplatform/apiv1/aiplatformpb\"\n\t\"google.golang.org/api/option\"\n)\n\n// main defines an example of how to initialize a vertex ai reasoning engine\nfunc main() {\n\tctx := context.Background()\n\tprojectID := os.Getenv(\"GOOGLE_CLOUD_PROJECT\")\n\tif projectID == \"\" {\n\t\tlog.Fatalf(\"Env var GOOGLE_CLOUD_PROJECT is not set\")\n\t}\n\tlocation := os.Getenv(\"GOOGLE_CLOUD_LOCATION\")\n\tif location == \"\" {\n\t\tlog.Fatalf(\"Env var GOOGLE_CLOUD_LOCATION is not set\")\n\t}\n\n\terr := createReasoningEngine(ctx, projectID, location, \"adk-go\", \"A reasoning engine created by an adk go sample\")\n\tif err != nil {\n\t\tlog.Fatalf(\"Failed to create reasoning engine: %v\", err)\n\t}\n}\n\nfunc createReasoningEngine(ctx context.Context, projectID, location, displayName, description string) error {\n\t// Construct the parent resource name\n\tparent := fmt.Sprintf(\"projects/%s/locations/%s\", projectID, location)\n\n\t// Construct the regional endpoint\n\tendpoint := fmt.Sprintf(\"%s-aiplatform.googleapis.com:443\", location)\n\n\t// Create the client\n\tclient, err := aiplatform.NewReasoningEngineClient(ctx, option.WithEndpoint(endpoint))\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to create ReasoningEngineClient: %w\", err)\n\t}\n\tdefer func() {\n\t\tif err := client.Close(); err != nil {\n\t\t\tlog.Printf(\"Warning: failed to close client: %v\", err)\n\t\t}\n\t}()\n\n\t// Define the ReasoningEngine object\n\treasoningEngine := &aiplatformpb.ReasoningEngine{\n\t\tDisplayName: displayName,\n\t\tDescription: description,\n\t}\n\n\t// Create the request\n\treq := &aiplatformpb.CreateReasoningEngineRequest{\n\t\tParent:          parent,\n\t\tReasoningEngine: reasoningEngine,\n\t}\n\n\t// Call the CreateReasoningEngine method\n\top, err := client.CreateReasoningEngine(ctx, req)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to call CreateReasoningEngine: %w\", err)\n\t}\n\n\t// Wait for the long-running operation to complete\n\tresp, err := op.Wait(ctx)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to wait for operation: %w\", err)\n\t}\n\n\tfmt.Printf(\"Successfully created ReasoningEngine: %s\\n\", resp.Name)\n\treturn nil\n}\n"
  },
  {
    "path": "examples/web/agents/image_generator.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Package agents contains sample agents to demonstate ADK Web Capabilities.\npackage agents\n\nimport (\n\t\"context\"\n\t\"log\"\n\t\"os\"\n\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/agent\"\n\t\"google.golang.org/adk/agent/llmagent\"\n\t\"google.golang.org/adk/model\"\n\t\"google.golang.org/adk/tool\"\n\t\"google.golang.org/adk/tool/functiontool\"\n\t\"google.golang.org/adk/tool/loadartifactstool\"\n)\n\nfunc generateImage(ctx tool.Context, input generateImageInput) (generateImageResult, error) {\n\tclient, err := genai.NewClient(ctx, &genai.ClientConfig{\n\t\tProject:  os.Getenv(\"GOOGLE_CLOUD_PROJECT\"),\n\t\tLocation: os.Getenv(\"GOOGLE_CLOUD_LOCATION\"),\n\t\tBackend:  genai.BackendVertexAI,\n\t})\n\tif err != nil {\n\t\treturn generateImageResult{\n\t\t\tStatus: \"fail\",\n\t\t}, nil\n\t}\n\n\tresponse, err := client.Models.GenerateImages(\n\t\tctx,\n\t\t\"imagen-3.0-generate-002\",\n\t\tinput.Prompt,\n\t\t&genai.GenerateImagesConfig{NumberOfImages: 1})\n\tif err != nil {\n\t\treturn generateImageResult{\n\t\t\tStatus: \"fail\",\n\t\t}, nil\n\t}\n\n\t_, err = ctx.Artifacts().Save(ctx, input.Filename, genai.NewPartFromBytes(response.GeneratedImages[0].Image.ImageBytes, \"image/png\"))\n\tif err != nil {\n\t\treturn generateImageResult{\n\t\t\tStatus: \"fail\",\n\t\t}, nil\n\t}\n\n\treturn generateImageResult{\n\t\tStatus:   \"success\",\n\t\tFilename: input.Filename,\n\t}, nil\n}\n\ntype generateImageInput struct {\n\tPrompt   string `json:\"prompt\"`\n\tFilename string `json:\"filename\"`\n}\n\ntype generateImageResult struct {\n\tFilename string `json:\"filename\"`\n\tStatus   string `json:\"Status\"`\n}\n\nfunc GetImageGeneratorAgent(ctx context.Context, model model.LLM) agent.Agent {\n\tgenerateImageTool, err := functiontool.New(\n\t\tfunctiontool.Config{\n\t\t\tName:        \"generate_image\",\n\t\t\tDescription: \"Generates image and saves in artifact service.\",\n\t\t},\n\t\tgenerateImage)\n\tif err != nil {\n\t\tlog.Fatalf(\"Failed to create generate image tool: %v\", err)\n\t}\n\timageGeneratorAgent, err := llmagent.New(llmagent.Config{\n\t\tName:        \"image_generator\",\n\t\tModel:       model,\n\t\tDescription: \"Agent to generate pictures, answers questions about it and saves it locally if asked.\",\n\t\tInstruction: \"You are an agent whose job is to generate or edit an image based on the user's prompt.\",\n\t\tTools: []tool.Tool{\n\t\t\tgenerateImageTool, loadartifactstool.New(),\n\t\t},\n\t})\n\tif err != nil {\n\t\tlog.Fatalf(\"Failed to create agent: %v\", err)\n\t}\n\treturn imageGeneratorAgent\n}\n"
  },
  {
    "path": "examples/web/agents/llmauditor.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage agents\n\nimport (\n\t\"context\"\n\t\"strings\"\n\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/agent\"\n\t\"google.golang.org/adk/agent/llmagent\"\n\t\"google.golang.org/adk/agent/workflowagents/sequentialagent\"\n\t\"google.golang.org/adk/model\"\n)\n\nconst EndMark = \"---END-OF-EDIT---\"\n\nconst CriticPrompt = `\nYou are a professional investigative journalist, excelling at critical thinking and verifying information before printed to a highly-trustworthy publication.\nIn this task you are given a question-answer pair to be printed to the publication. The publication editor tasked you to double-check the answer text.\n\n# Your task\n\nYour task involves three key steps: First, identifying all CLAIMS presented in the answer. Second, determining the reliability of each CLAIM. And lastly, provide an overall assessment.\n\n## Step 1: Identify the CLAIMS\n\nCarefully read the provided answer text. Extract every distinct CLAIM made within the answer. A CLAIM can be a statement of fact about the world or a logical argument presented to support a point.\n\n## Step 2: Verify each CLAIM\n\nFor each CLAIM you identified in Step 1, perform the following:\n\n* Consider the Context: Take into account the original question and any other CLAIMS already identified within the answer.\n* Consult External Sources: Use your general knowledge and/or search the web to find evidence that supports or contradicts the CLAIM. Aim to consult reliable and authoritative sources.\n* Determine the VERDICT: Based on your evaluation, assign one of the following verdicts to the CLAIM:\n    * Accurate: The information presented in the CLAIM is correct, complete, and consistent with the provided context and reliable sources.\n    * Inaccurate: The information presented in the CLAIM contains errors, omissions, or inconsistencies when compared to the provided context and reliable sources.\n    * Disputed: Reliable and authoritative sources offer conflicting information regarding the CLAIM, indicating a lack of definitive agreement on the objective information.\n    * Unsupported: Despite your search efforts, no reliable source can be found to substantiate the information presented in the CLAIM.\n    * Not Applicable: The CLAIM expresses a subjective opinion, personal belief, or pertains to fictional content that does not require external verification.\n* Provide a JUSTIFICATION: For each verdict, clearly explain the reasoning behind your assessment. Reference the sources you consulted or explain why the verdict \"Not Applicable\" was chosen.\n\n## Step 3: Provide an overall assessment\n\nAfter you have evaluated each individual CLAIM, provide an OVERALL VERDICT for the entire answer text, and an OVERALL JUSTIFICATION for your overall verdict. Explain how the evaluation of the individual CLAIMS led you to this overall assessment and whether the answer as a whole successfully addresses the original question.\n\n# Tips\n\nYour work is iterative. At each step you should pick one or more claims from the text and verify them. Then, continue to the next claim or claims. You may rely on previous claims to verify the current claim.\n\nThere are various actions you can take to help you with the verification:\n  * You may use your own knowledge to verify pieces of information in the text, indicating \"Based on my knowledge...\". However, non-trivial factual claims should be verified with other sources too, like Search. Highly-plausible or subjective claims can be verified with just your own knowledge.\n  * You may spot the information that doesn't require fact-checking and mark it as \"Not Applicable\".\n  * You may search the web to find information that supports or contradicts the claim.\n  * You may conduct multiple searches per claim if acquired evidence was insufficient.\n  * In your reasoning please refer to the evidence you have collected so far via their squared brackets indices.\n  * You may check the context to verify if the claim is consistent with the context. Read the context carefully to identify specific user instructions that the text should follow, facts that the text should be faithful to, etc.\n  * You should draw your final conclusion on the entire text after you acquired all the information you needed.\n\n# Output format\n\nThe last block of your output should be a Markdown-formatted list, summarizing your verification result. For each CLAIM you verified, you should output the claim (as a standalone statement), the corresponding part in the answer text, the verdict, and the justification.\n\nHere is the question and answer you are going to double check:\n`\n\nconst ReviserPrompt = `\nYou are a professional editor working for a highly-trustworthy publication.\nIn this task you are given a question-answer pair to be printed to the publication. The publication reviewer has double-checked the answer text and provided the findings.\nYour task is to minimally revise the answer text to make it accurate, while maintaining the overall structure, style, and length similar to the original.\n\nThe reviewer has identified CLAIMs (including facts and logical arguments) made in the answer text, and has verified whether each CLAIM is accurate, using the following VERDICTs:\n\n    * Accurate: The information presented in the CLAIM is correct, complete, and consistent with the provided context and reliable sources.\n    * Inaccurate: The information presented in the CLAIM contains errors, omissions, or inconsistencies when compared to the provided context and reliable sources.\n    * Disputed: Reliable and authoritative sources offer conflicting information regarding the CLAIM, indicating a lack of definitive agreement on the objective information.\n    * Unsupported: Despite your search efforts, no reliable source can be found to substantiate the information presented in the CLAIM.\n    * Not Applicable: The CLAIM expresses a subjective opinion, personal belief, or pertains to fictional content that does not require external verification.\n\nEditing guidelines for each type of claim:\n\n  * Accurate claims: There is no need to edit them.\n  * Inaccurate claims: You should fix them following the reviewer's justification, if possible.\n  * Disputed claims: You should try to present two (or more) sides of an argument, to make the answer more balanced.\n  * Unsupported claims: You may omit unsupported claims if they are not central to the answer. Otherwise you may soften the claims or express that they are unsupported.\n  * Not applicable claims: There is no need to edit them.\n\nAs a last resort, you may omit a claim if they are not central to the answer and impossible to fix. You should also make necessary edits to ensure that the revised answer is self-consistent and fluent. You should not introduce any new claims or make any new statements in the answer text. Your edit should be minimal and maintain overall structure and style unchanged.\n\nOutput format:\n\n  * If the answer is accurate, you should output exactly the same answer text as you are given.\n  * If the answer is inaccurate, disputed, or unsupported, then you should output your revised answer text.\n  * After the answer, output a line of \"---END-OF-EDIT---\" and stop.\n\nHere are some examples of the task:\n\n=== Example 1 ===\n\nQuestion: Who was the first president of the US?\n\nAnswer: George Washington was the first president of the United States.\n\nFindings:\n\n  * Claim 1: George Washington was the first president of the United States.\n      * Verdict: Accurate\n      * Justification: Multiple reliable sources confirm that George Washington was the first president of the United States.\n  * Overall verdict: Accurate\n  * Overall justification: The answer is accurate and completely answers the question.\n\nYour expected response:\n\nGeorge Washington was the first president of the United States.\n---END-OF-EDIT---\n\n=== Example 2 ===\n\nQuestion: What is the shape of the sun?\n\nAnswer: The sun is cube-shaped and very hot.\n\nFindings:\n\n  * Claim 1: The sun is cube-shaped.\n      * Verdict: Inaccurate\n      * Justification: NASA states that the sun is a sphere of hot plasma, so it is not cube-shaped. It is a sphere.\n  * Claim 2: The sun is very hot.\n      * Verdict: Accurate\n      * Justification: Based on my knowledge and the search results, the sun is extremely hot.\n  * Overall verdict: Inaccurate\n  * Overall justification: The answer states that the sun is cube-shaped, which is incorrect.\n\nYour expected response:\n\nThe sun is sphere-shaped and very hot.\n---END-OF-EDIT---\n\nHere are the question-answer pair and the reviewer-provided findings:\n`\n\nfunc afterCritic(ctx agent.CallbackContext, llmResponse *model.LLMResponse, llmResponseError error) (*model.LLMResponse, error) {\n\tif llmResponse == nil || llmResponse.Content == nil || llmResponse.Content.Parts == nil || llmResponse.GroundingMetadata == nil {\n\t\treturn llmResponse, nil\n\t}\n\n\treferences := []string{}\n\tfor _, chunk := range llmResponse.GroundingMetadata.GroundingChunks {\n\t\tvar title, uri, text string\n\t\tif chunk.RetrievedContext != nil {\n\t\t\ttitle = chunk.RetrievedContext.Title\n\t\t\turi = chunk.RetrievedContext.URI\n\t\t\ttext = chunk.RetrievedContext.Text\n\t\t} else if chunk.Web != nil {\n\t\t\ttitle = chunk.Web.Title\n\t\t\turi = chunk.Web.URI\n\t\t}\n\t\treference := \"\"\n\t\tparts := []string{}\n\t\tif title != \"\" {\n\t\t\tparts = append(parts, title)\n\t\t}\n\t\tif uri != \"\" {\n\t\t\tparts = append(parts, uri)\n\t\t}\n\t\tif text != \"\" {\n\t\t\tparts = append(parts, text)\n\t\t}\n\t\tif len(parts) > 0 {\n\t\t\treference = \"* \" + strings.Join(parts, \": \") + \"\\n\"\n\t\t}\n\t\tif reference != \"\" {\n\t\t\treferences = append(references, reference)\n\t\t}\n\t}\n\tif len(references) > 0 {\n\t\treference := \"\\n\\nReference:\\n\\n\" + strings.Join(references, \"\")\n\t\tllmResponse.Content.Parts = append(llmResponse.Content.Parts, &genai.Part{Text: reference})\n\t}\n\ttext_parts := []string{}\n\tfor _, part := range llmResponse.Content.Parts {\n\t\tif part.Text != \"\" {\n\t\t\ttext_parts = append(text_parts, part.Text)\n\t\t}\n\t}\n\ttext := strings.Join(text_parts, \"\")\n\tif text != \"\" {\n\t\tllmResponse.Content.Parts = []*genai.Part{{Text: text}}\n\t}\n\treturn llmResponse, nil\n}\n\nfunc afterReviser(ctx agent.CallbackContext, llmResponse *model.LLMResponse, llmResponseError error) (*model.LLMResponse, error) {\n\tif llmResponse.Content == nil || llmResponse.Content.Parts == nil {\n\t\treturn llmResponse, nil\n\t}\n\n\tfor idx, part := range llmResponse.Content.Parts {\n\t\tif strings.Contains(part.Text, EndMark) {\n\t\t\tllmResponse.Content.Parts = llmResponse.Content.Parts[:idx]\n\t\t\tpart.Text = strings.SplitN(part.Text, EndMark, 1)[0]\n\t\t}\n\t}\n\treturn llmResponse, nil\n}\n\nfunc GetLLMAuditorAgent(ctx context.Context, model model.LLM) agent.Agent {\n\tcriticAgent, err := llmagent.New(llmagent.Config{\n\t\tModel:       model,\n\t\tName:        \"critic_agent\",\n\t\tInstruction: CriticPrompt,\n\t\tAfterModelCallbacks: []llmagent.AfterModelCallback{\n\t\t\tafterCritic,\n\t\t},\n\t},\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\treviserAgent, err := llmagent.New(llmagent.Config{\n\t\tModel:       model,\n\t\tName:        \"reviser_agent\",\n\t\tInstruction: ReviserPrompt,\n\t\tAfterModelCallbacks: []llmagent.AfterModelCallback{\n\t\t\tafterReviser,\n\t\t},\n\t},\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\trootAgent, err := sequentialagent.New(sequentialagent.Config{\n\t\tAgentConfig: agent.Config{\n\t\t\tName:        \"llm_auditor\",\n\t\t\tDescription: \"Evaluates LLM-generated answers.\",\n\t\t\tSubAgents: []agent.Agent{\n\t\t\t\tcriticAgent,\n\t\t\t\treviserAgent,\n\t\t\t},\n\t\t},\n\t})\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\treturn rootAgent\n}\n"
  },
  {
    "path": "examples/web/main.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage main\n\nimport (\n\t\"context\"\n\t\"log\"\n\t\"os\"\n\n\t\"github.com/a2aproject/a2a-go/a2asrv\"\n\t\"github.com/google/uuid\"\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/agent\"\n\t\"google.golang.org/adk/agent/llmagent\"\n\t\"google.golang.org/adk/artifact\"\n\t\"google.golang.org/adk/cmd/launcher\"\n\t\"google.golang.org/adk/cmd/launcher/full\"\n\t\"google.golang.org/adk/examples/web/agents\"\n\t\"google.golang.org/adk/model\"\n\t\"google.golang.org/adk/model/gemini\"\n\t\"google.golang.org/adk/session\"\n\t\"google.golang.org/adk/tool\"\n\t\"google.golang.org/adk/tool/geminitool\"\n)\n\nfunc saveReportfunc(ctx agent.CallbackContext, llmResponse *model.LLMResponse, llmResponseError error) (*model.LLMResponse, error) {\n\tif llmResponse == nil || llmResponse.Content == nil || llmResponseError != nil {\n\t\treturn llmResponse, llmResponseError\n\t}\n\tfor _, part := range llmResponse.Content.Parts {\n\t\t_, err := ctx.Artifacts().Save(ctx, uuid.NewString(), part)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\treturn llmResponse, llmResponseError\n}\n\n// AuthInterceptor sets 'user' name needed for both a2a and webui launchers which sharing the same sessions service.\ntype AuthInterceptor struct {\n\ta2asrv.PassthroughCallInterceptor\n}\n\n// Before implements a before request callback.\nfunc (a *AuthInterceptor) Before(ctx context.Context, callCtx *a2asrv.CallContext, req *a2asrv.Request) (context.Context, error) {\n\tcallCtx.User = &a2asrv.AuthenticatedUser{\n\t\tUserName: \"user\",\n\t}\n\treturn ctx, nil\n}\n\nfunc main() {\n\tctx := context.Background()\n\tapiKey := os.Getenv(\"GOOGLE_API_KEY\")\n\n\tmodel, err := gemini.NewModel(ctx, \"gemini-2.5-flash\", &genai.ClientConfig{\n\t\tAPIKey: apiKey,\n\t})\n\tif err != nil {\n\t\tlog.Fatalf(\"Failed to create model: %v\", err)\n\t}\n\tsessionService := session.InMemoryService()\n\trootAgent, err := llmagent.New(llmagent.Config{\n\t\tName:        \"weather_time_agent\",\n\t\tModel:       model,\n\t\tDescription: \"Agent to answer questions about the time and weather in a city.\",\n\t\tInstruction: \"I can answer your questions about the time and weather in a city.\",\n\t\tTools: []tool.Tool{\n\t\t\tgeminitool.GoogleSearch{},\n\t\t},\n\t\tAfterModelCallbacks: []llmagent.AfterModelCallback{saveReportfunc},\n\t})\n\tif err != nil {\n\t\tlog.Fatalf(\"Failed to create agent: %v\", err)\n\t}\n\tllmAuditor := agents.GetLLMAuditorAgent(ctx, model)\n\timageGeneratorAgent := agents.GetImageGeneratorAgent(ctx, model)\n\n\tagentLoader, err := agent.NewMultiLoader(\n\t\trootAgent,\n\t\tllmAuditor,\n\t\timageGeneratorAgent,\n\t)\n\tif err != nil {\n\t\tlog.Fatalf(\"Failed to create agent loader: %v\", err)\n\t}\n\n\tartifactservice := artifact.InMemoryService()\n\n\tconfig := &launcher.Config{\n\t\tArtifactService: artifactservice,\n\t\tSessionService:  sessionService,\n\t\tAgentLoader:     agentLoader,\n\t\tA2AOptions: []a2asrv.RequestHandlerOption{\n\t\t\ta2asrv.WithCallInterceptor(&AuthInterceptor{}),\n\t\t},\n\t}\n\n\tl := full.NewLauncher()\n\tif err = l.Execute(ctx, config, os.Args[1:]); err != nil {\n\t\tlog.Fatalf(\"Run failed: %v\\n\\n%s\", err, l.CommandLineSyntax())\n\t}\n}\n"
  },
  {
    "path": "examples/workflowagents/loop/main.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Package demonstrates a workflow agent that runs a loop agent.\npackage main\n\nimport (\n\t\"context\"\n\t\"iter\"\n\t\"log\"\n\t\"os\"\n\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/agent\"\n\t\"google.golang.org/adk/agent/workflowagents/loopagent\"\n\t\"google.golang.org/adk/cmd/launcher\"\n\t\"google.golang.org/adk/cmd/launcher/full\"\n\t\"google.golang.org/adk/model\"\n\t\"google.golang.org/adk/session\"\n)\n\nfunc CustomAgentRun(ctx agent.InvocationContext) iter.Seq2[*session.Event, error] {\n\treturn func(yield func(*session.Event, error) bool) {\n\t\tyield(&session.Event{\n\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\tContent: &genai.Content{\n\t\t\t\t\tParts: []*genai.Part{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tText: \"Hello from MyAgent!\\n\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t}, nil)\n\t}\n}\n\nfunc main() {\n\tctx := context.Background()\n\n\tcustomAgent, err := agent.New(agent.Config{\n\t\tName:        \"my_custom_agent\",\n\t\tDescription: \"A custom agent that responds with a greeting.\",\n\t\tRun:         CustomAgentRun,\n\t})\n\tif err != nil {\n\t\tlog.Fatalf(\"Failed to create agent: %v\", err)\n\t}\n\n\tloopAgent, err := loopagent.New(loopagent.Config{\n\t\tMaxIterations: 3,\n\t\tAgentConfig: agent.Config{\n\t\t\tName:        \"loop_agent\",\n\t\t\tDescription: \"A loop agent that runs sub-agents\",\n\t\t\tSubAgents:   []agent.Agent{customAgent},\n\t\t},\n\t})\n\tif err != nil {\n\t\tlog.Fatalf(\"Failed to create agent: %v\", err)\n\t}\n\n\tconfig := &launcher.Config{\n\t\tAgentLoader: agent.NewSingleLoader(loopAgent),\n\t}\n\n\tl := full.NewLauncher()\n\tif err = l.Execute(ctx, config, os.Args[1:]); err != nil {\n\t\tlog.Fatalf(\"Run failed: %v\\n\\n%s\", err, l.CommandLineSyntax())\n\t}\n}\n"
  },
  {
    "path": "examples/workflowagents/parallel/main.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Package demonstrates a workflow agent that runs sub-agents in parallel.\npackage main\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"iter\"\n\t\"log\"\n\trand \"math/rand/v2\"\n\t\"os\"\n\t\"time\"\n\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/agent\"\n\t\"google.golang.org/adk/agent/workflowagents/parallelagent\"\n\t\"google.golang.org/adk/cmd/launcher\"\n\t\"google.golang.org/adk/cmd/launcher/full\"\n\t\"google.golang.org/adk/model\"\n\t\"google.golang.org/adk/session\"\n)\n\nfunc main() {\n\tctx := context.Background()\n\n\tsubAgent1, err := agent.New(agent.Config{\n\t\tName:        \"my_custom_agent_1\",\n\t\tDescription: \"A custom agent that responds with a greeting.\",\n\t\tRun:         myAgent{id: 1}.Run,\n\t})\n\tif err != nil {\n\t\tlog.Fatalf(\"Failed to create agent: %v\", err)\n\t}\n\n\tsubAgent2, err := agent.New(agent.Config{\n\t\tName:        \"my_custom_agent_2\",\n\t\tDescription: \"A custom agent that responds with a greeting.\",\n\t\tRun:         myAgent{id: 2}.Run,\n\t})\n\tif err != nil {\n\t\tlog.Fatalf(\"Failed to create agent: %v\", err)\n\t}\n\n\tparallelAgent, err := parallelagent.New(parallelagent.Config{\n\t\tAgentConfig: agent.Config{\n\t\t\tName:        \"parallel_agent\",\n\t\t\tDescription: \"A parallel agent that runs sub-agents\",\n\t\t\tSubAgents:   []agent.Agent{subAgent1, subAgent2},\n\t\t},\n\t})\n\tif err != nil {\n\t\tlog.Fatalf(\"Failed to create agent: %v\", err)\n\t}\n\n\tconfig := &launcher.Config{\n\t\tAgentLoader: agent.NewSingleLoader(parallelAgent),\n\t}\n\n\tl := full.NewLauncher()\n\tif err = l.Execute(ctx, config, os.Args[1:]); err != nil {\n\t\tlog.Fatalf(\"Run failed: %v\\n\\n%s\", err, l.CommandLineSyntax())\n\t}\n}\n\ntype myAgent struct {\n\tid int\n}\n\nfunc (a myAgent) Run(ctx agent.InvocationContext) iter.Seq2[*session.Event, error] {\n\treturn func(yield func(*session.Event, error) bool) {\n\t\tfor range 3 {\n\t\t\tif !yield(&session.Event{\n\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\tContent: &genai.Content{\n\t\t\t\t\t\tParts: []*genai.Part{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tText: fmt.Sprintf(\"Hello from MyAgent id: %v!\\n\", a.id),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t}, nil) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tr := 1 + rand.IntN(5)\n\t\t\ttime.Sleep(time.Duration(r) * time.Second)\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "examples/workflowagents/sequential/main.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Package demonstrates a workflow agent that runs sub-agents sequentially.\npackage main\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"iter\"\n\t\"log\"\n\t\"os\"\n\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/agent\"\n\t\"google.golang.org/adk/agent/workflowagents/sequentialagent\"\n\t\"google.golang.org/adk/cmd/launcher\"\n\t\"google.golang.org/adk/cmd/launcher/full\"\n\t\"google.golang.org/adk/model\"\n\t\"google.golang.org/adk/session\"\n)\n\ntype myAgent struct {\n\tid int\n}\n\nfunc (a myAgent) Run(ctx agent.InvocationContext) iter.Seq2[*session.Event, error] {\n\treturn func(yield func(*session.Event, error) bool) {\n\t\tyield(&session.Event{\n\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\tContent: &genai.Content{\n\t\t\t\t\tParts: []*genai.Part{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tText: fmt.Sprintf(\"Hello from MyAgent id: %v!\\n\", a.id),\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t}, nil)\n\t}\n}\n\nfunc main() {\n\tctx := context.Background()\n\n\tmyAgent1, err := agent.New(agent.Config{\n\t\tName:        \"my_custom_agent_1\",\n\t\tDescription: \"A custom agent that responds with a greeting.\",\n\t\tRun:         myAgent{id: 1}.Run,\n\t})\n\tif err != nil {\n\t\tlog.Fatalf(\"Failed to create agent: %v\", err)\n\t}\n\n\tmyAgent2, err := agent.New(agent.Config{\n\t\tName:        \"my_custom_agent_2\",\n\t\tDescription: \"A custom agent that responds with a greeting.\",\n\t\tRun:         myAgent{id: 2}.Run,\n\t})\n\tif err != nil {\n\t\tlog.Fatalf(\"Failed to create agent: %v\", err)\n\t}\n\n\tsequentialAgent, err := sequentialagent.New(sequentialagent.Config{\n\t\tAgentConfig: agent.Config{\n\t\t\tName:        \"sequential_agent\",\n\t\t\tDescription: \"A sequential agent that runs sub-agents\",\n\t\t\tSubAgents:   []agent.Agent{myAgent1, myAgent2},\n\t\t},\n\t})\n\tif err != nil {\n\t\tlog.Fatalf(\"Failed to create agent: %v\", err)\n\t}\n\n\tconfig := &launcher.Config{\n\t\tAgentLoader: agent.NewSingleLoader(sequentialAgent),\n\t}\n\n\tl := full.NewLauncher()\n\tif err = l.Execute(ctx, config, os.Args[1:]); err != nil {\n\t\tlog.Fatalf(\"Run failed: %v\\n\\n%s\", err, l.CommandLineSyntax())\n\t}\n}\n"
  },
  {
    "path": "examples/workflowagents/sequentialCode/main.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Package demonstrates a coding workflow agent that runs sub-agents sequentially.\npackage main\n\nimport (\n\t\"context\"\n\t\"log\"\n\t\"os\"\n\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/agent\"\n\t\"google.golang.org/adk/agent/llmagent\"\n\t\"google.golang.org/adk/agent/workflowagents/sequentialagent\"\n\t\"google.golang.org/adk/cmd/launcher\"\n\t\"google.golang.org/adk/cmd/launcher/full\"\n\t\"google.golang.org/adk/model/gemini\"\n)\n\nfunc main() {\n\tctx := context.Background()\n\n\tmodel, err := gemini.NewModel(ctx, \"gemini-2.5-flash\", &genai.ClientConfig{})\n\tif err != nil {\n\t\tlog.Fatalf(\"failed to create model: %s\", err)\n\t}\n\n\t// --- 1. Define Sub-Agents for Each Pipeline Stage ---\n\n\t// Code Writer Agent\n\t// Takes the initial specification (from user query) and writes code.\n\tcodeWriterAgent, err := llmagent.New(llmagent.Config{\n\t\tName:  \"CodeWriterAgent\",\n\t\tModel: model,\n\t\tInstruction: `You are a Python Code Generator.\nBased *only* on the user's request, write Python code that fulfills the requirement.\nOutput *only* the complete Python code block, enclosed in triple backticks ('''python ... ''').\nDo not add any other text before or after the code block.`,\n\t\tDescription: \"Writes initial Python code based on a specification.\",\n\t\tOutputKey:   \"generated_code\", // Stores output in state[\"generated_code\"]\n\t})\n\tif err != nil {\n\t\tlog.Fatalf(\"failed to create codeWriterAgent: %s\", err)\n\t}\n\n\t// Code Reviewer Agent\n\t// Takes the code generated by the previous agent (read from state) and provides feedback.\n\tcodeReviewerAgent, err := llmagent.New(llmagent.Config{\n\t\tName:  \"CodeReviewerAgent\",\n\t\tModel: model,\n\t\tInstruction: `You are an expert Python Code Reviewer.\nYour task is to provide constructive feedback on the provided code.\n\n**Code to Review:**\n'''python\n{generated_code}\n'''\n\n**Review Criteria:**\n1.  **Correctness:** Does the code work as intended? Are there logic errors?\n2.  **Readability:** Is the code clear and easy to understand? Follows PEP 8 style guidelines?\n3.  **Efficiency:** Is the code reasonably efficient? Any obvious performance bottlenecks?\n4.  **Edge Cases:** Does the code handle potential edge cases or invalid inputs gracefully?\n5.  **Best Practices:** Does the code follow common Python best practices?\n\n**Output:**\nProvide your feedback as a concise, bulleted list. Focus on the most important points for improvement.\nIf the code is excellent and requires no changes, simply state: \"No major issues found.\"\nOutput *only* the review comments or the \"No major issues\" statement.`,\n\t\tDescription: \"Reviews code and provides feedback.\",\n\t\tOutputKey:   \"temp:review_comments\", // Stores output in state[\"temp:review_comments\"]\n\t})\n\tif err != nil {\n\t\tlog.Fatalf(\"failed to create codeReviewerAgent: %s\", err)\n\t}\n\n\t// Code Refactorer Agent\n\t// Takes the original code and the review comments (read from state) and refactors the code.\n\tcodeRefactorerAgent, err := llmagent.New(llmagent.Config{\n\t\tName:  \"CodeRefactorerAgent\",\n\t\tModel: model,\n\t\tInstruction: `You are a Python Code Refactoring AI.\nYour goal is to improve the given Python code based on the provided review comments.\n\n**Original Code:**\n'''python\n{generated_code}\n'''\n\n**Review Comments:**\n{temp:review_comments}\n\n**Task:**\nCarefully apply the suggestions from the review comments to refactor the original code.\nIf the review comments state \"No major issues found,\" return the original code unchanged.\nEnsure the final code is complete, functional, and includes necessary imports and docstrings.\n\n**Output:**\nOutput *only* the final, refactored Python code block, enclosed in triple backticks ('''python ... ''').\nDo not add any other text before or after the code block.`,\n\t\tDescription: \"Refactors code based on review comments.\",\n\t\tOutputKey:   \"refactored_code\", // Stores output in state[\"refactored_code\"]\n\t})\n\tif err != nil {\n\t\tlog.Fatalf(\"failed to create codeRefactorerAgent: %s\", err)\n\t}\n\n\t// --- 2. Create the SequentialAgent ---\n\t// This agent orchestrates the pipeline by running the sub_agents in order.\n\tcodePipelineAgent, err := sequentialagent.New(sequentialagent.Config{\n\t\tAgentConfig: agent.Config{\n\t\t\tName: \"CodePipelineAgent\",\n\t\t\tSubAgents: []agent.Agent{\n\t\t\t\tcodeWriterAgent,\n\t\t\t\tcodeReviewerAgent,\n\t\t\t\tcodeRefactorerAgent,\n\t\t\t},\n\t\t\tDescription: \"Executes a sequence of code writing, reviewing, and refactoring.\",\n\t\t},\n\t})\n\tif err != nil {\n\t\tlog.Fatalf(\"failed to create codePipelineAgent: %s\", err)\n\t}\n\n\trootAgent := codePipelineAgent\n\n\t// The rootAgent can now be used by the ADK framework.\n\tlog.Printf(\"Successfully created root agent: %s\", rootAgent.Name())\n\n\tconfig := &launcher.Config{\n\t\tAgentLoader: agent.NewSingleLoader(rootAgent),\n\t}\n\tl := full.NewLauncher()\n\tif err = l.Execute(ctx, config, os.Args[1:]); err != nil {\n\t\tlog.Fatalf(\"Run failed: %v\\n\\n%s\", err, l.CommandLineSyntax())\n\t}\n}\n"
  },
  {
    "path": "go.mod",
    "content": "module google.golang.org/adk\n\ngo 1.25.0\n\nrequire (\n\tcloud.google.com/go v0.123.0\n\tcloud.google.com/go/aiplatform v1.105.0\n\tcloud.google.com/go/storage v1.56.1\n\tgithub.com/a2aproject/a2a-go v0.3.10\n\tgithub.com/awalterschulze/gographviz v2.0.3+incompatible\n\tgithub.com/glebarez/sqlite v1.8.0\n\tgithub.com/google/go-cmp v0.7.0\n\tgithub.com/google/jsonschema-go v0.4.2\n\tgithub.com/google/safehtml v0.1.0\n\tgithub.com/google/uuid v1.6.0\n\tgithub.com/gorilla/mux v1.8.1\n\tgithub.com/mitchellh/mapstructure v1.5.0\n\tgithub.com/modelcontextprotocol/go-sdk v1.4.1\n\tgithub.com/spf13/cobra v1.8.1\n\tgo.opentelemetry.io/contrib/detectors/gcp v1.40.0\n\tgo.opentelemetry.io/otel v1.40.0\n\tgo.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.16.0\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.39.0\n\tgo.opentelemetry.io/otel/log v0.16.0\n\tgo.opentelemetry.io/otel/sdk v1.40.0\n\tgo.opentelemetry.io/otel/trace v1.40.0\n\tgolang.org/x/oauth2 v0.34.0\n\tgolang.org/x/sync v0.19.0\n\tgoogle.golang.org/api v0.252.0\n\tgoogle.golang.org/genai v1.40.0\n\tgoogle.golang.org/grpc v1.79.3\n\tgoogle.golang.org/protobuf v1.36.11\n\tgopkg.in/yaml.v3 v3.0.1\n\tgorm.io/gorm v1.31.0\n\trsc.io/omap v1.2.0\n\trsc.io/ordered v1.1.1\n)\n\nrequire (\n\tcel.dev/expr v0.25.1 // indirect\n\tcloud.google.com/go/auth v0.17.0 // indirect\n\tcloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect\n\tcloud.google.com/go/compute/metadata v0.9.0 // indirect\n\tcloud.google.com/go/iam v1.5.3 // indirect\n\tcloud.google.com/go/longrunning v0.7.0 // indirect\n\tcloud.google.com/go/monitoring v1.24.3 // indirect\n\tgithub.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.31.0 // indirect\n\tgithub.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.53.0 // indirect\n\tgithub.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.53.0 // indirect\n\tgithub.com/cenkalti/backoff/v5 v5.0.3 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.3.0 // indirect\n\tgithub.com/cncf/xds/go v0.0.0-20251210132809-ee656c7534f5 // indirect\n\tgithub.com/dustin/go-humanize v1.0.1 // indirect\n\tgithub.com/envoyproxy/go-control-plane/envoy v1.36.0 // indirect\n\tgithub.com/envoyproxy/protoc-gen-validate v1.3.0 // indirect\n\tgithub.com/felixge/httpsnoop v1.0.4 // indirect\n\tgithub.com/glebarez/go-sqlite v1.21.1 // indirect\n\tgithub.com/go-jose/go-jose/v4 v4.1.3 // indirect\n\tgithub.com/go-logr/logr v1.4.3 // indirect\n\tgithub.com/go-logr/stdr v1.2.2 // indirect\n\tgithub.com/google/s2a-go v0.1.9 // indirect\n\tgithub.com/googleapis/enterprise-certificate-proxy v0.3.6 // indirect\n\tgithub.com/googleapis/gax-go/v2 v2.15.0 // indirect\n\tgithub.com/gorilla/websocket v1.5.3 // indirect\n\tgithub.com/grpc-ecosystem/grpc-gateway/v2 v2.27.7 // indirect\n\tgithub.com/inconshreveable/mousetrap v1.1.0 // indirect\n\tgithub.com/jinzhu/inflection v1.0.0 // indirect\n\tgithub.com/jinzhu/now v1.1.5 // indirect\n\tgithub.com/mattn/go-isatty v0.0.17 // indirect\n\tgithub.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect\n\tgithub.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect\n\tgithub.com/segmentio/asm v1.1.3 // indirect\n\tgithub.com/segmentio/encoding v0.5.4 // indirect\n\tgithub.com/spf13/pflag v1.0.10 // indirect\n\tgithub.com/spiffe/go-spiffe/v2 v2.6.0 // indirect\n\tgithub.com/yosida95/uritemplate/v3 v3.0.2 // indirect\n\tgo.opentelemetry.io/auto/sdk v1.2.1 // indirect\n\tgo.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.63.0 // indirect\n\tgo.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.63.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.39.0 // indirect\n\tgo.opentelemetry.io/otel/metric v1.40.0 // indirect\n\tgo.opentelemetry.io/otel/sdk/log v0.16.0\n\tgo.opentelemetry.io/otel/sdk/metric v1.40.0 // indirect\n\tgo.opentelemetry.io/proto/otlp v1.9.0 // indirect\n\tgolang.org/x/crypto v0.47.0 // indirect\n\tgolang.org/x/net v0.49.0 // indirect\n\tgolang.org/x/sys v0.41.0 // indirect\n\tgolang.org/x/text v0.33.0 // indirect\n\tgolang.org/x/time v0.14.0 // indirect\n\tgoogle.golang.org/genproto v0.0.0-20251014184007-4626949a642f // indirect\n\tgoogle.golang.org/genproto/googleapis/api v0.0.0-20260128011058-8636f8732409 // indirect\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20260128011058-8636f8732409 // indirect\n\tmodernc.org/libc v1.22.3 // indirect\n\tmodernc.org/mathutil v1.5.0 // indirect\n\tmodernc.org/memory v1.5.0 // indirect\n\tmodernc.org/sqlite v1.21.1 // indirect\n)\n"
  },
  {
    "path": "go.sum",
    "content": "cel.dev/expr v0.25.1 h1:1KrZg61W6TWSxuNZ37Xy49ps13NUovb66QLprthtwi4=\ncel.dev/expr v0.25.1/go.mod h1:hrXvqGP6G6gyx8UAHSHJ5RGk//1Oj5nXQ2NI02Nrsg4=\ncloud.google.com/go v0.123.0 h1:2NAUJwPR47q+E35uaJeYoNhuNEM9kM8SjgRgdeOJUSE=\ncloud.google.com/go v0.123.0/go.mod h1:xBoMV08QcqUGuPW65Qfm1o9Y4zKZBpGS+7bImXLTAZU=\ncloud.google.com/go/aiplatform v1.105.0 h1:Tbc2iEp7vbzgk6Vs4QexfNo8/nl+E+Na+FEreRZdhcM=\ncloud.google.com/go/aiplatform v1.105.0/go.mod h1:4rwKOMdubQOND81AlO3EckcskvEFCYSzXKfn42GMm8k=\ncloud.google.com/go/auth v0.17.0 h1:74yCm7hCj2rUyyAocqnFzsAYXgJhrG26XCFimrc/Kz4=\ncloud.google.com/go/auth v0.17.0/go.mod h1:6wv/t5/6rOPAX4fJiRjKkJCvswLwdet7G8+UGXt7nCQ=\ncloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIiLpZnkHRbnc=\ncloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c=\ncloud.google.com/go/compute/metadata v0.9.0 h1:pDUj4QMoPejqq20dK0Pg2N4yG9zIkYGdBtwLoEkH9Zs=\ncloud.google.com/go/compute/metadata v0.9.0/go.mod h1:E0bWwX5wTnLPedCKqk3pJmVgCBSM6qQI1yTBdEb3C10=\ncloud.google.com/go/iam v1.5.3 h1:+vMINPiDF2ognBJ97ABAYYwRgsaqxPbQDlMnbHMjolc=\ncloud.google.com/go/iam v1.5.3/go.mod h1:MR3v9oLkZCTlaqljW6Eb2d3HGDGK5/bDv93jhfISFvU=\ncloud.google.com/go/logging v1.13.0 h1:7j0HgAp0B94o1YRDqiqm26w4q1rDMH7XNRU34lJXHYc=\ncloud.google.com/go/logging v1.13.0/go.mod h1:36CoKh6KA/M0PbhPKMq6/qety2DCAErbhXT62TuXALA=\ncloud.google.com/go/longrunning v0.7.0 h1:FV0+SYF1RIj59gyoWDRi45GiYUMM3K1qO51qoboQT1E=\ncloud.google.com/go/longrunning v0.7.0/go.mod h1:ySn2yXmjbK9Ba0zsQqunhDkYi0+9rlXIwnoAf+h+TPY=\ncloud.google.com/go/monitoring v1.24.3 h1:dde+gMNc0UhPZD1Azu6at2e79bfdztVDS5lvhOdsgaE=\ncloud.google.com/go/monitoring v1.24.3/go.mod h1:nYP6W0tm3N9H/bOw8am7t62YTzZY+zUeQ+Bi6+2eonI=\ncloud.google.com/go/storage v1.56.1 h1:n6gy+yLnHn0hTwBFzNn8zJ1kqWfR91wzdM8hjRF4wP0=\ncloud.google.com/go/storage v1.56.1/go.mod h1:C9xuCZgFl3buo2HZU/1FncgvvOgTAs/rnh4gF4lMg0s=\ncloud.google.com/go/trace v1.11.7 h1:kDNDX8JkaAG3R2nq1lIdkb7FCSi1rCmsEtKVsty7p+U=\ncloud.google.com/go/trace v1.11.7/go.mod h1:TNn9d5V3fQVf6s4SCveVMIBS2LJUqo73GACmq/Tky0s=\ngithub.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.31.0 h1:DHa2U07rk8syqvCge0QIGMCE1WxGj9njT44GH7zNJLQ=\ngithub.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.31.0/go.mod h1:P4WPRUkOhJC13W//jWpyfJNDAIpvRbAUIYLX/4jtlE0=\ngithub.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.53.0 h1:owcC2UnmsZycprQ5RfRgjydWhuoxg71LUfyiQdijZuM=\ngithub.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.53.0/go.mod h1:ZPpqegjbE99EPKsu3iUWV22A04wzGPcAY/ziSIQEEgs=\ngithub.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.53.0 h1:4LP6hvB4I5ouTbGgWtixJhgED6xdf67twf9PoY96Tbg=\ngithub.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.53.0/go.mod h1:jUZ5LYlw40WMd07qxcQJD5M40aUxrfwqQX1g7zxYnrQ=\ngithub.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.53.0 h1:Ron4zCA/yk6U7WOBXhTJcDpsUBG9npumK6xw2auFltQ=\ngithub.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.53.0/go.mod h1:cSgYe11MCNYunTnRXrKiR/tHc0eoKjICUuWpNZoVCOo=\ngithub.com/a2aproject/a2a-go v0.3.10 h1:oiwxhxe6HlJiYupASW04aHixZeiZq1Y/fha2N1EWJyI=\ngithub.com/a2aproject/a2a-go v0.3.10/go.mod h1:I7Cm+a1oL+UT6zMoP+roaRE5vdfUa1iQGVN8aSOuZ0I=\ngithub.com/awalterschulze/gographviz v2.0.3+incompatible h1:9sVEXJBJLwGX7EQVhLm2elIKCm7P2YHFC8v6096G09E=\ngithub.com/awalterschulze/gographviz v2.0.3+incompatible/go.mod h1:GEV5wmg4YquNw7v1kkyoX9etIk8yVmXj+AkDHuuETHs=\ngithub.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM=\ngithub.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw=\ngithub.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=\ngithub.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cncf/xds/go v0.0.0-20251210132809-ee656c7534f5 h1:6xNmx7iTtyBRev0+D/Tv1FZd4SCg8axKApyNyRsAt/w=\ngithub.com/cncf/xds/go v0.0.0-20251210132809-ee656c7534f5/go.mod h1:KdCmV+x/BuvyMxRnYBlmVaq4OLiKW6iRQfvC62cvdkI=\ngithub.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY=\ngithub.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=\ngithub.com/envoyproxy/go-control-plane v0.14.0 h1:hbG2kr4RuFj222B6+7T83thSPqLjwBIfQawTkC++2HA=\ngithub.com/envoyproxy/go-control-plane v0.14.0/go.mod h1:NcS5X47pLl/hfqxU70yPwL9ZMkUlwlKxtAohpi2wBEU=\ngithub.com/envoyproxy/go-control-plane/envoy v1.36.0 h1:yg/JjO5E7ubRyKX3m07GF3reDNEnfOboJ0QySbH736g=\ngithub.com/envoyproxy/go-control-plane/envoy v1.36.0/go.mod h1:ty89S1YCCVruQAm9OtKeEkQLTb+Lkz0k8v9W0Oxsv98=\ngithub.com/envoyproxy/go-control-plane/ratelimit v0.1.0 h1:/G9QYbddjL25KvtKTv3an9lx6VBE2cnb8wp1vEGNYGI=\ngithub.com/envoyproxy/go-control-plane/ratelimit v0.1.0/go.mod h1:Wk+tMFAFbCXaJPzVVHnPgRKdUdwW/KdbRt94AzgRee4=\ngithub.com/envoyproxy/protoc-gen-validate v1.3.0 h1:TvGH1wof4H33rezVKWSpqKz5NXWg5VPuZ0uONDT6eb4=\ngithub.com/envoyproxy/protoc-gen-validate v1.3.0/go.mod h1:HvYl7zwPa5mffgyeTUHA9zHIH36nmrm7oCbo4YKoSWA=\ngithub.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg=\ngithub.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=\ngithub.com/glebarez/go-sqlite v1.21.1 h1:7MZyUPh2XTrHS7xNEHQbrhfMZuPSzhkm2A1qgg0y5NY=\ngithub.com/glebarez/go-sqlite v1.21.1/go.mod h1:ISs8MF6yk5cL4n/43rSOmVMGJJjHYr7L2MbZZ5Q4E2E=\ngithub.com/glebarez/sqlite v1.8.0 h1:02X12E2I/4C1n+v90yTqrjRa8yuo7c3KeHI3FRznCvc=\ngithub.com/glebarez/sqlite v1.8.0/go.mod h1:bpET16h1za2KOOMb8+jCp6UBP/iahDpfPQqSaYLTLx8=\ngithub.com/go-jose/go-jose/v4 v4.1.3 h1:CVLmWDhDVRa6Mi/IgCgaopNosCaHz7zrMeF9MlZRkrs=\ngithub.com/go-jose/go-jose/v4 v4.1.3/go.mod h1:x4oUasVrzR7071A4TnHLGSPpNOm2a21K9Kf04k1rs08=\ngithub.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI=\ngithub.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/golang-jwt/jwt/v5 v5.3.0 h1:pv4AsKCKKZuqlgs5sUmn4x8UlGa0kEVt/puTpKx9vvo=\ngithub.com/golang-jwt/jwt/v5 v5.3.0/go.mod h1:fxCRLWMO43lRc8nhHWY6LGqRcf+1gQWArsqaEUEa5bE=\ngithub.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=\ngithub.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=\ngithub.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=\ngithub.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=\ngithub.com/google/jsonschema-go v0.4.2 h1:tmrUohrwoLZZS/P3x7ex0WAVknEkBZM46iALbcqoRA8=\ngithub.com/google/jsonschema-go v0.4.2/go.mod h1:r5quNTdLOYEz95Ru18zA0ydNbBuYoo9tgaYcxEYhJVE=\ngithub.com/google/martian/v3 v3.3.3 h1:DIhPTQrbPkgs2yJYdXU/eNACCG5DVQjySNRNlflZ9Fc=\ngithub.com/google/martian/v3 v3.3.3/go.mod h1:iEPrYcgCF7jA9OtScMFQyAlZZ4YXTKEtJ1E6RWzmBA0=\ngithub.com/google/pprof v0.0.0-20221118152302-e6195bd50e26 h1:Xim43kblpZXfIBQsbuBVKCudVG457BR2GZFIz3uw3hQ=\ngithub.com/google/pprof v0.0.0-20221118152302-e6195bd50e26/go.mod h1:dDKJzRmX4S37WGHujM7tX//fmj1uioxKzKxz3lo4HJo=\ngithub.com/google/s2a-go v0.1.9 h1:LGD7gtMgezd8a/Xak7mEWL0PjoTQFvpRudN895yqKW0=\ngithub.com/google/s2a-go v0.1.9/go.mod h1:YA0Ei2ZQL3acow2O62kdp9UlnvMmU7kA6Eutn0dXayM=\ngithub.com/google/safehtml v0.1.0 h1:EwLKo8qawTKfsi0orxcQAZzu07cICaBeFMegAU9eaT8=\ngithub.com/google/safehtml v0.1.0/go.mod h1:L4KWwDsUJdECRAEpZoBn3O64bQaywRscowZjJAzjHnU=\ngithub.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=\ngithub.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/googleapis/enterprise-certificate-proxy v0.3.6 h1:GW/XbdyBFQ8Qe+YAmFU9uHLo7OnF5tL52HFAgMmyrf4=\ngithub.com/googleapis/enterprise-certificate-proxy v0.3.6/go.mod h1:MkHOF77EYAE7qfSuSS9PU6g4Nt4e11cnsDUowfwewLA=\ngithub.com/googleapis/gax-go/v2 v2.15.0 h1:SyjDc1mGgZU5LncH8gimWo9lW1DtIfPibOG81vgd/bo=\ngithub.com/googleapis/gax-go/v2 v2.15.0/go.mod h1:zVVkkxAQHa1RQpg9z2AUCMnKhi0Qld9rcmyfL1OZhoc=\ngithub.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY=\ngithub.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ=\ngithub.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg=\ngithub.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.27.7 h1:X+2YciYSxvMQK0UZ7sg45ZVabVZBeBuvMkmuI2V3Fak=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.27.7/go.mod h1:lW34nIZuQ8UDPdkon5fmfp2l3+ZkQ2me/+oecHYLOII=\ngithub.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=\ngithub.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=\ngithub.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng=\ngithub.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=\ngithub.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=\ngithub.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/modelcontextprotocol/go-sdk v1.4.1 h1:M4x9GyIPj+HoIlHNGpK2hq5o3BFhC+78PkEaldQRphc=\ngithub.com/modelcontextprotocol/go-sdk v1.4.1/go.mod h1:Bo/mS87hPQqHSRkMv4dQq1XCu6zv4INdXnFZabkNU6s=\ngithub.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo=\ngithub.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=\ngithub.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE=\ngithub.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=\ngithub.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ=\ngithub.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc=\ngithub.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=\ngithub.com/segmentio/asm v1.1.3 h1:WM03sfUOENvvKexOLp+pCqgb/WDjsi7EK8gIsICtzhc=\ngithub.com/segmentio/asm v1.1.3/go.mod h1:Ld3L4ZXGNcSLRg4JBsZ3//1+f/TjYl0Mzen/DQy1EJg=\ngithub.com/segmentio/encoding v0.5.4 h1:OW1VRern8Nw6ITAtwSZ7Idrl3MXCFwXHPgqESYfvNt0=\ngithub.com/segmentio/encoding v0.5.4/go.mod h1:HS1ZKa3kSN32ZHVZ7ZLPLXWvOVIiZtyJnO1gPH1sKt0=\ngithub.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM=\ngithub.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y=\ngithub.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=\ngithub.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk=\ngithub.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=\ngithub.com/spiffe/go-spiffe/v2 v2.6.0 h1:l+DolpxNWYgruGQVV0xsfeya3CsC7m8iBzDnMpsbLuo=\ngithub.com/spiffe/go-spiffe/v2 v2.6.0/go.mod h1:gm2SeUoMZEtpnzPNs2Csc0D/gX33k1xIx7lEzqblHEs=\ngithub.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=\ngithub.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=\ngithub.com/yosida95/uritemplate/v3 v3.0.2 h1:Ed3Oyj9yrmi9087+NczuL5BwkIc4wvTb5zIM+UJPGz4=\ngithub.com/yosida95/uritemplate/v3 v3.0.2/go.mod h1:ILOh0sOhIJR3+L/8afwt/kE++YT040gmv5BQTMR2HP4=\ngo.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64=\ngo.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y=\ngo.opentelemetry.io/contrib/detectors/gcp v1.40.0 h1:Awaf8gmW99tZTOWqkLCOl6aw1/rxAWVlHsHIZ3fT2sA=\ngo.opentelemetry.io/contrib/detectors/gcp v1.40.0/go.mod h1:99OY9ZCqyLkzJLTh5XhECpLRSxcZl+ZDKBEO+jMBFR4=\ngo.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.63.0 h1:YH4g8lQroajqUwWbq/tr2QX1JFmEXaDLgG+ew9bLMWo=\ngo.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.63.0/go.mod h1:fvPi2qXDqFs8M4B4fmJhE92TyQs9Ydjlg3RvfUp+NbQ=\ngo.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.63.0 h1:RbKq8BG0FI8OiXhBfcRtqqHcZcka+gU3cskNuf05R18=\ngo.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.63.0/go.mod h1:h06DGIukJOevXaj/xrNjhi/2098RZzcLTbc0jDAUbsg=\ngo.opentelemetry.io/otel v1.40.0 h1:oA5YeOcpRTXq6NN7frwmwFR0Cn3RhTVZvXsP4duvCms=\ngo.opentelemetry.io/otel v1.40.0/go.mod h1:IMb+uXZUKkMXdPddhwAHm6UfOwJyh4ct1ybIlV14J0g=\ngo.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.16.0 h1:djrxvDxAe44mJUrKataUbOhCKhR3F8QCyWucO16hTQs=\ngo.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.16.0/go.mod h1:dt3nxpQEiSoKvfTVxp3TUg5fHPLhKtbcnN3Z1I1ePD0=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.39.0 h1:f0cb2XPmrqn4XMy9PNliTgRKJgS5WcL/u0/WRYGz4t0=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.39.0/go.mod h1:vnakAaFckOMiMtOIhFI2MNH4FYrZzXCYxmb1LlhoGz8=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.39.0 h1:Ckwye2FpXkYgiHX7fyVrN1uA/UYd9ounqqTuSNAv0k4=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.39.0/go.mod h1:teIFJh5pW2y+AN7riv6IBPX2DuesS3HgP39mwOspKwU=\ngo.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.36.0 h1:rixTyDGXFxRy1xzhKrotaHy3/KXdPhlWARrCgK+eqUY=\ngo.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.36.0/go.mod h1:dowW6UsM9MKbJq5JTz2AMVp3/5iW5I/TStsk8S+CfHw=\ngo.opentelemetry.io/otel/log v0.16.0 h1:DeuBPqCi6pQwtCK0pO4fvMB5eBq6sNxEnuTs88pjsN4=\ngo.opentelemetry.io/otel/log v0.16.0/go.mod h1:rWsmqNVTLIA8UnwYVOItjyEZDbKIkMxdQunsIhpUMes=\ngo.opentelemetry.io/otel/metric v1.40.0 h1:rcZe317KPftE2rstWIBitCdVp89A2HqjkxR3c11+p9g=\ngo.opentelemetry.io/otel/metric v1.40.0/go.mod h1:ib/crwQH7N3r5kfiBZQbwrTge743UDc7DTFVZrrXnqc=\ngo.opentelemetry.io/otel/sdk v1.40.0 h1:KHW/jUzgo6wsPh9At46+h4upjtccTmuZCFAc9OJ71f8=\ngo.opentelemetry.io/otel/sdk v1.40.0/go.mod h1:Ph7EFdYvxq72Y8Li9q8KebuYUr2KoeyHx0DRMKrYBUE=\ngo.opentelemetry.io/otel/sdk/log v0.16.0 h1:e/b4bdlQwC5fnGtG3dlXUrNOnP7c8YLVSpSfEBIkTnI=\ngo.opentelemetry.io/otel/sdk/log v0.16.0/go.mod h1:JKfP3T6ycy7QEuv3Hj8oKDy7KItrEkus8XJE6EoSzw4=\ngo.opentelemetry.io/otel/sdk/log/logtest v0.16.0 h1:/XVkpZ41rVRTP4DfMgYv1nEtNmf65XPPyAdqV90TMy4=\ngo.opentelemetry.io/otel/sdk/log/logtest v0.16.0/go.mod h1:iOOPgQr5MY9oac/F5W86mXdeyWZGleIx3uXO98X2R6Y=\ngo.opentelemetry.io/otel/sdk/metric v1.40.0 h1:mtmdVqgQkeRxHgRv4qhyJduP3fYJRMX4AtAlbuWdCYw=\ngo.opentelemetry.io/otel/sdk/metric v1.40.0/go.mod h1:4Z2bGMf0KSK3uRjlczMOeMhKU2rhUqdWNoKcYrtcBPg=\ngo.opentelemetry.io/otel/trace v1.40.0 h1:WA4etStDttCSYuhwvEa8OP8I5EWu24lkOzp+ZYblVjw=\ngo.opentelemetry.io/otel/trace v1.40.0/go.mod h1:zeAhriXecNGP/s2SEG3+Y8X9ujcJOTqQ5RgdEJcawiA=\ngo.opentelemetry.io/proto/otlp v1.9.0 h1:l706jCMITVouPOqEnii2fIAuO3IVGBRPV5ICjceRb/A=\ngo.opentelemetry.io/proto/otlp v1.9.0/go.mod h1:xE+Cx5E/eEHw+ISFkwPLwCZefwVjY+pqKg1qcK03+/4=\ngo.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\ngo.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\ngolang.org/x/crypto v0.47.0 h1:V6e3FRj+n4dbpw86FJ8Fv7XVOql7TEwpHapKoMJ/GO8=\ngolang.org/x/crypto v0.47.0/go.mod h1:ff3Y9VzzKbwSSEzWqJsJVBnWmRwRSHt/6Op5n9bQc4A=\ngolang.org/x/net v0.49.0 h1:eeHFmOGUTtaaPSGNmjBKpbng9MulQsJURQUAfUwY++o=\ngolang.org/x/net v0.49.0/go.mod h1:/ysNB2EvaqvesRkuLAyjI1ycPZlQHM3q01F02UY/MV8=\ngolang.org/x/oauth2 v0.34.0 h1:hqK/t4AKgbqWkdkcAeI8XLmbK+4m4G5YeQRrmiotGlw=\ngolang.org/x/oauth2 v0.34.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA=\ngolang.org/x/sync v0.19.0 h1:vV+1eWNmZ5geRlYjzm2adRgW2/mcpevXNg50YZtPCE4=\ngolang.org/x/sync v0.19.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI=\ngolang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.41.0 h1:Ivj+2Cp/ylzLiEU89QhWblYnOE9zerudt9Ftecq2C6k=\ngolang.org/x/sys v0.41.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.33.0 h1:B3njUFyqtHDUI5jMn1YIr5B0IE2U0qck04r6d4KPAxE=\ngolang.org/x/text v0.33.0/go.mod h1:LuMebE6+rBincTi9+xWTY8TztLzKHc/9C1uBCG27+q8=\ngolang.org/x/time v0.14.0 h1:MRx4UaLrDotUKUdCIqzPC48t1Y9hANFKIRpNx+Te8PI=\ngolang.org/x/time v0.14.0/go.mod h1:eL/Oa2bBBK0TkX57Fyni+NgnyQQN4LitPmob2Hjnqw4=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.41.0 h1:a9b8iMweWG+S0OBnlU36rzLp20z1Rp10w+IY2czHTQc=\ngolang.org/x/tools v0.41.0/go.mod h1:XSY6eDqxVNiYgezAVqqCeihT4j1U2CCsqvH3WhQpnlg=\ngonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk=\ngonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E=\ngoogle.golang.org/api v0.252.0 h1:xfKJeAJaMwb8OC9fesr369rjciQ704AjU/psjkKURSI=\ngoogle.golang.org/api v0.252.0/go.mod h1:dnHOv81x5RAmumZ7BWLShB/u7JZNeyalImxHmtTHxqw=\ngoogle.golang.org/genai v1.40.0 h1:kYxyQSH+vsib8dvsgyLJzsVEIv5k3ZmHJyVqdvGncmc=\ngoogle.golang.org/genai v1.40.0/go.mod h1:A3kkl0nyBjyFlNjgxIwKq70julKbIxpSxqKO5gw/gmk=\ngoogle.golang.org/genproto v0.0.0-20251014184007-4626949a642f h1:vLd1CJuJOUgV6qijD7KT5Y2ZtC97ll4dxjTUappMnbo=\ngoogle.golang.org/genproto v0.0.0-20251014184007-4626949a642f/go.mod h1:PI3KrSadr00yqfv6UDvgZGFsmLqeRIwt8x4p5Oo7CdM=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20260128011058-8636f8732409 h1:merA0rdPeUV3YIIfHHcH4qBkiQAc1nfCKSI7lB4cV2M=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20260128011058-8636f8732409/go.mod h1:fl8J1IvUjCilwZzQowmw2b7HQB2eAuYBabMXzWurF+I=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20260128011058-8636f8732409 h1:H86B94AW+VfJWDqFeEbBPhEtHzJwJfTbgE2lZa54ZAQ=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20260128011058-8636f8732409/go.mod h1:j9x/tPzZkyxcgEFkiKEEGxfvyumM01BEtsW8xzOahRQ=\ngoogle.golang.org/grpc v1.79.3 h1:sybAEdRIEtvcD68Gx7dmnwjZKlyfuc61Dyo9pGXXkKE=\ngoogle.golang.org/grpc v1.79.3/go.mod h1:KmT0Kjez+0dde/v2j9vzwoAScgEPx/Bw1CYChhHLrHQ=\ngoogle.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE=\ngoogle.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngorm.io/gorm v1.31.0 h1:0VlycGreVhK7RF/Bwt51Fk8v0xLiiiFdbGDPIZQ7mJY=\ngorm.io/gorm v1.31.0/go.mod h1:XyQVbO2k6YkOis7C2437jSit3SsDK72s7n7rsSHd+Gs=\nmodernc.org/libc v1.22.3 h1:D/g6O5ftAfavceqlLOFwaZuA5KYafKwmr30A6iSqoyY=\nmodernc.org/libc v1.22.3/go.mod h1:MQrloYP209xa2zHome2a8HLiLm6k0UT8CoHpV74tOFw=\nmodernc.org/mathutil v1.5.0 h1:rV0Ko/6SfM+8G+yKiyI830l3Wuz1zRutdslNoQ0kfiQ=\nmodernc.org/mathutil v1.5.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E=\nmodernc.org/memory v1.5.0 h1:N+/8c5rE6EqugZwHii4IFsaJ7MUhoWX07J5tC/iI5Ds=\nmodernc.org/memory v1.5.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU=\nmodernc.org/sqlite v1.21.1 h1:GyDFqNnESLOhwwDRaHGdp2jKLDzpyT/rNLglX3ZkMSU=\nmodernc.org/sqlite v1.21.1/go.mod h1:XwQ0wZPIh1iKb5mkvCJ3szzbhk+tykC8ZWqTRTgYRwI=\nrsc.io/omap v1.2.0 h1:c1M8jchnHbzmJALzGLclfH3xDWXrPxSUHXzH5C+8Kdw=\nrsc.io/omap v1.2.0/go.mod h1:C8pkI0AWexHopQtZX+qiUeJGzvc8HkdgnsWK4/mAa00=\nrsc.io/ordered v1.1.1 h1:1kZM6RkTmceJgsFH/8DLQvkCVEYomVDJfBRLT595Uak=\nrsc.io/ordered v1.1.1/go.mod h1:evAi8739bWVBRG9aaufsjVc202+6okf8u2QeVL84BCM=\n"
  },
  {
    "path": "internal/agent/parentmap/map.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage parentmap\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\t\"google.golang.org/adk/agent\"\n)\n\ntype Map map[string]agent.Agent\n\n// New creates parent map allowing to fetch agent's parent.\n// It ensures that agent can have at most one parent.\n// It ensures that the root node name is not referenced again in the agent tree\nfunc New(root agent.Agent) (Map, error) {\n\tres := make(map[string]agent.Agent)\n\trootName := root.Name()\n\tpointerMap := map[agent.Agent]string{root: \"is root agent\"}\n\n\tvar f func(cur agent.Agent) error\n\tf = func(cur agent.Agent) error {\n\t\tfor _, subAgent := range cur.SubAgents() {\n\t\t\tif p, ok := pointerMap[subAgent]; ok {\n\t\t\t\treturn fmt.Errorf(\"%q agent cannot have >1 parents, found: %q, %q\", subAgent.Name(), p, cur.Name())\n\t\t\t}\n\t\t\tif _, ok := res[subAgent.Name()]; ok || subAgent.Name() == rootName {\n\t\t\t\treturn fmt.Errorf(\"agent names must be unique in the agent tree, found duplicate: %q\", subAgent.Name())\n\t\t\t}\n\t\t\tres[subAgent.Name()] = cur\n\t\t\tpointerMap[subAgent] = cur.Name()\n\n\t\t\tif err := f(subAgent); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t\treturn nil\n\t}\n\n\treturn res, f(root)\n}\n\n// RootAgent returns the root of the agent tree.\nfunc (m Map) RootAgent(cur agent.Agent) agent.Agent {\n\tif cur == nil {\n\t\treturn nil\n\t}\n\tfor {\n\t\tparent := m[cur.Name()]\n\t\tif parent == nil {\n\t\t\treturn cur\n\t\t}\n\t\tcur = parent\n\t}\n}\n\nfunc ToContext(ctx context.Context, parents Map) context.Context {\n\treturn context.WithValue(ctx, mapCtxKey, parents)\n}\n\nfunc FromContext(ctx context.Context) Map {\n\tm, ok := ctx.Value(mapCtxKey).(Map)\n\tif !ok {\n\t\treturn nil\n\t}\n\treturn m\n}\n\ntype ctxKey int\n\nconst mapCtxKey ctxKey = 0\n"
  },
  {
    "path": "internal/agent/parentmap/map_test.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage parentmap_test\n\nimport (\n\t\"testing\"\n\n\t\"github.com/google/go-cmp/cmp\"\n\n\t\"google.golang.org/adk/agent\"\n\t\"google.golang.org/adk/agent/llmagent\"\n\t\"google.golang.org/adk/internal/agent/parentmap\"\n\t\"google.golang.org/adk/internal/utils\"\n\t\"google.golang.org/adk/model\"\n)\n\nfunc TestNew(t *testing.T) {\n\tchild1_1 := utils.Must(agent.New(agent.Config{\n\t\tName: \"child1_1\",\n\t}))\n\n\tchild1 := utils.Must(agent.New(agent.Config{\n\t\tName:      \"child1\",\n\t\tSubAgents: []agent.Agent{child1_1},\n\t}))\n\n\tchild2 := utils.Must(agent.New(agent.Config{\n\t\tName: \"child2\",\n\t}))\n\n\troot := utils.Must(agent.New(agent.Config{\n\t\tName:      \"root\",\n\t\tSubAgents: []agent.Agent{child1, child2},\n\t}))\n\n\tgot, err := parentmap.New(root)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\twant := parentmap.Map{\n\t\tchild1_1.Name(): child1,\n\t\tchild1.Name():   root,\n\t\tchild2.Name():   root,\n\t}\n\n\tagentNames := cmp.Transformer(\"agentNames\", func(m parentmap.Map) map[string]string {\n\t\tif m == nil {\n\t\t\treturn nil\n\t\t}\n\t\tres := make(map[string]string)\n\t\tfor k, v := range m {\n\t\t\tres[k] = v.Name()\n\t\t}\n\t\treturn res\n\t})\n\n\tif diff := cmp.Diff(want, got, agentNames); diff != \"\" {\n\t\tt.Errorf(\"New() = %v, got %v diff (-want/+got): %v\", got, want, diff)\n\t}\n}\n\nfunc TestMap_RootAgent(t *testing.T) {\n\tmodel := struct {\n\t\tmodel.LLM\n\t}{}\n\n\tnonLLM := utils.Must(agent.New(agent.Config{\n\t\tName: \"mock\",\n\t}))\n\tb := utils.Must(llmagent.New(llmagent.Config{\n\t\tName:      \"b\",\n\t\tModel:     model,\n\t\tSubAgents: []agent.Agent{nonLLM},\n\t}))\n\ta := utils.Must(llmagent.New(llmagent.Config{\n\t\tName:      \"a\",\n\t\tModel:     model,\n\t\tSubAgents: []agent.Agent{b},\n\t}))\n\troot := utils.Must(llmagent.New(llmagent.Config{\n\t\tName:      \"root\",\n\t\tModel:     model,\n\t\tSubAgents: []agent.Agent{a},\n\t}))\n\n\tagentName := func(a agent.Agent) string {\n\t\tif a == nil {\n\t\t\treturn \"nil\"\n\t\t}\n\t\treturn a.Name()\n\t}\n\n\tparents, err := parentmap.New(root)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\tfor _, tc := range []struct {\n\t\tagent agent.Agent\n\t\twant  agent.Agent\n\t}{\n\t\t{root, root},\n\t\t{a, root},\n\t\t{b, root},\n\t\t{nonLLM, root},\n\t\t{nil, nil},\n\t} {\n\t\tt.Run(\"agent=\"+agentName(tc.agent), func(t *testing.T) {\n\t\t\tgotRoot := parents.RootAgent(tc.agent)\n\t\t\tif got, want := agentName(gotRoot), agentName(tc.want); got != want {\n\t\t\t\tt.Errorf(\"rootAgent(%q) = %q, want %q\", agentName(tc.agent), got, want)\n\t\t\t}\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "internal/agent/remoteagent/a2a_config.go",
    "content": "// Copyright 2026 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage remoteagent\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"os\"\n\t\"strings\"\n\n\t\"github.com/a2aproject/a2a-go/a2a\"\n\t\"github.com/a2aproject/a2a-go/a2aclient\"\n\t\"github.com/a2aproject/a2a-go/a2aclient/agentcard\"\n)\n\n// RemoteAgentState holds the internal state of a remote agent.\ntype RemoteAgentState struct {\n\t// A2A holds the A2A configuration if remote agent is an A2A agent.\n\tA2A *A2AServerConfig\n}\n\n// A2AServerConfig is used to describe and configure a remote agent.\ntype A2AServerConfig struct {\n\t// AgentCardSource can be either an http(s) URL or a local file path. If a2a.AgentCard\n\t// is not provided, the source is used to resolve the card during the first agent invocation.\n\tAgentCard       *a2a.AgentCard\n\tAgentCardSource string\n\t// CardResolveOptions can be used to provide a set of agencard.Resolver configurations.\n\tCardResolveOptions []agentcard.ResolveOption\n\t// ClientFactory can be used to provide a set of a2aclient.Client configurations.\n\tClientFactory *a2aclient.Factory\n}\n\nfunc CreateA2AClient(ctx context.Context, cfg *A2AServerConfig) (*a2a.AgentCard, *a2aclient.Client, error) {\n\tcard, err := resolveAgentCard(ctx, cfg)\n\tif err != nil {\n\t\treturn nil, nil, fmt.Errorf(\"agent card resolution failed: %w\", err)\n\t}\n\n\tvar client *a2aclient.Client\n\tif cfg.ClientFactory != nil {\n\t\tclient, err = cfg.ClientFactory.CreateFromCard(ctx, card)\n\t} else {\n\t\tclient, err = a2aclient.NewFromCard(ctx, card)\n\t}\n\tif err != nil {\n\t\treturn nil, nil, fmt.Errorf(\"client creation failed: %w\", err)\n\t}\n\treturn card, client, nil\n}\n\nfunc resolveAgentCard(ctx context.Context, cfg *A2AServerConfig) (*a2a.AgentCard, error) {\n\tif cfg.AgentCard != nil {\n\t\treturn cfg.AgentCard, nil\n\t}\n\n\tif strings.HasPrefix(cfg.AgentCardSource, \"http://\") || strings.HasPrefix(cfg.AgentCardSource, \"https://\") {\n\t\tcard, err := agentcard.DefaultResolver.Resolve(ctx, cfg.AgentCardSource, cfg.CardResolveOptions...)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"failed to fetch an agent card: %w\", err)\n\t\t}\n\t\treturn card, nil\n\t}\n\n\tfileBytes, err := os.ReadFile(cfg.AgentCardSource)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to read agent card from %q: %w\", cfg.AgentCardSource, err)\n\t}\n\n\tvar card a2a.AgentCard\n\tif err := json.Unmarshal(fileBytes, &card); err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to unmarshal an agent card: %w\", err)\n\t}\n\treturn &card, nil\n}\n"
  },
  {
    "path": "internal/agent/runconfig/run_config.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage runconfig\n\nimport \"context\"\n\ntype StreamingMode string\n\nconst (\n\tStreamingModeNone StreamingMode = \"none\"\n\tStreamingModeSSE  StreamingMode = \"sse\"\n\tStreamingModeBidi StreamingMode = \"bidi\"\n)\n\ntype RunConfig struct {\n\tStreamingMode StreamingMode\n}\n\nfunc ToContext(ctx context.Context, cfg *RunConfig) context.Context {\n\treturn context.WithValue(ctx, runConfigCtxKey, cfg)\n}\n\nfunc FromContext(ctx context.Context) *RunConfig {\n\tm, ok := ctx.Value(runConfigCtxKey).(*RunConfig)\n\tif !ok {\n\t\treturn nil\n\t}\n\treturn m\n}\n\ntype ctxKey int\n\nconst runConfigCtxKey ctxKey = 0\n"
  },
  {
    "path": "internal/agent/state.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage agent\n\n// holds Agent internal state\ntype Agent interface {\n\tinternal() *State\n}\n\ntype State struct {\n\tAgentType Type\n\tConfig    any\n}\n\ntype Type string\n\nconst (\n\tTypeLLMAgent        Type = \"LLMAgent\"\n\tTypeLoopAgent       Type = \"LoopAgent\"\n\tTypeSequentialAgent Type = \"SequentialAgent\"\n\tTypeParallelAgent   Type = \"ParallelAgent\"\n\tTypeCustomAgent     Type = \"CustomAgent\"\n\tTypeRemoteAgent     Type = \"RemoteAgent\"\n)\n\nfunc (s *State) internal() *State { return s }\n\nfunc Reveal(a Agent) *State { return a.internal() }\n"
  },
  {
    "path": "internal/artifact/artifacts.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage artifact\n\nimport (\n\t\"context\"\n\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/agent\"\n\t\"google.golang.org/adk/artifact\"\n)\n\n// Artifacts implements Artifacts\ntype Artifacts struct {\n\tService   artifact.Service\n\tAppName   string\n\tUserID    string\n\tSessionID string\n}\n\nfunc (a *Artifacts) Save(ctx context.Context, name string, data *genai.Part) (*artifact.SaveResponse, error) {\n\treturn a.Service.Save(ctx, &artifact.SaveRequest{\n\t\tAppName:   a.AppName,\n\t\tUserID:    a.UserID,\n\t\tSessionID: a.SessionID,\n\t\tFileName:  name,\n\t\tPart:      data,\n\t})\n}\n\nfunc (a *Artifacts) Load(ctx context.Context, name string) (*artifact.LoadResponse, error) {\n\treturn a.Service.Load(ctx, &artifact.LoadRequest{\n\t\tAppName:   a.AppName,\n\t\tUserID:    a.UserID,\n\t\tSessionID: a.SessionID,\n\t\tFileName:  name,\n\t})\n}\n\nfunc (a *Artifacts) LoadVersion(ctx context.Context, name string, version int) (*artifact.LoadResponse, error) {\n\treturn a.Service.Load(ctx, &artifact.LoadRequest{\n\t\tAppName:   a.AppName,\n\t\tUserID:    a.UserID,\n\t\tSessionID: a.SessionID,\n\t\tFileName:  name,\n\t\tVersion:   int64(version),\n\t})\n}\n\nfunc (a *Artifacts) List(ctx context.Context) (*artifact.ListResponse, error) {\n\treturn a.Service.List(ctx, &artifact.ListRequest{\n\t\tAppName:   a.AppName,\n\t\tUserID:    a.UserID,\n\t\tSessionID: a.SessionID,\n\t})\n}\n\nvar _ agent.Artifacts = (*Artifacts)(nil)\n"
  },
  {
    "path": "internal/artifact/artifacts_test.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage artifact_test\n\nimport (\n\t\"testing\"\n\n\t\"github.com/google/go-cmp/cmp\"\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/artifact\"\n\tartifactinternal \"google.golang.org/adk/internal/artifact\"\n)\n\nfunc TestArtifacts(t *testing.T) {\n\ta := artifactinternal.Artifacts{\n\t\tService:   artifact.InMemoryService(),\n\t\tAppName:   \"testApp\",\n\t\tUserID:    \"testUser\",\n\t\tSessionID: \"testSession\",\n\t}\n\n\t// Save\n\tpart := genai.NewPartFromText(\"test data\")\n\t_, err := a.Save(t.Context(), \"testArtifact\", part)\n\tif err != nil {\n\t\tt.Fatalf(\"Save failed: %v\", err)\n\t}\n\n\t// Load\n\tloadResp, err := a.Load(t.Context(), \"testArtifact\")\n\tif err != nil {\n\t\tt.Fatalf(\"Load failed: %v\", err)\n\t}\n\n\tif diff := cmp.Diff(part, loadResp.Part); diff != \"\" {\n\t\tt.Errorf(\"Loaded part differs from saved part (-want +got):\\n%s\", diff)\n\t}\n\n\t// List\n\tlistResp, err := a.List(t.Context())\n\tif err != nil {\n\t\tt.Fatalf(\"List failed: %v\", err)\n\t}\n\n\texpectedFileNames := []string{\"testArtifact\"}\n\tif diff := cmp.Diff(expectedFileNames, listResp.FileNames); diff != \"\" {\n\t\tt.Errorf(\"List returned unexpected file names (-want +got):\\n%s\", diff)\n\t}\n}\n\nfunc TestArtifacts_WithLoadVersion(t *testing.T) {\n\ta := artifactinternal.Artifacts{\n\t\tService:   artifact.InMemoryService(),\n\t\tAppName:   \"testApp\",\n\t\tUserID:    \"testUser\",\n\t\tSessionID: \"testSession\",\n\t}\n\n\tpart := genai.NewPartFromText(\"test data\")\n\t_, err := a.Save(t.Context(), \"testArtifact\", part)\n\tif err != nil {\n\t\tt.Fatalf(\"Save failed: %v\", err)\n\t}\n\tpart2 := genai.NewPartFromText(\"test data 2\")\n\t_, err = a.Save(t.Context(), \"testArtifact\", part2)\n\tif err != nil {\n\t\tt.Fatalf(\"Save failed: %v\", err)\n\t}\n\n\tloadResp, err := a.LoadVersion(t.Context(), \"testArtifact\", 0)\n\tif err != nil {\n\t\tt.Fatalf(\"Load failed: %v\", err)\n\t}\n\n\tif diff := cmp.Diff(part2, loadResp.Part); diff != \"\" {\n\t\tt.Errorf(\"Loaded part differs from saved part (-want +got):\\n%s\", diff)\n\t}\n}\n\nfunc TestArtifacts_Errors(t *testing.T) {\n\ta := artifactinternal.Artifacts{\n\t\tService:   artifact.InMemoryService(),\n\t\tAppName:   \"testApp\",\n\t\tUserID:    \"testUser\",\n\t\tSessionID: \"testSession\",\n\t}\n\n\t// Attempt to Load non-existent artifact\n\t_, err := a.Load(t.Context(), \"nonExistentArtifact\")\n\tif err == nil {\n\t\tt.Errorf(\"Load(\\\"nonExistentArtifact\\\") succeeded, want error\")\n\t}\n\n\t// Attempt to LoadVersion non-existent artifact\n\t_, err = a.LoadVersion(t.Context(), \"nonExistentArtifact\", 0)\n\tif err == nil {\n\t\tt.Errorf(\"LoadVersion(\\\"nonExistentArtifact\\\", 0) succeeded, want error\")\n\t}\n\n\t// Save an artifact to test LoadVersion with an invalid version\n\tpart := genai.NewPartFromText(\"test data\")\n\tif _, err := a.Save(t.Context(), \"existsArtifact\", part); err != nil {\n\t\tt.Fatalf(\"Save(\\\"existsArtifact\\\") failed: %v\", err)\n\t}\n\n\t// Attempt to LoadVersion with a version number that doesn't exist\n\t_, err = a.LoadVersion(t.Context(), \"existsArtifact\", 99)\n\tif err == nil {\n\t\tt.Errorf(\"LoadVersion(\\\"existsArtifact\\\", 99) succeeded, want error\")\n\t}\n}\n"
  },
  {
    "path": "internal/artifact/tests/service_suite.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage tests\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io/fs\"\n\t\"slices\"\n\t\"testing\"\n\n\t\"github.com/google/go-cmp/cmp\"\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/artifact\"\n)\n\nfunc TestArtifactService(t *testing.T, name string, factory func(t *testing.T) (artifact.Service, error)) {\n\tt.Run(fmt.Sprintf(\"Test%sArtifactService\", name), func(t *testing.T) {\n\t\tctx := t.Context()\n\t\t// Create the service using the factory for this sub-test\n\t\tsrv, err := factory(t)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"Failed to set up service: %v\", err)\n\t\t}\n\t\ttestArtifactService(ctx, t, srv, name)\n\t})\n\tt.Run(fmt.Sprintf(\"Test%sArtifactService_Empty\", name), func(t *testing.T) {\n\t\tctx := t.Context()\n\t\t// Create the service using the factory for this sub-test\n\t\tsrv, err := factory(t)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"Failed to set up service: %v\", err)\n\t\t}\n\t\ttestArtifactService_Empty(ctx, t, srv, name)\n\t})\n\tt.Run(fmt.Sprintf(\"Test%sArtifactService_UserScoped\", name), func(t *testing.T) {\n\t\tctx := t.Context()\n\t\t// Create the service using the factory for this sub-test\n\t\tsrv, err := factory(t)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"Failed to set up service: %v\", err)\n\t\t}\n\t\ttestArtifactService_UserScoped(ctx, t, srv, name)\n\t})\n}\n\nfunc testArtifactService(ctx context.Context, t *testing.T, srv artifact.Service, testSuffix string) {\n\tappName := \"testapp\"\n\tuserID := \"testuser\"\n\tsessionID := \"testsession\"\n\n\t// Save these artifacts for later subtests.\n\ttestData := []struct {\n\t\tfileName string\n\t\tversion  int64\n\t\tartifact *genai.Part\n\t}{\n\t\t// file1.\n\t\t{\"file1\", 1, genai.NewPartFromBytes([]byte(\"file v1\"), \"text/plain\")},\n\t\t{\"file1\", 2, genai.NewPartFromBytes([]byte(\"file v2\"), \"text/plain\")},\n\t\t{\"file1\", 3, genai.NewPartFromBytes([]byte(\"file v3\"), \"text/plain\")},\n\t\t// file2.\n\t\t{\"file2\", 1, genai.NewPartFromBytes([]byte(\"file v3\"), \"text/plain\")},\n\t\t// file3.\n\t\t{\"file3\", 1, genai.NewPartFromText(\"file v1\")},\n\t}\n\n\tt.Log(\"Save file1 and file2\")\n\tfor i, data := range testData {\n\t\twantVersion := data.version\n\t\tgot, err := srv.Save(ctx, &artifact.SaveRequest{\n\t\t\tAppName: appName, UserID: userID, SessionID: sessionID, FileName: data.fileName,\n\t\t\tPart: data.artifact,\n\t\t})\n\t\tif err != nil || got.Version != wantVersion {\n\t\t\tt.Errorf(\"[%d] Save() = (%v, %v), want (%v, nil)\", i, got.Version, err, wantVersion)\n\t\t\tcontinue\n\t\t}\n\t}\n\n\tt.Run(fmt.Sprintf(\"Load_%s\", testSuffix), func(t *testing.T) {\n\t\tfileName := \"file1\"\n\t\tfor _, tc := range []struct {\n\t\t\tname    string\n\t\t\tversion int64\n\t\t\twant    *genai.Part\n\t\t}{\n\t\t\t{\"latest\", 0, genai.NewPartFromBytes([]byte(\"file v3\"), \"text/plain\")},\n\t\t\t{\"ver=1\", 1, genai.NewPartFromBytes([]byte(\"file v1\"), \"text/plain\")},\n\t\t\t{\"ver=2\", 2, genai.NewPartFromBytes([]byte(\"file v2\"), \"text/plain\")},\n\t\t} {\n\t\t\tgot, err := srv.Load(ctx, &artifact.LoadRequest{\n\t\t\t\tAppName: appName, UserID: userID, SessionID: sessionID, FileName: fileName,\n\t\t\t\tVersion: tc.version,\n\t\t\t})\n\t\t\tif err != nil || !cmp.Equal(got.Part, tc.want) {\n\t\t\t\tt.Errorf(\"Load(%v) = (%v, %v), want (%v, nil)\", tc.version, got.Part, err, tc.want)\n\t\t\t}\n\t\t}\n\t})\n\n\tt.Run(fmt.Sprintf(\"List_%s\", testSuffix), func(t *testing.T) {\n\t\tresp, err := srv.List(ctx, &artifact.ListRequest{\n\t\t\tAppName: appName, UserID: userID, SessionID: sessionID,\n\t\t})\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"List() failed: %v\", err)\n\t\t}\n\t\tgot := resp.FileNames\n\t\tslices.Sort(got)\n\t\twant := []string{\"file1\", \"file2\", \"file3\"} // testData has two files.\n\t\tif diff := cmp.Diff(got, want); diff != \"\" {\n\t\t\tt.Errorf(\"List() = %v, want %v\", got, want)\n\t\t}\n\t})\n\n\tt.Run(fmt.Sprintf(\"Versions_%s\", testSuffix), func(t *testing.T) {\n\t\tresp, err := srv.Versions(ctx, &artifact.VersionsRequest{\n\t\t\tAppName: appName, UserID: userID, SessionID: sessionID, FileName: \"file1\",\n\t\t})\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"Versions() failed: %v\", err)\n\t\t}\n\t\tgot := resp.Versions\n\t\tslices.Sort(got)\n\t\twant := []int64{1, 2, 3}\n\t\tif diff := cmp.Diff(got, want); diff != \"\" {\n\t\t\tt.Errorf(\"Versions('file1') = %v, want %v\", got, want)\n\t\t}\n\t})\n\n\tt.Log(\"Delete file1 version 3\")\n\tif err := srv.Delete(ctx, &artifact.DeleteRequest{\n\t\tAppName: appName, UserID: userID, SessionID: sessionID, FileName: \"file1\",\n\t\tVersion: 3,\n\t}); err != nil {\n\t\tt.Fatalf(\"Delete(file1@v3) failed: %v\", err)\n\t}\n\n\tt.Run(fmt.Sprintf(\"LoadAfterDeleteVersion3_%s\", testSuffix), func(t *testing.T) {\n\t\tresp, err := srv.Load(ctx, &artifact.LoadRequest{\n\t\t\tAppName: appName, UserID: userID, SessionID: sessionID, FileName: \"file1\",\n\t\t})\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"Load('file1') failed: %v\", err)\n\t\t}\n\t\tgot := resp.Part\n\t\twant := genai.NewPartFromBytes([]byte(\"file v2\"), \"text/plain\")\n\t\tif diff := cmp.Diff(got, want); diff != \"\" {\n\t\t\tt.Fatalf(\"Load('file1') = (%v, %v), want (%v, nil)\", got, err, want)\n\t\t}\n\t})\n\n\tif err := srv.Delete(ctx, &artifact.DeleteRequest{\n\t\tAppName: appName, UserID: userID, SessionID: sessionID, FileName: \"file1\",\n\t}); err != nil {\n\t\tt.Fatalf(\"Delete(file1) failed: %v\", err)\n\t}\n\n\tt.Run(fmt.Sprintf(\"LoadAfterDelete_%s\", testSuffix), func(t *testing.T) {\n\t\tgot, err := srv.Load(ctx, &artifact.LoadRequest{\n\t\t\tAppName: appName, UserID: userID, SessionID: sessionID, FileName: \"file1\",\n\t\t})\n\t\tif !errors.Is(err, fs.ErrNotExist) {\n\t\t\tt.Fatalf(\"Load('file1') = (%v, %v), want error(%v)\", got, err, fs.ErrNotExist)\n\t\t}\n\t})\n\n\tt.Run(fmt.Sprintf(\"ListAfterDelete_%s\", testSuffix), func(t *testing.T) {\n\t\tresp, err := srv.List(ctx, &artifact.ListRequest{\n\t\t\tAppName: appName, UserID: userID, SessionID: sessionID,\n\t\t})\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"List() failed: %v\", err)\n\t\t}\n\t\tgot := resp.FileNames\n\t\tslices.Sort(got)\n\t\twant := []string{\"file2\", \"file3\"} // testData has two files.\n\t\tif diff := cmp.Diff(got, want); diff != \"\" {\n\t\t\tt.Errorf(\"List() = %v, want %v\", got, want)\n\t\t}\n\t})\n\n\tt.Run(fmt.Sprintf(\"VersionsAfterDelete_%s\", testSuffix), func(t *testing.T) {\n\t\tgot, err := srv.Versions(ctx, &artifact.VersionsRequest{\n\t\t\tAppName: appName, UserID: userID, SessionID: sessionID, FileName: \"file1\",\n\t\t})\n\t\tif !errors.Is(err, fs.ErrNotExist) {\n\t\t\tt.Fatalf(\"Versions('file1') = (%v, %v), want error(%v)\", got, err, fs.ErrNotExist)\n\t\t}\n\t})\n\n\t// Clean up\n\tif err := srv.Delete(ctx, &artifact.DeleteRequest{\n\t\tAppName: appName, UserID: userID, SessionID: sessionID, FileName: \"file2\",\n\t}); err != nil {\n\t\tt.Fatalf(\"Delete(file2) failed: %v\", err)\n\t}\n\tif err := srv.Delete(ctx, &artifact.DeleteRequest{\n\t\tAppName: appName, UserID: userID, SessionID: sessionID, FileName: \"file3\",\n\t}); err != nil {\n\t\tt.Fatalf(\"Delete(file3) failed: %v\", err)\n\t}\n}\n\nfunc testArtifactService_UserScoped(ctx context.Context, t *testing.T, srv artifact.Service, testSuffix string) {\n\tappName := \"testapp\"\n\tuserID := \"testuser\"\n\tsessionID := \"testsession\"\n\n\t// Save these artifacts for later subtests.\n\ttestData := []struct {\n\t\tfileName string\n\t\tversion  int64\n\t\tartifact *genai.Part\n\t}{\n\t\t// file1.\n\t\t{\"user:file1\", 1, genai.NewPartFromBytes([]byte(\"file v1\"), \"text/plain\")},\n\t\t{\"user:file1\", 2, genai.NewPartFromBytes([]byte(\"file v2\"), \"text/plain\")},\n\t\t{\"user:file1\", 3, genai.NewPartFromBytes([]byte(\"file v3\"), \"text/plain\")},\n\t\t// file2.\n\t\t{\"file2\", 1, genai.NewPartFromBytes([]byte(\"file v3\"), \"text/plain\")},\n\t\t// file3.\n\t\t{\"user:file3\", 1, genai.NewPartFromText(\"file v1\")},\n\t}\n\n\tt.Log(\"Save file1 and file2\")\n\tfor i, data := range testData {\n\t\twantVersion := data.version\n\t\tgot, err := srv.Save(ctx, &artifact.SaveRequest{\n\t\t\tAppName: appName, UserID: userID, SessionID: sessionID, FileName: data.fileName,\n\t\t\tPart: data.artifact,\n\t\t})\n\t\tif err != nil || got.Version != wantVersion {\n\t\t\tt.Errorf(\"[%d] Save() = (%v, %v), want (%v, nil)\", i, got.Version, err, wantVersion)\n\t\t\tcontinue\n\t\t}\n\t}\n\n\tt.Run(fmt.Sprintf(\"Load_%s\", testSuffix), func(t *testing.T) {\n\t\tfileName := \"user:file1\"\n\t\tfor _, tc := range []struct {\n\t\t\tname    string\n\t\t\tversion int64\n\t\t\twant    *genai.Part\n\t\t}{\n\t\t\t{\"latest\", 0, genai.NewPartFromBytes([]byte(\"file v3\"), \"text/plain\")},\n\t\t\t{\"ver=1\", 1, genai.NewPartFromBytes([]byte(\"file v1\"), \"text/plain\")},\n\t\t\t{\"ver=2\", 2, genai.NewPartFromBytes([]byte(\"file v2\"), \"text/plain\")},\n\t\t} {\n\t\t\tgot, err := srv.Load(ctx, &artifact.LoadRequest{\n\t\t\t\tAppName: appName, UserID: userID, SessionID: \"'user' should be used instead\", FileName: fileName,\n\t\t\t\tVersion: tc.version,\n\t\t\t})\n\t\t\tif err != nil || !cmp.Equal(got.Part, tc.want) {\n\t\t\t\tt.Errorf(\"Load(%v) = (%v, %v), want (%v, nil)\", tc.version, got.Part, err, tc.want)\n\t\t\t}\n\t\t}\n\t})\n\n\tt.Run(fmt.Sprintf(\"List_%s\", testSuffix), func(t *testing.T) {\n\t\tresp, err := srv.List(ctx, &artifact.ListRequest{\n\t\t\tAppName: appName, UserID: userID, SessionID: sessionID,\n\t\t})\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"List() failed: %v\", err)\n\t\t}\n\t\tgot := resp.FileNames\n\t\twant := []string{\"file2\", \"user:file1\", \"user:file3\"} // testData has two files.\n\t\tif diff := cmp.Diff(got, want); diff != \"\" {\n\t\t\tt.Errorf(\"List() = %v, want %v\", got, want)\n\t\t}\n\t})\n\n\tt.Run(fmt.Sprintf(\"Versions_%s\", testSuffix), func(t *testing.T) {\n\t\tresp, err := srv.Versions(ctx, &artifact.VersionsRequest{\n\t\t\tAppName: appName, UserID: userID, SessionID: sessionID, FileName: \"user:file1\",\n\t\t})\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"Versions() failed: %v\", err)\n\t\t}\n\t\tgot := resp.Versions\n\t\tslices.Sort(got)\n\t\twant := []int64{1, 2, 3}\n\t\tif diff := cmp.Diff(got, want); diff != \"\" {\n\t\t\tt.Errorf(\"Versions('user:file1') = %v, want %v\", got, want)\n\t\t}\n\t})\n\n\tt.Log(\"Delete user:file1 version 3\")\n\tif err := srv.Delete(ctx, &artifact.DeleteRequest{\n\t\tAppName: appName, UserID: userID, SessionID: sessionID, FileName: \"user:file1\",\n\t\tVersion: 3,\n\t}); err != nil {\n\t\tt.Fatalf(\"Delete(user:file1@v3) failed: %v\", err)\n\t}\n\n\tt.Run(fmt.Sprintf(\"LoadAfterDeleteVersion3_%s\", testSuffix), func(t *testing.T) {\n\t\tresp, err := srv.Load(ctx, &artifact.LoadRequest{\n\t\t\tAppName: appName, UserID: userID, SessionID: sessionID, FileName: \"user:file1\",\n\t\t})\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"Load('user:file1') failed: %v\", err)\n\t\t}\n\t\tgot := resp.Part\n\t\twant := genai.NewPartFromBytes([]byte(\"file v2\"), \"text/plain\")\n\t\tif diff := cmp.Diff(got, want); diff != \"\" {\n\t\t\tt.Fatalf(\"Load('user:file1') = (%v, %v), want (%v, nil)\", got, err, want)\n\t\t}\n\t})\n\n\tif err := srv.Delete(ctx, &artifact.DeleteRequest{\n\t\tAppName: appName, UserID: userID, SessionID: sessionID, FileName: \"user:file1\",\n\t}); err != nil {\n\t\tt.Fatalf(\"Delete(user:file1) failed: %v\", err)\n\t}\n\n\tt.Run(fmt.Sprintf(\"LoadAfterDelete_%s\", testSuffix), func(t *testing.T) {\n\t\tgot, err := srv.Load(ctx, &artifact.LoadRequest{\n\t\t\tAppName: appName, UserID: userID, SessionID: sessionID, FileName: \"user:file1\",\n\t\t})\n\t\tif !errors.Is(err, fs.ErrNotExist) {\n\t\t\tt.Fatalf(\"Load('user:file1') = (%v, %v), want error(%v)\", got, err, fs.ErrNotExist)\n\t\t}\n\t})\n\n\tt.Run(fmt.Sprintf(\"ListAfterDelete_%s\", testSuffix), func(t *testing.T) {\n\t\tresp, err := srv.List(ctx, &artifact.ListRequest{\n\t\t\tAppName: appName, UserID: userID, SessionID: sessionID,\n\t\t})\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"List() failed: %v\", err)\n\t\t}\n\t\tgot := resp.FileNames\n\t\tslices.Sort(got)\n\t\twant := []string{\"file2\", \"user:file3\"} // testData has two files.\n\t\tif diff := cmp.Diff(got, want); diff != \"\" {\n\t\t\tt.Errorf(\"List() = %v, want %v\", got, want)\n\t\t}\n\t})\n\n\tt.Run(fmt.Sprintf(\"VersionsAfterDelete_%s\", testSuffix), func(t *testing.T) {\n\t\tgot, err := srv.Versions(ctx, &artifact.VersionsRequest{\n\t\t\tAppName: appName, UserID: userID, SessionID: sessionID, FileName: \"user:file1\",\n\t\t})\n\t\tif !errors.Is(err, fs.ErrNotExist) {\n\t\t\tt.Fatalf(\"Versions('user:file1') = (%v, %v), want error(%v)\", got, err, fs.ErrNotExist)\n\t\t}\n\t})\n\n\t// Clean up\n\tif err := srv.Delete(ctx, &artifact.DeleteRequest{\n\t\tAppName: appName, UserID: userID, SessionID: sessionID, FileName: \"file2\",\n\t}); err != nil {\n\t\tt.Fatalf(\"Delete(file2) failed: %v\", err)\n\t}\n\tif err := srv.Delete(ctx, &artifact.DeleteRequest{\n\t\tAppName: appName, UserID: userID, SessionID: sessionID, FileName: \"user:file3\",\n\t}); err != nil {\n\t\tt.Fatalf(\"Delete(user:file3) failed: %v\", err)\n\t}\n}\n\nfunc testArtifactService_Empty(ctx context.Context, t *testing.T, srv artifact.Service, testSuffix string) {\n\tt.Run(fmt.Sprintf(\"Load_%s\", testSuffix), func(t *testing.T) {\n\t\tgot, err := srv.Load(ctx, &artifact.LoadRequest{\n\t\t\tAppName: \"app\", UserID: \"user\", SessionID: \"session\", FileName: \"file\",\n\t\t})\n\t\tif !errors.Is(err, fs.ErrNotExist) {\n\t\t\tt.Fatalf(\"List() = (%v, %v), want error(%v)\", got, err, fs.ErrNotExist)\n\t\t}\n\t})\n\tt.Run(fmt.Sprintf(\"List_%s\", testSuffix), func(t *testing.T) {\n\t\t_, err := srv.List(ctx, &artifact.ListRequest{\n\t\t\tAppName: \"app\", UserID: \"user\", SessionID: \"session\",\n\t\t})\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"List() failed: %v\", err)\n\t\t}\n\t})\n\tt.Run(fmt.Sprintf(\"Delete_%s\", testSuffix), func(t *testing.T) {\n\t\terr := srv.Delete(ctx, &artifact.DeleteRequest{\n\t\t\tAppName: \"app\", UserID: \"user\", SessionID: \"session\", FileName: \"file1\",\n\t\t})\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"Delete() failed: %v\", err)\n\t\t}\n\t})\n\tt.Run(fmt.Sprintf(\"Versions_%s\", testSuffix), func(t *testing.T) {\n\t\tgot, err := srv.Versions(ctx, &artifact.VersionsRequest{\n\t\t\tAppName: \"app\", UserID: \"user\", SessionID: \"session\", FileName: \"file1\",\n\t\t})\n\t\tif !errors.Is(err, fs.ErrNotExist) {\n\t\t\tt.Fatalf(\"Versions() = (%v, %v), want error(%v)\", got, err, fs.ErrNotExist)\n\t\t}\n\t})\n}\n"
  },
  {
    "path": "internal/cli/util/doc.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Package util provides helper functions for execution of commands and presenting their stderr and stdout in uniform way.\n// Provides also a way to capture text generated by FlagSet as command line arguments' documentation (PrintDefaults)\npackage util\n"
  },
  {
    "path": "internal/cli/util/flagset_helpers.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage util\n\nimport (\n\t\"flag\"\n\t\"strings\"\n)\n\n// FormatFlagUsage returns a string containing the usage information for the given FlagSet.\nfunc FormatFlagUsage(fs *flag.FlagSet) string {\n\tvar b strings.Builder\n\to := fs.Output()\n\tfs.SetOutput(&b)\n\tfs.PrintDefaults()\n\tfs.SetOutput(o)\n\treturn b.String()\n}\n"
  },
  {
    "path": "internal/cli/util/oscmd.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage util\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\t\"os/exec\"\n\t\"path\"\n)\n\n// Printer is a function printing its arguments\ntype Printer func(a ...any)\n\nvar (\n\tReset   = \"\\033[0m\"\n\tRed     = \"\\033[31m\"\n\tGreen   = \"\\033[32m\"\n\tYellow  = \"\\033[33m\"\n\tBlue    = \"\\033[34m\"\n\tMagenta = \"\\033[35m\"\n\tCyan    = \"\\033[36m\"\n\tGray    = \"\\033[37m\"\n\tWhite   = \"\\033[97m\"\n)\n\n// LogStartStop is a helper function which executes a particular command with logging\nfunc LogStartStop(msg string, command func(p Printer) error) error {\n\tfmt.Println(msg, \": \"+Green+\"Starting\"+Reset)\n\terr := command(func(a ...any) { fmt.Println(\"    \"+Green+\"> \"+Reset, a) })\n\tfmt.Println()\n\tif err == nil {\n\t\tfmt.Println(msg, \": \"+Green+\"Finished successfully\"+Reset)\n\t} else {\n\t\tfmt.Println(msg, \": \"+Red+\"Finished with error\"+Reset)\n\t\tfmt.Println(\"Error:\", err)\n\t}\n\n\treturn err\n}\n\ntype reprintableStream struct {\n\tprefix []byte\n\tclean  bool\n\tstream io.Writer\n}\n\n// function Write is an interceptor of a stream adding some decorations\nfunc (s *reprintableStream) Write(p []byte) (total int, err error) {\n\tstart := 0\n\terr = nil\n\tif s.clean {\n\t\t_, err = s.stream.Write(s.prefix)\n\t\tif err != nil {\n\t\t\treturn total, err\n\t\t}\n\t\ts.clean = false\n\t}\n\tfor i, c := range p {\n\t\tif c == '\\n' {\n\t\t\t_, err = s.stream.Write(p[start:i])\n\t\t\tif err != nil {\n\t\t\t\treturn len(p), err\n\t\t\t}\n\t\t\t_, err = s.stream.Write(s.prefix)\n\t\t\tif err != nil {\n\t\t\t\treturn len(p), err\n\t\t\t}\n\t\t\tstart = i + 1\n\t\t}\n\t}\n\tif start < len(p) {\n\t\t_, err = s.stream.Write(p[start:])\n\t}\n\n\treturn len(p), err\n}\n\nfunc newReprintableStream(s io.Writer, prefix, color string) io.Writer {\n\treturn &reprintableStream{prefix: []byte(\"\\n       \" + color + prefix + \" > \" + Reset), stream: s, clean: true}\n}\n\n// function LogCommand runs a command pretty-printing its stdout and stderr\nfunc LogCommand(c *exec.Cmd, p Printer) error {\n\tp(\"Running : \", Yellow, c.Dir, Reset, \" \", c)\n\tc.Stdout = newReprintableStream(os.Stdout, \"  \", Yellow)\n\tc.Stderr = newReprintableStream(os.Stdout, \"  \", Yellow)\n\treturn c.Run()\n}\n\nfunc StripExtension(p, expected string) (string, error) {\n\tex := path.Ext(p)\n\tif ex == \"\" {\n\t\treturn \"\", errors.New(\"Cannot find extension in '\" + p + \"'\")\n\t}\n\tif ex != expected {\n\t\treturn \"\", errors.New(\"Unexpected extension. Found '\" + ex + \"' instead of '\" + expected + \"'\")\n\t}\n\treturn p[:len(p)-len(ex)], nil\n}\n"
  },
  {
    "path": "internal/cli/util/text_helpers.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage util\n\nimport \"strings\"\n\nfunc CenterString(s string, w int) string {\n\tsw := w - len(s)\n\tlw := sw / 2\n\trw := sw - lw\n\treturn strings.Repeat(\" \", lw) + s + strings.Repeat(\" \", rw)\n}\n"
  },
  {
    "path": "internal/configurable/configurable.go",
    "content": "// Copyright 2026 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage configurable\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"os\"\n\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/agent\"\n\t\"google.golang.org/adk/agent/llmagent\"\n\t\"google.golang.org/adk/agent/workflowagents/loopagent\"\n\t\"google.golang.org/adk/agent/workflowagents/parallelagent\"\n\t\"google.golang.org/adk/agent/workflowagents/sequentialagent\"\n\t\"google.golang.org/adk/internal/llminternal/googlellm\"\n\t\"google.golang.org/adk/model/gemini\"\n\t\"google.golang.org/adk/tool\"\n)\n\n// codeConfig represents a reference to a function or callback.\n// Equivalent to: common_configs.codeConfig\ntype codeConfig struct {\n\t// Name of the function/method (e.g., \"my_pkg.security.Check\")\n\tName string `yaml:\"name\"`\n\n\t// Optional params if your system supports parameterized callbacks\n\tParams map[string]any `yaml:\"params,omitempty\"`\n}\n\n// agentRefConfig represents a reference to a sub-agent.\n// Equivalent to: common_configs.agentRefConfig\ntype agentRefConfig struct {\n\t// Path to another agent's YAML file\n\tConfigPath string `yaml:\"config_path,omitempty\"`\n\n\t// OR an inline code reference\n\tCode string `yaml:\"code,omitempty\"`\n}\n\ntype ToolConfig struct {\n\t// Name of the tool/method (e.g., \"my_pkg.security.Check\")\n\tName string `yaml:\"name\"`\n\n\t// Optional params if your system supports parameterized callbacks\n\tArgs map[string]any `yaml:\"args,omitempty\"`\n}\n\n// baseAgentConfig matches the Python baseAgentConfig Pydantic model.\n//\n// Usage: Do not use this struct directly for unmarshalling specific agents.\n// Embed it into concrete agent configs (see Example below).\ntype baseAgentConfig struct {\n\t// Required. The class of the agent.\n\t// Default is \"BaseAgent\" in Python, but usually overridden by concrete agents.\n\tAgentClass string `yaml:\"agent_class\"`\n\n\t// Required. The name of the agent.\n\tName string `yaml:\"name\"`\n\n\t// Optional. Description of the agent.\n\tDescription string `yaml:\"description,omitempty\"`\n\n\t// Optional. List of sub-agents.\n\tSubAgents []agentRefConfig `yaml:\"sub_agents,omitempty\"`\n\n\t// Optional. Callbacks to run before execution.\n\tBeforeAgentCallbacks []codeConfig `yaml:\"before_agent_callbacks,omitempty\"`\n\n\t// Optional. Callbacks to run after execution.\n\tAfterAgentCallbacks []codeConfig `yaml:\"after_agent_callbacks,omitempty\"`\n\n\t// Path to the config file.\n\tConfigPath string `yaml:\"-\"`\n\n\t// Handle extra fields (extra='allow'):\n\t// If you use this struct standalone, this map catches unknown fields.\n\t// However, the preferred pattern is to embed this struct in a concrete config\n\t// so specific fields are strongly typed.\n\tAdditionalProperties map[string]any `yaml:\",inline\"`\n}\n\n// llmAgentYAMLConfig is the concrete config for a specific agent.\ntype llmAgentYAMLConfig struct {\n\t// 1. Embed baseAgentConfig with \",inline\".\n\t// This pulls \"name\", \"sub_agents\", etc. to the top level of the YAML.\n\tbaseAgentConfig `yaml:\",inline\"`\n\n\t// 2. Define the \"extra\" fields specific to this agent here.\n\tModel string `yaml:\"model\"`\n\n\tInstruction string `yaml:\"instruction\"`\n\n\tTools []ToolConfig `yaml:\"tools,omitempty\"`\n\n\tDisallowTransferToPeers bool `yaml:\"disallow_transfer_to_peers,omitempty\"`\n\n\tDisallowTransferToParent bool `yaml:\"disallow_transfer_to_parent,omitempty\"`\n\n\tGenerateContentConfig *genai.GenerateContentConfig `yaml:\"generate_content_config,omitempty\"`\n}\n\nfunc (c *llmAgentYAMLConfig) toLLMAgentConfig(ctx context.Context) (*llmagent.Config, error) {\n\tif !googlellm.IsGeminiModel(c.Model) {\n\t\treturn nil, fmt.Errorf(\"model %s is not supported\", c.Model)\n\t}\n\n\tmodel, err := gemini.NewModel(ctx, c.Model, &genai.ClientConfig{\n\t\tAPIKey: os.Getenv(\"GOOGLE_API_KEY\"),\n\t})\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to create model: %w\", err)\n\t}\n\n\tsubAgents, err := resolveSubAgents(ctx, c.ConfigPath, c.SubAgents)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\ttools, toolsets, err := resolveTools(ctx, c.ConfigPath, c.Tools)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tbeforeCallbacks, err := resolveCallbacks[agent.BeforeAgentCallback](ctx, c.BeforeAgentCallbacks)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tafterCallbacks, err := resolveCallbacks[agent.AfterAgentCallback](ctx, c.AfterAgentCallbacks)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &llmagent.Config{\n\t\tName:                     c.Name,\n\t\tDescription:              c.Description,\n\t\tSubAgents:                subAgents,\n\t\tModel:                    model,\n\t\tInstruction:              c.Instruction,\n\t\tDisallowTransferToPeers:  c.DisallowTransferToPeers,\n\t\tDisallowTransferToParent: c.DisallowTransferToParent,\n\t\tTools:                    tools,\n\t\tToolsets:                 toolsets,\n\t\tGenerateContentConfig:    c.GenerateContentConfig,\n\t\tBeforeAgentCallbacks:     beforeCallbacks,\n\t\tAfterAgentCallbacks:      afterCallbacks,\n\t}, nil\n}\n\ntype loopAgentYAMLConfig struct {\n\tbaseAgentConfig `yaml:\",inline\"`\n\tMaxIterations   uint `yaml:\"max_iterations\"`\n}\n\nfunc (c *loopAgentYAMLConfig) toLoopAgentConfig(ctx context.Context) (*loopagent.Config, error) {\n\tsubAgents, err := resolveSubAgents(ctx, c.ConfigPath, c.SubAgents)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &loopagent.Config{\n\t\tAgentConfig: agent.Config{\n\t\t\tName:        c.Name,\n\t\t\tDescription: c.Description,\n\t\t\tSubAgents:   subAgents,\n\t\t},\n\t\tMaxIterations: c.MaxIterations,\n\t}, nil\n}\n\n// ParallelAgentYAMLConfig is the concrete config for a specific agent.\ntype parallelAgentYAMLConfig struct {\n\tbaseAgentConfig `yaml:\",inline\"`\n}\n\nfunc (c *parallelAgentYAMLConfig) toParallelAgentConfig(ctx context.Context) (*parallelagent.Config, error) {\n\tsubAgents, err := resolveSubAgents(ctx, c.ConfigPath, c.SubAgents)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &parallelagent.Config{\n\t\tAgentConfig: agent.Config{\n\t\t\tName:        c.Name,\n\t\t\tDescription: c.Description,\n\t\t\tSubAgents:   subAgents,\n\t\t},\n\t}, nil\n}\n\n// SequentialAgentYAMLConfig is the concrete config for a specific agent.\ntype sequentialAgentYAMLConfig struct {\n\tbaseAgentConfig `yaml:\",inline\"`\n}\n\nfunc (c *sequentialAgentYAMLConfig) toSequentialAgentConfig(ctx context.Context) (*sequentialagent.Config, error) {\n\tsubAgents, err := resolveSubAgents(ctx, c.ConfigPath, c.SubAgents)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &sequentialagent.Config{\n\t\tAgentConfig: agent.Config{\n\t\t\tName:        c.Name,\n\t\t\tDescription: c.Description,\n\t\t\tSubAgents:   subAgents,\n\t\t},\n\t}, nil\n}\n\nfunc resolveSubAgents(ctx context.Context, parentPath string, refs []agentRefConfig) ([]agent.Agent, error) {\n\tvar agents []agent.Agent\n\tfor _, ref := range refs {\n\t\tif ref.ConfigPath != \"\" {\n\t\t\ta, err := ResolveAgentReference(ctx, parentPath, ref.ConfigPath)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, fmt.Errorf(\"failed to resolve agent reference %s: %w\", ref.ConfigPath, err)\n\t\t\t}\n\t\t\tagents = append(agents, a)\n\t\t} else if ref.Code != \"\" {\n\t\t\treturn nil, fmt.Errorf(\"inline code agent references are not yet supported for %s\", ref.Code)\n\t\t}\n\t}\n\treturn agents, nil\n}\n\ntype contextKey string\n\nconst parentPathKey contextKey = \"parentPath\"\n\nfunc resolveTools(ctx context.Context, parentPath string, toolConfigs []ToolConfig) ([]tool.Tool, []tool.Toolset, error) {\n\tvar tools []tool.Tool\n\tvar toolsets []tool.Toolset\n\tfor _, tc := range toolConfigs {\n\t\tif tc.Name != \"\" {\n\t\t\tctx = context.WithValue(ctx, parentPathKey, parentPath)\n\t\t\ta, ts, err := ResolveToolReference(ctx, tc.Name, tc.Args)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, nil, fmt.Errorf(\"failed to resolve tool reference %s: %w\", tc.Name, err)\n\t\t\t}\n\t\t\tif a != nil {\n\t\t\t\ttools = append(tools, a)\n\t\t\t}\n\t\t\tif ts != nil {\n\t\t\t\ttoolsets = append(toolsets, ts)\n\t\t\t}\n\t\t}\n\t}\n\treturn tools, toolsets, nil\n}\n\nfunc resolveCallbacks[T any](ctx context.Context, callbacks []codeConfig) ([]T, error) {\n\tvar cbs []T\n\tfor _, ref := range callbacks {\n\t\tif ref.Name != \"\" {\n\t\t\tc, err := ResolveCallbackReference(ctx, ref.Name)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, fmt.Errorf(\"failed to resolve callback reference %s: %w\", ref.Name, err)\n\t\t\t}\n\t\t\tcb, ok := c.(T)\n\t\t\tif !ok {\n\t\t\t\treturn nil, fmt.Errorf(\"callback %s is of type %T and not %T\", ref.Name, c, *new(T))\n\t\t\t}\n\t\t\tcbs = append(cbs, cb)\n\t\t}\n\t}\n\treturn cbs, nil\n}\n"
  },
  {
    "path": "internal/configurable/configurable_utils.go",
    "content": "// Copyright 2026 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// configutils.go provides utility functions for working with configurable agents.\npackage configurable\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"os\"\n\t\"os/exec\"\n\t\"path/filepath\"\n\t\"sync\"\n\n\t\"github.com/modelcontextprotocol/go-sdk/mcp\"\n\t\"gopkg.in/yaml.v3\"\n\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/agent\"\n\t\"google.golang.org/adk/agent/llmagent\"\n\t\"google.golang.org/adk/agent/workflowagents/loopagent\"\n\t\"google.golang.org/adk/agent/workflowagents/parallelagent\"\n\t\"google.golang.org/adk/agent/workflowagents/sequentialagent\"\n\t\"google.golang.org/adk/tool\"\n\t\"google.golang.org/adk/tool/agenttool\"\n\t\"google.golang.org/adk/tool/exampletool\"\n\t\"google.golang.org/adk/tool/exitlooptool\"\n\t\"google.golang.org/adk/tool/geminitool\"\n\t\"google.golang.org/adk/tool/mcptoolset\"\n)\n\ntype AgentFactory func(ctx context.Context, configBytes []byte, configPath string) (agent.Agent, error)\n\ntype ToolFactory func(ctx context.Context, args map[string]any) (tool.Tool, error)\n\ntype ToolsetFactory func(ctx context.Context, args map[string]any) (tool.Toolset, error)\n\nvar (\n\tregistryMu       sync.RWMutex\n\tregistry         = make(map[string]AgentFactory)\n\tagentRegistry    = make(map[string]agent.Agent)\n\ttoolRegistry     = make(map[string]any)\n\tcallbackRegistry = make(map[string]any)\n)\n\nfunc init() {\n\tif err := Register(\"LlmAgent\", newLLMAgent); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := Register(\"LoopAgent\", newLoopAgent); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := Register(\"ParallelAgent\", newParallelAgent); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := Register(\"SequentialAgent\", newSequentialAgent); err != nil {\n\t\tpanic(err)\n\t}\n\terr := RegisterToolFactory(\"exit_loop\", func(_ context.Context, _ map[string]any) (tool.Tool, error) {\n\t\treturn exitlooptool.New()\n\t})\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\terr = RegisterToolFactory(\"google_search\", func(_ context.Context, _ map[string]any) (tool.Tool, error) {\n\t\treturn geminitool.GoogleSearch{}, nil\n\t})\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\terr = RegisterToolFactory(\"url_context\", func(_ context.Context, _ map[string]any) (tool.Tool, error) {\n\t\treturn geminitool.New(\"url_context\", \"url context\", &genai.Tool{URLContext: &genai.URLContext{}}), nil\n\t})\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\terr = RegisterToolFactory(\"google_maps_grounding\", func(_ context.Context, _ map[string]any) (tool.Tool, error) {\n\t\treturn geminitool.New(\"google_maps_grounding\", \"google maps grounding\", &genai.Tool{GoogleMaps: &genai.GoogleMaps{}}), nil\n\t})\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\terr = RegisterToolFactory(\"AgentTool\", func(ctx context.Context, args map[string]any) (tool.Tool, error) {\n\t\tif args == nil {\n\t\t\treturn nil, fmt.Errorf(\"args is nil\")\n\t\t}\n\t\ta, ok := args[\"agent\"].(map[string]any)\n\t\tif !ok {\n\t\t\treturn nil, fmt.Errorf(\"agent not found in args\")\n\t\t}\n\t\tskipSummarization := false\n\t\tif ss, ok := a[\"skip_summarization\"].(bool); ok {\n\t\t\tskipSummarization = ss\n\t\t}\n\t\tparentPath, ok := ctx.Value(parentPathKey).(string)\n\t\tif !ok {\n\t\t\treturn nil, fmt.Errorf(\"parentPath not found in context\")\n\t\t}\n\t\tif configPath, ok := a[\"config_path\"].(string); ok {\n\t\t\tag, err := ResolveAgentReference(ctx, parentPath, configPath)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\treturn agenttool.New(ag, &agenttool.Config{SkipSummarization: skipSummarization}), nil\n\t\t} else {\n\t\t\treturn nil, fmt.Errorf(\"config_path not found in args\")\n\t\t}\n\t})\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\terr = RegisterToolFactory(\"LongRunningFunctionTool\", func(ctx context.Context, args map[string]any) (tool.Tool, error) {\n\t\tif args == nil {\n\t\t\treturn nil, fmt.Errorf(\"args is nil\")\n\t\t}\n\t\tfuncName, ok := args[\"func\"].(string)\n\t\tif !ok {\n\t\t\treturn nil, fmt.Errorf(\"func not found in args\")\n\t\t}\n\t\ttool, _, err := ResolveToolReference(ctx, funcName, args)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tif tool == nil {\n\t\t\treturn nil, fmt.Errorf(\"tool '%s' not found\", funcName)\n\t\t}\n\t\treturn tool, nil\n\t})\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\terr = RegisterToolFactory(\"ExampleTool\", func(ctx context.Context, args map[string]any) (tool.Tool, error) {\n\t\tif args == nil {\n\t\t\treturn nil, fmt.Errorf(\"args is nil\")\n\t\t}\n\n\t\traw, ok := args[\"examples\"]\n\t\tif !ok {\n\t\t\treturn nil, fmt.Errorf(\"examples not found in args\")\n\t\t}\n\n\t\t// 1. Cast the top-level 'examples' to a generic slice\n\t\texamplesSlice, ok := raw.([]any)\n\t\tif !ok {\n\t\t\treturn nil, fmt.Errorf(\"examples is not a list\")\n\t\t}\n\n\t\t// 2. Iterate and normalize the 'output' field\n\t\tfor i, item := range examplesSlice {\n\t\t\tm, ok := item.(map[string]any)\n\t\t\tif !ok {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\toutput := m[\"output\"]\n\t\t\tif output == nil {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\t// Check if 'output' is NOT a slice. If it's a single object,\n\t\t\t// wrap it in a new slice []any{output}\n\t\t\tif _, isSlice := output.([]any); !isSlice {\n\t\t\t\tm[\"output\"] = []any{output}\n\t\t\t\texamplesSlice[i] = m\n\t\t\t}\n\t\t}\n\n\t\t// 3. Now marshal/unmarshal as usual into your clean struct\n\t\tbytes, _ := json.Marshal(examplesSlice)\n\t\tvar examples []*exampletool.Example\n\t\tif err := json.Unmarshal(bytes, &examples); err != nil {\n\t\t\treturn nil, fmt.Errorf(\"failed to decode normalized examples: %w\", err)\n\t\t}\n\n\t\treturn exampletool.New(exampletool.ExampleToolConfig{\n\t\t\tExamples: examples,\n\t\t})\n\t})\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\terr = RegisterToolsetFactory(\"McpToolset\", func(ctx context.Context, args map[string]any) (tool.Toolset, error) {\n\t\tstdioConnectionParams, ok := args[\"stdio_connection_params\"].(map[string]any)\n\t\tif !ok {\n\t\t\treturn nil, fmt.Errorf(\"stdio_connection_params not found in args\")\n\t\t}\n\t\tserverParams, ok := stdioConnectionParams[\"server_params\"].(map[string]any)\n\t\tif !ok {\n\t\t\treturn nil, fmt.Errorf(\"server_params not found in stdio_connection_params\")\n\t\t}\n\t\tcommand, ok := serverParams[\"command\"].(string)\n\t\tif !ok {\n\t\t\treturn nil, fmt.Errorf(\"command not found in server_params\")\n\t\t}\n\t\tserverArgs, ok := serverParams[\"args\"].([]any)\n\t\tif !ok {\n\t\t\treturn nil, fmt.Errorf(\"args not found in server_params\")\n\t\t}\n\t\ttoolFilter, ok := args[\"tool_filter\"].([]any)\n\t\tif !ok {\n\t\t\treturn nil, fmt.Errorf(\"tool_filter not found in args\")\n\t\t}\n\t\tserverArgsStr := make([]string, len(serverArgs))\n\t\tfor i, arg := range serverArgs {\n\t\t\tserverArgsStr[i] = arg.(string)\n\t\t}\n\t\ttoolFilterStr := make([]string, len(toolFilter))\n\t\tfor i, t := range toolFilter {\n\t\t\ttoolFilterStr[i] = t.(string)\n\t\t}\n\n\t\tmcpSet, err := mcptoolset.New(mcptoolset.Config{\n\t\t\tTransport: &mcp.CommandTransport{\n\t\t\t\tCommand: exec.Command(command, serverArgsStr...),\n\t\t\t},\n\t\t\tToolFilter: tool.StringPredicate(toolFilterStr),\n\t\t})\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"failed to create mcp toolset: %v\", err)\n\t\t}\n\t\treturn mcpSet, nil\n\t})\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// Register allows concrete implementations to add themselves to the system.\n// This replaces Python's dynamic importlib logic.\nfunc Register(name string, factory AgentFactory) error {\n\tregistryMu.Lock()\n\tdefer registryMu.Unlock()\n\tif _, dup := registry[name]; dup {\n\t\treturn fmt.Errorf(\"Register called twice for agent %s\", name)\n\t}\n\tregistry[name] = factory\n\treturn nil\n}\n\n// RegisterToolFactory allows concrete implementations to add themselves to the system.\nfunc RegisterToolFactory(name string, factory ToolFactory) error {\n\tregistryMu.Lock()\n\tdefer registryMu.Unlock()\n\tif _, dup := toolRegistry[name]; dup {\n\t\treturn fmt.Errorf(\"RegisterToolFactory called twice for tool %s\", name)\n\t}\n\ttoolRegistry[name] = factory\n\treturn nil\n}\n\nfunc RegisterToolsetFactory(name string, factory ToolsetFactory) error {\n\tregistryMu.Lock()\n\tdefer registryMu.Unlock()\n\tif _, dup := toolRegistry[name]; dup {\n\t\treturn fmt.Errorf(\"RegisterToolsetFactory called twice for toolset %s\", name)\n\t}\n\ttoolRegistry[name] = factory\n\treturn nil\n}\n\nfunc RegisterCallback(name string, callback any) error {\n\tregistryMu.Lock()\n\tdefer registryMu.Unlock()\n\tif _, dup := callbackRegistry[name]; dup {\n\t\treturn fmt.Errorf(\"RegisterCallback called twice for callback %s\", name)\n\t}\n\tcallbackRegistry[name] = callback\n\treturn nil\n}\n\n// FromConfig builds an agent from a config file path.\n// Equivalent to: def from_config(config_path: str) -> BaseAgent\nfunc FromConfig(ctx context.Context, configPath string) (agent.Agent, error) {\n\tabsPath, err := filepath.Abs(configPath)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to resolve absolute path: %w\", err)\n\t}\n\n\t// 1. Read the file\n\tdata, err := os.ReadFile(absPath)\n\tif err != nil {\n\t\tif os.IsNotExist(err) {\n\t\t\treturn nil, fmt.Errorf(\"config file not found: %s\", absPath)\n\t\t}\n\t\treturn nil, err\n\t}\n\n\t// 2. Peek at the \"agent_class\" field to know which factory to use.\n\tvar baseConfig baseAgentConfig\n\tif err := yaml.Unmarshal(data, &baseConfig); err != nil {\n\t\treturn nil, fmt.Errorf(\"invalid YAML content: %w\", err)\n\t}\n\n\t// Default fallback similar to Python's handling\n\tagentClass := baseConfig.AgentClass\n\tif agentClass == \"\" {\n\t\tagentClass = \"LlmAgent\"\n\t}\n\n\t// 3. Resolve the factory (The Go equivalent of _resolve_agent_class)\n\tregistryMu.RLock()\n\tfactory, exists := registry[agentClass]\n\tregistryMu.RUnlock()\n\n\tif !exists {\n\t\treturn nil, fmt.Errorf(\"invalid agent class '%s': not registered. Ensure the package is imported\", agentClass)\n\t}\n\n\t// 4. Delegate creation to the specific factory.\n\t// We pass the raw data so the factory can unmarshal into its specific Config struct.\n\treturn factory(ctx, data, absPath)\n}\n\nfunc ResolveToolReference(ctx context.Context, toolName string, args map[string]any) (tool.Tool, tool.Toolset, error) {\n\tif toolName == \"\" {\n\t\treturn nil, nil, fmt.Errorf(\"tool name cannot be empty\")\n\t}\n\n\tregistryMu.RLock()\n\tif t, ok := toolRegistry[toolName]; ok {\n\t\tregistryMu.RUnlock()\n\t\tif factory, ok := t.(ToolFactory); ok {\n\t\t\ttool, err := factory(ctx, args)\n\t\t\treturn tool, nil, err\n\t\t}\n\t\tif toolsetFactory, ok := t.(ToolsetFactory); ok {\n\t\t\ttoolset, err := toolsetFactory(ctx, args)\n\t\t\treturn nil, toolset, err\n\t\t}\n\t\treturn nil, nil, fmt.Errorf(\"tool '%s' is not a tool or toolset factory\", toolName)\n\t}\n\tregistryMu.RUnlock()\n\treturn nil, nil, fmt.Errorf(\"tool '%s' not found\", toolName)\n}\n\nfunc ResolveCallbackReference(ctx context.Context, callbackName string) (any, error) {\n\tif callbackName == \"\" {\n\t\treturn nil, fmt.Errorf(\"callback name cannot be empty\")\n\t}\n\n\tregistryMu.RLock()\n\tif c, ok := callbackRegistry[callbackName]; ok {\n\t\tregistryMu.RUnlock()\n\t\treturn c, nil\n\t}\n\tregistryMu.RUnlock()\n\treturn nil, fmt.Errorf(\"callback '%s' not found\", callbackName)\n}\n\n// ResolveAgentReference builds an agent from a reference config.\nfunc ResolveAgentReference(ctx context.Context, parentPath, refPath string) (agent.Agent, error) {\n\tif refPath == \"\" {\n\t\treturn nil, fmt.Errorf(\"agent reference path cannot be empty\")\n\t}\n\n\ttargetPath := refPath\n\t// Handle relative paths\n\tif !filepath.IsAbs(refPath) {\n\t\ttargetPath = filepath.Join(filepath.Dir(parentPath), refPath)\n\t}\n\n\tabsPath, err := filepath.Abs(targetPath)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to resolve absolute path: %w\", err)\n\t}\n\n\tregistryMu.RLock()\n\tif a, ok := agentRegistry[absPath]; ok {\n\t\tregistryMu.RUnlock()\n\t\treturn a, nil\n\t}\n\tregistryMu.RUnlock()\n\n\ta, err := FromConfig(ctx, absPath)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tregistryMu.Lock()\n\tdefer registryMu.Unlock()\n\tif existing, ok := agentRegistry[absPath]; ok {\n\t\treturn existing, nil\n\t}\n\tagentRegistry[absPath] = a\n\treturn a, nil\n}\n\n// NewLLMAgent is the factory function registered in the system.\nfunc newLLMAgent(ctx context.Context, data []byte, configPath string) (agent.Agent, error) {\n\tvar cfg llmAgentYAMLConfig\n\n\t// Unmarshal parses the shared fields (Name) into BaseAgentConfig\n\t// AND the specific fields (ModelName) into LLMAgentConfig simultaneously.\n\tif err := yaml.Unmarshal(data, &cfg); err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to parse LLM agent config: %w\", err)\n\t}\n\n\t// Validation Logic (Pydantic equivalent)\n\tif cfg.Name == \"\" {\n\t\treturn nil, fmt.Errorf(\"'name' is required\")\n\t}\n\tif cfg.Model == \"\" {\n\t\treturn nil, fmt.Errorf(\"'model' is required for LlmAgent\")\n\t}\n\n\tcfg.ConfigPath = configPath\n\n\tagentConfig, err := cfg.toLLMAgentConfig(ctx)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to create LLM agent config: %w\", err)\n\t}\n\n\treturn llmagent.New(*agentConfig)\n}\n\nfunc newLoopAgent(ctx context.Context, data []byte, configPath string) (agent.Agent, error) {\n\tvar cfg loopAgentYAMLConfig\n\n\t// Unmarshal parses the shared fields (Name) into BaseAgentConfig\n\t// AND the specific fields (ModelName) into LLMAgentConfig simultaneously.\n\tif err := yaml.Unmarshal(data, &cfg); err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to parse Loop agent config: %w\", err)\n\t}\n\n\t// Validation Logic (Pydantic equivalent)\n\tif cfg.Name == \"\" {\n\t\treturn nil, fmt.Errorf(\"'name' is required\")\n\t}\n\n\tcfg.ConfigPath = configPath\n\n\tagentConfig, err := cfg.toLoopAgentConfig(ctx)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to create Loop agent config: %w\", err)\n\t}\n\n\treturn loopagent.New(*agentConfig)\n}\n\nfunc newParallelAgent(ctx context.Context, data []byte, configPath string) (agent.Agent, error) {\n\tvar cfg parallelAgentYAMLConfig\n\n\t// Unmarshal parses the shared fields (Name) into BaseAgentConfig\n\t// AND the specific fields (ModelName) into LLMAgentConfig simultaneously.\n\tif err := yaml.Unmarshal(data, &cfg); err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to parse Parallel agent config: %w\", err)\n\t}\n\n\t// Validation Logic (Pydantic equivalent)\n\tif cfg.Name == \"\" {\n\t\treturn nil, fmt.Errorf(\"'name' is required\")\n\t}\n\n\tcfg.ConfigPath = configPath\n\n\tagentConfig, err := cfg.toParallelAgentConfig(ctx)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to create Parallel agent config: %w\", err)\n\t}\n\n\treturn parallelagent.New(*agentConfig)\n}\n\nfunc newSequentialAgent(ctx context.Context, data []byte, configPath string) (agent.Agent, error) {\n\tvar cfg sequentialAgentYAMLConfig\n\n\t// Unmarshal parses the shared fields (Name) into BaseAgentConfig\n\t// AND the specific fields (ModelName) into LLMAgentConfig simultaneously.\n\tif err := yaml.Unmarshal(data, &cfg); err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to parse Sequential agent config: %w\", err)\n\t}\n\n\t// Validation Logic (Pydantic equivalent)\n\tif cfg.Name == \"\" {\n\t\treturn nil, fmt.Errorf(\"'name' is required\")\n\t}\n\n\tcfg.ConfigPath = configPath\n\n\tagentConfig, err := cfg.toSequentialAgentConfig(ctx)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to create Sequential agent config: %w\", err)\n\t}\n\n\treturn sequentialagent.New(*agentConfig)\n}\n"
  },
  {
    "path": "internal/configurable/conformance/callbacks.go",
    "content": "// Copyright 2026 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage conformance\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/agent\"\n\t\"google.golang.org/adk/internal/configurable\"\n\t\"google.golang.org/adk/session\"\n)\n\nfunc beforeAgentCallback1(ctx agent.CallbackContext) (*genai.Content, error) {\n\terr := ctx.State().Set(\"before_agent_callback_state_key\", \"value1\")\n\treturn nil, err\n}\n\nfunc beforeAgentCallback2(ctx agent.CallbackContext) (*genai.Content, error) {\n\tval, err := ctx.State().Get(\"before_agent_callback_state_key\")\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\ts, ok := val.(string)\n\tif !ok {\n\t\treturn nil, fmt.Errorf(\"state value for 'before_agent_callback_state_key' is not a string, but %T\", val)\n\t}\n\terr = ctx.State().Set(\"before_agent_callback_state_key\", s+\"+value2\")\n\treturn nil, err\n}\n\nfunc shortcutAgentExecution(ctx agent.CallbackContext) (*genai.Content, error) {\n\tval, err := ctx.State().Get(\"conversation_limit_reached\")\n\tif err != nil {\n\t\tif !errors.Is(err, session.ErrStateKeyNotExist) {\n\t\t\treturn nil, err\n\t\t}\n\t\terr = ctx.State().Set(\"conversation_limit_reached\", \"True\")\n\t\treturn nil, err\n\t}\n\tif limitReached, ok := val.(string); ok && limitReached == \"True\" {\n\t\treturn &genai.Content{\n\t\t\tParts: []*genai.Part{\n\t\t\t\t{Text: \"Sorry, you have reached the limit of the conversation.\"},\n\t\t\t},\n\t\t\tRole: \"model\",\n\t\t}, nil\n\t}\n\treturn nil, nil\n}\n\nfunc afterAgentCallback1(ctx agent.CallbackContext) (*genai.Content, error) {\n\terr := ctx.State().Set(\"after_agent_callback_state_key\", \"value1\")\n\treturn nil, err\n}\n\nfunc afterAgentCallback2(ctx agent.CallbackContext) (*genai.Content, error) {\n\tval, err := ctx.State().Get(\"after_agent_callback_state_key\")\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\ts, ok := val.(string)\n\tif !ok {\n\t\treturn nil, fmt.Errorf(\"state value for 'after_agent_callback_state_key' is not a string, but %T\", val)\n\t}\n\terr = ctx.State().Set(\"after_agent_callback_state_key\", s+\"+value2\")\n\treturn nil, err\n}\n\nfunc RegisterCallbacks() error {\n\terr := configurable.RegisterCallback(\"callback_agent_001.callbacks.before_agent_callback1\", agent.BeforeAgentCallback(beforeAgentCallback1))\n\tif err != nil {\n\t\treturn fmt.Errorf(\"error registering before agent callback 1: %w\", err)\n\t}\n\terr = configurable.RegisterCallback(\"callback_agent_001.callbacks.before_agent_callback2\", agent.BeforeAgentCallback(beforeAgentCallback2))\n\tif err != nil {\n\t\treturn fmt.Errorf(\"error registering before agent callback 2: %w\", err)\n\t}\n\terr = configurable.RegisterCallback(\"callback_agent_002.callbacks.shortcut_agent_execution\", agent.BeforeAgentCallback(shortcutAgentExecution))\n\tif err != nil {\n\t\treturn fmt.Errorf(\"error registering shortcut agent execution: %w\", err)\n\t}\n\terr = configurable.RegisterCallback(\"callback_agent_003.callbacks.after_agent_callback1\", agent.AfterAgentCallback(afterAgentCallback1))\n\tif err != nil {\n\t\treturn fmt.Errorf(\"error registering after agent callback 1: %w\", err)\n\t}\n\terr = configurable.RegisterCallback(\"callback_agent_003.callbacks.after_agent_callback2\", agent.AfterAgentCallback(afterAgentCallback2))\n\tif err != nil {\n\t\treturn fmt.Errorf(\"error registering after agent callback 2: %w\", err)\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "internal/configurable/conformance/functions.go",
    "content": "// Copyright 2026 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage conformance\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"hash/fnv\"\n\t\"math\"\n\t\"regexp\"\n\n\t\"google.golang.org/adk/internal/configurable\"\n\t\"google.golang.org/adk/tool\"\n\t\"google.golang.org/adk/tool/functiontool\"\n)\n\ntype ValidateEmailArgs struct {\n\tEmail string `json:\"email\"`\n}\n\nvar emailRegex = regexp.MustCompile(`^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$`)\n\nfunc validateEmail(ctx tool.Context, args ValidateEmailArgs) (bool, error) {\n\treturn emailRegex.MatchString(args.Email), nil\n}\n\nfunc getUserID(ctx tool.Context, args ValidateEmailArgs) (int, error) {\n\tvalid, err := validateEmail(ctx, args)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\tif !valid {\n\t\treturn 0, fmt.Errorf(\"invalid email format provided\")\n\t}\n\n\t// 1. Create a new FNV-1a 32-bit hasher\n\th := fnv.New32a()\n\n\t// 2. Write the email string as bytes to the hasher\n\th.Write([]byte(args.Email))\n\n\t// 3. Get the resulting 32-bit unsigned integer\n\tresult := h.Sum32()\n\n\t// 4. Modulo 10000 to keep it in range\n\treturn int(result % 10000), nil\n}\n\nfunc createBooking(ctx tool.Context, args ValidateEmailArgs) (map[string]any, error) {\n\tuserID, err := getUserID(ctx, args)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn map[string]any{\n\t\t\"user_id\":           userID,\n\t\t\"is_confirmed\":      true,\n\t\t\"details\":           \"Booking created for user \" + args.Email,\n\t\t\"user_id_type\":      \"int\",\n\t\t\"is_confirmed_type\": \"bool\",\n\t\t\"details_type\":      \"string\",\n\t}, nil\n}\n\ntype FlightPreferences struct {\n\tCabinClass       string `json:\"cabin_class\"`\n\tMaxStops         int    `json:\"max_stops\"`\n\tPreferredAirline string `json:\"preferred_airline\"`\n\tFlexibleDates    bool   `json:\"flexible_dates\"`\n}\n\ntype TripDetails struct {\n\tOrigin        string `json:\"origin\"`\n\tDestination   string `json:\"destination\"`\n\tDepartureDate string `json:\"departure_date\"`\n\tReturnDate    string `json:\"return_date\"`\n}\n\ntype SearchFlightsArgs struct {\n\tTrip        TripDetails        `json:\"trip\"`\n\tPreferences *FlightPreferences `json:\"preferences\"`\n}\n\nfunc searchFlights(ctx tool.Context, args SearchFlightsArgs) (map[string]any, error) {\n\tif args.Preferences == nil {\n\t\targs.Preferences = &FlightPreferences{\n\t\t\tCabinClass:    \"Economy\",\n\t\t\tMaxStops:      1,\n\t\t\tFlexibleDates: false,\n\t\t}\n\t}\n\n\ttripType := \"one-way\"\n\tif args.Trip.ReturnDate != \"\" {\n\t\ttripType = \"round-trip\"\n\t}\n\n\tresult := map[string]any{\n\t\t\"trip_type\":         tripType,\n\t\t\"route\":             args.Trip.Origin + \" to \" + args.Trip.Destination,\n\t\t\"departure_date\":    args.Trip.DepartureDate,\n\t\t\"return_date\":       args.Trip.ReturnDate,\n\t\t\"cabin_class\":       args.Preferences.CabinClass,\n\t\t\"max_stops\":         args.Preferences.MaxStops,\n\t\t\"preferred_airline\": args.Preferences.PreferredAirline,\n\t\t\"flexible_dates\":    args.Preferences.FlexibleDates,\n\t\t\"search_status\":     \"completed\",\n\t}\n\n\tairline := args.Preferences.PreferredAirline\n\tif airline == \"\" {\n\t\tairline = \"Various Airlines\"\n\t}\n\n\tstopsDesc := \"direct\"\n\tif args.Preferences.MaxStops > 0 {\n\t\tstopsDesc = fmt.Sprintf(\"up to %d stops\", args.Preferences.MaxStops)\n\t}\n\n\tflights := []string{\n\t\tfmt.Sprintf(\"%s - %s %s flight with %s\",\n\t\t\tairline, tripType, args.Preferences.CabinClass, stopsDesc),\n\t\tfmt.Sprintf(\"Departure: %s\", args.Trip.DepartureDate),\n\t}\n\n\tif args.Trip.ReturnDate != \"\" {\n\t\tflights = append(flights, fmt.Sprintf(\"Return: %s\", args.Trip.ReturnDate))\n\t}\n\n\tresult[\"available_flights\"] = flights\n\n\treturn result, nil\n}\n\ntype CalculateTripCostArgs struct {\n\tBaseFare      float64 `json:\"base_fare\"`\n\tNumPassengers int     `json:\"num_passengers\"`\n\tInsurance     bool    `json:\"insurance\"`\n\tBaggageCount  *int    `json:\"baggage_count\"`\n}\n\nfunc calculateTripCost(ctx tool.Context, args CalculateTripCostArgs) (map[string]any, error) {\n\t// Handle Python's default num_passengers=1 logic\n\t// In Go, if the caller passes 0, we should ensure at least 1\n\t// or handle it based on your specific business logic.\n\tif args.NumPassengers <= 0 {\n\t\targs.NumPassengers = 1\n\t}\n\n\tsubtotal := args.BaseFare * float64(args.NumPassengers)\n\n\t// Add insurance (10% of base fare per passenger)\n\tinsuranceCost := 0.0\n\tif args.Insurance {\n\t\tinsuranceCost = subtotal * 0.1\n\t}\n\n\t// Add baggage fees\n\tbaggageCost := 0.0\n\tvar displayBaggage any = nil\n\n\tif args.BaggageCount != nil {\n\t\tcount := *args.BaggageCount\n\t\tdisplayBaggage = count\n\n\t\t// First bag free, $35 per additional bag per passenger\n\t\tchargeableBags := math.Max(0, float64(count-1))\n\t\tbaggageCost = chargeableBags * 35 * float64(args.NumPassengers)\n\t}\n\n\ttotal := subtotal + insuranceCost + baggageCost\n\n\treturn map[string]any{\n\t\t\"base_fare\":          args.BaseFare,\n\t\t\"num_passengers\":     args.NumPassengers,\n\t\t\"subtotal\":           subtotal,\n\t\t\"insurance_included\": args.Insurance,\n\t\t\"insurance_cost\":     insuranceCost,\n\t\t\"baggage_count\":      displayBaggage,\n\t\t\"baggage_cost\":       baggageCost,\n\t\t\"total_cost\":         total,\n\t}, nil\n}\n\ntype reimburseArgs struct {\n\tPurpose string  `json:\"purpose\"`\n\tAmount  float64 `json:\"amount\"`\n}\n\nfunc reimburse(ctx tool.Context, args reimburseArgs) (map[string]any, error) {\n\treturn map[string]any{\n\t\t\"status\": \"ok\",\n\t}, nil\n}\n\ntype askForApprovalArgs struct {\n\tPurpose string  `json:\"purpose\"`\n\tAmount  float64 `json:\"amount\"`\n}\n\nfunc askForApproval(ctx tool.Context, args askForApprovalArgs) (map[string]any, error) {\n\treturn map[string]any{\n\t\t\"status\":   \"pending\",\n\t\t\"amount\":   args.Amount,\n\t\t\"ticketId\": \"reimbursement-ticket-001\",\n\t}, nil\n}\n\nfunc RegisterFunctions() error {\n\tvalidateEmailTool, err := functiontool.New(functiontool.Config{\n\t\tName:        \"validate_email\",\n\t\tDescription: \"Checks if the provided string is a valid email format.\",\n\t}, validateEmail)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"error creating validate email tool: %w\", err)\n\t}\n\tgetUserIDTool, err := functiontool.New(functiontool.Config{\n\t\tName:        \"get_user_id\",\n\t\tDescription: \"Retrieves a user ID based on their email.\",\n\t}, getUserID)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"error creating get user ID tool: %w\", err)\n\t}\n\tcreateBookingTool, err := functiontool.New(functiontool.Config{\n\t\tName: \"create_booking\",\n\t\tDescription: `Creates a booking for a user.\n\n  Args:\n    user_id: The unique identifier for the user.\n    is_confirmed: Whether the booking is confirmed.\n    details: Any additional details for the booking.\n\n  Returns:\n    A dictionary containing the booking information and the types of the\n    received arguments.\n  `,\n\t}, createBooking)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"error creating create booking tool: %w\", err)\n\t}\n\n\tsearchFlightsTool, err := functiontool.New(functiontool.Config{\n\t\tName: \"search_flights\",\n\t\tDescription: `Search for flights based on trip details and preferences.\n\n  This function demonstrates advanced parameter handling:\n  - Pydantic models as parameters (trip, preferences)\n  - Optional/nullable parameters (preferences, return_date, preferred_airline)\n  - Default values (cabin_class, max_stops, flexible_dates)\n\n  Args:\n    trip: Core trip information including origin, destination, and dates.\n    preferences: Optional flight preferences. If not provided, uses defaults.\n\n  Returns:\n    A dictionary containing search results and parameters received.\n  `,\n\t}, searchFlights)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"error creating search flights tool: %w\", err)\n\t}\n\n\tcalculateTripCostTool, err := functiontool.New(functiontool.Config{\n\t\tName: \"calculate_trip_cost\",\n\t\tDescription: `Calculate total trip cost with various optional charges.\n\n  This function demonstrates:\n  - Mix of required and optional parameters\n  - Default values for common cases\n  - Nullable parameter that affects calculation logic\n\n  Args:\n    base_fare: Base ticket price per passenger.\n    num_passengers: Number of passengers (default: 1).\n    insurance: Whether to add travel insurance (default: False).\n    baggage_count: Number of checked bags per passenger, or None for carry-on\n      only.\n\n  Returns:\n    A dictionary with cost breakdown.\n  `,\n\t}, calculateTripCost)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"error creating calculate trip cost tool: %w\", err)\n\t}\n\n\treimburseTool, err := functiontool.New(functiontool.Config{\n\t\tName:        \"reimburse\",\n\t\tDescription: `Reimburse the amount of money to the employee.`,\n\t}, reimburse)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"error creating reimburse tool: %w\", err)\n\t}\n\n\taskForApprovalTool, err := functiontool.New(functiontool.Config{\n\t\tName:          \"ask_for_approval\",\n\t\tDescription:   `Ask for approval for the reimbursement.`,\n\t\tIsLongRunning: true,\n\t}, askForApproval)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"error creating ask for approval tool: %w\", err)\n\t}\n\n\terr = configurable.RegisterToolFactory(\"tools_agent_002.tools.validate_email\", func(ctx context.Context, _ map[string]any) (tool.Tool, error) {\n\t\treturn validateEmailTool, nil\n\t})\n\tif err != nil {\n\t\treturn fmt.Errorf(\"error registering validate email tool: %w\", err)\n\t}\n\terr = configurable.RegisterToolFactory(\"tools_agent_002.tools.get_user_id\", func(ctx context.Context, _ map[string]any) (tool.Tool, error) {\n\t\treturn getUserIDTool, nil\n\t})\n\tif err != nil {\n\t\treturn fmt.Errorf(\"error registering get user ID tool: %w\", err)\n\t}\n\terr = configurable.RegisterToolFactory(\"tools_agent_002.tools.create_booking\", func(ctx context.Context, _ map[string]any) (tool.Tool, error) {\n\t\treturn createBookingTool, nil\n\t})\n\tif err != nil {\n\t\treturn fmt.Errorf(\"error registering create booking tool: %w\", err)\n\t}\n\n\terr = configurable.RegisterToolFactory(\"tools_agent_004.tools.search_flights\", func(ctx context.Context, _ map[string]any) (tool.Tool, error) {\n\t\treturn searchFlightsTool, nil\n\t})\n\tif err != nil {\n\t\treturn fmt.Errorf(\"error registering search flights tool: %w\", err)\n\t}\n\terr = configurable.RegisterToolFactory(\"tools_agent_004.tools.calculate_trip_cost\", func(ctx context.Context, _ map[string]any) (tool.Tool, error) {\n\t\treturn calculateTripCostTool, nil\n\t})\n\tif err != nil {\n\t\treturn fmt.Errorf(\"error registering calculate trip cost tool: %w\", err)\n\t}\n\n\terr = configurable.RegisterToolFactory(\"tools_agent_009.tools.reimburse\", func(ctx context.Context, _ map[string]any) (tool.Tool, error) {\n\t\treturn reimburseTool, nil\n\t})\n\tif err != nil {\n\t\treturn fmt.Errorf(\"error registering reimburse tool: %w\", err)\n\t}\n\terr = configurable.RegisterToolFactory(\"tools_agent_009.tools.ask_for_approval\", func(ctx context.Context, _ map[string]any) (tool.Tool, error) {\n\t\treturn askForApprovalTool, nil\n\t})\n\tif err != nil {\n\t\treturn fmt.Errorf(\"error registering ask for approval tool: %w\", err)\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "internal/configurable/conformance/loader.go",
    "content": "// Copyright 2026 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage conformance\n\nimport (\n\t\"fmt\"\n\t\"sort\"\n\n\t\"google.golang.org/adk/agent\"\n)\n\ntype conformanceAgentLoader struct {\n\tagentMap    map[string]agent.Agent\n\tagentsNames []string\n}\n\n// NewConformanceAgentLoader returns a new AgentLoader with the given root Agent and other agents.\n// Returns an error if more than one agent (including root) shares the same name\nfunc NewConformanceAgentLoader(agentMap map[string]agent.Agent) (agent.Loader, error) {\n\tagentsNames := make([]string, 0, len(agentMap))\n\tfor name := range agentMap {\n\t\tagentsNames = append(agentsNames, name)\n\t}\n\tsort.Strings(agentsNames)\n\treturn &conformanceAgentLoader{\n\t\tagentMap:    agentMap,\n\t\tagentsNames: agentsNames,\n\t}, nil\n}\n\n// conformanceAgentLoader implements AgentLoader. Returns the list of all agents' names (including root agent)\nfunc (m *conformanceAgentLoader) ListAgents() []string {\n\treturn m.agentsNames\n}\n\n// conformanceAgentLoader implements LoadAgent. Returns an agent with given name or error if no such an agent is found\nfunc (m *conformanceAgentLoader) LoadAgent(name string) (agent.Agent, error) {\n\tagent, ok := m.agentMap[name]\n\tif !ok {\n\t\treturn nil, fmt.Errorf(\"agent %s not found. Please specify one of those: %v\", name, m.ListAgents())\n\t}\n\treturn agent, nil\n}\n\n// conformanceAgentLoader implements LoadAgent.\nfunc (m *conformanceAgentLoader) RootAgent() agent.Agent {\n\tif len(m.agentsNames) == 0 {\n\t\treturn nil\n\t}\n\treturn m.agentMap[m.agentsNames[0]]\n}\n"
  },
  {
    "path": "internal/configurable/conformance/replayplugin/invocation_replay_state.go",
    "content": "// Copyright 2026 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage replayplugin\n\nimport (\n\t\"sync\"\n\n\t\"google.golang.org/adk/internal/configurable/conformance/replayplugin/recording\"\n)\n\n// invocationReplayState tracks per-invocation replay state to isolate concurrent runs.\ntype invocationReplayState struct {\n\ttestCasePath     string\n\tuserMessageIndex int\n\trecordings       *recording.Recordings\n\n\t// Per-agent replay indices for parallel execution\n\t// key: agent_name -> current replay index for that agent\n\tagentReplayIndices map[string]int\n\n\tcurIndex int\n\tmu       sync.Mutex\n\tcond     *sync.Cond\n}\n\n// newInvocationReplayState behaves as the constructor.\nfunc newInvocationReplayState(testCasePath string, userMessageIndex int, recs *recording.Recordings) *invocationReplayState {\n\tstate := &invocationReplayState{\n\t\ttestCasePath:       testCasePath,\n\t\tuserMessageIndex:   userMessageIndex,\n\t\trecordings:         recs,\n\t\tagentReplayIndices: make(map[string]int),\n\t\tcurIndex:           0,\n\t\tmu:                 sync.Mutex{},\n\t}\n\tstate.cond = sync.NewCond(&state.mu)\n\treturn state\n}\n\n// GetTestCasePath returns the test case path.\nfunc (s *invocationReplayState) GetTestCasePath() string {\n\treturn s.testCasePath\n}\n\n// GetUserMessageIndex returns the user message index.\nfunc (s *invocationReplayState) GetUserMessageIndex() int {\n\treturn s.userMessageIndex\n}\n\n// GetRecordings returns the recordings object.\nfunc (s *invocationReplayState) GetRecordings() *recording.Recordings {\n\treturn s.recordings\n}\n\n// GetAgentReplayIndex returns the index for the agent.\n// In Go, looking up a missing key returns the zero value (0),\n// so getOrDefault is intrinsic to the language for integers.\nfunc (s *invocationReplayState) GetAgentReplayIndex(agentName string) (int, bool) {\n\ts.mu.Lock()\n\tdefer s.mu.Unlock()\n\tval, ok := s.agentReplayIndices[agentName]\n\treturn val, ok\n}\n"
  },
  {
    "path": "internal/configurable/conformance/replayplugin/recording/recording.go",
    "content": "// Copyright 2026 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage recording\n\nimport (\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/model\"\n)\n\n// Recordings represents all recordings in chronological order.\ntype Recordings struct {\n\t// Chronological list of all recordings.\n\tRecordings []Recording `yaml:\"recordings\"`\n}\n\n// Recording represents a single interaction recording, ordered by request timestamp.\ntype Recording struct {\n\t// Index of the user message this recording belongs to (0-based).\n\tUserMessageIndex int `yaml:\"usermessageindex\"`\n\n\t// Name of the agent.\n\tAgentName string `yaml:\"agentname\"`\n\n\t// oneof fields - start\n\n\t// LLM request-response pair.\n\tLLMRecording *LLMRecording `yaml:\"llmrecording,omitempty\"`\n\n\t// Tool call-response pair.\n\tToolRecording *ToolRecording `yaml:\"toolrecording,omitempty\"`\n\n\t// oneof fields - end\n\n\t// Index of the recording in the recordings list (0-based).\n\tIndex int `yaml:\"-\"`\n}\n\n// LLMRecording represents a paired LLM request and response.\ntype LLMRecording struct {\n\t// Required. The LLM request.\n\tLLMRequest *model.LLMRequest `yaml:\"llmrequest,omitempty\"`\n\n\t// Required. The LLM response.\n\tLLMResponse *model.LLMResponse `yaml:\"llmresponse,omitempty\"`\n}\n\n// ToolRecording represents a paired tool call and response.\ntype ToolRecording struct {\n\t// Required. The tool call.\n\tToolCall *genai.FunctionCall `yaml:\"toolcall,omitempty\"`\n\n\t// Required. The tool response.\n\tToolResponse *genai.FunctionResponse `yaml:\"toolresponse,omitempty\"`\n}\n"
  },
  {
    "path": "internal/configurable/conformance/replayplugin/replay_plugin.go",
    "content": "// Copyright 2026 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage replayplugin\n\n// Package replayplugin provides an ADK plugin for replaying recorded LLM and tool interactions.\n//\n// This plugin is primarily used for conformance testing, allowing deterministic execution\n// of agents by mocking LLM responses and tool outputs based on a pre-recorded session.\n//\n// The plugin operates by intercepting:\n//   - BeforeRun: To initialize replay state from configuration.\n//   - BeforeModel: To match LLM requests against recordings and return mock responses.\n//   - BeforeTool: To match tool calls against recordings and return mock outputs.\n//   - AfterRun: To clean up invocation state.\n//\n// Replay configuration is expected in the session state under the key \"_adk_replay_config\",\n// containing:\n//   - \"dir\": Path to the directory containing \"generated-recordings.yaml\".\n//   - \"user_message_index\": The index of the user message to replay.\n\nimport (\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"regexp\"\n\t\"strings\"\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/google/go-cmp/cmp\"\n\t\"github.com/google/go-cmp/cmp/cmpopts\"\n\t\"google.golang.org/genai\"\n\t\"gopkg.in/yaml.v3\"\n\n\t\"google.golang.org/adk/agent\"\n\t\"google.golang.org/adk/internal/configurable/conformance/replayplugin/recording\"\n\t\"google.golang.org/adk/internal/toolinternal\"\n\t\"google.golang.org/adk/model\"\n\t\"google.golang.org/adk/plugin\"\n\t\"google.golang.org/adk/session\"\n\t\"google.golang.org/adk/tool\"\n)\n\n// New creates an instance of the replay plugin.\n//\n// allowedBaseDir specifies the root directory from which recordings can be loaded.\n// Attempts to load recordings from outside this directory will result in an error.\nfunc New(allowedBaseDir string) (*plugin.Plugin, error) {\n\tp := &replayPlugin{\n\t\tinvocationStates: make(map[string]*invocationReplayState),\n\t\tallowedBaseDir:   allowedBaseDir,\n\t}\n\treturn plugin.New(plugin.Config{\n\t\tName:                \"replay_plugin\",\n\t\tBeforeRunCallback:   p.beforeRun,\n\t\tAfterRunCallback:    p.afterRun,\n\t\tBeforeModelCallback: p.beforeModel,\n\t\tBeforeToolCallback:  p.beforeTool,\n\t})\n}\n\n// MustNew is like New but panics if there is an error.\nfunc MustNew(allowedBaseDir string) *plugin.Plugin {\n\tp, err := New(allowedBaseDir)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn p\n}\n\ntype replayPlugin struct {\n\tmu               sync.Mutex // Mutex to protect the map\n\tinvocationStates map[string]*invocationReplayState\n\tallowedBaseDir   string\n}\n\n// beforeRun initializes the replay state for the current invocation if replay mode is enabled.\nfunc (p *replayPlugin) beforeRun(ctx agent.InvocationContext) (*genai.Content, error) {\n\tif ctx.Session() == nil {\n\t\treturn nil, nil\n\t}\n\n\ton, err := p.isReplayModeOn(ctx.Session().State())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif !on {\n\t\treturn nil, nil\n\t}\n\n\t_, err = p.loadInvocationState(ctx)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn nil, nil\n}\n\n// beforeModel intercepts LLM requests, verifies them against the recording, and returns the recorded response.\nfunc (p *replayPlugin) beforeModel(ctx agent.CallbackContext, req *model.LLMRequest) (*model.LLMResponse, error) {\n\ton, err := p.isReplayModeOn(ctx.State())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif !on {\n\t\treturn nil, nil\n\t}\n\n\tinvocationState, err := p.getInvocationState(ctx)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tagentName := ctx.AgentName()\n\trecording, err := p.verifyAndGetNextLLMRecordingForAgent(invocationState, agentName, req)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn recording.LLMResponse, nil\n}\n\n// beforeTool intercepts tool calls, verifies them against the recording, and returns the recorded response.\nfunc (p *replayPlugin) beforeTool(ctx tool.Context, t tool.Tool, args map[string]any) (map[string]any, error) {\n\ton, err := p.isReplayModeOn(ctx.State())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif !on {\n\t\treturn nil, nil\n\t}\n\n\tinvocationState, err := p.getInvocationState(ctx)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tagentName := ctx.AgentName()\n\trecording, err := p.verifyAndGetNextToolRecordingForAgent(invocationState, agentName, t, args)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\ttypeName := fmt.Sprintf(\"%T\", t)\n\tif !strings.HasSuffix(typeName, \"agentTool\") {\n\t\t// TODO: support replay requests and responses from AgentTool.\n\t\tif ft, ok := t.(toolinternal.FunctionTool); ok {\n\t\t\t_, err := ft.Run(ctx, args)\n\t\t\tif err != nil {\n\t\t\t\tfmt.Println(\"Error calling tool:\", err)\n\t\t\t}\n\t\t}\n\t}\n\n\treturn recording.ToolResponse.Response, nil\n}\n\n// afterRun cleans up the invocation state.\nfunc (p *replayPlugin) afterRun(ctx agent.InvocationContext) {\n\tif ctx.Session() == nil {\n\t\treturn\n\t}\n\tsessionState := ctx.Session().State()\n\ton, err := p.isReplayModeOn(sessionState)\n\tif err != nil || !on {\n\t\treturn\n\t}\n\tp.mu.Lock()\n\tdelete(p.invocationStates, ctx.InvocationID())\n\tp.mu.Unlock()\n}\n\n// isReplayModeOn checks if replay mode is enabled in the session state and validates the configuration.\nfunc (p *replayPlugin) isReplayModeOn(sessionState session.State) (bool, error) {\n\tif sessionState == nil {\n\t\treturn false, nil\n\t}\n\tconfigVal, err := sessionState.Get(\"_adk_replay_config\")\n\t// If the key doesn't exist or there's an error, we treat it as disabled.\n\tif err != nil {\n\t\treturn false, nil\n\t}\n\n\tconfig, ok := configVal.(map[string]any)\n\tif !ok {\n\t\treturn false, nil\n\t}\n\n\tcaseDirVal, ok := config[\"dir\"]\n\tif !ok {\n\t\treturn false, nil\n\t}\n\tcaseDir, ok := caseDirVal.(string)\n\tif !ok || caseDir == \"\" {\n\t\treturn false, nil\n\t}\n\n\tbasePath, err := filepath.Abs(p.allowedBaseDir)\n\tif err != nil {\n\t\treturn false, fmt.Errorf(\"invalid path format: %v\", err)\n\t}\n\trequestedAbsPath, err := filepath.Abs(caseDir)\n\tif err != nil {\n\t\treturn false, fmt.Errorf(\"invalid path format: %v\", err)\n\t}\n\trel, err := filepath.Rel(basePath, requestedAbsPath)\n\tif err != nil {\n\t\treturn false, fmt.Errorf(\"invalid path format: %v\", err)\n\t}\n\tif strings.HasPrefix(rel, \"..\") || filepath.IsAbs(rel) {\n\t\treturn false, fmt.Errorf(\"replay config error: 'dir' is not within the allowed base directory\")\n\t}\n\n\tmsgIndexVal, ok := config[\"user_message_index\"]\n\tif !ok || msgIndexVal == nil {\n\t\treturn false, nil\n\t}\n\n\treturn true, nil\n}\n\n// getInvocationState retrieves the replay state for the current invocation.\nfunc (p *replayPlugin) getInvocationState(ctx agent.CallbackContext) (*invocationReplayState, error) {\n\tinvocationID := ctx.InvocationID()\n\tstate, ok := p.invocationStates[invocationID]\n\tif !ok {\n\t\treturn nil, fmt.Errorf(\"replay state not initialized. ensure before_run created it\")\n\t}\n\treturn state, nil\n}\n\n// loadInvocationState loads the recordings and initializes the replay state for the invocation.\nfunc (p *replayPlugin) loadInvocationState(ctx agent.InvocationContext) (*invocationReplayState, error) {\n\tinvocationID := ctx.InvocationID()\n\n\t// 1. Extract Configuration\n\t// We assume ctx.State is map[string]any\n\tconfigVal, err := ctx.Session().State().Get(\"_adk_replay_config\")\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"replay config error: %w\", err)\n\t}\n\n\tconfig, ok := configVal.(map[string]any)\n\tif !ok {\n\t\treturn nil, fmt.Errorf(\"replay config error: '_adk_replay_config' is not a valid map\")\n\t}\n\n\t// 2. Validate Parameters\n\t// Safely extract 'dir'\n\tcaseDir, ok := config[\"dir\"].(string)\n\tif !ok || caseDir == \"\" {\n\t\treturn nil, fmt.Errorf(\"replay config error: 'dir' parameter is missing or empty\")\n\t}\n\n\tbasePath, err := filepath.Abs(p.allowedBaseDir)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"invalid path format: %v\", err)\n\t}\n\trequestedAbsPath, err := filepath.Abs(caseDir)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"invalid path format: %v\", err)\n\t}\n\trel, err := filepath.Rel(basePath, requestedAbsPath)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"invalid path format: %v\", err)\n\t}\n\tif strings.HasPrefix(rel, \"..\") || filepath.IsAbs(rel) {\n\t\treturn nil, fmt.Errorf(\"replay config error: 'dir' is not within the allowed base directory\")\n\t}\n\n\t// Safely extract 'user_message_index'\n\t// Note: JSON/YAML unmarshaling into 'any' often results in float64,\n\t// so we check for both int and float64 to be robust.\n\tvar msgIndex int\n\tswitch v := config[\"user_message_index\"].(type) {\n\tcase int:\n\t\tmsgIndex = v\n\tcase float64:\n\t\tmsgIndex = int(v)\n\tdefault:\n\t\treturn nil, fmt.Errorf(\"replay config error: 'user_message_index' is missing or not a number\")\n\t}\n\n\t// 3. Load Recordings File\n\trecordingsPath := filepath.Join(requestedAbsPath, \"generated-recordings.yaml\")\n\n\t// Check if file exists\n\tif _, err := os.Stat(recordingsPath); os.IsNotExist(err) {\n\t\treturn nil, fmt.Errorf(\"replay config error: recordings file not found: %s\", recordingsPath)\n\t}\n\n\t// Read file\n\tdata, err := os.ReadFile(recordingsPath)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to read recordings file: %w\", err)\n\t}\n\n\t// Parse YAML\n\tvar root yaml.Node\n\tif err := yaml.Unmarshal(data, &root); err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to parse recordings from %s: %w\", recordingsPath, err)\n\t}\n\n\tremoveUnderscores(&root)\n\tfixTypeMismatches(&root)\n\n\tvar recordings recording.Recordings\n\tif err := root.Decode(&recordings); err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to decode recordings: %w\", err)\n\t}\n\n\t// Add index to each recording, based on user message index. Used for parallel execution sync.\n\tindex := 0\n\tprevMessageId := 0\n\tfor i := range recordings.Recordings {\n\t\tif prevMessageId != recordings.Recordings[i].UserMessageIndex {\n\t\t\tprevMessageId = recordings.Recordings[i].UserMessageIndex\n\t\t\tindex = 0\n\t\t}\n\t\trecordings.Recordings[i].Index = index\n\t\tindex++\n\t}\n\n\t// 4. Create and Store State\n\tstate := newInvocationReplayState(caseDir, msgIndex, &recordings)\n\n\tp.mu.Lock()\n\tp.invocationStates[invocationID] = state\n\tp.mu.Unlock()\n\n\treturn state, nil\n}\n\n// getNextRecordingForAgent retrieves the next expected recording for the given agent.\n// It enforces ordering of events within the user message turn to ensure deterministic replay.\nfunc getNextRecordingForAgent(state *invocationReplayState, agentName string) (*recording.Recording, error) {\n\t// Get current agent index\n\tcurrentAgentIndex, ok := state.GetAgentReplayIndex(agentName)\n\tif !ok {\n\t\tcurrentAgentIndex = 0\n\t}\n\n\t// Filter ALL recordings for this agent and user message index (strict order)\n\tagentRecordings := make([]*recording.Recording, 0)\n\tfor _, recording := range state.recordings.Recordings {\n\t\tif recording.AgentName == agentName && recording.UserMessageIndex == state.userMessageIndex {\n\t\t\tagentRecordings = append(agentRecordings, &recording)\n\t\t}\n\t}\n\n\t// Check if we have enough recordings for this agent\n\tif currentAgentIndex >= len(agentRecordings) {\n\t\treturn nil, fmt.Errorf(\"runtime sent more requests than expected for agent '%s' at user_message_index %d. Expected %d, but got request at index %d\",\n\t\t\tagentName, state.userMessageIndex, len(agentRecordings), currentAgentIndex)\n\t}\n\n\t// Get the expected recording\n\texpectedRecording := agentRecordings[currentAgentIndex]\n\n\t// Wait for the current index to match the expected index\n\t// This ensures that we process recordings in the expected order, even if agents are executing in parallel\n\tstate.mu.Lock()\n\tfor state.curIndex != expectedRecording.Index {\n\t\tstate.cond.Wait()\n\t}\n\t// FIXME: remove this sleep, move curIndex++ and state cond.Broadcast() to onEvent callback.\n\t// This sleep is here to make the replay deterministic, but it's not ideal.\n\ttime.Sleep(time.Duration(expectedRecording.Index) * time.Millisecond * 10)\n\n\tstate.agentReplayIndices[agentName]++\n\tstate.curIndex++\n\n\tstate.mu.Unlock()\n\tstate.cond.Broadcast()\n\n\treturn expectedRecording, nil\n}\n\n// verifyAndGetNextLLMRecordingForAgent ensures the next recording is an LLM request and matches the actual request.\nfunc (p *replayPlugin) verifyAndGetNextLLMRecordingForAgent(state *invocationReplayState, agentName string, llmRequest *model.LLMRequest) (*recording.LLMRecording, error) {\n\tcurrentAgentIndex, ok := state.GetAgentReplayIndex(agentName)\n\tif !ok {\n\t\tcurrentAgentIndex = 0\n\t}\n\texpectedRecording, err := getNextRecordingForAgent(state, agentName)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tif expectedRecording.LLMRecording == nil {\n\t\treturn nil, fmt.Errorf(\"expected LLM recording for agent '%s' at index %d, but found tool recording\", agentName, currentAgentIndex)\n\t}\n\n\t// Strict verification of LLM request\n\terr = verifyLLMRequestMatch(expectedRecording.LLMRecording.LLMRequest, llmRequest, agentName, currentAgentIndex)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn expectedRecording.LLMRecording, nil\n}\n\n// verifyLLMRequestMatch compares the expected LLM request from recording with the actual request.\nfunc verifyLLMRequestMatch(expectedLLMRequest, actualLLMRequest *model.LLMRequest, agentName string, agentIndex int) error {\n\t// Define options to ignore specific fields.\n\topts := []cmp.Option{\n\t\tcmpopts.IgnoreFields(genai.FunctionDeclaration{}, \"ParametersJsonSchema\", \"ResponseJsonSchema\", \"Parameters\", \"Response\"),\n\t\tcmpopts.IgnoreFields(model.LLMRequest{}, \"Tools\"),\n\t\tcmpopts.IgnoreFields(genai.GenerateContentConfig{}, \"Labels\"),\n\t\tcmpopts.EquateEmpty(),\n\t}\n\n\tif transferToolAny, ok := expectedLLMRequest.Tools[\"transfer_to_agent\"]; ok {\n\t\ttransferTool := transferToolAny.(*genai.FunctionDeclaration)\n\t\ttransferTool.Description = `Transfer the question to another agent.\nThis tool hands off control to another agent when it's more suitable to answer the user's question according to the agent's description.`\n\t}\n\n\tif expectedLLMRequest.Config != nil {\n\t\tfor _, tool := range expectedLLMRequest.Config.Tools {\n\t\t\tfor _, funcDecl := range tool.FunctionDeclarations {\n\t\t\t\tif funcDecl.Name == \"transfer_to_agent\" {\n\t\t\t\t\tfuncDecl.Description = `Transfer the question to another agent.\nThis tool hands off control to another agent when it's more suitable to answer the user's question according to the agent's description.`\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Compare!\n\t// cmp.Diff returns an empty string if they are equal, otherwise a human-readable diff.\n\tif diff := cmp.Diff(expectedLLMRequest, actualLLMRequest, opts...); diff != \"\" {\n\t\tfor _, content := range expectedLLMRequest.Contents {\n\t\t\tfor _, part := range content.Parts {\n\t\t\t\tif part.Text != \"\" {\n\t\t\t\t\tpart.Text = modifyString(part.Text)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif diff := cmp.Diff(expectedLLMRequest, actualLLMRequest, opts...); diff != \"\" {\n\t\t\treturn fmt.Errorf(\"LLM request mismatch for agent '%s' (index %d):\\n%s\",\n\t\t\t\tagentName, agentIndex, diff)\n\t\t}\n\t}\n\n\treturn nil\n}\n\nvar (\n\t// Matches either \"parameters: \" or \"result: \" followed by a JSON-like object/array\n\tdataBlockRegex = regexp.MustCompile(`(?i)(parameters|result):\\s*([\\{\\[].*[\\}\\]])`)\n\t// Matches 'key' or 'value' but ignores apostrophes inside words like O'Malley\n\tquoteRegex = regexp.MustCompile(`'([^']*)'`)\n\t// Matches Python/Pseudo-JSON constants specifically as values\n\tnullRegex = regexp.MustCompile(`\\bNone\\b`)\n\tboolRegex = regexp.MustCompile(`\\b(True|False)\\b`)\n)\n\nfunc modifyString(input string) string {\n\t// We use ReplaceAllStringFunc to process ONLY the captured data parts\n\treturn dataBlockRegex.ReplaceAllStringFunc(input, func(fullMatch string) string {\n\t\t// Split label (e.g., \"parameters:\") from the data (e.g., \"{'a': 1}\")\n\t\tparts := dataBlockRegex.FindStringSubmatch(fullMatch)\n\t\tif len(parts) < 3 {\n\t\t\treturn fullMatch\n\t\t}\n\n\t\tlabel := parts[1]\n\t\trawData := parts[2]\n\n\t\t// Normalize Python-isms to JSON-isms\n\t\t// Replace single quotes with double quotes\n\t\tnormalized := quoteRegex.ReplaceAllString(rawData, `\"$1\"`)\n\t\t// Replace None -> null\n\t\tnormalized = nullRegex.ReplaceAllString(normalized, \"null\")\n\t\t// Replace True/False -> true/false\n\t\tnormalized = boolRegex.ReplaceAllStringFunc(normalized, func(m string) string {\n\t\t\treturn strings.ToLower(m)\n\t\t})\n\n\t\t// Round-trip through JSON to validate and clean up\n\t\tvar parsed any\n\t\tif err := json.Unmarshal([]byte(normalized), &parsed); err != nil {\n\t\t\t// If it's still not valid JSON, return the original match to avoid corruption\n\t\t\treturn fullMatch\n\t\t}\n\n\t\t// Marshal back to a clean, standard JSON string\n\t\tfixedJSON, err := json.Marshal(parsed)\n\t\tif err != nil {\n\t\t\treturn fullMatch\n\t\t}\n\n\t\treturn fmt.Sprintf(\"%s: %s\", label, string(fixedJSON))\n\t})\n}\n\n// verifyAndGetNextToolRecordingForAgent ensures the next recording is a tool call and matches the actual call.\nfunc (p *replayPlugin) verifyAndGetNextToolRecordingForAgent(state *invocationReplayState, agentName string, t tool.Tool, args map[string]any) (*recording.ToolRecording, error) {\n\tcurrentAgentIndex, ok := state.GetAgentReplayIndex(agentName)\n\tif !ok {\n\t\tcurrentAgentIndex = 0\n\t}\n\texpectedRecording, err := getNextRecordingForAgent(state, agentName)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tif expectedRecording.ToolRecording == nil {\n\t\treturn nil, fmt.Errorf(\"expected tool recording for agent '%s' at index %d, but found LLM recording\", agentName, currentAgentIndex)\n\t}\n\n\t// Strict verification of tool call\n\terr = verifyToolCallMatch(expectedRecording.ToolRecording.ToolCall, t.Name(), args, agentName, currentAgentIndex)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn expectedRecording.ToolRecording, nil\n}\n\n// verifyToolCallMatch compares the expected tool call from recording with the actual tool call.\nfunc verifyToolCallMatch(expectedToolCall *genai.FunctionCall, toolName string, toolArgs map[string]any, agentName string, agentIndex int) error {\n\tif expectedToolCall.Name != toolName {\n\t\treturn fmt.Errorf(\"tool name mismatch for agent '%s' (index %d): expected '%s', got '%s'\",\n\t\t\tagentName, agentIndex, expectedToolCall.Name, toolName)\n\t}\n\n\tif diff := cmp.Diff(expectedToolCall.Args, toolArgs); diff != \"\" {\n\t\treturn fmt.Errorf(\"tool args mismatch for agent '%s' (index %d):\\n%s\",\n\t\t\tagentName, agentIndex, diff)\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "internal/configurable/conformance/replayplugin/replay_plugin_test.go",
    "content": "// Copyright 2026 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage replayplugin_test\n\nimport (\n\t\"context\"\n\t\"iter\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"testing\"\n\t\"time\"\n\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/agent\"\n\t\"google.golang.org/adk/internal/configurable/conformance/replayplugin\"\n\t\"google.golang.org/adk/memory\"\n\t\"google.golang.org/adk/model\"\n\t\"google.golang.org/adk/plugin\"\n\t\"google.golang.org/adk/session\"\n\t\"google.golang.org/adk/tool/toolconfirmation\"\n)\n\n// TestReplayPlugin verifies the plugin's callback behavior and replay functionality.\nfunc TestReplayPlugin(t *testing.T) {\n\t// Setup per test\n\tsetup := func(t *testing.T) (*plugin.Plugin, *MockSession, *MockState) {\n\t\tplugin := replayplugin.MustNew(\"/\")\n\t\tsessionState := make(map[string]any)\n\t\tmockState := &MockState{data: sessionState}\n\t\tmockSession := &MockSession{state: mockState}\n\t\treturn plugin, mockSession, mockState\n\t}\n\n\tt.Run(\"BeforeModelCallback_WithMatchingRecording_ReturnsRecordedResponse\", func(t *testing.T) {\n\t\tplugin, mockSession, _ := setup(t)\n\t\ttempDir := t.TempDir()\n\n\t\t// 1. Create recording file\n\t\trecordingsYaml := `\nrecordings:\n  - user_message_index: 0\n    agent_name: \"test_agent\"\n    llm_recording:\n      llm_request:\n        model: \"gemini-2.0-flash\"\n        contents:\n          - role: \"user\"\n            parts:\n              - text: \"Hello\"\n      llm_response:\n        content:\n          role: \"model\"\n          parts:\n            - text: \"Recorded response\"\n`\n\t\tcreateRecordingsFile(t, tempDir, recordingsYaml)\n\n\t\t// 2. Setup replay config\n\t\terr := mockSession.State().Set(\"_adk_replay_config\", map[string]any{\n\t\t\t\"dir\":                tempDir,\n\t\t\t\"user_message_index\": 0,\n\t\t})\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"unexpected error: %v\", err)\n\t\t}\n\n\t\t// 3. Load recordings (BeforeRunCallback)\n\t\tinvContext := &MockInvocationContext{\n\t\t\tsession:      mockSession,\n\t\t\tinvocationID: \"test-invocation\",\n\t\t}\n\t\t_, err = plugin.BeforeRunCallback()(invContext)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"unexpected error: %v\", err)\n\t\t}\n\n\t\t// 4. Call BeforeModelCallback with matching request\n\t\tcbContext := &MockCallbackContext{\n\t\t\tstate:        mockSession.State(),\n\t\t\tinvocationID: \"test-invocation\",\n\t\t\tagentName:    \"test_agent\",\n\t\t}\n\n\t\trequest := &model.LLMRequest{\n\t\t\tModel: \"gemini-2.0-flash\",\n\t\t\tContents: []*genai.Content{\n\t\t\t\t{\n\t\t\t\t\tRole:  \"user\",\n\t\t\t\t\tParts: []*genai.Part{{Text: \"Hello\"}},\n\t\t\t\t},\n\t\t\t},\n\t\t}\n\n\t\tresult, err := plugin.BeforeModelCallback()(cbContext, request)\n\t\t// 5. Verify\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"unexpected error: %v\", err)\n\t\t}\n\t\tif result == nil {\n\t\t\tt.Fatal(\"expected non-nil result\")\n\t\t}\n\t\tif result.Content == nil {\n\t\t\tt.Fatal(\"expected non-nil result.Content\")\n\t\t}\n\n\t\tif got := result.Content.Parts[0].Text; got != \"Recorded response\" {\n\t\t\tt.Errorf(\"expected %q, got %q\", \"Recorded response\", got)\n\t\t}\n\t})\n\n\tt.Run(\"BeforeModelCallback_RequestMismatch_ReturnsEmpty\", func(t *testing.T) {\n\t\tplugin, mockSession, _ := setup(t)\n\t\ttempDir := t.TempDir()\n\n\t\t// 1. Create recording with DIFFERENT model\n\t\trecordingsYaml := `\nrecordings:\n  - user_message_index: 0\n    agent_name: \"test_agent\"\n    llm_recording:\n      llm_request:\n        model: \"gemini-1.5-pro\" \n        contents:\n          - role: \"user\"\n            parts:\n              - text: \"Hello\"\n`\n\t\tcreateRecordingsFile(t, tempDir, recordingsYaml)\n\n\t\t// 2. Setup config\n\t\terr := mockSession.State().Set(\"_adk_replay_config\", map[string]any{\n\t\t\t\"dir\":                tempDir,\n\t\t\t\"user_message_index\": 0,\n\t\t})\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"unexpected error: %v\", err)\n\t\t}\n\n\t\t// 3. Load recordings\n\t\tinvContext := &MockInvocationContext{\n\t\t\tsession:      mockSession,\n\t\t\tinvocationID: \"test-invocation\",\n\t\t}\n\t\t_, err = plugin.BeforeRunCallback()(invContext)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"unexpected error: %v\", err)\n\t\t}\n\n\t\t// 4. Call with mismatched request (gemini-2.0-flash vs 1.5-pro)\n\t\tcbContext := &MockCallbackContext{\n\t\t\tstate:        mockSession.State(),\n\t\t\tinvocationID: \"test-invocation\",\n\t\t\tagentName:    \"test_agent\",\n\t\t}\n\n\t\trequest := &model.LLMRequest{\n\t\t\tModel: \"gemini-2.0-flash\",\n\t\t\tContents: []*genai.Content{\n\t\t\t\t{\n\t\t\t\t\tRole:  \"user\",\n\t\t\t\t\tParts: []*genai.Part{{Text: \"Hello\"}},\n\t\t\t\t},\n\t\t\t},\n\t\t}\n\n\t\tresult, err := plugin.BeforeModelCallback()(cbContext, request)\n\t\t// 5. Verify result is nil (empty) and error is returned\n\t\tif err == nil {\n\t\t\tt.Fatal(\"expected error due to mismatch\")\n\t\t}\n\t\tif result != nil {\n\t\t\tt.Errorf(\"expected nil result, got %v\", result)\n\t\t}\n\t})\n\n\tt.Run(\"BeforeToolCallback_WithMatchingRecording_ReturnsRecordedResponse\", func(t *testing.T) {\n\t\tplugin, mockSession, _ := setup(t)\n\t\ttempDir := t.TempDir()\n\n\t\t// 1. Create recording with tool call\n\t\trecordingsYaml := `\nrecordings:\n  - user_message_index: 0\n    agent_name: \"test_agent\"\n    tool_recording:\n      tool_call:\n        name: \"test_tool\"\n        args:\n          param1: \"value1\"\n          param2: 42\n      tool_response:\n        name: \"test_tool\"\n        response:\n          result: \"success\"\n          data: \"recorded data\"\n`\n\t\tcreateRecordingsFile(t, tempDir, recordingsYaml)\n\n\t\t// 2. Setup config\n\t\terr := mockSession.State().Set(\"_adk_replay_config\", map[string]any{\n\t\t\t\"dir\":                tempDir,\n\t\t\t\"user_message_index\": 0,\n\t\t})\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"unexpected error: %v\", err)\n\t\t}\n\n\t\t// 3. Load recordings\n\t\tinvContext := &MockInvocationContext{\n\t\t\tsession:      mockSession,\n\t\t\tinvocationID: \"test-invocation\",\n\t\t}\n\t\t_, err = plugin.BeforeRunCallback()(invContext)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"unexpected error: %v\", err)\n\t\t}\n\n\t\t// 4. Call BeforeToolCallback\n\t\tmockTool := &MockTool{NameVal: \"test_tool\"}\n\t\ttoolContext := &MockToolContext{\n\t\t\tstate:        mockSession.State(),\n\t\t\tinvocationID: \"test-invocation\",\n\t\t\tagentName:    \"test_agent\",\n\t\t}\n\t\ttoolArgs := map[string]any{\"param1\": \"value1\", \"param2\": 42}\n\n\t\tresult, err := plugin.BeforeToolCallback()(toolContext, mockTool, toolArgs)\n\t\t// 5. Verify\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"unexpected error: %v\", err)\n\t\t}\n\t\tif result == nil {\n\t\t\tt.Fatal(\"expected non-nil result\")\n\t\t}\n\t\tif got := result[\"result\"]; got != \"success\" {\n\t\t\tt.Errorf(\"expected %q, got %q\", \"success\", got)\n\t\t}\n\t\tif got := result[\"data\"]; got != \"recorded data\" {\n\t\t\tt.Errorf(\"expected %q, got %q\", \"recorded data\", got)\n\t\t}\n\t})\n\n\tt.Run(\"BeforeToolCallback_ToolNameMismatch_ReturnsEmpty\", func(t *testing.T) {\n\t\tplugin, mockSession, _ := setup(t)\n\t\ttempDir := t.TempDir()\n\n\t\t// 1. Recording expects \"expected_tool\"\n\t\trecordingsYaml := `\nrecordings:\n  - user_message_index: 0\n    agent_name: \"test_agent\"\n    tool_recording:\n      tool_call:\n        name: \"expected_tool\"\n        args:\n          param: \"value\"\n`\n\t\tcreateRecordingsFile(t, tempDir, recordingsYaml)\n\n\t\terr := mockSession.State().Set(\"_adk_replay_config\", map[string]any{\n\t\t\t\"dir\":                tempDir,\n\t\t\t\"user_message_index\": 0,\n\t\t})\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"unexpected error: %v\", err)\n\t\t}\n\t\tinvContext := &MockInvocationContext{session: mockSession, invocationID: \"test-invocation\"}\n\t\t_, err = plugin.BeforeRunCallback()(invContext)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"unexpected error: %v\", err)\n\t\t}\n\n\t\t// 2. Call with \"actual_tool\"\n\t\tmockTool := &MockTool{NameVal: \"actual_tool\"} // Wrong name\n\t\ttoolContext := &MockToolContext{\n\t\t\tstate:        mockSession.State(),\n\t\t\tinvocationID: \"test-invocation\",\n\t\t\tagentName:    \"test_agent\",\n\t\t}\n\n\t\tresult, err := plugin.BeforeToolCallback()(toolContext, mockTool, map[string]any{\"param\": \"value\"})\n\t\t// 3. Verify nil result and error\n\t\tif err == nil {\n\t\t\tt.Fatal(\"expected error due to tool name mismatch\")\n\t\t}\n\t\tif result != nil {\n\t\t\tt.Errorf(\"expected nil result, got %v\", result)\n\t\t}\n\t})\n\n\tt.Run(\"BeforeToolCallback_ToolArgsMismatch_ReturnsEmpty\", func(t *testing.T) {\n\t\tplugin, mockSession, _ := setup(t)\n\t\ttempDir := t.TempDir()\n\n\t\t// 1. Recording expects \"expected_value\"\n\t\trecordingsYaml := `\nrecordings:\n  - user_message_index: 0\n    agent_name: \"test_agent\"\n    tool_recording:\n      tool_call:\n        name: \"test_tool\"\n        args:\n          param: \"expected_value\"\n`\n\t\tcreateRecordingsFile(t, tempDir, recordingsYaml)\n\n\t\terr := mockSession.State().Set(\"_adk_replay_config\", map[string]any{\n\t\t\t\"dir\":                tempDir,\n\t\t\t\"user_message_index\": 0,\n\t\t})\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"unexpected error: %v\", err)\n\t\t}\n\t\tinvContext := &MockInvocationContext{session: mockSession, invocationID: \"test-invocation\"}\n\t\t_, err = plugin.BeforeRunCallback()(invContext)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"unexpected error: %v\", err)\n\t\t}\n\n\t\t// 2. Call with \"actual_value\"\n\t\tmockTool := &MockTool{NameVal: \"test_tool\"}\n\t\ttoolContext := &MockToolContext{\n\t\t\tstate:        mockSession.State(),\n\t\t\tinvocationID: \"test-invocation\",\n\t\t\tagentName:    \"test_agent\",\n\t\t}\n\n\t\tresult, err := plugin.BeforeToolCallback()(toolContext, mockTool, map[string]any{\"param\": \"actual_value\"})\n\t\t// 3. Verify nil result and error\n\t\tif err == nil {\n\t\t\tt.Fatal(\"expected error due to tool args mismatch\")\n\t\t}\n\t\tif result != nil {\n\t\t\tt.Errorf(\"expected nil result, got %v\", result)\n\t\t}\n\t})\n}\n\n// --- Helpers & Mocks ---\n\nfunc createRecordingsFile(t *testing.T, dir, content string) {\n\tpath := filepath.Join(dir, \"generated-recordings.yaml\")\n\terr := os.WriteFile(path, []byte(content), 0o644)\n\tif err != nil {\n\t\tt.Fatalf(\"unexpected error: %v\", err)\n\t}\n}\n\n// Mock interfaces needed to replace Mockito\n// These should implement the interfaces defined in your main code.\n\ntype MockState struct {\n\tdata map[string]any\n}\n\nfunc (m *MockState) Set(key string, val any) error { m.data[key] = val; return nil }\nfunc (m *MockState) Get(key string) (any, error)   { return m.data[key], nil }\nfunc (m *MockState) All() iter.Seq2[string, any]   { return nil }\n\n// Assuming Session interface has a State() method\ntype MockSession struct {\n\tstate *MockState\n}\n\nfunc (m *MockSession) ID() string                { return \"mock-session-id\" }\nfunc (m *MockSession) AppName() string           { return \"mock-app\" }\nfunc (m *MockSession) UserID() string            { return \"mock-user\" }\nfunc (m *MockSession) State() session.State      { return m.state }\nfunc (m *MockSession) Events() session.Events    { return nil }\nfunc (m *MockSession) LastUpdateTime() time.Time { return time.Now() }\n\n// MockInvocationContext\ntype MockInvocationContext struct {\n\tsession      *MockSession\n\tinvocationID string\n}\n\nfunc (m *MockInvocationContext) Session() session.Session                                { return m.session }\nfunc (m *MockInvocationContext) InvocationID() string                                    { return m.invocationID }\nfunc (m *MockInvocationContext) Agent() agent.Agent                                      { return nil }\nfunc (m *MockInvocationContext) Artifacts() agent.Artifacts                              { return nil }\nfunc (m *MockInvocationContext) Memory() agent.Memory                                    { return nil }\nfunc (m *MockInvocationContext) Branch() string                                          { return \"\" }\nfunc (m *MockInvocationContext) UserContent() *genai.Content                             { return nil }\nfunc (m *MockInvocationContext) RunConfig() *agent.RunConfig                             { return nil } // Use context? No, RunConfig struct.\nfunc (m *MockInvocationContext) EndInvocation()                                          {}\nfunc (m *MockInvocationContext) Ended() bool                                             { return false }\nfunc (m *MockInvocationContext) WithContext(ctx context.Context) agent.InvocationContext { return m }\nfunc (m *MockInvocationContext) Value(key any) any                                       { return nil }\nfunc (m *MockInvocationContext) Deadline() (deadline time.Time, ok bool)                 { return time.Time{}, false }\nfunc (m *MockInvocationContext) Done() <-chan struct{}                                   { return nil }\nfunc (m *MockInvocationContext) Err() error                                              { return nil }\n\n// MockCallbackContext\ntype MockCallbackContext struct {\n\tstate        session.State\n\tinvocationID string\n\tagentName    string\n}\n\nfunc (m *MockCallbackContext) State() session.State                    { return m.state }\nfunc (m *MockCallbackContext) ReadonlyState() session.ReadonlyState    { return m.state }\nfunc (m *MockCallbackContext) InvocationID() string                    { return m.invocationID }\nfunc (m *MockCallbackContext) AgentName() string                       { return m.agentName }\nfunc (m *MockCallbackContext) AppName() string                         { return \"mock-app\" }\nfunc (m *MockCallbackContext) Branch() string                          { return \"\" }\nfunc (m *MockCallbackContext) SessionID() string                       { return \"mock-session-id\" }\nfunc (m *MockCallbackContext) UserID() string                          { return \"mock-user\" }\nfunc (m *MockCallbackContext) UserContent() *genai.Content             { return nil }\nfunc (m *MockCallbackContext) Artifacts() agent.Artifacts              { return nil }\nfunc (m *MockCallbackContext) Value(key any) any                       { return nil }\nfunc (m *MockCallbackContext) Deadline() (deadline time.Time, ok bool) { return time.Time{}, false }\nfunc (m *MockCallbackContext) Done() <-chan struct{}                   { return nil }\nfunc (m *MockCallbackContext) Err() error                              { return nil }\n\n// MockToolContext\ntype MockToolContext struct {\n\tstate        session.State\n\tinvocationID string\n\tagentName    string\n}\n\nfunc (m *MockToolContext) State() session.State                 { return m.state }\nfunc (m *MockToolContext) ReadonlyState() session.ReadonlyState { return m.state }\nfunc (m *MockToolContext) InvocationID() string                 { return m.invocationID }\nfunc (m *MockToolContext) AgentName() string                    { return m.agentName }\nfunc (m *MockToolContext) FunctionCallID() string               { return \"mock-function-call-id\" }\nfunc (m *MockToolContext) Actions() *session.EventActions       { return nil }\nfunc (m *MockToolContext) SearchMemory(ctx context.Context, query string) (*memory.SearchResponse, error) {\n\treturn nil, nil\n}\nfunc (m *MockToolContext) ToolConfirmation() *toolconfirmation.ToolConfirmation { return nil }\nfunc (m *MockToolContext) RequestConfirmation(hint string, payload any) error   { return nil }\nfunc (m *MockToolContext) AppName() string                                      { return \"mock-app\" }\nfunc (m *MockToolContext) Branch() string                                       { return \"\" }\nfunc (m *MockToolContext) SessionID() string                                    { return \"mock-session-id\" }\nfunc (m *MockToolContext) UserID() string                                       { return \"mock-user\" }\nfunc (m *MockToolContext) UserContent() *genai.Content                          { return nil }\nfunc (m *MockToolContext) Artifacts() agent.Artifacts                           { return nil }\nfunc (m *MockToolContext) Value(key any) any                                    { return nil }\nfunc (m *MockToolContext) Deadline() (deadline time.Time, ok bool)              { return time.Time{}, false }\nfunc (m *MockToolContext) Done() <-chan struct{}                                { return nil }\nfunc (m *MockToolContext) Err() error                                           { return nil }\n\n// MockTool\ntype MockTool struct {\n\tNameVal string\n}\n\nfunc (m *MockTool) Name() string                                        { return m.NameVal }\nfunc (m *MockTool) Description() string                                 { return \"mock tool\" }\nfunc (m *MockTool) IsLongRunning() bool                                 { return false }\nfunc (m *MockTool) Run(ctx any, args map[string]any, toolCtx any) error { return nil }\n\nfunc TestReplayPlugin_PathValidation(t *testing.T) {\n\t// Create a temporary directory structure for testing path validation\n\ttempDir := t.TempDir()\n\tsafeDir := filepath.Join(tempDir, \"safe\")\n\tif err := os.Mkdir(safeDir, 0o755); err != nil {\n\t\tt.Fatalf(\"failed to create safe dir: %v\", err)\n\t}\n\n\t// Create a safe recordings file\n\tcreateRecordingsFile(t, safeDir, \"recordings: []\")\n\n\t// Initialize plugin with restricted base directory\n\tplugin := replayplugin.MustNew(safeDir)\n\tsessionState := make(map[string]any)\n\tmockState := &MockState{data: sessionState}\n\tmockSession := &MockSession{state: mockState}\n\tinvContext := &MockInvocationContext{\n\t\tsession:      mockSession,\n\t\tinvocationID: \"test-invocation\",\n\t}\n\n\ttests := []struct {\n\t\tname        string\n\t\tdir         string\n\t\texpectError bool\n\t}{\n\t\t{\n\t\t\tname:        \"ValidPath_InsideBaseDir\",\n\t\t\tdir:         safeDir,\n\t\t\texpectError: false,\n\t\t},\n\t\t{\n\t\t\tname:        \"InvalidPath_ParentTraversal\",\n\t\t\tdir:         filepath.Join(safeDir, \"..\"),\n\t\t\texpectError: true,\n\t\t},\n\t\t{\n\t\t\tname:        \"InvalidPath_OutsideBaseDir\",\n\t\t\tdir:         tempDir, // tempDir is parent of safeDir, so it's outside\n\t\t\texpectError: true,\n\t\t},\n\t\t{\n\t\t\tname:        \"InvalidPath_AbsoluteOutside\",\n\t\t\tdir:         \"/etc\", // outside\n\t\t\texpectError: true,\n\t\t},\n\t\t{\n\t\t\tname:        \"InvalidPath_RelativeTraversal\",\n\t\t\tdir:         \"../\", // Relative path traversing up\n\t\t\texpectError: true,\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\t// Set the config\n\t\t\terr := mockSession.State().Set(\"_adk_replay_config\", map[string]any{\n\t\t\t\t\"dir\":                tt.dir,\n\t\t\t\t\"user_message_index\": 0,\n\t\t\t})\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"unexpected error setting config: %v\", err)\n\t\t\t}\n\n\t\t\t// Run BeforeRunCallback\n\t\t\t_, err = plugin.BeforeRunCallback()(invContext)\n\n\t\t\tif tt.expectError {\n\t\t\t\tif err == nil {\n\t\t\t\t\tt.Errorf(\"expected error for dir %q, got nil\", tt.dir)\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err != nil {\n\t\t\t\t\tt.Errorf(\"unexpected error for dir %q: %v\", tt.dir, err)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "internal/configurable/conformance/replayplugin/yaml_utils.go",
    "content": "// Copyright 2026 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage replayplugin\n\nimport (\n\t\"strings\"\n\n\t\"gopkg.in/yaml.v3\"\n)\n\nvar toIgnore = map[string]struct{}{\"thought_signature\": {}, \"http_options\": {}, \"args\": {}, \"response\": {}}\n\nfunc removeUnderscores(node *yaml.Node) {\n\tswitch node.Kind {\n\tcase yaml.DocumentNode, yaml.SequenceNode:\n\t\t// If it's a document or a list, just pass through to its children\n\t\tfor _, child := range node.Content {\n\t\t\tremoveUnderscores(child)\n\t\t}\n\tcase yaml.MappingNode:\n\t\t// A MappingNode's content is a flat array alternating [key, value, key, value...]\n\t\tfor i := 0; i < len(node.Content); i += 2 {\n\t\t\tkeyNode := node.Content[i]\n\t\t\tvalueNode := node.Content[i+1]\n\t\t\tif _, ok := toIgnore[keyNode.Value]; ok {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\t// Strip the underscore from the key (e.g., \"first_name\" -> \"firstname\")\n\t\t\tkeyNode.Value = strings.ReplaceAll(keyNode.Value, \"_\", \"\")\n\n\t\t\t// Continue walking down into the value in case of nested objects\n\t\t\tremoveUnderscores(valueNode)\n\t\t}\n\t}\n}\n\nfunc fixTypeMismatches(n *yaml.Node) {\n\tswitch n.Kind {\n\tcase yaml.DocumentNode, yaml.SequenceNode:\n\t\tfor _, child := range n.Content {\n\t\t\tfixTypeMismatches(child)\n\t\t}\n\n\tcase yaml.MappingNode:\n\t\tfor i := 0; i < len(n.Content); i += 2 {\n\t\t\tkeyNode := n.Content[i]\n\t\t\tvalueNode := n.Content[i+1]\n\n\t\t\tswitch keyNode.Value {\n\t\t\tcase \"systeminstruction\":\n\t\t\t\tif valueNode.Kind == yaml.ScalarNode {\n\t\t\t\t\tval := valueNode.Value\n\t\t\t\t\tvalueNode.Kind = yaml.MappingNode\n\t\t\t\t\tvalueNode.Tag = \"!!map\"\n\t\t\t\t\tvalueNode.Value = \"\"\n\t\t\t\t\tvalueNode.Content = []*yaml.Node{\n\t\t\t\t\t\t{Kind: yaml.ScalarNode, Value: \"role\"},\n\t\t\t\t\t\t{Kind: yaml.ScalarNode, Tag: \"!!str\", Value: \"user\"},\n\t\t\t\t\t\t{Kind: yaml.ScalarNode, Value: \"parts\"},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tKind: yaml.SequenceNode,\n\t\t\t\t\t\t\tTag:  \"!!seq\",\n\t\t\t\t\t\t\tContent: []*yaml.Node{\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tKind: yaml.MappingNode,\n\t\t\t\t\t\t\t\t\tTag:  \"!!map\",\n\t\t\t\t\t\t\t\t\tContent: []*yaml.Node{\n\t\t\t\t\t\t\t\t\t\t{Kind: yaml.ScalarNode, Value: \"text\"},\n\t\t\t\t\t\t\t\t\t\t{Kind: yaml.ScalarNode, Tag: \"!!str\", Value: val},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Recurse into the value to catch nested structures\n\t\t\tfixTypeMismatches(valueNode)\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "internal/context/callback_context.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage context\n\nimport (\n\t\"context\"\n\t\"iter\"\n\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/agent\"\n\t\"google.golang.org/adk/artifact\"\n\t\"google.golang.org/adk/session\"\n)\n\ntype internalArtifacts struct {\n\tagent.Artifacts\n\teventActions *session.EventActions\n}\n\nfunc (ia *internalArtifacts) Save(ctx context.Context, name string, data *genai.Part) (*artifact.SaveResponse, error) {\n\tresp, err := ia.Artifacts.Save(ctx, name, data)\n\tif err != nil {\n\t\treturn resp, err\n\t}\n\tif ia.eventActions != nil {\n\t\tif ia.eventActions.ArtifactDelta == nil {\n\t\t\tia.eventActions.ArtifactDelta = make(map[string]int64)\n\t\t}\n\t\t// TODO: RWLock, check the version stored is newer in case multiple tools save the same file.\n\t\tia.eventActions.ArtifactDelta[name] = resp.Version\n\t}\n\treturn resp, nil\n}\n\nfunc NewCallbackContext(ctx agent.InvocationContext) agent.CallbackContext {\n\treturn newCallbackContext(ctx, make(map[string]any), make(map[string]int64))\n}\n\nfunc NewCallbackContextWithDelta(ctx agent.InvocationContext, stateDelta map[string]any, artifactDelta map[string]int64) agent.CallbackContext {\n\treturn newCallbackContext(ctx, stateDelta, artifactDelta)\n}\n\nfunc newCallbackContext(ctx agent.InvocationContext, stateDelta map[string]any, artifactDelta map[string]int64) *callbackContext {\n\trCtx := NewReadonlyContext(ctx)\n\teventActions := &session.EventActions{StateDelta: stateDelta, ArtifactDelta: artifactDelta}\n\treturn &callbackContext{\n\t\tReadonlyContext: rCtx,\n\t\tinvocationCtx:   ctx,\n\t\teventActions:    eventActions,\n\t\tartifacts: &internalArtifacts{\n\t\t\tArtifacts:    ctx.Artifacts(),\n\t\t\teventActions: eventActions,\n\t\t},\n\t}\n}\n\n// TODO: unify with agent.callbackContext\n\ntype callbackContext struct {\n\tagent.ReadonlyContext\n\tartifacts     *internalArtifacts\n\tinvocationCtx agent.InvocationContext\n\teventActions  *session.EventActions\n}\n\nfunc (c *callbackContext) Artifacts() agent.Artifacts {\n\treturn c.artifacts\n}\n\nfunc (c *callbackContext) AgentName() string {\n\treturn c.invocationCtx.Agent().Name()\n}\n\nfunc (c *callbackContext) ReadonlyState() session.ReadonlyState {\n\treturn c.invocationCtx.Session().State()\n}\n\nfunc (c *callbackContext) State() session.State {\n\treturn &callbackContextState{ctx: c}\n}\n\nfunc (c *callbackContext) InvocationID() string {\n\treturn c.invocationCtx.InvocationID()\n}\n\nfunc (c *callbackContext) UserContent() *genai.Content {\n\treturn c.invocationCtx.UserContent()\n}\n\ntype callbackContextState struct {\n\tctx *callbackContext\n}\n\nfunc (c *callbackContextState) Get(key string) (any, error) {\n\tif c.ctx.eventActions != nil && c.ctx.eventActions.StateDelta != nil {\n\t\tif val, ok := c.ctx.eventActions.StateDelta[key]; ok {\n\t\t\treturn val, nil\n\t\t}\n\t}\n\treturn c.ctx.invocationCtx.Session().State().Get(key)\n}\n\nfunc (c *callbackContextState) Set(key string, val any) error {\n\tif c.ctx.eventActions != nil && c.ctx.eventActions.StateDelta != nil {\n\t\tc.ctx.eventActions.StateDelta[key] = val\n\t}\n\treturn c.ctx.invocationCtx.Session().State().Set(key, val)\n}\n\nfunc (c *callbackContextState) All() iter.Seq2[string, any] {\n\treturn c.ctx.invocationCtx.Session().State().All()\n}\n"
  },
  {
    "path": "internal/context/context_test.go",
    "content": "// Copyright 2026 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage context\n\nimport (\n\t\"context\"\n\t\"testing\"\n\n\t\"github.com/google/go-cmp/cmp\"\n\t\"github.com/google/go-cmp/cmp/cmpopts\"\n\n\t\"google.golang.org/adk/agent\"\n)\n\nfunc TestReadonlyContext(t *testing.T) {\n\tinv := NewInvocationContext(t.Context(), InvocationContextParams{})\n\treadonly := NewReadonlyContext(inv)\n\n\tif got, ok := readonly.(agent.InvocationContext); ok {\n\t\tt.Errorf(\"ReadonlyContext(%+T) is unexpectedly an InvocationContext\", got)\n\t}\n}\n\nfunc TestCallbackContext(t *testing.T) {\n\tinv := NewInvocationContext(t.Context(), InvocationContextParams{})\n\tcallback := NewCallbackContext(inv)\n\n\tif _, ok := callback.(agent.ReadonlyContext); !ok {\n\t\tt.Errorf(\"CallbackContext(%+T) is unexpectedly not a ReadonlyContext\", callback)\n\t}\n\tif got, ok := callback.(agent.InvocationContext); ok {\n\t\tt.Errorf(\"CallbackContext(%+T) is unexpectedly an InvocationContext\", got)\n\t}\n}\n\ntype testKey struct{}\n\nfunc TestWithContext(t *testing.T) {\n\tbaseCtx := t.Context()\n\tinv := NewInvocationContext(baseCtx, InvocationContextParams{\n\t\tBranch: \"test-branch\",\n\t})\n\n\tkey := testKey{}\n\tval := \"val\"\n\tgot := inv.WithContext(context.WithValue(baseCtx, key, val))\n\n\tif got.Value(key) != val {\n\t\tt.Errorf(\"WithContext() did not update context\")\n\t}\n\tif diff := cmp.Diff(inv, got, cmp.AllowUnexported(InvocationContext{}), cmpopts.IgnoreFields(InvocationContext{}, \"Context\")); diff != \"\" {\n\t\tt.Errorf(\"WithContext() mismatch (-want +got):\\n%s\", diff)\n\t}\n}\n"
  },
  {
    "path": "internal/context/invocation_context.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage context\n\nimport (\n\t\"context\"\n\n\t\"github.com/google/uuid\"\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/agent\"\n\t\"google.golang.org/adk/session\"\n)\n\ntype InvocationContextParams struct {\n\tArtifacts agent.Artifacts\n\tMemory    agent.Memory\n\tSession   session.Session\n\n\tBranch string\n\tAgent  agent.Agent\n\n\tUserContent   *genai.Content\n\tRunConfig     *agent.RunConfig\n\tEndInvocation bool\n\tInvocationID  string\n}\n\nfunc NewInvocationContext(ctx context.Context, params InvocationContextParams) agent.InvocationContext {\n\tif params.InvocationID == \"\" {\n\t\tparams.InvocationID = \"e-\" + uuid.NewString()\n\t}\n\treturn &InvocationContext{\n\t\tContext: ctx,\n\t\tparams:  params,\n\t}\n}\n\ntype InvocationContext struct {\n\tcontext.Context\n\n\tparams InvocationContextParams\n}\n\nfunc (c *InvocationContext) Artifacts() agent.Artifacts {\n\treturn c.params.Artifacts\n}\n\nfunc (c *InvocationContext) Agent() agent.Agent {\n\treturn c.params.Agent\n}\n\nfunc (c *InvocationContext) Branch() string {\n\treturn c.params.Branch\n}\n\nfunc (c *InvocationContext) InvocationID() string {\n\treturn c.params.InvocationID\n}\n\nfunc (c *InvocationContext) Memory() agent.Memory {\n\treturn c.params.Memory\n}\n\nfunc (c *InvocationContext) Session() session.Session {\n\treturn c.params.Session\n}\n\nfunc (c *InvocationContext) UserContent() *genai.Content {\n\treturn c.params.UserContent\n}\n\nfunc (c *InvocationContext) RunConfig() *agent.RunConfig {\n\treturn c.params.RunConfig\n}\n\nfunc (c *InvocationContext) EndInvocation() {\n\tc.params.EndInvocation = true\n}\n\nfunc (c *InvocationContext) Ended() bool {\n\treturn c.params.EndInvocation\n}\n\nfunc (c *InvocationContext) WithContext(ctx context.Context) agent.InvocationContext {\n\tnewCtx := *c\n\tnewCtx.Context = ctx\n\treturn &newCtx\n}\n\nvar _ agent.InvocationContext = (*InvocationContext)(nil)\n"
  },
  {
    "path": "internal/context/readonly_context.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage context\n\nimport (\n\t\"context\"\n\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/agent\"\n\t\"google.golang.org/adk/session\"\n)\n\nfunc NewReadonlyContext(ctx agent.InvocationContext) agent.ReadonlyContext {\n\treturn &ReadonlyContext{\n\t\tContext:           ctx,\n\t\tInvocationContext: ctx,\n\t}\n}\n\ntype ReadonlyContext struct {\n\tcontext.Context\n\tInvocationContext agent.InvocationContext\n}\n\n// AppName implements agent.ReadonlyContext.\nfunc (c *ReadonlyContext) AppName() string {\n\treturn c.InvocationContext.Session().AppName()\n}\n\n// Branch implements agent.ReadonlyContext.\nfunc (c *ReadonlyContext) Branch() string {\n\treturn c.InvocationContext.Branch()\n}\n\n// SessionID implements agent.ReadonlyContext.\nfunc (c *ReadonlyContext) SessionID() string {\n\treturn c.InvocationContext.Session().ID()\n}\n\n// UserID implements agent.ReadonlyContext.\nfunc (c *ReadonlyContext) UserID() string {\n\treturn c.InvocationContext.Session().UserID()\n}\n\nfunc (c *ReadonlyContext) AgentName() string {\n\treturn c.InvocationContext.Agent().Name()\n}\n\nfunc (c *ReadonlyContext) ReadonlyState() session.ReadonlyState {\n\treturn c.InvocationContext.Session().State()\n}\n\nfunc (c *ReadonlyContext) InvocationID() string {\n\treturn c.InvocationContext.InvocationID()\n}\n\nfunc (c *ReadonlyContext) UserContent() *genai.Content {\n\treturn c.InvocationContext.UserContent()\n}\n"
  },
  {
    "path": "internal/converters/map_structure.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage converters\n\nimport (\n\t\"encoding/json\"\n)\n\n// ToMapStructure converts any to map[string]any.\n// We can't use mapstructure library in a way compatible with ADK-python, because genai type fields\n// don't have proper field tags.\n// TODO(yarolegovich): field annotation PR for genai types.\nfunc ToMapStructure(data any) (map[string]any, error) {\n\tbytes, err := json.Marshal(data)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tvar result map[string]any\n\tif err := json.Unmarshal(bytes, &result); err != nil {\n\t\treturn nil, err\n\t}\n\treturn result, nil\n}\n\n// FromMapStructure converts map[string]any to the type parameter T.\n// We can't use mapstructure library in a way compatible with ADK-python, because genai type fields\n// don't have proper field tags.\n// TODO(yarolegovich): field annotation PR for genai types.\nfunc FromMapStructure[T any](data map[string]any) (*T, error) {\n\tbytes, err := json.Marshal(data)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tvar zero T\n\tif err := json.Unmarshal(bytes, &zero); err != nil {\n\t\treturn nil, err\n\t}\n\treturn &zero, nil\n}\n"
  },
  {
    "path": "internal/httprr/LICENSE",
    "content": "Copyright (c) 2009 The Go Authors. All rights reserved.\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n   * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n   * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n   * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
  },
  {
    "path": "internal/httprr/rr.go",
    "content": "// Copyright 2024 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// Package httprr implements HTTP record and replay, mainly for use in tests.\n//\n// [Open] creates a new [RecordReplay]. Whether it is recording or replaying\n// is controlled by the -httprecord flag, which is defined by this package\n// only in test programs (built by “go test”).\n// See the [Open] documentation for more details.\npackage httprr\n\nimport (\n\t\"bufio\"\n\t\"bytes\"\n\t\"cmp\"\n\t\"context\"\n\t\"flag\"\n\t\"fmt\"\n\t\"io\"\n\t\"net/http\"\n\t\"os\"\n\t\"regexp\"\n\t\"strconv\"\n\t\"strings\"\n\t\"sync\"\n\t\"testing\"\n)\n\nvar record = new(string)\n\nfunc init() {\n\tif testing.Testing() {\n\t\trecord = flag.String(\"httprecord\", \"\", \"re-record traces for files matching `regexp`\")\n\t}\n}\n\n// A RecordReplay is an [http.RoundTripper] that can operate in two modes: record and replay.\n//\n// In record mode, the RecordReplay invokes another RoundTripper\n// and logs the (request, response) pairs to a file.\n//\n// In replay mode, the RecordReplay responds to requests by finding\n// an identical request in the log and sending the logged response.\ntype RecordReplay struct {\n\tfile string            // file being read or written\n\treal http.RoundTripper // real HTTP connection\n\n\tmu        sync.Mutex\n\treqScrub  []func(*http.Request) error // scrubbers for logging requests\n\trespScrub []func(*bytes.Buffer) error // scrubbers for logging responses\n\treplay    map[string]string           // if replaying, the log\n\trecord    *os.File                    // if recording, the file being written\n\twriteErr  error                       // if recording, any write error encountered\n}\n\n// ScrubReq adds new request scrubbing functions to rr.\n//\n// Before using a request as a lookup key or saving it in the record/replay log,\n// the RecordReplay calls each scrub function, in the order they were registered,\n// to canonicalize non-deterministic parts of the request and remove secrets.\n// Scrubbing only applies to a copy of the request used in the record/replay log;\n// the unmodified original request is sent to the actual server in recording mode.\n// A scrub function can assume that if req.Body is not nil, then it has type [*Body].\n//\n// Calling ScrubReq adds to the list of registered request scrubbing functions;\n// it does not replace those registered by earlier calls.\nfunc (rr *RecordReplay) ScrubReq(scrubs ...func(req *http.Request) error) {\n\trr.reqScrub = append(rr.reqScrub, scrubs...)\n}\n\n// ScrubResp adds new response scrubbing functions to rr.\n//\n// Before using a response as a lookup key or saving it in the record/replay log,\n// the RecordReplay calls each scrub function on a byte representation of the\n// response, in the order they were registered, to canonicalize non-deterministic\n// parts of the response and remove secrets.\n//\n// Calling ScrubResp adds to the list of registered response scrubbing functions;\n// it does not replace those registered by earlier calls.\n//\n// Clients should be careful when loading the bytes into [*http.Response] using\n// [http.ReadResponse]. This function can set [http.Response].Close to true even\n// when the original response had it false. See code in go/src/net/http.Response.Write\n// and go/src/net/http.Write for more info.\nfunc (rr *RecordReplay) ScrubResp(scrubs ...func(*bytes.Buffer) error) {\n\trr.respScrub = append(rr.respScrub, scrubs...)\n}\n\n// Recording reports whether the rr is in recording mode.\nfunc (rr *RecordReplay) Recording() bool {\n\treturn rr.record != nil\n}\n\n// Open opens a new record/replay log in the named file and\n// returns a [RecordReplay] backed by that file.\n//\n// By default Open expects the file to exist and contain a\n// previously-recorded log of (request, response) pairs,\n// which [RecordReplay.RoundTrip] consults to prepare its responses.\n//\n// If the command-line flag -httprecord is set to a non-empty\n// regular expression that matches file, then Open creates\n// the file as a new log. In that mode, [RecordReplay.RoundTrip]\n// makes actual HTTP requests using rt but then logs the requests and\n// responses to the file for replaying in a future run.\nfunc Open(file string, rt http.RoundTripper) (*RecordReplay, error) {\n\trecord, err := Recording(file)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif record {\n\t\treturn create(file, rt)\n\t}\n\treturn open(file, rt)\n}\n\n// Recording reports whether the \"-httprecord\" flag is set\n// for the given file.\n// It returns an error if the flag is set to an invalid value.\nfunc Recording(file string) (bool, error) {\n\tif *record != \"\" {\n\t\tre, err := regexp.Compile(*record)\n\t\tif err != nil {\n\t\t\treturn false, fmt.Errorf(\"invalid -httprecord flag: %v\", err)\n\t\t}\n\t\tif re.MatchString(file) {\n\t\t\treturn true, nil\n\t\t}\n\t}\n\treturn false, nil\n}\n\n// creates creates a new record-mode RecordReplay in the file.\nfunc create(file string, rt http.RoundTripper) (*RecordReplay, error) {\n\tf, err := os.Create(file)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Write header line.\n\t// Each round-trip will write a new request-response record.\n\tif _, err := fmt.Fprintf(f, \"httprr trace v1\\n\"); err != nil {\n\t\t// unreachable unless write error immediately after os.Create\n\t\tf.Close()\n\t\treturn nil, err\n\t}\n\trr := &RecordReplay{\n\t\tfile:   file,\n\t\treal:   rt,\n\t\trecord: f,\n\t}\n\treturn rr, nil\n}\n\n// open opens a replay-mode RecordReplay using the data in the file.\nfunc open(file string, rt http.RoundTripper) (*RecordReplay, error) {\n\t// Note: To handle larger traces without storing entirely in memory,\n\t// could instead read the file incrementally, storing a map[hash]offsets\n\t// and then reread the relevant part of the file during RoundTrip.\n\tbdata, err := os.ReadFile(file)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Trace begins with header line.\n\tdata := string(bdata)\n\tline, data, ok := strings.Cut(data, \"\\n\")\n\tif !ok || line != \"httprr trace v1\" {\n\t\treturn nil, fmt.Errorf(\"read %s: not an httprr trace\", file)\n\t}\n\n\treplay := make(map[string]string)\n\tfor data != \"\" {\n\t\t// Each record starts with a line of the form \"n1 n2\\n\"\n\t\t// followed by n1 bytes of request encoding and\n\t\t// n2 bytes of response encoding.\n\t\tline, data, ok = strings.Cut(data, \"\\n\")\n\t\tf1, f2, _ := strings.Cut(line, \" \")\n\t\tn1, err1 := strconv.Atoi(f1)\n\t\tn2, err2 := strconv.Atoi(f2)\n\t\tif !ok || err1 != nil || err2 != nil || n1 > len(data) || n2 > len(data[n1:]) {\n\t\t\treturn nil, fmt.Errorf(\"read %s: corrupt httprr trace\", file)\n\t\t}\n\t\tvar req, resp string\n\t\treq, resp, data = data[:n1], data[n1:n1+n2], data[n1+n2:]\n\t\treplay[req] = resp\n\t}\n\n\trr := &RecordReplay{\n\t\tfile:   file,\n\t\treal:   rt,\n\t\treplay: replay,\n\t}\n\treturn rr, nil\n}\n\n// Client returns an http.Client using rr as its transport.\n// It is a shorthand for:\n//\n//\treturn &http.Client{Transport: rr}\n//\n// For more complicated uses, use rr or the [RecordReplay.RoundTrip] method directly.\nfunc (rr *RecordReplay) Client() *http.Client {\n\treturn &http.Client{Transport: rr}\n}\n\n// A Body is an io.ReadCloser used as an HTTP request body.\n// In a Scrubber, if req.Body != nil, then req.Body is guaranteed\n// to have type *Body, making it easy to access the body to change it.\ntype Body struct {\n\tData       []byte\n\tReadOffset int\n}\n\n// Read reads from the body, implementing io.Reader.\nfunc (b *Body) Read(p []byte) (int, error) {\n\tn := copy(p, b.Data[b.ReadOffset:])\n\tif n == 0 {\n\t\treturn 0, io.EOF\n\t}\n\tb.ReadOffset += n\n\treturn n, nil\n}\n\n// Close is a no-op, implementing io.Closer.\nfunc (b *Body) Close() error {\n\treturn nil\n}\n\n// RoundTrip implements [http.RoundTripper].\n//\n// If rr has been opened in record mode, RoundTrip passes the requests on to\n// the RoundTripper specified in the call to [Open] and then logs the\n// (request, response) pair to the underlying file.\n//\n// If rr has been opened in replay mode, RoundTrip looks up the request in the log\n// and then responds with the previously logged response.\n// If the log does not contain req, RoundTrip returns an error.\nfunc (rr *RecordReplay) RoundTrip(req *http.Request) (*http.Response, error) {\n\treqWire, err := rr.reqWire(req)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// If we're in replay mode, replay a response.\n\tif rr.replay != nil {\n\t\treturn rr.replayRoundTrip(req, reqWire)\n\t}\n\n\t// Otherwise run a real round trip and save the request-response pair.\n\t// But if we've had a log write error already, don't bother.\n\tif err := rr.writeError(); err != nil {\n\t\treturn nil, err\n\t}\n\tresp, err := rr.real.RoundTrip(req)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Encode resp and decode to get a copy for our caller.\n\trespWire, err := rr.respWire(resp)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif err := rr.writeLog(reqWire, respWire); err != nil {\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n\n// reqWire returns the wire-format HTTP request key to be\n// used for request when saving to the log or looking up in a\n// previously written log. It consumes the original req.Body\n// but modifies req.Body to be an equivalent [*Body].\nfunc (rr *RecordReplay) reqWire(req *http.Request) (string, error) {\n\t// rkey is the scrubbed request used as a lookup key.\n\t// Clone req including req.Body.\n\trkey := req.Clone(context.Background())\n\tif req.Body != nil {\n\t\tbody, err := io.ReadAll(req.Body)\n\t\treq.Body.Close()\n\t\tif err != nil {\n\t\t\treturn \"\", err\n\t\t}\n\t\treq.Body = &Body{Data: body}\n\t\trkey.Body = &Body{Data: bytes.Clone(body)}\n\t}\n\n\t// Canonicalize and scrub request key.\n\tfor _, scrub := range rr.reqScrub {\n\t\tif err := scrub(rkey); err != nil {\n\t\t\treturn \"\", err\n\t\t}\n\t}\n\n\t// Now that scrubbers are done potentially modifying body, set length.\n\tif rkey.Body != nil {\n\t\trkey.ContentLength = int64(len(rkey.Body.(*Body).Data))\n\t}\n\n\t// Serialize rkey to produce the log entry.\n\t// Use WriteProxy instead of Write to preserve the URL's scheme.\n\tvar key strings.Builder\n\tif err := rkey.WriteProxy(&key); err != nil {\n\t\treturn \"\", err\n\t}\n\treturn key.String(), nil\n}\n\n// respWire returns the wire-format HTTP response log entry.\n// It modifies resp but leaves an equivalent response in its place.\nfunc (rr *RecordReplay) respWire(resp *http.Response) (string, error) {\n\tvar key bytes.Buffer\n\tif err := resp.Write(&key); err != nil {\n\t\treturn \"\", err\n\t}\n\tresp2, err := http.ReadResponse(bufio.NewReader(bytes.NewReader(key.Bytes())), resp.Request)\n\tif err != nil {\n\t\t// unreachable unless resp.Write does not round-trip with http.ReadResponse\n\t\treturn \"\", err\n\t}\n\t*resp = *resp2\n\n\tfor _, scrub := range rr.respScrub {\n\t\tif err := scrub(&key); err != nil {\n\t\t\treturn \"\", err\n\t\t}\n\t}\n\treturn key.String(), nil\n}\n\n// replayRoundTrip implements RoundTrip using the replay log.\nfunc (rr *RecordReplay) replayRoundTrip(req *http.Request, reqLog string) (*http.Response, error) {\n\trespLog, ok := rr.replay[reqLog]\n\tif !ok {\n\t\treturn nil, fmt.Errorf(\"cached HTTP response not found for:\\n%s\", reqLog)\n\t}\n\tresp, err := http.ReadResponse(bufio.NewReader(strings.NewReader(respLog)), req)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"read %s: corrupt httprr trace: %v\", rr.file, err)\n\t}\n\treturn resp, nil\n}\n\n// writeError reports any previous log write error.\nfunc (rr *RecordReplay) writeError() error {\n\trr.mu.Lock()\n\tdefer rr.mu.Unlock()\n\treturn rr.writeErr\n}\n\n// writeLog writes the request-response pair to the log.\n// If a write fails, writeLog arranges for rr.broken to return\n// an error and deletes the underlying log.\nfunc (rr *RecordReplay) writeLog(reqWire, respWire string) error {\n\trr.mu.Lock()\n\tdefer rr.mu.Unlock()\n\n\tif rr.writeErr != nil {\n\t\t// Unreachable unless concurrent I/O error.\n\t\t// Caller should have checked already.\n\t\treturn rr.writeErr\n\t}\n\n\t_, err1 := fmt.Fprintf(rr.record, \"%d %d\\n\", len(reqWire), len(respWire))\n\t_, err2 := rr.record.WriteString(reqWire)\n\t_, err3 := rr.record.WriteString(respWire)\n\tif err := cmp.Or(err1, err2, err3); err != nil {\n\t\trr.writeErr = err\n\t\trr.record.Close()\n\t\tos.Remove(rr.file)\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\n// Close closes the RecordReplay.\n// It is a no-op in replay mode.\nfunc (rr *RecordReplay) Close() error {\n\tif rr.writeErr != nil {\n\t\treturn rr.writeErr\n\t}\n\tif rr.record != nil {\n\t\treturn rr.record.Close()\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "internal/httprr/rr_test.go",
    "content": "// Copyright 2024 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage httprr\n\nimport (\n\t\"bytes\"\n\t\"errors\"\n\t\"io\"\n\t\"net/http\"\n\t\"net/http/httptest\"\n\t\"os\"\n\t\"strings\"\n\t\"testing\"\n\t\"testing/iotest\"\n)\n\nfunc handler(w http.ResponseWriter, r *http.Request) {\n\tif strings.HasSuffix(r.URL.Path, \"/redirect\") {\n\t\thttp.Error(w, \"redirect me!\", 304)\n\t\treturn\n\t}\n\tif r.Method == \"GET\" {\n\t\tif r.Header.Get(\"Secret\") != \"key\" {\n\t\t\thttp.Error(w, \"missing secret\", 666)\n\t\t\treturn\n\t\t}\n\t}\n\tif r.Method == \"POST\" {\n\t\tdata, err := io.ReadAll(r.Body)\n\t\tif err != nil {\n\t\t\tpanic(err)\n\t\t}\n\t\tif !strings.Contains(string(data), \"my Secret\") {\n\t\t\thttp.Error(w, \"missing body secret\", 667)\n\t\t\treturn\n\t\t}\n\t}\n}\n\nfunc always555(w http.ResponseWriter, r *http.Request) {\n\thttp.Error(w, \"should not be making HTTP requests\", 555)\n}\n\nfunc dropPort(r *http.Request) error {\n\tif r.URL.Port() != \"\" {\n\t\tr.URL.Host = r.URL.Host[:strings.LastIndex(r.URL.Host, \":\")]\n\t\tr.Host = r.Host[:strings.LastIndex(r.Host, \":\")]\n\t}\n\treturn nil\n}\n\nfunc dropSecretHeader(r *http.Request) error {\n\tr.Header.Del(\"Secret\")\n\treturn nil\n}\n\nfunc hideSecretBody(r *http.Request) error {\n\tif r.Body != nil {\n\t\tbody := r.Body.(*Body)\n\t\tbody.Data = []byte(\"redacted\")\n\t}\n\treturn nil\n}\n\nfunc doNothing(b *bytes.Buffer) error {\n\treturn nil\n}\n\nfunc doRefresh(b *bytes.Buffer) error {\n\ts := b.String()\n\tb.Reset()\n\t_, _ = b.WriteString(s)\n\treturn nil\n}\n\nfunc TestRecordReplay(t *testing.T) {\n\tdir := t.TempDir()\n\tfile := dir + \"/rr\"\n\n\t// 4 passes:\n\t//\t0: create\n\t//\t1: open\n\t//\t2: Open with -httprecord=\"r+\"\n\t//\t3: Open with -httprecord=\"\"\n\tfor pass := range 4 {\n\t\tstart := open\n\t\th := always555\n\t\t*record = \"\"\n\t\tswitch pass {\n\t\tcase 0:\n\t\t\tstart = create\n\t\t\th = handler\n\t\tcase 2:\n\t\t\tstart = Open\n\t\t\t*record = \"r+\"\n\t\t\th = handler\n\t\tcase 3:\n\t\t\tstart = Open\n\t\t}\n\t\trr, err := start(file, http.DefaultTransport)\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\tif rr.Recording() {\n\t\t\tt.Log(\"RECORDING\")\n\t\t} else {\n\t\t\tt.Log(\"REPLAYING\")\n\t\t}\n\t\trr.ScrubReq(dropPort, dropSecretHeader)\n\t\trr.ScrubReq(hideSecretBody)\n\t\trr.ScrubResp(doNothing, doRefresh)\n\n\t\tmustNewRequest := func(method, url string, body io.Reader) *http.Request {\n\t\t\treq, err := http.NewRequest(method, url, body)\n\t\t\tif err != nil {\n\t\t\t\tt.Helper()\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\t\t\treturn req\n\t\t}\n\n\t\tmustDo := func(req *http.Request, status int) {\n\t\t\tresp, err := rr.Client().Do(req)\n\t\t\tif err != nil {\n\t\t\t\tt.Helper()\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\t\t\tbody, _ := io.ReadAll(resp.Body)\n\t\t\tresp.Body.Close()\n\t\t\tif resp.StatusCode != status {\n\t\t\t\tt.Helper()\n\t\t\t\tt.Fatalf(\"%v: %s\\n%s\", req.URL, resp.Status, body)\n\t\t\t}\n\t\t}\n\n\t\tsrv := httptest.NewServer(http.HandlerFunc(h))\n\t\tdefer srv.Close()\n\n\t\treq := mustNewRequest(\"GET\", srv.URL+\"/myrequest\", nil)\n\t\treq.Header.Set(\"Secret\", \"key\")\n\t\tmustDo(req, 200)\n\n\t\treq = mustNewRequest(\"POST\", srv.URL+\"/myrequest\", strings.NewReader(\"my Secret\"))\n\t\tmustDo(req, 200)\n\n\t\treq = mustNewRequest(\"GET\", srv.URL+\"/redirect\", nil)\n\t\tmustDo(req, 304)\n\n\t\tif !rr.Recording() {\n\t\t\treq = mustNewRequest(\"GET\", srv.URL+\"/uncached\", nil)\n\t\t\tresp, err := rr.Client().Do(req)\n\t\t\tif err == nil {\n\t\t\t\tbody, _ := io.ReadAll(resp.Body)\n\t\t\t\tt.Fatalf(\"%v: %s\\n%s\", req.URL, resp.Status, body)\n\t\t\t}\n\t\t}\n\n\t\tif err := rr.Close(); err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t}\n\n\tdata, err := os.ReadFile(file)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tif strings.Contains(string(data), \"Secret\") {\n\t\tt.Fatalf(\"rr file contains Secret:\\n%s\", data)\n\t}\n}\n\nvar badResponseTrace = []byte(\"httprr trace v1\\n\" +\n\t\"92 75\\n\" +\n\t\"GET http://127.0.0.1/myrequest HTTP/1.1\\r\\n\" +\n\t\"Host: 127.0.0.1\\r\\n\" +\n\t\"User-Agent: Go-http-client/1.1\\r\\n\" +\n\t\"\\r\\n\" +\n\t\"HZZP/1.1 200 OK\\r\\n\" +\n\t\"Date: Wed, 12 Jun 2024 13:55:02 GMT\\r\\n\" +\n\t\"Content-Length: 0\\r\\n\" +\n\t\"\\r\\n\")\n\nfunc TestErrors(t *testing.T) {\n\tdir := t.TempDir()\n\n\tmakeTmpFile := func() string {\n\t\tf, err := os.CreateTemp(dir, \"TestErrors\")\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"failed to create tmp file for test: %v\", err)\n\t\t}\n\t\tname := f.Name()\n\t\tf.Close()\n\t\treturn name\n\t}\n\n\t// -httprecord regexp parsing\n\t*record = \"+\"\n\tif _, err := Open(makeTmpFile(), nil); err == nil || !strings.Contains(err.Error(), \"invalid -httprecord flag\") {\n\t\tt.Errorf(\"did not diagnose bad -httprecord: err = %v\", err)\n\t}\n\t*record = \"\"\n\n\t// invalid httprr trace\n\tif _, err := Open(makeTmpFile(), nil); err == nil || !strings.Contains(err.Error(), \"not an httprr trace\") {\n\t\tt.Errorf(\"did not diagnose invalid httprr trace: err = %v\", err)\n\t}\n\n\t// corrupt httprr trace\n\tcorruptTraceFile := makeTmpFile()\n\tos.WriteFile(corruptTraceFile, []byte(\"httprr trace v1\\ngarbage\\n\"), 0o666)\n\tif _, err := Open(corruptTraceFile, nil); err == nil || !strings.Contains(err.Error(), \"corrupt httprr trace\") {\n\t\tt.Errorf(\"did not diagnose invalid httprr trace: err = %v\", err)\n\t}\n\n\t// os.Create error creating trace\n\tif _, err := create(\"invalid\\x00file\", nil); err == nil {\n\t\tt.Errorf(\"did not report failure from os.Create: err = %v\", err)\n\t}\n\n\t// os.ReadAll error reading trace\n\tif _, err := open(\"nonexistent\", nil); err == nil {\n\t\tt.Errorf(\"did not report failure from os.ReadFile: err = %v\", err)\n\t}\n\n\t// error reading body\n\trr, err := create(makeTmpFile(), nil)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tif _, err := rr.Client().Post(\"http://127.0.0.1/nonexist\", \"x/error\", iotest.ErrReader(errors.New(\"MY ERROR\"))); err == nil || !strings.Contains(err.Error(), \"MY ERROR\") {\n\t\tt.Errorf(\"did not report failure from io.ReadAll(body): err = %v\", err)\n\t}\n\n\t// error during request scrub\n\trr.ScrubReq(func(*http.Request) error { return errors.New(\"SCRUB ERROR\") })\n\tif _, err := rr.Client().Get(\"http://127.0.0.1/nonexist\"); err == nil || !strings.Contains(err.Error(), \"SCRUB ERROR\") {\n\t\tt.Errorf(\"did not report failure from scrub: err = %v\", err)\n\t}\n\trr.Close()\n\n\t// error during response scrub\n\trr.ScrubResp(func(*bytes.Buffer) error { return errors.New(\"SCRUB ERROR\") })\n\tif _, err := rr.Client().Get(\"http://127.0.0.1/nonexist\"); err == nil || !strings.Contains(err.Error(), \"SCRUB ERROR\") {\n\t\tt.Errorf(\"did not report failure from scrub: err = %v\", err)\n\t}\n\trr.Close()\n\n\t// error during rkey.WriteProxy\n\trr, err = create(makeTmpFile(), nil)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\trr.ScrubReq(func(req *http.Request) error {\n\t\treq.URL = nil\n\t\treq.Host = \"\"\n\t\treturn nil\n\t})\n\trr.ScrubResp(func(b *bytes.Buffer) error {\n\t\tb.Reset()\n\t\treturn nil\n\t})\n\tif _, err := rr.Client().Get(\"http://127.0.0.1/nonexist\"); err == nil || !strings.Contains(err.Error(), \"no Host or URL set\") {\n\t\tt.Errorf(\"did not report failure from rkey.WriteProxy: err = %v\", err)\n\t}\n\trr.Close()\n\n\t// error during resp.Write\n\trr, err = create(makeTmpFile(), badRespTransport{})\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tif _, err := rr.Client().Get(\"http://127.0.0.1/nonexist\"); err == nil || !strings.Contains(err.Error(), \"TRANSPORT ERROR\") {\n\t\tt.Errorf(\"did not report failure from resp.Write: err = %v\", err)\n\t}\n\trr.Close()\n\n\t// error during Write logging request\n\tsrv := httptest.NewServer(http.HandlerFunc(always555))\n\tdefer srv.Close()\n\trr, err = create(makeTmpFile(), http.DefaultTransport)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\trr.ScrubReq(dropPort)\n\trr.record.Close() // cause write error\n\tif _, err := rr.Client().Get(srv.URL + \"/redirect\"); err == nil || !strings.Contains(err.Error(), \"file already closed\") {\n\t\tt.Errorf(\"did not report failure from record write: err = %v\", err)\n\t}\n\trr.writeErr = errors.New(\"BROKEN ERROR\")\n\tif _, err := rr.Client().Get(srv.URL + \"/redirect\"); err == nil || !strings.Contains(err.Error(), \"BROKEN ERROR\") {\n\t\tt.Errorf(\"did not report previous write failure: err = %v\", err)\n\t}\n\tif err := rr.Close(); err == nil || !strings.Contains(err.Error(), \"BROKEN ERROR\") {\n\t\tt.Errorf(\"did not report write failure during close: err = %v\", err)\n\t}\n\n\t// error during RoundTrip\n\trr, err = create(makeTmpFile(), errTransport{errors.New(\"TRANSPORT ERROR\")})\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tif _, err := rr.Client().Get(srv.URL); err == nil || !strings.Contains(err.Error(), \"TRANSPORT ERROR\") {\n\t\tt.Errorf(\"did not report failure from transport: err = %v\", err)\n\t}\n\trr.Close()\n\n\t// error during http.ReadResponse: trace is structurally okay but has malformed response inside\n\ttmpFile := makeTmpFile()\n\tif err := os.WriteFile(tmpFile, badResponseTrace, 0o666); err != nil {\n\t\tt.Fatal(err)\n\t}\n\trr, err = Open(tmpFile, nil)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tif _, err := rr.Client().Get(\"http://127.0.0.1/myrequest\"); err == nil || !strings.Contains(err.Error(), \"corrupt httprr trace:\") {\n\t\tt.Errorf(\"did not diagnose invalid httprr trace: err = %v\", err)\n\t}\n\trr.Close()\n}\n\ntype errTransport struct{ err error }\n\nfunc (e errTransport) RoundTrip(req *http.Request) (*http.Response, error) {\n\treturn nil, e.err\n}\n\ntype badRespTransport struct{}\n\nfunc (badRespTransport) RoundTrip(req *http.Request) (*http.Response, error) {\n\tresp := new(http.Response)\n\tresp.Body = io.NopCloser(iotest.ErrReader(errors.New(\"TRANSPORT ERROR\")))\n\treturn resp, nil\n}\n"
  },
  {
    "path": "internal/llminternal/agent.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage llminternal\n\nimport (\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/agent\"\n\t\"google.golang.org/adk/model\"\n\t\"google.golang.org/adk/tool\"\n)\n\n// holds LLMAgent internal state\ntype Agent interface {\n\tinternal() *State\n}\n\ntype State struct {\n\tModel model.LLM\n\n\tTools    []tool.Tool\n\tToolsets []tool.Toolset\n\n\tIncludeContents string\n\n\tGenerateContentConfig *genai.GenerateContentConfig\n\n\tInstruction               string\n\tInstructionProvider       InstructionProvider\n\tGlobalInstruction         string\n\tGlobalInstructionProvider InstructionProvider\n\n\tDisallowTransferToParent bool\n\tDisallowTransferToPeers  bool\n\n\tInputSchema  *genai.Schema\n\tOutputSchema *genai.Schema\n\n\tOutputKey string\n}\n\ntype InstructionProvider func(ctx agent.ReadonlyContext) (string, error)\n\nfunc (s *State) internal() *State { return s }\n\nfunc Reveal(a Agent) *State { return a.internal() }\n"
  },
  {
    "path": "internal/llminternal/agent_transfer.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage llminternal\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"iter\"\n\t\"slices\"\n\t\"strings\"\n\n\t\"github.com/google/safehtml/template\"\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/agent\"\n\t\"google.golang.org/adk/internal/agent/parentmap\"\n\t\"google.golang.org/adk/internal/toolinternal\"\n\t\"google.golang.org/adk/internal/utils\"\n\t\"google.golang.org/adk/model\"\n\t\"google.golang.org/adk/session\"\n\t\"google.golang.org/adk/tool\"\n)\n\n// From src/google/adk/flows/llm_flows/auto_flow.py\n//\n// * SingleFlow\n//\n// SingleFlow is the LLM flow that handles tool calls.\n//\n//  A single flow only considers the agent itself and its tools.\n//  No sub-agents are allowed for a single flow, i.e.,\n//      DisallowTransferToParent == true &&\n//      DisallowTransferToPeers == true &&\n//      len(SubAgents) == 0\n//\n// * AutoFlow\n//\n// Agent transfers are allowed in the following directions:\n//\n//  1. From parent to sub-agent.\n//  2. From sub-agent to parent.\n//  3. From sub-agent to its peer agent.\n//\n// Peer-agent transfers are only enabled when all the following conditions are met:\n//\n//  - The parent agent is also an LLMAgent.\n//  - This agent has DisallowTransferToPeers set to false (default).\n//\n// Depending on the target agent type, the transfer may be automatically\n// reversed. See python's Runner._find_agent_to_run method for which\n// agent will remain active to handle the next user message.\n// (src/google/adk/runners.py)\n//\n// TODO: implement it in the runners package and update this doc.\n\nfunc AgentTransferRequestProcessor(ctx agent.InvocationContext, req *model.LLMRequest, f *Flow) iter.Seq2[*session.Event, error] {\n\treturn func(yield func(*session.Event, error) bool) {\n\t\t// TODO: support agent types other than LLMAgent, that have parent/subagents?\n\t\tagent := ctx.Agent()\n\t\tif !shouldUseAutoFlow(agent) {\n\t\t\treturn\n\t\t}\n\n\t\tparents := parentmap.FromContext(ctx)\n\n\t\ttargets := transferTargets(agent, parents[agent.Name()])\n\t\tif len(targets) == 0 {\n\t\t\treturn\n\t\t}\n\n\t\t// TODO(hyangah): why do we set this up in request processor\n\t\t// instead of registering this as a normal function tool of the Agent?\n\t\ttransferToAgentTool := &TransferToAgentTool{}\n\t\tsi, err := instructionsForTransferToAgent(agent, parents[agent.Name()], targets, transferToAgentTool)\n\t\tif err != nil {\n\t\t\tyield(nil, err)\n\t\t\treturn\n\t\t}\n\t\tutils.AppendInstructions(req, si)\n\t\terr = appendTools(req, transferToAgentTool)\n\t\tif err != nil {\n\t\t\tyield(nil, err)\n\t\t}\n\t}\n}\n\ntype TransferToAgentTool struct{}\n\n// Description implements tool.Tool.\nfunc (t *TransferToAgentTool) Description() string {\n\treturn `Transfer the question to another agent.\nThis tool hands off control to another agent when it's more suitable to answer the user's question according to the agent's description.`\n}\n\n// Name implements tool.Tool.\nfunc (t *TransferToAgentTool) Name() string {\n\treturn \"transfer_to_agent\"\n}\n\n// IsLongRunning implements tool.Tool.\nfunc (t *TransferToAgentTool) IsLongRunning() bool {\n\treturn false\n}\n\nfunc (t *TransferToAgentTool) Declaration() *genai.FunctionDeclaration {\n\treturn &genai.FunctionDeclaration{\n\t\tName:        t.Name(),\n\t\tDescription: t.Description(),\n\t\tParameters: &genai.Schema{\n\t\t\tType: \"object\",\n\t\t\tProperties: map[string]*genai.Schema{\n\t\t\t\t\"agent_name\": {\n\t\t\t\t\tType:        \"string\",\n\t\t\t\t\tDescription: \"the agent name to transfer to\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tRequired: []string{\"agent_name\"},\n\t\t},\n\t}\n}\n\n// ProcessRequest implements types.Tool.\nfunc (t *TransferToAgentTool) ProcessRequest(ctx tool.Context, req *model.LLMRequest) error {\n\treturn appendTools(req, t)\n}\n\n// Run implements types.Tool.\nfunc (t *TransferToAgentTool) Run(ctx tool.Context, args any) (map[string]any, error) {\n\tif args == nil {\n\t\treturn nil, fmt.Errorf(\"missing argument\")\n\t}\n\tm, ok := args.(map[string]any)\n\tif !ok {\n\t\treturn nil, fmt.Errorf(\"unexpected args type: %T\", args)\n\t}\n\tagent, ok := m[\"agent_name\"].(string)\n\tif !ok || agent == \"\" {\n\t\treturn nil, fmt.Errorf(\"empty agent_name: %v\", args)\n\t}\n\tctx.Actions().TransferToAgent = agent\n\treturn map[string]any{}, nil\n}\n\nvar _ tool.Tool = (*TransferToAgentTool)(nil)\n\nfunc transferTargets(agent, parent agent.Agent) []agent.Agent {\n\ttargets := slices.Clone(agent.SubAgents())\n\n\tllmAgent := asLLMAgent(agent)\n\tllmParent := asLLMAgent(parent)\n\n\tif llmParent == nil {\n\t\treturn targets\n\t}\n\n\tif !llmAgent.internal().DisallowTransferToParent {\n\t\ttargets = append(targets, parent)\n\t}\n\t// For peer-agent transfers, it's only enabled when all below conditions are met:\n\t// - the parent agent is also of AutoFlow.\n\t// - DisallowTransferToPeers is false.\n\tif !llmAgent.internal().DisallowTransferToPeers {\n\t\tif shouldUseAutoFlow(parent) {\n\t\t\tfor _, peer := range parent.SubAgents() {\n\t\t\t\tif peer.Name() != agent.Name() {\n\t\t\t\t\ttargets = append(targets, peer)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn targets\n}\n\nfunc asLLMAgent(agent agent.Agent) Agent {\n\tif agent == nil {\n\t\treturn nil\n\t}\n\tif llmAgent, ok := agent.(Agent); ok {\n\t\treturn llmAgent\n\t}\n\treturn nil\n}\n\nfunc shouldUseAutoFlow(agent agent.Agent) bool {\n\ta := asLLMAgent(agent)\n\tif a == nil {\n\t\treturn false\n\t}\n\treturn len(agent.SubAgents()) != 0 || !a.internal().DisallowTransferToParent || !a.internal().DisallowTransferToPeers\n}\n\n// AppendTools appends the tools to the request.\n// Appending duplicate tools or nameless tools is an error.\nfunc appendTools(r *model.LLMRequest, tools ...tool.Tool) error {\n\tif r.Tools == nil {\n\t\tr.Tools = make(map[string]any)\n\t}\n\n\tvar declarations []*genai.FunctionDeclaration\n\n\tfor i, tool := range tools {\n\t\tif tool == nil || tool.Name() == \"\" {\n\t\t\treturn fmt.Errorf(\"tools[%d] tool without name: %v\", i, tool)\n\t\t}\n\t\tname := tool.Name()\n\t\tif _, ok := r.Tools[name]; ok {\n\t\t\treturn fmt.Errorf(\"tools[%d] duplicate tool: %q\", i, name)\n\t\t}\n\t\tr.Tools[name] = tool\n\n\t\tif fnTool, ok := tool.(toolinternal.FunctionTool); ok {\n\t\t\tif decl := fnTool.Declaration(); decl != nil {\n\t\t\t\t// TODO: verify for duplicates.\n\t\t\t\tdeclarations = append(declarations, decl)\n\t\t\t}\n\t\t}\n\t}\n\tif len(declarations) == 0 {\n\t\treturn nil\n\t}\n\tif r.Config == nil {\n\t\tr.Config = &genai.GenerateContentConfig{}\n\t}\n\t// Find an existing genai.Tool with FunctionDeclarations\n\tvar funcTool *genai.Tool\n\tfor _, gt := range r.Config.Tools {\n\t\tif gt.FunctionDeclarations != nil {\n\t\t\tfuncTool = gt\n\t\t\tbreak\n\t\t}\n\t}\n\tif funcTool != nil {\n\t\tfuncTool.FunctionDeclarations = append(funcTool.FunctionDeclarations, declarations...)\n\t} else {\n\t\tr.Config.Tools = append(r.Config.Tools, &genai.Tool{\n\t\t\tFunctionDeclarations: declarations,\n\t\t})\n\t}\n\treturn nil\n}\n\nvar transferToAgentPromptTmpl = template.Must(\n\ttemplate.New(\"transfer_to_agent_prompt\").Parse(agentTransferInstructionTemplate))\n\nfunc instructionsForTransferToAgent(curAgent, parent agent.Agent, targets []agent.Agent, transferTool tool.Tool) (string, error) {\n\tif asLLMAgent(curAgent).internal().DisallowTransferToParent {\n\t\tparent = nil\n\t}\n\n\tvar buf bytes.Buffer\n\tif err := transferToAgentPromptTmpl.Execute(&buf, struct {\n\t\tAgentName        string\n\t\tParent           agent.Agent\n\t\tTargets          []agent.Agent\n\t\tToolName         string\n\t\tFormattedTargets string\n\t}{\n\t\tAgentName:        curAgent.Name(),\n\t\tParent:           parent,\n\t\tTargets:          targets,\n\t\tToolName:         transferTool.Name(),\n\t\tFormattedTargets: formatTargets(targets),\n\t}); err != nil {\n\t\treturn \"\", err\n\t}\n\treturn buf.String(), nil\n}\n\nfunc formatTargets(targets []agent.Agent) string {\n\tavailableAgentNames := make([]string, len(targets))\n\tfor i, t := range targets {\n\t\tavailableAgentNames[i] = t.Name()\n\t}\n\tslices.Sort(availableAgentNames)\n\tformattedAgentNames := make([]string, len(availableAgentNames))\n\tfor i, name := range availableAgentNames {\n\t\tformattedAgentNames[i] = fmt.Sprintf(\"`%s`\", name)\n\t}\n\treturn strings.Join(formattedAgentNames, \", \")\n}\n\n// Prompt source:\n//  flows/llm_flows/agent_transfer.py _build_target_agents_instructions.\n\nconst agentTransferInstructionTemplate = `\nYou have a list of other agents to transfer to:\n\n{{range .Targets}}\nAgent name: {{.Name}}\nAgent description: {{.Description}}\n\n{{end}}\nIf you are the best to answer the question according to your description,\nyou can answer it.\n\nIf another agent is better for answering the question according to its\ndescription, call ` + \"`\" + `{{.ToolName}}` + \"`\" + ` function to transfer the question to that\nagent. When transferring, do not generate any text other than the function\ncall.\n\n**NOTE**: the only available agents for ` + \"`\" + `{{.ToolName}}` + \"`\" + ` function are\n{{.FormattedTargets}}.\n{{if .Parent}}\nIf neither you nor the other agents are best for the question, transfer to your parent agent {{.Parent.Name}}.\n{{end}}`\n"
  },
  {
    "path": "internal/llminternal/agent_transfer_test.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage llminternal_test\n\nimport (\n\t\"encoding/json\"\n\t\"slices\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/google/go-cmp/cmp\"\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/agent\"\n\t\"google.golang.org/adk/agent/llmagent\"\n\t\"google.golang.org/adk/agent/workflowagents/parallelagent\"\n\t\"google.golang.org/adk/agent/workflowagents/sequentialagent\"\n\t\"google.golang.org/adk/internal/agent/parentmap\"\n\ticontext \"google.golang.org/adk/internal/context\"\n\t\"google.golang.org/adk/internal/llminternal\"\n\t\"google.golang.org/adk/internal/toolinternal\"\n\t\"google.golang.org/adk/internal/utils\"\n\t\"google.golang.org/adk/model\"\n\t\"google.golang.org/adk/session\"\n\t\"google.golang.org/adk/tool\"\n\t\"google.golang.org/adk/tool/functiontool\"\n)\n\nfunc TestAgentTransferRequestProcessor(t *testing.T) {\n\tcurTool := &llminternal.TransferToAgentTool{}\n\tllm := &struct{ model.LLM }{}\n\n\tif curTool.Name() == \"\" || curTool.Description() == \"\" || curTool.Declaration() == nil {\n\t\tt.Fatalf(\"unexpected TransferToAgentTool: name=%q, desc=%q, decl=%v\", curTool.Name(), curTool.Description(), curTool)\n\t}\n\n\tcheck := func(t *testing.T, curAgent, root agent.Agent, wantParent string, wantAgents, unwantAgents []string) {\n\t\treq := &model.LLMRequest{}\n\n\t\tparents, err := parentmap.New(root)\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\n\t\tctx := icontext.NewInvocationContext(parentmap.ToContext(t.Context(), parents), icontext.InvocationContextParams{\n\t\t\tAgent: curAgent,\n\t\t})\n\n\t\tfor ev, err := range llminternal.AgentTransferRequestProcessor(ctx, req, &llminternal.Flow{}) {\n\t\t\tif ev != nil {\n\t\t\t\tt.Fatal(\"AgentTransferRequestProcessor generated an unexpected event\")\n\t\t\t}\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"AgentTransferRequestProcessor failed: %v\", err)\n\t\t\t}\n\t\t}\n\n\t\t// We don't expect transfer. Check AgentTransferRequestProcessor was no-op.\n\t\tif wantParent == \"\" && len(wantAgents) == 0 {\n\t\t\tif diff := cmp.Diff(&model.LLMRequest{}, req); diff != \"\" {\n\t\t\t\tt.Errorf(\"req was changed unexpectedly (-want, +got): %v\", diff)\n\t\t\t}\n\t\t\treturn\n\t\t}\n\t\t// We expect transfer. From here, it's true that either wantParent != \"\" or len(wantSubagents) > 0.\n\n\t\t// check tools dictionary.\n\t\twantToolName := curTool.Name()\n\t\tgotRawTool, ok := req.Tools[wantToolName]\n\t\tif !ok {\n\t\t\tt.Errorf(\"req.Tools does not include %v: req.Tools = %v\", wantToolName, req.Tools)\n\t\t}\n\t\tgotTool, ok := gotRawTool.(tool.Tool)\n\t\tif !ok {\n\t\t\tt.Errorf(\"failed to type convert tool %v, got %T\", wantToolName, gotRawTool)\n\t\t}\n\n\t\tif gotTool.Name() != wantToolName {\n\t\t\tt.Errorf(\"unexpected name for tool, got: %v, want: %v\", gotTool.Name(), wantToolName)\n\t\t}\n\n\t\t// check instructions.\n\t\tinstructions := utils.TextParts(req.Config.SystemInstruction)\n\t\tif !slices.ContainsFunc(instructions, func(s string) bool {\n\t\t\treturn strings.Contains(s, wantToolName) && strings.Contains(s, \"You have a list of other agents to transfer to\")\n\t\t}) {\n\t\t\tt.Errorf(\"instruction does not include agent transfer instruction, got: %s\", strings.Join(instructions, \"\\n\"))\n\t\t}\n\t\tif wantParent != \"\" && !slices.ContainsFunc(instructions, func(s string) bool {\n\t\t\treturn strings.Contains(s, wantParent)\n\t\t}) {\n\t\t\tt.Errorf(\"instruction does not include parent agent, got: %s\", strings.Join(instructions, \"\\n\"))\n\t\t}\n\t\tif slices.Contains(instructions, curAgent.Name()) {\n\t\t\tt.Errorf(\"instruction should not suggest transfer to current agent, got: %s\", strings.Join(instructions, \"\\n\"))\n\t\t}\n\t\tif len(wantAgents) > 0 && !slices.ContainsFunc(instructions, func(s string) bool {\n\t\t\treturn slices.ContainsFunc(wantAgents, func(sub string) bool {\n\t\t\t\tfor _, subagent := range wantAgents {\n\t\t\t\t\tif !strings.Contains(s, subagent) {\n\t\t\t\t\t\treturn false\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn true\n\t\t\t})\n\t\t}) {\n\t\t\tt.Errorf(\"instruction does not include subagents, got: %s\", strings.Join(instructions, \"\\n\"))\n\t\t}\n\t\tif len(unwantAgents) > 0 && slices.ContainsFunc(instructions, func(s string) bool {\n\t\t\treturn slices.ContainsFunc(unwantAgents, func(unwanted string) bool {\n\t\t\t\tfor _, unwanted := range unwantAgents {\n\t\t\t\t\tif strings.Contains(s, unwanted) {\n\t\t\t\t\t\treturn true\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn false\n\t\t\t})\n\t\t}) {\n\t\t\tt.Errorf(\"instruction includes unwanted agents, got: %s\", strings.Join(instructions, \"\\n\"))\n\t\t}\n\n\t\t// check function declarations.\n\t\twantToolDescription := curTool.Description()\n\t\tfunctions := utils.FunctionDecls(req.Config)\n\t\tif !slices.ContainsFunc(functions, func(f *genai.FunctionDeclaration) bool {\n\t\t\treturn f.Name == wantToolName && strings.Contains(f.Description, wantToolDescription) && f.ParametersJsonSchema == nil\n\t\t}) {\n\t\t\tt.Errorf(\"AgentTransferRequestProcessor() did not append the function declaration, got: %v\", stringify(functions))\n\t\t}\n\t}\n\n\tt.Run(\"SoloAgent\", func(t *testing.T) {\n\t\tagent := utils.Must(llmagent.New(llmagent.Config{\n\t\t\tName:  \"Current\",\n\t\t\tModel: llm,\n\t\t}))\n\t\tcheck(t, agent, agent, \"\", nil, []string{\"Current\"})\n\t})\n\tt.Run(\"NotLLMAgent\", func(t *testing.T) {\n\t\ta := utils.Must(agent.New(agent.Config{\n\t\t\tName: \"mockAgent\",\n\t\t}))\n\t\tcheck(t, a, a, \"\", nil, nil)\n\t})\n\tt.Run(\"LLMAgentParent\", func(t *testing.T) {\n\t\ttestAgent := utils.Must(llmagent.New(llmagent.Config{\n\t\t\tName:  \"Current\",\n\t\t\tModel: llm,\n\t\t}))\n\t\troot := utils.Must(llmagent.New(llmagent.Config{\n\t\t\tName:      \"Parent\",\n\t\t\tModel:     llm,\n\t\t\tSubAgents: []agent.Agent{testAgent},\n\t\t}))\n\t\tcheck(t, testAgent, root, \"Parent\", nil, []string{\"Current\"})\n\t})\n\tt.Run(\"LLMAgentParentAndPeer\", func(t *testing.T) {\n\t\tcurAgent := utils.Must(llmagent.New(llmagent.Config{\n\t\t\tName:  \"Current\",\n\t\t\tModel: llm,\n\t\t}))\n\t\tpeer := utils.Must(llmagent.New(llmagent.Config{\n\t\t\tName:  \"Peer\",\n\t\t\tModel: llm,\n\t\t}))\n\t\troot := utils.Must(llmagent.New(llmagent.Config{\n\t\t\tName:      \"Parent\",\n\t\t\tModel:     llm,\n\t\t\tSubAgents: []agent.Agent{curAgent, peer},\n\t\t}))\n\t\tcheck(t, curAgent, root, \"Parent\", []string{\"Peer\"}, []string{\"Current\"})\n\t})\n\tt.Run(\"LLMAgentSubagents\", func(t *testing.T) {\n\t\tagent := utils.Must(llmagent.New(llmagent.Config{\n\t\t\tName:  \"Current\",\n\t\t\tModel: llm,\n\t\t\tSubAgents: []agent.Agent{\n\t\t\t\tutils.Must(agent.New(agent.Config{\n\t\t\t\t\tName: \"Sub1\",\n\t\t\t\t})),\n\t\t\t\tutils.Must(llmagent.New(llmagent.Config{\n\t\t\t\t\tName:  \"Sub2\",\n\t\t\t\t\tModel: llm,\n\t\t\t\t})),\n\t\t\t},\n\t\t}))\n\t\tcheck(t, agent, agent, \"\", []string{\"Sub1\", \"Sub2\"}, []string{\"Current\"})\n\t})\n\n\tt.Run(\"AgentWithParentAndPeersAndSubagents\", func(t *testing.T) {\n\t\tcurAgent := utils.Must(llmagent.New(llmagent.Config{\n\t\t\tName:  \"Current\",\n\t\t\tModel: llm,\n\t\t\tSubAgents: []agent.Agent{\n\t\t\t\tutils.Must(agent.New(agent.Config{\n\t\t\t\t\tName: \"Sub1\",\n\t\t\t\t})),\n\t\t\t\tutils.Must(llmagent.New(llmagent.Config{\n\t\t\t\t\tName:  \"Sub2\",\n\t\t\t\t\tModel: llm,\n\t\t\t\t})),\n\t\t\t},\n\t\t}))\n\t\tpeer := utils.Must(agent.New(agent.Config{\n\t\t\tName: \"Peer\",\n\t\t}))\n\t\troot := utils.Must(llmagent.New(llmagent.Config{\n\t\t\tName:      \"Parent\",\n\t\t\tModel:     llm,\n\t\t\tSubAgents: []agent.Agent{curAgent, peer},\n\t\t}))\n\t\tcheck(t, curAgent, root, \"Parent\", []string{\"Peer\", \"Sub1\", \"Sub2\"}, []string{\"Current\"})\n\t})\n\n\tt.Run(\"NonLLMAgentSubagents\", func(t *testing.T) {\n\t\tagent := utils.Must(llmagent.New(llmagent.Config{\n\t\t\tName:  \"Current\",\n\t\t\tModel: llm,\n\t\t\tSubAgents: []agent.Agent{\n\t\t\t\tutils.Must(agent.New(agent.Config{\n\t\t\t\t\tName: \"Sub1\",\n\t\t\t\t})),\n\t\t\t\tutils.Must(agent.New(agent.Config{\n\t\t\t\t\tName: \"Sub2\",\n\t\t\t\t})),\n\t\t\t},\n\t\t}))\n\t\tcheck(t, agent, agent, \"\", []string{\"Sub1\", \"Sub2\"}, []string{\"Current\"})\n\t})\n\n\tt.Run(\"AgentWithDisallowTransferToParent\", func(t *testing.T) {\n\t\tcurAgent := utils.Must(llmagent.New(llmagent.Config{\n\t\t\tName:                     \"Current\",\n\t\t\tModel:                    llm,\n\t\t\tDisallowTransferToParent: true,\n\t\t\tSubAgents: []agent.Agent{\n\t\t\t\tutils.Must(llmagent.New(llmagent.Config{\n\t\t\t\t\tName:  \"Sub1\",\n\t\t\t\t\tModel: llm,\n\t\t\t\t})),\n\t\t\t\tutils.Must(llmagent.New(llmagent.Config{\n\t\t\t\t\tName:  \"Sub2\",\n\t\t\t\t\tModel: llm,\n\t\t\t\t})),\n\t\t\t},\n\t\t}))\n\t\troot := utils.Must(llmagent.New(llmagent.Config{\n\t\t\tName:  \"Parent\",\n\t\t\tModel: llm,\n\t\t\tSubAgents: []agent.Agent{\n\t\t\t\tcurAgent,\n\t\t\t},\n\t\t}))\n\n\t\tcheck(t, curAgent, root, \"\", []string{\"Sub1\", \"Sub2\"}, []string{\"Parent\", \"Current\"})\n\t})\n\n\tt.Run(\"AgentWithDisallowTransferToPeers\", func(t *testing.T) {\n\t\tcurAgent := utils.Must(llmagent.New(llmagent.Config{\n\t\t\tName:                    \"Current\",\n\t\t\tModel:                   llm,\n\t\t\tDisallowTransferToPeers: true,\n\t\t\tSubAgents: []agent.Agent{\n\t\t\t\tutils.Must(agent.New(agent.Config{\n\t\t\t\t\tName: \"Sub1\",\n\t\t\t\t})), utils.Must(llmagent.New(llmagent.Config{\n\t\t\t\t\tName:  \"Sub2\",\n\t\t\t\t\tModel: llm,\n\t\t\t\t})),\n\t\t\t},\n\t\t}))\n\t\tpeer := utils.Must(llmagent.New(llmagent.Config{\n\t\t\tName:  \"Peer\",\n\t\t\tModel: llm,\n\t\t}))\n\t\troot := utils.Must(llmagent.New(llmagent.Config{\n\t\t\tName:  \"Parent\",\n\t\t\tModel: llm,\n\t\t\tSubAgents: []agent.Agent{\n\t\t\t\tcurAgent, peer,\n\t\t\t},\n\t\t}))\n\t\tcheck(t, curAgent, root, \"Parent\", []string{\"Sub1\", \"Sub2\"}, []string{\"Peer\", \"Current\"})\n\t})\n\n\tt.Run(\"AgentWithDisallowTransferToParentAndPeers\", func(t *testing.T) {\n\t\tcurAgent := utils.Must(llmagent.New(llmagent.Config{\n\t\t\tName:                     \"Current\",\n\t\t\tModel:                    llm,\n\t\t\tDisallowTransferToParent: true,\n\t\t\tDisallowTransferToPeers:  true,\n\t\t\tSubAgents: []agent.Agent{\n\t\t\t\tutils.Must(agent.New(agent.Config{\n\t\t\t\t\tName: \"Sub1\",\n\t\t\t\t})),\n\t\t\t\tutils.Must(llmagent.New(llmagent.Config{\n\t\t\t\t\tName:  \"Sub2\",\n\t\t\t\t\tModel: llm,\n\t\t\t\t})),\n\t\t\t},\n\t\t}))\n\t\tpeer := utils.Must(llmagent.New(llmagent.Config{\n\t\t\tName:  \"Peer\",\n\t\t\tModel: llm,\n\t\t}))\n\t\troot := utils.Must(llmagent.New(llmagent.Config{\n\t\t\tName:      \"Parent\",\n\t\t\tModel:     llm,\n\t\t\tSubAgents: []agent.Agent{peer, curAgent},\n\t\t}))\n\n\t\tcheck(t, curAgent, root, \"\", []string{\"Sub1\", \"Sub2\"}, []string{\"Parent\", \"Peer\", \"Current\"})\n\t})\n\n\tt.Run(\"AgentWithDisallowTransfer\", func(t *testing.T) {\n\t\tcurAgent := utils.Must(llmagent.New(llmagent.Config{\n\t\t\tName:                     \"Current\",\n\t\t\tModel:                    llm,\n\t\t\tDisallowTransferToParent: true,\n\t\t\tDisallowTransferToPeers:  true,\n\t\t}))\n\t\tpeer := utils.Must(llmagent.New(llmagent.Config{\n\t\t\tName:  \"Peer\",\n\t\t\tModel: llm,\n\t\t}))\n\t\troot := utils.Must(llmagent.New(llmagent.Config{\n\t\t\tName:      \"Parent\",\n\t\t\tModel:     llm,\n\t\t\tSubAgents: []agent.Agent{curAgent, peer},\n\t\t}))\n\n\t\tcheck(t, curAgent, root, \"\", nil, []string{\"Parent\", \"Peer\", \"Current\"})\n\t})\n\n\tt.Run(\"AgentWithParallelParent\", func(t *testing.T) {\n\t\tcurAgent := utils.Must(llmagent.New(llmagent.Config{\n\t\t\tName:                     \"Current\",\n\t\t\tModel:                    llm,\n\t\t\tDisallowTransferToParent: false,\n\t\t\tDisallowTransferToPeers:  false,\n\t\t}))\n\t\tpeer := utils.Must(llmagent.New(llmagent.Config{\n\t\t\tName:  \"Peer\",\n\t\t\tModel: llm,\n\t\t}))\n\t\troot := utils.Must(parallelagent.New(parallelagent.Config{\n\t\t\tAgentConfig: agent.Config{\n\t\t\t\tName:      \"Parent\",\n\t\t\t\tSubAgents: []agent.Agent{curAgent, peer},\n\t\t\t},\n\t\t}))\n\n\t\tcheck(t, curAgent, root, \"\", nil, []string{\"Parent\", \"Peer\", \"Current\"})\n\t})\n\n\tt.Run(\"AgentWithSequentialParent\", func(t *testing.T) {\n\t\tcurAgent := utils.Must(llmagent.New(llmagent.Config{\n\t\t\tName:                     \"Current\",\n\t\t\tModel:                    llm,\n\t\t\tDisallowTransferToParent: false,\n\t\t\tDisallowTransferToPeers:  false,\n\t\t}))\n\t\tpeer := utils.Must(llmagent.New(llmagent.Config{\n\t\t\tName:  \"Peer\",\n\t\t\tModel: llm,\n\t\t}))\n\t\troot := utils.Must(sequentialagent.New(sequentialagent.Config{\n\t\t\tAgentConfig: agent.Config{\n\t\t\t\tName:      \"Parent\",\n\t\t\t\tSubAgents: []agent.Agent{curAgent, peer},\n\t\t\t},\n\t\t}))\n\n\t\tcheck(t, curAgent, root, \"\", nil, []string{\"Parent\", \"Peer\", \"Current\"})\n\t})\n\n\tt.Run(\"AgentWithSequentialSubagent\", func(t *testing.T) {\n\t\tseqSub := utils.Must(llmagent.New(llmagent.Config{\n\t\t\tName:  \"Sub3\",\n\t\t\tModel: llm,\n\t\t}))\n\t\tagent := utils.Must(llmagent.New(llmagent.Config{\n\t\t\tName:  \"Current\",\n\t\t\tModel: llm,\n\t\t\tSubAgents: []agent.Agent{\n\t\t\t\tutils.Must(sequentialagent.New(sequentialagent.Config{\n\t\t\t\t\tAgentConfig: agent.Config{\n\t\t\t\t\t\tName:      \"Sub1\",\n\t\t\t\t\t\tSubAgents: []agent.Agent{seqSub},\n\t\t\t\t\t},\n\t\t\t\t})),\n\t\t\t\tutils.Must(llmagent.New(llmagent.Config{\n\t\t\t\t\tName:  \"Sub2\",\n\t\t\t\t\tModel: llm,\n\t\t\t\t})),\n\t\t\t},\n\t\t}))\n\t\tcheck(t, agent, agent, \"\", []string{\"Sub1\", \"Sub2\"}, []string{\"Current\"})\n\t})\n}\n\nfunc TestAgentTransfer_ProcessRequest(t *testing.T) {\n\t// First Tool\n\ttype Input struct {\n\t\tx int\n\t}\n\tvar req model.LLMRequest\n\thandler := func(ctx tool.Context, input Input) (int, error) {\n\t\treturn input.x, nil\n\t}\n\tidentityTool, err := functiontool.New(functiontool.Config{\n\t\tName:        \"identity\",\n\t\tDescription: \"returns the input value\",\n\t}, handler)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\trequestProcessor, ok := identityTool.(toolinternal.RequestProcessor)\n\tif !ok {\n\t\tt.Fatal(\"identityTool does not implement itype.RequestProcessor\")\n\t}\n\tif err := requestProcessor.ProcessRequest(nil, &req); err != nil {\n\t\tt.Fatalf(\"identityTool.ProcessRequest failed: %v\", err)\n\t}\n\t// Second tool\n\ttransferToAgentTool := &llminternal.TransferToAgentTool{}\n\tif err := transferToAgentTool.ProcessRequest(nil, &req); err != nil {\n\t\tt.Fatalf(\"transferToAgentTool.ProcessRequest failed: %v\", err)\n\t}\n\n\tif len(req.Config.Tools) != 1 {\n\t\tt.Errorf(\"number of tools should be one, got: %d\", len(req.Config.Tools))\n\t}\n\tif len(req.Config.Tools[0].FunctionDeclarations) != 2 {\n\t\tt.Errorf(\"number of function declarations should be two, got: %d\", len(req.Config.Tools[0].FunctionDeclarations))\n\t}\n}\n\nfunc TestTransferToAgentToolRun(t *testing.T) {\n\tt.Run(\"Success\", func(t *testing.T) {\n\t\tcurTool := &llminternal.TransferToAgentTool{}\n\n\t\tinvCtx := icontext.NewInvocationContext(t.Context(), icontext.InvocationContextParams{})\n\t\tctx := toolinternal.NewToolContext(invCtx, \"\", &session.EventActions{}, nil)\n\n\t\twantAgentName := \"TestAgent\"\n\t\targs := map[string]any{\"agent_name\": wantAgentName}\n\t\tif _, err := curTool.Run(ctx, args); err != nil {\n\t\t\tt.Fatalf(\"Run(%v) failed: %v\", args, err)\n\t\t}\n\t\tif got, want := ctx.Actions().TransferToAgent, wantAgentName; got != want {\n\t\t\tt.Errorf(\"Run(%v) did not set TransferToAgent, got %q, want %q\", args, got, want)\n\t\t}\n\t})\n\n\tt.Run(\"InvalidArguments\", func(t *testing.T) {\n\t\ttestCases := []struct {\n\t\t\tname string\n\t\t\targs map[string]any\n\t\t}{\n\t\t\t{name: \"NoAgentName\", args: map[string]any{}},\n\t\t\t{name: \"NilArg\", args: nil},\n\t\t\t{name: \"InvalidType\", args: map[string]any{\"agent_name\": 123}},\n\t\t\t{name: \"InvalidValue\", args: map[string]any{\"agent_name\": \"\"}},\n\t\t}\n\n\t\tfor _, tc := range testCases {\n\t\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t\tcurTool := &llminternal.TransferToAgentTool{}\n\t\t\t\tctx := toolinternal.NewToolContext(icontext.NewInvocationContext(t.Context(), icontext.InvocationContextParams{}), \"\", nil, nil)\n\t\t\t\tif got, err := curTool.Run(ctx, tc.args); err == nil {\n\t\t\t\t\tt.Fatalf(\"Run(%v) = (%v, %v), want error\", tc.args, got, err)\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\t})\n}\n\nfunc stringify(v any) string {\n\ts, _ := json.Marshal(v)\n\treturn string(s)\n}\n"
  },
  {
    "path": "internal/llminternal/base_flow.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage llminternal\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"iter\"\n\t\"maps\"\n\t\"slices\"\n\t\"strings\"\n\t\"sync\"\n\n\t\"github.com/google/uuid\"\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/agent\"\n\t\"google.golang.org/adk/internal/agent/parentmap\"\n\t\"google.golang.org/adk/internal/agent/runconfig\"\n\ticontext \"google.golang.org/adk/internal/context\"\n\t\"google.golang.org/adk/internal/llminternal/googlellm\"\n\t\"google.golang.org/adk/internal/plugininternal/plugincontext\"\n\t\"google.golang.org/adk/internal/telemetry\"\n\t\"google.golang.org/adk/internal/toolinternal\"\n\t\"google.golang.org/adk/internal/utils\"\n\t\"google.golang.org/adk/model\"\n\t\"google.golang.org/adk/session\"\n\t\"google.golang.org/adk/tool\"\n\t\"google.golang.org/adk/tool/toolconfirmation\"\n)\n\nvar ErrModelNotConfigured = errors.New(\"model not configured; ensure Model is set in llmagent.Config\")\n\ntype BeforeModelCallback func(ctx agent.CallbackContext, llmRequest *model.LLMRequest) (*model.LLMResponse, error)\n\ntype AfterModelCallback func(ctx agent.CallbackContext, llmResponse *model.LLMResponse, llmResponseError error) (*model.LLMResponse, error)\n\ntype OnModelErrorCallback func(ctx agent.CallbackContext, llmRequest *model.LLMRequest, llmResponseError error) (*model.LLMResponse, error)\n\ntype BeforeToolCallback func(ctx tool.Context, tool tool.Tool, args map[string]any) (map[string]any, error)\n\ntype AfterToolCallback func(ctx tool.Context, tool tool.Tool, args, result map[string]any, err error) (map[string]any, error)\n\ntype OnToolErrorCallback func(ctx tool.Context, tool tool.Tool, args map[string]any, err error) (map[string]any, error)\n\ntype Flow struct {\n\tModel model.LLM\n\n\tTools                 []tool.Tool\n\tRequestProcessors     []func(ctx agent.InvocationContext, req *model.LLMRequest, f *Flow) iter.Seq2[*session.Event, error]\n\tResponseProcessors    []func(ctx agent.InvocationContext, req *model.LLMRequest, resp *model.LLMResponse) error\n\tBeforeModelCallbacks  []BeforeModelCallback\n\tAfterModelCallbacks   []AfterModelCallback\n\tOnModelErrorCallbacks []OnModelErrorCallback\n\tBeforeToolCallbacks   []BeforeToolCallback\n\tAfterToolCallbacks    []AfterToolCallback\n\tOnToolErrorCallbacks  []OnToolErrorCallback\n}\n\nvar (\n\tDefaultRequestProcessors = []func(ctx agent.InvocationContext, req *model.LLMRequest, f *Flow) iter.Seq2[*session.Event, error]{\n\t\tbasicRequestProcessor,\n\t\ttoolProcessor,\n\t\tauthPreprocessor,\n\t\tRequestConfirmationRequestProcessor,\n\t\tinstructionsRequestProcessor,\n\t\tidentityRequestProcessor,\n\t\tContentsRequestProcessor,\n\t\t// Some implementations of NL Planning mark planning contents as thoughts in the post processor.\n\t\t// Since these need to be unmarked, NL Planning should be after contentsRequestProcessor.\n\t\tnlPlanningRequestProcessor,\n\t\t// Code execution should be after contentsRequestProcessor as it mutates the contents\n\t\t// to optimize data files.\n\t\tcodeExecutionRequestProcessor,\n\t\toutputSchemaRequestProcessor,\n\t\tAgentTransferRequestProcessor,\n\t\tremoveDisplayNameIfExists,\n\t}\n\tDefaultResponseProcessors = []func(ctx agent.InvocationContext, req *model.LLMRequest, resp *model.LLMResponse) error{\n\t\tnlPlanningResponseProcessor,\n\t\tcodeExecutionResponseProcessor,\n\t}\n)\n\nfunc (f *Flow) Run(ctx agent.InvocationContext) iter.Seq2[*session.Event, error] {\n\treturn func(yield func(*session.Event, error) bool) {\n\t\tfor {\n\t\t\tvar lastEvent *session.Event\n\t\t\tfor ev, err := range f.runOneStep(ctx) {\n\t\t\t\tif err != nil {\n\t\t\t\t\tyield(nil, err)\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\t// forward the event first.\n\t\t\t\tif !yield(ev, nil) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tlastEvent = ev\n\t\t\t}\n\t\t\tif lastEvent == nil || lastEvent.IsFinalResponse() {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif lastEvent.LLMResponse.Partial {\n\t\t\t\t// We may have reached max token limit during streaming mode.\n\t\t\t\t// TODO: handle Partial response in model level. CL 781377328\n\t\t\t\tyield(nil, fmt.Errorf(\"TODO: last event is not final\"))\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc (f *Flow) runOneStep(ctx agent.InvocationContext) iter.Seq2[*session.Event, error] {\n\treturn func(yield func(*session.Event, error) bool) {\n\t\tif f.Model == nil {\n\t\t\tyield(nil, fmt.Errorf(\"agent %q: %w\", ctx.Agent().Name(), ErrModelNotConfigured))\n\t\t\treturn\n\t\t}\n\n\t\treq := &model.LLMRequest{\n\t\t\tModel: f.Model.Name(),\n\t\t}\n\n\t\t// Preprocess before calling the LLM.\n\t\tfor ev, err := range f.preprocess(ctx, req) {\n\t\t\tif err != nil {\n\t\t\t\tyield(nil, err)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif ev != nil {\n\t\t\t\tif !yield(ev, nil) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif ctx.Ended() {\n\t\t\treturn\n\t\t}\n\t\t// Create event to pass to callback state delta\n\t\tstateDelta := make(map[string]any)\n\t\tartifactDelta := make(map[string]int64)\n\t\t// Calls the LLM.\n\t\tfor resp, err := range f.callLLM(ctx, req, stateDelta, artifactDelta) {\n\t\t\tif err != nil {\n\t\t\t\tyield(nil, err)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif err := f.postprocess(ctx, req, resp); err != nil {\n\t\t\t\tyield(nil, err)\n\t\t\t\treturn\n\t\t\t}\n\t\t\t// Skip the model response event if there is no content and no error code.\n\t\t\t// This is needed for the code executor to trigger another loop according to\n\t\t\t// adk-python src/google/adk/flows/llm_flows/base_llm_flow.py BaseLlmFlow._postprocess_async.\n\t\t\tif resp.Content == nil && resp.ErrorCode == \"\" && !resp.Interrupted {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\t// TODO: temporarily convert\n\t\t\ttools := make(map[string]tool.Tool)\n\t\t\tfor k, v := range req.Tools {\n\t\t\t\ttool, ok := v.(tool.Tool)\n\t\t\t\tif !ok {\n\t\t\t\t\tif !yield(nil, fmt.Errorf(\"unexpected tool type %T for tool %v\", v, k)) {\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\ttools[k] = tool\n\t\t\t}\n\n\t\t\t// Build the event and yield.\n\t\t\tmodelResponseEvent := f.finalizeModelResponseEvent(ctx, resp, tools, stateDelta)\n\t\t\tif !yield(modelResponseEvent, nil) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\t// TODO: generate and yield an auth event if needed.\n\n\t\t\tif resp.Partial {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\t// Handle function calls.\n\n\t\t\tev, err := f.handleFunctionCalls(ctx, tools, resp.LLMResponse, nil)\n\t\t\tif err != nil {\n\t\t\t\tyield(nil, err)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif ev == nil {\n\t\t\t\t// nothing to yield/process.\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\ttoolConfirmationEvent := generateRequestConfirmationEvent(ctx, modelResponseEvent, ev)\n\t\t\tif toolConfirmationEvent != nil {\n\t\t\t\tif !yield(toolConfirmationEvent, nil) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif !yield(ev, nil) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// If the model response is structured, yield it as a final model response event.\n\t\t\toutputSchemaResponse, err := retrieveStructuredModelResponse(ev)\n\t\t\tif err != nil {\n\t\t\t\tyield(nil, err)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif outputSchemaResponse != \"\" {\n\t\t\t\tif !yield(createFinalModelResponseEvent(ctx, outputSchemaResponse), nil) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Actually handle \"transfer_to_agent\" tool. The function call sets the ev.Actions.TransferToAgent field.\n\t\t\t// We are following python's execution flow which is\n\t\t\t//   BaseLlmFlow._postprocess_async\n\t\t\t//    -> _postprocess_handle_function_calls_async\n\t\t\t// TODO(hakim): figure out why this isn't handled by the runner.\n\t\t\tif ev.Actions.TransferToAgent == \"\" {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tnextAgent := f.agentToRun(ctx, ev.Actions.TransferToAgent)\n\t\t\tif nextAgent == nil {\n\t\t\t\tyield(nil, fmt.Errorf(\"failed to find agent: %s\", ev.Actions.TransferToAgent))\n\t\t\t\treturn\n\t\t\t}\n\t\t\tfor ev, err := range nextAgent.Run(ctx) {\n\t\t\t\tif !yield(ev, err) || err != nil { // forward\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc (f *Flow) preprocess(ctx agent.InvocationContext, req *model.LLMRequest) iter.Seq2[*session.Event, error] {\n\treturn func(yield func(*session.Event, error) bool) {\n\t\t// apply request processor functions to the request in the configured order.\n\t\tfor _, processor := range f.RequestProcessors {\n\t\t\tfor ev, err := range processor(ctx, req, f) {\n\t\t\t\tif err != nil {\n\t\t\t\t\tyield(nil, err)\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif ev != nil {\n\t\t\t\t\tyield(ev, nil)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif f.Tools != nil {\n\t\t\tif err := toolPreprocess(ctx, req, f.Tools); err != nil {\n\t\t\t\tyield(nil, err)\n\t\t\t}\n\t\t}\n\t}\n}\n\n// toolPreprocess runs tool preprocess on the given request\n// If a tool set is encountered, it's expanded recursively in DFS fashion.\n// TODO: check need/feasibility of running this concurrently.\nfunc toolPreprocess(ctx agent.InvocationContext, req *model.LLMRequest, tools []tool.Tool) error {\n\tfor _, t := range tools {\n\t\trequestProcessor, ok := t.(toolinternal.RequestProcessor)\n\t\tif !ok {\n\t\t\treturn fmt.Errorf(\"tool %q does not implement RequestProcessor() method\", t.Name())\n\t\t}\n\t\t// TODO: how to prevent mutation on this?\n\t\ttoolCtx := toolinternal.NewToolContext(ctx, \"\", &session.EventActions{}, nil)\n\t\tif err := requestProcessor.ProcessRequest(toolCtx, req); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc newResponseWithEventID(resp *model.LLMResponse) *responseWithEventID {\n\treturn &responseWithEventID{resp, uuid.New().String()}\n}\n\nfunc (f *Flow) callLLM(ctx agent.InvocationContext, req *model.LLMRequest, stateDelta map[string]any, artifactDelta map[string]int64) iter.Seq2[*responseWithEventID, error] {\n\treturn func(yield func(*responseWithEventID, error) bool) {\n\t\tpluginManager := pluginManagerFromContext(ctx)\n\t\tif pluginManager != nil {\n\t\t\tcctx := icontext.NewCallbackContextWithDelta(ctx, stateDelta, artifactDelta)\n\t\t\tcallbackResponse, callbackErr := pluginManager.RunBeforeModelCallback(cctx, req)\n\t\t\tif callbackResponse != nil || callbackErr != nil {\n\t\t\t\tyield(newResponseWithEventID(callbackResponse), callbackErr)\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\n\t\tfor _, callback := range f.BeforeModelCallbacks {\n\t\t\tcctx := icontext.NewCallbackContextWithDelta(ctx, stateDelta, artifactDelta)\n\t\t\tcallbackResponse, callbackErr := callback(cctx, req)\n\n\t\t\tif callbackResponse != nil || callbackErr != nil {\n\t\t\t\tyield(newResponseWithEventID(callbackResponse), callbackErr)\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\n\t\t// TODO: Set _ADK_AGENT_NAME_LABEL_KEY in req.GenerateConfig.Labels\n\t\t// to help with slicing the billing reports on a per-agent basis.\n\n\t\t// TODO: RunLive mode when invocation_context.run_config.support_cfc is true.\n\t\tuseStream := runconfig.FromContext(ctx).StreamingMode == runconfig.StreamingModeSSE\n\n\t\tfor resp, err := range generateContent(ctx, f.Model, req, useStream) {\n\t\t\tif err != nil {\n\t\t\t\tcbResp, cbErr := f.runOnModelErrorCallbacks(ctx, req, stateDelta, artifactDelta, err)\n\t\t\t\tif cbErr != nil {\n\t\t\t\t\tyield(nil, cbErr)\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif cbResp == nil {\n\t\t\t\t\tyield(nil, err)\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tresp = &responseWithEventID{\n\t\t\t\t\tLLMResponse: cbResp,\n\t\t\t\t\teventID:     resp.eventID,\n\t\t\t\t}\n\t\t\t\terr = cbErr\n\t\t\t}\n\t\t\t// Function call ID is optional in genai API and some models do not use the field.\n\t\t\t// Set it in case after model callbacks use it.\n\t\t\tutils.PopulateClientFunctionCallID(resp.Content)\n\n\t\t\tcallbackResp, callbackErr := f.runAfterModelCallbacks(ctx, resp.LLMResponse, stateDelta, artifactDelta, err)\n\t\t\t// TODO: check if we should stop iterator on the first error from stream or continue yielding next results.\n\t\t\tif callbackErr != nil {\n\t\t\t\tyield(nil, callbackErr)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif callbackResp != nil {\n\t\t\t\tresp := &responseWithEventID{\n\t\t\t\t\tLLMResponse: callbackResp,\n\t\t\t\t\teventID:     resp.eventID,\n\t\t\t\t}\n\t\t\t\tif !yield(resp, nil) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\t// TODO: check if we should stop iterator on the first error from stream or continue yielding next results.\n\t\t\tif err != nil {\n\t\t\t\tyield(nil, err)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif !yield(resp, nil) {\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t}\n}\n\ntype responseWithEventID struct {\n\t*model.LLMResponse\n\teventID string\n}\n\n// generateContent wraps the LLM call with tracing and logging.\n// The generate_content span should cover only calls to LLM. Plugins and callbacks should be outside of this span.\nfunc generateContent(ctx agent.InvocationContext, m model.LLM, req *model.LLMRequest, useStream bool) iter.Seq2[*responseWithEventID, error] {\n\treturn func(yield func(*responseWithEventID, error) bool) {\n\t\tspanCtx, span := telemetry.StartGenerateContentSpan(ctx, telemetry.StartGenerateContentSpanParams{\n\t\t\tModelName:    m.Name(),\n\t\t\tInvocationID: ctx.InvocationID(),\n\t\t})\n\t\tctx = ctx.WithContext(spanCtx)\n\t\tbackend := googlellm.GetGoogleLLMVariant(m)\n\t\t// Log request before calling the model.\n\t\ttelemetry.LogRequest(ctx, req, backend)\n\n\t\tvar lastResponse responseWithEventID\n\t\tvar lastErr error\n\t\tspanEnded := false\n\t\tendSpanAndTrackResult := func() {\n\t\t\tif spanEnded {\n\t\t\t\t// Return to avoid spamming the logs with \"span already ended\" errors.\n\t\t\t\treturn\n\t\t\t}\n\t\t\ttelemetry.TraceGenerateContentResult(span, telemetry.TraceGenerateContentResultParams{\n\t\t\t\tResponse: lastResponse.LLMResponse,\n\t\t\t\tEventID:  lastResponse.eventID,\n\t\t\t\tError:    lastErr,\n\t\t\t})\n\t\t\tspan.End()\n\t\t\tspanEnded = true\n\t\t}\n\t\t// Ensure that the span is ended in case of error or if none final responses are yielded before the yield returns false.\n\t\tdefer endSpanAndTrackResult()\n\t\tfor resp, err := range m.GenerateContent(ctx, req, useStream) {\n\t\t\tresponse := newResponseWithEventID(resp)\n\t\t\tlastResponse = *response\n\t\t\tlastErr = err\n\t\t\t// Complete the span immediately to avoid capturing the upstream yield processing time.\n\t\t\tif err != nil {\n\t\t\t\tendSpanAndTrackResult()\n\t\t\t} else if !resp.Partial {\n\t\t\t\t// Log only final responses.\n\t\t\t\ttelemetry.LogResponse(ctx, resp, backend)\n\t\t\t\tendSpanAndTrackResult()\n\t\t\t}\n\t\t\tif !yield(response, err) {\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc (f *Flow) runAfterModelCallbacks(ctx agent.InvocationContext, llmResp *model.LLMResponse, stateDelta map[string]any, artifactDelta map[string]int64, llmErr error) (*model.LLMResponse, error) {\n\tpluginManager := pluginManagerFromContext(ctx)\n\tif pluginManager != nil {\n\t\tcctx := icontext.NewCallbackContextWithDelta(ctx, stateDelta, artifactDelta)\n\t\tcallbackResponse, callbackErr := pluginManager.RunAfterModelCallback(cctx, llmResp, llmErr)\n\t\tif callbackResponse != nil || callbackErr != nil {\n\t\t\treturn callbackResponse, callbackErr\n\t\t}\n\t}\n\n\tfor _, callback := range f.AfterModelCallbacks {\n\t\tcctx := icontext.NewCallbackContextWithDelta(ctx, stateDelta, artifactDelta)\n\t\tcallbackResponse, callbackErr := callback(cctx, llmResp, llmErr)\n\n\t\tif callbackResponse != nil || callbackErr != nil {\n\t\t\treturn callbackResponse, callbackErr\n\t\t}\n\t}\n\n\treturn nil, nil\n}\n\nfunc (f *Flow) runOnModelErrorCallbacks(ctx agent.InvocationContext, llmReq *model.LLMRequest, stateDelta map[string]any, artifactDelta map[string]int64, llmErr error) (*model.LLMResponse, error) {\n\tpluginManager := pluginManagerFromContext(ctx)\n\tif pluginManager != nil {\n\t\tcctx := icontext.NewCallbackContextWithDelta(ctx, stateDelta, artifactDelta)\n\t\tcallbackResponse, callbackErr := pluginManager.RunOnModelErrorCallback(cctx, llmReq, llmErr)\n\t\tif callbackResponse != nil || callbackErr != nil {\n\t\t\treturn callbackResponse, callbackErr\n\t\t}\n\t}\n\n\tfor _, callback := range f.OnModelErrorCallbacks {\n\t\tcctx := icontext.NewCallbackContextWithDelta(ctx, stateDelta, artifactDelta)\n\t\tcallbackResponse, callbackErr := callback(cctx, llmReq, llmErr)\n\n\t\tif callbackResponse != nil || callbackErr != nil {\n\t\t\treturn callbackResponse, callbackErr\n\t\t}\n\t}\n\n\treturn nil, nil\n}\n\nfunc (f *Flow) postprocess(ctx agent.InvocationContext, req *model.LLMRequest, resp *responseWithEventID) error {\n\t// apply response processor functions to the response in the configured order.\n\tfor _, processor := range f.ResponseProcessors {\n\t\tif err := processor(ctx, req, resp.LLMResponse); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc (f *Flow) agentToRun(ctx agent.InvocationContext, agentName string) agent.Agent {\n\t// NOTE: in python, BaseLlmFlow._get_agent_to_run searches the entire agent\n\t// tree from the root_agent when processing _postprocess_handle_function_calls_async.\n\t// I think that is strange. In our version, we check the agents included in transferTarget.\n\tparents := parentmap.FromContext(ctx)\n\tagents := transferTargets(ctx.Agent(), parents[ctx.Agent().Name()])\n\tfor _, agent := range agents {\n\t\tif agent.Name() == agentName {\n\t\t\treturn agent\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc (f *Flow) finalizeModelResponseEvent(ctx agent.InvocationContext, resp *responseWithEventID, tools map[string]tool.Tool, stateDelta map[string]any) *session.Event {\n\t// FunctionCall & FunctionResponse matching algorithm assumes non-empty function call IDs\n\t// but function call ID is optional in genai API and some models do not use the field.\n\t// Generate function call ids. (see functions.populate_client_function_call_id in python SDK)\n\tutils.PopulateClientFunctionCallID(resp.Content)\n\n\tev := session.NewEvent(ctx.InvocationID())\n\tev.ID = resp.eventID // TODO change NewEvent to accept event id\n\tev.Author = ctx.Agent().Name()\n\tev.Branch = ctx.Branch()\n\tev.LLMResponse = *resp.LLMResponse\n\tev.Actions.StateDelta = stateDelta\n\n\t// Populate ev.LongRunningToolIDs\n\tev.LongRunningToolIDs = findLongRunningFunctionCallIDs(resp.Content, tools)\n\n\treturn ev\n}\n\n// findLongRunningFunctionCallIDs iterates over the FunctionCalls and\n// returns the callIDs of the long running functions\nfunc findLongRunningFunctionCallIDs(c *genai.Content, tools map[string]tool.Tool) []string {\n\tset := make(map[string]struct{})\n\t// Iterate over function calls.\n\tfor _, fc := range utils.FunctionCalls(c) {\n\t\tif tool, ok := tools[fc.Name]; ok && fc.ID != \"\" && tool.IsLongRunning() {\n\t\t\t// If the tool exists and is long-running, add its ID to the set.\n\t\t\tset[fc.ID] = struct{}{}\n\t\t}\n\t}\n\t// Transform the set (map keys) into a slice.\n\treturn slices.Collect(maps.Keys(set))\n}\n\ntype fakeTool struct {\n\tname string\n}\n\nfunc (f *fakeTool) Name() string      { return f.name }\nfunc (*fakeTool) Description() string { return \"Tool not found\" }\nfunc (*fakeTool) IsLongRunning() bool { return false }\n\nvar _ tool.Tool = (*fakeTool)(nil)\n\n// newToolNotFoundError creates an error matching the specific Python format\nfunc newToolNotFoundError(toolName string, availableTools []string) error {\n\tjoinedTools := strings.Join(availableTools, \", \")\n\n\treturn fmt.Errorf(`tool '%s' not found.\nAvailable tools: %s\n\nPossible causes:\n  1. LLM hallucinated the function name - review agent instruction clarity\n  2. Tool not registered - verify agent.tools list\n  3. Name mismatch - check for typos\n\nSuggested fixes:\n  - Review agent instruction to ensure tool usage is clear\n  - Verify tool is included in agent.tools list\n  - Check for typos in function name`, toolName, joinedTools)\n}\n\n// handleFunctionCalls calls the functions and returns the function response event.\n//\n// TODO: accept filters to include/exclude function calls.\n// TODO: check feasibility of running tool.Run concurrently.\nfunc (f *Flow) handleFunctionCalls(ctx agent.InvocationContext, toolsDict map[string]tool.Tool, resp *model.LLMResponse, toolConfirmations map[string]*toolconfirmation.ToolConfirmation) (mergedEvent *session.Event, err error) {\n\tfnCalls := utils.FunctionCalls(resp.Content)\n\ttoolNames := slices.Collect(maps.Keys(toolsDict))\n\n\t// Merged span for parallel tool calls - create only if there is more than one tool call.\n\tif len(fnCalls) > 1 {\n\t\tmergedCtx, mergedToolCallSpan := telemetry.StartTrace(ctx, \"execute_tool (merged)\")\n\t\tctx = ctx.WithContext(mergedCtx)\n\t\tdefer func() {\n\t\t\ttelemetry.TraceMergedToolCallsResult(mergedToolCallSpan, mergedEvent, err)\n\t\t\tmergedToolCallSpan.End()\n\t\t}()\n\t}\n\n\tfnResponseEvents := make([]*session.Event, len(fnCalls))\n\tvar wg sync.WaitGroup\n\n\tfor i, fnCall := range fnCalls {\n\t\twg.Add(1)\n\t\tgo func(i int, fnCall *genai.FunctionCall) {\n\t\t\tdefer wg.Done()\n\n\t\t\tsctx, span := telemetry.StartExecuteToolSpan(ctx, telemetry.StartExecuteToolSpanParams{\n\t\t\t\tToolName: fnCall.Name,\n\t\t\t\tArgs:     fnCall.Args,\n\t\t\t})\n\t\t\tdefer span.End()\n\t\t\ttoolCallCtx := ctx.WithContext(sctx)\n\t\t\tvar confirmation *toolconfirmation.ToolConfirmation\n\t\t\tif toolConfirmations != nil {\n\t\t\t\tconfirmation = toolConfirmations[fnCall.ID]\n\t\t\t}\n\t\t\ttoolCtx := toolinternal.NewToolContext(toolCallCtx, fnCall.ID, &session.EventActions{StateDelta: make(map[string]any)}, confirmation)\n\n\t\t\tvar result map[string]any\n\t\t\tcurTool, found := toolsDict[fnCall.Name]\n\t\t\tif !found {\n\t\t\t\terr := newToolNotFoundError(fnCall.Name, toolNames)\n\t\t\t\tresult, err = f.runOnToolErrorCallbacks(toolCtx, &fakeTool{name: fnCall.Name}, fnCall.Args, err)\n\t\t\t\tif err != nil {\n\t\t\t\t\tresult = map[string]any{\"error\": err.Error()}\n\t\t\t\t}\n\t\t\t} else if funcTool, ok := curTool.(toolinternal.FunctionTool); !ok {\n\t\t\t\terr := newToolNotFoundError(fnCall.Name, toolNames)\n\t\t\t\tresult, err = f.runOnToolErrorCallbacks(toolCtx, &fakeTool{name: fnCall.Name}, fnCall.Args, err)\n\t\t\t\tif err != nil {\n\t\t\t\t\tresult = map[string]any{\"error\": err.Error()}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tresult = f.callTool(toolCtx, funcTool, fnCall.Args)\n\t\t\t}\n\n\t\t\t// TODO: handle long-running tool.\n\t\t\tev := session.NewEvent(ctx.InvocationID())\n\t\t\tev.LLMResponse = model.LLMResponse{\n\t\t\t\tContent: &genai.Content{\n\t\t\t\t\tRole: \"user\",\n\t\t\t\t\tParts: []*genai.Part{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tFunctionResponse: &genai.FunctionResponse{\n\t\t\t\t\t\t\t\tID:       fnCall.ID,\n\t\t\t\t\t\t\t\tName:     fnCall.Name,\n\t\t\t\t\t\t\t\tResponse: result,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t}\n\t\t\tev.Author = ctx.Agent().Name()\n\t\t\tev.Branch = ctx.Branch()\n\t\t\tev.Actions = *toolCtx.Actions()\n\n\t\t\ttraceTool := curTool\n\t\t\tif traceTool == nil {\n\t\t\t\ttraceTool = &fakeTool{name: fnCall.Name}\n\t\t\t}\n\t\t\tvar toolErr error\n\t\t\tresultErr := result[\"error\"]\n\t\t\tif resultErr != nil {\n\t\t\t\tif err, ok := resultErr.(error); ok {\n\t\t\t\t\ttoolErr = err\n\t\t\t\t} else if errStr, ok := resultErr.(string); ok {\n\t\t\t\t\ttoolErr = errors.New(errStr)\n\t\t\t\t}\n\t\t\t}\n\t\t\ttelemetry.TraceToolResult(span, telemetry.TraceToolResultParams{\n\t\t\t\tDescription:   traceTool.Description(),\n\t\t\t\tResponseEvent: ev,\n\t\t\t\tError:         toolErr,\n\t\t\t})\n\n\t\t\tfnResponseEvents[i] = ev\n\t\t}(i, fnCall)\n\t}\n\twg.Wait()\n\tmergedEvent, err = mergeParallelFunctionResponseEvents(fnResponseEvents)\n\tif err != nil {\n\t\treturn mergedEvent, err\n\t}\n\treturn mergedEvent, nil\n}\n\nfunc (f *Flow) runOnToolErrorCallbacks(toolCtx tool.Context, tool tool.Tool, fArgs map[string]any, err error) (map[string]any, error) {\n\tpluginManager := pluginManagerFromContext(toolCtx)\n\tif pluginManager != nil {\n\t\tresult, err := pluginManager.RunOnToolErrorCallback(toolCtx, tool, fArgs, err)\n\t\tif result != nil || err != nil {\n\t\t\treturn result, err\n\t\t}\n\t}\n\treturn f.invokeOnToolErrorCallbacks(toolCtx, tool, fArgs, err)\n}\n\nfunc (f *Flow) callTool(toolCtx tool.Context, tool toolinternal.FunctionTool, fArgs map[string]any) map[string]any {\n\tvar response map[string]any\n\tvar err error\n\tpluginManager := pluginManagerFromContext(toolCtx)\n\tif pluginManager != nil {\n\t\tresponse, err = pluginManager.RunBeforeToolCallback(toolCtx, tool, fArgs)\n\t}\n\tif response == nil && err == nil {\n\t\tresponse, err = f.invokeBeforeToolCallbacks(toolCtx, tool, fArgs)\n\t}\n\n\tif response == nil && err == nil {\n\t\tresponse, err = tool.Run(toolCtx, fArgs)\n\t}\n\n\tvar errorResponse map[string]any\n\tvar cbErr error\n\tif err != nil && pluginManager != nil {\n\t\terrorResponse, cbErr = pluginManager.RunOnToolErrorCallback(toolCtx, tool, fArgs, err)\n\t}\n\tif err != nil && errorResponse == nil && cbErr == nil {\n\t\terrorResponse, cbErr = f.invokeOnToolErrorCallbacks(toolCtx, tool, fArgs, err)\n\t}\n\tif errorResponse != nil || cbErr != nil {\n\t\tresponse = errorResponse\n\t\terr = cbErr\n\t}\n\n\tvar alteredResponse map[string]any\n\tvar alteredErr error\n\tif pluginManager != nil {\n\t\talteredResponse, alteredErr = pluginManager.RunAfterToolCallback(toolCtx, tool, fArgs, response, err)\n\t}\n\tif alteredResponse == nil && alteredErr == nil {\n\t\talteredResponse, alteredErr = f.invokeAfterToolCallbacks(toolCtx, tool, fArgs, response, err)\n\t}\n\tif alteredResponse != nil || alteredErr != nil {\n\t\tresponse = alteredResponse\n\t\terr = alteredErr\n\t}\n\n\tif err != nil {\n\t\treturn map[string]any{\"error\": err.Error()}\n\t}\n\treturn response\n}\n\nfunc (f *Flow) invokeBeforeToolCallbacks(toolCtx tool.Context, tool tool.Tool, fArgs map[string]any) (map[string]any, error) {\n\tfor _, callback := range f.BeforeToolCallbacks {\n\t\tresult, err := callback(toolCtx, tool, fArgs)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\t// When a list of callbacks is provided, the callbacks will be called in the\n\t\t// order they are listed while a callback returns nil.\n\t\tif result != nil {\n\t\t\treturn result, nil\n\t\t}\n\t}\n\treturn nil, nil\n}\n\nfunc (f *Flow) invokeAfterToolCallbacks(toolCtx tool.Context, tool toolinternal.FunctionTool, fArgs, fResult map[string]any, fErr error) (map[string]any, error) {\n\tfor _, callback := range f.AfterToolCallbacks {\n\t\tresult, err := callback(toolCtx, tool, fArgs, fResult, fErr)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\t// When a list of callbacks is provided, the callbacks will be called in the\n\t\t// order they are listed while a callback returns nil.\n\t\tif result != nil {\n\t\t\treturn result, nil\n\t\t}\n\t}\n\t// If no callback returned a result/error, return the original result/error.\n\treturn fResult, fErr\n}\n\nfunc (f *Flow) invokeOnToolErrorCallbacks(toolCtx tool.Context, tool tool.Tool, fArgs map[string]any, fErr error) (map[string]any, error) {\n\tfor _, callback := range f.OnToolErrorCallbacks {\n\t\tresult, err := callback(toolCtx, tool, fArgs, fErr)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\t// When a list of callbacks is provided, the callbacks will be called in the\n\t\t// order they are listed while a callback returns nil.\n\t\tif result != nil {\n\t\t\treturn result, nil\n\t\t}\n\t}\n\t// If no callback returned a result/error, return the original result/error.\n\treturn nil, fErr\n}\n\nfunc mergeParallelFunctionResponseEvents(events []*session.Event) (*session.Event, error) {\n\tswitch len(events) {\n\tcase 0:\n\t\treturn nil, nil\n\tcase 1:\n\t\treturn events[0], nil\n\t}\n\tvar parts []*genai.Part\n\tvar actions *session.EventActions\n\tfor _, ev := range events {\n\t\tif ev == nil || ev.LLMResponse.Content == nil {\n\t\t\tcontinue\n\t\t}\n\t\tparts = append(parts, ev.LLMResponse.Content.Parts...)\n\t\tactions = mergeEventActions(actions, &ev.Actions)\n\t}\n\t// reuse events[0]\n\tev := events[0]\n\tev.LLMResponse = model.LLMResponse{\n\t\tContent: &genai.Content{\n\t\t\tRole:  \"user\",\n\t\t\tParts: parts,\n\t\t},\n\t}\n\tev.Actions = *actions\n\treturn ev, nil\n}\n\nfunc mergeEventActions(base, other *session.EventActions) *session.EventActions {\n\t// flows/llm_flows/functions.py merge_parallel_function_response_events\n\tif other == nil {\n\t\treturn base\n\t}\n\tif base == nil {\n\t\treturn other\n\t}\n\tif other.SkipSummarization {\n\t\tbase.SkipSummarization = true\n\t}\n\tif other.TransferToAgent != \"\" {\n\t\tbase.TransferToAgent = other.TransferToAgent\n\t}\n\tif other.Escalate {\n\t\tbase.Escalate = true\n\t}\n\tif other.StateDelta != nil {\n\t\tbase.StateDelta = deepMergeMap(base.StateDelta, other.StateDelta)\n\t}\n\t// TODO add similar logic for state\n\tif other.RequestedToolConfirmations != nil {\n\t\tif base.RequestedToolConfirmations == nil {\n\t\t\tbase.RequestedToolConfirmations = make(map[string]toolconfirmation.ToolConfirmation)\n\t\t}\n\t\tmaps.Copy(base.RequestedToolConfirmations, other.RequestedToolConfirmations)\n\t}\n\treturn base\n}\n\nfunc deepMergeMap(dst, src map[string]any) map[string]any {\n\tif dst == nil {\n\t\tdst = make(map[string]any)\n\t}\n\tfor key, value := range src {\n\t\tif srcMap, ok := value.(map[string]any); ok {\n\t\t\tif dstMap, ok := dst[key].(map[string]any); ok {\n\t\t\t\tdst[key] = deepMergeMap(dstMap, srcMap)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\t\tdst[key] = value\n\t}\n\treturn dst\n}\n\nfunc pluginManagerFromContext(ctx context.Context) pluginManager {\n\tm, ok := ctx.Value(plugincontext.PluginManagerCtxKey).(pluginManager)\n\tif !ok {\n\t\treturn nil\n\t}\n\treturn m\n}\n\ntype pluginManager interface {\n\tRunBeforeModelCallback(cctx agent.CallbackContext, llmRequest *model.LLMRequest) (*model.LLMResponse, error)\n\tRunAfterModelCallback(cctx agent.CallbackContext, llmResponse *model.LLMResponse, llmResponseError error) (*model.LLMResponse, error)\n\tRunOnModelErrorCallback(ctx agent.CallbackContext, llmRequest *model.LLMRequest, llmResponseError error) (*model.LLMResponse, error)\n\tRunBeforeToolCallback(ctx tool.Context, t tool.Tool, args map[string]any) (map[string]any, error)\n\tRunAfterToolCallback(ctx tool.Context, t tool.Tool, args, result map[string]any, err error) (map[string]any, error)\n\tRunOnToolErrorCallback(ctx tool.Context, t tool.Tool, args map[string]any, err error) (map[string]any, error)\n}\n"
  },
  {
    "path": "internal/llminternal/base_flow_telemetry_test.go",
    "content": "// Copyright 2026 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage llminternal\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"iter\"\n\t\"sync\"\n\t\"testing\"\n\n\t\"go.opentelemetry.io/otel\"\n\t\"go.opentelemetry.io/otel/attribute\"\n\t\"go.opentelemetry.io/otel/codes\"\n\t\"go.opentelemetry.io/otel/log/global\"\n\tsdklog \"go.opentelemetry.io/otel/sdk/log\"\n\tsdktrace \"go.opentelemetry.io/otel/sdk/trace\"\n\t\"go.opentelemetry.io/otel/sdk/trace/tracetest\"\n\tsemconv \"go.opentelemetry.io/otel/semconv/v1.36.0\"\n\t\"go.opentelemetry.io/otel/trace\"\n\t\"google.golang.org/genai\"\n\n\ticontext \"google.golang.org/adk/internal/context\"\n\t\"google.golang.org/adk/model\"\n)\n\ntype mockModelForTest struct {\n\tname            string\n\tgenerateContent func(ctx context.Context, req *model.LLMRequest, stream bool) iter.Seq2[*model.LLMResponse, error]\n}\n\nfunc (m *mockModelForTest) Name() string {\n\treturn m.name\n}\n\nfunc (m *mockModelForTest) GenerateContent(ctx context.Context, req *model.LLMRequest, stream bool) iter.Seq2[*model.LLMResponse, error] {\n\tif m.generateContent != nil {\n\t\treturn m.generateContent(ctx, req, stream)\n\t}\n\treturn func(yield func(*model.LLMResponse, error) bool) {}\n}\n\nfunc (m *mockModelForTest) Backend() genai.Backend {\n\treturn genai.BackendGeminiAPI\n}\n\nvar (\n\ttestExporter *tracetest.InMemoryExporter\n\tinitTracer   sync.Once\n)\n\nfunc TestGenerateContentTracing(t *testing.T) {\n\tsetupTestTracer(t)\n\n\tmodelMock := &mockModelForTest{\n\t\tname: \"test-model\",\n\t\tgenerateContent: func(ctx context.Context, req *model.LLMRequest, stream bool) iter.Seq2[*model.LLMResponse, error] {\n\t\t\treturn func(yield func(*model.LLMResponse, error) bool) {\n\t\t\t\t// Yield partial response.\n\t\t\t\tif !yield(&model.LLMResponse{\n\t\t\t\t\tUsageMetadata: &genai.GenerateContentResponseUsageMetadata{\n\t\t\t\t\t\tPromptTokenCount:     1,\n\t\t\t\t\t\tCandidatesTokenCount: 2,\n\t\t\t\t\t},\n\t\t\t\t\tPartial: true,\n\t\t\t\t}, nil) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\t// Verify span NOT ended.\n\t\t\t\tgotSpans := testExporter.GetSpans()\n\t\t\t\tif len(gotSpans) != 0 {\n\t\t\t\t\tt.Errorf(\"expected 0 spans after partial response, got %d\", len(gotSpans))\n\t\t\t\t}\n\n\t\t\t\t// Yield final response.\n\t\t\t\tif !yield(&model.LLMResponse{\n\t\t\t\t\tUsageMetadata: &genai.GenerateContentResponseUsageMetadata{\n\t\t\t\t\t\tPromptTokenCount:     10,\n\t\t\t\t\t\tCandidatesTokenCount: 20,\n\t\t\t\t\t},\n\t\t\t\t\tPartial: false,\n\t\t\t\t}, nil) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\t// Verify span ENDED.\n\t\t\t\tgotSpans = testExporter.GetSpans()\n\t\t\t\tif len(gotSpans) != 1 {\n\t\t\t\t\tt.Errorf(\"expected 1 span after final response, got %d\", len(gotSpans))\n\t\t\t\t}\n\n\t\t\t\t// Yield final response - should not panic.\n\t\t\t\tif !yield(&model.LLMResponse{\n\t\t\t\t\tUsageMetadata: &genai.GenerateContentResponseUsageMetadata{\n\t\t\t\t\t\tPromptTokenCount:     100,\n\t\t\t\t\t\tCandidatesTokenCount: 200,\n\t\t\t\t\t},\n\t\t\t\t\tPartial: false,\n\t\t\t\t}, nil) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\t// Verify there is no new span.\n\t\t\t\tgotSpans = testExporter.GetSpans()\n\t\t\t\tif len(gotSpans) != 1 {\n\t\t\t\t\tt.Errorf(\"expected 1 span after final response, got %d\", len(gotSpans))\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t}\n\n\tctx := icontext.NewInvocationContext(context.Background(), icontext.InvocationContextParams{})\n\n\tfor range generateContent(ctx, modelMock, &model.LLMRequest{}, true) {\n\t}\n\n\t// Verify that there is only single span.\n\tgotSpans := testExporter.GetSpans()\n\tif len(gotSpans) != 1 {\n\t\tt.Fatalf(\"expected 1 span, got %d\", len(gotSpans))\n\t}\n\tgotSpan := gotSpans[0]\n\n\tif gotSpan.Name != \"generate_content test-model\" {\n\t\tt.Errorf(\"expected span name %q, got %q\", \"generate_content test-model\", gotSpan.Name)\n\t}\n\n\t// Verify span attributes.\n\tattrs := make(map[attribute.Key]string)\n\tfor _, kv := range gotSpan.Attributes {\n\t\tattrs[kv.Key] = kv.Value.Emit()\n\t}\n\n\tif val := attrs[semconv.GenAIUsageInputTokensKey]; val != \"10\" {\n\t\tt.Errorf(\"expected input tokens 10, got %s\", val)\n\t}\n\tif val := attrs[semconv.GenAIUsageOutputTokensKey]; val != \"20\" {\n\t\tt.Errorf(\"expected output tokens 20, got %s\", val)\n\t}\n\tif val := attrs[\"gcp.vertexai.invocation_id\"]; val != \"\" {\n\t\tt.Errorf(\"expected invocation id, got %s\", val)\n\t}\n}\n\nfunc TestGenerateContentTracingNoFinalResponse(t *testing.T) {\n\tsetupTestTracer(t)\n\n\tmodelMock := &mockModelForTest{\n\t\tname: \"test-model\",\n\t\tgenerateContent: func(ctx context.Context, req *model.LLMRequest, stream bool) iter.Seq2[*model.LLMResponse, error] {\n\t\t\treturn func(yield func(*model.LLMResponse, error) bool) {\n\t\t\t\t// Yield partial response.\n\t\t\t\tif !yield(&model.LLMResponse{\n\t\t\t\t\tUsageMetadata: &genai.GenerateContentResponseUsageMetadata{\n\t\t\t\t\t\tPromptTokenCount:     10,\n\t\t\t\t\t\tCandidatesTokenCount: 20,\n\t\t\t\t\t},\n\t\t\t\t\tPartial: true,\n\t\t\t\t}, nil) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\t// Verify span NOT ended.\n\t\t\t\tgotSpans := testExporter.GetSpans()\n\t\t\t\tif len(gotSpans) != 0 {\n\t\t\t\t\tt.Errorf(\"expected 0 spans after partial response, got %d\", len(gotSpans))\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t}\n\n\tctx := icontext.NewInvocationContext(context.Background(), icontext.InvocationContextParams{})\n\n\tfor range generateContent(ctx, modelMock, &model.LLMRequest{}, true) {\n\t}\n\n\t// Verify that there is only single span.\n\tgotSpans := testExporter.GetSpans()\n\tif len(gotSpans) != 1 {\n\t\tt.Fatalf(\"expected 1 span, got %d\", len(gotSpans))\n\t}\n\tgotSpan := gotSpans[0]\n\n\tif gotSpan.Name != \"generate_content test-model\" {\n\t\tt.Errorf(\"expected span name %q, got %q\", \"generate_content test-model\", gotSpan.Name)\n\t}\n\n\t// Verify span attributes.\n\tattrs := make(map[attribute.Key]string)\n\tfor _, kv := range gotSpan.Attributes {\n\t\tattrs[kv.Key] = kv.Value.Emit()\n\t}\n\n\tif val := attrs[semconv.GenAIUsageInputTokensKey]; val != \"10\" {\n\t\tt.Errorf(\"expected input tokens 10, got %s\", val)\n\t}\n\tif val := attrs[semconv.GenAIUsageOutputTokensKey]; val != \"20\" {\n\t\tt.Errorf(\"expected output tokens 20, got %s\", val)\n\t}\n}\n\nfunc TestGenerateContentTracingError(t *testing.T) {\n\tsetupTestTracer(t)\n\n\tmodelMock := &mockModelForTest{\n\t\tname: \"test-model\",\n\t\tgenerateContent: func(ctx context.Context, req *model.LLMRequest, stream bool) iter.Seq2[*model.LLMResponse, error] {\n\t\t\treturn func(yield func(*model.LLMResponse, error) bool) {\n\t\t\t\t// Yield partial response.\n\t\t\t\tif !yield(&model.LLMResponse{\n\t\t\t\t\tUsageMetadata: &genai.GenerateContentResponseUsageMetadata{\n\t\t\t\t\t\tPromptTokenCount:     1,\n\t\t\t\t\t\tCandidatesTokenCount: 2,\n\t\t\t\t\t},\n\t\t\t\t\tPartial: true,\n\t\t\t\t}, nil) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\t// Yield error.\n\t\t\t\tyield(nil, errors.New(\"test error\"))\n\n\t\t\t\t// Verify span ended.\n\t\t\t\tgotSpans := testExporter.GetSpans()\n\t\t\t\tif len(gotSpans) != 1 {\n\t\t\t\t\tt.Errorf(\"expected 1 span after error, got %d\", len(gotSpans))\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t}\n\n\tctx := icontext.NewInvocationContext(context.Background(), icontext.InvocationContextParams{})\n\n\tfor range generateContent(ctx, modelMock, &model.LLMRequest{}, true) {\n\t}\n\n\t// Verify that there is only single span.\n\tgotSpans := testExporter.GetSpans()\n\tif len(gotSpans) != 1 {\n\t\tt.Fatalf(\"expected 1 span, got %d\", len(gotSpans))\n\t}\n\tgotSpan := gotSpans[0]\n\n\tif gotSpan.Name != \"generate_content test-model\" {\n\t\tt.Errorf(\"expected span name %q, got %q\", \"generate_content test-model\", gotSpan.Name)\n\t}\n\n\tif gotSpan.Status.Code != codes.Error {\n\t\tt.Errorf(\"expected span status %q, got %q\", codes.Error, gotSpan.Status.Code)\n\t}\n\n\tif gotSpan.Status.Description != \"test error\" {\n\t\tt.Errorf(\"expected span status description %q, got %q\", \"test error\", gotSpan.Status.Description)\n\t}\n}\n\nfunc setupTestTracer(t *testing.T) {\n\tt.Helper()\n\tinitTracer.Do(func() {\n\t\t// internal/telemetry initializes the global tracer provider once at startup.\n\t\t// Subsequent calls to otel.SetTracerProvider don't update existing tracer providers, so we can override only once.\n\t\ttestExporter = tracetest.NewInMemoryExporter()\n\t\ttp := sdktrace.NewTracerProvider(\n\t\t\tsdktrace.WithSyncer(testExporter),\n\t\t)\n\t\totel.SetTracerProvider(tp)\n\t})\n\t// Reset the exporter before each test to avoid flakiness.\n\ttestExporter.Reset()\n\tt.Cleanup(func() {\n\t\ttestExporter.Reset()\n\t})\n}\n\ntype inMemoryLogExporter struct {\n\trecords []sdklog.Record\n}\n\nfunc (e *inMemoryLogExporter) Export(ctx context.Context, records []sdklog.Record) error {\n\te.records = append(e.records, records...)\n\treturn nil\n}\nfunc (e *inMemoryLogExporter) Shutdown(ctx context.Context) error   { return nil }\nfunc (e *inMemoryLogExporter) ForceFlush(ctx context.Context) error { return nil }\n\nfunc TestLoggingSpanIDPropagation(t *testing.T) {\n\tsetupTestTracer(t)\n\tlogExporter := setupLoggerProvider(t)\n\n\tvar wantSpanID trace.SpanID\n\tmodelMock := &mockModelForTest{\n\t\tname: \"test-model\",\n\t\tgenerateContent: func(ctx context.Context, req *model.LLMRequest, stream bool) iter.Seq2[*model.LLMResponse, error] {\n\t\t\t// Capture the span ID.\n\t\t\twantSpanID = trace.SpanFromContext(ctx).SpanContext().SpanID()\n\t\t\tif !wantSpanID.IsValid() {\n\t\t\t\tt.Fatalf(\"expected span ID to be valid, got %q\", wantSpanID)\n\t\t\t}\n\t\t\treturn func(yield func(*model.LLMResponse, error) bool) {\n\t\t\t\tyield(&model.LLMResponse{\n\t\t\t\t\tUsageMetadata: &genai.GenerateContentResponseUsageMetadata{\n\t\t\t\t\t\tPromptTokenCount:     1,\n\t\t\t\t\t\tCandidatesTokenCount: 2,\n\t\t\t\t\t},\n\t\t\t\t\tContent: &genai.Content{\n\t\t\t\t\t\tRole:  \"model\",\n\t\t\t\t\t\tParts: []*genai.Part{{Text: \"Response\"}},\n\t\t\t\t\t},\n\t\t\t\t}, nil)\n\t\t\t}\n\t\t},\n\t}\n\n\treq := &model.LLMRequest{\n\t\tConfig: &genai.GenerateContentConfig{\n\t\t\tSystemInstruction: &genai.Content{\n\t\t\t\tRole: \"system\",\n\t\t\t\tParts: []*genai.Part{\n\t\t\t\t\t{Text: \"You are a helpful assistant.\"},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tContents: []*genai.Content{\n\t\t\t{\n\t\t\t\tRole: \"user\",\n\t\t\t\tParts: []*genai.Part{\n\t\t\t\t\t{Text: \"Hello\"},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n\n\tctx := icontext.NewInvocationContext(context.Background(), icontext.InvocationContextParams{})\n\tfor range generateContent(ctx, modelMock, req, true) {\n\t}\n\n\tif len(logExporter.records) != 3 {\n\t\tt.Fatalf(\"expected 3 log records, got %d\", len(logExporter.records))\n\t}\n\n\twantEvents := []string{\n\t\t\"gen_ai.system.message\",\n\t\t\"gen_ai.user.message\",\n\t\t\"gen_ai.choice\",\n\t}\n\n\tfor i, record := range logExporter.records {\n\t\tif got := record.SpanID(); got != wantSpanID {\n\t\t\tt.Errorf(\"record[%d]: expected span ID %q, got %q\", i, wantSpanID, got)\n\t\t}\n\t\tif got := record.EventName(); got != wantEvents[i] {\n\t\t\tt.Errorf(\"record[%d]: expected event name %q, got %q\", i, wantEvents[i], got)\n\t\t}\n\t}\n}\n\nfunc setupLoggerProvider(t *testing.T) *inMemoryLogExporter {\n\tlogExporter := &inMemoryLogExporter{}\n\tprovider := sdklog.NewLoggerProvider(\n\t\tsdklog.WithProcessor(sdklog.NewSimpleProcessor(logExporter)),\n\t)\n\toriginalProvider := global.GetLoggerProvider()\n\tglobal.SetLoggerProvider(provider)\n\tt.Cleanup(func() {\n\t\tglobal.SetLoggerProvider(originalProvider)\n\t})\n\treturn logExporter\n}\n"
  },
  {
    "path": "internal/llminternal/base_flow_test.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage llminternal\n\nimport (\n\t\"errors\"\n\t\"testing\"\n\n\t\"github.com/google/go-cmp/cmp\"\n\t\"google.golang.org/genai\"\n\n\ticontext \"google.golang.org/adk/internal/context\"\n\t\"google.golang.org/adk/internal/toolinternal\"\n\t\"google.golang.org/adk/model\"\n\t\"google.golang.org/adk/session\"\n\t\"google.golang.org/adk/tool\"\n)\n\ntype mockFunctionTool struct {\n\tname    string\n\trunFunc func(tool.Context, map[string]any) (map[string]any, error)\n}\n\nfunc (m *mockFunctionTool) Name() string {\n\treturn m.name\n}\n\nfunc (m *mockFunctionTool) Description() string {\n\treturn \"mock tool\"\n}\n\nfunc (m *mockFunctionTool) InputSchema() *genai.Schema {\n\treturn nil\n}\n\nfunc (m *mockFunctionTool) OutputSchema() *genai.Schema {\n\treturn nil\n}\n\nfunc (m *mockFunctionTool) IsLongRunning() bool {\n\treturn false\n}\n\nfunc (m *mockFunctionTool) ProcessRequest(ctx tool.Context, req *model.LLMRequest) error {\n\treturn nil\n}\n\nfunc (m *mockFunctionTool) Run(ctx tool.Context, args any) (map[string]any, error) {\n\tif m.runFunc != nil {\n\t\treturn m.runFunc(ctx, args.(map[string]any))\n\t}\n\treturn nil, nil\n}\n\nfunc (m *mockFunctionTool) Declaration() *genai.FunctionDeclaration {\n\treturn nil\n}\n\ntype testCase struct {\n\tname                 string\n\ttool                 toolinternal.FunctionTool\n\targs                 map[string]any\n\tbeforeToolCallbacks  []BeforeToolCallback\n\tafterToolCallbacks   []AfterToolCallback\n\tonToolErrorCallbacks []OnToolErrorCallback\n\twant                 map[string]any\n}\n\nfunc TestCallTool(t *testing.T) {\n\ttestCases := []testCase{\n\t\t{\n\t\t\tname: \"tool runs successfully\",\n\t\t\ttool: &mockFunctionTool{\n\t\t\t\tname: \"testTool\",\n\t\t\t\trunFunc: func(ctx tool.Context, args map[string]any) (map[string]any, error) {\n\t\t\t\t\treturn map[string]any{\"result\": \"success\"}, nil\n\t\t\t\t},\n\t\t\t},\n\t\t\targs: map[string]any{\"key\": \"value\"},\n\t\t\twant: map[string]any{\"result\": \"success\"},\n\t\t},\n\t\t{\n\t\t\tname: \"tool error\",\n\t\t\ttool: &mockFunctionTool{\n\t\t\t\tname: \"testTool\",\n\t\t\t\trunFunc: func(ctx tool.Context, args map[string]any) (map[string]any, error) {\n\t\t\t\t\treturn nil, errors.New(\"tool error\")\n\t\t\t\t},\n\t\t\t},\n\t\t\targs: map[string]any{\"key\": \"value\"},\n\t\t\twant: map[string]any{\"error\": \"tool error\"},\n\t\t},\n\t\t{\n\t\t\tname: \"before callback returns result\",\n\t\t\ttool: &mockFunctionTool{\n\t\t\t\tname: \"testTool\",\n\t\t\t\trunFunc: func(ctx tool.Context, args map[string]any) (map[string]any, error) {\n\t\t\t\t\tt.Error(\"tool should not be called\")\n\t\t\t\t\treturn nil, nil\n\t\t\t\t},\n\t\t\t},\n\t\t\tbeforeToolCallbacks: []BeforeToolCallback{\n\t\t\t\tfunc(ctx tool.Context, tool tool.Tool, args map[string]any) (map[string]any, error) {\n\t\t\t\t\treturn map[string]any{\"result\": \"intercepted\"}, nil\n\t\t\t\t},\n\t\t\t\tfunc(ctx tool.Context, tool tool.Tool, args map[string]any) (map[string]any, error) {\n\t\t\t\t\treturn map[string]any{\"result\": \"2nd callback should not be called\"}, nil\n\t\t\t\t},\n\t\t\t},\n\t\t\twant: map[string]any{\"result\": \"intercepted\"},\n\t\t},\n\t\t{\n\t\t\tname: \"before callback returns error\",\n\t\t\ttool: &mockFunctionTool{\n\t\t\t\tname: \"testTool\",\n\t\t\t\trunFunc: func(ctx tool.Context, args map[string]any) (map[string]any, error) {\n\t\t\t\t\tt.Error(\"tool should not be called\")\n\t\t\t\t\treturn nil, nil\n\t\t\t\t},\n\t\t\t},\n\t\t\tbeforeToolCallbacks: []BeforeToolCallback{\n\t\t\t\tfunc(ctx tool.Context, tool tool.Tool, args map[string]any) (map[string]any, error) {\n\t\t\t\t\treturn nil, errors.New(\"before callback error\")\n\t\t\t\t},\n\t\t\t\tfunc(ctx tool.Context, tool tool.Tool, args map[string]any) (map[string]any, error) {\n\t\t\t\t\treturn nil, errors.New(\"unexpected error\")\n\t\t\t\t},\n\t\t\t},\n\t\t\twant: map[string]any{\"error\": \"before callback error\"},\n\t\t},\n\t\t{\n\t\t\tname: \"after callback modifies result\",\n\t\t\ttool: &mockFunctionTool{\n\t\t\t\tname: \"testTool\",\n\t\t\t\trunFunc: func(ctx tool.Context, args map[string]any) (map[string]any, error) {\n\t\t\t\t\treturn map[string]any{\"result\": \"original\"}, nil\n\t\t\t\t},\n\t\t\t},\n\t\t\tafterToolCallbacks: []AfterToolCallback{\n\t\t\t\tfunc(ctx tool.Context, tool tool.Tool, args, result map[string]any, err error) (map[string]any, error) {\n\t\t\t\t\treturn map[string]any{\"result\": \"modified\"}, nil\n\t\t\t\t},\n\t\t\t},\n\t\t\twant: map[string]any{\"result\": \"modified\"},\n\t\t},\n\t\t{\n\t\t\tname: \"after callback handles error\",\n\t\t\ttool: &mockFunctionTool{\n\t\t\t\tname: \"testTool\",\n\t\t\t\trunFunc: func(ctx tool.Context, args map[string]any) (map[string]any, error) {\n\t\t\t\t\treturn nil, errors.New(\"tool error\")\n\t\t\t\t},\n\t\t\t},\n\t\t\tafterToolCallbacks: []AfterToolCallback{\n\t\t\t\tfunc(ctx tool.Context, tool tool.Tool, args, result map[string]any, err error) (map[string]any, error) {\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn map[string]any{\"result\": \"error handled\"}, nil\n\t\t\t\t\t}\n\t\t\t\t\treturn nil, nil\n\t\t\t\t},\n\t\t\t\tfunc(ctx tool.Context, tool tool.Tool, args, result map[string]any, err error) (map[string]any, error) {\n\t\t\t\t\treturn map[string]any{\"result\": \"unexpected output\"}, nil\n\t\t\t\t},\n\t\t\t},\n\t\t\twant: map[string]any{\"result\": \"error handled\"},\n\t\t},\n\t\t{\n\t\t\tname: \"after callback returns error\",\n\t\t\ttool: &mockFunctionTool{\n\t\t\t\tname: \"testTool\",\n\t\t\t\trunFunc: func(ctx tool.Context, args map[string]any) (map[string]any, error) {\n\t\t\t\t\treturn map[string]any{\"result\": \"success\"}, nil\n\t\t\t\t},\n\t\t\t},\n\t\t\tafterToolCallbacks: []AfterToolCallback{\n\t\t\t\tfunc(ctx tool.Context, tool tool.Tool, args, result map[string]any, err error) (map[string]any, error) {\n\t\t\t\t\treturn nil, errors.New(\"after callback error\")\n\t\t\t\t},\n\t\t\t\tfunc(ctx tool.Context, tool tool.Tool, args, result map[string]any, err error) (map[string]any, error) {\n\t\t\t\t\treturn nil, errors.New(\"unexpected error\")\n\t\t\t\t},\n\t\t\t},\n\t\t\twant: map[string]any{\"error\": \"after callback error\"},\n\t\t},\n\t\t{\n\t\t\tname: \"no-op callbacks return func results\",\n\t\t\ttool: &mockFunctionTool{\n\t\t\t\tname: \"testTool\",\n\t\t\t\trunFunc: func(ctx tool.Context, args map[string]any) (map[string]any, error) {\n\t\t\t\t\treturn map[string]any{\"result\": \"success\"}, nil\n\t\t\t\t},\n\t\t\t},\n\t\t\tbeforeToolCallbacks: []BeforeToolCallback{\n\t\t\t\tfunc(ctx tool.Context, tool tool.Tool, args map[string]any) (map[string]any, error) {\n\t\t\t\t\treturn nil, nil\n\t\t\t\t},\n\t\t\t},\n\t\t\tafterToolCallbacks: []AfterToolCallback{\n\t\t\t\tfunc(ctx tool.Context, tool tool.Tool, args, result map[string]any, err error) (map[string]any, error) {\n\t\t\t\t\treturn nil, nil\n\t\t\t\t},\n\t\t\t},\n\t\t\twant: map[string]any{\"result\": \"success\"},\n\t\t},\n\t\t{\n\t\t\tname: \"before callback result passed to after callback\",\n\t\t\ttool: &mockFunctionTool{\n\t\t\t\tname: \"testTool\",\n\t\t\t\trunFunc: func(ctx tool.Context, args map[string]any) (map[string]any, error) {\n\t\t\t\t\tt.Error(\"tool should not be called\")\n\t\t\t\t\treturn nil, nil\n\t\t\t\t},\n\t\t\t},\n\t\t\tbeforeToolCallbacks: []BeforeToolCallback{\n\t\t\t\tfunc(ctx tool.Context, tool tool.Tool, args map[string]any) (map[string]any, error) {\n\t\t\t\t\treturn map[string]any{\"result\": \"from_before\"}, nil\n\t\t\t\t},\n\t\t\t},\n\t\t\tafterToolCallbacks: []AfterToolCallback{\n\t\t\t\tfunc(ctx tool.Context, tool tool.Tool, args, result map[string]any, err error) (map[string]any, error) {\n\t\t\t\t\tif val, ok := result[\"result\"]; !ok || val != \"from_before\" {\n\t\t\t\t\t\treturn nil, errors.New(\"unexpected result in after callback\")\n\t\t\t\t\t}\n\t\t\t\t\treturn map[string]any{\"result\": \"from_after\"}, nil\n\t\t\t\t},\n\t\t\t},\n\t\t\twant: map[string]any{\"result\": \"from_after\"},\n\t\t},\n\t\t{\n\t\t\tname: \"before callback error passed to after callback\",\n\t\t\ttool: &mockFunctionTool{\n\t\t\t\tname: \"testTool\",\n\t\t\t\trunFunc: func(ctx tool.Context, args map[string]any) (map[string]any, error) {\n\t\t\t\t\tt.Error(\"tool should not be called\")\n\t\t\t\t\treturn nil, nil\n\t\t\t\t},\n\t\t\t},\n\t\t\tbeforeToolCallbacks: []BeforeToolCallback{\n\t\t\t\tfunc(ctx tool.Context, tool tool.Tool, args map[string]any) (map[string]any, error) {\n\t\t\t\t\treturn nil, errors.New(\"error_from_before\")\n\t\t\t\t},\n\t\t\t},\n\t\t\tafterToolCallbacks: []AfterToolCallback{\n\t\t\t\tfunc(ctx tool.Context, tool tool.Tool, args, result map[string]any, err error) (map[string]any, error) {\n\t\t\t\t\tif err == nil || err.Error() != \"error_from_before\" {\n\t\t\t\t\t\treturn nil, errors.New(\"unexpected error in after callback\")\n\t\t\t\t\t}\n\t\t\t\t\treturn map[string]any{\"result\": \"error_handled_in_after\"}, nil\n\t\t\t\t},\n\t\t\t},\n\t\t\twant: map[string]any{\"result\": \"error_handled_in_after\"},\n\t\t},\n\t\t{\n\t\t\tname: \"before callback error passed to on tool error callback\",\n\t\t\ttool: &mockFunctionTool{\n\t\t\t\tname: \"testTool\",\n\t\t\t\trunFunc: func(ctx tool.Context, args map[string]any) (map[string]any, error) {\n\t\t\t\t\tt.Error(\"tool should not be called\")\n\t\t\t\t\treturn nil, nil\n\t\t\t\t},\n\t\t\t},\n\t\t\tbeforeToolCallbacks: []BeforeToolCallback{\n\t\t\t\tfunc(ctx tool.Context, tool tool.Tool, args map[string]any) (map[string]any, error) {\n\t\t\t\t\treturn nil, errors.New(\"error_from_before\")\n\t\t\t\t},\n\t\t\t},\n\t\t\tonToolErrorCallbacks: []OnToolErrorCallback{\n\t\t\t\tfunc(ctx tool.Context, tool tool.Tool, args map[string]any, err error) (map[string]any, error) {\n\t\t\t\t\tif err == nil || err.Error() != \"error_from_before\" {\n\t\t\t\t\t\tt.Error(\"unexpected error in on tool error callback\")\n\t\t\t\t\t\treturn nil, errors.New(\"unexpected error in on tool error callback\")\n\t\t\t\t\t}\n\t\t\t\t\treturn map[string]any{\"result\": \"error_handled_in_on_tool_error_callback\"}, nil\n\t\t\t\t},\n\t\t\t},\n\t\t\twant: map[string]any{\"result\": \"error_handled_in_on_tool_error_callback\"},\n\t\t},\n\t\t{\n\t\t\tname: \"before callback error passed to on tool error callback and after tool called\",\n\t\t\ttool: &mockFunctionTool{\n\t\t\t\tname: \"testTool\",\n\t\t\t\trunFunc: func(ctx tool.Context, args map[string]any) (map[string]any, error) {\n\t\t\t\t\tt.Error(\"tool should not be called\")\n\t\t\t\t\treturn nil, nil\n\t\t\t\t},\n\t\t\t},\n\t\t\tbeforeToolCallbacks: []BeforeToolCallback{\n\t\t\t\tfunc(ctx tool.Context, tool tool.Tool, args map[string]any) (map[string]any, error) {\n\t\t\t\t\treturn nil, errors.New(\"error_from_before\")\n\t\t\t\t},\n\t\t\t},\n\t\t\tonToolErrorCallbacks: []OnToolErrorCallback{\n\t\t\t\tfunc(ctx tool.Context, tool tool.Tool, args map[string]any, err error) (map[string]any, error) {\n\t\t\t\t\tif err == nil || err.Error() != \"error_from_before\" {\n\t\t\t\t\t\tt.Error(\"unexpected error in on tool error callback\")\n\t\t\t\t\t\treturn nil, errors.New(\"unexpected error in on tool error callback\")\n\t\t\t\t\t}\n\t\t\t\t\treturn map[string]any{\"result\": \"error_handled_in_on_tool_error_callback\"}, nil\n\t\t\t\t},\n\t\t\t},\n\t\t\tafterToolCallbacks: []AfterToolCallback{\n\t\t\t\tfunc(ctx tool.Context, tool tool.Tool, args, result map[string]any, err error) (map[string]any, error) {\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn nil, errors.New(\"unexpected error in after callback\")\n\t\t\t\t\t}\n\t\t\t\t\treturn map[string]any{\"result\": \"from_after\"}, nil\n\t\t\t\t},\n\t\t\t},\n\t\t\twant: map[string]any{\"result\": \"from_after\"},\n\t\t},\n\t\t{\n\t\t\tname: \"before callback error passed to on tool error callback and passed to after tool called\",\n\t\t\ttool: &mockFunctionTool{\n\t\t\t\tname: \"testTool\",\n\t\t\t\trunFunc: func(ctx tool.Context, args map[string]any) (map[string]any, error) {\n\t\t\t\t\tt.Error(\"tool should not be called\")\n\t\t\t\t\treturn nil, nil\n\t\t\t\t},\n\t\t\t},\n\t\t\tbeforeToolCallbacks: []BeforeToolCallback{\n\t\t\t\tfunc(ctx tool.Context, tool tool.Tool, args map[string]any) (map[string]any, error) {\n\t\t\t\t\treturn nil, errors.New(\"error_from_before\")\n\t\t\t\t},\n\t\t\t},\n\t\t\tonToolErrorCallbacks: []OnToolErrorCallback{\n\t\t\t\tfunc(ctx tool.Context, tool tool.Tool, args map[string]any, err error) (map[string]any, error) {\n\t\t\t\t\tif err == nil || err.Error() != \"error_from_before\" {\n\t\t\t\t\t\tt.Error(\"unexpected error in on tool error callback\")\n\t\t\t\t\t\treturn nil, errors.New(\"unexpected error in on tool error callback\")\n\t\t\t\t\t}\n\t\t\t\t\treturn nil, errors.New(\"error_from_on_tool_error\")\n\t\t\t\t},\n\t\t\t},\n\t\t\tafterToolCallbacks: []AfterToolCallback{\n\t\t\t\tfunc(ctx tool.Context, tool tool.Tool, args, result map[string]any, err error) (map[string]any, error) {\n\t\t\t\t\tif err == nil || err.Error() != \"error_from_on_tool_error\" {\n\t\t\t\t\t\treturn nil, errors.New(\"unexpected error in after callback\")\n\t\t\t\t\t}\n\t\t\t\t\treturn nil, errors.New(\"error_from_after_tool\")\n\t\t\t\t},\n\t\t\t},\n\t\t\twant: map[string]any{\"error\": \"error_from_after_tool\"},\n\t\t},\n\t\t{\n\t\t\tname: \"before callback error passed to on tool error callback and passed to after tool called and handled\",\n\t\t\ttool: &mockFunctionTool{\n\t\t\t\tname: \"testTool\",\n\t\t\t\trunFunc: func(ctx tool.Context, args map[string]any) (map[string]any, error) {\n\t\t\t\t\tt.Error(\"tool should not be called\")\n\t\t\t\t\treturn nil, nil\n\t\t\t\t},\n\t\t\t},\n\t\t\tbeforeToolCallbacks: []BeforeToolCallback{\n\t\t\t\tfunc(ctx tool.Context, tool tool.Tool, args map[string]any) (map[string]any, error) {\n\t\t\t\t\treturn nil, errors.New(\"error_from_before\")\n\t\t\t\t},\n\t\t\t},\n\t\t\tonToolErrorCallbacks: []OnToolErrorCallback{\n\t\t\t\tfunc(ctx tool.Context, tool tool.Tool, args map[string]any, err error) (map[string]any, error) {\n\t\t\t\t\tif err == nil || err.Error() != \"error_from_before\" {\n\t\t\t\t\t\tt.Error(\"unexpected error in on tool error callback\")\n\t\t\t\t\t\treturn nil, errors.New(\"unexpected error in on tool error callback\")\n\t\t\t\t\t}\n\t\t\t\t\treturn nil, errors.New(\"error_from_on_tool_error\")\n\t\t\t\t},\n\t\t\t},\n\t\t\tafterToolCallbacks: []AfterToolCallback{\n\t\t\t\tfunc(ctx tool.Context, tool tool.Tool, args, result map[string]any, err error) (map[string]any, error) {\n\t\t\t\t\tif err == nil || err.Error() != \"error_from_on_tool_error\" {\n\t\t\t\t\t\treturn nil, errors.New(\"unexpected error in after callback\")\n\t\t\t\t\t}\n\t\t\t\t\treturn map[string]any{\"result\": \"error_handled_in_on_tool_error_callback\"}, nil\n\t\t\t\t},\n\t\t\t},\n\t\t\twant: map[string]any{\"result\": \"error_handled_in_on_tool_error_callback\"},\n\t\t},\n\t}\n\tfor _, tc := range testCases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\tf := &Flow{\n\t\t\t\tBeforeToolCallbacks:  tc.beforeToolCallbacks,\n\t\t\t\tAfterToolCallbacks:   tc.afterToolCallbacks,\n\t\t\t\tOnToolErrorCallbacks: tc.onToolErrorCallbacks,\n\t\t\t}\n\t\t\tctx := icontext.NewInvocationContext(t.Context(), icontext.InvocationContextParams{})\n\t\t\tgot := f.callTool(toolinternal.NewToolContext(ctx, \"\", nil, nil), tc.tool, tc.args)\n\t\t\tif diff := cmp.Diff(tc.want, got); diff != \"\" {\n\t\t\t\tt.Errorf(\"callTool() mismatch (-want +got):\\n%s\", diff)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestMergeEventActions(t *testing.T) {\n\ttests := []struct {\n\t\tname  string\n\t\tbase  *session.EventActions\n\t\tother *session.EventActions\n\t\twant  *session.EventActions\n\t}{\n\t\t{\n\t\t\tname:  \"both nil\",\n\t\t\tbase:  nil,\n\t\t\tother: nil,\n\t\t\twant:  nil,\n\t\t},\n\t\t{\n\t\t\tname: \"other nil returns base\",\n\t\t\tbase: &session.EventActions{\n\t\t\t\tStateDelta: map[string]any{\"key1\": \"value1\"},\n\t\t\t},\n\t\t\tother: nil,\n\t\t\twant: &session.EventActions{\n\t\t\t\tStateDelta: map[string]any{\"key1\": \"value1\"},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"base nil returns other\",\n\t\t\tbase: nil,\n\t\t\tother: &session.EventActions{\n\t\t\t\tStateDelta: map[string]any{\"key1\": \"value1\"},\n\t\t\t},\n\t\t\twant: &session.EventActions{\n\t\t\t\tStateDelta: map[string]any{\"key1\": \"value1\"},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"state delta merged with non-overlapping keys\",\n\t\t\tbase: &session.EventActions{\n\t\t\t\tStateDelta: map[string]any{\"key1\": \"value1\"},\n\t\t\t},\n\t\t\tother: &session.EventActions{\n\t\t\t\tStateDelta: map[string]any{\"key2\": \"value2\"},\n\t\t\t},\n\t\t\twant: &session.EventActions{\n\t\t\t\tStateDelta: map[string]any{\"key1\": \"value1\", \"key2\": \"value2\"},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"state delta merged with overlapping keys - later wins\",\n\t\t\tbase: &session.EventActions{\n\t\t\t\tStateDelta: map[string]any{\"key1\": \"original\"},\n\t\t\t},\n\t\t\tother: &session.EventActions{\n\t\t\t\tStateDelta: map[string]any{\"key1\": \"overwritten\"},\n\t\t\t},\n\t\t\twant: &session.EventActions{\n\t\t\t\tStateDelta: map[string]any{\"key1\": \"overwritten\"},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"state delta merged with nested map values\",\n\t\t\tbase: &session.EventActions{\n\t\t\t\tStateDelta: map[string]any{\n\t\t\t\t\t\"outer\": map[string]any{\"key1\": \"value1\", \"key2\": \"value2\"},\n\t\t\t\t},\n\t\t\t},\n\t\t\tother: &session.EventActions{\n\t\t\t\tStateDelta: map[string]any{\n\t\t\t\t\t\"outer\": map[string]any{\"key2\": \"updated\", \"key3\": \"value3\"},\n\t\t\t\t},\n\t\t\t},\n\t\t\twant: &session.EventActions{\n\t\t\t\tStateDelta: map[string]any{\n\t\t\t\t\t\"outer\": map[string]any{\"key1\": \"value1\", \"key2\": \"updated\", \"key3\": \"value3\"},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"state delta merged with multiple keys from multiple tools\",\n\t\t\tbase: &session.EventActions{\n\t\t\t\tStateDelta: map[string]any{\"tool1_key\": \"tool1_value\"},\n\t\t\t},\n\t\t\tother: &session.EventActions{\n\t\t\t\tStateDelta: map[string]any{\"tool2_key\": \"tool2_value\", \"tool3_key\": \"tool3_value\"},\n\t\t\t},\n\t\t\twant: &session.EventActions{\n\t\t\t\tStateDelta: map[string]any{\n\t\t\t\t\t\"tool1_key\": \"tool1_value\",\n\t\t\t\t\t\"tool2_key\": \"tool2_value\",\n\t\t\t\t\t\"tool3_key\": \"tool3_value\",\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"base has nil state delta, other has values\",\n\t\t\tbase: &session.EventActions{\n\t\t\t\tSkipSummarization: true,\n\t\t\t},\n\t\t\tother: &session.EventActions{\n\t\t\t\tStateDelta: map[string]any{\"key1\": \"value1\"},\n\t\t\t},\n\t\t\twant: &session.EventActions{\n\t\t\t\tSkipSummarization: true,\n\t\t\t\tStateDelta:        map[string]any{\"key1\": \"value1\"},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"skip summarization merging - any true wins\",\n\t\t\tbase: &session.EventActions{\n\t\t\t\tSkipSummarization: false,\n\t\t\t},\n\t\t\tother: &session.EventActions{\n\t\t\t\tSkipSummarization: true,\n\t\t\t},\n\t\t\twant: &session.EventActions{\n\t\t\t\tSkipSummarization: true,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"escalate merging - any true wins\",\n\t\t\tbase: &session.EventActions{\n\t\t\t\tEscalate: false,\n\t\t\t},\n\t\t\tother: &session.EventActions{\n\t\t\t\tEscalate: true,\n\t\t\t},\n\t\t\twant: &session.EventActions{\n\t\t\t\tEscalate: true,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"transfer to agent - last wins\",\n\t\t\tbase: &session.EventActions{\n\t\t\t\tTransferToAgent: \"agent1\",\n\t\t\t},\n\t\t\tother: &session.EventActions{\n\t\t\t\tTransferToAgent: \"agent2\",\n\t\t\t},\n\t\t\twant: &session.EventActions{\n\t\t\t\tTransferToAgent: \"agent2\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"all fields merged correctly\",\n\t\t\tbase: &session.EventActions{\n\t\t\t\tStateDelta:        map[string]any{\"key1\": \"value1\"},\n\t\t\t\tSkipSummarization: false,\n\t\t\t\tTransferToAgent:   \"agent1\",\n\t\t\t\tEscalate:          false,\n\t\t\t},\n\t\t\tother: &session.EventActions{\n\t\t\t\tStateDelta:        map[string]any{\"key2\": \"value2\"},\n\t\t\t\tSkipSummarization: true,\n\t\t\t\tTransferToAgent:   \"agent2\",\n\t\t\t\tEscalate:          true,\n\t\t\t},\n\t\t\twant: &session.EventActions{\n\t\t\t\tStateDelta:        map[string]any{\"key1\": \"value1\", \"key2\": \"value2\"},\n\t\t\t\tSkipSummarization: true,\n\t\t\t\tTransferToAgent:   \"agent2\",\n\t\t\t\tEscalate:          true,\n\t\t\t},\n\t\t},\n\t}\n\n\tfor _, tc := range tests {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\tgot := mergeEventActions(tc.base, tc.other)\n\t\t\tif diff := cmp.Diff(tc.want, got); diff != \"\" {\n\t\t\t\tt.Errorf(\"mergeEventActions() mismatch (-want +got):\\n%s\", diff)\n\t\t\t}\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "internal/llminternal/basic_processor.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage llminternal\n\nimport (\n\t\"fmt\"\n\t\"iter\"\n\t\"reflect\"\n\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/agent\"\n\t\"google.golang.org/adk/model\"\n\t\"google.golang.org/adk/session\"\n)\n\n// basicRequestProcessor populates the LLMRequest\n// with the agent's LLM generation configs.\nfunc basicRequestProcessor(ctx agent.InvocationContext, req *model.LLMRequest, f *Flow) iter.Seq2[*session.Event, error] {\n\t// reference: adk-python src/google/adk/flows/llm_flows/basic.py\n\treturn func(yield func(*session.Event, error) bool) {\n\t\tllmAgent := asLLMAgent(ctx.Agent())\n\t\tif llmAgent == nil {\n\t\t\treturn // do nothing.\n\t\t}\n\n\t\tstate := llmAgent.internal()\n\n\t\treq.Config = clone(state.GenerateContentConfig)\n\t\tif req.Config == nil {\n\t\t\treq.Config = &genai.GenerateContentConfig{}\n\t\t}\n\n\t\t// Set OutputSchema directly if no tools are present or native combo support exists.\n\t\t// Otherwise, OutputSchemaRequestProcessor will be used to provide a tool-based workaround.\n\t\tif state.OutputSchema != nil && !needOutputSchemaProcessor(state) {\n\t\t\treq.Config.ResponseSchema = state.OutputSchema\n\t\t\treq.Config.ResponseMIMEType = \"application/json\"\n\t\t}\n\n\t\t// TODO: missing features\n\t\t//  populate LLMRequest LiveConnectConfig setting\n\t}\n}\n\n// clone returns a deep copy of the src.\n// NOTE: this does not work for types with unexported fields.\nfunc clone[M any](src M) M {\n\tval := reflect.ValueOf(src)\n\n\t// Handle nil pointers\n\tif val.Kind() == reflect.Pointer && val.IsNil() {\n\t\tvar zero M\n\t\treturn zero\n\t}\n\n\tsrcIsPointer := val.Kind() == reflect.Pointer\n\n\t// Dereference pointer to get the underlying value\n\tif srcIsPointer {\n\t\tval = val.Elem()\n\t}\n\n\t// Create a new instance of the same type\n\tnewVal := reflect.New(val.Type()).Elem()\n\n\t// Recursively copy fields\n\tdeepCopy(val, newVal)\n\n\t// Return as the original type\n\tif srcIsPointer {\n\t\treturn newVal.Addr().Interface().(M)\n\t}\n\treturn newVal.Interface().(M)\n}\n\n// deepCopy copies src to dst using reflect.\nfunc deepCopy(src, dst reflect.Value) {\n\tswitch src.Kind() {\n\tcase reflect.Struct:\n\t\tt := src.Type()\n\t\tfor i := 0; i < src.NumField(); i++ {\n\t\t\tif !t.Field(i).IsExported() {\n\t\t\t\tpanic(fmt.Sprintf(\"deepCopy: unexported field %q in type %q\", t.Field(i).Name, t.Name()))\n\t\t\t}\n\t\t\t// Create a copy of the field and set it on the destination struct\n\t\t\tfieldCopy := reflect.New(src.Field(i).Type()).Elem()\n\t\t\tdeepCopy(src.Field(i), fieldCopy)\n\t\t\tdst.Field(i).Set(fieldCopy)\n\t\t}\n\tcase reflect.Slice:\n\t\tif src.IsNil() {\n\t\t\treturn\n\t\t}\n\t\tdst.Set(reflect.MakeSlice(src.Type(), src.Len(), src.Cap()))\n\t\tfor i := 0; i < src.Len(); i++ {\n\t\t\t// Create a copy of each element and set it in the new slice\n\t\t\telemCopy := reflect.New(src.Index(i).Type()).Elem()\n\t\t\tdeepCopy(src.Index(i), elemCopy)\n\t\t\tdst.Index(i).Set(elemCopy)\n\t\t}\n\tcase reflect.Map:\n\t\tif src.IsNil() {\n\t\t\treturn\n\t\t}\n\t\tdst.Set(reflect.MakeMap(src.Type()))\n\t\tfor _, key := range src.MapKeys() {\n\t\t\t// Create copies of the key and value and set them in the new map\n\t\t\tkeyCopy := reflect.New(key.Type()).Elem()\n\t\t\tdeepCopy(key, keyCopy)\n\t\t\tvalCopy := reflect.New(src.MapIndex(key).Type()).Elem()\n\t\t\tdeepCopy(src.MapIndex(key), valCopy)\n\t\t\tdst.SetMapIndex(keyCopy, valCopy)\n\t\t}\n\tcase reflect.Pointer:\n\t\tif src.IsNil() {\n\t\t\treturn\n\t\t}\n\t\t// Create a new pointer and deep copy the underlying value\n\t\tnewPtr := reflect.New(src.Elem().Type())\n\t\tdeepCopy(src.Elem(), newPtr.Elem())\n\t\tdst.Set(newPtr)\n\tdefault:\n\t\t// For basic types, direct assignment is sufficient\n\t\tdst.Set(src)\n\t}\n}\n"
  },
  {
    "path": "internal/llminternal/clone_test.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage llminternal\n\nimport (\n\t\"reflect\"\n\t\"testing\"\n)\n\nfunc TestClone(t *testing.T) {\n\ttype testStruct struct {\n\t\tS  string\n\t\tI  int\n\t\tSl []string\n\t\tM  map[string]string\n\t\tP  *int\n\t\tN  *testStruct\n\t}\n\n\ttestData := func() *testStruct {\n\t\treturn &testStruct{\n\t\t\tS:  \"test\",\n\t\t\tI:  123,\n\t\t\tSl: []string{\"a\", \"b\"},\n\t\t\tM:  map[string]string{\"k\": \"v\"},\n\t\t\tP:  func() *int { i := 456; return &i }(),\n\t\t\tN: &testStruct{\n\t\t\t\tS: \"nested\",\n\t\t\t},\n\t\t}\n\t}\n\n\tcheck := func(t *testing.T, original, cloned *testStruct) {\n\t\tif !reflect.DeepEqual(original, cloned) {\n\t\t\tt.Errorf(\"clone() = %+v, want %+v\", cloned, original)\n\t\t}\n\n\t\t// Modify cloned and check if original is affected\n\t\tcloned.Sl[0] = \"c\"\n\t\tcloned.M[\"k\"] = \"v2\"\n\t\t*cloned.P = 789\n\t\tcloned.N.S = \"nested2\"\n\n\t\tif reflect.DeepEqual(original, cloned) {\n\t\t\tt.Errorf(\"clone() should not be affected by modifications to original\")\n\t\t}\n\t\tif original.Sl[0] != \"a\" {\n\t\t\tt.Errorf(\"original slice was modified\")\n\t\t}\n\t\tif original.M[\"k\"] != \"v\" {\n\t\t\tt.Errorf(\"original map was modified\")\n\t\t}\n\t\tif *original.P != 456 {\n\t\t\tt.Errorf(\"original pointer value was modified\")\n\t\t}\n\t\tif original.N.S != \"nested\" {\n\t\t\tt.Errorf(\"original nested struct was modified\")\n\t\t}\n\t}\n\n\tt.Run(\"pointer\", func(t *testing.T) {\n\t\toriginal := testData()\n\t\tcloned := clone(original)\n\t\tcheck(t, original, cloned)\n\t})\n\tt.Run(\"value\", func(t *testing.T) {\n\t\toriginal := testData()\n\t\tcloned := clone(*original)\n\t\tcheck(t, original, &cloned)\n\t})\n\tt.Run(\"interface\", func(t *testing.T) {\n\t\toriginal := testData()\n\t\tcloned := clone(any(original))\n\t\ttyped, ok := cloned.(*testStruct)\n\t\tif !ok {\n\t\t\tt.Fatalf(\"clone failed with interface: %v\", cloned)\n\t\t}\n\t\tcheck(t, original, typed)\n\t})\n}\n\nfunc TestCloneNil(t *testing.T) {\n\tvar original *int\n\tcloned := clone(original)\n\tif cloned != nil {\n\t\tt.Errorf(\"clone(nil) = %v, want nil\", cloned)\n\t}\n}\n\nfunc TestCloneUnexported(t *testing.T) {\n\ttype testStructUnexported struct {\n\t\ts string\n\t}\n\toriginal := &testStructUnexported{s: \"test\"}\n\n\tdefer func() {\n\t\tif r := recover(); r == nil {\n\t\t\tt.Errorf(\"clone() did not panic on unexported field\")\n\t\t}\n\t}()\n\tclone(original)\n}\n"
  },
  {
    "path": "internal/llminternal/contents_processor.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage llminternal\n\nimport (\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"iter\"\n\t\"reflect\"\n\t\"slices\"\n\t\"sort\"\n\t\"strings\"\n\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/agent\"\n\t\"google.golang.org/adk/internal/utils\"\n\t\"google.golang.org/adk/model\"\n\t\"google.golang.org/adk/session\"\n)\n\n// ContentRequestProcessor populates the LLMRequest's Contents based on\n// the InvocationContext that includes the previous events.\nfunc ContentsRequestProcessor(ctx agent.InvocationContext, req *model.LLMRequest, f *Flow) iter.Seq2[*session.Event, error] {\n\treturn func(yield func(*session.Event, error) bool) {\n\t\t// TODO: implement (adk-python src/google/adk/flows/llm_flows/contents.py) - extract function call results, etc.\n\t\tllmAgent := asLLMAgent(ctx.Agent())\n\t\tif llmAgent == nil {\n\t\t\t// Do nothing.\n\t\t\treturn // In python, no error is yielded.\n\t\t}\n\t\tfn := buildContentsDefault // \"\" or \"default\".\n\t\tif llmAgent.internal().IncludeContents == \"none\" {\n\t\t\t// Include current turn context only (no conversation history)\n\t\t\tfn = buildContentsCurrentTurnContextOnly\n\t\t}\n\t\tvar events []*session.Event\n\t\tif ctx.Session() != nil {\n\t\t\tfor e := range ctx.Session().Events().All() {\n\t\t\t\tevents = append(events, e)\n\t\t\t}\n\t\t}\n\t\tcontents, err := fn(ctx.Agent().Name(), ctx.Branch(), events)\n\t\tif err != nil {\n\t\t\tyield(nil, err)\n\t\t\treturn\n\t\t}\n\t\treq.Contents = append(req.Contents, contents...)\n\t}\n}\n\n// buildContentsDefault returns the contents for the LLM request by applying\n// filtering, rearrangement, and content processing to the given events.\nfunc buildContentsDefault(agentName, invocationBranch string, events []*session.Event) ([]*genai.Content, error) {\n\t// parse the events, leaving the contents and the function calls and responses from the current agent.\n\tvar filtered []*session.Event\n\tfor _, ev := range events {\n\t\tcontent := utils.Content(ev)\n\t\t// Skip events without content or generated neither by user nor\n\t\t// by model.\n\t\t// e.g. events purely for mutating session states.\n\t\tif content == nil || content.Role == \"\" || len(content.Parts) == 0 {\n\t\t\t// TODO: log a bad event with content but no Role is skipped\n\t\t\t// Note: python checks here if content.Parts[0] is an empty string and skip if so.\n\t\t\t// But unlike python that distinguishes None vs empty string, two cases are indistinguishable in Go.\n\t\t\tcontinue\n\t\t}\n\t\t// Skip events that do not belong to the current branch.\n\t\t// TODO: can we use a richer type for branch (e.g. []string) instead of using string prefix test?\n\t\tif !eventBelongsToBranch(invocationBranch, ev) {\n\t\t\tcontinue\n\t\t}\n\t\tif isAuthEvent(ev) {\n\t\t\tcontinue\n\t\t}\n\t\tif isOtherAgentReply(agentName, ev) {\n\t\t\tfiltered = append(filtered, ConvertForeignEvent(ev))\n\t\t} else {\n\t\t\tfiltered = append(filtered, ev)\n\t\t}\n\t}\n\n\t//  src/google/adk/flows/llm_flows/contents.py\n\t// \t - _rearrange_events_for_async_function_response\n\tfiltered, err := rearrangeEventsForLatestFunctionResponse(filtered)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\t//   - _rearrange_events_for_async_function_responses_in_history\n\tfiltered, err = rearrangeEventsForFunctionResponsesInHistory(filtered)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tvar contents []*genai.Content\n\tfor _, ev := range filtered {\n\t\tcontent := clone(utils.Content(ev))\n\t\tif content == nil {\n\t\t\tcontinue\n\t\t}\n\n\t\t// gemini 3 in streaming returns a last response with an empty part. We need to filter it out.\n\t\tcontent.Parts = slices.DeleteFunc(content.Parts, func(p *genai.Part) bool {\n\t\t\treturn p == nil || reflect.ValueOf(*p).IsZero()\n\t\t})\n\t\tif len(content.Parts) == 0 {\n\t\t\tcontinue\n\t\t}\n\n\t\tutils.RemoveClientFunctionCallID(content)\n\t\tcontents = append(contents, content)\n\t}\n\treturn contents, nil\n}\n\nfunc eventBelongsToBranch(invocationBranch string, event *session.Event) bool {\n\tif invocationBranch == \"\" || event.Branch == \"\" {\n\t\treturn true\n\t}\n\tif event.Branch == invocationBranch {\n\t\treturn true\n\t}\n\t// We use dot to delimit branch nodes. To avoid simple prefix match\n\t// (e.g. agent_0 unexpectedly matching agent_00), require either perfect branch\n\t// match, or match prefix with an additional explicit '.'\n\treturn strings.HasPrefix(invocationBranch, event.Branch+\".\")\n}\n\n// rearrangeEventsForLatestFunctionResponse\n// This function only acts if the very last event is a function response.\n// It searches backward for the matching call, deletes all intervening events,\n// and appends a single (merged) response.\n// If the latest function_response is for an async function_call, all events\n// between the initial function_call and the latest function_response will be removed.\nfunc rearrangeEventsForLatestFunctionResponse(events []*session.Event) ([]*session.Event, error) {\n\tif len(events) < 2 {\n\t\treturn events, nil\n\t}\n\n\tlastEvent := events[len(events)-1]\n\tlastResponses := utils.FunctionResponses(lastEvent.Content)\n\t// No need to process, since the latest event is not function_response.\n\tif len(lastResponses) == 0 {\n\t\treturn events, nil\n\t}\n\n\t// Create response id set\n\tresponseIDs := make(map[string]struct{})\n\tfor _, res := range lastResponses {\n\t\tresponseIDs[res.ID] = struct{}{}\n\t}\n\n\t// Check if its already in the correct position\n\tprevEvent := events[len(events)-2]\n\tprevCalls := utils.FunctionCalls(prevEvent.Content)\n\tif len(prevCalls) > 0 {\n\t\tfor _, call := range prevCalls {\n\t\t\tif _, found := responseIDs[call.ID]; found {\n\t\t\t\t// The latest response is already matched with the immediately\n\t\t\t\t// preceding call event. The history is clean. Nothing to do.\n\t\t\t\treturn events, nil\n\t\t\t}\n\t\t}\n\t}\n\n\tfunctionCallEventIdx := -1\n\tvar allCallIDsFromMatchingEvent map[string]struct{}\n\nSearchLoop: // A label to allow breaking out of the nested loop\n\tfor idx := len(events) - 2; idx >= 0; idx-- {\n\t\tevent := events[idx]\n\t\tcalls := utils.FunctionCalls(event.Content)\n\n\t\tif len(calls) > 0 {\n\t\t\tfor _, call := range calls {\n\t\t\t\tif _, found := responseIDs[call.ID]; found {\n\t\t\t\t\t// Match found. This is the event we're looking for.\n\t\t\t\t\tfunctionCallEventIdx = idx\n\n\t\t\t\t\t// Create a new set of all call IDs from this specific event\n\t\t\t\t\tallCallIDsFromMatchingEvent = make(map[string]struct{})\n\t\t\t\t\tfor _, c := range calls {\n\t\t\t\t\t\tallCallIDsFromMatchingEvent[c.ID] = struct{}{}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Validation check\n\t\t\t\t\t// last response event should only contain the responses for the\n\t\t\t\t\t// function calls in the same function call event\n\t\t\t\t\tfor respID := range responseIDs {\n\t\t\t\t\t\tif _, exists := allCallIDsFromMatchingEvent[respID]; !exists {\n\t\t\t\t\t\t\treturn nil, fmt.Errorf(\n\t\t\t\t\t\t\t\t\"validation failed: last response event has IDs not in the matching call event. Call IDs: %v, Response IDs: %v\",\n\t\t\t\t\t\t\t\tallCallIDsFromMatchingEvent, responseIDs,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Update the tracked IDs to be ALL IDs from the call event\n\t\t\t\t\tresponseIDs = allCallIDsFromMatchingEvent\n\n\t\t\t\t\t// Exit the search loop\n\t\t\t\t\tbreak SearchLoop\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tif functionCallEventIdx == -1 {\n\t\treturn nil, fmt.Errorf(\n\t\t\t\"no function call event found for function responses ids: %v\",\n\t\t\tresponseIDs,\n\t\t)\n\t}\n\n\t// Collect all function response events *between* the call and the last response.\n\tvar responseEventsToMerge []*session.Event\n\tfor i := functionCallEventIdx + 1; i < len(events)-1; i++ {\n\t\tevent := events[i]\n\t\tresponses := utils.FunctionResponses(event.Content)\n\t\tif len(responses) == 0 {\n\t\t\tcontinue\n\t\t}\n\n\t\t// Check if this event contains any response relevant to our call.\n\t\tisRelated := false\n\t\tfor _, res := range responses {\n\t\t\tif _, exists := responseIDs[res.ID]; exists {\n\t\t\t\tisRelated = true\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\n\t\tif isRelated {\n\t\t\tresponseEventsToMerge = append(responseEventsToMerge, event)\n\t\t}\n\t}\n\n\t// Add the final response event itself to the list to be merged.\n\tresponseEventsToMerge = append(responseEventsToMerge, events[len(events)-1])\n\n\tresultEvents := events[:functionCallEventIdx+1]\n\tmergedEvent, err := mergeFunctionResponseEvents(responseEventsToMerge)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tresultEvents = append(resultEvents, mergedEvent)\n\treturn resultEvents, nil\n}\n\n// rearrangeEventsForFunctionResponsesInHistory reorganizes an entire event history to ensure\n// every function call event is immediately followed by a single, consolidated\n// function response event.\n//\n// This function processes the whole slice of events to clean up and correctly\n// pair function calls with their corresponding responses, which is especially\n// useful for histories involving long running tool calls where\n// responses may not have originally been consecutive. It preserves all\n// non-tool-call events (like user messages) in their original order.\n//\n// It returns a new, correctly ordered slice of events or an error if the\n// history is malformed (e.g., a response is found without a corresponding call).\nfunc rearrangeEventsForFunctionResponsesInHistory(events []*session.Event) ([]*session.Event, error) {\n\tif len(events) < 2 {\n\t\treturn events, nil\n\t}\n\n\t// Create a map to store the index of the event containing each function response.\n\tcallIDToResponseEventIndex := make(map[string]int)\n\tfor i, event := range events {\n\t\tresponses := utils.FunctionResponses(event.Content)\n\n\t\tif len(responses) > 0 {\n\t\t\tfor _, res := range responses {\n\t\t\t\tcallIDToResponseEventIndex[res.ID] = i\n\t\t\t}\n\t\t}\n\t}\n\n\t// Rebuild the event list\n\tvar resultEvents []*session.Event\n\n\tfor _, event := range events {\n\t\t// If the event contains responses, skip it. It will be handled\n\t\t// when we process its corresponding call event.\n\t\tif len(utils.FunctionResponses(event.Content)) > 0 {\n\t\t\tcontinue\n\t\t}\n\n\t\tcalls := utils.FunctionCalls(event.Content)\n\t\tif len(calls) == 0 {\n\t\t\t// This is a regular event (e.g., user message). Just append it.\n\t\t\tresultEvents = append(resultEvents, event)\n\t\t} else {\n\t\t\t// This is a function call event, append it and search for responses\n\t\t\tresultEvents = append(resultEvents, event)\n\n\t\t\t// Find the unique indices of all corresponding response events.\n\t\t\t// Using a map[int]struct{} as a set.\n\t\t\tresponseEventIndicesSet := make(map[int]struct{})\n\t\t\tfor _, call := range calls {\n\t\t\t\tif index, found := callIDToResponseEventIndex[call.ID]; found {\n\t\t\t\t\tresponseEventIndicesSet[index] = struct{}{}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// If no responses were found for any calls in this event, continue.\n\t\t\tif len(responseEventIndicesSet) == 0 {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\t// If there's only one unique response event, append it directly.\n\t\t\tif len(responseEventIndicesSet) == 1 {\n\t\t\t\tfor index := range responseEventIndicesSet { // A trick to get the single key\n\t\t\t\t\tresultEvents = append(resultEvents, events[index])\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Multiple response events exist for that function call so we merge them.\n\t\t\t\t// Collect and sort the indices to process events in order.\n\t\t\t\tvar sortedIndices []int\n\t\t\t\tfor index := range responseEventIndicesSet {\n\t\t\t\t\tsortedIndices = append(sortedIndices, index)\n\t\t\t\t}\n\t\t\t\tsort.Ints(sortedIndices)\n\n\t\t\t\t// Collect the actual event objects to be merged.\n\t\t\t\teventsToMerge := make([]*session.Event, len(sortedIndices))\n\t\t\t\tfor i, index := range sortedIndices {\n\t\t\t\t\teventsToMerge[i] = events[index]\n\t\t\t\t}\n\n\t\t\t\t// Merge the events and append the single result.\n\t\t\t\tmergedEvent, err := mergeFunctionResponseEvents(eventsToMerge)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, fmt.Errorf(\"failed to merge response events: %w\", err)\n\t\t\t\t}\n\t\t\t\tresultEvents = append(resultEvents, mergedEvent)\n\t\t\t}\n\t\t}\n\t}\n\n\treturn resultEvents, nil\n}\n\n// mergeFunctionResponseEvents merges a list of function response events into one.\n//\n// Its key goal is to ensure that a function call event is followed by a\n// single, consolidated response event containing all relevant parts.\n//\n// The input `functionResponseEvents` must meet several requirements:\n//  1. The list must be sorted in increasing order of timestamp.\n//  2. The first event is treated as the initial \"base\" response event.\n//  3. All later events must contain at least one response part related\n//     to the original function call.\n//\n// The function returns a single merged event with the following properties:\n//  1. Function response parts from later events will replace any matching\n//     (by function call ID) response parts from the initial event.\n//  2. All non-function-response parts (e.g., text) are appended to the\n//     end of the part list.\n//\n// Caveat: This implementation doesn't support a parallel function call\n// event that contains async function calls of the same name.\nfunc mergeFunctionResponseEvents(functionResponseEvents []*session.Event) (*session.Event, error) {\n\tif len(functionResponseEvents) == 0 {\n\t\treturn nil, fmt.Errorf(\"at least one function_response event is required\")\n\t}\n\n\t// 1. Use the first event as the base\n\tmergedEvent := cloneEvent(functionResponseEvents[0])\n\tif mergedEvent == nil {\n\t\treturn nil, fmt.Errorf(\"mergedEvent based on the first event should not be nil\")\n\t}\n\tif mergedEvent.Content == nil {\n\t\treturn nil, fmt.Errorf(\"content for the first event should not be nil\")\n\t}\n\tpartsInMergedEvent := mergedEvent.LLMResponse.Content.Parts\n\n\tif len(partsInMergedEvent) == 0 {\n\t\treturn nil, fmt.Errorf(\"there should be at least one function_response part\")\n\t}\n\n\t// 2. Create an index (map) of function_response parts by their ID\n\tpartIndicesInMergedEvent := make(map[string]int)\n\tfor idx, part := range partsInMergedEvent {\n\t\tif part.FunctionResponse != nil {\n\t\t\tfunctionCallID := part.FunctionResponse.ID\n\t\t\tpartIndicesInMergedEvent[functionCallID] = idx\n\t\t}\n\t}\n\n\t// 3. Merge subsequent events\n\tfor _, event := range functionResponseEvents[1:] {\n\t\tif len(event.LLMResponse.Content.Parts) == 0 {\n\t\t\treturn nil, fmt.Errorf(\"event should contain at least one part\")\n\t\t}\n\n\t\t// 4. Update or Append parts\n\t\tfor _, part := range event.LLMResponse.Content.Parts {\n\t\t\tif part.FunctionResponse != nil {\n\t\t\t\tfunctionCallID := part.FunctionResponse.ID\n\t\t\t\t// If we've seen this response ID before, replace it\n\t\t\t\tif idx, found := partIndicesInMergedEvent[functionCallID]; found {\n\t\t\t\t\tpartsInMergedEvent[idx] = part\n\t\t\t\t} else {\n\t\t\t\t\t// Otherwise, append it and update the index\n\t\t\t\t\tpartsInMergedEvent = append(partsInMergedEvent, part)\n\t\t\t\t\tpartIndicesInMergedEvent[functionCallID] = len(partsInMergedEvent) - 1\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// If it's not a function response, just append it\n\t\t\t\tpartsInMergedEvent = append(partsInMergedEvent, part)\n\t\t\t}\n\t\t}\n\t}\n\n\t// Update the parts slice in the merged event in case it was reallocated\n\tmergedEvent.LLMResponse.Content.Parts = partsInMergedEvent\n\n\treturn mergedEvent, nil\n}\n\n// buildContentsCurrentTurnContextOnly returns contents for the current turn only (no conversation history).\n//\n// When include_contents='none', we want to include:\n//   - The current user input\n//   - Tool calls and responses from the current turn\n//\n// But exclude conversation history from previous turns.\n//\n//\tIn multi-agent scenarios, the \"current turn\" for an agent starts from an\n//\tactual user or from another agent.\nfunc buildContentsCurrentTurnContextOnly(agentName, branch string, events []*session.Event) ([]*genai.Content, error) {\n\t// Find the latest event that starts the current turn and process from there\n\tfor i := len(events) - 1; i >= 0; i-- {\n\t\tevent := events[i]\n\t\tif event.Author == \"user\" || isOtherAgentReply(agentName, event) {\n\t\t\treturn buildContentsDefault(agentName, branch, events[i:])\n\t\t}\n\t}\n\t// NOTE: in Python, it returns [] if there is no event authored by a user or another agent,\n\t// but that may be a bug.\n\treturn buildContentsDefault(agentName, branch, events)\n}\n\nfunc isOtherAgentReply(currentAgentName string, ev *session.Event) bool {\n\treturn ev.Author != currentAgentName && ev.Author != \"user\"\n}\n\n// ConvertForeignEvent converts an event authored by another agent as\n// a user-content event.\n// This is to provide another aget's output as context to the current agent,\n// so that the current agent can continue to respond, such as summarizing\n// the previous agent's reply, etc.\nfunc ConvertForeignEvent(ev *session.Event) *session.Event {\n\tcontent := utils.Content(ev)\n\tif content == nil || len(content.Parts) == 0 {\n\t\treturn ev\n\t}\n\n\tconverted := &genai.Content{\n\t\tRole:  \"user\",\n\t\tParts: []*genai.Part{{Text: \"For context:\"}},\n\t}\n\tfor _, p := range content.Parts {\n\t\tswitch {\n\t\tcase p.Text != \"\":\n\t\t\tconverted.Parts = append(converted.Parts, &genai.Part{\n\t\t\t\tText: fmt.Sprintf(\"[%s] said: %s\", ev.Author, p.Text),\n\t\t\t})\n\t\tcase p.FunctionCall != nil:\n\t\t\tconverted.Parts = append(converted.Parts, &genai.Part{\n\t\t\t\tText: fmt.Sprintf(\"[%s] called tool `%s` with parameters: %s\", ev.Author, p.FunctionCall.Name, stringify(p.FunctionCall.Args)),\n\t\t\t})\n\t\tcase p.FunctionResponse != nil:\n\t\t\tconverted.Parts = append(converted.Parts, &genai.Part{\n\t\t\t\tText: fmt.Sprintf(\"[%s] `%s` tool returned result: %v\", ev.Author, p.FunctionResponse.Name, stringify(p.FunctionResponse.Response)),\n\t\t\t})\n\t\tdefault: // fallback to the original part for non-text and non-functionCall parts.\n\t\t\tconverted.Parts = append(converted.Parts, p)\n\t\t}\n\t}\n\n\treturn &session.Event{ // made-up event. Don't go through types.NewEvent.\n\t\tTimestamp:   ev.Timestamp,\n\t\tAuthor:      \"user\",\n\t\tLLMResponse: model.LLMResponse{Content: converted},\n\t\tBranch:      ev.Branch,\n\t}\n}\n\nfunc stringify(v any) string {\n\ts, _ := json.Marshal(v)\n\treturn string(s)\n}\n\n// requestEUCFunctionCallName is a special function to handle credential\n// request.\nconst requestEUCFunctionCallName = \"adk_request_credential\"\n\nfunc isAuthEvent(ev *session.Event) bool {\n\tc := utils.Content(ev)\n\tif c == nil {\n\t\treturn false\n\t}\n\tfor _, p := range c.Parts {\n\t\tif p.FunctionCall != nil && p.FunctionCall.Name == requestEUCFunctionCallName {\n\t\t\treturn true\n\t\t}\n\t\tif p.FunctionResponse != nil && p.FunctionResponse.Name == requestEUCFunctionCallName {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\nfunc cloneEvent(e *session.Event) *session.Event {\n\tif e == nil {\n\t\treturn nil\n\t}\n\n\t// 1. Create a new Event instance\n\tnewEvent := &session.Event{\n\t\tID:           e.ID,\n\t\tTimestamp:    e.Timestamp,\n\t\tInvocationID: e.InvocationID,\n\t\tBranch:       e.Branch,\n\t\tAuthor:       e.Author,\n\t\tActions:      e.Actions,\n\t}\n\n\t// 2. Deep copy the LongRunningToolIDs slice\n\tif e.LongRunningToolIDs != nil {\n\t\tnewEvent.LongRunningToolIDs = make([]string, len(e.LongRunningToolIDs))\n\t\tcopy(newEvent.LongRunningToolIDs, e.LongRunningToolIDs)\n\t}\n\n\t// TODO check if copy parts is needed\n\t// 3. Deep copy the LLMResponse pointer struct and content\n\tif e.LLMResponse.Content != nil {\n\t\tnewEvent.LLMResponse.Content = &genai.Content{\n\t\t\tParts: make([]*genai.Part, len(e.LLMResponse.Content.Parts)),\n\t\t\tRole:  e.LLMResponse.Content.Role,\n\t\t}\n\t\tcopy(newEvent.LLMResponse.Content.Parts, e.LLMResponse.Content.Parts)\n\t}\n\n\treturn newEvent\n}\n"
  },
  {
    "path": "internal/llminternal/contents_processor_test.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage llminternal_test\n\nimport (\n\t\"iter\"\n\t\"slices\"\n\t\"strings\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/google/go-cmp/cmp\"\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/agent\"\n\t\"google.golang.org/adk/agent/llmagent\"\n\ticontext \"google.golang.org/adk/internal/context\"\n\t\"google.golang.org/adk/internal/llminternal\"\n\t\"google.golang.org/adk/internal/utils\"\n\t\"google.golang.org/adk/model\"\n\t\"google.golang.org/adk/session\"\n)\n\ntype testModel struct {\n\tmodel.LLM\n}\n\n// Test behavior around Agent's IncludeContents.\nfunc TestContentsRequestProcessor_IncludeContents(t *testing.T) {\n\tconst agentName = \"testAgent\"\n\ttestModel := &testModel{}\n\n\temptyEvent := []*session.Event{}\n\thelloAndGoodBye := []*session.Event{\n\t\t{\n\t\t\tAuthor: \"user\", // Not in the current turn in multi-agent scenario. See buildContentsCurrentTurnContextOnly.\n\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\tContent: genai.NewContentFromText(\"hello\", \"user\"),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tAuthor: \"user\",\n\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\tContent: genai.NewContentFromText(\"good bye\", \"user\"),\n\t\t\t},\n\t\t},\n\t}\n\tagentTransfer := []*session.Event{\n\t\t{\n\t\t\tAuthor: \"anotherAgent\", // History.\n\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\tContent: genai.NewContentFromFunctionCall(\"func1\", nil, \"model\"),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tAuthor: \"anotherAgent\",\n\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\tContent: genai.NewContentFromFunctionResponse(\"func1\", nil, \"user\"),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tAuthor: \"anotherAgent\", // Beginning of the current turn started by another agent.\n\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\tContent: genai.NewContentFromText(\"transfer to testAgent\", \"model\"),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tAuthor: agentName, // See python flows/llm_flows/base_llm_flow.py BaseLlmFlow._run_one_step_async.\n\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\tContent: genai.NewContentFromFunctionCall(\"func1\", nil, \"model\"),\n\t\t\t},\n\t\t},\n\t}\n\trobot := []*session.Event{\n\t\t{\n\t\t\tAuthor: agentName,\n\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\tContent: genai.NewContentFromText(\"do func1\", \"user\"),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tAuthor: agentName,\n\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\tContent: genai.NewContentFromFunctionCall(\"func1\", nil, \"model\"),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tAuthor: agentName,\n\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\tContent: genai.NewContentFromFunctionResponse(\"func1\", nil, \"user\"),\n\t\t\t},\n\t\t},\n\t}\n\n\tt.Parallel()\n\ttestCases := []struct {\n\t\tname            string\n\t\tincludeContents llmagent.IncludeContents\n\t\tevents          []*session.Event\n\t\twant            []*genai.Content\n\t}{\n\t\t{\n\t\t\tname:            \"empty\",\n\t\t\tincludeContents: \"default\",\n\t\t\tevents:          emptyEvent,\n\t\t},\n\t\t{\n\t\t\tname:            \"empty\",\n\t\t\tincludeContents: \"none\",\n\t\t\tevents:          emptyEvent,\n\t\t},\n\t\t{\n\t\t\tname:            \"helloAndGoodBye\",\n\t\t\tincludeContents: \"\",\n\t\t\tevents:          helloAndGoodBye,\n\t\t\twant: []*genai.Content{\n\t\t\t\tgenai.NewContentFromText(\"hello\", \"user\"),\n\t\t\t\tgenai.NewContentFromText(\"good bye\", \"user\"),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname:            \"helloAndGoodBye\",\n\t\t\tincludeContents: \"default\", // default == \"\"\n\t\t\tevents:          helloAndGoodBye,\n\t\t\twant: []*genai.Content{\n\t\t\t\tgenai.NewContentFromText(\"hello\", \"user\"),\n\t\t\t\tgenai.NewContentFromText(\"good bye\", \"user\"),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname:            \"helloAndGoodBye\",\n\t\t\tincludeContents: \"none\",\n\t\t\tevents:          helloAndGoodBye,\n\t\t\twant: []*genai.Content{\n\t\t\t\tgenai.NewContentFromText(\"good bye\", \"user\"),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname:            \"agentTransfer\",\n\t\t\tincludeContents: \"\",\n\t\t\tevents:          agentTransfer,\n\t\t\twant: []*genai.Content{\n\t\t\t\t// events from other agents are converted by convertForeignEvent.\n\t\t\t\t{\n\t\t\t\t\tParts: []*genai.Part{\n\t\t\t\t\t\t{Text: \"For context:\"},\n\t\t\t\t\t\t{Text: \"[anotherAgent] called tool `func1` with parameters: null\"},\n\t\t\t\t\t},\n\t\t\t\t\tRole: \"user\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tParts: []*genai.Part{\n\t\t\t\t\t\t{Text: \"For context:\"},\n\t\t\t\t\t\t{Text: \"[anotherAgent] `func1` tool returned result: null\"},\n\t\t\t\t\t},\n\t\t\t\t\tRole: \"user\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tParts: []*genai.Part{\n\t\t\t\t\t\t{Text: \"For context:\"},\n\t\t\t\t\t\t{Text: \"[anotherAgent] said: transfer to testAgent\"},\n\t\t\t\t\t},\n\t\t\t\t\tRole: \"user\",\n\t\t\t\t},\n\t\t\t\tgenai.NewContentFromFunctionCall(\"func1\", nil, \"model\"),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname:            \"agentTransfer\",\n\t\t\tincludeContents: \"none\",\n\t\t\tevents:          agentTransfer,\n\t\t\twant: []*genai.Content{\n\t\t\t\t{\n\t\t\t\t\tParts: []*genai.Part{\n\t\t\t\t\t\t{Text: \"For context:\"},\n\t\t\t\t\t\t{Text: \"[anotherAgent] said: transfer to testAgent\"},\n\t\t\t\t\t},\n\t\t\t\t\tRole: \"user\",\n\t\t\t\t},\n\t\t\t\tgenai.NewContentFromFunctionCall(\"func1\", nil, \"model\"),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname:            \"robot\",\n\t\t\tincludeContents: \"default\",\n\t\t\tevents:          robot,\n\t\t\twant: []*genai.Content{\n\t\t\t\tgenai.NewContentFromText(\"do func1\", \"user\"),\n\t\t\t\tgenai.NewContentFromFunctionCall(\"func1\", nil, \"model\"),\n\t\t\t\tgenai.NewContentFromFunctionResponse(\"func1\", nil, \"user\"),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname:            \"robot\",\n\t\t\tincludeContents: \"none\",\n\t\t\tevents:          robot,\n\t\t\twant: []*genai.Content{\n\t\t\t\tgenai.NewContentFromText(\"do func1\", \"user\"),\n\t\t\t\tgenai.NewContentFromFunctionCall(\"func1\", nil, \"model\"),\n\t\t\t\tgenai.NewContentFromFunctionResponse(\"func1\", nil, \"user\"),\n\t\t\t},\n\t\t},\n\t}\n\n\tfor _, tc := range testCases {\n\t\tt.Run(tc.name+\"/include_contents=\"+string(tc.includeContents), func(t *testing.T) {\n\t\t\ttestAgent := utils.Must(llmagent.New(llmagent.Config{\n\t\t\t\tName:            agentName,\n\t\t\t\tModel:           testModel,\n\t\t\t\tIncludeContents: tc.includeContents,\n\t\t\t}))\n\n\t\t\tctx := icontext.NewInvocationContext(t.Context(), icontext.InvocationContextParams{\n\t\t\t\tAgent: testAgent,\n\t\t\t\tSession: &fakeSession{\n\t\t\t\t\tevents: tc.events,\n\t\t\t\t},\n\t\t\t})\n\n\t\t\treq := &model.LLMRequest{}\n\t\t\tfor ev, err := range llminternal.ContentsRequestProcessor(ctx, req, &llminternal.Flow{}) {\n\t\t\t\tif ev != nil {\n\t\t\t\t\tt.Fatal(\"ContentsRequestProcessor generated an unexpected event\")\n\t\t\t\t}\n\t\t\t\tif err != nil {\n\t\t\t\t\tt.Fatalf(\"contentRequestProcessor failed: %v\", err)\n\t\t\t\t}\n\t\t\t}\n\t\t\tgot := req.Contents\n\t\t\tif diff := cmp.Diff(tc.want, got); diff != \"\" {\n\t\t\t\tt.Errorf(\"LLMRequest after contentsRequestProcessor mismatch (-want +got):\\n%s\", diff)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestContentsRequestProcessor(t *testing.T) {\n\tconst agentName = \"testAgent\"\n\ttestModel := &testModel{}\n\n\tt.Parallel()\n\ttestCases := []struct {\n\t\tname   string\n\t\tbranch string\n\t\tevents []*session.Event\n\t\twant   []*genai.Content\n\t}{\n\t\t{\n\t\t\tname:   \"NilEvent\",\n\t\t\tevents: nil,\n\t\t\twant:   nil,\n\t\t},\n\t\t{\n\t\t\tname:   \"EmptyEvents\",\n\t\t\tevents: []*session.Event{},\n\t\t\twant:   nil,\n\t\t},\n\t\t{\n\t\t\tname: \"UserAndAgentEvents\",\n\t\t\tevents: []*session.Event{\n\t\t\t\t{\n\t\t\t\t\tAuthor: \"user\",\n\t\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\t\tContent: genai.NewContentFromText(\"Hello\", \"user\"),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tAuthor: \"testAgent\",\n\t\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\t\tContent: genai.NewContentFromText(\"Hi there\", \"model\"),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twant: []*genai.Content{\n\t\t\t\tgenai.NewContentFromText(\"Hello\", \"user\"),\n\t\t\t\tgenai.NewContentFromText(\"Hi there\", \"model\"),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"anotherAgentEvent\",\n\t\t\tevents: []*session.Event{\n\t\t\t\t{\n\t\t\t\t\tAuthor: \"anotherAgent\",\n\t\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\t\tContent: genai.NewContentFromText(\"Foreign message\", \"model\"),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twant: []*genai.Content{\n\t\t\t\t{\n\t\t\t\t\tRole: \"user\",\n\t\t\t\t\tParts: []*genai.Part{\n\t\t\t\t\t\t{Text: \"For context:\"},\n\t\t\t\t\t\t{Text: \"[anotherAgent] said: Foreign message\"},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname:   \"FilterByBranch\",\n\t\t\tbranch: \"branch1.task1\",\n\t\t\tevents: []*session.Event{\n\t\t\t\t{\n\t\t\t\t\tAuthor: \"user\",\n\t\t\t\t\tBranch: \"branch1\",\n\t\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\t\tContent: genai.NewContentFromText(\"In branch 1\", \"user\"),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tAuthor: \"user\",\n\t\t\t\t\tBranch: \"branch1.task1\",\n\t\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\t\tContent: genai.NewContentFromText(\"In branch 1 and task 1\", \"user\"),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tAuthor: \"user\",\n\t\t\t\t\tBranch: \"branch12\",\n\t\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\t\tContent: genai.NewContentFromText(\"In branch 12\", \"user\"),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tAuthor: \"user\",\n\t\t\t\t\tBranch: \"branch2\",\n\t\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\t\tContent: genai.NewContentFromText(\"In branch 2\", \"user\"),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tAuthor: \"user\",\n\t\t\t\t\tBranch: \"\",\n\t\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\t\tContent: genai.NewContentFromText(\"empty branch\", \"user\"),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twant: []*genai.Content{\n\t\t\t\tgenai.NewContentFromText(\"In branch 1\", \"user\"),\n\t\t\t\tgenai.NewContentFromText(\"In branch 1 and task 1\", \"user\"),\n\t\t\t\tgenai.NewContentFromText(\"empty branch\", \"user\"),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"AuthEvent\",\n\t\t\tevents: []*session.Event{\n\t\t\t\t{\n\t\t\t\t\tAuthor: agentName,\n\t\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\t\tContent: &genai.Content{\n\t\t\t\t\t\t\tRole: \"model\",\n\t\t\t\t\t\t\tParts: []*genai.Part{\n\t\t\t\t\t\t\t\t{FunctionCall: &genai.FunctionCall{Name: \"adk_request_credential\"}},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twant: nil,\n\t\t},\n\t\t{\n\t\t\tname: \"EventWithoutContent\",\n\t\t\tevents: []*session.Event{\n\t\t\t\t{Author: \"user\"},\n\t\t\t},\n\t\t\twant: nil,\n\t\t},\n\t}\n\n\tfor _, tc := range testCases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\ttestAgent := utils.Must(llmagent.New(llmagent.Config{\n\t\t\t\tName:  \"testAgent\",\n\t\t\t\tModel: testModel,\n\t\t\t}))\n\n\t\t\tctx := icontext.NewInvocationContext(t.Context(), icontext.InvocationContextParams{\n\t\t\t\tAgent:  testAgent,\n\t\t\t\tBranch: tc.branch,\n\t\t\t\tSession: &fakeSession{\n\t\t\t\t\tevents: tc.events,\n\t\t\t\t},\n\t\t\t})\n\n\t\t\treq := &model.LLMRequest{}\n\t\t\tfor ev, err := range llminternal.ContentsRequestProcessor(ctx, req, &llminternal.Flow{}) {\n\t\t\t\tif ev != nil {\n\t\t\t\t\tt.Fatal(\"ContentsRequestProcessor generated an unexpected event\")\n\t\t\t\t}\n\t\t\t\tif err != nil {\n\t\t\t\t\tt.Fatalf(\"contentRequestProcessor failed: %v\", err)\n\t\t\t\t}\n\t\t\t}\n\t\t\tgot := req.Contents\n\t\t\tif diff := cmp.Diff(tc.want, got); diff != \"\" {\n\t\t\t\tt.Errorf(\"LLMRequest after contentRequestProcessor mismatch (-want +got):\\n%s\", diff)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestConvertForeignEvent(t *testing.T) {\n\tt.Parallel()\n\tnow := time.Now()\n\ttestCases := []struct {\n\t\tname  string\n\t\tevent *session.Event\n\t\twant  *session.Event\n\t}{\n\t\t{\n\t\t\tname: \"Text\",\n\t\t\tevent: &session.Event{\n\t\t\t\tTimestamp: now,\n\t\t\t\tAuthor:    \"foreign\",\n\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\tContent: genai.NewContentFromText(\"hello\", \"model\"),\n\t\t\t\t},\n\t\t\t\tBranch: \"b\",\n\t\t\t},\n\t\t\twant: &session.Event{\n\t\t\t\tTimestamp: now,\n\t\t\t\tAuthor:    \"user\",\n\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\tContent: &genai.Content{\n\t\t\t\t\t\tRole: \"user\",\n\t\t\t\t\t\tParts: []*genai.Part{\n\t\t\t\t\t\t\t{Text: \"For context:\"},\n\t\t\t\t\t\t\t{Text: \"[foreign] said: hello\"},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tBranch: \"b\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"FunctionCall\",\n\t\t\tevent: &session.Event{\n\t\t\t\tTimestamp: now,\n\t\t\t\tAuthor:    \"foreign\",\n\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\tContent: &genai.Content{\n\t\t\t\t\t\tRole: \"model\",\n\t\t\t\t\t\tParts: []*genai.Part{\n\t\t\t\t\t\t\t{FunctionCall: &genai.FunctionCall{Name: \"test\", Args: map[string]any{\"a\": \"b\"}}},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tBranch: \"b\",\n\t\t\t},\n\t\t\twant: &session.Event{\n\t\t\t\tTimestamp: now,\n\t\t\t\tAuthor:    \"user\",\n\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\tContent: &genai.Content{\n\t\t\t\t\t\tRole: \"user\",\n\t\t\t\t\t\tParts: []*genai.Part{\n\t\t\t\t\t\t\t{Text: \"For context:\"},\n\t\t\t\t\t\t\t{Text: \"[foreign] called tool `test` with parameters: {\\\"a\\\":\\\"b\\\"}\"},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tBranch: \"b\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"FunctionResponse\",\n\t\t\tevent: &session.Event{\n\t\t\t\tTimestamp: now,\n\t\t\t\tAuthor:    \"foreign\",\n\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\tContent: &genai.Content{\n\t\t\t\t\t\tRole: \"model\",\n\t\t\t\t\t\tParts: []*genai.Part{\n\t\t\t\t\t\t\t{FunctionResponse: &genai.FunctionResponse{Name: \"test\", Response: map[string]any{\"c\": \"d\"}}},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tBranch: \"b\",\n\t\t\t},\n\t\t\twant: &session.Event{\n\t\t\t\tTimestamp: now,\n\t\t\t\tAuthor:    \"user\",\n\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\tContent: &genai.Content{\n\t\t\t\t\t\tRole: \"user\",\n\t\t\t\t\t\tParts: []*genai.Part{\n\t\t\t\t\t\t\t{Text: \"For context:\"},\n\t\t\t\t\t\t\t{Text: \"[foreign] `test` tool returned result: {\\\"c\\\":\\\"d\\\"}\"},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tBranch: \"b\",\n\t\t\t},\n\t\t},\n\t}\n\n\tfor _, tc := range testCases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\tgot := llminternal.ConvertForeignEvent(tc.event)\n\t\t\tif diff := cmp.Diff(tc.want, got, cmp.AllowUnexported(genai.FunctionCall{}, genai.FunctionResponse{})); diff != \"\" {\n\t\t\t\tt.Errorf(\"convertForeignEvent() mismatch (-want +got):\\n%s\", diff)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestContentsRequestProcessor_NonLLMAgent(t *testing.T) {\n\ttestAgent := utils.Must(agent.New(agent.Config{\n\t\tName: \"test_agent\",\n\t}))\n\n\tctx := icontext.NewInvocationContext(t.Context(), icontext.InvocationContextParams{\n\t\tAgent: testAgent,\n\t})\n\n\treq := &model.LLMRequest{}\n\n\tfor ev, err := range llminternal.ContentsRequestProcessor(ctx, req, &llminternal.Flow{}) {\n\t\tif ev != nil {\n\t\t\tt.Fatal(\"ContentsRequestProcessor generated an unexpected event\")\n\t\t}\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"contentRequestProcessor failed: %v\", err)\n\t\t}\n\t}\n\tgot := req\n\twant := &model.LLMRequest{}\n\tif diff := cmp.Diff(want, got); diff != \"\" {\n\t\tt.Errorf(\"LLMRequest after contentRequestProcessor mismatch (-want +got):\\n%s\", diff)\n\t}\n}\n\nfunc TestContentsRequestProcessor_Rearrange(t *testing.T) {\n\tconst agentName = \"test_agent\"\n\ttestModel := &testModel{}\n\n\t// --- Reusable Test Data ---\n\t// Basic Call/Response\n\tfcBasic := &genai.FunctionCall{\n\t\tID:   \"call_123\",\n\t\tName: \"search_tool\",\n\t\tArgs: map[string]any{\"query\": \"test\"},\n\t}\n\tfrBasic := &genai.FunctionResponse{\n\t\tID:       \"call_123\",\n\t\tName:     \"search_tool\",\n\t\tResponse: map[string]any{\"results\": []string{\"item1\", \"item2\"}},\n\t}\n\n\t// LRO Call/Responses\n\tfcLRO := &genai.FunctionCall{\n\t\tID:   \"long_call_123\",\n\t\tName: \"long_running_tool\",\n\t\tArgs: map[string]any{\"task\": \"process\"},\n\t}\n\tfrLROInter := &genai.FunctionResponse{\n\t\tID:       \"long_call_123\",\n\t\tName:     \"long_running_tool\",\n\t\tResponse: map[string]any{\"status\": \"processing\", \"progress\": 50},\n\t}\n\tfrLROFinal := &genai.FunctionResponse{\n\t\tID:       \"long_call_123\",\n\t\tName:     \"long_running_tool\",\n\t\tResponse: map[string]any{\"status\": \"completed\", \"result\": \"done\"},\n\t}\n\n\t// Mixed LRO/Normal Calls/Responses\n\tfcLROMixed := &genai.FunctionCall{\n\t\tID:   \"lro_call_456\",\n\t\tName: \"long_running_tool\",\n\t\tArgs: map[string]any{\"task\": \"analyze\"},\n\t}\n\tfcNormalMixed := &genai.FunctionCall{\n\t\tID:   \"normal_call_789\",\n\t\tName: \"search_tool\",\n\t\tArgs: map[string]any{\"query\": \"test\"},\n\t}\n\tfrLROInterMixed := &genai.FunctionResponse{\n\t\tID:       \"lro_call_456\",\n\t\tName:     \"long_running_tool\",\n\t\tResponse: map[string]any{\"status\": \"processing\", \"progress\": 25},\n\t}\n\tfrNormalMixed := &genai.FunctionResponse{\n\t\tID:       \"normal_call_789\",\n\t\tName:     \"search_tool\",\n\t\tResponse: map[string]any{\"results\": []string{\"item1\", \"item2\"}},\n\t}\n\tfrLROFinalMixed := &genai.FunctionResponse{\n\t\tID:       \"lro_call_456\",\n\t\tName:     \"long_running_tool\",\n\t\tResponse: map[string]any{\"status\": \"completed\", \"analysis\": \"done\"},\n\t}\n\n\t// History LRO Call/Responses\n\tfcHistLRO := &genai.FunctionCall{\n\t\tID:   \"history_call_123\",\n\t\tName: \"long_running_tool\",\n\t\tArgs: map[string]any{\"task\": \"process\"},\n\t}\n\tfrHistLROInter := &genai.FunctionResponse{\n\t\tID:       \"history_call_123\",\n\t\tName:     \"long_running_tool\",\n\t\tResponse: map[string]any{\"status\": \"processing\", \"progress\": 50},\n\t}\n\tfrHistLROFinal := &genai.FunctionResponse{\n\t\tID:       \"history_call_123\",\n\t\tName:     \"long_running_tool\",\n\t\tResponse: map[string]any{\"status\": \"completed\", \"result\": \"done\"},\n\t}\n\n\t// History Mixed Call/Responses\n\tfcHistLROMixed := &genai.FunctionCall{\n\t\tID:   \"history_lro_123\",\n\t\tName: \"long_running_tool\",\n\t\tArgs: map[string]any{\"task\": \"analyze\"},\n\t}\n\tfcHistNormalMixed := &genai.FunctionCall{\n\t\tID:   \"history_normal_456\",\n\t\tName: \"search_tool\",\n\t\tArgs: map[string]any{\"query\": \"data\"},\n\t}\n\tfrHistLROInterMixed := &genai.FunctionResponse{\n\t\tID:       \"history_lro_123\",\n\t\tName:     \"long_running_tool\",\n\t\tResponse: map[string]any{\"status\": \"processing\", \"progress\": 30},\n\t}\n\tfrHistNormalMixed := &genai.FunctionResponse{\n\t\tID:       \"history_normal_456\",\n\t\tName:     \"search_tool\",\n\t\tResponse: map[string]any{\"results\": []string{\"result1\", \"result2\"}},\n\t}\n\tfrHistLROFinalMixed := &genai.FunctionResponse{\n\t\tID:       \"history_lro_123\",\n\t\tName:     \"long_running_tool\",\n\t\tResponse: map[string]any{\"status\": \"completed\", \"analysis\": \"finished\"},\n\t}\n\n\t// Preserve Content Call/Responses\n\tfcPreserve := &genai.FunctionCall{\n\t\tID:   \"preserve_test\",\n\t\tName: \"long_running_tool\",\n\t\tArgs: map[string]any{\"test\": \"value\"},\n\t}\n\tfrPreserveInter := &genai.FunctionResponse{\n\t\tID:       \"preserve_test\",\n\t\tName:     \"long_running_tool\",\n\t\tResponse: map[string]any{\"status\": \"processing\"},\n\t}\n\tfrPreserveFinal := &genai.FunctionResponse{\n\t\tID:       \"preserve_test\",\n\t\tName:     \"long_running_tool\",\n\t\tResponse: map[string]any{\"output\": \"preserved\"},\n\t}\n\n\t// Error Call/Response\n\tfrOrphaned := &genai.FunctionResponse{\n\t\tID:       \"no_matching_call\",\n\t\tName:     \"orphaned_tool\",\n\t\tResponse: map[string]any{\"error\": \"no matching call\"},\n\t}\n\n\t// --- Test Cases ---\n\ttestCases := []struct {\n\t\tname    string\n\t\tevents  []*session.Event\n\t\twant    []*genai.Content\n\t\twantErr string // Use string to check for specific error messages\n\t}{\n\t\t{\n\t\t\tname:   \"NilEvent\",\n\t\t\tevents: nil,\n\t\t\twant:   nil,\n\t\t},\n\t\t{\n\t\t\tname:   \"EmptyEvents\",\n\t\t\tevents: []*session.Event{},\n\t\t\twant:   nil,\n\t\t},\n\t\t{\n\t\t\tname: \"EventWithoutContent\",\n\t\t\tevents: []*session.Event{\n\t\t\t\t{Author: \"user\"},\n\t\t\t},\n\t\t\twant: nil,\n\t\t},\n\t\t{\n\t\t\tname: \"Basic function call no rearrangement\",\n\t\t\tevents: []*session.Event{\n\t\t\t\t{Author: \"user\", LLMResponse: model.LLMResponse{Content: genai.NewContentFromText(\"Search for test\", \"user\")}},\n\t\t\t\t{Author: agentName, LLMResponse: model.LLMResponse{Content: NewContentFromFunctionCall(fcBasic, \"model\")}},\n\t\t\t\t{Author: \"user\", LLMResponse: model.LLMResponse{Content: NewContentFromFunctionResponse(frBasic, \"user\")}},\n\t\t\t},\n\t\t\twant: []*genai.Content{\n\t\t\t\tgenai.NewContentFromText(\"Search for test\", \"user\"),\n\t\t\t\tNewContentFromFunctionCall(fcBasic, \"model\"),\n\t\t\t\tNewContentFromFunctionResponse(frBasic, \"user\"),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"Rearrangement with intermediate response\",\n\t\t\tevents: []*session.Event{\n\t\t\t\t{Author: \"user\", LLMResponse: model.LLMResponse{Content: genai.NewContentFromText(\"Run long process\", \"user\")}},\n\t\t\t\t{Author: agentName, LLMResponse: model.LLMResponse{Content: NewContentFromFunctionCall(fcLRO, \"model\")}},\n\t\t\t\t{Author: \"user\", LLMResponse: model.LLMResponse{Content: NewContentFromFunctionResponse(frLROInter, \"user\")}},\n\t\t\t\t{Author: agentName, LLMResponse: model.LLMResponse{Content: genai.NewContentFromText(\"Still processing...\", \"model\")}},\n\t\t\t\t{Author: \"user\", LLMResponse: model.LLMResponse{Content: NewContentFromFunctionResponse(frLROFinal, \"user\")}},\n\t\t\t},\n\t\t\twant: []*genai.Content{\n\t\t\t\tgenai.NewContentFromText(\"Run long process\", \"user\"),\n\t\t\t\tNewContentFromFunctionCall(fcLRO, \"model\"),\n\t\t\t\tNewContentFromFunctionResponse(frLROFinal, \"user\"),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"Rearrangement with mixed LRO and normal calls\",\n\t\t\tevents: []*session.Event{\n\t\t\t\t{Author: \"user\", LLMResponse: model.LLMResponse{Content: genai.NewContentFromText(\"Analyze data and search for info\", \"user\")}},\n\t\t\t\t{\n\t\t\t\t\tAuthor: agentName,\n\t\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\t\tContent: &genai.Content{\n\t\t\t\t\t\t\tRole:  \"model\",\n\t\t\t\t\t\t\tParts: []*genai.Part{{FunctionCall: fcLROMixed}, {FunctionCall: fcNormalMixed}},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tAuthor: \"user\",\n\t\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\t\tContent: &genai.Content{\n\t\t\t\t\t\t\tRole:  \"user\",\n\t\t\t\t\t\t\tParts: []*genai.Part{{FunctionResponse: frLROInterMixed}, {FunctionResponse: frNormalMixed}},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{Author: agentName, LLMResponse: model.LLMResponse{Content: genai.NewContentFromText(\"Analysis in progress, search completed\", \"model\")}},\n\t\t\t\t{Author: \"user\", LLMResponse: model.LLMResponse{Content: NewContentFromFunctionResponse(frLROFinalMixed, \"user\")}},\n\t\t\t},\n\t\t\twant: []*genai.Content{\n\t\t\t\tgenai.NewContentFromText(\"Analyze data and search for info\", \"user\"),\n\t\t\t\t{Role: \"model\", Parts: []*genai.Part{{FunctionCall: fcLROMixed}, {FunctionCall: fcNormalMixed}}},\n\t\t\t\t{Role: \"user\", Parts: []*genai.Part{{FunctionResponse: frLROFinalMixed}, {FunctionResponse: frNormalMixed}}},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"Rearrangement in history (non-final event)\",\n\t\t\tevents: []*session.Event{\n\t\t\t\t{Author: \"user\", LLMResponse: model.LLMResponse{Content: genai.NewContentFromText(\"Start long process\", \"user\")}},\n\t\t\t\t{Author: agentName, LLMResponse: model.LLMResponse{Content: NewContentFromFunctionCall(fcHistLRO, \"model\")}},\n\t\t\t\t{Author: \"user\", LLMResponse: model.LLMResponse{Content: NewContentFromFunctionResponse(frHistLROInter, \"user\")}},\n\t\t\t\t{Author: agentName, LLMResponse: model.LLMResponse{Content: genai.NewContentFromText(\"Still processing...\", \"model\")}},\n\t\t\t\t{Author: \"user\", LLMResponse: model.LLMResponse{Content: NewContentFromFunctionResponse(frHistLROFinal, \"user\")}},\n\t\t\t\t{Author: agentName, LLMResponse: model.LLMResponse{Content: genai.NewContentFromText(\"Process completed successfully!\", \"model\")}},\n\t\t\t\t{Author: \"user\", LLMResponse: model.LLMResponse{Content: genai.NewContentFromText(\"Great! What's next?\", \"user\")}},\n\t\t\t},\n\t\t\twant: []*genai.Content{\n\t\t\t\tgenai.NewContentFromText(\"Start long process\", \"user\"),\n\t\t\t\tNewContentFromFunctionCall(fcHistLRO, \"model\"),\n\t\t\t\tNewContentFromFunctionResponse(frHistLROFinal, \"user\"),\n\t\t\t\tgenai.NewContentFromText(\"Still processing...\", \"model\"),\n\t\t\t\tgenai.NewContentFromText(\"Process completed successfully!\", \"model\"),\n\t\t\t\tgenai.NewContentFromText(\"Great! What's next?\", \"user\"),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"Mixed rearrangement in history (non-final event)\",\n\t\t\tevents: []*session.Event{\n\t\t\t\t{Author: \"user\", LLMResponse: model.LLMResponse{Content: genai.NewContentFromText(\"Analyze and search simultaneously\", \"user\")}},\n\t\t\t\t{\n\t\t\t\t\tAuthor: agentName,\n\t\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\t\tContent: &genai.Content{\n\t\t\t\t\t\t\tRole:  \"model\",\n\t\t\t\t\t\t\tParts: []*genai.Part{{FunctionCall: fcHistLROMixed}, {FunctionCall: fcHistNormalMixed}},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tAuthor: \"user\",\n\t\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\t\tContent: &genai.Content{\n\t\t\t\t\t\t\tRole:  \"user\",\n\t\t\t\t\t\t\tParts: []*genai.Part{{FunctionResponse: frHistLROInterMixed}, {FunctionResponse: frHistNormalMixed}},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{Author: agentName, LLMResponse: model.LLMResponse{Content: genai.NewContentFromText(\"Analysis continuing, search done\", \"model\")}},\n\t\t\t\t{Author: \"user\", LLMResponse: model.LLMResponse{Content: NewContentFromFunctionResponse(frHistLROFinalMixed, \"user\")}},\n\t\t\t\t{Author: agentName, LLMResponse: model.LLMResponse{Content: genai.NewContentFromText(\"Both tasks completed successfully!\", \"model\")}},\n\t\t\t\t{Author: \"user\", LLMResponse: model.LLMResponse{Content: genai.NewContentFromText(\"Perfect! What should we do next?\", \"user\")}},\n\t\t\t},\n\t\t\twant: []*genai.Content{\n\t\t\t\tgenai.NewContentFromText(\"Analyze and search simultaneously\", \"user\"),\n\t\t\t\t{Role: \"model\", Parts: []*genai.Part{{FunctionCall: fcHistLROMixed}, {FunctionCall: fcHistNormalMixed}}},\n\t\t\t\t{Role: \"user\", Parts: []*genai.Part{{FunctionResponse: frHistLROFinalMixed}, {FunctionResponse: frHistNormalMixed}}},\n\t\t\t\tgenai.NewContentFromText(\"Analysis continuing, search done\", \"model\"),\n\t\t\t\tgenai.NewContentFromText(\"Both tasks completed successfully!\", \"model\"),\n\t\t\t\tgenai.NewContentFromText(\"Perfect! What should we do next?\", \"user\"),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"Rearrangement preserves mixed text parts\",\n\t\t\tevents: []*session.Event{\n\t\t\t\t{Author: \"user\", LLMResponse: model.LLMResponse{Content: genai.NewContentFromText(\"Before function call\", \"user\")}},\n\t\t\t\t{\n\t\t\t\t\tAuthor: agentName,\n\t\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\t\tContent: &genai.Content{\n\t\t\t\t\t\t\tRole:  \"model\",\n\t\t\t\t\t\t\tParts: []*genai.Part{{Text: \"I'll process this for you\"}, {FunctionCall: fcPreserve}},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tAuthor: \"user\",\n\t\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\t\tContent: &genai.Content{\n\t\t\t\t\t\t\tRole:  \"user\",\n\t\t\t\t\t\t\tParts: []*genai.Part{{Text: \"Intermediate prefix\"}, {FunctionResponse: frPreserveInter}, {Text: \"Processing...\"}},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{Author: agentName, LLMResponse: model.LLMResponse{Content: genai.NewContentFromText(\"Still working on it...\", \"model\")}},\n\t\t\t\t{\n\t\t\t\t\tAuthor: \"user\",\n\t\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\t\tContent: &genai.Content{\n\t\t\t\t\t\t\tRole:  \"user\",\n\t\t\t\t\t\t\tParts: []*genai.Part{{Text: \"Final prefix\"}, {FunctionResponse: frPreserveFinal}, {Text: \"Final suffix\"}},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twant: []*genai.Content{\n\t\t\t\tgenai.NewContentFromText(\"Before function call\", \"user\"),\n\t\t\t\t{Role: \"model\", Parts: []*genai.Part{{Text: \"I'll process this for you\"}, {FunctionCall: fcPreserve}}},\n\t\t\t\t{Role: \"user\", Parts: []*genai.Part{\n\t\t\t\t\t{Text: \"Intermediate prefix\"},\n\t\t\t\t\t{FunctionResponse: frPreserveFinal},\n\t\t\t\t\t{Text: \"Processing...\"},\n\t\t\t\t\t{Text: \"Final prefix\"},\n\t\t\t\t\t{Text: \"Final suffix\"},\n\t\t\t\t}},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"Error on function response without matching call\",\n\t\t\tevents: []*session.Event{\n\t\t\t\t{Author: \"user\", LLMResponse: model.LLMResponse{Content: &genai.Content{Role: \"user\", Parts: []*genai.Part{{Text: \"Regular message\"}}}}},\n\t\t\t\t{Author: \"user\", LLMResponse: model.LLMResponse{Content: &genai.Content{Role: \"user\", Parts: []*genai.Part{{FunctionResponse: frOrphaned}}}}},\n\t\t\t},\n\t\t\twant:    nil,\n\t\t\twantErr: \"no function call event found\",\n\t\t},\n\t}\n\n\tfor _, tc := range testCases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\ttestAgent := utils.Must(llmagent.New(llmagent.Config{\n\t\t\t\tName:  agentName,\n\t\t\t\tModel: testModel,\n\t\t\t}))\n\n\t\t\tctx := icontext.NewInvocationContext(t.Context(), icontext.InvocationContextParams{\n\t\t\t\tAgent: testAgent,\n\t\t\t\tSession: &fakeSession{\n\t\t\t\t\tevents: tc.events,\n\t\t\t\t},\n\t\t\t})\n\n\t\t\treq := &model.LLMRequest{}\n\t\t\tfor ev, err := range llminternal.ContentsRequestProcessor(ctx, req, &llminternal.Flow{}) {\n\t\t\t\tif ev != nil {\n\t\t\t\t\tt.Fatal(\"ContentsRequestProcessor generated an unexpected event\")\n\t\t\t\t}\n\t\t\t\tif tc.wantErr != \"\" {\n\t\t\t\t\tif err == nil {\n\t\t\t\t\t\tt.Fatal(\"ContentsRequestProcessor succeeded; expected an error\")\n\t\t\t\t\t}\n\t\t\t\t\tif !strings.Contains(err.Error(), tc.wantErr) {\n\t\t\t\t\t\tt.Errorf(\"Expected error to contain %q, got: %v\", tc.wantErr, err)\n\t\t\t\t\t}\n\t\t\t\t\treturn // Test is done\n\t\t\t\t}\n\n\t\t\t\tif err != nil {\n\t\t\t\t\tt.Fatalf(\"ContentsRequestProcessor failed: %v\", err)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tgot := req.Contents\n\t\t\tif diff := cmp.Diff(tc.want, got); diff != \"\" {\n\t\t\t\tt.Errorf(\"LLMRequest.Contents mismatch (-want +got):\\n%s\", diff)\n\t\t\t}\n\t\t})\n\t}\n}\n\n// NewContentFromFunctionCall creates a new Content struct with a single FunctionCall part.\n// It assigns the provided role to the Content.\nfunc NewContentFromFunctionCall(fc *genai.FunctionCall, role string) *genai.Content {\n\treturn &genai.Content{\n\t\tRole:  role,\n\t\tParts: []*genai.Part{{FunctionCall: fc}},\n\t}\n}\n\n// NewContentFromFunctionResponse creates a new Content struct with a single FunctionResponse part.\n// It assigns the provided role to the Content.\nfunc NewContentFromFunctionResponse(fr *genai.FunctionResponse, role string) *genai.Content {\n\treturn &genai.Content{\n\t\tRole:  role,\n\t\tParts: []*genai.Part{{FunctionResponse: fr}},\n\t}\n}\n\ntype fakeSession struct {\n\tevents []*session.Event\n}\n\nfunc (s *fakeSession) State() session.State {\n\treturn nil\n}\n\nfunc (s *fakeSession) Events() session.Events {\n\treturn s\n}\n\nfunc (s *fakeSession) ID() string {\n\treturn \"\"\n}\n\nfunc (s *fakeSession) AppName() string {\n\treturn \"\"\n}\n\nfunc (s *fakeSession) UserID() string {\n\treturn \"\"\n}\n\nfunc (s *fakeSession) LastUpdateTime() time.Time {\n\treturn time.Time{}\n}\n\nfunc (s *fakeSession) All() iter.Seq[*session.Event] {\n\treturn slices.Values(s.events)\n}\n\nfunc (s *fakeSession) Len() int {\n\treturn len(s.events)\n}\n\nfunc (s *fakeSession) At(i int) *session.Event {\n\treturn s.events[i]\n}\n\nvar (\n\t_ session.Session = (*fakeSession)(nil)\n\t_ session.Events  = (*fakeSession)(nil)\n)\n"
  },
  {
    "path": "internal/llminternal/converters/converters.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage converters\n\nimport (\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/model\"\n)\n\nfunc Genai2LLMResponse(res *genai.GenerateContentResponse) *model.LLMResponse {\n\tusageMetadata := res.UsageMetadata\n\tif len(res.Candidates) > 0 && res.Candidates[0] != nil {\n\t\tcandidate := res.Candidates[0]\n\t\tif (candidate.Content != nil && len(candidate.Content.Parts) > 0) || candidate.FinishReason == genai.FinishReasonStop {\n\t\t\treturn &model.LLMResponse{\n\t\t\t\tContent:           candidate.Content,\n\t\t\t\tGroundingMetadata: candidate.GroundingMetadata,\n\t\t\t\tFinishReason:      candidate.FinishReason,\n\t\t\t\tCitationMetadata:  candidate.CitationMetadata,\n\t\t\t\tAvgLogprobs:       candidate.AvgLogprobs,\n\t\t\t\tLogprobsResult:    candidate.LogprobsResult,\n\t\t\t\tUsageMetadata:     usageMetadata,\n\t\t\t\tModelVersion:      res.ModelVersion,\n\t\t\t}\n\t\t}\n\t\treturn &model.LLMResponse{\n\t\t\tErrorCode:         string(candidate.FinishReason),\n\t\t\tErrorMessage:      candidate.FinishMessage,\n\t\t\tGroundingMetadata: candidate.GroundingMetadata,\n\t\t\tFinishReason:      candidate.FinishReason,\n\t\t\tCitationMetadata:  candidate.CitationMetadata,\n\t\t\tAvgLogprobs:       candidate.AvgLogprobs,\n\t\t\tLogprobsResult:    candidate.LogprobsResult,\n\t\t\tUsageMetadata:     usageMetadata,\n\t\t\tModelVersion:      res.ModelVersion,\n\t\t}\n\t}\n\tif res.PromptFeedback != nil {\n\t\treturn &model.LLMResponse{\n\t\t\tErrorCode:     string(res.PromptFeedback.BlockReason),\n\t\t\tErrorMessage:  res.PromptFeedback.BlockReasonMessage,\n\t\t\tUsageMetadata: usageMetadata,\n\t\t\tModelVersion:  res.ModelVersion,\n\t\t}\n\t}\n\treturn &model.LLMResponse{\n\t\tErrorCode:     \"UNKNOWN_ERROR\",\n\t\tErrorMessage:  \"Unknown error.\",\n\t\tUsageMetadata: usageMetadata,\n\t\tModelVersion:  res.ModelVersion,\n\t}\n}\n"
  },
  {
    "path": "internal/llminternal/file_uploads_processor.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage llminternal\n\nimport (\n\t\"iter\"\n\n\t\"google.golang.org/adk/agent\"\n\t\"google.golang.org/adk/internal/llminternal/googlellm\"\n\t\"google.golang.org/adk/model\"\n\t\"google.golang.org/adk/session\"\n)\n\n// The Gemini API (non-Vertex) backend does not support the display_name parameter for file uploads,\n// so it must be removed to prevent request failures.\nfunc removeDisplayNameIfExists(ctx agent.InvocationContext, req *model.LLMRequest, f *Flow) iter.Seq2[*session.Event, error] {\n\treturn func(yield func(*session.Event, error) bool) {\n\t\tif req.Contents == nil {\n\t\t\treturn\n\t\t}\n\n\t\tllmAgent := asLLMAgent(ctx.Agent())\n\t\tif llmAgent == nil {\n\t\t\treturn\n\t\t}\n\n\t\tif !googlellm.IsGeminiAPIVariant(llmAgent.internal().Model) {\n\t\t\treturn\n\t\t}\n\n\t\tfor _, content := range req.Contents {\n\t\t\tif content.Parts == nil {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tfor _, part := range content.Parts {\n\t\t\t\tif part.InlineData != nil {\n\t\t\t\t\tpart.InlineData.DisplayName = \"\"\n\t\t\t\t}\n\t\t\t\tif part.FileData != nil {\n\t\t\t\t\tpart.FileData.DisplayName = \"\"\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "internal/llminternal/functions.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage llminternal\n\nimport (\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/agent\"\n\t\"google.golang.org/adk/internal/utils\"\n\t\"google.golang.org/adk/model\"\n\t\"google.golang.org/adk/session\"\n\t\"google.golang.org/adk/tool/toolconfirmation\"\n)\n\n// generateRequestConfirmationEvent creates a new Event containing\n// adk_request_confirmation function calls based on the requested confirmations.\n// NOTE: The trigger for this in ADK Go is usually a tool.Context.RequestConfirmation call,\n// not parsing a function_response_event like in the Python example.\n// This function assumes you have a list of confirmations to process.\nfunc generateRequestConfirmationEvent(\n\tinvocationContext agent.InvocationContext,\n\tfunctionCallEvent *session.Event,\n\tfunctionResponseEvent *session.Event,\n) *session.Event {\n\tif functionResponseEvent == nil || len(functionResponseEvent.Actions.RequestedToolConfirmations) == 0 {\n\t\treturn nil\n\t}\n\tif functionCallEvent == nil || functionCallEvent.Content == nil {\n\t\treturn nil\n\t}\n\n\tparts := []*genai.Part{}\n\tlongRunningToolIDs := []string{}\n\tfunctionCalls := make(map[string]*genai.FunctionCall, len(functionCallEvent.Content.Parts))\n\tfor _, call := range utils.FunctionCalls(functionCallEvent.Content) {\n\t\tfunctionCalls[call.ID] = call\n\t}\n\n\tfor funcID, confirmation := range functionResponseEvent.Actions.RequestedToolConfirmations {\n\t\toriginalFunctionCall, ok := functionCalls[funcID]\n\t\tif !ok || originalFunctionCall == nil {\n\t\t\tcontinue\n\t\t}\n\n\t\t// Prepare arguments for the adk_request_confirmation call\n\t\targs := map[string]any{\n\t\t\t\"originalFunctionCall\": originalFunctionCall,\n\t\t\t\"toolConfirmation\":     confirmation,\n\t\t}\n\n\t\trequestConfirmationFC := &genai.FunctionCall{\n\t\t\tID:   utils.GenerateFunctionCallID(),\n\t\t\tName: toolconfirmation.FunctionCallName,\n\t\t\tArgs: args,\n\t\t}\n\n\t\tparts = append(parts, &genai.Part{\n\t\t\tFunctionCall: requestConfirmationFC,\n\t\t})\n\t\tlongRunningToolIDs = append(longRunningToolIDs, requestConfirmationFC.ID)\n\t}\n\n\tif len(parts) == 0 {\n\t\treturn nil\n\t}\n\n\tev := session.NewEvent(invocationContext.InvocationID())\n\tev.Author = invocationContext.Agent().Name()\n\tev.Branch = invocationContext.Branch()\n\tev.LLMResponse = model.LLMResponse{\n\t\tContent: &genai.Content{\n\t\t\tParts: parts,\n\t\t\tRole:  genai.RoleModel,\n\t\t},\n\t}\n\tev.LongRunningToolIDs = longRunningToolIDs\n\treturn ev\n}\n"
  },
  {
    "path": "internal/llminternal/functions_test.go",
    "content": "// Copyright 2026 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage llminternal\n\nimport (\n\t\"testing\"\n\n\t\"github.com/google/go-cmp/cmp\"\n\t\"github.com/google/go-cmp/cmp/cmpopts\"\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/agent\"\n\t\"google.golang.org/adk/model\"\n\t\"google.golang.org/adk/session\"\n\t\"google.golang.org/adk/tool/toolconfirmation\"\n)\n\ntype mockAgent struct {\n\tagent.Agent\n\tname string\n}\n\nfunc (m *mockAgent) Name() string {\n\treturn m.name\n}\n\ntype mockInvocationContext struct {\n\tagent.InvocationContext\n\tinvocationID string\n\tagentName    string\n\tbranch       string\n}\n\nfunc (m *mockInvocationContext) InvocationID() string {\n\treturn m.invocationID\n}\n\nfunc (m *mockInvocationContext) Agent() agent.Agent {\n\treturn &mockAgent{name: m.agentName}\n}\n\nfunc (m *mockInvocationContext) Branch() string {\n\treturn m.branch\n}\n\nfunc TestGenerateRequestConfirmationEvent(t *testing.T) {\n\tconfirmingFunctionCall := &genai.FunctionCall{\n\t\tID:   \"call_1\",\n\t\tName: \"test_tool\",\n\t\tArgs: map[string]any{\"arg\": \"val\"},\n\t}\n\n\ttests := []struct {\n\t\tname                  string\n\t\tinvocationContext     agent.InvocationContext\n\t\tfunctionCallEvent     *session.Event\n\t\tfunctionResponseEvent *session.Event\n\t\twantEvent             *session.Event\n\t}{\n\t\t{\n\t\t\tname: \"no confirmation requested\",\n\t\t\tinvocationContext: &mockInvocationContext{\n\t\t\t\tinvocationID: \"inv_1\",\n\t\t\t\tagentName:    \"agent_1\",\n\t\t\t},\n\t\t\tfunctionCallEvent: &session.Event{\n\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\tContent: &genai.Content{\n\t\t\t\t\t\tParts: []*genai.Part{\n\t\t\t\t\t\t\t{FunctionCall: confirmingFunctionCall},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tfunctionResponseEvent: &session.Event{\n\t\t\t\tActions: session.EventActions{\n\t\t\t\t\tRequestedToolConfirmations: nil,\n\t\t\t\t},\n\t\t\t},\n\t\t\twantEvent: nil,\n\t\t},\n\t\t{\n\t\t\tname: \"confirmation requested but no matching function call\",\n\t\t\tinvocationContext: &mockInvocationContext{\n\t\t\t\tinvocationID: \"inv_1\",\n\t\t\t\tagentName:    \"agent_1\",\n\t\t\t},\n\t\t\tfunctionCallEvent: &session.Event{\n\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\tContent: &genai.Content{\n\t\t\t\t\t\tParts: []*genai.Part{\n\t\t\t\t\t\t\t{FunctionCall: &genai.FunctionCall{ID: \"other_call\"}},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tfunctionResponseEvent: &session.Event{\n\t\t\t\tActions: session.EventActions{\n\t\t\t\t\tRequestedToolConfirmations: map[string]toolconfirmation.ToolConfirmation{\n\t\t\t\t\t\t\"call_1\": {\n\t\t\t\t\t\t\tHint: \"Are you sure?\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twantEvent: nil,\n\t\t},\n\t\t{\n\t\t\tname: \"confirmation requested and matching function call\",\n\t\t\tinvocationContext: &mockInvocationContext{\n\t\t\t\tinvocationID: \"inv_1\",\n\t\t\t\tagentName:    \"agent_1\",\n\t\t\t\tbranch:       \"main\",\n\t\t\t},\n\t\t\tfunctionCallEvent: &session.Event{\n\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\tContent: &genai.Content{\n\t\t\t\t\t\tParts: []*genai.Part{\n\t\t\t\t\t\t\t{FunctionCall: confirmingFunctionCall},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tfunctionResponseEvent: &session.Event{\n\t\t\t\tActions: session.EventActions{\n\t\t\t\t\tRequestedToolConfirmations: map[string]toolconfirmation.ToolConfirmation{\n\t\t\t\t\t\t\"call_1\": {\n\t\t\t\t\t\t\tHint: \"Are you sure?\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twantEvent: &session.Event{\n\t\t\t\tInvocationID: \"inv_1\",\n\t\t\t\tAuthor:       \"agent_1\",\n\t\t\t\tBranch:       \"main\",\n\t\t\t\tActions: session.EventActions{\n\t\t\t\t\tStateDelta:    map[string]any{},\n\t\t\t\t\tArtifactDelta: map[string]int64{},\n\t\t\t\t},\n\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\tContent: &genai.Content{\n\t\t\t\t\t\tRole: genai.RoleModel,\n\t\t\t\t\t\tParts: []*genai.Part{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tFunctionCall: &genai.FunctionCall{\n\t\t\t\t\t\t\t\t\tName: toolconfirmation.FunctionCallName,\n\t\t\t\t\t\t\t\t\tArgs: map[string]any{\n\t\t\t\t\t\t\t\t\t\t\"originalFunctionCall\": confirmingFunctionCall,\n\t\t\t\t\t\t\t\t\t\t\"toolConfirmation\": toolconfirmation.ToolConfirmation{\n\t\t\t\t\t\t\t\t\t\t\tHint: \"Are you sure?\",\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tgot := generateRequestConfirmationEvent(tt.invocationContext, tt.functionCallEvent, tt.functionResponseEvent)\n\n\t\t\tif diff := cmp.Diff(tt.wantEvent, got,\n\t\t\t\tcmpopts.IgnoreFields(session.Event{}, \"Timestamp\", \"LongRunningToolIDs\", \"ID\"),\n\t\t\t\tcmpopts.IgnoreFields(genai.FunctionCall{}, \"ID\"), // Ignore generated IDs\n\t\t\t); diff != \"\" {\n\t\t\t\tt.Errorf(\"generateRequestConfirmationEvent() mismatch (-want +got):\\n%s\", diff)\n\t\t\t}\n\n\t\t\tif got != nil {\n\t\t\t\tfor _, s := range got.LongRunningToolIDs {\n\t\t\t\t\tif s == \"\" {\n\t\t\t\t\t\tt.Errorf(\"empty long running tool id\")\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n}\n\n// TestGenerateRequestConfirmationEventHasID verifies that the event returned\n// by generateRequestConfirmationEvent always has a non-empty ID.\n//\n// In Python ADK, every Event gets a UUID via model_post_init:\n//\n//\tdef model_post_init(self, __context):\n//\t    if not self.id:\n//\t        self.id = Event.new_id()   # str(uuid.uuid4())\n//\n// In Go ADK, events must be created with session.NewEvent() to get an ID.\n// A raw &session.Event{} literal leaves ID as \"\" which breaks features\n// that rely on event IDs (e.g. time-travel restart_from_event_id).\nfunc TestGenerateRequestConfirmationEventHasID(t *testing.T) {\n\tconfirmingFunctionCall := &genai.FunctionCall{\n\t\tID:   \"call_1\",\n\t\tName: \"test_tool\",\n\t\tArgs: map[string]any{\"arg\": \"val\"},\n\t}\n\n\tctx := &mockInvocationContext{\n\t\tinvocationID: \"inv_1\",\n\t\tagentName:    \"agent_1\",\n\t\tbranch:       \"main\",\n\t}\n\n\tfunctionCallEvent := &session.Event{\n\t\tLLMResponse: model.LLMResponse{\n\t\t\tContent: &genai.Content{\n\t\t\t\tParts: []*genai.Part{\n\t\t\t\t\t{FunctionCall: confirmingFunctionCall},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n\n\tfunctionResponseEvent := &session.Event{\n\t\tActions: session.EventActions{\n\t\t\tRequestedToolConfirmations: map[string]toolconfirmation.ToolConfirmation{\n\t\t\t\t\"call_1\": {\n\t\t\t\t\tHint: \"Are you sure?\",\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n\n\tgot := generateRequestConfirmationEvent(ctx, functionCallEvent, functionResponseEvent)\n\tif got == nil {\n\t\tt.Fatal(\"expected non-nil event\")\n\t}\n\n\tif got.ID == \"\" {\n\t\tt.Error(\"event ID is empty; events must have a UUID for time-travel and session lookup\")\n\t}\n\n\tif got.InvocationID != \"inv_1\" {\n\t\tt.Errorf(\"expected InvocationID=\\\"inv_1\\\", got %q\", got.InvocationID)\n\t}\n}\n"
  },
  {
    "path": "internal/llminternal/googlellm/variant.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage googlellm\n\nimport (\n\t\"regexp\"\n\t\"strconv\"\n\t\"strings\"\n\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/model\"\n)\n\nvar geminiModelVersionRegex = regexp.MustCompile(`^gemini-(\\d+(\\.\\d+)?)`)\n\n// GetGoogleLLMVariant returns the Google LLM variant used (GeminiAPI or VertexAI).\nfunc GetGoogleLLMVariant(llm model.LLM) genai.Backend {\n\ti, ok := llm.(GoogleLLM)\n\tif !ok {\n\t\treturn genai.BackendUnspecified\n\t}\n\treturn i.GetGoogleLLMVariant()\n}\n\n// GoogleLLM is an interface which allows to distinguish between Vertex AI and Gemini API models.\ntype GoogleLLM interface {\n\tGetGoogleLLMVariant() genai.Backend\n}\n\n// IsGeminiModel returns true if the model is a Gemini model.\nfunc IsGeminiModel(model string) bool {\n\treturn strings.HasPrefix(extractModelName(model), \"gemini-\")\n}\n\n// IsGemini25OrLower returns true if the model is a Gemini 2.5 or less.\n// These models do not support output schema with tools natively, so we need to use a processor to handle it.\nfunc IsGemini25OrLower(model string) bool {\n\tmodel = extractModelName(model)\n\t// extract the model version from model name - e.g. turn gemini-2.5-flash or gemini-2.5-flash-lite into 2.5\n\tmatches := geminiModelVersionRegex.FindStringSubmatch(model)\n\tif len(matches) < 2 {\n\t\treturn false\n\t}\n\tversion, err := strconv.ParseFloat(matches[1], 64)\n\tif err != nil {\n\t\treturn false\n\t}\n\treturn version <= 2.5\n}\n\n// IsGeminiAPIVariant returns true if the model is a Gemini API model (not Vertex AI).\nfunc IsGeminiAPIVariant(llm model.LLM) bool {\n\treturn GetGoogleLLMVariant(llm) == genai.BackendGeminiAPI\n}\n\n// NeedsOutputSchemaProcessor returns true if the Gemini model doesn't support output schema with tools natively and requires a processor to handle it.\n// Only Gemini 2.5 models and lower and only in Gemini API don't support natively, so we enable the processor for them.\nfunc NeedsOutputSchemaProcessor(llm model.LLM) bool {\n\tif llm == nil {\n\t\treturn false\n\t}\n\treturn IsGeminiModel(llm.Name()) && IsGeminiAPIVariant(llm) && IsGemini25OrLower(llm.Name())\n}\n\nfunc extractModelName(model string) string {\n\tmodelstring := model[strings.LastIndex(model, \"/\")+1:]\n\treturn strings.ToLower(modelstring)\n}\n"
  },
  {
    "path": "internal/llminternal/googlellm/variant_test.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage googlellm\n\nimport (\n\t\"testing\"\n\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/model\"\n)\n\nfunc TestIsGemini25OrLower(t *testing.T) {\n\ttestCases := []struct {\n\t\tmodel string\n\t\twant  bool\n\t}{\n\t\t{\"gemini-1.5-pro\", true},\n\t\t{\"gemini-2.0-flash\", true},\n\t\t{\"gemini-2.5-flash-lite\", true},\n\t\t{\"gemini-2.0-flash-exp\", true},\n\t\t{\"gemini-1.0-pro\", true},\n\t\t{\"projects/p/locations/l/models/gemini-2.0-flash\", true},\n\t\t{\"models/gemini-1.5-pro\", true},\n\t\t{\"not-a-gemini-model\", false},\n\t\t{\"gemini-2\", true},\n\t\t{\"gemini-3.0\", false},\n\t\t{\"gemini-3-pro\", false},\n\t}\n\n\tfor _, tc := range testCases {\n\t\tgot := IsGemini25OrLower(tc.model)\n\t\tif got != tc.want {\n\t\t\tt.Errorf(\"IsGemini25OrLower(%q) = %v, want %v\", tc.model, got, tc.want)\n\t\t}\n\t}\n}\n\nfunc TestIsGeminiModel(t *testing.T) {\n\ttestCases := []struct {\n\t\tmodel string\n\t\twant  bool\n\t}{\n\t\t{\"gemini-1.5-pro\", true},\n\t\t{\"models/gemini-2.0-flash\", true},\n\t\t{\"claud-3.5-sonnet\", false},\n\t}\n\n\tfor _, tc := range testCases {\n\t\tgot := IsGeminiModel(tc.model)\n\t\tif got != tc.want {\n\t\t\tt.Errorf(\"IsGeminiModel(%q) = %v, want %v\", tc.model, got, tc.want)\n\t\t}\n\t}\n}\n\nfunc TestNeedsOutputSchemaProcessor(t *testing.T) {\n\ttestCases := []struct {\n\t\tname    string\n\t\tmodel   string\n\t\tvariant genai.Backend\n\t\twant    bool\n\t}{\n\t\t{\"Gemini2.0_Vertex\", \"gemini-2.0-flash\", genai.BackendVertexAI, false},\n\t\t{\"Gemini2.0_GeminiAPI\", \"gemini-2.0-flash\", genai.BackendGeminiAPI, true},\n\t\t{\"NonGemini_Vertex\", \"not-a-gemini\", genai.BackendVertexAI, false},\n\t\t{\"Gemini3.0_GeminiAPI\", \"gemini-3.0\", genai.BackendGeminiAPI, false},\n\t\t{\"Gemini3.0_Vertex\", \"gemini-3.0\", genai.BackendVertexAI, false},\n\t\t{\"CustomGemini2\", \"gemini-2.0-hack\", genai.BackendUnspecified, false},\n\t\t{\"CustomGemini3\", \"gemini-3.0-hack\", genai.BackendUnspecified, false},\n\t}\n\n\tfor _, tc := range testCases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\tgot := NeedsOutputSchemaProcessor(&mockGoogleLLM{\n\t\t\t\tvariant: tc.variant,\n\t\t\t\tnameVal: tc.model,\n\t\t\t})\n\t\t\tif got != tc.want {\n\t\t\t\tt.Errorf(\"NeedsOutputSchemaProcessor(%q) = %v, want %v\", tc.model, got, tc.want)\n\t\t\t}\n\t\t})\n\t}\n}\n\ntype mockGoogleLLM struct {\n\tmodel.LLM\n\tvariant genai.Backend\n\tnameVal string\n}\n\nfunc (m *mockGoogleLLM) GetGoogleLLMVariant() genai.Backend {\n\treturn m.variant\n}\n\nfunc (m *mockGoogleLLM) Name() string {\n\treturn m.nameVal\n}\n\nvar _ GoogleLLM = (*mockGoogleLLM)(nil)\n"
  },
  {
    "path": "internal/llminternal/handle_function_calls_async_test.go",
    "content": "// Copyright 2026 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage llminternal_test\n\nimport (\n\t\"context\"\n\t\"iter\"\n\t\"testing\"\n\t\"time\"\n\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/agent\"\n\t\"google.golang.org/adk/agent/llmagent\"\n\t\"google.golang.org/adk/model\"\n\t\"google.golang.org/adk/runner\"\n\t\"google.golang.org/adk/session\"\n\t\"google.golang.org/adk/tool\"\n\t\"google.golang.org/adk/tool/functiontool\"\n)\n\ntype SleepArgs struct {\n\tDurationMS int `json:\"duration_ms\"`\n}\ntype SleepResult struct {\n\tSuccess bool `json:\"success\"`\n}\n\nfunc sleepFunc(ctx tool.Context, input SleepArgs) (SleepResult, error) {\n\ttime.Sleep(time.Duration(input.DurationMS) * time.Millisecond)\n\treturn SleepResult{Success: true}, nil\n}\n\n// mockModel is a simple mock model that returns parallel tool calls.\ntype mockModel struct {\n\tmodel.LLM\n\tCalls int\n}\n\nfunc (m *mockModel) Name() string {\n\treturn \"mock-model\"\n}\n\nfunc (m *mockModel) GenerateContent(ctx context.Context, req *model.LLMRequest, useStream bool) iter.Seq2[*model.LLMResponse, error] {\n\treturn func(yield func(*model.LLMResponse, error) bool) {\n\t\tm.Calls++\n\t\tif m.Calls > 1 {\n\t\t\t// Second call should be the final response after tool execution.\n\t\t\t// Or we just return a final response if we don't want to loop.\n\t\t\t// For this test, we just need to trigger the tool calls once.\n\t\t\tyield(&model.LLMResponse{\n\t\t\t\tContent: &genai.Content{\n\t\t\t\t\tParts: []*genai.Part{\n\t\t\t\t\t\tgenai.NewPartFromText(\"I am done.\"),\n\t\t\t\t\t},\n\t\t\t\t\tRole: \"model\",\n\t\t\t\t},\n\t\t\t\tPartial: false,\n\t\t\t}, nil)\n\t\t\treturn\n\t\t}\n\n\t\t// First call returns parallel tool calls.\n\t\tyield(&model.LLMResponse{\n\t\t\tContent: &genai.Content{\n\t\t\t\tParts: []*genai.Part{\n\t\t\t\t\t{\n\t\t\t\t\t\tFunctionCall: &genai.FunctionCall{\n\t\t\t\t\t\t\tID:   \"call_1\",\n\t\t\t\t\t\t\tName: \"sleep\",\n\t\t\t\t\t\t\tArgs: map[string]any{\"duration_ms\": 500},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tFunctionCall: &genai.FunctionCall{\n\t\t\t\t\t\t\tID:   \"call_2\",\n\t\t\t\t\t\t\tName: \"sleep\",\n\t\t\t\t\t\t\tArgs: map[string]any{\"duration_ms\": 500},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tFunctionCall: &genai.FunctionCall{\n\t\t\t\t\t\t\tID:   \"call_3\",\n\t\t\t\t\t\t\tName: \"sleep\",\n\t\t\t\t\t\t\tArgs: map[string]any{\"duration_ms\": 500},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tRole: \"model\",\n\t\t\t},\n\t\t\tPartial: false,\n\t\t}, nil)\n\t}\n}\n\nfunc TestHandleFunctionCallsAsync(t *testing.T) {\n\tsleepTool, err := functiontool.New(functiontool.Config{\n\t\tName:        \"sleep\",\n\t\tDescription: \"sleeps for a duration\",\n\t}, sleepFunc)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\tmodel := &mockModel{}\n\n\ta, err := llmagent.New(llmagent.Config{\n\t\tName:        \"tester\",\n\t\tDescription: \"Tester agent\",\n\t\tInstruction: \"You are a tester agent.\",\n\t\tModel:       model,\n\t\tTools: []tool.Tool{\n\t\t\tsleepTool,\n\t\t},\n\t})\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\tsessionService := session.InMemoryService()\n\t_, err = sessionService.Create(t.Context(), &session.CreateRequest{\n\t\tAppName:   \"testApp\",\n\t\tUserID:    \"testUser\",\n\t\tSessionID: \"testSession\",\n\t})\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\tr, err := runner.New(runner.Config{\n\t\tAgent:          a,\n\t\tSessionService: sessionService,\n\t\tAppName:        \"testApp\",\n\t})\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\tstartTime := time.Now()\n\n\tit := r.Run(t.Context(), \"testUser\", \"testSession\", &genai.Content{\n\t\tParts: []*genai.Part{\n\t\t\tgenai.NewPartFromText(\"Test sleep\"),\n\t\t},\n\t\tRole: \"user\",\n\t}, agent.RunConfig{StreamingMode: agent.StreamingModeSSE})\n\n\tevents := []*session.Event{}\n\tfor ev, err := range it {\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\tevents = append(events, ev)\n\t}\n\tif len(events) != 3 {\n\t\tt.Errorf(\"Expected 3 events, got %d\", len(events))\n\t}\n\n\telapsed := time.Since(startTime)\n\tt.Logf(\"Elapsed time: %v\", elapsed)\n\n\tif len(events[0].Content.Parts) != 3 {\n\t\tt.Errorf(\"Expected first event to have 3 function calls, got %d\", len(events[0].Content.Parts))\n\t}\n\tif len(events[1].Content.Parts) != 3 {\n\t\tt.Errorf(\"Expected second event to have 3 function responses, got %d\", len(events[1].Content.Parts))\n\t}\n\tif len(events[2].Content.Parts) != 1 {\n\t\tt.Errorf(\"Expected third event to have 1 text part got %d\", len(events[2].Content.Parts))\n\t}\n\n\t// Since we are calling sleep 3 times for 500ms each, synchronous execution would take\n\t// ~1500ms, while asynchronous execution should take ~500ms.\n\t// We assert that the time is significantly less than 1500ms to verify async.\n\t// We also assert it's at least 500ms.\n\n\tif elapsed < 500*time.Millisecond {\n\t\tt.Errorf(\"Elapsed time %v is less than expected 500ms\", elapsed)\n\t}\n\n\tif elapsed > 1000*time.Millisecond {\n\t\tt.Errorf(\"Elapsed time %v is greater than expected 1000ms for async execution\", elapsed)\n\t}\n}\n"
  },
  {
    "path": "internal/llminternal/helpers_test.go",
    "content": "// Copyright 2026 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage llminternal\n\nimport (\n\t\"google.golang.org/adk/agent\"\n)\n\n// mockLLMAgent satisfies both agent.Agent (via embedding) and llminternal.Agent (via internal() implementation)\ntype mockLLMAgent struct {\n\tagent.Agent\n\ts *State\n}\n\nvar _ Agent = (*mockLLMAgent)(nil)\n\nfunc (m *mockLLMAgent) internal() *State {\n\treturn m.s\n}\n"
  },
  {
    "path": "internal/llminternal/identity_request_processor.go",
    "content": "// Copyright 2026 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage llminternal\n\nimport (\n\t\"fmt\"\n\t\"iter\"\n\t\"strings\"\n\n\t\"google.golang.org/adk/agent\"\n\t\"google.golang.org/adk/internal/utils\"\n\t\"google.golang.org/adk/model\"\n\t\"google.golang.org/adk/session\"\n)\n\n// identityRequestProcessor gives the agent identity from the framework.\nfunc identityRequestProcessor(ctx agent.InvocationContext, req *model.LLMRequest, f *Flow) iter.Seq2[*session.Event, error] {\n\treturn func(yield func(*session.Event, error) bool) {\n\t\tllmAgent := asLLMAgent(ctx.Agent())\n\t\tif llmAgent == nil {\n\t\t\treturn // do nothing.\n\t\t}\n\n\t\tparts := []string{fmt.Sprintf(\"You are an agent. Your internal name is %q.\", ctx.Agent().Name())}\n\t\tif description := ctx.Agent().Description(); description != \"\" {\n\t\t\tparts = append(parts, fmt.Sprintf(\"The description about you is %q.\", description))\n\t\t}\n\t\tsi := strings.Join(parts, \" \")\n\n\t\tutils.AppendInstructions(req, si)\n\t}\n}\n"
  },
  {
    "path": "internal/llminternal/identity_request_processor_test.go",
    "content": "// Copyright 2026 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage llminternal\n\nimport (\n\t\"strings\"\n\t\"testing\"\n\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/agent\"\n\ticontext \"google.golang.org/adk/internal/context\"\n\t\"google.golang.org/adk/internal/utils\"\n\t\"google.golang.org/adk/model\"\n)\n\nfunc TestIdentityRequestProcessor(t *testing.T) {\n\tt.Parallel()\n\n\ttests := []struct {\n\t\tname           string\n\t\tagent          agent.Agent\n\t\texistingSI     *genai.Content\n\t\twantContains   []string\n\t\twantNotContain []string\n\t\twantNoSI       bool\n\t}{\n\t\t{\n\t\t\tname: \"InjectsNameOnly\",\n\t\t\tagent: &mockLLMAgent{\n\t\t\t\tAgent: utils.Must(agent.New(agent.Config{Name: \"test_agent\"})),\n\t\t\t\ts:     &State{},\n\t\t\t},\n\t\t\twantContains: []string{\n\t\t\t\t\"You are an agent.\",\n\t\t\t\t\"Your internal name is \\\"test_agent\\\".\",\n\t\t\t},\n\t\t\twantNotContain: []string{\n\t\t\t\t\"The description about you is\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"InjectsNameAndDescription\",\n\t\t\tagent: &mockLLMAgent{\n\t\t\t\tAgent: utils.Must(agent.New(agent.Config{\n\t\t\t\t\tName:        \"helper_agent\",\n\t\t\t\t\tDescription: \"A helpful assistant that answers questions\",\n\t\t\t\t})),\n\t\t\t\ts: &State{},\n\t\t\t},\n\t\t\twantContains: []string{\n\t\t\t\t\"You are an agent.\",\n\t\t\t\t\"Your internal name is \\\"helper_agent\\\".\",\n\t\t\t\t\"The description about you is \\\"A helpful assistant that answers questions\\\".\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname:     \"NoOpForNonLLMAgent\",\n\t\t\tagent:    utils.Must(agent.New(agent.Config{Name: \"plain_agent\"})),\n\t\t\twantNoSI: true,\n\t\t},\n\t\t{\n\t\t\tname: \"EmptyDescription\",\n\t\t\tagent: &mockLLMAgent{\n\t\t\t\tAgent: utils.Must(agent.New(agent.Config{\n\t\t\t\t\tName:        \"empty_desc_agent\",\n\t\t\t\t\tDescription: \"\",\n\t\t\t\t})),\n\t\t\t\ts: &State{},\n\t\t\t},\n\t\t\twantContains: []string{\n\t\t\t\t\"You are an agent.\",\n\t\t\t\t\"Your internal name is \\\"empty_desc_agent\\\".\",\n\t\t\t},\n\t\t\twantNotContain: []string{\n\t\t\t\t\"The description about you is\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"AppendsToExistingInstructions\",\n\t\t\tagent: &mockLLMAgent{\n\t\t\t\tAgent: utils.Must(agent.New(agent.Config{Name: \"append_agent\"})),\n\t\t\t\ts:     &State{},\n\t\t\t},\n\t\t\texistingSI: genai.NewContentFromText(\"Be concise.\", genai.RoleUser),\n\t\t\twantContains: []string{\n\t\t\t\t\"Be concise.\",\n\t\t\t\t\"You are an agent.\",\n\t\t\t\t\"Your internal name is \\\"append_agent\\\".\",\n\t\t\t},\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tt.Parallel()\n\n\t\t\treq := &model.LLMRequest{}\n\t\t\tif tt.existingSI != nil {\n\t\t\t\treq.Config = &genai.GenerateContentConfig{\n\t\t\t\t\tSystemInstruction: tt.existingSI,\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tctx := icontext.NewInvocationContext(t.Context(), icontext.InvocationContextParams{\n\t\t\t\tAgent: tt.agent,\n\t\t\t})\n\n\t\t\titer := identityRequestProcessor(ctx, req, &Flow{})\n\n\t\t\tvar eventCount int\n\t\t\tfor _, err := range iter {\n\t\t\t\tif err != nil {\n\t\t\t\t\tt.Fatalf(\"identityRequestProcessor() unexpected error: %v\", err)\n\t\t\t\t}\n\t\t\t\teventCount++\n\t\t\t}\n\n\t\t\tif eventCount > 0 {\n\t\t\t\tt.Errorf(\"identityRequestProcessor() yielded %d events, want 0\", eventCount)\n\t\t\t}\n\n\t\t\tif tt.wantNoSI {\n\t\t\t\tif req.Config != nil && req.Config.SystemInstruction != nil {\n\t\t\t\t\tt.Errorf(\"identityRequestProcessor() set SystemInstruction on non-LLM agent, got: %v\", req.Config.SystemInstruction)\n\t\t\t\t}\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif req.Config == nil || req.Config.SystemInstruction == nil {\n\t\t\t\tt.Fatal(\"identityRequestProcessor() did not set SystemInstruction\")\n\t\t\t}\n\n\t\t\tsi := strings.Join(utils.TextParts(req.Config.SystemInstruction), \" \")\n\t\t\tfor _, want := range tt.wantContains {\n\t\t\t\tif !strings.Contains(si, want) {\n\t\t\t\t\tt.Errorf(\"SystemInstruction does not contain %q\\ngot: %q\", want, si)\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor _, notWant := range tt.wantNotContain {\n\t\t\t\tif strings.Contains(si, notWant) {\n\t\t\t\t\tt.Errorf(\"SystemInstruction unexpectedly contains %q\\ngot: %q\", notWant, si)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "internal/llminternal/instruction_processor.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage llminternal\n\nimport (\n\t\"fmt\"\n\t\"iter\"\n\t\"regexp\"\n\t\"slices\"\n\t\"strings\"\n\t\"unicode\"\n\n\t\"google.golang.org/adk/agent\"\n\t\"google.golang.org/adk/internal/agent/parentmap\"\n\ticontext \"google.golang.org/adk/internal/context\"\n\t\"google.golang.org/adk/internal/utils\"\n\t\"google.golang.org/adk/model\"\n\t\"google.golang.org/adk/session\"\n)\n\n// TODO: Remove this once state keywords are implemented and replace with those consts\nconst (\n\tappPrefix  = \"app:\"\n\tuserPrefix = \"user:\"\n\ttempPrefix = \"temp:\"\n)\n\n// instructionsRequestProcessor configures req's instructions and global instructions for LLM flow.\nfunc instructionsRequestProcessor(ctx agent.InvocationContext, req *model.LLMRequest, f *Flow) iter.Seq2[*session.Event, error] {\n\treturn func(yield func(*session.Event, error) bool) {\n\t\tllmAgent := asLLMAgent(ctx.Agent())\n\t\tif llmAgent == nil {\n\t\t\treturn // do nothing.\n\t\t}\n\n\t\tparents := parentmap.FromContext(ctx)\n\n\t\trootAgent := asLLMAgent(parents.RootAgent(ctx.Agent()))\n\t\tif rootAgent == nil {\n\t\t\trootAgent = llmAgent\n\t\t}\n\n\t\t// Append global instructions.\n\t\tif err := appendGlobalInstructions(ctx, req, rootAgent.internal()); err != nil {\n\t\t\tyield(nil, fmt.Errorf(\"failed to append global instructions: %w\", err))\n\t\t\treturn\n\t\t}\n\n\t\t// Append agent's instruction\n\t\tif err := appendInstructions(ctx, req, llmAgent.internal()); err != nil {\n\t\t\tyield(nil, fmt.Errorf(\"failed to append instructions: %w\", err))\n\t\t\treturn\n\t\t}\n\t}\n}\n\n// The regex to find placeholders like {variable} or {artifact.file_name}.\nvar placeholderRegex = regexp.MustCompile(`{+[^{}]*}+`)\n\nfunc appendInstructions(ctx agent.InvocationContext, req *model.LLMRequest, agentState *State) error {\n\tif agentState.InstructionProvider != nil {\n\t\tinstruction, err := agentState.InstructionProvider(icontext.NewReadonlyContext(ctx))\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"failed to evaluate global instruction provider: %w\", err)\n\t\t}\n\n\t\tutils.AppendInstructions(req, instruction)\n\t\treturn nil\n\t}\n\n\tif agentState.Instruction == \"\" {\n\t\treturn nil\n\t}\n\n\tinst, err := InjectSessionState(ctx, agentState.Instruction)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to inject session state into instruction: %w\", err)\n\t}\n\n\tutils.AppendInstructions(req, inst)\n\treturn nil\n}\n\nfunc appendGlobalInstructions(ctx agent.InvocationContext, req *model.LLMRequest, agentState *State) error {\n\tif agentState.GlobalInstructionProvider != nil {\n\t\tinstruction, err := agentState.GlobalInstructionProvider(icontext.NewReadonlyContext(ctx))\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"failed to evaluate global instruction provider: %w\", err)\n\t\t}\n\n\t\tutils.AppendInstructions(req, instruction)\n\t\treturn nil\n\t}\n\n\tif agentState.GlobalInstruction == \"\" {\n\t\treturn nil\n\t}\n\n\tinst, err := InjectSessionState(ctx, agentState.GlobalInstruction)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to inject session state into global instruction: %w\", err)\n\t}\n\n\tutils.AppendInstructions(req, inst)\n\treturn nil\n}\n\n// replaceMatch is the Go equivalent of the _replace_match async function in the Python code.\nfunc replaceMatch(ctx agent.InvocationContext, match string) (string, error) {\n\t// Trim curly braces: \"{var_name}\" -> \"var_name\"\n\tvarName := strings.TrimSpace(strings.Trim(match, \"{}\"))\n\toptional := false\n\tif strings.HasSuffix(varName, \"?\") {\n\t\toptional = true\n\t\tvarName = strings.TrimSuffix(varName, \"?\")\n\t}\n\n\tif after, ok := strings.CutPrefix(varName, \"artifact.\"); ok {\n\t\tfileName := after\n\t\tif ctx.Artifacts() == nil {\n\t\t\treturn \"\", fmt.Errorf(\"artifact service is not initialized\")\n\t\t}\n\t\tresp, err := ctx.Artifacts().Load(ctx, fileName)\n\t\tif err != nil {\n\t\t\tif optional {\n\t\t\t\t// TODO: consistent logging approach in adk-go\n\t\t\t\treturn \"\", nil\n\t\t\t}\n\t\t\treturn \"\", fmt.Errorf(\"failed to load artifact %s: %w\", fileName, err)\n\t\t}\n\t\treturn resp.Part.Text, nil\n\t}\n\n\tif !isValidStateName(varName) {\n\t\treturn match, nil // Return the original string if not a valid name\n\t}\n\n\tvalue, err := ctx.Session().State().Get(varName)\n\tif err != nil {\n\t\tif optional {\n\t\t\t// TODO: log error when !errors.Is(err, session.ErrStateKeyNotExist)\n\t\t\treturn \"\", nil\n\t\t}\n\t\treturn \"\", err\n\t}\n\n\tif value == nil {\n\t\treturn \"\", nil\n\t}\n\n\treturn fmt.Sprintf(\"%v\", value), nil\n}\n\n// isIdentifier checks if a string is a valid Go identifier.\n// This is the equivalent of Python's `str.isidentifier()`.\nfunc isIdentifier(s string) bool {\n\tif s == \"\" {\n\t\treturn false\n\t}\n\tfor i, r := range s {\n\t\tif i == 0 {\n\t\t\tif !unicode.IsLetter(r) && r != '_' {\n\t\t\t\treturn false\n\t\t\t}\n\t\t} else {\n\t\t\tif !unicode.IsLetter(r) && !unicode.IsDigit(r) && r != '_' {\n\t\t\t\treturn false\n\t\t\t}\n\t\t}\n\t}\n\treturn true\n}\n\n// isValidStateName checks if the variable name is a valid state name.\nfunc isValidStateName(varName string) bool {\n\tparts := strings.Split(varName, \":\")\n\tif len(parts) == 1 {\n\t\treturn isIdentifier(varName)\n\t}\n\n\tif len(parts) == 2 {\n\t\tprefix := parts[0] + \":\"\n\t\tvalidPrefixes := []string{appPrefix, userPrefix, tempPrefix}\n\t\tif slices.Contains(validPrefixes, prefix) {\n\t\t\treturn isIdentifier(parts[1])\n\t\t}\n\t}\n\treturn false\n}\n\n// InjectSessionState populates values in an instruction template from a context.\nfunc InjectSessionState(ctx agent.InvocationContext, template string) (string, error) {\n\t// Find all matches, then iterate through them, building the result string.\n\tvar result strings.Builder\n\tlastIndex := 0\n\tmatches := placeholderRegex.FindAllStringIndex(template, -1)\n\n\tfor _, matchIndexes := range matches {\n\t\tstartIndex, endIndex := matchIndexes[0], matchIndexes[1]\n\n\t\t// Append the text between the last match and this one\n\t\tresult.WriteString(template[lastIndex:startIndex])\n\n\t\t// Get the replacement for the current match\n\t\tmatchStr := template[startIndex:endIndex]\n\t\treplacement, err := replaceMatch(ctx, matchStr)\n\t\tif err != nil {\n\t\t\treturn \"\", err // Propagate the error\n\t\t}\n\t\tresult.WriteString(replacement)\n\n\t\tlastIndex = endIndex\n\t}\n\n\t// Append any remaining text after the last match\n\tresult.WriteString(template[lastIndex:])\n\n\treturn result.String(), nil\n}\n"
  },
  {
    "path": "internal/llminternal/instruction_processor_test.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage llminternal\n\nimport (\n\t\"context\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/agent\"\n\t\"google.golang.org/adk/artifact\"\n\tartifactinternal \"google.golang.org/adk/internal/artifact\"\n\ticontext \"google.golang.org/adk/internal/context\"\n\t\"google.golang.org/adk/session\"\n)\n\nfunc TestInjectSessionState(t *testing.T) {\n\t// Define the structure for our test cases\n\ttestCases := []struct {\n\t\tname             string                 // Name of the sub-test\n\t\ttemplate         string                 // Input template string\n\t\tstate            map[string]any         // Initial session state\n\t\tartifacts        map[string]*genai.Part // Artifacts for the mock service\n\t\texpectNilService bool                   // Flag to test with a nil artifact service\n\t\twant             string                 // Expected successful output\n\t\twantErr          bool                   // Whether we expect an error\n\t\twantErrMsg       string                 // A substring of the expected error message\n\t}{\n\t\t// Corresponds to: test_inject_session_state\n\t\t{\n\t\t\tname:     \"successful state injection\",\n\t\t\ttemplate: \"Hello {user_name}, you are in {app_state} state.\",\n\t\t\tstate:    map[string]any{\"user_name\": \"Foo\", \"app_state\": \"active\"},\n\t\t\twant:     \"Hello Foo, you are in active state.\",\n\t\t},\n\t\t// Corresponds to: test_inject_session_state_with_artifact\n\t\t{\n\t\t\tname:     \"successful artifact injection\",\n\t\t\ttemplate: \"The artifact content is: {artifact.my_file}\",\n\t\t\tartifacts: map[string]*genai.Part{\n\t\t\t\t\"my_file\": {Text: \"This is my artifact content.\"},\n\t\t\t},\n\t\t\twant: \"The artifact content is: This is my artifact content.\",\n\t\t},\n\t\t// Corresponds to: test_inject_session_state_with_optional_state\n\t\t// and test_inject_session_state_with_optional_missing_state_returns_empty\n\t\t{\n\t\t\tname:     \"optional missing state variable\",\n\t\t\ttemplate: \"Optional value: {optional_value?}\",\n\t\t\tstate:    map[string]any{},\n\t\t\twant:     \"Optional value: \",\n\t\t},\n\t\t// Corresponds to: test_inject_session_state_with_missing_state_raises_key_error\n\t\t{\n\t\t\tname:       \"missing required state variable\",\n\t\t\ttemplate:   \"Hello {missing_key}!\",\n\t\t\tstate:      map[string]any{\"user_name\": \"Foo\"},\n\t\t\twantErr:    true,\n\t\t\twantErrMsg: \"state key does not exist\",\n\t\t},\n\t\t// Corresponds to: test_inject_session_state_with_missing_artifact_raises_key_error\n\t\t{\n\t\t\tname:     \"missing required artifact\",\n\t\t\ttemplate: \"The artifact content is: {artifact.missing_file}\",\n\t\t\tartifacts: map[string]*genai.Part{\n\t\t\t\t\"my_file\": {Text: \"This is my artifact content.\"},\n\t\t\t},\n\t\t\twantErr:    true,\n\t\t\twantErrMsg: \"failed to load artifact missing_file: artifact not found: file does not exist\",\n\t\t},\n\t\t// Corresponds to: test_inject_session_state_with_invalid_state_name_returns_original\n\t\t{\n\t\t\tname:     \"invalid state name is not replaced\",\n\t\t\ttemplate: \"Hello {invalid-key}!\",\n\t\t\tstate:    map[string]any{\"user_name\": \"Foo\"},\n\t\t\twant:     \"Hello {invalid-key}!\",\n\t\t},\n\t\t// Corresponds to: test_inject_session_state_with_invalid_prefix_state_name_returns_original\n\t\t{\n\t\t\tname:     \"invalid prefix state name is not replaced\",\n\t\t\ttemplate: \"Hello {invalid:key}!\",\n\t\t\tstate:    map[string]any{\"user_name\": \"Foo\"},\n\t\t\twant:     \"Hello {invalid:key}!\",\n\t\t},\n\t\t// Corresponds to: test_inject_session_state_with_valid_prefix_state\n\t\t{\n\t\t\tname:     \"valid prefixed state variable\",\n\t\t\ttemplate: \"Hello {app:user_name}!\",\n\t\t\tstate:    map[string]any{\"app:user_name\": \"Foo\"},\n\t\t\twant:     \"Hello Foo!\",\n\t\t},\n\t\t// Corresponds to: test_inject_session_state_with_none_state_value_returns_empty\n\t\t{\n\t\t\tname:     \"state value is nil\",\n\t\t\ttemplate: \"Value: {test_key}\",\n\t\t\tstate:    map[string]any{\"test_key\": nil},\n\t\t\twant:     \"Value: \",\n\t\t},\n\t\t// Corresponds to: test_inject_session_state_with_optional_missing_artifact_returns_empty\n\t\t{\n\t\t\tname:     \"optional missing artifact\",\n\t\t\ttemplate: \"Optional artifact: {artifact.missing_file?}\",\n\t\t\tartifacts: map[string]*genai.Part{\n\t\t\t\t\"my_file\": {Text: \"This is my artifact content.\"},\n\t\t\t},\n\t\t\twant: \"Optional artifact: \",\n\t\t},\n\t\t// Corresponds to: test_inject_session_state_artifact_service_not_initialized_raises_value_error\n\t\t{\n\t\t\tname:             \"artifact service not initialized\",\n\t\t\ttemplate:         \"The artifact content is: {artifact.my_file}\",\n\t\t\texpectNilService: true,\n\t\t\twantErr:          true,\n\t\t\twantErrMsg:       \"artifact service is not initialized\",\n\t\t},\n\t\t// Corresponds to: test_inject_session_state_with_empty_artifact_name_raises_key_error\n\t\t{\n\t\t\tname:       \"empty artifact name\",\n\t\t\ttemplate:   \"The artifact content is: {artifact.}\",\n\t\t\tartifacts:  map[string]*genai.Part{},\n\t\t\twantErr:    true,\n\t\t\twantErrMsg: \"failed to load artifact : request validation failed: invalid load request: missing required fields: FileName\",\n\t\t},\n\t\t// Corresponds to: test_inject_session_state_with_multiple_variables_and_artifacts\n\t\t{\n\t\t\tname: \"complex template with mixed variables and artifacts\",\n\t\t\ttemplate: `\nHello {user_name},\nYou are {user_age} years old.\nYour favorite color is {favorite_color}.\nThe artifact says: {artifact.my_file}\nAnd another optional artifact: {artifact.other_file?}\n`,\n\t\t\tstate: map[string]any{\n\t\t\t\t\"user_name\":      \"Foo\",\n\t\t\t\t\"user_age\":       30,\n\t\t\t\t\"favorite_color\": \"blue\",\n\t\t\t},\n\t\t\tartifacts: map[string]*genai.Part{\n\t\t\t\t\"my_file\": {Text: \"This is my artifact content.\"},\n\t\t\t},\n\t\t\twant: `\nHello Foo,\nYou are 30 years old.\nYour favorite color is blue.\nThe artifact says: This is my artifact content.\nAnd another optional artifact: \n`,\n\t\t},\n\t}\n\n\t// Iterate over the test cases\n\tfor _, tc := range testCases {\n\t\t// t.Run creates a sub-test, which makes test output cleaner and more organized.\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t// Setup, create inMemorySessionService, inMemoryArtifactService and wrappers.\n\t\t\tsessionService := session.InMemoryService()\n\t\t\tcreateResp, err := sessionService.Create(t.Context(), &session.CreateRequest{\n\t\t\t\tAppName:   \"testApp\",\n\t\t\t\tUserID:    \"testUser\",\n\t\t\t\tSessionID: \"testSession\",\n\t\t\t\tState:     tc.state,\n\t\t\t})\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"Failed to create session: %v\", err)\n\t\t\t}\n\n\t\t\t// Setup Artifacts\n\t\t\tvar artifacts agent.Artifacts\n\t\t\tif !tc.expectNilService {\n\t\t\t\tartifacts = &artifactinternal.Artifacts{\n\t\t\t\t\tService:   artifact.InMemoryService(),\n\t\t\t\t\tAppName:   \"testApp\",\n\t\t\t\t\tUserID:    \"testUser\",\n\t\t\t\t\tSessionID: \"testSession\",\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor filename, part := range tc.artifacts {\n\t\t\t\tif _, err := artifacts.Save(t.Context(), filename, part); err != nil {\n\t\t\t\t\tt.Fatalf(\"Failed to save artifact: %v\", err)\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Create invocation context\n\t\t\tctx := icontext.NewInvocationContext(context.Background(), icontext.InvocationContextParams{\n\t\t\t\tArtifacts: artifacts,\n\t\t\t\tSession:   createResp.Session,\n\t\t\t})\n\n\t\t\t// --- Execution ---\n\t\t\tgot, err := InjectSessionState(ctx, tc.template)\n\n\t\t\t// --- Assertion ---\n\t\t\tif tc.wantErr {\n\t\t\t\tif err == nil {\n\t\t\t\t\tt.Fatal(\"expected an error but got none\")\n\t\t\t\t}\n\t\t\t\tif tc.wantErrMsg != \"\" && !strings.Contains(err.Error(), tc.wantErrMsg) {\n\t\t\t\t\tt.Errorf(\"expected error message to contain %q, but got %q\", tc.wantErrMsg, err.Error())\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err != nil {\n\t\t\t\t\tt.Fatalf(\"did not expect an error but got: %v\", err)\n\t\t\t\t}\n\t\t\t\tif got != tc.want {\n\t\t\t\t\t// Use %q to clearly show differences in strings, especially with whitespace.\n\t\t\t\t\tt.Errorf(\"got %q, want %q\", got, tc.want)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "internal/llminternal/other_processors.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage llminternal\n\nimport (\n\t\"iter\"\n\n\t\"google.golang.org/adk/agent\"\n\t\"google.golang.org/adk/model\"\n\t\"google.golang.org/adk/session\"\n)\n\nfunc nlPlanningRequestProcessor(ctx agent.InvocationContext, req *model.LLMRequest, f *Flow) iter.Seq2[*session.Event, error] {\n\t// TODO: implement (adk-python src/google/adk/flows/llm_flows/_nl_plnning.py)\n\treturn func(yield func(*session.Event, error) bool) {}\n}\n\nfunc codeExecutionRequestProcessor(ctx agent.InvocationContext, req *model.LLMRequest, f *Flow) iter.Seq2[*session.Event, error] {\n\t// TODO: implement (adk-python src/google/adk/flows/llm_flows/_code_execution.py)\n\treturn func(yield func(*session.Event, error) bool) {}\n}\n\nfunc authPreprocessor(ctx agent.InvocationContext, req *model.LLMRequest, f *Flow) iter.Seq2[*session.Event, error] {\n\t// TODO: implement (adk-python src/google/adk/auth/auth_preprocessor.py)\n\treturn func(yield func(*session.Event, error) bool) {}\n}\n\nfunc nlPlanningResponseProcessor(ctx agent.InvocationContext, req *model.LLMRequest, resp *model.LLMResponse) error {\n\t// TODO: implement (adk-python src/google/adk/_nl_planning.py)\n\treturn nil\n}\n\nfunc codeExecutionResponseProcessor(ctx agent.InvocationContext, req *model.LLMRequest, resp *model.LLMResponse) error {\n\t// TODO: implement (adk-python src/google/adk_code_execution.py)\n\treturn nil\n}\n"
  },
  {
    "path": "internal/llminternal/outputschema_processor.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage llminternal\n\nimport (\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"iter\"\n\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/agent\"\n\t\"google.golang.org/adk/internal/llminternal/googlellm\"\n\t\"google.golang.org/adk/internal/toolinternal/toolutils\"\n\t\"google.golang.org/adk/internal/utils\"\n\t\"google.golang.org/adk/model\"\n\t\"google.golang.org/adk/session\"\n\t\"google.golang.org/adk/tool\"\n)\n\nconst (\n\tinstructionForProcessor = \"IMPORTANT: You have access to other tools, but you must provide \" +\n\t\t\"your final response using the set_model_response tool with the \" +\n\t\t\"required structured format. After using any other tools needed \" +\n\t\t\"to complete the task, always call set_model_response with your \" +\n\t\t\"final answer in the specified schema format.\"\n)\n\n// outputSchemaRequestProcessor adds the set_model_response tool to handle structured output.\nfunc outputSchemaRequestProcessor(ctx agent.InvocationContext, req *model.LLMRequest, f *Flow) iter.Seq2[*session.Event, error] {\n\treturn func(yield func(*session.Event, error) bool) {\n\t\tllmAgent := asLLMAgent(ctx.Agent())\n\t\tif llmAgent == nil {\n\t\t\treturn\n\t\t}\n\n\t\tstate := llmAgent.internal()\n\t\t// Check if we need the processor in the first place.\n\t\tif state.OutputSchema == nil || !needOutputSchemaProcessor(state) {\n\t\t\treturn\n\t\t}\n\n\t\t// Add the set_model_response tool to handle structured output\n\t\tsetResponseTool := &setModelResponseTool{schema: state.OutputSchema}\n\t\tif err := toolutils.PackTool(req, setResponseTool); err != nil {\n\t\t\tyield(nil, fmt.Errorf(\"failed to pack set_model_response tool: %w\", err))\n\t\t\treturn\n\t\t}\n\n\t\t// Add instruction about using the set_model_response tool\n\t\tutils.AppendInstructions(req, instructionForProcessor)\n\t}\n}\n\n// createFinalModelResponseEvent creates a final model response event from set_model_response JSON.\nfunc createFinalModelResponseEvent(invocationContext agent.InvocationContext, response string) *session.Event {\n\t// Create a proper model response event\n\tfinalEvent := session.NewEvent(invocationContext.InvocationID())\n\tfinalEvent.Author = invocationContext.Agent().Name()\n\tfinalEvent.Branch = invocationContext.Branch()\n\tfinalEvent.Content = &genai.Content{\n\t\tRole:  \"model\",\n\t\tParts: []*genai.Part{{Text: response}},\n\t}\n\treturn finalEvent\n}\n\n// retrieveStructuredModelResponse checks if function response contains set_model_response tool and extract JSON.\nfunc retrieveStructuredModelResponse(ev *session.Event) (string, error) {\n\tif ev == nil || ev.LLMResponse.Content == nil {\n\t\treturn \"\", nil\n\t}\n\n\tfor _, part := range ev.LLMResponse.Content.Parts {\n\t\tif part.FunctionResponse != nil && part.FunctionResponse.Name == \"set_model_response\" {\n\t\t\tbytes, err := json.Marshal(part.FunctionResponse.Response)\n\t\t\tif err != nil {\n\t\t\t\treturn \"\", fmt.Errorf(\"failed to marshal set_model_response: %w\", err)\n\t\t\t}\n\t\t\treturn string(bytes), nil\n\t\t}\n\t}\n\n\treturn \"\", nil\n}\n\nfunc needOutputSchemaProcessor(state *State) bool {\n\tif state == nil || state.Model == nil {\n\t\treturn false\n\t}\n\thasTools := len(state.Tools) > 0 || len(state.Toolsets) > 0\n\treturn hasTools && googlellm.NeedsOutputSchemaProcessor(state.Model)\n}\n\n// setModelResponseTool implements tool.Tool and toolinternal.FunctionTool.\ntype setModelResponseTool struct {\n\tschema *genai.Schema\n}\n\nfunc (t *setModelResponseTool) Name() string {\n\treturn \"set_model_response\"\n}\n\nfunc (t *setModelResponseTool) Description() string {\n\treturn \"Set your final response using the required output schema. Use this tool to provide your final structured answer instead of outputting text directly.\"\n}\n\nfunc (t *setModelResponseTool) IsLongRunning() bool {\n\treturn false\n}\n\nfunc (t *setModelResponseTool) Declaration() *genai.FunctionDeclaration {\n\treturn &genai.FunctionDeclaration{\n\t\tName:                 t.Name(),\n\t\tDescription:          t.Description(),\n\t\tParametersJsonSchema: t.schema,\n\t}\n}\n\nfunc (t *setModelResponseTool) Run(ctx tool.Context, args any) (map[string]any, error) {\n\tm, ok := args.(map[string]any)\n\tif !ok {\n\t\treturn nil, fmt.Errorf(\"unexpected args type for set_model_response: %T\", args)\n\t}\n\tif err := utils.ValidateMapOnSchema(m, t.schema, false); err != nil {\n\t\treturn nil, fmt.Errorf(\"invalid output schema: %w\", err)\n\t}\n\treturn m, nil\n}\n"
  },
  {
    "path": "internal/llminternal/outputschema_processor_test.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage llminternal\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/google/go-cmp/cmp\"\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/agent\"\n\ticontext \"google.golang.org/adk/internal/context\"\n\t\"google.golang.org/adk/internal/toolinternal\"\n\t\"google.golang.org/adk/internal/utils\"\n\t\"google.golang.org/adk/model\"\n\t\"google.golang.org/adk/session\"\n\t\"google.golang.org/adk/tool\"\n)\n\ntype mockTool struct {\n\tname string\n}\n\nfunc (m *mockTool) Name() string        { return m.name }\nfunc (m *mockTool) Description() string { return \"mock tool\" }\nfunc (m *mockTool) IsLongRunning() bool { return false }\nfunc (m *mockTool) Declaration() *genai.FunctionDeclaration {\n\treturn &genai.FunctionDeclaration{Name: m.name}\n}\nfunc (m *mockTool) Run(ctx tool.Context, args any) (map[string]any, error) { return nil, nil }\n\ntype mockLLM struct {\n\tmodel.LLM\n\tname    string\n\tvariant *genai.Backend\n}\n\nfunc (m *mockLLM) Name() string { return m.name }\n\nfunc (m *mockLLM) GetGoogleLLMVariant() genai.Backend {\n\tif m.variant != nil {\n\t\treturn *m.variant\n\t}\n\treturn genai.BackendGeminiAPI\n}\n\nfunc TestOutputSchemaRequestProcessor(t *testing.T) {\n\tschema := &genai.Schema{\n\t\tType: genai.TypeObject,\n\t\tProperties: map[string]*genai.Schema{\n\t\t\t\"answer\": {Type: genai.TypeString},\n\t\t},\n\t\tRequired: []string{\"answer\"},\n\t}\n\n\tf := &Flow{}\n\n\tt.Run(\"InjectsToolAndInstructions\", func(t *testing.T) {\n\t\tbaseAgent := utils.Must(agent.New(agent.Config{Name: \"SchemaAgent\"}))\n\t\tmockAgent := &mockLLMAgent{\n\t\t\tAgent: baseAgent,\n\t\t\ts: &State{\n\t\t\t\tModel:        &mockLLM{name: \"gemini-2.5-flash\"},\n\t\t\t\tOutputSchema: schema,\n\t\t\t\tTools:        []tool.Tool{&mockTool{name: \"other_tool\"}},\n\t\t\t},\n\t\t}\n\n\t\treq := &model.LLMRequest{}\n\t\tctx := icontext.NewInvocationContext(context.Background(), icontext.InvocationContextParams{\n\t\t\tAgent: mockAgent,\n\t\t})\n\n\t\tevents := outputSchemaRequestProcessor(ctx, req, f)\n\t\tfor _, err := range events {\n\t\t\tt.Fatalf(\"outputSchemaRequestProcessor() error = %v\", err)\n\t\t}\n\n\t\t// Verify set_model_response tool is present\n\t\tif _, ok := req.Tools[\"set_model_response\"]; !ok {\n\t\t\tt.Error(\"req.Tools['set_model_response'] missing\")\n\t\t}\n\n\t\t// Verify instructions\n\t\tinstructions := utils.TextParts(req.Config.SystemInstruction)\n\t\tfound := false\n\t\tfor _, s := range instructions {\n\t\t\tif strings.Contains(s, \"set_model_response\") && strings.Contains(s, \"required structured format\") {\n\t\t\t\tfound = true\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\tif !found {\n\t\t\tt.Errorf(\"Instruction about set_model_response not found. Instructions: %v\", instructions)\n\t\t}\n\t})\n\n\tt.Run(\"NoOpWhenNoTools\", func(t *testing.T) {\n\t\tbaseAgent := utils.Must(agent.New(agent.Config{Name: \"SchemaAgentNoTools\"}))\n\t\tmockAgent := &mockLLMAgent{\n\t\t\tAgent: baseAgent,\n\t\t\ts: &State{\n\t\t\t\tModel:        &mockLLM{name: \"gemini-2.5-flash\"},\n\t\t\t\tOutputSchema: schema,\n\t\t\t\tTools:        nil, // No tools -> optimization skips processor\n\t\t\t},\n\t\t}\n\n\t\treq := &model.LLMRequest{}\n\t\tctx := icontext.NewInvocationContext(context.Background(), icontext.InvocationContextParams{\n\t\t\tAgent: mockAgent,\n\t\t})\n\n\t\tevents := outputSchemaRequestProcessor(ctx, req, f)\n\t\tfor _, err := range events {\n\t\t\tt.Fatalf(\"outputSchemaRequestProcessor() error = %v\", err)\n\t\t}\n\n\t\tif _, ok := req.Tools[\"set_model_response\"]; ok {\n\t\t\tt.Error(\"set_model_response tool should NOT be added when no other tools are present\")\n\t\t}\n\t})\n\n\tt.Run(\"NoOpWhenNoSchema\", func(t *testing.T) {\n\t\tbaseAgent := utils.Must(agent.New(agent.Config{Name: \"NoSchemaAgent\"}))\n\t\tmockAgent := &mockLLMAgent{\n\t\t\tAgent: baseAgent,\n\t\t\ts: &State{\n\t\t\t\tModel:        &mockLLM{name: \"gemini-2.5-flash\"},\n\t\t\t\tOutputSchema: nil,\n\t\t\t\tTools:        []tool.Tool{&mockTool{name: \"other_tool\"}},\n\t\t\t},\n\t\t}\n\n\t\treq := &model.LLMRequest{}\n\t\tctx := icontext.NewInvocationContext(context.Background(), icontext.InvocationContextParams{\n\t\t\tAgent: mockAgent,\n\t\t})\n\n\t\tevents := outputSchemaRequestProcessor(ctx, req, f)\n\t\tfor _, err := range events {\n\t\t\tt.Fatalf(\"outputSchemaRequestProcessor() error = %v\", err)\n\t\t}\n\n\t\tif _, ok := req.Tools[\"set_model_response\"]; ok {\n\t\t\tt.Error(\"set_model_response tool should NOT be added when no OutputSchema\")\n\t\t}\n\t})\n\n\tt.Run(\"NoOpWhenNativeSupportAvailable\", func(t *testing.T) {\n\t\t// Native support = Vertex AI + Gemini 2.5+\n\t\tllm := &mockLLM{\n\t\t\tname:    \"gemini-2.5-flash\",\n\t\t\tvariant: func() *genai.Backend { x := genai.BackendVertexAI; return &x }(),\n\t\t}\n\n\t\tbaseAgent := utils.Must(agent.New(agent.Config{Name: \"VertexGemini2Agent\"}))\n\t\tmockAgent := &mockLLMAgent{\n\t\t\tAgent: baseAgent,\n\t\t\ts: &State{\n\t\t\t\tModel:        llm,\n\t\t\t\tOutputSchema: schema,\n\t\t\t\tTools:        []tool.Tool{&mockTool{name: \"other_tool\"}},\n\t\t\t},\n\t\t}\n\n\t\treq := &model.LLMRequest{}\n\t\tctx := icontext.NewInvocationContext(context.Background(), icontext.InvocationContextParams{\n\t\t\tAgent: mockAgent,\n\t\t})\n\n\t\tevents := outputSchemaRequestProcessor(ctx, req, f)\n\t\tfor _, err := range events {\n\t\t\tt.Fatalf(\"outputSchemaRequestProcessor() error = %v\", err)\n\t\t}\n\n\t\tif _, ok := req.Tools[\"set_model_response\"]; ok {\n\t\t\tt.Error(\"set_model_response tool should NOT be added when native support is available\")\n\t\t}\n\t})\n}\n\nfunc TestCreateFinalModelResponseEvent(t *testing.T) {\n\t// Setup context\n\ta := utils.Must(agent.New(agent.Config{Name: \"TestAgent\"}))\n\tinvCtx := icontext.NewInvocationContext(context.Background(), icontext.InvocationContextParams{\n\t\tAgent: a,\n\t})\n\n\tjsonResp := `{\"answer\": \"value\"}`\n\tevent := createFinalModelResponseEvent(invCtx, jsonResp)\n\n\tif event.Author != \"TestAgent\" {\n\t\tt.Errorf(\"Author = %q, want TestAgent\", event.Author)\n\t}\n\tif event.Content == nil || event.Content.Role != \"model\" {\n\t\tt.Errorf(\"Content Role mismatch or nil\")\n\t}\n\tif event.Branch != invCtx.Branch() {\n\t\tt.Errorf(\"Branch = %q, want %q\", event.Branch, invCtx.Branch())\n\t}\n\tif event.InvocationID != invCtx.InvocationID() {\n\t\tt.Errorf(\"InvocationID = %q, want %q\", event.InvocationID, invCtx.InvocationID())\n\t}\n\tif len(event.Content.Parts) != 1 {\n\t\tt.Fatalf(\"Content Parts length = %d, want 1\", len(event.Content.Parts))\n\t}\n\tif got := event.Content.Parts[0].Text; got != jsonResp {\n\t\tt.Errorf(\"Content Text = %q, want %q\", got, jsonResp)\n\t}\n}\n\nfunc TestGetStructuredModelResponse(t *testing.T) {\n\tt.Run(\"ExtractsResponse\", func(t *testing.T) {\n\t\tevent := &session.Event{\n\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\tContent: &genai.Content{\n\t\t\t\t\tParts: []*genai.Part{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tFunctionResponse: &genai.FunctionResponse{\n\t\t\t\t\t\t\t\tName: \"set_model_response\",\n\t\t\t\t\t\t\t\tResponse: map[string]any{\n\t\t\t\t\t\t\t\t\t\"result\": 123.0,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t}\n\n\t\tgot, err := retrieveStructuredModelResponse(event)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"GetStructuredModelResponse error: %v\", err)\n\t\t}\n\n\t\t// The JSON might be formatted differently, so unmarshal to compare\n\t\tvar gotMap map[string]any\n\t\tif err := json.Unmarshal([]byte(got), &gotMap); err != nil {\n\t\t\tt.Fatalf(\"Result is not valid JSON: %v\", err)\n\t\t}\n\n\t\twantMap := map[string]any{\"result\": 123.0}\n\t\tif diff := cmp.Diff(wantMap, gotMap); diff != \"\" {\n\t\t\tt.Errorf(\"Extracted JSON mismatch (-want +got):\\n%s\", diff)\n\t\t}\n\t})\n\n\tt.Run(\"NoResponseWhenNameMismatch\", func(t *testing.T) {\n\t\tevent := &session.Event{\n\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\tContent: &genai.Content{\n\t\t\t\t\tParts: []*genai.Part{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tFunctionResponse: &genai.FunctionResponse{\n\t\t\t\t\t\t\t\tName:     \"other_tool\",\n\t\t\t\t\t\t\t\tResponse: map[string]any{\"x\": 1},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t}\n\n\t\tgot, err := retrieveStructuredModelResponse(event)\n\t\tif err != nil {\n\t\t\tt.Fatal(\"Expected nil for tool name mismatch, got error\")\n\t\t}\n\t\tif got != \"\" {\n\t\t\tt.Errorf(\"Expected empty string, got %q\", got)\n\t\t}\n\t})\n\n\tt.Run(\"NilEvent\", func(t *testing.T) {\n\t\tgot, err := retrieveStructuredModelResponse(nil)\n\t\tif err != nil {\n\t\t\tt.Fatal(\"Expected nil for nil event, got error\")\n\t\t}\n\t\tif got != \"\" {\n\t\t\tt.Error(\"expected empty string\")\n\t\t}\n\t})\n}\n\nfunc TestSetModelResponseTool(t *testing.T) {\n\tschema := &genai.Schema{\n\t\tType: genai.TypeObject,\n\t\tProperties: map[string]*genai.Schema{\n\t\t\t\"count\": {Type: genai.TypeInteger},\n\t\t},\n\t\tRequired: []string{\"count\"},\n\t}\n\n\ttoolInstance := &setModelResponseTool{schema: schema}\n\n\t// Check Description\n\tif !strings.Contains(toolInstance.Description(), \"outputting text directly\") {\n\t\tt.Errorf(\"Description should contain explicit instruction\")\n\t}\n\n\tt.Run(\"RunSuccess\", func(t *testing.T) {\n\t\tinvCtx := icontext.NewInvocationContext(context.Background(), icontext.InvocationContextParams{})\n\t\ttoolCtx := toolinternal.NewToolContext(invCtx, \"\", nil, nil)\n\n\t\tinput := map[string]any{\"count\": 10.0} // JSON numbers often come as float64\n\t\tgot, err := toolInstance.Run(toolCtx, input)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"Run failed: %v\", err)\n\t\t}\n\t\tif diff := cmp.Diff(input, got); diff != \"\" {\n\t\t\tt.Errorf(\"Output mismatch (-want +got):\\n%s\", diff)\n\t\t}\n\t})\n\n\tt.Run(\"RunValidationFailure_Type\", func(t *testing.T) {\n\t\tinvCtx := icontext.NewInvocationContext(context.Background(), icontext.InvocationContextParams{})\n\t\ttoolCtx := toolinternal.NewToolContext(invCtx, \"\", nil, nil)\n\n\t\tinput := map[string]any{\"count\": \"not a number\"}\n\t\t_, err := toolInstance.Run(toolCtx, input)\n\t\tif err == nil {\n\t\t\tt.Error(\"Expected validation error for invalid type, got nil\")\n\t\t}\n\t})\n\n\tt.Run(\"RunValidationFailure_MissingRequired\", func(t *testing.T) {\n\t\tinvCtx := icontext.NewInvocationContext(context.Background(), icontext.InvocationContextParams{})\n\t\ttoolCtx := toolinternal.NewToolContext(invCtx, \"\", nil, nil)\n\n\t\tinput := map[string]any{\"other\": 123}\n\t\t_, err := toolInstance.Run(toolCtx, input)\n\t\tif err == nil {\n\t\t\tt.Error(\"Expected validation error for missing required field, got nil\")\n\t\t}\n\t})\n}\n"
  },
  {
    "path": "internal/llminternal/parallel_function_call_test.go",
    "content": "// Copyright 2026 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage llminternal_test\n\nimport (\n\t\"net/http\"\n\t\"path/filepath\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/google/go-cmp/cmp\"\n\t\"github.com/google/go-cmp/cmp/cmpopts\"\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/agent\"\n\t\"google.golang.org/adk/agent/llmagent\"\n\t\"google.golang.org/adk/internal/httprr\"\n\t\"google.golang.org/adk/internal/testutil\"\n\t\"google.golang.org/adk/model\"\n\t\"google.golang.org/adk/model/gemini\"\n\t\"google.golang.org/adk/runner\"\n\t\"google.golang.org/adk/session\"\n\t\"google.golang.org/adk/tool\"\n\t\"google.golang.org/adk/tool/functiontool\"\n)\n\ntype SumArgs struct {\n\tA int `json:\"a\"` // an integer to sum\n\tB int `json:\"b\"` // another integer to sum\n}\ntype SumResult struct {\n\tSum int `json:\"sum\"` // the sum of two integers\n}\n\nfunc sumFunc(ctx tool.Context, input SumArgs) (SumResult, error) {\n\treturn SumResult{Sum: input.A + input.B}, nil\n}\n\nvar expectedNonPartialLLMResponse25Flash = []*model.LLMResponse{\n\t{\n\t\tPartial: false,\n\t\tContent: &genai.Content{\n\t\t\tParts: []*genai.Part{\n\t\t\t\tgenai.NewPartFromFunctionCall(\"sum\", map[string]any{\n\t\t\t\t\t\"a\": 2.0,\n\t\t\t\t\t\"b\": 3.0,\n\t\t\t\t}),\n\t\t\t\tgenai.NewPartFromFunctionCall(\"sum\", map[string]any{\n\t\t\t\t\t\"a\": 4.0,\n\t\t\t\t\t\"b\": 5.0,\n\t\t\t\t}),\n\t\t\t\tgenai.NewPartFromFunctionCall(\"sum\", map[string]any{\n\t\t\t\t\t\"a\": 6.0,\n\t\t\t\t\t\"b\": 7.0,\n\t\t\t\t}),\n\t\t\t},\n\t\t\tRole: \"model\",\n\t\t},\n\t},\n\t{\n\t\tPartial: false,\n\t\tContent: &genai.Content{\n\t\t\tParts: []*genai.Part{\n\t\t\t\tgenai.NewPartFromFunctionResponse(\"sum\", map[string]any{\n\t\t\t\t\t\"sum\": 5.0,\n\t\t\t\t}),\n\t\t\t\tgenai.NewPartFromFunctionResponse(\"sum\", map[string]any{\n\t\t\t\t\t\"sum\": 9.0,\n\t\t\t\t}),\n\t\t\t\tgenai.NewPartFromFunctionResponse(\"sum\", map[string]any{\n\t\t\t\t\t\"sum\": 13.0,\n\t\t\t\t}),\n\t\t\t},\n\t\t\tRole: \"user\",\n\t\t},\n\t},\n\t{\n\t\tPartial: false,\n\t\tContent: &genai.Content{\n\t\t\tParts: []*genai.Part{\n\t\t\t\tgenai.NewPartFromText(\"The sum of 2 and 3 is 5.\\nThe sum of 4 and 5 is 9.\\nThe sum of 6 and 7 is 13.\"),\n\t\t\t},\n\t\t\tRole: \"model\",\n\t\t},\n\t},\n\t{\n\t\tPartial: false,\n\t\tContent: &genai.Content{\n\t\t\tParts: []*genai.Part{\n\t\t\t\tgenai.NewPartFromFunctionCall(\"sum\", map[string]any{\n\t\t\t\t\t\"a\": 10.0,\n\t\t\t\t\t\"b\": 20.0,\n\t\t\t\t}),\n\t\t\t\tgenai.NewPartFromFunctionCall(\"sum\", map[string]any{\n\t\t\t\t\t\"a\": 40.0,\n\t\t\t\t\t\"b\": 50.0,\n\t\t\t\t}),\n\t\t\t\tgenai.NewPartFromFunctionCall(\"sum\", map[string]any{\n\t\t\t\t\t\"a\": 60.0,\n\t\t\t\t\t\"b\": 70.0,\n\t\t\t\t}),\n\t\t\t},\n\t\t\tRole: \"model\",\n\t\t},\n\t},\n\t{\n\t\tPartial: false,\n\t\tContent: &genai.Content{\n\t\t\tParts: []*genai.Part{\n\t\t\t\tgenai.NewPartFromFunctionResponse(\"sum\", map[string]any{\n\t\t\t\t\t\"sum\": 30.0,\n\t\t\t\t}),\n\t\t\t\tgenai.NewPartFromFunctionResponse(\"sum\", map[string]any{\n\t\t\t\t\t\"sum\": 90.0,\n\t\t\t\t}),\n\t\t\t\tgenai.NewPartFromFunctionResponse(\"sum\", map[string]any{\n\t\t\t\t\t\"sum\": 130.0,\n\t\t\t\t}),\n\t\t\t},\n\t\t\tRole: \"user\",\n\t\t},\n\t},\n\t{\n\t\tPartial: false,\n\t\tContent: &genai.Content{\n\t\t\tParts: []*genai.Part{\n\t\t\t\tgenai.NewPartFromText(\"The sum of 10 and 20 is 30.\\nThe sum of 40 and 50 is 90.\\nThe sum of 60 and 70 is 130.\"),\n\t\t\t},\n\t\t\tRole: \"model\",\n\t\t},\n\t},\n}\n\nvar expectedNonPartialLLMResponse3FlashPreview = []*model.LLMResponse{\n\t{\n\t\tPartial: false,\n\t\tContent: &genai.Content{\n\t\t\tParts: []*genai.Part{\n\t\t\t\tgenai.NewPartFromFunctionCall(\"sum\", map[string]any{\n\t\t\t\t\t\"a\": 2.0,\n\t\t\t\t\t\"b\": 3.0,\n\t\t\t\t}),\n\t\t\t\tgenai.NewPartFromFunctionCall(\"sum\", map[string]any{\n\t\t\t\t\t\"a\": 4.0,\n\t\t\t\t\t\"b\": 5.0,\n\t\t\t\t}),\n\t\t\t\tgenai.NewPartFromFunctionCall(\"sum\", map[string]any{\n\t\t\t\t\t\"a\": 6.0,\n\t\t\t\t\t\"b\": 7.0,\n\t\t\t\t}),\n\t\t\t},\n\t\t\tRole: \"model\",\n\t\t},\n\t},\n\t{\n\t\tPartial: false,\n\t\tContent: &genai.Content{\n\t\t\tParts: []*genai.Part{\n\t\t\t\tgenai.NewPartFromFunctionResponse(\"sum\", map[string]any{\n\t\t\t\t\t\"sum\": 5.0,\n\t\t\t\t}),\n\t\t\t\tgenai.NewPartFromFunctionResponse(\"sum\", map[string]any{\n\t\t\t\t\t\"sum\": 9.0,\n\t\t\t\t}),\n\t\t\t\tgenai.NewPartFromFunctionResponse(\"sum\", map[string]any{\n\t\t\t\t\t\"sum\": 13.0,\n\t\t\t\t}),\n\t\t\t},\n\t\t\tRole: \"user\",\n\t\t},\n\t},\n\t{\n\t\tPartial: false,\n\t\tContent: &genai.Content{\n\t\t\tParts: []*genai.Part{\n\t\t\t\tgenai.NewPartFromText(\"The sum of 2 and 3 is 5, the sum of 4 and 5 is 9, and the sum of 6 and 7 is 13.\"),\n\t\t\t},\n\t\t\tRole: \"model\",\n\t\t},\n\t},\n\t{\n\t\tPartial: false,\n\t\tContent: &genai.Content{\n\t\t\tParts: []*genai.Part{\n\t\t\t\tgenai.NewPartFromFunctionCall(\"sum\", map[string]any{\n\t\t\t\t\t\"a\": 10.0,\n\t\t\t\t\t\"b\": 20.0,\n\t\t\t\t}),\n\t\t\t\tgenai.NewPartFromFunctionCall(\"sum\", map[string]any{\n\t\t\t\t\t\"a\": 40.0,\n\t\t\t\t\t\"b\": 50.0,\n\t\t\t\t}),\n\t\t\t\tgenai.NewPartFromFunctionCall(\"sum\", map[string]any{\n\t\t\t\t\t\"a\": 60.0,\n\t\t\t\t\t\"b\": 70.0,\n\t\t\t\t}),\n\t\t\t},\n\t\t\tRole: \"model\",\n\t\t},\n\t},\n\t{\n\t\tPartial: false,\n\t\tContent: &genai.Content{\n\t\t\tParts: []*genai.Part{\n\t\t\t\tgenai.NewPartFromFunctionResponse(\"sum\", map[string]any{\n\t\t\t\t\t\"sum\": 30.0,\n\t\t\t\t}),\n\t\t\t\tgenai.NewPartFromFunctionResponse(\"sum\", map[string]any{\n\t\t\t\t\t\"sum\": 90.0,\n\t\t\t\t}),\n\t\t\t\tgenai.NewPartFromFunctionResponse(\"sum\", map[string]any{\n\t\t\t\t\t\"sum\": 130.0,\n\t\t\t\t}),\n\t\t\t},\n\t\t\tRole: \"user\",\n\t\t},\n\t},\n\t{\n\t\tPartial: false,\n\t\tContent: &genai.Content{\n\t\t\tParts: []*genai.Part{\n\t\t\t\tgenai.NewPartFromText(\"The sum of 10 and 20 is 30, the sum of 40 and 50 is 90, and the sum of 60 and 70 is 130.\"),\n\t\t\t},\n\t\t\tRole: \"model\",\n\t\t},\n\t},\n}\n\nvar expectedNonPartialLLMResponse3ProPreview = []*model.LLMResponse{\n\t{\n\t\tPartial: false,\n\t\tContent: &genai.Content{\n\t\t\tParts: []*genai.Part{\n\t\t\t\tgenai.NewPartFromFunctionCall(\"sum\", map[string]any{\n\t\t\t\t\t\"a\": 2.0,\n\t\t\t\t\t\"b\": 3.0,\n\t\t\t\t}),\n\t\t\t\tgenai.NewPartFromFunctionCall(\"sum\", map[string]any{\n\t\t\t\t\t\"a\": 4.0,\n\t\t\t\t\t\"b\": 5.0,\n\t\t\t\t}),\n\t\t\t\tgenai.NewPartFromFunctionCall(\"sum\", map[string]any{\n\t\t\t\t\t\"a\": 6.0,\n\t\t\t\t\t\"b\": 7.0,\n\t\t\t\t}),\n\t\t\t},\n\t\t\tRole: \"model\",\n\t\t},\n\t},\n\t{\n\t\tPartial: false,\n\t\tContent: &genai.Content{\n\t\t\tParts: []*genai.Part{\n\t\t\t\tgenai.NewPartFromFunctionResponse(\"sum\", map[string]any{\n\t\t\t\t\t\"sum\": 5.0,\n\t\t\t\t}),\n\t\t\t\tgenai.NewPartFromFunctionResponse(\"sum\", map[string]any{\n\t\t\t\t\t\"sum\": 9.0,\n\t\t\t\t}),\n\t\t\t\tgenai.NewPartFromFunctionResponse(\"sum\", map[string]any{\n\t\t\t\t\t\"sum\": 13.0,\n\t\t\t\t}),\n\t\t\t},\n\t\t\tRole: \"user\",\n\t\t},\n\t},\n\t{\n\t\tPartial: false,\n\t\tContent: &genai.Content{\n\t\t\tParts: []*genai.Part{\n\t\t\t\tgenai.NewPartFromText(\"Here are the results of your additions:\\n* 2 + 3 = 5\\n* 4 + 5 = 9\\n* 6 + 7 = 13\"),\n\t\t\t\t{}, // empty part with thought signature\n\t\t\t},\n\t\t\tRole: \"model\",\n\t\t},\n\t},\n\t{\n\t\tPartial: false,\n\t\tContent: &genai.Content{\n\t\t\tParts: []*genai.Part{\n\t\t\t\tgenai.NewPartFromFunctionCall(\"sum\", map[string]any{\n\t\t\t\t\t\"a\": 10.0,\n\t\t\t\t\t\"b\": 20.0,\n\t\t\t\t}),\n\t\t\t\tgenai.NewPartFromFunctionCall(\"sum\", map[string]any{\n\t\t\t\t\t\"a\": 40.0,\n\t\t\t\t\t\"b\": 50.0,\n\t\t\t\t}),\n\t\t\t\tgenai.NewPartFromFunctionCall(\"sum\", map[string]any{\n\t\t\t\t\t\"a\": 60.0,\n\t\t\t\t\t\"b\": 70.0,\n\t\t\t\t}),\n\t\t\t},\n\t\t\tRole: \"model\",\n\t\t},\n\t},\n\t{\n\t\tPartial: false,\n\t\tContent: &genai.Content{\n\t\t\tParts: []*genai.Part{\n\t\t\t\tgenai.NewPartFromFunctionResponse(\"sum\", map[string]any{\n\t\t\t\t\t\"sum\": 30.0,\n\t\t\t\t}),\n\t\t\t\tgenai.NewPartFromFunctionResponse(\"sum\", map[string]any{\n\t\t\t\t\t\"sum\": 90.0,\n\t\t\t\t}),\n\t\t\t\tgenai.NewPartFromFunctionResponse(\"sum\", map[string]any{\n\t\t\t\t\t\"sum\": 130.0,\n\t\t\t\t}),\n\t\t\t},\n\t\t\tRole: \"user\",\n\t\t},\n\t},\n\t{\n\t\tPartial: false,\n\t\tContent: &genai.Content{\n\t\t\tParts: []*genai.Part{\n\t\t\t\tgenai.NewPartFromText(\"Here are the results for those additions:\\n* 10 + 20 = 30\\n* 40 + 50 = 90\\n* 60 + 70 = 130\"),\n\t\t\t\t{}, // empty part with thought signature\n\t\t\t},\n\t\t\tRole: \"model\",\n\t\t},\n\t},\n}\n\nfunc TestParallelFunctionCalls(t *testing.T) {\n\ttests := []struct {\n\t\tname            string\n\t\tmodelName       string\n\t\twantLLMResponse []*model.LLMResponse\n\t}{\n\t\t{\"gemini-2.5-flash\", \"gemini-2.5-flash\", expectedNonPartialLLMResponse25Flash},\n\t\t{\"gemini-3-flash-preview\", \"gemini-3-flash-preview\", expectedNonPartialLLMResponse3FlashPreview},\n\t\t{\"gemini-3.1-pro-preview\", \"gemini-3.1-pro-preview\", expectedNonPartialLLMResponse3ProPreview},\n\t}\n\tfor _, tt := range tests {\n\t\tt.Run(\"test_parallel_function_calls_\"+tt.name, func(t *testing.T) {\n\t\t\thttpRecordFilename := filepath.Join(\"testdata\", strings.ReplaceAll(t.Name(), \"/\", \"_\")+\".httprr\")\n\n\t\t\tbaseTransport, err := testutil.NewGeminiTransport(httpRecordFilename)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\n\t\t\tapiKey := \"\"\n\t\t\tif recording, _ := httprr.Recording(httpRecordFilename); !recording {\n\t\t\t\tapiKey = \"fakekey\"\n\t\t\t}\n\n\t\t\tcfg := &genai.ClientConfig{\n\t\t\t\tHTTPClient: &http.Client{Transport: baseTransport},\n\t\t\t\tAPIKey:     apiKey,\n\t\t\t}\n\n\t\t\tgeminiModel, err := gemini.NewModel(t.Context(), tt.modelName, cfg)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\n\t\t\tsumTool, err := functiontool.New(functiontool.Config{\n\t\t\t\tName:        \"sum\",\n\t\t\t\tDescription: \"sums two integers\",\n\t\t\t}, sumFunc)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\n\t\t\ta, err := llmagent.New(llmagent.Config{\n\t\t\t\tName:        \"calculator\",\n\t\t\t\tDescription: \"A calculator that can add two integers\",\n\t\t\t\tInstruction: \"You are a calculator assistant. You will recieve requests to add two integers. Respond with the sum of the two integers and you must use the sum tool to calculate the sum.\",\n\t\t\t\tModel:       geminiModel,\n\t\t\t\tTools: []tool.Tool{\n\t\t\t\t\tsumTool,\n\t\t\t\t},\n\t\t\t})\n\t\t\tif err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\n\t\t\tsessionService := session.InMemoryService()\n\t\t\t_, err = sessionService.Create(t.Context(), &session.CreateRequest{\n\t\t\t\tAppName:   \"testApp\",\n\t\t\t\tUserID:    \"testUser\",\n\t\t\t\tSessionID: \"testSession\",\n\t\t\t})\n\t\t\tif err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\n\t\t\tr, err := runner.New(runner.Config{\n\t\t\t\tAgent:          a,\n\t\t\t\tSessionService: sessionService,\n\t\t\t\tAppName:        \"testApp\",\n\t\t\t})\n\t\t\tif err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\n\t\t\tit := r.Run(t.Context(), \"testUser\", \"testSession\", &genai.Content{\n\t\t\t\tParts: []*genai.Part{\n\t\t\t\t\tgenai.NewPartFromText(\"Can you add 2 and 3? Also 4 and 5? And 6 and 7?\"),\n\t\t\t\t},\n\t\t\t\tRole: \"user\",\n\t\t\t}, agent.RunConfig{StreamingMode: agent.StreamingModeSSE})\n\n\t\t\tfunctionCalls := make([]*genai.FunctionCall, 0)\n\t\t\tfunctionResponses := make([]*genai.FunctionResponse, 0)\n\t\t\tfunctionCallsPartial := make([]*genai.FunctionCall, 0)\n\t\t\tfunctionResponsesPartial := make([]*genai.FunctionResponse, 0)\n\t\t\tnonPartialEvents := make([]*model.LLMResponse, 0)\n\n\t\t\thandleLoop := func(ev *session.Event) {\n\t\t\t\tif !ev.Partial {\n\t\t\t\t\tnonPartialEvents = append(nonPartialEvents, &ev.LLMResponse)\n\t\t\t\t}\n\t\t\t\tif ev.Content != nil {\n\t\t\t\t\tfor _, part := range ev.Content.Parts {\n\t\t\t\t\t\tif part.FunctionCall != nil {\n\t\t\t\t\t\t\tif ev.Partial {\n\t\t\t\t\t\t\t\tfunctionCallsPartial = append(functionCallsPartial, part.FunctionCall)\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tfunctionCalls = append(functionCalls, part.FunctionCall)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif part.FunctionResponse != nil {\n\t\t\t\t\t\t\tif ev.Partial {\n\t\t\t\t\t\t\t\tfunctionResponsesPartial = append(functionResponsesPartial, part.FunctionResponse)\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tfunctionResponses = append(functionResponses, part.FunctionResponse)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor ev, err := range it {\n\t\t\t\tif err != nil {\n\t\t\t\t\tt.Fatal(err)\n\t\t\t\t}\n\t\t\t\thandleLoop(ev)\n\t\t\t}\n\n\t\t\tignoreFields := []cmp.Option{\n\t\t\t\tcmpopts.IgnoreFields(genai.FunctionCall{}, \"ID\"),\n\t\t\t\tcmpopts.IgnoreFields(genai.Part{}, \"ThoughtSignature\"),\n\t\t\t\tcmpopts.IgnoreFields(genai.FunctionResponse{}, \"ID\"),\n\t\t\t\tcmpopts.IgnoreFields(model.LLMResponse{}, \"UsageMetadata\"),\n\t\t\t}\n\n\t\t\tif len(functionCalls) != 3 || len(functionResponses) != 3 {\n\t\t\t\tt.Errorf(\"expected 3 function calls and 3 function responses, got %d function calls and %d function responses\", len(functionCalls), len(functionResponses))\n\t\t\t}\n\t\t\tif len(functionCallsPartial) != 3 || len(functionResponsesPartial) != 0 {\n\t\t\t\tt.Errorf(\"expected 3 partial function calls and 0 partial function responses, got %d partial function calls and %d partial function responses\", len(functionCallsPartial), len(functionResponsesPartial))\n\t\t\t}\n\n\t\t\tit = r.Run(t.Context(), \"testUser\", \"testSession\", &genai.Content{\n\t\t\t\tParts: []*genai.Part{\n\t\t\t\t\tgenai.NewPartFromText(\"Great, now can you add 10 and 20? Also 40 and 50? And 60 and 70?\"),\n\t\t\t\t},\n\t\t\t\tRole: \"user\",\n\t\t\t}, agent.RunConfig{StreamingMode: agent.StreamingModeSSE})\n\t\t\tfor ev, err := range it {\n\t\t\t\tif err != nil {\n\t\t\t\t\tt.Fatal(err)\n\t\t\t\t}\n\t\t\t\thandleLoop(ev)\n\t\t\t}\n\n\t\t\tif len(functionCalls) != 6 || len(functionResponses) != 6 {\n\t\t\t\tt.Errorf(\"expected 6 function calls and 6 function responses, got %d function calls and %d function responses\", len(functionCalls), len(functionResponses))\n\t\t\t}\n\t\t\tif len(functionCallsPartial) != 6 || len(functionResponsesPartial) != 0 {\n\t\t\t\tt.Errorf(\"expected 6 partial function calls and 0 partial function responses, got %d partial function calls and %d partial function responses\", len(functionCallsPartial), len(functionResponsesPartial))\n\t\t\t}\n\n\t\t\tfor i, ev := range nonPartialEvents {\n\t\t\t\tif diff := cmp.Diff(tt.wantLLMResponse[i], ev, ignoreFields...); diff != \"\" {\n\t\t\t\t\tt.Errorf(\"diff in the events: got event[%d]: %v, want: %v, diff: %v\", i, ev, tt.wantLLMResponse[i], diff)\n\t\t\t\t}\n\t\t\t\tif i == 0 || i == 3 {\n\t\t\t\t\tif len(ev.Content.Parts[0].ThoughtSignature) == 0 {\n\t\t\t\t\t\tt.Errorf(\"expected non-empty thought signature, got empty\")\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "internal/llminternal/request_confirmation_processor.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage llminternal\n\nimport (\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"iter\"\n\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/agent\"\n\t\"google.golang.org/adk/internal/utils\"\n\t\"google.golang.org/adk/model\"\n\t\"google.golang.org/adk/session\"\n\t\"google.golang.org/adk/tool\"\n\t\"google.golang.org/adk/tool/toolconfirmation\"\n)\n\ntype confirmedCall struct {\n\tconfirmation *toolconfirmation.ToolConfirmation\n\tcall         genai.FunctionCall\n}\n\nfunc RequestConfirmationRequestProcessor(ctx agent.InvocationContext, req *model.LLMRequest, f *Flow) iter.Seq2[*session.Event, error] {\n\treturn func(yield func(*session.Event, error) bool) {\n\t\tllmAgent := asLLMAgent(ctx.Agent())\n\t\tif llmAgent == nil {\n\t\t\treturn // In python, no error is yielded.\n\t\t}\n\n\t\ttoolsmap := make(map[string]tool.Tool)\n\t\tfor _, tool := range f.Tools {\n\t\t\ttoolsmap[tool.Name()] = tool\n\t\t}\n\n\t\tvar events []*session.Event\n\t\tif ctx.Session() != nil {\n\t\t\tfor e := range ctx.Session().Events().All() {\n\t\t\t\tevents = append(events, e)\n\t\t\t}\n\t\t}\n\t\tconfirmationResponses := make(map[string]toolconfirmation.ToolConfirmation)\n\t\tconfirmationEventIndex := -1\n\t\tfor k := len(events) - 1; k >= 0; k-- {\n\t\t\tevent := events[k]\n\t\t\t// Find the first event authored by user\n\t\t\tif event.Author != \"user\" {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tresponses := utils.FunctionResponses(event.Content)\n\t\t\tif len(responses) == 0 {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tfor _, funcResp := range responses {\n\t\t\t\tif funcResp.Name != toolconfirmation.FunctionCallName {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tvar tc toolconfirmation.ToolConfirmation\n\t\t\t\tif funcResp.Response != nil {\n\t\t\t\t\tresp, hasResponseKey := funcResp.Response[\"response\"]\n\t\t\t\t\t// ADK web client will send a request that is always encapsulated in a 'response' key.\n\t\t\t\t\tif hasResponseKey && len(funcResp.Response) == 1 {\n\t\t\t\t\t\tif jsonString, ok := resp.(string); ok {\n\t\t\t\t\t\t\terr := json.Unmarshal([]byte(jsonString), &tc)\n\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\tyield(nil, fmt.Errorf(\"error 'response' key found but failed unmarshalling confirmation function response for event id %q: %w\", event.ID, err))\n\t\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tyield(nil, fmt.Errorf(\"error 'response' key found but value is not a string for confirmation function response for event id %q\", event.ID))\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttempJSON, err := json.Marshal(funcResp.Response)\n\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\tyield(nil, fmt.Errorf(\"error failed marshalling confirmation function response for event id %q: %w\", event.ID, err))\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t}\n\t\t\t\t\t\terr = json.Unmarshal(tempJSON, &tc)\n\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\tyield(nil, fmt.Errorf(\"error failed unmarshalling confirmation function response for event id %q: %w\", event.ID, err))\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconfirmationResponses[funcResp.ID] = tc\n\t\t\t}\n\t\t\tconfirmationEventIndex = k\n\t\t\tbreak\n\t\t}\n\n\t\tif len(confirmationResponses) == 0 {\n\t\t\treturn\n\t\t}\n\n\t\t// TODO could we skip events for >= confirmationEventIndex\n\t\tfor k := len(events) - 2; k >= 0; k-- {\n\t\t\tevent := events[k]\n\t\t\t// Find the system generated FunctionCall event requesting the tool confirmation\n\t\t\tcalls := utils.FunctionCalls(event.Content)\n\t\t\tif len(calls) == 0 {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\ttoolsToResumeByFunctionCallID := map[string]*confirmedCall{}\n\t\t\tfor _, functionCall := range calls {\n\t\t\t\tconfirmation, ok := confirmationResponses[functionCall.ID]\n\t\t\t\tif !ok {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\toriginalFunctionCall, err := toolconfirmation.OriginalCallFrom(functionCall)\n\t\t\t\tif err != nil {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\n\t\t\t\ttoolsToResumeByFunctionCallID[originalFunctionCall.ID] = &confirmedCall{\n\t\t\t\t\tconfirmation: &confirmation,\n\t\t\t\t\tcall:         *originalFunctionCall,\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif len(toolsToResumeByFunctionCallID) == 0 {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\t// TODO consider forward or backward pass instead of nested loops\n\t\t\t// Remove the tools that have already been confirmed.\n\t\t\tfor j := len(events) - 1; j > confirmationEventIndex; j-- {\n\t\t\t\tevent = events[j]\n\t\t\t\tresponses := utils.FunctionResponses(event.Content)\n\t\t\t\tif len(responses) == 0 {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tfor _, resp := range responses {\n\t\t\t\t\tdelete(toolsToResumeByFunctionCallID, resp.ID)\n\t\t\t\t}\n\t\t\t\tif len(toolsToResumeByFunctionCallID) == 0 {\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\t\t\tif len(toolsToResumeByFunctionCallID) == 0 {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tparts := make([]*genai.Part, 0)\n\t\t\ttoolsToResumeConfirmation := make(map[string]*toolconfirmation.ToolConfirmation, len(toolsToResumeByFunctionCallID))\n\t\t\tfor callID, cc := range toolsToResumeByFunctionCallID {\n\t\t\t\tparts = append(parts, &genai.Part{FunctionCall: &cc.call})\n\t\t\t\ttoolsToResumeConfirmation[callID] = cc.confirmation\n\t\t\t}\n\n\t\t\tev, err := f.handleFunctionCalls(ctx, toolsmap, &model.LLMResponse{\n\t\t\t\tContent: &genai.Content{Parts: parts, Role: genai.RoleUser},\n\t\t\t}, toolsToResumeConfirmation)\n\t\t\tif !yield(ev, err) {\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "internal/llminternal/request_confirmation_processor_test.go",
    "content": "// Copyright 2026 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage llminternal_test\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"testing\"\n\n\t\"github.com/google/go-cmp/cmp\"\n\t\"github.com/google/go-cmp/cmp/cmpopts\"\n\t\"google.golang.org/genai\"\n\t\"google.golang.org/protobuf/testing/protocmp\"\n\n\t\"google.golang.org/adk/agent\"\n\t\"google.golang.org/adk/agent/llmagent\"\n\ticontext \"google.golang.org/adk/internal/context\"\n\t\"google.golang.org/adk/internal/llminternal\"\n\t\"google.golang.org/adk/model\"\n\t\"google.golang.org/adk/session\"\n\t\"google.golang.org/adk/tool\"\n\t\"google.golang.org/adk/tool/toolconfirmation\"\n)\n\nconst (\n\tmockToolName                   = \"mock_tool\"\n\tmockFunctionCallID             = \"mock_function_call_id\"\n\tmockConfirmationFunctionCallID = \"mock_confirmation_function_call_id\"\n)\n\ntype mockTool struct {\n\tname string\n}\n\nfunc (m *mockTool) Name() string        { return m.name }\nfunc (m *mockTool) Description() string { return \"mock tool\" }\nfunc (m *mockTool) IsLongRunning() bool { return false }\nfunc (m *mockTool) Declaration() *genai.FunctionDeclaration {\n\treturn &genai.FunctionDeclaration{Name: m.name}\n}\n\nfunc (m *mockTool) Run(ctx tool.Context, args any) (map[string]any, error) {\n\tif ctx.ToolConfirmation() == nil || !ctx.ToolConfirmation().Confirmed {\n\t\treturn map[string]any{\"error\": string(\"Tool execution not confirmed\")}, nil\n\t}\n\treturn map[string]any{\"result\": \"Mock tool result with test\"}, nil\n}\n\nfunc newMockLlmAgent() (agent.Agent, []tool.Tool, error) {\n\ttestModel := &testModel{}\n\ttools := []tool.Tool{\n\t\t&mockTool{name: \"mock_tool\"},\n\t}\n\tagnt, err := llmagent.New(llmagent.Config{\n\t\tName:  \"testAgent\",\n\t\tModel: testModel,\n\t\tTools: tools,\n\t})\n\treturn agnt, tools, err\n}\n\nfunc createInvocationContext(t *testing.T, agnt agent.Agent, sess session.Session) agent.InvocationContext {\n\tt.Helper()\n\tctx := icontext.NewInvocationContext(context.Background(), icontext.InvocationContextParams{\n\t\tAgent:   agnt,\n\t\tSession: sess,\n\t})\n\treturn ctx\n}\n\nfunc TestRequestConfirmationRequestProcessor(t *testing.T) {\n\t// 1. Setup shared data and helpers used across test cases\n\toriginalFunctionCall := &genai.FunctionCall{\n\t\tName: mockToolName,\n\t\tArgs: map[string]any{\"param1\": \"test\"},\n\t\tID:   mockFunctionCallID,\n\t}\n\n\toriginalCallMap := map[string]any{\n\t\t\"name\": originalFunctionCall.Name,\n\t\t\"args\": originalFunctionCall.Args,\n\t\t\"id\":   originalFunctionCall.ID,\n\t}\n\n\t// Helper to create input events for the \"confirmation\" scenarios\n\tcreateConfirmationEvents := func(confirmed bool) []*session.Event {\n\t\ttoolConfirmation := toolconfirmation.ToolConfirmation{Confirmed: false, Hint: \"test hint\"}\n\t\ttoolConfirmationArgs := map[string]any{\n\t\t\t\"originalFunctionCall\": originalCallMap,\n\t\t\t\"toolConfirmation\":     toolConfirmation,\n\t\t}\n\n\t\tuserConfirmation := toolconfirmation.ToolConfirmation{Confirmed: confirmed}\n\t\tuserConfirmationJSON, _ := json.Marshal(userConfirmation) // Ignoring err for brevity in test setup helpers\n\t\tuserConfirmationResponse := map[string]any{\n\t\t\t\"response\": string(userConfirmationJSON),\n\t\t}\n\n\t\treturn []*session.Event{\n\t\t\t{\n\t\t\t\tAuthor: \"agent\",\n\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\tContent: &genai.Content{\n\t\t\t\t\t\tParts: []*genai.Part{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tFunctionCall: &genai.FunctionCall{\n\t\t\t\t\t\t\t\t\tName: toolconfirmation.FunctionCallName,\n\t\t\t\t\t\t\t\t\tArgs: toolConfirmationArgs,\n\t\t\t\t\t\t\t\t\tID:   mockConfirmationFunctionCallID,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tAuthor: \"user\",\n\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\tContent: &genai.Content{\n\t\t\t\t\t\tParts: []*genai.Part{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tFunctionResponse: &genai.FunctionResponse{\n\t\t\t\t\t\t\t\t\tName:     toolconfirmation.FunctionCallName,\n\t\t\t\t\t\t\t\t\tID:       mockConfirmationFunctionCallID,\n\t\t\t\t\t\t\t\t\tResponse: userConfirmationResponse,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t}\n\t}\n\n\t// 2. Define the test cases\n\ttests := []struct {\n\t\tname       string\n\t\tevents     []*session.Event\n\t\twantEvents []*session.Event\n\t}{\n\t\t{\n\t\t\tname:       \"NoEvents\",\n\t\t\tevents:     nil,\n\t\t\twantEvents: nil,\n\t\t},\n\t\t{\n\t\t\tname: \"NoFunctionResponses\",\n\t\t\tevents: []*session.Event{\n\t\t\t\t{\n\t\t\t\t\tAuthor: \"user\",\n\t\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\t\tContent: &genai.Content{},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twantEvents: nil,\n\t\t},\n\t\t{\n\t\t\tname: \"NoConfirmationFunctionResponse\",\n\t\t\tevents: []*session.Event{\n\t\t\t\t{\n\t\t\t\t\tAuthor: \"user\",\n\t\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\t\tContent: &genai.Content{\n\t\t\t\t\t\t\tParts: []*genai.Part{\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tFunctionResponse: &genai.FunctionResponse{\n\t\t\t\t\t\t\t\t\t\tName:     \"other_function\",\n\t\t\t\t\t\t\t\t\t\tResponse: map[string]any{},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twantEvents: nil,\n\t\t},\n\t\t{\n\t\t\tname:   \"Success\",\n\t\t\tevents: createConfirmationEvents(true),\n\t\t\twantEvents: []*session.Event{\n\t\t\t\t{\n\t\t\t\t\tAuthor: \"testAgent\",\n\t\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\t\tContent: &genai.Content{\n\t\t\t\t\t\t\tParts: []*genai.Part{\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tFunctionResponse: &genai.FunctionResponse{\n\t\t\t\t\t\t\t\t\t\tName:     mockToolName,\n\t\t\t\t\t\t\t\t\t\tID:       mockFunctionCallID,\n\t\t\t\t\t\t\t\t\t\tResponse: map[string]any{\"result\": \"Mock tool result with test\"},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tRole: \"user\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname:   \"ToolNotConfirmed\",\n\t\t\tevents: createConfirmationEvents(false),\n\t\t\twantEvents: []*session.Event{\n\t\t\t\t{\n\t\t\t\t\tAuthor: \"testAgent\",\n\t\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\t\tContent: &genai.Content{\n\t\t\t\t\t\t\tParts: []*genai.Part{\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tFunctionResponse: &genai.FunctionResponse{\n\t\t\t\t\t\t\t\t\t\tName:     mockToolName,\n\t\t\t\t\t\t\t\t\t\tID:       mockFunctionCallID,\n\t\t\t\t\t\t\t\t\t\tResponse: map[string]any{\"error\": \"Tool execution not confirmed\"},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tRole: \"user\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n\n\t// 3. Execution Loop\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tagnt, tools, err := newMockLlmAgent()\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"error creating mock llmagent: %v\", err)\n\t\t\t}\n\n\t\t\tinvocationContext := createInvocationContext(t, agnt, &fakeSession{\n\t\t\t\tevents: tt.events,\n\t\t\t})\n\t\t\tllmRequest := &model.LLMRequest{}\n\n\t\t\titer := llminternal.RequestConfirmationRequestProcessor(invocationContext, llmRequest, &llminternal.Flow{Tools: tools})\n\n\t\t\tvar gotEvents []*session.Event\n\t\t\tfor event, err := range iter {\n\t\t\t\tif err != nil {\n\t\t\t\t\tt.Fatalf(\"RequestConfirmationRequestProcessor() unexpected error: %v\", err)\n\t\t\t\t}\n\t\t\t\tgotEvents = append(gotEvents, event)\n\t\t\t}\n\n\t\t\t// Validate Count\n\t\t\tif len(gotEvents) != len(tt.wantEvents) {\n\t\t\t\tt.Errorf(\"RequestConfirmationRequestProcessor() got %d events, want %d\", len(gotEvents), len(tt.wantEvents))\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// Validate Content (only if we expected events)\n\t\t\tif len(tt.wantEvents) > 0 {\n\t\t\t\tignoreFields := []cmp.Option{\n\t\t\t\t\tprotocmp.Transform(),\n\t\t\t\t\tcmpopts.IgnoreFields(session.Event{}, \"ID\"),\n\t\t\t\t\tcmpopts.IgnoreFields(session.Event{}, \"Timestamp\"),\n\t\t\t\t\tcmpopts.IgnoreFields(session.Event{}, \"InvocationID\"),\n\t\t\t\t\tcmpopts.IgnoreFields(session.EventActions{}, \"StateDelta\", \"ArtifactDelta\"),\n\t\t\t\t}\n\n\t\t\t\tif diff := cmp.Diff(tt.wantEvents, gotEvents, ignoreFields...); diff != \"\" {\n\t\t\t\t\tt.Errorf(\"RequestConfirmationRequestProcessor() event diff (-want +got):\\n%s\", diff)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "internal/llminternal/stream_aggregator.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage llminternal\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"iter\"\n\t\"maps\"\n\t\"reflect\"\n\t\"strings\"\n\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/internal/llminternal/converters\"\n\t\"google.golang.org/adk/model\"\n)\n\n// streamingResponseAggregator aggregates partial streaming responses.\n// It aggregates content from partial responses, and generates LlmResponses for\n// individual (partial) model responses, as well as for aggregated content.\ntype streamingResponseAggregator struct {\n\tusageMetadata     *genai.GenerateContentResponseUsageMetadata\n\tgroundingMetadata *genai.GroundingMetadata\n\tcitationMetadata  *genai.CitationMetadata\n\tresponse          *model.LLMResponse\n\n\tsequence             []*genai.Part\n\tcurrentTextBuffer    string\n\tcurrentTextIsThought bool\n\tfinishReason         genai.FinishReason\n\n\tcurrentFunctionName             string\n\tcurrentFunctionID               string\n\tcurrentFunctionArgs             map[string]any\n\tcurrentFunctionThoughtSignature []byte\n}\n\n// NewStreamingResponseAggregator creates a new, initialized streamingResponseAggregator.\nfunc NewStreamingResponseAggregator() *streamingResponseAggregator {\n\treturn &streamingResponseAggregator{}\n}\n\n// ProcessResponse transforms the GenerateContentResponse into an model.Response and yields that result,\n// also yielding an aggregated response if the GenerateContentResponse has zero parts or is audio data\nfunc (s *streamingResponseAggregator) ProcessResponse(ctx context.Context, genResp *genai.GenerateContentResponse) iter.Seq2[*model.LLMResponse, error] {\n\treturn func(yield func(*model.LLMResponse, error) bool) {\n\t\tif len(genResp.Candidates) == 0 {\n\t\t\t// shouldn't happen?\n\t\t\tyield(nil, fmt.Errorf(\"empty response\"))\n\t\t\treturn\n\t\t}\n\t\tcandidate := genResp.Candidates[0]\n\t\tresp := converters.Genai2LLMResponse(genResp)\n\t\tresp.TurnComplete = candidate.FinishReason != \"\"\n\t\t// Aggregate the response and check if an intermediate event to yield was created\n\t\tif aggrResp := s.aggregateResponse(resp); aggrResp != nil {\n\t\t\tif !yield(aggrResp, nil) {\n\t\t\t\treturn // Consumer stopped\n\t\t\t}\n\t\t}\n\t\t// Yield the processed response\n\t\tif !yield(resp, nil) {\n\t\t\treturn // Consumer stopped\n\t\t}\n\t}\n}\n\nfunc (s *streamingResponseAggregator) aggregateResponse(llmResponse *model.LLMResponse) *model.LLMResponse {\n\ts.response = llmResponse\n\ts.usageMetadata = llmResponse.UsageMetadata\n\tif llmResponse.GroundingMetadata != nil {\n\t\ts.groundingMetadata = llmResponse.GroundingMetadata\n\t}\n\tif llmResponse.CitationMetadata != nil {\n\t\ts.citationMetadata = llmResponse.CitationMetadata\n\t}\n\n\tif llmResponse.FinishReason != \"\" {\n\t\ts.finishReason = llmResponse.FinishReason\n\t}\n\tllmResponse.Partial = true\n\n\tif llmResponse.Content == nil {\n\t\treturn nil\n\t}\n\n\tfor _, part := range llmResponse.Content.Parts {\n\t\t// gemini 3 in streaming returns a last response with an empty part. We will filter it out.\n\t\tif reflect.ValueOf(*part).IsZero() {\n\t\t\tcontinue\n\t\t}\n\t\tif part.Text != \"\" {\n\t\t\tif s.currentTextBuffer != \"\" && part.Thought != s.currentTextIsThought {\n\t\t\t\ts.flushTextBufferToSequence()\n\t\t\t}\n\t\t\tif s.currentTextBuffer == \"\" {\n\t\t\t\ts.currentTextIsThought = part.Thought\n\t\t\t}\n\t\t\ts.currentTextBuffer += part.Text\n\t\t} else if part.FunctionCall != nil {\n\t\t\t// Process function call (handles both streaming Args and non-streaming Args\n\t\t\ts.processFunctionCallPart(part)\n\t\t} else {\n\t\t\t// Other non-text parts (bytes, etc.)\n\t\t\t// Flush any buffered text first, then add the non-text part\n\t\t\ts.flushTextBufferToSequence()\n\t\t\ts.sequence = append(s.sequence, part)\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc (s *streamingResponseAggregator) processFunctionCallPart(part *genai.Part) {\n\tif part.FunctionCall == nil {\n\t\treturn\n\t}\n\tif part.FunctionCall.PartialArgs != nil || (part.FunctionCall.WillContinue != nil && *part.FunctionCall.WillContinue) {\n\t\tif len(part.ThoughtSignature) > 0 && s.currentFunctionThoughtSignature == nil {\n\t\t\ts.currentFunctionThoughtSignature = part.ThoughtSignature\n\t\t}\n\t\ts.processStreamingFunctionCallPart(part)\n\t} else {\n\t\tif part.FunctionCall.Name != \"\" {\n\t\t\ts.flushTextBufferToSequence()\n\t\t\ts.sequence = append(s.sequence, part)\n\t\t}\n\t}\n}\n\n// Process a streaming function call with partialArgs.\nfunc (s *streamingResponseAggregator) processStreamingFunctionCallPart(part *genai.Part) {\n\tif part.FunctionCall.Name != \"\" {\n\t\ts.currentFunctionName = part.FunctionCall.Name\n\t}\n\tif part.FunctionCall.ID != \"\" {\n\t\ts.currentFunctionID = part.FunctionCall.ID\n\t}\n\tfor _, arg := range part.FunctionCall.PartialArgs {\n\t\tjsonPath := arg.JsonPath\n\t\tif jsonPath == \"\" {\n\t\t\tcontinue\n\t\t}\n\t\tvalue, ok := s.getValueFromPartialArg(arg, jsonPath)\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\t\ts.setValueByJSONPath(jsonPath, value)\n\t}\n\tif part.FunctionCall.WillContinue != nil && *part.FunctionCall.WillContinue {\n\t\treturn\n\t}\n\ts.flushTextBufferToSequence()\n\ts.flushFunctionCallToSequence()\n}\n\nfunc (s *streamingResponseAggregator) getValueFromPartialArg(partialArg *genai.PartialArg, jsonPath string) (any, bool) {\n\tvar value any\n\tvar hasValue bool\n\n\tif partialArg.StringValue != \"\" {\n\t\tstringChunk := partialArg.StringValue\n\t\thasValue = true\n\n\t\t// Clean up the JSONPath prefix\n\t\tpathWithoutPrefix := jsonPath\n\t\tif strings.HasPrefix(jsonPath, \"$.\") {\n\t\t\tpathWithoutPrefix = jsonPath[2:]\n\t\t}\n\t\tpathParts := strings.Split(pathWithoutPrefix, \".\")\n\n\t\t// Try to get existing value by traversing the map\n\t\tvar existingValue any = s.currentFunctionArgs\n\t\tfor _, part := range pathParts {\n\t\t\tif m, ok := existingValue.(map[string]any); ok {\n\t\t\t\tif val, exists := m[part]; exists {\n\t\t\t\t\texistingValue = val\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t}\n\t\t\t// If we can't find the path or it's not a map, reset existingValue\n\t\t\texistingValue = nil\n\t\t\tbreak\n\t\t}\n\n\t\t// Append to existing string or set new value\n\t\tif str, ok := existingValue.(string); ok {\n\t\t\tvalue = str + stringChunk\n\t\t} else {\n\t\t\tvalue = stringChunk\n\t\t}\n\n\t} else if partialArg.NumberValue != nil {\n\t\tvalue = *partialArg.NumberValue\n\t\thasValue = true\n\t} else if partialArg.BoolValue != nil {\n\t\tvalue = *partialArg.BoolValue\n\t\thasValue = true\n\t} else if partialArg.NULLValue != \"\" {\n\t\tvalue = nil\n\t\thasValue = true\n\t}\n\n\treturn value, hasValue\n}\n\nfunc (s *streamingResponseAggregator) setValueByJSONPath(jsonPath string, value any) {\n\t// Initialize the map if it hasn't been already\n\tif s.currentFunctionArgs == nil {\n\t\ts.currentFunctionArgs = make(map[string]any)\n\t}\n\n\t// Remove leading \"$.\" from jsonPath\n\tpath := jsonPath\n\tif strings.HasPrefix(jsonPath, \"$.\") {\n\t\tpath = jsonPath[2:]\n\t}\n\n\t// Split path into components\n\tpathParts := strings.Split(path, \".\")\n\tif len(pathParts) == 0 || (len(pathParts) == 1 && pathParts[0] == \"\") {\n\t\treturn // Handle empty path case\n\t}\n\n\t// Navigate to the correct location\n\tcurrent := s.currentFunctionArgs\n\n\t// Iterate through all parts except the last one\n\tfor _, part := range pathParts[:len(pathParts)-1] {\n\t\tnext, exists := current[part]\n\n\t\t// If the path doesn't exist, or the existing value isn't a map,\n\t\t// create a new map at this node.\n\t\tnextMap, ok := next.(map[string]any)\n\t\tif !exists || !ok {\n\t\t\tnextMap = make(map[string]any)\n\t\t\tcurrent[part] = nextMap\n\t\t}\n\n\t\tcurrent = nextMap\n\t}\n\n\t// Set the final value at the last key\n\tlastKey := pathParts[len(pathParts)-1]\n\tcurrent[lastKey] = value\n}\n\nfunc (s *streamingResponseAggregator) flushTextBufferToSequence() {\n\t// Check if buffer has content (strings.Builder.Len() is efficient)\n\tif s.currentTextBuffer != \"\" {\n\t\ts.sequence = append(s.sequence, &genai.Part{\n\t\t\tText:    s.currentTextBuffer,\n\t\t\tThought: s.currentTextIsThought,\n\t\t})\n\t\t// Reset the buffer and the state\n\t\ts.currentTextBuffer = \"\"\n\t\ts.currentTextIsThought = false\n\t}\n}\n\nfunc (s *streamingResponseAggregator) flushFunctionCallToSequence() {\n\tif s.currentFunctionName != \"\" {\n\t\tfc := &genai.FunctionCall{\n\t\t\tName: s.currentFunctionName,\n\t\t\tArgs: maps.Clone(s.currentFunctionArgs),\n\t\t\tID:   s.currentFunctionID,\n\t\t}\n\n\t\tfcPart := &genai.Part{\n\t\t\tFunctionCall: fc,\n\t\t}\n\t\tif s.currentFunctionThoughtSignature != nil {\n\t\t\tfcPart.ThoughtSignature = s.currentFunctionThoughtSignature\n\t\t}\n\n\t\ts.sequence = append(s.sequence, fcPart)\n\n\t\ts.currentFunctionName = \"\"\n\t\ts.currentFunctionID = \"\"\n\t\ts.currentFunctionThoughtSignature = nil\n\t\ts.currentFunctionArgs = make(map[string]any)\n\t}\n}\n\n// Close generates an aggregated response at the end, if needed,\n// this should be called after all the model responses are processed.\nfunc (s *streamingResponseAggregator) Close() *model.LLMResponse {\n\tif s.response != nil {\n\t\ts.flushTextBufferToSequence()\n\t\ts.flushFunctionCallToSequence()\n\t\terrorCode := \"\"\n\t\terrorMessage := \"\"\n\t\tif s.finishReason != genai.FinishReasonStop {\n\t\t\tif s.response.ErrorCode != \"\" {\n\t\t\t\terrorCode = s.response.ErrorCode\n\t\t\t} else {\n\t\t\t\terrorCode = \"error\"\n\t\t\t}\n\t\t\tif s.response.ErrorMessage != \"\" {\n\t\t\t\terrorMessage = s.response.ErrorMessage\n\t\t\t} else {\n\t\t\t\terrorMessage = \"error\"\n\t\t\t}\n\t\t}\n\n\t\treturn &model.LLMResponse{\n\t\t\tContent: &genai.Content{\n\t\t\t\tParts: s.sequence,\n\t\t\t\tRole:  genai.RoleModel,\n\t\t\t},\n\t\t\tUsageMetadata:     s.usageMetadata,\n\t\t\tGroundingMetadata: s.groundingMetadata,\n\t\t\tCitationMetadata:  s.citationMetadata,\n\t\t\tErrorCode:         errorCode,\n\t\t\tErrorMessage:      errorMessage,\n\t\t}\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "internal/llminternal/stream_aggregator_test.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage llminternal_test\n\nimport (\n\t\"context\"\n\t\"iter\"\n\t\"testing\"\n\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/agent\"\n\t\"google.golang.org/adk/agent/llmagent\"\n\t\"google.golang.org/adk/internal/llminternal\"\n\t\"google.golang.org/adk/internal/testutil\"\n\t\"google.golang.org/adk/model\"\n\t\"google.golang.org/adk/session\"\n\t\"google.golang.org/adk/tool\"\n\t\"google.golang.org/adk/tool/functiontool\"\n)\n\nfunc ptr[T any](v T) *T {\n\treturn &v\n}\n\nfunc TestProgressiveSSEStreamingFunctionCallArguments(t *testing.T) {\n\taggregator := llminternal.NewStreamingResponseAggregator()\n\tctx := t.Context()\n\n\t// Chunk 1: FC name + partial location argument (\"New \")\n\tchunk1 := &genai.GenerateContentResponse{\n\t\tCandidates: []*genai.Candidate{\n\t\t\t{\n\t\t\t\tContent: &genai.Content{\n\t\t\t\t\tRole: \"model\",\n\t\t\t\t\tParts: []*genai.Part{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tFunctionCall: &genai.FunctionCall{\n\t\t\t\t\t\t\t\tName: \"get_weather\",\n\t\t\t\t\t\t\t\tID:   \"fc_001\",\n\t\t\t\t\t\t\t\tPartialArgs: []*genai.PartialArg{\n\t\t\t\t\t\t\t\t\t{JsonPath: \"$.location\", StringValue: \"New \"},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tWillContinue: ptr(true),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n\n\t// Chunk 2: Continue location argument (\"York\")\n\tchunk2 := &genai.GenerateContentResponse{\n\t\tCandidates: []*genai.Candidate{\n\t\t\t{\n\t\t\t\tContent: &genai.Content{\n\t\t\t\t\tRole: \"model\",\n\t\t\t\t\tParts: []*genai.Part{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tFunctionCall: &genai.FunctionCall{\n\t\t\t\t\t\t\t\tPartialArgs: []*genai.PartialArg{\n\t\t\t\t\t\t\t\t\t{JsonPath: \"$.location\", StringValue: \"York\"},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tWillContinue: ptr(true),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n\n\t// Chunk 3: Add unit argument, FC complete\n\tchunk3 := &genai.GenerateContentResponse{\n\t\tCandidates: []*genai.Candidate{\n\t\t\t{\n\t\t\t\tContent: &genai.Content{\n\t\t\t\t\tRole: \"model\",\n\t\t\t\t\tParts: []*genai.Part{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tFunctionCall: &genai.FunctionCall{\n\t\t\t\t\t\t\t\tPartialArgs: []*genai.PartialArg{\n\t\t\t\t\t\t\t\t\t{JsonPath: \"$.unit\", StringValue: \"celsius\"},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tWillContinue: ptr(false),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tFinishReason: genai.FinishReasonStop,\n\t\t\t},\n\t\t},\n\t}\n\n\tvar processedChunks []*model.LLMResponse\n\n\tfor _, chunk := range []*genai.GenerateContentResponse{chunk1, chunk2, chunk3} {\n\t\tfor resp, err := range aggregator.ProcessResponse(ctx, chunk) {\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"unexpected error: %v\", err)\n\t\t\t}\n\t\t\tif resp != nil {\n\t\t\t\tprocessedChunks = append(processedChunks, resp)\n\t\t\t}\n\t\t}\n\t}\n\n\tfinalResponse := aggregator.Close()\n\tif finalResponse == nil {\n\t\tt.Fatal(\"expected final response from aggregator\")\n\t}\n\n\tparts := finalResponse.Content.Parts\n\tif len(parts) != 1 {\n\t\tt.Fatalf(\"expected 1 part, got %d\", len(parts))\n\t}\n\n\tfcPart := parts[0]\n\tif fcPart.FunctionCall == nil {\n\t\tt.Fatal(\"expected function call part\")\n\t}\n\tif fcPart.FunctionCall.Name != \"get_weather\" {\n\t\tt.Errorf(\"expected get_weather, got %s\", fcPart.FunctionCall.Name)\n\t}\n\tif fcPart.FunctionCall.ID != \"fc_001\" {\n\t\tt.Errorf(\"expected fc_001, got %s\", fcPart.FunctionCall.ID)\n\t}\n\n\targs := fcPart.FunctionCall.Args\n\tif args[\"location\"] != \"New York\" {\n\t\tt.Errorf(\"expected location 'New York', got '%v'\", args[\"location\"])\n\t}\n\tif args[\"unit\"] != \"celsius\" {\n\t\tt.Errorf(\"expected unit 'celsius', got '%v'\", args[\"unit\"])\n\t}\n}\n\nfunc TestProgressiveSSEPreservesThoughtSignature(t *testing.T) {\n\taggregator := llminternal.NewStreamingResponseAggregator()\n\tctx := t.Context()\n\n\ttestThoughtSignature := []byte(\"test_signature_abc123\")\n\n\tchunk := &genai.GenerateContentResponse{\n\t\tCandidates: []*genai.Candidate{\n\t\t\t{\n\t\t\t\tContent: &genai.Content{\n\t\t\t\t\tRole: \"model\",\n\t\t\t\t\tParts: []*genai.Part{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tFunctionCall: &genai.FunctionCall{\n\t\t\t\t\t\t\t\tName: \"add_5_numbers\",\n\t\t\t\t\t\t\t\tID:   \"fc_003\",\n\t\t\t\t\t\t\t\tPartialArgs: []*genai.PartialArg{\n\t\t\t\t\t\t\t\t\t{JsonPath: \"$.num1\", NumberValue: ptr(10.0)},\n\t\t\t\t\t\t\t\t\t{JsonPath: \"$.num2\", NumberValue: ptr(20.0)},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tWillContinue: ptr(false),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tThoughtSignature: testThoughtSignature,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tFinishReason: genai.FinishReasonStop,\n\t\t\t},\n\t\t},\n\t}\n\n\tfor _, err := range aggregator.ProcessResponse(ctx, chunk) {\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"unexpected error: %v\", err)\n\t\t}\n\t}\n\n\tfinalResponse := aggregator.Close()\n\tif finalResponse == nil {\n\t\tt.Fatal(\"expected final response\")\n\t}\n\n\tparts := finalResponse.Content.Parts\n\tif len(parts) != 1 {\n\t\tt.Fatalf(\"expected 1 part, got %d\", len(parts))\n\t}\n\n\tfcPart := parts[0]\n\tif fcPart.FunctionCall == nil {\n\t\tt.Fatal(\"expected function call\")\n\t}\n\tif fcPart.FunctionCall.Name != \"add_5_numbers\" {\n\t\tt.Errorf(\"expected add_5_numbers, got %s\", fcPart.FunctionCall.Name)\n\t}\n\tif string(fcPart.ThoughtSignature) != string(testThoughtSignature) {\n\t\tt.Errorf(\"expected thought signature %s, got %s\", string(testThoughtSignature), string(fcPart.ThoughtSignature))\n\t}\n}\n\nfunc TestProgressiveSSEHandlesEmptyFunctionCall(t *testing.T) {\n\taggregator := llminternal.NewStreamingResponseAggregator()\n\tctx := t.Context()\n\n\tchunk1 := &genai.GenerateContentResponse{\n\t\tCandidates: []*genai.Candidate{\n\t\t\t{\n\t\t\t\tContent: &genai.Content{\n\t\t\t\t\tRole: \"model\",\n\t\t\t\t\tParts: []*genai.Part{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tFunctionCall: &genai.FunctionCall{\n\t\t\t\t\t\t\t\tName: \"concat_number_and_string\",\n\t\t\t\t\t\t\t\tID:   \"fc_001\",\n\t\t\t\t\t\t\t\tPartialArgs: []*genai.PartialArg{\n\t\t\t\t\t\t\t\t\t{JsonPath: \"$.num\", NumberValue: ptr(100.0)},\n\t\t\t\t\t\t\t\t\t{JsonPath: \"$.s\", StringValue: \"ADK\"},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tWillContinue: ptr(false),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n\n\tchunk2 := &genai.GenerateContentResponse{\n\t\tCandidates: []*genai.Candidate{\n\t\t\t{\n\t\t\t\tContent: &genai.Content{\n\t\t\t\t\tRole: \"model\",\n\t\t\t\t\tParts: []*genai.Part{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tFunctionCall: &genai.FunctionCall{},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tFinishReason: genai.FinishReasonStop,\n\t\t\t},\n\t\t},\n\t}\n\n\tfor _, chunk := range []*genai.GenerateContentResponse{chunk1, chunk2} {\n\t\tfor _, err := range aggregator.ProcessResponse(ctx, chunk) {\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"unexpected error: %v\", err)\n\t\t\t}\n\t\t}\n\t}\n\n\tfinalResponse := aggregator.Close()\n\tif finalResponse == nil {\n\t\tt.Fatal(\"expected final response\")\n\t}\n\n\tparts := finalResponse.Content.Parts\n\tif len(parts) != 1 {\n\t\tt.Fatalf(\"expected 1 part, got %d\", len(parts))\n\t}\n\n\tfcPart := parts[0]\n\tif fcPart.FunctionCall == nil {\n\t\tt.Fatal(\"expected function call\")\n\t}\n\tif fcPart.FunctionCall.Name != \"concat_number_and_string\" {\n\t\tt.Errorf(\"expected concat_number_and_string, got %s\", fcPart.FunctionCall.Name)\n\t}\n\tif fcPart.FunctionCall.ID != \"fc_001\" {\n\t\tt.Errorf(\"expected fc_001, got %s\", fcPart.FunctionCall.ID)\n\t}\n\n\targs := fcPart.FunctionCall.Args\n\tif args[\"num\"] != 100.0 {\n\t\tt.Errorf(\"expected num 100, got %v\", args[\"num\"])\n\t}\n\tif args[\"s\"] != \"ADK\" {\n\t\tt.Errorf(\"expected s 'ADK', got %v\", args[\"s\"])\n\t}\n}\n\nfunc TestStreamingFCChunkWithWillContinueButNoPartialArgs(t *testing.T) {\n\taggregator := llminternal.NewStreamingResponseAggregator()\n\tctx := t.Context()\n\n\tchunk1 := &genai.GenerateContentResponse{\n\t\tCandidates: []*genai.Candidate{\n\t\t\t{\n\t\t\t\tContent: &genai.Content{\n\t\t\t\t\tRole: \"model\",\n\t\t\t\t\tParts: []*genai.Part{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tFunctionCall: &genai.FunctionCall{\n\t\t\t\t\t\t\t\tName:         \"my_tool\",\n\t\t\t\t\t\t\t\tID:           \"fc_gemini3\",\n\t\t\t\t\t\t\t\tWillContinue: ptr(true),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tThoughtSignature: []byte(\"test_sig_123\"),\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n\n\tchunk2 := &genai.GenerateContentResponse{\n\t\tCandidates: []*genai.Candidate{\n\t\t\t{\n\t\t\t\tContent: &genai.Content{\n\t\t\t\t\tRole: \"model\",\n\t\t\t\t\tParts: []*genai.Part{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tFunctionCall: &genai.FunctionCall{\n\t\t\t\t\t\t\t\tPartialArgs: []*genai.PartialArg{\n\t\t\t\t\t\t\t\t\t{JsonPath: \"$.document\", StringValue: \"Once upon \"},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tWillContinue: ptr(true),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n\n\tchunk3 := &genai.GenerateContentResponse{\n\t\tCandidates: []*genai.Candidate{\n\t\t\t{\n\t\t\t\tContent: &genai.Content{\n\t\t\t\t\tRole: \"model\",\n\t\t\t\t\tParts: []*genai.Part{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tFunctionCall: &genai.FunctionCall{\n\t\t\t\t\t\t\t\tPartialArgs: []*genai.PartialArg{\n\t\t\t\t\t\t\t\t\t{JsonPath: \"$.document\", StringValue: \"a time...\"},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tWillContinue: ptr(true),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n\n\tchunk4 := &genai.GenerateContentResponse{\n\t\tCandidates: []*genai.Candidate{\n\t\t\t{\n\t\t\t\tContent: &genai.Content{\n\t\t\t\t\tRole: \"model\",\n\t\t\t\t\tParts: []*genai.Part{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tFunctionCall: &genai.FunctionCall{\n\t\t\t\t\t\t\t\tWillContinue: ptr(false),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tFinishReason: genai.FinishReasonStop,\n\t\t\t},\n\t\t},\n\t}\n\n\tvar processedChunks []*model.LLMResponse\n\tfor _, chunk := range []*genai.GenerateContentResponse{chunk1, chunk2, chunk3, chunk4} {\n\t\tfor resp, err := range aggregator.ProcessResponse(ctx, chunk) {\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"unexpected error: %v\", err)\n\t\t\t}\n\t\t\tif resp != nil {\n\t\t\t\tprocessedChunks = append(processedChunks, resp)\n\t\t\t}\n\t\t}\n\t}\n\n\t// Wait, we don't strictly test that intermediate chunks are marked partial because ProcessResponse behavior might differ. Let's just check the final result.\n\tfinalResponse := aggregator.Close()\n\tif finalResponse == nil {\n\t\tt.Fatal(\"expected final response\")\n\t}\n\n\tparts := finalResponse.Content.Parts\n\tif len(parts) != 1 {\n\t\tt.Fatalf(\"expected 1 part, got %d\", len(parts))\n\t}\n\n\tfcPart := parts[0]\n\tif fcPart.FunctionCall == nil {\n\t\tt.Fatal(\"expected function call\")\n\t}\n\tif fcPart.FunctionCall.Name != \"my_tool\" {\n\t\tt.Errorf(\"expected my_tool, got %s\", fcPart.FunctionCall.Name)\n\t}\n\tif fcPart.FunctionCall.ID != \"fc_gemini3\" {\n\t\tt.Errorf(\"expected fc_gemini3, got %s\", fcPart.FunctionCall.ID)\n\t}\n\tif string(fcPart.ThoughtSignature) != \"test_sig_123\" {\n\t\tt.Errorf(\"expected thought signature test_sig_123, got %s\", string(fcPart.ThoughtSignature))\n\t}\n\n\targs := fcPart.FunctionCall.Args\n\tif args[\"document\"] != \"Once upon a time...\" {\n\t\tt.Errorf(\"expected document 'Once upon a time...', got '%v'\", args[\"document\"])\n\t}\n}\n\ntype streamingMockModel struct {\n\tstreamChunks []*model.LLMResponse\n\tcallCount    int\n}\n\nfunc (m *streamingMockModel) GenerateContent(ctx context.Context, req *model.LLMRequest, stream bool) iter.Seq2[*model.LLMResponse, error] {\n\tm.callCount++\n\treturn func(yield func(*model.LLMResponse, error) bool) {\n\t\tif m.callCount > 1 {\n\t\t\tresp := &model.LLMResponse{\n\t\t\t\tContent: &genai.Content{\n\t\t\t\t\tRole:  \"model\",\n\t\t\t\t\tParts: []*genai.Part{{Text: \"Task completed.\"}},\n\t\t\t\t},\n\t\t\t\tPartial: false,\n\t\t\t}\n\t\t\tyield(resp, nil)\n\t\t\treturn\n\t\t}\n\n\t\taggregator := llminternal.NewStreamingResponseAggregator()\n\t\tfor _, chunk := range m.streamChunks {\n\t\t\tgenResp := m.llmResponseToGenerateContentResponse(chunk)\n\t\t\tfor processedChunk, err := range aggregator.ProcessResponse(ctx, genResp) {\n\t\t\t\tif err != nil {\n\t\t\t\t\tyield(nil, err)\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif processedChunk != nil {\n\t\t\t\t\tif !yield(processedChunk, nil) {\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif finalResp := aggregator.Close(); finalResp != nil {\n\t\t\tyield(finalResp, nil)\n\t\t}\n\t}\n}\n\nfunc (m *streamingMockModel) Name() string { return \"streaming-mock\" }\n\nfunc (m *streamingMockModel) llmResponseToGenerateContentResponse(resp *model.LLMResponse) *genai.GenerateContentResponse {\n\tvar candidates []*genai.Candidate\n\tif resp.Content != nil {\n\t\tcandidates = append(candidates, &genai.Candidate{\n\t\t\tContent:      resp.Content,\n\t\t\tFinishReason: resp.FinishReason,\n\t\t})\n\t}\n\treturn &genai.GenerateContentResponse{\n\t\tCandidates:    candidates,\n\t\tUsageMetadata: resp.UsageMetadata,\n\t}\n}\n\ntype GetWeatherArgs struct {\n\tLocation string `json:\"location\"`\n}\n\nfunc getWeather(ctx tool.Context, args GetWeatherArgs) (map[string]any, error) {\n\treturn map[string]any{\n\t\t\"temperature\": 22,\n\t\t\"condition\":   \"sunny\",\n\t\t\"location\":    args.Location,\n\t}, nil\n}\n\nfunc TestProgressiveSSEStreamingFunctionCalls(t *testing.T) {\n\tresponse1 := &model.LLMResponse{\n\t\tContent: &genai.Content{\n\t\t\tRole:  \"model\",\n\t\t\tParts: []*genai.Part{{Text: \"Checking weather...\"}},\n\t\t},\n\t}\n\tresponse2 := &model.LLMResponse{\n\t\tContent: &genai.Content{\n\t\t\tRole: \"model\",\n\t\t\tParts: []*genai.Part{\n\t\t\t\t{\n\t\t\t\t\tFunctionCall: &genai.FunctionCall{\n\t\t\t\t\t\tName: \"get_weather\",\n\t\t\t\t\t\tArgs: map[string]any{\"location\": \"Tokyo\"},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n\tresponse3 := &model.LLMResponse{\n\t\tContent: &genai.Content{\n\t\t\tRole: \"model\",\n\t\t\tParts: []*genai.Part{\n\t\t\t\t{\n\t\t\t\t\tFunctionCall: &genai.FunctionCall{\n\t\t\t\t\t\tName: \"get_weather\",\n\t\t\t\t\t\tArgs: map[string]any{\"location\": \"New York\"},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tFinishReason: genai.FinishReasonStop,\n\t}\n\n\tmockModel := &streamingMockModel{\n\t\tstreamChunks: []*model.LLMResponse{response1, response2, response3},\n\t}\n\n\tgetWeatherTool, _ := functiontool.New(functiontool.Config{\n\t\tName:        \"get_weather\",\n\t\tDescription: \"get weather for location\",\n\t}, getWeather)\n\n\tag, _ := llmagent.New(llmagent.Config{\n\t\tName:  \"weather_agent\",\n\t\tModel: mockModel,\n\t\tTools: []tool.Tool{getWeatherTool},\n\t})\n\n\trunner := testutil.NewTestAgentRunner(t, ag)\n\tcfg := agent.RunConfig{StreamingMode: agent.StreamingModeSSE}\n\n\tevents, err := testutil.CollectEvents(runner.RunContentWithConfig(t, \"session-1\", genai.NewContentFromText(\"What is the weather?\", \"user\"), cfg))\n\tif err != nil {\n\t\tt.Fatalf(\"unexpected error: %v\", err)\n\t}\n\n\tif len(events) != 6 {\n\t\tt.Fatalf(\"expected 6 events, got %d\", len(events))\n\t}\n\n\tif !events[0].Partial || events[0].LLMResponse.Content.Parts[0].Text != \"Checking weather...\" {\n\t\tt.Errorf(\"expected partial event 0 with text\")\n\t}\n\n\tif !events[1].Partial || events[1].LLMResponse.Content.Parts[0].FunctionCall.Name != \"get_weather\" || events[1].LLMResponse.Content.Parts[0].FunctionCall.Args[\"location\"] != \"Tokyo\" {\n\t\tt.Errorf(\"expected partial event 1 with function call 1\")\n\t}\n\n\tif !events[2].Partial || events[2].LLMResponse.Content.Parts[0].FunctionCall.Name != \"get_weather\" || events[2].LLMResponse.Content.Parts[0].FunctionCall.Args[\"location\"] != \"New York\" {\n\t\tt.Errorf(\"expected partial event 2 with function call 2\")\n\t}\n\n\tif events[3].Partial || events[3].LLMResponse.Content.Parts[0].Text != \"Checking weather...\" || events[3].LLMResponse.Content.Parts[1].FunctionCall.Name != \"get_weather\" || events[3].LLMResponse.Content.Parts[2].FunctionCall.Name != \"get_weather\" {\n\t\tt.Errorf(\"expected final aggregated event 3 with FCs\")\n\t}\n\n\tif events[4].Partial || events[4].LLMResponse.Content.Parts[0].FunctionResponse.Name != \"get_weather\" || events[4].LLMResponse.Content.Parts[1].FunctionResponse.Name != \"get_weather\" {\n\t\tt.Errorf(\"expected function response event 4\")\n\t}\n\n\tresp1 := events[4].LLMResponse.Content.Parts[0].FunctionResponse.Response\n\tresp2 := events[4].LLMResponse.Content.Parts[1].FunctionResponse.Response\n\tif resp1[\"location\"] != \"Tokyo\" || resp2[\"location\"] != \"New York\" {\n\t\tif resp1[\"location\"] != \"New York\" || resp2[\"location\"] != \"Tokyo\" {\n\t\t\tt.Errorf(\"expected function responses to have Tokyo and New York, got %v and %v\", resp1[\"location\"], resp2[\"location\"])\n\t\t}\n\t}\n\n\tif events[5].Partial || len(events[5].LLMResponse.Content.Parts) == 0 || events[5].LLMResponse.Content.Parts[0].Text != \"Task completed.\" {\n\t\tt.Errorf(\"expected task completed event 5\")\n\t}\n}\n\nfunc TestProgressiveSSEPreservesPartOrdering(t *testing.T) {\n\tchunk1 := &model.LLMResponse{\n\t\tContent: &genai.Content{\n\t\t\tRole:  \"model\",\n\t\t\tParts: []*genai.Part{{Text: \"Initial thought part 1. \", Thought: true}},\n\t\t},\n\t}\n\tchunk2 := &model.LLMResponse{\n\t\tContent: &genai.Content{\n\t\t\tRole:  \"model\",\n\t\t\tParts: []*genai.Part{{Text: \"Initial thought part 2.\", Thought: true}},\n\t\t},\n\t}\n\tchunk3 := &model.LLMResponse{\n\t\tContent: &genai.Content{\n\t\t\tRole:  \"model\",\n\t\t\tParts: []*genai.Part{{Text: \"Let me check Tokyo. \"}},\n\t\t},\n\t}\n\tchunk4 := &model.LLMResponse{\n\t\tContent: &genai.Content{\n\t\t\tRole:  \"model\",\n\t\t\tParts: []*genai.Part{{Text: \"And New York too.\"}},\n\t\t},\n\t}\n\tchunk5 := &model.LLMResponse{\n\t\tContent: &genai.Content{\n\t\t\tRole: \"model\",\n\t\t\tParts: []*genai.Part{\n\t\t\t\t{\n\t\t\t\t\tFunctionCall: &genai.FunctionCall{\n\t\t\t\t\t\tName: \"get_weather\",\n\t\t\t\t\t\tArgs: map[string]any{\"location\": \"Tokyo\"},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n\tchunk6 := &model.LLMResponse{\n\t\tContent: &genai.Content{\n\t\t\tRole:  \"model\",\n\t\t\tParts: []*genai.Part{{Text: \"Now processing second thought part 1. \", Thought: true}},\n\t\t},\n\t}\n\tchunk7 := &model.LLMResponse{\n\t\tContent: &genai.Content{\n\t\t\tRole:  \"model\",\n\t\t\tParts: []*genai.Part{{Text: \"Second thought part 2.\", Thought: true}},\n\t\t},\n\t}\n\tchunk8 := &model.LLMResponse{\n\t\tContent: &genai.Content{\n\t\t\tRole: \"model\",\n\t\t\tParts: []*genai.Part{\n\t\t\t\t{\n\t\t\t\t\tFunctionCall: &genai.FunctionCall{\n\t\t\t\t\t\tName: \"get_weather\",\n\t\t\t\t\t\tArgs: map[string]any{\"location\": \"New York\"},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tFinishReason: genai.FinishReasonStop,\n\t}\n\n\tmockModel := &streamingMockModel{\n\t\tstreamChunks: []*model.LLMResponse{chunk1, chunk2, chunk3, chunk4, chunk5, chunk6, chunk7, chunk8},\n\t}\n\n\tgetWeatherTool, _ := functiontool.New(functiontool.Config{\n\t\tName:        \"get_weather\",\n\t\tDescription: \"get weather for location\",\n\t}, getWeather)\n\n\tag, _ := llmagent.New(llmagent.Config{\n\t\tName:  \"ordering_test_agent\",\n\t\tModel: mockModel,\n\t\tTools: []tool.Tool{getWeatherTool},\n\t})\n\n\trunner := testutil.NewTestAgentRunner(t, ag)\n\tcfg := agent.RunConfig{StreamingMode: agent.StreamingModeSSE}\n\n\tevents, err := testutil.CollectEvents(runner.RunContentWithConfig(t, \"session-1\", genai.NewContentFromText(\"What is the weather?\", \"user\"), cfg))\n\tif err != nil {\n\t\tt.Fatalf(\"unexpected error: %v\", err)\n\t}\n\n\tvar aggregatedEvent *session.Event\n\tfor _, event := range events {\n\t\tif !event.Partial && event.Author == \"ordering_test_agent\" && event.Content != nil && len(event.Content.Parts) > 2 {\n\t\t\taggregatedEvent = event\n\t\t\tbreak\n\t\t}\n\t}\n\n\tif aggregatedEvent == nil {\n\t\tt.Fatal(\"Should find an aggregated model event\")\n\t}\n\n\tparts := aggregatedEvent.LLMResponse.Content.Parts\n\tif len(parts) != 5 {\n\t\tt.Fatalf(\"Expected 5 parts, got %d\", len(parts))\n\t}\n\n\tif !parts[0].Thought || parts[0].Text != \"Initial thought part 1. Initial thought part 2.\" {\n\t\tt.Errorf(\"part 0 mismatch. got text: %q, thought: %v\", parts[0].Text, parts[0].Thought)\n\t}\n\tif parts[1].Thought || parts[1].Text != \"Let me check Tokyo. And New York too.\" {\n\t\tt.Errorf(\"part 1 mismatch. got text: %q, thought: %v\", parts[1].Text, parts[1].Thought)\n\t}\n\tif parts[2].FunctionCall.Name != \"get_weather\" || parts[2].FunctionCall.Args[\"location\"] != \"Tokyo\" {\n\t\tt.Errorf(\"part 2 mismatch. got FC: %v\", parts[2].FunctionCall)\n\t}\n\tif !parts[3].Thought || parts[3].Text != \"Now processing second thought part 1. Second thought part 2.\" {\n\t\tt.Errorf(\"part 3 mismatch. got text: %q, thought: %v\", parts[3].Text, parts[3].Thought)\n\t}\n\tif parts[4].FunctionCall.Name != \"get_weather\" || parts[4].FunctionCall.Args[\"location\"] != \"New York\" {\n\t\tt.Errorf(\"part 4 mismatch. got FC: %v\", parts[4].FunctionCall)\n\t}\n}\n\ntype partialFunctionCallMockModel struct{}\n\nfunc (m *partialFunctionCallMockModel) Name() string { return \"partial-fc-mock\" }\n\nfunc (m *partialFunctionCallMockModel) GenerateContent(ctx context.Context, req *model.LLMRequest, stream bool) iter.Seq2[*model.LLMResponse, error] {\n\treturn func(yield func(*model.LLMResponse, error) bool) {\n\t\thasFunctionResponse := false\n\t\tfor _, content := range req.Contents {\n\t\t\tfor _, part := range content.Parts {\n\t\t\t\tif part.FunctionResponse != nil {\n\t\t\t\t\thasFunctionResponse = true\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif hasFunctionResponse {\n\t\t\tresp := &model.LLMResponse{\n\t\t\t\tContent: &genai.Content{\n\t\t\t\t\tRole:  \"model\",\n\t\t\t\t\tParts: []*genai.Part{{Text: \"Function executed once.\"}},\n\t\t\t\t},\n\t\t\t\tPartial: false,\n\t\t\t}\n\t\t\tyield(resp, nil)\n\t\t\treturn\n\t\t}\n\n\t\tif !yield(&model.LLMResponse{\n\t\t\tContent: &genai.Content{\n\t\t\t\tRole: \"model\",\n\t\t\t\tParts: []*genai.Part{\n\t\t\t\t\t{\n\t\t\t\t\t\tFunctionCall: &genai.FunctionCall{\n\t\t\t\t\t\t\tName: \"track_execution\",\n\t\t\t\t\t\t\tArgs: map[string]any{\"call_id\": \"partial_1\"},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tPartial: true,\n\t\t}, nil) {\n\t\t\treturn\n\t\t}\n\n\t\tif !yield(&model.LLMResponse{\n\t\t\tContent: &genai.Content{\n\t\t\t\tRole: \"model\",\n\t\t\t\tParts: []*genai.Part{\n\t\t\t\t\t{\n\t\t\t\t\t\tFunctionCall: &genai.FunctionCall{\n\t\t\t\t\t\t\tName: \"track_execution\",\n\t\t\t\t\t\t\tArgs: map[string]any{\"call_id\": \"partial_2\"},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tPartial: true,\n\t\t}, nil) {\n\t\t\treturn\n\t\t}\n\n\t\tif !yield(&model.LLMResponse{\n\t\t\tContent: &genai.Content{\n\t\t\t\tRole: \"model\",\n\t\t\t\tParts: []*genai.Part{\n\t\t\t\t\t{\n\t\t\t\t\t\tFunctionCall: &genai.FunctionCall{\n\t\t\t\t\t\t\tName: \"track_execution\",\n\t\t\t\t\t\t\tArgs: map[string]any{\"call_id\": \"final\"},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tPartial:      false,\n\t\t\tFinishReason: genai.FinishReasonStop,\n\t\t}, nil) {\n\t\t\treturn\n\t\t}\n\t}\n}\n\nfunc TestPartialFunctionCallsNotExecutedInNoneStreamingMode(t *testing.T) {\n\tvar executionLog []string\n\n\tmockModel := &partialFunctionCallMockModel{}\n\n\ttype TrackExecutionArgs struct {\n\t\tCallID string `json:\"call_id\"`\n\t}\n\n\ttrackExecution := func(ctx tool.Context, args TrackExecutionArgs) (string, error) {\n\t\texecutionLog = append(executionLog, args.CallID)\n\t\treturn \"Executed: \" + args.CallID, nil\n\t}\n\ttrackTool, _ := functiontool.New(functiontool.Config{\n\t\tName:        \"track_execution\",\n\t\tDescription: \"A tool that logs execution\",\n\t}, trackExecution)\n\n\tag, _ := llmagent.New(llmagent.Config{\n\t\tName:  \"partial_fc_test_agent\",\n\t\tModel: mockModel,\n\t\tTools: []tool.Tool{trackTool},\n\t})\n\n\trunner := testutil.NewTestAgentRunner(t, ag)\n\tcfg := agent.RunConfig{StreamingMode: agent.StreamingModeNone} // using mode None to ensure partial handling acts same\n\n\tevents, err := testutil.CollectEvents(runner.RunContentWithConfig(t, \"session-1\", genai.NewContentFromText(\"Test partial FC handling\", \"user\"), cfg))\n\tif err != nil {\n\t\tt.Fatalf(\"unexpected error: %v\", err)\n\t}\n\n\tif len(executionLog) != 1 {\n\t\tt.Fatalf(\"Expected 1 execution, got %d: %v\", len(executionLog), executionLog)\n\t}\n\tif executionLog[0] != \"final\" {\n\t\tt.Errorf(\"Expected 'final' execution, got: %s\", executionLog[0])\n\t}\n\n\tpartialEvents := 0\n\tfor _, event := range events {\n\t\tif event.Partial {\n\t\t\tpartialEvents++\n\t\t}\n\t}\n\tif partialEvents != 2 {\n\t\tt.Errorf(\"Expected 2 partial events, got %d\", partialEvents)\n\t}\n\n\tfunctionResponseEvents := 0\n\tfor _, event := range events {\n\t\tif event.Content != nil {\n\t\t\tfor _, p := range event.Content.Parts {\n\t\t\t\tif p.FunctionResponse != nil {\n\t\t\t\t\tfunctionResponseEvents++\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tif functionResponseEvents != 1 {\n\t\tt.Errorf(\"Expected 1 function response event, got %d\", functionResponseEvents)\n\t}\n}\n"
  },
  {
    "path": "internal/llminternal/testdata/TestParallelFunctionCalls_test_parallel_function_calls_gemini-2.5-flash.httprr",
    "content": "httprr trace v1\n1093 1473\nPOST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:streamGenerateContent?alt=sse HTTP/1.1\r\nHost: generativelanguage.googleapis.com\r\nUser-Agent: Go-http-client/1.1\r\nContent-Length: 847\r\nContent-Type: application/json\r\n\r\n{\"contents\":[{\"parts\":[{\"text\":\"Can you add 2 and 3? Also 4 and 5? And 6 and 7?\"}],\"role\":\"user\"}],\"generationConfig\":{},\"systemInstruction\":{\"parts\":[{\"text\":\"You are a calculator assistant. You will recieve requests to add two integers. Respond with the sum of the two integers and you must use the sum tool to calculate the sum.\\n\\nYou are an agent. Your internal name is \\\"calculator\\\". The description about you is \\\"A calculator that can add two integers\\\".\"}],\"role\":\"user\"},\"tools\":[{\"functionDeclarations\":[{\"description\":\"sums two integers\",\"name\":\"sum\",\"parametersJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"a\":{\"type\":\"integer\"},\"b\":{\"type\":\"integer\"}},\"required\":[\"a\",\"b\"],\"type\":\"object\"},\"responseJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"sum\":{\"type\":\"integer\"}},\"required\":[\"sum\"],\"type\":\"object\"}}]}]}HTTP/2.0 200 OK\r\nConnection: close\r\nContent-Disposition: attachment\r\nContent-Type: text/event-stream\r\nDate: Tue, 17 Mar 2026 09:52:39 GMT\r\nServer: scaffolding on HTTPServer2\r\nServer-Timing: gfet4t7; dur=1217\r\nVary: Origin\r\nVary: X-Origin\r\nVary: Referer\r\nX-Content-Type-Options: nosniff\r\nX-Frame-Options: SAMEORIGIN\r\nX-Xss-Protection: 0\r\n\r\ndata: {\"candidates\": [{\"content\": {\"parts\": [{\"functionCall\": {\"name\": \"sum\",\"args\": {\"a\": 2,\"b\": 3}},\"thoughtSignature\": \"CmIBvj72+4pAeKnGzc+2rNwOgLyF3mo/fgOg3Nblgmuo9Mi8ln6O1N7n44cra26xGGff6ytv5zn/rtbUZtxEbAH/r2gaff8IVDzP9yg6eVn5b8Q9KgZ+9eXgqwUyyPhvgtX7xQrTAQG+Pvb7ebaQHoDzFqzNxQvrfKM5M065iUMaAZAz2UJGxPPlIax4lob1+E303FYme/2SenXsgqKTZ7i4NYjhs9QfwQbOfd3dYbZZ1RZyDKU6RX+PYzt4TJ2NzayUos42UHDW+vCftrntl7paR1azuiu+Tr7RqqVeBng6yvwkmzJTHSXZrurGRLwNbzeCijEC4O5OPZepbdtiCo1AKP9Tc5tTeVWaTY1K8/ps5usoAgPQkOMWl9QQwjNSYW/ER7oHzkRidxQzabT1DG8FOKK98VIySfwKSwG+Pvb7U2KAVMyij4xiu5gkeZR0jguuRR7+QWThUIzNNL/Y/fLgP9i8nS5Gpdus5o97y66e2VlUZgBbMXiieDrIbSPlEcbuubkHzQ==\"},{\"functionCall\": {\"name\": \"sum\",\"args\": {\"a\": 4,\"b\": 5}}},{\"functionCall\": {\"name\": \"sum\",\"args\": {\"a\": 6,\"b\": 7}}}],\"role\": \"model\"},\"finishReason\": \"STOP\",\"index\": 0,\"finishMessage\": \"Model generated function call(s).\"}],\"usageMetadata\": {\"promptTokenCount\": 171,\"candidatesTokenCount\": 54,\"totalTokenCount\": 302,\"promptTokensDetails\": [{\"modality\": \"TEXT\",\"tokenCount\": 171}],\"thoughtsTokenCount\": 77},\"modelVersion\": \"gemini-2.5-flash\",\"responseId\": \"ZiS5ae3fFoSAkdUPnfrxqQU\"}\r\n\r\n2024 1412\nPOST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:streamGenerateContent?alt=sse HTTP/1.1\r\nHost: generativelanguage.googleapis.com\r\nUser-Agent: Go-http-client/1.1\r\nContent-Length: 1777\r\nContent-Type: application/json\r\n\r\n{\"contents\":[{\"parts\":[{\"text\":\"Can you add 2 and 3? Also 4 and 5? And 6 and 7?\"}],\"role\":\"user\"},{\"parts\":[{\"functionCall\":{\"args\":{\"a\":2,\"b\":3},\"name\":\"sum\"},\"thoughtSignature\":\"CmIBvj72+4pAeKnGzc+2rNwOgLyF3mo/fgOg3Nblgmuo9Mi8ln6O1N7n44cra26xGGff6ytv5zn/rtbUZtxEbAH/r2gaff8IVDzP9yg6eVn5b8Q9KgZ+9eXgqwUyyPhvgtX7xQrTAQG+Pvb7ebaQHoDzFqzNxQvrfKM5M065iUMaAZAz2UJGxPPlIax4lob1+E303FYme/2SenXsgqKTZ7i4NYjhs9QfwQbOfd3dYbZZ1RZyDKU6RX+PYzt4TJ2NzayUos42UHDW+vCftrntl7paR1azuiu+Tr7RqqVeBng6yvwkmzJTHSXZrurGRLwNbzeCijEC4O5OPZepbdtiCo1AKP9Tc5tTeVWaTY1K8/ps5usoAgPQkOMWl9QQwjNSYW/ER7oHzkRidxQzabT1DG8FOKK98VIySfwKSwG+Pvb7U2KAVMyij4xiu5gkeZR0jguuRR7+QWThUIzNNL/Y/fLgP9i8nS5Gpdus5o97y66e2VlUZgBbMXiieDrIbSPlEcbuubkHzQ==\"},{\"functionCall\":{\"args\":{\"a\":4,\"b\":5},\"name\":\"sum\"}},{\"functionCall\":{\"args\":{\"a\":6,\"b\":7},\"name\":\"sum\"}}],\"role\":\"model\"},{\"parts\":[{\"functionResponse\":{\"name\":\"sum\",\"response\":{\"sum\":5}}},{\"functionResponse\":{\"name\":\"sum\",\"response\":{\"sum\":9}}},{\"functionResponse\":{\"name\":\"sum\",\"response\":{\"sum\":13}}}],\"role\":\"user\"}],\"generationConfig\":{},\"systemInstruction\":{\"parts\":[{\"text\":\"You are a calculator assistant. You will recieve requests to add two integers. Respond with the sum of the two integers and you must use the sum tool to calculate the sum.\\n\\nYou are an agent. Your internal name is \\\"calculator\\\". The description about you is \\\"A calculator that can add two integers\\\".\"}],\"role\":\"user\"},\"tools\":[{\"functionDeclarations\":[{\"description\":\"sums two integers\",\"name\":\"sum\",\"parametersJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"a\":{\"type\":\"integer\"},\"b\":{\"type\":\"integer\"}},\"required\":[\"a\",\"b\"],\"type\":\"object\"},\"responseJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"sum\":{\"type\":\"integer\"}},\"required\":[\"sum\"],\"type\":\"object\"}}]}]}HTTP/2.0 200 OK\r\nConnection: close\r\nContent-Disposition: attachment\r\nContent-Type: text/event-stream\r\nDate: Tue, 17 Mar 2026 09:52:39 GMT\r\nServer: scaffolding on HTTPServer2\r\nServer-Timing: gfet4t7; dur=271\r\nVary: Origin\r\nVary: X-Origin\r\nVary: Referer\r\nX-Content-Type-Options: nosniff\r\nX-Frame-Options: SAMEORIGIN\r\nX-Xss-Protection: 0\r\n\r\ndata: {\"candidates\": [{\"content\": {\"parts\": [{\"text\": \"The sum of \"}],\"role\": \"model\"},\"index\": 0}],\"usageMetadata\": {\"promptTokenCount\": 338,\"candidatesTokenCount\": 3,\"totalTokenCount\": 341,\"promptTokensDetails\": [{\"modality\": \"TEXT\",\"tokenCount\": 338}]},\"modelVersion\": \"gemini-2.5-flash\",\"responseId\": \"ZyS5aZaqIYSAkdUP_fnxqQU\"}\r\n\r\ndata: {\"candidates\": [{\"content\": {\"parts\": [{\"text\": \"2 and 3 is 5.\\nThe sum of 4 and \"}],\"role\": \"model\"},\"index\": 0}],\"usageMetadata\": {\"promptTokenCount\": 338,\"candidatesTokenCount\": 18,\"totalTokenCount\": 356,\"promptTokensDetails\": [{\"modality\": \"TEXT\",\"tokenCount\": 338}]},\"modelVersion\": \"gemini-2.5-flash\",\"responseId\": \"ZyS5aZaqIYSAkdUP_fnxqQU\"}\r\n\r\ndata: {\"candidates\": [{\"content\": {\"parts\": [{\"text\": \"5 is 9.\\nThe sum of 6 and 7 is 13.\"}],\"role\": \"model\"},\"finishReason\": \"STOP\",\"index\": 0}],\"usageMetadata\": {\"promptTokenCount\": 338,\"candidatesTokenCount\": 37,\"totalTokenCount\": 375,\"promptTokensDetails\": [{\"modality\": \"TEXT\",\"tokenCount\": 338}]},\"modelVersion\": \"gemini-2.5-flash\",\"responseId\": \"ZyS5aZaqIYSAkdUP_fnxqQU\"}\r\n\r\n2242 1479\nPOST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:streamGenerateContent?alt=sse HTTP/1.1\r\nHost: generativelanguage.googleapis.com\r\nUser-Agent: Go-http-client/1.1\r\nContent-Length: 1995\r\nContent-Type: application/json\r\n\r\n{\"contents\":[{\"parts\":[{\"text\":\"Can you add 2 and 3? Also 4 and 5? And 6 and 7?\"}],\"role\":\"user\"},{\"parts\":[{\"functionCall\":{\"args\":{\"a\":2,\"b\":3},\"name\":\"sum\"},\"thoughtSignature\":\"CmIBvj72+4pAeKnGzc+2rNwOgLyF3mo/fgOg3Nblgmuo9Mi8ln6O1N7n44cra26xGGff6ytv5zn/rtbUZtxEbAH/r2gaff8IVDzP9yg6eVn5b8Q9KgZ+9eXgqwUyyPhvgtX7xQrTAQG+Pvb7ebaQHoDzFqzNxQvrfKM5M065iUMaAZAz2UJGxPPlIax4lob1+E303FYme/2SenXsgqKTZ7i4NYjhs9QfwQbOfd3dYbZZ1RZyDKU6RX+PYzt4TJ2NzayUos42UHDW+vCftrntl7paR1azuiu+Tr7RqqVeBng6yvwkmzJTHSXZrurGRLwNbzeCijEC4O5OPZepbdtiCo1AKP9Tc5tTeVWaTY1K8/ps5usoAgPQkOMWl9QQwjNSYW/ER7oHzkRidxQzabT1DG8FOKK98VIySfwKSwG+Pvb7U2KAVMyij4xiu5gkeZR0jguuRR7+QWThUIzNNL/Y/fLgP9i8nS5Gpdus5o97y66e2VlUZgBbMXiieDrIbSPlEcbuubkHzQ==\"},{\"functionCall\":{\"args\":{\"a\":4,\"b\":5},\"name\":\"sum\"}},{\"functionCall\":{\"args\":{\"a\":6,\"b\":7},\"name\":\"sum\"}}],\"role\":\"model\"},{\"parts\":[{\"functionResponse\":{\"name\":\"sum\",\"response\":{\"sum\":5}}},{\"functionResponse\":{\"name\":\"sum\",\"response\":{\"sum\":9}}},{\"functionResponse\":{\"name\":\"sum\",\"response\":{\"sum\":13}}}],\"role\":\"user\"},{\"parts\":[{\"text\":\"The sum of 2 and 3 is 5.\\nThe sum of 4 and 5 is 9.\\nThe sum of 6 and 7 is 13.\"}],\"role\":\"model\"},{\"parts\":[{\"text\":\"Great, now can you add 10 and 20? Also 40 and 50? And 60 and 70?\"}],\"role\":\"user\"}],\"generationConfig\":{},\"systemInstruction\":{\"parts\":[{\"text\":\"You are a calculator assistant. You will recieve requests to add two integers. Respond with the sum of the two integers and you must use the sum tool to calculate the sum.\\n\\nYou are an agent. Your internal name is \\\"calculator\\\". The description about you is \\\"A calculator that can add two integers\\\".\"}],\"role\":\"user\"},\"tools\":[{\"functionDeclarations\":[{\"description\":\"sums two integers\",\"name\":\"sum\",\"parametersJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"a\":{\"type\":\"integer\"},\"b\":{\"type\":\"integer\"}},\"required\":[\"a\",\"b\"],\"type\":\"object\"},\"responseJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"sum\":{\"type\":\"integer\"}},\"required\":[\"sum\"],\"type\":\"object\"}}]}]}HTTP/2.0 200 OK\r\nConnection: close\r\nContent-Disposition: attachment\r\nContent-Type: text/event-stream\r\nDate: Tue, 17 Mar 2026 09:52:41 GMT\r\nServer: scaffolding on HTTPServer2\r\nServer-Timing: gfet4t7; dur=1245\r\nVary: Origin\r\nVary: X-Origin\r\nVary: Referer\r\nX-Content-Type-Options: nosniff\r\nX-Frame-Options: SAMEORIGIN\r\nX-Xss-Protection: 0\r\n\r\ndata: {\"candidates\": [{\"content\": {\"parts\": [{\"functionCall\": {\"name\": \"sum\",\"args\": {\"a\": 10,\"b\": 20}},\"thoughtSignature\": \"CiQBvj72+xHfUSjY1Q+JRm0oddaC1zU0b6arnGetTB/NCDEg6F8KVgG+Pvb7UlT/wm74gxxi23x3jgRE1cPd2/FOdOxcntkcdQ5v+L4mTYfUu2sGLwXVNNnv9bUoyLpp+wSJ+o7AGBUW53UZFrLF2sqFfhHP49A92pLViInxCroBAb4+9vueuRpaSOxdDOvi0EEDDXFDCkCCBUk8FgFriWtuPuNd7duA+ladgBMxodC7eMP0QyetPmx/QKCGJE+4t3h1oyK8kOKMqFFjP2z29TDo2988zhi41NCF4tS0yL6s3nUl/QD/76u83NbETV+uFs3qEbJI9aPftOrRVds2NBRiyJeKfcB8SutblxGghc+fUS0XimvFhdoqL6t74tH/EsS+srJlVTGX4dM7d2Pmdq6Pcz00H2mlCPLbCksBvj72+5+YQntTIc43ewrEbHPiXDZfocwp7AweHd0Oj6+//JjI01VYrGXe5wDXlApu+aSfMmngFS/jM1p6bJPXJRKyiaPlzou6C/U=\"},{\"functionCall\": {\"name\": \"sum\",\"args\": {\"a\": 40,\"b\": 50}}},{\"functionCall\": {\"name\": \"sum\",\"args\": {\"a\": 60,\"b\": 70}}}],\"role\": \"model\"},\"finishReason\": \"STOP\",\"index\": 0,\"finishMessage\": \"Model generated function call(s).\"}],\"usageMetadata\": {\"promptTokenCount\": 334,\"candidatesTokenCount\": 60,\"totalTokenCount\": 470,\"promptTokensDetails\": [{\"modality\": \"TEXT\",\"tokenCount\": 334}],\"thoughtsTokenCount\": 76},\"modelVersion\": \"gemini-2.5-flash\",\"responseId\": \"ZyS5aaH2NpyjnsEP_d3zkQY\"}\r\n\r\n3181 1421\nPOST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:streamGenerateContent?alt=sse HTTP/1.1\r\nHost: generativelanguage.googleapis.com\r\nUser-Agent: Go-http-client/1.1\r\nContent-Length: 2934\r\nContent-Type: application/json\r\n\r\n{\"contents\":[{\"parts\":[{\"text\":\"Can you add 2 and 3? Also 4 and 5? And 6 and 7?\"}],\"role\":\"user\"},{\"parts\":[{\"functionCall\":{\"args\":{\"a\":2,\"b\":3},\"name\":\"sum\"},\"thoughtSignature\":\"CmIBvj72+4pAeKnGzc+2rNwOgLyF3mo/fgOg3Nblgmuo9Mi8ln6O1N7n44cra26xGGff6ytv5zn/rtbUZtxEbAH/r2gaff8IVDzP9yg6eVn5b8Q9KgZ+9eXgqwUyyPhvgtX7xQrTAQG+Pvb7ebaQHoDzFqzNxQvrfKM5M065iUMaAZAz2UJGxPPlIax4lob1+E303FYme/2SenXsgqKTZ7i4NYjhs9QfwQbOfd3dYbZZ1RZyDKU6RX+PYzt4TJ2NzayUos42UHDW+vCftrntl7paR1azuiu+Tr7RqqVeBng6yvwkmzJTHSXZrurGRLwNbzeCijEC4O5OPZepbdtiCo1AKP9Tc5tTeVWaTY1K8/ps5usoAgPQkOMWl9QQwjNSYW/ER7oHzkRidxQzabT1DG8FOKK98VIySfwKSwG+Pvb7U2KAVMyij4xiu5gkeZR0jguuRR7+QWThUIzNNL/Y/fLgP9i8nS5Gpdus5o97y66e2VlUZgBbMXiieDrIbSPlEcbuubkHzQ==\"},{\"functionCall\":{\"args\":{\"a\":4,\"b\":5},\"name\":\"sum\"}},{\"functionCall\":{\"args\":{\"a\":6,\"b\":7},\"name\":\"sum\"}}],\"role\":\"model\"},{\"parts\":[{\"functionResponse\":{\"name\":\"sum\",\"response\":{\"sum\":5}}},{\"functionResponse\":{\"name\":\"sum\",\"response\":{\"sum\":9}}},{\"functionResponse\":{\"name\":\"sum\",\"response\":{\"sum\":13}}}],\"role\":\"user\"},{\"parts\":[{\"text\":\"The sum of 2 and 3 is 5.\\nThe sum of 4 and 5 is 9.\\nThe sum of 6 and 7 is 13.\"}],\"role\":\"model\"},{\"parts\":[{\"text\":\"Great, now can you add 10 and 20? Also 40 and 50? And 60 and 70?\"}],\"role\":\"user\"},{\"parts\":[{\"functionCall\":{\"args\":{\"a\":10,\"b\":20},\"name\":\"sum\"},\"thoughtSignature\":\"CiQBvj72+xHfUSjY1Q+JRm0oddaC1zU0b6arnGetTB/NCDEg6F8KVgG+Pvb7UlT/wm74gxxi23x3jgRE1cPd2/FOdOxcntkcdQ5v+L4mTYfUu2sGLwXVNNnv9bUoyLpp+wSJ+o7AGBUW53UZFrLF2sqFfhHP49A92pLViInxCroBAb4+9vueuRpaSOxdDOvi0EEDDXFDCkCCBUk8FgFriWtuPuNd7duA+ladgBMxodC7eMP0QyetPmx/QKCGJE+4t3h1oyK8kOKMqFFjP2z29TDo2988zhi41NCF4tS0yL6s3nUl/QD/76u83NbETV+uFs3qEbJI9aPftOrRVds2NBRiyJeKfcB8SutblxGghc+fUS0XimvFhdoqL6t74tH/EsS+srJlVTGX4dM7d2Pmdq6Pcz00H2mlCPLbCksBvj72+5+YQntTIc43ewrEbHPiXDZfocwp7AweHd0Oj6+//JjI01VYrGXe5wDXlApu+aSfMmngFS/jM1p6bJPXJRKyiaPlzou6C/U=\"},{\"functionCall\":{\"args\":{\"a\":40,\"b\":50},\"name\":\"sum\"}},{\"functionCall\":{\"args\":{\"a\":60,\"b\":70},\"name\":\"sum\"}}],\"role\":\"model\"},{\"parts\":[{\"functionResponse\":{\"name\":\"sum\",\"response\":{\"sum\":30}}},{\"functionResponse\":{\"name\":\"sum\",\"response\":{\"sum\":90}}},{\"functionResponse\":{\"name\":\"sum\",\"response\":{\"sum\":130}}}],\"role\":\"user\"}],\"generationConfig\":{},\"systemInstruction\":{\"parts\":[{\"text\":\"You are a calculator assistant. You will recieve requests to add two integers. Respond with the sum of the two integers and you must use the sum tool to calculate the sum.\\n\\nYou are an agent. Your internal name is \\\"calculator\\\". The description about you is \\\"A calculator that can add two integers\\\".\"}],\"role\":\"user\"},\"tools\":[{\"functionDeclarations\":[{\"description\":\"sums two integers\",\"name\":\"sum\",\"parametersJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"a\":{\"type\":\"integer\"},\"b\":{\"type\":\"integer\"}},\"required\":[\"a\",\"b\"],\"type\":\"object\"},\"responseJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"sum\":{\"type\":\"integer\"}},\"required\":[\"sum\"],\"type\":\"object\"}}]}]}HTTP/2.0 200 OK\r\nConnection: close\r\nContent-Disposition: attachment\r\nContent-Type: text/event-stream\r\nDate: Tue, 17 Mar 2026 09:52:41 GMT\r\nServer: scaffolding on HTTPServer2\r\nServer-Timing: gfet4t7; dur=375\r\nVary: Origin\r\nVary: X-Origin\r\nVary: Referer\r\nX-Content-Type-Options: nosniff\r\nX-Frame-Options: SAMEORIGIN\r\nX-Xss-Protection: 0\r\n\r\ndata: {\"candidates\": [{\"content\": {\"parts\": [{\"text\": \"The sum of \"}],\"role\": \"model\"},\"index\": 0}],\"usageMetadata\": {\"promptTokenCount\": 509,\"candidatesTokenCount\": 3,\"totalTokenCount\": 512,\"promptTokensDetails\": [{\"modality\": \"TEXT\",\"tokenCount\": 509}]},\"modelVersion\": \"gemini-2.5-flash\",\"responseId\": \"aSS5acO0CfXk7M8PsJHAsQI\"}\r\n\r\ndata: {\"candidates\": [{\"content\": {\"parts\": [{\"text\": \"10 and 20 is 30.\\nThe sum of \"}],\"role\": \"model\"},\"index\": 0}],\"usageMetadata\": {\"promptTokenCount\": 509,\"candidatesTokenCount\": 18,\"totalTokenCount\": 527,\"promptTokensDetails\": [{\"modality\": \"TEXT\",\"tokenCount\": 509}]},\"modelVersion\": \"gemini-2.5-flash\",\"responseId\": \"aSS5acO0CfXk7M8PsJHAsQI\"}\r\n\r\ndata: {\"candidates\": [{\"content\": {\"parts\": [{\"text\": \"40 and 50 is 90.\\nThe sum of 60 and 70 is 130.\"}],\"role\": \"model\"},\"finishReason\": \"STOP\",\"index\": 0}],\"usageMetadata\": {\"promptTokenCount\": 509,\"candidatesTokenCount\": 46,\"totalTokenCount\": 555,\"promptTokensDetails\": [{\"modality\": \"TEXT\",\"tokenCount\": 509}]},\"modelVersion\": \"gemini-2.5-flash\",\"responseId\": \"aSS5acO0CfXk7M8PsJHAsQI\"}\r\n\r\n"
  },
  {
    "path": "internal/llminternal/testdata/TestParallelFunctionCalls_test_parallel_function_calls_gemini-3-flash-preview.httprr",
    "content": "httprr trace v1\n1099 2311\nPOST https://generativelanguage.googleapis.com/v1beta/models/gemini-3-flash-preview:streamGenerateContent?alt=sse HTTP/1.1\r\nHost: generativelanguage.googleapis.com\r\nUser-Agent: Go-http-client/1.1\r\nContent-Length: 847\r\nContent-Type: application/json\r\n\r\n{\"contents\":[{\"parts\":[{\"text\":\"Can you add 2 and 3? Also 4 and 5? And 6 and 7?\"}],\"role\":\"user\"}],\"generationConfig\":{},\"systemInstruction\":{\"parts\":[{\"text\":\"You are a calculator assistant. You will recieve requests to add two integers. Respond with the sum of the two integers and you must use the sum tool to calculate the sum.\\n\\nYou are an agent. Your internal name is \\\"calculator\\\". The description about you is \\\"A calculator that can add two integers\\\".\"}],\"role\":\"user\"},\"tools\":[{\"functionDeclarations\":[{\"description\":\"sums two integers\",\"name\":\"sum\",\"parametersJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"a\":{\"type\":\"integer\"},\"b\":{\"type\":\"integer\"}},\"required\":[\"a\",\"b\"],\"type\":\"object\"},\"responseJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"sum\":{\"type\":\"integer\"}},\"required\":[\"sum\"],\"type\":\"object\"}}]}]}HTTP/2.0 200 OK\r\nConnection: close\r\nContent-Disposition: attachment\r\nContent-Type: text/event-stream\r\nDate: Tue, 17 Mar 2026 09:52:42 GMT\r\nServer: scaffolding on HTTPServer2\r\nServer-Timing: gfet4t7; dur=1104\r\nVary: Origin\r\nVary: X-Origin\r\nVary: Referer\r\nX-Content-Type-Options: nosniff\r\nX-Frame-Options: SAMEORIGIN\r\nX-Xss-Protection: 0\r\n\r\ndata: {\"candidates\": [{\"content\": {\"parts\": [{\"functionCall\": {\"name\": \"sum\",\"args\": {\"b\": 3,\"a\": 2},\"id\": \"3ae8iwca\"},\"thoughtSignature\": \"EukBCuYBAb4+9vt/vxxSqnu1O2VmsspptIIuZ5UI1XKt5qIGVw+l6Wp8gHTOskqE5v3VzNm9TnfsQQoZiWn9SnbjHsEB8zT4ABquQukeRIimRFRDehFQR0+Q8d1Ycq/8nu9h9pPtATCiVhb7L705JKNsMPhSk/k8i3XDw/jhFa11w9YWuCP2/nsul7SZP1/AfDJRroE/3/J5U8vUXnBFgmh9ZOAqEpTQvro03WSEEXy7XL5E5lMuPBEu/9CcH+N1OX32GeV0JQgZFA1vnh6DYJRwmWAbqEYqBZj8ruO7cY6FRIKagh+o7gVb+dk=\"}],\"role\": \"model\"},\"index\": 0}],\"usageMetadata\": {\"promptTokenCount\": 161,\"candidatesTokenCount\": 16,\"totalTokenCount\": 222,\"promptTokensDetails\": [{\"modality\": \"TEXT\",\"tokenCount\": 161}],\"thoughtsTokenCount\": 45},\"modelVersion\": \"gemini-3-flash-preview\",\"responseId\": \"aiS5abqwJJf7nsEPuIy3wQQ\"}\r\n\r\ndata: {\"candidates\": [{\"content\": {\"parts\": [{\"functionCall\": {\"name\": \"sum\",\"args\": {\"a\": 4,\"b\": 5},\"id\": \"up3kf30e\"}}],\"role\": \"model\"},\"index\": 0}],\"usageMetadata\": {\"promptTokenCount\": 161,\"candidatesTokenCount\": 32,\"totalTokenCount\": 238,\"promptTokensDetails\": [{\"modality\": \"TEXT\",\"tokenCount\": 161}],\"thoughtsTokenCount\": 45},\"modelVersion\": \"gemini-3-flash-preview\",\"responseId\": \"aiS5abqwJJf7nsEPuIy3wQQ\"}\r\n\r\ndata: {\"candidates\": [{\"content\": {\"parts\": [{\"functionCall\": {\"name\": \"sum\",\"args\": {\"b\": 7,\"a\": 6},\"id\": \"ycroch25\"}}],\"role\": \"model\"},\"index\": 0}],\"usageMetadata\": {\"promptTokenCount\": 161,\"candidatesTokenCount\": 48,\"totalTokenCount\": 254,\"promptTokensDetails\": [{\"modality\": \"TEXT\",\"tokenCount\": 161}],\"thoughtsTokenCount\": 45},\"modelVersion\": \"gemini-3-flash-preview\",\"responseId\": \"aiS5abqwJJf7nsEPuIy3wQQ\"}\r\n\r\ndata: {\"candidates\": [{\"content\": {\"parts\": [{\"text\": \"\"}],\"role\": \"model\"},\"finishReason\": \"STOP\",\"index\": 0}],\"usageMetadata\": {\"promptTokenCount\": 161,\"candidatesTokenCount\": 48,\"totalTokenCount\": 254,\"promptTokensDetails\": [{\"modality\": \"TEXT\",\"tokenCount\": 161}],\"thoughtsTokenCount\": 45},\"modelVersion\": \"gemini-3-flash-preview\",\"responseId\": \"aiS5abqwJJf7nsEPuIy3wQQ\"}\r\n\r\n1918 1764\nPOST https://generativelanguage.googleapis.com/v1beta/models/gemini-3-flash-preview:streamGenerateContent?alt=sse HTTP/1.1\r\nHost: generativelanguage.googleapis.com\r\nUser-Agent: Go-http-client/1.1\r\nContent-Length: 1665\r\nContent-Type: application/json\r\n\r\n{\"contents\":[{\"parts\":[{\"text\":\"Can you add 2 and 3? Also 4 and 5? And 6 and 7?\"}],\"role\":\"user\"},{\"parts\":[{\"functionCall\":{\"args\":{\"a\":2,\"b\":3},\"id\":\"3ae8iwca\",\"name\":\"sum\"},\"thoughtSignature\":\"EukBCuYBAb4+9vt/vxxSqnu1O2VmsspptIIuZ5UI1XKt5qIGVw+l6Wp8gHTOskqE5v3VzNm9TnfsQQoZiWn9SnbjHsEB8zT4ABquQukeRIimRFRDehFQR0+Q8d1Ycq/8nu9h9pPtATCiVhb7L705JKNsMPhSk/k8i3XDw/jhFa11w9YWuCP2/nsul7SZP1/AfDJRroE/3/J5U8vUXnBFgmh9ZOAqEpTQvro03WSEEXy7XL5E5lMuPBEu/9CcH+N1OX32GeV0JQgZFA1vnh6DYJRwmWAbqEYqBZj8ruO7cY6FRIKagh+o7gVb+dk=\"},{\"functionCall\":{\"args\":{\"a\":4,\"b\":5},\"id\":\"up3kf30e\",\"name\":\"sum\"}},{\"functionCall\":{\"args\":{\"a\":6,\"b\":7},\"id\":\"ycroch25\",\"name\":\"sum\"}}],\"role\":\"model\"},{\"parts\":[{\"functionResponse\":{\"id\":\"3ae8iwca\",\"name\":\"sum\",\"response\":{\"sum\":5}}},{\"functionResponse\":{\"id\":\"up3kf30e\",\"name\":\"sum\",\"response\":{\"sum\":9}}},{\"functionResponse\":{\"id\":\"ycroch25\",\"name\":\"sum\",\"response\":{\"sum\":13}}}],\"role\":\"user\"}],\"generationConfig\":{},\"systemInstruction\":{\"parts\":[{\"text\":\"You are a calculator assistant. You will recieve requests to add two integers. Respond with the sum of the two integers and you must use the sum tool to calculate the sum.\\n\\nYou are an agent. Your internal name is \\\"calculator\\\". The description about you is \\\"A calculator that can add two integers\\\".\"}],\"role\":\"user\"},\"tools\":[{\"functionDeclarations\":[{\"description\":\"sums two integers\",\"name\":\"sum\",\"parametersJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"a\":{\"type\":\"integer\"},\"b\":{\"type\":\"integer\"}},\"required\":[\"a\",\"b\"],\"type\":\"object\"},\"responseJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"sum\":{\"type\":\"integer\"}},\"required\":[\"sum\"],\"type\":\"object\"}}]}]}HTTP/2.0 200 OK\r\nConnection: close\r\nContent-Disposition: attachment\r\nContent-Type: text/event-stream\r\nDate: Tue, 17 Mar 2026 09:52:43 GMT\r\nServer: scaffolding on HTTPServer2\r\nServer-Timing: gfet4t7; dur=1232\r\nVary: Origin\r\nVary: X-Origin\r\nVary: Referer\r\nX-Content-Type-Options: nosniff\r\nX-Frame-Options: SAMEORIGIN\r\nX-Xss-Protection: 0\r\n\r\ndata: {\"candidates\": [{\"content\": {\"parts\": [{\"text\": \"The sum\"}],\"role\": \"model\"},\"index\": 0}],\"usageMetadata\": {\"promptTokenCount\": 236,\"candidatesTokenCount\": 2,\"totalTokenCount\": 238,\"promptTokensDetails\": [{\"modality\": \"TEXT\",\"tokenCount\": 236}]},\"modelVersion\": \"gemini-3-flash-preview\",\"responseId\": \"ayS5abiBOIGzkdUPttS9wAQ\"}\r\n\r\ndata: {\"candidates\": [{\"content\": {\"parts\": [{\"text\": \" of 2 and 3 is 5, the sum of 4 and\"}],\"role\": \"model\"},\"index\": 0}],\"usageMetadata\": {\"promptTokenCount\": 236,\"candidatesTokenCount\": 18,\"totalTokenCount\": 254,\"promptTokensDetails\": [{\"modality\": \"TEXT\",\"tokenCount\": 236}]},\"modelVersion\": \"gemini-3-flash-preview\",\"responseId\": \"ayS5abiBOIGzkdUPttS9wAQ\"}\r\n\r\ndata: {\"candidates\": [{\"content\": {\"parts\": [{\"text\": \" 5 is 9, and the sum of 6 and 7 is 13.\"}],\"role\": \"model\"},\"index\": 0}],\"usageMetadata\": {\"promptTokenCount\": 236,\"candidatesTokenCount\": 38,\"totalTokenCount\": 274,\"promptTokensDetails\": [{\"modality\": \"TEXT\",\"tokenCount\": 236}]},\"modelVersion\": \"gemini-3-flash-preview\",\"responseId\": \"ayS5abiBOIGzkdUPttS9wAQ\"}\r\n\r\ndata: {\"candidates\": [{\"content\": {\"parts\": [{\"text\": \"\"}],\"role\": \"model\"},\"finishReason\": \"STOP\",\"index\": 0}],\"usageMetadata\": {\"promptTokenCount\": 281,\"candidatesTokenCount\": 38,\"totalTokenCount\": 319,\"promptTokensDetails\": [{\"modality\": \"TEXT\",\"tokenCount\": 281}]},\"modelVersion\": \"gemini-3-flash-preview\",\"responseId\": \"ayS5abiBOIGzkdUPttS9wAQ\"}\r\n\r\n2138 2509\nPOST https://generativelanguage.googleapis.com/v1beta/models/gemini-3-flash-preview:streamGenerateContent?alt=sse HTTP/1.1\r\nHost: generativelanguage.googleapis.com\r\nUser-Agent: Go-http-client/1.1\r\nContent-Length: 1885\r\nContent-Type: application/json\r\n\r\n{\"contents\":[{\"parts\":[{\"text\":\"Can you add 2 and 3? Also 4 and 5? And 6 and 7?\"}],\"role\":\"user\"},{\"parts\":[{\"functionCall\":{\"args\":{\"a\":2,\"b\":3},\"id\":\"3ae8iwca\",\"name\":\"sum\"},\"thoughtSignature\":\"EukBCuYBAb4+9vt/vxxSqnu1O2VmsspptIIuZ5UI1XKt5qIGVw+l6Wp8gHTOskqE5v3VzNm9TnfsQQoZiWn9SnbjHsEB8zT4ABquQukeRIimRFRDehFQR0+Q8d1Ycq/8nu9h9pPtATCiVhb7L705JKNsMPhSk/k8i3XDw/jhFa11w9YWuCP2/nsul7SZP1/AfDJRroE/3/J5U8vUXnBFgmh9ZOAqEpTQvro03WSEEXy7XL5E5lMuPBEu/9CcH+N1OX32GeV0JQgZFA1vnh6DYJRwmWAbqEYqBZj8ruO7cY6FRIKagh+o7gVb+dk=\"},{\"functionCall\":{\"args\":{\"a\":4,\"b\":5},\"id\":\"up3kf30e\",\"name\":\"sum\"}},{\"functionCall\":{\"args\":{\"a\":6,\"b\":7},\"id\":\"ycroch25\",\"name\":\"sum\"}}],\"role\":\"model\"},{\"parts\":[{\"functionResponse\":{\"id\":\"3ae8iwca\",\"name\":\"sum\",\"response\":{\"sum\":5}}},{\"functionResponse\":{\"id\":\"up3kf30e\",\"name\":\"sum\",\"response\":{\"sum\":9}}},{\"functionResponse\":{\"id\":\"ycroch25\",\"name\":\"sum\",\"response\":{\"sum\":13}}}],\"role\":\"user\"},{\"parts\":[{\"text\":\"The sum of 2 and 3 is 5, the sum of 4 and 5 is 9, and the sum of 6 and 7 is 13.\"}],\"role\":\"model\"},{\"parts\":[{\"text\":\"Great, now can you add 10 and 20? Also 40 and 50? And 60 and 70?\"}],\"role\":\"user\"}],\"generationConfig\":{},\"systemInstruction\":{\"parts\":[{\"text\":\"You are a calculator assistant. You will recieve requests to add two integers. Respond with the sum of the two integers and you must use the sum tool to calculate the sum.\\n\\nYou are an agent. Your internal name is \\\"calculator\\\". The description about you is \\\"A calculator that can add two integers\\\".\"}],\"role\":\"user\"},\"tools\":[{\"functionDeclarations\":[{\"description\":\"sums two integers\",\"name\":\"sum\",\"parametersJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"a\":{\"type\":\"integer\"},\"b\":{\"type\":\"integer\"}},\"required\":[\"a\",\"b\"],\"type\":\"object\"},\"responseJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"sum\":{\"type\":\"integer\"}},\"required\":[\"sum\"],\"type\":\"object\"}}]}]}HTTP/2.0 200 OK\r\nConnection: close\r\nContent-Disposition: attachment\r\nContent-Type: text/event-stream\r\nDate: Tue, 17 Mar 2026 09:52:45 GMT\r\nServer: scaffolding on HTTPServer2\r\nServer-Timing: gfet4t7; dur=1324\r\nVary: Origin\r\nVary: X-Origin\r\nVary: Referer\r\nX-Content-Type-Options: nosniff\r\nX-Frame-Options: SAMEORIGIN\r\nX-Xss-Protection: 0\r\n\r\ndata: {\"candidates\": [{\"content\": {\"parts\": [{\"functionCall\": {\"name\": \"sum\",\"args\": {\"a\": 10,\"b\": 20},\"id\": \"to7c5o31\"},\"thoughtSignature\": \"EvUCCvICAb4+9vvPcHezYjAM+dPVIaGQOAMn5M6STamapCVVfguQGZpzFbuKSAshItSRvLBweSrybnG3JEtPI7Pk1DW7y04z1upmBUjkE99fC5bi8EYBpr3qkLJ4cGgO2r8PQbR5NbUEjcNAwBg32hMEerc5kJca7KQYYknU08Ft0/u7peN4JlfW8z97YI7Pp6h7xIWSWNCV03mY3zudV7E2fgLrfB8tNGbFO9Nw3uEIOoVucfU2+AM4DBi0f3tET9kyZh4MEmXfKWzfceImj5hF1EKWnj1Qbue1LuDKTBWe8WJSMQQmfTiGE0mdMBcf6+1HuEEvixx9e9jLC+xkgnOBBQDlBJi75ZZ2Mn5GIYITJWU7GCu+g9Bm7/bVjidyWezp8I8lp1b73ppdxBaXJMRH7m/UcfKI8SySi8q4RdpyWsCVqvakYRNqqNcMVnq5nEzGZYWQMPfeR56cdRIhDKAIawV5dXXbwHajS2jtkq8iW0QqoN6P0w==\"}],\"role\": \"model\"},\"index\": 0}],\"usageMetadata\": {\"promptTokenCount\": 308,\"candidatesTokenCount\": 18,\"totalTokenCount\": 432,\"promptTokensDetails\": [{\"modality\": \"TEXT\",\"tokenCount\": 308}],\"thoughtsTokenCount\": 106},\"modelVersion\": \"gemini-3-flash-preview\",\"responseId\": \"bSS5acb2Fr6vnsEPyL-o6Qc\"}\r\n\r\ndata: {\"candidates\": [{\"content\": {\"parts\": [{\"functionCall\": {\"name\": \"sum\",\"args\": {\"a\": 40,\"b\": 50},\"id\": \"4v64pue3\"}}],\"role\": \"model\"},\"index\": 0}],\"usageMetadata\": {\"promptTokenCount\": 308,\"candidatesTokenCount\": 36,\"totalTokenCount\": 450,\"promptTokensDetails\": [{\"modality\": \"TEXT\",\"tokenCount\": 308}],\"thoughtsTokenCount\": 106},\"modelVersion\": \"gemini-3-flash-preview\",\"responseId\": \"bSS5acb2Fr6vnsEPyL-o6Qc\"}\r\n\r\ndata: {\"candidates\": [{\"content\": {\"parts\": [{\"functionCall\": {\"name\": \"sum\",\"args\": {\"a\": 60,\"b\": 70},\"id\": \"dwwo765i\"}}],\"role\": \"model\"},\"index\": 0}],\"usageMetadata\": {\"promptTokenCount\": 308,\"candidatesTokenCount\": 54,\"totalTokenCount\": 468,\"promptTokensDetails\": [{\"modality\": \"TEXT\",\"tokenCount\": 308}],\"thoughtsTokenCount\": 106},\"modelVersion\": \"gemini-3-flash-preview\",\"responseId\": \"bSS5acb2Fr6vnsEPyL-o6Qc\"}\r\n\r\ndata: {\"candidates\": [{\"content\": {\"parts\": [{\"text\": \"\"}],\"role\": \"model\"},\"finishReason\": \"STOP\",\"index\": 0}],\"usageMetadata\": {\"promptTokenCount\": 308,\"candidatesTokenCount\": 54,\"totalTokenCount\": 468,\"promptTokensDetails\": [{\"modality\": \"TEXT\",\"tokenCount\": 308}],\"thoughtsTokenCount\": 106},\"modelVersion\": \"gemini-3-flash-preview\",\"responseId\": \"bSS5acb2Fr6vnsEPyL-o6Qc\"}\r\n\r\n3153 2103\nPOST https://generativelanguage.googleapis.com/v1beta/models/gemini-3-flash-preview:streamGenerateContent?alt=sse HTTP/1.1\r\nHost: generativelanguage.googleapis.com\r\nUser-Agent: Go-http-client/1.1\r\nContent-Length: 2900\r\nContent-Type: application/json\r\n\r\n{\"contents\":[{\"parts\":[{\"text\":\"Can you add 2 and 3? Also 4 and 5? And 6 and 7?\"}],\"role\":\"user\"},{\"parts\":[{\"functionCall\":{\"args\":{\"a\":2,\"b\":3},\"id\":\"3ae8iwca\",\"name\":\"sum\"},\"thoughtSignature\":\"EukBCuYBAb4+9vt/vxxSqnu1O2VmsspptIIuZ5UI1XKt5qIGVw+l6Wp8gHTOskqE5v3VzNm9TnfsQQoZiWn9SnbjHsEB8zT4ABquQukeRIimRFRDehFQR0+Q8d1Ycq/8nu9h9pPtATCiVhb7L705JKNsMPhSk/k8i3XDw/jhFa11w9YWuCP2/nsul7SZP1/AfDJRroE/3/J5U8vUXnBFgmh9ZOAqEpTQvro03WSEEXy7XL5E5lMuPBEu/9CcH+N1OX32GeV0JQgZFA1vnh6DYJRwmWAbqEYqBZj8ruO7cY6FRIKagh+o7gVb+dk=\"},{\"functionCall\":{\"args\":{\"a\":4,\"b\":5},\"id\":\"up3kf30e\",\"name\":\"sum\"}},{\"functionCall\":{\"args\":{\"a\":6,\"b\":7},\"id\":\"ycroch25\",\"name\":\"sum\"}}],\"role\":\"model\"},{\"parts\":[{\"functionResponse\":{\"id\":\"3ae8iwca\",\"name\":\"sum\",\"response\":{\"sum\":5}}},{\"functionResponse\":{\"id\":\"up3kf30e\",\"name\":\"sum\",\"response\":{\"sum\":9}}},{\"functionResponse\":{\"id\":\"ycroch25\",\"name\":\"sum\",\"response\":{\"sum\":13}}}],\"role\":\"user\"},{\"parts\":[{\"text\":\"The sum of 2 and 3 is 5, the sum of 4 and 5 is 9, and the sum of 6 and 7 is 13.\"}],\"role\":\"model\"},{\"parts\":[{\"text\":\"Great, now can you add 10 and 20? Also 40 and 50? And 60 and 70?\"}],\"role\":\"user\"},{\"parts\":[{\"functionCall\":{\"args\":{\"a\":10,\"b\":20},\"id\":\"to7c5o31\",\"name\":\"sum\"},\"thoughtSignature\":\"EvUCCvICAb4+9vvPcHezYjAM+dPVIaGQOAMn5M6STamapCVVfguQGZpzFbuKSAshItSRvLBweSrybnG3JEtPI7Pk1DW7y04z1upmBUjkE99fC5bi8EYBpr3qkLJ4cGgO2r8PQbR5NbUEjcNAwBg32hMEerc5kJca7KQYYknU08Ft0/u7peN4JlfW8z97YI7Pp6h7xIWSWNCV03mY3zudV7E2fgLrfB8tNGbFO9Nw3uEIOoVucfU2+AM4DBi0f3tET9kyZh4MEmXfKWzfceImj5hF1EKWnj1Qbue1LuDKTBWe8WJSMQQmfTiGE0mdMBcf6+1HuEEvixx9e9jLC+xkgnOBBQDlBJi75ZZ2Mn5GIYITJWU7GCu+g9Bm7/bVjidyWezp8I8lp1b73ppdxBaXJMRH7m/UcfKI8SySi8q4RdpyWsCVqvakYRNqqNcMVnq5nEzGZYWQMPfeR56cdRIhDKAIawV5dXXbwHajS2jtkq8iW0QqoN6P0w==\"},{\"functionCall\":{\"args\":{\"a\":40,\"b\":50},\"id\":\"4v64pue3\",\"name\":\"sum\"}},{\"functionCall\":{\"args\":{\"a\":60,\"b\":70},\"id\":\"dwwo765i\",\"name\":\"sum\"}}],\"role\":\"model\"},{\"parts\":[{\"functionResponse\":{\"id\":\"to7c5o31\",\"name\":\"sum\",\"response\":{\"sum\":30}}},{\"functionResponse\":{\"id\":\"4v64pue3\",\"name\":\"sum\",\"response\":{\"sum\":90}}},{\"functionResponse\":{\"id\":\"dwwo765i\",\"name\":\"sum\",\"response\":{\"sum\":130}}}],\"role\":\"user\"}],\"generationConfig\":{},\"systemInstruction\":{\"parts\":[{\"text\":\"You are a calculator assistant. You will recieve requests to add two integers. Respond with the sum of the two integers and you must use the sum tool to calculate the sum.\\n\\nYou are an agent. Your internal name is \\\"calculator\\\". The description about you is \\\"A calculator that can add two integers\\\".\"}],\"role\":\"user\"},\"tools\":[{\"functionDeclarations\":[{\"description\":\"sums two integers\",\"name\":\"sum\",\"parametersJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"a\":{\"type\":\"integer\"},\"b\":{\"type\":\"integer\"}},\"required\":[\"a\",\"b\"],\"type\":\"object\"},\"responseJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"sum\":{\"type\":\"integer\"}},\"required\":[\"sum\"],\"type\":\"object\"}}]}]}HTTP/2.0 200 OK\r\nConnection: close\r\nContent-Disposition: attachment\r\nContent-Type: text/event-stream\r\nDate: Tue, 17 Mar 2026 09:52:46 GMT\r\nServer: scaffolding on HTTPServer2\r\nServer-Timing: gfet4t7; dur=885\r\nVary: Origin\r\nVary: X-Origin\r\nVary: Referer\r\nX-Content-Type-Options: nosniff\r\nX-Frame-Options: SAMEORIGIN\r\nX-Xss-Protection: 0\r\n\r\ndata: {\"candidates\": [{\"content\": {\"parts\": [{\"text\": \"The sum of \"}],\"role\": \"model\"},\"index\": 0}],\"usageMetadata\": {\"promptTokenCount\": 392,\"candidatesTokenCount\": 4,\"totalTokenCount\": 396,\"promptTokensDetails\": [{\"modality\": \"TEXT\",\"tokenCount\": 392}]},\"modelVersion\": \"gemini-3-flash-preview\",\"responseId\": \"biS5aeW-FbyNkdUPpfGxwQY\"}\r\n\r\ndata: {\"candidates\": [{\"content\": {\"parts\": [{\"text\": \"10 and 20 is 30, the sum of 4\"}],\"role\": \"model\"},\"index\": 0}],\"usageMetadata\": {\"promptTokenCount\": 392,\"candidatesTokenCount\": 20,\"totalTokenCount\": 412,\"promptTokensDetails\": [{\"modality\": \"TEXT\",\"tokenCount\": 392}]},\"modelVersion\": \"gemini-3-flash-preview\",\"responseId\": \"biS5aeW-FbyNkdUPpfGxwQY\"}\r\n\r\ndata: {\"candidates\": [{\"content\": {\"parts\": [{\"text\": \"0 and 50 is 90, and the sum of 60 and 70 is 1\"}],\"role\": \"model\"},\"index\": 0}],\"usageMetadata\": {\"promptTokenCount\": 392,\"candidatesTokenCount\": 44,\"totalTokenCount\": 436,\"promptTokensDetails\": [{\"modality\": \"TEXT\",\"tokenCount\": 392}]},\"modelVersion\": \"gemini-3-flash-preview\",\"responseId\": \"biS5aeW-FbyNkdUPpfGxwQY\"}\r\n\r\ndata: {\"candidates\": [{\"content\": {\"parts\": [{\"text\": \"30.\"}],\"role\": \"model\"},\"index\": 0}],\"usageMetadata\": {\"promptTokenCount\": 392,\"candidatesTokenCount\": 47,\"totalTokenCount\": 439,\"promptTokensDetails\": [{\"modality\": \"TEXT\",\"tokenCount\": 392}]},\"modelVersion\": \"gemini-3-flash-preview\",\"responseId\": \"biS5aeW-FbyNkdUPpfGxwQY\"}\r\n\r\ndata: {\"candidates\": [{\"content\": {\"parts\": [{\"text\": \"\"}],\"role\": \"model\"},\"finishReason\": \"STOP\",\"index\": 0}],\"usageMetadata\": {\"promptTokenCount\": 498,\"candidatesTokenCount\": 47,\"totalTokenCount\": 545,\"promptTokensDetails\": [{\"modality\": \"TEXT\",\"tokenCount\": 498}]},\"modelVersion\": \"gemini-3-flash-preview\",\"responseId\": \"biS5aeW-FbyNkdUPpfGxwQY\"}\r\n\r\n"
  },
  {
    "path": "internal/llminternal/testdata/TestParallelFunctionCalls_test_parallel_function_calls_gemini-3.1-pro-preview.httprr",
    "content": "httprr trace v1\n1099 3079\nPOST https://generativelanguage.googleapis.com/v1beta/models/gemini-3.1-pro-preview:streamGenerateContent?alt=sse HTTP/1.1\r\nHost: generativelanguage.googleapis.com\r\nUser-Agent: Go-http-client/1.1\r\nContent-Length: 847\r\nContent-Type: application/json\r\n\r\n{\"contents\":[{\"parts\":[{\"text\":\"Can you add 2 and 3? Also 4 and 5? And 6 and 7?\"}],\"role\":\"user\"}],\"generationConfig\":{},\"systemInstruction\":{\"parts\":[{\"text\":\"You are a calculator assistant. You will recieve requests to add two integers. Respond with the sum of the two integers and you must use the sum tool to calculate the sum.\\n\\nYou are an agent. Your internal name is \\\"calculator\\\". The description about you is \\\"A calculator that can add two integers\\\".\"}],\"role\":\"user\"},\"tools\":[{\"functionDeclarations\":[{\"description\":\"sums two integers\",\"name\":\"sum\",\"parametersJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"a\":{\"type\":\"integer\"},\"b\":{\"type\":\"integer\"}},\"required\":[\"a\",\"b\"],\"type\":\"object\"},\"responseJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"sum\":{\"type\":\"integer\"}},\"required\":[\"sum\"],\"type\":\"object\"}}]}]}HTTP/2.0 200 OK\r\nConnection: close\r\nContent-Disposition: attachment\r\nContent-Type: text/event-stream\r\nDate: Tue, 17 Mar 2026 09:52:50 GMT\r\nServer: scaffolding on HTTPServer2\r\nServer-Timing: gfet4t7; dur=3944\r\nVary: Origin\r\nVary: X-Origin\r\nVary: Referer\r\nX-Content-Type-Options: nosniff\r\nX-Frame-Options: SAMEORIGIN\r\nX-Xss-Protection: 0\r\n\r\ndata: {\"candidates\": [{\"content\": {\"parts\": [{\"functionCall\": {\"name\": \"sum\",\"args\": {\"a\": 2,\"b\": 3},\"id\": \"okz0loqw\"},\"thoughtSignature\": \"EqYGCqMGAb4+9vv52GL4uROrsj4WLU0dMpALbUuH2pF13Xi6KloBtUSDw1WJLbPldKOEU1Zqf0jO7rthZuoAl7jGZTuQpRDIRkhwuVY8mKIUzgeBR6Z68wVty1jQf9j+XVxJ7l/axwicTn6cOJOzZ66K3AeFqeWM2jNE/5eoJezmWCOAxgg/Cf70AwChH7YgetDR4F+VvWav91zlx95scApzG9LaS+ihvoRzjSKRPyR2WQgtUvi+m+PvzBaLUNcYR0XZZaKXWMzLI5vnw+NeJq0h04gNTJmAHJOsQ5DjVWp703Aoh5fN8z56UO6HgMrYrIr91fJhGI2bVDKq7G5CeFj1HiFD4z4na+xmgndsEZHrj6/6JKu+2Xe2LL7iTVdi9vsv/yeQCLDC6eIbEDT7Mpda3e61Q1x+LwhMEP7LMp8lTBzcQuNxXBAcRglHC+6wIifmWwlKK1UbyEg1Fz+PctdShrhZBfs/GHPsVZdGRyzgTxa3E0cEHEfbBThtkFMmaCLUAzLXBQMs92+HpgJmXRj3iSOjlePh2PutnlHxsKLI2rs7oKOoc8XSqZt2PAoO5T6l7cgjjKbEPhKtHyKlCCekyFUggwOt1ju4U30ztmnsFM6wB0K/qA9PoQrD7AdrtdUENI0Oe/rISTj6qTviNzvMOWuRlv0L3DWsqwdAfhrseXbuTCndAixDuLMIaUsApIyqIG1/0qF1KjJRo/VXjGKyFr027Io1LjZXrHkyRrRgXntU1/v2Ys0K6SfhbluRkUFOV8AuOhm/z5UVdfObKx0GEnyOXnY9megaOnCKBmYnpv5TXyddeS+b6wEXRMaf/6eXM1Yjvvpq3iXw18cgk+z0U1LsI9u2Doq2tozBMoqEGM/bzIAVwt9nsZakcbGgUX8Y7gu+PZlTJVsrAYLsCkKD//6pxE7UdCYPdeyGIxwqefxF2LD/DugQIL7y+HgES2IgFSjyTnRjzV2pyXGtxiBBxDoT7sIMaUJciNlpwgwVmS2c5PYDOIp1Dmbw6zc8k2R3xapBFYZOqBJHu8bGWm5zsI/lmFZ0uYo7EDElbhyvQBuifbnAKDk=\"}],\"role\": \"model\"},\"index\": 0}],\"usageMetadata\": {\"promptTokenCount\": 161,\"candidatesTokenCount\": 16,\"totalTokenCount\": 381,\"promptTokensDetails\": [{\"modality\": \"TEXT\",\"tokenCount\": 161}],\"thoughtsTokenCount\": 204},\"modelVersion\": \"gemini-3.1-pro-preview\",\"responseId\": \"ciS5aZnUG9KqkdUP5eK_kAY\"}\r\n\r\ndata: {\"candidates\": [{\"content\": {\"parts\": [{\"functionCall\": {\"name\": \"sum\",\"args\": {\"b\": 5,\"a\": 4},\"id\": \"55jh6i4d\"}}],\"role\": \"model\"},\"index\": 0}],\"usageMetadata\": {\"promptTokenCount\": 161,\"candidatesTokenCount\": 32,\"totalTokenCount\": 397,\"promptTokensDetails\": [{\"modality\": \"TEXT\",\"tokenCount\": 161}],\"thoughtsTokenCount\": 204},\"modelVersion\": \"gemini-3.1-pro-preview\",\"responseId\": \"ciS5aZnUG9KqkdUP5eK_kAY\"}\r\n\r\ndata: {\"candidates\": [{\"content\": {\"parts\": [{\"functionCall\": {\"name\": \"sum\",\"args\": {\"a\": 6,\"b\": 7},\"id\": \"c3oxmvnd\"}}],\"role\": \"model\"},\"index\": 0}],\"usageMetadata\": {\"promptTokenCount\": 161,\"candidatesTokenCount\": 48,\"totalTokenCount\": 413,\"promptTokensDetails\": [{\"modality\": \"TEXT\",\"tokenCount\": 161}],\"thoughtsTokenCount\": 204},\"modelVersion\": \"gemini-3.1-pro-preview\",\"responseId\": \"ciS5aZnUG9KqkdUP5eK_kAY\"}\r\n\r\ndata: {\"candidates\": [{\"content\": {\"parts\": [{\"text\": \"\"}],\"role\": \"model\"},\"finishReason\": \"STOP\",\"index\": 0}],\"usageMetadata\": {\"promptTokenCount\": 161,\"candidatesTokenCount\": 48,\"totalTokenCount\": 413,\"promptTokensDetails\": [{\"modality\": \"TEXT\",\"tokenCount\": 161}],\"thoughtsTokenCount\": 204},\"modelVersion\": \"gemini-3.1-pro-preview\",\"responseId\": \"ciS5aZnUG9KqkdUP5eK_kAY\"}\r\n\r\n2682 2324\nPOST https://generativelanguage.googleapis.com/v1beta/models/gemini-3.1-pro-preview:streamGenerateContent?alt=sse HTTP/1.1\r\nHost: generativelanguage.googleapis.com\r\nUser-Agent: Go-http-client/1.1\r\nContent-Length: 2429\r\nContent-Type: application/json\r\n\r\n{\"contents\":[{\"parts\":[{\"text\":\"Can you add 2 and 3? Also 4 and 5? And 6 and 7?\"}],\"role\":\"user\"},{\"parts\":[{\"functionCall\":{\"args\":{\"a\":2,\"b\":3},\"id\":\"okz0loqw\",\"name\":\"sum\"},\"thoughtSignature\":\"EqYGCqMGAb4+9vv52GL4uROrsj4WLU0dMpALbUuH2pF13Xi6KloBtUSDw1WJLbPldKOEU1Zqf0jO7rthZuoAl7jGZTuQpRDIRkhwuVY8mKIUzgeBR6Z68wVty1jQf9j+XVxJ7l/axwicTn6cOJOzZ66K3AeFqeWM2jNE/5eoJezmWCOAxgg/Cf70AwChH7YgetDR4F+VvWav91zlx95scApzG9LaS+ihvoRzjSKRPyR2WQgtUvi+m+PvzBaLUNcYR0XZZaKXWMzLI5vnw+NeJq0h04gNTJmAHJOsQ5DjVWp703Aoh5fN8z56UO6HgMrYrIr91fJhGI2bVDKq7G5CeFj1HiFD4z4na+xmgndsEZHrj6/6JKu+2Xe2LL7iTVdi9vsv/yeQCLDC6eIbEDT7Mpda3e61Q1x+LwhMEP7LMp8lTBzcQuNxXBAcRglHC+6wIifmWwlKK1UbyEg1Fz+PctdShrhZBfs/GHPsVZdGRyzgTxa3E0cEHEfbBThtkFMmaCLUAzLXBQMs92+HpgJmXRj3iSOjlePh2PutnlHxsKLI2rs7oKOoc8XSqZt2PAoO5T6l7cgjjKbEPhKtHyKlCCekyFUggwOt1ju4U30ztmnsFM6wB0K/qA9PoQrD7AdrtdUENI0Oe/rISTj6qTviNzvMOWuRlv0L3DWsqwdAfhrseXbuTCndAixDuLMIaUsApIyqIG1/0qF1KjJRo/VXjGKyFr027Io1LjZXrHkyRrRgXntU1/v2Ys0K6SfhbluRkUFOV8AuOhm/z5UVdfObKx0GEnyOXnY9megaOnCKBmYnpv5TXyddeS+b6wEXRMaf/6eXM1Yjvvpq3iXw18cgk+z0U1LsI9u2Doq2tozBMoqEGM/bzIAVwt9nsZakcbGgUX8Y7gu+PZlTJVsrAYLsCkKD//6pxE7UdCYPdeyGIxwqefxF2LD/DugQIL7y+HgES2IgFSjyTnRjzV2pyXGtxiBBxDoT7sIMaUJciNlpwgwVmS2c5PYDOIp1Dmbw6zc8k2R3xapBFYZOqBJHu8bGWm5zsI/lmFZ0uYo7EDElbhyvQBuifbnAKDk=\"},{\"functionCall\":{\"args\":{\"a\":4,\"b\":5},\"id\":\"55jh6i4d\",\"name\":\"sum\"}},{\"functionCall\":{\"args\":{\"a\":6,\"b\":7},\"id\":\"c3oxmvnd\",\"name\":\"sum\"}}],\"role\":\"model\"},{\"parts\":[{\"functionResponse\":{\"id\":\"okz0loqw\",\"name\":\"sum\",\"response\":{\"sum\":5}}},{\"functionResponse\":{\"id\":\"55jh6i4d\",\"name\":\"sum\",\"response\":{\"sum\":9}}},{\"functionResponse\":{\"id\":\"c3oxmvnd\",\"name\":\"sum\",\"response\":{\"sum\":13}}}],\"role\":\"user\"}],\"generationConfig\":{},\"systemInstruction\":{\"parts\":[{\"text\":\"You are a calculator assistant. You will recieve requests to add two integers. Respond with the sum of the two integers and you must use the sum tool to calculate the sum.\\n\\nYou are an agent. Your internal name is \\\"calculator\\\". The description about you is \\\"A calculator that can add two integers\\\".\"}],\"role\":\"user\"},\"tools\":[{\"functionDeclarations\":[{\"description\":\"sums two integers\",\"name\":\"sum\",\"parametersJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"a\":{\"type\":\"integer\"},\"b\":{\"type\":\"integer\"}},\"required\":[\"a\",\"b\"],\"type\":\"object\"},\"responseJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"sum\":{\"type\":\"integer\"}},\"required\":[\"sum\"],\"type\":\"object\"}}]}]}HTTP/2.0 200 OK\r\nConnection: close\r\nContent-Disposition: attachment\r\nContent-Type: text/event-stream\r\nDate: Tue, 17 Mar 2026 09:52:53 GMT\r\nServer: scaffolding on HTTPServer2\r\nServer-Timing: gfet4t7; dur=2570\r\nVary: Origin\r\nVary: X-Origin\r\nVary: Referer\r\nX-Content-Type-Options: nosniff\r\nX-Frame-Options: SAMEORIGIN\r\nX-Xss-Protection: 0\r\n\r\ndata: {\"candidates\": [{\"content\": {\"parts\": [{\"text\": \"Here are the results of your additions:\\n* 2 +\"}],\"role\": \"model\"},\"index\": 0}],\"usageMetadata\": {\"promptTokenCount\": 236,\"candidatesTokenCount\": 13,\"totalTokenCount\": 324,\"promptTokensDetails\": [{\"modality\": \"TEXT\",\"tokenCount\": 236}],\"thoughtsTokenCount\": 75},\"modelVersion\": \"gemini-3.1-pro-preview\",\"responseId\": \"dSS5ab-cA-vgnsEP8_61wAQ\"}\r\n\r\ndata: {\"candidates\": [{\"content\": {\"parts\": [{\"text\": \" 3 = 5\\n* 4 + 5 = 9\\n* 6 + 7 = \"}],\"role\": \"model\"},\"index\": 0}],\"usageMetadata\": {\"promptTokenCount\": 236,\"candidatesTokenCount\": 37,\"totalTokenCount\": 348,\"promptTokensDetails\": [{\"modality\": \"TEXT\",\"tokenCount\": 236}],\"thoughtsTokenCount\": 75},\"modelVersion\": \"gemini-3.1-pro-preview\",\"responseId\": \"dSS5ab-cA-vgnsEP8_61wAQ\"}\r\n\r\ndata: {\"candidates\": [{\"content\": {\"parts\": [{\"text\": \"13\"}],\"role\": \"model\"},\"index\": 0}],\"usageMetadata\": {\"promptTokenCount\": 236,\"candidatesTokenCount\": 39,\"totalTokenCount\": 350,\"promptTokensDetails\": [{\"modality\": \"TEXT\",\"tokenCount\": 236}],\"thoughtsTokenCount\": 75},\"modelVersion\": \"gemini-3.1-pro-preview\",\"responseId\": \"dSS5ab-cA-vgnsEP8_61wAQ\"}\r\n\r\ndata: {\"candidates\": [{\"content\": {\"parts\": [{\"text\": \"\",\"thoughtSignature\": \"EsICCr8CAb4+9vvi0hPdbkZGP+O32Dk8jBZLVhTDxNt/Wg68DhD2sv8f2czbtpO2pwTh4nbLUfEWwG8RZqdJ3O5HZHBgesXVAFgGwmkAIMGLMaLQeuuSOjg91/ejYt4RlyEHPzO9bxVY7BxidtbUv2MkvEx2v9aLs8HwqvMNKy+me6Hy2SOZdeceMKHLBS6Or19NCY1bznX2AG0l3T/uDs2lFWmGlgEXYsIFNeXQvXKID1pkagWC9OiMVWPCYOKN6s7OdrAx/oyrK8Anm9WdtCB7HCuIqAcx9L75S8VtHrFfHd8dr/Pj5Lnwb1VBDxvLU/7251WQgeAgm0CjFNR7RICmFzMHyR2i2mMxeFKI7SQScoXb71nb4HehJxcHAYNwpDUWq4Q5E5Ehhyrz8dCpBooTdoVl1d5Pjw2L7W0in6AiyhA7yg==\"}],\"role\": \"model\"},\"finishReason\": \"STOP\",\"index\": 0}],\"usageMetadata\": {\"promptTokenCount\": 440,\"candidatesTokenCount\": 39,\"totalTokenCount\": 554,\"promptTokensDetails\": [{\"modality\": \"TEXT\",\"tokenCount\": 440}],\"thoughtsTokenCount\": 75},\"modelVersion\": \"gemini-3.1-pro-preview\",\"responseId\": \"dSS5ab-cA-vgnsEP8_61wAQ\"}\r\n\r\n3362 2765\nPOST https://generativelanguage.googleapis.com/v1beta/models/gemini-3.1-pro-preview:streamGenerateContent?alt=sse HTTP/1.1\r\nHost: generativelanguage.googleapis.com\r\nUser-Agent: Go-http-client/1.1\r\nContent-Length: 3109\r\nContent-Type: application/json\r\n\r\n{\"contents\":[{\"parts\":[{\"text\":\"Can you add 2 and 3? Also 4 and 5? And 6 and 7?\"}],\"role\":\"user\"},{\"parts\":[{\"functionCall\":{\"args\":{\"a\":2,\"b\":3},\"id\":\"okz0loqw\",\"name\":\"sum\"},\"thoughtSignature\":\"EqYGCqMGAb4+9vv52GL4uROrsj4WLU0dMpALbUuH2pF13Xi6KloBtUSDw1WJLbPldKOEU1Zqf0jO7rthZuoAl7jGZTuQpRDIRkhwuVY8mKIUzgeBR6Z68wVty1jQf9j+XVxJ7l/axwicTn6cOJOzZ66K3AeFqeWM2jNE/5eoJezmWCOAxgg/Cf70AwChH7YgetDR4F+VvWav91zlx95scApzG9LaS+ihvoRzjSKRPyR2WQgtUvi+m+PvzBaLUNcYR0XZZaKXWMzLI5vnw+NeJq0h04gNTJmAHJOsQ5DjVWp703Aoh5fN8z56UO6HgMrYrIr91fJhGI2bVDKq7G5CeFj1HiFD4z4na+xmgndsEZHrj6/6JKu+2Xe2LL7iTVdi9vsv/yeQCLDC6eIbEDT7Mpda3e61Q1x+LwhMEP7LMp8lTBzcQuNxXBAcRglHC+6wIifmWwlKK1UbyEg1Fz+PctdShrhZBfs/GHPsVZdGRyzgTxa3E0cEHEfbBThtkFMmaCLUAzLXBQMs92+HpgJmXRj3iSOjlePh2PutnlHxsKLI2rs7oKOoc8XSqZt2PAoO5T6l7cgjjKbEPhKtHyKlCCekyFUggwOt1ju4U30ztmnsFM6wB0K/qA9PoQrD7AdrtdUENI0Oe/rISTj6qTviNzvMOWuRlv0L3DWsqwdAfhrseXbuTCndAixDuLMIaUsApIyqIG1/0qF1KjJRo/VXjGKyFr027Io1LjZXrHkyRrRgXntU1/v2Ys0K6SfhbluRkUFOV8AuOhm/z5UVdfObKx0GEnyOXnY9megaOnCKBmYnpv5TXyddeS+b6wEXRMaf/6eXM1Yjvvpq3iXw18cgk+z0U1LsI9u2Doq2tozBMoqEGM/bzIAVwt9nsZakcbGgUX8Y7gu+PZlTJVsrAYLsCkKD//6pxE7UdCYPdeyGIxwqefxF2LD/DugQIL7y+HgES2IgFSjyTnRjzV2pyXGtxiBBxDoT7sIMaUJciNlpwgwVmS2c5PYDOIp1Dmbw6zc8k2R3xapBFYZOqBJHu8bGWm5zsI/lmFZ0uYo7EDElbhyvQBuifbnAKDk=\"},{\"functionCall\":{\"args\":{\"a\":4,\"b\":5},\"id\":\"55jh6i4d\",\"name\":\"sum\"}},{\"functionCall\":{\"args\":{\"a\":6,\"b\":7},\"id\":\"c3oxmvnd\",\"name\":\"sum\"}}],\"role\":\"model\"},{\"parts\":[{\"functionResponse\":{\"id\":\"okz0loqw\",\"name\":\"sum\",\"response\":{\"sum\":5}}},{\"functionResponse\":{\"id\":\"55jh6i4d\",\"name\":\"sum\",\"response\":{\"sum\":9}}},{\"functionResponse\":{\"id\":\"c3oxmvnd\",\"name\":\"sum\",\"response\":{\"sum\":13}}}],\"role\":\"user\"},{\"parts\":[{\"text\":\"Here are the results of your additions:\\n* 2 + 3 = 5\\n* 4 + 5 = 9\\n* 6 + 7 = 13\"},{\"thoughtSignature\":\"EsICCr8CAb4+9vvi0hPdbkZGP+O32Dk8jBZLVhTDxNt/Wg68DhD2sv8f2czbtpO2pwTh4nbLUfEWwG8RZqdJ3O5HZHBgesXVAFgGwmkAIMGLMaLQeuuSOjg91/ejYt4RlyEHPzO9bxVY7BxidtbUv2MkvEx2v9aLs8HwqvMNKy+me6Hy2SOZdeceMKHLBS6Or19NCY1bznX2AG0l3T/uDs2lFWmGlgEXYsIFNeXQvXKID1pkagWC9OiMVWPCYOKN6s7OdrAx/oyrK8Anm9WdtCB7HCuIqAcx9L75S8VtHrFfHd8dr/Pj5Lnwb1VBDxvLU/7251WQgeAgm0CjFNR7RICmFzMHyR2i2mMxeFKI7SQScoXb71nb4HehJxcHAYNwpDUWq4Q5E5Ehhyrz8dCpBooTdoVl1d5Pjw2L7W0in6AiyhA7yg==\"}],\"role\":\"model\"},{\"parts\":[{\"text\":\"Great, now can you add 10 and 20? Also 40 and 50? And 60 and 70?\"}],\"role\":\"user\"}],\"generationConfig\":{},\"systemInstruction\":{\"parts\":[{\"text\":\"You are a calculator assistant. You will recieve requests to add two integers. Respond with the sum of the two integers and you must use the sum tool to calculate the sum.\\n\\nYou are an agent. Your internal name is \\\"calculator\\\". The description about you is \\\"A calculator that can add two integers\\\".\"}],\"role\":\"user\"},\"tools\":[{\"functionDeclarations\":[{\"description\":\"sums two integers\",\"name\":\"sum\",\"parametersJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"a\":{\"type\":\"integer\"},\"b\":{\"type\":\"integer\"}},\"required\":[\"a\",\"b\"],\"type\":\"object\"},\"responseJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"sum\":{\"type\":\"integer\"}},\"required\":[\"sum\"],\"type\":\"object\"}}]}]}HTTP/2.0 200 OK\r\nConnection: close\r\nContent-Disposition: attachment\r\nContent-Type: text/event-stream\r\nDate: Tue, 17 Mar 2026 09:52:56 GMT\r\nServer: scaffolding on HTTPServer2\r\nServer-Timing: gfet4t7; dur=3577\r\nVary: Origin\r\nVary: X-Origin\r\nVary: Referer\r\nX-Content-Type-Options: nosniff\r\nX-Frame-Options: SAMEORIGIN\r\nX-Xss-Protection: 0\r\n\r\ndata: {\"candidates\": [{\"content\": {\"parts\": [{\"functionCall\": {\"name\": \"sum\",\"args\": {\"a\": 10,\"b\": 20},\"id\": \"cxk8o6f8\"},\"thoughtSignature\": \"ErcECrQEAb4+9vsZQeAMGNLLD6TBwEoFKx96WY+FK1pPtIvlrhOPDj2iojUru29Bzxj8Qfx77fx4594Oqs+C1+yYTt9kTxsFxt1SXRjepUUKjm0WLYs0LpkP46czdNaaR7rGdlgs3RJ85TNi2Sz11qrBnet4Jyl+O+Hbq49czNjl+dKpN4DhqnOPZqsaWN9m5uIGhlt17Q5CibXZApNTEUy/SqQKKzEvjbTUo4Z99f4Pw4cxw6YttaJEUiyVutnFQ+l0hoQu5HgQzKsSu4oOX6JsyQSktECvQI4R+LU2z64WgcIbv7TlcpDxmcyH7huWfNRnSCZ2UCIBZp5IUOjJIPQwpD+ElwcenyBVY6Mfk0kLex0O909631z5rump25yZlN5R330RmuNav7eXeFs6UMoiq1DsGWUipwzG4PAPEWUJPChgzttUdBPgxleTArdOw2+c1+rS7OUcaHRpmu9BfGEZgvFEff4yCwlC6Hw9dHDRgTDTuXF0AXQOT4mipXBNpaCo0JqNzFf63TALLS80Qh98uqyhHSfXYzQRTd5VBUpwIDQkB5P/7IPrkMlKGeweKOHNK2JtBlAuqBQTmXalWo3UMX9IZf0W/Q+UCRJHGoMHa7Q9xzP/bmSkO897H3VS+FbEVR4eKL0fQaHO6D4LsEGBPfUZVuc+BiCDjyRzavdXm1CYuGqwZK9LyRLEsG20+fgccDXSFCFVVi0eaUKGt3Ws+h9ALL9KrAjgSBSrFG0M8/caAXczwmk8\"}],\"role\": \"model\"},\"index\": 0}],\"usageMetadata\": {\"promptTokenCount\": 309,\"candidatesTokenCount\": 18,\"totalTokenCount\": 481,\"promptTokensDetails\": [{\"modality\": \"TEXT\",\"tokenCount\": 309}],\"thoughtsTokenCount\": 154},\"modelVersion\": \"gemini-3.1-pro-preview\",\"responseId\": \"eCS5adbAKNC9kdUPwpj9gAI\"}\r\n\r\ndata: {\"candidates\": [{\"content\": {\"parts\": [{\"functionCall\": {\"name\": \"sum\",\"args\": {\"a\": 40,\"b\": 50},\"id\": \"f801pusn\"}}],\"role\": \"model\"},\"index\": 0}],\"usageMetadata\": {\"promptTokenCount\": 309,\"candidatesTokenCount\": 36,\"totalTokenCount\": 499,\"promptTokensDetails\": [{\"modality\": \"TEXT\",\"tokenCount\": 309}],\"thoughtsTokenCount\": 154},\"modelVersion\": \"gemini-3.1-pro-preview\",\"responseId\": \"eCS5adbAKNC9kdUPwpj9gAI\"}\r\n\r\ndata: {\"candidates\": [{\"content\": {\"parts\": [{\"functionCall\": {\"name\": \"sum\",\"args\": {\"a\": 60,\"b\": 70},\"id\": \"szrp1it3\"}}],\"role\": \"model\"},\"index\": 0}],\"usageMetadata\": {\"promptTokenCount\": 309,\"candidatesTokenCount\": 54,\"totalTokenCount\": 517,\"promptTokensDetails\": [{\"modality\": \"TEXT\",\"tokenCount\": 309}],\"thoughtsTokenCount\": 154},\"modelVersion\": \"gemini-3.1-pro-preview\",\"responseId\": \"eCS5adbAKNC9kdUPwpj9gAI\"}\r\n\r\ndata: {\"candidates\": [{\"content\": {\"parts\": [{\"text\": \"\"}],\"role\": \"model\"},\"finishReason\": \"STOP\",\"index\": 0}],\"usageMetadata\": {\"promptTokenCount\": 309,\"candidatesTokenCount\": 54,\"totalTokenCount\": 517,\"promptTokensDetails\": [{\"modality\": \"TEXT\",\"tokenCount\": 309}],\"thoughtsTokenCount\": 154},\"modelVersion\": \"gemini-3.1-pro-preview\",\"responseId\": \"eCS5adbAKNC9kdUPwpj9gAI\"}\r\n\r\n4633 2335\nPOST https://generativelanguage.googleapis.com/v1beta/models/gemini-3.1-pro-preview:streamGenerateContent?alt=sse HTTP/1.1\r\nHost: generativelanguage.googleapis.com\r\nUser-Agent: Go-http-client/1.1\r\nContent-Length: 4380\r\nContent-Type: application/json\r\n\r\n{\"contents\":[{\"parts\":[{\"text\":\"Can you add 2 and 3? Also 4 and 5? And 6 and 7?\"}],\"role\":\"user\"},{\"parts\":[{\"functionCall\":{\"args\":{\"a\":2,\"b\":3},\"id\":\"okz0loqw\",\"name\":\"sum\"},\"thoughtSignature\":\"EqYGCqMGAb4+9vv52GL4uROrsj4WLU0dMpALbUuH2pF13Xi6KloBtUSDw1WJLbPldKOEU1Zqf0jO7rthZuoAl7jGZTuQpRDIRkhwuVY8mKIUzgeBR6Z68wVty1jQf9j+XVxJ7l/axwicTn6cOJOzZ66K3AeFqeWM2jNE/5eoJezmWCOAxgg/Cf70AwChH7YgetDR4F+VvWav91zlx95scApzG9LaS+ihvoRzjSKRPyR2WQgtUvi+m+PvzBaLUNcYR0XZZaKXWMzLI5vnw+NeJq0h04gNTJmAHJOsQ5DjVWp703Aoh5fN8z56UO6HgMrYrIr91fJhGI2bVDKq7G5CeFj1HiFD4z4na+xmgndsEZHrj6/6JKu+2Xe2LL7iTVdi9vsv/yeQCLDC6eIbEDT7Mpda3e61Q1x+LwhMEP7LMp8lTBzcQuNxXBAcRglHC+6wIifmWwlKK1UbyEg1Fz+PctdShrhZBfs/GHPsVZdGRyzgTxa3E0cEHEfbBThtkFMmaCLUAzLXBQMs92+HpgJmXRj3iSOjlePh2PutnlHxsKLI2rs7oKOoc8XSqZt2PAoO5T6l7cgjjKbEPhKtHyKlCCekyFUggwOt1ju4U30ztmnsFM6wB0K/qA9PoQrD7AdrtdUENI0Oe/rISTj6qTviNzvMOWuRlv0L3DWsqwdAfhrseXbuTCndAixDuLMIaUsApIyqIG1/0qF1KjJRo/VXjGKyFr027Io1LjZXrHkyRrRgXntU1/v2Ys0K6SfhbluRkUFOV8AuOhm/z5UVdfObKx0GEnyOXnY9megaOnCKBmYnpv5TXyddeS+b6wEXRMaf/6eXM1Yjvvpq3iXw18cgk+z0U1LsI9u2Doq2tozBMoqEGM/bzIAVwt9nsZakcbGgUX8Y7gu+PZlTJVsrAYLsCkKD//6pxE7UdCYPdeyGIxwqefxF2LD/DugQIL7y+HgES2IgFSjyTnRjzV2pyXGtxiBBxDoT7sIMaUJciNlpwgwVmS2c5PYDOIp1Dmbw6zc8k2R3xapBFYZOqBJHu8bGWm5zsI/lmFZ0uYo7EDElbhyvQBuifbnAKDk=\"},{\"functionCall\":{\"args\":{\"a\":4,\"b\":5},\"id\":\"55jh6i4d\",\"name\":\"sum\"}},{\"functionCall\":{\"args\":{\"a\":6,\"b\":7},\"id\":\"c3oxmvnd\",\"name\":\"sum\"}}],\"role\":\"model\"},{\"parts\":[{\"functionResponse\":{\"id\":\"okz0loqw\",\"name\":\"sum\",\"response\":{\"sum\":5}}},{\"functionResponse\":{\"id\":\"55jh6i4d\",\"name\":\"sum\",\"response\":{\"sum\":9}}},{\"functionResponse\":{\"id\":\"c3oxmvnd\",\"name\":\"sum\",\"response\":{\"sum\":13}}}],\"role\":\"user\"},{\"parts\":[{\"text\":\"Here are the results of your additions:\\n* 2 + 3 = 5\\n* 4 + 5 = 9\\n* 6 + 7 = 13\"},{\"thoughtSignature\":\"EsICCr8CAb4+9vvi0hPdbkZGP+O32Dk8jBZLVhTDxNt/Wg68DhD2sv8f2czbtpO2pwTh4nbLUfEWwG8RZqdJ3O5HZHBgesXVAFgGwmkAIMGLMaLQeuuSOjg91/ejYt4RlyEHPzO9bxVY7BxidtbUv2MkvEx2v9aLs8HwqvMNKy+me6Hy2SOZdeceMKHLBS6Or19NCY1bznX2AG0l3T/uDs2lFWmGlgEXYsIFNeXQvXKID1pkagWC9OiMVWPCYOKN6s7OdrAx/oyrK8Anm9WdtCB7HCuIqAcx9L75S8VtHrFfHd8dr/Pj5Lnwb1VBDxvLU/7251WQgeAgm0CjFNR7RICmFzMHyR2i2mMxeFKI7SQScoXb71nb4HehJxcHAYNwpDUWq4Q5E5Ehhyrz8dCpBooTdoVl1d5Pjw2L7W0in6AiyhA7yg==\"}],\"role\":\"model\"},{\"parts\":[{\"text\":\"Great, now can you add 10 and 20? Also 40 and 50? And 60 and 70?\"}],\"role\":\"user\"},{\"parts\":[{\"functionCall\":{\"args\":{\"a\":10,\"b\":20},\"id\":\"cxk8o6f8\",\"name\":\"sum\"},\"thoughtSignature\":\"ErcECrQEAb4+9vsZQeAMGNLLD6TBwEoFKx96WY+FK1pPtIvlrhOPDj2iojUru29Bzxj8Qfx77fx4594Oqs+C1+yYTt9kTxsFxt1SXRjepUUKjm0WLYs0LpkP46czdNaaR7rGdlgs3RJ85TNi2Sz11qrBnet4Jyl+O+Hbq49czNjl+dKpN4DhqnOPZqsaWN9m5uIGhlt17Q5CibXZApNTEUy/SqQKKzEvjbTUo4Z99f4Pw4cxw6YttaJEUiyVutnFQ+l0hoQu5HgQzKsSu4oOX6JsyQSktECvQI4R+LU2z64WgcIbv7TlcpDxmcyH7huWfNRnSCZ2UCIBZp5IUOjJIPQwpD+ElwcenyBVY6Mfk0kLex0O909631z5rump25yZlN5R330RmuNav7eXeFs6UMoiq1DsGWUipwzG4PAPEWUJPChgzttUdBPgxleTArdOw2+c1+rS7OUcaHRpmu9BfGEZgvFEff4yCwlC6Hw9dHDRgTDTuXF0AXQOT4mipXBNpaCo0JqNzFf63TALLS80Qh98uqyhHSfXYzQRTd5VBUpwIDQkB5P/7IPrkMlKGeweKOHNK2JtBlAuqBQTmXalWo3UMX9IZf0W/Q+UCRJHGoMHa7Q9xzP/bmSkO897H3VS+FbEVR4eKL0fQaHO6D4LsEGBPfUZVuc+BiCDjyRzavdXm1CYuGqwZK9LyRLEsG20+fgccDXSFCFVVi0eaUKGt3Ws+h9ALL9KrAjgSBSrFG0M8/caAXczwmk8\"},{\"functionCall\":{\"args\":{\"a\":40,\"b\":50},\"id\":\"f801pusn\",\"name\":\"sum\"}},{\"functionCall\":{\"args\":{\"a\":60,\"b\":70},\"id\":\"szrp1it3\",\"name\":\"sum\"}}],\"role\":\"model\"},{\"parts\":[{\"functionResponse\":{\"id\":\"cxk8o6f8\",\"name\":\"sum\",\"response\":{\"sum\":30}}},{\"functionResponse\":{\"id\":\"f801pusn\",\"name\":\"sum\",\"response\":{\"sum\":90}}},{\"functionResponse\":{\"id\":\"szrp1it3\",\"name\":\"sum\",\"response\":{\"sum\":130}}}],\"role\":\"user\"}],\"generationConfig\":{},\"systemInstruction\":{\"parts\":[{\"text\":\"You are a calculator assistant. You will recieve requests to add two integers. Respond with the sum of the two integers and you must use the sum tool to calculate the sum.\\n\\nYou are an agent. Your internal name is \\\"calculator\\\". The description about you is \\\"A calculator that can add two integers\\\".\"}],\"role\":\"user\"},\"tools\":[{\"functionDeclarations\":[{\"description\":\"sums two integers\",\"name\":\"sum\",\"parametersJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"a\":{\"type\":\"integer\"},\"b\":{\"type\":\"integer\"}},\"required\":[\"a\",\"b\"],\"type\":\"object\"},\"responseJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"sum\":{\"type\":\"integer\"}},\"required\":[\"sum\"],\"type\":\"object\"}}]}]}HTTP/2.0 200 OK\r\nConnection: close\r\nContent-Disposition: attachment\r\nContent-Type: text/event-stream\r\nDate: Tue, 17 Mar 2026 09:52:59 GMT\r\nServer: scaffolding on HTTPServer2\r\nServer-Timing: gfet4t7; dur=2791\r\nVary: Origin\r\nVary: X-Origin\r\nVary: Referer\r\nX-Content-Type-Options: nosniff\r\nX-Frame-Options: SAMEORIGIN\r\nX-Xss-Protection: 0\r\n\r\ndata: {\"candidates\": [{\"content\": {\"parts\": [{\"text\": \"Here are the results for those additions:\\n* 10 +\"}],\"role\": \"model\"},\"index\": 0}],\"usageMetadata\": {\"promptTokenCount\": 393,\"candidatesTokenCount\": 14,\"totalTokenCount\": 487,\"promptTokensDetails\": [{\"modality\": \"TEXT\",\"tokenCount\": 393}],\"thoughtsTokenCount\": 80},\"modelVersion\": \"gemini-3.1-pro-preview\",\"responseId\": \"eyS5aY3aJf65nsEPzPaAoQM\"}\r\n\r\ndata: {\"candidates\": [{\"content\": {\"parts\": [{\"text\": \" 20 = 30\\n* 40 + 50 = 90\\n* 6\"}],\"role\": \"model\"},\"index\": 0}],\"usageMetadata\": {\"promptTokenCount\": 393,\"candidatesTokenCount\": 38,\"totalTokenCount\": 511,\"promptTokensDetails\": [{\"modality\": \"TEXT\",\"tokenCount\": 393}],\"thoughtsTokenCount\": 80},\"modelVersion\": \"gemini-3.1-pro-preview\",\"responseId\": \"eyS5aY3aJf65nsEPzPaAoQM\"}\r\n\r\ndata: {\"candidates\": [{\"content\": {\"parts\": [{\"text\": \"0 + 70 = 130\"}],\"role\": \"model\"},\"index\": 0}],\"usageMetadata\": {\"promptTokenCount\": 393,\"candidatesTokenCount\": 48,\"totalTokenCount\": 521,\"promptTokensDetails\": [{\"modality\": \"TEXT\",\"tokenCount\": 393}],\"thoughtsTokenCount\": 80},\"modelVersion\": \"gemini-3.1-pro-preview\",\"responseId\": \"eyS5aY3aJf65nsEPzPaAoQM\"}\r\n\r\ndata: {\"candidates\": [{\"content\": {\"parts\": [{\"text\": \"\",\"thoughtSignature\": \"EsMCCsACAb4+9vsz1Lyx7TgiQyKVq3Bd/Zp4Yb+u7+COuc+BrIYdmHit3Af7++ds/aicQ51M+mD7+7TQySuE96fsb2a7Iv/xCMzWdAqBJs2Ynpox7MQQxACeVOX34ozgPfAC60LSDkNQYbnwYq1PHjV0T0Ig67+UUjucfh+pfiDriZNRRmLHEXJIn2m5PU53nnyr2dQIUU08ebT8G4SqdOI0PLFab4RELwRWJ3i5RlWxrKYwJJohefG5xDtZMWAjJHcqN8FuyQ/D74dW/0X/qPHGVq/NkVFVH0LUMq5+yB2hOrXgjGATrKg1nu+GF6vOEo+QmGOnyLv4rtmQ2bTj6Tfw/sFkhLwHs9vVOCAnohW/fkXFkCXpq9zcab1a/Q/v+TwMqy5WF0UTuPcJ/3cL+TUhfTSQqT6Pa8zTDVh0yVBXPSrQ78E=\"}],\"role\": \"model\"},\"finishReason\": \"STOP\",\"index\": 0}],\"usageMetadata\": {\"promptTokenCount\": 547,\"candidatesTokenCount\": 48,\"totalTokenCount\": 675,\"promptTokensDetails\": [{\"modality\": \"TEXT\",\"tokenCount\": 547}],\"thoughtsTokenCount\": 80},\"modelVersion\": \"gemini-3.1-pro-preview\",\"responseId\": \"eyS5aY3aJf65nsEPzPaAoQM\"}\r\n\r\n"
  },
  {
    "path": "internal/llminternal/tools_processor.go",
    "content": "// Copyright 2026 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage llminternal\n\nimport (\n\t\"fmt\"\n\t\"iter\"\n\n\t\"google.golang.org/adk/agent\"\n\ticontext \"google.golang.org/adk/internal/context\"\n\t\"google.golang.org/adk/model\"\n\t\"google.golang.org/adk/session\"\n)\n\n// ContentRequestProcessor populates the LLMRequest's Contents based on\n// the InvocationContext that includes the previous events.\nfunc toolProcessor(ctx agent.InvocationContext, req *model.LLMRequest, f *Flow) iter.Seq2[*session.Event, error] {\n\treturn func(yield func(*session.Event, error) bool) {\n\t\tif f.Tools != nil {\n\t\t\treturn\n\t\t}\n\t\tllmAgent, ok := ctx.Agent().(Agent)\n\t\tif !ok {\n\t\t\tyield(nil, fmt.Errorf(\"agent %v is not an LLMAgent\", ctx.Agent().Name()))\n\t\t\treturn\n\t\t}\n\t\ttools := Reveal(llmAgent).Tools\n\t\tfor _, toolSet := range Reveal(llmAgent).Toolsets {\n\t\t\ttsTools, err := toolSet.Tools(icontext.NewReadonlyContext(ctx))\n\t\t\tif err != nil {\n\t\t\t\tyield(nil, fmt.Errorf(\"failed to extract tools from the tool set %q: %w\", toolSet.Name(), err))\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\ttools = append(tools, tsTools...)\n\t\t}\n\t\tf.Tools = tools\n\t}\n}\n"
  },
  {
    "path": "internal/memory/memory.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage memory\n\nimport (\n\t\"context\"\n\n\t\"google.golang.org/adk/memory\"\n\t\"google.golang.org/adk/session\"\n)\n\ntype Memory struct {\n\tService   memory.Service\n\tSessionID string\n\tUserID    string\n\tAppName   string\n}\n\nfunc (a *Memory) AddSessionToMemory(ctx context.Context, session session.Session) error {\n\treturn a.Service.AddSessionToMemory(ctx, session)\n}\n\nfunc (a *Memory) SearchMemory(ctx context.Context, query string) (*memory.SearchResponse, error) {\n\treturn a.Service.SearchMemory(ctx, &memory.SearchRequest{\n\t\tAppName: a.AppName,\n\t\tUserID:  a.UserID,\n\t\tQuery:   query,\n\t})\n}\n"
  },
  {
    "path": "internal/memory/memory_test.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage memory_test\n\nimport (\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/google/go-cmp/cmp\"\n\t\"github.com/google/go-cmp/cmp/cmpopts\"\n\t\"google.golang.org/genai\"\n\n\timemory \"google.golang.org/adk/internal/memory\"\n\t\"google.golang.org/adk/memory\"\n\t\"google.golang.org/adk/model\"\n\t\"google.golang.org/adk/session\"\n)\n\nfunc TestMemory_AddAndSearch(t *testing.T) {\n\tappName, userID, sessionID := \"testApp\", \"testUser\", \"sess1\"\n\tmemoryService := imemory.Memory{\n\t\tService:   memory.InMemoryService(),\n\t\tUserID:    userID,\n\t\tAppName:   appName,\n\t\tSessionID: sessionID,\n\t}\n\n\tcontent1 := genai.NewContentFromText(\"The quick brown fox\", genai.RoleUser)\n\tcontent2 := genai.NewContentFromText(\"jumps over the lazy dog\", genai.RoleUser)\n\n\tevents := []*session.Event{\n\t\t{\n\t\t\tTimestamp: time.Date(2025, 1, 1, 10, 0, 0, 0, time.UTC),\n\t\t\tAuthor:    \"user1\",\n\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\tContent: content1,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tTimestamp: time.Date(2025, 1, 1, 10, 5, 0, 0, time.UTC),\n\t\t\tAuthor:    \"user1\",\n\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\tContent: content2,\n\t\t\t},\n\t\t},\n\t}\n\tsessionService := session.InMemoryService()\n\tcreateResponse, err := sessionService.Create(t.Context(), &session.CreateRequest{\n\t\tAppName:   appName,\n\t\tUserID:    userID,\n\t\tSessionID: sessionID,\n\t})\n\tif err != nil {\n\t\tt.Fatalf(\"Failed to create session: %v\", err)\n\t}\n\tsession := createResponse.Session\n\tfor _, event := range events {\n\t\tif err := sessionService.AppendEvent(t.Context(), session, event); err != nil {\n\t\t\tt.Fatalf(\"Failed to append event: %v\", err)\n\t\t}\n\t}\n\n\tif err := memoryService.AddSessionToMemory(t.Context(), session); err != nil {\n\t\tt.Fatalf(\"AddSessionToMemory failed: %v\", err)\n\t}\n\n\t// Expected MemoryEntry items\n\tentry1 := memory.Entry{\n\t\tContent:   content1,\n\t\tAuthor:    \"user1\",\n\t\tTimestamp: time.Date(2025, 1, 1, 10, 0, 0, 0, time.UTC),\n\t}\n\tentry2 := memory.Entry{\n\t\tContent:   content2,\n\t\tAuthor:    \"user1\",\n\t\tTimestamp: time.Date(2025, 1, 1, 10, 5, 0, 0, time.UTC),\n\t}\n\n\ttests := []struct {\n\t\tname  string\n\t\tquery string\n\t\twant  *memory.SearchResponse\n\t}{\n\t\t{\n\t\t\tname:  \"match first entry\",\n\t\t\tquery: \"fox\",\n\t\t\twant: &memory.SearchResponse{\n\t\t\t\tMemories: []memory.Entry{entry1},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname:  \"match second entry\",\n\t\t\tquery: \"DOG\", // Search should be case-insensitive\n\t\t\twant: &memory.SearchResponse{\n\t\t\t\tMemories: []memory.Entry{entry2},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname:  \"match both entries (any word)\",\n\t\t\tquery: \"quick dog\",\n\t\t\twant: &memory.SearchResponse{\n\t\t\t\tMemories: []memory.Entry{entry1, entry2},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname:  \"match word in both\",\n\t\t\tquery: \"the\",\n\t\t\twant: &memory.SearchResponse{\n\t\t\t\tMemories: []memory.Entry{entry1, entry2},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname:  \"no match\",\n\t\t\tquery: \"unrelated\",\n\t\t\twant:  &memory.SearchResponse{},\n\t\t},\n\t\t{\n\t\t\tname:  \"empty query\",\n\t\t\tquery: \"\",\n\t\t\twant:  &memory.SearchResponse{},\n\t\t},\n\t}\n\n\tfor _, tc := range tests {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\tgot, err := memoryService.SearchMemory(t.Context(), tc.query)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"SearchMemory(%q) failed: %v\", tc.query, err)\n\t\t\t}\n\n\t\t\tif diff := cmp.Diff(tc.want, got, cmpopts.EquateEmpty()); diff != \"\" {\n\t\t\t\tt.Errorf(\"SearchMemory(%q) returned diff (-want +got):\\n%s\", tc.query, diff)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestMemory_Search_NoData(t *testing.T) {\n\tmemory := imemory.Memory{\n\t\tService:   memory.InMemoryService(),\n\t\tUserID:    \"testUser\",\n\t\tAppName:   \"testApp\",\n\t\tSessionID: \"sess2\",\n\t}\n\n\tgot, err := memory.SearchMemory(t.Context(), \"any query\")\n\tif err != nil {\n\t\tt.Fatalf(\"SearchMemory() failed: %v\", err)\n\t}\n\tif len(got.Memories) != 0 {\n\t\tt.Errorf(\"SearchMemory() on empty memory returned %d items, want 0\", len(got.Memories))\n\t}\n}\n\nfunc TestMemory_Search_Isolation(t *testing.T) {\n\tmemService := memory.InMemoryService()\n\tappName := \"testApp\"\n\n\tuserID1, sessionID1 := \"user1\", \"sess1\"\n\n\tmemory1 := imemory.Memory{\n\t\tService:   memService,\n\t\tUserID:    userID1,\n\t\tAppName:   appName,\n\t\tSessionID: sessionID1,\n\t}\n\tcontent1 := genai.NewContentFromText(\"Content for user1\", genai.RoleUser)\n\tsessionService := session.InMemoryService()\n\tcreateResponse, err := sessionService.Create(t.Context(), &session.CreateRequest{\n\t\tAppName:   appName,\n\t\tUserID:    userID1,\n\t\tSessionID: sessionID1,\n\t})\n\tif err != nil {\n\t\tt.Fatalf(\"Failed to create session: %v\", err)\n\t}\n\tstoredSession := createResponse.Session\n\tif err := sessionService.AppendEvent(t.Context(), storedSession, &session.Event{\n\t\tTimestamp:   time.Now(),\n\t\tAuthor:      \"user1\",\n\t\tLLMResponse: model.LLMResponse{Content: content1},\n\t}); err != nil {\n\t\tt.Fatalf(\"Failed to append event: %v\", err)\n\t}\n\n\tif err := memory1.AddSessionToMemory(t.Context(), storedSession); err != nil {\n\t\tt.Fatalf(\"AddSessionToMemory failed: %v\", err)\n\t}\n\n\t// Add data for User2\n\tuserID2, sessionID2 := \"user2\", \"sess2\"\n\tmemory2 := imemory.Memory{\n\t\tService:   memService,\n\t\tUserID:    userID2,\n\t\tAppName:   \"testApp\",\n\t\tSessionID: sessionID2,\n\t}\n\tcontent2 := genai.NewContentFromText(\"Content for user2\", genai.RoleUser)\n\tcreateResponse2, err := sessionService.Create(t.Context(), &session.CreateRequest{\n\t\tAppName:   appName,\n\t\tUserID:    userID2,\n\t\tSessionID: sessionID2,\n\t})\n\tif err != nil {\n\t\tt.Fatalf(\"Failed to create session: %v\", err)\n\t}\n\tstoredSession2 := createResponse2.Session\n\tif err := sessionService.AppendEvent(t.Context(), storedSession2, &session.Event{\n\t\tTimestamp:   time.Now(),\n\t\tAuthor:      \"user2\",\n\t\tLLMResponse: model.LLMResponse{Content: content2},\n\t}); err != nil {\n\t\tt.Fatalf(\"Failed to append event: %v\", err)\n\t}\n\n\tif err := memory2.AddSessionToMemory(t.Context(), storedSession2); err != nil {\n\t\tt.Fatalf(\"AddSessionToMemory failed: %v\", err)\n\t}\n\n\t// User1 search should only find user1's content\n\tgot1, err := memory1.SearchMemory(t.Context(), \"Content\")\n\tif err != nil {\n\t\tt.Fatalf(\"memory1.SearchMemory failed: %v\", err)\n\t}\n\tif len(got1.Memories) != 1 {\n\t\tt.Errorf(\"memory1.SearchMemory returned %d items, want 1\", len(got1.Memories))\n\t} else if diff := cmp.Diff(content1, got1.Memories[0].Content); diff != \"\" {\n\t\tt.Errorf(\"memory1.SearchMemory returned diff (-want +got):\\n%s\", diff)\n\t}\n\n\t// User2 search should only find user2's content\n\tgot2, err := memory2.SearchMemory(t.Context(), \"Content\")\n\tif err != nil {\n\t\tt.Fatalf(\"memory2.SearchMemory failed: %v\", err)\n\t}\n\tif len(got2.Memories) != 1 {\n\t\tt.Errorf(\"memory2.SearchMemory returned %d items, want 1\", len(got2.Memories))\n\t} else if diff := cmp.Diff(content2, got2.Memories[0].Content); diff != \"\" {\n\t\tt.Errorf(\"memory2.SearchMemory returned diff (-want +got):\\n%s\", diff)\n\t}\n}\n"
  },
  {
    "path": "internal/plugininternal/plugin_manager.go",
    "content": "// Copyright 2026 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage plugininternal\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"time\"\n\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/agent\"\n\t\"google.golang.org/adk/internal/plugininternal/plugincontext\"\n\t\"google.golang.org/adk/model\"\n\t\"google.golang.org/adk/plugin\"\n\t\"google.golang.org/adk/session\"\n\t\"google.golang.org/adk/tool\"\n)\n\ntype PluginConfig struct {\n\tPlugins      []*plugin.Plugin\n\tCloseTimeout time.Duration\n}\n\n// PluginManager manages the registration and execution of plugins.\ntype PluginManager struct {\n\tplugins      []*plugin.Plugin\n\tcloseTimeout time.Duration\n}\n\n// NewPluginManager creates a new PluginManager.\nfunc NewPluginManager(cfg PluginConfig) (*PluginManager, error) {\n\tpm := &PluginManager{\n\t\tcloseTimeout: cfg.CloseTimeout,\n\t\tplugins:      make([]*plugin.Plugin, 0, len(cfg.Plugins)),\n\t}\n\n\t// Register plugins defined in the config\n\tfor _, p := range cfg.Plugins {\n\t\terr := pm.registerPlugin(p)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\treturn pm, nil\n}\n\n// RegisterPlugin adds a new plugin to the manager.\nfunc (pm *PluginManager) registerPlugin(plugin *plugin.Plugin) error {\n\tif plugin == nil {\n\t\treturn fmt.Errorf(\"cannot register nil plugin\")\n\t}\n\tfor _, p := range pm.plugins {\n\t\tif p.Name() == plugin.Name() {\n\t\t\treturn fmt.Errorf(\"plugin with name '%s' already registered\", plugin.Name())\n\t\t}\n\t}\n\tpm.plugins = append(pm.plugins, plugin)\n\treturn nil\n}\n\n// RunOnUserMessageCallback runs the OnUserMessageCallback for all plugins.\nfunc (pm *PluginManager) RunOnUserMessageCallback(cctx agent.InvocationContext, userMessage *genai.Content) (*genai.Content, error) {\n\tfor _, plugin := range pm.plugins {\n\t\tcallback := plugin.OnUserMessageCallback()\n\t\tif callback != nil {\n\t\t\tnewContent, err := callback(cctx, userMessage)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\tif newContent != nil {\n\t\t\t\treturn newContent, nil // Early exit\n\t\t\t}\n\t\t}\n\t}\n\treturn nil, nil\n}\n\n// RunBeforeRunCallback runs the BeforeRunCallback for all plugins.\nfunc (pm *PluginManager) RunBeforeRunCallback(cctx agent.InvocationContext) (*genai.Content, error) {\n\tfor _, plugin := range pm.plugins {\n\t\tcallback := plugin.BeforeRunCallback()\n\t\tif callback != nil {\n\t\t\tnewContent, err := callback(cctx)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\tif newContent != nil {\n\t\t\t\treturn newContent, nil // Early exit\n\t\t\t}\n\t\t}\n\t}\n\treturn nil, nil\n}\n\n// RunAfterRunCallback runs the AfterRunCallback for all plugins.\nfunc (pm *PluginManager) RunAfterRunCallback(cctx agent.InvocationContext) {\n\tfor _, plugin := range pm.plugins {\n\t\tcallback := plugin.AfterRunCallback()\n\t\tif callback != nil {\n\t\t\tcallback(cctx)\n\t\t}\n\t}\n}\n\n// RunOnEventCallback runs the OnEventCallback for all plugins.\nfunc (pm *PluginManager) RunOnEventCallback(cctx agent.InvocationContext, event *session.Event) (*session.Event, error) {\n\tfor _, plugin := range pm.plugins {\n\t\tcallback := plugin.OnEventCallback()\n\t\tif callback != nil {\n\t\t\tnewEvent, err := callback(cctx, event)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\tif newEvent != nil {\n\t\t\t\treturn newEvent, nil // Early exit\n\t\t\t}\n\t\t}\n\t}\n\treturn nil, nil\n}\n\n// RunBeforeAgentCallback runs the BeforeAgentCallback for all plugins.\nfunc (pm *PluginManager) RunBeforeAgentCallback(cctx agent.CallbackContext) (*genai.Content, error) {\n\tfor _, plugin := range pm.plugins {\n\t\tcallback := plugin.BeforeAgentCallback()\n\t\tif callback != nil {\n\t\t\tnewContent, err := callback(cctx)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\tif newContent != nil {\n\t\t\t\treturn newContent, nil // Early exit\n\t\t\t}\n\t\t}\n\t}\n\treturn nil, nil\n}\n\n// RunAfterAgentCallback runs the AfterAgentCallback for all plugins.\nfunc (pm *PluginManager) RunAfterAgentCallback(cctx agent.CallbackContext) (*genai.Content, error) {\n\tfor _, plugin := range pm.plugins {\n\t\tcallback := plugin.AfterAgentCallback()\n\t\tif callback != nil {\n\t\t\tnewContent, err := callback(cctx)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\tif newContent != nil {\n\t\t\t\treturn newContent, nil // Early exit\n\t\t\t}\n\t\t}\n\t}\n\treturn nil, nil\n}\n\n// RunBeforeToolCallback runs the BeforeToolCallback for all plugins.\nfunc (pm *PluginManager) RunBeforeToolCallback(ctx tool.Context, tool tool.Tool, args map[string]any) (map[string]any, error) {\n\tfor _, plugin := range pm.plugins {\n\t\tcallback := plugin.BeforeToolCallback()\n\t\tif callback != nil {\n\t\t\tnewArgs, err := callback(ctx, tool, args)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\tif newArgs != nil {\n\t\t\t\treturn newArgs, nil // Early exit\n\t\t\t}\n\t\t}\n\t}\n\treturn nil, nil\n}\n\n// RunAfterToolCallback runs the AfterToolCallback for all plugins.\nfunc (pm *PluginManager) RunAfterToolCallback(ctx tool.Context, tool tool.Tool, args, result map[string]any, err error) (map[string]any, error) {\n\tfor _, plugin := range pm.plugins {\n\t\tcallback := plugin.AfterToolCallback()\n\t\tif callback != nil {\n\t\t\tnewResult, err := callback(ctx, tool, args, result, err)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\tif newResult != nil {\n\t\t\t\treturn newResult, nil // Early exit\n\t\t\t}\n\t\t}\n\t}\n\treturn nil, nil\n}\n\n// RunOnToolErrorCallback runs the OnToolErrorCallback for all plugins.\nfunc (pm *PluginManager) RunOnToolErrorCallback(ctx tool.Context, tool tool.Tool, args map[string]any, err error) (map[string]any, error) {\n\tfor _, plugin := range pm.plugins {\n\t\tcallback := plugin.OnToolErrorCallback()\n\t\tif callback != nil {\n\t\t\tnewResult, err := callback(ctx, tool, args, err)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\tif newResult != nil {\n\t\t\t\treturn newResult, nil // Early exit\n\t\t\t}\n\t\t}\n\t}\n\treturn nil, nil\n}\n\n// RunBeforeModelCallback runs the BeforeModelCallback for all plugins.\nfunc (pm *PluginManager) RunBeforeModelCallback(cctx agent.CallbackContext, llmRequest *model.LLMRequest) (*model.LLMResponse, error) {\n\tfor _, plugin := range pm.plugins {\n\t\tcallback := plugin.BeforeModelCallback()\n\t\tif callback != nil {\n\t\t\tnewResponse, err := callback(cctx, llmRequest)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\tif newResponse != nil {\n\t\t\t\treturn newResponse, nil // Early exit\n\t\t\t}\n\t\t}\n\t}\n\treturn nil, nil\n}\n\n// RunAfterModelCallback runs the AfterModelCallback for all plugins.\nfunc (pm *PluginManager) RunAfterModelCallback(cctx agent.CallbackContext, llmResponse *model.LLMResponse, llmResponseError error) (*model.LLMResponse, error) {\n\tfor _, plugin := range pm.plugins {\n\t\tcallback := plugin.AfterModelCallback()\n\t\tif callback != nil {\n\t\t\tnewResponse, err := callback(cctx, llmResponse, llmResponseError)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\tif newResponse != nil {\n\t\t\t\treturn newResponse, nil // Early exit\n\t\t\t}\n\t\t}\n\t}\n\treturn nil, nil\n}\n\n// RunOnModelErrorCallback runs the OnModelErrorCallback for all plugins.\nfunc (pm *PluginManager) RunOnModelErrorCallback(cctx agent.CallbackContext, llmRequest *model.LLMRequest, llmResponseError error) (*model.LLMResponse, error) {\n\tfor _, plugin := range pm.plugins {\n\t\tcallback := plugin.OnModelErrorCallback()\n\t\tif callback != nil {\n\t\t\tnewResponse, err := callback(cctx, llmRequest, llmResponseError)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\tif newResponse != nil {\n\t\t\t\treturn newResponse, nil // Early exit\n\t\t\t}\n\t\t}\n\t}\n\treturn nil, nil\n}\n\n// Close calls the CloseFunc on all registered plugins.\nfunc (pm *PluginManager) Close() error {\n\tvar errors []error\n\tfor _, plugin := range pm.plugins {\n\t\tif err := plugin.Close(); err != nil {\n\t\t\terrors = append(errors, fmt.Errorf(\"error closing plugin '%s': %w\", plugin.Name(), err))\n\t\t}\n\t}\n\tif len(errors) > 0 {\n\t\treturn fmt.Errorf(\"failed to close plugins: %v\", errors)\n\t}\n\treturn nil\n}\n\nfunc ToContext(ctx context.Context, cfg *PluginManager) context.Context {\n\treturn context.WithValue(ctx, plugincontext.PluginManagerCtxKey, cfg)\n}\n"
  },
  {
    "path": "internal/plugininternal/plugincontext/context.go",
    "content": "// Copyright 2026 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage plugincontext\n\ntype ctxKey int\n\nconst PluginManagerCtxKey ctxKey = 0\n"
  },
  {
    "path": "internal/sessionutils/utils.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage sessionutils\n\nimport (\n\t\"maps\"\n\t\"strings\"\n)\n\nconst (\n\tappPrefix  = \"app:\"\n\tuserPrefix = \"user:\"\n\ttempPrefix = \"temp:\"\n)\n\n// ExtractStateDeltas splits a single state delta map into three separate maps\n// for app, user, and session states based on key prefixes.\n// Temporary keys (starting with TempStatePrefix) are ignored.\nfunc ExtractStateDeltas(delta map[string]any) (\n\tappStateDelta, userStateDelta, sessionStateDelta map[string]any,\n) {\n\t// Initialize the maps to be returned.\n\tappStateDelta = make(map[string]any)\n\tuserStateDelta = make(map[string]any)\n\tsessionStateDelta = make(map[string]any)\n\n\tif delta == nil {\n\t\treturn appStateDelta, userStateDelta, sessionStateDelta\n\t}\n\n\tfor key, value := range delta {\n\t\tif cleanKey, found := strings.CutPrefix(key, appPrefix); found {\n\t\t\tappStateDelta[cleanKey] = value\n\t\t} else if cleanKey, found := strings.CutPrefix(key, userPrefix); found {\n\t\t\tuserStateDelta[cleanKey] = value\n\t\t} else if !strings.HasPrefix(key, tempPrefix) {\n\t\t\t// This key belongs to the session state, as long as it's not temporary.\n\t\t\tsessionStateDelta[key] = value\n\t\t}\n\t}\n\treturn appStateDelta, userStateDelta, sessionStateDelta\n}\n\n// MergeStates combines app, user, and session state maps into a single map\n// for client-side responses, adding the appropriate prefixes back.\nfunc MergeStates(appState, userState, sessionState map[string]any) map[string]any {\n\t// Pre-allocate map capacity for efficiency.\n\ttotalSize := len(appState) + len(userState) + len(sessionState)\n\tmergedState := make(map[string]any, totalSize)\n\n\tmaps.Copy(mergedState, sessionState)\n\n\tfor key, value := range appState {\n\t\tmergedState[appPrefix+key] = value\n\t}\n\n\tfor key, value := range userState {\n\t\tmergedState[userPrefix+key] = value\n\t}\n\n\treturn mergedState\n}\n"
  },
  {
    "path": "internal/style_test.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage internal_test\n\nimport (\n\t\"flag\"\n\t\"fmt\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\t\"testing\"\n\t\"time\"\n)\n\nconst copyrightHeaderTmpl = `// Copyright %d Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n`\n\nconst validStartYear = 2025\n\nvar fixError = flag.Bool(\"fix\", false, \"fix detected problems (e.g. add missing copyright headers)\")\n\nfunc TestCopyrightHeader(t *testing.T) {\n\t// Start test from the parent directory, root of the module.\n\tt.Chdir(\"..\")\n\n\tignore := map[string]bool{\n\t\t// Skip directories that are not relevant for copyright checks.\n\t\t// The followings were copied from golang.org/x/tools.\n\t\t\"internal/jsonschema\": true,\n\t\t\"internal/util\":       true,\n\t\t// The following was copied from golang.org/x/oscar.\n\t\t\"internal/httprr\": true,\n\t\t// Contains vendored dependencies, not subject to copyright checks.\n\t\t\"vendor\": true,\n\t}\n\t_ = filepath.Walk(\".\", func(path string, info os.FileInfo, err error) error {\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif info.IsDir() {\n\t\t\tif ignore[path] {\n\t\t\t\treturn filepath.SkipDir\n\t\t\t}\n\t\t\treturn nil\n\t\t}\n\t\tif !strings.HasSuffix(path, \".go\") {\n\t\t\treturn nil\n\t\t}\n\t\thasHeader, err := hasCopyrightHeader(path)\n\t\tswitch {\n\t\tcase err != nil:\n\t\t\tt.Errorf(\"failed to check file %q: %v\", path, err)\n\t\tcase !hasHeader && !*fixError:\n\t\t\tt.Errorf(\"file %q does not have the copyright header\", path)\n\t\tcase !hasHeader && *fixError:\n\t\t\tt.Logf(\"updating file %q with copyright header\", path)\n\t\t\tif err := addCopyrightHeader(path); err != nil {\n\t\t\t\tt.Errorf(\"failed to update file %q: %v\", path, err)\n\t\t\t}\n\t\t}\n\t\treturn nil\n\t})\n}\n\nfunc hasCopyrightHeader(path string) (bool, error) {\n\tcontent, err := os.ReadFile(path)\n\tif err != nil {\n\t\treturn false, err\n\t}\n\tcontentStr := string(content)\n\tcurrentYear := time.Now().UTC().Year()\n\tfor year := validStartYear; year <= currentYear; year++ {\n\t\texpectedHeader := fmt.Sprintf(copyrightHeaderTmpl, year)\n\t\tif strings.HasPrefix(contentStr, expectedHeader) {\n\t\t\treturn true, nil\n\t\t}\n\t}\n\n\treturn false, nil\n}\n\nfunc addCopyrightHeader(path string) error {\n\tcontent, err := os.ReadFile(path)\n\tif err != nil {\n\t\treturn err\n\t}\n\tcurrentYearHeader := fmt.Sprintf(copyrightHeaderTmpl, time.Now().UTC().Year())\n\tnewContent := []byte(currentYearHeader)\n\tnewContent = append(newContent, content...)\n\treturn os.WriteFile(path, newContent, 0o644)\n}\n"
  },
  {
    "path": "internal/telemetry/converters.go",
    "content": "// Copyright 2026 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage telemetry\n\nimport (\n\t\"fmt\"\n\n\t\"go.opentelemetry.io/otel/log\"\n)\n\n// toLogValue converts a JSON value to a log.Value.\n// From [encoding/json.Unmarshal] documentation:\n// To unmarshal JSON into an interface value,\n// Unmarshal stores one of these in the interface value:\n//\n//   - bool, for JSON booleans\n//   - float64, for JSON numbers\n//   - string, for JSON strings\n//   - []any, for JSON arrays\n//   - map[string]any, for JSON objects\n//   - nil for JSON null\nfunc toLogValue(v any) log.Value {\n\tswitch val := v.(type) {\n\tcase nil:\n\t\treturn log.Value{}\n\tcase string:\n\t\treturn log.StringValue(val)\n\tcase bool:\n\t\treturn log.BoolValue(val)\n\tcase float64:\n\t\treturn log.Float64Value(val)\n\tcase int:\n\t\treturn log.IntValue(val)\n\tcase []any:\n\t\tvalues := make([]log.Value, 0, len(val))\n\t\tfor _, item := range val {\n\t\t\tvalues = append(values, toLogValue(item))\n\t\t}\n\t\treturn log.SliceValue(values...)\n\tcase map[string]any:\n\t\tkvs := make([]log.KeyValue, 0, len(val))\n\t\tfor k, v := range val {\n\t\t\tkvs = append(kvs, log.KeyValue{Key: k, Value: toLogValue(v)})\n\t\t}\n\t\treturn log.MapValue(kvs...)\n\tdefault:\n\t\t// Fallback for other types\n\t\treturn log.StringValue(fmt.Sprintf(\"%v\", val))\n\t}\n}\n\n// FromLogValue converts a log.Value to golang type. See [toLogValue] for more details.\nfunc FromLogValue(v log.Value) any {\n\tswitch v.Kind() {\n\tcase log.KindString:\n\t\treturn v.AsString()\n\tcase log.KindInt64:\n\t\treturn v.AsInt64()\n\tcase log.KindFloat64:\n\t\treturn v.AsFloat64()\n\tcase log.KindBool:\n\t\treturn v.AsBool()\n\tcase log.KindBytes:\n\t\treturn v.AsBytes()\n\tcase log.KindMap:\n\t\tm := make(map[string]any)\n\t\tfor _, kv := range v.AsMap() {\n\t\t\tm[kv.Key] = FromLogValue(kv.Value)\n\t\t}\n\t\treturn m\n\tcase log.KindSlice:\n\t\ts := make([]any, 0)\n\t\tfor _, v := range v.AsSlice() {\n\t\t\ts = append(s, FromLogValue(v))\n\t\t}\n\t\treturn s\n\tcase log.KindEmpty:\n\t\treturn nil\n\tdefault:\n\t\t// Try to handle this as gracefully as possible.\n\t\t//\n\t\t// Don't panic here. The goal here is to have developers find this\n\t\t// first if a slog.Kind is is not handled. It is\n\t\t// preferable to have user's open issue asking why their attributes\n\t\t// have a \"unhandled: \" prefix than say that their code is panicking.\n\t\treturn fmt.Sprintf(\"<unhandled log.Kind: %s>\", v.Kind())\n\t}\n}\n"
  },
  {
    "path": "internal/telemetry/converters_test.go",
    "content": "// Copyright 2026 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage telemetry\n\nimport (\n\t\"testing\"\n\n\t\"github.com/google/go-cmp/cmp\"\n)\n\nfunc TestConvertersRoundTrip(t *testing.T) {\n\ttests := []struct {\n\t\tname string\n\t\tval  any\n\t\twant any\n\t}{\n\t\t{\n\t\t\tname: \"nil\",\n\t\t\tval:  nil,\n\t\t\twant: nil,\n\t\t},\n\t\t{\n\t\t\tname: \"string\",\n\t\t\tval:  \"hello\",\n\t\t\twant: \"hello\",\n\t\t},\n\t\t{\n\t\t\tname: \"bool\",\n\t\t\tval:  true,\n\t\t\twant: true,\n\t\t},\n\t\t{\n\t\t\tname: \"float64\",\n\t\t\tval:  123.456,\n\t\t\twant: 123.456,\n\t\t},\n\t\t{\n\t\t\tname: \"int to int64\",\n\t\t\tval:  int(123),\n\t\t\twant: int64(123),\n\t\t},\n\t\t{\n\t\t\tname: \"slice of mixed types\",\n\t\t\tval:  []any{1.0, true, \"foo\"},\n\t\t\twant: []any{1.0, true, \"foo\"},\n\t\t},\n\t\t{\n\t\t\tname: \"map\",\n\t\t\tval: map[string]any{\n\t\t\t\t\"foo\": \"bar\",\n\t\t\t\t\"baz\": 123.0,\n\t\t\t},\n\t\t\twant: map[string]any{\n\t\t\t\t\"foo\": \"bar\",\n\t\t\t\t\"baz\": 123.0,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"nested structure\",\n\t\t\tval: map[string]any{\n\t\t\t\t\"list\": []any{\n\t\t\t\t\tmap[string]any{\"a\": 1.0},\n\t\t\t\t},\n\t\t\t},\n\t\t\twant: map[string]any{\n\t\t\t\t\"list\": []any{\n\t\t\t\t\tmap[string]any{\"a\": 1.0},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"fallback for unsupported type\",\n\t\t\tval:  struct{ A int }{A: 1},\n\t\t\twant: \"{1}\",\n\t\t},\n\t}\n\n\tfor _, tc := range tests {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t// Convert to log.Value\n\t\t\tval := toLogValue(tc.val)\n\t\t\t// Convert back to any\n\t\t\tgot := FromLogValue(val)\n\n\t\t\t// Assert that result is the same as the expected want\n\t\t\tif diff := cmp.Diff(tc.want, got); diff != \"\" {\n\t\t\t\tt.Errorf(\"Round trip conversion mismatch (-want +got):\\n%s\", diff)\n\t\t\t}\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "internal/telemetry/logger.go",
    "content": "// Copyright 2026 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage telemetry\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"strings\"\n\t\"sync/atomic\"\n\n\t\"go.opentelemetry.io/otel/log\"\n\t\"go.opentelemetry.io/otel/log/global\"\n\tsemconv \"go.opentelemetry.io/otel/semconv/v1.36.0\"\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/internal/version\"\n\t\"google.golang.org/adk/model\"\n)\n\n// genAICaptureMessageContent is true if message content should be elided. False by default.\nvar genAICaptureMessageContent atomic.Bool\n\n// SetGenAICaptureMessageContent sets whether message content should be elided.\nfunc SetGenAICaptureMessageContent(capture bool) {\n\tgenAICaptureMessageContent.Store(capture)\n}\n\n// getGenAICaptureMessageContent returns whether message content should be elided.\nfunc getGenAICaptureMessageContent() bool {\n\treturn genAICaptureMessageContent.Load()\n}\n\nconst elidedContent = \"<elided>\"\n\nvar otelLogger = global.GetLoggerProvider().Logger(\n\tsystemName,\n\tlog.WithSchemaURL(semconv.SchemaURL),\n\tlog.WithInstrumentationVersion(version.Version),\n)\n\n// LogRequest logs the request to the model - the system message and user messages.\n// It iterates over the request contents and logs each as a separate event.\n// Check [logSystemMessage] and [logUserMessage] for emitted event details.\nfunc LogRequest(ctx context.Context, req *model.LLMRequest, backend genai.Backend) {\n\tgenAISystem := variantToGenAISystem(backend)\n\tlogSystemMessage(ctx, req, genAISystem)\n\tfor _, content := range req.Contents {\n\t\tlogUserMessage(ctx, content, genAISystem)\n\t}\n}\n\n// LogResponse logs the inference result.\n// Semconv reference: https://github.com/open-telemetry/semantic-conventions/blob/v1.36.0/docs/gen-ai/gen-ai-events.md#event-gen_aichoice.\n// NOTE: The current implementation doesn't fully follow the spec, but aims for consistency with ADK Python. The differences are:\n// * The spec embeds the \"content\" field to be under the \"message\" key, but it's added directly in body.\n// * The \"tool_calls\" field is required if available in the spec, but it's omitted.\nfunc LogResponse(ctx context.Context, resp *model.LLMResponse, backend genai.Backend) {\n\trecord := log.Record{}\n\trecord.SetEventName(\"gen_ai.choice\")\n\n\tvar finishReason string\n\tvar content *genai.Content\n\tif resp != nil {\n\t\tfinishReason = string(resp.FinishReason)\n\t\tif resp.Content != nil {\n\t\t\tcontent = resp.Content\n\t\t}\n\t}\n\n\tkvs := []log.KeyValue{\n\t\t// ADK internal data model only supports single candidate, even though the implementations can return multiple candidates. Hardcoding index to 0.\n\t\tlog.Int(\"index\", 0),\n\t\t{Key: \"content\", Value: contentToLogValue(content)},\n\t}\n\n\tif finishReason != \"\" {\n\t\tkvs = append(kvs, log.String(\"finish_reason\", finishReason))\n\t}\n\trecord.SetBody(log.MapValue(kvs...))\n\n\tgenAISystem := variantToGenAISystem(backend)\n\tif genAISystem != nil {\n\t\trecord.AddAttributes(*genAISystem)\n\t}\n\n\totelLogger.Emit(ctx, record)\n}\n\n// logSystemMessage logs the system message from the request.\n// Semconv reference: https://github.com/open-telemetry/semantic-conventions/blob/v1.36.0/docs/gen-ai/gen-ai-events.md#event-gen_aisystemmessage.\n// NOTE: The current implementation doesn't fully follow the spec, but aims for consistency with ADK Python. The differences are:\n// * The spec requires a \"role\" body field, but it's ommited.\nfunc logSystemMessage(ctx context.Context, req *model.LLMRequest, genAISystem *log.KeyValue) {\n\trecord := log.Record{}\n\trecord.SetEventName(\"gen_ai.system.message\")\n\trecord.SetBody(log.MapValue(\n\t\tlog.KeyValue{Key: \"content\", Value: extractSystemMessage(req)},\n\t))\n\tif genAISystem != nil {\n\t\trecord.AddAttributes(*genAISystem)\n\t}\n\totelLogger.Emit(ctx, record)\n}\n\n// logUserMessage logs the user message from the request.\n// Semconv reference: https://github.com/open-telemetry/semantic-conventions/blob/v1.36.0/docs/gen-ai/gen-ai-events.md#event-gen_aiusermessage.\n// NOTE: The current implementation doesn't fully follow the spec, but aims for consistency with ADK Python. The differences are:\n// * The spec requires a \"role\" body field, but it's ommited. If the role is set in [genai.Content], then it will be available in body.content.role.\nfunc logUserMessage(ctx context.Context, content *genai.Content, genAISystem *log.KeyValue) {\n\trecord := log.Record{}\n\trecord.SetEventName(\"gen_ai.user.message\")\n\trecord.SetBody(log.MapValue(\n\t\tlog.KeyValue{Key: \"content\", Value: toLogValue(contentToJSONLikeValue(content))},\n\t))\n\tif genAISystem != nil {\n\t\trecord.AddAttributes(*genAISystem)\n\t}\n\n\totelLogger.Emit(ctx, record)\n}\n\n// Ref: https://github.com/open-telemetry/semantic-conventions/blob/v1.36.0/docs/registry/attributes/gen-ai.md#gen-ai-system well-known values.\nfunc variantToGenAISystem(variant genai.Backend) *log.KeyValue {\n\tif variant == genai.BackendVertexAI {\n\t\tval := log.KeyValueFromAttribute(semconv.GenAISystemGCPVertexAI)\n\t\treturn &val\n\t}\n\tif variant == genai.BackendGeminiAPI {\n\t\tval := log.KeyValueFromAttribute(semconv.GenAISystemGCPGemini)\n\t\treturn &val\n\t}\n\treturn nil\n}\n\n// extractSystemMessage extracts the system message from the request config and concatenates it into a single string.\n// If the content is elided, it returns the elided content string.\nfunc extractSystemMessage(req *model.LLMRequest) log.Value {\n\tif !getGenAICaptureMessageContent() {\n\t\treturn log.StringValue(elidedContent)\n\t}\n\tif req == nil || req.Config == nil || req.Config.SystemInstruction == nil {\n\t\treturn log.Value{}\n\t}\n\tvar text []string\n\tfor _, p := range req.Config.SystemInstruction.Parts {\n\t\tif p.Text != \"\" {\n\t\t\ttext = append(text, p.Text)\n\t\t}\n\t}\n\tcontent := strings.Join(text, \"\\n\")\n\treturn log.StringValue(content)\n}\n\nfunc contentToLogValue(c *genai.Content) log.Value {\n\treturn toLogValue(contentToJSONLikeValue(c))\n}\n\n// contentToJSONLikeValue converts a genai.Content to a JSON, which is then converted to a log.Value.\nfunc contentToJSONLikeValue(c *genai.Content) any {\n\tif !getGenAICaptureMessageContent() {\n\t\treturn elidedContent\n\t}\n\tif c == nil {\n\t\treturn nil\n\t}\n\n\t// Marshall to JSON first to preserve the json key names, omit null fields, etc.\n\tb, err := json.Marshal(c)\n\tif err != nil {\n\t\treturn \"<not_serializable>\"\n\t}\n\n\tvar m map[string]any\n\tif err := json.Unmarshal(b, &m); err != nil {\n\t\treturn \"<not_serializable>\"\n\t}\n\treturn m\n}\n"
  },
  {
    "path": "internal/telemetry/logger_test.go",
    "content": "// Copyright 2026 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage telemetry\n\nimport (\n\t\"context\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/google/go-cmp/cmp\"\n\t\"go.opentelemetry.io/otel\"\n\t\"go.opentelemetry.io/otel/log\"\n\tsdklog \"go.opentelemetry.io/otel/sdk/log\"\n\tsemconv \"go.opentelemetry.io/otel/semconv/v1.36.0\"\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/model\"\n)\n\nfunc TestLogRequest(t *testing.T) {\n\ttype wantEvent struct {\n\t\tname  string\n\t\tbody  any // can be map[string]any or string (for elided)\n\t\tattrs []log.KeyValue\n\t}\n\ttests := []struct {\n\t\tname                  string\n\t\tbackend               genai.Backend\n\t\tcaptureMessageContent bool\n\t\treq                   *model.LLMRequest\n\t\twantEvents            []wantEvent\n\t}{\n\t\t{\n\t\t\tname:                  \"RequestWithSystemAndUserMessages\",\n\t\t\tcaptureMessageContent: true,\n\t\t\treq: &model.LLMRequest{\n\t\t\t\tConfig: &genai.GenerateContentConfig{\n\t\t\t\t\tSystemInstruction: &genai.Content{\n\t\t\t\t\t\tRole: \"system\",\n\t\t\t\t\t\tParts: []*genai.Part{\n\t\t\t\t\t\t\t{Text: \"System instruction part 1\"},\n\t\t\t\t\t\t\t{Text: \"System instruction part 2\"},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tContents: []*genai.Content{\n\t\t\t\t\t// Messages from previous turns.\n\t\t\t\t\t{\n\t\t\t\t\t\tRole: \"user\", Parts: []*genai.Part{\n\t\t\t\t\t\t\t{Text: \"Previous user message part 1\"},\n\t\t\t\t\t\t\t{Text: \"Previous user message part 2\"},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tRole: \"agent\",\n\t\t\t\t\t\tParts: []*genai.Part{\n\t\t\t\t\t\t\t{Text: \"Previous agent message part 1\"},\n\t\t\t\t\t\t\t{Text: \"Previous agent message part 2\"},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t// New message.\n\t\t\t\t\t{\n\t\t\t\t\t\tRole: \"user\", Parts: []*genai.Part{\n\t\t\t\t\t\t\t{Text: \"User message part 1\"},\n\t\t\t\t\t\t\t{Text: \"User message part 2\"},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twantEvents: []wantEvent{\n\t\t\t\t{\n\t\t\t\t\tname: \"gen_ai.system.message\",\n\t\t\t\t\tbody: map[string]any{\n\t\t\t\t\t\t\"content\": \"System instruction part 1\\nSystem instruction part 2\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: \"gen_ai.user.message\",\n\t\t\t\t\tbody: map[string]any{\n\t\t\t\t\t\t\"content\": map[string]any{\n\t\t\t\t\t\t\t\"role\": \"user\",\n\t\t\t\t\t\t\t\"parts\": []any{\n\t\t\t\t\t\t\t\tmap[string]any{\"text\": \"Previous user message part 1\"},\n\t\t\t\t\t\t\t\tmap[string]any{\"text\": \"Previous user message part 2\"},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: \"gen_ai.user.message\",\n\t\t\t\t\tbody: map[string]any{\n\t\t\t\t\t\t\"content\": map[string]any{\n\t\t\t\t\t\t\t\"role\": \"agent\",\n\t\t\t\t\t\t\t\"parts\": []any{\n\t\t\t\t\t\t\t\tmap[string]any{\"text\": \"Previous agent message part 1\"},\n\t\t\t\t\t\t\t\tmap[string]any{\"text\": \"Previous agent message part 2\"},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: \"gen_ai.user.message\",\n\t\t\t\t\tbody: map[string]any{\n\t\t\t\t\t\t\"content\": map[string]any{\n\t\t\t\t\t\t\t\"role\": \"user\",\n\t\t\t\t\t\t\t\"parts\": []any{\n\t\t\t\t\t\t\t\tmap[string]any{\"text\": \"User message part 1\"},\n\t\t\t\t\t\t\t\tmap[string]any{\"text\": \"User message part 2\"},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname:                  \"RequestWithNilConfigAndContents\",\n\t\t\tcaptureMessageContent: true,\n\t\t\treq: &model.LLMRequest{\n\t\t\t\tConfig:   nil,\n\t\t\t\tContents: nil,\n\t\t\t},\n\t\t\twantEvents: []wantEvent{\n\t\t\t\t{\n\t\t\t\t\tname: \"gen_ai.system.message\",\n\t\t\t\t\tbody: map[string]any{\n\t\t\t\t\t\t\"content\": nil,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname:                  \"RequestWithNilContentsGeminiBackend\",\n\t\t\tcaptureMessageContent: true,\n\t\t\tbackend:               genai.BackendGeminiAPI,\n\t\t\treq: &model.LLMRequest{\n\t\t\t\tConfig:   nil,\n\t\t\t\tContents: nil,\n\t\t\t},\n\t\t\twantEvents: []wantEvent{\n\t\t\t\t{\n\t\t\t\t\tname: \"gen_ai.system.message\",\n\t\t\t\t\tbody: map[string]any{\n\t\t\t\t\t\t\"content\": nil,\n\t\t\t\t\t},\n\t\t\t\t\tattrs: []log.KeyValue{\n\t\t\t\t\t\tlog.KeyValueFromAttribute(semconv.GenAISystemGCPGemini),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname:                  \"RequestWithNilContentsVertexBackend\",\n\t\t\tcaptureMessageContent: true,\n\t\t\tbackend:               genai.BackendVertexAI,\n\t\t\treq: &model.LLMRequest{\n\t\t\t\tConfig:   nil,\n\t\t\t\tContents: nil,\n\t\t\t},\n\t\t\twantEvents: []wantEvent{\n\t\t\t\t{\n\t\t\t\t\tname: \"gen_ai.system.message\",\n\t\t\t\t\tbody: map[string]any{\n\t\t\t\t\t\t\"content\": nil,\n\t\t\t\t\t},\n\t\t\t\t\tattrs: []log.KeyValue{\n\t\t\t\t\t\tlog.KeyValueFromAttribute(semconv.GenAISystemGCPVertexAI),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname:                  \"RequestWithEmptyConfigAndUserContentWithoutParts\",\n\t\t\tcaptureMessageContent: true,\n\t\t\treq: &model.LLMRequest{\n\t\t\t\tConfig: &genai.GenerateContentConfig{\n\t\t\t\t\t// Config without system instruction.\n\t\t\t\t},\n\t\t\t\tContents: []*genai.Content{\n\t\t\t\t\t// Content without parts.\n\t\t\t\t\t{Role: \"user\"},\n\t\t\t\t},\n\t\t\t},\n\t\t\twantEvents: []wantEvent{\n\t\t\t\t{\n\t\t\t\t\tname: \"gen_ai.system.message\",\n\t\t\t\t\tbody: map[string]any{\n\t\t\t\t\t\t\"content\": nil,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: \"gen_ai.user.message\",\n\t\t\t\t\tbody: map[string]any{\n\t\t\t\t\t\t\"content\": map[string]any{\n\t\t\t\t\t\t\t\"role\": \"user\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname:                  \"ElidedRequest\",\n\t\t\tcaptureMessageContent: false,\n\t\t\treq: &model.LLMRequest{\n\t\t\t\tConfig: &genai.GenerateContentConfig{\n\t\t\t\t\tSystemInstruction: &genai.Content{\n\t\t\t\t\t\tRole: \"system\",\n\t\t\t\t\t\tParts: []*genai.Part{\n\t\t\t\t\t\t\t{Text: \"System instruction\"},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tContents: []*genai.Content{\n\t\t\t\t\t{Role: \"user\", Parts: []*genai.Part{{Text: \"Hello\"}}},\n\t\t\t\t},\n\t\t\t},\n\t\t\twantEvents: []wantEvent{\n\t\t\t\t{\n\t\t\t\t\tname: \"gen_ai.system.message\",\n\t\t\t\t\tbody: map[string]any{\n\t\t\t\t\t\t\"content\": \"<elided>\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: \"gen_ai.user.message\",\n\t\t\t\t\tbody: map[string]any{\n\t\t\t\t\t\t\"content\": \"<elided>\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname:                  \"ElidedRequestWithNilConfigAndContents\",\n\t\t\tcaptureMessageContent: false,\n\t\t\treq: &model.LLMRequest{\n\t\t\t\tConfig:   nil,\n\t\t\t\tContents: nil,\n\t\t\t},\n\t\t\twantEvents: []wantEvent{\n\t\t\t\t{\n\t\t\t\t\tname: \"gen_ai.system.message\",\n\t\t\t\t\tbody: map[string]any{\n\t\t\t\t\t\t\"content\": \"<elided>\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname:                  \"ElidedRequestWithEmptyConfigAndUserContentWithoutParts\",\n\t\t\tcaptureMessageContent: false,\n\t\t\treq: &model.LLMRequest{\n\t\t\t\tConfig: &genai.GenerateContentConfig{\n\t\t\t\t\t// Config without system instruction.\n\t\t\t\t},\n\t\t\t\tContents: []*genai.Content{\n\t\t\t\t\t// Content without parts.\n\t\t\t\t\t{Role: \"user\"},\n\t\t\t\t},\n\t\t\t},\n\t\t\twantEvents: []wantEvent{\n\t\t\t\t{\n\t\t\t\t\tname: \"gen_ai.system.message\",\n\t\t\t\t\tbody: map[string]any{\n\t\t\t\t\t\t\"content\": \"<elided>\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: \"gen_ai.user.message\",\n\t\t\t\t\tbody: map[string]any{\n\t\t\t\t\t\t\"content\": \"<elided>\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n\n\tfor _, tc := range tests {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\tctx := t.Context()\n\t\t\texporter := setup(t, tc.captureMessageContent)\n\n\t\t\tLogRequest(ctx, tc.req, tc.backend)\n\n\t\t\tif len(exporter.records) != len(tc.wantEvents) {\n\t\t\t\tvar records strings.Builder\n\t\t\t\tfor _, r := range exporter.records {\n\t\t\t\t\trecords.WriteString(r.EventName())\n\t\t\t\t\trecords.WriteString(\"\\n\")\n\t\t\t\t}\n\t\t\t\tt.Fatalf(\"expected %d records, got %d, got events:\\n%s\", len(tc.wantEvents), len(exporter.records), records.String())\n\t\t\t}\n\n\t\t\tfor i, want := range tc.wantEvents {\n\t\t\t\tgotRecord := exporter.records[i]\n\t\t\t\tif gotRecord.EventName() != want.name {\n\t\t\t\t\tt.Errorf(\"record[%d]: expected event %q, got %q\", i, want.name, gotRecord.EventName())\n\t\t\t\t}\n\t\t\t\tgotBody := toGoValue(gotRecord.Body())\n\n\t\t\t\tif diff := cmp.Diff(want.body, gotBody); diff != \"\" {\n\t\t\t\t\tt.Errorf(\"record[%d] body mismatch (-want +got):\\n%s\", i, diff)\n\t\t\t\t}\n\n\t\t\t\tvar gotAttrs []log.KeyValue\n\t\t\t\tgotRecord.WalkAttributes(func(kv log.KeyValue) bool {\n\t\t\t\t\tgotAttrs = append(gotAttrs, kv)\n\t\t\t\t\treturn true\n\t\t\t\t})\n\t\t\t\tif diff := cmp.Diff(want.attrs, gotAttrs); diff != \"\" {\n\t\t\t\t\tt.Errorf(\"record[%d] attributes mismatch (-want +got):\\n%s\", i, diff)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestLogResponse(t *testing.T) {\n\ttests := []struct {\n\t\tname                  string\n\t\tresp                  *model.LLMResponse\n\t\tbackend               genai.Backend\n\t\tcaptureMessageContent bool\n\t\twantName              string\n\t\twantBody              map[string]any\n\t\twantAttrs             []log.KeyValue\n\t}{\n\t\t{\n\t\t\tname:                  \"Response\",\n\t\t\tcaptureMessageContent: true,\n\t\t\tresp: &model.LLMResponse{\n\t\t\t\tFinishReason: genai.FinishReasonStop,\n\t\t\t\tContent: &genai.Content{\n\t\t\t\t\tRole: \"model\",\n\t\t\t\t\tParts: []*genai.Part{\n\t\t\t\t\t\t{Text: \"Text part 1\"},\n\t\t\t\t\t\t{Text: \"Text part 2\"},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twantName: \"gen_ai.choice\",\n\t\t\twantBody: map[string]any{\n\t\t\t\t\"index\":         int64(0),\n\t\t\t\t\"finish_reason\": \"STOP\",\n\t\t\t\t\"content\": map[string]any{\n\t\t\t\t\t\"role\": \"model\",\n\t\t\t\t\t\"parts\": []any{\n\t\t\t\t\t\tmap[string]any{\"text\": \"Text part 1\"},\n\t\t\t\t\t\tmap[string]any{\"text\": \"Text part 2\"},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname:                  \"ResponseGeminiBackend\",\n\t\t\tcaptureMessageContent: true,\n\t\t\tbackend:               genai.BackendGeminiAPI,\n\t\t\tresp: &model.LLMResponse{\n\t\t\t\tFinishReason: genai.FinishReasonStop,\n\t\t\t\tContent: &genai.Content{\n\t\t\t\t\tRole: \"model\",\n\t\t\t\t\tParts: []*genai.Part{\n\t\t\t\t\t\t{Text: \"Text\"},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twantName: \"gen_ai.choice\",\n\t\t\twantBody: map[string]any{\n\t\t\t\t\"index\":         int64(0),\n\t\t\t\t\"finish_reason\": \"STOP\",\n\t\t\t\t\"content\": map[string]any{\n\t\t\t\t\t\"role\": \"model\",\n\t\t\t\t\t\"parts\": []any{\n\t\t\t\t\t\tmap[string]any{\"text\": \"Text\"},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twantAttrs: []log.KeyValue{\n\t\t\t\tlog.KeyValueFromAttribute(semconv.GenAISystemGCPGemini),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname:                  \"ResponseVertexBackend\",\n\t\t\tcaptureMessageContent: true,\n\t\t\tbackend:               genai.BackendVertexAI,\n\t\t\tresp: &model.LLMResponse{\n\t\t\t\tFinishReason: genai.FinishReasonStop,\n\t\t\t\tContent: &genai.Content{\n\t\t\t\t\tRole: \"model\",\n\t\t\t\t\tParts: []*genai.Part{\n\t\t\t\t\t\t{Text: \"Text part 1\"},\n\t\t\t\t\t\t{Text: \"Text part 2\"},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twantName: \"gen_ai.choice\",\n\t\t\twantBody: map[string]any{\n\t\t\t\t\"index\":         int64(0),\n\t\t\t\t\"finish_reason\": \"STOP\",\n\t\t\t\t\"content\": map[string]any{\n\t\t\t\t\t\"role\": \"model\",\n\t\t\t\t\t\"parts\": []any{\n\t\t\t\t\t\tmap[string]any{\"text\": \"Text part 1\"},\n\t\t\t\t\t\tmap[string]any{\"text\": \"Text part 2\"},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twantAttrs: []log.KeyValue{\n\t\t\t\tlog.KeyValueFromAttribute(semconv.GenAISystemGCPVertexAI),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname:                  \"ResponseWithFunctionCall\",\n\t\t\tcaptureMessageContent: true,\n\t\t\tresp: &model.LLMResponse{\n\t\t\t\tFinishReason: genai.FinishReasonStop,\n\t\t\t\tContent: &genai.Content{\n\t\t\t\t\tRole: \"model\",\n\t\t\t\t\tParts: []*genai.Part{\n\t\t\t\t\t\t{Thought: true, Text: \"Call tools\"},\n\t\t\t\t\t\t{FunctionCall: &genai.FunctionCall{Name: \"myTool1\", ID: \"id1\", Args: map[string]any{\"arg1\": \"val1\"}}},\n\t\t\t\t\t\t{FunctionCall: &genai.FunctionCall{Name: \"myTool2\", ID: \"id2\", Args: map[string]any{\"arg2\": \"val2\"}}},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twantName: \"gen_ai.choice\",\n\t\t\twantBody: map[string]any{\n\t\t\t\t\"index\":         int64(0),\n\t\t\t\t\"finish_reason\": \"STOP\",\n\t\t\t\t\"content\": map[string]any{\n\t\t\t\t\t\"role\": \"model\",\n\t\t\t\t\t\"parts\": []any{\n\t\t\t\t\t\tmap[string]any{\n\t\t\t\t\t\t\t\"text\":    \"Call tools\",\n\t\t\t\t\t\t\t\"thought\": true,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tmap[string]any{\"functionCall\": map[string]any{\n\t\t\t\t\t\t\t\"name\": \"myTool1\",\n\t\t\t\t\t\t\t\"id\":   \"id1\",\n\t\t\t\t\t\t\t\"args\": map[string]any{\"arg1\": \"val1\"},\n\t\t\t\t\t\t}},\n\t\t\t\t\t\tmap[string]any{\"functionCall\": map[string]any{\n\t\t\t\t\t\t\t\"name\": \"myTool2\",\n\t\t\t\t\t\t\t\"id\":   \"id2\",\n\t\t\t\t\t\t\t\"args\": map[string]any{\"arg2\": \"val2\"},\n\t\t\t\t\t\t}},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname:                  \"NilResponse\",\n\t\t\tcaptureMessageContent: true,\n\t\t\tresp:                  nil,\n\t\t\twantName:              \"gen_ai.choice\",\n\t\t\twantBody: map[string]any{\n\t\t\t\t\"index\":   int64(0),\n\t\t\t\t\"content\": nil,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname:                  \"ElidedResponse\",\n\t\t\tcaptureMessageContent: false,\n\t\t\tresp: &model.LLMResponse{\n\t\t\t\tFinishReason: genai.FinishReasonStop,\n\t\t\t\tContent: &genai.Content{\n\t\t\t\t\tRole: \"model\",\n\t\t\t\t\tParts: []*genai.Part{\n\t\t\t\t\t\t{Text: \"Response part 1\"},\n\t\t\t\t\t\t{Text: \"Response part 2\"},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twantName: \"gen_ai.choice\",\n\t\t\twantBody: map[string]any{\n\t\t\t\t\"index\":         int64(0),\n\t\t\t\t\"finish_reason\": \"STOP\",\n\t\t\t\t\"content\":       \"<elided>\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname:                  \"ElidedNilResponse\",\n\t\t\tcaptureMessageContent: false,\n\t\t\tresp:                  nil,\n\t\t\twantName:              \"gen_ai.choice\",\n\t\t\twantBody: map[string]any{\n\t\t\t\t\"index\":   int64(0),\n\t\t\t\t\"content\": \"<elided>\",\n\t\t\t},\n\t\t},\n\t}\n\n\tfor _, tc := range tests {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\texporter := setup(t, tc.captureMessageContent)\n\n\t\t\tLogResponse(t.Context(), tc.resp, tc.backend)\n\n\t\t\tif len(exporter.records) != 1 {\n\t\t\t\tvar records strings.Builder\n\t\t\t\tfor _, r := range exporter.records {\n\t\t\t\t\trecords.WriteString(r.EventName())\n\t\t\t\t\trecords.WriteString(\"\\n\")\n\t\t\t\t}\n\t\t\t\tt.Fatalf(\"expected 1 record, got %d, got events:\\n%s\", len(exporter.records), records.String())\n\t\t\t}\n\t\t\trecord := exporter.records[0]\n\t\t\tif record.EventName() != tc.wantName {\n\t\t\t\tt.Errorf(\"expected event %q, got %q\", tc.wantName, record.EventName())\n\t\t\t}\n\n\t\t\tgot := toGoValue(record.Body())\n\t\t\tif diff := cmp.Diff(tc.wantBody, got); diff != \"\" {\n\t\t\t\tt.Errorf(\"Body mismatch (-want +got):\\n%s\", diff)\n\t\t\t}\n\n\t\t\tvar gotAttrs []log.KeyValue\n\t\t\trecord.WalkAttributes(func(kv log.KeyValue) bool {\n\t\t\t\tgotAttrs = append(gotAttrs, kv)\n\t\t\t\treturn true\n\t\t\t})\n\t\t\tif diff := cmp.Diff(tc.wantAttrs, gotAttrs); diff != \"\" {\n\t\t\t\tt.Errorf(\"attributes mismatch (-want +got):\\n%s\", diff)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestSpanIDPropagation(t *testing.T) {\n\tctx, span := otel.Tracer(\"test\").Start(context.Background(), \"test\")\n\tdefer span.End()\n\n\texporter := setup(t, false)\n\n\treq := &model.LLMRequest{\n\t\tConfig: &genai.GenerateContentConfig{\n\t\t\tSystemInstruction: &genai.Content{\n\t\t\t\tRole: \"system\",\n\t\t\t\tParts: []*genai.Part{\n\t\t\t\t\t{Text: \"You are a helpful assistant.\"},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tContents: []*genai.Content{\n\t\t\t{\n\t\t\t\tRole: \"user\",\n\t\t\t\tParts: []*genai.Part{\n\t\t\t\t\t{Text: \"Hello\"},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n\n\tLogRequest(ctx, req, genai.BackendVertexAI)\n\tLogResponse(ctx, &model.LLMResponse{}, genai.BackendVertexAI)\n\n\tif len(exporter.records) != 3 {\n\t\tt.Fatalf(\"expected 3 records, got %d\", len(exporter.records))\n\t}\n\n\twantSpanID := span.SpanContext().SpanID()\n\tfor _, record := range exporter.records {\n\t\tif got := record.SpanID(); got != wantSpanID {\n\t\t\tt.Errorf(\"expected span ID %q, got %q\", wantSpanID, got)\n\t\t}\n\t}\n}\n\nfunc setup(t *testing.T, elided bool) *inMemoryExporter {\n\texporter := &inMemoryExporter{}\n\tprovider := sdklog.NewLoggerProvider(\n\t\tsdklog.WithProcessor(sdklog.NewSimpleProcessor(exporter)),\n\t)\n\toriginalLogger := otelLogger\n\totelLogger = provider.Logger(\"test\")\n\tt.Cleanup(func() {\n\t\totelLogger = originalLogger\n\t})\n\n\toriginal := getGenAICaptureMessageContent()\n\tSetGenAICaptureMessageContent(elided)\n\tt.Cleanup(func() {\n\t\tSetGenAICaptureMessageContent(original)\n\t})\n\treturn exporter\n}\n\ntype inMemoryExporter struct {\n\trecords []sdklog.Record\n}\n\nfunc (e *inMemoryExporter) Export(ctx context.Context, records []sdklog.Record) error {\n\te.records = append(e.records, records...)\n\treturn nil\n}\n\nfunc (e *inMemoryExporter) Shutdown(ctx context.Context) error   { return nil }\nfunc (e *inMemoryExporter) ForceFlush(ctx context.Context) error { return nil }\n\n// toGoValue converts a log.Value to a Go value for easier testing.\n// log.Value is not comparable by design, so we need to transform it to another form.\nfunc toGoValue(v log.Value) any {\n\tswitch v.Kind() {\n\tcase log.KindBool:\n\t\treturn v.AsBool()\n\tcase log.KindFloat64:\n\t\treturn v.AsFloat64()\n\tcase log.KindInt64:\n\t\treturn v.AsInt64()\n\tcase log.KindString:\n\t\treturn v.AsString()\n\tcase log.KindBytes:\n\t\treturn v.AsBytes()\n\tcase log.KindSlice:\n\t\tvar s []any\n\t\tfor _, v := range v.AsSlice() {\n\t\t\ts = append(s, toGoValue(v))\n\t\t}\n\t\treturn s\n\tcase log.KindMap:\n\t\tm := make(map[string]any)\n\t\tfor _, kv := range v.AsMap() {\n\t\t\tm[kv.Key] = toGoValue(kv.Value)\n\t\t}\n\t\treturn m\n\tdefault:\n\t\treturn nil\n\t}\n}\n"
  },
  {
    "path": "internal/telemetry/telemetry.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Package telemetry implements telemetry for ADK.\n//\n// WARNING: telemetry provided by ADK (internal/telemetry package) may change (e.g. attributes and their names)\n// because we're in process to standardize and unify telemetry across all ADKs.\npackage telemetry\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"fmt\"\n\n\t\"go.opentelemetry.io/otel\"\n\t\"go.opentelemetry.io/otel/attribute\"\n\t\"go.opentelemetry.io/otel/codes\"\n\tsemconv \"go.opentelemetry.io/otel/semconv/v1.36.0\"\n\t\"go.opentelemetry.io/otel/trace\"\n\n\t\"google.golang.org/adk/internal/version\"\n\t\"google.golang.org/adk/model\"\n\t\"google.golang.org/adk/session\"\n)\n\nconst (\n\tsystemName = \"gcp.vertex.agent\"\n\n\texecuteToolName = \"execute_tool\"\n\tmergeToolName   = \"(merged tools)\"\n)\n\nvar (\n\tgcpVertexAgentToolCallArgsName = attribute.Key(\"gcp.vertex.agent.tool_call_args\")\n\tgcpVertexAgentEventID          = attribute.Key(\"gcp.vertex.agent.event_id\")\n\tgcpVertexAgentToolResponseName = attribute.Key(\"gcp.vertex.agent.tool_response\")\n\tgcpVertexAgentInvocationID     = attribute.Key(\"gcp.vertex.agent.invocation_id\")\n)\n\n// tracer is the tracer instance for ADK go.\nvar tracer trace.Tracer = otel.GetTracerProvider().Tracer(\n\tsystemName,\n\ttrace.WithInstrumentationVersion(version.Version),\n\ttrace.WithSchemaURL(semconv.SchemaURL),\n)\n\ntype agent interface {\n\tName() string\n\tDescription() string\n}\n\n// StartInvokeAgentSpan starts a new semconv invoke_agent span.\n// It returns a new context with the span and the span itself.\nfunc StartInvokeAgentSpan(ctx context.Context, agent agent, sessionID, invocationID string) (context.Context, trace.Span) {\n\tagentName := agent.Name()\n\tspanCtx, span := tracer.Start(ctx, fmt.Sprintf(\"invoke_agent %s\", agentName), trace.WithAttributes(\n\t\tgcpVertexAgentInvocationID.String(invocationID), // used by adk-web\n\t\tsemconv.GenAIOperationNameInvokeAgent,\n\t\tsemconv.GenAIAgentDescription(agent.Description()),\n\t\tsemconv.GenAIAgentName(agentName),\n\t\tsemconv.GenAIConversationID(sessionID),\n\t))\n\n\treturn spanCtx, span\n}\n\ntype TraceAgentResultParams struct {\n\tResponseEvent *session.Event\n\tError         error\n}\n\n// TraceAgentResult records the result of the agent invocation, including status and error.\nfunc TraceAgentResult(span trace.Span, params TraceAgentResultParams) {\n\trecordErrorAndStatus(span, params.Error)\n}\n\n// StartGenerateContentSpanParams contains parameters for [StartGenerateContentSpan].\ntype StartGenerateContentSpanParams struct {\n\t// ModelName is the name of the model being used for generation.\n\tModelName string\n\t// InvocationID is the ID of the invocation.\n\tInvocationID string\n}\n\n// StartGenerateContentSpan starts a new semconv generate_content span.\nfunc StartGenerateContentSpan(ctx context.Context, params StartGenerateContentSpanParams) (context.Context, trace.Span) {\n\tmodelName := params.ModelName\n\tspanCtx, span := tracer.Start(ctx, fmt.Sprintf(\"generate_content %s\", modelName), trace.WithAttributes(\n\t\t// Used by adk-web, can be removed once it reads the invocation id from invoke_agent span.\n\t\tgcpVertexAgentInvocationID.String(params.InvocationID),\n\t\tsemconv.GenAIOperationNameGenerateContent,\n\t\tsemconv.GenAIRequestModel(modelName),\n\t))\n\treturn spanCtx, span\n}\n\ntype TraceGenerateContentResultParams struct {\n\tResponse *model.LLMResponse\n\tEventID  string\n\tError    error\n}\n\n// TraceGenerateContentResult records the result of the generate_content operation, including token usage and finish reason.\nfunc TraceGenerateContentResult(span trace.Span, params TraceGenerateContentResultParams) {\n\trecordErrorAndStatus(span, params.Error)\n\tif params.Response == nil {\n\t\treturn\n\t}\n\tspan.SetAttributes(\n\t\tgcpVertexAgentEventID.String(params.EventID),\n\t\tsemconv.GenAIResponseFinishReasons(string(params.Response.FinishReason)),\n\t)\n\tif params.Response.UsageMetadata != nil {\n\t\tspan.SetAttributes(\n\t\t\tsemconv.GenAIUsageInputTokens(int(params.Response.UsageMetadata.PromptTokenCount)),\n\t\t\tsemconv.GenAIUsageOutputTokens(int(params.Response.UsageMetadata.CandidatesTokenCount)),\n\t\t)\n\t}\n}\n\n// StartExecuteToolSpanParams contains parameters for [StartExecuteToolSpan].\ntype StartExecuteToolSpanParams struct {\n\t// ToolName is the name of the tool being executed.\n\tToolName string\n\t// Args is the arguments of the tool call.\n\tArgs map[string]any\n}\n\n// StartExecuteToolSpan starts a new semconv execute_tool span.\nfunc StartExecuteToolSpan(ctx context.Context, params StartExecuteToolSpanParams) (context.Context, trace.Span) {\n\ttoolName := params.ToolName\n\tspanCtx, span := tracer.Start(ctx, fmt.Sprintf(\"execute_tool %s\", toolName), trace.WithAttributes(\n\t\tsemconv.GenAIOperationNameExecuteTool,\n\t\tsemconv.GenAIToolName(toolName),\n\t\tgcpVertexAgentToolCallArgsName.String(safeSerialize(params.Args))))\n\treturn spanCtx, span\n}\n\ntype TraceToolResultParams struct {\n\t// ToolDescription is a brief description of the tool's purpose.\n\tDescription   string\n\tResponseEvent *session.Event\n\tError         error\n}\n\n// TraceToolResult records the tool execution events.\nfunc TraceToolResult(span trace.Span, params TraceToolResultParams) {\n\trecordErrorAndStatus(span, params.Error)\n\n\tattributes := []attribute.KeyValue{\n\t\tsemconv.GenAIOperationNameKey.String(executeToolName),\n\t\tsemconv.GenAIToolDescriptionKey.String(params.Description),\n\t}\n\n\ttoolCallID := \"<not specified>\"\n\ttoolResponse := \"<not specified>\"\n\n\tif params.ResponseEvent != nil {\n\t\tattributes = append(attributes, gcpVertexAgentEventID.String(params.ResponseEvent.ID))\n\t\tif params.ResponseEvent.LLMResponse.Content != nil {\n\t\t\tresponseParts := params.ResponseEvent.LLMResponse.Content.Parts\n\n\t\t\tif len(responseParts) > 0 {\n\t\t\t\tfunctionResponse := responseParts[0].FunctionResponse\n\t\t\t\tif functionResponse != nil {\n\t\t\t\t\tif functionResponse.ID != \"\" {\n\t\t\t\t\t\ttoolCallID = functionResponse.ID\n\t\t\t\t\t}\n\t\t\t\t\tif functionResponse.Response != nil {\n\t\t\t\t\t\ttoolResponse = safeSerialize(functionResponse.Response)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tattributes = append(attributes, semconv.GenAIToolCallIDKey.String(toolCallID))\n\tattributes = append(attributes, gcpVertexAgentToolResponseName.String(toolResponse))\n\n\tspan.SetAttributes(attributes...)\n}\n\nfunc recordErrorAndStatus(span trace.Span, err error) {\n\tif err == nil {\n\t\treturn\n\t}\n\tspan.RecordError(err)\n\tspan.SetStatus(codes.Error, err.Error())\n}\n\n// WrapYield wraps a yield function to add tracing of values returned by iterators. Read [iter.Seq2] for more information about yield.\n// Limitations:\n// * if yield is called multiple times, then the span will be finalized with the values from the last call.\n//\n// Parameters:\n//\n//\tspan: The OpenTelemetry span to be managed.\n//\tyield: The original yield function `func(T, error) bool`.\n//\tfinalizeSpan: A function `func(trace.Span, T, error)` called just before the span is ended to record final attributes.\n//\n// Returns:\n//\n//\twrapped: A wrapped yield function with the same signature as the original.\n//\tendSpan: A function to be called via `defer` to ensure the span is finalized with capture data and ended.\nfunc WrapYield[T any](span trace.Span, yield func(T, error) bool, finalizeSpan func(trace.Span, T, error)) (wrapped func(T, error) bool, endSpan func()) {\n\tvar val T\n\tvar err error\n\twrapped = func(v T, e error) bool {\n\t\tval = v\n\t\terr = e\n\t\treturn yield(v, e)\n\t}\n\tendSpan = func() {\n\t\tfinalizeSpan(span, val, err)\n\t\tspan.End()\n\t}\n\treturn wrapped, endSpan\n}\n\n// StartTrace starts a new span with the given name.\nfunc StartTrace(ctx context.Context, traceName string) (context.Context, trace.Span) {\n\treturn tracer.Start(ctx, traceName)\n}\n\n// TraceMergedToolCallsResult records the result of the merged tool calls, including status and tool execution events.\nfunc TraceMergedToolCallsResult(span trace.Span, fnResponseEvent *session.Event, err error) {\n\trecordErrorAndStatus(span, err)\n\tattributes := []attribute.KeyValue{\n\t\tsemconv.GenAIOperationNameKey.String(executeToolName),\n\t\tsemconv.GenAIToolNameKey.String(mergeToolName),\n\t\tsemconv.GenAIToolDescriptionKey.String(mergeToolName),\n\t\tgcpVertexAgentToolCallArgsName.String(\"N/A\"),\n\t\tgcpVertexAgentToolResponseName.String(safeSerialize(fnResponseEvent)),\n\t}\n\tif fnResponseEvent != nil {\n\t\tattributes = append(attributes, gcpVertexAgentEventID.String(fnResponseEvent.ID))\n\t}\n\tspan.SetAttributes(attributes...)\n}\n\nfunc safeSerialize(obj any) string {\n\tdump, err := json.Marshal(obj)\n\tif err != nil {\n\t\treturn \"<not serializable>\"\n\t}\n\treturn string(dump)\n}\n"
  },
  {
    "path": "internal/telemetry/telemetry_test.go",
    "content": "// Copyright 2026 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage telemetry\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"testing\"\n\n\t\"go.opentelemetry.io/otel/attribute\"\n\t\"go.opentelemetry.io/otel/codes\"\n\tsdktrace \"go.opentelemetry.io/otel/sdk/trace\"\n\t\"go.opentelemetry.io/otel/sdk/trace/tracetest\"\n\tsemconv \"go.opentelemetry.io/otel/semconv/v1.36.0\"\n\t\"go.opentelemetry.io/otel/trace\"\n\t\"go.opentelemetry.io/otel/trace/noop\"\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/model\"\n\t\"google.golang.org/adk/session\"\n)\n\nfunc TestWrapYield(t *testing.T) {\n\tt.Parallel()\n\n\tvar finalized bool\n\tfinalizeFn := func(span trace.Span, val string, err error) {\n\t\tif val != \"test\" {\n\t\t\tt.Errorf(\"unexpected value in finalizeFn: got %q, want %q\", val, \"test\")\n\t\t}\n\t\tif !errors.Is(err, errTest) {\n\t\t\tt.Errorf(\"unexpected error in finalizeFn: got %v, want %v\", err, errTest)\n\t\t}\n\t\tfinalized = true\n\t}\n\n\tyieldFn := func(val string, err error) bool {\n\t\tif val != \"test\" {\n\t\t\tt.Errorf(\"unexpected value in yieldFn: got %q, want %q\", val, \"test\")\n\t\t}\n\t\tif !errors.Is(err, errTest) {\n\t\t\tt.Errorf(\"unexpected error in yieldFn: got %v, want %v\", err, errTest)\n\t\t}\n\t\treturn true\n\t}\n\n\t_, span := noop.NewTracerProvider().Tracer(\"test\").Start(context.Background(), \"test\")\n\twrappedYield, endSpan := WrapYield(span, yieldFn, finalizeFn)\n\n\tif !wrappedYield(\"test\", errTest) {\n\t\tt.Error(\"wrappedYield should have returned true\")\n\t}\n\n\tendSpan()\n\n\tif !finalized {\n\t\tt.Error(\"finalizeFn was not called\")\n\t}\n}\n\nfunc TestWrapYield_MultipleCalls(t *testing.T) {\n\tt.Parallel()\n\n\tvar finalized bool\n\tfinalizeFn := func(span trace.Span, val string, err error) {\n\t\tif val != \"last\" {\n\t\t\tt.Errorf(\"unexpected value in finalizeFn: got %q, want %q\", val, \"last\")\n\t\t}\n\t\tif !errors.Is(err, errTest) {\n\t\t\tt.Errorf(\"unexpected error in finalizeFn: got %v, want %v\", err, errTest)\n\t\t}\n\t\tfinalized = true\n\t}\n\n\tyieldFn := func(val string, err error) bool {\n\t\treturn true\n\t}\n\n\t_, span := noop.NewTracerProvider().Tracer(\"test\").Start(context.Background(), \"test\")\n\twrappedYield, endSpan := WrapYield(span, yieldFn, finalizeFn)\n\n\twrappedYield(\"first\", nil)\n\twrappedYield(\"\", fmt.Errorf(\"some error\"))\n\twrappedYield(\"last\", errTest)\n\n\tendSpan()\n\n\tif !finalized {\n\t\tt.Error(\"finalizeFn was not called\")\n\t}\n}\n\nvar errTest = errors.New(\"test error\")\n\ntype mockAgent struct{}\n\nfunc (a *mockAgent) Name() string {\n\treturn \"test-agent\"\n}\n\nfunc (a *mockAgent) Description() string {\n\treturn \"test-agent-description\"\n}\n\nfunc TestInvokeAgent(t *testing.T) {\n\tsessionID := \"test-session\"\n\tinvocationID := \"test-invocation-id\"\n\tagent := &mockAgent{}\n\ttests := []struct {\n\t\tname         string\n\t\tresultParams TraceAgentResultParams\n\t\twantName     string\n\t\twantStatus   codes.Code\n\t\twantAttrs    map[attribute.Key]string\n\t}{\n\t\t{\n\t\t\tname: \"Success\",\n\t\t\tresultParams: TraceAgentResultParams{\n\t\t\t\tResponseEvent: session.NewEvent(\"test-invocation-id\"),\n\t\t\t},\n\t\t\twantName:   \"invoke_agent test-agent\",\n\t\t\twantStatus: codes.Unset,\n\t\t\twantAttrs: map[attribute.Key]string{\n\t\t\t\tsemconv.GenAIOperationNameKey:    \"invoke_agent\",\n\t\t\t\tsemconv.GenAIAgentNameKey:        \"test-agent\",\n\t\t\t\tsemconv.GenAIAgentDescriptionKey: \"test-agent-description\",\n\t\t\t\tsemconv.GenAIConversationIDKey:   \"test-session\",\n\t\t\t\tgcpVertexAgentInvocationID:       invocationID,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"Error\",\n\t\t\tresultParams: TraceAgentResultParams{\n\t\t\t\tError: errTest,\n\t\t\t},\n\t\t\twantName:   \"invoke_agent test-agent\",\n\t\t\twantStatus: codes.Error,\n\t\t\twantAttrs: map[attribute.Key]string{\n\t\t\t\tsemconv.GenAIOperationNameKey:    \"invoke_agent\",\n\t\t\t\tsemconv.GenAIAgentNameKey:        \"test-agent\",\n\t\t\t\tsemconv.GenAIAgentDescriptionKey: \"test-agent-description\",\n\t\t\t\tsemconv.GenAIConversationIDKey:   \"test-session\",\n\t\t\t\tgcpVertexAgentInvocationID:       invocationID,\n\t\t\t},\n\t\t},\n\t}\n\n\tfor _, tc := range tests {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\texporter := setupTestTracer(t)\n\t\t\tctx := t.Context()\n\n\t\t\t_, span := StartInvokeAgentSpan(ctx, agent, sessionID, invocationID)\n\t\t\tTraceAgentResult(span, tc.resultParams)\n\t\t\tspan.End()\n\n\t\t\tspans := exporter.GetSpans()\n\t\t\tif len(spans) != 1 {\n\t\t\t\tt.Fatalf(\"expected 1 span, got %d\", len(spans))\n\t\t\t}\n\t\t\tgotSpan := spans[0]\n\n\t\t\tif gotSpan.Name != tc.wantName {\n\t\t\t\tt.Errorf(\"expected span name %q, got %q\", tc.wantName, gotSpan.Name)\n\t\t\t}\n\t\t\tif gotSpan.Status.Code != tc.wantStatus {\n\t\t\t\tt.Errorf(\"expected status %v, got %v\", tc.wantStatus, gotSpan.Status.Code)\n\t\t\t}\n\t\t\tif tc.resultParams.Error != nil {\n\t\t\t\tif gotSpan.Status.Description != tc.resultParams.Error.Error() {\n\t\t\t\t\tt.Errorf(\"expected status description %q, got %q\", tc.resultParams.Error.Error(), gotSpan.Status.Description)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif tc.wantAttrs != nil {\n\t\t\t\tgotAttrs := attributesToMap(gotSpan.Attributes)\n\t\t\t\tfor k, v := range tc.wantAttrs {\n\t\t\t\t\tif gotAttrs[k] != v {\n\t\t\t\t\t\tt.Errorf(\"attribute %q: got %q, want %q\", k, gotAttrs[k], v)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestGenerateContent(t *testing.T) {\n\tinvocationID := \"test-invocation-id\"\n\ttests := []struct {\n\t\tname         string\n\t\tstartParams  StartGenerateContentSpanParams\n\t\tresultParams TraceGenerateContentResultParams\n\t\twantName     string\n\t\twantStatus   codes.Code\n\t\twantAttrs    map[attribute.Key]string\n\t}{\n\t\t{\n\t\t\tname: \"Success\",\n\t\t\tstartParams: StartGenerateContentSpanParams{\n\t\t\t\tModelName:    \"test-model\",\n\t\t\t\tInvocationID: invocationID,\n\t\t\t},\n\t\t\tresultParams: TraceGenerateContentResultParams{\n\t\t\t\tResponse: &model.LLMResponse{\n\t\t\t\t\tUsageMetadata: &genai.GenerateContentResponseUsageMetadata{\n\t\t\t\t\t\tPromptTokenCount:     10,\n\t\t\t\t\t\tCandidatesTokenCount: 20,\n\t\t\t\t\t},\n\t\t\t\t\tFinishReason: genai.FinishReasonStop,\n\t\t\t\t},\n\t\t\t},\n\t\t\twantName:   \"generate_content test-model\",\n\t\t\twantStatus: codes.Unset,\n\t\t\twantAttrs: map[attribute.Key]string{\n\t\t\t\tsemconv.GenAIOperationNameKey:         \"generate_content\",\n\t\t\t\tsemconv.GenAIRequestModelKey:          \"test-model\",\n\t\t\t\tsemconv.GenAIUsageInputTokensKey:      \"10\",\n\t\t\t\tsemconv.GenAIUsageOutputTokensKey:     \"20\",\n\t\t\t\tsemconv.GenAIResponseFinishReasonsKey: \"[\\\"STOP\\\"]\",\n\t\t\t\tgcpVertexAgentInvocationID:            invocationID,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"Error\",\n\t\t\tstartParams: StartGenerateContentSpanParams{\n\t\t\t\tModelName:    \"test-model\",\n\t\t\t\tInvocationID: invocationID,\n\t\t\t},\n\t\t\tresultParams: TraceGenerateContentResultParams{\n\t\t\t\tError: errTest,\n\t\t\t},\n\t\t\twantName:   \"generate_content test-model\",\n\t\t\twantStatus: codes.Error,\n\t\t\twantAttrs: map[attribute.Key]string{\n\t\t\t\tsemconv.GenAIOperationNameKey: \"generate_content\",\n\t\t\t\tsemconv.GenAIRequestModelKey:  \"test-model\",\n\t\t\t\tgcpVertexAgentInvocationID:    invocationID,\n\t\t\t},\n\t\t},\n\t}\n\n\tfor _, tc := range tests {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\texporter := setupTestTracer(t)\n\t\t\tctx := t.Context()\n\n\t\t\t_, span := StartGenerateContentSpan(ctx, tc.startParams)\n\t\t\tTraceGenerateContentResult(span, tc.resultParams)\n\t\t\tspan.End()\n\n\t\t\tspans := exporter.GetSpans()\n\t\t\tif len(spans) != 1 {\n\t\t\t\tt.Fatalf(\"expected 1 span, got %d\", len(spans))\n\t\t\t}\n\t\t\tgotSpan := spans[0]\n\n\t\t\tif gotSpan.Name != tc.wantName {\n\t\t\t\tt.Errorf(\"expected span name %q, got %q\", tc.wantName, gotSpan.Name)\n\t\t\t}\n\t\t\tif gotSpan.Status.Code != tc.wantStatus {\n\t\t\t\tt.Errorf(\"expected status %v, got %v\", tc.wantStatus, gotSpan.Status.Code)\n\t\t\t}\n\t\t\tif tc.resultParams.Error != nil {\n\t\t\t\tif gotSpan.Status.Description != tc.resultParams.Error.Error() {\n\t\t\t\t\tt.Errorf(\"expected status description %q, got %q\", tc.resultParams.Error.Error(), gotSpan.Status.Description)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif tc.wantAttrs != nil {\n\t\t\t\tgotAttrs := attributesToMap(gotSpan.Attributes)\n\t\t\t\tfor k, v := range tc.wantAttrs {\n\t\t\t\t\tif gotAttrs[k] != v {\n\t\t\t\t\t\tt.Errorf(\"attribute %q: got %q, want %q\", k, gotAttrs[k], v)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestExecuteTool(t *testing.T) {\n\ttests := []struct {\n\t\tname         string\n\t\tstartParams  StartExecuteToolSpanParams\n\t\tresultParams TraceToolResultParams\n\t\twantName     string\n\t\twantStatus   codes.Code\n\t\twantAttrs    map[attribute.Key]string\n\t}{\n\t\t{\n\t\t\tname: \"Success\",\n\t\t\tstartParams: StartExecuteToolSpanParams{\n\t\t\t\tToolName: \"test-tool\",\n\t\t\t\tArgs:     map[string]any{\"arg\": \"val\"},\n\t\t\t},\n\t\t\tresultParams: TraceToolResultParams{\n\t\t\t\tDescription:   \"tool-description\",\n\t\t\t\tResponseEvent: &session.Event{ID: \"test-event\"},\n\t\t\t},\n\t\t\twantName:   \"execute_tool test-tool\",\n\t\t\twantStatus: codes.Unset,\n\t\t\twantAttrs: map[attribute.Key]string{\n\t\t\t\tsemconv.GenAIOperationNameKey:   \"execute_tool\",\n\t\t\t\tsemconv.GenAIToolNameKey:        \"test-tool\",\n\t\t\t\tsemconv.GenAIToolDescriptionKey: \"tool-description\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"Error\",\n\t\t\tstartParams: StartExecuteToolSpanParams{\n\t\t\t\tToolName: \"test-tool\",\n\t\t\t},\n\t\t\tresultParams: TraceToolResultParams{\n\t\t\t\tDescription: \"tool-description\",\n\t\t\t\tError:       errTest,\n\t\t\t},\n\t\t\twantName:   \"execute_tool test-tool\",\n\t\t\twantStatus: codes.Error,\n\t\t},\n\t}\n\n\tfor _, tc := range tests {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\texporter := setupTestTracer(t)\n\t\t\tctx := t.Context()\n\n\t\t\t_, span := StartExecuteToolSpan(ctx, tc.startParams)\n\t\t\tTraceToolResult(span, tc.resultParams)\n\t\t\tspan.End()\n\n\t\t\tspans := exporter.GetSpans()\n\t\t\tif len(spans) != 1 {\n\t\t\t\tt.Fatalf(\"expected 1 span, got %d\", len(spans))\n\t\t\t}\n\t\t\tgotSpan := spans[0]\n\n\t\t\tif gotSpan.Name != tc.wantName {\n\t\t\t\tt.Errorf(\"expected span name %q, got %q\", tc.wantName, gotSpan.Name)\n\t\t\t}\n\t\t\tif gotSpan.Status.Code != tc.wantStatus {\n\t\t\t\tt.Errorf(\"expected status %v, got %v\", tc.wantStatus, gotSpan.Status.Code)\n\t\t\t}\n\t\t\tif tc.resultParams.Error != nil {\n\t\t\t\tif gotSpan.Status.Description != tc.resultParams.Error.Error() {\n\t\t\t\t\tt.Errorf(\"expected status description %q, got %q\", tc.resultParams.Error.Error(), gotSpan.Status.Description)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif tc.wantAttrs != nil {\n\t\t\t\tgotAttrs := attributesToMap(gotSpan.Attributes)\n\t\t\t\tfor k, v := range tc.wantAttrs {\n\t\t\t\t\tif gotAttrs[k] != v {\n\t\t\t\t\t\tt.Errorf(\"attribute %q: got %q, want %q\", k, gotAttrs[k], v)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc setupTestTracer(t *testing.T) *tracetest.InMemoryExporter {\n\tt.Helper()\n\texporter := tracetest.NewInMemoryExporter()\n\ttp := sdktrace.NewTracerProvider(\n\t\tsdktrace.WithSyncer(exporter),\n\t)\n\n\toriginalTracer := tracer\n\ttracer = tp.Tracer(\"test\")\n\tt.Cleanup(func() {\n\t\ttracer = originalTracer\n\t})\n\treturn exporter\n}\n\nfunc attributesToMap(attrs []attribute.KeyValue) map[attribute.Key]string {\n\tm := make(map[attribute.Key]string, len(attrs))\n\tfor _, attr := range attrs {\n\t\tm[attr.Key] = attr.Value.Emit()\n\t}\n\treturn m\n}\n"
  },
  {
    "path": "internal/testutil/genai.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage testutil\n\nimport (\n\t\"bytes\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"net/http\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/internal/httprr\"\n)\n\n// NewGeminiTransport returns the genai.ClientConfig configured for record and replay.\nfunc NewGeminiTransport(rrfile string) (http.RoundTripper, error) {\n\trr, err := httprr.Open(rrfile, http.DefaultTransport)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"httprr.Open(%q) failed: %w\", rrfile, err)\n\t}\n\trr.ScrubReq(scrubGeminiRequest)\n\treturn rr, nil\n}\n\nfunc scrubGeminiRequest(req *http.Request) error {\n\tdelete(req.Header, \"x-goog-api-key\")    // genai does not canonicalize\n\treq.Header.Del(\"X-Goog-Api-Key\")        // in case it starts\n\tdelete(req.Header, \"x-goog-api-client\") // contains version numbers\n\treq.Header.Del(\"X-Goog-Api-Client\")\n\tdelete(req.Header, \"user-agent\") // contains google-genai-sdk and gl-go version numbers\n\treq.Header.Del(\"User-Agent\")\n\n\tif ctype := req.Header.Get(\"Content-Type\"); ctype == \"application/json\" || strings.HasPrefix(ctype, \"application/json;\") {\n\t\t// Canonicalize JSON body.\n\t\t// google.golang.org/protobuf/internal/encoding.json\n\t\t// goes out of its way to randomize the JSON encodings\n\t\t// of protobuf messages by adding or not adding spaces\n\t\t// after commas. Derandomize by compacting the JSON.\n\t\tb := req.Body.(*httprr.Body)\n\t\tvar buf bytes.Buffer\n\t\tif err := json.Compact(&buf, b.Data); err == nil {\n\t\t\tb.Data = buf.Bytes()\n\t\t}\n\t}\n\treturn nil\n}\n\n// NewGeminiTestClientConfig returns the genai.ClientConfig configured for record and replay.\nfunc NewGeminiTestClientConfig(t *testing.T, rrfile string) *genai.ClientConfig {\n\tt.Helper()\n\trr, err := NewGeminiTransport(rrfile)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tapiKey := \"\"\n\tif recording, _ := httprr.Recording(rrfile); !recording {\n\t\tapiKey = \"fakekey\"\n\t}\n\treturn &genai.ClientConfig{\n\t\tHTTPClient: &http.Client{Transport: rr},\n\t\tAPIKey:     apiKey,\n\t}\n}\n"
  },
  {
    "path": "internal/testutil/test_agent_runner.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage testutil\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"iter\"\n\t\"testing\"\n\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/agent\"\n\t\"google.golang.org/adk/internal/llminternal\"\n\t\"google.golang.org/adk/model\"\n\t\"google.golang.org/adk/runner\"\n\t\"google.golang.org/adk/session\"\n)\n\ntype TestAgentRunner struct {\n\tagent            agent.Agent\n\tsessionService   session.Service\n\tlastSession      session.Session\n\tinitSessionState map[string]any\n\tappName          string\n\t// TODO: move runner definition to the adk package and it's a part of public api, but the logic to the internal runner\n\trunner *runner.Runner\n}\n\nfunc (r *TestAgentRunner) session(t *testing.T, appName, userID, sessionID string) (session.Session, error) {\n\tctx := t.Context()\n\tif last := r.lastSession; last != nil && last.ID() == sessionID {\n\t\tresp, err := r.sessionService.Get(ctx, &session.GetRequest{\n\t\t\tAppName:   \"test_app\",\n\t\t\tUserID:    \"test_user\",\n\t\t\tSessionID: sessionID,\n\t\t})\n\t\tr.lastSession = resp.Session\n\t\treturn resp.Session, err\n\t}\n\tresp, err := r.sessionService.Create(ctx, &session.CreateRequest{\n\t\tAppName:   \"test_app\",\n\t\tUserID:    \"test_user\",\n\t\tSessionID: sessionID,\n\t\tState:     r.initSessionState,\n\t})\n\tr.lastSession = resp.Session\n\treturn resp.Session, err\n}\n\nfunc (r *TestAgentRunner) SetInitSessionState(state map[string]any) {\n\tr.initSessionState = state\n}\n\nfunc (r *TestAgentRunner) Run(t *testing.T, sessionID, newMessage string) iter.Seq2[*session.Event, error] {\n\tt.Helper()\n\n\tvar content *genai.Content\n\tif newMessage != \"\" {\n\t\tcontent = genai.NewContentFromText(newMessage, genai.RoleUser)\n\t}\n\treturn r.RunContent(t, sessionID, content)\n}\n\nfunc (r *TestAgentRunner) RunContent(t *testing.T, sessionID string, content *genai.Content) iter.Seq2[*session.Event, error] {\n\tt.Helper()\n\treturn r.RunContentWithConfig(t, sessionID, content, agent.RunConfig{})\n}\n\nfunc (r *TestAgentRunner) RunContentWithConfig(t *testing.T, sessionID string, content *genai.Content, cfg agent.RunConfig) iter.Seq2[*session.Event, error] {\n\tt.Helper()\n\tctx := t.Context()\n\n\tuserID := \"test_user\"\n\n\tsession, err := r.session(t, r.appName, userID, sessionID)\n\tif err != nil {\n\t\tt.Fatalf(\"failed to get/create session: %v\", err)\n\t}\n\n\treturn r.runner.Run(ctx, userID, session.ID(), content, cfg)\n}\n\n// NewTestAgentRunner creates a new TestAgentRunner for the given agent as root\n// initSessionState will be used to init all sessions created by this runner.\nfunc NewTestAgentRunner(t *testing.T, agent agent.Agent) *TestAgentRunner {\n\tappName := \"test_app\"\n\tsessionService := session.InMemoryService()\n\n\trunner, err := runner.New(runner.Config{\n\t\tAppName:        appName,\n\t\tAgent:          agent,\n\t\tSessionService: sessionService,\n\t})\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\treturn &TestAgentRunner{\n\t\tagent:          agent,\n\t\tsessionService: sessionService,\n\t\tappName:        appName,\n\t\trunner:         runner,\n\t}\n}\n\n// NewTestAgentRunner creates a new TestAgentRunner for the given agent as root\n// initSessionState will be used to init all sessions created by this runner.\nfunc NewTestAgentRunnerWithPluginManager(t *testing.T, agent agent.Agent, pluginConfig runner.PluginConfig) *TestAgentRunner {\n\tappName := \"test_app\"\n\tsessionService := session.InMemoryService()\n\n\trunner, err := runner.New(runner.Config{\n\t\tAppName:        appName,\n\t\tAgent:          agent,\n\t\tSessionService: sessionService,\n\t\tPluginConfig:   pluginConfig,\n\t})\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\treturn &TestAgentRunner{\n\t\tagent:          agent,\n\t\tsessionService: sessionService,\n\t\tappName:        appName,\n\t\trunner:         runner,\n\t}\n}\n\ntype MockModel struct {\n\tRequests             []*model.LLMRequest\n\tResponses            []*genai.Content\n\tStreamResponsesCount int\n}\n\nvar errNoModelData = errors.New(\"no data\")\n\nfunc (m *MockModel) GenerateContent(ctx context.Context, req *model.LLMRequest, stream bool) iter.Seq2[*model.LLMResponse, error] {\n\tif stream {\n\t\treturn m.GenerateStream(ctx, req)\n\t}\n\treturn func(yield func(*model.LLMResponse, error) bool) {\n\t\tresp, err := m.Generate(ctx, req)\n\t\tyield(resp, err)\n\t}\n}\n\n// GenerateContent implements llm.Model.\nfunc (m *MockModel) Generate(ctx context.Context, req *model.LLMRequest) (*model.LLMResponse, error) {\n\tm.Requests = append(m.Requests, req)\n\tif len(m.Responses) == 0 {\n\t\treturn nil, errNoModelData\n\t}\n\n\tresp := &model.LLMResponse{\n\t\tContent: m.Responses[0],\n\t}\n\n\tm.Responses = m.Responses[1:]\n\n\treturn resp, nil\n}\n\nfunc (m *MockModel) GenerateStream(ctx context.Context, req *model.LLMRequest) iter.Seq2[*model.LLMResponse, error] {\n\taggregator := llminternal.NewStreamingResponseAggregator()\n\treturn func(yield func(*model.LLMResponse, error) bool) {\n\t\tstreamResponsesCount := m.StreamResponsesCount\n\t\tif streamResponsesCount == 0 {\n\t\t\tstreamResponsesCount = 1\n\t\t}\n\t\tfor i := 0; i < streamResponsesCount; i++ {\n\t\t\tif len(m.Responses) == 0 {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tresp := &genai.GenerateContentResponse{Candidates: []*genai.Candidate{{Content: m.Responses[0], FinishReason: genai.FinishReasonStop}}}\n\t\t\tm.Responses = m.Responses[1:]\n\t\t\tfor llmResponse, err := range aggregator.ProcessResponse(ctx, resp) {\n\t\t\t\tif !yield(llmResponse, err) {\n\t\t\t\t\treturn // Consumer stopped\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif closeResult := aggregator.Close(); closeResult != nil {\n\t\t\tyield(closeResult, nil)\n\t\t}\n\t}\n}\n\n// Name implements llm.Model.\nfunc (m *MockModel) Name() string {\n\treturn \"mock\"\n}\n\nvar _ model.LLM = (*MockModel)(nil)\n\n// CollectEvents collects all event from the llm response until encountering an error.\n// It returns all collected events and the last error.\nfunc CollectEvents(stream iter.Seq2[*session.Event, error]) ([]*session.Event, error) {\n\tvar events []*session.Event\n\tfor ev, err := range stream {\n\t\tif err != nil {\n\t\t\treturn events, err\n\t\t}\n\t\tif ev == nil || ev.LLMResponse.Content == nil {\n\t\t\treturn events, fmt.Errorf(\"unexpected empty event: %v\", ev)\n\t\t}\n\t\tevents = append(events, ev)\n\t}\n\treturn events, nil\n}\n\n// CollectParts collects all parts from the llm response until encountering an error.\n// It returns all collected parts and the last error.\nfunc CollectParts(stream iter.Seq2[*session.Event, error]) ([]*genai.Part, error) {\n\tvar parts []*genai.Part\n\tfor ev, err := range stream {\n\t\tif err != nil {\n\t\t\treturn parts, err\n\t\t}\n\t\tif ev == nil || ev.LLMResponse.Content == nil {\n\t\t\treturn parts, fmt.Errorf(\"unexpected empty event: %v\", ev)\n\t\t}\n\t\tparts = append(parts, ev.LLMResponse.Content.Parts...)\n\t}\n\treturn parts, nil\n}\n\n// CollectTextParts collects all text parts from the llm response until encountering an error.\n// It returns all collected text parts and the last error.\nfunc CollectTextParts(stream iter.Seq2[*session.Event, error]) ([]string, error) {\n\tvar texts []string\n\tfor ev, err := range stream {\n\t\tif err != nil {\n\t\t\treturn texts, err\n\t\t}\n\t\tif ev == nil || ev.LLMResponse.Content == nil {\n\t\t\treturn texts, fmt.Errorf(\"unexpected empty event: %v\", ev)\n\t\t}\n\t\tfor _, p := range ev.LLMResponse.Content.Parts {\n\t\t\tif p.Text != \"\" {\n\t\t\t\ttexts = append(texts, p.Text)\n\t\t\t}\n\t\t}\n\t}\n\treturn texts, nil\n}\n"
  },
  {
    "path": "internal/toolinternal/context.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage toolinternal\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/google/uuid\"\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/agent\"\n\t\"google.golang.org/adk/artifact\"\n\tcontextinternal \"google.golang.org/adk/internal/context\"\n\t\"google.golang.org/adk/memory\"\n\t\"google.golang.org/adk/session\"\n\t\"google.golang.org/adk/tool\"\n\t\"google.golang.org/adk/tool/toolconfirmation\"\n)\n\ntype internalArtifacts struct {\n\tagent.Artifacts\n\teventActions *session.EventActions\n}\n\nfunc (ia *internalArtifacts) Save(ctx context.Context, name string, data *genai.Part) (*artifact.SaveResponse, error) {\n\tresp, err := ia.Artifacts.Save(ctx, name, data)\n\tif err != nil {\n\t\treturn resp, err\n\t}\n\tif ia.eventActions != nil {\n\t\tif ia.eventActions.ArtifactDelta == nil {\n\t\t\tia.eventActions.ArtifactDelta = make(map[string]int64)\n\t\t}\n\t\t// TODO: RWLock, check the version stored is newer in case multiple tools save the same file.\n\t\tia.eventActions.ArtifactDelta[name] = resp.Version\n\t}\n\treturn resp, nil\n}\n\nfunc NewToolContext(ctx agent.InvocationContext, functionCallID string, actions *session.EventActions, confirmation *toolconfirmation.ToolConfirmation) tool.Context {\n\tif functionCallID == \"\" {\n\t\tfunctionCallID = uuid.NewString()\n\t}\n\tif actions == nil {\n\t\tactions = &session.EventActions{StateDelta: make(map[string]any)}\n\t}\n\tif actions.StateDelta == nil {\n\t\tactions.StateDelta = make(map[string]any)\n\t}\n\tif actions.ArtifactDelta == nil {\n\t\tactions.ArtifactDelta = make(map[string]int64)\n\t}\n\tcbCtx := contextinternal.NewCallbackContextWithDelta(ctx, actions.StateDelta, actions.ArtifactDelta)\n\n\treturn &toolContext{\n\t\tCallbackContext:   cbCtx,\n\t\tinvocationContext: ctx,\n\t\tfunctionCallID:    functionCallID,\n\t\teventActions:      actions,\n\t\tartifacts: &internalArtifacts{\n\t\t\tArtifacts:    ctx.Artifacts(),\n\t\t\teventActions: actions,\n\t\t},\n\t\ttoolConfirmation: confirmation,\n\t}\n}\n\ntype toolContext struct {\n\tagent.CallbackContext\n\tinvocationContext agent.InvocationContext\n\tfunctionCallID    string\n\teventActions      *session.EventActions\n\tartifacts         *internalArtifacts\n\ttoolConfirmation  *toolconfirmation.ToolConfirmation\n}\n\nfunc (c *toolContext) Artifacts() agent.Artifacts {\n\treturn c.artifacts\n}\n\nfunc (c *toolContext) FunctionCallID() string {\n\treturn c.functionCallID\n}\n\nfunc (c *toolContext) Actions() *session.EventActions {\n\treturn c.eventActions\n}\n\nfunc (c *toolContext) AgentName() string {\n\treturn c.invocationContext.Agent().Name()\n}\n\nfunc (c *toolContext) SearchMemory(ctx context.Context, query string) (*memory.SearchResponse, error) {\n\tif c.invocationContext.Memory() == nil {\n\t\treturn nil, fmt.Errorf(\"memory service is not set\")\n\t}\n\treturn c.invocationContext.Memory().SearchMemory(ctx, query)\n}\n\nfunc (c *toolContext) ToolConfirmation() *toolconfirmation.ToolConfirmation {\n\treturn c.toolConfirmation\n}\n\nfunc (c *toolContext) RequestConfirmation(hint string, payload any) error {\n\tif c.functionCallID == \"\" {\n\t\treturn fmt.Errorf(\"error function call id not set when requesting confirmation for tool\")\n\t}\n\tif c.eventActions.RequestedToolConfirmations == nil {\n\t\tc.eventActions.RequestedToolConfirmations = make(map[string]toolconfirmation.ToolConfirmation)\n\t}\n\tc.eventActions.RequestedToolConfirmations[c.functionCallID] = toolconfirmation.ToolConfirmation{\n\t\tHint:      hint,\n\t\tConfirmed: false,\n\t\tPayload:   payload,\n\t}\n\t// SkipSummarization stops the agent loop after this tool call. Without it,\n\t// the function response event becomes lastEvent and IsFinalResponse() returns\n\t// false (hasFunctionResponses == true), causing the loop to continue.\n\t// This matches the behavior of the built-in RequireConfirmation path in\n\t// functiontool (function.go).\n\tc.eventActions.SkipSummarization = true\n\treturn nil\n}\n"
  },
  {
    "path": "internal/toolinternal/context_test.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage toolinternal\n\nimport (\n\t\"testing\"\n\n\t\"google.golang.org/adk/agent\"\n\tcontextinternal \"google.golang.org/adk/internal/context\"\n\t\"google.golang.org/adk/session\"\n)\n\nfunc TestToolContext(t *testing.T) {\n\tinv := contextinternal.NewInvocationContext(t.Context(), contextinternal.InvocationContextParams{})\n\ttoolCtx := NewToolContext(inv, \"fn1\", &session.EventActions{}, nil)\n\n\tif _, ok := toolCtx.(agent.ReadonlyContext); !ok {\n\t\tt.Errorf(\"ToolContext(%+T) is unexpectedly not a ReadonlyContext\", toolCtx)\n\t}\n\tif _, ok := toolCtx.(agent.CallbackContext); !ok {\n\t\tt.Errorf(\"ToolContext(%+T) is unexpectedly not a CallbackContext\", toolCtx)\n\t}\n}\n\nfunc TestRequestConfirmation_SetsSkipSummarization(t *testing.T) {\n\tinv := contextinternal.NewInvocationContext(t.Context(), contextinternal.InvocationContextParams{})\n\tactions := &session.EventActions{}\n\ttoolCtx := NewToolContext(inv, \"fn1\", actions, nil)\n\n\terr := toolCtx.RequestConfirmation(\"please confirm\", map[string]any{\"key\": \"value\"})\n\tif err != nil {\n\t\tt.Fatalf(\"RequestConfirmation returned unexpected error: %v\", err)\n\t}\n\n\tif !actions.SkipSummarization {\n\t\tt.Error(\"RequestConfirmation did not set SkipSummarization to true\")\n\t}\n\n\tif actions.RequestedToolConfirmations == nil {\n\t\tt.Fatal(\"RequestConfirmation did not set RequestedToolConfirmations\")\n\t}\n\ttc, ok := actions.RequestedToolConfirmations[\"fn1\"]\n\tif !ok {\n\t\tt.Fatal(\"RequestConfirmation did not set confirmation for function call ID 'fn1'\")\n\t}\n\tif tc.Hint != \"please confirm\" {\n\t\tt.Errorf(\"expected hint 'please confirm', got %q\", tc.Hint)\n\t}\n\tif tc.Confirmed {\n\t\tt.Error(\"expected Confirmed to be false\")\n\t}\n}\n\nfunc TestRequestConfirmation_AutoGeneratesIDWhenEmpty(t *testing.T) {\n\tinv := contextinternal.NewInvocationContext(t.Context(), contextinternal.InvocationContextParams{})\n\tactions := &session.EventActions{}\n\t// NewToolContext auto-generates a UUID when functionCallID is empty.\n\ttoolCtx := NewToolContext(inv, \"\", actions, nil)\n\n\terr := toolCtx.RequestConfirmation(\"hint\", nil)\n\tif err != nil {\n\t\tt.Fatalf(\"RequestConfirmation returned unexpected error: %v\", err)\n\t}\n\n\tif !actions.SkipSummarization {\n\t\tt.Error(\"SkipSummarization should be set even with auto-generated function call ID\")\n\t}\n\tif len(actions.RequestedToolConfirmations) != 1 {\n\t\tt.Fatalf(\"expected 1 confirmation entry, got %d\", len(actions.RequestedToolConfirmations))\n\t}\n\tfor _, tc := range actions.RequestedToolConfirmations {\n\t\tif tc.Hint != \"hint\" {\n\t\t\tt.Errorf(\"expected hint 'hint', got %q\", tc.Hint)\n\t\t}\n\t\tif tc.Confirmed {\n\t\t\tt.Error(\"expected Confirmed to be false\")\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "internal/toolinternal/tool.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Package tool defines internal-only interfaces and logic for tools.\npackage toolinternal\n\nimport (\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/model\"\n\t\"google.golang.org/adk/tool\"\n)\n\ntype FunctionTool interface {\n\ttool.Tool\n\tDeclaration() *genai.FunctionDeclaration\n\tRun(ctx tool.Context, args any) (result map[string]any, err error)\n}\n\ntype RequestProcessor interface {\n\tProcessRequest(ctx tool.Context, req *model.LLMRequest) error\n}\n"
  },
  {
    "path": "internal/toolinternal/toolutils/toolutils.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Package tool defines internal-only interfaces and logic for tools.\npackage toolutils\n\nimport (\n\t\"fmt\"\n\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/model\"\n)\n\ntype Tool interface {\n\tName() string\n\tDeclaration() *genai.FunctionDeclaration\n}\n\n// The PackTool ensures that in case there is a usage of multiple function tools,\n// all of them are consolidated into one genai tool that has all the function declarations\n// provided by the tools. So, if there is already a tool with a function declaration,\n// it appends another to it; otherwise, it creates a new genai tool.\nfunc PackTool(req *model.LLMRequest, tool Tool) error {\n\tif req.Tools == nil {\n\t\treq.Tools = make(map[string]any)\n\t}\n\n\tname := tool.Name()\n\n\tif _, ok := req.Tools[name]; ok {\n\t\treturn fmt.Errorf(\"duplicate tool: %q\", name)\n\t}\n\treq.Tools[name] = tool\n\n\tif req.Config == nil {\n\t\treq.Config = &genai.GenerateContentConfig{}\n\t}\n\tif decl := tool.Declaration(); decl == nil {\n\t\treturn nil\n\t}\n\t// Find an existing genai.Tool with FunctionDeclarations\n\tvar funcTool *genai.Tool\n\tfor _, tool := range req.Config.Tools {\n\t\tif tool != nil && tool.FunctionDeclarations != nil {\n\t\t\tfuncTool = tool\n\t\t\tbreak\n\t\t}\n\t}\n\tif funcTool == nil {\n\t\treq.Config.Tools = append(req.Config.Tools, &genai.Tool{\n\t\t\tFunctionDeclarations: []*genai.FunctionDeclaration{tool.Declaration()},\n\t\t})\n\t} else {\n\t\tfuncTool.FunctionDeclarations = append(funcTool.FunctionDeclarations, tool.Declaration())\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "internal/typeutil/convert.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Package typeutil is a collection of type handling utility functions.\npackage typeutil\n\nimport (\n\t\"encoding/json\"\n\n\t\"github.com/google/jsonschema-go/jsonschema\"\n)\n\n// ConvertToWithJSONSchema converts the given value to another type using json marshal/unmarshal.\n// If non-nil resolvedSchema is provided, validation against the resolvedSchema will run\n// during the conversion.\nfunc ConvertToWithJSONSchema[From, To any](v From, resolvedSchema *jsonschema.Resolved) (To, error) {\n\tvar zero To\n\trawArgs, err := json.Marshal(v)\n\tif err != nil {\n\t\treturn zero, err\n\t}\n\tif resolvedSchema != nil {\n\t\t// See https://github.com/google/jsonschema-go/issues/23: in order to\n\t\t// validate, we must validate against a map[string]any. Struct validation\n\t\t// does not work as it cannot account for `omitempty` or custom marshalling.\n\t\tvar m map[string]any\n\t\tif err := json.Unmarshal(rawArgs, &m); err != nil {\n\t\t\treturn zero, err\n\t\t}\n\t\tif err := resolvedSchema.Validate(m); err != nil {\n\t\t\treturn zero, err\n\t\t}\n\t}\n\tvar typed To\n\tif err := json.Unmarshal(rawArgs, &typed); err != nil {\n\t\treturn zero, err\n\t}\n\treturn typed, nil\n}\n"
  },
  {
    "path": "internal/utils/schema_test.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage utils\n\nimport (\n\t\"reflect\"\n\t\"testing\"\n\n\t\"google.golang.org/genai\"\n)\n\nfunc TestMatchType(t *testing.T) {\n\ttests := []struct {\n\t\tname      string\n\t\tvalue     any\n\t\tschema    *genai.Schema\n\t\tisInput   bool\n\t\twantMatch bool\n\t\twantErr   bool\n\t}{\n\t\t{\n\t\t\tname:      \"nil schema\",\n\t\t\tvalue:     \"test\",\n\t\t\tschema:    nil,\n\t\t\tisInput:   true,\n\t\t\twantMatch: false,\n\t\t\twantErr:   true,\n\t\t},\n\t\t{\n\t\t\tname:      \"nil value\",\n\t\t\tvalue:     nil,\n\t\t\tschema:    &genai.Schema{Type: genai.TypeString},\n\t\t\tisInput:   true,\n\t\t\twantMatch: false,\n\t\t\twantErr:   false,\n\t\t},\n\t\t{\n\t\t\tname:      \"string match\",\n\t\t\tvalue:     \"test\",\n\t\t\tschema:    &genai.Schema{Type: genai.TypeString},\n\t\t\tisInput:   true,\n\t\t\twantMatch: true,\n\t\t\twantErr:   false,\n\t\t},\n\t\t{\n\t\t\tname:      \"string mismatch\",\n\t\t\tvalue:     123.0,\n\t\t\tschema:    &genai.Schema{Type: genai.TypeString},\n\t\t\tisInput:   true,\n\t\t\twantMatch: false,\n\t\t\twantErr:   false,\n\t\t},\n\t\t{\n\t\t\tname:      \"integer match\",\n\t\t\tvalue:     123.0,\n\t\t\tschema:    &genai.Schema{Type: genai.TypeInteger},\n\t\t\tisInput:   true,\n\t\t\twantMatch: true,\n\t\t\twantErr:   false,\n\t\t},\n\t\t{\n\t\t\tname:      \"integer mismatch float\",\n\t\t\tvalue:     123.45,\n\t\t\tschema:    &genai.Schema{Type: genai.TypeInteger},\n\t\t\tisInput:   true,\n\t\t\twantMatch: false,\n\t\t\twantErr:   false,\n\t\t},\n\t\t{\n\t\t\tname:      \"integer mismatch type\",\n\t\t\tvalue:     \"123\",\n\t\t\tschema:    &genai.Schema{Type: genai.TypeInteger},\n\t\t\tisInput:   true,\n\t\t\twantMatch: false,\n\t\t\twantErr:   false,\n\t\t},\n\t\t{\n\t\t\tname:      \"number match\",\n\t\t\tvalue:     123.45,\n\t\t\tschema:    &genai.Schema{Type: genai.TypeNumber},\n\t\t\tisInput:   true,\n\t\t\twantMatch: true,\n\t\t\twantErr:   false,\n\t\t},\n\t\t{\n\t\t\tname:      \"number mismatch\",\n\t\t\tvalue:     \"123.45\",\n\t\t\tschema:    &genai.Schema{Type: genai.TypeNumber},\n\t\t\tisInput:   true,\n\t\t\twantMatch: false,\n\t\t\twantErr:   false,\n\t\t},\n\t\t{\n\t\t\tname:      \"boolean match\",\n\t\t\tvalue:     true,\n\t\t\tschema:    &genai.Schema{Type: genai.TypeBoolean},\n\t\t\tisInput:   true,\n\t\t\twantMatch: true,\n\t\t\twantErr:   false,\n\t\t},\n\t\t{\n\t\t\tname:      \"boolean mismatch\",\n\t\t\tvalue:     \"true\",\n\t\t\tschema:    &genai.Schema{Type: genai.TypeBoolean},\n\t\t\tisInput:   true,\n\t\t\twantMatch: false,\n\t\t\twantErr:   false,\n\t\t},\n\t\t{\n\t\t\tname:      \"array match\",\n\t\t\tvalue:     []any{\"a\", \"b\"},\n\t\t\tschema:    &genai.Schema{Type: genai.TypeArray, Items: &genai.Schema{Type: genai.TypeString}},\n\t\t\tisInput:   true,\n\t\t\twantMatch: true,\n\t\t\twantErr:   false,\n\t\t},\n\t\t{\n\t\t\tname:      \"array mismatch type\",\n\t\t\tvalue:     \"not an array\",\n\t\t\tschema:    &genai.Schema{Type: genai.TypeArray, Items: &genai.Schema{Type: genai.TypeString}},\n\t\t\tisInput:   true,\n\t\t\twantMatch: false,\n\t\t\twantErr:   false,\n\t\t},\n\t\t{\n\t\t\tname:      \"array mismatch item type\",\n\t\t\tvalue:     []any{\"a\", 1.0},\n\t\t\tschema:    &genai.Schema{Type: genai.TypeArray, Items: &genai.Schema{Type: genai.TypeString}},\n\t\t\tisInput:   true,\n\t\t\twantMatch: false,\n\t\t\twantErr:   false,\n\t\t},\n\t\t{\n\t\t\tname:      \"array missing items\",\n\t\t\tvalue:     []any{\"a\", \"b\"},\n\t\t\tschema:    &genai.Schema{Type: genai.TypeArray},\n\t\t\tisInput:   true,\n\t\t\twantMatch: false,\n\t\t\twantErr:   true,\n\t\t},\n\t\t{\n\t\t\tname:      \"object match\",\n\t\t\tvalue:     map[string]any{\"foo\": \"bar\"},\n\t\t\tschema:    &genai.Schema{Type: genai.TypeObject, Properties: map[string]*genai.Schema{\"foo\": {Type: genai.TypeString}}},\n\t\t\tisInput:   true,\n\t\t\twantMatch: true,\n\t\t\twantErr:   false,\n\t\t},\n\t\t{\n\t\t\tname:      \"object mismatch type\",\n\t\t\tvalue:     \"not an object\",\n\t\t\tschema:    &genai.Schema{Type: genai.TypeObject, Properties: map[string]*genai.Schema{\"foo\": {Type: genai.TypeString}}},\n\t\t\tisInput:   true,\n\t\t\twantMatch: false,\n\t\t\twantErr:   false,\n\t\t},\n\t\t{\n\t\t\tname:      \"object mismatch property type\",\n\t\t\tvalue:     map[string]any{\"foo\": 123.0},\n\t\t\tschema:    &genai.Schema{Type: genai.TypeObject, Properties: map[string]*genai.Schema{\"foo\": {Type: genai.TypeString}}},\n\t\t\tisInput:   true,\n\t\t\twantMatch: false,\n\t\t\twantErr:   true, // This will fail ValidateMapOnSchema, which returns error\n\t\t},\n\t\t{\n\t\t\tname:      \"unsupported type\",\n\t\t\tvalue:     123,\n\t\t\tschema:    &genai.Schema{Type: \"UNSUPPORTED\"},\n\t\t\tisInput:   true,\n\t\t\twantMatch: false,\n\t\t\twantErr:   true,\n\t\t},\n\t\t{\n\t\t\tname:      \"lowercase type in schema\",\n\t\t\tvalue:     \"test\",\n\t\t\tschema:    &genai.Schema{Type: \"string\"},\n\t\t\tisInput:   true,\n\t\t\twantMatch: true,\n\t\t\twantErr:   false,\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tgotMatch, err := matchType(tt.value, tt.schema, tt.isInput)\n\t\t\tif (err != nil) != tt.wantErr {\n\t\t\t\tt.Errorf(\"matchType() error = %v, wantErr %v\", err, tt.wantErr)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif gotMatch != tt.wantMatch {\n\t\t\t\tt.Errorf(\"matchType() = %v, want %v\", gotMatch, tt.wantMatch)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestValidateMapOnSchema(t *testing.T) {\n\tschema := &genai.Schema{\n\t\tType: genai.TypeObject,\n\t\tProperties: map[string]*genai.Schema{\n\t\t\t\"str_field\": {Type: genai.TypeString},\n\t\t\t\"int_field\": {Type: genai.TypeInteger},\n\t\t},\n\t\tRequired: []string{\"str_field\"},\n\t}\n\tschemaNilProps := &genai.Schema{\n\t\tType: genai.TypeObject,\n\t}\n\n\ttests := []struct {\n\t\tname    string\n\t\targs    map[string]any\n\t\tschema  *genai.Schema\n\t\tisInput bool\n\t\twantErr bool\n\t}{\n\t\t{\n\t\t\tname:    \"valid map\",\n\t\t\targs:    map[string]any{\"str_field\": \"hello\", \"int_field\": 123.0},\n\t\t\tschema:  schema,\n\t\t\tisInput: true,\n\t\t\twantErr: false,\n\t\t},\n\t\t{\n\t\t\tname:    \"valid map with only required fields\",\n\t\t\targs:    map[string]any{\"str_field\": \"hello\"},\n\t\t\tschema:  schema,\n\t\t\tisInput: true,\n\t\t\twantErr: false,\n\t\t},\n\t\t{\n\t\t\tname:    \"missing required field\",\n\t\t\targs:    map[string]any{\"int_field\": 123.0},\n\t\t\tschema:  schema,\n\t\t\tisInput: true,\n\t\t\twantErr: true,\n\t\t},\n\t\t{\n\t\t\tname:    \"extra field\",\n\t\t\targs:    map[string]any{\"str_field\": \"hello\", \"extra\": \"field\"},\n\t\t\tschema:  schema,\n\t\t\tisInput: true,\n\t\t\twantErr: true,\n\t\t},\n\t\t{\n\t\t\tname:    \"type mismatch\",\n\t\t\targs:    map[string]any{\"str_field\": 123.0},\n\t\t\tschema:  schema,\n\t\t\tisInput: true,\n\t\t\twantErr: true,\n\t\t},\n\t\t{\n\t\t\tname:    \"nil schema\",\n\t\t\targs:    map[string]any{\"str_field\": \"hello\"},\n\t\t\tschema:  nil,\n\t\t\tisInput: true,\n\t\t\twantErr: true,\n\t\t},\n\t\t{\n\t\t\tname:    \"nil properties and no args\",\n\t\t\targs:    map[string]any{},\n\t\t\tschema:  schemaNilProps,\n\t\t\tisInput: true,\n\t\t\twantErr: false,\n\t\t},\n\t\t{\n\t\t\tname:    \"nil properties and some args\",\n\t\t\targs:    map[string]any{\"some\": \"arg\"},\n\t\t\tschema:  schemaNilProps,\n\t\t\tisInput: true,\n\t\t\twantErr: true,\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tif err := ValidateMapOnSchema(tt.args, tt.schema, tt.isInput); (err != nil) != tt.wantErr {\n\t\t\t\tt.Errorf(\"ValidateMapOnSchema() error = %v, wantErr %v\", err, tt.wantErr)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestValidateOutputSchema(t *testing.T) {\n\tschema := &genai.Schema{\n\t\tType: genai.TypeObject,\n\t\tProperties: map[string]*genai.Schema{\n\t\t\t\"result\": {Type: genai.TypeString},\n\t\t},\n\t\tRequired: []string{\"result\"},\n\t}\n\n\ttests := []struct {\n\t\tname       string\n\t\toutput     string\n\t\tschema     *genai.Schema\n\t\twantOutput map[string]any\n\t\twantErr    bool\n\t}{\n\t\t{\n\t\t\tname:       \"valid output\",\n\t\t\toutput:     `{\"result\": \"success\"}`,\n\t\t\tschema:     schema,\n\t\t\twantOutput: map[string]any{\"result\": \"success\"},\n\t\t\twantErr:    false,\n\t\t},\n\t\t{\n\t\t\tname:       \"invalid json\",\n\t\t\toutput:     `{\"result\": \"success\"`,\n\t\t\tschema:     schema,\n\t\t\twantOutput: nil,\n\t\t\twantErr:    true,\n\t\t},\n\t\t{\n\t\t\tname:       \"schema mismatch\",\n\t\t\toutput:     `{\"wrong_key\": \"failure\"}`,\n\t\t\tschema:     schema,\n\t\t\twantOutput: nil,\n\t\t\twantErr:    true,\n\t\t},\n\t\t{\n\t\t\tname:       \"nil schema\",\n\t\t\toutput:     `{\"result\": \"success\"}`,\n\t\t\tschema:     nil,\n\t\t\twantOutput: nil,\n\t\t\twantErr:    true,\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tgotOutput, err := ValidateOutputSchema(tt.output, tt.schema)\n\t\t\tif (err != nil) != tt.wantErr {\n\t\t\t\tt.Errorf(\"ValidateOutputSchema() error = %v, wantErr %v\", err, tt.wantErr)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif !tt.wantErr && !reflect.DeepEqual(gotOutput, tt.wantOutput) {\n\t\t\t\tt.Errorf(\"ValidateOutputSchema() = %v, want %v\", gotOutput, tt.wantOutput)\n\t\t\t}\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "internal/utils/schema_utils.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage utils\n\nimport (\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"math\"\n\t\"reflect\"\n\t\"strings\"\n\n\t\"google.golang.org/genai\"\n)\n\n// matchType checks if the value matches the schema type.\nfunc matchType(value any, schema *genai.Schema, isInput bool) (bool, error) {\n\tif schema == nil {\n\t\treturn false, fmt.Errorf(\"schema is nil\")\n\t}\n\n\tif value == nil {\n\t\treturn false, nil\n\t}\n\n\t// Convert type to upper case to match the type in the schema.\n\tswitch genai.Type(strings.ToUpper(string(schema.Type))) {\n\tcase genai.TypeString:\n\t\t_, ok := value.(string)\n\t\treturn ok, nil\n\tcase genai.TypeInteger:\n\t\tf, ok := value.(float64)\n\t\tif !ok {\n\t\t\treturn false, nil\n\t\t}\n\t\treturn f == math.Trunc(f), nil\n\tcase genai.TypeBoolean:\n\t\t_, ok := value.(bool)\n\t\treturn ok, nil\n\tcase genai.TypeNumber:\n\t\t_, ok := value.(float64)\n\t\treturn ok, nil\n\tcase genai.TypeArray:\n\t\tval := reflect.ValueOf(value)\n\t\tif val.Kind() != reflect.Slice {\n\t\t\treturn false, nil\n\t\t}\n\t\tif schema.Items == nil {\n\t\t\treturn false, fmt.Errorf(\"array schema missing items definition\")\n\t\t}\n\t\tfor i := 0; i < val.Len(); i++ {\n\t\t\tok, err := matchType(val.Index(i).Interface(), schema.Items, isInput)\n\t\t\tif err != nil {\n\t\t\t\treturn false, fmt.Errorf(\"array item %d: %w\", i, err)\n\t\t\t}\n\t\t\tif !ok {\n\t\t\t\treturn false, nil\n\t\t\t}\n\t\t}\n\t\treturn true, nil\n\tcase genai.TypeObject:\n\t\tobj, ok := value.(map[string]any)\n\t\tif !ok {\n\t\t\treturn false, nil\n\t\t}\n\t\terr := ValidateMapOnSchema(obj, schema, isInput)\n\t\treturn err == nil, err\n\tdefault:\n\t\treturn false, fmt.Errorf(\"unsupported type: %s\", schema.Type)\n\t}\n}\n\n// ValidateMapOnSchema validates a map against a schema.\nfunc ValidateMapOnSchema(args map[string]any, schema *genai.Schema, isInput bool) error {\n\tif schema == nil {\n\t\treturn fmt.Errorf(\"schema cannot be nil\")\n\t}\n\n\tproperties := schema.Properties\n\tif properties == nil {\n\t\tproperties = make(map[string]*genai.Schema)\n\t}\n\n\targType := \"input\"\n\tif !isInput {\n\t\targType = \"output\"\n\t}\n\n\tfor key, value := range args {\n\t\tpropSchema, exists := properties[key]\n\t\tif !exists {\n\t\t\t// Note: OpenAPI schemas can allow additional properties. This implementation assumes strictness.\n\t\t\treturn fmt.Errorf(\"%s arg: '%q' does not exist in schema properties\", argType, key)\n\t\t}\n\t\tok, err := matchType(value, propSchema, isInput)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"%s arg: '%q' validation failed: %w\", argType, key, err)\n\t\t}\n\t\tif !ok {\n\t\t\treturn fmt.Errorf(\"%s arg: '%q' type mismatch, expected schema type %s, got value %v of type %T\", argType, key, propSchema.Type, value, value)\n\t\t}\n\t}\n\n\tfor _, requiredKey := range schema.Required {\n\t\tif _, exists := args[requiredKey]; !exists {\n\t\t\treturn fmt.Errorf(\"%q args does not contain required key: '%q'\", argType, requiredKey)\n\t\t}\n\t}\n\treturn nil\n}\n\n// ValidateOutputSchema validates an output JSON string against a schema.\nfunc ValidateOutputSchema(output string, schema *genai.Schema) (map[string]any, error) {\n\tif schema == nil {\n\t\treturn nil, fmt.Errorf(\"schema cannot be nil\")\n\t}\n\tvar outputMap map[string]any\n\terr := json.Unmarshal([]byte(output), &outputMap)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to parse output JSON: %w\", err)\n\t}\n\n\tif err := ValidateMapOnSchema(outputMap, schema, false); err != nil { // isInput = false\n\t\treturn nil, err\n\t}\n\treturn outputMap, nil\n}\n"
  },
  {
    "path": "internal/utils/utils.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage utils\n\nimport (\n\t\"strings\"\n\n\t\"github.com/google/uuid\"\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/agent\"\n\t\"google.golang.org/adk/model\"\n\t\"google.golang.org/adk/session\"\n)\n\n// TODO: split in proper files/packages.\n\nconst afFunctionCallIDPrefix = \"adk-\"\n\n// PopulateClientFunctionCallID sets the function call ID field if it is empty.\n// Since the ID field is optional, some models don't fill the field, but\n// the LLMAgent depends on the IDs to map FunctionCall and FunctionResponse events\n// in the event stream.\nfunc PopulateClientFunctionCallID(c *genai.Content) {\n\tfor _, fn := range FunctionCalls(c) {\n\t\tif fn.ID == \"\" {\n\t\t\tfn.ID = GenerateFunctionCallID()\n\t\t}\n\t}\n}\n\n// GenerateFunctionCallID generates a new function call ID.\nfunc GenerateFunctionCallID() string {\n\treturn afFunctionCallIDPrefix + uuid.NewString()\n}\n\n// RemoveClientFunctionCallID removes the function call ID field that was set\n// by populateClientFunctionCallID. This is necessary when FunctionCall or\n// FunctionResponse are sent back to the model.\nfunc RemoveClientFunctionCallID(c *genai.Content) {\n\tfor _, fn := range FunctionCalls(c) {\n\t\tif strings.HasPrefix(fn.ID, afFunctionCallIDPrefix) {\n\t\t\tfn.ID = \"\"\n\t\t}\n\t}\n\tfor _, fn := range FunctionResponses(c) {\n\t\tif strings.HasPrefix(fn.ID, afFunctionCallIDPrefix) {\n\t\t\tfn.ID = \"\"\n\t\t}\n\t}\n}\n\n// Content is a convenience function that returns the genai.Content\n// in the event.\nfunc Content(ev *session.Event) *genai.Content {\n\tif ev == nil {\n\t\treturn nil\n\t}\n\treturn ev.LLMResponse.Content\n}\n\n// Belows are useful utilities that help working with genai.Content\n// included in types.Event.\n// TODO: Use generics.\n// FunctionCalls extracts all FunctionCall parts from the content.\nfunc FunctionCalls(c *genai.Content) (ret []*genai.FunctionCall) {\n\tif c == nil {\n\t\treturn nil\n\t}\n\tfor _, p := range c.Parts {\n\t\tif p.FunctionCall != nil {\n\t\t\tret = append(ret, p.FunctionCall)\n\t\t}\n\t}\n\treturn ret\n}\n\n// FunctionResponses extracts all FunctionResponse parts from the content.\nfunc FunctionResponses(c *genai.Content) (ret []*genai.FunctionResponse) {\n\tif c == nil {\n\t\treturn nil\n\t}\n\tfor _, p := range c.Parts {\n\t\tif p.FunctionResponse != nil {\n\t\t\tret = append(ret, p.FunctionResponse)\n\t\t}\n\t}\n\treturn ret\n}\n\n// TextParts extracts all Text parts from the content.\nfunc TextParts(c *genai.Content) (ret []string) {\n\tif c == nil {\n\t\treturn nil\n\t}\n\tfor _, p := range c.Parts {\n\t\tif p.Text != \"\" {\n\t\t\tret = append(ret, p.Text)\n\t\t}\n\t}\n\treturn ret\n}\n\n// FunctionDecls extracts all Function declarations from the GenerateContentConfig.\nfunc FunctionDecls(c *genai.GenerateContentConfig) (ret []*genai.FunctionDeclaration) {\n\tif c == nil {\n\t\treturn nil\n\t}\n\tfor _, t := range c.Tools {\n\t\tret = append(ret, t.FunctionDeclarations...)\n\t}\n\treturn ret\n}\n\nfunc Must[T agent.Agent](a T, err error) T {\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn a\n}\n\n// AppendInstructions appends instructions to the [genai.GenerateContentConfig.SystemInstruction] system instruction.\nfunc AppendInstructions(r *model.LLMRequest, instructions ...string) {\n\tif len(instructions) == 0 {\n\t\treturn\n\t}\n\n\tinst := strings.Join(instructions, \"\\n\\n\")\n\n\tif r.Config == nil {\n\t\tr.Config = &genai.GenerateContentConfig{}\n\t}\n\n\tif r.Config.SystemInstruction == nil {\n\t\tr.Config.SystemInstruction = genai.NewContentFromText(inst, genai.RoleUser)\n\t\treturn\n\t}\n\tif len(r.Config.SystemInstruction.Parts) > 0 && r.Config.SystemInstruction.Parts[len(r.Config.SystemInstruction.Parts)-1].Text != \"\" {\n\t\tr.Config.SystemInstruction.Parts[len(r.Config.SystemInstruction.Parts)-1].Text += \"\\n\\n\" + inst\n\t\treturn\n\t}\n\tr.Config.SystemInstruction.Parts = append(r.Config.SystemInstruction.Parts, genai.NewPartFromText(inst))\n}\n"
  },
  {
    "path": "internal/utils/utils_test.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage utils_test\n\nimport \"testing\"\n\nfunc TestNothing(t *testing.T) {\n\t// To make it buildable.\n}\n"
  },
  {
    "path": "internal/version/version.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage version\n\n// Version exposes the current ADK Go version, used for llm request tagging\nconst Version = \"0.6.0\"\n"
  },
  {
    "path": "memory/inmemory.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage memory\n\nimport (\n\t\"context\"\n\t\"maps\"\n\t\"strings\"\n\t\"sync\"\n\t\"time\"\n\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/session\"\n)\n\n// InMemoryService returns a new in-memory implementation of the memory service. Thread-safe.\nfunc InMemoryService() Service {\n\treturn &inMemoryService{\n\t\tstore: make(map[key]map[sessionID][]value),\n\t}\n}\n\ntype key struct {\n\tappName, userID string\n}\n\ntype sessionID string\n\ntype value struct {\n\tid             string\n\tcontent        *genai.Content\n\tauthor         string\n\ttimestamp      time.Time\n\tcustomMetadata map[string]any\n\n\t// precomputed set of words in the content for simple keyword matching.\n\twords map[string]struct{}\n}\n\n// inMemoryService is an in-memory implementation of Service.\ntype inMemoryService struct {\n\tmu    sync.RWMutex\n\tstore map[key]map[sessionID][]value\n}\n\nfunc (s *inMemoryService) AddSessionToMemory(ctx context.Context, curSession session.Session) error {\n\tvar values []value\n\n\tfor event := range curSession.Events().All() {\n\t\tif event.LLMResponse.Content == nil {\n\t\t\tcontinue\n\t\t}\n\n\t\twords := make(map[string]struct{})\n\t\tfor _, part := range event.LLMResponse.Content.Parts {\n\t\t\tif part.Text == \"\" {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tmaps.Copy(words, extractWords(part.Text))\n\t\t}\n\n\t\tif len(words) == 0 {\n\t\t\tcontinue\n\t\t}\n\n\t\tvalues = append(values, value{\n\t\t\tid:             event.ID,\n\t\t\tcontent:        event.LLMResponse.Content,\n\t\t\tauthor:         event.Author,\n\t\t\ttimestamp:      event.Timestamp,\n\t\t\tcustomMetadata: event.CustomMetadata,\n\t\t\twords:          words,\n\t\t})\n\t}\n\n\tk := key{\n\t\tappName: curSession.AppName(),\n\t\tuserID:  curSession.UserID(),\n\t}\n\n\ts.mu.Lock()\n\tdefer s.mu.Unlock()\n\n\tv, ok := s.store[k]\n\tif !ok {\n\t\tv = map[sessionID][]value{}\n\t\ts.store[k] = v\n\t}\n\n\tsid := sessionID(curSession.ID())\n\tv[sid] = values\n\treturn nil\n}\n\nfunc (s *inMemoryService) SearchMemory(ctx context.Context, req *SearchRequest) (*SearchResponse, error) {\n\tqueryWords := extractWords(req.Query)\n\n\tk := key{\n\t\tappName: req.AppName,\n\t\tuserID:  req.UserID,\n\t}\n\n\ts.mu.RLock()\n\tvalues, ok := s.store[k]\n\ts.mu.RUnlock()\n\tif !ok {\n\t\treturn &SearchResponse{}, nil\n\t}\n\n\tres := &SearchResponse{}\n\n\tfor _, events := range values {\n\t\tfor _, e := range events {\n\t\t\tif checkMapsIntersect(e.words, queryWords) {\n\t\t\t\tres.Memories = append(res.Memories, Entry{\n\t\t\t\t\tID:             e.id,\n\t\t\t\t\tContent:        e.content,\n\t\t\t\t\tAuthor:         e.author,\n\t\t\t\t\tTimestamp:      e.timestamp,\n\t\t\t\t\tCustomMetadata: e.customMetadata,\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t}\n\n\treturn res, nil\n}\n\nfunc checkMapsIntersect(m1, m2 map[string]struct{}) bool {\n\tif len(m1) == 0 || len(m2) == 0 {\n\t\treturn false\n\t}\n\n\t// Iterate over the smaller map.\n\tif len(m1) > len(m2) {\n\t\tm1, m2 = m2, m1\n\t}\n\n\tfor k := range m1 {\n\t\tif _, ok := m2[k]; ok {\n\t\t\treturn true\n\t\t}\n\t}\n\n\treturn false\n}\n\nfunc extractWords(text string) map[string]struct{} {\n\tres := make(map[string]struct{})\n\n\tfor s := range strings.SplitSeq(text, \" \") {\n\t\tif s == \"\" {\n\t\t\tcontinue\n\t\t}\n\t\tres[strings.ToLower(s)] = struct{}{}\n\t}\n\n\treturn res\n}\n"
  },
  {
    "path": "memory/inmemory_test.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage memory_test\n\nimport (\n\t\"iter\"\n\t\"slices\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/google/go-cmp/cmp\"\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/memory\"\n\t\"google.golang.org/adk/model\"\n\t\"google.golang.org/adk/session\"\n)\n\nfunc Test_inMemoryService_SearchMemory(t *testing.T) {\n\ttests := []struct {\n\t\tname         string\n\t\tinitSessions []session.Session\n\t\treq          *memory.SearchRequest\n\t\twantResp     *memory.SearchResponse\n\t\twantErr      bool\n\t}{\n\t\t{\n\t\t\tname: \"find events\",\n\t\t\tinitSessions: []session.Session{\n\t\t\t\tmakeSession(t, \"app1\", \"user1\", \"sess1\", []*session.Event{\n\t\t\t\t\t{\n\t\t\t\t\t\tID:     \"event1\",\n\t\t\t\t\t\tAuthor: \"user1\",\n\t\t\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\t\t\tContent:        genai.NewContentFromText(\"The Quick brown fox\", genai.RoleUser),\n\t\t\t\t\t\t\tCustomMetadata: map[string]any{\"key\": \"value\"},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tTimestamp: must(time.Parse(time.RFC3339, \"2023-10-01T10:00:00Z\")),\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\t\t\tContent: genai.NewContentFromText(\"jumps over the lazy dog\", genai.RoleModel),\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t\tmakeSession(t, \"app1\", \"user1\", \"sess2\", []*session.Event{\n\t\t\t\t\t{\n\t\t\t\t\t\tAuthor:      \"test-bot\",\n\t\t\t\t\t\tLLMResponse: model.LLMResponse{Content: genai.NewContentFromText(\"hello world\", genai.RoleModel)},\n\t\t\t\t\t\tTimestamp:   must(time.Parse(time.RFC3339, \"2023-10-02T10:00:00Z\")),\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t\tmakeSession(t, \"app1\", \"user1\", \"sess3\", []*session.Event{\n\t\t\t\t\t{LLMResponse: model.LLMResponse{Content: genai.NewContentFromText(\"test text\", genai.RoleUser)}},\n\t\t\t\t}),\n\t\t\t},\n\t\t\treq: &memory.SearchRequest{\n\t\t\t\tAppName: \"app1\",\n\t\t\t\tUserID:  \"user1\",\n\t\t\t\tQuery:   \"quick hello\",\n\t\t\t},\n\t\t\twantResp: &memory.SearchResponse{\n\t\t\t\tMemories: []memory.Entry{\n\t\t\t\t\t{\n\t\t\t\t\t\tID:             \"event1\",\n\t\t\t\t\t\tContent:        genai.NewContentFromText(\"The Quick brown fox\", genai.RoleUser),\n\t\t\t\t\t\tAuthor:         \"user1\",\n\t\t\t\t\t\tTimestamp:      must(time.Parse(time.RFC3339, \"2023-10-01T10:00:00Z\")),\n\t\t\t\t\t\tCustomMetadata: map[string]any{\"key\": \"value\"},\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tContent:   genai.NewContentFromText(\"hello world\", genai.RoleModel),\n\t\t\t\t\t\tAuthor:    \"test-bot\",\n\t\t\t\t\t\tTimestamp: must(time.Parse(time.RFC3339, \"2023-10-02T10:00:00Z\")),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"no leakage for different appName\",\n\t\t\tinitSessions: []session.Session{\n\t\t\t\tmakeSession(t, \"app1\", \"user1\", \"sess3\", []*session.Event{\n\t\t\t\t\t{LLMResponse: model.LLMResponse{Content: genai.NewContentFromText(\"test text\", genai.RoleUser)}},\n\t\t\t\t}),\n\t\t\t},\n\t\t\treq: &memory.SearchRequest{\n\t\t\t\tAppName: \"other_app\",\n\t\t\t\tUserID:  \"user1\",\n\t\t\t\tQuery:   \"test text\",\n\t\t\t},\n\t\t\twantResp: &memory.SearchResponse{},\n\t\t},\n\t\t{\n\t\t\tname: \"no leakage for different user\",\n\t\t\tinitSessions: []session.Session{\n\t\t\t\tmakeSession(t, \"app1\", \"user1\", \"sess3\", []*session.Event{\n\t\t\t\t\t{LLMResponse: model.LLMResponse{Content: genai.NewContentFromText(\"test text\", genai.RoleUser)}},\n\t\t\t\t}),\n\t\t\t},\n\t\t\treq: &memory.SearchRequest{\n\t\t\t\tAppName: \"app1\",\n\t\t\t\tUserID:  \"test_user\",\n\t\t\t\tQuery:   \"test text\",\n\t\t\t},\n\t\t\twantResp: &memory.SearchResponse{},\n\t\t},\n\t\t{\n\t\t\tname: \"no matches\",\n\t\t\tinitSessions: []session.Session{\n\t\t\t\tmakeSession(t, \"app1\", \"user1\", \"sess3\", []*session.Event{\n\t\t\t\t\t{LLMResponse: model.LLMResponse{Content: genai.NewContentFromText(\"test text\", genai.RoleUser)}},\n\t\t\t\t}),\n\t\t\t},\n\t\t\treq: &memory.SearchRequest{\n\t\t\t\tAppName: \"app1\",\n\t\t\t\tUserID:  \"test_user\",\n\t\t\t\tQuery:   \"something different\",\n\t\t\t},\n\t\t\twantResp: &memory.SearchResponse{},\n\t\t},\n\t\t{\n\t\t\tname: \"lookup on empty store\",\n\t\t\treq: &memory.SearchRequest{\n\t\t\t\tAppName: \"app1\",\n\t\t\t\tUserID:  \"test_user\",\n\t\t\t\tQuery:   \"something different\",\n\t\t\t},\n\t\t\twantResp: &memory.SearchResponse{},\n\t\t},\n\t}\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\ts := memory.InMemoryService()\n\n\t\t\tfor _, session := range tt.initSessions {\n\t\t\t\tif err := s.AddSessionToMemory(t.Context(), session); err != nil {\n\t\t\t\t\tt.Fatalf(\"inMemoryService.AddSessionToMemory() error = %v\", err)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tgot, err := s.SearchMemory(t.Context(), tt.req)\n\t\t\tif (err != nil) != tt.wantErr {\n\t\t\t\tt.Fatalf(\"inMemoryService.SearchMemory() error = %v, wantErr %v\", err, tt.wantErr)\n\t\t\t}\n\t\t\tif diff := cmp.Diff(tt.wantResp, got, sortMemories); diff != \"\" {\n\t\t\t\tt.Errorf(\"inMemoryiService.SearchMemory() mismatch (-want +got):\\n%s\", diff)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc makeSession(t *testing.T, appName, userID, sessionID string, events []*session.Event) session.Session {\n\tt.Helper()\n\n\treturn &testSession{\n\t\tappName:   appName,\n\t\tuserID:    userID,\n\t\tsessionID: sessionID,\n\t\tevents:    events,\n\t}\n}\n\nvar sortMemories = cmp.Transformer(\"Sort\", func(in *memory.SearchResponse) *memory.SearchResponse {\n\tslices.SortFunc(in.Memories, func(m1, m2 memory.Entry) int {\n\t\treturn m1.Timestamp.Compare(m2.Timestamp)\n\t})\n\treturn in\n})\n\ntype testSession struct {\n\tappName, userID, sessionID string\n\tevents                     []*session.Event\n}\n\nfunc (s *testSession) ID() string {\n\treturn s.sessionID\n}\n\nfunc (s *testSession) AppName() string {\n\treturn s.appName\n}\n\nfunc (s *testSession) UserID() string {\n\treturn s.userID\n}\n\nfunc (s *testSession) Events() session.Events {\n\treturn s\n}\n\nfunc (s *testSession) All() iter.Seq[*session.Event] {\n\treturn slices.Values(s.events)\n}\n\nfunc (s *testSession) Len() int {\n\treturn len(s.events)\n}\n\nfunc (s *testSession) At(i int) *session.Event {\n\treturn s.events[i]\n}\n\nfunc (s *testSession) State() session.State {\n\tpanic(\"not implemented\")\n}\n\nfunc (s *testSession) LastUpdateTime() time.Time {\n\tpanic(\"not implemented\")\n}\n\nfunc must[V any](v V, err error) V {\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn v\n}\n"
  },
  {
    "path": "memory/service.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Package memory defines the entities to interact with agent memory (long-term knowledge).\npackage memory\n\nimport (\n\t\"context\"\n\t\"time\"\n\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/session\"\n)\n\n// Service is a definition of the memory service.\n//\n// The service ingests sessions into memory so that it can be used for\n// user queries across user-scoped sessions.\ntype Service interface {\n\t// AddSession adds a session to the memory service.\n\t//\n\t// A session can be added multiple times during its lifetime.\n\tAddSessionToMemory(ctx context.Context, s session.Session) error\n\t// SearchMemory returns memory entries relevant to the given query.\n\t// Empty slice is returned if there are no matches.\n\tSearchMemory(ctx context.Context, req *SearchRequest) (*SearchResponse, error)\n}\n\n// SearchRequest represents a request for memory search.\ntype SearchRequest struct {\n\tQuery   string\n\tUserID  string\n\tAppName string\n}\n\n// SearchResponse represents the response from a memory search.\ntype SearchResponse struct {\n\tMemories []Entry\n}\n\n// Entry represents a single memory entry.\ntype Entry struct {\n\t// ID is the unique identifier of the memory.\n\tID string\n\t// Content contains the main content of the memory.\n\tContent *genai.Content\n\t// Author of the memory.\n\tAuthor string\n\t// Timestamp shows when the original content of this memory happened.\n\t// This string will be forwarded to LLM. Preferred format is ISO 8601 format.\n\tTimestamp time.Time\n\t// CustomMetadata contains optional custom metadata associated with the memory.\n\tCustomMetadata map[string]any\n}\n"
  },
  {
    "path": "model/apigee/apigee.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Package apigee provides an LLM implementation for calling Apigee proxy.\npackage apigee\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"iter\"\n\t\"net/http\"\n\t\"os\"\n\t\"strings\"\n\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/model\"\n\t\"google.golang.org/adk/model/gemini\"\n)\n\nconst (\n\tapigeeProxyURLEnvVar         = \"APIGEE_PROXY_URL\"\n\tgoogleGenaiUseVertexAIEnvVar = \"GOOGLE_GENAI_USE_VERTEXAI\"\n\tprojectEnvVar                = \"GOOGLE_CLOUD_PROJECT\"\n\tlocationEnvVar               = \"GOOGLE_CLOUD_LOCATION\"\n)\n\ntype modelInfo struct {\n\tmodelID    string\n\tapiVersion string\n\tisVertexAI bool\n}\n\ntype apigeeModel struct {\n\tdelegate model.LLM\n\tname     string\n}\n\n// Config contains the configuration for the Apigee LLM.\ntype Config struct {\n\tModelName     string\n\tProxyURL      string\n\tCustomHeaders http.Header\n\tHTTPClient    *http.Client // For testing only.\n}\n\n// Option is a function that configures the Apigee LLM.\ntype Option func(*Config)\n\n// WithProxyURL sets the proxy URL for the Apigee LLM.\nfunc WithProxyURL(proxyURL string) Option {\n\treturn func(c *Config) {\n\t\tc.ProxyURL = proxyURL\n\t}\n}\n\n// WithCustomHeaders sets the custom headers for the Apigee LLM.\nfunc WithCustomHeaders(headers http.Header) Option {\n\treturn func(c *Config) {\n\t\tc.CustomHeaders = headers\n\t}\n}\n\n// WithHTTPClient sets the HTTP client for the Apigee LLM. This is for testing only.\nfunc WithHTTPClient(client *http.Client) Option {\n\treturn func(c *Config) {\n\t\tc.HTTPClient = client\n\t}\n}\n\n// NewModel creates and initializes a new model instance that satisfies the\n// model.LLM interface, backed by the Apigee proxy.\nfunc NewModel(ctx context.Context, modelName string, opts ...Option) (*apigeeModel, error) {\n\tcfg := &Config{\n\t\tModelName: modelName,\n\t}\n\tfor _, opt := range opts {\n\t\topt(cfg)\n\t}\n\n\tif !strings.HasPrefix(cfg.ModelName, \"apigee/\") {\n\t\treturn nil, fmt.Errorf(\"invalid model string: %s\", cfg.ModelName)\n\t}\n\tmi, err := parseModelName(cfg.ModelName)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tproxyURL := resolveProxyURL(cfg.ProxyURL)\n\tif proxyURL == \"\" {\n\t\treturn nil, fmt.Errorf(\"%s environment variable not set\", apigeeProxyURLEnvVar)\n\t}\n\n\thttpOptions := generateHTTPOptions(proxyURL, mi.apiVersion, cfg.CustomHeaders)\n\n\tbackendType := backendType(mi.isVertexAI)\n\n\tclientConfig, err := generateClientConfig(mi.isVertexAI, backendType, httpOptions, cfg.HTTPClient)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tdelegate, err := gemini.NewModel(ctx, mi.modelID, clientConfig)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &apigeeModel{\n\t\tdelegate: delegate,\n\t\tname:     cfg.ModelName,\n\t}, nil\n}\n\nfunc (m *apigeeModel) Name() string {\n\treturn m.name\n}\n\n// GenerateContent calls the underlying model.\nfunc (m *apigeeModel) GenerateContent(ctx context.Context, req *model.LLMRequest, stream bool) iter.Seq2[*model.LLMResponse, error] {\n\treturn m.delegate.GenerateContent(ctx, req, stream)\n}\n\nfunc parseModelName(modelName string) (*modelInfo, error) {\n\tif !strings.HasPrefix(modelName, \"apigee/\") {\n\t\treturn nil, fmt.Errorf(\"invalid model string: %s\", modelName)\n\t}\n\tmodelPart := strings.TrimPrefix(modelName, \"apigee/\")\n\tif modelPart == \"\" {\n\t\treturn nil, fmt.Errorf(\"invalid model string: %s\", modelName)\n\t}\n\tcomponents := strings.Split(modelPart, \"/\")\n\n\tinfo := &modelInfo{}\n\tinfo.isVertexAI = !strings.HasPrefix(modelName, \"apigee/gemini/\") &&\n\t\t(strings.HasPrefix(modelName, \"apigee/vertex_ai/\") ||\n\t\t\tisEnabled(googleGenaiUseVertexAIEnvVar))\n\n\tvalidated := false\n\tif len(components) == 1 {\n\t\tinfo.modelID = components[0]\n\t\tvalidated = true\n\t} else if len(components) == 2 {\n\t\tif components[0] == \"vertex_ai\" || components[0] == \"gemini\" {\n\t\t\tinfo.modelID = components[1]\n\t\t\tvalidated = true\n\t\t} else if strings.HasPrefix(components[0], \"v\") {\n\t\t\tinfo.apiVersion = components[0]\n\t\t\tinfo.modelID = components[1]\n\t\t\tvalidated = true\n\t\t}\n\t} else if len(components) == 3 {\n\t\tif (components[0] == \"vertex_ai\" || components[0] == \"gemini\") && strings.HasPrefix(components[1], \"v\") {\n\t\t\tinfo.apiVersion = components[1]\n\t\t\tinfo.modelID = components[2]\n\t\t\tvalidated = true\n\t\t}\n\t}\n\n\tif !validated {\n\t\treturn nil, fmt.Errorf(\"invalid model string: %s\", modelName)\n\t}\n\n\treturn info, nil\n}\n\nfunc resolveProxyURL(proxyURL string) string {\n\tif proxyURL != \"\" {\n\t\treturn proxyURL\n\t}\n\treturn os.Getenv(apigeeProxyURLEnvVar)\n}\n\nfunc generateHTTPOptions(proxyURL, apiVersion string, customHeaders http.Header) *genai.HTTPOptions {\n\thttpOptions := &genai.HTTPOptions{\n\t\tBaseURL: proxyURL,\n\t}\n\tif customHeaders != nil {\n\t\thttpOptions.Headers = make(http.Header)\n\t\tfor k, v := range customHeaders {\n\t\t\thttpOptions.Headers[k] = v\n\t\t}\n\t}\n\tif apiVersion != \"\" {\n\t\thttpOptions.APIVersion = apiVersion\n\t}\n\treturn httpOptions\n}\n\nfunc backendType(isVertexAI bool) genai.Backend {\n\tif isVertexAI {\n\t\treturn genai.BackendVertexAI\n\t}\n\treturn genai.BackendGeminiAPI\n}\n\n// isEnabled returns true if the environment variable is set to \"true\" or \"1\".\nfunc isEnabled(envVarName string) bool {\n\tval := os.Getenv(envVarName)\n\treturn strings.ToLower(val) == \"true\" || val == \"1\"\n}\n\nfunc generateClientConfig(isVertexAI bool, backendType genai.Backend, httpOptions *genai.HTTPOptions, httpClient *http.Client) (*genai.ClientConfig, error) {\n\tclientConfig := &genai.ClientConfig{\n\t\tHTTPOptions: *httpOptions,\n\t\tBackend:     backendType,\n\t}\n\n\tproject := os.Getenv(projectEnvVar)\n\tlocation := os.Getenv(locationEnvVar)\n\tif isVertexAI {\n\t\tif project == \"\" {\n\t\t\treturn nil, fmt.Errorf(\"%s environment variable must be set\", projectEnvVar)\n\t\t}\n\t\tif location == \"\" {\n\t\t\treturn nil, fmt.Errorf(\"%s environment variable must be set\", locationEnvVar)\n\t\t}\n\t\tclientConfig.Project = project\n\t\tclientConfig.Location = location\n\t}\n\n\tif httpClient != nil {\n\t\tclientConfig.HTTPClient = httpClient\n\t}\n\n\treturn clientConfig, nil\n}\n"
  },
  {
    "path": "model/apigee/apigee_test.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage apigee\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"io\"\n\t\"net/http\"\n\t\"os\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/google/go-cmp/cmp\"\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/model\"\n)\n\nconst proxyURL = \"https://test.apigee.net\"\n\n// roundTripFunc is an adapter to allow the use of ordinary functions as http.RoundTrippers.\ntype roundTripFunc func(req *http.Request) (*http.Response, error)\n\n// RoundTrip executes the round trip.\nfunc (f roundTripFunc) RoundTrip(req *http.Request) (*http.Response, error) {\n\treturn f(req)\n}\n\n// newTestClient returns an *http.Client with the Transport replaced by the provided roundTripFunc.\nfunc newTestClient(fn roundTripFunc) *http.Client {\n\treturn &http.Client{\n\t\tTransport: fn,\n\t}\n}\n\nfunc TestNewModelWithValidModelStrings(t *testing.T) {\n\tvalidModelStrings := []string{\n\t\t\"apigee/gemini-1.5-flash\",\n\t\t\"apigee/v1/gemini-1.5-flash\",\n\t\t\"apigee/vertex_ai/gemini-1.5-flash\",\n\t\t\"apigee/gemini/v1/gemini-1.5-flash\",\n\t\t\"apigee/vertex_ai/v1beta/gemini-1.5-flash\",\n\t}\n\tctx := context.Background()\n\tt.Setenv(\"GOOGLE_API_KEY\", \"test-key\")\n\tfor _, modelName := range validModelStrings {\n\t\tt.Run(modelName, func(t *testing.T) {\n\t\t\tif strings.Contains(modelName, \"vertex_ai\") {\n\t\t\t\tt.Setenv(\"GOOGLE_CLOUD_PROJECT\", \"test-project\")\n\t\t\t\tt.Setenv(\"GOOGLE_CLOUD_LOCATION\", \"test-location\")\n\t\t\t} else {\n\t\t\t\tif err := os.Unsetenv(\"GOOGLE_CLOUD_PROJECT\"); err != nil {\n\t\t\t\t\tt.Errorf(\"failed to unset GOOGLE_CLOUD_PROJECT: %v\", err)\n\t\t\t\t}\n\t\t\t\tif err := os.Unsetenv(\"GOOGLE_CLOUD_LOCATION\"); err != nil {\n\t\t\t\t\tt.Errorf(\"failed to unset GOOGLE_CLOUD_LOCATION: %v\", err)\n\t\t\t\t}\n\t\t\t}\n\t\t\tclient := newTestClient(func(req *http.Request) (*http.Response, error) {\n\t\t\t\t// Check if the request URL is what we expect\n\t\t\t\tif req.URL.String() != \"https://www.google.com\" {\n\t\t\t\t\tt.Errorf(\"Unexpected URL: got %s, want https://www.google.com\", req.URL.String())\n\t\t\t\t\treturn nil, fmt.Errorf(\"unexpected URL: %s\", req.URL.String())\n\t\t\t\t}\n\n\t\t\t\t// Return a mock response\n\t\t\t\treturn &http.Response{\n\t\t\t\t\tStatusCode: http.StatusOK,\n\t\t\t\t\tBody:       io.NopCloser(strings.NewReader(\"<html><body>Mock Google</body></html>\")),\n\t\t\t\t\tHeader:     http.Header{\"Content-Type\": []string{\"text/html\"}},\n\t\t\t\t}, nil\n\t\t\t})\n\n\t\t\t_, err := NewModel(ctx, modelName, WithProxyURL(proxyURL), WithHTTPClient(client))\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"NewModel(%q) returned an unexpected error: %v\", modelName, err)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestNewModelWithInvalidModelStrings(t *testing.T) {\n\tinvalidModelStrings := []string{\n\t\t\"apigee/openai/v1/gpt\",\n\t\t\"apigee/\",\n\t\t\"apigee\",\n\t\t\"gemini-pro\",\n\t\t\"apigee/vertex_ai/v1/model/extra\",\n\t\t\"apigee/unknown/model\",\n\t}\n\tctx := context.Background()\n\tt.Setenv(\"GOOGLE_API_KEY\", \"test-key\")\n\tfor _, modelName := range invalidModelStrings {\n\t\tt.Run(modelName, func(t *testing.T) {\n\t\t\t_, err := NewModel(ctx, modelName, WithProxyURL(proxyURL))\n\t\t\tif err == nil {\n\t\t\t\tt.Errorf(\"NewModel(%q) did not return an error for invalid model string\", modelName)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestParseModelName(t *testing.T) {\n\ttestCases := []struct {\n\t\tname      string\n\t\tmodelName string\n\t\tvertexEnv string\n\t\twant      *modelInfo\n\t\twantErr   bool\n\t}{\n\t\t{\n\t\t\tname:      \"simple\",\n\t\t\tmodelName: \"apigee/gemini-1.5-flash\",\n\t\t\tvertexEnv: \"\",\n\t\t\twant:      &modelInfo{modelID: \"gemini-1.5-flash\", apiVersion: \"\", isVertexAI: false},\n\t\t},\n\t\t{\n\t\t\tname:      \"simple vertex env\",\n\t\t\tmodelName: \"apigee/gemini-1.5-flash\",\n\t\t\tvertexEnv: \"true\",\n\t\t\twant:      &modelInfo{modelID: \"gemini-1.5-flash\", apiVersion: \"\", isVertexAI: true},\n\t\t},\n\t\t{\n\t\t\tname:      \"v1\",\n\t\t\tmodelName: \"apigee/v1/gemini-1.5-flash\",\n\t\t\tvertexEnv: \"\",\n\t\t\twant:      &modelInfo{modelID: \"gemini-1.5-flash\", apiVersion: \"v1\", isVertexAI: false},\n\t\t},\n\t\t{\n\t\t\tname:      \"vertex\",\n\t\t\tmodelName: \"apigee/vertex_ai/gemini-1.5-flash\",\n\t\t\tvertexEnv: \"\",\n\t\t\twant:      &modelInfo{modelID: \"gemini-1.5-flash\", apiVersion: \"\", isVertexAI: true},\n\t\t},\n\t\t{\n\t\t\tname:      \"gemini v1\",\n\t\t\tmodelName: \"apigee/gemini/v1/gemini-1.5-flash\",\n\t\t\tvertexEnv: \"\",\n\t\t\twant:      &modelInfo{modelID: \"gemini-1.5-flash\", apiVersion: \"v1\", isVertexAI: false},\n\t\t},\n\t\t{\n\t\t\tname:      \"vertex v1beta\",\n\t\t\tmodelName: \"apigee/vertex_ai/v1beta/gemini-1.5-flash\",\n\t\t\tvertexEnv: \"\",\n\t\t\twant:      &modelInfo{modelID: \"gemini-1.5-flash\", apiVersion: \"v1beta\", isVertexAI: true},\n\t\t},\n\t\t{\n\t\t\tname:      \"invalid openai\",\n\t\t\tmodelName: \"apigee/openai/v1/gpt\",\n\t\t\twantErr:   true,\n\t\t},\n\t\t{\n\t\t\tname:      \"invalid trailing slash\",\n\t\t\tmodelName: \"apigee/\",\n\t\t\twantErr:   true,\n\t\t},\n\t\t{\n\t\t\tname:      \"invalid extra parts\",\n\t\t\tmodelName: \"apigee/vertex_ai/v1/model/extra\",\n\t\t\twantErr:   true,\n\t\t},\n\t\t{\n\t\t\tname:      \"invalid unknown\",\n\t\t\tmodelName: \"apigee/unknown/model\",\n\t\t\twantErr:   true,\n\t\t},\n\t}\n\n\tfor _, tc := range testCases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\tif tc.vertexEnv != \"\" {\n\t\t\t\tt.Setenv(googleGenaiUseVertexAIEnvVar, tc.vertexEnv)\n\t\t\t} else {\n\t\t\t\tif err := os.Unsetenv(googleGenaiUseVertexAIEnvVar); err != nil {\n\t\t\t\t\tt.Errorf(\"failed to unset %s: %v\", googleGenaiUseVertexAIEnvVar, err)\n\t\t\t\t}\n\t\t\t}\n\t\t\tgot, err := parseModelName(tc.modelName)\n\t\t\tif (err != nil) != tc.wantErr {\n\t\t\t\tt.Errorf(\"parseModelName(%q) error = %v, wantErr %v\", tc.modelName, err, tc.wantErr)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif !tc.wantErr {\n\t\t\t\tif !cmp.Equal(got, tc.want, cmp.AllowUnexported(modelInfo{})) {\n\t\t\t\t\tt.Errorf(\"parseModelName(%q) = %+v, want %+v\", tc.modelName, got, tc.want)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestNewModelWithCustomHeaders(t *testing.T) {\n\tctx := context.Background()\n\tt.Setenv(\"GOOGLE_API_KEY\", \"test-key\")\n\theaders := http.Header{}\n\theaders.Set(\"X-Custom-Header\", \"custom-value\")\n\t_, err := NewModel(ctx, \"apigee/gemini-1.5-flash\", WithProxyURL(proxyURL), WithCustomHeaders(headers))\n\tif err != nil {\n\t\tt.Fatalf(\"NewModel() returned an unexpected error: %v\", err)\n\t}\n}\n\nfunc TestNewModelWithoutProxyURL(t *testing.T) {\n\tctx := context.Background()\n\tt.Setenv(\"GOOGLE_API_KEY\", \"test-key\")\n\tif err := os.Unsetenv(apigeeProxyURLEnvVar); err != nil {\n\t\tt.Errorf(\"failed to unset %s: %v\", apigeeProxyURLEnvVar, err)\n\t}\n\t_, err := NewModel(ctx, \"apigee/gemini-1.5-flash\")\n\tif err == nil {\n\t\tt.Errorf(\"NewModel() did not return an error when proxy URL is not set\")\n\t}\n\n\tt.Setenv(apigeeProxyURLEnvVar, \"https://env.proxy.url\")\n\t_, err = NewModel(ctx, \"apigee/gemini-1.5-flash\")\n\tif err != nil {\n\t\tt.Fatalf(\"NewModel() returned an unexpected error: %v\", err)\n\t}\n}\n\nfunc TestNewModelVertexMissingProjectOrLocation(t *testing.T) {\n\tctx := context.Background()\n\tt.Setenv(\"GOOGLE_API_KEY\", \"test-key\")\n\tt.Setenv(googleGenaiUseVertexAIEnvVar, \"true\")\n\tif err := os.Unsetenv(projectEnvVar); err != nil {\n\t\tt.Errorf(\"failed to unset %s: %v\", projectEnvVar, err)\n\t}\n\tif err := os.Unsetenv(locationEnvVar); err != nil {\n\t\tt.Errorf(\"failed to unset %s: %v\", locationEnvVar, err)\n\t}\n\t_, err := NewModel(ctx, \"apigee/gemini-1.5-flash\", WithProxyURL(proxyURL))\n\tif err == nil || !strings.Contains(err.Error(), projectEnvVar) {\n\t\tt.Errorf(\"NewModel() with vertex enabled but no project env var should fail\")\n\t}\n\n\tt.Setenv(projectEnvVar, \"test-project\")\n\t_, err = NewModel(ctx, \"apigee/gemini-1.5-flash\", WithProxyURL(proxyURL))\n\tif err == nil || !strings.Contains(err.Error(), locationEnvVar) {\n\t\tt.Errorf(\"NewModel() with vertex enabled but no location env var should fail\")\n\t}\n}\n\n// test GenerateContent\nfunc TestGenerateContent(t *testing.T) {\n\tctx := context.Background()\n\tt.Setenv(\"GOOGLE_API_KEY\", \"test-key\")\n\tt.Setenv(googleGenaiUseVertexAIEnvVar, \"true\")\n\tt.Setenv(projectEnvVar, \"test-project\")\n\tt.Setenv(locationEnvVar, \"test-location\")\n\tclient := newTestClient(func(req *http.Request) (*http.Response, error) {\n\t\t// Check if the request URL is what we expect\n\t\tif req.URL.String() != \"https://test.apigee.net/v1/models/gemini-1.5-flash:generateContent\" && req.URL.String() != \"https://test.apigee.net/v1/models/gemini-1.5-flash:streamGenerateContent?alt=sse\" {\n\t\t\tt.Errorf(\"Unexpected URL: got %s, want https://test.apigee.net/v1/models/gemini-1.5-flash:generateContent or https://test.apigee.net/v1/models/gemini-1.5-flash:streamGenerateContent?alt=sse\", req.URL.String())\n\t\t\treturn nil, fmt.Errorf(\"unexpected URL: %s\", req.URL.String())\n\t\t}\n\n\t\t// Return a mock response\n\t\treturn &http.Response{\n\t\t\tStatusCode: http.StatusOK,\n\t\t\tBody:       io.NopCloser(strings.NewReader(\"{\\\"candidates\\\":[{\\\"content\\\":{\\\"parts\\\":[{\\\"text\\\":\\\"Paris\\\"}]}}]}\")),\n\t\t\tHeader:     http.Header{\"Content-Type\": []string{\"application/json\"}},\n\t\t}, nil\n\t})\n\tapigeeModel, err := NewModel(ctx, \"apigee/gemini/v1/gemini-1.5-flash\", WithProxyURL(proxyURL), WithHTTPClient(client))\n\tif err != nil {\n\t\tt.Fatalf(\"NewModel() returned an unexpected error: %v\", err)\n\t}\n\treq := &model.LLMRequest{\n\t\tContents: genai.Text(\"What is the capital of France? One word.\"),\n\t\tConfig: &genai.GenerateContentConfig{\n\t\t\tTemperature: new(float32),\n\t\t},\n\t}\n\n\tresponses := apigeeModel.GenerateContent(ctx, req, false)\n\tfor resp, err := range responses {\n\t\tif err != nil || resp.Content == nil || len(resp.Content.Parts) == 0 {\n\t\t\tt.Errorf(\"GenerateContent() returned an unexpected error or empty response: %v\", err)\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "model/gemini/gemini.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Package gemini implements the [model.LLM] interface for Gemini models.\npackage gemini\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"iter\"\n\t\"net/http\"\n\t\"runtime\"\n\t\"strings\"\n\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/internal/llminternal\"\n\t\"google.golang.org/adk/internal/llminternal/converters\"\n\t\"google.golang.org/adk/internal/llminternal/googlellm\"\n\t\"google.golang.org/adk/internal/version\"\n\t\"google.golang.org/adk/model\"\n)\n\n// TODO: test coverage\ntype geminiModel struct {\n\tclient             *genai.Client\n\tname               string\n\tversionHeaderValue string\n}\n\n// NewModel returns [model.LLM], backed by the Gemini API.\n//\n// It uses the provided context and configuration to initialize the underlying\n// [genai.Client]. The modelName specifies which Gemini model to target\n// (e.g., \"gemini-2.5-flash\").\n//\n// An error is returned if the [genai.Client] fails to initialize.\nfunc NewModel(ctx context.Context, modelName string, cfg *genai.ClientConfig) (model.LLM, error) {\n\t// Create a copy of the config to avoid mutating the caller's config\n\t// or the underlying http.Client.\n\tif cfg != nil {\n\t\tcfgCopy := *cfg\n\t\tif cfg.HTTPClient != nil {\n\t\t\tclientCopy := *cfg.HTTPClient\n\t\t\tcfgCopy.HTTPClient = &clientCopy\n\t\t}\n\t\tcfg = &cfgCopy\n\t}\n\n\tclient, err := genai.NewClient(ctx, cfg)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tif client.ClientConfig().HTTPClient != nil {\n\t\tclient.ClientConfig().HTTPClient.Transport = &mergeHeadersInterceptor{\n\t\t\tbase: client.ClientConfig().HTTPClient.Transport,\n\t\t}\n\t}\n\n\t// Create header value once, when the model is created\n\theaderValue := fmt.Sprintf(\"google-adk/%s gl-go/%s\", version.Version,\n\t\tstrings.TrimPrefix(runtime.Version(), \"go\"))\n\n\treturn &geminiModel{\n\t\tname:               modelName,\n\t\tclient:             client,\n\t\tversionHeaderValue: headerValue,\n\t}, nil\n}\n\nfunc (m *geminiModel) Name() string {\n\treturn m.name\n}\n\n// GenerateContent calls the underlying model.\nfunc (m *geminiModel) GenerateContent(ctx context.Context, req *model.LLMRequest, stream bool) iter.Seq2[*model.LLMResponse, error] {\n\tm.maybeAppendUserContent(req)\n\tif req.Config == nil {\n\t\treq.Config = &genai.GenerateContentConfig{}\n\t}\n\tif req.Config.HTTPOptions == nil {\n\t\treq.Config.HTTPOptions = &genai.HTTPOptions{}\n\t}\n\tif req.Config.HTTPOptions.Headers == nil {\n\t\treq.Config.HTTPOptions.Headers = make(http.Header)\n\t}\n\tm.addHeaders(req.Config.HTTPOptions.Headers)\n\n\tif stream {\n\t\treturn m.generateStream(ctx, req)\n\t}\n\n\treturn func(yield func(*model.LLMResponse, error) bool) {\n\t\tresp, err := m.generate(ctx, req)\n\t\tyield(resp, err)\n\t}\n}\n\n// addHeaders sets the x-goog-api-client and user-agent headers\nfunc (m *geminiModel) addHeaders(headers http.Header) {\n\theaders.Set(\"x-goog-api-client\", m.versionHeaderValue)\n\theaders.Set(\"user-agent\", m.versionHeaderValue)\n}\n\n// modelName returns the model name to use for the API call.\n// It prefers req.Model (which can be set by BeforeModelCallback),\n// falling back to the construction-time name if unset.\nfunc (m *geminiModel) modelName(req *model.LLMRequest) string {\n\tif req.Model != \"\" {\n\t\treturn req.Model\n\t}\n\treturn m.name\n}\n\n// generate calls the model synchronously returning result from the first candidate.\nfunc (m *geminiModel) generate(ctx context.Context, req *model.LLMRequest) (*model.LLMResponse, error) {\n\tresp, err := m.client.Models.GenerateContent(ctx, m.modelName(req), req.Contents, req.Config)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to call model: %w\", err)\n\t}\n\tif len(resp.Candidates) == 0 {\n\t\t// shouldn't happen?\n\t\treturn nil, fmt.Errorf(\"empty response\")\n\t}\n\treturn converters.Genai2LLMResponse(resp), nil\n}\n\n// generateStream returns a stream of responses from the model.\nfunc (m *geminiModel) generateStream(ctx context.Context, req *model.LLMRequest) iter.Seq2[*model.LLMResponse, error] {\n\taggregator := llminternal.NewStreamingResponseAggregator()\n\n\treturn func(yield func(*model.LLMResponse, error) bool) {\n\t\tfor resp, err := range m.client.Models.GenerateContentStream(ctx, m.modelName(req), req.Contents, req.Config) {\n\t\t\tif err != nil {\n\t\t\t\tyield(nil, err)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tfor llmResponse, err := range aggregator.ProcessResponse(ctx, resp) {\n\t\t\t\tif !yield(llmResponse, err) {\n\t\t\t\t\treturn // Consumer stopped\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif closeResult := aggregator.Close(); closeResult != nil {\n\t\t\tyield(closeResult, nil)\n\t\t}\n\t}\n}\n\n// maybeAppendUserContent appends a user content, so that model can continue to output.\nfunc (m *geminiModel) maybeAppendUserContent(req *model.LLMRequest) {\n\tif len(req.Contents) == 0 {\n\t\treq.Contents = append(req.Contents, genai.NewContentFromText(\"Handle the requests as specified in the System Instruction.\", \"user\"))\n\t}\n\n\tif last := req.Contents[len(req.Contents)-1]; last != nil && last.Role != \"user\" {\n\t\treq.Contents = append(req.Contents, genai.NewContentFromText(\"Continue processing previous requests as instructed. Exit or provide a summary if no more outputs are needed.\", \"user\"))\n\t}\n}\n\n// mergeHeadersInterceptor is a http.RoundTripper that merges headers from the request\n// with the model's headers before delegating to the base transport.\ntype mergeHeadersInterceptor struct {\n\tbase http.RoundTripper\n}\n\nfunc (h *mergeHeadersInterceptor) RoundTrip(req *http.Request) (*http.Response, error) {\n\tfor _, headerName := range []string{\"x-goog-api-client\", \"user-agent\"} {\n\t\tif values := req.Header.Values(headerName); len(values) > 0 {\n\t\t\treq.Header.Set(headerName, strings.Join(values, \" \"))\n\t\t}\n\t}\n\n\tif h.base == nil {\n\t\treturn http.DefaultTransport.RoundTrip(req)\n\t}\n\treturn h.base.RoundTrip(req)\n}\n\nfunc (m *geminiModel) GetGoogleLLMVariant() genai.Backend {\n\tif m == nil || m.client == nil {\n\t\treturn genai.BackendUnspecified\n\t}\n\treturn m.client.ClientConfig().Backend\n}\n\nvar _ googlellm.GoogleLLM = &geminiModel{}\n"
  },
  {
    "path": "model/gemini/gemini_test.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage gemini\n\nimport (\n\t\"fmt\"\n\t\"iter\"\n\t\"net/http\"\n\t\"path/filepath\"\n\t\"strconv\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/google/go-cmp/cmp\"\n\t\"github.com/google/go-cmp/cmp/cmpopts\"\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/internal/httprr\"\n\t\"google.golang.org/adk/internal/testutil\"\n\t\"google.golang.org/adk/model\"\n)\n\n//go:generate go test -httprecord=testdata/.*\\.httprr\n\nfunc TestModel_Generate(t *testing.T) {\n\ttests := []struct {\n\t\tname      string\n\t\tmodelName string\n\t\treq       *model.LLMRequest\n\t\twant      *model.LLMResponse\n\t\twantErr   bool\n\t}{\n\t\t{\n\t\t\tname:      \"ok\",\n\t\t\tmodelName: \"gemini-2.5-flash\",\n\t\t\treq: &model.LLMRequest{\n\t\t\t\tContents: genai.Text(\"What is the capital of France? One word.\"),\n\t\t\t\tConfig: &genai.GenerateContentConfig{\n\t\t\t\t\tTemperature: new(float32),\n\t\t\t\t},\n\t\t\t},\n\t\t\twant: &model.LLMResponse{\n\t\t\t\tContent: genai.NewContentFromText(\"Paris\", genai.RoleModel),\n\t\t\t\tUsageMetadata: &genai.GenerateContentResponseUsageMetadata{\n\t\t\t\t\tCandidatesTokenCount:    1,\n\t\t\t\t\tCandidatesTokensDetails: nil,\n\t\t\t\t\tPromptTokenCount:        11,\n\t\t\t\t\tPromptTokensDetails:     []*genai.ModalityTokenCount{{Modality: \"TEXT\", TokenCount: 11}},\n\t\t\t\t\tThoughtsTokenCount:      34,\n\t\t\t\t\tTotalTokenCount:         46,\n\t\t\t\t},\n\t\t\t\tModelVersion: \"gemini-2.5-flash\",\n\t\t\t\tFinishReason: \"STOP\",\n\t\t\t},\n\t\t},\n\t}\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\thttpRecordFilename := filepath.Join(\"testdata\", strings.ReplaceAll(t.Name(), \"/\", \"_\")+\".httprr\")\n\n\t\t\ttestModel, err := NewModel(t.Context(), tt.modelName, testutil.NewGeminiTestClientConfig(t, httpRecordFilename))\n\t\t\tif err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\n\t\t\tfor got, err := range testModel.GenerateContent(t.Context(), tt.req, false) {\n\t\t\t\tif (err != nil) != tt.wantErr {\n\t\t\t\t\tt.Errorf(\"Model.Generate() error = %v, wantErr %v\", err, tt.wantErr)\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif diff := cmp.Diff(tt.want, got, cmpopts.IgnoreFields(model.LLMResponse{}, \"AvgLogprobs\")); diff != \"\" {\n\t\t\t\t\tt.Errorf(\"Model.Generate() = %v, want %v\\ndiff(-want +got):\\n%v\", got, tt.want, diff)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestModel_GenerateStream(t *testing.T) {\n\ttests := []struct {\n\t\tname      string\n\t\tmodelName string\n\t\treq       *model.LLMRequest\n\t\twant      string\n\t\twantErr   bool\n\t}{\n\t\t{\n\t\t\tname:      \"ok\",\n\t\t\tmodelName: \"gemini-2.5-flash\",\n\t\t\treq: &model.LLMRequest{\n\t\t\t\tContents: genai.Text(\"What is the capital of France? One word.\"),\n\t\t\t\tConfig: &genai.GenerateContentConfig{\n\t\t\t\t\tTemperature: new(float32),\n\t\t\t\t},\n\t\t\t},\n\t\t\twant: \"Paris\",\n\t\t},\n\t}\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\thttpRecordFilename := filepath.Join(\"testdata\", strings.ReplaceAll(t.Name(), \"/\", \"_\")+\".httprr\")\n\n\t\t\tmodel, err := NewModel(t.Context(), tt.modelName, testutil.NewGeminiTestClientConfig(t, httpRecordFilename))\n\t\t\tif err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\n\t\t\t// Transforms the stream into strings, concatenating the text value of the response parts\n\t\t\tgot, err := readResponse(model.GenerateContent(t.Context(), tt.req, true))\n\t\t\tif (err != nil) != tt.wantErr {\n\t\t\t\tt.Errorf(\"Model.GenerateStream() error = %v, wantErr %v\", err, tt.wantErr)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif diff := cmp.Diff(tt.want, got.PartialText); diff != \"\" {\n\t\t\t\tt.Errorf(\"Model.GenerateStream() = %v, want %v\\ndiff(-want +got):\\n%v\", got.PartialText, tt.want, diff)\n\t\t\t}\n\t\t\t// Since we are expecting GenerateStream to aggregate partial events, the text should be the same\n\t\t\tif diff := cmp.Diff(tt.want, got.FinalText); diff != \"\" {\n\t\t\t\tt.Errorf(\"Model.GenerateStream() = %v, want %v\\ndiff(-want +got):\\n%v\", got.FinalText, tt.want, diff)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestModel_TrackingHeaders(t *testing.T) {\n\ttests := []struct {\n\t\tname      string\n\t\tuseVertex bool\n\t}{\n\t\t{\"vertex_enabled\", true},\n\t\t{\"vertex_disabled\", false},\n\t}\n\tfor _, tt := range tests {\n\t\tt.Run(\"verifies_headers_are_set_\"+tt.name, func(t *testing.T) {\n\t\t\tt.Setenv(\"GOOGLE_GENAI_USE_VERTEXAI\", strconv.FormatBool(tt.useVertex))\n\n\t\t\thttpRecordFilename := filepath.Join(\"testdata\", strings.ReplaceAll(t.Name(), \"/\", \"_\")+\".httprr\")\n\n\t\t\tbaseTransport, err := testutil.NewGeminiTransport(httpRecordFilename)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\n\t\t\theadersChecked := false\n\t\t\tinterceptor := &headerInterceptor{\n\t\t\t\tbase: baseTransport,\n\t\t\t\tcheck: func(req *http.Request) {\n\t\t\t\t\theadersChecked = true\n\t\t\t\t\t// Verify that standard tracking headers are present.\n\t\t\t\t\t// The exact expected values for these may need adjustment based on\n\t\t\t\t\t// the specific implementation of the tracking logic.\n\t\t\t\t\tif len(req.Header.Values(\"User-Agent\")) != 1 {\n\t\t\t\t\t\tt.Errorf(\"User-Agent header should have exactly one value, but got %v\", req.Header.Values(\"User-Agent\"))\n\t\t\t\t\t}\n\t\t\t\t\tif len(req.Header.Values(\"x-goog-api-client\")) != 1 {\n\t\t\t\t\t\tt.Errorf(\"x-goog-api-client header should have exactly one value, but got %v\", req.Header.Values(\"x-goog-api-client\"))\n\t\t\t\t\t}\n\t\t\t\t\tif ua := req.Header.Get(\"User-Agent\"); !strings.Contains(ua, \"google-adk/\") || !strings.Contains(ua, \"gl-go/\") {\n\t\t\t\t\t\tt.Errorf(\"User-Agent header should contain both 'google-adk/' and 'gl-go/', but got: %q\", ua)\n\t\t\t\t\t}\n\t\t\t\t\tif xgac := req.Header.Get(\"x-goog-api-client\"); !strings.Contains(xgac, \"google-adk/\") || !strings.Contains(xgac, \"gl-go/\") {\n\t\t\t\t\t\tt.Errorf(\"x-goog-api-client header should contain both 'google-adk/' and 'gl-go/', but got: %q\", xgac)\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t}\n\n\t\t\tapiKey := \"\"\n\t\t\tif recording, _ := httprr.Recording(httpRecordFilename); !recording {\n\t\t\t\tapiKey = \"fakekey\"\n\t\t\t}\n\n\t\t\tcfg := &genai.ClientConfig{\n\t\t\t\tHTTPClient: &http.Client{Transport: interceptor},\n\t\t\t\tAPIKey:     apiKey,\n\t\t\t}\n\n\t\t\tgeminiModel, err := NewModel(t.Context(), \"gemini-2.0-flash\", cfg)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\n\t\t\t// Trigger a request to fire the interceptor.\n\t\t\t// We don't strictly care about the success of the call, only that it was attempted with headers.\n\t\t\treq := &model.LLMRequest{Contents: genai.Text(\"ping\")}\n\t\t\tfor _, err := range geminiModel.GenerateContent(t.Context(), req, false) {\n\t\t\t\tif err != nil {\n\t\t\t\t\tt.Logf(\"GenerateContent finished with error (expected if no recording exists): %v\", err)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif !headersChecked {\n\t\t\t\tt.Error(\"HTTP request was not intercepted; headers not verified\")\n\t\t\t}\n\t\t})\n\t}\n}\n\n// TestModel_NoSideEffects verifies that NewModel does not modify the passed http.Client.\nfunc TestModel_NoSideEffects(t *testing.T) {\n\t// Create a custom transport to identify the client\n\toriginalTransport := &http.Transport{}\n\thttpClient := &http.Client{\n\t\tTransport: originalTransport,\n\t}\n\tcfg := &genai.ClientConfig{\n\t\tHTTPClient: httpClient,\n\t\tAPIKey:     \"fake-api-key\",\n\t}\n\n\t// We expect NewModel to fail because of the fake API key (or network),\n\t// but we only care about the side effects on httpClient.\n\t_, _ = NewModel(t.Context(), \"gemini-2.0-flash\", cfg)\n\n\tif httpClient.Transport != originalTransport {\n\t\tt.Errorf(\"NewModel modified the passed http.Client.Transport; got %v, want %v\", httpClient.Transport, originalTransport)\n\t}\n}\n\nfunc TestModel_RespectsRequestModel(t *testing.T) {\n\ttests := []struct {\n\t\tname            string\n\t\tconstructorName string\n\t\treqModel        string\n\t\twantInURL       string\n\t}{\n\t\t{\n\t\t\tname:            \"uses_constructor_name_when_req_model_empty\",\n\t\t\tconstructorName: \"gemini-2.5-flash\",\n\t\t\treqModel:        \"\",\n\t\t\twantInURL:       \"gemini-2.5-flash\",\n\t\t},\n\t\t{\n\t\t\tname:            \"uses_req_model_when_set\",\n\t\t\tconstructorName: \"gemini-2.5-flash\",\n\t\t\treqModel:        \"gemini-2.0-flash\",\n\t\t\twantInURL:       \"gemini-2.0-flash\",\n\t\t},\n\t}\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tvar capturedURL string\n\t\t\tinterceptor := &headerInterceptor{\n\t\t\t\tcheck: func(req *http.Request) {\n\t\t\t\t\tcapturedURL = req.URL.Path\n\t\t\t\t},\n\t\t\t}\n\n\t\t\tcfg := &genai.ClientConfig{\n\t\t\t\tHTTPClient: &http.Client{Transport: interceptor},\n\t\t\t\tAPIKey:     \"fakekey\",\n\t\t\t}\n\n\t\t\tgeminiModel, err := NewModel(t.Context(), tt.constructorName, cfg)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\n\t\t\treq := &model.LLMRequest{\n\t\t\t\tModel:    tt.reqModel,\n\t\t\t\tContents: genai.Text(\"ping\"),\n\t\t\t}\n\t\t\tfor range geminiModel.GenerateContent(t.Context(), req, false) {\n\t\t\t}\n\n\t\t\tif capturedURL == \"\" {\n\t\t\t\tt.Fatal(\"HTTP request was not intercepted\")\n\t\t\t}\n\t\t\tif !strings.Contains(capturedURL, tt.wantInURL) {\n\t\t\t\tt.Errorf(\"URL path = %q, want it to contain %q\", capturedURL, tt.wantInURL)\n\t\t\t}\n\t\t})\n\t}\n}\n\n// TextResponse holds the concatenated text from a response stream,\n// separated into partial and final parts.\ntype TextResponse struct {\n\t// PartialText is the full text concatenated from all partial (streaming) responses.\n\tPartialText string\n\t// FinalText is the full text concatenated from all final (non-partial) responses.\n\tFinalText string\n}\n\n// readResponse transforms a sequence into a TextResponse, concatenating the text value of the response parts\n// depending on the readPartial value it will only concatenate the text of partial events or the text of non partial events\nfunc readResponse(s iter.Seq2[*model.LLMResponse, error]) (TextResponse, error) {\n\tvar partialBuilder, finalBuilder strings.Builder\n\tvar result TextResponse\n\n\tfor resp, err := range s {\n\t\tif err != nil {\n\t\t\t// Return what we have so far, along with the error.\n\t\t\tresult.PartialText = partialBuilder.String()\n\t\t\tresult.FinalText = finalBuilder.String()\n\t\t\treturn result, err\n\t\t}\n\t\tif resp.Content == nil || len(resp.Content.Parts) == 0 {\n\t\t\treturn result, fmt.Errorf(\"encountered an empty response: %v\", resp)\n\t\t}\n\n\t\ttext := resp.Content.Parts[0].Text\n\t\tif resp.Partial {\n\t\t\tpartialBuilder.WriteString(text)\n\t\t} else {\n\t\t\tfinalBuilder.WriteString(text)\n\t\t}\n\t}\n\n\tresult.PartialText = partialBuilder.String()\n\tresult.FinalText = finalBuilder.String()\n\treturn result, nil\n}\n\n// headerInterceptor is a http.RoundTripper that executes a check function on the request\n// before delegating to the base transport.\ntype headerInterceptor struct {\n\tbase  http.RoundTripper\n\tcheck func(*http.Request)\n}\n\nfunc (h *headerInterceptor) RoundTrip(req *http.Request) (*http.Response, error) {\n\tif h.check != nil {\n\t\th.check(req)\n\t}\n\tif h.base == nil {\n\t\treturn http.DefaultTransport.RoundTrip(req)\n\t}\n\treturn h.base.RoundTrip(req)\n}\n"
  },
  {
    "path": "model/gemini/testdata/TestModel_GenerateStream_ok.httprr",
    "content": "httprr trace v1\n375 769\nPOST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:streamGenerateContent?alt=sse HTTP/1.1\r\nHost: generativelanguage.googleapis.com\r\nUser-Agent: Go-http-client/1.1\r\nContent-Length: 129\r\nContent-Type: application/json\r\n\r\n{\"contents\":[{\"parts\":[{\"text\":\"What is the capital of France? One word.\"}],\"role\":\"user\"}],\"generationConfig\":{\"temperature\":0}}HTTP/2.0 200 OK\r\nConnection: close\r\nAlt-Svc: h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000\r\nContent-Disposition: attachment\r\nContent-Type: text/event-stream\r\nDate: Fri, 20 Feb 2026 12:38:32 GMT\r\nServer: scaffolding on HTTPServer2\r\nServer-Timing: gfet4t7; dur=786\r\nVary: Origin\r\nVary: X-Origin\r\nVary: Referer\r\nX-Content-Type-Options: nosniff\r\nX-Frame-Options: SAMEORIGIN\r\nX-Xss-Protection: 0\r\n\r\ndata: {\"candidates\": [{\"content\": {\"parts\": [{\"text\": \"Paris\"}],\"role\": \"model\"},\"finishReason\": \"STOP\",\"index\": 0}],\"usageMetadata\": {\"promptTokenCount\": 11,\"candidatesTokenCount\": 1,\"totalTokenCount\": 45,\"promptTokensDetails\": [{\"modality\": \"TEXT\",\"tokenCount\": 11}],\"thoughtsTokenCount\": 33},\"modelVersion\": \"gemini-2.5-flash\",\"responseId\": \"yFWYabnBB8Wg1e8P3ZTdiAY\"}\r\n\r\n"
  },
  {
    "path": "model/gemini/testdata/TestModel_Generate_ok.httprr",
    "content": "httprr trace v1\n361 904\nPOST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent HTTP/1.1\r\nHost: generativelanguage.googleapis.com\r\nUser-Agent: Go-http-client/1.1\r\nContent-Length: 129\r\nContent-Type: application/json\r\n\r\n{\"contents\":[{\"parts\":[{\"text\":\"What is the capital of France? One word.\"}],\"role\":\"user\"}],\"generationConfig\":{\"temperature\":0}}HTTP/2.0 200 OK\r\nAlt-Svc: h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000\r\nContent-Type: application/json; charset=UTF-8\r\nDate: Fri, 20 Feb 2026 12:38:32 GMT\r\nServer: scaffolding on HTTPServer2\r\nServer-Timing: gfet4t7; dur=1173\r\nVary: Origin\r\nVary: X-Origin\r\nVary: Referer\r\nX-Content-Type-Options: nosniff\r\nX-Frame-Options: SAMEORIGIN\r\nX-Xss-Protection: 0\r\n\r\n{\n  \"candidates\": [\n    {\n      \"content\": {\n        \"parts\": [\n          {\n            \"text\": \"Paris\"\n          }\n        ],\n        \"role\": \"model\"\n      },\n      \"finishReason\": \"STOP\",\n      \"index\": 0\n    }\n  ],\n  \"usageMetadata\": {\n    \"promptTokenCount\": 11,\n    \"candidatesTokenCount\": 1,\n    \"totalTokenCount\": 46,\n    \"promptTokensDetails\": [\n      {\n        \"modality\": \"TEXT\",\n        \"tokenCount\": 11\n      }\n    ],\n    \"thoughtsTokenCount\": 34\n  },\n  \"modelVersion\": \"gemini-2.5-flash\",\n  \"responseId\": \"xlWYafXAOKSf1e8PpcODiAg\"\n}\n"
  },
  {
    "path": "model/gemini/testdata/TestModel_TrackingHeaders_verifies_headers_are_set_vertex_disabled.httprr",
    "content": "httprr trace v1\n309 930\nPOST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent HTTP/1.1\r\nHost: generativelanguage.googleapis.com\r\nUser-Agent: Go-http-client/1.1\r\nContent-Length: 78\r\nContent-Type: application/json\r\n\r\n{\"contents\":[{\"parts\":[{\"text\":\"ping\"}],\"role\":\"user\"}],\"generationConfig\":{}}HTTP/2.0 200 OK\r\nAlt-Svc: h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000\r\nContent-Type: application/json; charset=UTF-8\r\nDate: Fri, 20 Feb 2026 12:38:35 GMT\r\nServer: scaffolding on HTTPServer2\r\nServer-Timing: gfet4t7; dur=2945\r\nVary: Origin\r\nVary: X-Origin\r\nVary: Referer\r\nX-Content-Type-Options: nosniff\r\nX-Frame-Options: SAMEORIGIN\r\nX-Xss-Protection: 0\r\n\r\n{\n  \"candidates\": [\n    {\n      \"content\": {\n        \"parts\": [\n          {\n            \"text\": \"Pong! How can I help you today?\"\n          }\n        ],\n        \"role\": \"model\"\n      },\n      \"finishReason\": \"STOP\",\n      \"index\": 0\n    }\n  ],\n  \"usageMetadata\": {\n    \"promptTokenCount\": 2,\n    \"candidatesTokenCount\": 9,\n    \"totalTokenCount\": 469,\n    \"promptTokensDetails\": [\n      {\n        \"modality\": \"TEXT\",\n        \"tokenCount\": 2\n      }\n    ],\n    \"thoughtsTokenCount\": 458\n  },\n  \"modelVersion\": \"gemini-2.5-flash\",\n  \"responseId\": \"yFWYaYucO4a4vr0PqICv0Aw\"\n}\n"
  },
  {
    "path": "model/gemini/testdata/TestModel_TrackingHeaders_verifies_headers_are_set_vertex_enabled.httprr",
    "content": "httprr trace v1\n312 1269\nPOST https://aiplatform.googleapis.com/v1beta1/publishers/google/models/gemini-2.0-flash:generateContent HTTP/1.1\r\nHost: aiplatform.googleapis.com\r\nUser-Agent: Go-http-client/1.1\r\nContent-Length: 78\r\nContent-Type: application/json\r\n\r\n{\"contents\":[{\"parts\":[{\"text\":\"ping\"}],\"role\":\"user\"}],\"generationConfig\":{}}HTTP/2.0 401 Unauthorized\r\nContent-Type: application/json; charset=UTF-8\r\nDate: Mon, 02 Mar 2026 09:40:38 GMT\r\nServer: scaffolding on HTTPServer2\r\nVary: Origin\r\nVary: X-Origin\r\nVary: Referer\r\nWww-Authenticate: Bearer realm=\"https://accounts.google.com/\"\r\nX-Content-Type-Options: nosniff\r\nX-Frame-Options: SAMEORIGIN\r\nX-Xss-Protection: 0\r\n\r\n{\n  \"error\": {\n    \"code\": 401,\n    \"message\": \"API keys are not supported by this API. Expected OAuth2 access token or other authentication credentials that assert a principal. See https://cloud.google.com/docs/authentication\",\n    \"status\": \"UNAUTHENTICATED\",\n    \"details\": [\n      {\n        \"@type\": \"type.googleapis.com/google.rpc.DebugInfo\",\n        \"detail\": \"Request is missing required authentication credential. Expected OAuth 2 access token, login cookie or other valid authentication credential. See https://developers.google.com/identity/sign-in/web/devconsole-project.\"\n      },\n      {\n        \"@type\": \"type.googleapis.com/google.rpc.ErrorInfo\",\n        \"reason\": \"CREDENTIALS_MISSING\",\n        \"domain\": \"googleapis.com\",\n        \"metadata\": {\n          \"method\": \"google.cloud.aiplatform.v1beta1.PredictionService.GenerateContent\",\n          \"service\": \"aiplatform.googleapis.com\"\n        }\n      }\n    ]\n  }\n}\n"
  },
  {
    "path": "model/llm.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Package model defines the interfaces and data structures for interacting with LLMs.\npackage model\n\nimport (\n\t\"context\"\n\t\"iter\"\n\n\t\"google.golang.org/genai\"\n)\n\n// LLM provides the access to the underlying LLM.\ntype LLM interface {\n\tName() string\n\tGenerateContent(ctx context.Context, req *LLMRequest, stream bool) iter.Seq2[*LLMResponse, error]\n}\n\n// LLMRequest is the raw LLM request.\ntype LLMRequest struct {\n\tModel    string\n\tContents []*genai.Content\n\tConfig   *genai.GenerateContentConfig\n\n\tTools map[string]any `json:\"-\"`\n}\n\n// LLMResponse is the raw LLM response.\n// It provides the first candidate response from the model if available.\ntype LLMResponse struct {\n\tContent           *genai.Content\n\tCitationMetadata  *genai.CitationMetadata\n\tGroundingMetadata *genai.GroundingMetadata\n\tUsageMetadata     *genai.GenerateContentResponseUsageMetadata\n\tCustomMetadata    map[string]any\n\tLogprobsResult    *genai.LogprobsResult\n\tModelVersion      string\n\t// Partial indicates whether the content is part of a unfinished content stream.\n\t// Only used for streaming mode and when the content is plain text.\n\t// The Runner fully processes only the final non-partial event, partial\n\t// events are simply forwarded downstream (eg. to UI for display).\n\tPartial bool\n\t// Indicates whether the response from the model is complete.\n\t// Only used for streaming mode.\n\tTurnComplete bool\n\t// Flag indicating that LLM was interrupted when generating the content.\n\t// Usually it is due to user interruption during a bidi streaming.\n\tInterrupted  bool\n\tErrorCode    string\n\tErrorMessage string\n\tFinishReason genai.FinishReason\n\tAvgLogprobs  float64\n}\n"
  },
  {
    "path": "model/llm_test.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage model_test\n\nimport (\n\t\"reflect\"\n\t\"testing\"\n\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/internal/llminternal/converters\"\n\t\"google.golang.org/adk/model\"\n)\n\nconst (\n\tFinishReasonStop       genai.FinishReason = \"STOP\"\n\tFinishReasonSafety     genai.FinishReason = \"SAFETY\"\n\tFinishReasonRecitation genai.FinishReason = \"RECITATION\"\n)\n\nconst (\n\tBlockedReasonSafety genai.BlockedReason = \"SAFETY\"\n)\n\nfunc TestCreateResponse(t *testing.T) {\n\t// Pre-defined complex structs for reuse\n\temptyLogprobs := &genai.LogprobsResult{\n\t\tChosenCandidates: []*genai.LogprobsResultCandidate{},\n\t\tTopCandidates:    []*genai.LogprobsResultTopCandidates{},\n\t}\n\tconcreteLogprobs := &genai.LogprobsResult{\n\t\tChosenCandidates: []*genai.LogprobsResultCandidate{\n\t\t\t{Token: \"The\", LogProbability: -0.1, TokenID: 123},\n\t\t\t{Token: \" capital\", LogProbability: -0.5, TokenID: 456},\n\t\t\t{Token: \" of\", LogProbability: -0.2, TokenID: 789},\n\t\t},\n\t\tTopCandidates: []*genai.LogprobsResultTopCandidates{\n\t\t\t{Candidates: []*genai.LogprobsResultCandidate{{Token: \"The\"}, {Token: \"A\"}, {Token: \"This\"}}},\n\t\t\t{Candidates: []*genai.LogprobsResultCandidate{{Token: \" capital\"}, {Token: \" city\"}, {Token: \" main\"}}},\n\t\t},\n\t}\n\tpartialLogprobs := &genai.LogprobsResult{\n\t\tChosenCandidates: []*genai.LogprobsResultCandidate{\n\t\t\t{Token: \"Hello\", LogProbability: -0.05, TokenID: 111},\n\t\t\t{Token: \" world\", LogProbability: -0.8, TokenID: 222},\n\t\t},\n\t\tTopCandidates: []*genai.LogprobsResultTopCandidates{},\n\t}\n\tcitationMeta := &genai.CitationMetadata{\n\t\tCitations: []*genai.Citation{{StartIndex: 0, EndIndex: 10, URI: \"https://example.com\"}},\n\t}\n\n\ttestCases := []struct {\n\t\tname  string\n\t\tinput genai.GenerateContentResponse\n\t\twant  model.LLMResponse\n\t}{\n\t\t{\n\t\t\tname: \"CreateWithLogprobs\",\n\t\t\tinput: genai.GenerateContentResponse{\n\t\t\t\tCandidates: []*genai.Candidate{{\n\t\t\t\t\tContent:        &genai.Content{Parts: []*genai.Part{{Text: \"Response text\"}}},\n\t\t\t\t\tFinishReason:   FinishReasonStop,\n\t\t\t\t\tAvgLogprobs:    -0.75,\n\t\t\t\t\tLogprobsResult: emptyLogprobs,\n\t\t\t\t}},\n\t\t\t},\n\t\t\twant: model.LLMResponse{\n\t\t\t\tContent:        &genai.Content{Parts: []*genai.Part{{Text: \"Response text\"}}},\n\t\t\t\tFinishReason:   FinishReasonStop,\n\t\t\t\tAvgLogprobs:    -0.75,\n\t\t\t\tLogprobsResult: emptyLogprobs,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"CreateWithoutLogprobs\",\n\t\t\tinput: genai.GenerateContentResponse{\n\t\t\t\tCandidates: []*genai.Candidate{{\n\t\t\t\t\tContent:      &genai.Content{Parts: []*genai.Part{{Text: \"Response text\"}}},\n\t\t\t\t\tFinishReason: FinishReasonStop,\n\t\t\t\t}},\n\t\t\t},\n\t\t\twant: model.LLMResponse{\n\t\t\t\tContent:      &genai.Content{Parts: []*genai.Part{{Text: \"Response text\"}}},\n\t\t\t\tFinishReason: FinishReasonStop,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"CreateErrorCaseWithLogprobs\",\n\t\t\tinput: genai.GenerateContentResponse{\n\t\t\t\tCandidates: []*genai.Candidate{{\n\t\t\t\t\tFinishReason:  FinishReasonSafety,\n\t\t\t\t\tFinishMessage: \"Safety filter triggered\",\n\t\t\t\t\tAvgLogprobs:   -2.1,\n\t\t\t\t}},\n\t\t\t},\n\t\t\twant: model.LLMResponse{\n\t\t\t\tErrorCode:    string(FinishReasonSafety),\n\t\t\t\tErrorMessage: \"Safety filter triggered\",\n\t\t\t\tAvgLogprobs:  -2.1,\n\t\t\t\tFinishReason: FinishReasonSafety,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"CreateNoCandidates\",\n\t\t\tinput: genai.GenerateContentResponse{\n\t\t\t\tCandidates: []*genai.Candidate{},\n\t\t\t\tPromptFeedback: &genai.GenerateContentResponsePromptFeedback{\n\t\t\t\t\tBlockReason:        BlockedReasonSafety,\n\t\t\t\t\tBlockReasonMessage: \"Prompt blocked for safety\",\n\t\t\t\t},\n\t\t\t},\n\t\t\twant: model.LLMResponse{\n\t\t\t\tErrorCode:    string(BlockedReasonSafety),\n\t\t\t\tErrorMessage: \"Prompt blocked for safety\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"CreateWithConcreteLogprobsResult\",\n\t\t\tinput: genai.GenerateContentResponse{\n\t\t\t\tCandidates: []*genai.Candidate{{\n\t\t\t\t\tContent:        &genai.Content{Parts: []*genai.Part{{Text: \"The capital of France is Paris.\"}}},\n\t\t\t\t\tFinishReason:   FinishReasonStop,\n\t\t\t\t\tAvgLogprobs:    -0.27,\n\t\t\t\t\tLogprobsResult: concreteLogprobs,\n\t\t\t\t}},\n\t\t\t},\n\t\t\twant: model.LLMResponse{\n\t\t\t\tContent:        &genai.Content{Parts: []*genai.Part{{Text: \"The capital of France is Paris.\"}}},\n\t\t\t\tFinishReason:   FinishReasonStop,\n\t\t\t\tAvgLogprobs:    -0.27,\n\t\t\t\tLogprobsResult: concreteLogprobs,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"CreateWithPartial*genai.LogprobsResult\",\n\t\t\tinput: genai.GenerateContentResponse{\n\t\t\t\tCandidates: []*genai.Candidate{{\n\t\t\t\t\tContent:        &genai.Content{Parts: []*genai.Part{{Text: \"Hello world\"}}},\n\t\t\t\t\tFinishReason:   FinishReasonStop,\n\t\t\t\t\tAvgLogprobs:    -0.425,\n\t\t\t\t\tLogprobsResult: partialLogprobs,\n\t\t\t\t}},\n\t\t\t},\n\t\t\twant: model.LLMResponse{\n\t\t\t\tContent:        &genai.Content{Parts: []*genai.Part{{Text: \"Hello world\"}}},\n\t\t\t\tFinishReason:   FinishReasonStop,\n\t\t\t\tAvgLogprobs:    -0.425,\n\t\t\t\tLogprobsResult: partialLogprobs,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"CreateWithCitationMetadata\",\n\t\t\tinput: genai.GenerateContentResponse{\n\t\t\t\tCandidates: []*genai.Candidate{{\n\t\t\t\t\tContent:          &genai.Content{Parts: []*genai.Part{{Text: \"Response text\"}}},\n\t\t\t\t\tFinishReason:     FinishReasonStop,\n\t\t\t\t\tCitationMetadata: citationMeta,\n\t\t\t\t}},\n\t\t\t},\n\t\t\twant: model.LLMResponse{\n\t\t\t\tContent:          &genai.Content{Parts: []*genai.Part{{Text: \"Response text\"}}},\n\t\t\t\tFinishReason:     FinishReasonStop,\n\t\t\t\tCitationMetadata: citationMeta,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"CreateWithoutCitationMetadata\",\n\t\t\tinput: genai.GenerateContentResponse{\n\t\t\t\tCandidates: []*genai.Candidate{{\n\t\t\t\t\tContent:      &genai.Content{Parts: []*genai.Part{{Text: \"Response text\"}}},\n\t\t\t\t\tFinishReason: FinishReasonStop,\n\t\t\t\t}},\n\t\t\t},\n\t\t\twant: model.LLMResponse{\n\t\t\t\tContent:      &genai.Content{Parts: []*genai.Part{{Text: \"Response text\"}}},\n\t\t\t\tFinishReason: FinishReasonStop,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"CreateErrorCaseWithCitationMetadata\",\n\t\t\tinput: genai.GenerateContentResponse{\n\t\t\t\tCandidates: []*genai.Candidate{{\n\t\t\t\t\tFinishReason:     FinishReasonRecitation,\n\t\t\t\t\tFinishMessage:    \"Response blocked due to recitation triggered\",\n\t\t\t\t\tCitationMetadata: citationMeta,\n\t\t\t\t}},\n\t\t\t},\n\t\t\twant: model.LLMResponse{\n\t\t\t\tErrorCode:        string(FinishReasonRecitation),\n\t\t\t\tErrorMessage:     \"Response blocked due to recitation triggered\",\n\t\t\t\tCitationMetadata: citationMeta,\n\t\t\t\tFinishReason:     FinishReasonRecitation,\n\t\t\t},\n\t\t},\n\t}\n\n\tfor _, tc := range testCases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\tgot := converters.Genai2LLMResponse(&tc.input)\n\n\t\t\tif tc.want.AvgLogprobs != got.AvgLogprobs {\n\t\t\t\tt.Errorf(\"AvgLogprobs mismatch: want %f, got %f\", tc.want.AvgLogprobs, got.AvgLogprobs)\n\t\t\t}\n\n\t\t\tif got.ErrorCode != tc.want.ErrorCode {\n\t\t\t\tt.Errorf(\"ErrorCode mismatch: want %v, got %v\", tc.want.ErrorCode, got.ErrorCode)\n\t\t\t}\n\n\t\t\tif got.ErrorMessage != tc.want.ErrorMessage {\n\t\t\t\tt.Errorf(\"ErrorMessage mismatch: want '%s', got '%s'\", tc.want.ErrorMessage, got.ErrorMessage)\n\t\t\t}\n\n\t\t\tif got.FinishReason != tc.want.FinishReason {\n\t\t\t\tt.Errorf(\"FinishReason mismatch: want %s, got %s\", tc.want.FinishReason, got.FinishReason)\n\t\t\t}\n\n\t\t\t// Use DeepEqual for complex nested structs\n\t\t\tif !reflect.DeepEqual(got.Content, tc.want.Content) {\n\t\t\t\tt.Errorf(\"Content mismatch: want %+v, got %+v\", tc.want.Content, got.Content)\n\t\t\t}\n\n\t\t\tif !reflect.DeepEqual(got.LogprobsResult, tc.want.LogprobsResult) {\n\t\t\t\tt.Errorf(\"*genai.LogprobsResult mismatch: want %+v, got %+v\", tc.want.LogprobsResult, got.LogprobsResult)\n\t\t\t}\n\n\t\t\tif !reflect.DeepEqual(got.CitationMetadata, tc.want.CitationMetadata) {\n\t\t\t\tt.Errorf(\"CitationMetadata mismatch: want %+v, got %+v\", tc.want.CitationMetadata, got.CitationMetadata)\n\t\t\t}\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "plugin/functioncallmodifier/integration_test.go",
    "content": "// Copyright 2026 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage functioncallmodifier_test\n\nimport (\n\t\"fmt\"\n\t\"path/filepath\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/agent\"\n\t\"google.golang.org/adk/agent/llmagent\"\n\t\"google.golang.org/adk/internal/testutil\"\n\t\"google.golang.org/adk/model/gemini\"\n\t\"google.golang.org/adk/plugin\"\n\t\"google.golang.org/adk/plugin/functioncallmodifier\"\n\t\"google.golang.org/adk/runner\"\n\t\"google.golang.org/adk/session\"\n\t\"google.golang.org/adk/tool\"\n\t\"google.golang.org/adk/tool/agenttool\"\n\t\"google.golang.org/adk/tool/functiontool\"\n)\n\n//go:generate go test -v -httprecord=testdata/.*\\.httprr\n\nfunc TestPluginCallbackIntegration(t *testing.T) {\n\tfunctionTool, err := functiontool.New(functiontool.Config{\n\t\tName: \"other_tool\",\n\t}, okFunc)\n\tif err != nil {\n\t\tt.Fatalf(\"functiontool.New failed: %v\", err)\n\t}\n\n\ttestCases := []struct {\n\t\tname                     string\n\t\ttools                    func(agent.Agent) []tool.Tool\n\t\twantSkillStateValue      string\n\t\twantRationaleStateValue  string\n\t\tshouldHaveSkillState     bool\n\t\tshouldHaveRationaleState bool\n\t}{\n\t\t{\n\t\t\tname:                     \"no relevant tools\",\n\t\t\ttools:                    func(a agent.Agent) []tool.Tool { return []tool.Tool{functionTool} },\n\t\t\tshouldHaveSkillState:     false,\n\t\t\tshouldHaveRationaleState: false,\n\t\t},\n\t\t{\n\t\t\tname: \"agent tool default schema\",\n\t\t\ttools: func(a agent.Agent) []tool.Tool {\n\t\t\t\tagentToolDefault := agenttool.New(a, nil)\n\t\t\t\treturn []tool.Tool{agentToolDefault}\n\t\t\t},\n\t\t\twantSkillStateValue:      \"add\",\n\t\t\twantRationaleStateValue:  \"The user wants to add two numbers, and the calculator tool has an 'add' skill that can perform this operation. Providing the request as '2+2' and explicitly setting the skill_id to 'add' should allow the calculator to correctly perform the addition.\",\n\t\t\tshouldHaveSkillState:     true,\n\t\t\tshouldHaveRationaleState: true,\n\t\t},\n\t\t{\n\t\t\tname:                     \"transfer to agent tool\",\n\t\t\ttools:                    func(a agent.Agent) []tool.Tool { return []tool.Tool{} },\n\t\t\twantSkillStateValue:      \"add\",\n\t\t\twantRationaleStateValue:  \"The user is asking to add two numbers, and the calculator agent has an add skill.\",\n\t\t\tshouldHaveSkillState:     true,\n\t\t\tshouldHaveRationaleState: true,\n\t\t},\n\t}\n\n\tfor _, tc := range testCases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\thttpRecordFilename := filepath.Join(\"testdata\", strings.ReplaceAll(t.Name(), \"/\", \"_\")+\".httprr\")\n\n\t\t\tmodel, err := gemini.NewModel(t.Context(), \"gemini-2.5-flash\", testutil.NewGeminiTestClientConfig(t, httpRecordFilename))\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"gemini.NewModel failed: %v\", err)\n\t\t\t}\n\n\t\t\tcalc, err := llmagent.New(llmagent.Config{\n\t\t\t\tName:        \"calculator\",\n\t\t\t\tDescription: \"calculator agent\\n Skills: add, subtract, multiply, divide\",\n\t\t\t\tInstruction: \"You are a calculator agent. You can calculate numbers.\",\n\t\t\t\tModel:       model,\n\t\t\t})\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"NewLLMAgent calculator failed: %v\", err)\n\t\t\t}\n\n\t\t\ttools := tc.tools(calc)\n\t\t\tsubAgents := []agent.Agent{}\n\t\t\tif len(tools) == 0 {\n\t\t\t\tsubAgents = append(subAgents, calc)\n\t\t\t}\n\n\t\t\ta, err := llmagent.New(llmagent.Config{\n\t\t\t\tName:        \"transfer_agent\",\n\t\t\t\tDescription: \"transfer agent\",\n\t\t\t\tInstruction: \"You are a transfer agent. You can transfer to other agents using your tools.\",\n\t\t\t\tModel:       model,\n\t\t\t\tTools:       tools,\n\t\t\t\tSubAgents:   subAgents,\n\t\t\t})\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"NewLLMAgent failed: %v\", err)\n\t\t\t}\n\n\t\t\tfunctionCallModifierPlugin, err := functioncallmodifier.NewPlugin(functioncallmodifier.FunctionCallModifierConfig{\n\t\t\t\tPredicate: func(toolName string) bool {\n\t\t\t\t\treturn toolName == \"transfer_to_agent\" || toolName == \"calculator\"\n\t\t\t\t},\n\t\t\t\tArgs: map[string]*genai.Schema{\n\t\t\t\t\t\"skill_id\": {\n\t\t\t\t\t\tDescription: \"The specific skill to be utilized by the agent.\",\n\t\t\t\t\t\tType:        \"STRING\",\n\t\t\t\t\t},\n\t\t\t\t\t\"rationale\": {\n\t\t\t\t\t\tDescription: \"The reasoning behind selecting this agent and skill.\",\n\t\t\t\t\t\tType:        \"STRING\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tOverrideDescription: func(originalDescription string) string {\n\t\t\t\t\treturn fmt.Sprintf(\"This tool can now optionally accept skill_id and rationale parameters to guide skill-based orchestration. %s\", originalDescription)\n\t\t\t\t},\n\t\t\t})\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"New plugin failed: %v\", err)\n\t\t\t}\n\n\t\t\tpluginConfig := runner.PluginConfig{\n\t\t\t\tPlugins: []*plugin.Plugin{functionCallModifierPlugin},\n\t\t\t}\n\n\t\t\tappName := \"test_app\"\n\t\t\tsessionService := session.InMemoryService()\n\n\t\t\t_, err = sessionService.Create(t.Context(), &session.CreateRequest{\n\t\t\t\tAppName:   appName,\n\t\t\t\tUserID:    \"id\",\n\t\t\t\tSessionID: \"test_session\",\n\t\t\t})\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"sessionService.Create failed: %v\", err)\n\t\t\t}\n\n\t\t\tr, err := runner.New(runner.Config{\n\t\t\t\tAppName:        appName,\n\t\t\t\tAgent:          a,\n\t\t\t\tSessionService: sessionService,\n\t\t\t\tPluginConfig:   pluginConfig,\n\t\t\t})\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"NewRunner failed: %v\", err)\n\t\t\t}\n\n\t\t\tmsg := genai.NewContentFromText(\"Can you add 2 and 2?\", \"user\")\n\n\t\t\tstream := r.Run(t.Context(), \"id\", \"test_session\", msg, agent.RunConfig{StreamingMode: agent.StreamingModeNone})\n\t\t\tevents, err := testutil.CollectEvents(stream)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"CollectEvents failed: %v\", err)\n\t\t\t}\n\n\t\t\tfcId := \"\"\n\n\t\t\t// check function calls don't include skill_id and rationale\n\t\t\tfor _, event := range events {\n\t\t\t\tfor _, part := range event.Content.Parts {\n\t\t\t\t\tif part.FunctionCall != nil {\n\t\t\t\t\t\tfc := part.FunctionCall\n\t\t\t\t\t\tif fc.Args[\"skill_id\"] != nil || fc.Args[\"rationale\"] != nil {\n\t\t\t\t\t\t\tt.Errorf(\"function call includes skill_id or rationale: %v\", fc)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tfcId = fc.ID\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// check if state includes skill_id and rationale\n\t\t\tresp, err := sessionService.Get(t.Context(), &session.GetRequest{\n\t\t\t\tAppName:   appName,\n\t\t\t\tUserID:    \"id\",\n\t\t\t\tSessionID: \"test_session\",\n\t\t\t})\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"sessionService.Get failed: %v\", err)\n\t\t\t}\n\n\t\t\tskillIdKey := fmt.Sprintf(\"%s/skill_id\", fcId)\n\t\t\tskillId, err := resp.Session.State().Get(skillIdKey)\n\t\t\tif tc.shouldHaveSkillState {\n\t\t\t\tif err != nil {\n\t\t\t\t\tt.Fatalf(\"State().Get(%q) unexpected error: %v\", skillIdKey, err)\n\t\t\t\t}\n\t\t\t\tif skillId != tc.wantSkillStateValue {\n\t\t\t\t\tt.Errorf(\"want skill_id %q, got %q\", tc.wantSkillStateValue, skillId)\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err == nil {\n\t\t\t\t\tt.Errorf(\"unexpectedly found skill_id in state with value: %q\", skillId)\n\t\t\t\t} else if err != session.ErrStateKeyNotExist {\n\t\t\t\t\tt.Fatalf(\"State().Get(%q) unexpected error when expecting key not to exist: %v\", skillIdKey, err)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\trationaleKey := fmt.Sprintf(\"%s/rationale\", fcId)\n\t\t\trationale, err := resp.Session.State().Get(rationaleKey)\n\t\t\tif tc.shouldHaveRationaleState {\n\t\t\t\tif err != nil {\n\t\t\t\t\tt.Fatalf(\"State().Get(%q) unexpected error: %v\", rationaleKey, err)\n\t\t\t\t}\n\t\t\t\tif rationale != tc.wantRationaleStateValue {\n\t\t\t\t\tt.Errorf(\"want rationale %q, got %q\", tc.wantRationaleStateValue, rationale)\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err == nil {\n\t\t\t\t\tt.Errorf(\"unexpectedly found rationale in state with value: %q\", rationale)\n\t\t\t\t} else if err != session.ErrStateKeyNotExist {\n\t\t\t\t\tt.Fatalf(\"State().Get(%q) unexpected error when expecting key not to exist: %v\", rationaleKey, err)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "plugin/functioncallmodifier/plugin.go",
    "content": "// Copyright 2026 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Package functioncallmodifier provides a plugin to modify function calls.\npackage functioncallmodifier\n\nimport (\n\t\"fmt\"\n\t\"maps\"\n\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/agent\"\n\t\"google.golang.org/adk/model\"\n\t\"google.golang.org/adk/plugin\"\n)\n\ntype FunctionCallModifierConfig struct {\n\tPredicate           func(toolName string) bool\n\tArgs                map[string]*genai.Schema\n\tOverrideDescription func(originalDescription string) string\n}\n\n// NewPlugin creates a FunctionCallModifierPlugin.\nfunc NewPlugin(cfg FunctionCallModifierConfig) (*plugin.Plugin, error) {\n\treturn plugin.New(plugin.Config{\n\t\tName:                \"FunctionCallModifierPlugin\",\n\t\tBeforeModelCallback: beforeModelCallback(cfg),\n\t\tAfterModelCallback:  afterModelCallback(cfg),\n\t})\n}\n\n// MustNewPlugin is like NewPlugin but panics if there is an error.\nfunc MustNewPlugin(cfg FunctionCallModifierConfig) *plugin.Plugin {\n\tp, err := NewPlugin(cfg)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn p\n}\n\nfunc beforeModelCallback(cfg FunctionCallModifierConfig) func(agent.CallbackContext, *model.LLMRequest) (*model.LLMResponse, error) {\n\treturn func(ctx agent.CallbackContext, req *model.LLMRequest) (*model.LLMResponse, error) {\n\t\tif req.Config == nil || len(req.Config.Tools) == 0 {\n\t\t\treturn nil, nil\n\t\t}\n\n\t\tfor _, tool := range req.Config.Tools {\n\t\t\tif tool.FunctionDeclarations == nil {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tfor _, decl := range tool.FunctionDeclarations {\n\t\t\t\t_, exists := req.Tools[decl.Name]\n\t\t\t\tif !exists {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\n\t\t\t\tshouldAddArgs := cfg.Predicate(decl.Name)\n\n\t\t\t\tif shouldAddArgs {\n\t\t\t\t\tif decl.Parameters == nil {\n\t\t\t\t\t\tdecl.Parameters = &genai.Schema{Type: \"OBJECT\", Properties: map[string]*genai.Schema{}}\n\t\t\t\t\t}\n\t\t\t\t\tif decl.Parameters.Properties == nil {\n\t\t\t\t\t\tdecl.Parameters.Properties = map[string]*genai.Schema{}\n\t\t\t\t\t}\n\n\t\t\t\t\tmaps.Copy(decl.Parameters.Properties, cfg.Args)\n\n\t\t\t\t\tif cfg.OverrideDescription != nil {\n\t\t\t\t\t\tdecl.Description = cfg.OverrideDescription(decl.Description)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn nil, nil\n\t}\n}\n\nfunc afterModelCallback(cfg FunctionCallModifierConfig) func(agent.CallbackContext, *model.LLMResponse, error) (*model.LLMResponse, error) {\n\treturn func(ctx agent.CallbackContext, llmResponse *model.LLMResponse, llmResponseError error) (*model.LLMResponse, error) {\n\t\tif llmResponseError != nil {\n\t\t\treturn nil, llmResponseError // Pass through error\n\t\t}\n\t\tif llmResponse == nil || llmResponse.Content == nil || len(llmResponse.Content.Parts) == 0 {\n\t\t\treturn llmResponse, nil // No function calls to process\n\t\t}\n\n\t\tfor _, part := range llmResponse.Content.Parts {\n\t\t\tif fc := part.FunctionCall; fc != nil {\n\t\t\t\tif !cfg.Predicate(fc.Name) {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tfor name := range cfg.Args {\n\t\t\t\t\targ, hasArg := fc.Args[name]\n\t\t\t\t\tif !hasArg {\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\t\t\t\t\tdelete(fc.Args, name)\n\t\t\t\t\tstateKey := fmt.Sprintf(\"%s/%s\", fc.ID, name)\n\t\t\t\t\tif err := ctx.State().Set(stateKey, arg); err != nil {\n\t\t\t\t\t\treturn nil, fmt.Errorf(\"failed to set state: %w\", err)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn nil, nil\n\t}\n}\n"
  },
  {
    "path": "plugin/functioncallmodifier/plugin_test.go",
    "content": "// Copyright 2026 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage functioncallmodifier_test\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"maps\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/google/go-cmp/cmp\"\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/agent\"\n\ticontext \"google.golang.org/adk/internal/context\"\n\t\"google.golang.org/adk/internal/llminternal\"\n\t\"google.golang.org/adk/internal/toolinternal\"\n\t\"google.golang.org/adk/model\"\n\t\"google.golang.org/adk/plugin/functioncallmodifier\"\n\t\"google.golang.org/adk/session\"\n\t\"google.golang.org/adk/tool\"\n\t\"google.golang.org/adk/tool/agenttool\"\n\t\"google.golang.org/adk/tool/functiontool\"\n)\n\ntype SimpleArgs struct {\n\tNum int\n}\n\nfunc okFunc(_ tool.Context, _ SimpleArgs) (string, error) {\n\treturn \"ok\", nil\n}\n\nfunc TestBeforeModelCallback(t *testing.T) {\n\tinvCtx := icontext.NewInvocationContext(t.Context(), icontext.InvocationContextParams{})\n\tctx := icontext.NewCallbackContextWithDelta(invCtx, nil, nil)\n\n\ttransferTool := &llminternal.TransferToAgentTool{}\n\ttransferToolDecl := transferTool.Declaration()\n\n\tagentToolDefault := createAgentTool(t, \"agent_default\", \"desc\", nil)\n\tagentToolDefaultDecl := agentToolDefault.(toolinternal.FunctionTool).Declaration()\n\tfunctionTool, err := functiontool.New(functiontool.Config{\n\t\tName: \"other_tool\",\n\t}, okFunc)\n\tif err != nil {\n\t\tt.Fatalf(\"functiontool.New failed: %v\", err)\n\t}\n\n\ttestCases := []struct {\n\t\tname       string\n\t\treq        *model.LLMRequest\n\t\twantParams map[string]bool\n\t\tcheckTools []string\n\t}{\n\t\t{\n\t\t\tname: \"no relevant tools\",\n\t\t\treq: &model.LLMRequest{\n\t\t\t\tConfig: &genai.GenerateContentConfig{\n\t\t\t\t\tTools: []*genai.Tool{{\n\t\t\t\t\t\tFunctionDeclarations: []*genai.FunctionDeclaration{{Name: \"other_tool\"}},\n\t\t\t\t\t}},\n\t\t\t\t},\n\t\t\t\tTools: map[string]any{\"other_tool\": functionTool},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"agent tool default schema\",\n\t\t\treq: &model.LLMRequest{\n\t\t\t\tConfig: &genai.GenerateContentConfig{\n\t\t\t\t\tTools: []*genai.Tool{{\n\t\t\t\t\t\tFunctionDeclarations: []*genai.FunctionDeclaration{agentToolDefaultDecl},\n\t\t\t\t\t}},\n\t\t\t\t},\n\t\t\t\tTools: map[string]any{\"agent_default\": agentToolDefault},\n\t\t\t},\n\t\t\twantParams: map[string]bool{\"request\": true, \"skill_id\": true, \"rationale\": true},\n\t\t\tcheckTools: []string{\"agent_default\"},\n\t\t},\n\t\t{\n\t\t\tname: \"transfer to agent tool\",\n\t\t\treq: &model.LLMRequest{\n\t\t\t\tConfig: &genai.GenerateContentConfig{\n\t\t\t\t\tTools: []*genai.Tool{{\n\t\t\t\t\t\tFunctionDeclarations: []*genai.FunctionDeclaration{transferToolDecl},\n\t\t\t\t\t}},\n\t\t\t\t},\n\t\t\t\tTools: map[string]any{\"transfer_to_agent\": transferTool},\n\t\t\t},\n\t\t\twantParams: map[string]bool{\"agent_name\": true, \"skill_id\": true, \"rationale\": true},\n\t\t\tcheckTools: []string{\"transfer_to_agent\"},\n\t\t},\n\t}\n\n\tfor _, tc := range testCases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\tplugin, err := functioncallmodifier.NewPlugin(functioncallmodifier.FunctionCallModifierConfig{\n\t\t\t\tPredicate: func(toolName string) bool {\n\t\t\t\t\treturn toolName == \"transfer_to_agent\" || toolName == \"agent_default\"\n\t\t\t\t},\n\t\t\t\tArgs: map[string]*genai.Schema{\n\t\t\t\t\t\"skill_id\": {\n\t\t\t\t\t\tDescription: \"The specific skill to be utilized by the agent.\",\n\t\t\t\t\t\tType:        \"STRING\",\n\t\t\t\t\t},\n\t\t\t\t\t\"rationale\": {\n\t\t\t\t\t\tDescription: \"The reasoning behind selecting this agent and skill.\",\n\t\t\t\t\t\tType:        \"STRING\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tOverrideDescription: func(originalDescription string) string {\n\t\t\t\t\treturn fmt.Sprintf(\"This tool can now optionally accept skill_id and rationale parameters to guide skill-based orchestration. %s\", originalDescription)\n\t\t\t\t},\n\t\t\t})\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"New plugin failed: %v\", err)\n\t\t\t}\n\t\t\t// Clone req to avoid modification across test cases\n\t\t\tcurrentReq := cloneLLMRequest(t, tc.req)\n\n\t\t\tbeforeModelCallback := plugin.BeforeModelCallback()\n\t\t\tif _, err := beforeModelCallback(ctx, currentReq); err != nil {\n\t\t\t\tt.Fatalf(\"BeforeModelCallback failed: %v\", err)\n\t\t\t}\n\n\t\t\tfor _, toolName := range tc.checkTools {\n\t\t\t\tdecl := findDeclaration(currentReq, toolName)\n\t\t\t\tif decl == nil {\n\t\t\t\t\tt.Errorf(\"Tool %s: Declaration not found in request\", toolName)\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\n\t\t\t\tif len(decl.Parameters.Properties) != len(tc.wantParams) {\n\t\t\t\t\tt.Errorf(\"Tool %s: Expected %d parameters, got %d\", toolName, len(tc.wantParams), len(decl.Parameters.Properties))\n\t\t\t\t}\n\t\t\t\tparams := make(map[string]bool)\n\t\t\t\tfor k := range decl.Parameters.Properties {\n\t\t\t\t\tparams[k] = true\n\t\t\t\t}\n\t\t\t\tif diff := cmp.Diff(tc.wantParams, params); diff != \"\" {\n\t\t\t\t\tt.Errorf(\"Tool %s: Parameter mismatch (-want +got):\\n%s\", toolName, diff)\n\t\t\t\t}\n\n\t\t\t\tif !strings.Contains(decl.Description, \"skill-based orchestration\") {\n\t\t\t\t\tt.Errorf(\"Tool %s: Description not updated\", toolName)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestAfterModelCallback(t *testing.T) {\n\ttestCases := []struct {\n\t\tname                     string\n\t\tcontent                  *genai.Content\n\t\toriginalDecls            map[string]*genai.FunctionDeclaration\n\t\twantArgs                 map[string]any\n\t\twantSkillStateKey        string\n\t\twantSkillStateValue      string\n\t\twantRationaleStateKey    string\n\t\twantRationaleStateValue  string\n\t\tshouldHaveSkillState     bool\n\t\tshouldHaveRationaleState bool\n\t}{\n\t\t{\n\t\t\tname:                     \"no function calls\",\n\t\t\tcontent:                  &genai.Content{Parts: []*genai.Part{{Text: \"hello\"}}},\n\t\t\toriginalDecls:            map[string]*genai.FunctionDeclaration{},\n\t\t\tshouldHaveSkillState:     false,\n\t\t\tshouldHaveRationaleState: false,\n\t\t},\n\t\t{\n\t\t\tname:                     \"unmodified function call\",\n\t\t\tcontent:                  &genai.Content{Parts: []*genai.Part{{FunctionCall: &genai.FunctionCall{Name: \"other_tool\", Args: map[string]any{\"foo\": \"bar\"}}}}},\n\t\t\toriginalDecls:            map[string]*genai.FunctionDeclaration{},\n\t\t\twantArgs:                 map[string]any{\"foo\": \"bar\"},\n\t\t\tshouldHaveSkillState:     false,\n\t\t\tshouldHaveRationaleState: false,\n\t\t},\n\t\t{\n\t\t\tname:                     \"agent tool with skill and rationale\",\n\t\t\tcontent:                  &genai.Content{Parts: []*genai.Part{{FunctionCall: &genai.FunctionCall{ID: \"fcId\", Name: \"test_agent\", Args: map[string]any{\"request\": \"do\", \"skill_id\": \"s1\", \"rationale\": \"r1\"}}}}},\n\t\t\toriginalDecls:            map[string]*genai.FunctionDeclaration{\"test_agent\": {Name: \"test_agent\"}},\n\t\t\twantArgs:                 map[string]any{\"request\": \"do\"},\n\t\t\twantSkillStateKey:        \"fcId/skill_id\",\n\t\t\twantSkillStateValue:      \"s1\",\n\t\t\twantRationaleStateKey:    \"fcId/rationale\",\n\t\t\twantRationaleStateValue:  \"r1\",\n\t\t\tshouldHaveSkillState:     true,\n\t\t\tshouldHaveRationaleState: true,\n\t\t},\n\t\t{\n\t\t\tname:                     \"agent tool with only skill_id\",\n\t\t\tcontent:                  &genai.Content{Parts: []*genai.Part{{FunctionCall: &genai.FunctionCall{ID: \"fcId\", Name: \"test_agent\", Args: map[string]any{\"request\": \"do\", \"skill_id\": \"s1\"}}}}},\n\t\t\toriginalDecls:            map[string]*genai.FunctionDeclaration{\"test_agent\": {Name: \"test_agent\"}},\n\t\t\twantArgs:                 map[string]any{\"request\": \"do\"},\n\t\t\twantSkillStateKey:        \"fcId/skill_id\",\n\t\t\twantSkillStateValue:      \"s1\",\n\t\t\tshouldHaveSkillState:     true,\n\t\t\tshouldHaveRationaleState: false,\n\t\t},\n\t\t{\n\t\t\tname:                     \"agent tool without skill/rationale\",\n\t\t\tcontent:                  &genai.Content{Parts: []*genai.Part{{FunctionCall: &genai.FunctionCall{ID: \"fcId\", Name: \"test_agent\", Args: map[string]any{\"request\": \"do\"}}}}},\n\t\t\toriginalDecls:            map[string]*genai.FunctionDeclaration{\"test_agent\": {Name: \"test_agent\"}},\n\t\t\twantArgs:                 map[string]any{\"request\": \"do\"},\n\t\t\tshouldHaveSkillState:     false,\n\t\t\tshouldHaveRationaleState: false,\n\t\t},\n\t\t{\n\t\t\tname:                     \"transfer tool with skill and rationale\",\n\t\t\tcontent:                  &genai.Content{Parts: []*genai.Part{{FunctionCall: &genai.FunctionCall{ID: \"fcId\", Name: \"transfer_to_agent\", Args: map[string]any{\"agent_name\": \"a1\", \"skill_id\": \"s2\", \"rationale\": \"r2\"}}}}},\n\t\t\toriginalDecls:            map[string]*genai.FunctionDeclaration{\"transfer_to_agent\": {Name: \"transfer_to_agent\"}},\n\t\t\twantArgs:                 map[string]any{\"agent_name\": \"a1\"},\n\t\t\twantSkillStateKey:        \"fcId/skill_id\",\n\t\t\twantSkillStateValue:      \"s2\",\n\t\t\twantRationaleStateKey:    \"fcId/rationale\",\n\t\t\twantRationaleStateValue:  \"r2\",\n\t\t\tshouldHaveSkillState:     true,\n\t\t\tshouldHaveRationaleState: true,\n\t\t},\n\t}\n\n\tfor _, tc := range testCases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\tplugin, err := functioncallmodifier.NewPlugin(functioncallmodifier.FunctionCallModifierConfig{\n\t\t\t\tPredicate: func(toolName string) bool {\n\t\t\t\t\treturn toolName == \"transfer_to_agent\" || toolName == \"test_agent\"\n\t\t\t\t},\n\t\t\t\tArgs: map[string]*genai.Schema{\n\t\t\t\t\t\"skill_id\": {\n\t\t\t\t\t\tDescription: \"The specific skill to be utilized by the agent.\",\n\t\t\t\t\t\tType:        \"STRING\",\n\t\t\t\t\t},\n\t\t\t\t\t\"rationale\": {\n\t\t\t\t\t\tDescription: \"The reasoning behind selecting this agent and skill.\",\n\t\t\t\t\t\tType:        \"STRING\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tOverrideDescription: func(originalDescription string) string {\n\t\t\t\t\treturn fmt.Sprintf(\"This tool can now optionally accept skill_id and rationale parameters to guide skill-based orchestration. %s\", originalDescription)\n\t\t\t\t},\n\t\t\t})\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"New plugin failed: %v\", err)\n\t\t\t}\n\t\t\tservice := session.InMemoryService()\n\t\t\tsesResp, err := service.Create(context.Background(), &session.CreateRequest{AppName: \"test\", UserID: \"user\", SessionID: \"ses1\"})\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"Failed to create session: %v\", err)\n\t\t\t}\n\t\t\tinvCtx := icontext.NewInvocationContext(t.Context(), icontext.InvocationContextParams{\n\t\t\t\tSession: sesResp.Session,\n\t\t\t})\n\t\t\tctx := icontext.NewCallbackContextWithDelta(invCtx, nil, nil)\n\n\t\t\tafterModelCallback := plugin.AfterModelCallback()\n\t\t\tif _, err := afterModelCallback(ctx, &model.LLMResponse{Content: tc.content}, nil); err != nil {\n\t\t\t\tt.Fatalf(\"AfterModelCallback failed: %v\", err)\n\t\t\t}\n\n\t\t\t// Check if args are pruned\n\t\t\tif len(tc.content.Parts) > 0 {\n\t\t\t\tpart := tc.content.Parts[0]\n\t\t\t\tif part.FunctionCall != nil && tc.wantArgs != nil {\n\t\t\t\t\tif diff := cmp.Diff(tc.wantArgs, part.FunctionCall.Args); diff != \"\" {\n\t\t\t\t\t\tt.Errorf(\"Args mismatch (-want +got):\\n%s\", diff)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Check session state\n\t\t\tskillStateValue, err := sesResp.Session.State().Get(tc.wantSkillStateKey)\n\t\t\tif tc.shouldHaveSkillState {\n\t\t\t\tif err != nil {\n\t\t\t\t\tt.Errorf(\"State().Get(%q) unexpected error: %v\", tc.wantSkillStateKey, err)\n\t\t\t\t} else {\n\t\t\t\t\tgotState, ok := skillStateValue.(string)\n\t\t\t\t\tif !ok {\n\t\t\t\t\t\tt.Errorf(\"State value for key %s is not string: %T\", tc.wantSkillStateKey, skillStateValue)\n\t\t\t\t\t} else if diff := cmp.Diff(tc.wantSkillStateValue, gotState); diff != \"\" {\n\t\t\t\t\t\tt.Errorf(\"State value mismatch for key %s (-want +got):\\n%s\", tc.wantSkillStateKey, diff)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else { // Should NOT have state\n\t\t\t\tif tc.wantSkillStateKey != \"\" {\n\t\t\t\t\t_, err := sesResp.Session.State().Get(tc.wantSkillStateKey)\n\t\t\t\t\tif err == nil { // Key WAS found, which is unexpected\n\t\t\t\t\t\tt.Errorf(\"Unexpected state key %s found\", tc.wantSkillStateKey)\n\t\t\t\t\t} else if !errors.Is(err, session.ErrStateKeyNotExist) {\n\t\t\t\t\t\t// Unexpected error other than not existing\n\t\t\t\t\t\tt.Errorf(\"State().Get(%q) unexpected error when expecting key not to exist: %v\", tc.wantSkillStateKey, err)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\trationaleStateValue, err := sesResp.Session.State().Get(tc.wantRationaleStateKey)\n\t\t\tif tc.shouldHaveRationaleState {\n\t\t\t\tif err != nil {\n\t\t\t\t\tt.Errorf(\"State().Get(%q) unexpected error: %v\", tc.wantRationaleStateKey, err)\n\t\t\t\t} else {\n\t\t\t\t\tgotState, ok := rationaleStateValue.(string)\n\t\t\t\t\tif !ok {\n\t\t\t\t\t\tt.Errorf(\"State value for key %s is not string: %T\", tc.wantRationaleStateKey, rationaleStateValue)\n\t\t\t\t\t} else if diff := cmp.Diff(tc.wantRationaleStateValue, gotState); diff != \"\" {\n\t\t\t\t\t\tt.Errorf(\"State value mismatch for key %s (-want +got):\\n%s\", tc.wantRationaleStateKey, diff)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else { // Should NOT have state\n\t\t\t\tif tc.wantRationaleStateKey != \"\" {\n\t\t\t\t\t_, err := sesResp.Session.State().Get(tc.wantRationaleStateKey)\n\t\t\t\t\tif err == nil { // Key WAS found, which is unexpected\n\t\t\t\t\t\tt.Errorf(\"Unexpected state key %s found\", tc.wantRationaleStateKey)\n\t\t\t\t\t} else if !errors.Is(err, session.ErrStateKeyNotExist) {\n\t\t\t\t\t\t// Unexpected error other than not existing\n\t\t\t\t\t\tt.Errorf(\"State().Get(%q) unexpected error when expecting key not to exist: %v\", tc.wantRationaleStateKey, err)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n}\n\n// Mock agent for testing agenttool\ntype mockAgent struct {\n\tagent.Agent\n\tname        string\n\tdescription string\n\tinputSchema *genai.Schema\n}\n\nfunc (m *mockAgent) Name() string               { return m.name }\nfunc (m *mockAgent) Description() string        { return m.description }\nfunc (m *mockAgent) InputSchema() *genai.Schema { return m.inputSchema }\n\nfunc createAgentTool(t *testing.T, name, desc string, schema *genai.Schema) tool.Tool {\n\tt.Helper()\n\ttA := agenttool.New(&mockAgent{name: name, description: desc, inputSchema: schema}, nil)\n\n\treturn tA\n}\n\nfunc findDeclaration(req *model.LLMRequest, toolName string) *genai.FunctionDeclaration {\n\tif req.Config == nil {\n\t\treturn nil\n\t}\n\tfor _, tool := range req.Config.Tools {\n\t\tfor _, decl := range tool.FunctionDeclarations {\n\t\t\tif decl.Name == toolName {\n\t\t\t\treturn decl\n\t\t\t}\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc cloneLLMRequest(t *testing.T, req *model.LLMRequest) *model.LLMRequest {\n\tt.Helper()\n\tnewReq := &model.LLMRequest{\n\t\tTools: make(map[string]any),\n\t}\n\tif req.Config != nil {\n\t\tnewReq.Config = &genai.GenerateContentConfig{}\n\t\tfor _, tool := range req.Config.Tools {\n\t\t\tnewTool := &genai.Tool{}\n\t\t\tfor _, decl := range tool.FunctionDeclarations {\n\t\t\t\tnewDecl := *decl // Shallow copy of declaration\n\t\t\t\tif decl.Parameters != nil {\n\t\t\t\t\tnewParams := *decl.Parameters // Shallow copy of Schema\n\t\t\t\t\tnewParams.Properties = make(map[string]*genai.Schema)\n\t\t\t\t\tfor k, v := range decl.Parameters.Properties {\n\t\t\t\t\t\tprop := *v\n\t\t\t\t\t\tnewParams.Properties[k] = &prop\n\t\t\t\t\t}\n\t\t\t\t\tnewDecl.Parameters = &newParams\n\t\t\t\t}\n\t\t\t\tnewTool.FunctionDeclarations = append(newTool.FunctionDeclarations, &newDecl)\n\t\t\t}\n\t\t\tnewReq.Config.Tools = append(newReq.Config.Tools, newTool)\n\t\t}\n\t}\n\t// Shallow copy of tool instances\n\tmaps.Copy(newReq.Tools, req.Tools)\n\treturn newReq\n}\n"
  },
  {
    "path": "plugin/functioncallmodifier/testdata/TestPluginCallbackIntegration_agent_tool_default_schema.httprr",
    "content": "httprr trace v1\n1101 1715\nPOST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent HTTP/1.1\r\nHost: generativelanguage.googleapis.com\r\nUser-Agent: Go-http-client/1.1\r\nContent-Length: 869\r\nContent-Type: application/json\r\n\r\n{\"contents\":[{\"parts\":[{\"text\":\"Can you add 2 and 2?\"}],\"role\":\"user\"}],\"generationConfig\":{},\"systemInstruction\":{\"parts\":[{\"text\":\"You are a transfer agent. You can transfer to other agents using your tools.\\n\\nYou are an agent. Your internal name is \\\"transfer_agent\\\". The description about you is \\\"transfer agent\\\".\"}],\"role\":\"user\"},\"tools\":[{\"functionDeclarations\":[{\"description\":\"This tool can now optionally accept skill_id and rationale parameters to guide skill-based orchestration. calculator agent\\n Skills: add, subtract, multiply, divide\",\"name\":\"calculator\",\"parameters\":{\"properties\":{\"rationale\":{\"description\":\"The reasoning behind selecting this agent and skill.\",\"type\":\"STRING\"},\"request\":{\"type\":\"STRING\"},\"skill_id\":{\"description\":\"The specific skill to be utilized by the agent.\",\"type\":\"STRING\"}},\"required\":[\"request\"],\"type\":\"OBJECT\"}}]}]}HTTP/2.0 200 OK\r\nContent-Type: application/json; charset=UTF-8\r\nDate: Tue, 10 Mar 2026 14:09:49 GMT\r\nServer: scaffolding on HTTPServer2\r\nServer-Timing: gfet4t7; dur=962\r\nVary: Origin\r\nVary: X-Origin\r\nVary: Referer\r\nX-Content-Type-Options: nosniff\r\nX-Frame-Options: SAMEORIGIN\r\nX-Xss-Protection: 0\r\n\r\n{\n  \"candidates\": [\n    {\n      \"content\": {\n        \"parts\": [\n          {\n            \"functionCall\": {\n              \"name\": \"calculator\",\n              \"args\": {\n                \"skill_id\": \"add\",\n                \"request\": \"2 + 2\",\n                \"rationale\": \"The user is asking to add two numbers, and the calculator tool has an 'add' skill that can perform this operation.\"\n              }\n            },\n            \"thoughtSignature\": \"CtUCAb4+9vstWkvxauzjmusQV16aWpo/PQ7OMXTl2AAfjcNHrf66VJ+K+vjBB7b/Xc+uQ0ka6jVfHXyert4j2BFnwyrpmmW7Kyrle00NJfDippgXt+eXzPmEQHNLdBbgSSHBSVoRVUV8lRChvlTgACd4ihfJkBi4LA5xutfgcrpe6E/juxhdxO0eBRT/JVLsdVxCCKWogFG+4Bhm7HFpqZvEbALMnRbkEb9lNPI5bKkx0UdwzTFuJCzT8SVcs8a8XGBsaxhMj0gypaidLAy2DyDJOCVTfglxQIn6W+6jF+3OGDFr77o281+RbpfN1iP3BD+A7GUfr9Fn8KE3dyMrzKTfvrvfmvZLABLQEyaVUXUpkF7vgpQFaAi3SjSbv/R9VYmFeAFma9lH3jXcyzTbVfl2VfqR29nEwlHsP/44ECn1j0ZE3r+9aarV7d/nteIt60QLP3pPUIM=\"\n          }\n        ],\n        \"role\": \"model\"\n      },\n      \"finishReason\": \"STOP\",\n      \"index\": 0,\n      \"finishMessage\": \"Model generated function call(s).\"\n    }\n  ],\n  \"usageMetadata\": {\n    \"promptTokenCount\": 165,\n    \"candidatesTokenCount\": 52,\n    \"totalTokenCount\": 298,\n    \"promptTokensDetails\": [\n      {\n        \"modality\": \"TEXT\",\n        \"tokenCount\": 165\n      }\n    ],\n    \"thoughtsTokenCount\": 81\n  },\n  \"modelVersion\": \"gemini-2.5-flash\",\n  \"responseId\": \"LCawaZ-6Bd7ensEP5rH1kAw\"\n}\n590 544\nPOST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:streamGenerateContent?alt=sse HTTP/1.1\r\nHost: generativelanguage.googleapis.com\r\nUser-Agent: Go-http-client/1.1\r\nContent-Length: 344\r\nContent-Type: application/json\r\n\r\n{\"contents\":[{\"parts\":[{\"text\":\"2 + 2\"}],\"role\":\"user\"}],\"generationConfig\":{},\"systemInstruction\":{\"parts\":[{\"text\":\"You are a calculator agent. You can calculate numbers.\\n\\nYou are an agent. Your internal name is \\\"calculator\\\". The description about you is \\\"calculator agent\\\\n Skills: add, subtract, multiply, divide\\\".\"}],\"role\":\"user\"}}HTTP/2.0 200 OK\r\nConnection: close\r\nContent-Disposition: attachment\r\nContent-Type: text/event-stream\r\nDate: Tue, 10 Mar 2026 14:09:49 GMT\r\nServer: scaffolding on HTTPServer2\r\nServer-Timing: gfet4t7; dur=686\r\nVary: Origin\r\nVary: X-Origin\r\nVary: Referer\r\nX-Content-Type-Options: nosniff\r\nX-Frame-Options: SAMEORIGIN\r\nX-Xss-Protection: 0\r\n\r\ndata: {\"candidates\": [{\"finishReason\": \"UNEXPECTED_TOOL_CALL\",\"index\": 0}],\"usageMetadata\": {\"promptTokenCount\": 50,\"totalTokenCount\": 50,\"promptTokensDetails\": [{\"modality\": \"TEXT\",\"tokenCount\": 50}]}}\r\n\r\n1853 2362\nPOST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent HTTP/1.1\r\nHost: generativelanguage.googleapis.com\r\nUser-Agent: Go-http-client/1.1\r\nContent-Length: 1620\r\nContent-Type: application/json\r\n\r\n{\"contents\":[{\"parts\":[{\"text\":\"Can you add 2 and 2?\"}],\"role\":\"user\"},{\"parts\":[{\"functionCall\":{\"args\":{\"request\":\"2 + 2\"},\"name\":\"calculator\"},\"thoughtSignature\":\"CtUCAb4+9vstWkvxauzjmusQV16aWpo/PQ7OMXTl2AAfjcNHrf66VJ+K+vjBB7b/Xc+uQ0ka6jVfHXyert4j2BFnwyrpmmW7Kyrle00NJfDippgXt+eXzPmEQHNLdBbgSSHBSVoRVUV8lRChvlTgACd4ihfJkBi4LA5xutfgcrpe6E/juxhdxO0eBRT/JVLsdVxCCKWogFG+4Bhm7HFpqZvEbALMnRbkEb9lNPI5bKkx0UdwzTFuJCzT8SVcs8a8XGBsaxhMj0gypaidLAy2DyDJOCVTfglxQIn6W+6jF+3OGDFr77o281+RbpfN1iP3BD+A7GUfr9Fn8KE3dyMrzKTfvrvfmvZLABLQEyaVUXUpkF7vgpQFaAi3SjSbv/R9VYmFeAFma9lH3jXcyzTbVfl2VfqR29nEwlHsP/44ECn1j0ZE3r+9aarV7d/nteIt60QLP3pPUIM=\"}],\"role\":\"model\"},{\"parts\":[{\"functionResponse\":{\"name\":\"calculator\",\"response\":{\"error\":\"error from sub-agent \\\"calculator\\\" (code: \\\"UNEXPECTED_TOOL_CALL\\\", message: \\\"\\\")\"}}}],\"role\":\"user\"}],\"generationConfig\":{},\"systemInstruction\":{\"parts\":[{\"text\":\"You are a transfer agent. You can transfer to other agents using your tools.\\n\\nYou are an agent. Your internal name is \\\"transfer_agent\\\". The description about you is \\\"transfer agent\\\".\"}],\"role\":\"user\"},\"tools\":[{\"functionDeclarations\":[{\"description\":\"This tool can now optionally accept skill_id and rationale parameters to guide skill-based orchestration. calculator agent\\n Skills: add, subtract, multiply, divide\",\"name\":\"calculator\",\"parameters\":{\"properties\":{\"rationale\":{\"description\":\"The reasoning behind selecting this agent and skill.\",\"type\":\"STRING\"},\"request\":{\"type\":\"STRING\"},\"skill_id\":{\"description\":\"The specific skill to be utilized by the agent.\",\"type\":\"STRING\"}},\"required\":[\"request\"],\"type\":\"OBJECT\"}}]}]}HTTP/2.0 200 OK\r\nContent-Type: application/json; charset=UTF-8\r\nDate: Tue, 10 Mar 2026 14:09:51 GMT\r\nServer: scaffolding on HTTPServer2\r\nServer-Timing: gfet4t7; dur=1602\r\nVary: Origin\r\nVary: X-Origin\r\nVary: Referer\r\nX-Content-Type-Options: nosniff\r\nX-Frame-Options: SAMEORIGIN\r\nX-Xss-Protection: 0\r\n\r\n{\n  \"candidates\": [\n    {\n      \"content\": {\n        \"parts\": [\n          {\n            \"functionCall\": {\n              \"name\": \"calculator\",\n              \"args\": {\n                \"skill_id\": \"add\",\n                \"request\": \"add 2 and 2\",\n                \"rationale\": \"The user wants to add 2 and 2. The calculator tool with the \\\"add\\\" skill can perform this operation.\"\n              }\n            },\n            \"thoughtSignature\": \"Cr0GAb4+9vv8+09t2pLVTIf043HQXo7KHDiVeK5PoGfqTtNzSgeThEgZuPRE1B+hTr7FnqC77t8OQfHBt1GAmeNtaY0pncAqo6gLv/2/q/nLgOiwdjHMkv9WagOVCr5H/mNnR+zaYI1zzOXpeWkTQQUBaaOdGqo21LBUTUbjzvXVG3uhcZDVW7v7vkiSEFd1cWwJs6acP3UhQMSNT4M8EU8NVmSBd0eIqAcYhNkQYRkxXFuEh3MP+mJFk3w4XyhpIuQgpGp9tFoASKdm0PyCD0YxPbOc+NdBaMcknJxV/rzaorT2iZE39eHgeuveuAU9k6+zo6AXNVuPu+BHrAvRsvt51gH2Je3Lyh4pHsvmYUOSE4vqY1rWC8rdcFgRqsKi8GhKsmI3NK57r0z/f/UlAn3x+Xr5bILB58gp5HQLNAMpmaxZRlIVe3Szz7WXsGu+XIHfUXGgqniC7Dqnl3Y5UEelpeZiIj9+ZnrHXhxssmXT4qRJH0KnAOZ/m9RPsfN8QwYASeq8XA88zhizOvhYHsQSi61HXBU9ZjYND3iXHs/jk09azjS/A9jrxckrcGq2InGpb/+gzwx7rFwMINThItWbHP1EHHP1gt4J47eUJjIQWv0wIvjy5pv1WVUie/mY/QBqCSb0uGMwyGgmrZjC/hv+J7zdZrvnAG9iyNDn4bWz8SiIk/XHJBA7te+akcIQlobIwh5RkOnEf3qURBVNW97qJD2usw1Kl3NIt+5nwTqQpbtDMbMzDuUXQ5lJEnRkQa+tPs8t775QQ3SQN2lXXrUN/DI6EpYLAVlQNnsSiLE9uCkr6y3h2xkxyd1MFETOCIjMMjtZXQiiiDoBxfkzOhlrNE1uKFnCg3q8pavpZ5RoRRO5xyiKGAcXChLMBpGSIekeL4n9NqDRj6QaCv8MhudePqCePwBunypF4W7myDpg91AQsP6Mju8rEGTsRJyaDP26ewfVfhaFYJZxJYxZNtZsTSHiSN/6EJYJqinxhtAqLY6gxwjFXN0SreJr6P6dH1vKizraNa+CwxOSLfidtwnWpobUEBRv2knXrRkSlaVjkJ+Zx1DkqX5qEK0rv+gqat2/8ZmLWhVhAb7vmgHlyA==\"\n          }\n        ],\n        \"role\": \"model\"\n      },\n      \"finishReason\": \"STOP\",\n      \"index\": 0,\n      \"finishMessage\": \"Model generated function call(s).\"\n    }\n  ],\n  \"usageMetadata\": {\n    \"promptTokenCount\": 217,\n    \"candidatesTokenCount\": 54,\n    \"totalTokenCount\": 459,\n    \"promptTokensDetails\": [\n      {\n        \"modality\": \"TEXT\",\n        \"tokenCount\": 217\n      }\n    ],\n    \"thoughtsTokenCount\": 188\n  },\n  \"modelVersion\": \"gemini-2.5-flash\",\n  \"responseId\": \"LSawaYq0LfH3nsEP2v-88AQ\"\n}\n596 544\nPOST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:streamGenerateContent?alt=sse HTTP/1.1\r\nHost: generativelanguage.googleapis.com\r\nUser-Agent: Go-http-client/1.1\r\nContent-Length: 350\r\nContent-Type: application/json\r\n\r\n{\"contents\":[{\"parts\":[{\"text\":\"add 2 and 2\"}],\"role\":\"user\"}],\"generationConfig\":{},\"systemInstruction\":{\"parts\":[{\"text\":\"You are a calculator agent. You can calculate numbers.\\n\\nYou are an agent. Your internal name is \\\"calculator\\\". The description about you is \\\"calculator agent\\\\n Skills: add, subtract, multiply, divide\\\".\"}],\"role\":\"user\"}}HTTP/2.0 200 OK\r\nConnection: close\r\nContent-Disposition: attachment\r\nContent-Type: text/event-stream\r\nDate: Tue, 10 Mar 2026 14:09:51 GMT\r\nServer: scaffolding on HTTPServer2\r\nServer-Timing: gfet4t7; dur=616\r\nVary: Origin\r\nVary: X-Origin\r\nVary: Referer\r\nX-Content-Type-Options: nosniff\r\nX-Frame-Options: SAMEORIGIN\r\nX-Xss-Protection: 0\r\n\r\ndata: {\"candidates\": [{\"finishReason\": \"UNEXPECTED_TOOL_CALL\",\"index\": 0}],\"usageMetadata\": {\"promptTokenCount\": 52,\"totalTokenCount\": 52,\"promptTokensDetails\": [{\"modality\": \"TEXT\",\"tokenCount\": 52}]}}\r\n\r\n3262 3170\nPOST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent HTTP/1.1\r\nHost: generativelanguage.googleapis.com\r\nUser-Agent: Go-http-client/1.1\r\nContent-Length: 3029\r\nContent-Type: application/json\r\n\r\n{\"contents\":[{\"parts\":[{\"text\":\"Can you add 2 and 2?\"}],\"role\":\"user\"},{\"parts\":[{\"functionCall\":{\"args\":{\"request\":\"2 + 2\"},\"name\":\"calculator\"},\"thoughtSignature\":\"CtUCAb4+9vstWkvxauzjmusQV16aWpo/PQ7OMXTl2AAfjcNHrf66VJ+K+vjBB7b/Xc+uQ0ka6jVfHXyert4j2BFnwyrpmmW7Kyrle00NJfDippgXt+eXzPmEQHNLdBbgSSHBSVoRVUV8lRChvlTgACd4ihfJkBi4LA5xutfgcrpe6E/juxhdxO0eBRT/JVLsdVxCCKWogFG+4Bhm7HFpqZvEbALMnRbkEb9lNPI5bKkx0UdwzTFuJCzT8SVcs8a8XGBsaxhMj0gypaidLAy2DyDJOCVTfglxQIn6W+6jF+3OGDFr77o281+RbpfN1iP3BD+A7GUfr9Fn8KE3dyMrzKTfvrvfmvZLABLQEyaVUXUpkF7vgpQFaAi3SjSbv/R9VYmFeAFma9lH3jXcyzTbVfl2VfqR29nEwlHsP/44ECn1j0ZE3r+9aarV7d/nteIt60QLP3pPUIM=\"}],\"role\":\"model\"},{\"parts\":[{\"functionResponse\":{\"name\":\"calculator\",\"response\":{\"error\":\"error from sub-agent \\\"calculator\\\" (code: \\\"UNEXPECTED_TOOL_CALL\\\", message: \\\"\\\")\"}}}],\"role\":\"user\"},{\"parts\":[{\"functionCall\":{\"args\":{\"request\":\"add 2 and 2\"},\"name\":\"calculator\"},\"thoughtSignature\":\"Cr0GAb4+9vv8+09t2pLVTIf043HQXo7KHDiVeK5PoGfqTtNzSgeThEgZuPRE1B+hTr7FnqC77t8OQfHBt1GAmeNtaY0pncAqo6gLv/2/q/nLgOiwdjHMkv9WagOVCr5H/mNnR+zaYI1zzOXpeWkTQQUBaaOdGqo21LBUTUbjzvXVG3uhcZDVW7v7vkiSEFd1cWwJs6acP3UhQMSNT4M8EU8NVmSBd0eIqAcYhNkQYRkxXFuEh3MP+mJFk3w4XyhpIuQgpGp9tFoASKdm0PyCD0YxPbOc+NdBaMcknJxV/rzaorT2iZE39eHgeuveuAU9k6+zo6AXNVuPu+BHrAvRsvt51gH2Je3Lyh4pHsvmYUOSE4vqY1rWC8rdcFgRqsKi8GhKsmI3NK57r0z/f/UlAn3x+Xr5bILB58gp5HQLNAMpmaxZRlIVe3Szz7WXsGu+XIHfUXGgqniC7Dqnl3Y5UEelpeZiIj9+ZnrHXhxssmXT4qRJH0KnAOZ/m9RPsfN8QwYASeq8XA88zhizOvhYHsQSi61HXBU9ZjYND3iXHs/jk09azjS/A9jrxckrcGq2InGpb/+gzwx7rFwMINThItWbHP1EHHP1gt4J47eUJjIQWv0wIvjy5pv1WVUie/mY/QBqCSb0uGMwyGgmrZjC/hv+J7zdZrvnAG9iyNDn4bWz8SiIk/XHJBA7te+akcIQlobIwh5RkOnEf3qURBVNW97qJD2usw1Kl3NIt+5nwTqQpbtDMbMzDuUXQ5lJEnRkQa+tPs8t775QQ3SQN2lXXrUN/DI6EpYLAVlQNnsSiLE9uCkr6y3h2xkxyd1MFETOCIjMMjtZXQiiiDoBxfkzOhlrNE1uKFnCg3q8pavpZ5RoRRO5xyiKGAcXChLMBpGSIekeL4n9NqDRj6QaCv8MhudePqCePwBunypF4W7myDpg91AQsP6Mju8rEGTsRJyaDP26ewfVfhaFYJZxJYxZNtZsTSHiSN/6EJYJqinxhtAqLY6gxwjFXN0SreJr6P6dH1vKizraNa+CwxOSLfidtwnWpobUEBRv2knXrRkSlaVjkJ+Zx1DkqX5qEK0rv+gqat2/8ZmLWhVhAb7vmgHlyA==\"}],\"role\":\"model\"},{\"parts\":[{\"functionResponse\":{\"name\":\"calculator\",\"response\":{\"error\":\"error from sub-agent \\\"calculator\\\" (code: \\\"UNEXPECTED_TOOL_CALL\\\", message: \\\"\\\")\"}}}],\"role\":\"user\"}],\"generationConfig\":{},\"systemInstruction\":{\"parts\":[{\"text\":\"You are a transfer agent. You can transfer to other agents using your tools.\\n\\nYou are an agent. Your internal name is \\\"transfer_agent\\\". The description about you is \\\"transfer agent\\\".\"}],\"role\":\"user\"},\"tools\":[{\"functionDeclarations\":[{\"description\":\"This tool can now optionally accept skill_id and rationale parameters to guide skill-based orchestration. calculator agent\\n Skills: add, subtract, multiply, divide\",\"name\":\"calculator\",\"parameters\":{\"properties\":{\"rationale\":{\"description\":\"The reasoning behind selecting this agent and skill.\",\"type\":\"STRING\"},\"request\":{\"type\":\"STRING\"},\"skill_id\":{\"description\":\"The specific skill to be utilized by the agent.\",\"type\":\"STRING\"}},\"required\":[\"request\"],\"type\":\"OBJECT\"}}]}]}HTTP/2.0 200 OK\r\nContent-Type: application/json; charset=UTF-8\r\nDate: Tue, 10 Mar 2026 14:09:55 GMT\r\nServer: scaffolding on HTTPServer2\r\nServer-Timing: gfet4t7; dur=3295\r\nVary: Origin\r\nVary: X-Origin\r\nVary: Referer\r\nX-Content-Type-Options: nosniff\r\nX-Frame-Options: SAMEORIGIN\r\nX-Xss-Protection: 0\r\n\r\n{\n  \"candidates\": [\n    {\n      \"content\": {\n        \"parts\": [\n          {\n            \"functionCall\": {\n              \"name\": \"calculator\",\n              \"args\": {\n                \"rationale\": \"The user wants to add two numbers, and the calculator tool has an 'add' skill that can perform this operation. Providing the request as '2+2' and explicitly setting the skill_id to 'add' should allow the calculator to correctly perform the addition.\",\n                \"request\": \"2+2\",\n                \"skill_id\": \"add\"\n              }\n            },\n            \"thoughtSignature\": \"CrQKAb4+9vsHtyTo1nFULUKtvO66j3fZQoZhe7BVlgQ5jJOI4OJk7G/mDXeq5RGaUnloSH+S55e6wxRWzjtSaCkumrvNYnCLf8iKqy9Anz979Its9x6Fc3lBT0BHKhkGboq7FLuixWOVdgKM68GYDkIY/qYUg+koPL4nQo22tPNaRG0P94MEaglrTtPbSCDsCSpq8YFshLBT4Yago871D++bJnThzCBvOKD0eRnQnx7Pz+nHbWntijrvA9gTQ39UMJ7dduCJAYHw3L01F4hODoDn/McB/Rh7RNhZmUycqxRMwQI0eR1eUgzgkNeMcl3+iS1Q/Vt9BINp3PTjH7OQcO8233jItueR0u6lNtc75RYfGnbk1ydG873CHTnV3RT2Lfpag8g+pn5TIoDv2yKdP4u2nHviZs4SVDGFOH28/idoQhSiH8j6w9kgYRHiMvProJmytTihggqyFs6dHZo632RKu2lm3bl0rFG/UdVMNZEK6nqNwF2e7ksqqY2wwy1z/P/nXNuFzqV34pRplQtYPYXanvXdb5wHwt0zsA4bPD+ba8TVspCzkrMZVNs9+EUyK/jx+hDGRbyMRX52TRFPbVYYzAhJVB4QcTxMxRB0ATO2YYkpzr7hUeFQ9dxqsXIuMW/RqP+A4343JpGOd1IMZN9w0DiorYiYv6RO34Gu/IlvA4flqfsGTznL9szU8lZ1lMV8C9k7Buyx9vpwAcHbmt/QojAqj/uIxH6P1dbfCaob6sNXtjqlAI+mS2mDs+sZkkYxwtvDy/JZtNksm2eubD5mIMHp1Ca2xmBG5hWnq+2z2IreiywUVHdB8GaI6Pb0e2+vVk1jl09OVVTYebcFl7Q/2l9pV4IPoCwNnbqkbT2zdV6UEQtlp2ge+Ayd7mPSDdZto31Hk+HlmWr767s6zlP/5G3YcLN+FiJllFBRo2kvzpNfFCWHsuwn6cAiq4JvuHgXwZNNJaXueUU5YpbgfRN45cHozFX3G7M+cN4ld+ndxyD4pru1Z1APh/wXMjLfmSAjzmwZ45h13l8RV6AkazAvle1g/zVvqL1GwYYucpIBHnwOpH77xg7TUiTp/ZOng/FhaNBC3JXy4lTz6RgTpwc4tFtPogOTxUORZIOSgFWN6OQyDia9FNoodXe3UT/esUqCoJNGu+clQ1VhDr0bKW2vrJpRSkWpYMLiZeXNT/PSmqwwN3kil3SxHd3CtJpC9q/VzC4k8dJFzrbQLTwIs8kfzH0Epk732AhK5l9n7EM2OiS6+Wzlw/z2+HZbXl+MHzy+i3mBuyhqCLHm49pJKhI4Ou/O2Q/+w55T3qhS8sgyxK93ybAmdtH37XaL5JBwLRDZhsAAjw2LQJ015iqKPQQAlAwMmF/1+FIcAwPMr9rJtXKPK/BaFLUNC0YuCKr3Q6HHjv8HP+SVejjz7N9hwmu5MXcFt/zkWwbi8iY95kLpaQ/svNtTWp8cOveq23PDt8oVx7RwU07OaW5ej43Nfs09ALRT9XpjajJe8HrTgoOQjJlqAJjv7yCD9Y/+y3IdRXNSE0D3oz8A8HMC/x7lZwLh/ztPVGBP7ezKRxSDKUOTT8onjlhF789hO6X6Xw6Z9Q5PM4M7DG2oXRQcjftlw/PFrxxnl5W0Dxwb9UappLw5tZLtBUZlk7q1lCciKUpXN9VPFXC3XTMqKOWPDnRbdbUdcitPUkiH3rgQy0OV+0g2iHNLhBgIkR5Ei9pFpZht8UPHyd/qFN3Z8RusYxVE0sxc0rM7OI6vKm6xbloT5VBTepDKHhWn\"\n          }\n        ],\n        \"role\": \"model\"\n      },\n      \"finishReason\": \"STOP\",\n      \"index\": 0,\n      \"finishMessage\": \"Model generated function call(s).\"\n    }\n  ],\n  \"usageMetadata\": {\n    \"promptTokenCount\": 271,\n    \"candidatesTokenCount\": 80,\n    \"totalTokenCount\": 657,\n    \"promptTokensDetails\": [\n      {\n        \"modality\": \"TEXT\",\n        \"tokenCount\": 271\n      }\n    ],\n    \"thoughtsTokenCount\": 306\n  },\n  \"modelVersion\": \"gemini-2.5-flash\",\n  \"responseId\": \"LyawafntOumakdUP6ZHlkQo\"\n}\n588 544\nPOST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:streamGenerateContent?alt=sse HTTP/1.1\r\nHost: generativelanguage.googleapis.com\r\nUser-Agent: Go-http-client/1.1\r\nContent-Length: 342\r\nContent-Type: application/json\r\n\r\n{\"contents\":[{\"parts\":[{\"text\":\"2+2\"}],\"role\":\"user\"}],\"generationConfig\":{},\"systemInstruction\":{\"parts\":[{\"text\":\"You are a calculator agent. You can calculate numbers.\\n\\nYou are an agent. Your internal name is \\\"calculator\\\". The description about you is \\\"calculator agent\\\\n Skills: add, subtract, multiply, divide\\\".\"}],\"role\":\"user\"}}HTTP/2.0 200 OK\r\nConnection: close\r\nContent-Disposition: attachment\r\nContent-Type: text/event-stream\r\nDate: Tue, 10 Mar 2026 14:09:55 GMT\r\nServer: scaffolding on HTTPServer2\r\nServer-Timing: gfet4t7; dur=562\r\nVary: Origin\r\nVary: X-Origin\r\nVary: Referer\r\nX-Content-Type-Options: nosniff\r\nX-Frame-Options: SAMEORIGIN\r\nX-Xss-Protection: 0\r\n\r\ndata: {\"candidates\": [{\"finishReason\": \"UNEXPECTED_TOOL_CALL\",\"index\": 0}],\"usageMetadata\": {\"promptTokenCount\": 49,\"totalTokenCount\": 49,\"promptTokensDetails\": [{\"modality\": \"TEXT\",\"tokenCount\": 49}]}}\r\n\r\n5331 2901\nPOST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent HTTP/1.1\r\nHost: generativelanguage.googleapis.com\r\nUser-Agent: Go-http-client/1.1\r\nContent-Length: 5098\r\nContent-Type: application/json\r\n\r\n{\"contents\":[{\"parts\":[{\"text\":\"Can you add 2 and 2?\"}],\"role\":\"user\"},{\"parts\":[{\"functionCall\":{\"args\":{\"request\":\"2 + 2\"},\"name\":\"calculator\"},\"thoughtSignature\":\"CtUCAb4+9vstWkvxauzjmusQV16aWpo/PQ7OMXTl2AAfjcNHrf66VJ+K+vjBB7b/Xc+uQ0ka6jVfHXyert4j2BFnwyrpmmW7Kyrle00NJfDippgXt+eXzPmEQHNLdBbgSSHBSVoRVUV8lRChvlTgACd4ihfJkBi4LA5xutfgcrpe6E/juxhdxO0eBRT/JVLsdVxCCKWogFG+4Bhm7HFpqZvEbALMnRbkEb9lNPI5bKkx0UdwzTFuJCzT8SVcs8a8XGBsaxhMj0gypaidLAy2DyDJOCVTfglxQIn6W+6jF+3OGDFr77o281+RbpfN1iP3BD+A7GUfr9Fn8KE3dyMrzKTfvrvfmvZLABLQEyaVUXUpkF7vgpQFaAi3SjSbv/R9VYmFeAFma9lH3jXcyzTbVfl2VfqR29nEwlHsP/44ECn1j0ZE3r+9aarV7d/nteIt60QLP3pPUIM=\"}],\"role\":\"model\"},{\"parts\":[{\"functionResponse\":{\"name\":\"calculator\",\"response\":{\"error\":\"error from sub-agent \\\"calculator\\\" (code: \\\"UNEXPECTED_TOOL_CALL\\\", message: \\\"\\\")\"}}}],\"role\":\"user\"},{\"parts\":[{\"functionCall\":{\"args\":{\"request\":\"add 2 and 2\"},\"name\":\"calculator\"},\"thoughtSignature\":\"Cr0GAb4+9vv8+09t2pLVTIf043HQXo7KHDiVeK5PoGfqTtNzSgeThEgZuPRE1B+hTr7FnqC77t8OQfHBt1GAmeNtaY0pncAqo6gLv/2/q/nLgOiwdjHMkv9WagOVCr5H/mNnR+zaYI1zzOXpeWkTQQUBaaOdGqo21LBUTUbjzvXVG3uhcZDVW7v7vkiSEFd1cWwJs6acP3UhQMSNT4M8EU8NVmSBd0eIqAcYhNkQYRkxXFuEh3MP+mJFk3w4XyhpIuQgpGp9tFoASKdm0PyCD0YxPbOc+NdBaMcknJxV/rzaorT2iZE39eHgeuveuAU9k6+zo6AXNVuPu+BHrAvRsvt51gH2Je3Lyh4pHsvmYUOSE4vqY1rWC8rdcFgRqsKi8GhKsmI3NK57r0z/f/UlAn3x+Xr5bILB58gp5HQLNAMpmaxZRlIVe3Szz7WXsGu+XIHfUXGgqniC7Dqnl3Y5UEelpeZiIj9+ZnrHXhxssmXT4qRJH0KnAOZ/m9RPsfN8QwYASeq8XA88zhizOvhYHsQSi61HXBU9ZjYND3iXHs/jk09azjS/A9jrxckrcGq2InGpb/+gzwx7rFwMINThItWbHP1EHHP1gt4J47eUJjIQWv0wIvjy5pv1WVUie/mY/QBqCSb0uGMwyGgmrZjC/hv+J7zdZrvnAG9iyNDn4bWz8SiIk/XHJBA7te+akcIQlobIwh5RkOnEf3qURBVNW97qJD2usw1Kl3NIt+5nwTqQpbtDMbMzDuUXQ5lJEnRkQa+tPs8t775QQ3SQN2lXXrUN/DI6EpYLAVlQNnsSiLE9uCkr6y3h2xkxyd1MFETOCIjMMjtZXQiiiDoBxfkzOhlrNE1uKFnCg3q8pavpZ5RoRRO5xyiKGAcXChLMBpGSIekeL4n9NqDRj6QaCv8MhudePqCePwBunypF4W7myDpg91AQsP6Mju8rEGTsRJyaDP26ewfVfhaFYJZxJYxZNtZsTSHiSN/6EJYJqinxhtAqLY6gxwjFXN0SreJr6P6dH1vKizraNa+CwxOSLfidtwnWpobUEBRv2knXrRkSlaVjkJ+Zx1DkqX5qEK0rv+gqat2/8ZmLWhVhAb7vmgHlyA==\"}],\"role\":\"model\"},{\"parts\":[{\"functionResponse\":{\"name\":\"calculator\",\"response\":{\"error\":\"error from sub-agent \\\"calculator\\\" (code: \\\"UNEXPECTED_TOOL_CALL\\\", message: \\\"\\\")\"}}}],\"role\":\"user\"},{\"parts\":[{\"functionCall\":{\"args\":{\"request\":\"2+2\"},\"name\":\"calculator\"},\"thoughtSignature\":\"CrQKAb4+9vsHtyTo1nFULUKtvO66j3fZQoZhe7BVlgQ5jJOI4OJk7G/mDXeq5RGaUnloSH+S55e6wxRWzjtSaCkumrvNYnCLf8iKqy9Anz979Its9x6Fc3lBT0BHKhkGboq7FLuixWOVdgKM68GYDkIY/qYUg+koPL4nQo22tPNaRG0P94MEaglrTtPbSCDsCSpq8YFshLBT4Yago871D++bJnThzCBvOKD0eRnQnx7Pz+nHbWntijrvA9gTQ39UMJ7dduCJAYHw3L01F4hODoDn/McB/Rh7RNhZmUycqxRMwQI0eR1eUgzgkNeMcl3+iS1Q/Vt9BINp3PTjH7OQcO8233jItueR0u6lNtc75RYfGnbk1ydG873CHTnV3RT2Lfpag8g+pn5TIoDv2yKdP4u2nHviZs4SVDGFOH28/idoQhSiH8j6w9kgYRHiMvProJmytTihggqyFs6dHZo632RKu2lm3bl0rFG/UdVMNZEK6nqNwF2e7ksqqY2wwy1z/P/nXNuFzqV34pRplQtYPYXanvXdb5wHwt0zsA4bPD+ba8TVspCzkrMZVNs9+EUyK/jx+hDGRbyMRX52TRFPbVYYzAhJVB4QcTxMxRB0ATO2YYkpzr7hUeFQ9dxqsXIuMW/RqP+A4343JpGOd1IMZN9w0DiorYiYv6RO34Gu/IlvA4flqfsGTznL9szU8lZ1lMV8C9k7Buyx9vpwAcHbmt/QojAqj/uIxH6P1dbfCaob6sNXtjqlAI+mS2mDs+sZkkYxwtvDy/JZtNksm2eubD5mIMHp1Ca2xmBG5hWnq+2z2IreiywUVHdB8GaI6Pb0e2+vVk1jl09OVVTYebcFl7Q/2l9pV4IPoCwNnbqkbT2zdV6UEQtlp2ge+Ayd7mPSDdZto31Hk+HlmWr767s6zlP/5G3YcLN+FiJllFBRo2kvzpNfFCWHsuwn6cAiq4JvuHgXwZNNJaXueUU5YpbgfRN45cHozFX3G7M+cN4ld+ndxyD4pru1Z1APh/wXMjLfmSAjzmwZ45h13l8RV6AkazAvle1g/zVvqL1GwYYucpIBHnwOpH77xg7TUiTp/ZOng/FhaNBC3JXy4lTz6RgTpwc4tFtPogOTxUORZIOSgFWN6OQyDia9FNoodXe3UT/esUqCoJNGu+clQ1VhDr0bKW2vrJpRSkWpYMLiZeXNT/PSmqwwN3kil3SxHd3CtJpC9q/VzC4k8dJFzrbQLTwIs8kfzH0Epk732AhK5l9n7EM2OiS6+Wzlw/z2+HZbXl+MHzy+i3mBuyhqCLHm49pJKhI4Ou/O2Q/+w55T3qhS8sgyxK93ybAmdtH37XaL5JBwLRDZhsAAjw2LQJ015iqKPQQAlAwMmF/1+FIcAwPMr9rJtXKPK/BaFLUNC0YuCKr3Q6HHjv8HP+SVejjz7N9hwmu5MXcFt/zkWwbi8iY95kLpaQ/svNtTWp8cOveq23PDt8oVx7RwU07OaW5ej43Nfs09ALRT9XpjajJe8HrTgoOQjJlqAJjv7yCD9Y/+y3IdRXNSE0D3oz8A8HMC/x7lZwLh/ztPVGBP7ezKRxSDKUOTT8onjlhF789hO6X6Xw6Z9Q5PM4M7DG2oXRQcjftlw/PFrxxnl5W0Dxwb9UappLw5tZLtBUZlk7q1lCciKUpXN9VPFXC3XTMqKOWPDnRbdbUdcitPUkiH3rgQy0OV+0g2iHNLhBgIkR5Ei9pFpZht8UPHyd/qFN3Z8RusYxVE0sxc0rM7OI6vKm6xbloT5VBTepDKHhWn\"}],\"role\":\"model\"},{\"parts\":[{\"functionResponse\":{\"name\":\"calculator\",\"response\":{\"error\":\"error from sub-agent \\\"calculator\\\" (code: \\\"UNEXPECTED_TOOL_CALL\\\", message: \\\"\\\")\"}}}],\"role\":\"user\"}],\"generationConfig\":{},\"systemInstruction\":{\"parts\":[{\"text\":\"You are a transfer agent. You can transfer to other agents using your tools.\\n\\nYou are an agent. Your internal name is \\\"transfer_agent\\\". The description about you is \\\"transfer agent\\\".\"}],\"role\":\"user\"},\"tools\":[{\"functionDeclarations\":[{\"description\":\"This tool can now optionally accept skill_id and rationale parameters to guide skill-based orchestration. calculator agent\\n Skills: add, subtract, multiply, divide\",\"name\":\"calculator\",\"parameters\":{\"properties\":{\"rationale\":{\"description\":\"The reasoning behind selecting this agent and skill.\",\"type\":\"STRING\"},\"request\":{\"type\":\"STRING\"},\"skill_id\":{\"description\":\"The specific skill to be utilized by the agent.\",\"type\":\"STRING\"}},\"required\":[\"request\"],\"type\":\"OBJECT\"}}]}]}HTTP/2.0 200 OK\r\nContent-Type: application/json; charset=UTF-8\r\nDate: Tue, 10 Mar 2026 14:09:58 GMT\r\nServer: scaffolding on HTTPServer2\r\nServer-Timing: gfet4t7; dur=2769\r\nVary: Origin\r\nVary: X-Origin\r\nVary: Referer\r\nX-Content-Type-Options: nosniff\r\nX-Frame-Options: SAMEORIGIN\r\nX-Xss-Protection: 0\r\n\r\n{\n  \"candidates\": [\n    {\n      \"content\": {\n        \"parts\": [\n          {\n            \"text\": \"I am sorry, I cannot fulfill this request. The calculator tool is not working as expected. I am getting an error when I try to use it.\",\n            \"thoughtSignature\": \"CoILAb4+9vudz1XnXdU/nJydig4ktLc5tKK93RRRSGAw17B7QsvCelCuj1MmbmIp0Y4MBE/LsPl4zB2hBMBqgkZdctxik+0oAYyGKoK2VG2FW9xRz+7pRt4v0nFIjZxfuzYSN9ZTzhuu+N15zRS1Ft5yQiJi4BL5SqaFjq30nYNIngIetdFS6ulIP6Fy358MmStiZIezI3XG1dhxPEbIF1Q+oV94UUW9NBXxN50WR0Y5qeAYV/DrvCU2mZRdleXdUmcSv8V+URipKHrPlAlSdL2jdZUEexr+OjL1LBNJ1G+mqYLVk5gOuD1PBFBqCNlwqbflAgWUbfVzCWjcf7ej0jQQ5/Ek3YtxolG+cPUPrU5t7MkTM5BPhoxSE/q5k8/qAaMK06eaSfhGnyhXen2bi1+WjTKiqPlXV6avPDGaEibI2NTFcNeu13/FeeQV2CJSn5/HFItJONpqJJUW/izGlk4374IdENn0HTFK1Y+ap8FJEMJfIXk3NnYpC0K3NgAqOFsWTprK0mWqqadhTJcTnKrZ63rNuPnGWiUisnGSZvNzIFDwY6ADxy8m+ojaALoTDkSC3MexqS1hNQTNBrCuLESW/dkH6LLz0yL6E8k1hclQ0UJsN/HKZk88BgGVZc9ZE84ES5ksE9UMzGYUc6fuxqdwlzbpNfLBOloW8H7l/5Nkdo1QphyMzjfUX0XIoYUIHzjIqy98jWnmWtMipvuKjGVhi4uvX/RJu+lex5xhHadSPRsjbt44+C4g8myGGY/VWzX4fI4F1Q45034RZ4svqeqRldm//ePrWWo6U08bgA2ADOkunLfy62DER3VgmlmLxdA9c9+qf0N3vFiKEmu6jB4IiVPMFSsGAJnq1iID6xy8TwxXoBQkUoHT/ukmPIPJlQ7ghlOkR8ES1c3fQgn9wIaB58p/N6xMsOocflczFvvMuqfALUy3ysCYnuZeSpThOX9MBZfkaNrsgAgjR7oQSSrWg58aFXz1dCFAvulnxgMVKqkAN1yJF9q6aI9NUwViX9OtXY+CJM3TNpVRuQjMBqG3iYDNkvibpzHJr/9fW8qFY4S6yOOFBv/FNGGhN2n+Qd9THqFRo1AnbLJi0U0wefHdrKg/VwO+BwZ14KVfun6mlxR/mmWOaNSABlFfnh0rNnx1Y+Oh6JozQcuKmhGo7SGZYbI5iwMtHzD0tJloOaxZJ4FbCTSaoANiv3SR3rWXJ5FlKQ7WCziePJ3tYADz3J/r+rsBjLix3TiRTIdfKOZJhqC+KViszSCDutEdqJ/V2Iy77FJWTIJmnqHQ9xh8v5pGEsId8aevdW2C58a5Qf+C2VFjRdGvuU+MFKPCUzVAhL1ICc2qhNjLK1t2RcY8hv6kVkQycb11S4llv6y8v8tSzdXRia4TySeMDB7CMAyo8wzuOUzssa7+jy7ChUx2bX++deT6E9Jq2m4OfyuVwYvV/duFWuEbi/Dhu1HdNoGKdrCx0n2a5+vO9g83FAGyMcD0P/kv+fNnvCPOVZDTZZc2dECvenvISWijaZTU/Z6+fQCG3IM2FJIL7OLzP+4Nko9JLZF3z3EQErNN94pc/ZGmxk4YmMs++q3D/sC2Jf/BF8fA8qFrgtgc7l3r1NiplJV7IgIKLD5HLWYIHikjem2i1u3RLAIv2hR0HPgs4uErheBWpvj7QvnAja+CzePzBZHMZjdYEXqzM0I/Jwt3OcUkEO6Iq39NZ5i7rrAYJnvmPUHylR9BfvWSEhdWYaVWmXaPG1gABMmgQ/FL+5QAa6D1KfB4U+0DJP0x9Xco5FQE135ZPBpLFkJ+SnYnxDetZtx01TM/78l56jCmomSfh5HZ6tC2xDVtqTnjV9P79ZzeNRROlqlzbQJY+dbuwWsRBSOqNH+N\"\n          }\n        ],\n        \"role\": \"model\"\n      },\n      \"finishReason\": \"STOP\",\n      \"index\": 0\n    }\n  ],\n  \"usageMetadata\": {\n    \"promptTokenCount\": 322,\n    \"candidatesTokenCount\": 31,\n    \"totalTokenCount\": 672,\n    \"promptTokensDetails\": [\n      {\n        \"modality\": \"TEXT\",\n        \"tokenCount\": 322\n      }\n    ],\n    \"thoughtsTokenCount\": 319\n  },\n  \"modelVersion\": \"gemini-2.5-flash\",\n  \"responseId\": \"MyawaZWNNPzLkdUPsrHY4Ak\"\n}\n"
  },
  {
    "path": "plugin/functioncallmodifier/testdata/TestPluginCallbackIntegration_no_relevant_tools.httprr",
    "content": "httprr trace v1\n799 1427\nPOST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent HTTP/1.1\r\nHost: generativelanguage.googleapis.com\r\nUser-Agent: Go-http-client/1.1\r\nContent-Length: 567\r\nContent-Type: application/json\r\n\r\n{\"contents\":[{\"parts\":[{\"text\":\"Can you add 2 and 2?\"}],\"role\":\"user\"}],\"generationConfig\":{},\"systemInstruction\":{\"parts\":[{\"text\":\"You are a transfer agent. You can transfer to other agents using your tools.\\n\\nYou are an agent. Your internal name is \\\"transfer_agent\\\". The description about you is \\\"transfer agent\\\".\"}],\"role\":\"user\"},\"tools\":[{\"functionDeclarations\":[{\"name\":\"other_tool\",\"parametersJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"Num\":{\"type\":\"integer\"}},\"required\":[\"Num\"],\"type\":\"object\"},\"responseJsonSchema\":{\"type\":\"string\"}}]}]}HTTP/2.0 200 OK\r\nContent-Type: application/json; charset=UTF-8\r\nDate: Tue, 10 Mar 2026 14:09:48 GMT\r\nServer: scaffolding on HTTPServer2\r\nServer-Timing: gfet4t7; dur=783\r\nVary: Origin\r\nVary: X-Origin\r\nVary: Referer\r\nX-Content-Type-Options: nosniff\r\nX-Frame-Options: SAMEORIGIN\r\nX-Xss-Protection: 0\r\n\r\n{\n  \"candidates\": [\n    {\n      \"content\": {\n        \"parts\": [\n          {\n            \"text\": \"2 + 2 = 4\",\n            \"thoughtSignature\": \"CpADAb4+9vt+i6+qQR9zvUte0JZ0M5mqvUhdXgi2bUStUEEqH545LXdrNyIc9r2VrrE8QCS9rO3AOH4uoa60V3gxcATTMry6j/rHwuza2udWz9q65/YEJljJ4hbz9Uri399vsCHsJnz+81Cb9BJB9Stt9q0R6Yo6jDFV+oNfmw7UZej+SocDq6YvltlrwzboLYN5FYhWhoPnY0GobaNLfu8sgOKSyDqh0D0K5W5RV9ByiZUd2tlJv03Hy9H+XSEXS5r1WyX6xh5jhioTp16+ORB2okWACdzxysRrP+sxGEtBeeF2LXRhVwOCmHp8XIxlN/I/qnj0at8XjoVeEeLqqr+z7QBcT0lu68k7pVh11n7CkFmlhgyeXD/33PSO8JIlLWRejywf0NpyUafI4ftLX57xkfaDxAaBK+wy1UiR1tek8Ab9rRIPPqKOqi1iyQUn/0n8jTNOoxoIgpqE42ZxyKPUN0M1fRntnfHgWxhUTqRNBGU7oYemx9MRsmWob14FE9vt1YKUZhqzUSU8htO6Oq3cqw==\"\n          }\n        ],\n        \"role\": \"model\"\n      },\n      \"finishReason\": \"STOP\",\n      \"index\": 0\n    }\n  ],\n  \"usageMetadata\": {\n    \"promptTokenCount\": 83,\n    \"candidatesTokenCount\": 7,\n    \"totalTokenCount\": 166,\n    \"promptTokensDetails\": [\n      {\n        \"modality\": \"TEXT\",\n        \"tokenCount\": 83\n      }\n    ],\n    \"thoughtsTokenCount\": 76\n  },\n  \"modelVersion\": \"gemini-2.5-flash\",\n  \"responseId\": \"KyawacSTEqvzkdUPlY6CsAU\"\n}\n"
  },
  {
    "path": "plugin/functioncallmodifier/testdata/TestPluginCallbackIntegration_transfer_to_agent_tool.httprr",
    "content": "httprr trace v1\n1870 1661\nPOST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent HTTP/1.1\r\nHost: generativelanguage.googleapis.com\r\nUser-Agent: Go-http-client/1.1\r\nContent-Length: 1637\r\nContent-Type: application/json\r\n\r\n{\"contents\":[{\"parts\":[{\"text\":\"Can you add 2 and 2?\"}],\"role\":\"user\"}],\"generationConfig\":{},\"systemInstruction\":{\"parts\":[{\"text\":\"You are a transfer agent. You can transfer to other agents using your tools.\\n\\nYou are an agent. Your internal name is \\\"transfer_agent\\\". The description about you is \\\"transfer agent\\\".\\n\\n\\nYou have a list of other agents to transfer to:\\n\\n\\nAgent name: calculator\\nAgent description: calculator agent\\n Skills: add, subtract, multiply, divide\\n\\n\\nIf you are the best to answer the question according to your description,\\nyou can answer it.\\n\\nIf another agent is better for answering the question according to its\\ndescription, call `transfer_to_agent` function to transfer the question to that\\nagent. When transferring, do not generate any text other than the function\\ncall.\\n\\n**NOTE**: the only available agents for `transfer_to_agent` function are\\n`calculator`.\\n\"}],\"role\":\"user\"},\"tools\":[{\"functionDeclarations\":[{\"description\":\"This tool can now optionally accept skill_id and rationale parameters to guide skill-based orchestration. Transfer the question to another agent.\\nThis tool hands off control to another agent when it's more suitable to answer the user's question according to the agent's description.\",\"name\":\"transfer_to_agent\",\"parameters\":{\"properties\":{\"agent_name\":{\"description\":\"the agent name to transfer to\",\"type\":\"string\"},\"rationale\":{\"description\":\"The reasoning behind selecting this agent and skill.\",\"type\":\"STRING\"},\"skill_id\":{\"description\":\"The specific skill to be utilized by the agent.\",\"type\":\"STRING\"}},\"required\":[\"agent_name\"],\"type\":\"object\"}}]}]}HTTP/2.0 200 OK\r\nContent-Type: application/json; charset=UTF-8\r\nDate: Tue, 10 Mar 2026 16:41:17 GMT\r\nServer: scaffolding on HTTPServer2\r\nServer-Timing: gfet4t7; dur=879\r\nVary: Origin\r\nVary: X-Origin\r\nVary: Referer\r\nX-Content-Type-Options: nosniff\r\nX-Frame-Options: SAMEORIGIN\r\nX-Xss-Protection: 0\r\n\r\n{\n  \"candidates\": [\n    {\n      \"content\": {\n        \"parts\": [\n          {\n            \"functionCall\": {\n              \"name\": \"transfer_to_agent\",\n              \"args\": {\n                \"rationale\": \"The user is asking to add two numbers, and the calculator agent has an add skill.\",\n                \"skill_id\": \"add\",\n                \"agent_name\": \"calculator\"\n              }\n            },\n            \"thoughtSignature\": \"CrkCAb4+9vuVxYErwo4K564nvFRtZJ5vSCa5BzbEJaYf0xzMasZk38U10MtlOTi99gVWdxlT8dMVfKF2BYIu5FBeuudfzZsDrNs+hGvvYx+k+MAmGi7wYCP+0DtD6vdzrkxpedfYh0bFsUkNNp0jF05wgqh0g4MwzdKf4C9WUvqKpkSUk41SXUaEeVNlNfbTtX+wHJT/Tw3MDFGAssWWlomNsmbjPJMDEP3ozhmvrA5iHm/lGZdGMoBpUU67TPhiFJnqCcQqFMrlkNQJtzhoksTlwhb9pc/GlOqlLma4DmEbBdNLtECU77j8RGshuK0I7cspHuVb6I3MIWSCr61k0A54UvcNmBkC55tyA0JBTpBVe64Y7Dw/jO1d3xuLN/Yt7pIVdglCV47FKJHIEP4LK3RleJHi50Hj+J4PdA==\"\n          }\n        ],\n        \"role\": \"model\"\n      },\n      \"finishReason\": \"STOP\",\n      \"index\": 0,\n      \"finishMessage\": \"Model generated function call(s).\"\n    }\n  ],\n  \"usageMetadata\": {\n    \"promptTokenCount\": 330,\n    \"candidatesTokenCount\": 47,\n    \"totalTokenCount\": 436,\n    \"promptTokensDetails\": [\n      {\n        \"modality\": \"TEXT\",\n        \"tokenCount\": 330\n      }\n    ],\n    \"thoughtsTokenCount\": 59\n  },\n  \"modelVersion\": \"gemini-2.5-flash\",\n  \"responseId\": \"rEmwaZamPOmakdUP45HlkQo\"\n}\n2247 1254\nPOST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent HTTP/1.1\r\nHost: generativelanguage.googleapis.com\r\nUser-Agent: Go-http-client/1.1\r\nContent-Length: 2014\r\nContent-Type: application/json\r\n\r\n{\"contents\":[{\"parts\":[{\"text\":\"Can you add 2 and 2?\"}],\"role\":\"user\"},{\"parts\":[{\"text\":\"For context:\"},{\"text\":\"[transfer_agent] called tool `transfer_to_agent` with parameters: {\\\"agent_name\\\":\\\"calculator\\\"}\"}],\"role\":\"user\"},{\"parts\":[{\"text\":\"For context:\"},{\"text\":\"[transfer_agent] `transfer_to_agent` tool returned result: {}\"}],\"role\":\"user\"}],\"generationConfig\":{},\"systemInstruction\":{\"parts\":[{\"text\":\"You are a calculator agent. You can calculate numbers.\\n\\nYou are an agent. Your internal name is \\\"calculator\\\". The description about you is \\\"calculator agent\\\\n Skills: add, subtract, multiply, divide\\\".\\n\\n\\nYou have a list of other agents to transfer to:\\n\\n\\nAgent name: transfer_agent\\nAgent description: transfer agent\\n\\n\\nIf you are the best to answer the question according to your description,\\nyou can answer it.\\n\\nIf another agent is better for answering the question according to its\\ndescription, call `transfer_to_agent` function to transfer the question to that\\nagent. When transferring, do not generate any text other than the function\\ncall.\\n\\n**NOTE**: the only available agents for `transfer_to_agent` function are\\n`transfer_agent`.\\n\\nIf neither you nor the other agents are best for the question, transfer to your parent agent transfer_agent.\\n\"}],\"role\":\"user\"},\"tools\":[{\"functionDeclarations\":[{\"description\":\"This tool can now optionally accept skill_id and rationale parameters to guide skill-based orchestration. Transfer the question to another agent.\\nThis tool hands off control to another agent when it's more suitable to answer the user's question according to the agent's description.\",\"name\":\"transfer_to_agent\",\"parameters\":{\"properties\":{\"agent_name\":{\"description\":\"the agent name to transfer to\",\"type\":\"string\"},\"rationale\":{\"description\":\"The reasoning behind selecting this agent and skill.\",\"type\":\"STRING\"},\"skill_id\":{\"description\":\"The specific skill to be utilized by the agent.\",\"type\":\"STRING\"}},\"required\":[\"agent_name\"],\"type\":\"object\"}}]}]}HTTP/2.0 200 OK\r\nContent-Type: application/json; charset=UTF-8\r\nDate: Tue, 10 Mar 2026 16:41:18 GMT\r\nServer: scaffolding on HTTPServer2\r\nServer-Timing: gfet4t7; dur=847\r\nVary: Origin\r\nVary: X-Origin\r\nVary: Referer\r\nX-Content-Type-Options: nosniff\r\nX-Frame-Options: SAMEORIGIN\r\nX-Xss-Protection: 0\r\n\r\n{\n  \"candidates\": [\n    {\n      \"content\": {\n        \"parts\": [\n          {\n            \"text\": \"2 plus 2 is 4.\",\n            \"thoughtSignature\": \"CooCAb4+9vuh3wN99g1wzITVbxOvpWDIn36qoIUkUOy2L68xaVznt2SqQkYLw6W36gial9UelP09PlXYlDJFP4/zZA61mpZJu6noT5snlF2YL/Ygr7XpZ4W6AAtNSSL9hd43tUpLZd58Xktyiosvy2D54dNy1gtKxKkEBCo+0OQr++cFGEAmrkOwfYAxSss1vN+FbG95fI+SpFlulaseBQ+PQmBkJkibK7vk1vdrVqLcgUpxYKzxZaLyS0kbnfSCdh/Ssa8BHsG+u666gVHF/H59ifepCyEZ9wDxYCsWj/L2giI1Qf0ffv0b/bz7fwWx3ysPR5sh8hT7x233ryIgNUoNWp7nx3I3peleTb8=\"\n          }\n        ],\n        \"role\": \"model\"\n      },\n      \"finishReason\": \"STOP\",\n      \"index\": 0\n    }\n  ],\n  \"usageMetadata\": {\n    \"promptTokenCount\": 400,\n    \"candidatesTokenCount\": 8,\n    \"totalTokenCount\": 459,\n    \"promptTokensDetails\": [\n      {\n        \"modality\": \"TEXT\",\n        \"tokenCount\": 400\n      }\n    ],\n    \"thoughtsTokenCount\": 51\n  },\n  \"modelVersion\": \"gemini-2.5-flash\",\n  \"responseId\": \"rUmwaZLzNJaxkdUP58PwoAk\"\n}\n"
  },
  {
    "path": "plugin/loggingplugin/logging_plugin.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage loggingplugin\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/agent\"\n\t\"google.golang.org/adk/model\"\n\t\"google.golang.org/adk/plugin\"\n\t\"google.golang.org/adk/session\"\n\t\"google.golang.org/adk/tool\"\n)\n\n// New creates an instance of the logging plugin.\n//\n// This plugin helps print all critical events in the console. It is not a\n// replacement of existing logging in ADK. It rather helps terminal based\n// debugging by showing all logs in the console, and serves as a simple demo for\n// everyone to leverage when developing new plugins.\n//\n// This plugin helps users track the invocation status by logging:\n// - User messages and invocation context\n// - Agent execution flow\n// - LLM requests and responses\n// - Tool calls with arguments and results\n// - Events and final responses\n// - Errors during model and tool execution\nfunc New(name string) (*plugin.Plugin, error) {\n\tif name == \"\" {\n\t\tname = \"logging_plugin\"\n\t}\n\tp := &loggingPlugin{name: name}\n\treturn plugin.New(plugin.Config{\n\t\tName:                  name,\n\t\tOnUserMessageCallback: p.onUserMessage,\n\t\tBeforeRunCallback:     p.beforeRun,\n\t\tOnEventCallback:       p.onEvent,\n\t\tAfterRunCallback:      p.afterRun,\n\t\tBeforeAgentCallback:   p.beforeAgent,\n\t\tAfterAgentCallback:    p.afterAgent,\n\t\tBeforeModelCallback:   p.beforeModel,\n\t\tAfterModelCallback:    p.afterModel,\n\t\tOnModelErrorCallback:  p.onModelError,\n\t\tBeforeToolCallback:    p.beforeTool,\n\t\tAfterToolCallback:     p.afterTool,\n\t\tOnToolErrorCallback:   p.onToolError,\n\t})\n}\n\n// MustNew is like New but panics if there is an error.\nfunc MustNew(name string) *plugin.Plugin {\n\tp, err := New(name)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn p\n}\n\ntype loggingPlugin struct {\n\tname string\n}\n\nfunc (p *loggingPlugin) log(msg string) {\n\t// ANSI color codes: \\033[90m for grey, \\033[0m to reset\n\tfmt.Printf(\"\\033[90m[%s] %s\\033[0m\\n\", p.name, msg)\n}\n\nfunc (p *loggingPlugin) formatContent(content *genai.Content, maxLength int) string {\n\tif content == nil || len(content.Parts) == 0 {\n\t\treturn \"None\"\n\t}\n\n\tvar parts []string\n\tfor _, part := range content.Parts {\n\t\tif part.Text != \"\" {\n\t\t\ttext := strings.TrimSpace(part.Text)\n\t\t\tif len(text) > maxLength {\n\t\t\t\ttext = text[:maxLength] + \"...\"\n\t\t\t}\n\t\t\tparts = append(parts, fmt.Sprintf(\"text: '%s'\", text))\n\t\t} else if part.FunctionCall != nil {\n\t\t\tparts = append(parts, fmt.Sprintf(\"function_call: %s\", part.FunctionCall.Name))\n\t\t} else if part.FunctionResponse != nil {\n\t\t\tparts = append(parts, fmt.Sprintf(\"function_response: %s\", part.FunctionResponse.Name))\n\t\t} else if part.CodeExecutionResult != nil {\n\t\t\tparts = append(parts, \"code_execution_result\")\n\t\t} else {\n\t\t\tparts = append(parts, \"other_part\")\n\t\t}\n\t}\n\treturn strings.Join(parts, \" | \")\n}\n\nfunc (p *loggingPlugin) formatArgs(args map[string]any, maxLength int) string {\n\tif len(args) == 0 {\n\t\treturn \"{}\"\n\t}\n\tformatted := fmt.Sprintf(\"%v\", args)\n\tif len(formatted) > maxLength {\n\t\tformatted = formatted[:maxLength] + \"...}\"\n\t}\n\treturn formatted\n}\n\nfunc (p *loggingPlugin) onUserMessage(ctx agent.InvocationContext, userMessage *genai.Content) (*genai.Content, error) {\n\tp.log(\"🚀 USER MESSAGE RECEIVED\")\n\tp.log(fmt.Sprintf(\"   Invocation ID: %s\", ctx.InvocationID()))\n\tp.log(fmt.Sprintf(\"   Session ID: %s\", ctx.Session().ID()))\n\tp.log(fmt.Sprintf(\"   User ID: %s\", ctx.Session().UserID()))\n\tp.log(fmt.Sprintf(\"   App Name: %s\", ctx.Session().AppName()))\n\tagentName := \"Unknown\"\n\tif ctx.Agent() != nil {\n\t\tagentName = ctx.Agent().Name()\n\t}\n\tp.log(fmt.Sprintf(\"   Root Agent: %s\", agentName))\n\tp.log(fmt.Sprintf(\"   User Content: %s\", p.formatContent(userMessage, 200)))\n\tif ctx.Branch() != \"\" {\n\t\tp.log(fmt.Sprintf(\"   Branch: %s\", ctx.Branch()))\n\t}\n\treturn nil, nil\n}\n\nfunc (p *loggingPlugin) beforeRun(ctx agent.InvocationContext) (*genai.Content, error) {\n\tp.log(\"🏃 INVOCATION STARTING\")\n\tp.log(fmt.Sprintf(\"   Invocation ID: %s\", ctx.InvocationID()))\n\tagentName := \"Unknown\"\n\tif ctx.Agent() != nil {\n\t\tagentName = ctx.Agent().Name()\n\t}\n\tp.log(fmt.Sprintf(\"   Starting Agent: %s\", agentName))\n\treturn nil, nil\n}\n\nfunc (p *loggingPlugin) onEvent(ctx agent.InvocationContext, event *session.Event) (*session.Event, error) {\n\tp.log(\"📢 EVENT YIELDED\")\n\tp.log(fmt.Sprintf(\"   Event ID: %s\", event.ID))\n\tp.log(fmt.Sprintf(\"   Author: %s\", event.Author))\n\tp.log(fmt.Sprintf(\"   Content: %s\", p.formatContent(event.Content, 200)))\n\tp.log(fmt.Sprintf(\"   Final Response: %v\", event.IsFinalResponse()))\n\n\tvar funcCalls []string\n\tvar funcResponses []string\n\n\tif event.Content != nil {\n\t\tfor _, part := range event.Content.Parts {\n\t\t\tif part.FunctionCall != nil {\n\t\t\t\tfuncCalls = append(funcCalls, part.FunctionCall.Name)\n\t\t\t}\n\t\t\tif part.FunctionResponse != nil {\n\t\t\t\tfuncResponses = append(funcResponses, part.FunctionResponse.Name)\n\t\t\t}\n\t\t}\n\t}\n\n\tif len(funcCalls) > 0 {\n\t\tp.log(fmt.Sprintf(\"   Function Calls: %v\", funcCalls))\n\t}\n\tif len(funcResponses) > 0 {\n\t\tp.log(fmt.Sprintf(\"   Function Responses: %v\", funcResponses))\n\t}\n\tif len(event.LongRunningToolIDs) > 0 {\n\t\tp.log(fmt.Sprintf(\"   Long Running Tools: %v\", event.LongRunningToolIDs))\n\t}\n\n\treturn nil, nil\n}\n\nfunc (p *loggingPlugin) afterRun(ctx agent.InvocationContext) {\n\tp.log(\"✅ INVOCATION COMPLETED\")\n\tp.log(fmt.Sprintf(\"   Invocation ID: %s\", ctx.InvocationID()))\n\tagentName := \"Unknown\"\n\tif ctx.Agent() != nil {\n\t\tagentName = ctx.Agent().Name()\n\t}\n\tp.log(fmt.Sprintf(\"   Final Agent: %s\", agentName))\n}\n\nfunc (p *loggingPlugin) beforeAgent(ctx agent.CallbackContext) (*genai.Content, error) {\n\tp.log(\"🤖 AGENT STARTING\")\n\tp.log(fmt.Sprintf(\"   Agent Name: %s\", ctx.AgentName()))\n\tp.log(fmt.Sprintf(\"   Invocation ID: %s\", ctx.InvocationID()))\n\tif ctx.Branch() != \"\" {\n\t\tp.log(fmt.Sprintf(\"   Branch: %s\", ctx.Branch()))\n\t}\n\treturn nil, nil\n}\n\nfunc (p *loggingPlugin) afterAgent(ctx agent.CallbackContext) (*genai.Content, error) {\n\tp.log(\"🤖 AGENT COMPLETED\")\n\tp.log(fmt.Sprintf(\"   Agent Name: %s\", ctx.AgentName()))\n\tp.log(fmt.Sprintf(\"   Invocation ID: %s\", ctx.InvocationID()))\n\treturn nil, nil\n}\n\nfunc (p *loggingPlugin) beforeModel(ctx agent.CallbackContext, req *model.LLMRequest) (*model.LLMResponse, error) {\n\tp.log(\"🧠 LLM REQUEST\")\n\tmodelName := \"default\"\n\tif req.Model != \"\" {\n\t\tmodelName = req.Model\n\t}\n\tp.log(fmt.Sprintf(\"   Model: %s\", modelName))\n\tp.log(fmt.Sprintf(\"   Agent: %s\", ctx.AgentName()))\n\n\tif req.Config != nil && req.Config.SystemInstruction != nil && len(req.Config.SystemInstruction.Parts) > 0 {\n\t\t// Assuming SystemInstruction is a Content object with parts\n\t\tsysInstruction := \"\"\n\t\tfor _, part := range req.Config.SystemInstruction.Parts {\n\t\t\tsysInstruction += part.Text\n\t\t}\n\t\tif len(sysInstruction) > 200 {\n\t\t\tsysInstruction = sysInstruction[:200] + \"...\"\n\t\t}\n\t\tp.log(fmt.Sprintf(\"   System Instruction: '%s'\", sysInstruction))\n\t}\n\n\tif len(req.Tools) > 0 {\n\t\tvar toolNames []string\n\t\tfor name := range req.Tools {\n\t\t\ttoolNames = append(toolNames, name)\n\t\t}\n\t\tp.log(fmt.Sprintf(\"   Available Tools: %v\", toolNames))\n\t}\n\n\treturn nil, nil\n}\n\nfunc (p *loggingPlugin) afterModel(ctx agent.CallbackContext, resp *model.LLMResponse, err error) (*model.LLMResponse, error) {\n\tp.log(\"🧠 LLM RESPONSE\")\n\tp.log(fmt.Sprintf(\"   Agent: %s\", ctx.AgentName()))\n\n\t// If error passed in, log it\n\tif err != nil {\n\t\tp.log(fmt.Sprintf(\"   ❌ ERROR - %v\", err))\n\t\treturn nil, nil // Return nil, nil to propagate original error\n\t}\n\n\tif resp != nil {\n\t\tif resp.ErrorCode != \"\" {\n\t\t\tp.log(fmt.Sprintf(\"   ❌ ERROR - Code: %s\", resp.ErrorCode))\n\t\t\tp.log(fmt.Sprintf(\"   Error Message: %s\", resp.ErrorMessage))\n\t\t} else {\n\t\t\tp.log(fmt.Sprintf(\"   Content: %s\", p.formatContent(resp.Content, 200)))\n\t\t\tif resp.Partial {\n\t\t\t\tp.log(fmt.Sprintf(\"   Partial: %v\", resp.Partial))\n\t\t\t}\n\t\t\t// TurnComplete is a boolean in Go model\n\t\t\tp.log(fmt.Sprintf(\"   Turn Complete: %v\", resp.TurnComplete))\n\t\t}\n\n\t\tif resp.UsageMetadata != nil {\n\t\t\tp.log(fmt.Sprintf(\"   Token Usage - Input: %d, Output: %d\",\n\t\t\t\tresp.UsageMetadata.PromptTokenCount, resp.UsageMetadata.CandidatesTokenCount))\n\t\t}\n\t}\n\n\treturn nil, nil\n}\n\nfunc (p *loggingPlugin) onModelError(ctx agent.CallbackContext, req *model.LLMRequest, err error) (*model.LLMResponse, error) {\n\tp.log(\"🧠 LLM ERROR\")\n\tp.log(fmt.Sprintf(\"   Agent: %s\", ctx.AgentName()))\n\tp.log(fmt.Sprintf(\"   Error: %v\", err))\n\treturn nil, nil\n}\n\nfunc (p *loggingPlugin) beforeTool(ctx tool.Context, t tool.Tool, args map[string]any) (map[string]any, error) {\n\tp.log(\"🔧 TOOL STARTING\")\n\tp.log(fmt.Sprintf(\"   Tool Name: %s\", t.Name()))\n\tp.log(fmt.Sprintf(\"   Agent: %s\", ctx.AgentName()))\n\tp.log(fmt.Sprintf(\"   Function Call ID: %s\", ctx.FunctionCallID()))\n\tp.log(fmt.Sprintf(\"   Arguments: %s\", p.formatArgs(args, 300)))\n\treturn nil, nil\n}\n\nfunc (p *loggingPlugin) afterTool(ctx tool.Context, t tool.Tool, args, result map[string]any, err error) (map[string]any, error) {\n\tp.log(\"🔧 TOOL COMPLETED\")\n\tp.log(fmt.Sprintf(\"   Tool Name: %s\", t.Name()))\n\tp.log(fmt.Sprintf(\"   Agent: %s\", ctx.AgentName()))\n\tp.log(fmt.Sprintf(\"   Function Call ID: %s\", ctx.FunctionCallID()))\n\tif err != nil {\n\t\tp.log(fmt.Sprintf(\"   Error: %v\", err))\n\t} else {\n\t\tp.log(fmt.Sprintf(\"   Result: %s\", p.formatArgs(result, 300)))\n\t}\n\treturn nil, nil\n}\n\nfunc (p *loggingPlugin) onToolError(ctx tool.Context, t tool.Tool, args map[string]any, err error) (map[string]any, error) {\n\tp.log(\"🔧 TOOL ERROR\")\n\tp.log(fmt.Sprintf(\"   Tool Name: %s\", t.Name()))\n\tp.log(fmt.Sprintf(\"   Agent: %s\", ctx.AgentName()))\n\tp.log(fmt.Sprintf(\"   Function Call ID: %s\", ctx.FunctionCallID()))\n\tp.log(fmt.Sprintf(\"   Arguments: %s\", p.formatArgs(args, 300)))\n\tp.log(fmt.Sprintf(\"   Error: %v\", err))\n\treturn nil, nil\n}\n"
  },
  {
    "path": "plugin/plugin.go",
    "content": "// Copyright 2026 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Package plugin provides.\npackage plugin\n\nimport (\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/agent\"\n\t\"google.golang.org/adk/agent/llmagent\"\n\t\"google.golang.org/adk/session\"\n)\n\ntype Config struct {\n\tName string\n\n\tOnUserMessageCallback OnUserMessageCallback\n\n\tOnEventCallback OnEventCallback\n\n\tBeforeRunCallback BeforeRunCallback\n\tAfterRunCallback  AfterRunCallback\n\n\tBeforeAgentCallback agent.BeforeAgentCallback\n\tAfterAgentCallback  agent.AfterAgentCallback\n\n\tBeforeModelCallback  llmagent.BeforeModelCallback\n\tAfterModelCallback   llmagent.AfterModelCallback\n\tOnModelErrorCallback llmagent.OnModelErrorCallback\n\n\tBeforeToolCallback  llmagent.BeforeToolCallback\n\tAfterToolCallback   llmagent.AfterToolCallback\n\tOnToolErrorCallback llmagent.OnToolErrorCallback\n\n\tCloseFunc func() error\n}\n\nfunc New(cfg Config) (*Plugin, error) {\n\tp := &Plugin{\n\t\tname:                  cfg.Name,\n\t\tonUserMessageCallback: cfg.OnUserMessageCallback,\n\t\tonEventCallback:       cfg.OnEventCallback,\n\t\tbeforeRunCallback:     cfg.BeforeRunCallback,\n\t\tafterRunCallback:      cfg.AfterRunCallback,\n\t\tbeforeAgentCallback:   cfg.BeforeAgentCallback,\n\t\tafterAgentCallback:    cfg.AfterAgentCallback,\n\t\tbeforeModelCallback:   cfg.BeforeModelCallback,\n\t\tafterModelCallback:    cfg.AfterModelCallback,\n\t\tonModelErrorCallback:  cfg.OnModelErrorCallback,\n\t\tbeforeToolCallback:    cfg.BeforeToolCallback,\n\t\tafterToolCallback:     cfg.AfterToolCallback,\n\t\tonToolErrorCallback:   cfg.OnToolErrorCallback,\n\t\tcloseFunc:             cfg.CloseFunc,\n\t}\n\n\t// Ensure closeFunc is never nil so p.Close() doesn't panic\n\tif p.closeFunc == nil {\n\t\tp.closeFunc = func() error {\n\t\t\treturn nil\n\t\t}\n\t}\n\n\treturn p, nil\n}\n\ntype Plugin struct {\n\tname string\n\n\tonUserMessageCallback OnUserMessageCallback\n\tonEventCallback       OnEventCallback\n\n\tbeforeRunCallback BeforeRunCallback\n\tafterRunCallback  AfterRunCallback\n\n\tbeforeAgentCallback agent.BeforeAgentCallback\n\tafterAgentCallback  agent.AfterAgentCallback\n\n\tbeforeModelCallback  llmagent.BeforeModelCallback\n\tafterModelCallback   llmagent.AfterModelCallback\n\tonModelErrorCallback llmagent.OnModelErrorCallback\n\n\tbeforeToolCallback  llmagent.BeforeToolCallback\n\tafterToolCallback   llmagent.AfterToolCallback\n\tonToolErrorCallback llmagent.OnToolErrorCallback\n\n\tcloseFunc func() error\n}\n\n// Name returns the name of the plugin.\nfunc (p *Plugin) Name() string {\n\treturn p.name\n}\n\n// Close safely calls the internal close function.\nfunc (p *Plugin) Close() error {\n\treturn p.closeFunc()\n}\n\n// --- Accessors ---\n\nfunc (p *Plugin) OnUserMessageCallback() OnUserMessageCallback {\n\treturn p.onUserMessageCallback\n}\n\nfunc (p *Plugin) OnEventCallback() OnEventCallback {\n\treturn p.onEventCallback\n}\n\nfunc (p *Plugin) BeforeRunCallback() BeforeRunCallback {\n\treturn p.beforeRunCallback\n}\n\nfunc (p *Plugin) AfterRunCallback() AfterRunCallback {\n\treturn p.afterRunCallback\n}\n\nfunc (p *Plugin) BeforeAgentCallback() agent.BeforeAgentCallback {\n\treturn p.beforeAgentCallback\n}\n\nfunc (p *Plugin) AfterAgentCallback() agent.AfterAgentCallback {\n\treturn p.afterAgentCallback\n}\n\nfunc (p *Plugin) BeforeModelCallback() llmagent.BeforeModelCallback {\n\treturn p.beforeModelCallback\n}\n\nfunc (p *Plugin) AfterModelCallback() llmagent.AfterModelCallback {\n\treturn p.afterModelCallback\n}\n\nfunc (p *Plugin) OnModelErrorCallback() llmagent.OnModelErrorCallback {\n\treturn p.onModelErrorCallback\n}\n\nfunc (p *Plugin) BeforeToolCallback() llmagent.BeforeToolCallback {\n\treturn p.beforeToolCallback\n}\n\nfunc (p *Plugin) AfterToolCallback() llmagent.AfterToolCallback {\n\treturn p.afterToolCallback\n}\n\nfunc (p *Plugin) OnToolErrorCallback() llmagent.OnToolErrorCallback {\n\treturn p.onToolErrorCallback\n}\n\ntype OnUserMessageCallback func(agent.InvocationContext, *genai.Content) (*genai.Content, error)\n\ntype BeforeRunCallback func(agent.InvocationContext) (*genai.Content, error)\n\ntype AfterRunCallback func(agent.InvocationContext)\n\ntype OnEventCallback func(agent.InvocationContext, *session.Event) (*session.Event, error)\n"
  },
  {
    "path": "plugin/plugin_manager_test.go",
    "content": "// Copyright 2026 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage plugin_test\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"net/http\"\n\t\"testing\"\n\n\t\"github.com/google/go-cmp/cmp\"\n\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/agent\"\n\t\"google.golang.org/adk/agent/llmagent\"\n\t\"google.golang.org/adk/internal/testutil\"\n\t\"google.golang.org/adk/model\"\n\t\"google.golang.org/adk/plugin\"\n\t\"google.golang.org/adk/runner\"\n\t\"google.golang.org/adk/tool\"\n\t\"google.golang.org/adk/tool/functiontool\"\n)\n\ntype testCase struct {\n\tname                            string\n\ttool                            func(tool.Context, map[string]any) (map[string]any, error)\n\targs                            map[string]any\n\tbeforeToolCallbacks             []llmagent.BeforeToolCallback\n\tafterToolCallbacks              []llmagent.AfterToolCallback\n\tonToolErrorCallbacks            []llmagent.OnToolErrorCallback\n\twant                            map[string]any\n\tdontRunBeforeCanonicalCallback  bool\n\tdontRunAfterCanonicalCallback   bool\n\tdontRunOnErrorCanonicalCallback bool\n}\n\nfunc TestCallTool(t *testing.T) {\n\ttestCases := []testCase{\n\t\t{\n\t\t\tname: \"tool runs successfully\",\n\t\t\ttool: func(ctx tool.Context, args map[string]any) (map[string]any, error) {\n\t\t\t\treturn map[string]any{\"result\": \"success\"}, nil\n\t\t\t},\n\t\t\targs:                            map[string]any{\"key\": \"value\"},\n\t\t\tdontRunOnErrorCanonicalCallback: true,\n\t\t\twant:                            map[string]any{\"result\": \"success\"},\n\t\t},\n\t\t{\n\t\t\tname: \"tool error\",\n\t\t\ttool: func(ctx tool.Context, args map[string]any) (map[string]any, error) {\n\t\t\t\treturn nil, errors.New(\"tool error\")\n\t\t\t},\n\t\t\targs: map[string]any{\"key\": \"value\"},\n\t\t\twant: map[string]any{\"error\": \"tool error\"},\n\t\t},\n\t\t{\n\t\t\tname: \"before callback returns result\",\n\t\t\ttool: func(ctx tool.Context, args map[string]any) (map[string]any, error) {\n\t\t\t\tt.Error(\"tool should not be called\")\n\t\t\t\treturn nil, nil\n\t\t\t},\n\t\t\tbeforeToolCallbacks: []llmagent.BeforeToolCallback{\n\t\t\t\tfunc(ctx tool.Context, tool tool.Tool, args map[string]any) (map[string]any, error) {\n\t\t\t\t\treturn map[string]any{\"result\": \"intercepted\"}, nil\n\t\t\t\t},\n\t\t\t\tfunc(ctx tool.Context, tool tool.Tool, args map[string]any) (map[string]any, error) {\n\t\t\t\t\treturn map[string]any{\"result\": \"2nd callback should not be called\"}, nil\n\t\t\t\t},\n\t\t\t},\n\t\t\tdontRunOnErrorCanonicalCallback: true,\n\t\t\tdontRunBeforeCanonicalCallback:  true,\n\t\t\twant:                            map[string]any{\"result\": \"intercepted\"},\n\t\t},\n\t\t{\n\t\t\tname: \"before callback returns error\",\n\t\t\ttool: func(ctx tool.Context, args map[string]any) (map[string]any, error) {\n\t\t\t\tt.Error(\"tool should not be called\")\n\t\t\t\treturn nil, nil\n\t\t\t},\n\t\t\tbeforeToolCallbacks: []llmagent.BeforeToolCallback{\n\t\t\t\tfunc(ctx tool.Context, tool tool.Tool, args map[string]any) (map[string]any, error) {\n\t\t\t\t\treturn nil, errors.New(\"before callback error\")\n\t\t\t\t},\n\t\t\t\tfunc(ctx tool.Context, tool tool.Tool, args map[string]any) (map[string]any, error) {\n\t\t\t\t\treturn nil, errors.New(\"unexpected error\")\n\t\t\t\t},\n\t\t\t},\n\t\t\tdontRunBeforeCanonicalCallback: true,\n\t\t\twant:                           map[string]any{\"error\": \"before callback error\"},\n\t\t},\n\t\t{\n\t\t\tname: \"after callback modifies result\",\n\t\t\ttool: func(ctx tool.Context, args map[string]any) (map[string]any, error) {\n\t\t\t\treturn map[string]any{\"result\": \"original\"}, nil\n\t\t\t},\n\t\t\tafterToolCallbacks: []llmagent.AfterToolCallback{\n\t\t\t\tfunc(ctx tool.Context, tool tool.Tool, args, result map[string]any, err error) (map[string]any, error) {\n\t\t\t\t\treturn map[string]any{\"result\": \"modified\"}, nil\n\t\t\t\t},\n\t\t\t},\n\t\t\tdontRunAfterCanonicalCallback:   true,\n\t\t\tdontRunOnErrorCanonicalCallback: true,\n\t\t\twant:                            map[string]any{\"result\": \"modified\"},\n\t\t},\n\t\t{\n\t\t\tname: \"after callback handles error and are run in symmetrical order\",\n\t\t\ttool: func(ctx tool.Context, args map[string]any) (map[string]any, error) {\n\t\t\t\treturn nil, errors.New(\"tool error\")\n\t\t\t},\n\t\t\tafterToolCallbacks: []llmagent.AfterToolCallback{\n\t\t\t\tfunc(ctx tool.Context, tool tool.Tool, args, result map[string]any, err error) (map[string]any, error) {\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn map[string]any{\"result\": \"error handled\"}, nil\n\t\t\t\t\t}\n\t\t\t\t\treturn nil, nil\n\t\t\t\t},\n\t\t\t\tfunc(ctx tool.Context, tool tool.Tool, args, result map[string]any, err error) (map[string]any, error) {\n\t\t\t\t\tt.Errorf(\"unexpected call to after tool callback\")\n\t\t\t\t\treturn map[string]any{\"result\": \"unexpected output\"}, nil\n\t\t\t\t},\n\t\t\t},\n\t\t\tdontRunAfterCanonicalCallback: true,\n\t\t\twant:                          map[string]any{\"result\": \"error handled\"},\n\t\t},\n\t\t{\n\t\t\tname: \"after callback returns error and are run in symmetrical order\",\n\t\t\ttool: func(ctx tool.Context, args map[string]any) (map[string]any, error) {\n\t\t\t\treturn map[string]any{\"result\": \"success\"}, nil\n\t\t\t},\n\t\t\tafterToolCallbacks: []llmagent.AfterToolCallback{\n\t\t\t\tfunc(ctx tool.Context, tool tool.Tool, args, result map[string]any, err error) (map[string]any, error) {\n\t\t\t\t\treturn nil, errors.New(\"after callback error\")\n\t\t\t\t},\n\t\t\t\tfunc(ctx tool.Context, tool tool.Tool, args, result map[string]any, err error) (map[string]any, error) {\n\t\t\t\t\tt.Errorf(\"unexpected call to after tool callback\")\n\t\t\t\t\treturn nil, errors.New(\"unexpected error\")\n\t\t\t\t},\n\t\t\t},\n\t\t\tdontRunOnErrorCanonicalCallback: true,\n\t\t\tdontRunAfterCanonicalCallback:   true,\n\t\t\twant:                            map[string]any{\"error\": \"after callback error\"},\n\t\t},\n\t\t{\n\t\t\tname: \"no-op callbacks return func results\",\n\t\t\ttool: func(ctx tool.Context, args map[string]any) (map[string]any, error) {\n\t\t\t\treturn map[string]any{\"result\": \"success\"}, nil\n\t\t\t},\n\t\t\tbeforeToolCallbacks: []llmagent.BeforeToolCallback{\n\t\t\t\tfunc(ctx tool.Context, tool tool.Tool, args map[string]any) (map[string]any, error) {\n\t\t\t\t\treturn nil, nil\n\t\t\t\t},\n\t\t\t},\n\t\t\tafterToolCallbacks: []llmagent.AfterToolCallback{\n\t\t\t\tfunc(ctx tool.Context, tool tool.Tool, args, result map[string]any, err error) (map[string]any, error) {\n\t\t\t\t\treturn nil, nil\n\t\t\t\t},\n\t\t\t},\n\t\t\tdontRunOnErrorCanonicalCallback: true,\n\t\t\twant:                            map[string]any{\"result\": \"success\"},\n\t\t},\n\t\t{\n\t\t\tname: \"before callback result passed to after callback\",\n\t\t\ttool: func(ctx tool.Context, args map[string]any) (map[string]any, error) {\n\t\t\t\tt.Error(\"tool should not be called\")\n\t\t\t\treturn nil, nil\n\t\t\t},\n\t\t\tbeforeToolCallbacks: []llmagent.BeforeToolCallback{\n\t\t\t\tfunc(ctx tool.Context, tool tool.Tool, args map[string]any) (map[string]any, error) {\n\t\t\t\t\treturn map[string]any{\"result\": \"from_before\"}, nil\n\t\t\t\t},\n\t\t\t},\n\t\t\tafterToolCallbacks: []llmagent.AfterToolCallback{\n\t\t\t\tfunc(ctx tool.Context, tool tool.Tool, args, result map[string]any, err error) (map[string]any, error) {\n\t\t\t\t\tif val, ok := result[\"result\"]; !ok || val != \"from_before\" {\n\t\t\t\t\t\treturn nil, errors.New(\"unexpected result in after callback\")\n\t\t\t\t\t}\n\t\t\t\t\treturn map[string]any{\"result\": \"from_after\"}, nil\n\t\t\t\t},\n\t\t\t},\n\t\t\tdontRunOnErrorCanonicalCallback: true,\n\t\t\tdontRunBeforeCanonicalCallback:  true,\n\t\t\tdontRunAfterCanonicalCallback:   true,\n\t\t\twant:                            map[string]any{\"result\": \"from_after\"},\n\t\t},\n\t\t{\n\t\t\tname: \"before callback error passed to after callback\",\n\t\t\ttool: func(ctx tool.Context, args map[string]any) (map[string]any, error) {\n\t\t\t\tt.Error(\"tool should not be called\")\n\t\t\t\treturn nil, nil\n\t\t\t},\n\t\t\tbeforeToolCallbacks: []llmagent.BeforeToolCallback{\n\t\t\t\tfunc(ctx tool.Context, tool tool.Tool, args map[string]any) (map[string]any, error) {\n\t\t\t\t\treturn nil, errors.New(\"error_from_before\")\n\t\t\t\t},\n\t\t\t},\n\t\t\tafterToolCallbacks: []llmagent.AfterToolCallback{\n\t\t\t\tfunc(ctx tool.Context, tool tool.Tool, args, result map[string]any, err error) (map[string]any, error) {\n\t\t\t\t\tif err == nil || err.Error() != \"error_from_before\" {\n\t\t\t\t\t\treturn nil, errors.New(\"unexpected error in after callback\")\n\t\t\t\t\t}\n\t\t\t\t\treturn map[string]any{\"result\": \"error_handled_in_after\"}, nil\n\t\t\t\t},\n\t\t\t},\n\t\t\tdontRunBeforeCanonicalCallback: true,\n\t\t\tdontRunAfterCanonicalCallback:  true,\n\t\t\twant:                           map[string]any{\"result\": \"error_handled_in_after\"},\n\t\t},\n\t\t{\n\t\t\tname: \"before callback error passed to on tool error callback\",\n\t\t\ttool: func(ctx tool.Context, args map[string]any) (map[string]any, error) {\n\t\t\t\tt.Error(\"tool should not be called\")\n\t\t\t\treturn nil, nil\n\t\t\t},\n\t\t\tbeforeToolCallbacks: []llmagent.BeforeToolCallback{\n\t\t\t\tfunc(ctx tool.Context, tool tool.Tool, args map[string]any) (map[string]any, error) {\n\t\t\t\t\treturn nil, errors.New(\"error_from_before\")\n\t\t\t\t},\n\t\t\t},\n\t\t\tonToolErrorCallbacks: []llmagent.OnToolErrorCallback{\n\t\t\t\tfunc(ctx tool.Context, tool tool.Tool, args map[string]any, err error) (map[string]any, error) {\n\t\t\t\t\tif err == nil || err.Error() != \"error_from_before\" {\n\t\t\t\t\t\treturn nil, errors.New(\"unexpected error in on tool error callback\")\n\t\t\t\t\t}\n\t\t\t\t\treturn map[string]any{\"result\": \"error_handled_in_on_tool_error_callback\"}, nil\n\t\t\t\t},\n\t\t\t},\n\t\t\tdontRunBeforeCanonicalCallback:  true,\n\t\t\tdontRunOnErrorCanonicalCallback: true,\n\t\t\twant:                            map[string]any{\"result\": \"error_handled_in_on_tool_error_callback\"},\n\t\t},\n\t\t{\n\t\t\tname: \"before callback error passed to on tool error callback and after tool called\",\n\t\t\ttool: func(ctx tool.Context, args map[string]any) (map[string]any, error) {\n\t\t\t\tt.Error(\"tool should not be called\")\n\t\t\t\treturn nil, nil\n\t\t\t},\n\t\t\tbeforeToolCallbacks: []llmagent.BeforeToolCallback{\n\t\t\t\tfunc(ctx tool.Context, tool tool.Tool, args map[string]any) (map[string]any, error) {\n\t\t\t\t\treturn nil, errors.New(\"error_from_before\")\n\t\t\t\t},\n\t\t\t},\n\t\t\tonToolErrorCallbacks: []llmagent.OnToolErrorCallback{\n\t\t\t\tfunc(ctx tool.Context, tool tool.Tool, args map[string]any, err error) (map[string]any, error) {\n\t\t\t\t\tif err == nil || err.Error() != \"error_from_before\" {\n\t\t\t\t\t\treturn nil, errors.New(\"unexpected error in on tool error callback\")\n\t\t\t\t\t}\n\t\t\t\t\treturn map[string]any{\"result\": \"error_handled_in_on_tool_error_callback\"}, nil\n\t\t\t\t},\n\t\t\t},\n\t\t\tafterToolCallbacks: []llmagent.AfterToolCallback{\n\t\t\t\tfunc(ctx tool.Context, tool tool.Tool, args, result map[string]any, err error) (map[string]any, error) {\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn nil, errors.New(\"unexpected error in after callback\")\n\t\t\t\t\t}\n\t\t\t\t\treturn map[string]any{\"result\": \"from_after\"}, nil\n\t\t\t\t},\n\t\t\t},\n\t\t\tdontRunAfterCanonicalCallback:   true,\n\t\t\tdontRunBeforeCanonicalCallback:  true,\n\t\t\tdontRunOnErrorCanonicalCallback: true,\n\t\t\twant:                            map[string]any{\"result\": \"from_after\"},\n\t\t},\n\t\t{\n\t\t\tname: \"before callback error passed to on tool error callback and passed to after tool called\",\n\t\t\ttool: func(ctx tool.Context, args map[string]any) (map[string]any, error) {\n\t\t\t\tt.Error(\"tool should not be called\")\n\t\t\t\treturn nil, nil\n\t\t\t},\n\t\t\tbeforeToolCallbacks: []llmagent.BeforeToolCallback{\n\t\t\t\tfunc(ctx tool.Context, tool tool.Tool, args map[string]any) (map[string]any, error) {\n\t\t\t\t\treturn nil, errors.New(\"error_from_before\")\n\t\t\t\t},\n\t\t\t},\n\t\t\tonToolErrorCallbacks: []llmagent.OnToolErrorCallback{\n\t\t\t\tfunc(ctx tool.Context, tool tool.Tool, args map[string]any, err error) (map[string]any, error) {\n\t\t\t\t\tif err == nil || err.Error() != \"error_from_before\" {\n\t\t\t\t\t\treturn nil, errors.New(\"unexpected error in on tool error callback\")\n\t\t\t\t\t}\n\t\t\t\t\treturn nil, errors.New(\"error_from_on_tool_error\")\n\t\t\t\t},\n\t\t\t},\n\t\t\tafterToolCallbacks: []llmagent.AfterToolCallback{\n\t\t\t\tfunc(ctx tool.Context, tool tool.Tool, args, result map[string]any, err error) (map[string]any, error) {\n\t\t\t\t\tif err == nil || err.Error() != \"error_from_on_tool_error\" {\n\t\t\t\t\t\treturn nil, errors.New(\"unexpected error in after callback\")\n\t\t\t\t\t}\n\t\t\t\t\treturn nil, errors.New(\"error_from_after_tool\")\n\t\t\t\t},\n\t\t\t},\n\t\t\tdontRunAfterCanonicalCallback:   true,\n\t\t\tdontRunOnErrorCanonicalCallback: true,\n\t\t\tdontRunBeforeCanonicalCallback:  true,\n\t\t\twant:                            map[string]any{\"error\": \"error_from_after_tool\"},\n\t\t},\n\t\t{\n\t\t\tname: \"before callback error passed to on tool error callback and passed to after tool called and handled\",\n\t\t\ttool: func(ctx tool.Context, args map[string]any) (map[string]any, error) {\n\t\t\t\tt.Error(\"tool should not be called\")\n\t\t\t\treturn nil, nil\n\t\t\t},\n\t\t\tbeforeToolCallbacks: []llmagent.BeforeToolCallback{\n\t\t\t\tfunc(ctx tool.Context, tool tool.Tool, args map[string]any) (map[string]any, error) {\n\t\t\t\t\treturn nil, errors.New(\"error_from_before\")\n\t\t\t\t},\n\t\t\t},\n\t\t\tonToolErrorCallbacks: []llmagent.OnToolErrorCallback{\n\t\t\t\tfunc(ctx tool.Context, tool tool.Tool, args map[string]any, err error) (map[string]any, error) {\n\t\t\t\t\tif err == nil || err.Error() != \"error_from_before\" {\n\t\t\t\t\t\treturn nil, errors.New(\"unexpected error in on tool error callback\")\n\t\t\t\t\t}\n\t\t\t\t\treturn nil, errors.New(\"error_from_on_tool_error\")\n\t\t\t\t},\n\t\t\t},\n\t\t\tafterToolCallbacks: []llmagent.AfterToolCallback{\n\t\t\t\tfunc(ctx tool.Context, tool tool.Tool, args, result map[string]any, err error) (map[string]any, error) {\n\t\t\t\t\tif err == nil || err.Error() != \"error_from_on_tool_error\" {\n\t\t\t\t\t\treturn nil, errors.New(\"unexpected error in after tool callback\")\n\t\t\t\t\t}\n\t\t\t\t\treturn map[string]any{\"result\": \"error_handled_in_after_tool_callback\"}, nil\n\t\t\t\t},\n\t\t\t},\n\t\t\tdontRunAfterCanonicalCallback:   true,\n\t\t\tdontRunBeforeCanonicalCallback:  true,\n\t\t\tdontRunOnErrorCanonicalCallback: true,\n\t\t\twant:                            map[string]any{\"result\": \"error_handled_in_after_tool_callback\"},\n\t\t},\n\t}\n\tfor _, tc := range testCases {\n\t\tt.Run(fmt.Sprintf(\"%s_plugin\", tc.name), func(t *testing.T) {\n\t\t\tmaxLen := max(len(tc.beforeToolCallbacks), len(tc.afterToolCallbacks), len(tc.onToolErrorCallbacks))\n\t\t\tvar plugins []*plugin.Plugin\n\t\t\tfor i := range maxLen {\n\t\t\t\tvar currentBefore llmagent.BeforeToolCallback\n\t\t\t\tvar currentAfter llmagent.AfterToolCallback\n\t\t\t\tvar currentError llmagent.OnToolErrorCallback\n\n\t\t\t\t// 2. Bounds checks: Only assign if i is within the slice limits\n\t\t\t\tif i < len(tc.beforeToolCallbacks) {\n\t\t\t\t\tcurrentBefore = tc.beforeToolCallbacks[i]\n\t\t\t\t}\n\t\t\t\tif i < len(tc.afterToolCallbacks) {\n\t\t\t\t\tcurrentAfter = tc.afterToolCallbacks[i]\n\t\t\t\t}\n\t\t\t\tif i < len(tc.onToolErrorCallbacks) {\n\t\t\t\t\tcurrentError = tc.onToolErrorCallbacks[i]\n\t\t\t\t}\n\t\t\t\tp, err := plugin.New(plugin.Config{\n\t\t\t\t\tName:                fmt.Sprintf(\"plugin-%d\", i),\n\t\t\t\t\tBeforeToolCallback:  currentBefore,\n\t\t\t\t\tAfterToolCallback:   currentAfter,\n\t\t\t\t\tOnToolErrorCallback: currentError,\n\t\t\t\t})\n\t\t\t\tif err != nil {\n\t\t\t\t\tt.Errorf(\"failed to initialize plugin: %v\", err)\n\t\t\t\t}\n\t\t\t\tplugins = append(plugins, p)\n\t\t\t}\n\n\t\t\tmodel := &testutil.MockModel{\n\t\t\t\tResponses: []*genai.Content{\n\t\t\t\t\tgenai.NewContentFromFunctionCall(\"testTool\", tc.args, genai.RoleModel),\n\t\t\t\t},\n\t\t\t}\n\n\t\t\tft, err := functiontool.New(functiontool.Config{\n\t\t\t\tName: \"testTool\",\n\t\t\t}, tc.tool)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to function tool: %v\", err)\n\t\t\t}\n\n\t\t\tonToolErrorCallbacksCalled := false\n\t\t\tbeforeToolCallbacksCalled := false\n\t\t\tafterToolCallbacksCalled := false\n\t\t\tonToolErrorCallbacks := []llmagent.OnToolErrorCallback{\n\t\t\t\tfunc(ctx tool.Context, tool tool.Tool, args map[string]any, err error) (map[string]any, error) {\n\t\t\t\t\tonToolErrorCallbacksCalled = true\n\t\t\t\t\tif tc.dontRunOnErrorCanonicalCallback {\n\t\t\t\t\t\tt.Error(\"on tool error should not be called\")\n\t\t\t\t\t}\n\t\t\t\t\treturn nil, nil\n\t\t\t\t},\n\t\t\t}\n\t\t\tbeforeToolCallbacks := []llmagent.BeforeToolCallback{\n\t\t\t\tfunc(ctx tool.Context, tool tool.Tool, args map[string]any) (map[string]any, error) {\n\t\t\t\t\tbeforeToolCallbacksCalled = true\n\t\t\t\t\tif tc.dontRunBeforeCanonicalCallback {\n\t\t\t\t\t\tt.Error(\"before Tool Callback should not be called\")\n\t\t\t\t\t}\n\t\t\t\t\treturn nil, nil\n\t\t\t\t},\n\t\t\t}\n\t\t\tafterToolCallbacks := []llmagent.AfterToolCallback{\n\t\t\t\tfunc(ctx tool.Context, tool tool.Tool, args, result map[string]any, err error) (map[string]any, error) {\n\t\t\t\t\tafterToolCallbacksCalled = true\n\t\t\t\t\tif tc.dontRunAfterCanonicalCallback {\n\t\t\t\t\t\tt.Error(\"after Tool Callback should not be called\")\n\t\t\t\t\t}\n\t\t\t\t\treturn nil, nil\n\t\t\t\t},\n\t\t\t}\n\n\t\t\tagent, err := llmagent.New(llmagent.Config{\n\t\t\t\tName:                 \"test_agent\",\n\t\t\t\tModel:                model,\n\t\t\t\tTools:                []tool.Tool{ft},\n\t\t\t\tOnToolErrorCallbacks: onToolErrorCallbacks,\n\t\t\t\tBeforeToolCallbacks:  beforeToolCallbacks,\n\t\t\t\tAfterToolCallbacks:   afterToolCallbacks,\n\t\t\t})\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"failed to create LLM Agent: %v\", err)\n\t\t\t}\n\n\t\t\ttestRunner := testutil.NewTestAgentRunnerWithPluginManager(t, agent, runner.PluginConfig{\n\t\t\t\tPlugins: plugins,\n\t\t\t})\n\n\t\t\tstream := testRunner.Run(t, \"session\", \"user input\")\n\n\t\t\tparts, err := testutil.CollectParts(stream)\n\t\t\tif err != nil && err.Error() != \"no data\" {\n\t\t\t\tt.Fatalf(\"agent returned (%v, %v), want result\", parts, err)\n\t\t\t}\n\t\t\tvar got map[string]any\n\t\t\tfor _, part := range parts {\n\t\t\t\tif part.FunctionResponse != nil {\n\t\t\t\t\tgot = part.FunctionResponse.Response\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif diff := cmp.Diff(tc.want, got); diff != \"\" {\n\t\t\t\tt.Errorf(\"callTool() mismatch (-want +got):\\n%s\", diff)\n\t\t\t}\n\n\t\t\tif onToolErrorCallbacksCalled == false && tc.dontRunOnErrorCanonicalCallback == false {\n\t\t\t\tt.Error(\"on tool error should be called\")\n\t\t\t}\n\t\t\tif beforeToolCallbacksCalled == false && tc.dontRunBeforeCanonicalCallback == false {\n\t\t\t\tt.Error(\"before tool should be called\")\n\t\t\t}\n\t\t\tif afterToolCallbacksCalled == false && tc.dontRunAfterCanonicalCallback == false {\n\t\t\t\tt.Error(\"after tool should be called\")\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestModelCallbacks(t *testing.T) {\n\tt.Parallel()\n\n\tfor _, tc := range []struct {\n\t\tname                            string\n\t\tllmResponses                    []*genai.Content\n\t\tbeforeModelCallbacks            []llmagent.BeforeModelCallback\n\t\tafterModelCallbacks             []llmagent.AfterModelCallback\n\t\tonModelErrorCallback            []llmagent.OnModelErrorCallback\n\t\twantTexts                       []string\n\t\twantErr                         error\n\t\tdontRunBeforeCanonicalCallback  bool\n\t\tdontRunAfterCanonicalCallback   bool\n\t\tdontRunOnErrorCanonicalCallback bool\n\t}{\n\t\t{\n\t\t\tname: \"before model callback doesn't modify anything\",\n\t\t\tbeforeModelCallbacks: []llmagent.BeforeModelCallback{\n\t\t\t\tfunc(ctx agent.CallbackContext, llmRequest *model.LLMRequest) (*model.LLMResponse, error) {\n\t\t\t\t\treturn nil, nil\n\t\t\t\t},\n\t\t\t},\n\t\t\tllmResponses: []*genai.Content{\n\t\t\t\tgenai.NewContentFromText(\"hello from model\", genai.RoleModel),\n\t\t\t},\n\t\t\tdontRunOnErrorCanonicalCallback: true,\n\t\t\twantTexts: []string{\n\t\t\t\t\"hello from model\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"before model callback returns an error\",\n\t\t\tbeforeModelCallbacks: []llmagent.BeforeModelCallback{\n\t\t\t\tfunc(ctx agent.CallbackContext, llmRequest *model.LLMRequest) (*model.LLMResponse, error) {\n\t\t\t\t\treturn nil, fmt.Errorf(\"before_model_callback_error: %w\", http.ErrNoCookie)\n\t\t\t\t},\n\t\t\t\tfunc(ctx agent.CallbackContext, llmRequest *model.LLMRequest) (*model.LLMResponse, error) {\n\t\t\t\t\treturn nil, fmt.Errorf(\"before_model_callback_error: %w\", http.ErrHijacked)\n\t\t\t\t},\n\t\t\t},\n\t\t\tllmResponses: []*genai.Content{\n\t\t\t\tgenai.NewContentFromText(\"hello from model\", genai.RoleModel),\n\t\t\t},\n\t\t\tdontRunBeforeCanonicalCallback:  true,\n\t\t\tdontRunOnErrorCanonicalCallback: true,\n\t\t\tdontRunAfterCanonicalCallback:   true,\n\t\t\twantErr:                         http.ErrNoCookie,\n\t\t},\n\t\t{\n\t\t\tname: \"before model callback returns new LLMResponse\",\n\t\t\tbeforeModelCallbacks: []llmagent.BeforeModelCallback{\n\t\t\t\tfunc(ctx agent.CallbackContext, llmRequest *model.LLMRequest) (*model.LLMResponse, error) {\n\t\t\t\t\treturn &model.LLMResponse{\n\t\t\t\t\t\tContent: genai.NewContentFromText(\"hello from before_model_callback\", genai.RoleModel),\n\t\t\t\t\t}, nil\n\t\t\t\t},\n\t\t\t\tfunc(ctx agent.CallbackContext, llmRequest *model.LLMRequest) (*model.LLMResponse, error) {\n\t\t\t\t\treturn &model.LLMResponse{\n\t\t\t\t\t\tContent: genai.NewContentFromText(\"unexpected text\", genai.RoleModel),\n\t\t\t\t\t}, nil\n\t\t\t\t},\n\t\t\t},\n\t\t\tllmResponses: []*genai.Content{\n\t\t\t\tgenai.NewContentFromText(\"hello from model\", genai.RoleModel),\n\t\t\t},\n\t\t\tdontRunBeforeCanonicalCallback:  true,\n\t\t\tdontRunOnErrorCanonicalCallback: true,\n\t\t\tdontRunAfterCanonicalCallback:   true,\n\t\t\twantTexts: []string{\n\t\t\t\t\"hello from before_model_callback\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"before model callback returns both new LLMResponse and error\",\n\t\t\tbeforeModelCallbacks: []llmagent.BeforeModelCallback{\n\t\t\t\tfunc(ctx agent.CallbackContext, llmRequest *model.LLMRequest) (*model.LLMResponse, error) {\n\t\t\t\t\treturn &model.LLMResponse{\n\t\t\t\t\t\tContent: genai.NewContentFromText(\"hello from before_model_callback\", genai.RoleModel),\n\t\t\t\t\t}, fmt.Errorf(\"before_model_callback_error: %w\", http.ErrNoCookie)\n\t\t\t\t},\n\t\t\t},\n\t\t\tllmResponses: []*genai.Content{\n\t\t\t\tgenai.NewContentFromText(\"hello from model\", genai.RoleModel),\n\t\t\t},\n\t\t\tdontRunBeforeCanonicalCallback:  true,\n\t\t\tdontRunOnErrorCanonicalCallback: true,\n\t\t\tdontRunAfterCanonicalCallback:   true,\n\t\t\twantErr:                         http.ErrNoCookie,\n\t\t},\n\t\t{\n\t\t\tname: \"after model callback doesn't modify anything\",\n\t\t\tafterModelCallbacks: []llmagent.AfterModelCallback{\n\t\t\t\tfunc(ctx agent.CallbackContext, llmResponse *model.LLMResponse, llmResponseError error) (*model.LLMResponse, error) {\n\t\t\t\t\treturn nil, nil\n\t\t\t\t},\n\t\t\t},\n\t\t\tllmResponses: []*genai.Content{\n\t\t\t\tgenai.NewContentFromText(\"hello from model\", genai.RoleModel),\n\t\t\t},\n\t\t\tdontRunOnErrorCanonicalCallback: true,\n\t\t\twantTexts: []string{\n\t\t\t\t\"hello from model\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"after model callback returns new LLMResponse and are run in symmetrical order\",\n\t\t\tafterModelCallbacks: []llmagent.AfterModelCallback{\n\t\t\t\tfunc(ctx agent.CallbackContext, llmResponse *model.LLMResponse, llmResponseError error) (*model.LLMResponse, error) {\n\t\t\t\t\treturn &model.LLMResponse{\n\t\t\t\t\t\tContent: genai.NewContentFromText(\"hello from after_model_callback\", genai.RoleModel),\n\t\t\t\t\t}, nil\n\t\t\t\t},\n\t\t\t\tfunc(ctx agent.CallbackContext, llmResponse *model.LLMResponse, llmResponseError error) (*model.LLMResponse, error) {\n\t\t\t\t\treturn &model.LLMResponse{\n\t\t\t\t\t\tContent: genai.NewContentFromText(\"unexpected text\", genai.RoleModel),\n\t\t\t\t\t}, nil\n\t\t\t\t},\n\t\t\t},\n\t\t\tllmResponses: []*genai.Content{\n\t\t\t\tgenai.NewContentFromText(\"hello from model\", genai.RoleModel),\n\t\t\t},\n\t\t\tdontRunOnErrorCanonicalCallback: true,\n\t\t\tdontRunAfterCanonicalCallback:   true,\n\t\t\twantTexts: []string{\n\t\t\t\t\"hello from after_model_callback\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"after model callback returns error and are run in symmetrical order\",\n\t\t\tafterModelCallbacks: []llmagent.AfterModelCallback{\n\t\t\t\tfunc(ctx agent.CallbackContext, llmResponse *model.LLMResponse, llmResponseError error) (*model.LLMResponse, error) {\n\t\t\t\t\treturn nil, fmt.Errorf(\"error from after_model_callback: %w\", http.ErrNoCookie)\n\t\t\t\t},\n\t\t\t\tfunc(ctx agent.CallbackContext, llmResponse *model.LLMResponse, llmResponseError error) (*model.LLMResponse, error) {\n\t\t\t\t\treturn nil, fmt.Errorf(\"error from after_model_callback: %w\", http.ErrHijacked)\n\t\t\t\t},\n\t\t\t},\n\t\t\tllmResponses: []*genai.Content{\n\t\t\t\tgenai.NewContentFromText(\"hello from model\", genai.RoleModel),\n\t\t\t},\n\t\t\tdontRunOnErrorCanonicalCallback: true,\n\t\t\tdontRunAfterCanonicalCallback:   true,\n\t\t\twantErr:                         http.ErrNoCookie,\n\t\t},\n\t\t{\n\t\t\tname: \"after model callback returns both new LLMResponse and error\",\n\t\t\tafterModelCallbacks: []llmagent.AfterModelCallback{\n\t\t\t\tfunc(ctx agent.CallbackContext, llmResponse *model.LLMResponse, llmResponseError error) (*model.LLMResponse, error) {\n\t\t\t\t\treturn &model.LLMResponse{\n\t\t\t\t\t\tContent: genai.NewContentFromText(\"hello from after_model_callback\", genai.RoleModel),\n\t\t\t\t\t}, fmt.Errorf(\"error from after_model_callback: %w\", http.ErrNoCookie)\n\t\t\t\t},\n\t\t\t},\n\t\t\tllmResponses: []*genai.Content{\n\t\t\t\tgenai.NewContentFromText(\"hello from model\", genai.RoleModel),\n\t\t\t},\n\t\t\tdontRunOnErrorCanonicalCallback: true,\n\t\t\tdontRunAfterCanonicalCallback:   true,\n\t\t\twantErr:                         http.ErrNoCookie,\n\t\t},\n\t\t{\n\t\t\tname: \"on model error callback is not called\",\n\t\t\tonModelErrorCallback: []llmagent.OnModelErrorCallback{\n\t\t\t\tfunc(ctx agent.CallbackContext, llmRequest *model.LLMRequest, llmError error) (*model.LLMResponse, error) {\n\t\t\t\t\treturn &model.LLMResponse{\n\t\t\t\t\t\tContent: genai.NewContentFromText(\"hello from on_model_error_callback\", genai.RoleModel),\n\t\t\t\t\t}, fmt.Errorf(\"on_model_error_callback: %w\", http.ErrNoCookie)\n\t\t\t\t},\n\t\t\t},\n\t\t\tllmResponses: []*genai.Content{\n\t\t\t\tgenai.NewContentFromText(\"hello from model\", genai.RoleModel),\n\t\t\t},\n\t\t\tdontRunOnErrorCanonicalCallback: true,\n\t\t\twantTexts: []string{\n\t\t\t\t\"hello from model\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"on model error callback changes message\",\n\t\t\tonModelErrorCallback: []llmagent.OnModelErrorCallback{\n\t\t\t\tfunc(ctx agent.CallbackContext, llmRequest *model.LLMRequest, llmError error) (*model.LLMResponse, error) {\n\t\t\t\t\treturn &model.LLMResponse{\n\t\t\t\t\t\tContent: genai.NewContentFromText(\"hello from on_model_error_callback\", genai.RoleModel),\n\t\t\t\t\t}, nil\n\t\t\t\t},\n\t\t\t},\n\t\t\tllmResponses:                    []*genai.Content{},\n\t\t\tdontRunOnErrorCanonicalCallback: true,\n\t\t\twantTexts: []string{\n\t\t\t\t\"hello from on_model_error_callback\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"on model error callback changes err\",\n\t\t\tonModelErrorCallback: []llmagent.OnModelErrorCallback{\n\t\t\t\tfunc(ctx agent.CallbackContext, llmRequest *model.LLMRequest, llmError error) (*model.LLMResponse, error) {\n\t\t\t\t\treturn &model.LLMResponse{\n\t\t\t\t\t\tContent: genai.NewContentFromText(\"hello from on_model_error_callback\", genai.RoleModel),\n\t\t\t\t\t}, fmt.Errorf(\"error from on_model_error_callback: %w\", http.ErrNoCookie)\n\t\t\t\t},\n\t\t\t\tfunc(ctx agent.CallbackContext, llmRequest *model.LLMRequest, llmError error) (*model.LLMResponse, error) {\n\t\t\t\t\treturn &model.LLMResponse{\n\t\t\t\t\t\tContent: genai.NewContentFromText(\"hello from on_model_error_callback\", genai.RoleModel),\n\t\t\t\t\t}, fmt.Errorf(\"error from on_model_error_callback: %w\", http.ErrHijacked)\n\t\t\t\t},\n\t\t\t},\n\t\t\tllmResponses:                    []*genai.Content{},\n\t\t\tdontRunOnErrorCanonicalCallback: true,\n\t\t\tdontRunAfterCanonicalCallback:   true,\n\t\t\twantErr:                         http.ErrNoCookie,\n\t\t},\n\t\t{\n\t\t\tname: \"on model error callback returns both new LLMResponse and error\",\n\t\t\tonModelErrorCallback: []llmagent.OnModelErrorCallback{\n\t\t\t\tfunc(ctx agent.CallbackContext, llmRequest *model.LLMRequest, llmError error) (*model.LLMResponse, error) {\n\t\t\t\t\treturn &model.LLMResponse{\n\t\t\t\t\t\tContent: genai.NewContentFromText(\"hello from on_model_error_callback\", genai.RoleModel),\n\t\t\t\t\t}, fmt.Errorf(\"error from on_model_error_callback: %w\", http.ErrNoCookie)\n\t\t\t\t},\n\t\t\t},\n\t\t\tllmResponses:                    []*genai.Content{},\n\t\t\tdontRunOnErrorCanonicalCallback: true,\n\t\t\tdontRunAfterCanonicalCallback:   true,\n\t\t\twantErr:                         http.ErrNoCookie,\n\t\t},\n\t\t{\n\t\t\tname: \"on model error callback does not process before model callback error\",\n\t\t\tbeforeModelCallbacks: []llmagent.BeforeModelCallback{\n\t\t\t\tfunc(ctx agent.CallbackContext, llmRequest *model.LLMRequest) (*model.LLMResponse, error) {\n\t\t\t\t\treturn nil, fmt.Errorf(\"before_model_callback_error: %w\", http.ErrNoCookie)\n\t\t\t\t},\n\t\t\t},\n\t\t\tonModelErrorCallback: []llmagent.OnModelErrorCallback{\n\t\t\t\tfunc(ctx agent.CallbackContext, llmRequest *model.LLMRequest, llmError error) (*model.LLMResponse, error) {\n\t\t\t\t\treturn &model.LLMResponse{\n\t\t\t\t\t\tContent: genai.NewContentFromText(\"hello from on_model_error_callback\", genai.RoleModel),\n\t\t\t\t\t}, fmt.Errorf(\"error from on_model_error_callback: %w\", http.ErrHijacked)\n\t\t\t\t},\n\t\t\t},\n\t\t\tllmResponses: []*genai.Content{\n\t\t\t\tgenai.NewContentFromText(\"hello from model\", genai.RoleModel),\n\t\t\t},\n\t\t\tdontRunBeforeCanonicalCallback:  true,\n\t\t\tdontRunOnErrorCanonicalCallback: true,\n\t\t\tdontRunAfterCanonicalCallback:   true,\n\t\t\twantErr:                         http.ErrNoCookie,\n\t\t},\n\t\t{\n\t\t\tname: \"on model error callback does not process before model callback message\",\n\t\t\tbeforeModelCallbacks: []llmagent.BeforeModelCallback{\n\t\t\t\tfunc(ctx agent.CallbackContext, llmRequest *model.LLMRequest) (*model.LLMResponse, error) {\n\t\t\t\t\treturn &model.LLMResponse{\n\t\t\t\t\t\tContent: genai.NewContentFromText(\"hello from before_model_callback\", genai.RoleModel),\n\t\t\t\t\t}, nil\n\t\t\t\t},\n\t\t\t},\n\t\t\tonModelErrorCallback: []llmagent.OnModelErrorCallback{\n\t\t\t\tfunc(ctx agent.CallbackContext, llmRequest *model.LLMRequest, llmError error) (*model.LLMResponse, error) {\n\t\t\t\t\treturn &model.LLMResponse{\n\t\t\t\t\t\tContent: genai.NewContentFromText(\"hello from on_model_error_callback\", genai.RoleModel),\n\t\t\t\t\t}, fmt.Errorf(\"error from on_model_error_callback: %w\", http.ErrHijacked)\n\t\t\t\t},\n\t\t\t},\n\t\t\tllmResponses: []*genai.Content{\n\t\t\t\tgenai.NewContentFromText(\"hello from model\", genai.RoleModel),\n\t\t\t},\n\t\t\tdontRunBeforeCanonicalCallback:  true,\n\t\t\tdontRunOnErrorCanonicalCallback: true,\n\t\t\tdontRunAfterCanonicalCallback:   true,\n\t\t\twantTexts: []string{\n\t\t\t\t\"hello from before_model_callback\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"after error callback process on model error callback message\",\n\t\t\tonModelErrorCallback: []llmagent.OnModelErrorCallback{\n\t\t\t\tfunc(ctx agent.CallbackContext, llmRequest *model.LLMRequest, llmError error) (*model.LLMResponse, error) {\n\t\t\t\t\treturn &model.LLMResponse{\n\t\t\t\t\t\tContent: genai.NewContentFromText(\"hello from on_model_error_callback\", genai.RoleModel),\n\t\t\t\t\t}, nil\n\t\t\t\t},\n\t\t\t},\n\t\t\tafterModelCallbacks: []llmagent.AfterModelCallback{\n\t\t\t\tfunc(ctx agent.CallbackContext, llmResponse *model.LLMResponse, llmResponseError error) (*model.LLMResponse, error) {\n\t\t\t\t\treturn &model.LLMResponse{\n\t\t\t\t\t\tContent: genai.NewContentFromText(\"hello from after_model_callback\", genai.RoleModel),\n\t\t\t\t\t}, nil\n\t\t\t\t},\n\t\t\t},\n\t\t\tllmResponses:                    []*genai.Content{},\n\t\t\tdontRunOnErrorCanonicalCallback: true,\n\t\t\tdontRunAfterCanonicalCallback:   true,\n\t\t\twantTexts: []string{\n\t\t\t\t\"hello from after_model_callback\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"after error callback does not process on model error callback error\",\n\t\t\tonModelErrorCallback: []llmagent.OnModelErrorCallback{\n\t\t\t\tfunc(ctx agent.CallbackContext, llmRequest *model.LLMRequest, llmError error) (*model.LLMResponse, error) {\n\t\t\t\t\treturn nil, fmt.Errorf(\"error from on_model_error_callback: %w\", http.ErrNoCookie)\n\t\t\t\t},\n\t\t\t},\n\t\t\tafterModelCallbacks: []llmagent.AfterModelCallback{\n\t\t\t\tfunc(ctx agent.CallbackContext, llmResponse *model.LLMResponse, llmResponseError error) (*model.LLMResponse, error) {\n\t\t\t\t\treturn nil, fmt.Errorf(\"error from after_model_callback: %w\", http.ErrHijacked)\n\t\t\t\t},\n\t\t\t},\n\t\t\tllmResponses:                    []*genai.Content{},\n\t\t\tdontRunOnErrorCanonicalCallback: true,\n\t\t\tdontRunAfterCanonicalCallback:   true,\n\t\t\twantErr:                         http.ErrNoCookie,\n\t\t},\n\t} {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\tmaxLen := max(len(tc.beforeModelCallbacks), len(tc.afterModelCallbacks), len(tc.onModelErrorCallback))\n\t\t\tvar plugins []*plugin.Plugin\n\t\t\tfor i := range maxLen {\n\t\t\t\tvar currentBefore llmagent.BeforeModelCallback\n\t\t\t\tvar currentAfter llmagent.AfterModelCallback\n\t\t\t\tvar currentError llmagent.OnModelErrorCallback\n\n\t\t\t\t// 2. Bounds checks: Only assign if i is within the slice limits\n\t\t\t\tif i < len(tc.beforeModelCallbacks) {\n\t\t\t\t\tcurrentBefore = tc.beforeModelCallbacks[i]\n\t\t\t\t}\n\t\t\t\tif i < len(tc.afterModelCallbacks) {\n\t\t\t\t\tcurrentAfter = tc.afterModelCallbacks[i]\n\t\t\t\t}\n\t\t\t\tif i < len(tc.onModelErrorCallback) {\n\t\t\t\t\tcurrentError = tc.onModelErrorCallback[i]\n\t\t\t\t}\n\t\t\t\tp, err := plugin.New(plugin.Config{\n\t\t\t\t\tName:                 fmt.Sprintf(\"plugin-%d\", i),\n\t\t\t\t\tBeforeModelCallback:  currentBefore,\n\t\t\t\t\tAfterModelCallback:   currentAfter,\n\t\t\t\t\tOnModelErrorCallback: currentError,\n\t\t\t\t})\n\t\t\t\tif err != nil {\n\t\t\t\t\tt.Errorf(\"failed to initialize plugin: %v\", err)\n\t\t\t\t}\n\t\t\t\tplugins = append(plugins, p)\n\t\t\t}\n\n\t\t\tonModelErrorCallbacksCalled := false\n\t\t\tbeforeModelCallbacksCalled := false\n\t\t\tafterModelCallbacksCalled := false\n\n\t\t\tonModelErrorCallbacks := []llmagent.OnModelErrorCallback{\n\t\t\t\tfunc(ctx agent.CallbackContext, llmRequest *model.LLMRequest, llmError error) (*model.LLMResponse, error) {\n\t\t\t\t\tonModelErrorCallbacksCalled = true\n\t\t\t\t\tif tc.dontRunOnErrorCanonicalCallback {\n\t\t\t\t\t\tt.Error(\"on model error should not be called\")\n\t\t\t\t\t}\n\t\t\t\t\treturn nil, nil\n\t\t\t\t},\n\t\t\t}\n\t\t\tbeforeModelCallbacks := []llmagent.BeforeModelCallback{\n\t\t\t\tfunc(ctx agent.CallbackContext, llmRequest *model.LLMRequest) (*model.LLMResponse, error) {\n\t\t\t\t\tbeforeModelCallbacksCalled = true\n\t\t\t\t\tif tc.dontRunBeforeCanonicalCallback {\n\t\t\t\t\t\tt.Error(\"before model Callback should not be called\")\n\t\t\t\t\t}\n\t\t\t\t\treturn nil, nil\n\t\t\t\t},\n\t\t\t}\n\t\t\tafterModelCallbacks := []llmagent.AfterModelCallback{\n\t\t\t\tfunc(ctx agent.CallbackContext, llmResponse *model.LLMResponse, llmResponseError error) (*model.LLMResponse, error) {\n\t\t\t\t\tafterModelCallbacksCalled = true\n\t\t\t\t\tif tc.dontRunAfterCanonicalCallback {\n\t\t\t\t\t\tt.Error(\"after model Callback should not be called\")\n\t\t\t\t\t}\n\t\t\t\t\treturn nil, nil\n\t\t\t\t},\n\t\t\t}\n\n\t\t\ttestLLM := &testutil.MockModel{\n\t\t\t\tResponses: tc.llmResponses,\n\t\t\t}\n\t\t\ta, err := llmagent.New(llmagent.Config{\n\t\t\t\tName:                  \"hello_world_agent\",\n\t\t\t\tModel:                 testLLM,\n\t\t\t\tOnModelErrorCallbacks: onModelErrorCallbacks,\n\t\t\t\tBeforeModelCallbacks:  beforeModelCallbacks,\n\t\t\t\tAfterModelCallbacks:   afterModelCallbacks,\n\t\t\t})\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"failed to create llm agent: %v\", err)\n\t\t\t}\n\t\t\trunner := testutil.NewTestAgentRunnerWithPluginManager(t, a, runner.PluginConfig{\n\t\t\t\tPlugins: plugins,\n\t\t\t})\n\t\t\tstream := runner.Run(t, \"test_session\", \"\")\n\t\t\ttexts, err := testutil.CollectTextParts(stream)\n\t\t\tif tc.wantErr != nil && !errors.Is(err, tc.wantErr) {\n\t\t\t\tt.Fatalf(\"stream = (%q, %v), want (_, %v)\", texts, err, tc.wantErr)\n\t\t\t}\n\t\t\tif (err != nil) != (tc.wantErr != nil) {\n\t\t\t\tt.Fatalf(\"unexpected result from agent, got error: %v, want error: %v\", err, tc.wantErr)\n\t\t\t}\n\n\t\t\tif diff := cmp.Diff(tc.wantTexts, texts); diff != \"\" {\n\t\t\t\tt.Fatalf(\"unexpected result from agent, want: %v, got: %v, diff: %v\", tc.wantTexts, texts, diff)\n\t\t\t}\n\n\t\t\tif onModelErrorCallbacksCalled == false && tc.dontRunOnErrorCanonicalCallback == false {\n\t\t\t\tt.Error(\"on model error should be called\")\n\t\t\t}\n\t\t\tif beforeModelCallbacksCalled == false && tc.dontRunBeforeCanonicalCallback == false {\n\t\t\t\tt.Error(\"before model should be called\")\n\t\t\t}\n\t\t\tif afterModelCallbacksCalled == false && tc.dontRunAfterCanonicalCallback == false {\n\t\t\t\tt.Error(\"after model should be called\")\n\t\t\t}\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "plugin/plugin_test.go",
    "content": "// Copyright 2026 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage plugin\n\nimport (\n\t\"errors\"\n\t\"testing\"\n\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/agent\"\n)\n\nfunc TestNew(t *testing.T) {\n\tmockOnUserMsg := func(agent.InvocationContext, *genai.Content) (*genai.Content, error) { return nil, nil }\n\tmockCloseErr := errors.New(\"close error\")\n\n\ttests := []struct {\n\t\tname           string\n\t\tcfg            Config\n\t\tvalidate       func(*testing.T, *Plugin)\n\t\texpectCloseErr error\n\t}{\n\t\t{\n\t\t\tname: \"Successfully maps all fields\",\n\t\t\tcfg: Config{\n\t\t\t\tOnUserMessageCallback: mockOnUserMsg,\n\t\t\t},\n\t\t\tvalidate: func(t *testing.T, p *Plugin) {\n\t\t\t\tif p.OnUserMessageCallback() == nil {\n\t\t\t\t\tt.Error(\"OnUserMessageCallback was not mapped correctly\")\n\t\t\t\t}\n\t\t\t\t// Verify Close() is safe even if we didn't provide a CloseFunc\n\t\t\t\tif err := p.Close(); err != nil {\n\t\t\t\t\tt.Errorf(\"Expected nil error from default close, got %v\", err)\n\t\t\t\t}\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"Safety: Handles nil CloseFunc gracefully\",\n\t\t\tcfg:  Config{\n\t\t\t\t// No CloseFunc provided\n\t\t\t},\n\t\t\tvalidate: func(t *testing.T, p *Plugin) {\n\t\t\t\t// This should not panic\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tt.Errorf(\"Plugin.Close() panicked with nil CloseFunc\")\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\tif err := p.Close(); err != nil {\n\t\t\t\t\tt.Errorf(\"Expected nil error, got %v\", err)\n\t\t\t\t}\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"Functionality: Executes provided CloseFunc\",\n\t\t\tcfg: Config{\n\t\t\t\tCloseFunc: func() error {\n\t\t\t\t\treturn mockCloseErr\n\t\t\t\t},\n\t\t\t},\n\t\t\tvalidate: func(t *testing.T, p *Plugin) {\n\t\t\t\terr := p.Close()\n\t\t\t\tif err != mockCloseErr {\n\t\t\t\t\tt.Errorf(\"Expected error '%v', got '%v'\", mockCloseErr, err)\n\t\t\t\t}\n\t\t\t},\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tp, err := New(tt.cfg)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"New() returned unexpected error: %v\", err)\n\t\t\t}\n\t\t\tif p == nil {\n\t\t\t\tt.Fatal(\"New() returned nil Plugin\")\n\t\t\t}\n\t\t\tif tt.validate != nil {\n\t\t\t\ttt.validate(t, p)\n\t\t\t}\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "plugin/retryandreflect/exceeded.md",
    "content": "\nThe tool `{{.ToolName}}` has failed consecutively {{.MaxRetries}} times and the retry limit has been exceeded.\n\n**Last Error:**\n```\n{{.ErrorDetails}}\n```\n\n**Last Arguments Used:**\n```json\n{{.ArgsSummary}}\n```\n\n**Final Instruction:**\n**Do not attempt to use the `{{.ToolName}}` tool again for this task.** You must now try a different approach. Acknowledge the failure and devise a new strategy, potentially using other available tools or informing the user that the task cannot be completed.\n"
  },
  {
    "path": "plugin/retryandreflect/plugin.go",
    "content": "// Copyright 2026 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Package retryandreflect provides a plugin that provides self-healing,\n// concurrent-safe error recovery for tool failures.\n//\n// This is the Go version of the Python plugin.\n// See https://github.com/google/adk-py/blob/main/google/adk/plugins/retry_and_reflect_plugin.py\npackage retryandreflect\n\nimport (\n\t\"bytes\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"strings\"\n\t\"sync\"\n\t\"text/template\"\n\n\t\"google.golang.org/adk/plugin\"\n\t\"google.golang.org/adk/tool\"\n\n\t_ \"embed\"\n)\n\n//go:embed reflection.md\nvar reflection string\nvar reflectionTemplate = template.Must(template.New(\"ReflectionTemplate\").Parse(reflection))\n\n//go:embed exceeded.md\nvar exceeded string\nvar exceededTemplate = template.Must(template.New(\"ExceededTemplate\").Parse(exceeded))\n\nconst (\n\treflectAndRetryResponseType = \"ERROR_HANDLED_BY_REFLECT_AND_RETRY_PLUGIN\"\n\tglobalScopeKey              = \"__global_reflect_and_retry_scope__\"\n)\n\n// TrackingScope defines the lifecycle scope for tracking tool failure counts.\ntype TrackingScope string\n\nconst (\n\t// Invocation tracks failures per-invocation.\n\tInvocation TrackingScope = \"invocation\"\n\t// Global tracks failures globally across all turns and users.\n\tGlobal TrackingScope = \"global\"\n)\n\ntype retryAndReflect struct {\n\tmu                    sync.Mutex\n\tmaxRetries            int\n\terrorIfRetryExceeded  bool\n\tscope                 TrackingScope\n\tscopedFailureCounters map[string]map[string]int\n}\n\n// PluginOption is an option for configuring the ReflectAndRetryToolPlugin.\ntype PluginOption func(*retryAndReflect)\n\n// WithMaxRetries sets the maximum number of retries for a tool.\nfunc WithMaxRetries(maxRetries int) PluginOption {\n\treturn func(r *retryAndReflect) {\n\t\tr.maxRetries = maxRetries\n\t}\n}\n\n// WithErrorIfRetryExceeded sets whether to return an error if the retry limit is exceeded.\n// If set to true, then the original error is returned, otherwise instead of the original error,\n// the plugin will return a new instruction \"createToolRetryExceedMsg\" telling LLM to stop using this tool for the current task.\nfunc WithErrorIfRetryExceeded(errorIfRetryExceeded bool) PluginOption {\n\treturn func(r *retryAndReflect) {\n\t\tr.errorIfRetryExceeded = errorIfRetryExceeded\n\t}\n}\n\n// WithTrackingScope sets the tracking scope for tool failures.\nfunc WithTrackingScope(scope TrackingScope) PluginOption {\n\treturn func(r *retryAndReflect) {\n\t\tr.scope = scope\n\t}\n}\n\n// New creates a new reflect and retry tool plugin.\nfunc New(opts ...PluginOption) (*plugin.Plugin, error) {\n\tr := &retryAndReflect{\n\t\tmaxRetries:            3, // A sensible default\n\t\terrorIfRetryExceeded:  false,\n\t\tscope:                 Invocation,\n\t\tscopedFailureCounters: make(map[string]map[string]int),\n\t}\n\n\tfor _, opt := range opts {\n\t\topt(r)\n\t}\n\n\tif r.maxRetries < 0 {\n\t\treturn nil, fmt.Errorf(\"maxRetries must be a non-negative integer\")\n\t}\n\n\treturn plugin.New(plugin.Config{\n\t\tName:                \"RetryAndReflectPlugin\",\n\t\tAfterToolCallback:   r.afterTool,\n\t\tOnToolErrorCallback: r.onToolError,\n\t})\n}\n\n// MustNew creates a new reflect and retry tool plugin and panics if it fails.\nfunc MustNew(opts ...PluginOption) *plugin.Plugin {\n\tp, err := New(opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn p\n}\n\nfunc (r *retryAndReflect) afterTool(ctx tool.Context, tool tool.Tool, args, result map[string]any, err error) (map[string]any, error) {\n\tif err == nil {\n\t\tisReflectResponse := false\n\t\tif rt, ok := result[\"response_type\"].(string); ok && rt == reflectAndRetryResponseType {\n\t\t\tisReflectResponse = true\n\t\t}\n\t\t// On success, reset the failure count for this specific tool within its scope.\n\t\t// But do not reset if OnToolErrorCallback just produced a reflection response.\n\t\tif !isReflectResponse {\n\t\t\tr.resetFailuresForTool(ctx, tool.Name())\n\t\t}\n\t}\n\treturn nil, nil\n}\n\nfunc (r *retryAndReflect) onToolError(ctx tool.Context, tool tool.Tool, args map[string]any, err error) (map[string]any, error) {\n\treturn r.handleToolError(ctx, tool, args, err)\n}\n\nfunc (r *retryAndReflect) handleToolError(ctx tool.Context, failedTool tool.Tool, args map[string]any, err error) (map[string]any, error) {\n\t// skip if the error is tool.ErrConfirmationRequired.\n\tif errors.Is(err, tool.ErrConfirmationRequired) || errors.Is(err, tool.ErrConfirmationRejected) {\n\t\treturn nil, nil\n\t}\n\n\tif r.maxRetries == 0 {\n\t\tif r.errorIfRetryExceeded {\n\t\t\treturn nil, err\n\t\t}\n\t\treturn r.createToolRetryExceedMsg(failedTool, args, err), nil\n\t}\n\n\tscopeKey := r.scopeKey(ctx)\n\tr.mu.Lock()\n\tdefer r.mu.Unlock()\n\n\ttoolFailureCounter, ok := r.scopedFailureCounters[scopeKey]\n\tif !ok {\n\t\ttoolFailureCounter = make(map[string]int)\n\t\tr.scopedFailureCounters[scopeKey] = toolFailureCounter\n\t}\n\tcurrentRetries := toolFailureCounter[failedTool.Name()] + 1\n\ttoolFailureCounter[failedTool.Name()] = currentRetries\n\n\tif currentRetries <= r.maxRetries {\n\t\treturn r.createToolReflectionResponse(failedTool, args, err, currentRetries), nil\n\t}\n\n\t// Max Retry exceeded\n\tif r.errorIfRetryExceeded {\n\t\treturn nil, err\n\t}\n\treturn r.createToolRetryExceedMsg(failedTool, args, err), nil\n}\n\nfunc (r *retryAndReflect) scopeKey(ctx tool.Context) string {\n\tif r.scope == Global {\n\t\treturn globalScopeKey\n\t}\n\treturn ctx.InvocationID()\n}\n\nfunc (r *retryAndReflect) resetFailuresForTool(ctx tool.Context, toolName string) {\n\tscopeKey := r.scopeKey(ctx)\n\n\tr.mu.Lock()\n\tdefer r.mu.Unlock()\n\tif scope, ok := r.scopedFailureCounters[scopeKey]; ok {\n\t\tdelete(scope, toolName)\n\t\tif len(scope) == 0 {\n\t\t\tdelete(r.scopedFailureCounters, scopeKey)\n\t\t}\n\t}\n}\n\nfunc (r *retryAndReflect) formatErrorDetails(err error) string {\n\treturn fmt.Sprintf(\"%T: %v\", err, err)\n}\n\nfunc (r *retryAndReflect) formatToolArgs(toolArgs map[string]any) string {\n\targsBytes, err := json.MarshalIndent(toolArgs, \"\", \"  \")\n\tif err != nil {\n\t\treturn fmt.Sprintf(\"%+v\", toolArgs)\n\t}\n\treturn string(argsBytes)\n}\n\n// templateData represents the variables in the templates.\ntype templateData struct {\n\tToolName     string\n\tErrorDetails string\n\tArgsSummary  string\n\tRetryCount   int\n\tMaxRetries   int\n}\n\nfunc (r *retryAndReflect) createToolReflectionResponse(tool tool.Tool, toolArgs map[string]any, toolErr error, retryCount int) map[string]any {\n\targsSummary := r.formatToolArgs(toolArgs)\n\terrorDetails := r.formatErrorDetails(toolErr)\n\n\td := templateData{\n\t\tToolName:     tool.Name(),\n\t\tErrorDetails: errorDetails,\n\t\tArgsSummary:  argsSummary,\n\t\tRetryCount:   retryCount,\n\t\tMaxRetries:   r.maxRetries,\n\t}\n\n\tvar buf bytes.Buffer\n\terr := reflectionTemplate.Execute(&buf, d)\n\tif err != nil {\n\t\treturn nil\n\t}\n\n\treturn map[string]any{\n\t\t\"response_type\":       reflectAndRetryResponseType,\n\t\t\"error_type\":          fmt.Sprintf(\"%T\", toolErr),\n\t\t\"error_details\":       toolErr.Error(),\n\t\t\"retry_count\":         retryCount,\n\t\t\"reflection_guidance\": strings.TrimSpace(buf.String()),\n\t}\n}\n\nfunc (r *retryAndReflect) createToolRetryExceedMsg(tool tool.Tool, toolArgs map[string]any, toolErr error) map[string]any {\n\targsSummary := r.formatToolArgs(toolArgs)\n\terrorDetails := r.formatErrorDetails(toolErr)\n\n\td := templateData{\n\t\tToolName:     tool.Name(),\n\t\tErrorDetails: errorDetails,\n\t\tArgsSummary:  argsSummary,\n\t}\n\n\tvar buf bytes.Buffer\n\terr := exceededTemplate.Execute(&buf, d)\n\tif err != nil {\n\t\treturn nil\n\t}\n\n\treturn map[string]any{\n\t\t\"response_type\":       reflectAndRetryResponseType,\n\t\t\"error_type\":          fmt.Sprintf(\"%T\", toolErr),\n\t\t\"error_details\":       toolErr.Error(),\n\t\t\"retry_count\":         r.maxRetries,\n\t\t\"reflection_guidance\": strings.TrimSpace(buf.String()),\n\t}\n}\n"
  },
  {
    "path": "plugin/retryandreflect/plugin_test.go",
    "content": "// Copyright 2026 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage retryandreflect\n\nimport (\n\t\"errors\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"google.golang.org/adk/tool\"\n)\n\ntype mockTool struct {\n\tname string\n}\n\nfunc (m *mockTool) Name() string        { return m.name }\nfunc (m *mockTool) Description() string { return \"\" }\nfunc (m *mockTool) IsLongRunning() bool { return false }\n\ntype mockContext struct {\n\ttool.Context\n\tinvocationID string\n}\n\nfunc (m *mockContext) InvocationID() string { return m.invocationID }\n\nfunc TestNewOptions(t *testing.T) {\n\ttests := []struct {\n\t\tname    string\n\t\topts    []PluginOption\n\t\twantErr bool\n\t}{\n\t\t{\n\t\t\tname: \"defaults\",\n\t\t},\n\t\t{\n\t\t\tname: \"custom options\",\n\t\t\topts: []PluginOption{\n\t\t\t\tWithMaxRetries(5),\n\t\t\t\tWithErrorIfRetryExceeded(true),\n\t\t\t\tWithTrackingScope(Global),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"negative max retries\",\n\t\t\topts: []PluginOption{\n\t\t\t\tWithMaxRetries(-1),\n\t\t\t},\n\t\t\twantErr: true,\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tp, err := New(tt.opts...)\n\t\t\tif (err != nil) != tt.wantErr {\n\t\t\t\tt.Fatalf(\"New() error = %v, wantErr %v\", err, tt.wantErr)\n\t\t\t}\n\t\t\tif tt.wantErr {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif p.Name() != \"RetryAndReflectPlugin\" {\n\t\t\t\tt.Errorf(\"expected plugin name RetryAndReflectPlugin, got %s\", p.Name())\n\t\t\t}\n\t\t\tif p.AfterToolCallback() == nil {\n\t\t\t\tt.Errorf(\"expected AfterToolCallback to be set\")\n\t\t\t}\n\t\t\tif p.OnToolErrorCallback() == nil {\n\t\t\t\tt.Errorf(\"expected OnToolErrorCallback to be set\")\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestRetryAndReflect_SuccessResets(t *testing.T) {\n\tr := &retryAndReflect{\n\t\tmaxRetries:            3,\n\t\tscope:                 Invocation,\n\t\tscopedFailureCounters: make(map[string]map[string]int),\n\t}\n\n\tctx := &mockContext{invocationID: \"inv1\"}\n\ttl := &mockTool{name: \"test-tool\"}\n\targs := map[string]any{\"arg1\": \"val1\"}\n\terr := errors.New(\"some error\")\n\n\t// Fail twice\n\t_, _ = r.onToolError(ctx, tl, args, err)\n\t_, _ = r.onToolError(ctx, tl, args, err)\n\n\tif count := r.scopedFailureCounters[\"inv1\"][\"test-tool\"]; count != 2 {\n\t\tt.Errorf(\"expected count 2, got %d\", count)\n\t}\n\n\t// Succeed\n\t_, _ = r.afterTool(ctx, tl, args, nil, nil)\n\n\tif _, ok := r.scopedFailureCounters[\"inv1\"][\"test-tool\"]; ok {\n\t\tt.Errorf(\"expected failure count to be reset\")\n\t}\n}\n\nfunc TestRetryAndReflect_AfterToolNoResetOnReflection(t *testing.T) {\n\tr := &retryAndReflect{\n\t\tmaxRetries:            3,\n\t\tscope:                 Invocation,\n\t\tscopedFailureCounters: make(map[string]map[string]int),\n\t}\n\n\tctx := &mockContext{invocationID: \"inv1\"}\n\ttl := &mockTool{name: \"test-tool\"}\n\targs := map[string]any{\"arg1\": \"val1\"}\n\terr := errors.New(\"some error\")\n\n\t// Fail once\n\tres, _ := r.onToolError(ctx, tl, args, err)\n\n\tif count := r.scopedFailureCounters[\"inv1\"][\"test-tool\"]; count != 1 {\n\t\tt.Errorf(\"expected count 1, got %d\", count)\n\t}\n\n\t// AfterTool is called with the result of onToolError\n\t_, _ = r.afterTool(ctx, tl, args, res, nil)\n\n\tif count := r.scopedFailureCounters[\"inv1\"][\"test-tool\"]; count != 1 {\n\t\tt.Errorf(\"expected failure count NOT to be reset, got %d\", count)\n\t}\n}\n\nfunc TestRetryAndReflect_MaxRetries(t *testing.T) {\n\tr := &retryAndReflect{\n\t\tmaxRetries:            2,\n\t\tscope:                 Invocation,\n\t\tscopedFailureCounters: make(map[string]map[string]int),\n\t}\n\n\tctx := &mockContext{invocationID: \"inv1\"}\n\ttl := &mockTool{name: \"test-tool\"}\n\targs := map[string]any{\"arg1\": \"val1\"}\n\terr := errors.New(\"fail\")\n\n\t// 1st retry\n\tres, _ := r.onToolError(ctx, tl, args, err)\n\tif res[\"retry_count\"] != 1 {\n\t\tt.Errorf(\"expected retry_count 1, got %v\", res[\"retry_count\"])\n\t}\n\tif res[\"response_type\"] != reflectAndRetryResponseType {\n\t\tt.Errorf(\"expected reflectAndRetryResponseType\")\n\t}\n\n\t// 2nd retry\n\tres, _ = r.onToolError(ctx, tl, args, err)\n\tif res[\"retry_count\"] != 2 {\n\t\tt.Errorf(\"expected retry_count 2, got %v\", res[\"retry_count\"])\n\t}\n\n\t// 3rd time - exceed\n\tres, _ = r.onToolError(ctx, tl, args, err)\n\tif res[\"retry_count\"] != 2 { // It returns maxRetries in createToolRetryExceedMsg\n\t\tt.Errorf(\"expected retry_count 2 (max), got %v\", res[\"retry_count\"])\n\t}\n\tif !strings.Contains(res[\"reflection_guidance\"].(string), \"exceeded\") {\n\t\tt.Errorf(\"expected guidance to mention exceeded, got %v\", res[\"reflection_guidance\"])\n\t}\n}\n\nfunc TestRetryAndReflect_ErrorIfRetryExceeded(t *testing.T) {\n\tr := &retryAndReflect{\n\t\tmaxRetries:            1,\n\t\terrorIfRetryExceeded:  true,\n\t\tscope:                 Invocation,\n\t\tscopedFailureCounters: make(map[string]map[string]int),\n\t}\n\n\tctx := &mockContext{invocationID: \"inv1\"}\n\ttl := &mockTool{name: \"test-tool\"}\n\terr := errors.New(\"fail\")\n\n\t// 1st retry\n\t_, _ = r.onToolError(ctx, tl, nil, err)\n\n\t// 2nd time - exceed, should return error\n\t_, gotErr := r.onToolError(ctx, tl, nil, err)\n\tif gotErr != err {\n\t\tt.Errorf(\"expected error %v, got %v\", err, gotErr)\n\t}\n}\n\nfunc TestRetryAndReflect_Scopes(t *testing.T) {\n\trInvocation := &retryAndReflect{\n\t\tmaxRetries:            3,\n\t\tscope:                 Invocation,\n\t\tscopedFailureCounters: make(map[string]map[string]int),\n\t}\n\trGlobal := &retryAndReflect{\n\t\tmaxRetries:            3,\n\t\tscope:                 Global,\n\t\tscopedFailureCounters: make(map[string]map[string]int),\n\t}\n\n\tctx1 := &mockContext{invocationID: \"inv1\"}\n\tctx2 := &mockContext{invocationID: \"inv2\"}\n\ttl := &mockTool{name: \"test-tool\"}\n\terr := errors.New(\"fail\")\n\n\t// Invocation scope\n\t_, _ = rInvocation.onToolError(ctx1, tl, nil, err)\n\tif rInvocation.scopedFailureCounters[\"inv1\"][\"test-tool\"] != 1 {\n\t\tt.Errorf(\"expected 1 failure in inv1\")\n\t}\n\t_, _ = rInvocation.onToolError(ctx2, tl, nil, err)\n\tif rInvocation.scopedFailureCounters[\"inv2\"][\"test-tool\"] != 1 {\n\t\tt.Errorf(\"expected 1 failure in inv2\")\n\t}\n\n\t// Global scope\n\t_, _ = rGlobal.onToolError(ctx1, tl, nil, err)\n\tif rGlobal.scopedFailureCounters[globalScopeKey][\"test-tool\"] != 1 {\n\t\tt.Errorf(\"expected 1 failure in global scope\")\n\t}\n\t_, _ = rGlobal.onToolError(ctx2, tl, nil, err)\n\tif rGlobal.scopedFailureCounters[globalScopeKey][\"test-tool\"] != 2 {\n\t\tt.Errorf(\"expected 2 failures in global scope\")\n\t}\n}\n"
  },
  {
    "path": "plugin/retryandreflect/reflection.md",
    "content": "\nThe call to tool `{{.ToolName}}` failed.\n\n**Error Details:**\n```\n{{.ErrorDetails}}\n```\n\n**Tool Arguments Used:**\n```json\n{{.ArgsSummary}}\n```\n\n**Reflection Guidance:**\nThis is retry attempt **{{.RetryCount}} of {{.MaxRetries}}**. Analyze the error and the arguments you provided. Do not repeat the exact same call. Consider the following before your next attempt:\n\n1.  **Invalid Parameters**: Does the error suggest that one or more arguments are incorrect, badly formatted, or missing? Review the tool's schema and your arguments.\n2.  **State or Preconditions**: Did a previous step fail or not produce the necessary state/resource for this tool to succeed?\n3.  **Alternative Approach**: Is this the right tool for the job? Could another tool or a different sequence of steps achieve the goal?\n4.  **Simplify the Task**: Can you break the problem down into smaller, simpler steps?\n5.  **Wrong Function Name**: Does the error indicates the tool is not found? Please check again and only use available tools.\n\nFormulate a new plan based on your analysis and try a corrected or different approach.\n"
  },
  {
    "path": "runner/runner.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Package runner provides a runtime for ADK agents.\npackage runner\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"iter\"\n\t\"log\"\n\t\"time\"\n\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/agent\"\n\t\"google.golang.org/adk/artifact\"\n\t\"google.golang.org/adk/internal/agent/parentmap\"\n\t\"google.golang.org/adk/internal/agent/runconfig\"\n\tartifactinternal \"google.golang.org/adk/internal/artifact\"\n\ticontext \"google.golang.org/adk/internal/context\"\n\t\"google.golang.org/adk/internal/llminternal\"\n\timemory \"google.golang.org/adk/internal/memory\"\n\t\"google.golang.org/adk/internal/plugininternal\"\n\t\"google.golang.org/adk/internal/utils\"\n\t\"google.golang.org/adk/memory\"\n\t\"google.golang.org/adk/model\"\n\t\"google.golang.org/adk/plugin\"\n\t\"google.golang.org/adk/session\"\n)\n\n// Config is used to create a [Runner].\ntype Config struct {\n\tAppName string\n\t// Root agent which starts the execution.\n\tAgent          agent.Agent\n\tSessionService session.Service\n\n\t// optional\n\tArtifactService artifact.Service\n\t// optional\n\tMemoryService memory.Service\n\t// optional\n\tPluginConfig PluginConfig\n\t// optional\n\tAutoCreateSession bool\n}\n\ntype PluginConfig struct {\n\tPlugins      []*plugin.Plugin\n\tCloseTimeout time.Duration\n}\n\ntype RunOption func(*runOptions)\n\ntype runOptions struct {\n\tstateDelta map[string]any\n}\n\n// WithStateDelta sets a state delta for the run invocation.\nfunc WithStateDelta(delta map[string]any) RunOption {\n\treturn func(o *runOptions) {\n\t\to.stateDelta = delta\n\t}\n}\n\n// New creates a new [Runner].\nfunc New(cfg Config) (*Runner, error) {\n\tif cfg.Agent == nil {\n\t\treturn nil, fmt.Errorf(\"root agent is required\")\n\t}\n\n\tif cfg.SessionService == nil {\n\t\treturn nil, fmt.Errorf(\"session service is required\")\n\t}\n\n\tparents, err := parentmap.New(cfg.Agent)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to create agent tree: %w\", err)\n\t}\n\n\tpluginManager, err := plugininternal.NewPluginManager(plugininternal.PluginConfig{\n\t\tPlugins:      cfg.PluginConfig.Plugins,\n\t\tCloseTimeout: cfg.PluginConfig.CloseTimeout,\n\t})\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to create plugin manager: %w\", err)\n\t}\n\n\treturn &Runner{\n\t\tappName:           cfg.AppName,\n\t\trootAgent:         cfg.Agent,\n\t\tsessionService:    cfg.SessionService,\n\t\tartifactService:   cfg.ArtifactService,\n\t\tmemoryService:     cfg.MemoryService,\n\t\tparents:           parents,\n\t\tpluginManager:     pluginManager,\n\t\tautoCreateSession: cfg.AutoCreateSession,\n\t}, nil\n}\n\n// Runner manages the execution of the agent within a session, handling message\n// processing, event generation, and interaction with various services like\n// artifact storage, session management, and memory.\ntype Runner struct {\n\tappName         string\n\trootAgent       agent.Agent\n\tsessionService  session.Service\n\tartifactService artifact.Service\n\tmemoryService   memory.Service\n\n\tparents           parentmap.Map\n\tpluginManager     *plugininternal.PluginManager\n\tautoCreateSession bool\n}\n\n// Run runs the agent for the given user input, yielding events from agents.\n// For each user message it finds the proper agent within an agent tree to\n// continue the conversation within the session.\nfunc (r *Runner) Run(ctx context.Context, userID, sessionID string, msg *genai.Content, cfg agent.RunConfig, opts ...RunOption) iter.Seq2[*session.Event, error] {\n\t// TODO(hakim): we need to validate whether cfg is compatible with the Agent.\n\t//   see adk-python/src/google/adk/runners.py Runner._new_invocation_context.\n\t// TODO: setup tracer.\n\treturn func(yield func(*session.Event, error) bool) {\n\t\toptions := runOptions{}\n\t\tfor _, opt := range opts {\n\t\t\topt(&options)\n\t\t}\n\n\t\tvar storedSession session.Session\n\t\tgetResp, err := r.sessionService.Get(ctx, &session.GetRequest{\n\t\t\tAppName:   r.appName,\n\t\t\tUserID:    userID,\n\t\t\tSessionID: sessionID,\n\t\t})\n\t\tif err != nil {\n\t\t\tif !r.autoCreateSession {\n\t\t\t\tyield(nil, err)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tcreateResp, err := r.sessionService.Create(ctx, &session.CreateRequest{\n\t\t\t\tAppName:   r.appName,\n\t\t\t\tUserID:    userID,\n\t\t\t\tSessionID: sessionID,\n\t\t\t})\n\t\t\tif err != nil {\n\t\t\t\tyield(nil, err)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tstoredSession = createResp.Session\n\t\t} else {\n\t\t\tstoredSession = getResp.Session\n\t\t}\n\n\t\tagentToRun, err := r.findAgentToRun(storedSession, msg)\n\t\tif err != nil {\n\t\t\tyield(nil, err)\n\t\t\treturn\n\t\t}\n\n\t\tctx = parentmap.ToContext(ctx, r.parents)\n\t\tctx = runconfig.ToContext(ctx, &runconfig.RunConfig{\n\t\t\tStreamingMode: runconfig.StreamingMode(cfg.StreamingMode),\n\t\t})\n\t\tctx = plugininternal.ToContext(ctx, r.pluginManager)\n\n\t\tvar artifacts agent.Artifacts\n\t\tif r.artifactService != nil {\n\t\t\tartifacts = &artifactinternal.Artifacts{\n\t\t\t\tService:   r.artifactService,\n\t\t\t\tSessionID: storedSession.ID(),\n\t\t\t\tAppName:   storedSession.AppName(),\n\t\t\t\tUserID:    storedSession.UserID(),\n\t\t\t}\n\t\t}\n\n\t\tvar memoryImpl agent.Memory = nil\n\t\tif r.memoryService != nil {\n\t\t\tmemoryImpl = &imemory.Memory{\n\t\t\t\tService:   r.memoryService,\n\t\t\t\tSessionID: storedSession.ID(),\n\t\t\t\tUserID:    storedSession.UserID(),\n\t\t\t\tAppName:   storedSession.AppName(),\n\t\t\t}\n\t\t}\n\n\t\tctx := icontext.NewInvocationContext(ctx, icontext.InvocationContextParams{\n\t\t\tArtifacts:   artifacts,\n\t\t\tMemory:      memoryImpl,\n\t\t\tSession:     storedSession,\n\t\t\tAgent:       agentToRun,\n\t\t\tUserContent: msg,\n\t\t\tRunConfig:   &cfg,\n\t\t})\n\t\tctx, err = r.appendMessageToSession(ctx, storedSession, msg, cfg.SaveInputBlobsAsArtifacts, r.pluginManager, options.stateDelta)\n\t\tif err != nil {\n\t\t\tyield(nil, err)\n\t\t\treturn\n\t\t}\n\n\t\tpluginManager := r.pluginManager\n\t\tif pluginManager != nil {\n\t\t\t// Defer the after run callbacks to perform global cleanup tasks or finalizing logs and metrics data.\n\t\t\t// This does NOT emit any event.\n\t\t\tdefer pluginManager.RunAfterRunCallback(ctx)\n\n\t\t\tearlyExitResult, err := pluginManager.RunBeforeRunCallback(ctx)\n\t\t\tif earlyExitResult != nil || err != nil {\n\t\t\t\tearlyExitEvent := session.NewEvent(ctx.InvocationID())\n\t\t\t\tearlyExitEvent.Author = \"user\"\n\t\t\t\tearlyExitEvent.LLMResponse = model.LLMResponse{\n\t\t\t\t\tContent: msg,\n\t\t\t\t}\n\t\t\t\tif err := r.sessionService.AppendEvent(ctx, storedSession, earlyExitEvent); err != nil {\n\t\t\t\t\tyield(nil, fmt.Errorf(\"failed to add event to session: %w\", err))\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tyield(earlyExitEvent, err)\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\n\t\tfor event, err := range agentToRun.Run(ctx) {\n\t\t\tif err != nil {\n\t\t\t\tif !yield(event, err) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tif pluginManager != nil {\n\t\t\t\tmodifiedEvent, err := pluginManager.RunOnEventCallback(ctx, event)\n\t\t\t\tif err != nil {\n\t\t\t\t\tif !yield(nil, err) {\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tif modifiedEvent != nil {\n\t\t\t\t\tevent = modifiedEvent\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// only commit non-partial event to a session service\n\t\t\tif !event.LLMResponse.Partial {\n\t\t\t\tif err := r.sessionService.AppendEvent(ctx, storedSession, event); err != nil {\n\t\t\t\t\tyield(nil, fmt.Errorf(\"failed to add event to session: %w\", err))\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif !yield(event, nil) {\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc (r *Runner) appendMessageToSession(ctx agent.InvocationContext, storedSession session.Session, msg *genai.Content, saveInputBlobsAsArtifacts bool, pluginManager *plugininternal.PluginManager, stateDelta map[string]any) (agent.InvocationContext, error) {\n\tif msg == nil {\n\t\treturn ctx, nil\n\t}\n\tif pluginManager != nil {\n\t\tmodifiedMsg, err := pluginManager.RunOnUserMessageCallback(ctx, msg)\n\t\tif err != nil {\n\t\t\treturn ctx, fmt.Errorf(\"error running on run user message callback : %w\", err)\n\t\t}\n\t\tif modifiedMsg != nil {\n\t\t\tmsg = modifiedMsg\n\t\t\t// update ctx user message\n\t\t\tctx = icontext.NewInvocationContext(ctx, icontext.InvocationContextParams{\n\t\t\t\tArtifacts:    ctx.Artifacts(),\n\t\t\t\tMemory:       ctx.Memory(),\n\t\t\t\tSession:      ctx.Session(),\n\t\t\t\tAgent:        ctx.Agent(),\n\t\t\t\tUserContent:  msg,\n\t\t\t\tRunConfig:    ctx.RunConfig(),\n\t\t\t\tInvocationID: ctx.InvocationID(),\n\t\t\t})\n\t\t}\n\t}\n\n\tartifactsService := ctx.Artifacts()\n\tif artifactsService != nil && saveInputBlobsAsArtifacts {\n\t\tfor i, part := range msg.Parts {\n\t\t\tif part.InlineData == nil {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tfileName := fmt.Sprintf(\"artifact_%s_%d\", ctx.InvocationID(), i)\n\t\t\tif _, err := artifactsService.Save(ctx, fileName, part); err != nil {\n\t\t\t\treturn ctx, fmt.Errorf(\"failed to save artifact %s: %w\", fileName, err)\n\t\t\t}\n\t\t\t// Replace the part with a text placeholder\n\t\t\tmsg.Parts[i] = &genai.Part{\n\t\t\t\tText: fmt.Sprintf(\"Uploaded file: %s. It has been saved to the artifacts\", fileName),\n\t\t\t}\n\t\t}\n\t}\n\n\tevent := session.NewEvent(ctx.InvocationID())\n\n\tevent.Author = \"user\"\n\tevent.LLMResponse = model.LLMResponse{\n\t\tContent: msg,\n\t}\n\tif stateDelta != nil {\n\t\tevent.Actions.StateDelta = stateDelta\n\t}\n\n\tif err := r.sessionService.AppendEvent(ctx, storedSession, event); err != nil {\n\t\treturn ctx, fmt.Errorf(\"failed to append event to sessionService: %w\", err)\n\t}\n\treturn ctx, nil\n}\n\n// findAgentToRun returns the agent that should handle the next request based on\n// session history.\nfunc (r *Runner) findAgentToRun(session session.Session, msg *genai.Content) (agent.Agent, error) {\n\tif event := handleUserFunctionCallResponse(session.Events(), msg); event != nil {\n\t\tsubAgent := findAgent(r.rootAgent, event.Author)\n\t\tif subAgent != nil {\n\t\t\treturn subAgent, nil\n\t\t}\n\t\tlog.Printf(\"Function call from an unknown agent: %s, event id: %s\", event.Author, event.ID)\n\t}\n\n\tevents := session.Events()\n\tfor i := events.Len() - 1; i >= 0; i-- {\n\t\tevent := events.At(i)\n\n\t\tif event.Author == \"user\" {\n\t\t\tcontinue\n\t\t}\n\n\t\tsubAgent := findAgent(r.rootAgent, event.Author)\n\t\t// Agent not found, continue looking for the other event.\n\t\tif subAgent == nil {\n\t\t\tlog.Printf(\"Event from an unknown agent: %s, event id: %s\", event.Author, event.ID)\n\t\t\tcontinue\n\t\t}\n\n\t\tif r.isTransferableAcrossAgentTree(subAgent) {\n\t\t\treturn subAgent, nil\n\t\t}\n\t}\n\n\t// Falls back to root agent if no suitable agents are found in the session.\n\treturn r.rootAgent, nil\n}\n\n// handleUserFunctionCallResponse finds the function call event that matches the function response id\n// delivered by the user in the latest event.\nfunc handleUserFunctionCallResponse(events session.Events, msg *genai.Content) *session.Event {\n\tif events.Len() == 0 {\n\t\treturn nil\n\t}\n\n\tfunctionResponses := utils.FunctionResponses(msg)\n\tif len(functionResponses) == 0 {\n\t\treturn nil\n\t}\n\n\t// This assumes that even if user provides multiple function responses, all the function calls\n\t// were made by the same agent. Otherwise it would be impossible to rearrange session events\n\t// such that every function response has a corresponding call filtering by author.\n\tcallID := functionResponses[0].ID\n\tfor i := events.Len() - 1; i >= 0; i-- {\n\t\tevent := events.At(i)\n\t\tfor _, part := range utils.FunctionCalls(event.Content) {\n\t\t\tif part.ID == callID {\n\t\t\t\treturn event\n\t\t\t}\n\t\t}\n\t}\n\treturn nil\n}\n\n// checks if the agent and its parent chain allow transfer up the tree.\nfunc (r *Runner) isTransferableAcrossAgentTree(agentToRun agent.Agent) bool {\n\tfor curAgent := agentToRun; curAgent != nil; curAgent = r.parents[curAgent.Name()] {\n\t\tllmAgent, ok := curAgent.(llminternal.Agent)\n\t\tif !ok {\n\t\t\treturn false\n\t\t}\n\n\t\tif llminternal.Reveal(llmAgent).DisallowTransferToParent {\n\t\t\treturn false\n\t\t}\n\t}\n\n\treturn true\n}\n\nfunc findAgent(curAgent agent.Agent, targetName string) agent.Agent {\n\tif curAgent == nil || curAgent.Name() == targetName {\n\t\treturn curAgent\n\t}\n\n\tfor _, subAgent := range curAgent.SubAgents() {\n\t\tif agent := findAgent(subAgent, targetName); agent != nil {\n\t\t\treturn agent\n\t\t}\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "runner/runner_test.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage runner\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"fmt\"\n\t\"iter\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/agent\"\n\t\"google.golang.org/adk/agent/llmagent\"\n\t\"google.golang.org/adk/artifact\"\n\t\"google.golang.org/adk/model\"\n\t\"google.golang.org/adk/session\"\n)\n\nfunc TestRunner_findAgentToRun(t *testing.T) {\n\tt.Parallel()\n\n\tappName, userID, sessionID := \"test\", \"userID\", \"sessionID\"\n\n\tagentTree := agentTree(t)\n\n\ttests := []struct {\n\t\tname        string\n\t\trootAgent   agent.Agent\n\t\tsession     session.Session\n\t\tuserMessage *genai.Content\n\t\twantAgent   agent.Agent\n\t\twantErr     bool\n\t}{\n\t\t{\n\t\t\tname: \"last event from agent allowing transfer\",\n\t\t\tsession: createSession(t, t.Context(), appName, userID, sessionID, []*session.Event{\n\t\t\t\t{\n\t\t\t\t\tAuthor: \"allows_transfer_agent\",\n\t\t\t\t},\n\t\t\t}),\n\t\t\trootAgent: agentTree.root,\n\t\t\twantAgent: agentTree.allowsTransferAgent,\n\t\t},\n\t\t{\n\t\t\tname: \"last event from agent not allowing transfer\",\n\t\t\tsession: createSession(t, t.Context(), appName, userID, sessionID, []*session.Event{\n\t\t\t\t{\n\t\t\t\t\tAuthor: \"no_transfer_agent\",\n\t\t\t\t},\n\t\t\t}),\n\t\t\trootAgent: agentTree.root,\n\t\t\twantAgent: agentTree.root,\n\t\t},\n\t\t{\n\t\t\tname:      \"no events from agents, call root\",\n\t\t\tsession:   createSession(t, t.Context(), appName, userID, sessionID, []*session.Event{}),\n\t\t\trootAgent: agentTree.root,\n\t\t\twantAgent: agentTree.root,\n\t\t},\n\t\t{\n\t\t\tname: \"last event from user with function response\",\n\t\t\tsession: createSession(t, t.Context(), appName, userID, sessionID, []*session.Event{\n\t\t\t\t{\n\t\t\t\t\tAuthor: agentTree.noTransferAgent.Name(),\n\t\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\t\tContent: &genai.Content{\n\t\t\t\t\t\t\tParts: []*genai.Part{\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tFunctionCall: &genai.FunctionCall{\n\t\t\t\t\t\t\t\t\t\tName: \"fn_name\",\n\t\t\t\t\t\t\t\t\t\tID:   \"fn_id\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tAuthor: agentTree.root.Name(),\n\t\t\t\t},\n\t\t\t}),\n\t\t\tuserMessage: genai.NewContentFromParts([]*genai.Part{{\n\t\t\t\tFunctionResponse: &genai.FunctionResponse{\n\t\t\t\t\tName: \"fn_name\",\n\t\t\t\t\tID:   \"fn_id\",\n\t\t\t\t},\n\t\t\t}}, genai.RoleUser),\n\t\t\trootAgent: agentTree.root,\n\t\t\twantAgent: agentTree.noTransferAgent,\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tr := &Runner{\n\t\t\t\trootAgent: tt.rootAgent,\n\t\t\t}\n\t\t\tgotAgent, err := r.findAgentToRun(tt.session, tt.userMessage)\n\t\t\tif (err != nil) != tt.wantErr {\n\t\t\t\tt.Errorf(\"Runner.findAgentToRun() error = %v, wantErr %v\", err, tt.wantErr)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif tt.wantAgent != gotAgent {\n\t\t\t\tt.Errorf(\"Runner.findAgentToRun() = %+v, want %+v\", gotAgent.Name(), tt.wantAgent.Name())\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc Test_findAgent(t *testing.T) {\n\tagentTree := agentTree(t)\n\n\toneAgent := must(llmagent.New(llmagent.Config{\n\t\tName: \"test\",\n\t}))\n\n\ttests := []struct {\n\t\tname      string\n\t\troot      agent.Agent\n\t\ttarget    string\n\t\twantAgent agent.Agent\n\t}{\n\t\t{\n\t\t\tname:      \"ok\",\n\t\t\troot:      agentTree.root,\n\t\t\ttarget:    agentTree.allowsTransferAgent.Name(),\n\t\t\twantAgent: agentTree.allowsTransferAgent,\n\t\t},\n\t\t{\n\t\t\tname:      \"finds in one node tree\",\n\t\t\troot:      oneAgent,\n\t\t\ttarget:    oneAgent.Name(),\n\t\t\twantAgent: oneAgent,\n\t\t},\n\t\t{\n\t\t\tname:      \"doesn't fail if agent is missing in the tree\",\n\t\t\troot:      agentTree.root,\n\t\t\ttarget:    \"random\",\n\t\t\twantAgent: nil,\n\t\t},\n\t\t{\n\t\t\tname:      \"doesn't fail on the empty tree\",\n\t\t\troot:      nil,\n\t\t\ttarget:    \"random\",\n\t\t\twantAgent: nil,\n\t\t},\n\t}\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tif gotAgent := findAgent(tt.root, tt.target); gotAgent != tt.wantAgent {\n\t\t\t\tt.Errorf(\"Runner.findAgent() = %+v, want %+v\", gotAgent.Name(), tt.wantAgent.Name())\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc Test_isTransferrableAcrossAgentTree(t *testing.T) {\n\ttests := []struct {\n\t\tname  string\n\t\tagent agent.Agent\n\t\twant  bool\n\t}{\n\t\t{\n\t\t\tname: \"disallow for agent with DisallowTransferToParent\",\n\t\t\tagent: must(llmagent.New(llmagent.Config{\n\t\t\t\tName:                     \"test\",\n\t\t\t\tDisallowTransferToParent: true,\n\t\t\t})),\n\t\t\twant: false,\n\t\t},\n\t\t{\n\t\t\tname: \"disallow for non-LLM agent\",\n\t\t\tagent: must(agent.New(agent.Config{\n\t\t\t\tName: \"test\",\n\t\t\t})),\n\t\t\twant: false,\n\t\t},\n\t\t{\n\t\t\tname: \"allow for the default LLM agent\",\n\t\t\tagent: must(llmagent.New(llmagent.Config{\n\t\t\t\tName: \"test\",\n\t\t\t})),\n\t\t\twant: true,\n\t\t},\n\t}\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\trunner, err := New(Config{\n\t\t\t\tAppName:        \"testApp\",\n\t\t\t\tAgent:          tt.agent,\n\t\t\t\tSessionService: session.InMemoryService(),\n\t\t\t})\n\t\t\tif err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\t\t\tif got := runner.isTransferableAcrossAgentTree(tt.agent); got != tt.want {\n\t\t\t\tt.Errorf(\"isTransferrableAcrossAgentTree() = %v, want %v\", got, tt.want)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestRunner_SaveInputBlobsAsArtifacts(t *testing.T) {\n\tctx := context.Background()\n\tappName := \"testApp\"\n\tuserID := \"testUser\"\n\tsessionID := \"testSession\"\n\n\tsessionService := session.InMemoryService()\n\tartifactService := artifact.InMemoryService()\n\n\ttestAgent := must(agent.New(agent.Config{\n\t\tName: \"test_agent\",\n\t\tRun: func(ctx agent.InvocationContext) iter.Seq2[*session.Event, error] {\n\t\t\treturn func(yield func(*session.Event, error) bool) {\n\t\t\t\t// no-op, we are testing logic before agent run.\n\t\t\t}\n\t\t},\n\t}))\n\n\tr, err := New(Config{\n\t\tAppName:        appName,\n\t\tAgent:          testAgent,\n\t\tSessionService: sessionService,\n\t})\n\tif err != nil {\n\t\tt.Fatalf(\"New() error = %v\", err)\n\t}\n\tr.artifactService = artifactService\n\n\t_, err = sessionService.Create(ctx, &session.CreateRequest{\n\t\tAppName:   appName,\n\t\tUserID:    userID,\n\t\tSessionID: sessionID,\n\t})\n\tif err != nil {\n\t\tt.Fatalf(\"sessionService.Create() error = %v\", err)\n\t}\n\n\t// Blob data, the message is saved only when inline data is present.\n\tblobData := []byte(\"this is not blob data - René Magritte\")\n\tmsg := &genai.Content{\n\t\tParts: []*genai.Part{\n\t\t\tgenai.NewPartFromText(\"here is a file\"),\n\t\t\t{InlineData: &genai.Blob{MIMEType: \"application/octet-stream\", Data: blobData}},\n\t\t},\n\t\tRole: genai.RoleUser,\n\t}\n\n\tcfg := agent.RunConfig{\n\t\tSaveInputBlobsAsArtifacts: true,\n\t}\n\n\t// Consume the iterator from Run. The agent itself does nothing, but the runner\n\t// will save the artifact before calling the agent.\n\tfor _, err := range r.Run(ctx, userID, sessionID, msg, cfg) {\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"r.Run() returned an error: %v\", err)\n\t\t}\n\t}\n\n\tlistResp, err := artifactService.List(ctx, &artifact.ListRequest{\n\t\tAppName:   appName,\n\t\tUserID:    userID,\n\t\tSessionID: sessionID,\n\t})\n\tif err != nil {\n\t\tt.Fatalf(\"artifactService.List() error = %v\", err)\n\t}\n\tif len(listResp.FileNames) != 1 {\n\t\tt.Fatalf(\"expected 1 artifact, got %d\", len(listResp.FileNames))\n\t}\n\tsavedFileName := listResp.FileNames[0]\n\n\tif !strings.HasPrefix(savedFileName, \"artifact_\") {\n\t\tt.Errorf(\"saved file name should start with 'artifact_', got %q\", savedFileName)\n\t}\n\n\tloadResp, err := artifactService.Load(ctx, &artifact.LoadRequest{\n\t\tAppName:   appName,\n\t\tUserID:    userID,\n\t\tSessionID: sessionID,\n\t\tFileName:  savedFileName,\n\t})\n\tif err != nil {\n\t\tt.Fatalf(\"artifactService.Load() error = %v\", err)\n\t}\n\n\tif !bytes.Equal(loadResp.Part.InlineData.Data, blobData) {\n\t\tt.Errorf(\"loaded artifact data does not match original blob data\")\n\t}\n\n\tgetResponse, err := sessionService.Get(ctx, &session.GetRequest{\n\t\tAppName:   appName,\n\t\tUserID:    userID,\n\t\tSessionID: sessionID,\n\t})\n\tif err != nil {\n\t\tt.Fatalf(\"sessionService.Get() error = %v\", err)\n\t}\n\n\tevents := getResponse.Session.Events()\n\tif events.Len() == 0 {\n\t\tt.Fatal(\"no events in session\")\n\t}\n\tuserEvent := events.At(0)\n\tif userEvent.Author != \"user\" {\n\t\tt.Fatalf(\"expected first event to be from user, got %s\", userEvent.Author)\n\t}\n\n\t// The part with InlineData should be replaced.\n\tif len(userEvent.LLMResponse.Content.Parts) != 2 {\n\t\tt.Fatalf(\"expected 2 parts in user message event, got %d\", len(userEvent.LLMResponse.Content.Parts))\n\t}\n\tpartWithBlob := userEvent.LLMResponse.Content.Parts[1]\n\tif partWithBlob.InlineData != nil {\n\t\tt.Errorf(\"InlineData was not removed from the message part in the session\")\n\t}\n\texpectedText := fmt.Sprintf(\"Uploaded file: %s. It has been saved to the artifacts\", savedFileName)\n\tif partWithBlob.Text != expectedText {\n\t\tt.Errorf(\"unexpected text in placeholder part. got %q, want %q\", partWithBlob.Text, expectedText)\n\t}\n}\n\n// creates agentTree for tests and returns references to the agents\nfunc agentTree(t *testing.T) agentTreeStruct {\n\tt.Helper()\n\n\tsub1 := must(llmagent.New(llmagent.Config{\n\t\tName:                     \"no_transfer_agent\",\n\t\tDisallowTransferToParent: true,\n\t}))\n\tsub2 := must(llmagent.New(llmagent.Config{\n\t\tName: \"allows_transfer_agent\",\n\t}))\n\tparent := must(llmagent.New(llmagent.Config{\n\t\tName:      \"root\",\n\t\tSubAgents: []agent.Agent{sub1, sub2},\n\t}))\n\n\treturn agentTreeStruct{\n\t\troot:                parent,\n\t\tnoTransferAgent:     sub1,\n\t\tallowsTransferAgent: sub2,\n\t}\n}\n\ntype agentTreeStruct struct {\n\troot, noTransferAgent, allowsTransferAgent agent.Agent\n}\n\nfunc must[T agent.Agent](a T, err error) T {\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn a\n}\n\nfunc createSession(t *testing.T, ctx context.Context, sessionID, appName, userID string, events []*session.Event) session.Session {\n\tt.Helper()\n\n\tservice := session.InMemoryService()\n\n\tresp, err := service.Create(ctx, &session.CreateRequest{\n\t\tAppName:   appName,\n\t\tUserID:    userID,\n\t\tSessionID: sessionID,\n\t})\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\tfor _, event := range events {\n\t\tif err := service.AppendEvent(ctx, resp.Session, event); err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t}\n\n\treturn resp.Session\n}\n\nfunc TestRunner_AutoCreateSession(t *testing.T) {\n\tt.Parallel()\n\n\tappName := \"testApp\"\n\tuserID := \"testUser\"\n\tsessionID := \"testSession\"\n\n\ttestAgent := must(agent.New(agent.Config{\n\t\tName: \"test_agent\",\n\t\tRun: func(ctx agent.InvocationContext) iter.Seq2[*session.Event, error] {\n\t\t\treturn func(yield func(*session.Event, error) bool) {\n\t\t\t\t// no-op, we are testing logic before agent run.\n\t\t\t}\n\t\t},\n\t}))\n\n\ttests := []struct {\n\t\tname              string\n\t\tautoCreateSession bool\n\t\tsetupSession      bool\n\t\twantErr           bool\n\t}{\n\t\t{\n\t\t\tname:              \"auto_create_true_session_missing\",\n\t\t\tautoCreateSession: true,\n\t\t\tsetupSession:      false,\n\t\t\twantErr:           false,\n\t\t},\n\t\t{\n\t\t\tname:              \"auto_create_false_session_missing\",\n\t\t\tautoCreateSession: false,\n\t\t\tsetupSession:      false,\n\t\t\twantErr:           true,\n\t\t},\n\t\t{\n\t\t\tname:              \"auto_create_false_session_exists\",\n\t\t\tautoCreateSession: false,\n\t\t\tsetupSession:      true,\n\t\t\twantErr:           false,\n\t\t},\n\t\t{\n\t\t\tname:              \"auto_create_true_session_exists\",\n\t\t\tautoCreateSession: true,\n\t\t\tsetupSession:      true,\n\t\t\twantErr:           false,\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tctx := t.Context()\n\t\t\tsessionService := session.InMemoryService()\n\n\t\t\tif tt.setupSession {\n\t\t\t\t_, err := sessionService.Create(ctx, &session.CreateRequest{\n\t\t\t\t\tAppName:   appName,\n\t\t\t\t\tUserID:    userID,\n\t\t\t\t\tSessionID: sessionID,\n\t\t\t\t})\n\t\t\t\tif err != nil {\n\t\t\t\t\tt.Fatalf(\"failed to setup session: %v\", err)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tr, err := New(Config{\n\t\t\t\tAppName:           appName,\n\t\t\t\tAgent:             testAgent,\n\t\t\t\tSessionService:    sessionService,\n\t\t\t\tAutoCreateSession: tt.autoCreateSession,\n\t\t\t})\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"New() error = %v\", err)\n\t\t\t}\n\n\t\t\tmsg := &genai.Content{Parts: []*genai.Part{{Text: \"hello\"}}}\n\t\t\tgotError := false\n\t\t\tfor _, err := range r.Run(ctx, userID, sessionID, msg, agent.RunConfig{}) {\n\t\t\t\tif err != nil {\n\t\t\t\t\tgotError = true\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif gotError != tt.wantErr {\n\t\t\t\tt.Errorf(\"Runner.Run() error = %v, wantErr %v\", gotError, tt.wantErr)\n\t\t\t}\n\n\t\t\t// If we expected success, verify session exists/persists\n\t\t\tif !tt.wantErr {\n\t\t\t\t_, err = sessionService.Get(ctx, &session.GetRequest{\n\t\t\t\t\tAppName:   appName,\n\t\t\t\t\tUserID:    userID,\n\t\t\t\t\tSessionID: sessionID,\n\t\t\t\t})\n\t\t\t\tif err != nil {\n\t\t\t\t\tt.Errorf(\"expected session to exist, but got error: %v\", err)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "scripts/adk-web/Dockerfile",
    "content": "# Stage 1: Clone the repository\nFROM node:iron-trixie AS downloader\nRUN apt-get update && apt-get install -y git\n\n# Trigger re-clone when the main branch changes.\nADD https://api.github.com/repos/google/adk-web/git/refs/heads/main version.json\nRUN git clone -b main https://github.com/google/adk-web /adk-web && rm version.json\n\n# Stage 2: Build the application\nFROM node:iron-trixie AS builder\n\nWORKDIR /adk-web\n\n# Copy package files first to leverage Docker cache for npm install.\n# This ensures that npm install is only re-run if package.json or package-lock.json changes,\n# and not when other source files change.\nCOPY --from=downloader /adk-web/package*.json ./\nRUN npm install\n\n# Copy the rest of the source code\nCOPY --from=downloader /adk-web ./\n\nRUN npm run build\n"
  },
  {
    "path": "scripts/adk-web/update-adk-web.sh",
    "content": "#!/bin/sh\n\n# This scripts pulls the latest version of adk-web.\n# It uses the latest version from https://github.com/google/adk-web and builds it in a docker container.\n\n\n# Use directory of the script for references\nSCRIPT_DIR=\"$(dirname \"$0\")\"\n\nOUTPUT_DIR=\"${SCRIPT_DIR}/../../cmd/launcher/web/webui/distr/\"\nCONTAINER_BUILD_DIR=\"adk-web/dist/agent_framework_web/browser\"\n\nif ! docker build -t adk-web-builder:latest \"${SCRIPT_DIR}\"; then\n    echo \"Failed to build container. Stopping the update.\"\n    exit 1\nfi\n\nCONTAINER_ID=$(docker create adk-web-builder:latest)\nif [ $? -ne 0 ]; then\n    echo \"Failed to create container. Stopping the update.\"\n    exit 1\nfi\ntrap \"docker rm -f ${CONTAINER_ID}\" EXIT\n\necho \"Cleaning up the output directory.\"\nrm -rf \"${OUTPUT_DIR}\"\necho \"Copying the built files from the container to the output directory.\"\ndocker cp \"${CONTAINER_ID}\":/${CONTAINER_BUILD_DIR}/. \"${OUTPUT_DIR}\"\n\necho \"Done.\"\n"
  },
  {
    "path": "server/adka2a/agent_card.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage adka2a\n\nimport (\n\t\"fmt\"\n\t\"regexp\"\n\t\"slices\"\n\t\"strings\"\n\n\t\"github.com/a2aproject/a2a-go/a2a\"\n\n\t\"google.golang.org/adk/agent\"\n\t\"google.golang.org/adk/agent/workflowagents/loopagent\"\n\tiagent \"google.golang.org/adk/internal/agent\"\n\t\"google.golang.org/adk/internal/llminternal\"\n)\n\n// BuildAgentSkills attempts to create a list of [a2a.AgentSkill]s based on agent descriptions and types.\n// This information can be used in [a2a.AgentCard] to help clients understand agent capabilities.\nfunc BuildAgentSkills(agent agent.Agent) []a2a.AgentSkill {\n\treturn slices.Concat(buildPrimarySkills(agent), buildSubAgentSkills(agent))\n}\n\nfunc buildPrimarySkills(agent agent.Agent) []a2a.AgentSkill {\n\tif llmAgent, ok := agent.(llminternal.Agent); ok {\n\t\treturn buildLLMAgentSkills(agent, llminternal.Reveal(llmAgent))\n\t} else {\n\t\treturn buildNonLLMAgentSkills(agent)\n\t}\n}\n\nfunc buildSubAgentSkills(agent agent.Agent) []a2a.AgentSkill {\n\tsubAgents := agent.SubAgents()\n\tresult := make([]a2a.AgentSkill, 0, len(agent.SubAgents()))\n\tfor _, sub := range subAgents {\n\t\tskills := buildPrimarySkills(sub)\n\t\tfor _, subSkill := range skills {\n\t\t\tskill := a2a.AgentSkill{\n\t\t\t\tID:          fmt.Sprintf(\"%s_%s\", sub.Name(), subSkill.ID),\n\t\t\t\tName:        fmt.Sprintf(\"%s: %s\", sub.Name(), subSkill.Name),\n\t\t\t\tDescription: subSkill.Description,\n\t\t\t\tTags:        slices.Concat([]string{fmt.Sprintf(\"sub_agent:%s\", sub.Name())}, subSkill.Tags),\n\t\t\t}\n\t\t\tresult = append(result, skill)\n\t\t}\n\t}\n\treturn result\n}\n\nfunc buildLLMAgentSkills(agent agent.Agent, llmState *llminternal.State) []a2a.AgentSkill {\n\tskills := []a2a.AgentSkill{\n\t\t{\n\t\t\tID:          agent.Name(),\n\t\t\tName:        \"model\",\n\t\t\tDescription: buildDescriptionFromInstructions(agent, llmState),\n\t\t\tTags:        []string{\"llm\"},\n\t\t},\n\t}\n\n\tif len(llmState.Tools) > 0 {\n\t\tfor _, tool := range llmState.Tools {\n\t\t\tdescription := tool.Description()\n\t\t\tif description == \"\" {\n\t\t\t\tdescription = fmt.Sprintf(\"Tool: %s\", tool.Name())\n\t\t\t}\n\t\t\tskills = append(skills, a2a.AgentSkill{\n\t\t\t\tID:          fmt.Sprintf(\"%s-%s\", agent.Name(), tool.Name()),\n\t\t\t\tName:        tool.Name(),\n\t\t\t\tDescription: description,\n\t\t\t\tTags:        []string{\"llm\", \"tools\"},\n\t\t\t})\n\t\t}\n\t}\n\n\t// TODO(yarolegovich): mention planning and code-execution skills once supported (and if configured)\n\n\treturn skills\n}\n\nfunc buildNonLLMAgentSkills(agent agent.Agent) []a2a.AgentSkill {\n\tstate := getInternalState(agent)\n\tskills := []a2a.AgentSkill{\n\t\t{\n\t\t\tID:          agent.Name(),\n\t\t\tName:        getAgentSkillName(state),\n\t\t\tDescription: buildAgentDescription(agent, state),\n\t\t\tTags:        []string{getAgentTypeTag(state)},\n\t\t},\n\t}\n\n\tsubAgents := agent.SubAgents()\n\tif len(subAgents) > 0 {\n\t\tdescriptions := make([]string, len(subAgents))\n\t\tfor i, sub := range subAgents {\n\t\t\tif sub.Description() != \"\" {\n\t\t\t\tdescriptions[i] = sub.Description()\n\t\t\t} else {\n\t\t\t\tdescriptions[i] = \"No description\"\n\t\t\t}\n\t\t}\n\t\tskills = append(skills, a2a.AgentSkill{\n\t\t\tID:          fmt.Sprintf(\"%s-sub-agents\", agent.Name()),\n\t\t\tName:        \"sub-agents\",\n\t\t\tDescription: fmt.Sprintf(\"Orchestrates: %s\", strings.Join(descriptions, \"; \")),\n\t\t\tTags:        []string{getAgentTypeTag(state), \"orchestration\"},\n\t\t})\n\t}\n\n\treturn skills\n}\n\nfunc buildAgentDescription(agent agent.Agent, state *iagent.State) string {\n\tdescriptionParts := []string{}\n\n\tif agent.Description() != \"\" {\n\t\tdescriptionParts = append(descriptionParts, agent.Description())\n\t}\n\n\tif len(agent.SubAgents()) > 0 {\n\t\tswitch state.AgentType {\n\t\tcase iagent.TypeLoopAgent:\n\t\t\tdescriptionParts = append(descriptionParts, buildLoopAgentDescription(agent, state))\n\t\tcase iagent.TypeParallelAgent:\n\t\t\tdescriptionParts = append(descriptionParts, buildParallelAgentDescription(agent))\n\t\tcase iagent.TypeSequentialAgent:\n\t\t\tdescriptionParts = append(descriptionParts, buildSequentialAgentDescription(agent))\n\t\t}\n\t}\n\n\tif len(descriptionParts) > 0 {\n\t\treturn strings.Join(descriptionParts, \" \")\n\t} else {\n\t\treturn getDefaultAgentDescription(state)\n\t}\n}\n\nfunc buildSequentialAgentDescription(agnt agent.Agent) string {\n\tsubAgents := agnt.SubAgents()\n\tdescriptions := make([]string, len(subAgents))\n\tfor i, sub := range subAgents {\n\t\tsubDescription := sub.Description()\n\t\tif subDescription == \"\" {\n\t\t\tsubDescription = fmt.Sprintf(\"execute the %s agent\", sub.Name())\n\t\t}\n\t\tswitch i {\n\t\tcase 0:\n\t\t\tdescriptions[i] = fmt.Sprintf(\"First, this agent will %s.\", subDescription)\n\t\tcase len(subAgents) - 1:\n\t\t\tdescriptions[i] = fmt.Sprintf(\"Finally, this agent will %s.\", subDescription)\n\t\tdefault:\n\t\t\tdescriptions[i] = fmt.Sprintf(\"Then, this agent will %s.\", subDescription)\n\t\t}\n\t}\n\treturn strings.Join(descriptions, \" \")\n}\n\nfunc buildParallelAgentDescription(agnt agent.Agent) string {\n\tsubAgents := agnt.SubAgents()\n\tdescriptions := make([]string, len(subAgents))\n\tfor i, sub := range subAgents {\n\t\tsubDescription := sub.Description()\n\t\tif subDescription == \"\" {\n\t\t\tsubDescription = fmt.Sprintf(\"execute the %s agent\", sub.Name())\n\t\t}\n\t\tswitch i {\n\t\tcase 0:\n\t\t\tdescriptions[i] = fmt.Sprintf(\"This agent will %s\", subDescription)\n\t\tcase len(subAgents) - 1:\n\t\t\tdescriptions[i] = fmt.Sprintf(\"and %s\", subDescription)\n\t\tdefault:\n\t\t\tdescriptions[i] = fmt.Sprintf(\", %s\", subDescription)\n\t\t}\n\t}\n\treturn fmt.Sprintf(\"%s simultaneously.\", strings.Join(descriptions, \" \"))\n}\n\nfunc buildLoopAgentDescription(agnt agent.Agent, state *iagent.State) string {\n\tllmConfig, ok := state.Config.(loopagent.Config)\n\tif !ok {\n\t\treturn \"\"\n\t}\n\tmaxIterations := \"unlimited\"\n\tif llmConfig.MaxIterations > 0 {\n\t\tmaxIterations = fmt.Sprintf(\"%d\", llmConfig.MaxIterations)\n\t}\n\tsubAgents := agnt.SubAgents()\n\tdescriptions := make([]string, len(subAgents))\n\tfor i, sub := range subAgents {\n\t\tsubDescription := sub.Description()\n\t\tif subDescription == \"\" {\n\t\t\tsubDescription = fmt.Sprintf(\"execute the %s agent\", sub.Name())\n\t\t}\n\t\tswitch i {\n\t\tcase 0:\n\t\t\tdescriptions[i] = fmt.Sprintf(\"This agent will %s\", subDescription)\n\t\tcase len(subAgents) - 1:\n\t\t\tdescriptions[i] = fmt.Sprintf(\"and %s\", subDescription)\n\t\tdefault:\n\t\t\tdescriptions[i] = fmt.Sprintf(\", %s\", subDescription)\n\t\t}\n\t}\n\treturn fmt.Sprintf(\"%s in a loop (max %s iterations).\", strings.Join(descriptions, \" \"), maxIterations)\n}\n\nfunc buildDescriptionFromInstructions(agent agent.Agent, llmState *llminternal.State) string {\n\tstate := getInternalState(agent)\n\tdescriptionParts := []string{}\n\tif agent.Description() != \"\" {\n\t\tdescriptionParts = append(descriptionParts, agent.Description())\n\t}\n\tif llmState.Instruction != \"\" {\n\t\tdescriptionParts = append(descriptionParts, replacePronouns(llmState.Instruction))\n\t}\n\tif llmState.GlobalInstruction != \"\" {\n\t\tdescriptionParts = append(descriptionParts, replacePronouns(llmState.GlobalInstruction))\n\t}\n\tdescription := getDefaultAgentDescription(state)\n\tif len(descriptionParts) > 0 {\n\t\tdescription = strings.Join(descriptionParts, \" \")\n\t}\n\treturn description\n}\n\n// Replaces pronouns and conjugate common verbs for agent description.\n// Examples: \"You are\" -> \"I am\", \"your\" -> \"my\"\nfunc replacePronouns(instruction string) string {\n\tsubstitutions := []struct {\n\t\toriginal string\n\t\ttarget   string\n\t}{\n\t\t// Keep sorted by len(original) DESC to ensure longer phrases are matched first\n\t\t// which prevents \"you\" in \"you are\" from being replaced on its own.\n\t\t{\"you were\", \"I was\"},\n\t\t{\"you are\", \"I am\"},\n\t\t{\"you're\", \"I am\"},\n\t\t{\"you've\", \"I have\"},\n\t\t{\"yours\", \"mine\"},\n\t\t{\"your\", \"my\"},\n\t\t{\"you\", \"I\"},\n\t}\n\tfor _, sub := range substitutions {\n\t\tpattern := regexp.MustCompile(fmt.Sprintf(`(?i)\\b%s\\b`, sub.original))\n\t\tinstruction = pattern.ReplaceAllString(instruction, sub.target)\n\t}\n\treturn instruction\n}\n\nfunc getDefaultAgentDescription(state *iagent.State) string {\n\tswitch state.AgentType {\n\tcase iagent.TypeLoopAgent:\n\t\treturn \"A loop workflow agent\"\n\tcase iagent.TypeSequentialAgent:\n\t\treturn \"A sequential workflow agent\"\n\tcase iagent.TypeParallelAgent:\n\t\treturn \"A parallel workflow agent\"\n\tcase iagent.TypeLLMAgent:\n\t\treturn \"An LLM-based agent\"\n\tdefault:\n\t\treturn \"A custom agent\"\n\t}\n}\n\nfunc getAgentTypeTag(state *iagent.State) string {\n\tswitch state.AgentType {\n\tcase iagent.TypeLoopAgent:\n\t\treturn \"loop_workflow\"\n\tcase iagent.TypeSequentialAgent:\n\t\treturn \"sequential_workflow\"\n\tcase iagent.TypeParallelAgent:\n\t\treturn \"parallel_workflow\"\n\tcase iagent.TypeLLMAgent:\n\t\treturn \"llm_agent\"\n\tdefault:\n\t\treturn \"custom_agent\"\n\t}\n}\n\nfunc getAgentSkillName(state *iagent.State) string {\n\tif state.AgentType == iagent.TypeLLMAgent {\n\t\treturn \"model\"\n\t}\n\tif isWorkflowAgent(state) {\n\t\treturn \"workflow\"\n\t}\n\treturn \"custom\"\n}\n\nfunc getInternalState(agent agent.Agent) *iagent.State {\n\tif agent, ok := agent.(iagent.Agent); ok {\n\t\treturn iagent.Reveal(agent)\n\t} else {\n\t\treturn &iagent.State{AgentType: iagent.TypeCustomAgent}\n\t}\n}\n\nfunc isWorkflowAgent(state *iagent.State) bool {\n\tworkflowAgents := []iagent.Type{iagent.TypeLoopAgent, iagent.TypeSequentialAgent, iagent.TypeParallelAgent}\n\treturn slices.Contains(workflowAgents, state.AgentType)\n}\n"
  },
  {
    "path": "server/adka2a/agent_card_test.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage adka2a\n\nimport (\n\t\"testing\"\n\n\t\"github.com/a2aproject/a2a-go/a2a\"\n\t\"github.com/google/go-cmp/cmp\"\n\n\t\"google.golang.org/adk/agent\"\n\t\"google.golang.org/adk/agent/llmagent\"\n\t\"google.golang.org/adk/agent/workflowagents/loopagent\"\n\t\"google.golang.org/adk/agent/workflowagents/parallelagent\"\n\t\"google.golang.org/adk/agent/workflowagents/sequentialagent\"\n\t\"google.golang.org/adk/tool\"\n\t\"google.golang.org/adk/tool/geminitool\"\n\t\"google.golang.org/adk/tool/loadartifactstool\"\n)\n\nfunc must[T agent.Agent](a T, err error) T {\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn a\n}\n\nfunc TestGetAgentSkills_LLMAgent(t *testing.T) {\n\tgoogleSearch, loadArtifacts := geminitool.GoogleSearch{}, loadartifactstool.New()\n\n\ttestCases := []struct {\n\t\tname  string\n\t\tagent agent.Agent\n\t\twant  []a2a.AgentSkill\n\t}{\n\t\t{\n\t\t\tname:  \"custom agent\",\n\t\t\tagent: must(agent.New(agent.Config{Name: \"Test\", Description: \"Test test\"})),\n\t\t\twant: []a2a.AgentSkill{{\n\t\t\t\tID:          \"Test\",\n\t\t\t\tDescription: \"Test test\",\n\t\t\t\tName:        \"custom\",\n\t\t\t\tTags:        []string{\"custom_agent\"},\n\t\t\t}},\n\t\t},\n\t\t{\n\t\t\tname: \"llm with instruction\",\n\t\t\tagent: must(llmagent.New(llmagent.Config{\n\t\t\t\tName:        \"Test LLM\",\n\t\t\t\tDescription: \"Test llm.\",\n\t\t\t\tInstruction: \"You're a helpful agent, only respond with useful information.\",\n\t\t\t})),\n\t\t\twant: []a2a.AgentSkill{{\n\t\t\t\tID:          \"Test LLM\",\n\t\t\t\tDescription: \"Test llm. I am a helpful agent, only respond with useful information.\",\n\t\t\t\tName:        \"model\",\n\t\t\t\tTags:        []string{\"llm\"},\n\t\t\t}},\n\t\t},\n\t\t{\n\t\t\tname: \"llm with tools\",\n\t\t\tagent: must(llmagent.New(llmagent.Config{\n\t\t\t\tName:        \"Test LLM\",\n\t\t\t\tDescription: \"Test llm.\",\n\t\t\t\tTools:       []tool.Tool{loadArtifacts, googleSearch},\n\t\t\t})),\n\t\t\twant: []a2a.AgentSkill{\n\t\t\t\t{\n\t\t\t\t\tID:          \"Test LLM\",\n\t\t\t\t\tDescription: \"Test llm.\",\n\t\t\t\t\tName:        \"model\",\n\t\t\t\t\tTags:        []string{\"llm\"},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tID:          \"Test LLM-\" + loadArtifacts.Name(),\n\t\t\t\t\tName:        loadArtifacts.Name(),\n\t\t\t\t\tDescription: loadArtifacts.Description(),\n\t\t\t\t\tTags:        []string{\"llm\", \"tools\"},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tID:          \"Test LLM-\" + googleSearch.Name(),\n\t\t\t\t\tName:        googleSearch.Name(),\n\t\t\t\t\tDescription: googleSearch.Description(),\n\t\t\t\t\tTags:        []string{\"llm\", \"tools\"},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"empty loop agent\",\n\t\t\tagent: must(loopagent.New(loopagent.Config{\n\t\t\t\tAgentConfig: agent.Config{Name: \"Test\", Description: \"Test test.\"},\n\t\t\t})),\n\t\t\twant: []a2a.AgentSkill{\n\t\t\t\t{ID: \"Test\", Description: \"Test test.\", Name: \"workflow\", Tags: []string{\"loop_workflow\"}},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"loop agent\",\n\t\t\tagent: must(loopagent.New(loopagent.Config{\n\t\t\t\tAgentConfig: agent.Config{\n\t\t\t\t\tName:        \"Test\",\n\t\t\t\t\tDescription: \"Test test.\",\n\t\t\t\t\tSubAgents: []agent.Agent{\n\t\t\t\t\t\tmust(agent.New(agent.Config{Name: \"Inner 1\", Description: \"Inner 1 description\"})),\n\t\t\t\t\t\tmust(agent.New(agent.Config{Name: \"Inner 2\", Description: \"Inner 2 description\"})),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tMaxIterations: 5,\n\t\t\t})),\n\t\t\twant: []a2a.AgentSkill{\n\t\t\t\t{\n\t\t\t\t\tID:          \"Test\",\n\t\t\t\t\tDescription: \"Test test. This agent will Inner 1 description and Inner 2 description in a loop (max 5 iterations).\",\n\t\t\t\t\tName:        \"workflow\",\n\t\t\t\t\tTags:        []string{\"loop_workflow\"},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tID:          \"Test-sub-agents\",\n\t\t\t\t\tDescription: \"Orchestrates: Inner 1 description; Inner 2 description\",\n\t\t\t\t\tName:        \"sub-agents\",\n\t\t\t\t\tTags:        []string{\"loop_workflow\", \"orchestration\"},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tID:          \"Inner 1_Inner 1\",\n\t\t\t\t\tDescription: \"Inner 1 description\",\n\t\t\t\t\tName:        \"Inner 1: custom\",\n\t\t\t\t\tTags:        []string{\"sub_agent:Inner 1\", \"custom_agent\"},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tID:          \"Inner 2_Inner 2\",\n\t\t\t\t\tDescription: \"Inner 2 description\",\n\t\t\t\t\tName:        \"Inner 2: custom\",\n\t\t\t\t\tTags:        []string{\"sub_agent:Inner 2\", \"custom_agent\"},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"unlimited loop agent\",\n\t\t\tagent: must(loopagent.New(loopagent.Config{\n\t\t\t\tAgentConfig: agent.Config{\n\t\t\t\t\tName:        \"Test\",\n\t\t\t\t\tDescription: \"Test test.\",\n\t\t\t\t\tSubAgents: []agent.Agent{\n\t\t\t\t\t\tmust(agent.New(agent.Config{Name: \"Inner 1\", Description: \"Inner 1 description\"})),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t})),\n\t\t\twant: []a2a.AgentSkill{\n\t\t\t\t{\n\t\t\t\t\tID:          \"Test\",\n\t\t\t\t\tDescription: \"Test test. This agent will Inner 1 description in a loop (max unlimited iterations).\",\n\t\t\t\t\tName:        \"workflow\",\n\t\t\t\t\tTags:        []string{\"loop_workflow\"},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tID:          \"Test-sub-agents\",\n\t\t\t\t\tDescription: \"Orchestrates: Inner 1 description\",\n\t\t\t\t\tName:        \"sub-agents\",\n\t\t\t\t\tTags:        []string{\"loop_workflow\", \"orchestration\"},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tID:          \"Inner 1_Inner 1\",\n\t\t\t\t\tDescription: \"Inner 1 description\",\n\t\t\t\t\tName:        \"Inner 1: custom\",\n\t\t\t\t\tTags:        []string{\"sub_agent:Inner 1\", \"custom_agent\"},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\n\t\t{\n\t\t\tname: \"empty sequential agent\",\n\t\t\tagent: must(sequentialagent.New(sequentialagent.Config{\n\t\t\t\tAgentConfig: agent.Config{Name: \"Test\", Description: \"Test test.\"},\n\t\t\t})),\n\t\t\twant: []a2a.AgentSkill{\n\t\t\t\t{ID: \"Test\", Description: \"Test test.\", Name: \"workflow\", Tags: []string{\"sequential_workflow\"}},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"sequential agent\",\n\t\t\tagent: must(sequentialagent.New(sequentialagent.Config{\n\t\t\t\tAgentConfig: agent.Config{\n\t\t\t\t\tName:        \"Test\",\n\t\t\t\t\tDescription: \"Test test.\",\n\t\t\t\t\tSubAgents: []agent.Agent{\n\t\t\t\t\t\tmust(agent.New(agent.Config{Name: \"Inner 1\", Description: \"Inner 1 description\"})),\n\t\t\t\t\t\tmust(agent.New(agent.Config{Name: \"Inner 2\", Description: \"Inner 2 description\"})),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t})),\n\t\t\twant: []a2a.AgentSkill{\n\t\t\t\t{\n\t\t\t\t\tID:          \"Test\",\n\t\t\t\t\tDescription: \"Test test. First, this agent will Inner 1 description. Finally, this agent will Inner 2 description.\",\n\t\t\t\t\tName:        \"workflow\",\n\t\t\t\t\tTags:        []string{\"sequential_workflow\"},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tID:          \"Test-sub-agents\",\n\t\t\t\t\tDescription: \"Orchestrates: Inner 1 description; Inner 2 description\",\n\t\t\t\t\tName:        \"sub-agents\",\n\t\t\t\t\tTags:        []string{\"sequential_workflow\", \"orchestration\"},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tID:          \"Inner 1_Inner 1\",\n\t\t\t\t\tDescription: \"Inner 1 description\",\n\t\t\t\t\tName:        \"Inner 1: custom\",\n\t\t\t\t\tTags:        []string{\"sub_agent:Inner 1\", \"custom_agent\"},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tID:          \"Inner 2_Inner 2\",\n\t\t\t\t\tDescription: \"Inner 2 description\",\n\t\t\t\t\tName:        \"Inner 2: custom\",\n\t\t\t\t\tTags:        []string{\"sub_agent:Inner 2\", \"custom_agent\"},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"empty parallel agent\",\n\t\t\tagent: must(parallelagent.New(parallelagent.Config{\n\t\t\t\tAgentConfig: agent.Config{Name: \"Test\", Description: \"Test test.\"},\n\t\t\t})),\n\t\t\twant: []a2a.AgentSkill{\n\t\t\t\t{ID: \"Test\", Description: \"Test test.\", Name: \"workflow\", Tags: []string{\"parallel_workflow\"}},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"parallel agent\",\n\t\t\tagent: must(parallelagent.New(parallelagent.Config{\n\t\t\t\tAgentConfig: agent.Config{\n\t\t\t\t\tName:        \"Test\",\n\t\t\t\t\tDescription: \"Test test.\",\n\t\t\t\t\tSubAgents: []agent.Agent{\n\t\t\t\t\t\tmust(agent.New(agent.Config{Name: \"Inner 1\", Description: \"Inner 1 description\"})),\n\t\t\t\t\t\tmust(agent.New(agent.Config{Name: \"Inner 2\", Description: \"Inner 2 description\"})),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t})),\n\t\t\twant: []a2a.AgentSkill{\n\t\t\t\t{\n\t\t\t\t\tID:          \"Test\",\n\t\t\t\t\tDescription: \"Test test. This agent will Inner 1 description and Inner 2 description simultaneously.\",\n\t\t\t\t\tName:        \"workflow\",\n\t\t\t\t\tTags:        []string{\"parallel_workflow\"},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tID:          \"Test-sub-agents\",\n\t\t\t\t\tDescription: \"Orchestrates: Inner 1 description; Inner 2 description\",\n\t\t\t\t\tName:        \"sub-agents\",\n\t\t\t\t\tTags:        []string{\"parallel_workflow\", \"orchestration\"},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tID:          \"Inner 1_Inner 1\",\n\t\t\t\t\tDescription: \"Inner 1 description\",\n\t\t\t\t\tName:        \"Inner 1: custom\",\n\t\t\t\t\tTags:        []string{\"sub_agent:Inner 1\", \"custom_agent\"},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tID:          \"Inner 2_Inner 2\",\n\t\t\t\t\tDescription: \"Inner 2 description\",\n\t\t\t\t\tName:        \"Inner 2: custom\",\n\t\t\t\t\tTags:        []string{\"sub_agent:Inner 2\", \"custom_agent\"},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"deep subagents\",\n\t\t\tagent: must(parallelagent.New(parallelagent.Config{\n\t\t\t\tAgentConfig: agent.Config{\n\t\t\t\t\tName:        \"Test\",\n\t\t\t\t\tDescription: \"Test test.\",\n\t\t\t\t\tSubAgents: []agent.Agent{\n\t\t\t\t\t\tmust(loopagent.New(loopagent.Config{\n\t\t\t\t\t\t\tAgentConfig: agent.Config{\n\t\t\t\t\t\t\t\tName:        \"Nested\",\n\t\t\t\t\t\t\t\tDescription: \"Nested loop\",\n\t\t\t\t\t\t\t\tSubAgents: []agent.Agent{\n\t\t\t\t\t\t\t\t\tmust(llmagent.New(llmagent.Config{\n\t\t\t\t\t\t\t\t\t\tName:        \"Test LLM\",\n\t\t\t\t\t\t\t\t\t\tDescription: \"Test llm\",\n\t\t\t\t\t\t\t\t\t\tTools:       []tool.Tool{loadArtifacts},\n\t\t\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t\t\t\tmust(sequentialagent.New(sequentialagent.Config{\n\t\t\t\t\t\t\t\t\t\tAgentConfig: agent.Config{\n\t\t\t\t\t\t\t\t\t\t\tName:        \"Leaf\",\n\t\t\t\t\t\t\t\t\t\t\tDescription: \"Leaf agent\",\n\t\t\t\t\t\t\t\t\t\t\tSubAgents: []agent.Agent{\n\t\t\t\t\t\t\t\t\t\t\t\tmust(agent.New(agent.Config{Name: \"Leaf\", Description: \"leaf\"})),\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t})),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t})),\n\t\t\twant: []a2a.AgentSkill{\n\t\t\t\t{\n\t\t\t\t\tID:          \"Test\",\n\t\t\t\t\tDescription: \"Test test. This agent will Nested loop simultaneously.\",\n\t\t\t\t\tName:        \"workflow\",\n\t\t\t\t\tTags:        []string{\"parallel_workflow\"},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tID:          \"Test-sub-agents\",\n\t\t\t\t\tDescription: \"Orchestrates: Nested loop\",\n\t\t\t\t\tName:        \"sub-agents\",\n\t\t\t\t\tTags:        []string{\"parallel_workflow\", \"orchestration\"},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tID:          \"Nested_Nested\",\n\t\t\t\t\tDescription: \"Nested loop This agent will Test llm and Leaf agent in a loop (max unlimited iterations).\",\n\t\t\t\t\tName:        \"Nested: workflow\",\n\t\t\t\t\tTags:        []string{\"sub_agent:Nested\", \"loop_workflow\"},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tDescription: \"Orchestrates: Test llm; Leaf agent\",\n\t\t\t\t\tID:          \"Nested_Nested-sub-agents\",\n\t\t\t\t\tName:        \"Nested: sub-agents\",\n\t\t\t\t\tTags:        []string{\"sub_agent:Nested\", \"loop_workflow\", \"orchestration\"},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n\n\tfor _, tc := range testCases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\tgot := BuildAgentSkills(tc.agent)\n\t\t\tif diff := cmp.Diff(tc.want, got); diff != \"\" {\n\t\t\t\tt.Errorf(\"BuildAgentSkills() wrong result (+got,-want)\\ngot = %+v\\nwant = %+v\\ndiff = %s\", got, tc.want, diff)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestReplacePronouns(t *testing.T) {\n\ttestCases := []struct {\n\t\tinput string\n\t\twant  string\n\t}{\n\t\t{\n\t\t\tinput: \"you are an agent. you were an agent, you're an agent, you've tasks, your tasks\",\n\t\t\twant:  \"I am an agent. I was an agent, I am an agent, I have tasks, my tasks\",\n\t\t},\n\t\t{\n\t\t\tinput: \"You should do your work and it will be yours.\",\n\t\t\twant:  \"I should do my work and it will be mine.\",\n\t\t},\n\t\t{\n\t\t\tinput: \"YOU should do YOUR work and it will be YOURS.\",\n\t\t\twant:  \"I should do my work and it will be mine.\",\n\t\t},\n\t\t{\n\t\t\tinput: \"You should do Your work and it will be Yours.\",\n\t\t\twant:  \"I should do my work and it will be mine.\",\n\t\t},\n\t\t{\n\t\t\tinput: \"This is a test message without pronouns.\",\n\t\t\twant:  \"This is a test message without pronouns.\",\n\t\t},\n\t\t{\n\t\t\tinput: \"youth, yourself, yourname\",\n\t\t\twant:  \"youth, yourself, yourname\",\n\t\t},\n\t\t{\n\t\t\tinput: \"You are a helpful chatbot\",\n\t\t\twant:  \"I am a helpful chatbot\",\n\t\t},\n\t\t{\n\t\t\tinput: \"Your task is to be helpful\",\n\t\t\twant:  \"my task is to be helpful\",\n\t\t},\n\t\t{\n\t\t\tinput: \"you you you\",\n\t\t\twant:  \"I I I\",\n\t\t},\n\t}\n\tfor _, tc := range testCases {\n\t\tgot := replacePronouns(tc.input)\n\t\tif got != tc.want {\n\t\t\tt.Errorf(\"replacePronouns(%q) = %q, want %q\", tc.input, got, tc.want)\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "server/adka2a/doc.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Package adka2a allows to expose ADK agents via A2A.\npackage adka2a\n"
  },
  {
    "path": "server/adka2a/events.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage adka2a\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"maps\"\n\n\t\"github.com/a2aproject/a2a-go/a2a\"\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/agent\"\n\t\"google.golang.org/adk/session\"\n)\n\n// NewRemoteAgentEvent create a new Event authored by the agent running in the provided invocation context.\nfunc NewRemoteAgentEvent(ctx agent.InvocationContext) *session.Event {\n\tevent := session.NewEvent(ctx.InvocationID())\n\tevent.Author = ctx.Agent().Name()\n\tevent.Branch = ctx.Branch()\n\treturn event\n}\n\n// EventToMessage converts the provided session event to A2A message.\nfunc EventToMessage(event *session.Event) (*a2a.Message, error) {\n\tif event == nil {\n\t\treturn nil, nil\n\t}\n\n\tparts, err := ToA2AParts(event.Content.Parts, event.LongRunningToolIDs)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"part conversion failed: %w\", err)\n\t}\n\teventMeta, err := toEventMeta(invocationMeta{}, event)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"event metadata conversion failed: %w\", err)\n\t}\n\n\tvar role a2a.MessageRole\n\tif event.Author == \"user\" {\n\t\trole = a2a.MessageRoleUser\n\t} else {\n\t\trole = a2a.MessageRoleAgent\n\t}\n\n\tmsg := a2a.NewMessage(role, parts...)\n\tmsg.Metadata = setActionsMeta(msg.Metadata, event.Actions)\n\tmaps.Copy(msg.Metadata, eventMeta)\n\treturn msg, nil\n}\n\n// ToSessionEvent converts the provided a2a event to session event authored by the agent running in the provided invocation context.\nfunc ToSessionEvent(ctx agent.InvocationContext, event a2a.Event) (*session.Event, error) {\n\treturn ToSessionEventWithParts(ctx, event, nil)\n}\n\n// ToSessionEventWithParts converts the provided a2a event to session event with custom part converter.\nfunc ToSessionEventWithParts(ctx agent.InvocationContext, event a2a.Event, partConverter A2APartConverter) (*session.Event, error) {\n\tif partConverter == nil {\n\t\tpartConverter = func(ctx context.Context, a2aEvent a2a.Event, part a2a.Part) (*genai.Part, error) {\n\t\t\treturn ToGenAIPart(part)\n\t\t}\n\t}\n\tswitch v := event.(type) {\n\tcase *a2a.Task:\n\t\treturn taskToEvent(ctx, v, partConverter)\n\n\tcase *a2a.Message:\n\t\treturn messageToEvent(ctx, v, partConverter)\n\n\tcase *a2a.TaskArtifactUpdateEvent:\n\t\tif len(v.Artifact.Parts) == 0 {\n\t\t\treturn nil, nil\n\t\t}\n\t\tif IsPartial(v.Metadata) && v.LastChunk {\n\t\t\t// Partial ADK artifact reset\n\t\t\treturn nil, nil\n\t\t}\n\t\tevent, err := artifactUpdateEventToEvent(ctx, v, partConverter)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"artifact update event conversion failed: %w\", err)\n\t\t}\n\t\tif len(event.Content.Parts) == 0 {\n\t\t\treturn nil, nil\n\t\t}\n\t\tevent.LongRunningToolIDs = getLongRunningToolIDs(v.Artifact.Parts, event.Content.Parts)\n\t\tif err := processA2AMeta(v, event); err != nil {\n\t\t\treturn nil, fmt.Errorf(\"metadata processing failed: %w\", err)\n\t\t}\n\t\tif partial, ok := v.Metadata[metadataPartialKey].(bool); ok {\n\t\t\tevent.Partial = partial\n\t\t} else {\n\t\t\t// append=false, lastChunk=false: emitted as partial, caller restarts aggregation\n\t\t\t// append=false, lastChunk=true: emitted as non partial, caller drops aggregation\n\t\t\t// append=true, lastChunk=false: emitted as partial, caller updates aggregation\n\t\t\t// append=true, lastChunk=true: emitted as partial, caller updates and emits aggregation as non-partial\n\t\t\tevent.Partial = v.Append || !v.LastChunk\n\t\t}\n\t\treturn event, nil\n\n\tcase *a2a.TaskStatusUpdateEvent:\n\t\tif v.Final {\n\t\t\treturn finalTaskStatusUpdateToEvent(ctx, v, partConverter)\n\t\t}\n\t\tif v.Status.Message == nil {\n\t\t\treturn nil, nil\n\t\t}\n\t\tevent, err := messageToEvent(ctx, v.Status.Message, partConverter)\n\t\tevent.TurnComplete = false\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"custom metadata conversion failed: %w\", err)\n\t\t}\n\t\tif len(event.Content.Parts) == 0 {\n\t\t\treturn nil, nil\n\t\t}\n\t\tif err := processA2AMeta(v, event); err != nil {\n\t\t\treturn nil, fmt.Errorf(\"metadata processing failed: %w\", err)\n\t\t}\n\t\tfor _, part := range event.Content.Parts {\n\t\t\tpart.Thought = true\n\t\t}\n\t\tevent.Partial = true\n\t\treturn event, nil\n\n\tdefault:\n\t\treturn nil, fmt.Errorf(\"unknown event type: %T\", v)\n\t}\n}\n\n// ToCustomMetadata creates a session event custom metadata with A2A task and context IDs in it.\nfunc ToCustomMetadata(taskID a2a.TaskID, ctxID string) map[string]any {\n\tif taskID == \"\" && ctxID == \"\" {\n\t\treturn nil\n\t}\n\tresult := make(map[string]any)\n\tif taskID != \"\" {\n\t\tresult[customMetaTaskIDKey] = string(taskID)\n\t}\n\tif ctxID != \"\" {\n\t\tresult[customMetaContextIDKey] = ctxID\n\t}\n\treturn result\n}\n\n// GetA2ATaskInfo returns A2A task and context IDs if they are present in session event custom metadata.\nfunc GetA2ATaskInfo(event *session.Event) (a2a.TaskID, string) {\n\tvar taskID a2a.TaskID\n\tvar contextID string\n\tif event == nil || event.CustomMetadata == nil {\n\t\treturn taskID, contextID\n\t}\n\tif tid, ok := event.CustomMetadata[customMetaTaskIDKey].(string); ok {\n\t\ttaskID = a2a.TaskID(tid)\n\t}\n\tif ctxID, ok := event.CustomMetadata[customMetaContextIDKey].(string); ok {\n\t\tcontextID = ctxID\n\t}\n\treturn taskID, contextID\n}\n\nfunc messageToEvent(ctx agent.InvocationContext, msg *a2a.Message, partConverter A2APartConverter) (*session.Event, error) {\n\tif ctx == nil {\n\t\treturn nil, fmt.Errorf(\"InvocationContext not provided\")\n\t}\n\tif msg == nil {\n\t\treturn nil, nil\n\t}\n\n\tvar parts []*genai.Part\n\tfor _, part := range msg.Parts {\n\t\tgenaiPart, err := partConverter(ctx, msg, part)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"failed to convert message part: %w\", err)\n\t\t}\n\t\tif genaiPart != nil {\n\t\t\tparts = append(parts, genaiPart)\n\t\t}\n\t}\n\n\tevent := NewRemoteAgentEvent(ctx)\n\tif len(parts) > 0 {\n\t\tevent.Content = genai.NewContentFromParts(parts, toGenAIRole(msg.Role))\n\t}\n\tif err := processA2AMeta(msg, event); err != nil {\n\t\treturn nil, fmt.Errorf(\"metadata processing failed: %w\", err)\n\t}\n\tevent.TurnComplete = true\n\treturn event, nil\n}\n\nfunc artifactUpdateEventToEvent(ctx agent.InvocationContext, update *a2a.TaskArtifactUpdateEvent, partConverter A2APartConverter) (*session.Event, error) {\n\tif ctx == nil {\n\t\treturn nil, fmt.Errorf(\"InvocationContext not provided\")\n\t}\n\tif update == nil {\n\t\treturn nil, nil\n\t}\n\n\tparts, err := convertParts(ctx, update, update.Artifact.Parts, partConverter)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to convert artifact parts: %w\", err)\n\t}\n\n\tevent := NewRemoteAgentEvent(ctx)\n\tevent.Content = genai.NewContentFromParts(parts, genai.RoleModel)\n\treturn event, nil\n}\n\nfunc taskToEvent(ctx agent.InvocationContext, task *a2a.Task, partConverter A2APartConverter) (*session.Event, error) {\n\tif ctx == nil {\n\t\treturn nil, fmt.Errorf(\"InvocationContext not provided\")\n\t}\n\n\tvar parts []*genai.Part\n\tvar longRunningToolIDs []string\n\tfor _, artifact := range task.Artifacts {\n\t\tartifactParts, err := convertParts(ctx, task, artifact.Parts, partConverter)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"failed to convert artifact parts: %w\", err)\n\t\t}\n\n\t\tlrtIDs := getLongRunningToolIDs(artifact.Parts, artifactParts)\n\n\t\tparts = append(parts, artifactParts...)\n\t\tlongRunningToolIDs = append(longRunningToolIDs, lrtIDs...)\n\t}\n\n\tevent := NewRemoteAgentEvent(ctx)\n\n\tif task.Status.Message != nil {\n\t\tmsgParts, err := convertParts(ctx, task, task.Status.Message.Parts, partConverter)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"failed to convert status message parts: %w\", err)\n\t\t}\n\t\tlrtIDs := getLongRunningToolIDs(task.Status.Message.Parts, msgParts)\n\n\t\tif task.Status.State == a2a.TaskStateFailed && len(msgParts) == 1 && msgParts[0].Text != \"\" {\n\t\t\tevent.ErrorMessage = msgParts[0].Text\n\t\t} else {\n\t\t\tparts = append(parts, msgParts...)\n\t\t}\n\t\tlongRunningToolIDs = append(longRunningToolIDs, lrtIDs...)\n\t}\n\n\tisTerminal := task.Status.State.Terminal() || task.Status.State == a2a.TaskStateInputRequired\n\tif len(parts) == 0 && !isTerminal {\n\t\treturn nil, nil\n\t}\n\tif len(parts) > 0 {\n\t\tevent.Content = genai.NewContentFromParts(parts, genai.RoleModel)\n\t}\n\tif task.Status.State == a2a.TaskStateInputRequired {\n\t\tevent.LongRunningToolIDs = longRunningToolIDs\n\t}\n\tif err := processA2AMeta(task, event); err != nil {\n\t\treturn nil, fmt.Errorf(\"metadata processing failed: %w\", err)\n\t}\n\tevent.TurnComplete = isTerminal\n\treturn event, nil\n}\n\nfunc finalTaskStatusUpdateToEvent(ctx agent.InvocationContext, update *a2a.TaskStatusUpdateEvent, partConverter A2APartConverter) (*session.Event, error) {\n\tif update == nil {\n\t\treturn nil, nil\n\t}\n\n\tevent := NewRemoteAgentEvent(ctx)\n\n\tvar parts []*genai.Part\n\tvar err error\n\tif update.Status.Message != nil {\n\t\tparts, err = convertParts(ctx, update, update.Status.Message.Parts, partConverter)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"failed to convert status message parts: %w\", err)\n\t\t}\n\t}\n\tif update.Status.State == a2a.TaskStateFailed && len(parts) == 1 && parts[0].Text != \"\" {\n\t\tevent.ErrorMessage = parts[0].Text\n\t} else if len(parts) > 0 {\n\t\tevent.Content = genai.NewContentFromParts(parts, genai.RoleModel)\n\t}\n\tif err := processA2AMeta(update, event); err != nil {\n\t\treturn nil, fmt.Errorf(\"metadata processing failed: %w\", err)\n\t}\n\tif update.Status.Message != nil {\n\t\tevent.LongRunningToolIDs = getLongRunningToolIDs(update.Status.Message.Parts, parts)\n\t}\n\tevent.TurnComplete = true\n\treturn event, nil\n}\n\nfunc getLongRunningToolIDs(parts []a2a.Part, converted []*genai.Part) []string {\n\tvar ids []string\n\tfor i, part := range parts {\n\t\tdp, ok := part.(a2a.DataPart)\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\t\tif longRunning, ok := dp.Metadata[a2aDataPartMetaLongRunningKey].(bool); ok && longRunning {\n\t\t\tfnCall := converted[i]\n\t\t\tif fnCall.FunctionCall == nil {\n\t\t\t\t// TODO(yarolegovich): log a warning\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tids = append(ids, fnCall.FunctionCall.ID)\n\t\t}\n\t}\n\treturn ids\n}\n\nfunc toGenAIRole(role a2a.MessageRole) genai.Role {\n\tif role == a2a.MessageRoleUser {\n\t\treturn genai.RoleUser\n\t} else {\n\t\treturn genai.RoleModel\n\t}\n}\n\nfunc toEventActions(meta map[string]any) session.EventActions {\n\tif meta == nil {\n\t\treturn session.EventActions{}\n\t}\n\tvar result session.EventActions\n\tresult.Escalate, _ = meta[metadataEscalateKey].(bool)\n\tresult.TransferToAgent, _ = meta[metadataTransferToAgentKey].(string)\n\treturn result\n}\n\nfunc convertParts(ctx agent.InvocationContext, event a2a.Event, parts []a2a.Part, partConverter A2APartConverter) ([]*genai.Part, error) {\n\tvar genaiParts []*genai.Part\n\tfor _, part := range parts {\n\t\tgenaiPart, err := partConverter(ctx, event, part)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"failed to convert part: %w\", err)\n\t\t}\n\t\tif genaiPart != nil {\n\t\t\tgenaiParts = append(genaiParts, genaiPart)\n\t\t}\n\t}\n\treturn genaiParts, nil\n}\n"
  },
  {
    "path": "server/adka2a/events_test.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage adka2a\n\nimport (\n\t\"context\"\n\t\"testing\"\n\n\t\"github.com/a2aproject/a2a-go/a2a\"\n\t\"github.com/google/go-cmp/cmp\"\n\t\"github.com/google/go-cmp/cmp/cmpopts\"\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/agent\"\n\ticontext \"google.golang.org/adk/internal/context\"\n\t\"google.golang.org/adk/model\"\n\t\"google.golang.org/adk/session\"\n)\n\nfunc TestToSessionEvent(t *testing.T) {\n\tt.Parallel()\n\ttaskID, contextID, branch, agentName := a2a.NewTaskID(), a2a.NewContextID(), \"main\", \"a2a agent\"\n\ta2aAgent, err := agent.New(agent.Config{Name: agentName})\n\tif err != nil {\n\t\tt.Fatalf(\"failed to create an agent: %v\", err)\n\t}\n\n\ttestCases := []struct {\n\t\tname                   string\n\t\tinput                  a2a.Event\n\t\twant                   *session.Event\n\t\tlongRunningFunctionIDs []string\n\t}{\n\t\t{\n\t\t\tname: \"message\",\n\t\t\tinput: &a2a.Message{\n\t\t\t\tParts:     []a2a.Part{a2a.TextPart{Text: \"foo\"}},\n\t\t\t\tTaskID:    taskID,\n\t\t\t\tContextID: contextID,\n\t\t\t\tMetadata: map[string]any{\n\t\t\t\t\tmetadataGroundingKey:       map[string]any{\"sourceFlaggingUris\": []any{map[string]any{\"sourceId\": \"id1\"}}},\n\t\t\t\t\tmetadataUsageKey:           map[string]any{\"candidatesTokenCount\": float64(12), \"thoughtsTokenCount\": float64(42)},\n\t\t\t\t\tmetadataCustomMetaKey:      map[string]any{\"nested\": map[string]any{\"key\": \"value\"}},\n\t\t\t\t\tmetadataTransferToAgentKey: \"a-2\",\n\t\t\t\t\tmetadataEscalateKey:        true,\n\t\t\t\t},\n\t\t\t},\n\t\t\twant: &session.Event{\n\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\tContent:           genai.NewContentFromParts([]*genai.Part{{Text: \"foo\"}}, genai.RoleModel),\n\t\t\t\t\tUsageMetadata:     &genai.GenerateContentResponseUsageMetadata{CandidatesTokenCount: 12, ThoughtsTokenCount: 42},\n\t\t\t\t\tGroundingMetadata: &genai.GroundingMetadata{SourceFlaggingUris: []*genai.GroundingMetadataSourceFlaggingURI{{SourceID: \"id1\"}}},\n\t\t\t\t\tCustomMetadata: map[string]any{\n\t\t\t\t\t\t\"nested\":               map[string]any{\"key\": \"value\"},\n\t\t\t\t\t\tcustomMetaTaskIDKey:    string(taskID),\n\t\t\t\t\t\tcustomMetaContextIDKey: contextID,\n\t\t\t\t\t},\n\t\t\t\t\tTurnComplete: true,\n\t\t\t\t},\n\t\t\t\tAuthor:  agentName,\n\t\t\t\tBranch:  branch,\n\t\t\t\tActions: session.EventActions{Escalate: true, TransferToAgent: \"a-2\"},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"nil values\",\n\t\t\tinput: &a2a.Message{\n\t\t\t\tParts:     []a2a.Part{a2a.TextPart{Text: \"foo\"}},\n\t\t\t\tTaskID:    taskID,\n\t\t\t\tContextID: contextID,\n\t\t\t\tMetadata: map[string]any{\n\t\t\t\t\tmetadataGroundingKey:  nil,\n\t\t\t\t\tmetadataUsageKey:      nil,\n\t\t\t\t\tmetadataCustomMetaKey: nil,\n\t\t\t\t},\n\t\t\t},\n\t\t\twant: &session.Event{\n\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\tContent:        genai.NewContentFromParts([]*genai.Part{{Text: \"foo\"}}, genai.RoleModel),\n\t\t\t\t\tCustomMetadata: map[string]any{customMetaTaskIDKey: string(taskID), customMetaContextIDKey: contextID},\n\t\t\t\t\tTurnComplete:   true,\n\t\t\t\t},\n\t\t\t\tAuthor: agentName,\n\t\t\t\tBranch: branch,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"message with no parts\",\n\t\t\tinput: &a2a.Message{\n\t\t\t\tTaskID:    taskID,\n\t\t\t\tContextID: contextID,\n\t\t\t},\n\t\t\twant: &session.Event{\n\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\tCustomMetadata: map[string]any{\n\t\t\t\t\t\tcustomMetaTaskIDKey:    string(taskID),\n\t\t\t\t\t\tcustomMetaContextIDKey: contextID,\n\t\t\t\t\t},\n\t\t\t\t\tTurnComplete: true,\n\t\t\t\t},\n\t\t\t\tAuthor: agentName,\n\t\t\t\tBranch: branch,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"task\",\n\t\t\tinput: &a2a.Task{\n\t\t\t\tID:        taskID,\n\t\t\t\tContextID: contextID,\n\t\t\t\tArtifacts: []*a2a.Artifact{\n\t\t\t\t\t{ // long running key is ignored for non-input-required states\n\t\t\t\t\t\tID: a2a.NewArtifactID(),\n\t\t\t\t\t\tParts: []a2a.Part{\n\t\t\t\t\t\t\ta2a.DataPart{\n\t\t\t\t\t\t\t\tData:     map[string]any{\"id\": \"get_weather\", \"args\": map[string]any{\"city\": \"Warsaw\"}, \"name\": \"GetWeather\"},\n\t\t\t\t\t\t\t\tMetadata: map[string]any{a2aDataPartMetaTypeKey: a2aDataPartTypeFunctionCall, a2aDataPartMetaLongRunningKey: true},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t{ID: a2a.NewArtifactID(), Parts: a2a.ContentParts{a2a.TextPart{Text: \"foo\"}}},\n\t\t\t\t\t{ID: a2a.NewArtifactID(), Parts: a2a.ContentParts{a2a.TextPart{Text: \"bar\"}}},\n\t\t\t\t},\n\t\t\t\tStatus: a2a.TaskStatus{\n\t\t\t\t\tState:   a2a.TaskStateCompleted,\n\t\t\t\t\tMessage: a2a.NewMessage(a2a.MessageRoleAgent, a2a.TextPart{Text: \"done\"}),\n\t\t\t\t},\n\t\t\t\tMetadata: map[string]any{\n\t\t\t\t\tmetadataGroundingKey:  map[string]any{\"sourceFlaggingUris\": []any{map[string]any{\"sourceId\": \"id1\"}}},\n\t\t\t\t\tmetadataUsageKey:      map[string]any{\"candidatesTokenCount\": float64(12), \"thoughtsTokenCount\": float64(42)},\n\t\t\t\t\tmetadataCustomMetaKey: map[string]any{\"nested\": map[string]any{\"key\": \"value\"}},\n\t\t\t\t\tmetadataEscalateKey:   true,\n\t\t\t\t},\n\t\t\t},\n\t\t\twant: &session.Event{\n\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\tContent: genai.NewContentFromParts([]*genai.Part{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tFunctionCall: &genai.FunctionCall{\n\t\t\t\t\t\t\t\tID:   \"get_weather\",\n\t\t\t\t\t\t\t\tArgs: map[string]any{\"city\": \"Warsaw\"},\n\t\t\t\t\t\t\t\tName: \"GetWeather\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{Text: \"foo\"},\n\t\t\t\t\t\t{Text: \"bar\"},\n\t\t\t\t\t\t{Text: \"done\"},\n\t\t\t\t\t}, genai.RoleModel),\n\t\t\t\t\tUsageMetadata:     &genai.GenerateContentResponseUsageMetadata{CandidatesTokenCount: 12, ThoughtsTokenCount: 42},\n\t\t\t\t\tGroundingMetadata: &genai.GroundingMetadata{SourceFlaggingUris: []*genai.GroundingMetadataSourceFlaggingURI{{SourceID: \"id1\"}}},\n\t\t\t\t\tCustomMetadata: map[string]any{\n\t\t\t\t\t\t\"nested\":               map[string]any{\"key\": \"value\"},\n\t\t\t\t\t\tcustomMetaTaskIDKey:    string(taskID),\n\t\t\t\t\t\tcustomMetaContextIDKey: contextID,\n\t\t\t\t\t},\n\t\t\t\t\tTurnComplete: true,\n\t\t\t\t},\n\t\t\t\tAuthor:  agentName,\n\t\t\t\tBranch:  branch,\n\t\t\t\tActions: session.EventActions{Escalate: true},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"terminal task with no parts\",\n\t\t\tinput: &a2a.Task{\n\t\t\t\tID:        taskID,\n\t\t\t\tContextID: contextID,\n\t\t\t\tStatus:    a2a.TaskStatus{State: a2a.TaskStateCompleted},\n\t\t\t},\n\t\t\twant: &session.Event{\n\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\tCustomMetadata: map[string]any{\n\t\t\t\t\t\tcustomMetaTaskIDKey:    string(taskID),\n\t\t\t\t\t\tcustomMetaContextIDKey: contextID,\n\t\t\t\t\t},\n\t\t\t\t\tTurnComplete: true,\n\t\t\t\t},\n\t\t\t\tAuthor: agentName,\n\t\t\t\tBranch: branch,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"non-terminal task with no parts\",\n\t\t\tinput: &a2a.Task{\n\t\t\t\tID:        taskID,\n\t\t\t\tContextID: contextID,\n\t\t\t\tStatus:    a2a.TaskStatus{State: a2a.TaskStateSubmitted},\n\t\t\t},\n\t\t\twant: nil,\n\t\t},\n\t\t{\n\t\t\tname: \"task in input required\",\n\t\t\tinput: &a2a.Task{\n\t\t\t\tID:        taskID,\n\t\t\t\tContextID: contextID,\n\t\t\t\tArtifacts: []*a2a.Artifact{\n\t\t\t\t\t{\n\t\t\t\t\t\tID: a2a.NewArtifactID(),\n\t\t\t\t\t\tParts: []a2a.Part{\n\t\t\t\t\t\t\ta2a.DataPart{\n\t\t\t\t\t\t\t\tData:     map[string]any{\"id\": \"get_weather\", \"args\": map[string]any{\"city\": \"Warsaw\"}, \"name\": \"GetWeather\"},\n\t\t\t\t\t\t\t\tMetadata: map[string]any{a2aDataPartMetaTypeKey: a2aDataPartTypeFunctionCall, a2aDataPartMetaLongRunningKey: true},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tStatus:   a2a.TaskStatus{State: a2a.TaskStateInputRequired},\n\t\t\t\tMetadata: map[string]any{metadataEscalateKey: true},\n\t\t\t},\n\t\t\twant: &session.Event{\n\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\tContent: genai.NewContentFromParts([]*genai.Part{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tFunctionCall: &genai.FunctionCall{\n\t\t\t\t\t\t\t\tID:   \"get_weather\",\n\t\t\t\t\t\t\t\tArgs: map[string]any{\"city\": \"Warsaw\"},\n\t\t\t\t\t\t\t\tName: \"GetWeather\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t}, genai.RoleModel),\n\t\t\t\t\tCustomMetadata: map[string]any{\n\t\t\t\t\t\tcustomMetaTaskIDKey:    string(taskID),\n\t\t\t\t\t\tcustomMetaContextIDKey: contextID,\n\t\t\t\t\t},\n\t\t\t\t\tTurnComplete: true,\n\t\t\t\t},\n\t\t\t\tLongRunningToolIDs: []string{\"get_weather\"},\n\t\t\t\tAuthor:             agentName,\n\t\t\t\tBranch:             branch,\n\t\t\t\tActions:            session.EventActions{Escalate: true},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"artifact update\",\n\t\t\tinput: &a2a.TaskArtifactUpdateEvent{\n\t\t\t\tTaskID:    taskID,\n\t\t\t\tContextID: contextID,\n\t\t\t\tArtifact: &a2a.Artifact{\n\t\t\t\t\tID: a2a.NewArtifactID(), Parts: a2a.ContentParts{a2a.TextPart{Text: \"foo\"}, a2a.TextPart{Text: \"bar\"}},\n\t\t\t\t},\n\t\t\t\tMetadata: map[string]any{\n\t\t\t\t\tmetadataGroundingKey:  map[string]any{\"sourceFlaggingUris\": []any{map[string]any{\"sourceId\": \"id1\"}}},\n\t\t\t\t\tmetadataUsageKey:      map[string]any{\"candidatesTokenCount\": float64(12), \"thoughtsTokenCount\": float64(42)},\n\t\t\t\t\tmetadataCustomMetaKey: map[string]any{\"nested\": map[string]any{\"key\": \"value\"}},\n\t\t\t\t},\n\t\t\t},\n\t\t\twant: &session.Event{\n\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\tContent: genai.NewContentFromParts([]*genai.Part{\n\t\t\t\t\t\t{Text: \"foo\"},\n\t\t\t\t\t\t{Text: \"bar\"},\n\t\t\t\t\t}, genai.RoleModel),\n\t\t\t\t\tGroundingMetadata: &genai.GroundingMetadata{SourceFlaggingUris: []*genai.GroundingMetadataSourceFlaggingURI{{SourceID: \"id1\"}}},\n\t\t\t\t\tUsageMetadata:     &genai.GenerateContentResponseUsageMetadata{CandidatesTokenCount: 12, ThoughtsTokenCount: 42},\n\t\t\t\t\tCustomMetadata: map[string]any{\n\t\t\t\t\t\t\"nested\":               map[string]any{\"key\": \"value\"},\n\t\t\t\t\t\tcustomMetaTaskIDKey:    string(taskID),\n\t\t\t\t\t\tcustomMetaContextIDKey: contextID,\n\t\t\t\t\t},\n\t\t\t\t\tPartial: true,\n\t\t\t\t},\n\t\t\t\tAuthor: agentName,\n\t\t\t\tBranch: branch,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"artifact update with no parts is skipped\",\n\t\t\tinput: &a2a.TaskArtifactUpdateEvent{\n\t\t\t\tTaskID:    taskID,\n\t\t\t\tContextID: contextID,\n\t\t\t\tArtifact: &a2a.Artifact{\n\t\t\t\t\tID:    a2a.NewArtifactID(),\n\t\t\t\t\tParts: []a2a.Part{},\n\t\t\t\t},\n\t\t\t},\n\t\t\twant: nil,\n\t\t},\n\t\t{\n\t\t\tname: \"artifact update with long running tool call\",\n\t\t\tinput: &a2a.TaskArtifactUpdateEvent{\n\t\t\t\tTaskID:    taskID,\n\t\t\t\tContextID: contextID,\n\t\t\t\tArtifact: &a2a.Artifact{\n\t\t\t\t\tID: a2a.NewArtifactID(),\n\t\t\t\t\tParts: []a2a.Part{\n\t\t\t\t\t\ta2a.DataPart{\n\t\t\t\t\t\t\tData:     map[string]any{\"id\": \"get_weather\", \"args\": map[string]any{\"city\": \"Warsaw\"}, \"name\": \"GetWeather\"},\n\t\t\t\t\t\t\tMetadata: map[string]any{a2aDataPartMetaTypeKey: a2aDataPartTypeFunctionCall, a2aDataPartMetaLongRunningKey: true},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twant: &session.Event{\n\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\tContent: genai.NewContentFromParts([]*genai.Part{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tFunctionCall: &genai.FunctionCall{\n\t\t\t\t\t\t\t\tID:   \"get_weather\",\n\t\t\t\t\t\t\t\tArgs: map[string]any{\"city\": \"Warsaw\"},\n\t\t\t\t\t\t\t\tName: \"GetWeather\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t}, genai.RoleModel),\n\t\t\t\t\tCustomMetadata: map[string]any{\n\t\t\t\t\t\tcustomMetaTaskIDKey:    string(taskID),\n\t\t\t\t\t\tcustomMetaContextIDKey: contextID,\n\t\t\t\t\t},\n\t\t\t\t\tPartial: true,\n\t\t\t\t},\n\t\t\t\tLongRunningToolIDs: []string{\"get_weather\"},\n\t\t\t\tAuthor:             agentName,\n\t\t\t\tBranch:             branch,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"final task status update with message\",\n\t\t\tinput: &a2a.TaskStatusUpdateEvent{\n\t\t\t\tTaskID:    taskID,\n\t\t\t\tContextID: contextID,\n\t\t\t\tFinal:     true,\n\t\t\t\tStatus: a2a.TaskStatus{\n\t\t\t\t\tMessage: &a2a.Message{\n\t\t\t\t\t\tParts: []a2a.Part{a2a.TextPart{Text: \"foo\"}},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tMetadata: map[string]any{\n\t\t\t\t\tmetadataGroundingKey:  map[string]any{\"sourceFlaggingUris\": []any{map[string]any{\"sourceId\": \"id1\"}}},\n\t\t\t\t\tmetadataUsageKey:      map[string]any{\"candidatesTokenCount\": float64(12), \"thoughtsTokenCount\": float64(42)},\n\t\t\t\t\tmetadataCustomMetaKey: map[string]any{\"nested\": map[string]any{\"key\": \"value\"}},\n\t\t\t\t\tmetadataEscalateKey:   true,\n\t\t\t\t},\n\t\t\t},\n\t\t\twant: &session.Event{\n\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\tContent: genai.NewContentFromParts([]*genai.Part{{Text: \"foo\"}}, genai.RoleModel),\n\t\t\t\t\tCustomMetadata: map[string]any{\n\t\t\t\t\t\t\"nested\":               map[string]any{\"key\": \"value\"},\n\t\t\t\t\t\tcustomMetaTaskIDKey:    string(taskID),\n\t\t\t\t\t\tcustomMetaContextIDKey: contextID,\n\t\t\t\t\t},\n\t\t\t\t\tTurnComplete:      true,\n\t\t\t\t\tGroundingMetadata: &genai.GroundingMetadata{SourceFlaggingUris: []*genai.GroundingMetadataSourceFlaggingURI{{SourceID: \"id1\"}}},\n\t\t\t\t\tUsageMetadata:     &genai.GenerateContentResponseUsageMetadata{CandidatesTokenCount: 12, ThoughtsTokenCount: 42},\n\t\t\t\t},\n\t\t\t\tActions: session.EventActions{Escalate: true},\n\t\t\t\tAuthor:  agentName,\n\t\t\t\tBranch:  branch,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname:  \"final task status update without message\",\n\t\t\tinput: &a2a.TaskStatusUpdateEvent{TaskID: taskID, ContextID: contextID, Final: true},\n\t\t\twant: &session.Event{\n\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\tCustomMetadata: map[string]any{\n\t\t\t\t\t\tcustomMetaTaskIDKey:    string(taskID),\n\t\t\t\t\t\tcustomMetaContextIDKey: contextID,\n\t\t\t\t\t},\n\t\t\t\t\tTurnComplete: true,\n\t\t\t\t},\n\t\t\t\tAuthor: agentName,\n\t\t\t\tBranch: branch,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"non final task status update message is a thought\",\n\t\t\tinput: &a2a.TaskStatusUpdateEvent{\n\t\t\t\tTaskID:    taskID,\n\t\t\t\tContextID: contextID,\n\t\t\t\tStatus: a2a.TaskStatus{\n\t\t\t\t\tState: a2a.TaskStateCompleted,\n\t\t\t\t\tMessage: &a2a.Message{\n\t\t\t\t\t\tParts: []a2a.Part{a2a.TextPart{Text: \"foo\"}},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twant: &session.Event{\n\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\tContent: genai.NewContentFromParts([]*genai.Part{{Text: \"foo\", Thought: true}}, genai.RoleModel),\n\t\t\t\t\tCustomMetadata: map[string]any{\n\t\t\t\t\t\tcustomMetaTaskIDKey:    string(taskID),\n\t\t\t\t\t\tcustomMetaContextIDKey: contextID,\n\t\t\t\t\t},\n\t\t\t\t\tPartial: true,\n\t\t\t\t},\n\t\t\t\tAuthor: agentName,\n\t\t\t\tBranch: branch,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname:  \"non-final task status update without message is skipped\",\n\t\t\tinput: &a2a.TaskStatusUpdateEvent{TaskID: taskID, ContextID: contextID},\n\t\t\twant:  nil,\n\t\t},\n\t\t{\n\t\t\tname: \"task status failed with single-part message\",\n\t\t\tinput: &a2a.TaskStatusUpdateEvent{\n\t\t\t\tTaskID:    taskID,\n\t\t\t\tContextID: contextID,\n\t\t\t\tFinal:     true,\n\t\t\t\tStatus: a2a.TaskStatus{\n\t\t\t\t\tState:   a2a.TaskStateFailed,\n\t\t\t\t\tMessage: &a2a.Message{Parts: []a2a.Part{a2a.TextPart{Text: \"failed with an error\"}}},\n\t\t\t\t},\n\t\t\t},\n\t\t\twant: &session.Event{\n\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\tErrorMessage: \"failed with an error\",\n\t\t\t\t\tCustomMetadata: map[string]any{\n\t\t\t\t\t\tcustomMetaTaskIDKey:    string(taskID),\n\t\t\t\t\t\tcustomMetaContextIDKey: contextID,\n\t\t\t\t\t},\n\t\t\t\t\tTurnComplete: true,\n\t\t\t\t},\n\t\t\t\tAuthor: agentName,\n\t\t\t\tBranch: branch,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"task with multiple artifacts and mixed long-running tools\",\n\t\t\tinput: &a2a.Task{\n\t\t\t\tID:        taskID,\n\t\t\t\tContextID: contextID,\n\t\t\t\tArtifacts: []*a2a.Artifact{\n\t\t\t\t\t{\n\t\t\t\t\t\tID: \"artifact-1\",\n\t\t\t\t\t\tParts: []a2a.Part{\n\t\t\t\t\t\t\ta2a.TextPart{Text: \"Checking weather...\"},\n\t\t\t\t\t\t\ta2a.DataPart{\n\t\t\t\t\t\t\t\tData: map[string]any{\"id\": \"tool_1\", \"name\": \"GetWeather\", \"args\": map[string]any{\"city\": \"London\"}},\n\t\t\t\t\t\t\t\tMetadata: map[string]any{\n\t\t\t\t\t\t\t\t\ta2aDataPartMetaTypeKey:        a2aDataPartTypeFunctionCall,\n\t\t\t\t\t\t\t\t\ta2aDataPartMetaLongRunningKey: true,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tID: \"artifact-2\",\n\t\t\t\t\t\tParts: []a2a.Part{\n\t\t\t\t\t\t\ta2a.DataPart{\n\t\t\t\t\t\t\t\tData: map[string]any{\"id\": \"tool_2\", \"name\": \"GetNews\", \"args\": map[string]any{\"topic\": \"tech\"}},\n\t\t\t\t\t\t\t\tMetadata: map[string]any{\n\t\t\t\t\t\t\t\t\ta2aDataPartMetaTypeKey:        a2aDataPartTypeFunctionCall,\n\t\t\t\t\t\t\t\t\ta2aDataPartMetaLongRunningKey: true,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tStatus: a2a.TaskStatus{State: a2a.TaskStateInputRequired},\n\t\t\t},\n\t\t\twant: &session.Event{\n\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\tContent: genai.NewContentFromParts([]*genai.Part{\n\t\t\t\t\t\t{Text: \"Checking weather...\"},\n\t\t\t\t\t\t{FunctionCall: &genai.FunctionCall{ID: \"tool_1\", Name: \"GetWeather\", Args: map[string]any{\"city\": \"London\"}}},\n\t\t\t\t\t\t{FunctionCall: &genai.FunctionCall{ID: \"tool_2\", Name: \"GetNews\", Args: map[string]any{\"topic\": \"tech\"}}},\n\t\t\t\t\t}, genai.RoleModel),\n\t\t\t\t\tCustomMetadata: map[string]any{\n\t\t\t\t\t\tcustomMetaTaskIDKey:    string(taskID),\n\t\t\t\t\t\tcustomMetaContextIDKey: contextID,\n\t\t\t\t\t},\n\t\t\t\t\tTurnComplete: true,\n\t\t\t\t},\n\t\t\t\tLongRunningToolIDs: []string{\"tool_1\", \"tool_2\"},\n\t\t\t\tAuthor:             agentName,\n\t\t\t\tBranch:             branch,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"task with single-part text status\",\n\t\t\tinput: &a2a.Task{\n\t\t\t\tID:        taskID,\n\t\t\t\tContextID: contextID,\n\t\t\t\tStatus: a2a.TaskStatus{\n\t\t\t\t\tState:   a2a.TaskStateFailed,\n\t\t\t\t\tMessage: &a2a.Message{Parts: []a2a.Part{a2a.TextPart{Text: \"failed with an error\"}}},\n\t\t\t\t},\n\t\t\t},\n\t\t\twant: &session.Event{\n\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\tErrorMessage:   \"failed with an error\",\n\t\t\t\t\tCustomMetadata: map[string]any{customMetaTaskIDKey: string(taskID), customMetaContextIDKey: contextID},\n\t\t\t\t\tTurnComplete:   true,\n\t\t\t\t},\n\t\t\t\tAuthor: agentName,\n\t\t\t\tBranch: branch,\n\t\t\t},\n\t\t},\n\t}\n\n\tignoreFields := []cmp.Option{\n\t\tcmpopts.IgnoreFields(session.Event{}, \"ID\"),\n\t\tcmpopts.IgnoreFields(session.Event{}, \"Timestamp\"),\n\t\tcmpopts.IgnoreFields(session.Event{}, \"InvocationID\"),\n\t\tcmpopts.IgnoreFields(session.EventActions{}, \"StateDelta\"),\n\t}\n\tfor _, tc := range testCases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\tictx := icontext.NewInvocationContext(t.Context(), icontext.InvocationContextParams{Branch: branch, Agent: a2aAgent})\n\t\t\tgot, err := ToSessionEvent(ictx, tc.input)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"ToSessionEvent() error = %v, want nil\", err)\n\t\t\t}\n\t\t\tif diff := cmp.Diff(tc.want, got, ignoreFields...); diff != \"\" {\n\t\t\t\tt.Errorf(\"ToSessionEvent() wrong result (+got,-want)\\ngot = %v\\nwant = %v\\ndiff = %s\", got, tc.want, diff)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestToSessionEventWithParts_NilResultFiltered(t *testing.T) {\n\ttaskID, contextID, branch, agentName := a2a.NewTaskID(), a2a.NewContextID(), \"main\", \"a2a agent\"\n\ta2aAgent, err := agent.New(agent.Config{Name: agentName})\n\tif err != nil {\n\t\tt.Fatalf(\"failed to create an agent: %v\", err)\n\t}\n\n\tkeepPart := a2a.TextPart{Text: \"KEEP\"}\n\tdropPart := a2a.TextPart{Text: \"DROP\"}\n\n\tfilterConverter := func(ctx context.Context, ev a2a.Event, p a2a.Part) (*genai.Part, error) {\n\t\tif tp, ok := p.(a2a.TextPart); ok && tp.Text == \"DROP\" {\n\t\t\treturn nil, nil\n\t\t}\n\t\treturn ToGenAIPart(p)\n\t}\n\n\ttestCases := []struct {\n\t\tname  string\n\t\tinput a2a.Event\n\t}{\n\t\t{\n\t\t\tname: \"task event\",\n\t\t\tinput: &a2a.Task{\n\t\t\t\tID:        taskID,\n\t\t\t\tContextID: contextID,\n\t\t\t\tArtifacts: []*a2a.Artifact{{Parts: []a2a.Part{keepPart, dropPart}}},\n\t\t\t\tStatus: a2a.TaskStatus{\n\t\t\t\t\tState:   a2a.TaskStateCompleted,\n\t\t\t\t\tMessage: &a2a.Message{Parts: []a2a.Part{keepPart, dropPart}},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"message event\",\n\t\t\tinput: &a2a.Message{\n\t\t\t\tParts: []a2a.Part{keepPart, dropPart},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"artifact update event\",\n\t\t\tinput: &a2a.TaskArtifactUpdateEvent{\n\t\t\t\tArtifact: &a2a.Artifact{Parts: []a2a.Part{keepPart, dropPart}},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"status update event\",\n\t\t\tinput: &a2a.TaskStatusUpdateEvent{\n\t\t\t\tTaskID:    taskID,\n\t\t\t\tContextID: contextID,\n\t\t\t\tFinal:     true,\n\t\t\t\tStatus: a2a.TaskStatus{\n\t\t\t\t\tMessage: &a2a.Message{Parts: []a2a.Part{keepPart, dropPart}},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n\n\tictx := icontext.NewInvocationContext(t.Context(), icontext.InvocationContextParams{Branch: branch, Agent: a2aAgent})\n\n\tfor _, tc := range testCases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\tgot, err := ToSessionEventWithParts(ictx, tc.input, filterConverter)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"ToSessionEventWithParts() error = %v\", err)\n\t\t\t}\n\t\t\tif got == nil {\n\t\t\t\tt.Fatal(\"got event is nil, expected valid event with filtered parts\")\n\t\t\t}\n\n\t\t\tparts := got.LLMResponse.Content.Parts\n\t\t\tfor _, p := range parts {\n\t\t\t\tif p == nil {\n\t\t\t\t\tt.Fatalf(\"got nil part, want it filtered out.\")\n\t\t\t\t}\n\t\t\t\tif p.Text != \"KEEP\" {\n\t\t\t\t\tt.Errorf(\"got %s, want 'KEEP'\", p.Text)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "server/adka2a/executor.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage adka2a\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"slices\"\n\n\t\"github.com/a2aproject/a2a-go/a2a\"\n\t\"github.com/a2aproject/a2a-go/a2aclient\"\n\t\"github.com/a2aproject/a2a-go/a2asrv\"\n\t\"github.com/a2aproject/a2a-go/a2asrv/eventqueue\"\n\t\"github.com/a2aproject/a2a-go/log\"\n\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/agent\"\n\tiremoteagent \"google.golang.org/adk/internal/agent/remoteagent\"\n\t\"google.golang.org/adk/runner\"\n\t\"google.golang.org/adk/session\"\n)\n\n// BeforeExecuteCallback is the callback which will be called before an execution is started.\ntype BeforeExecuteCallback func(ctx context.Context, reqCtx *a2asrv.RequestContext) (context.Context, error)\n\n// AfterEventCallback is the callback which will be called after an ADK event is converted to an A2A event.\ntype AfterEventCallback func(ctx ExecutorContext, event *session.Event, processed *a2a.TaskArtifactUpdateEvent) error\n\n// AfterExecuteCallback is the callback which will be called after an execution resolved into a completed or failed task.\ntype AfterExecuteCallback func(ctx ExecutorContext, finalEvent *a2a.TaskStatusUpdateEvent, err error) error\n\n// A2APartConverter is a custom converter for converting A2A parts to GenAI parts.\n// Implementations should generally remember to leverage adka2a.ToGenAiPart for default conversions\n// nil returns are considered intentionally dropped parts.\ntype A2APartConverter func(ctx context.Context, a2aEvent a2a.Event, part a2a.Part) (*genai.Part, error)\n\n// GenAIPartConverter is a custom converter for converting GenAI parts to A2A parts.\n// Implementations should generally remember to leverage adka2a.ToA2APart for default conversions\n// nil returns are considered intentionally dropped parts.\ntype GenAIPartConverter func(ctx context.Context, adkEvent *session.Event, part *genai.Part) (a2a.Part, error)\n\n// A2AExecutionCleanupCallback is a callback which will be called after an execution or cancellatio has completed or failed.\ntype A2AExecutionCleanupCallback func(ctx context.Context, reqCtx *a2asrv.RequestContext, subAgentCards []*a2a.AgentCard, result a2a.SendMessageResult, cause error)\n\n// OutputMode controls how artifacts are produced.\ntype OutputMode string\n\nconst (\n\t// OutputArtifactPerRun produces a single artifact per [runner.Runner.Run].\n\tOutputArtifactPerRun OutputMode = \"artifact-per-run\"\n\t// OutputArtifactPerEvent produces an artifact per non-partial [session.Event].\n\t// While agent is emitting events an artifact is build incrementally (parts are append to it).\n\t// The next partial event replaces accumulated contents and seals the artifact, meaning\n\t// the next event from this agent will create a new artifact.\n\tOutputArtifactPerEvent OutputMode = \"artifact-per-event\"\n)\n\n// ExecutorConfig allows to configure Executor.\ntype ExecutorConfig struct {\n\t// RunnerConfig is the configuration which will be used for [runner.New] during A2A Execute invocation.\n\tRunnerConfig runner.Config\n\n\t// RunConfig is the configuration which will be passed to [runner.Runner.Run] during A2A Execute invocation.\n\tRunConfig agent.RunConfig\n\n\t// BeforeExecuteCallback is the callback which will be called before an execution is started.\n\t// It can be used to instrument a context or prevent the execution by returning an error.\n\tBeforeExecuteCallback BeforeExecuteCallback\n\n\t// AfterEventCallback is the callback which will be called after an ADK event is successfully converted to an A2A event.\n\t// This gives an opportunity to enrich the event with additional metadata or abort the execution by returning an error.\n\t// The callback is not invoked for errors originating from ADK or event processing. Such errors are converted to\n\t// TaskStatusUpdateEvent-s with TaskStateFailed state. If needed these can be intercepted using AfterExecuteCallback.\n\tAfterEventCallback AfterEventCallback\n\n\t// AfterExecuteCallback is the callback which will be called after an execution resolved into a completed or failed task.\n\t// This gives an opportunity to enrich the event with additional metadata or log it.\n\tAfterExecuteCallback AfterExecuteCallback\n\n\t// A2APartConverter is a custom converter for converting A2A parts to GenAI parts.\n\t// Implementations should generally remember to leverage [adka2a.ToGenAiPart] for default conversions\n\t// nil returns are considered intentionally dropped parts.\n\tA2APartConverter A2APartConverter\n\n\t// GenAIPartConverter is a custom converter for converting GenAI parts to A2A parts.\n\t// Implementations should generally remember to leverage [adka2a.ToA2APart] for default conversions\n\t// nil returns are considered intentionally dropped parts.\n\tGenAIPartConverter GenAIPartConverter\n\n\t// OutputMode controls how artifacts are produced. Can be [OutputArtifactPerRun] or [OutputArtifactPerEvent].\n\t// Defaults to [OutputArtifactPerRun].\n\tOutputMode OutputMode\n\n\t// A2AExecutionCleanupCallback is a callback which will be called after an execution or cancellation has completed or failed.\n\t// If not provided, the default behavior is to log the failure cause, if any.\n\tA2AExecutionCleanupCallback A2AExecutionCleanupCallback\n}\n\nvar _ a2asrv.AgentExecutor = (*Executor)(nil)\n\n// Executor invokes an ADK agent and translates [session.Event]-s to [a2a.Event]-s according to the following rules:\n//   - If the input doesn't reference any a2a.Task, produce a Task with TaskStateSubmitted state.\n//   - Right before runner.Runner invocation, produce TaskStatusUpdateEvent with TaskStateWorking.\n//   - For every session.Event produce a TaskArtifactUpdateEvent{Append=true} with transformed parts.\n//   - After the last session.Event is processed produce an empty TaskArtifactUpdateEvent{Append=true} with LastChunk=true,\n//     if at least one artifact update was produced during the run.\n//   - If there was an LLMResponse with non-zero error code, produce a TaskStatusUpdateEvent with TaskStateFailed.\n//     Else if there was an LLMResponse with long-running tool invocation, produce a TaskStatusUpdateEvent with TaskStateInputRequired.\n//     Else produce a TaskStatusUpdateEvent with TaskStateCompleted.\ntype Executor struct {\n\tconfig ExecutorConfig\n}\n\n// NewExecutor creates an initialized [Executor] instance.\nfunc NewExecutor(config ExecutorConfig) *Executor {\n\treturn &Executor{config: config}\n}\n\nfunc (e *Executor) Execute(ctx context.Context, reqCtx *a2asrv.RequestContext, queue eventqueue.Queue) error {\n\tmsg := reqCtx.Message\n\tif msg == nil {\n\t\treturn fmt.Errorf(\"message not provided\")\n\t}\n\tcontent, err := toGenAIContent(ctx, msg, e.config.A2APartConverter)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"a2a message conversion failed: %w\", err)\n\t}\n\n\trunnerCfg, executorPlugin, err := withExecutorPlugin(e.config.RunnerConfig)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to install a2a-executor plugin: %w\", err)\n\t}\n\n\tr, err := runner.New(runnerCfg)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to create a runner: %w\", err)\n\t}\n\tif e.config.BeforeExecuteCallback != nil {\n\t\tctx, err = e.config.BeforeExecuteCallback(ctx, reqCtx)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"before execute: %w\", err)\n\t\t}\n\t}\n\n\tif event, err := handleInputRequired(reqCtx, content); event != nil || err != nil {\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn queue.Write(ctx, event)\n\t}\n\n\tif reqCtx.StoredTask == nil {\n\t\tevent := a2a.NewSubmittedTask(reqCtx, msg)\n\t\tif err := queue.Write(ctx, event); err != nil {\n\t\t\treturn fmt.Errorf(\"failed to submit a task: %w\", err)\n\t\t}\n\t}\n\n\tinvocationMeta := toInvocationMeta(ctx, e.config, reqCtx)\n\n\terr = e.prepareSession(ctx, invocationMeta)\n\tif err != nil {\n\t\tevent := toTaskFailedUpdateEvent(reqCtx, err, invocationMeta.eventMeta)\n\t\texecCtx := newExecutorContext(ctx, invocationMeta, executorPlugin, content)\n\t\treturn e.writeFinalTaskStatus(execCtx, queue, nil, event, err)\n\t}\n\n\tevent := a2a.NewStatusUpdateEvent(reqCtx, a2a.TaskStateWorking, nil)\n\tevent.Metadata = invocationMeta.eventMeta\n\tif err := queue.Write(ctx, event); err != nil {\n\t\treturn err\n\t}\n\n\tvar artifactTransform eventToArtifactTransform\n\tif e.config.OutputMode == OutputArtifactPerEvent {\n\t\tartifactTransform = newArtifactMaker(reqCtx)\n\t} else {\n\t\tartifactTransform = newLegacyArtifactMaker(reqCtx)\n\t}\n\n\tprocessor := newEventProcessor(reqCtx, invocationMeta, e.config.GenAIPartConverter, artifactTransform)\n\texecutorContext := newExecutorContext(ctx, invocationMeta, executorPlugin, content)\n\treturn e.process(executorContext, r, processor, queue)\n}\n\nfunc (e *Executor) Cancel(ctx context.Context, reqCtx *a2asrv.RequestContext, queue eventqueue.Queue) error {\n\tevent := a2a.NewStatusUpdateEvent(reqCtx, a2a.TaskStateCanceled, nil)\n\tevent.Final = true\n\treturn queue.Write(ctx, event)\n}\n\nfunc (e *Executor) Cleanup(ctx context.Context, reqCtx *a2asrv.RequestContext, result a2a.SendMessageResult, cause error) {\n\tremoteSubagents := findRemoteSubagents(e.config.RunnerConfig.Agent)\n\n\t// If task was in input-required and got successfully cancelled - run the cleanup logic\n\tif reqCtx.StoredTask != nil && reqCtx.StoredTask.Status.State == a2a.TaskStateInputRequired {\n\t\tif task, ok := result.(*a2a.Task); ok && task.Status.State == a2a.TaskStateCanceled && reqCtx.Message == nil {\n\t\t\tif err := e.cancelChildInputRequiredTasks(ctx, reqCtx, reqCtx.StoredTask.Status, remoteSubagents); err != nil {\n\t\t\t\tlog.Warn(ctx, \"failed to cancel subagent tasks waiting for input\", \"cause\", err)\n\t\t\t}\n\t\t}\n\t}\n\n\tif e.config.A2AExecutionCleanupCallback != nil {\n\t\tsubAgentCards := make([]*a2a.AgentCard, len(remoteSubagents))\n\t\tfor i, subagent := range remoteSubagents {\n\t\t\tsubAgentCards[i] = subagent.config.AgentCard\n\t\t}\n\t\te.config.A2AExecutionCleanupCallback(ctx, reqCtx, subAgentCards, result, cause)\n\t} else if cause != nil {\n\t\tif reqCtx.Message != nil {\n\t\t\tlog.Warn(ctx, \"execution failed\", \"error\", cause)\n\t\t} else {\n\t\t\tlog.Warn(ctx, \"cancellation failed\", \"error\", cause)\n\t\t}\n\t}\n}\n\nfunc (e *Executor) cancelChildInputRequiredTasks(ctx context.Context, reqCtx *a2asrv.RequestContext, status a2a.TaskStatus, subagents []remoteAgent) error {\n\tif len(subagents) == 0 {\n\t\treturn nil\n\t}\n\n\tmeta := toInvocationMeta(ctx, e.config, reqCtx)\n\tgetSessionResponse, err := e.config.RunnerConfig.SessionService.Get(ctx, &session.GetRequest{\n\t\tAppName:   e.config.RunnerConfig.AppName,\n\t\tUserID:    meta.userID,\n\t\tSessionID: meta.sessionID,\n\t})\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to get a session: %w\", err)\n\t}\n\n\ttasksToCancel, err := getSubagentTasksToCancel(ctx, status, getSessionResponse.Session)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"subtask search failed: %w\", err)\n\t}\n\tif len(tasksToCancel) == 0 {\n\t\treturn nil\n\t}\n\n\tvar failures []error\n\tclientCache := map[string]*a2aclient.Client{}\n\tfor _, task := range tasksToCancel { // TODO(yarolegovich): run in parallel (how to limit?)\n\t\tremoteSubagentIdx := slices.IndexFunc(subagents, func(a remoteAgent) bool { return a.agent.Name() == task.agentName })\n\t\tif remoteSubagentIdx < 0 {\n\t\t\tcontinue\n\t\t}\n\t\tremoteSubagent := subagents[remoteSubagentIdx]\n\t\tclient, ok := clientCache[task.agentName]\n\t\tif !ok {\n\t\t\t_, newClient, err := iremoteagent.CreateA2AClient(ctx, remoteSubagent.config)\n\t\t\tif err != nil {\n\t\t\t\tfailures = append(failures, fmt.Errorf(\"failed to create A2A client: %w\", err))\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tclientCache[task.agentName] = newClient\n\t\t\tclient = newClient\n\t\t}\n\t\t_, err = client.CancelTask(ctx, &a2a.TaskIDParams{ID: task.taskID})\n\t\tif err != nil {\n\t\t\tfailures = append(failures, fmt.Errorf(\"failed to cancel task: %w\", err))\n\t\t\tcontinue\n\t\t}\n\t}\n\tfor _, client := range clientCache {\n\t\tif err := client.Destroy(); err != nil {\n\t\t\tfailures = append(failures, fmt.Errorf(\"client destroy failed: %w\", err))\n\t\t}\n\t}\n\treturn errors.Join(failures...)\n}\n\n// Processing failures should be delivered as Task failed events. An error is returned from this method if an event write fails.\nfunc (e *Executor) process(ctx ExecutorContext, r *runner.Runner, processor *eventProcessor, q eventqueue.Queue) error {\n\tmeta := processor.meta\n\tfor adkEvent, adkErr := range r.Run(ctx, meta.userID, meta.sessionID, ctx.UserContent(), e.config.RunConfig) {\n\t\tif adkErr != nil {\n\t\t\tevent := processor.makeTaskFailedEvent(fmt.Errorf(\"agent run failed: %w\", adkErr), nil)\n\t\t\treturn e.writeFinalTaskStatus(ctx, q, processor.makeFinalArtifactUpdate(), event, adkErr)\n\t\t}\n\n\t\ta2aEvent, pErr := processor.process(ctx, adkEvent)\n\t\tif pErr == nil && a2aEvent != nil && e.config.AfterEventCallback != nil {\n\t\t\tpErr = e.config.AfterEventCallback(ctx, adkEvent, a2aEvent)\n\t\t}\n\n\t\tif pErr != nil {\n\t\t\tevent := processor.makeTaskFailedEvent(fmt.Errorf(\"processor failed: %w\", pErr), adkEvent)\n\t\t\treturn e.writeFinalTaskStatus(ctx, q, processor.makeFinalArtifactUpdate(), event, pErr)\n\t\t}\n\n\t\tif a2aEvent != nil {\n\t\t\tif err := q.Write(ctx, a2aEvent); err != nil {\n\t\t\t\treturn fmt.Errorf(\"event write failed: %w\", err)\n\t\t\t}\n\t\t}\n\t}\n\n\tfinalStatus := processor.makeFinalStatusUpdate()\n\treturn e.writeFinalTaskStatus(ctx, q, processor.makeFinalArtifactUpdate(), finalStatus, nil)\n}\n\nfunc (e *Executor) writeFinalTaskStatus(\n\tctx ExecutorContext,\n\tqueue eventqueue.Queue,\n\tpartialReset *a2a.TaskArtifactUpdateEvent,\n\tstatus *a2a.TaskStatusUpdateEvent,\n\terr error,\n) error {\n\tif e.config.AfterExecuteCallback != nil {\n\t\tif err = e.config.AfterExecuteCallback(ctx, status, err); err != nil {\n\t\t\treturn fmt.Errorf(\"after execute: %w\", err)\n\t\t}\n\t}\n\tif partialReset != nil {\n\t\tif err := queue.Write(ctx, partialReset); err != nil {\n\t\t\treturn fmt.Errorf(\"partial artifact update write failed: %w\", err)\n\t\t}\n\t}\n\tif err := queue.Write(ctx, status); err != nil {\n\t\treturn fmt.Errorf(\"%q state update event write failed: %w\", status.Status.State, err)\n\t}\n\treturn nil\n}\n\nfunc (e *Executor) prepareSession(ctx context.Context, meta invocationMeta) error {\n\tservice := e.config.RunnerConfig.SessionService\n\n\t_, err := service.Get(ctx, &session.GetRequest{\n\t\tAppName:   e.config.RunnerConfig.AppName,\n\t\tUserID:    meta.userID,\n\t\tSessionID: meta.sessionID,\n\t})\n\tif err == nil {\n\t\treturn nil\n\t}\n\n\t_, err = service.Create(ctx, &session.CreateRequest{\n\t\tAppName:   e.config.RunnerConfig.AppName,\n\t\tUserID:    meta.userID,\n\t\tSessionID: meta.sessionID,\n\t\tState:     make(map[string]any),\n\t})\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to create a session: %w\", err)\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "server/adka2a/executor_context.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage adka2a\n\nimport (\n\t\"context\"\n\t\"iter\"\n\n\t\"github.com/a2aproject/a2a-go/a2asrv\"\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/session\"\n)\n\n// ExecutorContext provides read-only information about the context of an A2A agent execution.\n// An execution starts with a user message and ends with a task in a terminal or input-required state.\ntype ExecutorContext interface {\n\tcontext.Context\n\n\t// SessionID is ID of the session. It is passed as contextID in A2A request.\n\tSessionID() string\n\t// UserID is ID of the user who made the request. The information is either extracted from [a2asrv.CallContext]\n\t// or derived from session ID for unauthenticated requests.\n\tUserID() string\n\t// AgentName is the name of the root agent.\n\tAgentName() string\n\t// ReadonlyState provides a view of the current session state.\n\tReadonlyState() session.ReadonlyState\n\t// Events provides a readonly view of the current session events.\n\tEvents() session.Events\n\t// UserContent is a converted A2A message which is passed to runner.Run.\n\tUserContent() *genai.Content\n\t// RequestContext containts information about the original A2A Request, the current task and related tasks.\n\tRequestContext() *a2asrv.RequestContext\n}\n\ntype executorContext struct {\n\tcontext.Context\n\tmeta        invocationMeta\n\tplugin      *executorPlugin\n\tuserContent *genai.Content\n}\n\nfunc newExecutorContext(ctx context.Context, meta invocationMeta, plugin *executorPlugin, userContent *genai.Content) ExecutorContext {\n\treturn &executorContext{\n\t\tContext:     ctx,\n\t\tmeta:        meta,\n\t\tplugin:      plugin,\n\t\tuserContent: userContent,\n\t}\n}\n\nfunc (ec *executorContext) SessionID() string {\n\treturn ec.meta.sessionID\n}\n\nfunc (ec *executorContext) UserID() string {\n\treturn ec.meta.userID\n}\n\nfunc (ec *executorContext) AgentName() string {\n\treturn ec.meta.agentName\n}\n\nfunc (ec *executorContext) ReadonlyState() session.ReadonlyState {\n\tsession := ec.plugin.invocationSession\n\tif session == nil {\n\t\treturn emptySessionState{}\n\t}\n\treturn session.State()\n}\n\nfunc (ec *executorContext) Events() session.Events {\n\tsession := ec.plugin.invocationSession\n\tif session == nil {\n\t\treturn emptySessionEvents{}\n\t}\n\treturn session.Events()\n}\n\nfunc (ec *executorContext) RequestContext() *a2asrv.RequestContext {\n\treturn ec.meta.reqCtx\n}\n\nfunc (ec *executorContext) UserContent() *genai.Content {\n\treturn ec.userContent\n}\n\ntype emptySessionState struct{}\n\nfunc (emptySessionState) Get(string) (any, error) {\n\treturn nil, session.ErrStateKeyNotExist\n}\n\nfunc (emptySessionState) All() iter.Seq2[string, any] {\n\treturn func(yield func(string, any) bool) {}\n}\n\ntype emptySessionEvents struct{}\n\nfunc (emptySessionEvents) At(i int) *session.Event {\n\treturn nil\n}\n\nfunc (emptySessionEvents) All() iter.Seq[*session.Event] {\n\treturn func(yield func(*session.Event) bool) {}\n}\n\nfunc (emptySessionEvents) Len() int {\n\treturn 0\n}\n"
  },
  {
    "path": "server/adka2a/executor_plugin.go",
    "content": "// Copyright 2026 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage adka2a\n\nimport (\n\t\"slices\"\n\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/agent\"\n\t\"google.golang.org/adk/plugin\"\n\t\"google.golang.org/adk/runner\"\n\t\"google.golang.org/adk/session\"\n)\n\ntype executorPlugin struct {\n\tplugin *plugin.Plugin\n\n\tinvocationSession session.Session\n}\n\nfunc withExecutorPlugin(cfg runner.Config) (runner.Config, *executorPlugin, error) {\n\texecutorPlugin, err := newExecutorPlugin()\n\tif err != nil {\n\t\treturn cfg, nil, err\n\t}\n\tcfg.PluginConfig.Plugins = append(slices.Clone(cfg.PluginConfig.Plugins), executorPlugin.plugin)\n\treturn cfg, executorPlugin, nil\n}\n\nfunc newExecutorPlugin() (*executorPlugin, error) {\n\texecPlugin := &executorPlugin{}\n\tplugin, err := plugin.New(plugin.Config{\n\t\tName: \"a2a-executor\",\n\t\tBeforeRunCallback: func(ic agent.InvocationContext) (*genai.Content, error) {\n\t\t\texecPlugin.invocationSession = ic.Session()\n\t\t\treturn nil, nil\n\t\t},\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\texecPlugin.plugin = plugin\n\treturn execPlugin, nil\n}\n"
  },
  {
    "path": "server/adka2a/executor_test.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage adka2a\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"iter\"\n\t\"net/http/httptest\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/a2aproject/a2a-go/a2a\"\n\t\"github.com/a2aproject/a2a-go/a2aclient\"\n\t\"github.com/a2aproject/a2a-go/a2asrv\"\n\t\"github.com/a2aproject/a2a-go/a2asrv/eventqueue\"\n\t\"github.com/google/go-cmp/cmp\"\n\t\"github.com/google/go-cmp/cmp/cmpopts\"\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/agent\"\n\t\"google.golang.org/adk/model\"\n\t\"google.golang.org/adk/runner\"\n\t\"google.golang.org/adk/session\"\n)\n\ntype testQueue struct {\n\teventqueue.Queue\n\tevents   []a2a.Event\n\twriteErr *eventIndex\n}\n\nfunc (q *testQueue) Write(_ context.Context, e a2a.Event) error {\n\tif q.writeErr != nil && q.writeErr.i == len(q.events) {\n\t\treturn fmt.Errorf(\"queue write failed\")\n\t}\n\tq.events = append(q.events, e)\n\treturn nil\n}\n\ntype testSessionService struct {\n\tsession.Service\n\tcreateErr bool\n}\n\nfunc (s *testSessionService) Create(ctx context.Context, req *session.CreateRequest) (*session.CreateResponse, error) {\n\tif s.createErr {\n\t\treturn nil, fmt.Errorf(\"session creation failed\")\n\t}\n\treturn s.Service.Create(ctx, req)\n}\n\nfunc newEventReplayAgent(events []*session.Event, failWith error) (agent.Agent, error) {\n\treturn agent.New(agent.Config{\n\t\tName: \"test\",\n\t\tRun: func(agent.InvocationContext) iter.Seq2[*session.Event, error] {\n\t\t\treturn func(yield func(*session.Event, error) bool) {\n\t\t\t\tfor _, event := range events {\n\t\t\t\t\tif !yield(event, nil) {\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif failWith != nil {\n\t\t\t\t\tyield(nil, failWith)\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t})\n}\n\nfunc newInMemoryQueue(t *testing.T) eventqueue.Queue {\n\tt.Helper()\n\tqm := eventqueue.NewInMemoryManager()\n\tq, err := qm.GetOrCreate(t.Context(), \"test\")\n\tif err != nil {\n\t\tt.Fatalf(\"qm.GetOrCreate() error = %v\", err)\n\t}\n\treturn q\n}\n\ntype eventIndex struct{ i int }\n\nfunc TestExecutor_Execute(t *testing.T) {\n\ttask := &a2a.Task{ID: a2a.NewTaskID(), ContextID: a2a.NewContextID()}\n\thiMsg := a2a.NewMessage(a2a.MessageRoleUser, a2a.TextPart{Text: \"hi\"})\n\thiMsgForTask := a2a.NewMessageForTask(a2a.MessageRoleUser, task, a2a.TextPart{Text: \"hi\"})\n\n\ttestCases := []struct {\n\t\tname               string\n\t\trequest            *a2a.MessageSendParams\n\t\tevents             []*session.Event\n\t\twantEvents         []a2a.Event\n\t\tcreateSessionFails bool\n\t\tagentRunFails      error\n\t\tqueueWriteFails    *eventIndex\n\t\twantErr            bool\n\t}{\n\t\t{\n\t\t\tname:    \"no message\",\n\t\t\trequest: &a2a.MessageSendParams{},\n\t\t\twantErr: true,\n\t\t},\n\t\t{\n\t\t\tname: \"malformed data\",\n\t\t\trequest: &a2a.MessageSendParams{Message: a2a.NewMessageForTask(a2a.MessageRoleUser, task, a2a.FilePart{\n\t\t\t\tFile: a2a.FileBytes{Bytes: \"(*_*)\"}, // malformed base64\n\t\t\t})},\n\t\t\twantErr: true,\n\t\t},\n\t\t{\n\t\t\tname:               \"session setup fails\",\n\t\t\trequest:            &a2a.MessageSendParams{Message: hiMsgForTask},\n\t\t\tcreateSessionFails: true,\n\t\t\twantEvents: []a2a.Event{\n\t\t\t\tnewFinalStatusUpdate(\n\t\t\t\t\ttask, a2a.TaskStateFailed,\n\t\t\t\t\ta2a.NewMessageForTask(a2a.MessageRoleAgent, task, a2a.TextPart{Text: \"failed to create a session: session creation failed\"}),\n\t\t\t\t),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname:    \"success for a new task\",\n\t\t\trequest: &a2a.MessageSendParams{Message: hiMsg},\n\t\t\tevents: []*session.Event{\n\t\t\t\t{LLMResponse: modelResponseFromParts(genai.NewPartFromText(\"Hello\"))},\n\t\t\t\t{LLMResponse: modelResponseFromParts(genai.NewPartFromText(\", world!\"))},\n\t\t\t},\n\t\t\twantEvents: []a2a.Event{\n\t\t\t\ta2a.NewSubmittedTask(task, hiMsg),\n\t\t\t\ta2a.NewStatusUpdateEvent(task, a2a.TaskStateWorking, nil),\n\t\t\t\ta2a.NewArtifactEvent(task, a2a.TextPart{Text: \"Hello\"}),\n\t\t\t\ta2a.NewArtifactUpdateEvent(task, a2a.NewArtifactID(), a2a.TextPart{Text: \", world!\"}),\n\t\t\t\tnewFinalStatusUpdate(task, a2a.TaskStateCompleted, nil),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname:    \"success for existing task\",\n\t\t\trequest: &a2a.MessageSendParams{Message: hiMsgForTask},\n\t\t\tevents: []*session.Event{\n\t\t\t\t{LLMResponse: modelResponseFromParts(genai.NewPartFromText(\"Hello\"))},\n\t\t\t\t{LLMResponse: modelResponseFromParts(genai.NewPartFromText(\", world!\"))},\n\t\t\t},\n\t\t\twantEvents: []a2a.Event{\n\t\t\t\ta2a.NewStatusUpdateEvent(task, a2a.TaskStateWorking, nil),\n\t\t\t\ta2a.NewArtifactEvent(task, a2a.TextPart{Text: \"Hello\"}),\n\t\t\t\ta2a.NewArtifactUpdateEvent(task, a2a.NewArtifactID(), a2a.TextPart{Text: \", world!\"}),\n\t\t\t\tnewFinalStatusUpdate(task, a2a.TaskStateCompleted, nil),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname:            \"queue write fails\",\n\t\t\trequest:         &a2a.MessageSendParams{Message: hiMsgForTask},\n\t\t\tqueueWriteFails: &eventIndex{0},\n\t\t\twantErr:         true,\n\t\t},\n\t\t{\n\t\t\tname:    \"llm fails\",\n\t\t\trequest: &a2a.MessageSendParams{Message: hiMsgForTask},\n\t\t\tevents: []*session.Event{\n\t\t\t\t{LLMResponse: modelResponseFromParts(genai.NewPartFromText(\"Hello\"))},\n\t\t\t\t{LLMResponse: model.LLMResponse{ErrorCode: \"418\", ErrorMessage: \"I'm a teapot\"}},\n\t\t\t\t{LLMResponse: modelResponseFromParts(genai.NewPartFromText(\", world!\"))},\n\t\t\t},\n\t\t\twantEvents: []a2a.Event{\n\t\t\t\ta2a.NewStatusUpdateEvent(task, a2a.TaskStateWorking, nil),\n\t\t\t\ta2a.NewArtifactEvent(task, a2a.TextPart{Text: \"Hello\"}),\n\t\t\t\ta2a.NewArtifactUpdateEvent(task, a2a.NewArtifactID(), a2a.TextPart{Text: \", world!\"}),\n\t\t\t\ttoTaskFailedUpdateEvent(\n\t\t\t\t\ttask, errorFromResponse(&model.LLMResponse{ErrorCode: \"418\", ErrorMessage: \"I'm a teapot\"}),\n\t\t\t\t\tmap[string]any{ToA2AMetaKey(\"error_code\"): \"418\"},\n\t\t\t\t),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname:    \"agent run fails\",\n\t\t\trequest: &a2a.MessageSendParams{Message: hiMsgForTask},\n\t\t\tevents: []*session.Event{\n\t\t\t\t{LLMResponse: modelResponseFromParts(genai.NewPartFromText(\"Hello\"))},\n\t\t\t},\n\t\t\tagentRunFails: fmt.Errorf(\"OOF\"),\n\t\t\twantEvents: []a2a.Event{\n\t\t\t\ta2a.NewStatusUpdateEvent(task, a2a.TaskStateWorking, nil),\n\t\t\t\ta2a.NewArtifactEvent(task, a2a.TextPart{Text: \"Hello\"}),\n\t\t\t\tnewFinalStatusUpdate(\n\t\t\t\t\ttask, a2a.TaskStateFailed,\n\t\t\t\t\ta2a.NewMessageForTask(a2a.MessageRoleAgent, task, a2a.TextPart{Text: \"agent run failed: OOF\"}),\n\t\t\t\t),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname:    \"agent run and queue write fail\",\n\t\t\trequest: &a2a.MessageSendParams{Message: hiMsgForTask},\n\t\t\tevents: []*session.Event{\n\t\t\t\t{LLMResponse: modelResponseFromParts(genai.NewPartFromText(\"Hello\"))},\n\t\t\t},\n\t\t\tqueueWriteFails: &eventIndex{2},\n\t\t\tagentRunFails:   fmt.Errorf(\"OOF\"),\n\t\t\twantErr:         true,\n\t\t\twantEvents: []a2a.Event{\n\t\t\t\ta2a.NewStatusUpdateEvent(task, a2a.TaskStateWorking, nil),\n\t\t\t\ta2a.NewArtifactEvent(task, a2a.TextPart{Text: \"Hello\"}),\n\t\t\t},\n\t\t},\n\t}\n\n\tfor _, tc := range testCases {\n\t\tignoreFields := []cmp.Option{\n\t\t\tcmpopts.IgnoreFields(a2a.Message{}, \"ID\"),\n\t\t\tcmpopts.IgnoreFields(a2a.Artifact{}, \"ID\"),\n\t\t\tcmpopts.IgnoreFields(a2a.TaskStatus{}, \"Timestamp\"),\n\t\t\tcmpopts.IgnoreFields(a2a.TaskStatusUpdateEvent{}, \"Metadata\"),\n\t\t\tcmpopts.IgnoreFields(a2a.TaskArtifactUpdateEvent{}, \"Metadata\"),\n\t\t}\n\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\tagent, err := newEventReplayAgent(tc.events, tc.agentRunFails)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"newEventReplayAgent() error = %v, want nil\", err)\n\t\t\t}\n\t\t\tsessionService := &testSessionService{Service: session.InMemoryService(), createErr: tc.createSessionFails}\n\t\t\trunnerConfig := runner.Config{AppName: agent.Name(), Agent: agent, SessionService: sessionService}\n\t\t\texecutor := NewExecutor(ExecutorConfig{RunnerConfig: runnerConfig})\n\t\t\tqueue := &testQueue{Queue: newInMemoryQueue(t), writeErr: tc.queueWriteFails}\n\t\t\treqCtx := &a2asrv.RequestContext{TaskID: task.ID, ContextID: task.ContextID, Message: tc.request.Message}\n\t\t\tif tc.request.Message != nil && tc.request.Message.TaskID == task.ID {\n\t\t\t\treqCtx.StoredTask = task\n\t\t\t}\n\n\t\t\terr = executor.Execute(t.Context(), reqCtx, queue)\n\t\t\tif err != nil && !tc.wantErr {\n\t\t\t\tt.Fatalf(\"executor.Execute() error = %v, want nil\", err)\n\t\t\t}\n\t\t\tif err == nil && tc.wantErr {\n\t\t\t\tt.Fatalf(\"executor.Execute() produced %d events, want error\", len(queue.events))\n\t\t\t}\n\t\t\tif tc.wantEvents != nil {\n\t\t\t\tif diff := cmp.Diff(tc.wantEvents, queue.events, ignoreFields...); diff != \"\" {\n\t\t\t\t\tt.Fatalf(\"executor.Execute() wrong events (+got,-want):\\ngot = %v\\nwant = %v\\ndiff = %s\", queue.events, tc.wantEvents, diff)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestExecutor_Cancel(t *testing.T) {\n\ttask := &a2a.Task{ID: a2a.NewTaskID(), ContextID: a2a.NewContextID()}\n\texecutor := NewExecutor(ExecutorConfig{})\n\treqCtx := &a2asrv.RequestContext{TaskID: task.ID, ContextID: task.ContextID}\n\n\tqueue := &testQueue{Queue: newInMemoryQueue(t)}\n\n\treqCtx.StoredTask = task\n\terr := executor.Cancel(t.Context(), reqCtx, queue)\n\tif err != nil {\n\t\tt.Fatalf(\"executor.Cancel() error = %v, want nil\", err)\n\t}\n\tif len(queue.events) != 1 {\n\t\tt.Fatalf(\"executor.Cancel() produced %d events, want 1\", queue.events)\n\t}\n\tevent := queue.events[0].(*a2a.TaskStatusUpdateEvent)\n\tif event.Status.State != a2a.TaskStateCanceled {\n\t\tt.Fatalf(\"executor.Cancel() = %v, want a single TaskStateCanceled update\", event)\n\t}\n}\n\nfunc TestExecutor_SessionReuse(t *testing.T) {\n\tctx := t.Context()\n\tagent, err := newEventReplayAgent([]*session.Event{}, nil)\n\tif err != nil {\n\t\tt.Fatalf(\"newEventReplayAgent() error = %v, want nil\", err)\n\t}\n\n\tsessionService := session.InMemoryService()\n\ttask := &a2a.Task{ID: a2a.NewTaskID(), ContextID: a2a.NewContextID()}\n\treq := &a2a.MessageSendParams{Message: a2a.NewMessageForTask(a2a.MessageRoleUser, task)}\n\treqCtx := &a2asrv.RequestContext{TaskID: task.ID, ContextID: task.ContextID, Message: req.Message}\n\trunnerConfig := runner.Config{AppName: agent.Name(), Agent: agent, SessionService: sessionService}\n\tconfig := ExecutorConfig{RunnerConfig: runnerConfig}\n\texecutor := NewExecutor(config)\n\tqueue := newInMemoryQueue(t)\n\n\terr = executor.Execute(ctx, reqCtx, queue)\n\tif err != nil {\n\t\tt.Fatalf(\"executor.Execute() error = %v, want nil\", err)\n\t}\n\terr = executor.Execute(ctx, reqCtx, queue)\n\tif err != nil {\n\t\tt.Fatalf(\"executor.Execute() error = %v, want nil\", err)\n\t}\n\n\tmeta := toInvocationMeta(ctx, config, reqCtx)\n\tsessions, err := sessionService.List(ctx, &session.ListRequest{AppName: runnerConfig.AppName, UserID: meta.userID})\n\tif err != nil {\n\t\tt.Fatalf(\"sessionService.List() error = %v, want nil\", err)\n\t}\n\tif len(sessions.Sessions) != 1 {\n\t\tt.Fatalf(\"sessionService.List() got %d sessions, want 1\", sessions.Sessions)\n\t}\n\n\treqCtx.ContextID = a2a.NewContextID()\n\totherContextMeta := toInvocationMeta(ctx, config, reqCtx)\n\tif meta.sessionID == otherContextMeta.sessionID {\n\t\tt.Fatal(\"want sessionID to be different for different contextIDs\")\n\t}\n}\n\nfunc TestExecutor_Callbacks(t *testing.T) {\n\ttype contextKeyType struct{}\n\ttask := &a2a.Task{ID: a2a.NewTaskID(), ContextID: a2a.NewContextID()}\n\thiMsg := a2a.NewMessageForTask(a2a.MessageRoleUser, task, a2a.TextPart{Text: \"hi\"})\n\n\ttestCases := []struct {\n\t\tname               string\n\t\tcreateSessionFails bool\n\t\tevents             []*session.Event\n\t\tbeforeExecution    BeforeExecuteCallback\n\t\tafterEvent         AfterEventCallback\n\t\tafterExecution     AfterExecuteCallback\n\t\twantEvents         []a2a.Event\n\t\twantErr            error\n\t}{\n\t\t{\n\t\t\tname: \"abort execution\",\n\t\t\tbeforeExecution: func(ctx context.Context, reqCtx *a2asrv.RequestContext) (context.Context, error) {\n\t\t\t\treturn nil, fmt.Errorf(\"aborted\")\n\t\t\t},\n\t\t\twantErr: fmt.Errorf(\"aborted\"),\n\t\t},\n\t\t{\n\t\t\tname: \"instrument context\",\n\t\t\tbeforeExecution: func(ctx context.Context, reqCtx *a2asrv.RequestContext) (context.Context, error) {\n\t\t\t\treturn context.WithValue(ctx, contextKeyType{}, \"bar\"), nil\n\t\t\t},\n\t\t\tafterExecution: func(ctx ExecutorContext, finalUpdate *a2a.TaskStatusUpdateEvent, err error) error {\n\t\t\t\ttext, _ := ctx.Value(contextKeyType{}).(string)\n\t\t\t\tfinalUpdate.Status.Message = a2a.NewMessage(a2a.MessageRoleAgent, a2a.TextPart{Text: text})\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\twantEvents: []a2a.Event{\n\t\t\t\ta2a.NewStatusUpdateEvent(task, a2a.TaskStateWorking, nil),\n\t\t\t\tnewFinalStatusUpdate(task, a2a.TaskStateCompleted, a2a.NewMessage(a2a.MessageRoleAgent, a2a.TextPart{Text: \"bar\"})),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"intercept processing failure\",\n\t\t\tevents: []*session.Event{\n\t\t\t\t{LLMResponse: modelResponseFromParts(genai.NewPartFromText(\"Hello, world!\"))},\n\t\t\t},\n\t\t\tafterEvent: func(ctx ExecutorContext, event *session.Event, processed *a2a.TaskArtifactUpdateEvent) error {\n\t\t\t\treturn fmt.Errorf(\"fail!\")\n\t\t\t},\n\t\t\tafterExecution: func(ctx ExecutorContext, finalUpdate *a2a.TaskStatusUpdateEvent, err error) error {\n\t\t\t\tfinalUpdate.Status.Message = a2a.NewMessage(a2a.MessageRoleAgent, a2a.TextPart{Text: \"bar\"})\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\twantEvents: []a2a.Event{\n\t\t\t\ta2a.NewStatusUpdateEvent(task, a2a.TaskStateWorking, nil),\n\t\t\t\tnewFinalStatusUpdate(task, a2a.TaskStateFailed, a2a.NewMessage(a2a.MessageRoleAgent, a2a.TextPart{Text: \"bar\"})),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname:               \"intercept session setup failure\",\n\t\t\tcreateSessionFails: true,\n\t\t\tafterExecution: func(ctx ExecutorContext, finalUpdate *a2a.TaskStatusUpdateEvent, err error) error {\n\t\t\t\teventCount := 0\n\t\t\t\tfor range ctx.ReadonlyState().All() {\n\t\t\t\t\teventCount++\n\t\t\t\t}\n\t\t\t\tfinalUpdate.Status.Message = a2a.NewMessage(a2a.MessageRoleAgent, a2a.TextPart{Text: fmt.Sprintf(\"%d events\", eventCount)})\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\twantEvents: []a2a.Event{newFinalStatusUpdate(task, a2a.TaskStateFailed, a2a.NewMessage(a2a.MessageRoleAgent, a2a.TextPart{Text: \"0 events\"}))},\n\t\t},\n\t\t{\n\t\t\tname: \"enrich event\",\n\t\t\tevents: []*session.Event{\n\t\t\t\t{LLMResponse: modelResponseFromParts(genai.NewPartFromText(\"Hello\"))},\n\t\t\t\t{LLMResponse: modelResponseFromParts(genai.NewPartFromText(\", world!\"))},\n\t\t\t},\n\t\t\tafterEvent: func(ctx ExecutorContext, event *session.Event, processed *a2a.TaskArtifactUpdateEvent) error {\n\t\t\t\tprocessed.Artifact.Parts = append(processed.Artifact.Parts, a2a.TextPart{Text: \" (enriched)\"})\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\twantEvents: []a2a.Event{\n\t\t\t\ta2a.NewStatusUpdateEvent(task, a2a.TaskStateWorking, nil),\n\t\t\t\ta2a.NewArtifactEvent(task, a2a.TextPart{Text: \"Hello\"}, a2a.TextPart{Text: \" (enriched)\"}),\n\t\t\t\ta2a.NewArtifactUpdateEvent(task, a2a.NewArtifactID(), a2a.TextPart{Text: \", world!\"}, a2a.TextPart{Text: \" (enriched)\"}),\n\t\t\t\tnewFinalStatusUpdate(task, a2a.TaskStateCompleted, nil),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"can access session events\",\n\t\t\tevents: []*session.Event{\n\t\t\t\t{LLMResponse: modelResponseFromParts(genai.NewPartFromText(\"Hello\"))},\n\t\t\t\t{LLMResponse: modelResponseFromParts(genai.NewPartFromText(\", world!\"))},\n\t\t\t},\n\t\t\tafterExecution: func(ctx ExecutorContext, finalUpdate *a2a.TaskStatusUpdateEvent, err error) error {\n\t\t\t\teventCount := ctx.Events().Len()\n\t\t\t\tfinalUpdate.Status.Message = a2a.NewMessage(a2a.MessageRoleAgent, a2a.TextPart{Text: fmt.Sprintf(\"event count = %d\", eventCount)})\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\twantEvents: []a2a.Event{\n\t\t\t\ta2a.NewStatusUpdateEvent(task, a2a.TaskStateWorking, nil),\n\t\t\t\ta2a.NewArtifactEvent(task, a2a.TextPart{Text: \"Hello\"}),\n\t\t\t\ta2a.NewArtifactUpdateEvent(task, a2a.NewArtifactID(), a2a.TextPart{Text: \", world!\"}),\n\t\t\t\tnewFinalStatusUpdate(task, a2a.TaskStateCompleted,\n\t\t\t\t\ta2a.NewMessage(a2a.MessageRoleAgent, a2a.TextPart{Text: \"event count = 3\"}),\n\t\t\t\t),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"abort execution\",\n\t\t\tevents: []*session.Event{\n\t\t\t\t{LLMResponse: modelResponseFromParts(genai.NewPartFromText(\"Hello\"))},\n\t\t\t\t{LLMResponse: modelResponseFromParts(genai.NewPartFromText(\", world!\"))},\n\t\t\t},\n\t\t\tafterEvent: func(ctx ExecutorContext, event *session.Event, processed *a2a.TaskArtifactUpdateEvent) error {\n\t\t\t\treturn fmt.Errorf(\"abort execution\")\n\t\t\t},\n\t\t\twantEvents: []a2a.Event{\n\t\t\t\ta2a.NewStatusUpdateEvent(task, a2a.TaskStateWorking, nil),\n\t\t\t\ttoTaskFailedUpdateEvent(task, fmt.Errorf(\"processor failed: abort execution\"), nil),\n\t\t\t},\n\t\t},\n\t}\n\n\tfor _, tc := range testCases {\n\t\tignoreFields := []cmp.Option{\n\t\t\tcmpopts.IgnoreFields(a2a.Message{}, \"ID\"),\n\t\t\tcmpopts.IgnoreFields(a2a.Artifact{}, \"ID\"),\n\t\t\tcmpopts.IgnoreFields(a2a.TaskStatus{}, \"Timestamp\"),\n\t\t\tcmpopts.IgnoreFields(a2a.TaskStatusUpdateEvent{}, \"Metadata\"),\n\t\t\tcmpopts.IgnoreFields(a2a.TaskArtifactUpdateEvent{}, \"Metadata\"),\n\t\t}\n\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\tagent, err := newEventReplayAgent(tc.events, nil)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"newEventReplayAgent() error = %v, want nil\", err)\n\t\t\t}\n\t\t\tsessionService := &testSessionService{Service: session.InMemoryService(), createErr: tc.createSessionFails}\n\t\t\trunnerConfig := runner.Config{AppName: agent.Name(), Agent: agent, SessionService: sessionService}\n\t\t\texecutor := NewExecutor(ExecutorConfig{\n\t\t\t\tRunnerConfig:          runnerConfig,\n\t\t\t\tBeforeExecuteCallback: tc.beforeExecution,\n\t\t\t\tAfterEventCallback:    tc.afterEvent,\n\t\t\t\tAfterExecuteCallback:  tc.afterExecution,\n\t\t\t})\n\t\t\tqueue := &testQueue{Queue: newInMemoryQueue(t)}\n\t\t\treqCtx := &a2asrv.RequestContext{TaskID: task.ID, ContextID: task.ContextID, Message: hiMsg, StoredTask: task}\n\n\t\t\terr = executor.Execute(t.Context(), reqCtx, queue)\n\t\t\tif err != nil && tc.wantErr == nil {\n\t\t\t\tt.Fatalf(\"executor.Execute() error = %v, want nil\", err)\n\t\t\t}\n\t\t\tif err == nil && tc.wantErr != nil {\n\t\t\t\tt.Fatalf(\"executor.Execute() error = nil, want %v\", tc.wantErr)\n\t\t\t}\n\t\t\tif tc.wantEvents != nil {\n\t\t\t\tif diff := cmp.Diff(tc.wantEvents, queue.events, ignoreFields...); diff != \"\" {\n\t\t\t\t\tt.Fatalf(\"executor.Execute() wrong events (+got,-want):\\ngot = %v\\nwant = %v\\ndiff = %s\", queue.events, tc.wantEvents, diff)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc startA2AServer(agentExecutor a2asrv.AgentExecutor) *httptest.Server {\n\trequestHandler := a2asrv.NewHandler(agentExecutor)\n\treturn httptest.NewServer(a2asrv.NewJSONRPCHandler(requestHandler))\n}\n\nfunc TestExecutor_Cancel_AfterEvent(t *testing.T) {\n\tsessionService := session.InMemoryService()\n\tchannel := make(chan struct{})\n\n\tagent, err := agent.New(agent.Config{\n\t\tName: \"test\",\n\t\tRun: func(ctx agent.InvocationContext) iter.Seq2[*session.Event, error] {\n\t\t\treturn func(yield func(*session.Event, error) bool) {\n\t\t\t\tdefer close(channel)\n\t\t\t\t<-ctx.Done()\n\t\t\t\tyield(nil, ctx.Err())\n\t\t\t}\n\t\t},\n\t})\n\tif err != nil {\n\t\tt.Fatalf(\"agent.New() error = %v, want nil\", err)\n\t}\n\n\texecutor := NewExecutor(ExecutorConfig{\n\t\tRunnerConfig: runner.Config{\n\t\t\tAppName:        agent.Name(),\n\t\t\tAgent:          agent,\n\t\t\tSessionService: sessionService,\n\t\t},\n\t})\n\n\tserver := startA2AServer(executor)\n\tdefer server.Close()\n\n\tcard := &a2a.AgentCard{\n\t\tName:               \"test\",\n\t\tURL:                server.URL,\n\t\tPreferredTransport: a2a.TransportProtocolJSONRPC,\n\t}\n\n\tclient, err := a2aclient.NewFromCard(t.Context(), card)\n\tif err != nil {\n\t\tt.Fatalf(\"a2aclient.NewFromCard() error = %v, want nil\", err)\n\t}\n\n\tmsgId := a2a.NewMessageID()\n\tblocking := false\n\n\tresult, sendErr := client.SendMessage(t.Context(), &a2a.MessageSendParams{\n\t\tMessage: &a2a.Message{ID: string(msgId), Parts: []a2a.Part{a2a.TextPart{Text: \"TEST\"}}, Role: a2a.MessageRoleUser},\n\t\tConfig:  &a2a.MessageSendConfig{Blocking: &blocking},\n\t})\n\n\tif sendErr != nil {\n\t\tt.Fatalf(\"client.SendMessage() error = %v, want nil\", sendErr)\n\t}\n\n\ttaskID := result.TaskInfo().TaskID\n\n\ttask, err := client.CancelTask(t.Context(), &a2a.TaskIDParams{ID: taskID})\n\tif err != nil {\n\t\tt.Fatalf(\"client.CancelTask() error = %v, want nil\", err)\n\t}\n\n\tif task.Status.State != a2a.TaskStateCanceled {\n\t\tt.Fatalf(\"executor.Cancel() state = %v, want %v\", task.Status.State, a2a.TaskStateCanceled)\n\t}\n\n\t// Verify that execution context is closed\n\tselect {\n\tcase <-channel:\n\t\tt.Log(\"Agent successfully unblocked\")\n\tcase <-time.After(1 * time.Second):\n\t\tt.Fatal(\"Agent did not unblock\")\n\t}\n}\n\nfunc TestExecutor_Converters(t *testing.T) {\n\ttask := &a2a.Task{ID: a2a.NewTaskID(), ContextID: a2a.NewContextID()}\n\thiMsg := a2a.NewMessageForTask(a2a.MessageRoleUser, task, a2a.TextPart{Text: \"hi\"})\n\n\tt.Run(\"A2APartConverter\", func(t *testing.T) {\n\t\tt.Run(\"modify input\", func(t *testing.T) {\n\t\t\tvar receivedText string\n\t\t\tagent, err := agent.New(agent.Config{\n\t\t\t\tName: \"test\",\n\t\t\t\tRun: func(ctx agent.InvocationContext) iter.Seq2[*session.Event, error] {\n\t\t\t\t\tif parts := ctx.UserContent().Parts; len(parts) > 0 {\n\t\t\t\t\t\treceivedText = parts[0].Text\n\t\t\t\t\t}\n\t\t\t\t\treturn func(yield func(*session.Event, error) bool) {}\n\t\t\t\t},\n\t\t\t})\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"agent.New() error = %v\", err)\n\t\t\t}\n\n\t\t\texecutor := NewExecutor(ExecutorConfig{\n\t\t\t\tRunnerConfig: runner.Config{AppName: agent.Name(), Agent: agent, SessionService: session.InMemoryService()},\n\t\t\t\tA2APartConverter: func(ctx context.Context, evt a2a.Event, part a2a.Part) (*genai.Part, error) {\n\t\t\t\t\tif p, ok := part.(a2a.TextPart); ok && p.Text == \"hi\" {\n\t\t\t\t\t\treturn genai.NewPartFromText(\"HELLO\"), nil\n\t\t\t\t\t}\n\t\t\t\t\treturn nil, nil\n\t\t\t\t},\n\t\t\t})\n\n\t\t\treqCtx := &a2asrv.RequestContext{TaskID: task.ID, ContextID: task.ContextID, Message: hiMsg, StoredTask: task}\n\t\t\tif err := executor.Execute(t.Context(), reqCtx, newInMemoryQueue(t)); err != nil {\n\t\t\t\tt.Fatalf(\"executor.Execute() error = %v\", err)\n\t\t\t}\n\n\t\t\tif receivedText != \"HELLO\" {\n\t\t\t\tt.Errorf(\"received text = %q, want %q\", receivedText, \"HELLO\")\n\t\t\t}\n\t\t})\n\n\t\tt.Run(\"filter input\", func(t *testing.T) {\n\t\t\tvar receivedParts int\n\t\t\tagent, err := agent.New(agent.Config{\n\t\t\t\tName: \"test\",\n\t\t\t\tRun: func(ctx agent.InvocationContext) iter.Seq2[*session.Event, error] {\n\t\t\t\t\treceivedParts = len(ctx.UserContent().Parts)\n\t\t\t\t\treturn func(yield func(*session.Event, error) bool) {}\n\t\t\t\t},\n\t\t\t})\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"agent.New() error = %v\", err)\n\t\t\t}\n\n\t\t\texecutor := NewExecutor(ExecutorConfig{\n\t\t\t\tRunnerConfig: runner.Config{AppName: agent.Name(), Agent: agent, SessionService: session.InMemoryService()},\n\t\t\t\tA2APartConverter: func(ctx context.Context, evt a2a.Event, part a2a.Part) (*genai.Part, error) {\n\t\t\t\t\treturn nil, nil\n\t\t\t\t},\n\t\t\t})\n\n\t\t\treqCtx := &a2asrv.RequestContext{TaskID: task.ID, ContextID: task.ContextID, Message: hiMsg, StoredTask: task}\n\t\t\tif err := executor.Execute(t.Context(), reqCtx, newInMemoryQueue(t)); err != nil {\n\t\t\t\tt.Fatalf(\"executor.Execute() error = %v\", err)\n\t\t\t}\n\n\t\t\tif receivedParts != 0 {\n\t\t\t\tt.Errorf(\"received parts count = %d, want 0\", receivedParts)\n\t\t\t}\n\t\t})\n\t})\n\n\tt.Run(\"GenAIPartConverter\", func(t *testing.T) {\n\t\tagentEvents := []*session.Event{\n\t\t\t{LLMResponse: model.LLMResponse{\n\t\t\t\tContent: &genai.Content{Parts: []*genai.Part{genai.NewPartFromText(\"world\")}},\n\t\t\t}},\n\t\t}\n\n\t\tt.Run(\"modify output\", func(t *testing.T) {\n\t\t\tagent, err := newEventReplayAgent(agentEvents, nil)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"newEventReplayAgent() error = %v\", err)\n\t\t\t}\n\n\t\t\texecutor := NewExecutor(ExecutorConfig{\n\t\t\t\tRunnerConfig: runner.Config{AppName: agent.Name(), Agent: agent, SessionService: session.InMemoryService()},\n\t\t\t\tGenAIPartConverter: func(ctx context.Context, evt *session.Event, part *genai.Part) (a2a.Part, error) {\n\t\t\t\t\tif part.Text == \"world\" {\n\t\t\t\t\t\treturn a2a.TextPart{Text: \"WORLD\"}, nil\n\t\t\t\t\t}\n\t\t\t\t\treturn a2a.TextPart{Text: part.Text}, nil\n\t\t\t\t},\n\t\t\t})\n\n\t\t\tqueue := &testQueue{Queue: newInMemoryQueue(t)}\n\t\t\treqCtx := &a2asrv.RequestContext{TaskID: task.ID, ContextID: task.ContextID, Message: hiMsg, StoredTask: task}\n\t\t\tif err := executor.Execute(t.Context(), reqCtx, queue); err != nil {\n\t\t\t\tt.Fatalf(\"executor.Execute() error = %v\", err)\n\t\t\t}\n\n\t\t\tfound := false\n\t\t\tfor _, e := range queue.events {\n\t\t\t\tif ae, ok := e.(*a2a.TaskArtifactUpdateEvent); ok {\n\t\t\t\t\tfor _, p := range ae.Artifact.Parts {\n\t\t\t\t\t\tif tp, ok := p.(a2a.TextPart); ok && tp.Text == \"WORLD\" {\n\t\t\t\t\t\t\tfound = true\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif !found {\n\t\t\t\tt.Errorf(\"did not find 'WORLD' in events: %v\", queue.events)\n\t\t\t}\n\t\t})\n\n\t\tt.Run(\"filter output\", func(t *testing.T) {\n\t\t\tagent, err := newEventReplayAgent(agentEvents, nil)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"newEventReplayAgent() error = %v\", err)\n\t\t\t}\n\n\t\t\texecutor := NewExecutor(ExecutorConfig{\n\t\t\t\tRunnerConfig: runner.Config{AppName: agent.Name(), Agent: agent, SessionService: session.InMemoryService()},\n\t\t\t\tGenAIPartConverter: func(ctx context.Context, evt *session.Event, part *genai.Part) (a2a.Part, error) {\n\t\t\t\t\treturn nil, nil\n\t\t\t\t},\n\t\t\t})\n\n\t\t\tqueue := &testQueue{Queue: newInMemoryQueue(t)}\n\t\t\treqCtx := &a2asrv.RequestContext{TaskID: task.ID, ContextID: task.ContextID, Message: hiMsg, StoredTask: task}\n\t\t\tif err := executor.Execute(t.Context(), reqCtx, queue); err != nil {\n\t\t\t\tt.Fatalf(\"executor.Execute() error = %v\", err)\n\t\t\t}\n\n\t\t\tfor _, e := range queue.events {\n\t\t\t\tif ae, ok := e.(*a2a.TaskArtifactUpdateEvent); ok {\n\t\t\t\t\tif len(ae.Artifact.Parts) != 0 {\n\t\t\t\t\t\tt.Errorf(\"found %d parts but expected 0\", len(ae.Artifact.Parts))\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t})\n}\n\nfunc TestExecutor_OutputArtifactPerEvent(t *testing.T) {\n\ttask := &a2a.Task{ID: a2a.NewTaskID(), ContextID: a2a.NewContextID()}\n\thiMsg := a2a.NewMessageForTask(a2a.MessageRoleUser, task, a2a.TextPart{Text: \"hi\"})\n\n\ttestCases := []struct {\n\t\tname             string\n\t\tevents           []*session.Event\n\t\twantEvents       []a2a.Event\n\t\twantArtifactMeta []map[string]any\n\t}{\n\t\t{\n\t\t\tname: \"single artifact per event chain\",\n\t\t\tevents: []*session.Event{\n\t\t\t\t{LLMResponse: modelPartialResponseFromParts(genai.NewPartFromText(\"Hello, \")), Author: \"agent\"},\n\t\t\t\t{LLMResponse: modelPartialResponseFromParts(genai.NewPartFromText(\"world!\")), Author: \"agent\"},\n\t\t\t\t{LLMResponse: modelResponseFromParts(genai.NewPartFromText(\"Hello, world!\")), Author: \"agent\"},\n\t\t\t},\n\t\t\twantEvents: []a2a.Event{\n\t\t\t\ta2a.NewStatusUpdateEvent(task, a2a.TaskStateWorking, nil),\n\t\t\t\t&a2a.TaskArtifactUpdateEvent{\n\t\t\t\t\tArtifact: &a2a.Artifact{Parts: a2a.ContentParts{a2a.TextPart{Text: \"Hello, \"}}},\n\t\t\t\t\tAppend:   false, LastChunk: false,\n\t\t\t\t},\n\t\t\t\t&a2a.TaskArtifactUpdateEvent{\n\t\t\t\t\tArtifact: &a2a.Artifact{Parts: a2a.ContentParts{a2a.TextPart{Text: \"world!\"}}},\n\t\t\t\t\tAppend:   true, LastChunk: false,\n\t\t\t\t},\n\t\t\t\t&a2a.TaskArtifactUpdateEvent{\n\t\t\t\t\tArtifact: &a2a.Artifact{Parts: a2a.ContentParts{a2a.TextPart{Text: \"Hello, world!\"}}},\n\t\t\t\t\tAppend:   false, LastChunk: true,\n\t\t\t\t},\n\t\t\t\tnewFinalStatusUpdate(task, a2a.TaskStateCompleted, nil),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"multiple authors\",\n\t\t\tevents: []*session.Event{\n\t\t\t\t{LLMResponse: modelPartialResponseFromParts(genai.NewPartFromText(\"Agent1: H\")), Author: \"agent1\"},\n\t\t\t\t{LLMResponse: modelPartialResponseFromParts(genai.NewPartFromText(\"Agent2: W\")), Author: \"agent2\"},\n\t\t\t\t{LLMResponse: modelResponseFromParts(genai.NewPartFromText(\"Agent1: Hello\")), Author: \"agent1\"},\n\t\t\t\t{LLMResponse: modelResponseFromParts(genai.NewPartFromText(\"Agent2: World\")), Author: \"agent2\"},\n\t\t\t},\n\t\t\twantEvents: []a2a.Event{\n\t\t\t\ta2a.NewStatusUpdateEvent(task, a2a.TaskStateWorking, nil),\n\t\t\t\t&a2a.TaskArtifactUpdateEvent{\n\t\t\t\t\tArtifact: &a2a.Artifact{Parts: a2a.ContentParts{a2a.TextPart{Text: \"Agent1: H\"}}},\n\t\t\t\t\tAppend:   false, LastChunk: false,\n\t\t\t\t},\n\t\t\t\t&a2a.TaskArtifactUpdateEvent{\n\t\t\t\t\tArtifact: &a2a.Artifact{Parts: a2a.ContentParts{a2a.TextPart{Text: \"Agent2: W\"}}},\n\t\t\t\t\tAppend:   false, LastChunk: false,\n\t\t\t\t},\n\t\t\t\t&a2a.TaskArtifactUpdateEvent{\n\t\t\t\t\tArtifact: &a2a.Artifact{Parts: a2a.ContentParts{a2a.TextPart{Text: \"Agent1: Hello\"}}},\n\t\t\t\t\tAppend:   false, LastChunk: true,\n\t\t\t\t},\n\t\t\t\t&a2a.TaskArtifactUpdateEvent{\n\t\t\t\t\tArtifact: &a2a.Artifact{Parts: a2a.ContentParts{a2a.TextPart{Text: \"Agent2: World\"}}},\n\t\t\t\t\tAppend:   false, LastChunk: true,\n\t\t\t\t},\n\t\t\t\tnewFinalStatusUpdate(task, a2a.TaskStateCompleted, nil),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"metadata and thoughts\",\n\t\t\tevents: []*session.Event{\n\t\t\t\t{\n\t\t\t\t\tLLMResponse:  modelPartialResponseFromParts(&genai.Part{Text: \"Thinking...\", Thought: true}),\n\t\t\t\t\tAuthor:       \"agent\",\n\t\t\t\t\tInvocationID: \"inv1\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tLLMResponse:  modelResponseFromParts(genai.NewPartFromText(\"Done\")),\n\t\t\t\t\tAuthor:       \"agent\",\n\t\t\t\t\tInvocationID: \"inv1\",\n\t\t\t\t},\n\t\t\t},\n\t\t\twantEvents: []a2a.Event{\n\t\t\t\ta2a.NewStatusUpdateEvent(task, a2a.TaskStateWorking, nil),\n\t\t\t\t&a2a.TaskArtifactUpdateEvent{\n\t\t\t\t\tArtifact: &a2a.Artifact{\n\t\t\t\t\t\tParts: a2a.ContentParts{a2a.TextPart{\n\t\t\t\t\t\t\tText:     \"Thinking...\",\n\t\t\t\t\t\t\tMetadata: map[string]any{ToA2AMetaKey(\"thought\"): true},\n\t\t\t\t\t\t}},\n\t\t\t\t\t},\n\t\t\t\t\tAppend: false, LastChunk: false,\n\t\t\t\t},\n\t\t\t\t&a2a.TaskArtifactUpdateEvent{\n\t\t\t\t\tArtifact: &a2a.Artifact{\n\t\t\t\t\t\tParts: a2a.ContentParts{a2a.TextPart{Text: \"Done\"}},\n\t\t\t\t\t},\n\t\t\t\t\tAppend: false, LastChunk: true,\n\t\t\t\t},\n\t\t\t\tnewFinalStatusUpdate(task, a2a.TaskStateCompleted, nil),\n\t\t\t},\n\t\t\twantArtifactMeta: []map[string]any{\n\t\t\t\t{ToA2AMetaKey(\"invocation_id\"): \"inv1\"},\n\t\t\t\t{ToA2AMetaKey(\"invocation_id\"): \"inv1\"},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"mixed segments\",\n\t\t\tevents: []*session.Event{\n\t\t\t\t{\n\t\t\t\t\tLLMResponse: modelResponseFromParts(\n\t\t\t\t\t\t&genai.Part{Text: \"Thought part\", Thought: true},\n\t\t\t\t\t\tgenai.NewPartFromText(\"Text part\"),\n\t\t\t\t\t),\n\t\t\t\t\tAuthor: \"agent\",\n\t\t\t\t},\n\t\t\t},\n\t\t\twantEvents: []a2a.Event{\n\t\t\t\ta2a.NewStatusUpdateEvent(task, a2a.TaskStateWorking, nil),\n\t\t\t\t&a2a.TaskArtifactUpdateEvent{\n\t\t\t\t\tArtifact: &a2a.Artifact{\n\t\t\t\t\t\tParts: a2a.ContentParts{\n\t\t\t\t\t\t\ta2a.TextPart{\n\t\t\t\t\t\t\t\tText:     \"Thought part\",\n\t\t\t\t\t\t\t\tMetadata: map[string]any{ToA2AMetaKey(\"thought\"): true},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\ta2a.TextPart{Text: \"Text part\"},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tAppend: false, LastChunk: true,\n\t\t\t\t},\n\t\t\t\tnewFinalStatusUpdate(task, a2a.TaskStateCompleted, nil),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"sequential distinct artifact chains\",\n\t\t\tevents: []*session.Event{\n\t\t\t\t{LLMResponse: modelPartialResponseFromParts(genai.NewPartFromText(\"1.a\")), Author: \"agent\"},\n\t\t\t\t{LLMResponse: modelResponseFromParts(genai.NewPartFromText(\"1.final\")), Author: \"agent\"},\n\t\t\t\t{LLMResponse: modelPartialResponseFromParts(genai.NewPartFromText(\"2.a\")), Author: \"agent\"},\n\t\t\t\t{LLMResponse: modelResponseFromParts(genai.NewPartFromText(\"2.final\")), Author: \"agent\"},\n\t\t\t},\n\t\t\twantEvents: []a2a.Event{\n\t\t\t\ta2a.NewStatusUpdateEvent(task, a2a.TaskStateWorking, nil),\n\t\t\t\t&a2a.TaskArtifactUpdateEvent{\n\t\t\t\t\tArtifact: &a2a.Artifact{Parts: a2a.ContentParts{a2a.TextPart{Text: \"1.a\"}}},\n\t\t\t\t\tAppend:   false, LastChunk: false,\n\t\t\t\t},\n\t\t\t\t&a2a.TaskArtifactUpdateEvent{\n\t\t\t\t\tArtifact: &a2a.Artifact{Parts: a2a.ContentParts{a2a.TextPart{Text: \"1.final\"}}},\n\t\t\t\t\tAppend:   false, LastChunk: true,\n\t\t\t\t},\n\t\t\t\t&a2a.TaskArtifactUpdateEvent{\n\t\t\t\t\tArtifact: &a2a.Artifact{Parts: a2a.ContentParts{a2a.TextPart{Text: \"2.a\"}}},\n\t\t\t\t\tAppend:   false, LastChunk: false,\n\t\t\t\t},\n\t\t\t\t&a2a.TaskArtifactUpdateEvent{\n\t\t\t\t\tArtifact: &a2a.Artifact{Parts: a2a.ContentParts{a2a.TextPart{Text: \"2.final\"}}},\n\t\t\t\t\tAppend:   false, LastChunk: true,\n\t\t\t\t},\n\t\t\t\tnewFinalStatusUpdate(task, a2a.TaskStateCompleted, nil),\n\t\t\t},\n\t\t},\n\t}\n\n\tfor _, tc := range testCases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\tagent, _ := newEventReplayAgent(tc.events, nil)\n\t\t\texecutor := NewExecutor(ExecutorConfig{\n\t\t\t\tRunnerConfig: runner.Config{AppName: agent.Name(), Agent: agent, SessionService: session.InMemoryService()},\n\t\t\t\tOutputMode:   OutputArtifactPerEvent,\n\t\t\t})\n\n\t\t\tqueue := &testQueue{Queue: newInMemoryQueue(t)}\n\t\t\treqCtx := &a2asrv.RequestContext{TaskID: task.ID, ContextID: task.ContextID, Message: hiMsg, StoredTask: task}\n\n\t\t\tif err := executor.Execute(t.Context(), reqCtx, queue); err != nil {\n\t\t\t\tt.Fatalf(\"executor.Execute() error = %v\", err)\n\t\t\t}\n\n\t\t\tignoreOptions := []cmp.Option{\n\t\t\t\tcmpopts.IgnoreFields(a2a.Message{}, \"ID\"),\n\t\t\t\tcmpopts.IgnoreFields(a2a.Artifact{}, \"ID\", \"Metadata\"), // checked manually\n\t\t\t\tcmpopts.IgnoreFields(a2a.TaskStatus{}, \"Timestamp\"),\n\t\t\t\tcmpopts.IgnoreFields(a2a.TaskStatusUpdateEvent{}, \"Metadata\", \"TaskID\", \"ContextID\"),\n\t\t\t\tcmpopts.IgnoreFields(a2a.TaskArtifactUpdateEvent{}, \"Metadata\", \"TaskID\", \"ContextID\"),\n\t\t\t}\n\t\t\tif len(queue.events) != len(tc.wantEvents) {\n\t\t\t\tt.Fatalf(\"got %d events, want %d\", len(queue.events), len(tc.wantEvents))\n\t\t\t}\n\n\t\t\tauthorToID, lastFinishedID := make(map[string]a2a.ArtifactID), make(map[string]a2a.ArtifactID)\n\t\t\tartifactCount := 0\n\n\t\t\tfor i := range queue.events {\n\t\t\t\tgot := queue.events[i]\n\t\t\t\twant := tc.wantEvents[i]\n\n\t\t\t\tif diff := cmp.Diff(want, got, ignoreOptions...); diff != \"\" {\n\t\t\t\t\tt.Errorf(\"event[%d] mismatch (-want +got):\\n%s\", i, diff)\n\t\t\t\t}\n\n\t\t\t\t// Metadata check for cases that care about it\n\t\t\t\tif ge, ok := got.(*a2a.TaskArtifactUpdateEvent); ok {\n\t\t\t\t\tif artifactCount < len(tc.wantArtifactMeta) {\n\t\t\t\t\t\twantMeta := tc.wantArtifactMeta[artifactCount]\n\t\t\t\t\t\tfor k, v := range wantMeta {\n\t\t\t\t\t\t\tif gotV := ge.Artifact.Metadata[k]; gotV != v {\n\t\t\t\t\t\t\t\tt.Errorf(\"event[%d] Metadata[%s] = %v, want %v\", i, k, gotV, v)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tartifactCount++\n\t\t\t\t}\n\n\t\t\t\t// Custom check for ArtifactID consistency\n\t\t\t\tif ge, ok := got.(*a2a.TaskArtifactUpdateEvent); ok {\n\t\t\t\t\tauthor := tc.events[i-1].Author // i-1 because first event is TaskStatusUpdateEvent\n\t\t\t\t\tif id, ok := authorToID[author]; ok {\n\t\t\t\t\t\tif ge.Artifact.ID != id {\n\t\t\t\t\t\t\tt.Errorf(\"event[%d] expected ArtifactID %v, got %v\", i, id, ge.Artifact.ID)\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// New artifact stream started for this author\n\t\t\t\t\t\tif prevID, ok := lastFinishedID[author]; ok {\n\t\t\t\t\t\t\tif ge.Artifact.ID == prevID {\n\t\t\t\t\t\t\t\tt.Errorf(\"event[%d] expected NEW ArtifactID, but got same as previous chain: %v\", i, ge.Artifact.ID)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tauthorToID[author] = ge.Artifact.ID\n\t\t\t\t\t}\n\t\t\t\t\tif !tc.events[i-1].Partial {\n\t\t\t\t\t\t// Stream ended for this author\n\t\t\t\t\t\tlastFinishedID[author] = ge.Artifact.ID\n\t\t\t\t\t\tdelete(authorToID, author)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "server/adka2a/input_required.go",
    "content": "// Copyright 2026 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage adka2a\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"slices\"\n\n\t\"github.com/a2aproject/a2a-go/a2a\"\n\t\"github.com/a2aproject/a2a-go/a2asrv\"\n\t\"github.com/a2aproject/a2a-go/log\"\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/session\"\n)\n\ntype inputRequiredProcessor struct {\n\treqCtx        *a2asrv.RequestContext\n\tevent         *a2a.TaskStatusUpdateEvent\n\tpartConverter GenAIPartConverter\n\t// handles possible duplication in partial and non-partial events\n\taddedParts []*genai.Part\n}\n\nfunc newInputRequiredProcessor(reqCtx *a2asrv.RequestContext, partConverter GenAIPartConverter) *inputRequiredProcessor {\n\treturn &inputRequiredProcessor{reqCtx: reqCtx, partConverter: partConverter}\n}\n\n// process handles long-running function tool calls by accumulating them for the final task status update.\n// If a part was incorporated into the final task status update the original event is modified to not include it,\n// so that parts are not duplicated in the response.\nfunc (p *inputRequiredProcessor) process(ctx context.Context, event *session.Event) (*session.Event, error) {\n\tresp := event.LLMResponse\n\tif resp.Content == nil {\n\t\treturn event, nil\n\t}\n\n\tvar longRunningCallIDs []string\n\tvar inputRequiredParts []*genai.Part\n\tvar remainingParts []*genai.Part\n\tfor _, part := range resp.Content.Parts {\n\t\tcallID := \"\"\n\t\tif part.FunctionCall != nil && slices.Contains(event.LongRunningToolIDs, part.FunctionCall.ID) {\n\t\t\tcallID = part.FunctionCall.ID\n\t\t}\n\t\tif p.isLongRunningResponse(event, part) {\n\t\t\tcallID = part.FunctionResponse.ID\n\t\t}\n\t\tif callID == \"\" {\n\t\t\tremainingParts = append(remainingParts, part)\n\t\t\tcontinue\n\t\t}\n\t\tadded := slices.ContainsFunc(p.addedParts, func(p *genai.Part) bool {\n\t\t\tif part.FunctionCall != nil && p.FunctionCall != nil && part.FunctionCall.ID == p.FunctionCall.ID {\n\t\t\t\treturn true\n\t\t\t}\n\t\t\treturn part.FunctionResponse != nil && p.FunctionResponse != nil && part.FunctionResponse.ID == p.FunctionResponse.ID\n\t\t})\n\t\tif added {\n\t\t\tcontinue\n\t\t}\n\t\tp.addedParts = append(p.addedParts, part)\n\t\tinputRequiredParts = append(inputRequiredParts, part)\n\t\tlongRunningCallIDs = append(longRunningCallIDs, callID)\n\t}\n\n\tif len(inputRequiredParts) > 0 {\n\t\ta2aParts, err := p.convertParts(ctx, event, inputRequiredParts, longRunningCallIDs)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"failed to convert input required parts to A2A parts: %w\", err)\n\t\t}\n\n\t\tif p.event != nil {\n\t\t\tp.event.Status.Message.Parts = append(p.event.Status.Message.Parts, a2aParts...)\n\t\t} else {\n\t\t\tmsg := a2a.NewMessage(a2a.MessageRoleAgent, a2aParts...)\n\t\t\tev := a2a.NewStatusUpdateEvent(p.reqCtx, a2a.TaskStateInputRequired, msg)\n\t\t\tev.Final = true\n\t\t\tp.event = ev\n\t\t}\n\t}\n\n\tif len(remainingParts) == len(resp.Content.Parts) {\n\t\treturn event, nil\n\t}\n\n\tmodifiedEvent := *event\n\tnewContent := *resp.Content\n\tnewContent.Parts = remainingParts\n\tmodifiedEvent.LLMResponse.Content = &newContent\n\n\treturn &modifiedEvent, nil\n}\n\nfunc (p *inputRequiredProcessor) convertParts(ctx context.Context, event *session.Event, parts []*genai.Part, longRunningCallIDs []string) ([]a2a.Part, error) {\n\tif p.partConverter == nil {\n\t\treturn ToA2AParts(parts, longRunningCallIDs)\n\t}\n\tconverted := make([]a2a.Part, 0, len(parts))\n\tfor _, part := range parts {\n\t\tcp, err := p.partConverter(ctx, event, part)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tif cp == nil {\n\t\t\tcontinue\n\t\t}\n\t\tconverted = append(converted, cp)\n\t}\n\treturn converted, nil\n}\n\nfunc (p *inputRequiredProcessor) isLongRunningResponse(event *session.Event, part *genai.Part) bool {\n\tif part.FunctionResponse == nil {\n\t\treturn false\n\t}\n\tid := part.FunctionResponse.ID\n\tif slices.Contains(event.LongRunningToolIDs, id) {\n\t\treturn true\n\t}\n\tif p.event == nil {\n\t\treturn false\n\t}\n\tfor _, part := range p.event.Status.Message.Parts {\n\t\tif dp, ok := part.(a2a.DataPart); ok {\n\t\t\tif typeVal, ok := dp.Metadata[a2aDataPartMetaTypeKey]; ok && typeVal == a2aDataPartTypeFunctionCall {\n\t\t\t\tif callID, ok := dp.Data[\"id\"].(string); ok && callID == id {\n\t\t\t\t\treturn true\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn false\n}\n\n// handleInputRequired checks if the input message contains responses to all function calls\n// that happened during the previous invocation and were recorded in the Task input-required state message.\n// If a non-nil event is returned the invoking code needs to use the event as the result of the execution\nfunc handleInputRequired(reqCtx *a2asrv.RequestContext, content *genai.Content) (*a2a.TaskStatusUpdateEvent, error) {\n\tif reqCtx.StoredTask == nil {\n\t\treturn nil, nil\n\t}\n\ttask, statusMsg := reqCtx.StoredTask, reqCtx.StoredTask.Status.Message\n\tif task.Status.State != a2a.TaskStateInputRequired || statusMsg == nil {\n\t\treturn nil, nil\n\t}\n\n\ttaskParts, err := ToGenAIParts(statusMsg.Parts)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to parse task status message: %w\", err)\n\t}\n\n\tfor _, statusPart := range taskParts {\n\t\tif statusPart.FunctionCall == nil {\n\t\t\tcontinue\n\t\t}\n\t\thasMatchingResponse := slices.ContainsFunc(content.Parts, func(p *genai.Part) bool {\n\t\t\treturn p.FunctionResponse != nil && p.FunctionResponse.ID == statusPart.FunctionCall.ID\n\t\t})\n\t\tif !hasMatchingResponse {\n\t\t\tparts := makeInputMissingErrorMessage(statusMsg.Parts, statusPart.FunctionCall.ID)\n\t\t\tmsg := a2a.NewMessageForTask(a2a.MessageRoleAgent, reqCtx.StoredTask, parts...)\n\t\t\tevent := a2a.NewStatusUpdateEvent(reqCtx, a2a.TaskStateInputRequired, msg)\n\t\t\tevent.Final = true\n\t\t\treturn event, nil\n\t\t}\n\t}\n\treturn nil, nil\n}\n\nfunc getSubagentTasksToCancel(ctx context.Context, status a2a.TaskStatus, session session.Session) ([]subagentTask, error) {\n\tpendingCallIDs, err := getPendingLongRunningCallIDs(status)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"malformed task status: %w\", err)\n\t}\n\tif len(pendingCallIDs) == 0 {\n\t\treturn nil, nil\n\t}\n\n\tfoundCalls := 0\n\tvar tasksToCancel []subagentTask\n\tevents := session.Events()\n\tfor i := events.Len() - 1; i >= 0; i-- {\n\t\tevent := events.At(i)\n\t\tif event.Content != nil {\n\t\t\tif slices.ContainsFunc(event.Content.Parts, func(p *genai.Part) bool {\n\t\t\t\treturn p.FunctionCall != nil && slices.Contains(pendingCallIDs, p.FunctionCall.ID)\n\t\t\t}) {\n\t\t\t\tfoundCalls++\n\t\t\t\tif taskID, _ := GetA2ATaskInfo(event); taskID != \"\" {\n\t\t\t\t\ttasksToCancel = append(tasksToCancel, subagentTask{agentName: event.Author, taskID: a2a.TaskID(taskID)})\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif foundCalls == len(pendingCallIDs) {\n\t\t\tbreak\n\t\t}\n\t}\n\n\tif foundCalls < len(pendingCallIDs) {\n\t\tlog.Warn(ctx, \"could not find all function calls from status message\", \"found\", foundCalls, \"total\", len(pendingCallIDs))\n\t}\n\n\treturn tasksToCancel, nil\n}\n\nfunc getPendingLongRunningCallIDs(status a2a.TaskStatus) ([]string, error) {\n\tstatusMsg := status.Message\n\tif status.State != a2a.TaskStateInputRequired || statusMsg == nil {\n\t\treturn nil, nil\n\t}\n\ttaskParts, err := ToGenAIParts(statusMsg.Parts)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to parse task status message: %w\", err)\n\t}\n\tvar callIDs []string\n\tfor _, statusPart := range taskParts {\n\t\tif statusPart.FunctionCall != nil {\n\t\t\tcallIDs = append(callIDs, statusPart.FunctionCall.ID)\n\t\t}\n\t}\n\treturn callIDs, nil\n}\n\nfunc makeInputMissingErrorMessage(inputRequiredParts []a2a.Part, callID string) []a2a.Part {\n\terrPart := a2a.TextPart{\n\t\tText:     fmt.Sprintf(\"no input provided for function call ID %q\", callID),\n\t\tMetadata: map[string]any{\"validation_error\": true},\n\t}\n\tvar preservedParts []a2a.Part\n\tfor _, p := range inputRequiredParts {\n\t\tif meta := p.Meta(); meta != nil {\n\t\t\tif v, ok := meta[\"validation_error\"].(bool); ok && v {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\t\tpreservedParts = append(preservedParts, p)\n\t}\n\treturn append(preservedParts, errPart)\n}\n\ntype subagentTask struct {\n\tagentName string\n\ttaskID    a2a.TaskID\n}\n"
  },
  {
    "path": "server/adka2a/metadata.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage adka2a\n\nimport (\n\t\"context\"\n\t\"maps\"\n\n\t\"github.com/a2aproject/a2a-go/a2a\"\n\t\"github.com/a2aproject/a2a-go/a2asrv\"\n\n\t\"google.golang.org/adk/internal/converters\"\n\t\"google.golang.org/adk/session\"\n)\n\nvar (\n\tcustomMetaTaskIDKey    = ToADKMetaKey(\"task_id\")\n\tcustomMetaContextIDKey = ToADKMetaKey(\"context_id\")\n\n\tmetadataEscalateKey        = ToA2AMetaKey(\"escalate\")\n\tmetadataTransferToAgentKey = ToA2AMetaKey(\"transfer_to_agent\")\n\tmetadataErrorCodeKey       = ToA2AMetaKey(\"error_code\")\n\tmetadataCitationKey        = ToA2AMetaKey(\"citation_metadata\")\n\tmetadataGroundingKey       = ToA2AMetaKey(\"grounding_metadata\")\n\tmetadataUsageKey           = ToA2AMetaKey(\"usage_metadata\")\n\tmetadataCustomMetaKey      = ToA2AMetaKey(\"custom_metadata\")\n\tmetadataPartialKey         = ToA2AMetaKey(\"partial\")\n)\n\n// ToA2AMetaKey adds a prefix used to differentiage ADK-related values stored in Metadata an A2A event.\nfunc ToA2AMetaKey(key string) string {\n\treturn \"adk_\" + key\n}\n\n// ToADKMetaKey adds a prefix used to differentiage A2A-related values stored in custom metadata of an ADK session event.\nfunc ToADKMetaKey(key string) string {\n\treturn \"a2a:\" + key\n}\n\ntype invocationMeta struct {\n\tuserID    string\n\tsessionID string\n\tagentName string\n\treqCtx    *a2asrv.RequestContext\n\teventMeta map[string]any\n}\n\nfunc toInvocationMeta(ctx context.Context, config ExecutorConfig, reqCtx *a2asrv.RequestContext) invocationMeta {\n\tuserID, sessionID := \"A2A_USER_\"+reqCtx.ContextID, reqCtx.ContextID\n\n\t// a2a sdk attaches authn info to the call context, use it when provided\n\tif callCtx, ok := a2asrv.CallContextFrom(ctx); ok {\n\t\tif callCtx.User != nil && callCtx.User.Name() != \"\" {\n\t\t\tuserID = callCtx.User.Name()\n\t\t}\n\t}\n\n\tmeta := map[string]any{\n\t\tToA2AMetaKey(\"app_name\"):   config.RunnerConfig.AppName,\n\t\tToA2AMetaKey(\"user_id\"):    userID,\n\t\tToA2AMetaKey(\"session_id\"): sessionID,\n\t}\n\n\treturn invocationMeta{\n\t\tuserID:    userID,\n\t\tsessionID: sessionID,\n\t\tagentName: config.RunnerConfig.Agent.Name(),\n\t\teventMeta: meta,\n\t\treqCtx:    reqCtx,\n\t}\n}\n\nfunc toEventMeta(meta invocationMeta, event *session.Event) (map[string]any, error) {\n\tresult := make(map[string]any)\n\tmaps.Copy(result, meta.eventMeta)\n\n\tfor k, v := range map[string]string{\n\t\t\"invocation_id\": event.InvocationID,\n\t\t\"author\":        event.Author,\n\t\t\"branch\":        event.Branch,\n\t} {\n\t\tif v != \"\" {\n\t\t\tresult[ToA2AMetaKey(k)] = v\n\t\t}\n\t}\n\n\tif err := addMeta(result, metadataCitationKey, event.CitationMetadata); err != nil {\n\t\treturn nil, err\n\t}\n\tif err := addMeta(result, metadataGroundingKey, event.GroundingMetadata); err != nil {\n\t\treturn nil, err\n\t}\n\tif err := addMeta(result, metadataUsageKey, event.UsageMetadata); err != nil {\n\t\treturn nil, err\n\t}\n\tif event.CustomMetadata != nil {\n\t\tresult[metadataCustomMetaKey] = event.CustomMetadata\n\t}\n\tif event.LLMResponse.ErrorCode != \"\" {\n\t\tresult[metadataErrorCodeKey] = event.LLMResponse.ErrorCode\n\t}\n\n\treturn result, nil\n}\n\nfunc setActionsMeta(meta map[string]any, actions session.EventActions) map[string]any {\n\tif actions.TransferToAgent == \"\" && !actions.Escalate { // if meta was nil, it should remain nil\n\t\treturn meta\n\t}\n\tif meta == nil {\n\t\tmeta = map[string]any{}\n\t}\n\tif actions.Escalate {\n\t\tmeta[metadataEscalateKey] = true\n\t}\n\tif actions.TransferToAgent != \"\" {\n\t\tmeta[metadataTransferToAgentKey] = actions.TransferToAgent\n\t}\n\treturn meta\n}\n\nfunc processA2AMeta(a2aEvent a2a.Event, event *session.Event) error {\n\ttaskInfo, meta := a2aEvent.TaskInfo(), a2aEvent.Meta()\n\n\tif au, ok := a2aEvent.(*a2a.TaskArtifactUpdateEvent); ok && len(au.Artifact.Metadata) > 0 {\n\t\tif meta == nil {\n\t\t\tmeta = make(map[string]any)\n\t\t}\n\t\tmaps.Copy(meta, au.Artifact.Metadata)\n\t}\n\n\tif err := processMeta(metadataCitationKey, meta, &event.CitationMetadata); err != nil {\n\t\treturn err\n\t}\n\tif err := processMeta(metadataGroundingKey, meta, &event.GroundingMetadata); err != nil {\n\t\treturn err\n\t}\n\tif err := processMeta(metadataUsageKey, meta, &event.UsageMetadata); err != nil {\n\t\treturn err\n\t}\n\n\tevent.CustomMetadata = ToCustomMetadata(taskInfo.TaskID, taskInfo.ContextID)\n\tif um, ok := meta[metadataCustomMetaKey].(map[string]any); ok {\n\t\tif event.CustomMetadata == nil {\n\t\t\tevent.CustomMetadata = make(map[string]any)\n\t\t}\n\t\tmaps.Copy(event.CustomMetadata, um)\n\t}\n\n\tif ec, ok := meta[metadataErrorCodeKey].(string); ok {\n\t\tevent.LLMResponse.ErrorCode = ec\n\t}\n\n\tevent.Actions = toEventActions(a2aEvent.Meta())\n\treturn nil\n}\n\nfunc addMeta(result map[string]any, key string, data any) error {\n\tif data == nil {\n\t\treturn nil\n\t}\n\tv, err := converters.ToMapStructure(data)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif v == nil {\n\t\treturn nil\n\t}\n\n\tresult[key] = v\n\treturn nil\n}\n\nfunc processMeta[T any](key string, meta map[string]any, target **T) error {\n\tif m, ok := meta[key].(map[string]any); ok {\n\t\tconverted, err := converters.FromMapStructure[T](m)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t*target = converted\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "server/adka2a/metadata_test.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage adka2a\n\nimport (\n\t\"testing\"\n\n\t\"github.com/a2aproject/a2a-go/a2a\"\n\t\"github.com/google/go-cmp/cmp\"\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/model\"\n\t\"google.golang.org/adk/session\"\n)\n\nfunc TestMetadataTwoWayConversion(t *testing.T) {\n\ttestCases := []struct {\n\t\tname    string\n\t\tevent   *session.Event\n\t\ta2aMeta map[string]any\n\t}{\n\t\t{\n\t\t\tname: \"error code\",\n\t\t\tevent: &session.Event{\n\t\t\t\tLLMResponse: model.LLMResponse{ErrorCode: \"102\"},\n\t\t\t},\n\t\t\ta2aMeta: map[string]any{metadataErrorCodeKey: \"102\"},\n\t\t},\n\t\t{\n\t\t\tname: \"custom metadata\",\n\t\t\tevent: &session.Event{\n\t\t\t\tLLMResponse: model.LLMResponse{CustomMetadata: map[string]any{\"nested\": map[string]any{\"key\": \"value\"}}},\n\t\t\t},\n\t\t\ta2aMeta: map[string]any{metadataCustomMetaKey: map[string]any{\"nested\": map[string]any{\"key\": \"value\"}}},\n\t\t},\n\t\t{\n\t\t\tname: \"usage\",\n\t\t\tevent: &session.Event{\n\t\t\t\tLLMResponse: model.LLMResponse{UsageMetadata: &genai.GenerateContentResponseUsageMetadata{\n\t\t\t\t\tCacheTokensDetails:      []*genai.ModalityTokenCount{{Modality: \"text\", TokenCount: 1}},\n\t\t\t\t\tPromptTokenCount:        1,\n\t\t\t\t\tToolUsePromptTokenCount: 1,\n\t\t\t\t}},\n\t\t\t},\n\t\t\ta2aMeta: map[string]any{metadataUsageKey: map[string]any{\n\t\t\t\t\"cacheTokensDetails\":      []any{map[string]any{\"modality\": \"text\", \"tokenCount\": float64(1)}},\n\t\t\t\t\"promptTokenCount\":        float64(1),\n\t\t\t\t\"toolUsePromptTokenCount\": float64(1),\n\t\t\t}},\n\t\t},\n\t\t{\n\t\t\tname: \"grounding\",\n\t\t\tevent: &session.Event{\n\t\t\t\tLLMResponse: model.LLMResponse{GroundingMetadata: &genai.GroundingMetadata{\n\t\t\t\t\tRetrievalQueries:  []string{\"hello\"},\n\t\t\t\t\tRetrievalMetadata: &genai.RetrievalMetadata{GoogleSearchDynamicRetrievalScore: 23.3},\n\t\t\t\t}},\n\t\t\t},\n\t\t\ta2aMeta: map[string]any{\n\t\t\t\tmetadataGroundingKey: map[string]any{\n\t\t\t\t\t\"retrievalQueries\":  []any{string(\"hello\")},\n\t\t\t\t\t\"retrievalMetadata\": map[string]any{\"googleSearchDynamicRetrievalScore\": 23.3},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname:    \"actions\",\n\t\t\tevent:   &session.Event{Actions: session.EventActions{TransferToAgent: \"another\", Escalate: true}},\n\t\t\ta2aMeta: map[string]any{metadataTransferToAgentKey: \"another\", metadataEscalateKey: true},\n\t\t},\n\t\t{\n\t\t\tname: \"composite\",\n\t\t\tevent: &session.Event{\n\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\tGroundingMetadata: &genai.GroundingMetadata{\n\t\t\t\t\t\tSourceFlaggingUris: []*genai.GroundingMetadataSourceFlaggingURI{{SourceID: \"id1\"}},\n\t\t\t\t\t},\n\t\t\t\t\tUsageMetadata: &genai.GenerateContentResponseUsageMetadata{\n\t\t\t\t\t\tCandidatesTokenCount: 12,\n\t\t\t\t\t\tThoughtsTokenCount:   42,\n\t\t\t\t\t},\n\t\t\t\t\tCustomMetadata: map[string]any{\n\t\t\t\t\t\t\"nested\": map[string]any{\"key\": \"value\"},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tActions: session.EventActions{TransferToAgent: \"another\", Escalate: true},\n\t\t\t},\n\t\t\ta2aMeta: map[string]any{\n\t\t\t\tmetadataGroundingKey:       map[string]any{\"sourceFlaggingUris\": []any{map[string]any{\"sourceId\": \"id1\"}}},\n\t\t\t\tmetadataUsageKey:           map[string]any{\"candidatesTokenCount\": float64(12), \"thoughtsTokenCount\": float64(42)},\n\t\t\t\tmetadataCustomMetaKey:      map[string]any{\"nested\": map[string]any{\"key\": \"value\"}},\n\t\t\t\tmetadataTransferToAgentKey: \"another\",\n\t\t\t\tmetadataEscalateKey:        true,\n\t\t\t},\n\t\t},\n\t}\n\n\tfor _, tc := range testCases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\tmeta, err := toEventMeta(invocationMeta{}, tc.event)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"toEventMeta() error = %v, want nil\", err)\n\t\t\t}\n\n\t\t\tmeta = setActionsMeta(meta, tc.event.Actions)\n\t\t\tif diff := cmp.Diff(tc.a2aMeta, meta); diff != \"\" {\n\t\t\t\tt.Errorf(\"toEventMeta() wrong result (+got,-want)\\ngot = %v\\nwant = %v\\ndiff = %s\", meta, tc.a2aMeta, diff)\n\t\t\t}\n\n\t\t\tevent := &session.Event{}\n\t\t\terr = processA2AMeta(&a2a.TaskStatusUpdateEvent{Metadata: meta}, event)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"processA2AMeta() error = %v, want nil\", err)\n\t\t\t}\n\t\t\tif diff := cmp.Diff(tc.event, event); diff != \"\" {\n\t\t\t\tt.Errorf(\"processA2AMeta() wrong result (+got,-want)\\ngot = %v\\nwant = %v\\ndiff = %s\", event, tc.event, diff)\n\t\t\t}\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "server/adka2a/parts.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage adka2a\n\nimport (\n\t\"context\"\n\t\"encoding/base64\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"maps\"\n\t\"slices\"\n\n\t\"github.com/a2aproject/a2a-go/a2a\"\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/internal/converters\"\n)\n\nvar (\n\ta2aDataPartMetaTypeKey        = ToA2AMetaKey(\"type\")\n\ta2aDataPartMetaLongRunningKey = ToA2AMetaKey(\"is_long_running\")\n)\n\nconst (\n\ta2aDataPartTypeFunctionCall       = \"function_call\"\n\ta2aDataPartTypeFunctionResponse   = \"function_response\"\n\ta2aDataPartTypeCodeExecResult     = \"code_execution_result\"\n\ta2aDataPartTypeCodeExecutableCode = \"executable_code\"\n)\n\n// IsPartial takes metadata of an A2A object (eg. a2a.Part, a2a.Artifact) and returs true if\n// it was marked as partial based on the ADK partial flag set on the original ADK object.\nfunc IsPartial(meta map[string]any) bool {\n\tif meta == nil {\n\t\treturn false\n\t}\n\tisPartial, _ := meta[metadataPartialKey].(bool)\n\treturn isPartial\n}\n\n// IsPartialFlagSet takes metadata of an A2A object (eg. a2a.Part, a2a.Artifact) and returs true if\n// the ADK partial flag was set on it.\nfunc IsPartialFlagSet(meta map[string]any) bool {\n\tif meta == nil {\n\t\treturn false\n\t}\n\t_, isSet := meta[metadataPartialKey].(bool)\n\treturn isSet\n}\n\n// ToA2APart converts the provided genai part to A2A equivalent. Long running tool IDs are used for attaching metadata to\n// the relevant data parts.\nfunc ToA2APart(part *genai.Part, longRunningToolIDs []string) (a2a.Part, error) {\n\tparts, err := ToA2AParts([]*genai.Part{part}, longRunningToolIDs)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn parts[0], nil\n}\n\n// ToA2AParts converts the provided genai parts to A2A equivalents. Long running tool IDs are used for attaching metadata to\n// the relevant data parts.\nfunc ToA2AParts(parts []*genai.Part, longRunningToolIDs []string) ([]a2a.Part, error) {\n\tresult := make([]a2a.Part, len(parts))\n\tfor i, part := range parts {\n\t\tif part.Text != \"\" {\n\t\t\tr := a2a.TextPart{Text: part.Text}\n\t\t\tif part.Thought {\n\t\t\t\tr.Metadata = map[string]any{ToA2AMetaKey(\"thought\"): true}\n\t\t\t}\n\t\t\tresult[i] = r\n\t\t} else if part.InlineData != nil || part.FileData != nil {\n\t\t\tr, err := toA2AFilePart(part)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\tresult[i] = r\n\t\t} else {\n\t\t\tr, err := toA2ADataPart(part, longRunningToolIDs)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\tresult[i] = r\n\t\t}\n\t}\n\treturn result, nil\n}\n\nfunc updatePartsMetadata(parts []a2a.Part, update map[string]any) {\n\tfor i, part := range parts {\n\t\tvar meta map[string]any\n\t\tswitch p := part.(type) {\n\t\tcase a2a.TextPart:\n\t\t\tif p.Metadata == nil {\n\t\t\t\tp.Metadata = make(map[string]any)\n\t\t\t\tparts[i] = p\n\t\t\t}\n\t\t\tmeta = p.Metadata\n\t\tcase a2a.FilePart:\n\t\t\tif p.Metadata == nil {\n\t\t\t\tp.Metadata = make(map[string]any)\n\t\t\t\tparts[i] = p\n\t\t\t}\n\t\t\tmeta = p.Metadata\n\t\tcase a2a.DataPart:\n\t\t\tif p.Metadata == nil {\n\t\t\t\tp.Metadata = make(map[string]any)\n\t\t\t\tparts[i] = p\n\t\t\t}\n\t\t\tmeta = p.Metadata\n\t\tdefault:\n\t\t\t// TODO: log unknown part type warning (should never happen)\n\t\t\tcontinue\n\t\t}\n\t\tmaps.Copy(meta, update)\n\t}\n}\n\nfunc toA2AFilePart(v *genai.Part) (a2a.FilePart, error) {\n\tif v == nil || (v.FileData == nil && v.InlineData == nil) {\n\t\treturn a2a.FilePart{}, fmt.Errorf(\"not a file part: %v\", v)\n\t}\n\n\tif v.FileData != nil {\n\t\treturn a2a.FilePart{\n\t\t\tFile: a2a.FileURI{\n\t\t\t\tFileMeta: a2a.FileMeta{\n\t\t\t\t\tName:     v.FileData.DisplayName,\n\t\t\t\t\tMimeType: v.FileData.MIMEType,\n\t\t\t\t},\n\t\t\t\tURI: v.FileData.FileURI,\n\t\t\t},\n\t\t}, nil\n\t}\n\n\tpart := a2a.FilePart{\n\t\tFile: a2a.FileBytes{\n\t\t\tFileMeta: a2a.FileMeta{\n\t\t\t\tName:     v.InlineData.DisplayName,\n\t\t\t\tMimeType: v.InlineData.MIMEType,\n\t\t\t},\n\t\t\tBytes: base64.StdEncoding.EncodeToString(v.InlineData.Data),\n\t\t},\n\t}\n\n\tif v.VideoMetadata != nil {\n\t\tdata, err := converters.ToMapStructure(v.VideoMetadata)\n\t\tif err != nil {\n\t\t\treturn a2a.FilePart{}, err\n\t\t}\n\t\tpart.Metadata = map[string]any{\"video_metadata\": data}\n\t}\n\n\treturn part, nil\n}\n\nfunc toA2ADataPart(part *genai.Part, longRunningToolIDs []string) (a2a.Part, error) {\n\tif part.CodeExecutionResult != nil {\n\t\tdata, err := converters.ToMapStructure(part.CodeExecutionResult)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\treturn a2a.DataPart{\n\t\t\tData:     data,\n\t\t\tMetadata: map[string]any{a2aDataPartMetaTypeKey: a2aDataPartTypeCodeExecResult},\n\t\t}, nil\n\t}\n\n\tif part.FunctionResponse != nil {\n\t\tdata, err := converters.ToMapStructure(part.FunctionResponse)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\treturn a2a.DataPart{\n\t\t\tData:     data,\n\t\t\tMetadata: map[string]any{a2aDataPartMetaTypeKey: a2aDataPartTypeFunctionResponse},\n\t\t}, nil\n\t}\n\n\tif part.ExecutableCode != nil {\n\t\tdata, err := converters.ToMapStructure(part.ExecutableCode)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\treturn a2a.DataPart{\n\t\t\tData:     data,\n\t\t\tMetadata: map[string]any{a2aDataPartMetaTypeKey: a2aDataPartTypeCodeExecutableCode},\n\t\t}, nil\n\t}\n\n\tif part.FunctionCall != nil {\n\t\tdata, err := converters.ToMapStructure(part.FunctionCall)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\treturn a2a.DataPart{\n\t\t\tData: data,\n\t\t\tMetadata: map[string]any{\n\t\t\t\ta2aDataPartMetaTypeKey:        a2aDataPartTypeFunctionCall,\n\t\t\t\ta2aDataPartMetaLongRunningKey: slices.Contains(longRunningToolIDs, part.FunctionCall.ID),\n\t\t\t},\n\t\t}, nil\n\t}\n\n\tmapStruct, err := converters.ToMapStructure(part)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn a2a.DataPart{Data: mapStruct}, nil\n}\n\nfunc toGenAIContent(ctx context.Context, msg *a2a.Message, converter A2APartConverter) (*genai.Content, error) {\n\tif converter == nil {\n\t\tparts, err := ToGenAIParts(msg.Parts)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\treturn genai.NewContentFromParts(parts, toGenAIRole(msg.Role)), nil\n\t}\n\n\tparts := make([]*genai.Part, 0, len(msg.Parts))\n\tfor _, part := range msg.Parts {\n\t\tcp, err := converter(ctx, a2a.Event(msg), part)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tif cp == nil {\n\t\t\tcontinue\n\t\t}\n\t\tparts = append(parts, cp)\n\t}\n\treturn genai.NewContentFromParts(parts, toGenAIRole(msg.Role)), nil\n}\n\n// ToGenAIPart converts the provided A2A part to a genai equivalent.\nfunc ToGenAIPart(part a2a.Part) (*genai.Part, error) {\n\tparts, err := ToGenAIParts([]a2a.Part{part})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn parts[0], nil\n}\n\n// ToGenAIParts converts the provided A2A parts to genai equivalents.\nfunc ToGenAIParts(parts []a2a.Part) ([]*genai.Part, error) {\n\tresult := make([]*genai.Part, len(parts))\n\tfor i, part := range parts {\n\t\tswitch v := part.(type) {\n\t\tcase a2a.TextPart:\n\t\t\tr := genai.NewPartFromText(v.Text)\n\t\t\tif v.Metadata != nil {\n\t\t\t\tif thought, ok := v.Metadata[ToA2AMetaKey(\"thought\")].(bool); ok {\n\t\t\t\t\tr.Thought = thought\n\t\t\t\t}\n\t\t\t}\n\t\t\tresult[i] = r\n\n\t\tcase a2a.DataPart:\n\t\t\tr, err := toGenAIDataPart(v)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\tresult[i] = r\n\n\t\tcase a2a.FilePart:\n\t\t\tr, err := toGenAIFilePart(v)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\tresult[i] = r\n\n\t\tdefault:\n\t\t\treturn nil, fmt.Errorf(\"unknown part type: %T\", v)\n\t\t}\n\t}\n\treturn result, nil\n}\n\nfunc toGenAIFilePart(part a2a.FilePart) (*genai.Part, error) {\n\tswitch v := part.File.(type) {\n\tcase a2a.FileBytes:\n\t\tbytes, err := base64.StdEncoding.DecodeString(v.Bytes)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tdata := &genai.Blob{Data: bytes, MIMEType: v.MimeType, DisplayName: v.Name}\n\t\treturn &genai.Part{InlineData: data}, nil\n\n\tcase a2a.FileURI:\n\t\tdata := &genai.FileData{FileURI: v.URI, MIMEType: v.MimeType, DisplayName: v.Name}\n\t\treturn &genai.Part{FileData: data}, nil\n\n\tdefault:\n\t\treturn nil, fmt.Errorf(\"unknown file content type: %T\", v)\n\t}\n}\n\nfunc toGenAIDataPart(part a2a.DataPart) (*genai.Part, error) {\n\tif part.Metadata == nil {\n\t\treturn toGenAITextPart(part)\n\t}\n\tadkMetaType, ok := part.Metadata[a2aDataPartMetaTypeKey]\n\tif !ok {\n\t\treturn toGenAITextPart(part)\n\t}\n\n\tbytes, err := json.Marshal(part.Data)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tswitch adkMetaType {\n\tcase a2aDataPartTypeCodeExecResult:\n\t\tvar val genai.CodeExecutionResult\n\t\tif err := json.Unmarshal(bytes, &val); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\treturn &genai.Part{CodeExecutionResult: &val}, nil\n\n\tcase a2aDataPartTypeFunctionCall:\n\t\tvar val genai.FunctionCall\n\t\tif err := json.Unmarshal(bytes, &val); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\treturn &genai.Part{FunctionCall: &val}, nil\n\n\tcase a2aDataPartTypeCodeExecutableCode:\n\t\tvar val genai.ExecutableCode\n\t\tif err := json.Unmarshal(bytes, &val); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\treturn &genai.Part{ExecutableCode: &val}, nil\n\n\tcase a2aDataPartTypeFunctionResponse:\n\t\tvar val genai.FunctionResponse\n\t\tif err := json.Unmarshal(bytes, &val); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\treturn &genai.Part{FunctionResponse: &val}, nil\n\n\tdefault:\n\t\treturn &genai.Part{Text: string(bytes)}, nil\n\t}\n}\n\nfunc toGenAITextPart(part a2a.DataPart) (*genai.Part, error) {\n\tbytes, err := json.Marshal(part.Data)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &genai.Part{Text: string(bytes)}, nil\n}\n"
  },
  {
    "path": "server/adka2a/parts_test.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage adka2a\n\nimport (\n\t\"testing\"\n\n\t\"github.com/a2aproject/a2a-go/a2a\"\n\t\"github.com/google/go-cmp/cmp\"\n\t\"google.golang.org/genai\"\n)\n\nfunc TestPartsTwoWayConversion(t *testing.T) {\n\ttestCases := []struct {\n\t\tname                   string\n\t\ta2aPart                a2a.Part\n\t\tgenaiPart              *genai.Part\n\t\tlongRunningFunctionIDs []string\n\t}{\n\t\t{\n\t\t\tname:      \"text\",\n\t\t\ta2aPart:   a2a.TextPart{Text: \"Hello\"},\n\t\t\tgenaiPart: &genai.Part{Text: \"Hello\"},\n\t\t},\n\t\t{\n\t\t\tname:      \"thought\",\n\t\t\ta2aPart:   a2a.TextPart{Text: \"Hello\", Metadata: map[string]any{ToA2AMetaKey(\"thought\"): true}},\n\t\t\tgenaiPart: &genai.Part{Text: \"Hello\", Thought: true},\n\t\t},\n\t\t{\n\t\t\tname: \"file uri\",\n\t\t\ta2aPart: a2a.FilePart{\n\t\t\t\tFile: a2a.FileURI{URI: \"ftp://cat.com\", FileMeta: a2a.FileMeta{MimeType: \"image/jpeg\", Name: \"cat.jpeg\"}},\n\t\t\t},\n\t\t\tgenaiPart: &genai.Part{\n\t\t\t\tFileData: &genai.FileData{FileURI: \"ftp://cat.com\", MIMEType: \"image/jpeg\", DisplayName: \"cat.jpeg\"},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"file bytes\",\n\t\t\ta2aPart: a2a.FilePart{\n\t\t\t\tFile: a2a.FileBytes{Bytes: \"/w==\", FileMeta: a2a.FileMeta{MimeType: \"image/jpeg\", Name: \"cat.jpeg\"}},\n\t\t\t},\n\t\t\tgenaiPart: &genai.Part{\n\t\t\t\tInlineData: &genai.Blob{Data: []byte{0xfF}, MIMEType: \"image/jpeg\", DisplayName: \"cat.jpeg\"},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"function call\",\n\t\t\ta2aPart: a2a.DataPart{\n\t\t\t\tData: map[string]any{\n\t\t\t\t\t\"id\":   \"get_weather\",\n\t\t\t\t\t\"args\": map[string]any{\"city\": \"Warsaw\"},\n\t\t\t\t\t\"name\": \"GetWeather\",\n\t\t\t\t},\n\t\t\t\tMetadata: map[string]any{\n\t\t\t\t\ta2aDataPartMetaTypeKey:        a2aDataPartTypeFunctionCall,\n\t\t\t\t\ta2aDataPartMetaLongRunningKey: false,\n\t\t\t\t},\n\t\t\t},\n\t\t\tgenaiPart: &genai.Part{\n\t\t\t\tFunctionCall: &genai.FunctionCall{\n\t\t\t\t\tID:   \"get_weather\",\n\t\t\t\t\tArgs: map[string]any{\"city\": \"Warsaw\"},\n\t\t\t\t\tName: \"GetWeather\",\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"long running function call\",\n\t\t\ta2aPart: a2a.DataPart{\n\t\t\t\tData: map[string]any{\n\t\t\t\t\t\"id\":   \"get_weather\",\n\t\t\t\t\t\"args\": map[string]any{\"city\": \"Warsaw\"},\n\t\t\t\t\t\"name\": \"GetWeather\",\n\t\t\t\t},\n\t\t\t\tMetadata: map[string]any{\n\t\t\t\t\ta2aDataPartMetaTypeKey:        a2aDataPartTypeFunctionCall,\n\t\t\t\t\ta2aDataPartMetaLongRunningKey: true,\n\t\t\t\t},\n\t\t\t},\n\t\t\tgenaiPart: &genai.Part{\n\t\t\t\tFunctionCall: &genai.FunctionCall{\n\t\t\t\t\tID:   \"get_weather\",\n\t\t\t\t\tArgs: map[string]any{\"city\": \"Warsaw\"},\n\t\t\t\t\tName: \"GetWeather\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tlongRunningFunctionIDs: []string{\"get_weather\"},\n\t\t},\n\t\t{\n\t\t\tname: \"function response\",\n\t\t\ta2aPart: a2a.DataPart{\n\t\t\t\tData: map[string]any{\n\t\t\t\t\t\"id\":         \"get_weather\",\n\t\t\t\t\t\"scheduling\": string(genai.FunctionResponseSchedulingInterrupt),\n\t\t\t\t\t\"response\":   map[string]any{\"temperature\": \"7C\"},\n\t\t\t\t\t\"name\":       \"GetWeather\",\n\t\t\t\t},\n\t\t\t\tMetadata: map[string]any{a2aDataPartMetaTypeKey: a2aDataPartTypeFunctionResponse},\n\t\t\t},\n\t\t\tgenaiPart: &genai.Part{\n\t\t\t\tFunctionResponse: &genai.FunctionResponse{\n\t\t\t\t\tID:         \"get_weather\",\n\t\t\t\t\tScheduling: genai.FunctionResponseSchedulingInterrupt,\n\t\t\t\t\tResponse:   map[string]any{\"temperature\": \"7C\"},\n\t\t\t\t\tName:       \"GetWeather\",\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"code execution result\",\n\t\t\ta2aPart: a2a.DataPart{\n\t\t\t\tData:     map[string]any{\"outcome\": string(genai.OutcomeOK), \"output\": \"4\"},\n\t\t\t\tMetadata: map[string]any{a2aDataPartMetaTypeKey: a2aDataPartTypeCodeExecResult},\n\t\t\t},\n\t\t\tgenaiPart: &genai.Part{\n\t\t\t\tCodeExecutionResult: &genai.CodeExecutionResult{\n\t\t\t\t\tOutcome: genai.OutcomeOK,\n\t\t\t\t\tOutput:  \"4\",\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"code execution result\",\n\t\t\ta2aPart: a2a.DataPart{\n\t\t\t\tData:     map[string]any{\"code\": \"print(2+2)\", \"language\": string(genai.LanguagePython)},\n\t\t\t\tMetadata: map[string]any{a2aDataPartMetaTypeKey: a2aDataPartTypeCodeExecutableCode},\n\t\t\t},\n\t\t\tgenaiPart: &genai.Part{\n\t\t\t\tExecutableCode: &genai.ExecutableCode{\n\t\t\t\t\tCode:     \"print(2+2)\",\n\t\t\t\t\tLanguage: genai.LanguagePython,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n\n\tfor _, tc := range testCases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\ttoA2A, err := ToA2AParts([]*genai.Part{tc.genaiPart}, tc.longRunningFunctionIDs)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"toA2AParts() error = %v, want nil\", err)\n\t\t\t}\n\t\t\tif diff := cmp.Diff([]a2a.Part{tc.a2aPart}, toA2A); diff != \"\" {\n\t\t\t\tt.Errorf(\"toA2AParts() wrong result (+got,-want)\\ngot = %v\\nwant = %v\\ndiff = %s\", toA2A, tc.a2aPart, diff)\n\t\t\t}\n\n\t\t\ttoGenAI, err := ToGenAIParts([]a2a.Part{tc.a2aPart})\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"toGenAIParts() error = %v, want nil\", err)\n\t\t\t}\n\t\t\tif diff := cmp.Diff([]*genai.Part{tc.genaiPart}, toGenAI); diff != \"\" {\n\t\t\t\tt.Errorf(\"toGenAIParts() wrong result (+got,-want)\\ngot = %v\\nwant = %v\\ndiff = %s\", toA2A, tc.a2aPart, diff)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestPartsOneWayConversion(t *testing.T) {\n\tpart := a2a.DataPart{Data: map[string]any{\"arbitrary\": \"data\"}}\n\twantGenAI := &genai.Part{Text: `{\"arbitrary\":\"data\"}`}\n\n\tgotGenAI, err := ToGenAIParts([]a2a.Part{part})\n\tif err != nil {\n\t\tt.Fatalf(\"toGenAI() error = %v, want nil\", err)\n\t}\n\tif diff := cmp.Diff([]*genai.Part{wantGenAI}, gotGenAI); diff != \"\" {\n\t\tt.Fatalf(\"toGenAI() wrong result (+got,-want)\\ngot = %v\\nwant = %v\\ndiff = %s\", gotGenAI, part, diff)\n\t}\n\n\twantA2A := a2a.TextPart{Text: `{\"arbitrary\":\"data\"}`}\n\tgotA2A, err := ToA2AParts(gotGenAI, nil)\n\tif err != nil {\n\t\tt.Fatalf(\"toA2AParts() error = %v, want nil\", err)\n\t}\n\tif diff := cmp.Diff([]a2a.Part{wantA2A}, gotA2A); diff != \"\" {\n\t\tt.Fatalf(\"toA2AParts() wrong result (+got,-want)\\ngot = %v\\nwant = %v\\ndiff = %s\", gotA2A, wantA2A, diff)\n\t}\n}\n"
  },
  {
    "path": "server/adka2a/processor.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage adka2a\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"maps\"\n\n\t\"github.com/a2aproject/a2a-go/a2a\"\n\t\"github.com/a2aproject/a2a-go/a2asrv\"\n\n\t\"google.golang.org/adk/model\"\n\t\"google.golang.org/adk/session\"\n)\n\ntype eventToArtifactTransform interface {\n\ttransform(event *session.Event, parts []a2a.Part, meta map[string]any) (*a2a.TaskArtifactUpdateEvent, error)\n\tmakeFinalUpdate() *a2a.TaskArtifactUpdateEvent\n}\n\ntype eventProcessor struct {\n\treqCtx        *a2asrv.RequestContext\n\tmeta          invocationMeta\n\tpartConverter GenAIPartConverter\n\n\t// terminalActions is used to keep track of escalate and agent transfer actions on processed events.\n\t// It is then gets passed to caller through with metadata of a terminal event.\n\t// This is done to make sure the caller processes it, since intermediate events without parts might be ignored.\n\tterminalActions session.EventActions\n\n\t// failedEvent is used to postpone sending a terminal event until the whole ADK response is saved as an A2A artifact.\n\t// Will be sent as the final Task status update if not nil.\n\tfailedEvent *a2a.TaskStatusUpdateEvent\n\n\t// inputRequiredProcessor is used to postpone sending input-required in response to long-running function tool calls.\n\t// inputRequiredProcessor.event will be sent as the final Task status update if failedEvent is nil.\n\tinputRequiredProcessor *inputRequiredProcessor\n\n\t// eventToArtifact is used to convert ADK events to A2A TaskArtifactUpdateEvents.\n\teventToArtifact eventToArtifactTransform\n}\n\nfunc newEventProcessor(\n\treqCtx *a2asrv.RequestContext,\n\tmeta invocationMeta,\n\tconverter GenAIPartConverter,\n\ttransform eventToArtifactTransform,\n) *eventProcessor {\n\treturn &eventProcessor{\n\t\tinputRequiredProcessor: newInputRequiredProcessor(reqCtx, converter),\n\t\tpartConverter:          converter,\n\t\treqCtx:                 reqCtx,\n\t\tmeta:                   meta,\n\t\teventToArtifact:        transform,\n\t}\n}\n\nfunc (p *eventProcessor) process(ctx context.Context, event *session.Event) (*a2a.TaskArtifactUpdateEvent, error) {\n\tif event == nil {\n\t\treturn nil, nil\n\t}\n\n\tp.updateTerminalActions(event)\n\n\teventMeta, err := toEventMeta(p.meta, event)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tresp := event.LLMResponse\n\tif resp.ErrorCode != \"\" || resp.ErrorMessage != \"\" {\n\t\t// TODO(yarolegovich): consider merging responses if multiple errors can be produced during an invocation\n\t\tif p.failedEvent == nil {\n\t\t\t// terminal event might add additional keys to its metadata when it's dispatched and these changes should\n\t\t\t// not be reflected in this event's metadata\n\t\t\tterminalEventMeta := maps.Clone(eventMeta)\n\t\t\tp.failedEvent = toTaskFailedUpdateEvent(p.reqCtx, errorFromResponse(&resp), terminalEventMeta)\n\t\t}\n\t}\n\n\tevent, err = p.inputRequiredProcessor.process(ctx, event)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"input required processing failed: %w\", err)\n\t}\n\n\tparts, err := p.convertParts(ctx, event)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif len(parts) == 0 {\n\t\treturn nil, nil\n\t}\n\n\tresult, err := p.eventToArtifact.transform(event, parts, eventMeta)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn result, nil\n}\n\nfunc (p *eventProcessor) makeFinalArtifactUpdate() *a2a.TaskArtifactUpdateEvent {\n\treturn p.eventToArtifact.makeFinalUpdate()\n}\n\nfunc (p *eventProcessor) makeFinalStatusUpdate() *a2a.TaskStatusUpdateEvent {\n\tfor _, event := range []*a2a.TaskStatusUpdateEvent{p.failedEvent, p.inputRequiredProcessor.event} {\n\t\tif event != nil {\n\t\t\tevent.Metadata = setActionsMeta(event.Metadata, p.terminalActions)\n\t\t\treturn event\n\t\t}\n\t}\n\n\tev := a2a.NewStatusUpdateEvent(p.reqCtx, a2a.TaskStateCompleted, nil)\n\tev.Final = true\n\t// we're modifying base processor metadata which might have been sent with one of the previous events.\n\t// this update shouldn't be reflected in the sent events' metadata.\n\tbaseMetaCopy := maps.Clone(p.meta.eventMeta)\n\tev.Metadata = setActionsMeta(baseMetaCopy, p.terminalActions)\n\treturn ev\n}\n\nfunc (p *eventProcessor) makeTaskFailedEvent(cause error, event *session.Event) *a2a.TaskStatusUpdateEvent {\n\tmeta := p.meta.eventMeta\n\tif event != nil {\n\t\tif eventMeta, err := toEventMeta(p.meta, event); err != nil {\n\t\t\t// TODO(yarolegovich): log ignored error\n\t\t} else {\n\t\t\tmeta = eventMeta\n\t\t}\n\t}\n\treturn toTaskFailedUpdateEvent(p.reqCtx, cause, meta)\n}\n\nfunc (p *eventProcessor) updateTerminalActions(event *session.Event) {\n\tp.terminalActions.Escalate = p.terminalActions.Escalate || event.Actions.Escalate\n\tif event.Actions.TransferToAgent != \"\" {\n\t\tp.terminalActions.TransferToAgent = event.Actions.TransferToAgent\n\t}\n}\n\nfunc (p *eventProcessor) convertParts(ctx context.Context, event *session.Event) ([]a2a.Part, error) {\n\tif event.Content == nil || len(event.Content.Parts) == 0 {\n\t\treturn nil, nil\n\t}\n\tparts := event.Content.Parts\n\tif p.partConverter == nil {\n\t\treturn ToA2AParts(parts, event.LongRunningToolIDs)\n\t}\n\tconverted := make([]a2a.Part, 0, len(parts))\n\tfor _, part := range parts {\n\t\tcp, err := p.partConverter(ctx, event, part)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tif cp == nil {\n\t\t\tcontinue\n\t\t}\n\t\tconverted = append(converted, cp)\n\t}\n\treturn converted, nil\n}\n\nfunc toTaskFailedUpdateEvent(task a2a.TaskInfoProvider, cause error, meta map[string]any) *a2a.TaskStatusUpdateEvent {\n\tmsg := a2a.NewMessageForTask(a2a.MessageRoleAgent, task, a2a.TextPart{Text: cause.Error()})\n\tev := a2a.NewStatusUpdateEvent(task, a2a.TaskStateFailed, msg)\n\tev.Metadata = meta\n\tev.Final = true\n\treturn ev\n}\n\nfunc errorFromResponse(resp *model.LLMResponse) error {\n\treturn fmt.Errorf(\"llm error response: %q\", resp.ErrorMessage)\n}\n"
  },
  {
    "path": "server/adka2a/processor_test.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage adka2a\n\nimport (\n\t\"testing\"\n\n\t\"github.com/a2aproject/a2a-go/a2a\"\n\t\"github.com/a2aproject/a2a-go/a2asrv\"\n\t\"github.com/google/go-cmp/cmp\"\n\t\"github.com/google/go-cmp/cmp/cmpopts\"\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/model\"\n\t\"google.golang.org/adk/session\"\n)\n\nfunc modelResponseFromParts(parts ...*genai.Part) model.LLMResponse {\n\treturn model.LLMResponse{Content: &genai.Content{Role: genai.RoleModel, Parts: parts}}\n}\n\nfunc modelPartialResponseFromParts(parts ...*genai.Part) model.LLMResponse {\n\tresp := modelResponseFromParts(parts...)\n\tresp.Partial = true\n\treturn resp\n}\n\nfunc newNonPartialArtifactEvent(task *a2a.Task, parts ...a2a.Part) *a2a.TaskArtifactUpdateEvent {\n\tev := a2a.NewArtifactEvent(task, parts...)\n\t// It is important for events to be explicitely marked as ADK partial or non-partial.\n\t// This signals to consumers that the remote agent is running its own aggregation logic.\n\tev.Metadata = map[string]any{metadataPartialKey: false}\n\treturn ev\n}\n\nfunc newNonPartialArtifactUpdateEvent(task *a2a.Task, parts ...a2a.Part) *a2a.TaskArtifactUpdateEvent {\n\tev := newNonPartialArtifactEvent(task, parts...)\n\tev.Append = true\n\treturn ev\n}\n\nfunc newDiscardPartialArtifactUpdate(task *a2a.Task) *a2a.TaskArtifactUpdateEvent {\n\tev := newLegacyPartialArtifactUpdate(task, \"\", []a2a.Part{a2a.DataPart{Data: map[string]any{}}})\n\tev.LastChunk = true\n\treturn ev\n}\n\nfunc newFinalStatusUpdate(task *a2a.Task, state a2a.TaskState, msg *a2a.Message) *a2a.TaskStatusUpdateEvent {\n\tev := a2a.NewStatusUpdateEvent(task, state, msg)\n\tev.Final = true\n\treturn ev\n}\n\nfunc TestEventProcessor_Process(t *testing.T) {\n\tartifactIDPlaceholder := a2a.NewArtifactID()\n\ttask := &a2a.Task{ID: a2a.NewTaskID(), ContextID: a2a.NewContextID()}\n\n\ttestCases := []struct {\n\t\tname      string\n\t\tevents    []*session.Event\n\t\tprocessed []*a2a.TaskArtifactUpdateEvent\n\t\tterminal  []a2a.Event\n\t}{\n\t\t{\n\t\t\tname: \"skip if no response\",\n\t\t\tevents: []*session.Event{\n\t\t\t\t{ID: \"125\", InvocationID: \"345\"},\n\t\t\t\t{ID: \"127\", InvocationID: \"345\", Branch: \"b\", Author: \"a\"},\n\t\t\t},\n\t\t\tterminal: []a2a.Event{newFinalStatusUpdate(task, a2a.TaskStateCompleted, nil)},\n\t\t},\n\t\t{\n\t\t\tname: \"skip if no content parts\",\n\t\t\tevents: []*session.Event{\n\t\t\t\t{LLMResponse: model.LLMResponse{Content: &genai.Content{Role: genai.RoleModel}}},\n\t\t\t\t{LLMResponse: model.LLMResponse{Interrupted: true}},\n\t\t\t},\n\t\t\tterminal: []a2a.Event{newFinalStatusUpdate(task, a2a.TaskStateCompleted, nil)},\n\t\t},\n\t\t{\n\t\t\tname: \"multi-part artifact update\",\n\t\t\tevents: []*session.Event{{\n\t\t\t\tLLMResponse: modelResponseFromParts(genai.NewPartFromText(\"Hello\"), genai.NewPartFromText(\", world!\")),\n\t\t\t}},\n\t\t\tprocessed: []*a2a.TaskArtifactUpdateEvent{\n\t\t\t\tnewNonPartialArtifactEvent(task, a2a.TextPart{Text: \"Hello\"}, a2a.TextPart{Text: \", world!\"}),\n\t\t\t},\n\t\t\tterminal: []a2a.Event{newFinalStatusUpdate(task, a2a.TaskStateCompleted, nil)},\n\t\t},\n\t\t{\n\t\t\tname: \"multiple artifact updates\",\n\t\t\tevents: []*session.Event{\n\t\t\t\t{LLMResponse: modelResponseFromParts(genai.NewPartFromExecutableCode(\"get_the_answer()\", genai.LanguagePython))},\n\t\t\t\t{LLMResponse: modelResponseFromParts(genai.NewPartFromCodeExecutionResult(genai.OutcomeOK, \"42\"))},\n\t\t\t\t{LLMResponse: modelResponseFromParts(genai.NewPartFromText(\"The answer is 42\"))},\n\t\t\t},\n\t\t\tprocessed: []*a2a.TaskArtifactUpdateEvent{\n\t\t\t\tnewNonPartialArtifactEvent(task, a2a.DataPart{\n\t\t\t\t\tData:     map[string]any{\"code\": \"get_the_answer()\", \"language\": string(genai.LanguagePython)},\n\t\t\t\t\tMetadata: map[string]any{a2aDataPartMetaTypeKey: a2aDataPartTypeCodeExecutableCode},\n\t\t\t\t}),\n\t\t\t\tnewNonPartialArtifactUpdateEvent(task, a2a.DataPart{\n\t\t\t\t\tData:     map[string]any{\"outcome\": string(genai.OutcomeOK), \"output\": \"42\"},\n\t\t\t\t\tMetadata: map[string]any{a2aDataPartMetaTypeKey: a2aDataPartTypeCodeExecResult},\n\t\t\t\t}),\n\t\t\t\tnewNonPartialArtifactUpdateEvent(task, a2a.TextPart{Text: \"The answer is 42\"}),\n\t\t\t},\n\t\t\tterminal: []a2a.Event{newFinalStatusUpdate(task, a2a.TaskStateCompleted, nil)},\n\t\t},\n\t\t{\n\t\t\tname: \"failed without artifacts\",\n\t\t\tevents: []*session.Event{\n\t\t\t\t{LLMResponse: model.LLMResponse{ErrorCode: \"1\", ErrorMessage: \"failed\"}},\n\t\t\t},\n\t\t\tterminal: []a2a.Event{\n\t\t\t\ttoTaskFailedUpdateEvent(\n\t\t\t\t\ttask, errorFromResponse(&model.LLMResponse{ErrorCode: \"1\", ErrorMessage: \"failed\"}),\n\t\t\t\t\tmap[string]any{ToA2AMetaKey(\"error_code\"): \"1\"},\n\t\t\t\t),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"the first failure is returned\",\n\t\t\tevents: []*session.Event{\n\t\t\t\t{LLMResponse: model.LLMResponse{ErrorCode: \"1\", ErrorMessage: \"failed 1\"}},\n\t\t\t\t{LLMResponse: model.LLMResponse{ErrorCode: \"2\", ErrorMessage: \"failed 2\"}},\n\t\t\t},\n\t\t\tterminal: []a2a.Event{\n\t\t\t\ttoTaskFailedUpdateEvent(\n\t\t\t\t\ttask, errorFromResponse(&model.LLMResponse{ErrorCode: \"1\", ErrorMessage: \"failed 1\"}),\n\t\t\t\t\tmap[string]any{ToA2AMetaKey(\"error_code\"): \"1\"},\n\t\t\t\t),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"failed with artifacts\",\n\t\t\tevents: []*session.Event{\n\t\t\t\t{LLMResponse: modelResponseFromParts(genai.NewPartFromText(\"The answer is\"))},\n\t\t\t\t{LLMResponse: modelResponseFromParts(genai.NewPartFromText(\"42\"))},\n\t\t\t\t{LLMResponse: model.LLMResponse{ErrorCode: \"1\", ErrorMessage: \"failed\"}},\n\t\t\t},\n\t\t\tprocessed: []*a2a.TaskArtifactUpdateEvent{\n\t\t\t\tnewNonPartialArtifactEvent(task, a2a.TextPart{Text: \"The answer is\"}),\n\t\t\t\tnewNonPartialArtifactUpdateEvent(task, a2a.TextPart{Text: \"42\"}),\n\t\t\t},\n\t\t\tterminal: []a2a.Event{\n\t\t\t\ttoTaskFailedUpdateEvent(\n\t\t\t\t\ttask, errorFromResponse(&model.LLMResponse{ErrorCode: \"1\", ErrorMessage: \"failed\"}),\n\t\t\t\t\tmap[string]any{ToA2AMetaKey(\"error_code\"): \"1\"},\n\t\t\t\t),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"failed before receiving all parts\",\n\t\t\tevents: []*session.Event{\n\t\t\t\t{LLMResponse: modelResponseFromParts(genai.NewPartFromText(\"The answer is\"))},\n\t\t\t\t{LLMResponse: model.LLMResponse{ErrorCode: \"1\", ErrorMessage: \"failed\"}},\n\t\t\t\t{LLMResponse: modelResponseFromParts(genai.NewPartFromText(\"42\"))},\n\t\t\t},\n\t\t\tprocessed: []*a2a.TaskArtifactUpdateEvent{\n\t\t\t\tnewNonPartialArtifactEvent(task, a2a.TextPart{Text: \"The answer is\"}),\n\t\t\t\tnewNonPartialArtifactUpdateEvent(task, a2a.TextPart{Text: \"42\"}),\n\t\t\t},\n\t\t\tterminal: []a2a.Event{\n\t\t\t\ttoTaskFailedUpdateEvent(\n\t\t\t\t\ttask, errorFromResponse(&model.LLMResponse{ErrorCode: \"1\", ErrorMessage: \"failed\"}),\n\t\t\t\t\tmap[string]any{ToA2AMetaKey(\"error_code\"): \"1\"},\n\t\t\t\t),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"input_required not produced for a normal function call\",\n\t\t\tevents: []*session.Event{\n\t\t\t\t{LLMResponse: modelResponseFromParts(genai.NewPartFromFunctionCall(\"get_weather\", map[string]any{\"city\": \"Warsaw\"}))},\n\t\t\t},\n\t\t\tprocessed: []*a2a.TaskArtifactUpdateEvent{\n\t\t\t\tnewNonPartialArtifactEvent(task, a2a.DataPart{\n\t\t\t\t\tData: map[string]any{\"name\": \"get_weather\", \"args\": map[string]any{\"city\": \"Warsaw\"}},\n\t\t\t\t\tMetadata: map[string]any{\n\t\t\t\t\t\ta2aDataPartMetaTypeKey:        a2aDataPartTypeFunctionCall,\n\t\t\t\t\t\ta2aDataPartMetaLongRunningKey: false,\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t},\n\t\t\tterminal: []a2a.Event{\n\t\t\t\tnewFinalStatusUpdate(task, a2a.TaskStateCompleted, nil),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"input_required produced for long running function\",\n\t\t\tevents: []*session.Event{\n\t\t\t\t{\n\t\t\t\t\tLongRunningToolIDs: []string{\"get_weather\"},\n\t\t\t\t\tLLMResponse: modelResponseFromParts(&genai.Part{\n\t\t\t\t\t\tFunctionCall: &genai.FunctionCall{ID: \"get_weather\", Name: \"weather\", Args: map[string]any{\"city\": \"Warsaw\"}},\n\t\t\t\t\t}),\n\t\t\t\t},\n\t\t\t},\n\t\t\tprocessed: nil,\n\t\t\tterminal: []a2a.Event{\n\t\t\t\tnewFinalStatusUpdate(task, a2a.TaskStateInputRequired, &a2a.Message{\n\t\t\t\t\tRole: a2a.MessageRoleAgent,\n\t\t\t\t\tParts: []a2a.Part{\n\t\t\t\t\t\ta2a.DataPart{\n\t\t\t\t\t\t\tData: map[string]any{\"id\": \"get_weather\", \"name\": \"weather\", \"args\": map[string]any{\"city\": \"Warsaw\"}},\n\t\t\t\t\t\t\tMetadata: map[string]any{\n\t\t\t\t\t\t\t\ta2aDataPartMetaTypeKey:        a2aDataPartTypeFunctionCall,\n\t\t\t\t\t\t\t\ta2aDataPartMetaLongRunningKey: true,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"long running tool call before receiving all parts\",\n\t\t\tevents: []*session.Event{\n\t\t\t\t{\n\t\t\t\t\tLongRunningToolIDs: []string{\"get_weather\"},\n\t\t\t\t\tLLMResponse: modelResponseFromParts(&genai.Part{\n\t\t\t\t\t\tFunctionCall: &genai.FunctionCall{ID: \"get_weather\", Name: \"weather\", Args: map[string]any{\"city\": \"Warsaw\"}},\n\t\t\t\t\t}),\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tLLMResponse: modelResponseFromParts(genai.NewPartFromText(\"This will take a while\")),\n\t\t\t\t},\n\t\t\t},\n\t\t\tprocessed: []*a2a.TaskArtifactUpdateEvent{\n\t\t\t\tnewNonPartialArtifactEvent(task, a2a.TextPart{Text: \"This will take a while\"}),\n\t\t\t},\n\n\t\t\tterminal: []a2a.Event{\n\t\t\t\tnewFinalStatusUpdate(task, a2a.TaskStateInputRequired, &a2a.Message{\n\t\t\t\t\tRole: a2a.MessageRoleAgent,\n\t\t\t\t\tParts: []a2a.Part{\n\t\t\t\t\t\ta2a.DataPart{\n\t\t\t\t\t\t\tData: map[string]any{\"id\": \"get_weather\", \"name\": \"weather\", \"args\": map[string]any{\"city\": \"Warsaw\"}},\n\t\t\t\t\t\t\tMetadata: map[string]any{\n\t\t\t\t\t\t\t\ta2aDataPartMetaTypeKey:        a2aDataPartTypeFunctionCall,\n\t\t\t\t\t\t\t\ta2aDataPartMetaLongRunningKey: true,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"long running tool response without ID\",\n\t\t\tevents: []*session.Event{\n\t\t\t\t{\n\t\t\t\t\tLongRunningToolIDs: []string{\"get_weather\"},\n\t\t\t\t\tLLMResponse: modelResponseFromParts(&genai.Part{\n\t\t\t\t\t\tFunctionCall: &genai.FunctionCall{ID: \"get_weather\", Name: \"weather\", Args: map[string]any{\"city\": \"Warsaw\"}},\n\t\t\t\t\t}),\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t// No LongRunningToolIDs here\n\t\t\t\t\tLLMResponse: modelResponseFromParts(&genai.Part{\n\t\t\t\t\t\tFunctionResponse: &genai.FunctionResponse{ID: \"get_weather\", Name: \"weather\", Response: map[string]any{\"status\": \"pending\"}},\n\t\t\t\t\t}),\n\t\t\t\t},\n\t\t\t},\n\t\t\tprocessed: nil,\n\t\t\tterminal: []a2a.Event{\n\t\t\t\tnewFinalStatusUpdate(task, a2a.TaskStateInputRequired, &a2a.Message{\n\t\t\t\t\tRole: a2a.MessageRoleAgent,\n\t\t\t\t\tParts: []a2a.Part{\n\t\t\t\t\t\ta2a.DataPart{\n\t\t\t\t\t\t\tData: map[string]any{\"id\": \"get_weather\", \"name\": \"weather\", \"args\": map[string]any{\"city\": \"Warsaw\"}},\n\t\t\t\t\t\t\tMetadata: map[string]any{\n\t\t\t\t\t\t\t\ta2aDataPartMetaTypeKey:        a2aDataPartTypeFunctionCall,\n\t\t\t\t\t\t\t\ta2aDataPartMetaLongRunningKey: true,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\ta2a.DataPart{\n\t\t\t\t\t\t\tData: map[string]any{\"id\": \"get_weather\", \"name\": \"weather\", \"response\": map[string]any{\"status\": \"pending\"}},\n\t\t\t\t\t\t\tMetadata: map[string]any{\n\t\t\t\t\t\t\t\ta2aDataPartMetaTypeKey: a2aDataPartTypeFunctionResponse,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"actions in completed event meta\",\n\t\t\tevents: []*session.Event{\n\t\t\t\t{ID: \"125\", InvocationID: \"345\", Actions: session.EventActions{Escalate: true, TransferToAgent: \"a-2\"}},\n\t\t\t},\n\t\t\tterminal: []a2a.Event{\n\t\t\t\t&a2a.TaskStatusUpdateEvent{\n\t\t\t\t\tTaskID:    task.ID,\n\t\t\t\t\tContextID: task.ContextID,\n\t\t\t\t\tStatus:    a2a.TaskStatus{State: a2a.TaskStateCompleted},\n\t\t\t\t\tMetadata:  map[string]any{metadataEscalateKey: true, metadataTransferToAgentKey: \"a-2\"},\n\t\t\t\t\tFinal:     true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"last agent transfer is returned\",\n\t\t\tevents: []*session.Event{\n\t\t\t\t{ID: \"125\", InvocationID: \"345\", Actions: session.EventActions{TransferToAgent: \"a-2\"}},\n\t\t\t\t{ID: \"126\", InvocationID: \"346\", Actions: session.EventActions{TransferToAgent: \"a-3\"}},\n\t\t\t},\n\t\t\tterminal: []a2a.Event{\n\t\t\t\t&a2a.TaskStatusUpdateEvent{\n\t\t\t\t\tTaskID:    task.ID,\n\t\t\t\t\tContextID: task.ContextID,\n\t\t\t\t\tStatus:    a2a.TaskStatus{State: a2a.TaskStateCompleted},\n\t\t\t\t\tMetadata:  map[string]any{metadataTransferToAgentKey: \"a-3\"},\n\t\t\t\t\tFinal:     true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"actions not overwritten by subsequent events\",\n\t\t\tevents: []*session.Event{\n\t\t\t\t{\n\t\t\t\t\tLLMResponse: modelResponseFromParts(genai.NewPartFromText(\"The answer is\")),\n\t\t\t\t\tActions:     session.EventActions{Escalate: true, TransferToAgent: \"a-2\"},\n\t\t\t\t},\n\t\t\t\t{LLMResponse: model.LLMResponse{ErrorCode: \"1\", ErrorMessage: \"failed\"}},\n\t\t\t},\n\t\t\tprocessed: []*a2a.TaskArtifactUpdateEvent{\n\t\t\t\tnewNonPartialArtifactEvent(task, a2a.TextPart{Text: \"The answer is\"}),\n\t\t\t},\n\t\t\tterminal: []a2a.Event{\n\t\t\t\ttoTaskFailedUpdateEvent(\n\t\t\t\t\ttask, errorFromResponse(&model.LLMResponse{ErrorCode: \"1\", ErrorMessage: \"failed\"}),\n\t\t\t\t\tmap[string]any{ToA2AMetaKey(\"error_code\"): \"1\", metadataEscalateKey: true, metadataTransferToAgentKey: \"a-2\"},\n\t\t\t\t),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"partial events parts marked\",\n\t\t\tevents: []*session.Event{\n\t\t\t\t{\n\t\t\t\t\tLLMResponse: modelPartialResponseFromParts(\n\t\t\t\t\t\tgenai.NewPartFromText(\"The answer is\"),\n\t\t\t\t\t\tgenai.NewPartFromExecutableCode(\"get_the_answer()\", genai.LanguagePython)),\n\t\t\t\t},\n\t\t\t\t{LLMResponse: modelPartialResponseFromParts(\n\t\t\t\t\tgenai.NewPartFromCodeExecutionResult(genai.OutcomeOK, \"42\"),\n\t\t\t\t\tgenai.NewPartFromText(\"42\"),\n\t\t\t\t)},\n\t\t\t},\n\t\t\tprocessed: []*a2a.TaskArtifactUpdateEvent{\n\t\t\t\tnewLegacyPartialArtifactUpdate(task, artifactIDPlaceholder, []a2a.Part{\n\t\t\t\t\ta2a.TextPart{Text: \"The answer is\", Metadata: map[string]any{ToA2AMetaKey(\"partial\"): true}},\n\t\t\t\t\ta2a.DataPart{\n\t\t\t\t\t\tData: map[string]any{\"code\": \"get_the_answer()\", \"language\": string(genai.LanguagePython)},\n\t\t\t\t\t\tMetadata: map[string]any{\n\t\t\t\t\t\t\ta2aDataPartMetaTypeKey:  a2aDataPartTypeCodeExecutableCode,\n\t\t\t\t\t\t\tToA2AMetaKey(\"partial\"): true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t\tnewLegacyPartialArtifactUpdate(task, artifactIDPlaceholder, []a2a.Part{\n\t\t\t\t\ta2a.DataPart{\n\t\t\t\t\t\tData: map[string]any{\"outcome\": string(genai.OutcomeOK), \"output\": \"42\"},\n\t\t\t\t\t\tMetadata: map[string]any{\n\t\t\t\t\t\t\ta2aDataPartMetaTypeKey:  a2aDataPartTypeCodeExecResult,\n\t\t\t\t\t\t\tToA2AMetaKey(\"partial\"): true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\ta2a.TextPart{Text: \"42\", Metadata: map[string]any{ToA2AMetaKey(\"partial\"): true}},\n\t\t\t\t}),\n\t\t\t},\n\t\t\tterminal: []a2a.Event{\n\t\t\t\tnewDiscardPartialArtifactUpdate(task),\n\t\t\t\tnewFinalStatusUpdate(task, a2a.TaskStateCompleted, nil),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"metadata merging\",\n\t\t\tevents: []*session.Event{{\n\t\t\t\tInvocationID: \"test-invocation-id\",\n\t\t\t\tLLMResponse:  modelResponseFromParts(genai.NewPartFromText(\"Hello\")),\n\t\t\t}},\n\t\t\tprocessed: []*a2a.TaskArtifactUpdateEvent{\n\t\t\t\tfunc() *a2a.TaskArtifactUpdateEvent {\n\t\t\t\t\tev := newNonPartialArtifactEvent(task, a2a.TextPart{Text: \"Hello\"})\n\t\t\t\t\tev.Metadata[ToA2AMetaKey(\"invocation_id\")] = \"test-invocation-id\"\n\t\t\t\t\treturn ev\n\t\t\t\t}(),\n\t\t\t},\n\t\t\tterminal: []a2a.Event{newFinalStatusUpdate(task, a2a.TaskStateCompleted, nil)},\n\t\t},\n\t}\n\n\tfor _, tc := range testCases {\n\t\tignoreFields := []cmp.Option{\n\t\t\tcmpopts.IgnoreFields(a2a.Message{}, \"ID\"),\n\t\t\tcmpopts.IgnoreFields(a2a.Artifact{}, \"ID\"),\n\t\t\tcmpopts.IgnoreFields(a2a.TaskStatus{}, \"Timestamp\"),\n\t\t}\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\treqCtx := &a2asrv.RequestContext{TaskID: task.ID, ContextID: task.ContextID}\n\t\t\tprocessor := newEventProcessor(reqCtx, invocationMeta{}, nil, newLegacyArtifactMaker(reqCtx))\n\n\t\t\tvar gotEvents []*a2a.TaskArtifactUpdateEvent\n\t\t\tfor _, event := range tc.events {\n\t\t\t\tgot, err := processor.process(t.Context(), event)\n\t\t\t\tif err != nil {\n\t\t\t\t\tt.Fatalf(\"processor.process() error = %v, want nil\", err)\n\t\t\t\t}\n\t\t\t\tif got != nil {\n\t\t\t\t\tgotEvents = append(gotEvents, got)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif diff := cmp.Diff(tc.processed, gotEvents, ignoreFields...); diff != \"\" {\n\t\t\t\tt.Fatalf(\"processor.process() wrong result (+got,-want)\\ngot = %v\\nwant = %v\\ndiff = %s\", gotEvents, tc.events, diff)\n\t\t\t}\n\n\t\t\tgotTerminal := makeTerminalEvents(processor)\n\t\t\tif diff := cmp.Diff(tc.terminal, gotTerminal, ignoreFields...); diff != \"\" {\n\t\t\t\tt.Fatalf(\"processor.makeTerminalEvents() wrong result (+got,-want)\\ngot = %v\\nwant = %v\\ndiff = %s\", gotTerminal, tc.terminal, diff)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestEventProcessor_ArtifactUpdates(t *testing.T) {\n\ttask := &a2a.Task{ID: a2a.NewTaskID(), ContextID: a2a.NewContextID()}\n\n\tevents := []*session.Event{\n\t\t{\n\t\t\tLLMResponse: modelResponseFromParts(genai.NewPartFromExecutableCode(\"find_cat()\", genai.LanguagePython)),\n\t\t},\n\t\t{\n\t\t\tLLMResponse: modelResponseFromParts(\n\t\t\t\tgenai.NewPartFromCodeExecutionResult(genai.OutcomeOK, \"https://cats.com/image.png\"),\n\t\t\t\tgenai.NewPartFromText(\"A cat image was downloaded to /home/me/cat.png\"),\n\t\t\t\tgenai.NewPartFromFunctionCall(\"download\", map[string]any{\"from\": \"https://cats.com/image.png\", \"to\": \"/home/me/cat.png\"}),\n\t\t\t),\n\t\t},\n\t\t{\n\t\t\tLLMResponse: modelResponseFromParts(genai.NewPartFromFunctionResponse(\"download\", map[string]any{\"status\": \"ok\"})),\n\t\t},\n\t\t{\n\t\t\tLLMResponse: modelResponseFromParts(genai.NewPartFromText(\"A cat image was downloaded to /home/me/cat.png\")),\n\t\t},\n\t}\n\n\treqCtx := &a2asrv.RequestContext{TaskID: task.ID, ContextID: task.ContextID}\n\tprocessor := newEventProcessor(reqCtx, invocationMeta{}, nil, newLegacyArtifactMaker(reqCtx))\n\tgot := make([]*a2a.TaskArtifactUpdateEvent, len(events))\n\tfor i, event := range events {\n\t\tprocessed, err := processor.process(t.Context(), event)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"processor.process() error for %d-th = %v, want nil\", i, err)\n\t\t}\n\t\tgot[i] = processed\n\t}\n\n\tif len(events) != len(got) {\n\t\tt.Fatalf(\"processor.process() returned %d events, want %d\\nevents = %v\", len(got), len(events), got)\n\t}\n\tif got[0].Append || got[0].LastChunk {\n\t\tt.Fatalf(\"processor.process()[0] = %+v, want {Append=false, LastChunk=false}\", got[0])\n\t}\n\twantID := got[0].Artifact.ID\n\tfor i := range len(got) - 1 {\n\t\tevent := got[i+1]\n\t\tif event.LastChunk {\n\t\t\tt.Fatalf(\"processor.process()[%d] = %+v, want LastChunk=false\", i, event)\n\t\t}\n\t\tif event.Artifact.ID != wantID {\n\t\t\tt.Fatalf(\"processor.process()[%d] ID = %v, got %v\", i, event.Artifact.ID, wantID)\n\t\t}\n\t}\n\n\tterminal := makeTerminalEvents(processor)\n\tif len(terminal) != 1 {\n\t\tt.Fatalf(\"processor.makeTerminalEvents() = %v, want [finalStatusUpdate]\", terminal)\n\t}\n}\n\nfunc TestEventProcessor_PartialEventsAreDiscardedAsAnArtifact(t *testing.T) {\n\ttask := &a2a.Task{ID: a2a.NewTaskID(), ContextID: a2a.NewContextID()}\n\n\tevents := []*session.Event{\n\t\t{LLMResponse: modelPartialResponseFromParts(genai.NewPartFromText(\"Hello, \"))},\n\t\t{LLMResponse: modelPartialResponseFromParts(genai.NewPartFromText(\"world!\"))},\n\t\t{LLMResponse: modelResponseFromParts(genai.NewPartFromText(\"Hello, world!\"))},\n\t}\n\n\treqCtx := &a2asrv.RequestContext{TaskID: task.ID, ContextID: task.ContextID}\n\tprocessor := newEventProcessor(reqCtx, invocationMeta{}, nil, newLegacyArtifactMaker(reqCtx))\n\tgot := make([]*a2a.TaskArtifactUpdateEvent, len(events))\n\tfor i, event := range events {\n\t\tprocessed, err := processor.process(t.Context(), event)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"processor.process() error for %d-th = %v, want nil\", i, err)\n\t\t}\n\t\tgot[i] = processed\n\t}\n\n\tif len(events) != len(got) {\n\t\tt.Fatalf(\"processor.process() returned %d events, want %d\\nevents = %v\", len(got), len(events), got)\n\t}\n\n\tlastI := len(events) - 1\n\tif got[0].Append || got[0].LastChunk {\n\t\tt.Fatalf(\"processor.process()[0] = %+v, want {Append=false, LastChunk=false}\", got[0])\n\t}\n\tif got[lastI].Append || got[lastI].LastChunk {\n\t\tt.Fatalf(\"processor.process()[lastI] = %+v, want {Append=false, LastChunk=false}\", got[lastI])\n\t}\n\n\tif got[0].Artifact.ID != got[1].Artifact.ID {\n\t\tt.Fatal(\"processor.process() partial events applied to different artifact\")\n\t}\n\tif got[0].Artifact.ID == got[lastI].Artifact.ID {\n\t\tt.Fatal(\"processor.process() final event applied to partial artifact\")\n\t}\n\n\tfor i, event := range got {\n\t\tif event.LastChunk {\n\t\t\tt.Fatalf(\"processor.process()[%d] = %+v, want LastChunk=false\", i, event)\n\t\t}\n\t}\n\n\tterminal := makeTerminalEvents(processor)\n\tfinalUpdate, ok := terminal[0].(*a2a.TaskArtifactUpdateEvent)\n\tif len(terminal) != 2 || !ok {\n\t\tt.Fatalf(\"processor.makeTerminalEvents() = %v, want [finalArtifactChunk, finalStatusUpdate]\", terminal)\n\t}\n\twantEvent := &a2a.TaskArtifactUpdateEvent{\n\t\tTaskID:    task.ID,\n\t\tContextID: task.ContextID,\n\t\tArtifact: &a2a.Artifact{\n\t\t\tID:       got[0].Artifact.ID,\n\t\t\tParts:    a2a.ContentParts{a2a.DataPart{Data: map[string]any{}, Metadata: map[string]any{metadataPartialKey: true}}},\n\t\t\tMetadata: map[string]any{metadataPartialKey: true},\n\t\t},\n\t\tMetadata:  map[string]any{metadataPartialKey: true},\n\t\tAppend:    false,\n\t\tLastChunk: true,\n\t}\n\tif diff := cmp.Diff(wantEvent, finalUpdate); diff != \"\" {\n\t\tt.Fatalf(\"makeTerminalEvents() wrong result (+got,-want) diff = %s\", diff)\n\t}\n}\n\nfunc makeTerminalEvents(processor *eventProcessor) []a2a.Event {\n\tresult := make([]a2a.Event, 0, 2)\n\tif finalUpdate := processor.eventToArtifact.makeFinalUpdate(); finalUpdate != nil {\n\t\tresult = append(result, finalUpdate)\n\t}\n\tresult = append(result, processor.makeFinalStatusUpdate())\n\treturn result\n}\n"
  },
  {
    "path": "server/adka2a/task_artifact.go",
    "content": "// Copyright 2026 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage adka2a\n\nimport (\n\t\"maps\"\n\n\t\"github.com/a2aproject/a2a-go/a2a\"\n\t\"github.com/a2aproject/a2a-go/a2asrv\"\n\n\t\"google.golang.org/adk/session\"\n)\n\ntype artifactMaker struct {\n\treqCtx                   *a2asrv.RequestContext\n\tlastAgentPartialArtifact map[string]a2a.ArtifactID\n}\n\nfunc newArtifactMaker(reqCtx *a2asrv.RequestContext) *artifactMaker {\n\treturn &artifactMaker{\n\t\treqCtx:                   reqCtx,\n\t\tlastAgentPartialArtifact: make(map[string]a2a.ArtifactID),\n\t}\n}\n\nvar _ eventToArtifactTransform = (*artifactMaker)(nil)\n\nfunc (m *artifactMaker) transform(event *session.Event, parts []a2a.Part, meta map[string]any) (*a2a.TaskArtifactUpdateEvent, error) {\n\tresult := a2a.NewArtifactEvent(m.reqCtx, parts...)\n\n\tif artifactID, ok := m.lastAgentPartialArtifact[event.Author]; ok {\n\t\tresult.Artifact.ID = artifactID\n\t\t// continue accumulating if partial, otherwise replace contents\n\t\tresult.Append = event.Partial\n\t}\n\tresult.LastChunk = !event.Partial\n\n\tif event.Partial {\n\t\tm.lastAgentPartialArtifact[event.Author] = result.Artifact.ID\n\t} else {\n\t\tdelete(m.lastAgentPartialArtifact, event.Author)\n\t}\n\n\tif len(meta) > 0 {\n\t\tif result.Artifact.Metadata == nil {\n\t\t\tresult.Artifact.Metadata = make(map[string]any)\n\t\t}\n\t\tmaps.Copy(result.Artifact.Metadata, meta)\n\t}\n\n\treturn result, nil\n}\n\nfunc (m *artifactMaker) makeFinalUpdate() *a2a.TaskArtifactUpdateEvent {\n\treturn nil\n}\n\ntype legacyArtifactMaker struct {\n\treqCtx *a2asrv.RequestContext\n\n\t// responseID is created once the first TaskArtifactUpdateEvent is sent. Used for subsequent artifact updates.\n\tresponseID a2a.ArtifactID\n\t// partialResponseID is created once the first TaskArtifactUpdateEvent created from a partial ADK event is sent.\n\t// Partial updates are not saved in the ADK session store. There is no concept of a partial event in A2A so instead\n\t// we're updating an \"ephemeral\" artifact while an agent is running. The artifact gets reset at the end of the\n\t// invocation effectively erasing its parts.\n\tpartialResponseID a2a.ArtifactID\n}\n\nfunc newLegacyArtifactMaker(reqCtx *a2asrv.RequestContext) *legacyArtifactMaker {\n\treturn &legacyArtifactMaker{\n\t\treqCtx: reqCtx,\n\t}\n}\n\nvar _ eventToArtifactTransform = (*legacyArtifactMaker)(nil)\n\nfunc (p *legacyArtifactMaker) transform(event *session.Event, parts []a2a.Part, meta map[string]any) (*a2a.TaskArtifactUpdateEvent, error) {\n\tvar result *a2a.TaskArtifactUpdateEvent\n\tif event.Partial {\n\t\tresult = newLegacyPartialArtifactUpdate(p.reqCtx, p.partialResponseID, parts)\n\t\tp.partialResponseID = result.Artifact.ID\n\t} else {\n\t\tresult = newLegacyArtifactUpdate(p.reqCtx, p.responseID, parts)\n\t\tp.responseID = result.Artifact.ID\n\t}\n\tif len(meta) > 0 {\n\t\tmaps.Copy(result.Metadata, meta)\n\t}\n\treturn result, nil\n}\n\nfunc (p *legacyArtifactMaker) makeFinalUpdate() *a2a.TaskArtifactUpdateEvent {\n\t// We could also send a LastChunk: true event for the main (non-partial) artifact,\n\t// but there's currently no special handling for it and not all A2A SDK (eg. Java)\n\t// implementations allow empty-part artifact updates.\n\tif p.partialResponseID == \"\" {\n\t\treturn nil\n\t}\n\tev := newLegacyPartialArtifactUpdate(p.reqCtx, p.partialResponseID, []a2a.Part{a2a.DataPart{Data: map[string]any{}}})\n\tev.LastChunk = true\n\treturn ev\n}\n\nfunc newLegacyArtifactUpdate(task a2a.TaskInfoProvider, id a2a.ArtifactID, parts []a2a.Part) *a2a.TaskArtifactUpdateEvent {\n\tvar result *a2a.TaskArtifactUpdateEvent\n\tif id == \"\" {\n\t\tresult = a2a.NewArtifactEvent(task, parts...)\n\t} else {\n\t\tresult = a2a.NewArtifactUpdateEvent(task, id, parts...)\n\t}\n\t// Explicitely mark and Artifact update as non-partial ADK event so that consumer side\n\t// does not run its own aggregation logic.\n\tresult.Metadata = map[string]any{metadataPartialKey: false}\n\treturn result\n}\n\nfunc newLegacyPartialArtifactUpdate(task a2a.TaskInfoProvider, artifactID a2a.ArtifactID, parts []a2a.Part) *a2a.TaskArtifactUpdateEvent {\n\tev := newLegacyArtifactUpdate(task, artifactID, parts)\n\tupdatePartsMetadata(parts, map[string]any{metadataPartialKey: true})\n\tif ev.Artifact.Metadata == nil {\n\t\tev.Artifact.Metadata = map[string]any{metadataPartialKey: true}\n\t} else {\n\t\tev.Artifact.Metadata[metadataPartialKey] = true\n\t}\n\tev.Metadata[metadataPartialKey] = true\n\tev.Append = false // discard partial events\n\treturn ev\n}\n"
  },
  {
    "path": "server/adka2a/utils.go",
    "content": "// Copyright 2026 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage adka2a\n\nimport (\n\t\"github.com/a2aproject/a2a-go/a2a\"\n\n\t\"google.golang.org/adk/agent\"\n\tiagent \"google.golang.org/adk/internal/agent\"\n\tiremoteagent \"google.golang.org/adk/internal/agent/remoteagent\"\n)\n\n// WithoutPartialArtifacts returns a slice of artifacts without partial artifacts.\n// Partial artifacts are usually discarded (contain no parts) after agent invocation is finished.\nfunc WithoutPartialArtifacts(artifacts []*a2a.Artifact) []*a2a.Artifact {\n\tvar result []*a2a.Artifact\n\tfor _, artifact := range artifacts {\n\t\tif IsPartial(artifact.Metadata) {\n\t\t\tcontinue\n\t\t}\n\t\tresult = append(result, artifact)\n\t}\n\treturn result\n}\n\nfunc findRemoteSubagents(root agent.Agent) []remoteAgent {\n\tvar result []remoteAgent\n\tvar collect func(agent.Agent)\n\tcollect = func(agent agent.Agent) {\n\t\tia, ok := agent.(iagent.Agent)\n\t\tif !ok {\n\t\t\treturn\n\t\t}\n\t\tconfig := iagent.Reveal(ia).Config\n\t\tif state, ok := config.(iremoteagent.RemoteAgentState); ok && state.A2A != nil {\n\t\t\tresult = append(result, remoteAgent{agent: agent, config: state.A2A})\n\t\t\treturn\n\t\t}\n\t\tfor _, sa := range agent.SubAgents() {\n\t\t\tcollect(sa)\n\t\t}\n\t}\n\tcollect(root)\n\treturn result\n}\n\ntype remoteAgent struct {\n\tagent  agent.Agent\n\tconfig *iremoteagent.A2AServerConfig\n}\n"
  },
  {
    "path": "server/adkrest/controllers/apps.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage controllers\n\nimport (\n\t\"net/http\"\n\n\t\"google.golang.org/adk/agent\"\n)\n\n// AppsAPIController is the controller for the Apps API.\ntype AppsAPIController struct {\n\tagentLoader agent.Loader\n}\n\n// NewAppsAPIController creates a controller for Apps API.\nfunc NewAppsAPIController(agentLoader agent.Loader) *AppsAPIController {\n\treturn &AppsAPIController{agentLoader: agentLoader}\n}\n\n// ListAppsHandler handles listing all loaded agents.\nfunc (c *AppsAPIController) ListAppsHandler(rw http.ResponseWriter, req *http.Request) {\n\tapps := c.agentLoader.ListAgents()\n\tEncodeJSONResponse(apps, http.StatusOK, rw)\n}\n"
  },
  {
    "path": "server/adkrest/controllers/artifacts.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage controllers\n\nimport (\n\t\"net/http\"\n\t\"strconv\"\n\n\t\"github.com/gorilla/mux\"\n\n\t\"google.golang.org/adk/artifact\"\n\t\"google.golang.org/adk/server/adkrest/internal/models\"\n)\n\n// ArtifactsAPIController is the controller for the Artifacts API.\ntype ArtifactsAPIController struct {\n\tartifactService artifact.Service\n}\n\nfunc NewArtifactsAPIController(artifactService artifact.Service) *ArtifactsAPIController {\n\treturn &ArtifactsAPIController{artifactService: artifactService}\n}\n\n// ListArtifactsHandler lists all the artifact filenames within a session.\nfunc (c *ArtifactsAPIController) ListArtifactsHandler(rw http.ResponseWriter, req *http.Request) {\n\tvars := mux.Vars(req)\n\tsessionID, err := models.SessionIDFromHTTPParameters(vars)\n\tif err != nil {\n\t\thttp.Error(rw, err.Error(), http.StatusBadRequest)\n\t\treturn\n\t}\n\tif sessionID.ID == \"\" {\n\t\thttp.Error(rw, \"session_id parameter is required\", http.StatusBadRequest)\n\t\treturn\n\t}\n\tresp, err := c.artifactService.List(req.Context(), &artifact.ListRequest{\n\t\tAppName:   sessionID.AppName,\n\t\tUserID:    sessionID.UserID,\n\t\tSessionID: sessionID.ID,\n\t})\n\tif err != nil {\n\t\thttp.Error(rw, err.Error(), http.StatusInternalServerError)\n\t\treturn\n\t}\n\tfiles := resp.FileNames\n\tif files == nil {\n\t\tfiles = []string{}\n\t}\n\tEncodeJSONResponse(files, http.StatusOK, rw)\n}\n\n// LoadArtifactHandler gets an artifact from the artifact service storage.\nfunc (c *ArtifactsAPIController) LoadArtifactHandler(rw http.ResponseWriter, req *http.Request) {\n\tvars := mux.Vars(req)\n\tsessionID, err := models.SessionIDFromHTTPParameters(vars)\n\tif err != nil {\n\t\thttp.Error(rw, err.Error(), http.StatusBadRequest)\n\t\treturn\n\t}\n\tif sessionID.ID == \"\" {\n\t\thttp.Error(rw, \"session_id parameter is required\", http.StatusBadRequest)\n\t\treturn\n\t}\n\tartifactName := vars[\"artifact_name\"]\n\tif artifactName == \"\" {\n\t\thttp.Error(rw, \"artifact_name parameter is required\", http.StatusBadRequest)\n\t\treturn\n\t}\n\tloadReq := &artifact.LoadRequest{\n\t\tAppName:   sessionID.AppName,\n\t\tUserID:    sessionID.UserID,\n\t\tSessionID: sessionID.ID,\n\t\tFileName:  artifactName,\n\t}\n\n\tqueryParams := req.URL.Query()\n\tversion := queryParams.Get(\"version\")\n\tif version != \"\" {\n\t\tversionInt, err := strconv.Atoi(version)\n\t\tif err != nil {\n\t\t\thttp.Error(rw, \"version parameter must be an integer\", http.StatusBadRequest)\n\t\t\treturn\n\t\t}\n\t\tloadReq.Version = int64(versionInt)\n\t}\n\n\tresp, err := c.artifactService.Load(req.Context(), loadReq)\n\tif err != nil {\n\t\thttp.Error(rw, err.Error(), http.StatusInternalServerError)\n\t\treturn\n\t}\n\tEncodeJSONResponse(resp.Part, http.StatusOK, rw)\n}\n\n// LoadArtifactVersionHandler gets an artifact from the artifact service storage with specified version.\nfunc (c *ArtifactsAPIController) LoadArtifactVersionHandler(rw http.ResponseWriter, req *http.Request) {\n\tvars := mux.Vars(req)\n\tsessionID, err := models.SessionIDFromHTTPParameters(vars)\n\tif err != nil {\n\t\thttp.Error(rw, err.Error(), http.StatusBadRequest)\n\t\treturn\n\t}\n\tif sessionID.ID == \"\" {\n\t\thttp.Error(rw, \"session_id parameter is required\", http.StatusBadRequest)\n\t\treturn\n\t}\n\tartifactName := vars[\"artifact_name\"]\n\tif artifactName == \"\" {\n\t\thttp.Error(rw, \"artifact_name parameter is required\", http.StatusBadRequest)\n\t\treturn\n\t}\n\tversion := vars[\"version\"]\n\n\tif version == \"\" {\n\t\thttp.Error(rw, \"version parameter is required\", http.StatusBadRequest)\n\t\treturn\n\t}\n\n\tversionInt, err := strconv.Atoi(version)\n\tif err != nil {\n\t\thttp.Error(rw, \"version parameter must be an integer\", http.StatusBadRequest)\n\t\treturn\n\t}\n\n\tloadReq := &artifact.LoadRequest{\n\t\tAppName:   sessionID.AppName,\n\t\tUserID:    sessionID.UserID,\n\t\tSessionID: sessionID.ID,\n\t\tFileName:  artifactName,\n\t\tVersion:   int64(versionInt),\n\t}\n\n\tresp, err := c.artifactService.Load(req.Context(), loadReq)\n\tif err != nil {\n\t\thttp.Error(rw, err.Error(), http.StatusInternalServerError)\n\t\treturn\n\t}\n\tEncodeJSONResponse(resp.Part, http.StatusOK, rw)\n}\n\n// DeleteArtifactHandler handles deleting an artifact.\nfunc (c *ArtifactsAPIController) DeleteArtifactHandler(rw http.ResponseWriter, req *http.Request) {\n\tvars := mux.Vars(req)\n\tsessionID, err := models.SessionIDFromHTTPParameters(vars)\n\tif err != nil {\n\t\thttp.Error(rw, err.Error(), http.StatusBadRequest)\n\t\treturn\n\t}\n\tif sessionID.ID == \"\" {\n\t\thttp.Error(rw, \"session_id parameter is required\", http.StatusBadRequest)\n\t\treturn\n\t}\n\tartifactName := vars[\"artifact_name\"]\n\tif artifactName == \"\" {\n\t\thttp.Error(rw, \"artifact_name parameter is required\", http.StatusBadRequest)\n\t\treturn\n\t}\n\terr = c.artifactService.Delete(req.Context(), &artifact.DeleteRequest{\n\t\tAppName:   sessionID.AppName,\n\t\tUserID:    sessionID.UserID,\n\t\tSessionID: sessionID.ID,\n\t\tFileName:  artifactName,\n\t})\n\tif err != nil {\n\t\thttp.Error(rw, err.Error(), http.StatusInternalServerError)\n\t\treturn\n\t}\n\tEncodeJSONResponse(nil, http.StatusOK, rw)\n}\n"
  },
  {
    "path": "server/adkrest/controllers/debug.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage controllers\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"slices\"\n\n\t\"github.com/gorilla/mux\"\n\tsemconv \"go.opentelemetry.io/otel/semconv/v1.36.0\"\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/agent\"\n\t\"google.golang.org/adk/server/adkrest/internal/models\"\n\t\"google.golang.org/adk/server/adkrest/internal/services\"\n\t\"google.golang.org/adk/session\"\n)\n\n// DebugAPIController is the controller for the Debug API.\ntype DebugAPIController struct {\n\tsessionService session.Service\n\tagentloader    agent.Loader\n\tdebugTelemetry *services.DebugTelemetry\n}\n\n// NewDebugAPIController creates the controller for the Debug API.\nfunc NewDebugAPIController(sessionService session.Service, agentLoader agent.Loader, spansExporter *services.DebugTelemetry) *DebugAPIController {\n\treturn &DebugAPIController{\n\t\tsessionService: sessionService,\n\t\tagentloader:    agentLoader,\n\t\tdebugTelemetry: spansExporter,\n\t}\n}\n\n// EventSpanHandler returns the debug span for the event.\nfunc (c *DebugAPIController) EventSpanHandler(rw http.ResponseWriter, req *http.Request) {\n\tparams := mux.Vars(req)\n\teventID := params[\"event_id\"]\n\tif eventID == \"\" {\n\t\thttp.Error(rw, \"event_id parameter is required\", http.StatusBadRequest)\n\t\treturn\n\t}\n\tspans := c.debugTelemetry.GetSpansByEventID(eventID)\n\tkey := string(semconv.GenAIOperationNameKey)\n\t// Return only generate content and execute tool spans.\n\twantedOperations := []string{\"execute_tool\", \"generate_content\"}\n\tfor _, span := range spans {\n\t\topName := span.Attributes[key]\n\t\tif slices.Contains(wantedOperations, opName) {\n\t\t\tresponse := convertEventSpan(span)\n\t\t\t// Return the first span that matches the wanted operations - single event should contain only a single generate content or execute tool span.\n\t\t\tEncodeJSONResponse(response, http.StatusOK, rw)\n\t\t\treturn\n\t\t}\n\t}\n\thttp.Error(rw, fmt.Sprintf(\"event not found: %s\", eventID), http.StatusNotFound)\n}\n\n// ADK web expects different format than in [SessionSpansHandler].\n// The main difference is that span attributes need to be flattened in the response.\nfunc convertEventSpan(span services.DebugSpan) map[string]any {\n\tflattened := map[string]any{\n\t\t\"name\":           span.Name,\n\t\t\"start_time\":     span.StartTime,\n\t\t\"end_time\":       span.EndTime,\n\t\t\"trace_id\":       span.TraceID,\n\t\t\"span_id\":        span.SpanID,\n\t\t\"parent_span_id\": span.ParentSpanID,\n\t\t\"logs\":           span.Logs,\n\t}\n\tfor k, v := range span.Attributes {\n\t\tflattened[string(k)] = v\n\t}\n\treturn flattened\n}\n\n// SessionSpansHandler returns the debug spans for the session.\nfunc (c *DebugAPIController) SessionSpansHandler(rw http.ResponseWriter, req *http.Request) {\n\tparams := mux.Vars(req)\n\tsessionID := params[\"session_id\"]\n\tif sessionID == \"\" {\n\t\thttp.Error(rw, \"session_id parameter is required\", http.StatusBadRequest)\n\t\treturn\n\t}\n\tspans := c.debugTelemetry.GetSpansBySessionID(sessionID)\n\tEncodeJSONResponse(spans, http.StatusOK, rw)\n}\n\n// EventGraphHandler returns the debug information for the session and session events in form of graph.\nfunc (c *DebugAPIController) EventGraphHandler(rw http.ResponseWriter, req *http.Request) {\n\tvars := mux.Vars(req)\n\tsessionID, err := models.SessionIDFromHTTPParameters(vars)\n\tif err != nil {\n\t\thttp.Error(rw, err.Error(), http.StatusBadRequest)\n\t\treturn\n\t}\n\tresp, err := c.sessionService.Get(req.Context(), &session.GetRequest{\n\t\tAppName:   sessionID.AppName,\n\t\tUserID:    sessionID.UserID,\n\t\tSessionID: sessionID.ID,\n\t})\n\tif err != nil {\n\t\thttp.Error(rw, err.Error(), http.StatusBadRequest)\n\t\treturn\n\t}\n\teventID := vars[\"event_id\"]\n\tif eventID == \"\" {\n\t\thttp.Error(rw, \"event_id parameter is required\", http.StatusBadRequest)\n\t\treturn\n\t}\n\n\tvar event *session.Event\n\tfor it := range resp.Session.Events().All() {\n\t\tif it.ID == eventID {\n\t\t\tevent = it\n\t\t\tbreak\n\t\t}\n\t}\n\n\tif event == nil {\n\t\thttp.Error(rw, \"event not found\", http.StatusNotFound)\n\t\treturn\n\t}\n\n\thighlightedPairs := [][]string{}\n\tfc := functionalCalls(event)\n\tfr := functionalResponses(event)\n\n\tif len(fc) > 0 {\n\t\tfor _, f := range fc {\n\t\t\tif f.Name != \"\" {\n\t\t\t\thighlightedPairs = append(highlightedPairs, []string{f.Name, event.Author})\n\t\t\t}\n\t\t}\n\t} else if len(fr) > 0 {\n\t\tfor _, f := range fr {\n\t\t\tif f.Name != \"\" {\n\t\t\t\thighlightedPairs = append(highlightedPairs, []string{f.Name, event.Author})\n\t\t\t}\n\t\t}\n\t} else {\n\t\thighlightedPairs = append(highlightedPairs, []string{event.Author, event.Author})\n\t}\n\n\tagent, err := c.agentloader.LoadAgent(sessionID.AppName)\n\tif err != nil {\n\t\thttp.Error(rw, err.Error(), http.StatusInternalServerError)\n\t\treturn\n\t}\n\tgraph, err := services.GetAgentGraph(req.Context(), agent, highlightedPairs)\n\tif err != nil {\n\t\thttp.Error(rw, err.Error(), http.StatusInternalServerError)\n\t\treturn\n\t}\n\tEncodeJSONResponse(map[string]string{\"dotSrc\": graph}, http.StatusOK, rw)\n}\n\nfunc functionalCalls(event *session.Event) []*genai.FunctionCall {\n\tif event.LLMResponse.Content == nil || event.LLMResponse.Content.Parts == nil {\n\t\treturn nil\n\t}\n\tfc := []*genai.FunctionCall{}\n\tfor _, part := range event.LLMResponse.Content.Parts {\n\t\tif part.FunctionCall != nil {\n\t\t\tfc = append(fc, part.FunctionCall)\n\t\t}\n\t}\n\treturn fc\n}\n\nfunc functionalResponses(event *session.Event) []*genai.FunctionResponse {\n\tif event.LLMResponse.Content == nil || event.LLMResponse.Content.Parts == nil {\n\t\treturn nil\n\t}\n\tfr := []*genai.FunctionResponse{}\n\tfor _, part := range event.LLMResponse.Content.Parts {\n\t\tif part.FunctionResponse != nil {\n\t\t\tfr = append(fr, part.FunctionResponse)\n\t\t}\n\t}\n\treturn fr\n}\n"
  },
  {
    "path": "server/adkrest/controllers/debug_test.go",
    "content": "// Copyright 2026 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage controllers_test\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"net/http\"\n\t\"net/http/httptest\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/google/go-cmp/cmp\"\n\t\"github.com/google/go-cmp/cmp/cmpopts\"\n\t\"github.com/gorilla/mux\"\n\t\"go.opentelemetry.io/otel/attribute\"\n\t\"go.opentelemetry.io/otel/log\"\n\tsdklog \"go.opentelemetry.io/otel/sdk/log\"\n\tsdktrace \"go.opentelemetry.io/otel/sdk/trace\"\n\tsemconv \"go.opentelemetry.io/otel/semconv/v1.36.0\"\n\t\"go.opentelemetry.io/otel/trace\"\n\n\t\"google.golang.org/adk/server/adkrest/controllers\"\n\t\"google.golang.org/adk/server/adkrest/internal/services\"\n)\n\nfunc TestSessionSpansHandler(t *testing.T) {\n\ttc := []struct {\n\t\tname         string\n\t\tsessionID    string\n\t\treqSessionID string\n\t\twantStatus   int\n\t\twantBody     []map[string]any\n\t}{\n\t\t{\n\t\t\tname:         \"spans_found_for_session\",\n\t\t\tsessionID:    \"test-session\",\n\t\t\treqSessionID: \"test-session\",\n\t\t\twantStatus:   http.StatusOK,\n\t\t\twantBody: []map[string]any{\n\t\t\t\t{\n\t\t\t\t\t\"name\":           \"test-span\",\n\t\t\t\t\t\"start_time\":     \"test-time\",\n\t\t\t\t\t\"end_time\":       \"test-time\",\n\t\t\t\t\t\"trace_id\":       \"test-trace-id\",\n\t\t\t\t\t\"span_id\":        \"test-span-id\",\n\t\t\t\t\t\"parent_span_id\": \"test-parent-span-id\",\n\t\t\t\t\t\"attributes\": map[string]any{\n\t\t\t\t\t\t\"gcp.vertex.agent.event_id\": \"test-event\",\n\t\t\t\t\t\t\"gen_ai.conversation.id\":    \"test-session\",\n\t\t\t\t\t\t\"gen_ai.operation.name\":     \"execute_tool\",\n\t\t\t\t\t},\n\t\t\t\t\t\"logs\": []any{\n\t\t\t\t\t\tmap[string]any{\n\t\t\t\t\t\t\t\"event_name\": \"test-log-event\",\n\t\t\t\t\t\t\t\"body\": map[string]any{\n\t\t\t\t\t\t\t\t\"message\": \"test log message\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname:         \"spans_not_found_for_session\",\n\t\t\tsessionID:    \"test-session\",\n\t\t\treqSessionID: \"other-session\",\n\t\t\twantStatus:   http.StatusOK,\n\t\t\twantBody:     []map[string]any{},\n\t\t},\n\t\t{\n\t\t\tname:         \"empty_session_id_param\",\n\t\t\tsessionID:    \"test-session\",\n\t\t\treqSessionID: \"\",\n\t\t\twantStatus:   http.StatusBadRequest,\n\t\t},\n\t}\n\n\tfor _, tt := range tc {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\teventID := \"test-event\"\n\t\t\topName := semconv.GenAIOperationNameExecuteTool.Value.AsString()\n\t\t\ttestTelemetry := setupTestTelemetry()\n\n\t\t\tapiController := controllers.NewDebugAPIController(nil, nil, testTelemetry.dt)\n\t\t\treq, err := http.NewRequest(http.MethodGet, \"/debug/sessions/\"+tt.reqSessionID+\"/spans\", nil)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"new request: %v\", err)\n\t\t\t}\n\n\t\t\treq = mux.SetURLVars(req, map[string]string{\n\t\t\t\t\"session_id\": tt.reqSessionID,\n\t\t\t})\n\t\t\trr := httptest.NewRecorder()\n\n\t\t\temitTestSignals(tt.sessionID, eventID, opName, testTelemetry.tp, testTelemetry.lp)\n\t\t\tapiController.SessionSpansHandler(rr, req)\n\n\t\t\tif gotStatus := rr.Code; gotStatus != tt.wantStatus {\n\t\t\t\tt.Fatalf(\"handler returned wrong status code: got %v want %v\", gotStatus, tt.wantStatus)\n\t\t\t}\n\n\t\t\tif tt.wantStatus == http.StatusOK {\n\t\t\t\tvar result []map[string]any\n\t\t\t\terr = json.NewDecoder(rr.Body).Decode(&result)\n\t\t\t\tif err != nil {\n\t\t\t\t\tt.Fatalf(\"decode response: %v\", err)\n\t\t\t\t}\n\n\t\t\t\tif diff := cmp.Diff(tt.wantBody, result, ignoreDynamicFields()); diff != \"\" {\n\t\t\t\t\tt.Errorf(\"handler returned unexpected body (-want +got):\\n%s\", diff)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestEventSpanHandler(t *testing.T) {\n\ttc := []struct {\n\t\tname       string\n\t\teventID    string\n\t\treqEventID string\n\t\topName     string\n\t\twantStatus int\n\t\twantBody   map[string]any\n\t}{\n\t\t{\n\t\t\tname:       \"span_with_generate_content_operation\",\n\t\t\teventID:    \"test-event\",\n\t\t\treqEventID: \"test-event\",\n\t\t\topName:     semconv.GenAIOperationNameGenerateContent.Value.AsString(),\n\t\t\twantStatus: http.StatusOK,\n\t\t\twantBody: map[string]any{\n\t\t\t\t\"name\":                      \"test-span\",\n\t\t\t\t\"gcp.vertex.agent.event_id\": \"test-event\",\n\t\t\t\t\"gen_ai.conversation.id\":    \"test-session\",\n\t\t\t\t\"gen_ai.operation.name\":     semconv.GenAIOperationNameGenerateContent.Value.AsString(),\n\t\t\t\t\"logs\": []any{\n\t\t\t\t\tmap[string]any{\n\t\t\t\t\t\t\"event_name\": \"test-log-event\",\n\t\t\t\t\t\t\"body\": map[string]any{\n\t\t\t\t\t\t\t\"message\": \"test log message\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname:       \"span_with_execute_tool_operation\",\n\t\t\teventID:    \"test-event\",\n\t\t\treqEventID: \"test-event\",\n\t\t\topName:     semconv.GenAIOperationNameExecuteTool.Value.AsString(),\n\t\t\twantStatus: http.StatusOK,\n\t\t\twantBody: map[string]any{\n\t\t\t\t\"name\":                      \"test-span\",\n\t\t\t\t\"gcp.vertex.agent.event_id\": \"test-event\",\n\t\t\t\t\"gen_ai.conversation.id\":    \"test-session\",\n\t\t\t\t\"gen_ai.operation.name\":     semconv.GenAIOperationNameExecuteTool.Value.AsString(),\n\t\t\t\t\"logs\": []any{\n\t\t\t\t\tmap[string]any{\n\t\t\t\t\t\t\"event_name\": \"test-log-event\",\n\t\t\t\t\t\t\"body\": map[string]any{\n\t\t\t\t\t\t\t\"message\": \"test log message\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname:       \"span_not_found_for_event_id\",\n\t\t\teventID:    \"test-event\",\n\t\t\treqEventID: \"other-event\",\n\t\t\topName:     semconv.GenAIOperationNameExecuteTool.Value.AsString(),\n\t\t\twantStatus: http.StatusNotFound,\n\t\t},\n\t\t{\n\t\t\tname:       \"span_with_different_operation_name\",\n\t\t\teventID:    \"test-event\",\n\t\t\treqEventID: \"test-event\",\n\t\t\topName:     \"other-op\",\n\t\t\twantStatus: http.StatusNotFound,\n\t\t},\n\t\t{\n\t\t\tname:       \"empty_event_id_param\",\n\t\t\teventID:    \"test-event\",\n\t\t\treqEventID: \"\",\n\t\t\topName:     semconv.GenAIOperationNameExecuteTool.Value.AsString(),\n\t\t\twantStatus: http.StatusBadRequest,\n\t\t},\n\t}\n\n\tfor _, tt := range tc {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tsessionID := \"test-session\"\n\t\t\ttestTelemetry := setupTestTelemetry()\n\n\t\t\tapiController := controllers.NewDebugAPIController(nil, nil, testTelemetry.dt)\n\t\t\treq, err := http.NewRequest(http.MethodGet, \"/debug/events/\"+tt.reqEventID+\"/span\", nil)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"new request: %v\", err)\n\t\t\t}\n\n\t\t\treq = mux.SetURLVars(req, map[string]string{\n\t\t\t\t\"event_id\": tt.reqEventID,\n\t\t\t})\n\t\t\trr := httptest.NewRecorder()\n\n\t\t\temitTestSignals(sessionID, tt.eventID, tt.opName, testTelemetry.tp, testTelemetry.lp)\n\t\t\tapiController.EventSpanHandler(rr, req)\n\n\t\t\tif status := rr.Code; status != tt.wantStatus {\n\t\t\t\tt.Fatalf(\"handler returned wrong status code: got %v want %v\", status, tt.wantStatus)\n\t\t\t}\n\n\t\t\tif tt.wantStatus == http.StatusOK {\n\t\t\t\tvar gotBody map[string]any\n\t\t\t\terr = json.NewDecoder(rr.Body).Decode(&gotBody)\n\t\t\t\tif err != nil {\n\t\t\t\t\tt.Fatalf(\"decode response: %v\", err)\n\t\t\t\t}\n\n\t\t\t\tif diff := cmp.Diff(tt.wantBody, gotBody, ignoreDynamicFields()); diff != \"\" {\n\t\t\t\t\tt.Errorf(\"handler returned unexpected body (-want +got):\\n%s\", diff)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc ignoreDynamicFields() cmp.Option {\n\treturn cmpopts.IgnoreMapEntries(func(k string, v any) bool {\n\t\tswitch k {\n\t\tcase \"end_time\", \"observed_timestamp\", \"span_id\", \"start_time\", \"trace_id\", \"parent_span_id\":\n\t\t\treturn true\n\t\tdefault:\n\t\t\treturn false\n\t\t}\n\t})\n}\n\ntype testTelemetry struct {\n\tdt     *services.DebugTelemetry\n\ttracer trace.Tracer\n\ttp     *sdktrace.TracerProvider\n\tlogger log.Logger\n\tlp     *sdklog.LoggerProvider\n}\n\nfunc setupTestTelemetry() *testTelemetry {\n\tdt := services.NewDebugTelemetry()\n\n\ttp := sdktrace.NewTracerProvider(sdktrace.WithSpanProcessor(dt.SpanProcessor()))\n\tlp := sdklog.NewLoggerProvider(sdklog.WithProcessor(dt.LogProcessor()))\n\n\ttracer := tp.Tracer(\"test-tracer\")\n\tlogger := lp.Logger(\"test-logger\")\n\n\treturn &testTelemetry{\n\t\tdt:     dt,\n\t\ttracer: tracer,\n\t\ttp:     tp,\n\t\tlogger: logger,\n\t\tlp:     lp,\n\t}\n}\n\nfunc emitTestSignals(sessionID, eventID, opName string, tp *sdktrace.TracerProvider, lp *sdklog.LoggerProvider) {\n\ttracer := tp.Tracer(\"test-tracer\")\n\tlogger := lp.Logger(\"test-logger\")\n\n\tctx, span := tracer.Start(context.Background(), \"test-span\", trace.WithAttributes(\n\t\tattribute.String(\"gcp.vertex.agent.event_id\", eventID),\n\t\tattribute.String(string(semconv.GenAIConversationIDKey), sessionID),\n\t\tattribute.String(string(semconv.GenAIOperationNameKey), opName),\n\t))\n\n\tvar record log.Record\n\trecord.SetTimestamp(time.Now())\n\trecord.SetObservedTimestamp(time.Now())\n\trecord.SetEventName(\"test-log-event\")\n\trecord.SetBody(\n\t\tlog.MapValue(\n\t\t\tlog.KeyValue{\n\t\t\t\tKey:   \"message\",\n\t\t\t\tValue: log.StringValue(\"test log message\"),\n\t\t\t},\n\t\t),\n\t)\n\tlogger.Emit(ctx, record)\n\n\tspan.End()\n\n\t_ = tp.ForceFlush(context.Background())\n\t_ = lp.ForceFlush(context.Background())\n}\n"
  },
  {
    "path": "server/adkrest/controllers/errors.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage controllers\n\ntype statusError struct {\n\tErr  error\n\tCode int\n}\n\nfunc newStatusError(err error, code int) statusError {\n\treturn statusError{Err: err, Code: code}\n}\n\n// Error returns an associated error\nfunc (se statusError) Error() string {\n\treturn se.Err.Error()\n}\n\n// Status returns an associated status code\nfunc (se statusError) Status() int {\n\treturn se.Code\n}\n"
  },
  {
    "path": "server/adkrest/controllers/handlers.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Package controllers contains the controllers for the ADK REST API.\npackage controllers\n\nimport (\n\t\"encoding/json\"\n\t\"net/http\"\n)\n\n// TODO: Move to an internal package, controllers doesn't have to be public API.\n\n// EncodeJSONResponse uses the json encoder to write an interface to the http response with an optional status code\nfunc EncodeJSONResponse(i any, status int, w http.ResponseWriter) {\n\twHeader := w.Header()\n\twHeader.Set(\"Content-Type\", \"application/json; charset=UTF-8\")\n\n\tw.WriteHeader(status)\n\n\tif i != nil {\n\t\terr := json.NewEncoder(w).Encode(i)\n\t\tif err != nil {\n\t\t\thttp.Error(w, err.Error(), http.StatusInternalServerError)\n\t\t}\n\t}\n}\n\ntype errorHandler func(http.ResponseWriter, *http.Request) error\n\n// NewErrorHandler writes the error code returned from the http handler.\nfunc NewErrorHandler(fn errorHandler) http.HandlerFunc {\n\treturn func(w http.ResponseWriter, r *http.Request) {\n\t\terr := fn(w, r)\n\t\tif err != nil {\n\t\t\tif statusErr, ok := err.(statusError); ok {\n\t\t\t\thttp.Error(w, statusErr.Error(), statusErr.Status())\n\t\t\t} else {\n\t\t\t\thttp.Error(w, err.Error(), http.StatusInternalServerError)\n\t\t\t}\n\t\t}\n\t}\n}\n\n// Unimplemented returns 501 - Status Not Implemented error\nfunc Unimplemented(rw http.ResponseWriter, req *http.Request) {\n\trw.WriteHeader(http.StatusNotImplemented)\n}\n"
  },
  {
    "path": "server/adkrest/controllers/runtime.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage controllers\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"net/http\"\n\t\"time\"\n\n\t\"google.golang.org/adk/agent\"\n\t\"google.golang.org/adk/artifact\"\n\t\"google.golang.org/adk/memory\"\n\t\"google.golang.org/adk/runner\"\n\t\"google.golang.org/adk/server/adkrest/internal/models\"\n\t\"google.golang.org/adk/session\"\n)\n\n// RuntimeAPIController is the controller for the Runtime API.\ntype RuntimeAPIController struct {\n\tsseTimeout      time.Duration\n\tsessionService  session.Service\n\tmemoryService   memory.Service\n\tartifactService artifact.Service\n\tagentLoader     agent.Loader\n\tpluginConfig    runner.PluginConfig\n}\n\n// NewRuntimeAPIController creates the controller for the Runtime API.\nfunc NewRuntimeAPIController(sessionService session.Service, memoryService memory.Service, agentLoader agent.Loader, artifactService artifact.Service, sseTimeout time.Duration, pluginConfig runner.PluginConfig) *RuntimeAPIController {\n\treturn &RuntimeAPIController{sessionService: sessionService, memoryService: memoryService, agentLoader: agentLoader, artifactService: artifactService, sseTimeout: sseTimeout, pluginConfig: pluginConfig}\n}\n\n// RunAgent executes a non-streaming agent run for a given session and message.\nfunc (c *RuntimeAPIController) RunHandler(rw http.ResponseWriter, req *http.Request) error {\n\trunAgentRequest, err := decodeRequestBody(req)\n\tif err != nil {\n\t\treturn err\n\t}\n\tsessionEvents, err := c.runAgent(req.Context(), runAgentRequest)\n\tif err != nil {\n\t\treturn err\n\t}\n\tvar events []models.Event\n\tfor _, event := range sessionEvents {\n\t\tevents = append(events, models.FromSessionEvent(*event))\n\t}\n\tEncodeJSONResponse(events, http.StatusOK, rw)\n\treturn nil\n}\n\n// RunAgent executes a non-streaming agent run for a given session and message.\nfunc (c *RuntimeAPIController) runAgent(ctx context.Context, runAgentRequest models.RunAgentRequest) ([]*session.Event, error) {\n\terr := c.validateSessionExists(ctx, runAgentRequest.AppName, runAgentRequest.UserId, runAgentRequest.SessionId)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tr, rCfg, err := c.getRunner(runAgentRequest)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tresp := r.Run(ctx, runAgentRequest.UserId, runAgentRequest.SessionId, &runAgentRequest.NewMessage, *rCfg)\n\n\tvar events []*session.Event\n\tfor event, err := range resp {\n\t\tif err != nil {\n\t\t\treturn nil, newStatusError(fmt.Errorf(\"failed to run agent: %w\", err), http.StatusInternalServerError)\n\t\t}\n\t\tevents = append(events, event)\n\t}\n\treturn events, nil\n}\n\n// RunSSEHandler executes an agent run and streams the resulting events using Server-Sent Events (SSE).\nfunc (c *RuntimeAPIController) RunSSEHandler(rw http.ResponseWriter, req *http.Request) error {\n\trw.Header().Set(\"Content-Type\", \"text/event-stream\")\n\trw.Header().Set(\"Cache-Control\", \"no-cache\")\n\trw.Header().Set(\"Connection\", \"keep-alive\")\n\n\t// set custom deadlines for this request - it overrides server-wide timeouts\n\trc := http.NewResponseController(rw)\n\tdeadline := time.Now().Add(c.sseTimeout)\n\terr := rc.SetWriteDeadline(deadline)\n\tif err != nil {\n\t\treturn newStatusError(fmt.Errorf(\"failed to set write deadline: %w\", err), http.StatusInternalServerError)\n\t}\n\n\trunAgentRequest, err := decodeRequestBody(req)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\terr = c.validateSessionExists(req.Context(), runAgentRequest.AppName, runAgentRequest.UserId, runAgentRequest.SessionId)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tr, rCfg, err := c.getRunner(runAgentRequest)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\topts := []runner.RunOption{}\n\tif runAgentRequest.StateDelta != nil {\n\t\topts = append(opts, runner.WithStateDelta(*runAgentRequest.StateDelta))\n\t}\n\tresp := r.Run(req.Context(), runAgentRequest.UserId, runAgentRequest.SessionId, &runAgentRequest.NewMessage, *rCfg, opts...)\n\n\tfor event, err := range resp {\n\t\tif err != nil {\n\t\t\t_, err := fmt.Fprintf(rw, \"Error while running agent: %v\\n\", err)\n\t\t\tif err != nil {\n\t\t\t\treturn newStatusError(fmt.Errorf(\"failed to write response: %w\", err), http.StatusInternalServerError)\n\t\t\t}\n\t\t\terr = rc.Flush()\n\t\t\tif err != nil {\n\t\t\t\treturn newStatusError(fmt.Errorf(\"failed to flush: %w\", err), http.StatusInternalServerError)\n\t\t\t}\n\n\t\t\tcontinue\n\t\t}\n\t\terr := flashEvent(rc, rw, *event)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc flashEvent(rc *http.ResponseController, rw http.ResponseWriter, event session.Event) error {\n\t_, err := fmt.Fprintf(rw, \"data: \")\n\tif err != nil {\n\t\treturn newStatusError(fmt.Errorf(\"failed to write response: %w\", err), http.StatusInternalServerError)\n\t}\n\terr = json.NewEncoder(rw).Encode(models.FromSessionEvent(event))\n\tif err != nil {\n\t\treturn newStatusError(fmt.Errorf(\"failed to encode response: %w\", err), http.StatusInternalServerError)\n\t}\n\t_, err = fmt.Fprintf(rw, \"\\n\")\n\tif err != nil {\n\t\treturn newStatusError(fmt.Errorf(\"failed to write response: %w\", err), http.StatusInternalServerError)\n\t}\n\terr = rc.Flush()\n\tif err != nil {\n\t\treturn newStatusError(fmt.Errorf(\"failed to flush: %w\", err), http.StatusInternalServerError)\n\t}\n\treturn nil\n}\n\nfunc (c *RuntimeAPIController) validateSessionExists(ctx context.Context, appName, userID, sessionID string) error {\n\t_, err := c.sessionService.Get(ctx, &session.GetRequest{\n\t\tAppName:   appName,\n\t\tUserID:    userID,\n\t\tSessionID: sessionID,\n\t})\n\tif err != nil {\n\t\treturn newStatusError(fmt.Errorf(\"failed to get session: %w\", err), http.StatusNotFound)\n\t}\n\treturn nil\n}\n\nfunc (c *RuntimeAPIController) getRunner(req models.RunAgentRequest) (*runner.Runner, *agent.RunConfig, error) {\n\tcurAgent, err := c.agentLoader.LoadAgent(req.AppName)\n\tif err != nil {\n\t\treturn nil, nil, newStatusError(fmt.Errorf(\"failed to load agent: %w\", err), http.StatusInternalServerError)\n\t}\n\n\tr, err := runner.New(runner.Config{\n\t\tAppName:         req.AppName,\n\t\tAgent:           curAgent,\n\t\tSessionService:  c.sessionService,\n\t\tMemoryService:   c.memoryService,\n\t\tArtifactService: c.artifactService,\n\t\tPluginConfig:    c.pluginConfig,\n\t},\n\t)\n\tif err != nil {\n\t\treturn nil, nil, newStatusError(fmt.Errorf(\"failed to create runner: %w\", err), http.StatusInternalServerError)\n\t}\n\n\tstreamingMode := agent.StreamingModeNone\n\tif req.Streaming {\n\t\tstreamingMode = agent.StreamingModeSSE\n\t}\n\treturn r, &agent.RunConfig{\n\t\tStreamingMode: streamingMode,\n\t}, nil\n}\n\nfunc decodeRequestBody(req *http.Request) (decodedReq models.RunAgentRequest, err error) {\n\tvar runAgentRequest models.RunAgentRequest\n\tdefer func() {\n\t\terr = req.Body.Close()\n\t}()\n\td := json.NewDecoder(req.Body)\n\td.DisallowUnknownFields()\n\tif err := d.Decode(&runAgentRequest); err != nil {\n\t\treturn runAgentRequest, newStatusError(fmt.Errorf(\"failed to decode request: %w\", err), http.StatusBadRequest)\n\t}\n\treturn runAgentRequest, nil\n}\n"
  },
  {
    "path": "server/adkrest/controllers/runtime_test.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage controllers\n\nimport (\n\t\"testing\"\n\t\"time\"\n\n\t\"google.golang.org/adk/plugin\"\n\t\"google.golang.org/adk/runner\"\n)\n\nfunc TestNewRuntimeAPIController_PluginsAssignment(t *testing.T) {\n\tp1, err := plugin.New(plugin.Config{Name: \"plugin1\"})\n\tif err != nil {\n\t\tt.Fatalf(\"plugin.New() failed for plugin1: %v\", err)\n\t}\n\n\tp2, err := plugin.New(plugin.Config{Name: \"plugin2\"})\n\tif err != nil {\n\t\tt.Fatalf(\"plugin.New() failed for plugin2: %v\", err)\n\t}\n\n\ttc := []struct {\n\t\tname        string\n\t\tplugins     []*plugin.Plugin\n\t\twantPlugins int\n\t}{\n\t\t{\n\t\t\tname:        \"with no plugins\",\n\t\t\tplugins:     nil,\n\t\t\twantPlugins: 0,\n\t\t},\n\t\t{\n\t\t\tname:        \"with empty plugin list\",\n\t\t\tplugins:     []*plugin.Plugin{},\n\t\t\twantPlugins: 0,\n\t\t},\n\t\t{\n\t\t\tname:        \"with single plugin\",\n\t\t\tplugins:     []*plugin.Plugin{p1},\n\t\t\twantPlugins: 1,\n\t\t},\n\t\t{\n\t\t\tname:        \"with multiple plugins\",\n\t\t\tplugins:     []*plugin.Plugin{p1, p2},\n\t\t\twantPlugins: 2,\n\t\t},\n\t}\n\n\tfor _, tt := range tc {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tcontroller := NewRuntimeAPIController(nil, nil, nil, nil, 10*time.Second, runner.PluginConfig{\n\t\t\t\tPlugins: tt.plugins,\n\t\t\t})\n\n\t\t\tif controller == nil {\n\t\t\t\tt.Fatal(\"NewRuntimeAPIController returned nil\")\n\t\t\t}\n\n\t\t\tif got := len(controller.pluginConfig.Plugins); got != tt.wantPlugins {\n\t\t\t\tt.Errorf(\"NewRuntimeAPIController() plugins count = %v, want %v\", got, tt.wantPlugins)\n\t\t\t}\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "server/adkrest/controllers/sessions.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage controllers\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"net/http\"\n\n\t\"github.com/gorilla/mux\"\n\n\t\"google.golang.org/adk/server/adkrest/internal/models\"\n\t\"google.golang.org/adk/session\"\n)\n\n// TODO: Confirm error handling and target semantic for REST API.\n\n// SessionsAPIController is the controller for the Sessions API.\ntype SessionsAPIController struct {\n\tservice session.Service\n}\n\n// NewSessionsAPIController creates a new SessionsAPIController.\nfunc NewSessionsAPIController(service session.Service) *SessionsAPIController {\n\treturn &SessionsAPIController{service: service}\n}\n\n// CreateSesssionHTTP is a HTTP handler for the create session API.\nfunc (c *SessionsAPIController) CreateSessionHandler(rw http.ResponseWriter, req *http.Request) {\n\tparams := mux.Vars(req)\n\tsessionID, err := models.SessionIDFromHTTPParameters(params)\n\tif err != nil {\n\t\thttp.Error(rw, err.Error(), http.StatusBadRequest)\n\t\treturn\n\t}\n\tcreateSessionRequest := models.CreateSessionRequest{}\n\t// No state and no events, fails to decode req.Body failing with \"EOF\"\n\tif req.ContentLength > 0 {\n\t\terr := json.NewDecoder(req.Body).Decode(&createSessionRequest)\n\t\tif err != nil {\n\t\t\thttp.Error(rw, err.Error(), http.StatusBadRequest)\n\t\t\treturn\n\t\t}\n\t}\n\trespSession, err := c.createSession(req.Context(), sessionID, createSessionRequest)\n\tif err != nil {\n\t\thttp.Error(rw, err.Error(), http.StatusInternalServerError)\n\t\treturn\n\t}\n\tEncodeJSONResponse(respSession, http.StatusOK, rw)\n}\n\nfunc (c *SessionsAPIController) createSession(ctx context.Context, sessionID models.SessionID, createSessionRequest models.CreateSessionRequest) (models.Session, error) {\n\tsession, err := c.service.Create(ctx, &session.CreateRequest{\n\t\tAppName:   sessionID.AppName,\n\t\tUserID:    sessionID.UserID,\n\t\tSessionID: sessionID.ID,\n\t\tState:     createSessionRequest.State,\n\t})\n\tif err != nil {\n\t\treturn models.Session{}, err\n\t}\n\tfor _, event := range createSessionRequest.Events {\n\t\terr = c.service.AppendEvent(ctx, session.Session, models.ToSessionEvent(event))\n\t\tif err != nil {\n\t\t\treturn models.Session{}, err\n\t\t}\n\t}\n\treturn models.FromSession(session.Session)\n}\n\n// DeleteSession handles deleting a specific session.\nfunc (c *SessionsAPIController) DeleteSessionHandler(rw http.ResponseWriter, req *http.Request) {\n\tparams := mux.Vars(req)\n\tsessionID, err := models.SessionIDFromHTTPParameters(params)\n\tif err != nil {\n\t\thttp.Error(rw, err.Error(), http.StatusBadRequest)\n\t\treturn\n\t}\n\tif sessionID.ID == \"\" {\n\t\thttp.Error(rw, \"session_id parameter is required\", http.StatusBadRequest)\n\t\treturn\n\t}\n\n\terr = c.service.Delete(req.Context(), &session.DeleteRequest{\n\t\tAppName:   sessionID.AppName,\n\t\tUserID:    sessionID.UserID,\n\t\tSessionID: sessionID.ID,\n\t})\n\tif err != nil {\n\t\thttp.Error(rw, err.Error(), http.StatusInternalServerError)\n\t\treturn\n\t}\n\tEncodeJSONResponse(nil, http.StatusOK, rw)\n}\n\n// GetSession retrieves a specific session by its ID.\nfunc (c *SessionsAPIController) GetSessionHandler(rw http.ResponseWriter, req *http.Request) {\n\tparams := mux.Vars(req)\n\tsessionID, err := models.SessionIDFromHTTPParameters(params)\n\tif err != nil {\n\t\thttp.Error(rw, err.Error(), http.StatusBadRequest)\n\t\treturn\n\t}\n\tif sessionID.ID == \"\" {\n\t\thttp.Error(rw, \"session_id parameter is required\", http.StatusBadRequest)\n\t\treturn\n\t}\n\tstoredSession, err := c.service.Get(req.Context(), &session.GetRequest{\n\t\tAppName:   sessionID.AppName,\n\t\tUserID:    sessionID.UserID,\n\t\tSessionID: sessionID.ID,\n\t})\n\tif err != nil {\n\t\thttp.Error(rw, err.Error(), http.StatusInternalServerError)\n\t\treturn\n\t}\n\tsession, err := models.FromSession(storedSession.Session)\n\tif err != nil {\n\t\thttp.Error(rw, err.Error(), http.StatusInternalServerError)\n\t\treturn\n\t}\n\tEncodeJSONResponse(session, http.StatusOK, rw)\n}\n\n// ListSessions handles listing all sessions for a given app and user.\nfunc (c *SessionsAPIController) ListSessionsHandler(rw http.ResponseWriter, req *http.Request) {\n\tparams := mux.Vars(req)\n\tsessionID, err := models.SessionIDFromHTTPParameters(params)\n\tif err != nil {\n\t\thttp.Error(rw, err.Error(), http.StatusBadRequest)\n\t\treturn\n\t}\n\tvar sessions []models.Session\n\tresp, err := c.service.List(req.Context(), &session.ListRequest{\n\t\tAppName: sessionID.AppName,\n\t\tUserID:  sessionID.UserID,\n\t})\n\tif err != nil {\n\t\thttp.Error(rw, err.Error(), http.StatusInternalServerError)\n\t\treturn\n\t}\n\tfor _, session := range resp.Sessions {\n\t\trespSession, err := models.FromSession(session)\n\t\tif err != nil {\n\t\t\thttp.Error(rw, err.Error(), http.StatusInternalServerError)\n\t\t\treturn\n\t\t}\n\t\tsessions = append(sessions, respSession)\n\t}\n\tEncodeJSONResponse(sessions, http.StatusOK, rw)\n}\n"
  },
  {
    "path": "server/adkrest/controllers/sessions_test.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage controllers_test\n\nimport (\n\t\"bytes\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"net/http\"\n\t\"net/http/httptest\"\n\t\"strings\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/google/go-cmp/cmp\"\n\t\"github.com/google/go-cmp/cmp/cmpopts\"\n\t\"github.com/gorilla/mux\"\n\n\t\"google.golang.org/adk/server/adkrest/controllers\"\n\t\"google.golang.org/adk/server/adkrest/internal/fakes\"\n\t\"google.golang.org/adk/server/adkrest/internal/models\"\n)\n\nfunc TestGetSession(t *testing.T) {\n\tid := fakes.SessionKey{\n\t\tAppName:   \"testApp\",\n\t\tUserID:    \"testUser\",\n\t\tSessionID: \"testSession\",\n\t}\n\n\ttc := []struct {\n\t\tname           string\n\t\tstoredSessions map[fakes.SessionKey]fakes.TestSession\n\t\tsessionID      fakes.SessionKey\n\t\twantSession    models.Session\n\t\twantErr        error\n\t\twantStatus     int\n\t}{\n\t\t{\n\t\t\tname: \"session exists\",\n\t\t\tstoredSessions: map[fakes.SessionKey]fakes.TestSession{\n\t\t\t\tid: {\n\t\t\t\t\tId:            id,\n\t\t\t\t\tSessionState:  fakes.TestState{\"foo\": \"bar\"},\n\t\t\t\t\tSessionEvents: fakes.TestEvents{},\n\t\t\t\t\tUpdatedAt:     time.Now(),\n\t\t\t\t},\n\t\t\t},\n\t\t\tsessionID: id,\n\t\t\twantSession: models.Session{\n\t\t\t\tID:        \"testSession\",\n\t\t\t\tAppName:   \"testApp\",\n\t\t\t\tUserID:    \"testUser\",\n\t\t\t\tUpdatedAt: time.Now().Unix(),\n\t\t\t\tEvents:    []models.Event{},\n\t\t\t\tState: map[string]any{\n\t\t\t\t\t\"foo\": \"bar\",\n\t\t\t\t},\n\t\t\t},\n\t\t\twantStatus: http.StatusOK,\n\t\t},\n\t\t{\n\t\t\tname:           \"session does not exist\",\n\t\t\tstoredSessions: map[fakes.SessionKey]fakes.TestSession{},\n\t\t\tsessionID:      id,\n\t\t\twantErr:        fmt.Errorf(\"not found\"),\n\t\t\twantStatus:     http.StatusInternalServerError,\n\t\t},\n\t\t{\n\t\t\tname: \"user ID is missing in input\",\n\t\t\tstoredSessions: map[fakes.SessionKey]fakes.TestSession{\n\t\t\t\tid: {\n\t\t\t\t\tId:            id,\n\t\t\t\t\tSessionState:  fakes.TestState{\"foo\": \"bar\"},\n\t\t\t\t\tSessionEvents: fakes.TestEvents{},\n\t\t\t\t\tUpdatedAt:     time.Now(),\n\t\t\t\t},\n\t\t\t},\n\t\t\tsessionID: fakes.SessionKey{\n\t\t\t\tAppName:   \"testApp\",\n\t\t\t\tSessionID: \"testSession\",\n\t\t\t},\n\t\t\twantErr:    fmt.Errorf(\"user_id parameter is required\"),\n\t\t\twantStatus: http.StatusBadRequest,\n\t\t},\n\t\t{\n\t\t\tname: \"session ID is missing\",\n\t\t\tstoredSessions: map[fakes.SessionKey]fakes.TestSession{\n\t\t\t\tid: {\n\t\t\t\t\tId: fakes.SessionKey{\n\t\t\t\t\t\tAppName: \"testApp\",\n\t\t\t\t\t\tUserID:  \"testUser\",\n\t\t\t\t\t},\n\t\t\t\t\tSessionState:  fakes.TestState{\"foo\": \"bar\"},\n\t\t\t\t\tSessionEvents: fakes.TestEvents{},\n\t\t\t\t\tUpdatedAt:     time.Now(),\n\t\t\t\t},\n\t\t\t},\n\t\t\tsessionID:  id,\n\t\t\twantErr:    fmt.Errorf(\"session_id is empty in received session\"),\n\t\t\twantStatus: http.StatusInternalServerError,\n\t\t},\n\t}\n\n\tfor _, tt := range tc {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tsessionService := fakes.FakeSessionService{Sessions: tt.storedSessions}\n\t\t\tapiController := controllers.NewSessionsAPIController(&sessionService)\n\t\t\treq, err := http.NewRequest(http.MethodGet, \"/apps/testApp/users/testUser/sessions/testSession\", nil)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"new request: %v\", err)\n\t\t\t}\n\t\t\t// Manually set the URL variables on the request using mux.SetURLVars.\n\t\t\treq = mux.SetURLVars(req, sessionVars(tt.sessionID))\n\t\t\trr := httptest.NewRecorder()\n\n\t\t\tapiController.GetSessionHandler(rr, req)\n\n\t\t\tif status := rr.Code; status != tt.wantStatus {\n\t\t\t\tt.Fatalf(\"handler returned wrong status code: got %v want %v\", status, tt.wantStatus)\n\t\t\t}\n\t\t\tif tt.wantErr != nil {\n\t\t\t\trespErr := strings.Trim(rr.Body.String(), \"\\n\")\n\t\t\t\tif tt.wantErr.Error() != respErr {\n\t\t\t\t\tt.Errorf(\"CreateSession() mismatch (-want +got):\\n%v, %v\", tt.wantErr.Error(), respErr)\n\t\t\t\t}\n\t\t\t\treturn\n\t\t\t}\n\t\t\tvar gotSession models.Session\n\t\t\terr = json.NewDecoder(rr.Body).Decode(&gotSession)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"decode response: %v\", err)\n\t\t\t}\n\t\t\tif diff := cmp.Diff(tt.wantSession, gotSession, EquateApproxInt(int64(time.Second))); diff != \"\" {\n\t\t\t\tt.Errorf(\"GetSession() mismatch (-want +got):\\n%s\", diff)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestCreateSession(t *testing.T) {\n\tid := fakes.SessionKey{\n\t\tAppName:   \"testApp\",\n\t\tUserID:    \"testUser\",\n\t\tSessionID: \"testSession\",\n\t}\n\n\ttc := []struct {\n\t\tname             string\n\t\tstoredSessions   map[fakes.SessionKey]fakes.TestSession\n\t\tsessionID        fakes.SessionKey\n\t\tcreateRequestObj models.CreateSessionRequest\n\t\twantSession      models.Session\n\t\twantErr          error\n\t\twantStatus       int\n\t}{\n\t\t{\n\t\t\tname: \"session exists\",\n\t\t\tstoredSessions: map[fakes.SessionKey]fakes.TestSession{\n\t\t\t\tid: {\n\t\t\t\t\tId:            id,\n\t\t\t\t\tSessionState:  fakes.TestState{\"foo\": \"bar\"},\n\t\t\t\t\tSessionEvents: fakes.TestEvents{},\n\t\t\t\t\tUpdatedAt:     time.Now(),\n\t\t\t\t},\n\t\t\t},\n\t\t\tsessionID:  id,\n\t\t\twantErr:    fmt.Errorf(\"session already exists\"),\n\t\t\twantStatus: http.StatusInternalServerError,\n\t\t},\n\t\t{\n\t\t\tname:           \"successful create operation\",\n\t\t\tstoredSessions: map[fakes.SessionKey]fakes.TestSession{},\n\t\t\tsessionID:      id,\n\t\t\tcreateRequestObj: models.CreateSessionRequest{\n\t\t\t\tState: map[string]any{\n\t\t\t\t\t\"foo\": \"bar\",\n\t\t\t\t},\n\t\t\t\tEvents: []models.Event{\n\t\t\t\t\t{\n\t\t\t\t\t\tID:     \"eventID\",\n\t\t\t\t\t\tAuthor: \"testUser\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twantSession: models.Session{\n\t\t\t\tID:      \"testSession\",\n\t\t\t\tAppName: \"testApp\",\n\t\t\t\tUserID:  \"testUser\",\n\t\t\t\tState: map[string]any{\n\t\t\t\t\t\"foo\": \"bar\",\n\t\t\t\t},\n\t\t\t\tEvents: []models.Event{\n\t\t\t\t\t{\n\t\t\t\t\t\tID:     \"eventID\",\n\t\t\t\t\t\tAuthor: \"testUser\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twantStatus: http.StatusOK,\n\t\t},\n\t\t{\n\t\t\tname:           \"user id is missing\",\n\t\t\tstoredSessions: map[fakes.SessionKey]fakes.TestSession{},\n\t\t\tsessionID: fakes.SessionKey{\n\t\t\t\tAppName:   \"testApp\",\n\t\t\t\tSessionID: \"testSession\",\n\t\t\t},\n\t\t\tcreateRequestObj: models.CreateSessionRequest{},\n\t\t\twantStatus:       http.StatusBadRequest,\n\t\t\twantErr:          fmt.Errorf(\"user_id parameter is required\"),\n\t\t},\n\t}\n\n\tfor _, tt := range tc {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tsessionService := fakes.FakeSessionService{Sessions: tt.storedSessions}\n\t\t\tapiController := controllers.NewSessionsAPIController(&sessionService)\n\t\t\treqBytes, err := json.Marshal(tt.createRequestObj)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"marshal request: %v\", err)\n\t\t\t}\n\t\t\treq, err := http.NewRequest(http.MethodPost, \"/apps/testApp/users/testUser/sessions/testSession\", bytes.NewBuffer(reqBytes))\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"new request: %v\", err)\n\t\t\t}\n\t\t\t// Manually set the URL variables on the request using mux.SetURLVars.\n\t\t\treq = mux.SetURLVars(req, sessionVars(tt.sessionID))\n\t\t\trr := httptest.NewRecorder()\n\n\t\t\tapiController.CreateSessionHandler(rr, req)\n\n\t\t\tif status := rr.Code; status != tt.wantStatus {\n\t\t\t\tt.Errorf(\"handler returned wrong status code: got %v want %v\", status, tt.wantStatus)\n\t\t\t}\n\t\t\tif tt.wantErr != nil {\n\t\t\t\trespErr := strings.Trim(rr.Body.String(), \"\\n\")\n\t\t\t\tif tt.wantErr.Error() != respErr {\n\t\t\t\t\tt.Errorf(\"CreateSession() mismatch (-want +got):\\n%v, %v\", tt.wantErr.Error(), respErr)\n\t\t\t\t}\n\t\t\t\treturn\n\t\t\t}\n\t\t\tvar gotSession models.Session\n\t\t\terr = json.NewDecoder(rr.Body).Decode(&gotSession)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"decode response: %v\", err)\n\t\t\t}\n\t\t\tif diff := cmp.Diff(tt.wantSession, gotSession, EquateApproxInt(int64(time.Second)),\n\t\t\t\tcmpopts.IgnoreFields(models.Session{}, \"UpdatedAt\")); diff != \"\" {\n\t\t\t\tt.Errorf(\"CreateSession() mismatch (-want +got):\\n%s\", diff)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestDeleteSession(t *testing.T) {\n\tid := fakes.SessionKey{\n\t\tAppName:   \"testApp\",\n\t\tUserID:    \"testUser\",\n\t\tSessionID: \"testSession\",\n\t}\n\n\ttc := []struct {\n\t\tname           string\n\t\tstoredSessions map[fakes.SessionKey]fakes.TestSession\n\t\tsessionID      fakes.SessionKey\n\t\twantStatus     int\n\t}{\n\t\t{\n\t\t\tname: \"session exists\",\n\t\t\tstoredSessions: map[fakes.SessionKey]fakes.TestSession{\n\t\t\t\tid: {\n\t\t\t\t\tId:            id,\n\t\t\t\t\tSessionState:  fakes.TestState{\"foo\": \"bar\"},\n\t\t\t\t\tSessionEvents: fakes.TestEvents{},\n\t\t\t\t\tUpdatedAt:     time.Now(),\n\t\t\t\t},\n\t\t\t},\n\t\t\tsessionID:  id,\n\t\t\twantStatus: http.StatusOK,\n\t\t},\n\t\t{\n\t\t\tname:           \"session does not exist\",\n\t\t\tstoredSessions: map[fakes.SessionKey]fakes.TestSession{},\n\t\t\tsessionID:      id,\n\t\t\twantStatus:     http.StatusInternalServerError,\n\t\t},\n\t}\n\n\tfor _, tt := range tc {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tsessionService := fakes.FakeSessionService{Sessions: tt.storedSessions}\n\t\t\tapiController := controllers.NewSessionsAPIController(&sessionService)\n\t\t\treq, err := http.NewRequest(http.MethodDelete, \"/apps/testApp/users/testUser/sessions/testSession\", nil)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"new request: %v\", err)\n\t\t\t}\n\t\t\t// Manually set the URL variables on the request using mux.SetURLVars.\n\t\t\treq = mux.SetURLVars(req, sessionVars(tt.sessionID))\n\t\t\trr := httptest.NewRecorder()\n\n\t\t\tapiController.DeleteSessionHandler(rr, req)\n\t\t\tif status := rr.Code; status != tt.wantStatus {\n\t\t\t\tt.Fatalf(\"handler returned wrong status code: got %v want %v\", status, tt.wantStatus)\n\t\t\t}\n\t\t\tif _, ok := sessionService.Sessions[tt.sessionID]; ok {\n\t\t\t\tt.Errorf(\"session was not deleted\")\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestListSessions(t *testing.T) {\n\tid := fakes.SessionKey{\n\t\tAppName:   \"testApp\",\n\t\tUserID:    \"testUser\",\n\t\tSessionID: \"testSession\",\n\t}\n\tnewSessionID := fakes.SessionKey{\n\t\tAppName:   \"testApp\",\n\t\tUserID:    \"testUser\",\n\t\tSessionID: \"newSession\",\n\t}\n\toldSessionID := fakes.SessionKey{\n\t\tAppName:   \"testApp\",\n\t\tUserID:    \"testUser\",\n\t\tSessionID: \"oldSession\",\n\t}\n\n\ttc := []struct {\n\t\tname           string\n\t\tstoredSessions map[fakes.SessionKey]fakes.TestSession\n\t\twantSessions   []models.Session\n\t\twantStatus     int\n\t}{\n\t\t{\n\t\t\tname: \"session exists\",\n\t\t\tstoredSessions: map[fakes.SessionKey]fakes.TestSession{\n\t\t\t\tid: {\n\t\t\t\t\tId:            id,\n\t\t\t\t\tSessionState:  fakes.TestState{\"foo\": \"bar\"},\n\t\t\t\t\tSessionEvents: fakes.TestEvents{},\n\t\t\t\t\tUpdatedAt:     time.Now(),\n\t\t\t\t},\n\t\t\t\tnewSessionID: {\n\t\t\t\t\tId:            newSessionID,\n\t\t\t\t\tSessionState:  fakes.TestState{\"xyz\": \"abc\"},\n\t\t\t\t\tSessionEvents: fakes.TestEvents{},\n\t\t\t\t\tUpdatedAt:     time.Now(),\n\t\t\t\t},\n\t\t\t\toldSessionID: {\n\t\t\t\t\tId:            oldSessionID,\n\t\t\t\t\tSessionState:  fakes.TestState{},\n\t\t\t\t\tSessionEvents: fakes.TestEvents{},\n\t\t\t\t\tUpdatedAt:     time.Now(),\n\t\t\t\t},\n\t\t\t},\n\t\t\twantSessions: []models.Session{\n\t\t\t\t{\n\t\t\t\t\tID:        \"testSession\",\n\t\t\t\t\tAppName:   \"testApp\",\n\t\t\t\t\tUserID:    \"testUser\",\n\t\t\t\t\tUpdatedAt: time.Now().Unix(),\n\t\t\t\t\tEvents:    []models.Event{},\n\t\t\t\t\tState: map[string]any{\n\t\t\t\t\t\t\"foo\": \"bar\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tID:        \"newSession\",\n\t\t\t\t\tAppName:   \"testApp\",\n\t\t\t\t\tUserID:    \"testUser\",\n\t\t\t\t\tUpdatedAt: time.Now().Unix(),\n\t\t\t\t\tEvents:    []models.Event{},\n\t\t\t\t\tState: map[string]any{\n\t\t\t\t\t\t\"xyz\": \"abc\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tID:        \"oldSession\",\n\t\t\t\t\tAppName:   \"testApp\",\n\t\t\t\t\tUserID:    \"testUser\",\n\t\t\t\t\tState:     map[string]any{},\n\t\t\t\t\tUpdatedAt: time.Now().Unix(),\n\t\t\t\t\tEvents:    []models.Event{},\n\t\t\t\t},\n\t\t\t},\n\t\t\twantStatus: http.StatusOK,\n\t\t},\n\t}\n\n\tfor _, tt := range tc {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tsessionService := fakes.FakeSessionService{Sessions: tt.storedSessions}\n\t\t\tapiController := controllers.NewSessionsAPIController(&sessionService)\n\t\t\treq, err := http.NewRequest(http.MethodDelete, \"/apps/testApp/users/testUser/sessions/testSession\", nil)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"new request: %v\", err)\n\t\t\t}\n\t\t\t// Manually set the URL variables on the request using mux.SetURLVars.\n\t\t\treq = mux.SetURLVars(req, map[string]string{\n\t\t\t\t\"app_name\": \"testApp\",\n\t\t\t\t\"user_id\":  \"testUser\",\n\t\t\t})\n\t\t\trr := httptest.NewRecorder()\n\n\t\t\tapiController.ListSessionsHandler(rr, req)\n\t\t\tif status := rr.Code; status != tt.wantStatus {\n\t\t\t\tt.Fatalf(\"handler returned wrong status code: got %v want %v\", status, tt.wantStatus)\n\t\t\t}\n\t\t\tgot := []models.Session{}\n\t\t\terr = json.NewDecoder(rr.Body).Decode(&got)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"decode response: %v\", err)\n\t\t\t}\n\t\t\tif diff := cmp.Diff(tt.wantSessions, got, EquateApproxInt(int64(time.Second)), cmpopts.SortSlices(func(a, b models.Session) bool {\n\t\t\t\treturn a.ID < b.ID\n\t\t\t})); diff != \"\" {\n\t\t\t\tt.Errorf(\"ListSessions() mismatch (-want +got):\\n%s\", diff)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc sessionVars(sessionID fakes.SessionKey) map[string]string {\n\treturn map[string]string{\n\t\t\"app_name\":   sessionID.AppName,\n\t\t\"user_id\":    sessionID.UserID,\n\t\t\"session_id\": sessionID.SessionID,\n\t}\n}\n\n// EquateApproxInt returns a cmp.Comparer option that determines integer values\n// to be equal if they are within a certain absolute margin.\nfunc EquateApproxInt(margin int64) cmp.Option {\n\treturn cmp.Comparer(func(x, y int64) bool {\n\t\tdiff := x - y\n\t\tif diff < 0 {\n\t\t\tdiff = -diff\n\t\t}\n\n\t\treturn diff <= margin\n\t})\n}\n"
  },
  {
    "path": "server/adkrest/handler.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage adkrest\n\nimport (\n\t\"net/http\"\n\t\"time\"\n\n\t\"github.com/gorilla/mux\"\n\tsdklog \"go.opentelemetry.io/otel/sdk/log\"\n\t\"go.opentelemetry.io/otel/sdk/trace\"\n\n\t\"google.golang.org/adk/agent\"\n\t\"google.golang.org/adk/artifact\"\n\t\"google.golang.org/adk/memory\"\n\t\"google.golang.org/adk/runner\"\n\t\"google.golang.org/adk/server/adkrest/controllers\"\n\t\"google.golang.org/adk/server/adkrest/internal/routers\"\n\t\"google.golang.org/adk/server/adkrest/internal/services\"\n\t\"google.golang.org/adk/session\"\n)\n\n// NewServer creates a new ADK REST API server which implements [http.Handler] interface.\nfunc NewServer(cfg ServerConfig) (*Server, error) {\n\tdebugTelemetry := services.NewDebugTelemetry()\n\n\trouter := mux.NewRouter().StrictSlash(true)\n\t// TODO: Allow taking a prefix to allow customizing the path\n\t// where the ADK REST API will be served.\n\tsetupRouter(router,\n\t\trouters.NewSessionsAPIRouter(controllers.NewSessionsAPIController(cfg.SessionService)),\n\t\trouters.NewRuntimeAPIRouter(controllers.NewRuntimeAPIController(cfg.SessionService, cfg.MemoryService, cfg.AgentLoader, cfg.ArtifactService, cfg.SSEWriteTimeout, cfg.PluginConfig)),\n\t\trouters.NewAppsAPIRouter(controllers.NewAppsAPIController(cfg.AgentLoader)),\n\t\trouters.NewDebugAPIRouter(controllers.NewDebugAPIController(cfg.SessionService, cfg.AgentLoader, debugTelemetry)),\n\t\trouters.NewArtifactsAPIRouter(controllers.NewArtifactsAPIController(cfg.ArtifactService)),\n\t\t&routers.EvalAPIRouter{},\n\t)\n\treturn &Server{\n\t\trouter:         router,\n\t\ttelemetryStore: debugTelemetry,\n\t}, nil\n}\n\n// ServerConfig contains parameters for the ADK REST API server.\ntype ServerConfig struct {\n\tSessionService  session.Service\n\tMemoryService   memory.Service\n\tAgentLoader     agent.Loader\n\tArtifactService artifact.Service\n\tSSEWriteTimeout time.Duration\n\tPluginConfig    runner.PluginConfig\n}\n\n// Server is an HTTP server that serves the ADK REST API.\ntype Server struct {\n\trouter         *mux.Router\n\ttelemetryStore *services.DebugTelemetry\n}\n\n// ServeHTTP makes [Server] implement [http.Handler] interface.\nfunc (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) {\n\ts.router.ServeHTTP(w, r)\n}\n\n// SpanProcessor returns a processor that captures spans used for /debug/trace endpoint of the ADK REST API server.\n// You can register it in your application TracerProvider to populate it with these spans.\nfunc (s *Server) SpanProcessor() trace.SpanProcessor {\n\treturn s.telemetryStore.SpanProcessor()\n}\n\n// LogProcessor returns a processor that captures log records used for /debug/trace endpoint of the ADK REST API server.\n// You can register it in your application LoggerProvider to populate it with these logs.\nfunc (s *Server) LogProcessor() sdklog.Processor {\n\treturn s.telemetryStore.LogProcessor()\n}\n\nfunc setupRouter(router *mux.Router, subrouters ...routers.Router) *mux.Router {\n\trouters.SetupSubRouters(router, subrouters...)\n\treturn router\n}\n"
  },
  {
    "path": "server/adkrest/internal/fakes/testsessionservice.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Package fakes contains a fake implementation of different ADK services used for testing\n\npackage fakes\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"iter\"\n\t\"time\"\n\n\t\"google.golang.org/adk/session\"\n)\n\ntype TestState map[string]any\n\nfunc (s TestState) Get(key string) (any, error) {\n\treturn s[key], nil\n}\n\nfunc (s TestState) Set(key string, val any) error {\n\ts[key] = val\n\treturn nil\n}\n\nfunc (s TestState) All() iter.Seq2[string, any] {\n\treturn func(yield func(key string, val any) bool) {\n\t\tfor k, v := range s {\n\t\t\tif !yield(k, v) {\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t}\n}\n\ntype TestEvents []*session.Event\n\nfunc (e TestEvents) All() iter.Seq[*session.Event] {\n\treturn func(yield func(*session.Event) bool) {\n\t\tfor _, event := range e {\n\t\t\tif !yield(event) {\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc (e TestEvents) Len() int {\n\treturn len(e)\n}\n\nfunc (e TestEvents) At(i int) *session.Event {\n\treturn e[i]\n}\n\ntype TestSession struct {\n\tId            SessionKey\n\tSessionState  TestState\n\tSessionEvents TestEvents\n\tUpdatedAt     time.Time\n}\n\nfunc (s TestSession) ID() string {\n\treturn s.Id.SessionID\n}\n\nfunc (s TestSession) AppName() string {\n\treturn s.Id.AppName\n}\n\nfunc (s TestSession) UserID() string {\n\treturn s.Id.UserID\n}\n\nfunc (s TestSession) State() session.State {\n\treturn s.SessionState\n}\n\nfunc (s TestSession) Events() session.Events {\n\treturn s.SessionEvents\n}\n\nfunc (s TestSession) LastUpdateTime() time.Time {\n\treturn s.UpdatedAt\n}\n\ntype FakeSessionService struct {\n\tSessions map[SessionKey]TestSession\n}\n\ntype SessionKey struct {\n\tAppName   string\n\tUserID    string\n\tSessionID string\n}\n\nfunc (s *FakeSessionService) Create(ctx context.Context, req *session.CreateRequest) (*session.CreateResponse, error) {\n\tif _, ok := s.Sessions[SessionKey{AppName: req.AppName, UserID: req.UserID, SessionID: req.SessionID}]; ok {\n\t\treturn nil, fmt.Errorf(\"session already exists\")\n\t}\n\n\tif req.SessionID == \"\" {\n\t\treq.SessionID = \"testID\"\n\t}\n\n\ttestSession := TestSession{\n\t\tId: SessionKey{\n\t\t\tAppName:   req.AppName,\n\t\t\tUserID:    req.UserID,\n\t\t\tSessionID: req.SessionID,\n\t\t},\n\t\tSessionState: req.State,\n\t\tUpdatedAt:    time.Now(),\n\t}\n\ts.Sessions[SessionKey{\n\t\tAppName:   req.AppName,\n\t\tUserID:    req.UserID,\n\t\tSessionID: req.SessionID,\n\t}] = testSession\n\treturn &session.CreateResponse{\n\t\tSession: &testSession,\n\t}, nil\n}\n\nfunc (s *FakeSessionService) Get(ctx context.Context, req *session.GetRequest) (*session.GetResponse, error) {\n\tif sess, ok := s.Sessions[SessionKey{\n\t\tAppName:   req.AppName,\n\t\tUserID:    req.UserID,\n\t\tSessionID: req.SessionID,\n\t}]; ok {\n\t\treturn &session.GetResponse{\n\t\t\tSession: &sess,\n\t\t}, nil\n\t}\n\treturn nil, fmt.Errorf(\"not found\")\n}\n\nfunc (s *FakeSessionService) List(ctx context.Context, req *session.ListRequest) (*session.ListResponse, error) {\n\tresult := []session.Session{}\n\tfor _, session := range s.Sessions {\n\t\tif session.Id.AppName != req.AppName || session.Id.UserID != req.UserID {\n\t\t\tcontinue\n\t\t}\n\t\tresult = append(result, session)\n\t}\n\treturn &session.ListResponse{\n\t\tSessions: result,\n\t}, nil\n}\n\nfunc (s *FakeSessionService) Delete(ctx context.Context, req *session.DeleteRequest) error {\n\tid := SessionKey{\n\t\tAppName:   req.AppName,\n\t\tUserID:    req.UserID,\n\t\tSessionID: req.SessionID,\n\t}\n\tif _, ok := s.Sessions[id]; !ok {\n\t\treturn fmt.Errorf(\"not found\")\n\t}\n\tdelete(s.Sessions, id)\n\treturn nil\n}\n\nfunc (s *FakeSessionService) AppendEvent(ctx context.Context, curSession session.Session, event *session.Event) error {\n\ttestSession, ok := curSession.(*TestSession)\n\tif !ok {\n\t\treturn fmt.Errorf(\"invalid session type\")\n\t}\n\ttestSession.SessionEvents = append(testSession.SessionEvents, event)\n\ttestSession.UpdatedAt = event.Timestamp\n\ts.Sessions[testSession.Id] = *testSession\n\treturn nil\n}\n\nvar _ session.Service = (*FakeSessionService)(nil)\n"
  },
  {
    "path": "server/adkrest/internal/models/event.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage models\n\nimport (\n\t\"encoding/json\"\n\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/model\"\n\t\"google.golang.org/adk/session\"\n)\n\n// EventActions represent a data model for session.EventActions\ntype EventActions struct {\n\tStateDelta        map[string]any   `json:\"stateDelta\"`\n\tArtifactDelta     map[string]int64 `json:\"artifactDelta\"`\n\tEscalate          bool             `json:\"escalate,omitempty\"`\n\tSkipSummarization bool             `json:\"skipSummarization,omitempty\"`\n\tTransferToAgent   string           `json:\"transferToAgent,omitempty\"`\n}\n\n// Event represents a single event in a session.\ntype Event struct {\n\tID                 string                                      `json:\"id\"`\n\tInvocationID       string                                      `json:\"invocationId\"`\n\tBranch             string                                      `json:\"branch,omitempty\"`\n\tAuthor             string                                      `json:\"author\"`\n\tPartial            bool                                        `json:\"partial,omitempty\"`\n\tLongRunningToolIDs []string                                    `json:\"longRunningToolIds,omitempty\"`\n\tContent            *genai.Content                              `json:\"content\"`\n\tGroundingMetadata  *genai.GroundingMetadata                    `json:\"groundingMetadata\"`\n\tUsageMetadata      *genai.GenerateContentResponseUsageMetadata `json:\"usageMetadata\"`\n\tTurnComplete       bool                                        `json:\"turnComplete,omitempty\"`\n\tInterrupted        bool                                        `json:\"interrupted,omitempty\"`\n\tErrorCode          string                                      `json:\"errorCode,omitempty\"`\n\tErrorMessage       string                                      `json:\"errorMessage,omitempty\"`\n\tAvgLogprobs        float64                                     `json:\"avgLogprobs,omitempty\"`\n\tFinishReason       genai.FinishReason                          `json:\"finishReason,omitempty\"`\n\tModelVersion       string                                      `json:\"modelVersion,omitempty\"`\n\tActions            EventActions                                `json:\"actions\"`\n}\n\n// ToSessionEvent maps Event data struct to session.Event\nfunc ToSessionEvent(event Event) *session.Event {\n\treturn &session.Event{\n\t\tID:                 event.ID,\n\t\tInvocationID:       event.InvocationID,\n\t\tBranch:             event.Branch,\n\t\tAuthor:             event.Author,\n\t\tLongRunningToolIDs: event.LongRunningToolIDs,\n\t\tLLMResponse: model.LLMResponse{\n\t\t\tAvgLogprobs:       event.AvgLogprobs,\n\t\t\tContent:           event.Content,\n\t\t\tGroundingMetadata: event.GroundingMetadata,\n\t\t\tUsageMetadata:     event.UsageMetadata,\n\t\t\tPartial:           event.Partial,\n\t\t\tTurnComplete:      event.TurnComplete,\n\t\t\tInterrupted:       event.Interrupted,\n\t\t\tErrorCode:         event.ErrorCode,\n\t\t\tErrorMessage:      event.ErrorMessage,\n\t\t\tFinishReason:      event.FinishReason,\n\t\t\tModelVersion:      event.ModelVersion,\n\t\t},\n\t\tActions: session.EventActions{\n\t\t\tStateDelta:        event.Actions.StateDelta,\n\t\t\tArtifactDelta:     event.Actions.ArtifactDelta,\n\t\t\tEscalate:          event.Actions.Escalate,\n\t\t\tSkipSummarization: event.Actions.SkipSummarization,\n\t\t\tTransferToAgent:   event.Actions.TransferToAgent,\n\t\t},\n\t}\n}\n\n// FromSessionEvent maps session.Event to Event data struct\nfunc FromSessionEvent(event session.Event) Event {\n\treturn Event{\n\t\tID:                 event.ID,\n\t\tInvocationID:       event.InvocationID,\n\t\tBranch:             event.Branch,\n\t\tAuthor:             event.Author,\n\t\tPartial:            event.Partial,\n\t\tLongRunningToolIDs: event.LongRunningToolIDs,\n\t\tAvgLogprobs:        event.LLMResponse.AvgLogprobs,\n\t\tContent:            event.LLMResponse.Content,\n\t\tGroundingMetadata:  event.LLMResponse.GroundingMetadata,\n\t\tUsageMetadata:      event.LLMResponse.UsageMetadata,\n\t\tTurnComplete:       event.LLMResponse.TurnComplete,\n\t\tInterrupted:        event.LLMResponse.Interrupted,\n\t\tErrorCode:          event.LLMResponse.ErrorCode,\n\t\tErrorMessage:       event.LLMResponse.ErrorMessage,\n\t\tFinishReason:       event.LLMResponse.FinishReason,\n\t\tModelVersion:       event.LLMResponse.ModelVersion,\n\t\tActions: EventActions{\n\t\t\tStateDelta:        event.Actions.StateDelta,\n\t\t\tArtifactDelta:     event.Actions.ArtifactDelta,\n\t\t\tEscalate:          event.Actions.Escalate,\n\t\t\tSkipSummarization: event.Actions.SkipSummarization,\n\t\t\tTransferToAgent:   event.Actions.TransferToAgent,\n\t\t},\n\t}\n}\n\nfunc (e Event) MarshalJSON() ([]byte, error) {\n\t// Define Proxy structs to override specific JSON tags.\n\t// These embed the original types to inherit all other fields automatically.\n\n\t// ProxyFunctionCall overrides 'Args' to remove 'omitempty'.\n\ttype ProxyFunctionCall struct {\n\t\t*genai.FunctionCall\n\t\tArgs map[string]any `json:\"args\"` // Tag changed: omitempty removed\n\t}\n\n\t// ProxyPart overrides 'FunctionCall' to use ProxyFunctionCall.\n\ttype ProxyPart struct {\n\t\t*genai.Part\n\t\tFunctionCall *ProxyFunctionCall `json:\"functionCall,omitempty\"`\n\t}\n\n\t// ProxyContent overrides 'Parts' to use ProxyPart.\n\ttype ProxyContent struct {\n\t\t*genai.Content\n\t\tParts []*ProxyPart `json:\"parts,omitempty\"`\n\t}\n\n\t// Create an Alias of Event to prevent infinite recursion during Marshal.\n\ttype EventAlias Event\n\n\t// Create a temporary struct that mimics Event but uses ProxyContent.\n\taux := &struct {\n\t\tEventAlias\n\t\tContent *ProxyContent `json:\"content\"`\n\t}{\n\t\tEventAlias: EventAlias(e),\n\t}\n\n\t// Reconstruct the Content hierarchy if it exists.\n\tif e.Content != nil {\n\t\taux.Content = &ProxyContent{\n\t\t\tContent: e.Content,\n\t\t\tParts:   make([]*ProxyPart, len(e.Content.Parts)),\n\t\t}\n\n\t\tfor i, part := range e.Content.Parts {\n\t\t\t// Wrap the original part\n\t\t\tproxyPart := &ProxyPart{Part: part}\n\n\t\t\t// If this part is a FunctionCall, wrap it to enforce Args visibility\n\t\t\tif part.FunctionCall != nil {\n\t\t\t\t// Ensure args is at least an empty map (not nil) so it marshals to {}\n\t\t\t\targs := part.FunctionCall.Args\n\t\t\t\tif args == nil {\n\t\t\t\t\targs = make(map[string]any)\n\t\t\t\t}\n\n\t\t\t\tproxyPart.FunctionCall = &ProxyFunctionCall{\n\t\t\t\t\tFunctionCall: part.FunctionCall,\n\t\t\t\t\tArgs:         args,\n\t\t\t\t}\n\t\t\t}\n\t\t\taux.Content.Parts[i] = proxyPart\n\t\t}\n\t}\n\n\treturn json.Marshal(aux)\n}\n"
  },
  {
    "path": "server/adkrest/internal/models/models.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Package models defines the data structures for the REST API.\npackage models\n\nimport \"reflect\"\n\n// IsZeroValue checks if the val is the zero-ed value.\nfunc IsZeroValue(val any) bool {\n\treturn val == nil || reflect.DeepEqual(val, reflect.Zero(reflect.TypeOf(val)).Interface())\n}\n"
  },
  {
    "path": "server/adkrest/internal/models/runtime.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage models\n\nimport (\n\t\"fmt\"\n\n\t\"google.golang.org/genai\"\n)\n\ntype RunAgentRequest struct {\n\tAppName string `json:\"appName\"`\n\n\tUserId string `json:\"userId\"`\n\n\tSessionId string `json:\"sessionId\"`\n\n\tNewMessage genai.Content `json:\"newMessage\"`\n\n\tStreaming bool `json:\"streaming,omitempty\"`\n\n\tStateDelta *map[string]any `json:\"stateDelta,omitempty\"`\n}\n\n// AssertRunAgentRequestRequired checks if the required fields are not zero-ed\nfunc (req RunAgentRequest) AssertRunAgentRequestRequired() error {\n\telements := map[string]any{\n\t\t\"appName\":    req.AppName,\n\t\t\"userId\":     req.UserId,\n\t\t\"sessionId\":  req.SessionId,\n\t\t\"newMessage\": req.NewMessage,\n\t}\n\tfor name, el := range elements {\n\t\tif isZero := IsZeroValue(el); isZero {\n\t\t\treturn fmt.Errorf(\"%s is required\", name)\n\t\t}\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "server/adkrest/internal/models/session.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage models\n\nimport (\n\t\"fmt\"\n\t\"maps\"\n\n\t\"github.com/mitchellh/mapstructure\"\n\n\t\"google.golang.org/adk/session\"\n)\n\n// Session represents an agent's session.\ntype Session struct {\n\tID        string         `json:\"id\"`\n\tAppName   string         `json:\"appName\"`\n\tUserID    string         `json:\"userId\"`\n\tUpdatedAt int64          `json:\"lastUpdateTime\"`\n\tEvents    []Event        `json:\"events\"`\n\tState     map[string]any `json:\"state\"`\n}\n\ntype CreateSessionRequest struct {\n\tState  map[string]any `json:\"state\"`\n\tEvents []Event        `json:\"events\"`\n}\n\ntype SessionID struct {\n\tID      string `mapstructure:\"session_id,optional\"`\n\tAppName string `mapstructure:\"app_name,required\"`\n\tUserID  string `mapstructure:\"user_id,required\"`\n}\n\nfunc SessionIDFromHTTPParameters(vars map[string]string) (SessionID, error) {\n\tvar sessionID SessionID\n\tdecoder, err := mapstructure.NewDecoder(&mapstructure.DecoderConfig{\n\t\tWeaklyTypedInput: true,\n\t\tResult:           &sessionID,\n\t})\n\tif err != nil {\n\t\treturn sessionID, err\n\t}\n\terr = decoder.Decode(vars)\n\tif err != nil {\n\t\treturn sessionID, err\n\t}\n\tif sessionID.AppName == \"\" {\n\t\treturn sessionID, fmt.Errorf(\"app_name parameter is required\")\n\t}\n\tif sessionID.UserID == \"\" {\n\t\treturn sessionID, fmt.Errorf(\"user_id parameter is required\")\n\t}\n\treturn sessionID, nil\n}\n\nfunc FromSession(session session.Session) (Session, error) {\n\tstate := map[string]any{}\n\tmaps.Insert(state, session.State().All())\n\tevents := []Event{}\n\tfor event := range session.Events().All() {\n\t\tevents = append(events, FromSessionEvent(*event))\n\t}\n\tmappedSession := Session{\n\t\tID:        session.ID(),\n\t\tAppName:   session.AppName(),\n\t\tUserID:    session.UserID(),\n\t\tUpdatedAt: session.LastUpdateTime().Unix(),\n\t\tEvents:    events,\n\t\tState:     state,\n\t}\n\treturn mappedSession, mappedSession.Validate()\n}\n\nfunc (s Session) Validate() error {\n\tif s.AppName == \"\" {\n\t\treturn fmt.Errorf(\"app_name is empty in received session\")\n\t}\n\tif s.UserID == \"\" {\n\t\treturn fmt.Errorf(\"user_id is empty in received session\")\n\t}\n\tif s.ID == \"\" {\n\t\treturn fmt.Errorf(\"session_id is empty in received session\")\n\t}\n\tif s.UpdatedAt == 0 {\n\t\treturn fmt.Errorf(\"updated_at is empty\")\n\t}\n\tif s.State == nil {\n\t\treturn fmt.Errorf(\"state is nil\")\n\t}\n\tif s.Events == nil {\n\t\treturn fmt.Errorf(\"events is nil\")\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "server/adkrest/internal/routers/apps.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage routers\n\nimport (\n\t\"net/http\"\n\n\t\"google.golang.org/adk/server/adkrest/controllers\"\n)\n\n// AppsAPIRouter defines the routes for the Apps API.\ntype AppsAPIRouter struct {\n\tappsController *controllers.AppsAPIController\n}\n\n// NewAppsAPIRouter creates a new AppsAPIRouter.\nfunc NewAppsAPIRouter(controller *controllers.AppsAPIController) *AppsAPIRouter {\n\treturn &AppsAPIRouter{appsController: controller}\n}\n\n// Routes returns the routes for the Apps API.\nfunc (r *AppsAPIRouter) Routes() Routes {\n\treturn Routes{\n\t\tRoute{\n\t\t\tName:        \"ListApps\",\n\t\t\tMethods:     []string{http.MethodGet},\n\t\t\tPattern:     \"/list-apps\",\n\t\t\tHandlerFunc: r.appsController.ListAppsHandler,\n\t\t},\n\t}\n}\n"
  },
  {
    "path": "server/adkrest/internal/routers/artifacts.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage routers\n\nimport (\n\t\"net/http\"\n\n\t\"google.golang.org/adk/server/adkrest/controllers\"\n)\n\n// ArtifactsAPIRouter defines the routes for the Artifacts API.\ntype ArtifactsAPIRouter struct {\n\tartifactsController *controllers.ArtifactsAPIController\n}\n\n// NewArtifactsAPIRouter creates a new ArtifactsAPIRouter.\nfunc NewArtifactsAPIRouter(controller *controllers.ArtifactsAPIController) *ArtifactsAPIRouter {\n\treturn &ArtifactsAPIRouter{artifactsController: controller}\n}\n\n// Routes returns the routes for the Artifacts API.\nfunc (r *ArtifactsAPIRouter) Routes() Routes {\n\treturn Routes{\n\t\tRoute{\n\t\t\tName:        \"ListArtifacts\",\n\t\t\tMethods:     []string{http.MethodGet},\n\t\t\tPattern:     \"/apps/{app_name}/users/{user_id}/sessions/{session_id}/artifacts\",\n\t\t\tHandlerFunc: r.artifactsController.ListArtifactsHandler,\n\t\t},\n\t\tRoute{\n\t\t\tName:        \"LoadArtifact\",\n\t\t\tMethods:     []string{http.MethodGet},\n\t\t\tPattern:     \"/apps/{app_name}/users/{user_id}/sessions/{session_id}/artifacts/{artifact_name}\",\n\t\t\tHandlerFunc: r.artifactsController.LoadArtifactHandler,\n\t\t},\n\t\tRoute{\n\t\t\tName:        \"LoadArtifactVersion\",\n\t\t\tMethods:     []string{http.MethodGet},\n\t\t\tPattern:     \"/apps/{app_name}/users/{user_id}/sessions/{session_id}/artifacts/{artifact_name}/versions/{version}\",\n\t\t\tHandlerFunc: r.artifactsController.LoadArtifactVersionHandler,\n\t\t},\n\t\tRoute{\n\t\t\tName:        \"DeleteArtifact\",\n\t\t\tMethods:     []string{http.MethodDelete, http.MethodOptions},\n\t\t\tPattern:     \"/apps/{app_name}/users/{user_id}/sessions/{session_id}/artifacts/{artifact_name}\",\n\t\t\tHandlerFunc: r.artifactsController.DeleteArtifactHandler,\n\t\t},\n\t}\n}\n"
  },
  {
    "path": "server/adkrest/internal/routers/debug.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage routers\n\nimport (\n\t\"net/http\"\n\n\t\"google.golang.org/adk/server/adkrest/controllers\"\n)\n\n// DebugAPIRouter defines the routes for the Debug API.\ntype DebugAPIRouter struct {\n\truntimeController *controllers.DebugAPIController\n}\n\n// NewDebugAPIRouter creates a new DebugAPIRouter.\nfunc NewDebugAPIRouter(controller *controllers.DebugAPIController) *DebugAPIRouter {\n\treturn &DebugAPIRouter{runtimeController: controller}\n}\n\n// Routes returns the routes for the Debug API.\nfunc (r *DebugAPIRouter) Routes() Routes {\n\treturn Routes{\n\t\tRoute{\n\t\t\tName:        \"GetTraceDict\",\n\t\t\tMethods:     []string{http.MethodGet},\n\t\t\tPattern:     \"/debug/trace/{event_id}\",\n\t\t\tHandlerFunc: r.runtimeController.EventSpanHandler,\n\t\t},\n\t\tRoute{\n\t\t\tName:        \"GetEventGraph\",\n\t\t\tMethods:     []string{http.MethodGet},\n\t\t\tPattern:     \"/apps/{app_name}/users/{user_id}/sessions/{session_id}/events/{event_id}/graph\",\n\t\t\tHandlerFunc: r.runtimeController.EventGraphHandler,\n\t\t},\n\n\t\tRoute{\n\t\t\tName:        \"GetSessionTrace\",\n\t\t\tMethods:     []string{http.MethodGet},\n\t\t\tPattern:     \"/debug/trace/session/{session_id}\",\n\t\t\tHandlerFunc: r.runtimeController.SessionSpansHandler,\n\t\t},\n\t}\n}\n"
  },
  {
    "path": "server/adkrest/internal/routers/eval.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage routers\n\nimport (\n\t\"net/http\"\n\n\t\"google.golang.org/adk/server/adkrest/controllers\"\n)\n\n// EvalAPIRouter defines the routes for the Eval API.\ntype EvalAPIRouter struct{}\n\n// Routes returns the routes for the Apps API.\nfunc (r *EvalAPIRouter) Routes() Routes {\n\treturn Routes{\n\t\tRoute{\n\t\t\tName:        \"ListEvalSets\",\n\t\t\tMethods:     []string{http.MethodGet},\n\t\t\tPattern:     \"/apps/{app_name}/eval_sets\",\n\t\t\tHandlerFunc: controllers.Unimplemented,\n\t\t},\n\t\tRoute{\n\t\t\tName:        \"ListEvalSets\",\n\t\t\tMethods:     []string{http.MethodPost, http.MethodOptions},\n\t\t\tPattern:     \"/apps/{app_name}/eval_sets/{eval_set_name}\",\n\t\t\tHandlerFunc: controllers.Unimplemented,\n\t\t},\n\t\tRoute{\n\t\t\tName:        \"ListEvalResults\",\n\t\t\tMethods:     []string{http.MethodGet},\n\t\t\tPattern:     \"/apps/{app_name}/eval_results\",\n\t\t\tHandlerFunc: controllers.Unimplemented,\n\t\t},\n\t}\n}\n"
  },
  {
    "path": "server/adkrest/internal/routers/routers.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Package routers defines the HTTP routes for the ADK REST API.\npackage routers\n\nimport (\n\t\"net/http\"\n\n\t\"github.com/gorilla/mux\"\n)\n\n// A Route defines the parameters for an api endpoint\ntype Route struct {\n\tName        string\n\tMethods     []string\n\tPattern     string\n\tHandlerFunc http.HandlerFunc\n}\n\n// Routes is a list of defined api endpoints\ntype Routes []Route\n\n// Router defines the required methods for retrieving api routes\ntype Router interface {\n\tRoutes() Routes\n}\n\n// NewRouter creates a new router for any number of api routers\nfunc NewRouter(routers ...Router) *mux.Router {\n\trouter := mux.NewRouter().StrictSlash(true)\n\tSetupSubRouters(router)\n\treturn router\n}\n\n// SetupSubRouters adds routes from subrouter to the naub router\nfunc SetupSubRouters(router *mux.Router, subrouters ...Router) {\n\tfor _, api := range subrouters {\n\t\tfor _, route := range api.Routes() {\n\t\t\tvar handler http.Handler = route.HandlerFunc\n\n\t\t\trouter.\n\t\t\t\tMethods(route.Methods...).\n\t\t\t\tPath(route.Pattern).\n\t\t\t\tName(route.Name).\n\t\t\t\tHandler(handler)\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "server/adkrest/internal/routers/runtime.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage routers\n\nimport (\n\t\"net/http\"\n\n\t\"google.golang.org/adk/server/adkrest/controllers\"\n)\n\n// RuntimeAPIRouter defines the routes for the Runtime API.\ntype RuntimeAPIRouter struct {\n\truntimeController *controllers.RuntimeAPIController\n}\n\n// NewRuntimeAPIRouter creates a new RuntimeAPIRouter.\nfunc NewRuntimeAPIRouter(controller *controllers.RuntimeAPIController) *RuntimeAPIRouter {\n\treturn &RuntimeAPIRouter{runtimeController: controller}\n}\n\n// Routes returns the routes for the Runtime API.\nfunc (r *RuntimeAPIRouter) Routes() Routes {\n\treturn Routes{\n\t\tRoute{\n\t\t\tName:        \"RunAgent\",\n\t\t\tMethods:     []string{http.MethodPost, http.MethodOptions},\n\t\t\tPattern:     \"/run\",\n\t\t\tHandlerFunc: controllers.NewErrorHandler(r.runtimeController.RunHandler),\n\t\t},\n\t\tRoute{\n\t\t\tName:        \"RunAgentSse\",\n\t\t\tMethods:     []string{http.MethodPost, http.MethodOptions},\n\t\t\tPattern:     \"/run_sse\",\n\t\t\tHandlerFunc: controllers.NewErrorHandler(r.runtimeController.RunSSEHandler),\n\t\t},\n\t}\n}\n"
  },
  {
    "path": "server/adkrest/internal/routers/sessions.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage routers\n\nimport (\n\t\"net/http\"\n\n\t\"google.golang.org/adk/server/adkrest/controllers\"\n)\n\n// SessionsAPIRouter defines the routes for the Sessions API.\ntype SessionsAPIRouter struct {\n\tsessionController *controllers.SessionsAPIController\n}\n\n// NewSessionsAPIRouter creates a new SessionsAPIRouter.\nfunc NewSessionsAPIRouter(controller *controllers.SessionsAPIController) *SessionsAPIRouter {\n\treturn &SessionsAPIRouter{sessionController: controller}\n}\n\n// Routes returns the routes for the Sessions API.\nfunc (r *SessionsAPIRouter) Routes() Routes {\n\treturn Routes{\n\t\tRoute{\n\t\t\tName:        \"GetSession\",\n\t\t\tMethods:     []string{http.MethodGet},\n\t\t\tPattern:     \"/apps/{app_name}/users/{user_id}/sessions/{session_id}\",\n\t\t\tHandlerFunc: r.sessionController.GetSessionHandler,\n\t\t},\n\t\tRoute{\n\t\t\tName:        \"CreateSession\",\n\t\t\tMethods:     []string{http.MethodPost},\n\t\t\tPattern:     \"/apps/{app_name}/users/{user_id}/sessions\",\n\t\t\tHandlerFunc: r.sessionController.CreateSessionHandler,\n\t\t},\n\t\tRoute{\n\t\t\tName:        \"CreateSessionWithId\",\n\t\t\tMethods:     []string{http.MethodPost},\n\t\t\tPattern:     \"/apps/{app_name}/users/{user_id}/sessions/{session_id}\",\n\t\t\tHandlerFunc: r.sessionController.CreateSessionHandler,\n\t\t},\n\t\tRoute{\n\t\t\tName:        \"DeleteSession\",\n\t\t\tMethods:     []string{http.MethodDelete, http.MethodOptions},\n\t\t\tPattern:     \"/apps/{app_name}/users/{user_id}/sessions/{session_id}\",\n\t\t\tHandlerFunc: r.sessionController.DeleteSessionHandler,\n\t\t},\n\t\tRoute{\n\t\t\tName:        \"ListSessions\",\n\t\t\tMethods:     []string{http.MethodGet},\n\t\t\tPattern:     \"/apps/{app_name}/users/{user_id}/sessions\",\n\t\t\tHandlerFunc: r.sessionController.ListSessionsHandler,\n\t\t},\n\t}\n}\n"
  },
  {
    "path": "server/adkrest/internal/services/agentgraphgenerator.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage services\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"slices\"\n\n\t\"github.com/awalterschulze/gographviz\"\n\n\t\"google.golang.org/adk/agent\"\n\tagentinternal \"google.golang.org/adk/internal/agent\"\n\tllmagentinternal \"google.golang.org/adk/internal/llminternal\"\n\t\"google.golang.org/adk/tool\"\n)\n\nconst (\n\tDarkGreen  = \"\\\"#0F5223\\\"\"\n\tLightGreen = \"\\\"#69CB87\\\"\"\n\tLightGray  = \"\\\"#cccccc\\\"\"\n\tWhite      = \"\\\"#ffffff\\\"\"\n\tBackground = \"\\\"#333537\\\"\"\n)\n\nvar supportedClusterAgents = []agentinternal.Type{\n\tagentinternal.TypeLoopAgent,\n\tagentinternal.TypeSequentialAgent,\n\tagentinternal.TypeParallelAgent,\n}\n\ntype namedInstance interface {\n\tName() string\n}\n\nfunc nodeName(instance any) string {\n\tswitch i := instance.(type) {\n\tcase agent.Agent:\n\t\treturn i.Name()\n\tcase tool.Tool:\n\t\treturn i.Name()\n\tdefault:\n\t\treturn \"Unknown instance type\"\n\t}\n}\n\nfunc nodeCaption(instance any) string {\n\tcaption := \"\"\n\tswitch i := instance.(type) {\n\tcase agent.Agent:\n\t\tcaption = \"🤖 \" + i.Name()\n\t\ttypedAgent, ok := i.(agentinternal.Agent)\n\t\tif ok {\n\t\t\tif slices.Contains(supportedClusterAgents, agentinternal.Reveal(typedAgent).AgentType) {\n\t\t\t\tcaption = i.Name() + \" (\" + string(agentinternal.Reveal(typedAgent).AgentType) + \")\"\n\t\t\t}\n\t\t}\n\tcase tool.Tool:\n\t\tcaption = \"🔧 \" + i.Name()\n\tdefault:\n\t\tcaption = \"Unsupported agent or tool type\"\n\t}\n\treturn \"\\\"\" + caption + \"\\\"\"\n}\n\nfunc nodeShape(instance any) string {\n\tswitch instance.(type) {\n\tcase agent.Agent:\n\t\treturn \"ellipse\"\n\tcase tool.Tool:\n\t\treturn \"box\"\n\tdefault:\n\t\treturn \"cylinder\"\n\t}\n}\n\nfunc shouldBuildAgentCluster(instance any) bool {\n\tswitch i := instance.(type) {\n\tcase agent.Agent:\n\t\tagent, ok := i.(agentinternal.Agent)\n\t\tif !ok {\n\t\t\treturn false\n\t\t}\n\t\treturn slices.Contains(supportedClusterAgents, agentinternal.Reveal(agent).AgentType)\n\tdefault:\n\t\treturn false\n\t}\n}\n\nfunc highlighted(nodeName string, higlightedPairs [][]string) bool {\n\tif len(higlightedPairs) == 0 {\n\t\treturn false\n\t}\n\tfor _, pair := range higlightedPairs {\n\t\tif slices.Contains(pair, nodeName) {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\nfunc boolPtr(b bool) *bool {\n\treturn &b\n}\n\n// Function returns whether the edge should be highlighted.\n// The graph could have the pairs highlighted in different directions.\n// If nil is returned, means the nodes aren't highlithed.\n// Otherwise, pointer to bool type is returned, where true\n// means the directed connection between nodes, while false means\n// there is a reversed order between nodes.\nfunc edgeHighlighted(from, to string, higlightedPairs [][]string) *bool {\n\tif len(higlightedPairs) == 0 {\n\t\treturn nil\n\t}\n\tfor _, pair := range higlightedPairs {\n\t\tif len(pair) == 2 {\n\t\t\tif pair[0] == from && pair[1] == to {\n\t\t\t\treturn boolPtr(true)\n\t\t\t}\n\t\t\tif pair[0] == to && pair[1] == from {\n\t\t\t\treturn boolPtr(false)\n\t\t\t}\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc drawCluster(parentGraph, cluster *gographviz.Graph, agent agent.Agent, highlightedPairs [][]string, visitedNodes map[string]bool) error {\n\tagentInternal, ok := agent.(agentinternal.Agent)\n\tif !ok {\n\t\treturn nil\n\t}\n\tfor i, subAgent := range agent.SubAgents() {\n\t\terr := buildGraph(cluster, parentGraph, subAgent, highlightedPairs, visitedNodes)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"draw cluster: build graph: %w\", err)\n\t\t}\n\t\tswitch agentinternal.Reveal(agentInternal).AgentType {\n\t\t// Sequential sub-agents should be connected one after another with edges.\n\t\tcase agentinternal.TypeSequentialAgent:\n\t\t\tif i < len(agent.SubAgents())-1 {\n\t\t\t\terr = drawEdge(parentGraph, nodeName(subAgent), nodeName(agent.SubAgents()[i+1]), highlightedPairs)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn fmt.Errorf(\"draw cluster: draw edge: %w\", err)\n\t\t\t\t}\n\t\t\t}\n\t\t// Sequential sub-agents should be connected one after another with edges, but the last one should point to the first agent.\n\t\tcase agentinternal.TypeLoopAgent:\n\t\t\tnextAgentIdx := i + 1\n\t\t\tif nextAgentIdx >= len(agent.SubAgents()) {\n\t\t\t\tnextAgentIdx = 0\n\t\t\t}\n\t\t\terr = drawEdge(parentGraph, nodeName(subAgent), nodeName(agent.SubAgents()[nextAgentIdx]), highlightedPairs)\n\t\t\tif err != nil {\n\t\t\t\treturn fmt.Errorf(\"draw cluster: draw edge: %w\", err)\n\t\t\t}\n\t\t}\n\t\t// Parallel sub-agents shouldn't be connected, they will be a part of the sub graph.\n\t}\n\treturn nil\n}\n\nfunc drawNode(graph, parentGraph *gographviz.Graph, instance any, highlightedPairs [][]string, visitedNodes map[string]bool) error {\n\tname := nodeName(instance)\n\tshape := nodeShape(instance)\n\tcaption := nodeCaption(instance)\n\thighlighted := highlighted(name, highlightedPairs)\n\tisCluster := shouldBuildAgentCluster(instance)\n\n\tvisitedNodes[name] = true\n\tif isCluster {\n\t\tagent, ok := instance.(agent.Agent)\n\t\tif !ok {\n\t\t\treturn nil\n\t\t}\n\t\tcluster := gographviz.NewGraph()\n\t\terr := cluster.SetName(\"cluster_\" + name)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"set cluster name: %w\", err)\n\t\t}\n\t\terr = graph.AddSubGraph(graph.Name, cluster.Name, map[string]string{\n\t\t\t\"style\":     \"rounded\",\n\t\t\t\"color\":     White,\n\t\t\t\"label\":     caption,\n\t\t\t\"fontcolor\": LightGray,\n\t\t})\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"add cluster: %w\", err)\n\t\t}\n\t\treturn drawCluster(graph, cluster, agent, highlightedPairs, visitedNodes)\n\t} else {\n\t\tnodeAttributes := map[string]string{\n\t\t\t\"label\":     caption,\n\t\t\t\"shape\":     shape,\n\t\t\t\"fontcolor\": LightGray,\n\t\t}\n\n\t\tif highlighted {\n\t\t\tnodeAttributes[\"color\"] = DarkGreen\n\t\t\tnodeAttributes[\"style\"] = \"filled\"\n\t\t} else {\n\t\t\tnodeAttributes[\"color\"] = LightGray\n\t\t\tnodeAttributes[\"style\"] = \"rounded\"\n\t\t}\n\t\treturn parentGraph.AddNode(graph.Name, name, nodeAttributes)\n\t}\n}\n\nfunc drawEdge(graph *gographviz.Graph, from, to string, highlightedPairs [][]string) error {\n\tedgeHighlighted := edgeHighlighted(from, to, highlightedPairs)\n\tedgeAttributes := map[string]string{}\n\tif edgeHighlighted != nil {\n\t\tedgeAttributes[\"color\"] = LightGreen\n\t\tif !*edgeHighlighted {\n\t\t\tedgeAttributes[\"arrowhead\"] = \"normal\"\n\t\t\tedgeAttributes[\"dir\"] = \"back\"\n\t\t} else {\n\t\t\tedgeAttributes[\"arrowhead\"] = \"normal\"\n\t\t}\n\t} else {\n\t\tedgeAttributes[\"color\"] = LightGray\n\t\tedgeAttributes[\"arrowhead\"] = \"none\"\n\t}\n\treturn graph.AddEdge(from, to, true, edgeAttributes)\n}\n\nfunc buildGraph(graph, parentGraph *gographviz.Graph, instance any, highlightedPairs [][]string, visitedNodes map[string]bool) error {\n\tnamedInstance, ok := instance.(namedInstance)\n\tif !ok {\n\t\treturn nil\n\t}\n\tif visitedNodes[namedInstance.Name()] {\n\t\treturn nil\n\t}\n\n\terr := drawNode(graph, parentGraph, instance, highlightedPairs, visitedNodes)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"draw node: %w\", err)\n\t}\n\tagent, ok := instance.(agent.Agent)\n\tif !ok {\n\t\treturn nil\n\t}\n\tllmAgent, ok := instance.(llmagentinternal.Agent)\n\tif ok {\n\t\ttools := llmagentinternal.Reveal(llmAgent).Tools\n\t\tfor _, tool := range tools {\n\t\t\terr = drawNode(graph, parentGraph, tool, highlightedPairs, visitedNodes)\n\t\t\tif err != nil {\n\t\t\t\treturn fmt.Errorf(\"draw tool node: %w\", err)\n\t\t\t}\n\t\t\terr = drawEdge(graph, nodeName(agent), nodeName(tool), highlightedPairs)\n\t\t\tif err != nil {\n\t\t\t\treturn fmt.Errorf(\"draw tool edge: %w\", err)\n\t\t\t}\n\t\t}\n\t}\n\tfor _, subAgent := range agent.SubAgents() {\n\t\terr = buildGraph(graph, parentGraph, subAgent, highlightedPairs, visitedNodes)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"build sub agent graph: %w\", err)\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc GetAgentGraph(ctx context.Context, agent agent.Agent, highlightedPairs [][]string) (string, error) {\n\tgraph := gographviz.NewGraph()\n\tif err := graph.SetName(\"AgentGraph\"); err != nil {\n\t\treturn \"\", fmt.Errorf(\"set graph name: %w\", err)\n\t}\n\tif err := graph.SetDir(true); err != nil {\n\t\treturn \"\", fmt.Errorf(\"set graph direction: %w\", err)\n\t}\n\tif err := graph.AddAttr(graph.Name, \"rankdir\", \"LR\"); err != nil {\n\t\treturn \"\", fmt.Errorf(\"set graph rank direction: %w\", err)\n\t}\n\tif err := graph.AddAttr(graph.Name, \"bgcolor\", Background); err != nil {\n\t\treturn \"\", fmt.Errorf(\"set graph background color: %w\", err)\n\t}\n\tvisitedNodes := map[string]bool{}\n\terr := buildGraph(graph, graph, agent, highlightedPairs, visitedNodes)\n\tif err != nil {\n\t\treturn \"\", fmt.Errorf(\"build root graph: %w\", err)\n\t}\n\treturn graph.String(), nil\n}\n"
  },
  {
    "path": "server/adkrest/internal/services/agentgraphgenerator_test.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage services\n\nimport (\n\t\"context\"\n\t\"iter\"\n\t\"testing\"\n\n\t\"github.com/awalterschulze/gographviz\"\n\t\"github.com/google/go-cmp/cmp\"\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/agent\"\n\t\"google.golang.org/adk/agent/llmagent\"\n\t\"google.golang.org/adk/agent/workflowagents/loopagent\"\n\t\"google.golang.org/adk/agent/workflowagents/parallelagent\"\n\t\"google.golang.org/adk/agent/workflowagents/sequentialagent\"\n\tagentinternal \"google.golang.org/adk/internal/agent\"\n\t\"google.golang.org/adk/model\"\n\t\"google.golang.org/adk/tool\"\n)\n\ntype dummyLLM struct {\n\tname string\n}\n\nfunc (d *dummyLLM) Name() string {\n\treturn d.name\n}\n\nfunc (d *dummyLLM) GenerateContent(ctx context.Context, req *model.LLMRequest, stream bool) iter.Seq2[*model.LLMResponse, error] {\n\treturn func(yield func(*model.LLMResponse, error) bool) {\n\t\tyield(&model.LLMResponse{\n\t\t\tContent: &genai.Content{\n\t\t\t\tParts: []*genai.Part{{Text: \"Response from agentgrapgenerator test.\"}},\n\t\t\t},\n\t\t}, nil)\n\t}\n}\n\n// Helper to create a generic agent.Agent\nfunc newTestAgent(t *testing.T, name, description string, agentType agentinternal.Type, subAgents []agent.Agent, tools []tool.Tool) agent.Agent {\n\tvar a agent.Agent\n\tvar err error\n\n\tswitch agentType {\n\tcase agentinternal.TypeSequentialAgent:\n\t\ta, err = sequentialagent.New(sequentialagent.Config{\n\t\t\tAgentConfig: agent.Config{\n\t\t\t\tName:        name,\n\t\t\t\tDescription: description,\n\t\t\t\tSubAgents:   subAgents,\n\t\t\t},\n\t\t})\n\tcase agentinternal.TypeLoopAgent:\n\t\ta, err = loopagent.New(loopagent.Config{\n\t\t\tAgentConfig: agent.Config{\n\t\t\t\tName:        name,\n\t\t\t\tDescription: description,\n\t\t\t\tSubAgents:   subAgents,\n\t\t\t},\n\t\t\tMaxIterations: 1,\n\t\t})\n\tcase agentinternal.TypeParallelAgent:\n\t\ta, err = parallelagent.New(parallelagent.Config{\n\t\t\tAgentConfig: agent.Config{\n\t\t\t\tName:        name,\n\t\t\t\tDescription: description,\n\t\t\t\tSubAgents:   subAgents,\n\t\t\t},\n\t\t})\n\tcase agentinternal.TypeCustomAgent, agentinternal.TypeLLMAgent:\n\t\ta, err = llmagent.New(llmagent.Config{\n\t\t\tName:        name,\n\t\t\tDescription: description,\n\t\t\tModel:       &dummyLLM{},\n\t\t\tTools:       tools,\n\t\t\tSubAgents:   subAgents,\n\t\t})\n\tdefault:\n\t\tt.Fatalf(\"Unsupported agent type: %v\", agentType)\n\t}\n\n\tif err != nil {\n\t\tt.Fatalf(\"failed to create agent: %v\", err)\n\t}\n\treturn a\n}\n\n// Mock tool for testing\ntype mockTool struct {\n\tname string\n}\n\nfunc (m *mockTool) Name() string { return m.name }\n\nfunc (m *mockTool) Description() string { return \"\" }\n\nfunc (m *mockTool) IsLongRunning() bool { return false }\n\nfunc TestNodeName(t *testing.T) {\n\ttests := []struct {\n\t\tname     string\n\t\tinstance any\n\t\texpected string\n\t}{\n\t\t{\n\t\t\tname:     \"agent\",\n\t\t\tinstance: newTestAgent(t, \"TestAgent\", \"\", agentinternal.TypeCustomAgent, nil, nil),\n\t\t\texpected: \"TestAgent\",\n\t\t},\n\t\t{\n\t\t\tname:     \"tool\",\n\t\t\tinstance: &mockTool{name: \"TestTool\"},\n\t\t\texpected: \"TestTool\",\n\t\t},\n\t\t{\n\t\t\tname:     \"unknown\",\n\t\t\tinstance: \"some string\",\n\t\t\texpected: \"Unknown instance type\",\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tif got := nodeName(tt.instance); got != tt.expected {\n\t\t\t\tt.Errorf(\"nodeName(%v) = %s; want %s\", tt.instance, got, tt.expected)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestNodeCaption(t *testing.T) {\n\ttests := []struct {\n\t\tname     string\n\t\tinstance any\n\t\texpected string\n\t}{\n\t\t{\n\t\t\tname:     \"llm agent\",\n\t\t\tinstance: newTestAgent(t, \"LLMAgent\", \"\", agentinternal.TypeLLMAgent, nil, nil),\n\t\t\texpected: \"\\\"🤖 LLMAgent\\\"\",\n\t\t},\n\t\t{\n\t\t\tname:     \"sequential agent\",\n\t\t\tinstance: newTestAgent(t, \"SeqAgent\", \"\", agentinternal.TypeSequentialAgent, nil, nil),\n\t\t\texpected: \"\\\"SeqAgent (SequentialAgent)\\\"\",\n\t\t},\n\t\t{\n\t\t\tname:     \"loop agent\",\n\t\t\tinstance: newTestAgent(t, \"LoopAgent\", \"\", agentinternal.TypeLoopAgent, nil, nil),\n\t\t\texpected: \"\\\"LoopAgent (LoopAgent)\\\"\",\n\t\t},\n\t\t{\n\t\t\tname:     \"parallel agent\",\n\t\t\tinstance: newTestAgent(t, \"ParAgent\", \"\", agentinternal.TypeParallelAgent, nil, nil),\n\t\t\texpected: \"\\\"ParAgent (ParallelAgent)\\\"\",\n\t\t},\n\t\t{\n\t\t\tname:     \"tool\",\n\t\t\tinstance: &mockTool{name: \"TestTool\"},\n\t\t\texpected: \"\\\"🔧 TestTool\\\"\",\n\t\t},\n\t\t{\n\t\t\tname:     \"unknown\",\n\t\t\tinstance: \"some string\",\n\t\t\texpected: \"\\\"Unsupported agent or tool type\\\"\",\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tif got := nodeCaption(tt.instance); got != tt.expected {\n\t\t\t\tt.Errorf(\"nodeCaption(%v) = %s; want %s\", tt.instance, got, tt.expected)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestNodeShape(t *testing.T) {\n\ttests := []struct {\n\t\tname     string\n\t\tinstance any\n\t\texpected string\n\t}{\n\t\t{\n\t\t\tname:     \"agent\",\n\t\t\tinstance: newTestAgent(t, \"TestAgent\", \"\", agentinternal.TypeCustomAgent, nil, nil),\n\t\t\texpected: \"ellipse\",\n\t\t},\n\t\t{\n\t\t\tname:     \"tool\",\n\t\t\tinstance: &mockTool{name: \"TestTool\"},\n\t\t\texpected: \"box\",\n\t\t},\n\t\t{\n\t\t\tname:     \"unknown\",\n\t\t\tinstance: \"some string\",\n\t\t\texpected: \"cylinder\",\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tif got := nodeShape(tt.instance); got != tt.expected {\n\t\t\t\tt.Errorf(\"nodeShape(%v) = %s; want %s\", tt.instance, got, tt.expected)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestShouldBuildAgentCluster(t *testing.T) {\n\ttests := []struct {\n\t\tname     string\n\t\tinstance any\n\t\texpected bool\n\t}{\n\t\t{\n\t\t\tname:     \"llm agent\",\n\t\t\tinstance: newTestAgent(t, \"LLMAgent\", \"\", agentinternal.TypeLLMAgent, nil, nil),\n\t\t\texpected: false,\n\t\t},\n\t\t{\n\t\t\tname:     \"sequential agent\",\n\t\t\tinstance: newTestAgent(t, \"SeqAgent\", \"\", agentinternal.TypeSequentialAgent, nil, nil),\n\t\t\texpected: true,\n\t\t},\n\t\t{\n\t\t\tname:     \"loop agent\",\n\t\t\tinstance: newTestAgent(t, \"LoopAgent\", \"\", agentinternal.TypeLoopAgent, nil, nil),\n\t\t\texpected: true,\n\t\t},\n\t\t{\n\t\t\tname:     \"parallel agent\",\n\t\t\tinstance: newTestAgent(t, \"ParAgent\", \"\", agentinternal.TypeParallelAgent, nil, nil),\n\t\t\texpected: true,\n\t\t},\n\t\t{\n\t\t\tname:     \"tool\",\n\t\t\tinstance: &mockTool{name: \"TestTool\"},\n\t\t\texpected: false,\n\t\t},\n\t\t{\n\t\t\tname:     \"unknown\",\n\t\t\tinstance: \"some string\",\n\t\t\texpected: false,\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tif got := shouldBuildAgentCluster(tt.instance); got != tt.expected {\n\t\t\t\tt.Errorf(\"shouldBuildAgentCluster(%v) = %t; want %t\", tt.instance, got, tt.expected)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestHighlighted(t *testing.T) {\n\ttests := []struct {\n\t\tname             string\n\t\tnodeName         string\n\t\thighlightedPairs [][]string\n\t\texpected         bool\n\t}{\n\t\t{\n\t\t\tname:     \"no highlight\",\n\t\t\tnodeName: \"NodeA\", highlightedPairs: [][]string{},\n\t\t\texpected: false,\n\t\t},\n\t\t{\n\t\t\tname:     \"node in pair\",\n\t\t\tnodeName: \"NodeA\", highlightedPairs: [][]string{{\"NodeA\", \"NodeB\"}},\n\t\t\texpected: true,\n\t\t},\n\t\t{\n\t\t\tname:             \"node not in pair\",\n\t\t\tnodeName:         \"NodeC\",\n\t\t\thighlightedPairs: [][]string{{\"NodeA\", \"NodeB\"}},\n\t\t\texpected:         false,\n\t\t},\n\t\t{\n\t\t\tname:             \"multiple pairs\",\n\t\t\tnodeName:         \"NodeB\",\n\t\t\thighlightedPairs: [][]string{{\"NodeA\", \"NodeB\"}, {\"NodeC\", \"NodeD\"}},\n\t\t\texpected:         true,\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tif got := highlighted(tt.nodeName, tt.highlightedPairs); got != tt.expected {\n\t\t\t\tt.Errorf(\"highlighted(%s, %v) = %t; want %t\", tt.nodeName, tt.highlightedPairs, got, tt.expected)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestEdgeHighlighted(t *testing.T) {\n\ttests := []struct {\n\t\tname             string\n\t\tfrom             string\n\t\tto               string\n\t\thighlightedPairs [][]string\n\t\texpected         *bool // Use pointer to distinguish nil from false\n\t}{\n\t\t{\n\t\t\tname:             \"no highlight pairs\",\n\t\t\tfrom:             \"A\",\n\t\t\tto:               \"B\",\n\t\t\thighlightedPairs: [][]string{},\n\t\t\texpected:         nil,\n\t\t},\n\t\t{\n\t\t\tname:             \"matching forward\",\n\t\t\tfrom:             \"A\",\n\t\t\tto:               \"B\",\n\t\t\thighlightedPairs: [][]string{{\"A\", \"B\"}},\n\t\t\texpected:         boolPtr(true),\n\t\t},\n\t\t{\n\t\t\tname:             \"matching backward\",\n\t\t\tfrom:             \"B\",\n\t\t\tto:               \"A\",\n\t\t\thighlightedPairs: [][]string{{\"A\", \"B\"}},\n\t\t\texpected:         boolPtr(false),\n\t\t},\n\t\t{\n\t\t\tname: \"no match\",\n\t\t\tfrom: \"C\",\n\t\t\tto:   \"D\", highlightedPairs: [][]string{{\"A\", \"B\"}},\n\t\t\texpected: nil,\n\t\t},\n\t\t{\n\t\t\tname:             \"partial match\",\n\t\t\tfrom:             \"A\",\n\t\t\tto:               \"C\",\n\t\t\thighlightedPairs: [][]string{{\"A\", \"B\"}},\n\t\t\texpected:         nil,\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tgot := edgeHighlighted(tt.from, tt.to, tt.highlightedPairs)\n\t\t\tif (got == nil && tt.expected != nil) || (got != nil && tt.expected == nil) {\n\t\t\t\tt.Errorf(\"edgeHighlighted(%s, %s, %v) = %v; want %v\", tt.from, tt.to, tt.highlightedPairs, got, tt.expected)\n\t\t\t} else if got != nil && tt.expected != nil && *got != *tt.expected {\n\t\t\t\tt.Errorf(\"edgeHighlighted(%s, %s, %v) = %t; want %t\", tt.from, tt.to, tt.highlightedPairs, *got, *tt.expected)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestDrawNode(t *testing.T) {\n\ttests := []struct {\n\t\tname             string\n\t\tagent            agent.Agent\n\t\ttool             tool.Tool\n\t\thighlightedPairs [][]string\n\t\texpected         gographviz.Attrs\n\t}{\n\t\t{\n\t\t\tname:             \"draw agent node\",\n\t\t\tagent:            newTestAgent(t, \"MyAgent\", \"\", agentinternal.TypeCustomAgent, nil, nil),\n\t\t\thighlightedPairs: [][]string{},\n\t\t\texpected: gographviz.Attrs{\n\t\t\t\t\"color\":     LightGray,\n\t\t\t\t\"label\":     \"\\\"🤖 MyAgent\\\"\",\n\t\t\t\t\"shape\":     \"ellipse\",\n\t\t\t\t\"fontcolor\": LightGray,\n\t\t\t\t\"style\":     \"rounded\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname:             \"draw agent node highlighted\",\n\t\t\tagent:            newTestAgent(t, \"HighlightedAgent\", \"\", agentinternal.TypeCustomAgent, nil, nil),\n\t\t\thighlightedPairs: [][]string{{\"HighlightedAgent\", \"Tool1\"}},\n\t\t\texpected: gographviz.Attrs{\n\t\t\t\t\"color\":     DarkGreen,\n\t\t\t\t\"label\":     \"\\\"🤖 HighlightedAgent\\\"\",\n\t\t\t\t\"shape\":     \"ellipse\",\n\t\t\t\t\"fontcolor\": LightGray,\n\t\t\t\t\"style\":     \"filled\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname:             \"draw tool node\",\n\t\t\ttool:             &mockTool{name: \"MyTool\"},\n\t\t\thighlightedPairs: [][]string{},\n\t\t\texpected: gographviz.Attrs{\n\t\t\t\t\"color\":     LightGray,\n\t\t\t\t\"label\":     \"\\\"🔧 MyTool\\\"\",\n\t\t\t\t\"shape\":     \"box\",\n\t\t\t\t\"fontcolor\": LightGray,\n\t\t\t\t\"style\":     \"rounded\",\n\t\t\t},\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tgraph := gographviz.NewGraph()\n\t\t\terr := graph.SetName(\"G\")\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"failed to set graph name: %v\", err)\n\t\t\t}\n\t\t\tparentGraph := graph\n\t\t\tvisitedNodes := make(map[string]bool)\n\t\t\tnodeName := \"\"\n\t\t\tif tt.agent != nil {\n\t\t\t\terr = drawNode(graph, parentGraph, tt.agent, tt.highlightedPairs, visitedNodes)\n\t\t\t\tif err != nil {\n\t\t\t\t\tt.Fatalf(\"drawNode failed: %v\", err)\n\t\t\t\t}\n\t\t\t\tnodeName = tt.agent.Name()\n\t\t\t}\n\t\t\tif tt.tool != nil {\n\t\t\t\terr = drawNode(graph, parentGraph, tt.tool, tt.highlightedPairs, visitedNodes)\n\t\t\t\tif err != nil {\n\t\t\t\t\tt.Fatalf(\"drawNode failed: %v\", err)\n\t\t\t\t}\n\t\t\t\tnodeName = tt.tool.Name()\n\t\t\t}\n\t\t\tif nodeName == \"\" {\n\t\t\t\tt.Fatalf(\"No node name found: %v\", nodeName)\n\t\t\t}\n\t\t\tnode := graph.Nodes.Lookup[nodeName]\n\t\t\tif node == nil {\n\t\t\t\tt.Fatal(\"Agent node not found in graph\")\n\t\t\t\t// to prevent SA5011: possible nil pointer dereference (staticcheck)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif diff := cmp.Diff(tt.expected, node.Attrs); diff != \"\" {\n\t\t\t\tt.Fatalf(\"drawNode mismatch (-want +got):\\n%s\", diff)\n\t\t\t}\n\t\t\tif !visitedNodes[nodeName] {\n\t\t\t\tt.Error(\"Agent node not marked as visited\")\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestDrawClusterNode(t *testing.T) {\n\tgraph := gographviz.NewGraph()\n\terr := graph.SetName(\"G\")\n\tif err != nil {\n\t\tt.Fatalf(\"failed to set graph name: %v\", err)\n\t}\n\tparentGraph := graph\n\tvisitedNodes := make(map[string]bool)\n\tagent := newTestAgent(t, \"MyClusterAgent\", \"\", agentinternal.TypeSequentialAgent, nil, nil)\n\terr = drawNode(graph, parentGraph, agent, [][]string{}, visitedNodes)\n\tif err != nil {\n\t\tt.Fatalf(\"drawNode failed: %v\", err)\n\t}\n\tclusterName := \"cluster_MyClusterAgent\"\n\tcluster := graph.SubGraphs.SubGraphs[clusterName]\n\tif cluster == nil {\n\t\tt.Fatal(\"Cluster not found in graph\")\n\t\t// to prevent SA5011: possible nil pointer dereference (staticcheck)\n\t\treturn\n\t}\n\tif cluster.Attrs[\"label\"] != \"\\\"MyClusterAgent (SequentialAgent)\\\"\" {\n\t\tt.Errorf(\"Cluster label mismatch: got %s\", cluster.Attrs[\"label\"])\n\t}\n\tif cluster.Attrs[\"style\"] != \"rounded\" {\n\t\tt.Errorf(\"Cluster style mismatch: got %s\", cluster.Attrs[\"style\"])\n\t}\n\tif !visitedNodes[\"MyClusterAgent\"] {\n\t\tt.Error(\"Cluster agent not marked as visited\")\n\t}\n}\n\nfunc lookupEdge(t *testing.T, graph *gographviz.Graph, src, dst string) *gographviz.Edge {\n\tnode := graph.Edges.SrcToDsts[src]\n\tif node == nil {\n\t\treturn nil\n\t}\n\tedges := node[dst]\n\tif edges == nil {\n\t\treturn nil\n\t}\n\tif len(edges) != 1 {\n\t\tt.Fatalf(\"Expected 1 edge, got %d\", len(edges))\n\t}\n\treturn edges[0]\n}\n\nfunc TestDrawEdge(t *testing.T) {\n\ttests := []struct {\n\t\tname             string\n\t\tfrom             string\n\t\tto               string\n\t\thighlightedPairs [][]string\n\t\texpected         gographviz.Attrs\n\t}{\n\t\t{\n\t\t\tname:             \"draw unhighlighted edge\",\n\t\t\tfrom:             \"NodeA\",\n\t\t\tto:               \"NodeB\",\n\t\t\thighlightedPairs: [][]string{},\n\t\t\texpected: gographviz.Attrs{\n\t\t\t\t\"color\":     LightGray,\n\t\t\t\t\"arrowhead\": \"none\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname:             \"draw highlighted edge\",\n\t\t\tfrom:             \"NodeC\",\n\t\t\tto:               \"NodeD\",\n\t\t\thighlightedPairs: [][]string{{\"NodeC\", \"NodeD\"}},\n\t\t\texpected: gographviz.Attrs{\n\t\t\t\t\"color\":     LightGreen,\n\t\t\t\t\"arrowhead\": \"normal\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname:             \"draw highlighted backward edge\",\n\t\t\tfrom:             \"NodeE\",\n\t\t\tto:               \"NodeF\",\n\t\t\thighlightedPairs: [][]string{{\"NodeF\", \"NodeE\"}},\n\t\t\texpected: gographviz.Attrs{\n\t\t\t\t\"color\":     LightGreen,\n\t\t\t\t\"arrowhead\": \"normal\",\n\t\t\t\t\"dir\":       \"back\",\n\t\t\t},\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tgraph := gographviz.NewGraph()\n\t\t\terr := graph.SetName(\"G\")\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"failed to set graph name: %v\", err)\n\t\t\t}\n\n\t\t\tfor _, node := range []string{tt.from, tt.to} {\n\t\t\t\terr := graph.AddNode(\"G\", node, nil)\n\t\t\t\tif err != nil {\n\t\t\t\t\tt.Fatalf(\"failed to add node %s: %v\", node, err)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\terr = drawEdge(graph, tt.from, tt.to, tt.highlightedPairs)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"drawEdge failed: %v\", err)\n\t\t\t}\n\t\t\tedge := lookupEdge(t, graph, tt.from, tt.to)\n\t\t\tif edge == nil {\n\t\t\t\tt.Fatalf(\"Edge between %v and %v not found\", tt.from, tt.to)\n\t\t\t\t// to prevent SA5011: possible nil pointer dereference (staticcheck)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif diff := cmp.Diff(tt.expected, edge.Attrs); diff != \"\" {\n\t\t\t\tt.Fatalf(\"drawEdge mismatch (-want +got):\\n%s\", diff)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestDrawCluster(t *testing.T) {\n\ttests := []struct {\n\t\tname      string\n\t\tagentType agentinternal.Type\n\t}{\n\t\t{\n\t\t\tname:      \"sequential agent cluster\",\n\t\t\tagentType: agentinternal.TypeSequentialAgent,\n\t\t},\n\t\t{\n\t\t\tname:      \"parallel agent cluster\",\n\t\t\tagentType: agentinternal.TypeParallelAgent,\n\t\t},\n\t\t{\n\t\t\tname:      \"loop agent cluster\",\n\t\t\tagentType: agentinternal.TypeLoopAgent,\n\t\t},\n\t}\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tparentGraph := gographviz.NewGraph()\n\t\t\terr := parentGraph.SetName(\"ParentG\")\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"failed to set parent graph name: %v\", err)\n\t\t\t}\n\n\t\t\tvisitedNodes := make(map[string]bool)\n\t\t\tsubAgent1 := newTestAgent(t, \"SubAgent1\", \"\", agentinternal.TypeLLMAgent, nil, nil)\n\t\t\tsubAgent2 := newTestAgent(t, \"SubAgent2\", \"\", agentinternal.TypeLLMAgent, nil, nil)\n\t\t\tparentAgent := newTestAgent(t, \"ParentAgent\", \"\", tt.agentType, []agent.Agent{subAgent1, subAgent2}, nil)\n\n\t\t\tclusterGraph := gographviz.NewGraph()\n\t\t\terr = drawCluster(parentGraph, clusterGraph, parentAgent, [][]string{}, visitedNodes)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"drawCluster failed: %v\", err)\n\t\t\t}\n\n\t\t\tif parentGraph.Nodes.Lookup[\"SubAgent1\"] == nil || parentGraph.Nodes.Lookup[\"SubAgent2\"] == nil {\n\t\t\t\tt.Error(\"Sub-agents not drawn as nodes in parent graph\")\n\t\t\t}\n\n\t\t\tswitch tt.agentType {\n\t\t\tcase agentinternal.TypeSequentialAgent:\n\t\t\t\t// Check if sub-agents are drawn as nodes in the parent graph (since drawNode adds to parentGraph)\n\t\t\t\tedge := lookupEdge(t, parentGraph, \"SubAgent1\", \"SubAgent2\")\n\t\t\t\t// Check if edge exists between sub-agents\n\t\t\t\tif edge == nil {\n\t\t\t\t\tt.Fatalf(\"Edge between SubAgent1 and SubAgent2 not found\")\n\t\t\t\t\t// to prevent SA5011: possible nil pointer dereference (staticcheck)\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif edge.Attrs[\"arrowhead\"] != \"none\" {\n\t\t\t\t\tt.Errorf(\"Sequential agent edge arrowhead mismatch: got %s\", edge.Attrs[\"arrowhead\"])\n\t\t\t\t}\n\t\t\tcase agentinternal.TypeParallelAgent:\n\t\t\t\t// Check that no edges exist between parallel sub-agents\n\t\t\t\tif lookupEdge(t, parentGraph, \"SubAgent1\", \"SubAgent2\") != nil || lookupEdge(t, parentGraph, \"ParSubAgent2\", \"ParSubAgent1\") != nil {\n\t\t\t\t\tt.Error(\"Unexpected edge found between parallel sub-agents\")\n\t\t\t\t}\n\t\t\tcase agentinternal.TypeLoopAgent:\n\t\t\t\t// Check if edges exist between sub-agents and back to the first\n\t\t\t\tif lookupEdge(t, parentGraph, \"SubAgent1\", \"SubAgent2\") == nil {\n\t\t\t\t\tt.Error(\"Edge between SubAgent1 and SubAgent2 not found\")\n\t\t\t\t}\n\t\t\t\tif lookupEdge(t, parentGraph, \"SubAgent1\", \"SubAgent2\") == nil {\n\t\t\t\t\tt.Error(\"Edge between SubAgent1 and LoopSubAgent1 not found\")\n\t\t\t\t}\n\t\t\tdefault:\n\t\t\t\tt.Fatalf(\"Wrong agent type provided: %v\", tt.agentType)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestBuildGraph(t *testing.T) {\n\tgraph := gographviz.NewGraph()\n\terr := graph.SetName(\"G\")\n\tif err != nil {\n\t\tt.Fatalf(\"failed to set parent graph name: %v\", err)\n\t}\n\tparentGraph := graph\n\tvisitedNodes := make(map[string]bool)\n\n\ttool1 := &mockTool{name: \"Tool1\"}\n\ttool2 := &mockTool{name: \"Tool2\"}\n\n\tsubAgent1 := newTestAgent(t, \"SubAgent1\", \"\", agentinternal.TypeLLMAgent, nil, []tool.Tool{tool1})\n\tsubAgent2 := newTestAgent(t, \"SubAgent2\", \"\", agentinternal.TypeLLMAgent, nil, nil)\n\tmainAgent := newTestAgent(t, \"MainAgent\", \"\", agentinternal.TypeLLMAgent, []agent.Agent{subAgent1, subAgent2}, []tool.Tool{tool2})\n\n\terr = buildGraph(graph, parentGraph, mainAgent, [][]string{}, visitedNodes)\n\tif err != nil {\n\t\tt.Fatalf(\"buildGraph failed: %v\", err)\n\t}\n\n\t// Check if all nodes are present\n\texpectedNodes := []string{\"MainAgent\", \"SubAgent1\", \"SubAgent2\", \"Tool1\", \"Tool2\"}\n\tfor _, nodeName := range expectedNodes {\n\t\tif graph.Nodes.Lookup[nodeName] == nil {\n\t\t\tt.Errorf(\"Node %s not found in graph\", nodeName)\n\t\t}\n\t\tif !visitedNodes[nodeName] {\n\t\t\tt.Errorf(\"Node %s not marked as visited\", nodeName)\n\t\t}\n\t}\n\n\t// Check edges from MainAgent to its tools\n\tif lookupEdge(t, graph, \"MainAgent\", \"Tool2\") == nil {\n\t\tt.Error(\"Edge from MainAgent to Tool2 not found\")\n\t}\n\n\t// // Check edges from SubAgent1 to its tools\n\tif lookupEdge(t, graph, \"SubAgent1\", \"Tool1\") == nil {\n\t\tt.Error(\"Edge from SubAgent1 to Tool1 not found\")\n\t}\n}\n"
  },
  {
    "path": "server/adkrest/internal/services/debugtelemetry.go",
    "content": "// Copyright 2026 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage services\n\nimport (\n\t\"context\"\n\t\"slices\"\n\t\"sync\"\n\t\"time\"\n\n\t\"go.opentelemetry.io/otel/attribute\"\n\tsdklog \"go.opentelemetry.io/otel/sdk/log\"\n\tsdktrace \"go.opentelemetry.io/otel/sdk/trace\"\n\tsemconv \"go.opentelemetry.io/otel/semconv/v1.36.0\"\n\t\"go.opentelemetry.io/otel/trace\"\n\n\t\"google.golang.org/adk/internal/telemetry\"\n)\n\nconst eventIDKey = \"gcp.vertex.agent.event_id\"\n\n// DebugTelemetry stores the in memory spans and logs, grouped by session and event.\ntype DebugTelemetry struct {\n\tstore *spanStore\n}\n\n// NewDebugTelemetry returns a new DebugTelemetry instance.\nfunc NewDebugTelemetry() *DebugTelemetry {\n\treturn &DebugTelemetry{\n\t\tstore: newSpanStore(),\n\t}\n}\n\nfunc (d *DebugTelemetry) SpanProcessor() sdktrace.SpanProcessor {\n\t// Use simple processor to avoid the lag between ending the span and it appearing in adk-web.\n\treturn sdktrace.NewSimpleSpanProcessor(d.store)\n}\n\nfunc (d *DebugTelemetry) LogProcessor() sdklog.Processor {\n\t// Use simple processor to avoid the lag between logging and it appearing in adk-web.\n\treturn sdklog.NewSimpleProcessor(d.store)\n}\n\n// GetSpansByEventID returns spans associated with the given event ID.\nfunc (d *DebugTelemetry) GetSpansByEventID(eventID string) []DebugSpan {\n\treturn d.store.getSpansByEventID(eventID)\n}\n\n// GetSpansBySessionID returns spans associated with the given session ID.\nfunc (d *DebugTelemetry) GetSpansBySessionID(sessionID string) []DebugSpan {\n\treturn d.store.getSpansBySessionID(sessionID)\n}\n\nfunc convertAttrs(in []attribute.KeyValue) map[string]string {\n\tout := make(map[string]string)\n\tfor _, attr := range in {\n\t\tout[string(attr.Key)] = attr.Value.Emit()\n\t}\n\treturn out\n}\n\n// DebugSpan represents a span in the trace.\ntype DebugSpan struct {\n\tName         string            `json:\"name\"`\n\tStartTime    int64             `json:\"start_time\"`\n\tEndTime      int64             `json:\"end_time\"`\n\tSpanID       string            `json:\"span_id\"`\n\tTraceID      string            `json:\"trace_id\"`\n\tParentSpanID string            `json:\"parent_span_id\"`\n\tAttributes   map[string]string `json:\"attributes\"`\n\tLogs         []DebugLog        `json:\"logs\"`\n}\n\n// DebugLog represents a log in the span.\ntype DebugLog struct {\n\tBody              any    `json:\"body\"`\n\tObservedTimestamp string `json:\"observed_timestamp\"`\n\tTraceID           string `json:\"trace_id\"`\n\tSpanID            string `json:\"span_id\"`\n\tEventName         string `json:\"event_name\"`\n}\n\n// spanRecord stores a span and its associated logs.\ntype spanRecord struct {\n\tSpan *inMemorySpan\n\tLogs []DebugLog\n}\n\n// inMemorySpan stores spans in memory for debug telemetry.\ntype inMemorySpan struct {\n\tName         string\n\tStartTime    time.Time\n\tEndTime      time.Time\n\tContext      trace.SpanContext\n\tParentSpanID trace.SpanID\n\tAttributes   map[string]string\n}\n\n// spanStore stores spans and logs in memory for debug telemetry.\ntype spanStore struct {\n\tmu sync.RWMutex\n\t// recordsBySpanID stores spans indexed by span id.\n\trecordsBySpanID map[string]*spanRecord\n\t// traceIDsBySessionID stores trace ids indexed by session id for easy lookup.\n\ttraceIDsBySessionID map[string]map[string]struct{}\n\t// recordsByEventID stores spans indexed by event id for easy lookup.\n\trecordsByEventID map[string][]*spanRecord\n\t// recordsByTraceID stores spans indexed by trace id for easy lookup.\n\trecordsByTraceID map[string][]*spanRecord\n}\n\nfunc newSpanStore() *spanStore {\n\treturn &spanStore{\n\t\trecordsBySpanID:     make(map[string]*spanRecord),\n\t\ttraceIDsBySessionID: make(map[string]map[string]struct{}),\n\t\trecordsByEventID:    make(map[string][]*spanRecord),\n\t\trecordsByTraceID:    make(map[string][]*spanRecord),\n\t}\n}\n\nfunc (s *spanStore) getSpansByEventID(id string) []DebugSpan {\n\ts.mu.RLock()\n\tdefer s.mu.RUnlock()\n\t// Create a copy of the slice to avoid race conditions.\n\trecords := slices.Clone(s.recordsByEventID[id])\n\treturn convertRecords(records)\n}\n\nfunc (s *spanStore) getSpansBySessionID(sessionID string) []DebugSpan {\n\ts.mu.RLock()\n\tdefer s.mu.RUnlock()\n\ttraces := s.traceIDsBySessionID[sessionID]\n\tvar records []*spanRecord\n\tfor traceID := range traces {\n\t\tif r, ok := s.recordsByTraceID[traceID]; ok {\n\t\t\trecords = append(records, r...)\n\t\t}\n\t}\n\treturn convertRecords(records)\n}\n\nfunc convertRecords(records []*spanRecord) []DebugSpan {\n\trecords = filterNilsAndSort(records)\n\tdebugSpans := make([]DebugSpan, len(records))\n\tfor i, r := range records {\n\t\t// Clone the logs to avoid race conditions.\n\t\tlogs := slices.Clone(r.Logs)\n\t\tdebugSpans[i] = DebugSpan{\n\t\t\tName:         r.Span.Name,\n\t\t\tStartTime:    r.Span.StartTime.UnixNano(),\n\t\t\tEndTime:      r.Span.EndTime.UnixNano(),\n\t\t\tTraceID:      r.Span.Context.TraceID().String(),\n\t\t\tSpanID:       r.Span.Context.SpanID().String(),\n\t\t\tParentSpanID: r.Span.ParentSpanID.String(),\n\t\t\tAttributes:   r.Span.Attributes,\n\t\t\tLogs:         logs,\n\t\t}\n\t}\n\treturn debugSpans\n}\n\nfunc filterNilsAndSort(records []*spanRecord) []*spanRecord {\n\tfiltered := slices.DeleteFunc(records, func(s *spanRecord) bool {\n\t\t// Logs are emitted before the span is closed and sent to the processor.\n\t\t// Skip them in the response.\n\t\treturn s == nil || s.Span == nil\n\t})\n\tslices.SortFunc(filtered, func(a, b *spanRecord) int {\n\t\treturn a.Span.StartTime.Compare(b.Span.StartTime)\n\t})\n\treturn filtered\n}\n\n// Export implements sdklog.Exporter.\nfunc (s *spanStore) Export(ctx context.Context, logRecords []sdklog.Record) error {\n\ts.mu.Lock()\n\tdefer s.mu.Unlock()\n\tfor _, log := range logRecords {\n\t\tif !log.SpanID().IsValid() {\n\t\t\t// Drop the logs without spanID - we'll never return them to the user.\n\t\t\tcontinue\n\t\t}\n\t\tspanID := log.SpanID().String()\n\t\trecord, ok := s.recordsBySpanID[spanID]\n\t\tif !ok {\n\t\t\trecord = &spanRecord{}\n\t\t\ts.recordsBySpanID[spanID] = record\n\t\t}\n\t\trecord.Logs = append(record.Logs, DebugLog{\n\t\t\tBody:              telemetry.FromLogValue(log.Body()),\n\t\t\tObservedTimestamp: log.ObservedTimestamp().Format(time.RFC3339Nano),\n\t\t\tTraceID:           log.TraceID().String(),\n\t\t\tSpanID:            log.SpanID().String(),\n\t\t\tEventName:         log.EventName(),\n\t\t})\n\t}\n\treturn nil\n}\n\n// ExportSpans implements [sdktrace.SpanExporter].\nfunc (s *spanStore) ExportSpans(ctx context.Context, spans []sdktrace.ReadOnlySpan) error {\n\ts.mu.Lock()\n\tdefer s.mu.Unlock()\n\tfor _, span := range spans {\n\t\tattrs := convertAttrs(span.Attributes())\n\t\tspanID := span.SpanContext().SpanID().String()\n\t\trecord, ok := s.recordsBySpanID[spanID]\n\t\tif !ok {\n\t\t\trecord = &spanRecord{}\n\t\t\ts.recordsBySpanID[spanID] = record\n\t\t}\n\n\t\trecord.Span = &inMemorySpan{\n\t\t\tName:         span.Name(),\n\t\t\tStartTime:    span.StartTime(),\n\t\t\tEndTime:      span.EndTime(),\n\t\t\tContext:      span.SpanContext(),\n\t\t\tParentSpanID: span.Parent().SpanID(),\n\t\t\tAttributes:   attrs,\n\t\t}\n\n\t\ts.updateSpanIndexes(record.Span, record)\n\t}\n\treturn nil\n}\n\nfunc (s *spanStore) updateSpanIndexes(span *inMemorySpan, record *spanRecord) {\n\t// Update session id -> trace id mapping.\n\tsessionIDKey := string(semconv.GenAIConversationIDKey)\n\tif sessionID, ok := span.Attributes[sessionIDKey]; ok {\n\t\ttraces, ok := s.traceIDsBySessionID[sessionID]\n\t\tif !ok {\n\t\t\ttraces = make(map[string]struct{})\n\t\t\ts.traceIDsBySessionID[sessionID] = traces\n\t\t}\n\t\ttraceID := span.Context.TraceID().String()\n\t\ttraces[traceID] = struct{}{}\n\t}\n\t// Update event id -> span id mapping.\n\tif eventID, ok := span.Attributes[eventIDKey]; ok {\n\t\ts.recordsByEventID[eventID] = append(s.recordsByEventID[eventID], record)\n\t}\n\t// Update trace id -> span id mapping.\n\ttraceID := span.Context.TraceID().String()\n\ts.recordsByTraceID[traceID] = append(s.recordsByTraceID[traceID], record)\n}\n\n// ForceFlush implements sdklog.Exporter and sdktrace.SpanProcessor.\nfunc (s *spanStore) ForceFlush(ctx context.Context) error {\n\treturn nil\n}\n\n// Shutdown implements sdklog.Exporter and sdktrace.SpanProcessor.\nfunc (s *spanStore) Shutdown(ctx context.Context) error {\n\treturn nil\n}\n"
  },
  {
    "path": "server/adkrest/internal/services/debugtelemetry_test.go",
    "content": "// Copyright 2026 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage services\n\nimport (\n\t\"context\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/google/go-cmp/cmp\"\n\t\"github.com/google/go-cmp/cmp/cmpopts\"\n\t\"go.opentelemetry.io/otel/attribute\"\n\t\"go.opentelemetry.io/otel/log\"\n\tsdklog \"go.opentelemetry.io/otel/sdk/log\"\n\tsdktrace \"go.opentelemetry.io/otel/sdk/trace\"\n\tsemconv \"go.opentelemetry.io/otel/semconv/v1.36.0\"\n\t\"go.opentelemetry.io/otel/trace\"\n)\n\nfunc TestDebugTelemetryGetSpansBySessionID(t *testing.T) {\n\tctx := context.Background()\n\n\ttype testCase struct {\n\t\tname             string\n\t\ttestSetup        func(ctx context.Context, tracer trace.Tracer, logger log.Logger)\n\t\tquerySessionID   string\n\t\twantSessionSpans []DebugSpan\n\t}\n\n\ttests := []testCase{\n\t\t{\n\t\t\tname: \"root span with conversation id\",\n\t\t\ttestSetup: func(rootCtx context.Context, tracer trace.Tracer, logger log.Logger) {\n\t\t\t\trootCtx, rootSpan := tracer.Start(rootCtx, \"root-span\", trace.WithAttributes(\n\t\t\t\t\tattribute.String(string(semconv.GenAIConversationIDKey), \"session-1\"),\n\t\t\t\t))\n\t\t\t\tdefer rootSpan.End()\n\n\t\t\t\tchildCtx, childSpan := tracer.Start(rootCtx, \"child-span\")\n\t\t\t\tchildLog := log.Record{}\n\t\t\t\tchildLog.SetBody(log.StringValue(\"child-log-body\"))\n\t\t\t\tchildLog.SetEventName(\"child-log-event\")\n\t\t\t\tchildLog.SetTimestamp(time.Now())\n\t\t\t\tlogger.Emit(childCtx, childLog)\n\t\t\t\tchildSpan.End()\n\n\t\t\t\trootLog := log.Record{}\n\t\t\t\trootLog.SetBody(log.StringValue(\"root-log-body\"))\n\t\t\t\trootLog.SetEventName(\"root-log-event\")\n\t\t\t\trootLog.SetTimestamp(time.Now())\n\t\t\t\tlogger.Emit(rootCtx, rootLog)\n\t\t\t},\n\t\t\tquerySessionID: \"session-1\",\n\t\t\twantSessionSpans: []DebugSpan{\n\t\t\t\t{\n\t\t\t\t\tName:         \"root-span\",\n\t\t\t\t\tParentSpanID: trace.SpanID{}.String(),\n\t\t\t\t\tAttributes: map[string]string{\n\t\t\t\t\t\tstring(semconv.GenAIConversationIDKey): \"session-1\",\n\t\t\t\t\t},\n\t\t\t\t\tLogs: []DebugLog{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tBody:      \"root-log-body\",\n\t\t\t\t\t\t\tEventName: \"root-log-event\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tName:         \"child-span\",\n\t\t\t\t\tParentSpanID: trace.SpanID{}.String(),\n\t\t\t\t\tAttributes:   map[string]string{},\n\t\t\t\t\tLogs: []DebugLog{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tBody:      \"child-log-body\",\n\t\t\t\t\t\t\tEventName: \"child-log-event\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"child span with conversation id\",\n\t\t\ttestSetup: func(rootCtx context.Context, tracer trace.Tracer, logger log.Logger) {\n\t\t\t\tvar rootSpan trace.Span\n\t\t\t\trootCtx, rootSpan = tracer.Start(rootCtx, \"root\")\n\t\t\t\tchildCtx, childSpan := tracer.Start(rootCtx, \"child\")\n\t\t\t\t_, secondChildSpan := tracer.Start(rootCtx, \"child-2\")\n\t\t\t\t_, thirdChildSpan := tracer.Start(childCtx, \"grandchild\", trace.WithAttributes(\n\t\t\t\t\tsemconv.GenAIConversationID(\"test-session-id\"),\n\t\t\t\t))\n\t\t\t\tthirdChildSpan.End()\n\t\t\t\tsecondChildSpan.End()\n\t\t\t\tchildSpan.End()\n\t\t\t\trootSpan.End()\n\n\t\t\t\t// Create another trace with a different session ID (should not be returned).\n\t\t\t\t_, rootSpan3 := tracer.Start(context.Background(), \"root-3\", trace.WithAttributes(\n\t\t\t\t\tsemconv.GenAIConversationID(\"test-session-id-1\"),\n\t\t\t\t))\n\t\t\t\trootSpan3.End()\n\t\t\t},\n\t\t\tquerySessionID: \"test-session-id\",\n\t\t\twantSessionSpans: []DebugSpan{\n\t\t\t\t{Name: \"root\", Attributes: map[string]string{}},\n\t\t\t\t{Name: \"child\", Attributes: map[string]string{}},\n\t\t\t\t{Name: \"child-2\", Attributes: map[string]string{}},\n\t\t\t\t{Name: \"grandchild\", Attributes: map[string]string{string(semconv.GenAIConversationIDKey): \"test-session-id\"}},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"multiple traces with same session id\",\n\t\t\ttestSetup: func(ctx context.Context, tracer trace.Tracer, logger log.Logger) {\n\t\t\t\t// Trace 1\n\t\t\t\troot1Ctx, root1Span := tracer.Start(ctx, \"root-1\", trace.WithAttributes(\n\t\t\t\t\tsemconv.GenAIConversationID(\"session-1\"),\n\t\t\t\t))\n\t\t\t\t_, child1 := tracer.Start(root1Ctx, \"child-1\")\n\t\t\t\tchild1.End()\n\t\t\t\troot1Span.End()\n\n\t\t\t\t// Trace 2 (different trace ID, same session ID)\n\t\t\t\t// Session ID on child span\n\t\t\t\troot2Ctx, root2Span := tracer.Start(ctx, \"root-2\")\n\t\t\t\t_, child2 := tracer.Start(root2Ctx, \"child-2\", trace.WithAttributes(\n\t\t\t\t\tsemconv.GenAIConversationID(\"session-1\"),\n\t\t\t\t))\n\t\t\t\tchild2.End()\n\t\t\t\troot2Span.End()\n\t\t\t},\n\t\t\tquerySessionID: \"session-1\",\n\t\t\twantSessionSpans: []DebugSpan{\n\t\t\t\t{Name: \"root-1\", Attributes: map[string]string{string(semconv.GenAIConversationIDKey): \"session-1\"}},\n\t\t\t\t{Name: \"child-1\", Attributes: map[string]string{}},\n\t\t\t\t{Name: \"root-2\", Attributes: map[string]string{}},\n\t\t\t\t{Name: \"child-2\", Attributes: map[string]string{string(semconv.GenAIConversationIDKey): \"session-1\"}},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"trace with spans with mixed session ids session-1\",\n\t\t\ttestSetup: func(ctx context.Context, tracer trace.Tracer, logger log.Logger) {\n\t\t\t\trootCtx, rootSpan := tracer.Start(ctx, \"mixed-root\", trace.WithAttributes(\n\t\t\t\t\tsemconv.GenAIConversationID(\"session-1\"),\n\t\t\t\t))\n\t\t\t\t_, childSpan := tracer.Start(rootCtx, \"mixed-child\", trace.WithAttributes(\n\t\t\t\t\tsemconv.GenAIConversationID(\"session-2\"),\n\t\t\t\t))\n\t\t\t\tchildSpan.End()\n\t\t\t\trootSpan.End()\n\t\t\t},\n\t\t\tquerySessionID: \"session-1\",\n\t\t\twantSessionSpans: []DebugSpan{\n\t\t\t\t{Name: \"mixed-root\", Attributes: map[string]string{string(semconv.GenAIConversationIDKey): \"session-1\"}},\n\t\t\t\t{Name: \"mixed-child\", Attributes: map[string]string{string(semconv.GenAIConversationIDKey): \"session-2\"}},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"trace with spans with mixed session ids session-2\",\n\t\t\ttestSetup: func(ctx context.Context, tracer trace.Tracer, logger log.Logger) {\n\t\t\t\trootCtx, rootSpan := tracer.Start(ctx, \"mixed-root\", trace.WithAttributes(\n\t\t\t\t\tsemconv.GenAIConversationID(\"session-1\"),\n\t\t\t\t))\n\t\t\t\t_, childSpan := tracer.Start(rootCtx, \"mixed-child\", trace.WithAttributes(\n\t\t\t\t\tsemconv.GenAIConversationID(\"session-2\"),\n\t\t\t\t))\n\t\t\t\tchildSpan.End()\n\t\t\t\trootSpan.End()\n\t\t\t},\n\t\t\tquerySessionID: \"session-2\",\n\t\t\twantSessionSpans: []DebugSpan{\n\t\t\t\t{Name: \"mixed-root\", Attributes: map[string]string{string(semconv.GenAIConversationIDKey): \"session-1\"}},\n\t\t\t\t{Name: \"mixed-child\", Attributes: map[string]string{string(semconv.GenAIConversationIDKey): \"session-2\"}},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"no matching session id\",\n\t\t\ttestSetup: func(ctx context.Context, tracer trace.Tracer, logger log.Logger) {\n\t\t\t\t_, rootSpan := tracer.Start(ctx, \"root-1\", trace.WithAttributes(\n\t\t\t\t\tattribute.String(string(semconv.GenAIConversationIDKey), \"session-1\"),\n\t\t\t\t\tattribute.String(\"gcp.vertex.agent.event_id\", \"event-1\"),\n\t\t\t\t))\n\t\t\t\trootSpan.End()\n\t\t\t},\n\t\t\tquerySessionID:   \"non-existent-session\",\n\t\t\twantSessionSpans: nil,\n\t\t},\n\t\t{\n\t\t\tname: \"log without span\",\n\t\t\ttestSetup: func(ctx context.Context, tracer trace.Tracer, logger log.Logger) {\n\t\t\t\tvar logRecord log.Record\n\t\t\t\tlogRecord.SetBody(log.StringValue(\"test body\"))\n\t\t\t\tlogRecord.SetEventName(\"test_event\")\n\t\t\t\tlogRecord.SetTimestamp(time.Now())\n\n\t\t\t\tlogger.Emit(ctx, logRecord)\n\t\t\t},\n\t\t\tquerySessionID:   \"session-1\",\n\t\t\twantSessionSpans: nil,\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tdebugTelemetry, tp, lp := setup()\n\n\t\t\tif tt.testSetup != nil {\n\t\t\t\ttt.testSetup(ctx, tp.Tracer(\"test-tracer\"), lp.Logger(\"test-logger\"))\n\t\t\t}\n\t\t\tif err := tp.ForceFlush(ctx); err != nil {\n\t\t\t\tt.Fatalf(\"Failed to flush spans: %v\", err)\n\t\t\t}\n\t\t\tif err := lp.ForceFlush(ctx); err != nil {\n\t\t\t\tt.Fatalf(\"Failed to flush logs: %v\", err)\n\t\t\t}\n\n\t\t\tcmpOpts := []cmp.Option{\n\t\t\t\tcmpopts.IgnoreUnexported(log.Value{}),\n\t\t\t\tcmpopts.IgnoreFields(DebugSpan{}, \"StartTime\", \"EndTime\", \"TraceID\", \"SpanID\", \"ParentSpanID\"),\n\t\t\t\tcmpopts.IgnoreFields(DebugLog{}, \"ObservedTimestamp\", \"TraceID\", \"SpanID\"),\n\t\t\t\tcmpopts.EquateEmpty(),\n\t\t\t}\n\n\t\t\t// Validate session spans\n\t\t\tgotSessionSpans := debugTelemetry.GetSpansBySessionID(tt.querySessionID)\n\t\t\tif diff := cmp.Diff(tt.wantSessionSpans, gotSessionSpans, cmpOpts...); diff != \"\" {\n\t\t\t\tt.Errorf(\"GetSpansBySessionID() mismatch (-want +got):\\n%s\", diff)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestDebugTelemetryGetSpansByEventID(t *testing.T) {\n\tctx := context.Background()\n\n\ttype testCase struct {\n\t\tname           string\n\t\ttestSetup      func(ctx context.Context, tracer trace.Tracer, logger log.Logger)\n\t\tqueryEventID   string\n\t\twantEventSpans []DebugSpan\n\t}\n\n\ttests := []testCase{\n\t\t{\n\t\t\tname: \"single span and log\",\n\t\t\ttestSetup: func(ctx context.Context, tracer trace.Tracer, logger log.Logger) {\n\t\t\t\tctx, span := tracer.Start(ctx, \"root-1\", trace.WithAttributes(\n\t\t\t\t\tattribute.String(\"gcp.vertex.agent.event_id\", \"event-1\"),\n\t\t\t\t\tattribute.String(\"genai.operation.name\", \"generate_content\"),\n\t\t\t\t))\n\t\t\t\tdefer span.End()\n\n\t\t\t\tvar r log.Record\n\t\t\t\tr.SetBody(log.StringValue(\"test body\"))\n\t\t\t\tr.SetEventName(\"test_event\")\n\t\t\t\tr.SetTimestamp(time.Now())\n\n\t\t\t\tlogger.Emit(ctx, r)\n\t\t\t},\n\t\t\tqueryEventID: \"event-1\",\n\t\t\twantEventSpans: []DebugSpan{\n\t\t\t\t{\n\t\t\t\t\tName:         \"root-1\",\n\t\t\t\t\tParentSpanID: trace.SpanID{}.String(),\n\t\t\t\t\tAttributes: map[string]string{\n\t\t\t\t\t\t\"gcp.vertex.agent.event_id\": \"event-1\",\n\t\t\t\t\t\t\"genai.operation.name\":      \"generate_content\",\n\t\t\t\t\t},\n\t\t\t\t\tLogs: []DebugLog{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tBody:      \"test body\",\n\t\t\t\t\t\t\tEventName: \"test_event\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"multiple spans\",\n\t\t\ttestSetup: func(span1Ctx context.Context, tracer trace.Tracer, logger log.Logger) {\n\t\t\t\tspan1Ctx, span1 := tracer.Start(span1Ctx, \"root-1\", trace.WithAttributes(\n\t\t\t\t\tattribute.String(\"gcp.vertex.agent.event_id\", \"event-1\"),\n\t\t\t\t\tattribute.String(\"genai.operation.name\", \"generate_content\"),\n\t\t\t\t))\n\t\t\t\tdefer span1.End()\n\n\t\t\t\t_, span2 := tracer.Start(span1Ctx, \"root-2\", trace.WithAttributes(\n\t\t\t\t\tattribute.String(\"gcp.vertex.agent.event_id\", \"event-1\"),\n\t\t\t\t\tattribute.String(\"genai.operation.name\", \"execute_tool\"),\n\t\t\t\t))\n\t\t\t\tdefer span2.End()\n\t\t\t},\n\t\t\tqueryEventID: \"event-1\",\n\t\t\twantEventSpans: []DebugSpan{\n\t\t\t\t{\n\t\t\t\t\tName:         \"root-1\",\n\t\t\t\t\tParentSpanID: trace.SpanID{}.String(),\n\t\t\t\t\tAttributes: map[string]string{\n\t\t\t\t\t\t\"gcp.vertex.agent.event_id\": \"event-1\",\n\t\t\t\t\t\t\"genai.operation.name\":      \"generate_content\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tName:         \"root-2\",\n\t\t\t\t\tParentSpanID: trace.SpanID{}.String(),\n\t\t\t\t\tAttributes: map[string]string{\n\t\t\t\t\t\t\"gcp.vertex.agent.event_id\": \"event-1\",\n\t\t\t\t\t\t\"genai.operation.name\":      \"execute_tool\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"no matching span\",\n\t\t\ttestSetup: func(ctx context.Context, tracer trace.Tracer, logger log.Logger) {\n\t\t\t\t_, span := tracer.Start(ctx, \"root-1\", trace.WithAttributes(\n\t\t\t\t\tattribute.String(\"gcp.vertex.agent.event_id\", \"event-1\"),\n\t\t\t\t\tattribute.String(\"genai.operation.name\", \"generate_content\"),\n\t\t\t\t))\n\t\t\t\tspan.End()\n\t\t\t},\n\t\t\tqueryEventID:   \"non-existent-event\",\n\t\t\twantEventSpans: nil,\n\t\t},\n\t\t{\n\t\t\tname: \"log without span\",\n\t\t\ttestSetup: func(ctx context.Context, tracer trace.Tracer, logger log.Logger) {\n\t\t\t\tvar r log.Record\n\t\t\t\tr.SetBody(log.StringValue(\"test body\"))\n\t\t\t\tr.SetEventName(\"test_event\")\n\t\t\t\tr.SetTimestamp(time.Now())\n\n\t\t\t\tlogger.Emit(ctx, r)\n\t\t\t},\n\t\t\tqueryEventID:   \"event-1\",\n\t\t\twantEventSpans: nil,\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tdebugTelemetry, tp, lp := setup()\n\n\t\t\tif tt.testSetup != nil {\n\t\t\t\ttt.testSetup(ctx, tp.Tracer(\"test-tracer\"), lp.Logger(\"test-logger\"))\n\t\t\t}\n\t\t\tif err := tp.ForceFlush(ctx); err != nil {\n\t\t\t\tt.Fatalf(\"Failed to flush spans: %v\", err)\n\t\t\t}\n\t\t\tif err := lp.ForceFlush(ctx); err != nil {\n\t\t\t\tt.Fatalf(\"Failed to flush logs: %v\", err)\n\t\t\t}\n\n\t\t\tcmpOpts := []cmp.Option{\n\t\t\t\tcmpopts.IgnoreUnexported(log.Value{}),\n\t\t\t\tcmpopts.IgnoreFields(DebugSpan{}, \"StartTime\", \"EndTime\", \"ParentSpanID\", \"TraceID\", \"SpanID\"),\n\t\t\t\tcmpopts.IgnoreFields(DebugLog{}, \"ObservedTimestamp\", \"TraceID\", \"SpanID\"),\n\t\t\t\tcmpopts.EquateEmpty(),\n\t\t\t}\n\n\t\t\t// Validate event spans\n\t\t\tgotEventSpans := debugTelemetry.GetSpansByEventID(tt.queryEventID)\n\t\t\tif diff := cmp.Diff(tt.wantEventSpans, gotEventSpans, cmpOpts...); diff != \"\" {\n\t\t\t\tt.Errorf(\"GetSpansByEventID() mismatch (-want +got):\\n%s\", diff)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc setup() (*DebugTelemetry, *sdktrace.TracerProvider, *sdklog.LoggerProvider) {\n\tdebugTelemetry := NewDebugTelemetry()\n\ttp := sdktrace.NewTracerProvider(\n\t\tsdktrace.WithSpanProcessor(debugTelemetry.SpanProcessor()),\n\t)\n\tlp := sdklog.NewLoggerProvider(sdklog.WithProcessor(debugTelemetry.LogProcessor()))\n\n\treturn debugTelemetry, tp, lp\n}\n"
  },
  {
    "path": "server/adkrest/internal/services/doc.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Package services contains services defined for the ADK-Web REST API.\npackage services\n"
  },
  {
    "path": "server/doc.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Package server hosts protocol implementations to expose and serve ADK agents.\npackage server\n"
  },
  {
    "path": "session/database/gorm_datatypes.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage database\n\nimport (\n\t\"context\"\n\t\"database/sql/driver\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\n\t\"gorm.io/gorm\"\n\t\"gorm.io/gorm/clause\"\n\t\"gorm.io/gorm/schema\"\n)\n\n// stateMap is a custom type for map[string]any that handles its own\n// JSON serialization and deserialization for the database by implementing gorm.Serializer.\ntype stateMap map[string]any\n\n// GormDataType defines the generic fallback data type, implements GormDataTypeInterface\nfunc (stateMap) GormDataType() string {\n\treturn \"text\"\n}\n\n// GormDBDataType defines database specific data types, implements GormDBDataTypeInterface\nfunc (stateMap) GormDBDataType(db *gorm.DB, field *schema.Field) string {\n\tswitch db.Dialector.Name() {\n\tcase \"postgres\":\n\t\treturn \"JSONB\"\n\tcase \"mysql\":\n\t\treturn \"LONGTEXT\"\n\tcase \"spanner\":\n\t\treturn \"STRING(MAX)\"\n\tdefault:\n\t\treturn \"\"\n\t}\n}\n\n// Value implements the gorm.Serializer Value method.\nfunc (sm stateMap) Value() (driver.Value, error) {\n\tif sm == nil {\n\t\tsm = make(map[string]any) // Serialize as '{}' instead of NULL\n\t}\n\t// For all other databases, return a JSON string.\n\tb, err := json.Marshal(sm)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn string(b), nil\n}\n\n// Scan implements the gorm.Serializer Scan method.\nfunc (sm *stateMap) Scan(value any) error {\n\tif value == nil {\n\t\t*sm = make(map[string]any)\n\t\treturn nil\n\t}\n\n\tvar bytes []byte\n\n\tswitch v := value.(type) {\n\tcase []byte: // Postgres, MySQL\n\t\tbytes = v\n\tcase string: // Some drivers\n\t\tbytes = []byte(v)\n\tdefault:\n\t\treturn fmt.Errorf(\"failed to unmarshal JSON value: %T\", value)\n\t}\n\n\tif len(bytes) == 0 {\n\t\t*sm = make(map[string]any)\n\t\treturn nil\n\t}\n\n\treturn json.Unmarshal(bytes, sm)\n}\n\nfunc (sm stateMap) GormValue(ctx context.Context, db *gorm.DB) clause.Expr {\n\tdata, _ := json.Marshal(sm)\n\t// TODO log the expression result\n\treturn gorm.Expr(\"?\", string(data))\n}\n\n// dynamicJSON defined JSON data type, that implements driver.Valuer, sql.Scanner interface\ntype dynamicJSON json.RawMessage\n\n// Value return json value, implement driver.Valuer interface\nfunc (j dynamicJSON) Value() (driver.Value, error) {\n\tif len(j) == 0 {\n\t\treturn nil, nil\n\t}\n\treturn string(j), nil\n}\n\n// Scan implements the gorm.Serializer Scan method.\nfunc (j *dynamicJSON) Scan(value any) error {\n\tif value == nil {\n\t\t*j = nil\n\t\treturn nil\n\t}\n\tvar bytes []byte\n\tswitch v := value.(type) {\n\tcase []byte:\n\t\tif len(v) == 0 {\n\t\t\t*j = nil\n\t\t\treturn nil\n\t\t}\n\t\tbytes = make([]byte, len(v))\n\t\tcopy(bytes, v)\n\tcase string:\n\t\tif v == \"\" {\n\t\t\t*j = nil\n\t\t\treturn nil\n\t\t}\n\t\tbytes = []byte(v)\n\tdefault:\n\t\treturn errors.New(fmt.Sprint(\"Failed to unmarshal JSONB value:\", value))\n\t}\n\n\tif !json.Valid(bytes) {\n\t\treturn fmt.Errorf(\"invalid JSON received from database: %s\", string(bytes))\n\t}\n\t*j = dynamicJSON(bytes)\n\treturn nil\n}\n\nfunc (j dynamicJSON) String() string {\n\treturn string(j)\n}\n\n// GormDataType defines the generic fallback data type, implements GormDataTypeInterface\nfunc (dynamicJSON) GormDataType() string {\n\treturn \"text\"\n}\n\n// GormDBDataType defines database specific data types, implements GormDBDataTypeInterface\nfunc (dynamicJSON) GormDBDataType(db *gorm.DB, field *schema.Field) string {\n\tswitch db.Dialector.Name() {\n\tcase \"mysql\":\n\t\treturn \"LONGTEXT\"\n\tcase \"postgres\":\n\t\treturn \"JSONB\"\n\tcase \"spanner\":\n\t\treturn \"STRING(MAX)\"\n\t}\n\treturn \"\"\n}\n\nfunc (js dynamicJSON) GormValue(ctx context.Context, db *gorm.DB) clause.Expr {\n\tif len(js) == 0 {\n\t\treturn gorm.Expr(\"NULL\")\n\t}\n\t// TODO log the expression result\n\treturn gorm.Expr(\"?\", string(js))\n}\n"
  },
  {
    "path": "session/database/service.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage database\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"maps\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/google/uuid\"\n\t\"gorm.io/gorm\"\n\n\t\"google.golang.org/adk/session\"\n)\n\n// databaseService is an database implementation of sessionService.Service.\ntype databaseService struct {\n\tdb *gorm.DB\n}\n\n// NewSessionService creates a new [session.Service] implementation that uses a\n// relational database (e.g., PostgreSQL, Spanner, SQLite) via the GORM library.\n//\n// It requires a [gorm.Dialector] to specify the database connection and\n// accepts optional [gorm.Option] values for further GORM configuration.\n//\n// It returns the new [session.Service] or an error if the database connection\n// [gorm.Open] fails.\nfunc NewSessionService(dialector gorm.Dialector, opts ...gorm.Option) (session.Service, error) {\n\tdb, err := gorm.Open(dialector, opts...)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"error creating database session service: %w\", err)\n\t}\n\treturn &databaseService{db: db}, nil\n}\n\n// AutoMigrate runs the GORM auto-migration tool to ensure the database schema\n// matches the internal storage models (e.g., storageSession, storageEvent).\n//\n// NOTE: This function relies on a type assertion to the concrete *databaseService\n// implementation. It will return an error if the provided session.Service is\n// a different implementation.\nfunc AutoMigrate(service session.Service) error {\n\tdbservice, ok := service.(*databaseService)\n\tif !ok {\n\t\treturn fmt.Errorf(\"invalid session service type\")\n\t}\n\terr := dbservice.db.AutoMigrate(&storageSession{}, &storageEvent{}, &storageAppState{}, &storageUserState{})\n\tif err != nil {\n\t\treturn fmt.Errorf(\"auto migrate failed: %w\", err)\n\t}\n\treturn nil\n}\n\n// Create generates a session and inserts it to the db, implements session.Service\nfunc (s *databaseService) Create(ctx context.Context, req *session.CreateRequest) (*session.CreateResponse, error) {\n\tif req.AppName == \"\" || req.UserID == \"\" {\n\t\treturn nil, fmt.Errorf(\"app_name and user_id are required\")\n\t}\n\n\tsessionID := req.SessionID\n\tif sessionID == \"\" {\n\t\tsessionID = uuid.NewString()\n\t}\n\n\tstateMap := req.State\n\tif stateMap == nil {\n\t\tstateMap = make(map[string]any)\n\t}\n\tval := &localSession{\n\t\tappName:   req.AppName,\n\t\tuserID:    req.UserID,\n\t\tsessionID: sessionID,\n\t\tstate:     stateMap,\n\t\tupdatedAt: time.Now(),\n\t}\n\tcreatedSession, err := createStorageSession(val)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\terr = s.db.WithContext(ctx).Transaction(func(tx *gorm.DB) error {\n\t\tstorageApp, err := fetchStorageAppState(tx, req.AppName)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"error on create session: %w\", err)\n\t\t}\n\t\tstorageUser, err := fetchStorageUserState(tx, req.AppName, req.UserID)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"error on create session: %w\", err)\n\t\t}\n\n\t\tappDelta, userDelta, sessionState := extractStateDeltas(req.State)\n\n\t\t// apply state delta\n\t\tif len(appDelta) > 0 {\n\t\t\tmaps.Copy(storageApp.State, appDelta)\n\t\t\tif err := tx.Save(&storageApp).Error; err != nil {\n\t\t\t\treturn fmt.Errorf(\"failed to save app state: %w\", err)\n\t\t\t}\n\t\t}\n\t\tif len(userDelta) > 0 {\n\t\t\tmaps.Copy(storageUser.State, userDelta)\n\t\t\tif err := tx.Save(&storageUser).Error; err != nil {\n\t\t\t\treturn fmt.Errorf(\"failed to save user state: %w\", err)\n\t\t\t}\n\t\t}\n\t\tcreatedSession.State = sessionState\n\n\t\tif err := tx.Create(createdSession).Error; err != nil {\n\t\t\treturn fmt.Errorf(\"error creating session on database: %w\", err)\n\t\t}\n\n\t\tval.state = mergeStates(storageApp.State, storageUser.State, sessionState)\n\t\tval.updatedAt = createdSession.UpdateTime\n\t\treturn nil\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &session.CreateResponse{\n\t\tSession: val,\n\t}, nil\n}\n\n// Get retrieves a single session from the database using its composite primary key.\nfunc (s *databaseService) Get(ctx context.Context, req *session.GetRequest) (*session.GetResponse, error) {\n\t// Ensure all parts of the composite key are provided.\n\tappName, userID, sessionID := req.AppName, req.UserID, req.SessionID\n\tif appName == \"\" || userID == \"\" || sessionID == \"\" {\n\t\treturn nil, fmt.Errorf(\"app_name, user_id, session_id are required, got app_name: %q, user_id: %q, session_id: %q\", appName, userID, sessionID)\n\t}\n\n\tvar foundSession storageSession\n\terr := s.db.WithContext(ctx).\n\t\tWhere(&storageSession{\n\t\t\tAppName: appName,\n\t\t\tUserID:  userID,\n\t\t\tID:      sessionID,\n\t\t}).\n\t\tFirst(&foundSession).Error\n\tif err != nil {\n\t\t// For any error including ErrRecordNotFound, return it as a system error.\n\t\treturn nil, fmt.Errorf(\"database error while fetching session: %w\", err)\n\t}\n\n\t// Fetch events\n\teventQuery := s.db.WithContext(ctx).\n\t\tModel(&storageEvent{}).\n\t\tWhere(\"app_name = ?\", appName).\n\t\tWhere(\"user_id = ?\", userID).\n\t\tWhere(\"session_id = ?\", sessionID)\n\n\t// Apply conditional filters from the request\n\tif !req.After.IsZero() {\n\t\teventQuery = eventQuery.Where(\"timestamp >= ?\", req.After)\n\t}\n\n\t// Order by timestamp DESC to get the most recent events when limiting\n\teventQuery = eventQuery.Order(\"timestamp DESC\")\n\n\tif req.NumRecentEvents > 0 {\n\t\teventQuery = eventQuery.Limit(req.NumRecentEvents)\n\t}\n\n\tvar storageEvents []storageEvent\n\tif err := eventQuery.Find(&storageEvents).Error; err != nil {\n\t\t// This is a system failure, not a \"not found\"\n\t\treturn nil, fmt.Errorf(\"database error while fetching events: %w\", err)\n\t}\n\n\t// fetch app and user states\n\tstorageApp, err := fetchStorageAppState(s.db.WithContext(ctx), appName)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"error on get session: %w\", err)\n\t}\n\tstorageUser, err := fetchStorageUserState(s.db.WithContext(ctx), appName, userID)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"error on get session: %w\", err)\n\t}\n\n\tresponseSession, err := createSessionFromStorageSession(&foundSession)\n\tresponseSession.state = mergeStates(storageApp.State, storageUser.State, responseSession.state)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to map storage object: %w\", err)\n\t}\n\n\t// We fetched in DESC order to get the most recent ones (due to LIMIT).\n\t// Now we reverse them to be in chronological ASC order for the response.\n\t// Convert storage events to response events\n\tresponseEvents := make([]*session.Event, 0, len(storageEvents))\n\tfor i := len(storageEvents) - 1; i >= 0; i-- {\n\t\tevt, err := createEventFromStorageEvent(&storageEvents[i])\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"failed to map storage event: %w\", err)\n\t\t}\n\t\tresponseEvents = append(responseEvents, evt)\n\t}\n\tresponseSession.events = responseEvents\n\n\treturn &session.GetResponse{\n\t\tSession: responseSession,\n\t}, nil\n}\n\n// List retrieves sessions from the database using its appName and optional UserID\nfunc (s *databaseService) List(ctx context.Context, req *session.ListRequest) (*session.ListResponse, error) {\n\tappName, userID := req.AppName, req.UserID\n\tif appName == \"\" {\n\t\treturn nil, fmt.Errorf(\"app_name is required, got app_name: %q\", req.AppName)\n\t}\n\n\tvar foundSessions []storageSession\n\tlistQuery := s.db.WithContext(ctx).\n\t\tWhere(&storageSession{\n\t\t\tAppName: appName,\n\t\t})\n\n\tif userID != \"\" {\n\t\tlistQuery = listQuery.Where(&storageSession{\n\t\t\tUserID: userID,\n\t\t})\n\t}\n\n\terr := listQuery.Find(&foundSessions).Error\n\tif err != nil {\n\t\t// Specifically check if the error is \"record not found\".\n\t\tif errors.Is(err, gorm.ErrRecordNotFound) {\n\t\t\t// This is not a system failure. The record simply doesn't exist.\n\t\t\treturn &session.ListResponse{\n\t\t\t\tSessions: make([]session.Session, 0),\n\t\t\t}, nil\n\t\t}\n\t\t// For any other error (e.g., connection lost), return it as a system error.\n\t\treturn nil, fmt.Errorf(\"database error while fetching session: %w\", err)\n\t}\n\n\tstorageApp, err := fetchStorageAppState(s.db.WithContext(ctx), appName)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"error on list sessions: %w\", err)\n\t}\n\n\tvar userStates map[string]*storageUserState\n\tif userID != \"\" {\n\t\tuserState, err := fetchStorageUserState(s.db.WithContext(ctx), appName, userID)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"error on list sessions: %w\", err)\n\t\t}\n\t\tuserStates = map[string]*storageUserState{userID: userState}\n\t} else {\n\t\tuserStates, err = fetchAllAppStorageUserState(s.db.WithContext(ctx), appName)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"error on list sessions: %w\", err)\n\t\t}\n\t}\n\n\t// Create response sessions, transform the storageSessions into\n\tresponseSessions := make([]session.Session, 0, len(foundSessions))\n\tfor _, storage := range foundSessions {\n\t\ts := storage\n\t\tsess, err := createSessionFromStorageSession(&s)\n\t\tif err != nil {\n\t\t\t// If we encounter a single mapping error, we fail the whole request.\n\t\t\treturn nil, fmt.Errorf(\"failed to map storage object for session %s: %w\", s.ID, err)\n\t\t}\n\n\t\tuserState, ok := userStates[sess.UserID()]\n\t\tif !ok {\n\t\t\tuserState = &storageUserState{AppName: appName, UserID: userID, State: make(map[string]any)}\n\t\t}\n\t\tsess.state = mergeStates(storageApp.State, userState.State, sess.state)\n\t\tresponseSessions = append(responseSessions, sess)\n\t}\n\n\treturn &session.ListResponse{\n\t\tSessions: responseSessions,\n\t}, nil\n}\n\n// Delete, deletes a session given a specific id returning error on failure, implements session.Service\nfunc (s *databaseService) Delete(ctx context.Context, req *session.DeleteRequest) error {\n\tappName, userID, sessionID := req.AppName, req.UserID, req.SessionID\n\tif appName == \"\" || userID == \"\" || sessionID == \"\" {\n\t\treturn fmt.Errorf(\"app_name, user_id, session_id are required, got app_name: %q, user_id: %q, session_id: %q\", appName, userID, sessionID)\n\t}\n\n\treturn s.db.WithContext(ctx).Transaction(func(tx *gorm.DB) error {\n\t\ttarget := &storageSession{}\n\n\t\tresult := tx.Where(&storageSession{\n\t\t\tAppName: req.AppName,\n\t\t\tUserID:  req.UserID,\n\t\t\tID:      req.SessionID,\n\t\t}).Delete(target)\n\n\t\tif result.Error != nil {\n\t\t\treturn fmt.Errorf(\"database error during session deletion: %w\", result.Error)\n\t\t}\n\n\t\treturn nil // Returning nil commits the transaction\n\t})\n}\n\nfunc (s *databaseService) AppendEvent(ctx context.Context, curSession session.Session, event *session.Event) error {\n\tif curSession == nil {\n\t\treturn fmt.Errorf(\"session is nil\")\n\t}\n\tif event == nil {\n\t\treturn fmt.Errorf(\"event is nil\")\n\t}\n\t// ignore partial events\n\tif event.Partial {\n\t\treturn nil\n\t}\n\n\t// Truncate timestamp to microsecond precision to match database precision and prevent rounding errors.\n\tevent.Timestamp = event.Timestamp.Truncate(time.Microsecond)\n\n\tsess, ok := curSession.(*localSession)\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected session type %T\", sess)\n\t}\n\t// append it to session\n\tif err := sess.appendEvent(event); err != nil {\n\t\treturn err\n\t}\n\n\t// Trim temp state before persisting\n\tevent = trimTempDeltaState(event)\n\t// applyChanges and persist them\n\terr := s.applyEvent(ctx, sess, event)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// update local session last update time\n\tsess.updatedAt = event.Timestamp\n\treturn nil\n}\n\n// applyEvent fetches the session, validates it, applies state changes from an\n// event, and saves the event atomically.\nfunc (s *databaseService) applyEvent(ctx context.Context, session *localSession, event *session.Event) error {\n\t// Wrap database operations in a single transaction.\n\terr := s.db.WithContext(ctx).Transaction(func(tx *gorm.DB) error {\n\t\t// Fetch the session object from storage.\n\t\tvar storageSess storageSession\n\t\terr := tx.Where(&storageSession{AppName: session.AppName(), UserID: session.UserID(), ID: session.ID()}).\n\t\t\tFirst(&storageSess).Error\n\t\tif err != nil {\n\t\t\tif errors.Is(err, gorm.ErrRecordNotFound) {\n\t\t\t\treturn fmt.Errorf(\"session not found, cannot apply event\")\n\t\t\t}\n\t\t\treturn fmt.Errorf(\"failed to get session: %w\", err)\n\t\t}\n\n\t\t// Ensure the session object is not stale.\n\t\t// We use UnixMicro() for microsecond-level precision, matching the Python code.\n\t\tstorageUpdateTime := storageSess.UpdateTime.UnixMicro()\n\t\tsessionUpdateTime := session.updatedAt.UnixMicro()\n\t\tif storageUpdateTime > sessionUpdateTime {\n\t\t\treturn fmt.Errorf(\n\t\t\t\t\"stale session error: last update time from request (%s) is older than in database (%s)\",\n\t\t\t\ttime.Unix(0, sessionUpdateTime).Format(time.RFC3339Nano),\n\t\t\t\ttime.Unix(0, storageUpdateTime).Format(time.RFC3339Nano),\n\t\t\t)\n\t\t}\n\n\t\t// Fetch App and User states.\n\t\tstorageApp, err := fetchStorageAppState(tx, session.AppName())\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tstorageUser, err := fetchStorageUserState(tx, session.AppName(), session.UserID())\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tappDelta, userDelta, sessionDelta := extractStateDeltas(event.Actions.StateDelta)\n\n\t\t// Merge state deltas and update the storage objects.\n\t\t// GORM's .Save() method will correctly perform an INSERT or UPDATE.\n\t\tif len(appDelta) > 0 {\n\t\t\tmaps.Copy(storageApp.State, appDelta)\n\t\t\tif err := tx.Save(&storageApp).Error; err != nil {\n\t\t\t\treturn fmt.Errorf(\"failed to save app state: %w\", err)\n\t\t\t}\n\t\t}\n\t\tif len(userDelta) > 0 {\n\t\t\tmaps.Copy(storageUser.State, userDelta)\n\t\t\tif err := tx.Save(&storageUser).Error; err != nil {\n\t\t\t\treturn fmt.Errorf(\"failed to save user state: %w\", err)\n\t\t\t}\n\t\t}\n\t\tif len(sessionDelta) > 0 {\n\t\t\tmaps.Copy(storageSess.State, sessionDelta)\n\t\t\t// The session state update will be saved along with the event timestamp update.\n\t\t}\n\n\t\t// Create the new event record in the database.\n\t\tstorageEv, err := createStorageEvent(session, event)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"failed to map event to storage model: %w\", err)\n\t\t}\n\t\tif err := tx.Create(storageEv).Error; err != nil {\n\t\t\treturn fmt.Errorf(\"failed to save event: %w\", err)\n\t\t}\n\n\t\tstorageSess.UpdateTime = event.Timestamp\n\t\t// Save the session to update its state and UpdateTime.\n\t\tif err := tx.Save(&storageSess).Error; err != nil {\n\t\t\treturn fmt.Errorf(\"failed to save session state: %w\", err)\n\t\t}\n\n\t\tsession.updatedAt = storageSess.UpdateTime\n\n\t\treturn nil // Returning nil commits the transaction.\n\t})\n\n\treturn err\n}\n\nfunc fetchStorageAppState(tx *gorm.DB, appName string) (*storageAppState, error) {\n\tvar storageApp storageAppState\n\tif err := tx.First(&storageApp, \"app_name = ?\", appName).Error; err != nil {\n\t\tif !errors.Is(err, gorm.ErrRecordNotFound) {\n\t\t\treturn nil, fmt.Errorf(\"failed to fetch app state: %w\", err)\n\t\t}\n\t\t// If not found, initialize a new object to be created later.\n\t\tstorageApp = storageAppState{AppName: appName, State: make(map[string]any)}\n\t}\n\treturn &storageApp, nil\n}\n\nfunc fetchStorageUserState(tx *gorm.DB, appName, userID string) (*storageUserState, error) {\n\tvar storageUser storageUserState\n\tif err := tx.First(&storageUser, \"app_name = ? AND user_id = ?\", appName, userID).Error; err != nil {\n\t\tif !errors.Is(err, gorm.ErrRecordNotFound) {\n\t\t\treturn nil, fmt.Errorf(\"failed to fetch user state: %w\", err)\n\t\t}\n\t\t// If not found, initialize a new object.\n\t\tstorageUser = storageUserState{AppName: appName, UserID: userID, State: make(map[string]any)}\n\t}\n\treturn &storageUser, nil\n}\n\nfunc fetchAllAppStorageUserState(tx *gorm.DB, appName string) (map[string]*storageUserState, error) {\n\tvar storageUserStates []storageUserState\n\n\tif err := tx.Find(&storageUserStates, \"app_name = ?\", appName).Error; err != nil {\n\t\tif !errors.Is(err, gorm.ErrRecordNotFound) {\n\t\t\treturn nil, fmt.Errorf(\"failed to fetch user states: %w\", err)\n\t\t}\n\t\treturn make(map[string]*storageUserState), nil\n\t}\n\tstatesByUserId := make(map[string]*storageUserState, len(storageUserStates))\n\tfor _, storageUserState := range storageUserStates {\n\t\tstatesByUserId[storageUserState.UserID] = &storageUserState\n\t}\n\treturn statesByUserId, nil\n}\n\n// extractStateDeltas splits a single state delta map into three separate maps\n// for app, user, and session states based on key prefixes.\n// Temporary keys (starting with TempStatePrefix) are ignored.\nfunc extractStateDeltas(delta map[string]any) (\n\tappStateDelta, userStateDelta, sessionStateDelta map[string]any,\n) {\n\t// Initialize the maps to be returned.\n\tappStateDelta = make(map[string]any)\n\tuserStateDelta = make(map[string]any)\n\tsessionStateDelta = make(map[string]any)\n\n\tif delta == nil {\n\t\treturn appStateDelta, userStateDelta, sessionStateDelta\n\t}\n\n\tfor key, value := range delta {\n\t\tif cleanKey, found := strings.CutPrefix(key, session.KeyPrefixApp); found {\n\t\t\tappStateDelta[cleanKey] = value\n\t\t} else if cleanKey, found := strings.CutPrefix(key, session.KeyPrefixUser); found {\n\t\t\tuserStateDelta[cleanKey] = value\n\t\t} else if !strings.HasPrefix(key, session.KeyPrefixTemp) {\n\t\t\t// This key belongs to the session state, as long as it's not temporary.\n\t\t\tsessionStateDelta[key] = value\n\t\t}\n\t}\n\treturn appStateDelta, userStateDelta, sessionStateDelta\n}\n\n// mergeStates combines app, user, and session state maps into a single map\n// for client-side responses, adding the appropriate prefixes back.\nfunc mergeStates(appState, userState, sessionState map[string]any) map[string]any {\n\t// Pre-allocate map capacity for efficiency.\n\ttotalSize := len(appState) + len(userState) + len(sessionState)\n\tmergedState := make(map[string]any, totalSize)\n\n\t// In Go, we create a new map and copy key-value pairs. This is equivalent\n\t// to the goal of Python's copy.deepcopy() in this context, which is to\n\t// avoid modifying the original sessionState map.\n\tmaps.Copy(mergedState, sessionState)\n\n\tfor key, value := range appState {\n\t\tmergedState[session.KeyPrefixApp+key] = value\n\t}\n\n\tfor key, value := range userState {\n\t\tmergedState[session.KeyPrefixUser+key] = value\n\t}\n\n\treturn mergedState\n}\n"
  },
  {
    "path": "session/database/service_test.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage database\n\nimport (\n\t\"maps\"\n\t\"strconv\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/glebarez/sqlite\"\n\t\"github.com/google/go-cmp/cmp\"\n\t\"github.com/google/go-cmp/cmp/cmpopts\"\n\t\"google.golang.org/genai\"\n\t\"gorm.io/gorm\"\n\n\t\"google.golang.org/adk/model\"\n\t\"google.golang.org/adk/session\"\n)\n\nfunc Test_databaseService_Create(t *testing.T) {\n\ttests := []struct {\n\t\tname    string\n\t\tsetup   func(t *testing.T) *databaseService\n\t\treq     *session.CreateRequest\n\t\twant    session.Session\n\t\twantErr bool\n\t}{\n\t\t{\n\t\t\tname:  \"full key\",\n\t\t\tsetup: emptyService,\n\t\t\treq: &session.CreateRequest{\n\t\t\t\tAppName:   \"testApp\",\n\t\t\t\tUserID:    \"testUserID\",\n\t\t\t\tSessionID: \"testSessionID\",\n\t\t\t\tState: map[string]any{\n\t\t\t\t\t\"k\": 5,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname:  \"generated session id\",\n\t\t\tsetup: emptyService,\n\t\t\treq: &session.CreateRequest{\n\t\t\t\tAppName: \"testApp\",\n\t\t\t\tUserID:  \"testUserID\",\n\t\t\t\tState: map[string]any{\n\t\t\t\t\t\"k\": 5,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname:  \"when already exists, it fails\", // this differs from inmemmory impl\n\t\t\tsetup: serviceDbWithData,\n\t\t\treq: &session.CreateRequest{\n\t\t\t\tAppName:   \"app1\",\n\t\t\t\tUserID:    \"user1\",\n\t\t\t\tSessionID: \"session1\",\n\t\t\t\tState: map[string]any{\n\t\t\t\t\t\"k\": 10,\n\t\t\t\t},\n\t\t\t},\n\t\t\twantErr: true,\n\t\t},\n\t}\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\ts := tt.setup(t)\n\n\t\t\tgot, err := s.Create(t.Context(), tt.req)\n\t\t\tif (err != nil) != tt.wantErr {\n\t\t\t\tt.Fatalf(\"databaseService.Create() error = %v, wantErr %v\", err, tt.wantErr)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif err != nil {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif got.Session.AppName() != tt.req.AppName {\n\t\t\t\tt.Errorf(\"AppName got: %v, want: %v\", got.Session.AppName(), tt.wantErr)\n\t\t\t}\n\n\t\t\tif got.Session.UserID() != tt.req.UserID {\n\t\t\t\tt.Errorf(\"UserID got: %v, want: %v\", got.Session.UserID(), tt.wantErr)\n\t\t\t}\n\n\t\t\tif tt.req.SessionID != \"\" {\n\t\t\t\tif got.Session.ID() != tt.req.SessionID {\n\t\t\t\t\tt.Errorf(\"SessionID got: %v, want: %v\", got.Session.ID(), tt.wantErr)\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif got.Session.ID() == \"\" {\n\t\t\t\t\tt.Errorf(\"SessionID was not generated on empty user input.\")\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tgotState := maps.Collect(got.Session.State().All())\n\t\t\twantState := tt.req.State\n\n\t\t\tif diff := cmp.Diff(wantState, gotState); diff != \"\" {\n\t\t\t\tt.Errorf(\"Create State mismatch: (-want +got):\\n%s\", diff)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc Test_databaseService_Delete(t *testing.T) {\n\ttests := []struct {\n\t\tname    string\n\t\treq     *session.DeleteRequest\n\t\tsetup   func(t *testing.T) *databaseService\n\t\twantErr bool\n\t}{\n\t\t{\n\t\t\tname:  \"delete ok\",\n\t\t\tsetup: serviceDbWithData,\n\t\t\treq: &session.DeleteRequest{\n\t\t\t\tAppName:   \"app1\",\n\t\t\t\tUserID:    \"user1\",\n\t\t\t\tSessionID: \"session1\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname:  \"no error when not found\",\n\t\t\tsetup: serviceDbWithData,\n\t\t\treq: &session.DeleteRequest{\n\t\t\t\tAppName:   \"appTest\",\n\t\t\t\tUserID:    \"user1\",\n\t\t\t\tSessionID: \"session1\",\n\t\t\t},\n\t\t},\n\t}\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\ts := tt.setup(t)\n\t\t\tif err := s.Delete(t.Context(), tt.req); (err != nil) != tt.wantErr {\n\t\t\t\tt.Errorf(\"databaseService.Delete() error = %v, wantErr %v\", err, tt.wantErr)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc Test_databaseService_Get(t *testing.T) {\n\t// This setup function is required for a test case.\n\t// It creates the specific scenario from 'test_get_session_respects_user_id'.\n\tsetupGetRespectsUserID := func(t *testing.T) *databaseService {\n\t\tt.Helper()\n\t\ts := serviceDbWithData(t) // Starts with the standard data\n\n\t\t// u1 creates s1 and adds an event.\n\t\t// 'serviceDbWithData' already created\n\t\t// (app1, user1, session1)\n\t\t// (app1, user2, session1)\n\t\t// We just need to add an event to it.\n\t\tsession1, err := s.Get(t.Context(), &session.GetRequest{\n\t\t\tAppName:   \"app1\",\n\t\t\tUserID:    \"user1\",\n\t\t\tSessionID: \"session1\",\n\t\t})\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"setupGetRespectsUserID failed to get session1: %v\", err)\n\t\t}\n\n\t\t// Update 'updatedAt' to pass stale validation on append\n\t\tsession1.Session.(*localSession).updatedAt = time.Now()\n\n\t\terr = s.AppendEvent(t.Context(), session1.Session.(*localSession), &session.Event{\n\t\t\tID:     \"event_for_user1\",\n\t\t\tAuthor: \"user\",\n\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\tPartial: false,\n\t\t\t},\n\t\t})\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"setupGetRespectsUserID failed to append event: %v\", err)\n\t\t}\n\t\treturn s\n\t}\n\n\tsetupGetWithConfig := func(t *testing.T) *databaseService {\n\t\tt.Helper()\n\t\ts := emptyService(t)\n\t\tctx := t.Context()\n\t\tnumTestEvents := 5\n\t\tcreated, err := s.Create(ctx, &session.CreateRequest{\n\t\t\tAppName:   \"my_app\",\n\t\t\tUserID:    \"user\",\n\t\t\tSessionID: \"s1\",\n\t\t})\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"setupGetWithConfig failed to create session: %v\", err)\n\t\t}\n\n\t\tfor i := 1; i <= numTestEvents; i++ {\n\t\t\tcreated.Session.(*localSession).updatedAt = time.Now()\n\t\t\tevent := &session.Event{\n\t\t\t\tID:          strconv.Itoa(i),\n\t\t\t\tAuthor:      \"user\",\n\t\t\t\tTimestamp:   time.Time{}.Add(time.Duration(i) * time.Microsecond),\n\t\t\t\tLLMResponse: model.LLMResponse{},\n\t\t\t}\n\t\t\tif err := s.AppendEvent(ctx, created.Session.(*localSession), event); err != nil {\n\t\t\t\tt.Fatalf(\"setupGetWithConfig failed to append event %d: %v\", i, err)\n\t\t\t}\n\t\t}\n\t\treturn s\n\t}\n\n\ttests := []struct {\n\t\tname         string\n\t\treq          *session.GetRequest\n\t\tsetup        func(t *testing.T) *databaseService\n\t\twantResponse *session.GetResponse\n\t\twantEvents   []*session.Event\n\t\twantErr      bool\n\t}{\n\t\t{\n\t\t\tname:  \"ok\",\n\t\t\tsetup: serviceDbWithData,\n\t\t\treq: &session.GetRequest{\n\t\t\t\tAppName:   \"app1\",\n\t\t\t\tUserID:    \"user1\",\n\t\t\t\tSessionID: \"session1\",\n\t\t\t},\n\t\t\twantResponse: &session.GetResponse{\n\t\t\t\tSession: &localSession{\n\t\t\t\t\tappName:   \"app1\",\n\t\t\t\t\tuserID:    \"user1\",\n\t\t\t\t\tsessionID: \"session1\",\n\t\t\t\t\tstate: map[string]any{\n\t\t\t\t\t\t\"k1\": \"v1\",\n\t\t\t\t\t},\n\t\t\t\t\tevents: []*session.Event{},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname:  \"error when not found\",\n\t\t\tsetup: serviceDbWithData,\n\t\t\treq: &session.GetRequest{\n\t\t\t\tAppName:   \"testApp\",\n\t\t\t\tUserID:    \"user1\",\n\t\t\t\tSessionID: \"session1\",\n\t\t\t},\n\t\t\twantErr: true,\n\t\t},\n\t\t{\n\t\t\tname:  \"get session respects user id\",\n\t\t\tsetup: setupGetRespectsUserID,\n\t\t\treq: &session.GetRequest{\n\t\t\t\tAppName:   \"app1\",\n\t\t\t\tUserID:    \"user2\",\n\t\t\t\tSessionID: \"session1\",\n\t\t\t},\n\t\t\twantResponse: &session.GetResponse{\n\t\t\t\tSession: &localSession{\n\t\t\t\t\tappName:   \"app1\",\n\t\t\t\t\tuserID:    \"user2\",\n\t\t\t\t\tsessionID: \"session1\",\n\t\t\t\t\t// This is user2's session, which should have its own state\n\t\t\t\t\tstate: map[string]any{\n\t\t\t\t\t\t\"k1\": \"v2\",\n\t\t\t\t\t},\n\t\t\t\t\t// Critically, it should NOT have the event from user1's session\n\t\t\t\t\tevents: []*session.Event{},\n\t\t\t\t},\n\t\t\t},\n\t\t\twantErr: false,\n\t\t},\n\t\t{\n\t\t\tname:  \"with config_no config returns all events\",\n\t\t\tsetup: setupGetWithConfig,\n\t\t\treq: &session.GetRequest{\n\t\t\t\tAppName: \"my_app\", UserID: \"user\", SessionID: \"s1\",\n\t\t\t},\n\t\t\twantEvents: []*session.Event{\n\t\t\t\t{ID: \"1\", Author: \"user\", Timestamp: time.Time{}.Add(1 * time.Microsecond), LLMResponse: model.LLMResponse{}},\n\t\t\t\t{ID: \"2\", Author: \"user\", Timestamp: time.Time{}.Add(2 * time.Microsecond), LLMResponse: model.LLMResponse{}},\n\t\t\t\t{ID: \"3\", Author: \"user\", Timestamp: time.Time{}.Add(3 * time.Microsecond), LLMResponse: model.LLMResponse{}},\n\t\t\t\t{ID: \"4\", Author: \"user\", Timestamp: time.Time{}.Add(4 * time.Microsecond), LLMResponse: model.LLMResponse{}},\n\t\t\t\t{ID: \"5\", Author: \"user\", Timestamp: time.Time{}.Add(5 * time.Microsecond), LLMResponse: model.LLMResponse{}},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname:  \"with config_num recent events\",\n\t\t\tsetup: setupGetWithConfig,\n\t\t\treq: &session.GetRequest{\n\t\t\t\tAppName: \"my_app\", UserID: \"user\", SessionID: \"s1\",\n\t\t\t\tNumRecentEvents: 3,\n\t\t\t},\n\t\t\twantEvents: []*session.Event{\n\t\t\t\t{ID: \"3\", Author: \"user\", Timestamp: time.Time{}.Add(3 * time.Microsecond), LLMResponse: model.LLMResponse{}},\n\t\t\t\t{ID: \"4\", Author: \"user\", Timestamp: time.Time{}.Add(4 * time.Microsecond), LLMResponse: model.LLMResponse{}},\n\t\t\t\t{ID: \"5\", Author: \"user\", Timestamp: time.Time{}.Add(5 * time.Microsecond), LLMResponse: model.LLMResponse{}},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname:  \"with config_after timestamp\",\n\t\t\tsetup: setupGetWithConfig,\n\t\t\treq: &session.GetRequest{\n\t\t\t\tAppName: \"my_app\", UserID: \"user\", SessionID: \"s1\",\n\t\t\t\tAfter: time.Time{}.Add(4 * time.Microsecond),\n\t\t\t},\n\t\t\twantEvents: []*session.Event{\n\t\t\t\t{ID: \"4\", Author: \"user\", Timestamp: time.Time{}.Add(4 * time.Microsecond), LLMResponse: model.LLMResponse{}},\n\t\t\t\t{ID: \"5\", Author: \"user\", Timestamp: time.Time{}.Add(5 * time.Microsecond), LLMResponse: model.LLMResponse{}},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname:  \"with config_combined filters\",\n\t\t\tsetup: setupGetWithConfig,\n\t\t\treq: &session.GetRequest{\n\t\t\t\tAppName: \"my_app\", UserID: \"user\", SessionID: \"s1\",\n\t\t\t\tNumRecentEvents: 3,\n\t\t\t\tAfter:           time.Time{}.Add(4 * time.Microsecond),\n\t\t\t},\n\t\t\twantEvents: []*session.Event{\n\t\t\t\t{ID: \"4\", Author: \"user\", Timestamp: time.Time{}.Add(4 * time.Microsecond), LLMResponse: model.LLMResponse{}},\n\t\t\t\t{ID: \"5\", Author: \"user\", Timestamp: time.Time{}.Add(5 * time.Microsecond), LLMResponse: model.LLMResponse{}},\n\t\t\t},\n\t\t},\n\t}\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\ts := tt.setup(t)\n\n\t\t\tgot, err := s.Get(t.Context(), tt.req)\n\t\t\tif (err != nil) != tt.wantErr {\n\t\t\t\tt.Fatalf(\"databaseService.Get() error = %v, wantErr %v\", err, tt.wantErr)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif err != nil {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif tt.wantResponse != nil {\n\t\t\t\tif diff := cmp.Diff(tt.wantResponse, got,\n\t\t\t\t\tcmp.AllowUnexported(localSession{}),\n\t\t\t\t\tcmpopts.IgnoreFields(localSession{}, \"mu\", \"updatedAt\")); diff != \"\" {\n\t\t\t\t\tt.Errorf(\"Get session mismatch: (-want +got):\\n%s\", diff)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif tt.wantEvents != nil {\n\t\t\t\topts := []cmp.Option{\n\t\t\t\t\tcmpopts.SortSlices(func(a, b *session.Event) bool { return a.Timestamp.Before(b.Timestamp) }),\n\t\t\t\t}\n\t\t\t\tif diff := cmp.Diff(events(tt.wantEvents), got.Session.Events(), opts...); diff != \"\" {\n\t\t\t\t\tt.Errorf(\"Get session events mismatch: (-want +got):\\n%s\", diff)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc Test_databaseService_List(t *testing.T) {\n\ttests := []struct {\n\t\tname         string\n\t\treq          *session.ListRequest\n\t\tsetup        func(t *testing.T) *databaseService\n\t\twantResponse *session.ListResponse\n\t\twantErr      bool\n\t}{\n\t\t{\n\t\t\tname:  \"list for user1\",\n\t\t\tsetup: serviceDbWithData,\n\t\t\treq: &session.ListRequest{\n\t\t\t\tAppName: \"app1\",\n\t\t\t\tUserID:  \"user1\",\n\t\t\t},\n\t\t\twantResponse: &session.ListResponse{\n\t\t\t\tSessions: []session.Session{\n\t\t\t\t\t&localSession{\n\t\t\t\t\t\tappName:   \"app1\",\n\t\t\t\t\t\tuserID:    \"user1\",\n\t\t\t\t\t\tsessionID: \"session1\",\n\t\t\t\t\t\tstate: map[string]any{\n\t\t\t\t\t\t\t\"k1\": \"v1\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t&localSession{\n\t\t\t\t\t\tappName:   \"app1\",\n\t\t\t\t\t\tuserID:    \"user1\",\n\t\t\t\t\t\tsessionID: \"session2\",\n\t\t\t\t\t\tstate: map[string]any{\n\t\t\t\t\t\t\t\"k1\": \"v2\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname:  \"empty list for non-existent user\",\n\t\t\tsetup: serviceDbWithData,\n\t\t\treq: &session.ListRequest{\n\t\t\t\tAppName: \"app1\",\n\t\t\t\tUserID:  \"custom_user\",\n\t\t\t},\n\t\t\twantResponse: &session.ListResponse{\n\t\t\t\tSessions: []session.Session{},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname:  \"list for user2\",\n\t\t\tsetup: serviceDbWithData,\n\t\t\treq: &session.ListRequest{\n\t\t\t\tAppName: \"app1\",\n\t\t\t\tUserID:  \"user2\",\n\t\t\t},\n\t\t\twantResponse: &session.ListResponse{\n\t\t\t\tSessions: []session.Session{\n\t\t\t\t\t&localSession{\n\t\t\t\t\t\tappName:   \"app1\",\n\t\t\t\t\t\tuserID:    \"user2\",\n\t\t\t\t\t\tsessionID: \"session1\",\n\t\t\t\t\t\tstate: map[string]any{\n\t\t\t\t\t\t\t\"k1\": \"v2\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname:  \"list all users for app\",\n\t\t\tsetup: serviceDbWithData,\n\t\t\treq:   &session.ListRequest{AppName: \"app1\", UserID: \"\"},\n\t\t\twantResponse: &session.ListResponse{\n\t\t\t\tSessions: []session.Session{\n\t\t\t\t\t&localSession{appName: \"app1\", userID: \"user1\", sessionID: \"session1\", state: map[string]any{\"k1\": \"v1\"}},\n\t\t\t\t\t&localSession{appName: \"app1\", userID: \"user1\", sessionID: \"session2\", state: map[string]any{\"k1\": \"v2\"}},\n\t\t\t\t\t&localSession{appName: \"app1\", userID: \"user2\", sessionID: \"session1\", state: map[string]any{\"k1\": \"v2\"}},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\ts := tt.setup(t)\n\t\t\tgot, err := s.List(t.Context(), tt.req)\n\t\t\tif (err != nil) != tt.wantErr {\n\t\t\t\tt.Errorf(\"databaseService.List() error = %v, wantErr %v\", err, tt.wantErr)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif err == nil {\n\t\t\t\t// Sort slices for stable comparison\n\t\t\t\topts := []cmp.Option{\n\t\t\t\t\tcmp.AllowUnexported(localSession{}),\n\t\t\t\t\tcmpopts.IgnoreFields(localSession{}, \"mu\", \"updatedAt\"),\n\t\t\t\t\tcmpopts.SortSlices(func(a, b session.Session) bool {\n\t\t\t\t\t\treturn a.ID() < b.ID()\n\t\t\t\t\t}),\n\t\t\t\t}\n\t\t\t\tif diff := cmp.Diff(tt.wantResponse, got, opts...); diff != \"\" {\n\t\t\t\t\tt.Errorf(\"databaseService.List() = %v (-want +got):\\n%s\", got, diff)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc Test_databaseService_AppendEvent(t *testing.T) {\n\ttests := []struct {\n\t\tname              string\n\t\tsetup             func(t *testing.T) *databaseService\n\t\tsession           *localSession\n\t\tevent             *session.Event\n\t\twantStoredSession *localSession // State of the session after Get\n\t\twantEventCount    int           // Expected event count in storage\n\t\twantErr           bool\n\t}{\n\t\t{\n\t\t\tname:  \"append event to the session and overwrite in storage\",\n\t\t\tsetup: serviceDbWithData,\n\t\t\tsession: &localSession{\n\t\t\t\tappName:   \"app1\",\n\t\t\t\tuserID:    \"user1\",\n\t\t\t\tsessionID: \"session1\",\n\t\t\t},\n\t\t\tevent: &session.Event{\n\t\t\t\tID: \"new_event1\",\n\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\tPartial: false,\n\t\t\t\t},\n\t\t\t},\n\t\t\twantStoredSession: &localSession{\n\t\t\t\tappName:   \"app1\",\n\t\t\t\tuserID:    \"user1\",\n\t\t\t\tsessionID: \"session1\",\n\t\t\t\tevents: []*session.Event{\n\t\t\t\t\t{\n\t\t\t\t\t\tID: \"new_event1\",\n\t\t\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\t\t\tPartial: false,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tstate: map[string]any{\n\t\t\t\t\t\"k1\": \"v1\",\n\t\t\t\t},\n\t\t\t},\n\t\t\twantEventCount: 1,\n\t\t},\n\t\t{\n\t\t\tname:  \"append event to the session with events and overwrite in storage\",\n\t\t\tsetup: serviceDbWithData,\n\t\t\tsession: &localSession{\n\t\t\t\tappName:   \"app2\",\n\t\t\t\tuserID:    \"user2\",\n\t\t\t\tsessionID: \"session2\",\n\t\t\t},\n\t\t\tevent: &session.Event{\n\t\t\t\tID: \"new_event1\",\n\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\tPartial: false,\n\t\t\t\t},\n\t\t\t},\n\t\t\twantStoredSession: &localSession{\n\t\t\t\tappName:   \"app2\",\n\t\t\t\tuserID:    \"user2\",\n\t\t\t\tsessionID: \"session2\",\n\t\t\t\tevents: []*session.Event{\n\t\t\t\t\t{\n\t\t\t\t\t\tID: \"existing_event1\",\n\t\t\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\t\t\tPartial: false,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tID: \"new_event1\",\n\t\t\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\t\t\tPartial: false,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tstate: map[string]any{\n\t\t\t\t\t\"k2\": \"v2\",\n\t\t\t\t},\n\t\t\t},\n\t\t\twantEventCount: 2,\n\t\t},\n\t\t{\n\t\t\tname:  \"append event when session not found should fail\",\n\t\t\tsetup: serviceDbWithData,\n\t\t\tsession: &localSession{\n\t\t\t\tappName:   \"app1\",\n\t\t\t\tuserID:    \"user1\",\n\t\t\t\tsessionID: \"custom_session\",\n\t\t\t},\n\t\t\tevent: &session.Event{\n\t\t\t\tID: \"new_event2\",\n\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\tPartial: false,\n\t\t\t\t},\n\t\t\t},\n\t\t\twantErr: true,\n\t\t},\n\t\t{\n\t\t\tname:  \"append event with bytes content\",\n\t\t\tsetup: serviceDbWithData,\n\t\t\tsession: &localSession{\n\t\t\t\tappName:   \"app1\",\n\t\t\t\tuserID:    \"user1\",\n\t\t\t\tsessionID: \"session1\",\n\t\t\t},\n\t\t\tevent: &session.Event{\n\t\t\t\tID:     \"event_with_bytes\",\n\t\t\t\tAuthor: \"user\",\n\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\tContent: genai.NewContentFromBytes([]byte(\"test_image_data\"), \"image/png\", \"user\"),\n\t\t\t\t\tGroundingMetadata: &genai.GroundingMetadata{\n\t\t\t\t\t\tSearchEntryPoint: &genai.SearchEntryPoint{\n\t\t\t\t\t\t\tSDKBlob: []byte(\"test_sdk_blob\"),\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twantStoredSession: &localSession{\n\t\t\t\tappName:   \"app1\",\n\t\t\t\tuserID:    \"user1\",\n\t\t\t\tsessionID: \"session1\",\n\t\t\t\tevents: []*session.Event{\n\t\t\t\t\t{\n\t\t\t\t\t\tID:     \"event_with_bytes\",\n\t\t\t\t\t\tAuthor: \"user\",\n\t\t\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\t\t\tContent: genai.NewContentFromBytes([]byte(\"test_image_data\"), \"image/png\", \"user\"),\n\t\t\t\t\t\t\tGroundingMetadata: &genai.GroundingMetadata{\n\t\t\t\t\t\t\t\tSearchEntryPoint: &genai.SearchEntryPoint{\n\t\t\t\t\t\t\t\t\tSDKBlob: []byte(\"test_sdk_blob\"),\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tstate: map[string]any{\n\t\t\t\t\t\"k1\": \"v1\",\n\t\t\t\t},\n\t\t\t},\n\t\t\twantEventCount: 1,\n\t\t},\n\t\t{\n\t\t\tname:  \"append event with all fields\",\n\t\t\tsetup: serviceDbWithData,\n\t\t\tsession: &localSession{\n\t\t\t\tappName:   \"app1\",\n\t\t\t\tuserID:    \"user1\",\n\t\t\t\tsessionID: \"session1\",\n\t\t\t},\n\t\t\tevent: &session.Event{\n\t\t\t\tID:                 \"event_complete\",\n\t\t\t\tAuthor:             \"user\",\n\t\t\t\tLongRunningToolIDs: []string{\"tool123\"},\n\t\t\t\tActions:            session.EventActions{StateDelta: map[string]any{\"k2\": \"v2\"}},\n\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\tContent:      genai.NewContentFromText(\"test_text\", \"user\"),\n\t\t\t\t\tTurnComplete: true,\n\t\t\t\t\tPartial:      false,\n\t\t\t\t\tErrorCode:    \"error_code\",\n\t\t\t\t\tErrorMessage: \"error_message\",\n\t\t\t\t\tInterrupted:  true,\n\t\t\t\t\tGroundingMetadata: &genai.GroundingMetadata{\n\t\t\t\t\t\tWebSearchQueries: []string{\"query1\"},\n\t\t\t\t\t},\n\t\t\t\t\tUsageMetadata: &genai.GenerateContentResponseUsageMetadata{\n\t\t\t\t\t\tPromptTokenCount:     1,\n\t\t\t\t\t\tCandidatesTokenCount: 1,\n\t\t\t\t\t\tTotalTokenCount:      2,\n\t\t\t\t\t},\n\t\t\t\t\tCitationMetadata: &genai.CitationMetadata{\n\t\t\t\t\t\tCitations: []*genai.Citation{{Title: \"test\", URI: \"google.com\"}},\n\t\t\t\t\t},\n\t\t\t\t\tCustomMetadata: map[string]any{\n\t\t\t\t\t\t\"custom_key\": \"custom_value\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twantStoredSession: &localSession{\n\t\t\t\tappName:   \"app1\",\n\t\t\t\tuserID:    \"user1\",\n\t\t\t\tsessionID: \"session1\",\n\t\t\t\tevents: []*session.Event{\n\t\t\t\t\t{\n\t\t\t\t\t\tID:                 \"event_complete\",\n\t\t\t\t\t\tAuthor:             \"user\",\n\t\t\t\t\t\tLongRunningToolIDs: []string{\"tool123\"},\n\t\t\t\t\t\tActions:            session.EventActions{StateDelta: map[string]any{\"k2\": \"v2\"}},\n\t\t\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\t\t\tContent:      genai.NewContentFromText(\"test_text\", \"user\"),\n\t\t\t\t\t\t\tTurnComplete: true,\n\t\t\t\t\t\t\tPartial:      false,\n\t\t\t\t\t\t\tErrorCode:    \"error_code\",\n\t\t\t\t\t\t\tErrorMessage: \"error_message\",\n\t\t\t\t\t\t\tInterrupted:  true,\n\t\t\t\t\t\t\tGroundingMetadata: &genai.GroundingMetadata{\n\t\t\t\t\t\t\t\tWebSearchQueries: []string{\"query1\"},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tUsageMetadata: &genai.GenerateContentResponseUsageMetadata{\n\t\t\t\t\t\t\t\tPromptTokenCount:     1,\n\t\t\t\t\t\t\t\tCandidatesTokenCount: 1,\n\t\t\t\t\t\t\t\tTotalTokenCount:      2,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tCitationMetadata: &genai.CitationMetadata{\n\t\t\t\t\t\t\t\tCitations: []*genai.Citation{{Title: \"test\", URI: \"google.com\"}},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tCustomMetadata: map[string]any{\n\t\t\t\t\t\t\t\t\"custom_key\": \"custom_value\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tstate: map[string]any{\n\t\t\t\t\t\"k1\": \"v1\",\n\t\t\t\t\t\"k2\": \"v2\",\n\t\t\t\t},\n\t\t\t},\n\t\t\twantEventCount: 1,\n\t\t},\n\t\t{\n\t\t\tname:  \"partial events are not persisted\",\n\t\t\tsetup: serviceDbWithData,\n\t\t\tsession: &localSession{\n\t\t\t\tappName:   \"app1\",\n\t\t\t\tuserID:    \"user1\",\n\t\t\t\tsessionID: \"session1\",\n\t\t\t},\n\t\t\tevent: &session.Event{\n\t\t\t\tID:     \"partial_event\",\n\t\t\t\tAuthor: \"user\",\n\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\tPartial: true, // This is the key field\n\t\t\t\t},\n\t\t\t},\n\t\t\twantStoredSession: &localSession{\n\t\t\t\tappName:   \"app1\",\n\t\t\t\tuserID:    \"user1\",\n\t\t\t\tsessionID: \"session1\",\n\t\t\t\tevents:    []*session.Event{}, // No event should be stored\n\t\t\t\tstate: map[string]any{\n\t\t\t\t\t\"k1\": \"v1\",\n\t\t\t\t},\n\t\t\t},\n\t\t\twantEventCount: 0, // Expect 0 events\n\t\t},\n\t}\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tctx := t.Context()\n\n\t\t\ts := tt.setup(t)\n\n\t\t\ttt.session.updatedAt = time.Now() // set updatedAt value to pass stale validation\n\t\t\terr := s.AppendEvent(ctx, tt.session, tt.event)\n\t\t\tif (err != nil) != tt.wantErr {\n\t\t\t\tt.Errorf(\"databaseService.AppendEvent() error = %v, wantErr %v\", err, tt.wantErr)\n\t\t\t}\n\n\t\t\tif err != nil {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tresp, err := s.Get(ctx, &session.GetRequest{\n\t\t\t\tAppName:   tt.session.AppName(),\n\t\t\t\tUserID:    tt.session.UserID(),\n\t\t\t\tSessionID: tt.session.ID(),\n\t\t\t})\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"databaseService.Get() error = %v, wantErr %v\", err, tt.wantErr)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// Check event count first\n\t\t\tif resp.Session.Events().Len() != tt.wantEventCount {\n\t\t\t\tt.Errorf(\"AppendEvent returned %d events, want %d\", resp.Session.Events().Len(), tt.wantEventCount)\n\t\t\t}\n\n\t\t\t// Define comparison options\n\t\t\topts := []cmp.Option{\n\t\t\t\tcmp.AllowUnexported(localSession{}),\n\t\t\t\tcmpopts.IgnoreFields(localSession{}, \"mu\", \"updatedAt\"),\n\t\t\t\tcmpopts.IgnoreFields(session.Event{}, \"Timestamp\"),\n\t\t\t\t// Add sorters if event order is not guaranteed\n\t\t\t\tcmpopts.SortSlices(func(a, b *session.Event) bool {\n\t\t\t\t\treturn a.ID < b.ID\n\t\t\t\t}),\n\t\t\t}\n\n\t\t\tif diff := cmp.Diff(tt.wantStoredSession, resp.Session, opts...); diff != \"\" {\n\t\t\t\tt.Errorf(\"AppendEvent session mismatch: (-want +got):\\n%s\", diff)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc Test_databaseService_StateManagement(t *testing.T) {\n\tctx := t.Context()\n\tappName := \"my_app\"\n\n\tt.Run(\"app_state_is_shared\", func(t *testing.T) {\n\t\ts := emptyService(t)\n\t\ts1, _ := s.Create(ctx, &session.CreateRequest{AppName: appName, UserID: \"u1\", SessionID: \"s1\", State: map[string]any{\"app:k1\": \"v1\"}})\n\t\ts1.Session.(*localSession).updatedAt = time.Now()\n\t\terr := s.AppendEvent(ctx, s1.Session.(*localSession), &session.Event{\n\t\t\tID:          \"event1\",\n\t\t\tActions:     session.EventActions{StateDelta: map[string]any{\"app:k2\": \"v2\"}},\n\t\t\tLLMResponse: model.LLMResponse{},\n\t\t})\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"Failed to appendEvent: %v\", err)\n\t\t}\n\n\t\ts2, err := s.Create(ctx, &session.CreateRequest{AppName: appName, UserID: \"u2\", SessionID: \"s2\"})\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"Failed to create session for user 2: %v\", err)\n\t\t}\n\n\t\twantState := map[string]any{\"app:k1\": \"v1\", \"app:k2\": \"v2\"}\n\t\tgotState := maps.Collect(s2.Session.State().All())\n\t\tif diff := cmp.Diff(wantState, gotState); diff != \"\" {\n\t\t\tt.Errorf(\"User 2 state mismatch (-want +got):\\n%s\", diff)\n\t\t}\n\t})\n\n\tt.Run(\"user_state_is_user_specific\", func(t *testing.T) {\n\t\ts := emptyService(t)\n\t\ts1, _ := s.Create(ctx, &session.CreateRequest{AppName: appName, UserID: \"u1\", SessionID: \"s1\", State: map[string]any{\"user:k1\": \"v1\"}})\n\t\ts1.Session.(*localSession).updatedAt = time.Now()\n\t\terr := s.AppendEvent(ctx, s1.Session.(*localSession), &session.Event{\n\t\t\tID:          \"event1\",\n\t\t\tActions:     session.EventActions{StateDelta: map[string]any{\"user:k2\": \"v2\"}},\n\t\t\tLLMResponse: model.LLMResponse{},\n\t\t})\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"Failed to appendEvent: %v\", err)\n\t\t}\n\n\t\ts1b, _ := s.Create(ctx, &session.CreateRequest{AppName: appName, UserID: \"u1\", SessionID: \"s1b\"})\n\t\twantStateU1 := map[string]any{\"user:k1\": \"v1\", \"user:k2\": \"v2\"}\n\t\tgotStateU1 := maps.Collect(s1b.Session.State().All())\n\t\tif diff := cmp.Diff(wantStateU1, gotStateU1); diff != \"\" {\n\t\t\tt.Errorf(\"User 1 second session state mismatch (-want +got):\\n%s\", diff)\n\t\t}\n\n\t\ts2, _ := s.Create(ctx, &session.CreateRequest{AppName: appName, UserID: \"u2\", SessionID: \"s2\"})\n\t\tgotStateU2 := maps.Collect(s2.Session.State().All())\n\t\tif len(gotStateU2) != 0 {\n\t\t\tt.Errorf(\"User 2 should have empty state, but got: %v\", gotStateU2)\n\t\t}\n\t})\n\n\tt.Run(\"session_state_is_not_shared\", func(t *testing.T) {\n\t\ts := emptyService(t)\n\t\ts1, _ := s.Create(ctx, &session.CreateRequest{AppName: appName, UserID: \"u1\", SessionID: \"s1\", State: map[string]any{\"sk1\": \"v1\"}})\n\t\ts1.Session.(*localSession).updatedAt = time.Now()\n\t\terr := s.AppendEvent(ctx, s1.Session.(*localSession), &session.Event{\n\t\t\tID:          \"event1\",\n\t\t\tActions:     session.EventActions{StateDelta: map[string]any{\"sk2\": \"v2\"}},\n\t\t\tLLMResponse: model.LLMResponse{},\n\t\t})\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"Failed to appendEvent: %v\", err)\n\t\t}\n\n\t\ts1_got, _ := s.Get(ctx, &session.GetRequest{AppName: appName, UserID: \"u1\", SessionID: \"s1\"})\n\t\twantState := map[string]any{\"sk1\": \"v1\", \"sk2\": \"v2\"}\n\t\tgotState := maps.Collect(s1_got.Session.State().All())\n\t\tif diff := cmp.Diff(wantState, gotState); diff != \"\" {\n\t\t\tt.Errorf(\"Refetched s1 state mismatch (-want +got):\\n%s\", diff)\n\t\t}\n\n\t\ts1b, _ := s.Create(ctx, &session.CreateRequest{AppName: appName, UserID: \"u1\", SessionID: \"s1b\"})\n\t\tgotStateS1b := maps.Collect(s1b.Session.State().All())\n\t\tif len(gotStateS1b) != 0 {\n\t\t\tt.Errorf(\"Session s1b should have empty state, but got: %v\", gotStateS1b)\n\t\t}\n\t})\n\n\tt.Run(\"temp_state_is_not_persisted\", func(t *testing.T) {\n\t\ts := emptyService(t)\n\t\ts1, _ := s.Create(ctx, &session.CreateRequest{AppName: appName, UserID: \"u1\", SessionID: \"s1\"})\n\t\ts1.Session.(*localSession).updatedAt = time.Now()\n\t\tevent := &session.Event{\n\t\t\tID:          \"event1\",\n\t\t\tActions:     session.EventActions{StateDelta: map[string]any{\"temp:k1\": \"v1\", \"sk\": \"v2\"}},\n\t\t\tLLMResponse: model.LLMResponse{},\n\t\t}\n\t\terr := s.AppendEvent(ctx, s1.Session.(*localSession), event)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"Failed to appendEvent: %v\", err)\n\t\t}\n\t\tinvocationSession := s1.Session.(*localSession)\n\t\twantInvocationState := map[string]any{\"sk\": \"v2\", \"temp:k1\": \"v1\"}\n\t\tgotInvocationState := maps.Collect(invocationSession.State().All())\n\t\tif diff := cmp.Diff(wantInvocationState, gotInvocationState); diff != \"\" {\n\t\t\tt.Errorf(\"Invocation session state mismatch (-want +got):\\n%s\", diff)\n\t\t}\n\n\t\ts1_got, _ := s.Get(ctx, &session.GetRequest{AppName: appName, UserID: \"u1\", SessionID: \"s1\"})\n\t\twantState := map[string]any{\"sk\": \"v2\"}\n\t\tgotState := maps.Collect(s1_got.Session.State().All())\n\t\tif diff := cmp.Diff(wantState, gotState); diff != \"\" {\n\t\t\tt.Errorf(\"Persisted state mismatch (-want +got):\\n%s\", diff)\n\t\t}\n\n\t\tstoredEvents := s1_got.Session.Events()\n\t\tif storedEvents.Len() != 1 {\n\t\t\tt.Fatalf(\"Expected 1 stored event, got %d\", storedEvents.Len())\n\t\t}\n\t\tstoredDelta := storedEvents.At(0).Actions.StateDelta\n\t\tif _, exists := storedDelta[\"temp:k1\"]; exists {\n\t\t\tt.Errorf(\"temp:k1 key was found in the stored event's state delta\")\n\t\t}\n\t\tif storedDelta[\"sk\"] != \"v2\" {\n\t\t\tt.Errorf(\"Expected 'sk' key in stored event, but was missing or wrong value\")\n\t\t}\n\t})\n}\n\nfunc serviceDbWithData(t *testing.T) *databaseService {\n\tt.Helper()\n\n\tservice := emptyService(t)\n\n\tfor _, storedSession := range []*localSession{\n\t\t{\n\t\t\tappName:   \"app1\",\n\t\t\tuserID:    \"user1\",\n\t\t\tsessionID: \"session1\",\n\t\t\tstate: map[string]any{\n\t\t\t\t\"k1\": \"v1\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tappName:   \"app1\",\n\t\t\tuserID:    \"user2\",\n\t\t\tsessionID: \"session1\",\n\t\t\tstate: map[string]any{\n\t\t\t\t\"k1\": \"v2\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tappName:   \"app1\",\n\t\t\tuserID:    \"user1\",\n\t\t\tsessionID: \"session2\",\n\t\t\tstate: map[string]any{\n\t\t\t\t\"k1\": \"v2\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tappName:   \"app2\",\n\t\t\tuserID:    \"user2\",\n\t\t\tsessionID: \"session2\",\n\t\t\tstate: map[string]any{\n\t\t\t\t\"k2\": \"v2\",\n\t\t\t},\n\t\t\tevents: []*session.Event{\n\t\t\t\t{\n\t\t\t\t\tID: \"existing_event1\",\n\t\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\t\tPartial: false,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t} {\n\t\t// TODO: Consider changing to SQL insert\n\t\tresp, err := service.Create(t.Context(), &session.CreateRequest{\n\t\t\tAppName:   storedSession.appName,\n\t\t\tUserID:    storedSession.userID,\n\t\t\tSessionID: storedSession.sessionID,\n\t\t\tState:     storedSession.state,\n\t\t})\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"Failed to create sample sessions on db initialization: %v\", err)\n\t\t}\n\n\t\tfor _, ev := range storedSession.events {\n\t\t\terr = service.AppendEvent(t.Context(), resp.Session, ev)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"Failed to append event to session on db initialization: %v\", err)\n\t\t\t}\n\t\t}\n\t}\n\n\treturn service\n}\n\nfunc emptyService(t *testing.T) *databaseService {\n\tt.Helper()\n\tgormConfig := &gorm.Config{\n\t\tPrepareStmt: true,\n\t}\n\n\tservice, err := NewSessionService(sqlite.Open(\"file::memory:?cache=shared\"), gormConfig)\n\tif err != nil {\n\t\tt.Fatalf(\"Failed to create session service: %v\", err)\n\t}\n\tdbservice, ok := service.(*databaseService)\n\tif !ok {\n\t\tt.Fatalf(\"invalid session service type\")\n\t}\n\n\terr = AutoMigrate(service)\n\tif err != nil {\n\t\tt.Fatalf(\"Failed to AutoMigrate db: %v\", err)\n\t}\n\n\tt.Cleanup(func() {\n\t\tt.Log(\"CLEANUP: Deleting all rows from tables...\")\n\n\t\t// Define models in Child-to-Parent order\n\t\tmodelsToDelete := []any{\n\t\t\t&storageEvent{}, // Child-most\n\t\t\t&storageSession{},\n\t\t\t&storageUserState{},\n\t\t\t&storageAppState{}, // Parent-most\n\t\t}\n\n\t\tfor _, model := range modelsToDelete {\n\t\t\t// GORM statement parser to get table names\n\t\t\tstmt := &gorm.Statement{DB: dbservice.db}\n\t\t\t// Parse the model to get its table name\n\t\t\tif err := stmt.Parse(model); err != nil {\n\t\t\t\tt.Errorf(\"Failed to parse model schema for cleanup: %v\", err)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\ttableName := stmt.Table\n\n\t\t\t// Exec with \"WHERE true\" instead of gorm.Delete()\n\t\t\t// satisfies Spanner's requirement for a WHERE clause.\n\t\t\tif err := dbservice.db.Exec(`DELETE FROM ` + tableName + ` WHERE true`).Error; err != nil {\n\t\t\t\tt.Errorf(\"Failed to delete from table %s: %v\", tableName, err)\n\t\t\t}\n\t\t}\n\t\tsqlDB, err := dbservice.db.DB()\n\t\tif err != nil {\n\t\t\tt.Errorf(\"Failed to get underlying *sql.DB: %v\", err)\n\t\t\treturn\n\t\t}\n\t\tif err := sqlDB.Close(); err != nil {\n\t\t\tt.Errorf(\"Failed to close database connection: %v\", err)\n\t\t}\n\t})\n\n\treturn dbservice\n}\n"
  },
  {
    "path": "session/database/session.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage database\n\nimport (\n\t\"fmt\"\n\t\"iter\"\n\t\"maps\"\n\t\"strings\"\n\t\"sync\"\n\t\"time\"\n\n\t\"google.golang.org/adk/session\"\n)\n\n// TODO localSession is identical to session.session. Move to sessioninternal\ntype localSession struct {\n\tappName   string\n\tuserID    string\n\tsessionID string\n\n\t// guards all mutable fields\n\tmu        sync.RWMutex\n\tevents    []*session.Event\n\tstate     map[string]any\n\tupdatedAt time.Time\n}\n\nfunc (s *localSession) ID() string {\n\treturn s.sessionID\n}\n\nfunc (s *localSession) AppName() string {\n\treturn s.appName\n}\n\nfunc (s *localSession) UserID() string {\n\treturn s.userID\n}\n\nfunc (s *localSession) State() session.State {\n\treturn &state{\n\t\tmu:    &s.mu,\n\t\tstate: s.state,\n\t}\n}\n\nfunc (s *localSession) Events() session.Events {\n\treturn events(s.events)\n}\n\nfunc (s *localSession) LastUpdateTime() time.Time {\n\ts.mu.RLock()\n\tdefer s.mu.RUnlock()\n\n\treturn s.updatedAt\n}\n\nfunc (s *localSession) appendEvent(event *session.Event) error {\n\tif event.Partial {\n\t\treturn nil\n\t}\n\n\ts.mu.Lock()\n\tdefer s.mu.Unlock()\n\n\tif err := updateSessionState(s, event); err != nil {\n\t\treturn fmt.Errorf(\"failed to update localSession state: %w\", err)\n\t}\n\n\tprocessedEvent := trimTempDeltaState(event)\n\ts.events = append(s.events, processedEvent)\n\treturn nil\n}\n\ntype events []*session.Event\n\nfunc (e events) All() iter.Seq[*session.Event] {\n\treturn func(yield func(*session.Event) bool) {\n\t\tfor _, event := range e {\n\t\t\tif !yield(event) {\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc (e events) Len() int {\n\treturn len(e)\n}\n\nfunc (e events) At(i int) *session.Event {\n\tif i >= 0 && i < len(e) {\n\t\treturn e[i]\n\t}\n\treturn nil\n}\n\ntype state struct {\n\tmu    *sync.RWMutex\n\tstate map[string]any\n}\n\nfunc (s *state) Get(key string) (any, error) {\n\ts.mu.RLock()\n\tdefer s.mu.RUnlock()\n\n\tval, ok := s.state[key]\n\tif !ok {\n\t\treturn nil, session.ErrStateKeyNotExist\n\t}\n\n\treturn val, nil\n}\n\nfunc (s *state) All() iter.Seq2[string, any] {\n\ts.mu.RLock()\n\t// Create a copy of the state to iterate over it without holding the lock.\n\tstateCopy := maps.Clone(s.state)\n\ts.mu.RUnlock()\n\n\treturn func(yield func(key string, val any) bool) {\n\t\tfor k, v := range stateCopy {\n\t\t\tif !yield(k, v) {\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc (s *state) Set(key string, value any) error {\n\ts.mu.Lock()\n\tdefer s.mu.Unlock()\n\n\ts.state[key] = value\n\treturn nil\n}\n\n// TrimTempDeltaState removes temporary state delta keys from the event.\nfunc trimTempDeltaState(event *session.Event) *session.Event {\n\tif len(event.Actions.StateDelta) == 0 {\n\t\treturn event\n\t}\n\n\t// Iterate over the map and build a new one with the keys we want to keep.\n\tfilteredStateDelta := make(map[string]any)\n\tfor key, value := range event.Actions.StateDelta {\n\t\tif !strings.HasPrefix(key, session.KeyPrefixTemp) {\n\t\t\tfilteredStateDelta[key] = value\n\t\t}\n\t}\n\n\t// Replace the old map with the newly filtered one.\n\tevent.Actions.StateDelta = filteredStateDelta\n\n\treturn event\n}\n\n// updateSessionState updates the session state based on the event state delta.\nfunc updateSessionState(sess *localSession, event *session.Event) error {\n\tif event.Actions.StateDelta == nil {\n\t\treturn nil // Nothing to do\n\t}\n\n\t// Ensure the session state map is initialized\n\tif sess.state == nil {\n\t\tsess.state = make(map[string]any)\n\t}\n\n\tmaps.Copy(sess.state, event.Actions.StateDelta)\n\n\treturn nil\n}\n\nvar (\n\t_ session.Session = (*localSession)(nil)\n\t_ session.Events  = (*events)(nil)\n\t_ session.State   = (*state)(nil)\n)\n"
  },
  {
    "path": "session/database/storage_session.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage database\n\nimport (\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"time\"\n\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/model\"\n\t\"google.golang.org/adk/session\"\n)\n\n// storageSession corresponds to the 'sessions' table.\ntype storageSession struct {\n\tAppName    string `gorm:\"primaryKey;\"`\n\tUserID     string `gorm:\"primaryKey;\"`\n\tID         string `gorm:\"primaryKey;\"`\n\tState      stateMap\n\tCreateTime time.Time `gorm:\"precision:6\"`\n\tUpdateTime time.Time `gorm:\"precision:6\"`\n\n\t// Has-Many relationship: A session has many events.\n\tEvents []storageEvent `gorm:\"foreignKey:AppName,UserID,SessionID;references:AppName,UserID,ID;constraint:OnDelete:CASCADE\"`\n}\n\n// TableName explicitly sets the table name for the storageSession struct.\nfunc (storageSession) TableName() string {\n\treturn \"sessions\"\n}\n\n// Helper to map from internal struct to GORM struct\nfunc createStorageSession(s *localSession) (*storageSession, error) {\n\treturn &storageSession{\n\t\tUserID:     s.userID,\n\t\tAppName:    s.appName,\n\t\tID:         s.sessionID,\n\t\tState:      s.state,\n\t\tCreateTime: time.Now(),\n\t\tUpdateTime: time.Now(),\n\t}, nil\n}\n\n// Helper to map from GORM struct to internal struct\nfunc createSessionFromStorageSession(storage *storageSession) (*localSession, error) {\n\treturn &localSession{\n\t\tappName:   storage.AppName,\n\t\tuserID:    storage.UserID,\n\t\tsessionID: storage.ID,\n\t\tstate:     storage.State,\n\t\tupdatedAt: storage.UpdateTime,\n\t}, nil\n}\n\n// storageEvent corresponds to the 'events' table.\ntype storageEvent struct {\n\tID        string `gorm:\"primaryKey;\"`\n\tAppName   string `gorm:\"primaryKey;\"`\n\tUserID    string `gorm:\"primaryKey;\"`\n\tSessionID string `gorm:\"primaryKey;\"`\n\n\tInvocationID string\n\tAuthor       string\n\t// In Python, this is a pickled object. In Go, the raw bytes are the closest\n\t// equivalent. Unpickling would require a custom library or service.\n\tActions                []byte\n\tLongRunningToolIDsJSON dynamicJSON\n\tBranch                 *string\n\tTimestamp              time.Time `gorm:\"precision:6\"`\n\n\t// Fields from llm_response\n\tContent           dynamicJSON\n\tGroundingMetadata dynamicJSON\n\tCustomMetadata    dynamicJSON\n\tUsageMetadata     dynamicJSON\n\tCitationMetadata  dynamicJSON\n\n\tPartial      *bool\n\tTurnComplete *bool\n\tErrorCode    *string\n\tErrorMessage *string\n\tInterrupted  *bool\n\n\t// Belongs-To relationship: An event belongs to a session.\n\tSession storageSession `gorm:\"foreignKey:AppName,UserID,SessionID;references:AppName,UserID,ID\"`\n}\n\n// TableName explicitly sets the table name for the storageEvent struct.\nfunc (storageEvent) TableName() string {\n\treturn \"events\"\n}\n\n// createStorageEvent translates the application-level Session and Event models\n// into a GORM-compatible storageEvent struct, ready for database insertion.\nfunc createStorageEvent(session session.Session, event *session.Event) (*storageEvent, error) {\n\t// Initialize the base storageEvent with direct field mappings.\n\tstorageEv := &storageEvent{\n\t\tID:           event.ID,\n\t\tInvocationID: event.InvocationID,\n\t\tAuthor:       event.Author,\n\t\tSessionID:    session.ID(),\n\t\tAppName:      session.AppName(),\n\t\tUserID:       session.UserID(),\n\t\tTimestamp:    event.Timestamp,\n\t}\n\n\t// --- Handle complex or nullable fields ---\n\t// Serialize the entire Actions struct into a JSON byte slice.\n\tactionsJSON, err := json.Marshal(event.Actions)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to marshal event actions: %w\", err)\n\t}\n\tstorageEv.Actions = actionsJSON\n\n\t// Serialize the list of tool IDs into a JSON string\n\tif len(event.LongRunningToolIDs) > 0 {\n\t\ttoolIDsJSON, err := json.Marshal(event.LongRunningToolIDs)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"failed to marshal long running tool IDs: %w\", err)\n\t\t}\n\t\tstorageEv.LongRunningToolIDsJSON = toolIDsJSON\n\t}\n\n\t// Handle optional fields by taking the address of the value.\n\t// An empty string from the event becomes a nil pointer in storage.\n\tif event.Branch != \"\" {\n\t\tstorageEv.Branch = &event.Branch\n\t}\n\tif event.ErrorCode != \"\" {\n\t\tstorageEv.ErrorCode = &event.ErrorCode\n\t}\n\tif event.ErrorMessage != \"\" {\n\t\tstorageEv.ErrorMessage = &event.ErrorMessage\n\t}\n\n\t// For booleans, we can assign pointers directly.\n\tstorageEv.Partial = &event.Partial\n\tstorageEv.TurnComplete = &event.TurnComplete\n\tstorageEv.Interrupted = &event.Interrupted\n\n\t// --- Handle JSON content fields ---\n\tif event.Content != nil {\n\t\tstorageEv.Content, err = json.Marshal(event.Content)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"failed to marshal content: %w\", err)\n\t\t}\n\t}\n\tif event.GroundingMetadata != nil {\n\t\tstorageEv.GroundingMetadata, err = json.Marshal(event.GroundingMetadata)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"failed to marshal grounding metadata: %w\", err)\n\t\t}\n\t}\n\tif len(event.CustomMetadata) > 0 {\n\t\tstorageEv.CustomMetadata, err = json.Marshal(event.CustomMetadata)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"failed to marshal custom metadata: %w\", err)\n\t\t}\n\t}\n\tif event.UsageMetadata != nil {\n\t\tstorageEv.UsageMetadata, err = json.Marshal(event.UsageMetadata)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"failed to marshal usage metadata: %w\", err)\n\t\t}\n\t}\n\tif event.CitationMetadata != nil {\n\t\tstorageEv.CitationMetadata, err = json.Marshal(event.CitationMetadata)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"failed to marshal citation metadata: %w\", err)\n\t\t}\n\t}\n\n\treturn storageEv, nil\n}\n\n// derefOrZero safely dereferences a pointer, returning the zero value\n// of its type if the pointer is nil.\nfunc derefOrZero[T any](p *T) T {\n\tif p == nil {\n\t\tvar zero T\n\t\treturn zero\n\t}\n\treturn *p\n}\n\n// createEventFromStorageEvent translates a GORM storageEvent back into an\n// application-level Event model.\nfunc createEventFromStorageEvent(se *storageEvent) (*session.Event, error) {\n\tvar actions session.EventActions\n\tif len(se.Actions) > 0 {\n\t\tif err := json.Unmarshal(se.Actions, &actions); err != nil {\n\t\t\treturn nil, fmt.Errorf(\"failed to unmarshal actions: %w\", err)\n\t\t}\n\t}\n\n\tvar content *genai.Content\n\tif len(se.Content) > 0 {\n\t\tif err := json.Unmarshal(se.Content, &content); err != nil {\n\t\t\treturn nil, fmt.Errorf(\"failed to unmarshal content: %w\", err)\n\t\t}\n\t}\n\n\tvar groundingMetadata *genai.GroundingMetadata\n\tif len(se.GroundingMetadata) > 0 {\n\t\tif err := json.Unmarshal(se.GroundingMetadata, &groundingMetadata); err != nil {\n\t\t\treturn nil, fmt.Errorf(\"failed to unmarshal grounding metadata: %w\", err)\n\t\t}\n\t}\n\n\tvar customMetadata map[string]any\n\tif len(se.CustomMetadata) > 0 {\n\t\tif err := json.Unmarshal(se.CustomMetadata, &customMetadata); err != nil {\n\t\t\treturn nil, fmt.Errorf(\"failed to unmarshal custom metadata: %w\", err)\n\t\t}\n\t}\n\n\tvar usageMetadata *genai.GenerateContentResponseUsageMetadata\n\tif len(se.UsageMetadata) > 0 {\n\t\tif err := json.Unmarshal(se.UsageMetadata, &usageMetadata); err != nil {\n\t\t\treturn nil, fmt.Errorf(\"failed to unmarshal usage metadata: %w\", err)\n\t\t}\n\t}\n\n\tvar citationMetadata *genai.CitationMetadata\n\tif len(se.CitationMetadata) > 0 {\n\t\tif err := json.Unmarshal(se.CitationMetadata, &citationMetadata); err != nil {\n\t\t\treturn nil, fmt.Errorf(\"failed to unmarshal citation metadata: %w\", err)\n\t\t}\n\t}\n\n\t// --- Handle JSON-encoded *string field ---\n\tvar toolIDs []string\n\tif se.LongRunningToolIDsJSON != nil {\n\t\tif err := json.Unmarshal([]byte(se.LongRunningToolIDsJSON), &toolIDs); err != nil {\n\t\t\treturn nil, fmt.Errorf(\"failed to unmarshal long running tool IDs: %w\", err)\n\t\t}\n\t}\n\n\t// --- Handle simple pointer fields (dereference or use zero value) ---\n\t// Use the helper to safely get the value or its zero-value default\n\tbranch := derefOrZero(se.Branch)\n\terrorCode := derefOrZero(se.ErrorCode)\n\terrorMessage := derefOrZero(se.ErrorMessage)\n\tpartial := derefOrZero(se.Partial)\n\tturnComplete := derefOrZero(se.TurnComplete)\n\tinterrupted := derefOrZero(se.Interrupted)\n\n\t// --- Assemble the final Event struct ---\n\tevent := &session.Event{\n\t\tID:                 se.ID,\n\t\tInvocationID:       se.InvocationID,\n\t\tAuthor:             se.Author,\n\t\tTimestamp:          se.Timestamp,\n\t\tActions:            actions,\n\t\tLongRunningToolIDs: toolIDs,\n\t\tBranch:             branch,\n\t\tLLMResponse: model.LLMResponse{\n\t\t\tContent:           content,\n\t\t\tGroundingMetadata: groundingMetadata,\n\t\t\tCustomMetadata:    customMetadata,\n\t\t\tUsageMetadata:     usageMetadata,\n\t\t\tCitationMetadata:  citationMetadata,\n\t\t\tErrorCode:         errorCode,\n\t\t\tErrorMessage:      errorMessage,\n\t\t\tPartial:           partial,\n\t\t\tTurnComplete:      turnComplete,\n\t\t\tInterrupted:       interrupted,\n\t\t},\n\t}\n\n\treturn event, nil\n}\n\n// AppState corresponds to the 'app_states' table.\ntype storageAppState struct {\n\tAppName    string `gorm:\"primaryKey;\"`\n\tState      stateMap\n\tUpdateTime time.Time `gorm:\"precision:6\"`\n}\n\n// TableName explicitly sets the table name for the AppState struct.\nfunc (storageAppState) TableName() string {\n\treturn \"app_states\"\n}\n\n// UserState corresponds to the 'user_states' table.\ntype storageUserState struct {\n\tAppName    string `gorm:\"primaryKey;\"`\n\tUserID     string `gorm:\"primaryKey;\"`\n\tState      stateMap\n\tUpdateTime time.Time `gorm:\"precision:6\"`\n}\n\n// TableName explicitly sets the table name for the UserState struct.\nfunc (storageUserState) TableName() string {\n\treturn \"user_states\"\n}\n"
  },
  {
    "path": "session/doc.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Package session provides types to manage user sessions and their states.\npackage session\n"
  },
  {
    "path": "session/inmemory.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage session\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"iter\"\n\t\"maps\"\n\t\"slices\"\n\t\"sort\"\n\t\"strings\"\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/google/uuid\"\n\t\"rsc.io/omap\"\n\t\"rsc.io/ordered\"\n\n\t\"google.golang.org/adk/internal/sessionutils\"\n)\n\ntype stateMap map[string]any\n\n// inMemoryService is an in-memory implementation of sessionService.Service.\n// Thread-safe.\ntype inMemoryService struct {\n\tmu        sync.RWMutex\n\tsessions  omap.Map[string, *session] // session.ID) -> storedSession\n\tuserState map[string]map[string]stateMap\n\tappState  map[string]stateMap\n}\n\nfunc (s *inMemoryService) Create(ctx context.Context, req *CreateRequest) (*CreateResponse, error) {\n\tif req.AppName == \"\" || req.UserID == \"\" {\n\t\treturn nil, fmt.Errorf(\"app_name and user_id are required, got app_name: %q, user_id: %q\", req.AppName, req.UserID)\n\t}\n\n\tsessionID := req.SessionID\n\tif sessionID == \"\" {\n\t\tsessionID = uuid.NewString()\n\t}\n\n\tkey := id{\n\t\tappName:   req.AppName,\n\t\tuserID:    req.UserID,\n\t\tsessionID: sessionID,\n\t}\n\n\tencodedKey := key.Encode()\n\ts.mu.Lock()\n\tdefer s.mu.Unlock()\n\n\tif _, ok := s.sessions.Get(encodedKey); ok {\n\t\treturn nil, fmt.Errorf(\"session %s already exists\", req.SessionID)\n\t}\n\n\tstate := req.State\n\tif state == nil {\n\t\tstate = make(stateMap)\n\t}\n\tval := &session{\n\t\tid:        key,\n\t\tstate:     state,\n\t\tupdatedAt: time.Now(),\n\t}\n\n\ts.sessions.Set(encodedKey, val)\n\tappDelta, userDelta, _ := sessionutils.ExtractStateDeltas(req.State)\n\tappState := s.updateAppState(appDelta, req.AppName)\n\tuserState := s.updateUserState(userDelta, req.AppName, req.UserID)\n\tval.state = sessionutils.MergeStates(appState, userState, state)\n\n\tcopiedSession := copySessionWithoutStateAndEvents(val)\n\tcopiedSession.state = maps.Clone(val.state)\n\tcopiedSession.events = slices.Clone(val.events)\n\n\treturn &CreateResponse{\n\t\tSession: copiedSession,\n\t}, nil\n}\n\nfunc (s *inMemoryService) Get(ctx context.Context, req *GetRequest) (*GetResponse, error) {\n\tappName, userID, sessionID := req.AppName, req.UserID, req.SessionID\n\tif appName == \"\" || userID == \"\" || sessionID == \"\" {\n\t\treturn nil, fmt.Errorf(\"app_name, user_id, session_id are required, got app_name: %q, user_id: %q, session_id: %q\", appName, userID, sessionID)\n\t}\n\n\ts.mu.RLock()\n\tdefer s.mu.RUnlock()\n\n\tid := id{\n\t\tappName:   appName,\n\t\tuserID:    userID,\n\t\tsessionID: sessionID,\n\t}\n\n\tres, ok := s.sessions.Get(id.Encode())\n\tif !ok {\n\t\treturn nil, fmt.Errorf(\"session %+v not found\", req.SessionID)\n\t}\n\n\tcopiedSession := copySessionWithoutStateAndEvents(res)\n\tcopiedSession.state = s.mergeStates(res.state, appName, userID)\n\n\tfilteredEvents := res.events\n\tif req.NumRecentEvents > 0 {\n\t\tstart := max(len(filteredEvents)-req.NumRecentEvents, 0)\n\t\t// create a new slice header pointing to the same array\n\t\tfilteredEvents = filteredEvents[start:]\n\t}\n\t// apply timestamp filter, assuming list is sorted\n\tif !req.After.IsZero() && len(filteredEvents) > 0 {\n\t\tfirstIndexToKeep := sort.Search(len(filteredEvents), func(i int) bool {\n\t\t\t// Find the first event that is not before the timestamp\n\t\t\treturn !filteredEvents[i].Timestamp.Before(req.After)\n\t\t})\n\t\tfilteredEvents = filteredEvents[firstIndexToKeep:]\n\t}\n\n\tcopiedSession.events = make([]*Event, 0, len(filteredEvents))\n\tcopiedSession.events = append(copiedSession.events, filteredEvents...)\n\n\treturn &GetResponse{\n\t\tSession: copiedSession,\n\t}, nil\n}\n\nfunc (s *inMemoryService) List(ctx context.Context, req *ListRequest) (*ListResponse, error) {\n\tappName, userID := req.AppName, req.UserID\n\tif appName == \"\" {\n\t\treturn nil, fmt.Errorf(\"app_name is required, got app_name: %q\", appName)\n\t}\n\n\ts.mu.RLock()\n\tdefer s.mu.RUnlock()\n\n\tlo := id{appName: appName, userID: userID}.Encode()\n\n\tvar hi string\n\tif userID == \"\" {\n\t\thi = id{appName: appName + \"\\x00\"}.Encode()\n\t} else {\n\t\thi = id{appName: appName, userID: userID + \"\\x00\"}.Encode()\n\t}\n\n\tsessions := make([]Session, 0)\n\tfor k, storedSession := range s.sessions.Scan(lo, hi) {\n\t\tvar key id\n\t\tif err := key.Decode(k); err != nil {\n\t\t\treturn nil, fmt.Errorf(\"failed to decode key: %w\", err)\n\t\t}\n\n\t\tif key.appName != appName && key.userID != userID {\n\t\t\tbreak\n\t\t}\n\t\tcopiedSession := copySessionWithoutStateAndEvents(storedSession)\n\t\tcopiedSession.state = s.mergeStates(storedSession.state, appName, storedSession.UserID())\n\t\tsessions = append(sessions, copiedSession)\n\t}\n\treturn &ListResponse{\n\t\tSessions: sessions,\n\t}, nil\n}\n\nfunc (s *inMemoryService) Delete(ctx context.Context, req *DeleteRequest) error {\n\tappName, userID, sessionID := req.AppName, req.UserID, req.SessionID\n\tif appName == \"\" || userID == \"\" || sessionID == \"\" {\n\t\treturn fmt.Errorf(\"app_name, user_id, session_id are required, got app_name: %q, user_id: %q, session_id: %q\", appName, userID, sessionID)\n\t}\n\n\ts.mu.Lock()\n\tdefer s.mu.Unlock()\n\n\tid := id{\n\t\tappName:   appName,\n\t\tuserID:    userID,\n\t\tsessionID: sessionID,\n\t}\n\n\ts.sessions.Delete(id.Encode())\n\treturn nil\n}\n\nfunc (s *inMemoryService) AppendEvent(ctx context.Context, curSession Session, event *Event) error {\n\tif curSession == nil {\n\t\treturn fmt.Errorf(\"session is nil\")\n\t}\n\tif event == nil {\n\t\treturn fmt.Errorf(\"event is nil\")\n\t}\n\tif event.Partial {\n\t\treturn nil\n\t}\n\n\tsess, ok := curSession.(*session)\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected session type %T for session ID %s\", curSession, curSession.ID())\n\t}\n\n\ts.mu.Lock()\n\tdefer s.mu.Unlock()\n\n\tstored_session, ok := s.sessions.Get(sess.id.Encode())\n\tif !ok {\n\t\treturn fmt.Errorf(\"session not found, cannot apply event\")\n\t}\n\n\t// update the in-memory session\n\tif err := sess.appendEvent(event); err != nil {\n\t\treturn fmt.Errorf(\"fail to set state on appendEvent: %w\", err)\n\t}\n\n\teventCopy := &Event{\n\t\tID:           event.ID,\n\t\tInvocationID: event.InvocationID,\n\t\tTimestamp:    event.Timestamp,\n\t\tAuthor:       event.Author,\n\t\tBranch:       event.Branch,\n\t\tActions: EventActions{\n\t\t\tStateDelta:                 maps.Clone(event.Actions.StateDelta),\n\t\t\tArtifactDelta:              maps.Clone(event.Actions.ArtifactDelta),\n\t\t\tRequestedToolConfirmations: maps.Clone(event.Actions.RequestedToolConfirmations),\n\t\t\tTransferToAgent:            event.Actions.TransferToAgent,\n\t\t\tEscalate:                   event.Actions.Escalate,\n\t\t\tSkipSummarization:          event.Actions.SkipSummarization,\n\t\t},\n\t\tLongRunningToolIDs: slices.Clone(event.LongRunningToolIDs),\n\t\tLLMResponse:        event.LLMResponse,\n\t}\n\n\t// update the in-memory session service\n\tstored_session.events = append(stored_session.events, eventCopy)\n\tstored_session.updatedAt = event.Timestamp\n\tif len(event.Actions.StateDelta) > 0 {\n\t\tappDelta, userDelta, sessionDelta := sessionutils.ExtractStateDeltas(event.Actions.StateDelta)\n\t\ts.updateAppState(appDelta, curSession.AppName())\n\t\ts.updateUserState(userDelta, curSession.AppName(), curSession.UserID())\n\t\tmaps.Copy(stored_session.state, sessionDelta)\n\t}\n\treturn nil\n}\n\nfunc (s *inMemoryService) updateAppState(appDelta stateMap, appName string) stateMap {\n\tinnerMap, ok := s.appState[appName]\n\tif !ok {\n\t\tinnerMap = make(stateMap)\n\t\ts.appState[appName] = innerMap\n\t}\n\tmaps.Copy(innerMap, appDelta)\n\treturn innerMap\n}\n\nfunc (s *inMemoryService) updateUserState(userDelta stateMap, appName, userID string) stateMap {\n\tinnerUsersMap, ok := s.userState[appName]\n\tif !ok {\n\t\tinnerUsersMap = make(map[string]stateMap)\n\t\ts.userState[appName] = innerUsersMap\n\t}\n\tinnerMap, ok := innerUsersMap[userID]\n\tif !ok {\n\t\tinnerMap = make(stateMap)\n\t\tinnerUsersMap[userID] = innerMap\n\t}\n\tmaps.Copy(innerMap, userDelta)\n\treturn innerMap\n}\n\nfunc (s *inMemoryService) mergeStates(state stateMap, appName, userID string) stateMap {\n\tappState := s.appState[appName]\n\tvar userState stateMap\n\tuserStateMap, ok := s.userState[appName]\n\tif ok {\n\t\tuserState = userStateMap[userID]\n\t}\n\treturn sessionutils.MergeStates(appState, userState, state)\n}\n\nfunc (id id) Encode() string {\n\treturn string(ordered.Encode(id.appName, id.userID, id.sessionID))\n}\n\nfunc (id *id) Decode(key string) error {\n\treturn ordered.Decode([]byte(key), &id.appName, &id.userID, &id.sessionID)\n}\n\ntype id struct {\n\tappName   string\n\tuserID    string\n\tsessionID string\n}\n\ntype session struct {\n\tid id\n\n\t// guards all mutable fields\n\tmu        sync.RWMutex\n\tevents    []*Event\n\tstate     map[string]any\n\tupdatedAt time.Time\n}\n\nfunc (s *session) ID() string {\n\treturn s.id.sessionID\n}\n\nfunc (s *session) AppName() string {\n\treturn s.id.appName\n}\n\nfunc (s *session) UserID() string {\n\treturn s.id.userID\n}\n\nfunc (s *session) State() State {\n\treturn &state{\n\t\tmu:    &s.mu,\n\t\tstate: s.state,\n\t}\n}\n\nfunc (s *session) Events() Events {\n\ts.mu.RLock()\n\tdefer s.mu.RUnlock()\n\treturn events(s.events)\n}\n\nfunc (s *session) LastUpdateTime() time.Time {\n\ts.mu.RLock()\n\tdefer s.mu.RUnlock()\n\n\treturn s.updatedAt\n}\n\nfunc (s *session) appendEvent(event *Event) error {\n\tif event.Partial {\n\t\treturn nil\n\t}\n\n\ts.mu.Lock()\n\tdefer s.mu.Unlock()\n\n\tif err := updateSessionState(s, event); err != nil {\n\t\treturn fmt.Errorf(\"error on appendEvent: %w\", err)\n\t}\n\tprocessedEvent := trimTempDeltaState(event)\n\n\ts.events = append(s.events, processedEvent)\n\ts.updatedAt = event.Timestamp\n\treturn nil\n}\n\ntype events []*Event\n\nfunc (e events) All() iter.Seq[*Event] {\n\treturn func(yield func(*Event) bool) {\n\t\tfor _, event := range e {\n\t\t\tif !yield(event) {\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc (e events) Len() int {\n\treturn len(e)\n}\n\nfunc (e events) At(i int) *Event {\n\tif i >= 0 && i < len(e) {\n\t\treturn e[i]\n\t}\n\treturn nil\n}\n\ntype state struct {\n\tmu    *sync.RWMutex\n\tstate map[string]any\n}\n\nfunc (s *state) Get(key string) (any, error) {\n\ts.mu.RLock()\n\tdefer s.mu.RUnlock()\n\n\tval, ok := s.state[key]\n\tif !ok {\n\t\treturn nil, ErrStateKeyNotExist\n\t}\n\n\treturn val, nil\n}\n\nfunc (s *state) All() iter.Seq2[string, any] {\n\ts.mu.RLock()\n\t// Create a copy of the state to iterate over it without holding the lock.\n\tstateCopy := maps.Clone(s.state)\n\ts.mu.RUnlock()\n\n\treturn func(yield func(key string, val any) bool) {\n\t\tfor k, v := range stateCopy {\n\t\t\tif !yield(k, v) {\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc (s *state) Set(key string, value any) error {\n\ts.mu.Lock()\n\tdefer s.mu.Unlock()\n\n\ts.state[key] = value\n\treturn nil\n}\n\n// trimTempDeltaState removes temporary state delta keys from the event.\nfunc trimTempDeltaState(event *Event) *Event {\n\tif len(event.Actions.StateDelta) == 0 {\n\t\treturn event\n\t}\n\n\t// Iterate over the map and build a new one with the keys we want to keep.\n\tfilteredStateDelta := make(map[string]any)\n\tfor key, value := range event.Actions.StateDelta {\n\t\tif !strings.HasPrefix(key, KeyPrefixTemp) {\n\t\t\tfilteredStateDelta[key] = value\n\t\t}\n\t}\n\n\t// Replace the old map with the newly filtered one.\n\tevent.Actions.StateDelta = filteredStateDelta\n\n\treturn event\n}\n\n// updateSessionState updates the session state based on the event state delta.\nfunc updateSessionState(session *session, event *Event) error {\n\tif event.Actions.StateDelta == nil {\n\t\treturn nil // Nothing to do\n\t}\n\n\t// ensure the session state map is initialized\n\tif session.state == nil {\n\t\tsession.state = make(map[string]any)\n\t}\n\n\tmaps.Copy(session.state, event.Actions.StateDelta)\n\treturn nil\n}\n\nfunc copySessionWithoutStateAndEvents(sess *session) *session {\n\treturn &session{\n\t\tid: id{\n\t\t\tappName:   sess.id.appName,\n\t\t\tuserID:    sess.id.userID,\n\t\t\tsessionID: sess.id.sessionID,\n\t\t},\n\t\tupdatedAt: sess.updatedAt,\n\t}\n}\n\nvar _ Service = (*inMemoryService)(nil)\n"
  },
  {
    "path": "session/inmemory_test.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage session\n\nimport (\n\t\"maps\"\n\t\"strconv\"\n\t\"strings\"\n\t\"sync\"\n\t\"sync/atomic\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/google/go-cmp/cmp\"\n\t\"github.com/google/go-cmp/cmp/cmpopts\"\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/model\"\n)\n\nfunc Test_databaseService_Create(t *testing.T) {\n\ttests := []struct {\n\t\tname    string\n\t\tsetup   func(t *testing.T) Service\n\t\treq     *CreateRequest\n\t\twant    Session\n\t\twantErr bool\n\t}{\n\t\t{\n\t\t\tname:  \"full key\",\n\t\t\tsetup: emptyService,\n\t\t\treq: &CreateRequest{\n\t\t\t\tAppName:   \"testApp\",\n\t\t\t\tUserID:    \"testUserID\",\n\t\t\t\tSessionID: \"testSessionID\",\n\t\t\t\tState: map[string]any{\n\t\t\t\t\t\"k\": 5,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname:  \"generated session id\",\n\t\t\tsetup: emptyService,\n\t\t\treq: &CreateRequest{\n\t\t\t\tAppName: \"testApp\",\n\t\t\t\tUserID:  \"testUserID\",\n\t\t\t\tState: map[string]any{\n\t\t\t\t\t\"k\": 5,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname:  \"when already exists, it fails\",\n\t\t\tsetup: serviceDbWithData,\n\t\t\treq: &CreateRequest{\n\t\t\t\tAppName:   \"app1\",\n\t\t\t\tUserID:    \"user1\",\n\t\t\t\tSessionID: \"session1\",\n\t\t\t\tState: map[string]any{\n\t\t\t\t\t\"k\": 10,\n\t\t\t\t},\n\t\t\t},\n\t\t\twantErr: true,\n\t\t},\n\t}\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\ts := tt.setup(t)\n\n\t\t\tgot, err := s.Create(t.Context(), tt.req)\n\t\t\tif (err != nil) != tt.wantErr {\n\t\t\t\tt.Fatalf(\"databaseService.Create() error = %v, wantErr %v\", err, tt.wantErr)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif err != nil {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif got.Session.AppName() != tt.req.AppName {\n\t\t\t\tt.Errorf(\"AppName got: %v, want: %v\", got.Session.AppName(), tt.wantErr)\n\t\t\t}\n\n\t\t\tif got.Session.UserID() != tt.req.UserID {\n\t\t\t\tt.Errorf(\"UserID got: %v, want: %v\", got.Session.UserID(), tt.wantErr)\n\t\t\t}\n\n\t\t\tif tt.req.SessionID != \"\" {\n\t\t\t\tif got.Session.ID() != tt.req.SessionID {\n\t\t\t\t\tt.Errorf(\"SessionID got: %v, want: %v\", got.Session.ID(), tt.wantErr)\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif got.Session.ID() == \"\" {\n\t\t\t\t\tt.Errorf(\"SessionID was not generated on empty user input.\")\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tgotState := maps.Collect(got.Session.State().All())\n\t\t\twantState := tt.req.State\n\n\t\t\tif diff := cmp.Diff(wantState, gotState); diff != \"\" {\n\t\t\t\tt.Errorf(\"Create State mismatch: (-want +got):\\n%s\", diff)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc Test_databaseService_Delete(t *testing.T) {\n\ttests := []struct {\n\t\tname    string\n\t\treq     *DeleteRequest\n\t\tsetup   func(t *testing.T) Service\n\t\twantErr bool\n\t}{\n\t\t{\n\t\t\tname:  \"delete ok\",\n\t\t\tsetup: serviceDbWithData,\n\t\t\treq: &DeleteRequest{\n\t\t\t\tAppName:   \"app1\",\n\t\t\t\tUserID:    \"user1\",\n\t\t\t\tSessionID: \"session1\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname:  \"no error when not found\",\n\t\t\tsetup: serviceDbWithData,\n\t\t\treq: &DeleteRequest{\n\t\t\t\tAppName:   \"appTest\",\n\t\t\t\tUserID:    \"user1\",\n\t\t\t\tSessionID: \"session1\",\n\t\t\t},\n\t\t},\n\t}\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\ts := tt.setup(t)\n\t\t\tif err := s.Delete(t.Context(), tt.req); (err != nil) != tt.wantErr {\n\t\t\t\tt.Errorf(\"databaseService.Delete() error = %v, wantErr %v\", err, tt.wantErr)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc Test_databaseService_Get(t *testing.T) {\n\t// This setup function is required for a test case.\n\t// It creates the specific scenario from 'test_get_session_respects_user_id'.\n\tsetupGetRespectsUserID := func(t *testing.T) Service {\n\t\tt.Helper()\n\t\ts := serviceDbWithData(t) // Starts with the standard data\n\n\t\t// u1 creates s1 and adds an event.\n\t\t// 'serviceDbWithData' already created\n\t\t// (app1, user1, session1)\n\t\t// (app1, user2, session1)\n\t\t// We just need to add an event to it.\n\t\tsession1, err := s.Get(t.Context(), &GetRequest{\n\t\t\tAppName:   \"app1\",\n\t\t\tUserID:    \"user1\",\n\t\t\tSessionID: \"session1\",\n\t\t})\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"setupGetRespectsUserID failed to get session1: %v\", err)\n\t\t}\n\n\t\t// Update 'updatedAt' to pass stale validation on append\n\t\tsession1.Session.(*session).updatedAt = time.Now()\n\n\t\terr = s.AppendEvent(t.Context(), session1.Session.(*session), &Event{\n\t\t\tID:     \"event_for_user1\",\n\t\t\tAuthor: \"user\",\n\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\tPartial: false,\n\t\t\t},\n\t\t})\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"setupGetRespectsUserID failed to append event: %v\", err)\n\t\t}\n\t\treturn s\n\t}\n\n\tsetupGetWithConfig := func(t *testing.T) Service {\n\t\tt.Helper()\n\t\ts := emptyService(t)\n\t\tctx := t.Context()\n\t\tnumTestEvents := 5\n\t\tcreated, err := s.Create(ctx, &CreateRequest{\n\t\t\tAppName:   \"my_app\",\n\t\t\tUserID:    \"user\",\n\t\t\tSessionID: \"s1\",\n\t\t})\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"setupGetWithConfig failed to create session: %v\", err)\n\t\t}\n\n\t\tfor i := 1; i <= numTestEvents; i++ {\n\t\t\tcreated.Session.(*session).updatedAt = time.Now()\n\t\t\tevent := &Event{\n\t\t\t\tID:          strconv.Itoa(i),\n\t\t\t\tAuthor:      \"user\",\n\t\t\t\tTimestamp:   time.Time{}.Add(time.Duration(i)),\n\t\t\t\tLLMResponse: model.LLMResponse{},\n\t\t\t}\n\t\t\tif err := s.AppendEvent(ctx, created.Session.(*session), event); err != nil {\n\t\t\t\tt.Fatalf(\"setupGetWithConfig failed to append event %d: %v\", i, err)\n\t\t\t}\n\t\t}\n\t\treturn s\n\t}\n\n\ttests := []struct {\n\t\tname         string\n\t\treq          *GetRequest\n\t\tsetup        func(t *testing.T) Service\n\t\twantResponse *GetResponse\n\t\twantEvents   []*Event\n\t\twantErr      bool\n\t}{\n\t\t{\n\t\t\tname:  \"ok\",\n\t\t\tsetup: serviceDbWithData,\n\t\t\treq: &GetRequest{\n\t\t\t\tAppName:   \"app1\",\n\t\t\t\tUserID:    \"user1\",\n\t\t\t\tSessionID: \"session1\",\n\t\t\t},\n\t\t\twantResponse: &GetResponse{\n\t\t\t\tSession: &session{\n\t\t\t\t\tid: id{\n\t\t\t\t\t\tappName:   \"app1\",\n\t\t\t\t\t\tuserID:    \"user1\",\n\t\t\t\t\t\tsessionID: \"session1\",\n\t\t\t\t\t},\n\t\t\t\t\tstate: map[string]any{\n\t\t\t\t\t\t\"k1\": \"v1\",\n\t\t\t\t\t},\n\t\t\t\t\tevents: []*Event{},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname:  \"error when not found\",\n\t\t\tsetup: serviceDbWithData,\n\t\t\treq: &GetRequest{\n\t\t\t\tAppName:   \"testApp\",\n\t\t\t\tUserID:    \"user1\",\n\t\t\t\tSessionID: \"session1\",\n\t\t\t},\n\t\t\twantErr: true,\n\t\t},\n\t\t{\n\t\t\tname:  \"get session respects user id\",\n\t\t\tsetup: setupGetRespectsUserID,\n\t\t\treq: &GetRequest{\n\t\t\t\tAppName:   \"app1\",\n\t\t\t\tUserID:    \"user2\",\n\t\t\t\tSessionID: \"session1\",\n\t\t\t},\n\t\t\twantResponse: &GetResponse{\n\t\t\t\tSession: &session{\n\t\t\t\t\tid: id{\n\t\t\t\t\t\tappName:   \"app1\",\n\t\t\t\t\t\tuserID:    \"user2\",\n\t\t\t\t\t\tsessionID: \"session1\",\n\t\t\t\t\t},\n\t\t\t\t\t// This is user2's session, which should have its own state\n\t\t\t\t\tstate: map[string]any{\n\t\t\t\t\t\t\"k1\": \"v2\",\n\t\t\t\t\t},\n\t\t\t\t\t// Critically, it should NOT have the event from user1's session\n\t\t\t\t\tevents: []*Event{},\n\t\t\t\t},\n\t\t\t},\n\t\t\twantErr: false,\n\t\t},\n\t\t{\n\t\t\tname:  \"with config_no config returns all events\",\n\t\t\tsetup: setupGetWithConfig,\n\t\t\treq: &GetRequest{\n\t\t\t\tAppName: \"my_app\", UserID: \"user\", SessionID: \"s1\",\n\t\t\t},\n\t\t\twantEvents: []*Event{\n\t\t\t\t{ID: \"1\", Author: \"user\", Timestamp: time.Time{}.Add(1), LLMResponse: model.LLMResponse{}},\n\t\t\t\t{ID: \"2\", Author: \"user\", Timestamp: time.Time{}.Add(2), LLMResponse: model.LLMResponse{}},\n\t\t\t\t{ID: \"3\", Author: \"user\", Timestamp: time.Time{}.Add(3), LLMResponse: model.LLMResponse{}},\n\t\t\t\t{ID: \"4\", Author: \"user\", Timestamp: time.Time{}.Add(4), LLMResponse: model.LLMResponse{}},\n\t\t\t\t{ID: \"5\", Author: \"user\", Timestamp: time.Time{}.Add(5), LLMResponse: model.LLMResponse{}},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname:  \"with config_num recent events\",\n\t\t\tsetup: setupGetWithConfig,\n\t\t\treq: &GetRequest{\n\t\t\t\tAppName: \"my_app\", UserID: \"user\", SessionID: \"s1\",\n\t\t\t\tNumRecentEvents: 3,\n\t\t\t},\n\t\t\twantEvents: []*Event{\n\t\t\t\t{ID: \"3\", Author: \"user\", Timestamp: time.Time{}.Add(3), LLMResponse: model.LLMResponse{}},\n\t\t\t\t{ID: \"4\", Author: \"user\", Timestamp: time.Time{}.Add(4), LLMResponse: model.LLMResponse{}},\n\t\t\t\t{ID: \"5\", Author: \"user\", Timestamp: time.Time{}.Add(5), LLMResponse: model.LLMResponse{}},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname:  \"with config_after timestamp\",\n\t\t\tsetup: setupGetWithConfig,\n\t\t\treq: &GetRequest{\n\t\t\t\tAppName: \"my_app\", UserID: \"user\", SessionID: \"s1\",\n\t\t\t\tAfter: time.Time{}.Add(4),\n\t\t\t},\n\t\t\twantEvents: []*Event{\n\t\t\t\t{ID: \"4\", Author: \"user\", Timestamp: time.Time{}.Add(4), LLMResponse: model.LLMResponse{}},\n\t\t\t\t{ID: \"5\", Author: \"user\", Timestamp: time.Time{}.Add(5), LLMResponse: model.LLMResponse{}},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname:  \"with config_combined filters\",\n\t\t\tsetup: setupGetWithConfig,\n\t\t\treq: &GetRequest{\n\t\t\t\tAppName: \"my_app\", UserID: \"user\", SessionID: \"s1\",\n\t\t\t\tNumRecentEvents: 3,\n\t\t\t\tAfter:           time.Time{}.Add(4),\n\t\t\t},\n\t\t\twantEvents: []*Event{\n\t\t\t\t{ID: \"4\", Author: \"user\", Timestamp: time.Time{}.Add(4), LLMResponse: model.LLMResponse{}},\n\t\t\t\t{ID: \"5\", Author: \"user\", Timestamp: time.Time{}.Add(5), LLMResponse: model.LLMResponse{}},\n\t\t\t},\n\t\t},\n\t}\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\ts := tt.setup(t)\n\n\t\t\tgot, err := s.Get(t.Context(), tt.req)\n\t\t\tif (err != nil) != tt.wantErr {\n\t\t\t\tt.Fatalf(\"databaseService.Get() error = %v, wantErr %v\", err, tt.wantErr)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif err != nil {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif tt.wantResponse != nil {\n\t\t\t\tif diff := cmp.Diff(tt.wantResponse, got,\n\t\t\t\t\tcmp.AllowUnexported(session{}),\n\t\t\t\t\tcmp.AllowUnexported(id{}),\n\t\t\t\t\tcmpopts.IgnoreFields(session{}, \"mu\", \"updatedAt\")); diff != \"\" {\n\t\t\t\t\tt.Errorf(\"Get session mismatch: (-want +got):\\n%s\", diff)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif tt.wantEvents != nil {\n\t\t\t\topts := []cmp.Option{\n\t\t\t\t\tcmpopts.SortSlices(func(a, b *Event) bool { return a.Timestamp.Before(b.Timestamp) }),\n\t\t\t\t}\n\t\t\t\tif diff := cmp.Diff(events(tt.wantEvents), got.Session.Events(), opts...); diff != \"\" {\n\t\t\t\t\tt.Errorf(\"Get session events mismatch: (-want +got):\\n%s\", diff)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc Test_databaseService_List(t *testing.T) {\n\ttests := []struct {\n\t\tname         string\n\t\treq          *ListRequest\n\t\tsetup        func(t *testing.T) Service\n\t\twantResponse *ListResponse\n\t\twantErr      bool\n\t}{\n\t\t{\n\t\t\tname:  \"list for user1\",\n\t\t\tsetup: serviceDbWithData,\n\t\t\treq: &ListRequest{\n\t\t\t\tAppName: \"app1\",\n\t\t\t\tUserID:  \"user1\",\n\t\t\t},\n\t\t\twantResponse: &ListResponse{\n\t\t\t\tSessions: []Session{\n\t\t\t\t\t&session{\n\t\t\t\t\t\tid: id{\n\t\t\t\t\t\t\tappName:   \"app1\",\n\t\t\t\t\t\t\tuserID:    \"user1\",\n\t\t\t\t\t\t\tsessionID: \"session1\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\tstate: map[string]any{\n\t\t\t\t\t\t\t\"k1\": \"v1\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t&session{\n\t\t\t\t\t\tid: id{\n\t\t\t\t\t\t\tappName:   \"app1\",\n\t\t\t\t\t\t\tuserID:    \"user1\",\n\t\t\t\t\t\t\tsessionID: \"session2\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\tstate: map[string]any{\n\t\t\t\t\t\t\t\"k1\": \"v2\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname:  \"empty list for non-existent user\",\n\t\t\tsetup: serviceDbWithData,\n\t\t\treq: &ListRequest{\n\t\t\t\tAppName: \"app1\",\n\t\t\t\tUserID:  \"custom_user\",\n\t\t\t},\n\t\t\twantResponse: &ListResponse{\n\t\t\t\tSessions: []Session{},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname:  \"list for user2\",\n\t\t\tsetup: serviceDbWithData,\n\t\t\treq: &ListRequest{\n\t\t\t\tAppName: \"app1\",\n\t\t\t\tUserID:  \"user2\",\n\t\t\t},\n\t\t\twantResponse: &ListResponse{\n\t\t\t\tSessions: []Session{\n\t\t\t\t\t&session{\n\t\t\t\t\t\tid: id{\n\t\t\t\t\t\t\tappName:   \"app1\",\n\t\t\t\t\t\t\tuserID:    \"user2\",\n\t\t\t\t\t\t\tsessionID: \"session1\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\tstate: map[string]any{\n\t\t\t\t\t\t\t\"k1\": \"v2\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname:  \"list all users for app\",\n\t\t\tsetup: serviceDbWithData,\n\t\t\treq:   &ListRequest{AppName: \"app1\", UserID: \"\"},\n\t\t\twantResponse: &ListResponse{\n\t\t\t\tSessions: []Session{\n\t\t\t\t\t&session{\n\t\t\t\t\t\tid: id{\n\t\t\t\t\t\t\tappName:   \"app1\",\n\t\t\t\t\t\t\tuserID:    \"user1\",\n\t\t\t\t\t\t\tsessionID: \"session1\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\tstate: map[string]any{\"k1\": \"v1\"},\n\t\t\t\t\t},\n\t\t\t\t\t&session{\n\t\t\t\t\t\tid: id{\n\t\t\t\t\t\t\tappName:   \"app1\",\n\t\t\t\t\t\t\tuserID:    \"user1\",\n\t\t\t\t\t\t\tsessionID: \"session2\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\tstate: map[string]any{\"k1\": \"v2\"},\n\t\t\t\t\t},\n\t\t\t\t\t&session{\n\t\t\t\t\t\tid: id{\n\t\t\t\t\t\t\tappName:   \"app1\",\n\t\t\t\t\t\t\tuserID:    \"user2\",\n\t\t\t\t\t\t\tsessionID: \"session1\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\tstate: map[string]any{\"k1\": \"v2\"},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\ts := tt.setup(t)\n\t\t\tgot, err := s.List(t.Context(), tt.req)\n\t\t\tif (err != nil) != tt.wantErr {\n\t\t\t\tt.Errorf(\"databaseService.List() error = %v, wantErr %v\", err, tt.wantErr)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif err == nil {\n\t\t\t\t// Sort slices for stable comparison\n\t\t\t\topts := []cmp.Option{\n\t\t\t\t\tcmp.AllowUnexported(session{}),\n\t\t\t\t\tcmp.AllowUnexported(id{}),\n\t\t\t\t\tcmpopts.IgnoreFields(session{}, \"mu\", \"updatedAt\"),\n\t\t\t\t\tcmpopts.SortSlices(func(a, b Session) bool {\n\t\t\t\t\t\treturn a.ID() < b.ID()\n\t\t\t\t\t}),\n\t\t\t\t}\n\t\t\t\tif diff := cmp.Diff(tt.wantResponse, got, opts...); diff != \"\" {\n\t\t\t\t\tt.Errorf(\"databaseService.List() = %v (-want +got):\\n%s\", got, diff)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc Test_databaseService_AppendEvent(t *testing.T) {\n\ttests := []struct {\n\t\tname              string\n\t\tsetup             func(t *testing.T) Service\n\t\tsession           *session\n\t\tevent             *Event\n\t\twantStoredSession *session // State of the session after Get\n\t\twantEventCount    int      // Expected event count in storage\n\t\twantErr           bool\n\t}{\n\t\t{\n\t\t\tname:  \"append event to the session and overwrite in storage\",\n\t\t\tsetup: serviceDbWithData,\n\t\t\tsession: &session{\n\t\t\t\tid: id{\n\t\t\t\t\tappName:   \"app1\",\n\t\t\t\t\tuserID:    \"user1\",\n\t\t\t\t\tsessionID: \"session1\",\n\t\t\t\t},\n\t\t\t\tstate: map[string]any{\n\t\t\t\t\t\"k1\": \"v1\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tevent: &Event{\n\t\t\t\tID: \"new_event1\",\n\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\tPartial: false,\n\t\t\t\t},\n\t\t\t},\n\t\t\twantStoredSession: &session{\n\t\t\t\tid: id{\n\t\t\t\t\tappName:   \"app1\",\n\t\t\t\t\tuserID:    \"user1\",\n\t\t\t\t\tsessionID: \"session1\",\n\t\t\t\t},\n\t\t\t\tevents: []*Event{\n\t\t\t\t\t{\n\t\t\t\t\t\tID: \"new_event1\",\n\t\t\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\t\t\tPartial: false,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tstate: map[string]any{\n\t\t\t\t\t\"k1\": \"v1\",\n\t\t\t\t},\n\t\t\t},\n\t\t\twantEventCount: 1,\n\t\t},\n\t\t{\n\t\t\tname:  \"append event to the session with events and overwrite in storage\",\n\t\t\tsetup: serviceDbWithData,\n\t\t\tsession: &session{\n\t\t\t\tid: id{\n\t\t\t\t\tappName:   \"app2\",\n\t\t\t\t\tuserID:    \"user2\",\n\t\t\t\t\tsessionID: \"session2\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tevent: &Event{\n\t\t\t\tID: \"new_event1\",\n\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\tPartial: false,\n\t\t\t\t},\n\t\t\t},\n\t\t\twantStoredSession: &session{\n\t\t\t\tid: id{\n\t\t\t\t\tappName:   \"app2\",\n\t\t\t\t\tuserID:    \"user2\",\n\t\t\t\t\tsessionID: \"session2\",\n\t\t\t\t},\n\t\t\t\tevents: []*Event{\n\t\t\t\t\t{\n\t\t\t\t\t\tID: \"existing_event1\",\n\t\t\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\t\t\tPartial: false,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tID: \"new_event1\",\n\t\t\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\t\t\tPartial: false,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tstate: map[string]any{\n\t\t\t\t\t\"k2\": \"v2\",\n\t\t\t\t},\n\t\t\t},\n\t\t\twantEventCount: 2,\n\t\t},\n\t\t{\n\t\t\tname:  \"append event when session not found should fail\",\n\t\t\tsetup: serviceDbWithData,\n\t\t\tsession: &session{\n\t\t\t\tid: id{\n\t\t\t\t\tappName:   \"app1\",\n\t\t\t\t\tuserID:    \"user1\",\n\t\t\t\t\tsessionID: \"custom_session\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tevent: &Event{\n\t\t\t\tID: \"new_event2\",\n\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\tPartial: false,\n\t\t\t\t},\n\t\t\t},\n\t\t\twantErr: true,\n\t\t},\n\t\t{\n\t\t\tname:  \"append event with bytes content\",\n\t\t\tsetup: serviceDbWithData,\n\t\t\tsession: &session{\n\t\t\t\tid: id{\n\t\t\t\t\tappName:   \"app1\",\n\t\t\t\t\tuserID:    \"user1\",\n\t\t\t\t\tsessionID: \"session1\",\n\t\t\t\t},\n\t\t\t\tstate: map[string]any{\n\t\t\t\t\t\"k1\": \"v1\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tevent: &Event{\n\t\t\t\tID:     \"event_with_bytes\",\n\t\t\t\tAuthor: \"user\",\n\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\tContent: genai.NewContentFromBytes([]byte(\"test_image_data\"), \"image/png\", \"user\"),\n\t\t\t\t\tGroundingMetadata: &genai.GroundingMetadata{\n\t\t\t\t\t\tSearchEntryPoint: &genai.SearchEntryPoint{\n\t\t\t\t\t\t\tSDKBlob: []byte(\"test_sdk_blob\"),\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twantStoredSession: &session{\n\t\t\t\tid: id{\n\t\t\t\t\tappName:   \"app1\",\n\t\t\t\t\tuserID:    \"user1\",\n\t\t\t\t\tsessionID: \"session1\",\n\t\t\t\t},\n\t\t\t\tevents: []*Event{\n\t\t\t\t\t{\n\t\t\t\t\t\tID:     \"event_with_bytes\",\n\t\t\t\t\t\tAuthor: \"user\",\n\t\t\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\t\t\tContent: genai.NewContentFromBytes([]byte(\"test_image_data\"), \"image/png\", \"user\"),\n\t\t\t\t\t\t\tGroundingMetadata: &genai.GroundingMetadata{\n\t\t\t\t\t\t\t\tSearchEntryPoint: &genai.SearchEntryPoint{\n\t\t\t\t\t\t\t\t\tSDKBlob: []byte(\"test_sdk_blob\"),\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tstate: map[string]any{\n\t\t\t\t\t\"k1\": \"v1\",\n\t\t\t\t},\n\t\t\t},\n\t\t\twantEventCount: 1,\n\t\t},\n\t\t{\n\t\t\tname:  \"append event with all fields\",\n\t\t\tsetup: serviceDbWithData,\n\t\t\tsession: &session{\n\t\t\t\tid: id{\n\t\t\t\t\tappName:   \"app1\",\n\t\t\t\t\tuserID:    \"user1\",\n\t\t\t\t\tsessionID: \"session1\",\n\t\t\t\t},\n\t\t\t\tstate: map[string]any{\n\t\t\t\t\t\"k1\": \"v1\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tevent: &Event{\n\t\t\t\tID:                 \"event_complete\",\n\t\t\t\tAuthor:             \"user\",\n\t\t\t\tLongRunningToolIDs: []string{\"tool123\"},\n\t\t\t\tActions:            EventActions{StateDelta: map[string]any{\"k2\": \"v2\"}},\n\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\tContent:      genai.NewContentFromText(\"test_text\", \"user\"),\n\t\t\t\t\tTurnComplete: true,\n\t\t\t\t\tPartial:      false,\n\t\t\t\t\tErrorCode:    \"error_code\",\n\t\t\t\t\tErrorMessage: \"error_message\",\n\t\t\t\t\tInterrupted:  true,\n\t\t\t\t\tGroundingMetadata: &genai.GroundingMetadata{\n\t\t\t\t\t\tWebSearchQueries: []string{\"query1\"},\n\t\t\t\t\t},\n\t\t\t\t\tUsageMetadata: &genai.GenerateContentResponseUsageMetadata{\n\t\t\t\t\t\tPromptTokenCount:     1,\n\t\t\t\t\t\tCandidatesTokenCount: 1,\n\t\t\t\t\t\tTotalTokenCount:      2,\n\t\t\t\t\t},\n\t\t\t\t\tCitationMetadata: &genai.CitationMetadata{\n\t\t\t\t\t\tCitations: []*genai.Citation{{Title: \"test\", URI: \"google.com\"}},\n\t\t\t\t\t},\n\t\t\t\t\tCustomMetadata: map[string]any{\n\t\t\t\t\t\t\"custom_key\": \"custom_value\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twantStoredSession: &session{\n\t\t\t\tid: id{\n\t\t\t\t\tappName:   \"app1\",\n\t\t\t\t\tuserID:    \"user1\",\n\t\t\t\t\tsessionID: \"session1\",\n\t\t\t\t},\n\t\t\t\tevents: []*Event{\n\t\t\t\t\t{\n\t\t\t\t\t\tID:                 \"event_complete\",\n\t\t\t\t\t\tAuthor:             \"user\",\n\t\t\t\t\t\tLongRunningToolIDs: []string{\"tool123\"},\n\t\t\t\t\t\tActions:            EventActions{StateDelta: map[string]any{\"k2\": \"v2\"}},\n\t\t\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\t\t\tContent:      genai.NewContentFromText(\"test_text\", \"user\"),\n\t\t\t\t\t\t\tTurnComplete: true,\n\t\t\t\t\t\t\tPartial:      false,\n\t\t\t\t\t\t\tErrorCode:    \"error_code\",\n\t\t\t\t\t\t\tErrorMessage: \"error_message\",\n\t\t\t\t\t\t\tInterrupted:  true,\n\t\t\t\t\t\t\tGroundingMetadata: &genai.GroundingMetadata{\n\t\t\t\t\t\t\t\tWebSearchQueries: []string{\"query1\"},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tUsageMetadata: &genai.GenerateContentResponseUsageMetadata{\n\t\t\t\t\t\t\t\tPromptTokenCount:     1,\n\t\t\t\t\t\t\t\tCandidatesTokenCount: 1,\n\t\t\t\t\t\t\t\tTotalTokenCount:      2,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tCitationMetadata: &genai.CitationMetadata{\n\t\t\t\t\t\t\t\tCitations: []*genai.Citation{{Title: \"test\", URI: \"google.com\"}},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tCustomMetadata: map[string]any{\n\t\t\t\t\t\t\t\t\"custom_key\": \"custom_value\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tstate: map[string]any{\n\t\t\t\t\t\"k1\": \"v1\",\n\t\t\t\t\t\"k2\": \"v2\",\n\t\t\t\t},\n\t\t\t},\n\t\t\twantEventCount: 1,\n\t\t},\n\t\t{\n\t\t\tname:  \"partial events are not persisted\",\n\t\t\tsetup: serviceDbWithData,\n\t\t\tsession: &session{\n\t\t\t\tid: id{\n\t\t\t\t\tappName:   \"app1\",\n\t\t\t\t\tuserID:    \"user1\",\n\t\t\t\t\tsessionID: \"session1\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tevent: &Event{\n\t\t\t\tID:     \"partial_event\",\n\t\t\t\tAuthor: \"user\",\n\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\tPartial: true, // This is the key field\n\t\t\t\t},\n\t\t\t},\n\t\t\twantStoredSession: &session{\n\t\t\t\tid: id{\n\t\t\t\t\tappName:   \"app1\",\n\t\t\t\t\tuserID:    \"user1\",\n\t\t\t\t\tsessionID: \"session1\",\n\t\t\t\t},\n\t\t\t\tevents: []*Event{}, // No event should be stored\n\t\t\t\tstate: map[string]any{\n\t\t\t\t\t\"k1\": \"v1\",\n\t\t\t\t},\n\t\t\t},\n\t\t\twantEventCount: 0, // Expect 0 events\n\t\t},\n\t}\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tctx := t.Context()\n\n\t\t\ts := tt.setup(t)\n\n\t\t\ttt.session.updatedAt = time.Now() // set updatedAt value to pass stale validation\n\t\t\terr := s.AppendEvent(ctx, tt.session, tt.event)\n\t\t\tif (err != nil) != tt.wantErr {\n\t\t\t\tt.Errorf(\"databaseService.AppendEvent() error = %v, wantErr %v\", err, tt.wantErr)\n\t\t\t}\n\n\t\t\tif err != nil {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tresp, err := s.Get(ctx, &GetRequest{\n\t\t\t\tAppName:   tt.session.AppName(),\n\t\t\t\tUserID:    tt.session.UserID(),\n\t\t\t\tSessionID: tt.session.ID(),\n\t\t\t})\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"databaseService.Get() error = %v, wantErr %v\", err, tt.wantErr)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// Check event count first\n\t\t\tif resp.Session.Events().Len() != tt.wantEventCount {\n\t\t\t\tt.Errorf(\"AppendEvent returned %d events, want %d\", resp.Session.Events().Len(), tt.wantEventCount)\n\t\t\t}\n\n\t\t\t// Define comparison options\n\t\t\topts := []cmp.Option{\n\t\t\t\tcmp.AllowUnexported(session{}),\n\t\t\t\tcmp.AllowUnexported(id{}),\n\t\t\t\tcmpopts.IgnoreFields(session{}, \"mu\", \"updatedAt\"),\n\t\t\t\tcmpopts.IgnoreFields(Event{}, \"Timestamp\"),\n\t\t\t\t// Add sorters if event order is not guaranteed\n\t\t\t\tcmpopts.SortSlices(func(a, b *Event) bool {\n\t\t\t\t\treturn a.ID < b.ID\n\t\t\t\t}),\n\t\t\t}\n\n\t\t\tif diff := cmp.Diff(tt.wantStoredSession, resp.Session, opts...); diff != \"\" {\n\t\t\t\tt.Errorf(\"AppendEvent session mismatch: (-want +got):\\n%s\", diff)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc Test_inMemoryService_StateManagement(t *testing.T) {\n\tctx := t.Context()\n\tappName := \"my_app\"\n\n\tt.Run(\"app_state_is_shared\", func(t *testing.T) {\n\t\ts := emptyService(t)\n\t\ts1, _ := s.Create(ctx, &CreateRequest{AppName: appName, UserID: \"u1\", SessionID: \"s1\", State: map[string]any{\"app:k1\": \"v1\"}})\n\t\ts1.Session.(*session).updatedAt = time.Now()\n\t\t_ = s.AppendEvent(ctx, s1.Session.(*session), &Event{\n\t\t\tID:          \"event1\",\n\t\t\tActions:     EventActions{StateDelta: map[string]any{\"app:k2\": \"v2\"}},\n\t\t\tLLMResponse: model.LLMResponse{},\n\t\t})\n\n\t\ts2, err := s.Create(ctx, &CreateRequest{AppName: appName, UserID: \"u2\", SessionID: \"s2\"})\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"Failed to create session for user 2: %v\", err)\n\t\t}\n\n\t\twantState := map[string]any{\"app:k1\": \"v1\", \"app:k2\": \"v2\"}\n\t\tgotState := maps.Collect(s2.Session.State().All())\n\t\tif diff := cmp.Diff(wantState, gotState); diff != \"\" {\n\t\t\tt.Errorf(\"User 2 state mismatch (-want +got):\\n%s\", diff)\n\t\t}\n\t})\n\n\tt.Run(\"user_state_is_user_specific\", func(t *testing.T) {\n\t\ts := emptyService(t)\n\t\ts1, _ := s.Create(ctx, &CreateRequest{AppName: appName, UserID: \"u1\", SessionID: \"s1\", State: map[string]any{\"user:k1\": \"v1\"}})\n\t\ts1.Session.(*session).updatedAt = time.Now()\n\t\t_ = s.AppendEvent(ctx, s1.Session.(*session), &Event{\n\t\t\tID:          \"event1\",\n\t\t\tActions:     EventActions{StateDelta: map[string]any{\"user:k2\": \"v2\"}},\n\t\t\tLLMResponse: model.LLMResponse{},\n\t\t})\n\n\t\ts1b, _ := s.Create(ctx, &CreateRequest{AppName: appName, UserID: \"u1\", SessionID: \"s1b\"})\n\t\twantStateU1 := map[string]any{\"user:k1\": \"v1\", \"user:k2\": \"v2\"}\n\t\tgotStateU1 := maps.Collect(s1b.Session.State().All())\n\t\tif diff := cmp.Diff(wantStateU1, gotStateU1); diff != \"\" {\n\t\t\tt.Errorf(\"User 1 second session state mismatch (-want +got):\\n%s\", diff)\n\t\t}\n\n\t\ts2, _ := s.Create(ctx, &CreateRequest{AppName: appName, UserID: \"u2\", SessionID: \"s2\"})\n\t\tgotStateU2 := maps.Collect(s2.Session.State().All())\n\t\tif len(gotStateU2) != 0 {\n\t\t\tt.Errorf(\"User 2 should have empty state, but got: %v\", gotStateU2)\n\t\t}\n\t})\n\n\tt.Run(\"session_state_is_not_shared\", func(t *testing.T) {\n\t\ts := emptyService(t)\n\t\ts1, _ := s.Create(ctx, &CreateRequest{AppName: appName, UserID: \"u1\", SessionID: \"s1\", State: map[string]any{\"sk1\": \"v1\"}})\n\t\ts1.Session.(*session).updatedAt = time.Now()\n\t\t_ = s.AppendEvent(ctx, s1.Session.(*session), &Event{\n\t\t\tID:          \"event1\",\n\t\t\tActions:     EventActions{StateDelta: map[string]any{\"sk2\": \"v2\"}},\n\t\t\tLLMResponse: model.LLMResponse{},\n\t\t})\n\n\t\ts1_got, _ := s.Get(ctx, &GetRequest{AppName: appName, UserID: \"u1\", SessionID: \"s1\"})\n\t\twantState := map[string]any{\"sk1\": \"v1\", \"sk2\": \"v2\"}\n\t\tgotState := maps.Collect(s1_got.Session.State().All())\n\t\tif diff := cmp.Diff(wantState, gotState); diff != \"\" {\n\t\t\tt.Errorf(\"Refetched s1 state mismatch (-want +got):\\n%s\", diff)\n\t\t}\n\n\t\ts1b, _ := s.Create(ctx, &CreateRequest{AppName: appName, UserID: \"u1\", SessionID: \"s1b\"})\n\t\tgotStateS1b := maps.Collect(s1b.Session.State().All())\n\t\tif len(gotStateS1b) != 0 {\n\t\t\tt.Errorf(\"Session s1b should have empty state, but got: %v\", gotStateS1b)\n\t\t}\n\t})\n\n\tt.Run(\"temp_state_is_not_persisted\", func(t *testing.T) {\n\t\ts := emptyService(t)\n\t\ts1, _ := s.Create(ctx, &CreateRequest{AppName: appName, UserID: \"u1\", SessionID: \"s1\"})\n\t\ts1.Session.(*session).updatedAt = time.Now()\n\t\tevent := &Event{\n\t\t\tID:          \"event1\",\n\t\t\tActions:     EventActions{StateDelta: map[string]any{\"temp:k1\": \"v1\", \"sk\": \"v2\"}},\n\t\t\tLLMResponse: model.LLMResponse{},\n\t\t}\n\t\terr := s.AppendEvent(ctx, s1.Session.(*session), event)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"Failed to append event: %v\", err)\n\t\t}\n\t\tinvocationSession := s1.Session.(*session)\n\t\twantInvocationState := map[string]any{\"sk\": \"v2\", \"temp:k1\": \"v1\"}\n\t\tgotInvocationState := maps.Collect(invocationSession.State().All())\n\t\tif diff := cmp.Diff(wantInvocationState, gotInvocationState); diff != \"\" {\n\t\t\tt.Errorf(\"Invocation session state mismatch (-want +got):\\n%s\", diff)\n\t\t}\n\n\t\ts1_got, _ := s.Get(ctx, &GetRequest{AppName: appName, UserID: \"u1\", SessionID: \"s1\"})\n\t\twantState := map[string]any{\"sk\": \"v2\"}\n\t\tgotState := maps.Collect(s1_got.Session.State().All())\n\t\tif diff := cmp.Diff(wantState, gotState); diff != \"\" {\n\t\t\tt.Errorf(\"Persisted state mismatch (-want +got):\\n%s\", diff)\n\t\t}\n\n\t\tstoredEvents := s1_got.Session.Events()\n\t\tif storedEvents.Len() != 1 {\n\t\t\tt.Fatalf(\"Expected 1 stored event, got %d\", storedEvents.Len())\n\t\t}\n\t\tstoredDelta := storedEvents.At(0).Actions.StateDelta\n\t\tif _, exists := storedDelta[\"temp:k1\"]; exists {\n\t\t\tt.Errorf(\"temp:k1 key was found in the stored event's state delta\")\n\t\t}\n\t\tif storedDelta[\"sk\"] != \"v2\" {\n\t\t\tt.Errorf(\"Expected 'sk' key in stored event, but was missing or wrong value\")\n\t\t}\n\t})\n}\n\nfunc serviceDbWithData(t *testing.T) Service {\n\tt.Helper()\n\n\tservice := emptyService(t).(*inMemoryService)\n\n\tfor _, storedSession := range []*session{\n\t\t{\n\t\t\tid: id{\n\t\t\t\tappName:   \"app1\",\n\t\t\t\tuserID:    \"user1\",\n\t\t\t\tsessionID: \"session1\",\n\t\t\t},\n\t\t\tstate: map[string]any{\n\t\t\t\t\"k1\": \"v1\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tid: id{\n\t\t\t\tappName:   \"app1\",\n\t\t\t\tuserID:    \"user2\",\n\t\t\t\tsessionID: \"session1\",\n\t\t\t},\n\t\t\tstate: map[string]any{\n\t\t\t\t\"k1\": \"v2\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tid: id{\n\t\t\t\tappName:   \"app1\",\n\t\t\t\tuserID:    \"user1\",\n\t\t\t\tsessionID: \"session2\",\n\t\t\t},\n\t\t\tstate: map[string]any{\n\t\t\t\t\"k1\": \"v2\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tid: id{\n\t\t\t\tappName:   \"app2\",\n\t\t\t\tuserID:    \"user2\",\n\t\t\t\tsessionID: \"session2\",\n\t\t\t},\n\t\t\tstate: map[string]any{\n\t\t\t\t\"k2\": \"v2\",\n\t\t\t},\n\t\t\tevents: []*Event{\n\t\t\t\t{\n\t\t\t\t\tID: \"existing_event1\",\n\t\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\t\tPartial: false,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t} {\n\t\tservice.sessions.Set(storedSession.id.Encode(), storedSession)\n\t}\n\n\treturn service\n}\n\nfunc emptyService(t *testing.T) Service {\n\tt.Helper()\n\treturn InMemoryService()\n}\n\n// TODO: test concurrency\nfunc Test_inMemoryService_CreateConcurrentAccess(t *testing.T) {\n\ts := InMemoryService()\n\tconst goroutines = 16\n\tconst attempts = 32\n\n\tstart := make(chan struct{})\n\tvar wg sync.WaitGroup\n\twg.Add(goroutines)\n\n\treq := &CreateRequest{\n\t\tAppName:   \"race-app\",\n\t\tUserID:    \"race-user\",\n\t\tSessionID: \"race-session\",\n\t}\n\n\tvar successCount atomic.Int32\n\tvar errorCount atomic.Int32\n\n\tfor range goroutines {\n\t\tgo func() {\n\t\t\tdefer wg.Done()\n\t\t\t<-start\n\t\t\tfor range attempts {\n\t\t\t\t_, err := s.Create(t.Context(), req)\n\t\t\t\tif err == nil {\n\t\t\t\t\tsuccessCount.Add(1)\n\t\t\t\t} else if strings.Contains(err.Error(), \"already exists\") {\n\t\t\t\t\terrorCount.Add(1)\n\t\t\t\t}\n\t\t\t}\n\t\t}()\n\t}\n\n\tclose(start)\n\twg.Wait()\n\n\tif successCount.Load() != 1 {\n\t\tt.Errorf(\"expected 1 successful creation, but got %d\", successCount.Load())\n\t}\n\n\texpectedErrors := int32(goroutines*attempts - 1)\n\tif errorCount.Load() != expectedErrors {\n\t\tt.Errorf(\"expected %d 'already exists' errors, but got %d\", expectedErrors, errorCount.Load())\n\t}\n}\n\nfunc TestInMemorySession_AppendEvent_Deadlock(t *testing.T) {\n\tctx := t.Context()\n\tservice := InMemoryService()\n\n\t// Create a session\n\tcreateReq := &CreateRequest{\n\t\tAppName: \"testapp\",\n\t\tUserID:  \"testuser\",\n\t}\n\tcreateResp, err := service.Create(ctx, createReq)\n\tif err != nil {\n\t\tt.Fatalf(\"Failed to create session: %v\", err)\n\t}\n\tsess := createResp.Session\n\n\t// Event with StateDelta to trigger updateSessionState\n\tevent := &Event{\n\t\tID:        \"event1\",\n\t\tTimestamp: time.Now(),\n\t\tActions: EventActions{\n\t\t\tStateDelta: map[string]any{\n\t\t\t\t\"test_key\": \"test_value\",\n\t\t\t},\n\t\t},\n\t}\n\n\t// This call should hang if the deadlock is present\n\terr = service.AppendEvent(ctx, sess, event)\n\tif err != nil {\n\t\tt.Fatalf(\"AppendEvent failed: %v\", err)\n\t}\n\n\t// If it doesn't hang, the test passes (meaning no deadlock)\n\tt.Log(\"AppendEvent did not deadlock\")\n}\n"
  },
  {
    "path": "session/service.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage session\n\nimport (\n\t\"context\"\n\t\"time\"\n)\n\n// Service is a session storage service.\n//\n// It provides a set of methods for managing sessions and events.\ntype Service interface {\n\tCreate(context.Context, *CreateRequest) (*CreateResponse, error)\n\tGet(context.Context, *GetRequest) (*GetResponse, error)\n\tList(context.Context, *ListRequest) (*ListResponse, error)\n\tDelete(context.Context, *DeleteRequest) error\n\t// AppendEvent is used to append an event to a session, and remove temporary state keys from the event.\n\tAppendEvent(context.Context, Session, *Event) error\n}\n\n// InMemoryService returns an in-memory implementation of the session service.\nfunc InMemoryService() Service {\n\treturn &inMemoryService{\n\t\tappState:  make(map[string]stateMap),\n\t\tuserState: make(map[string]map[string]stateMap),\n\t}\n}\n\n// CreateRequest represents a request to create a session.\ntype CreateRequest struct {\n\tAppName string\n\tUserID  string\n\t// SessionID is the client-provided ID of the session to create.\n\t// Optional: if not set, it will be autogenerated.\n\tSessionID string\n\t// State is the initial state of the session.\n\tState map[string]any\n}\n\n// CreateResponse represents a response for newly created session.\ntype CreateResponse struct {\n\tSession Session\n}\n\n// GetRequest represents a request to get a session.\ntype GetRequest struct {\n\tAppName   string\n\tUserID    string\n\tSessionID string\n\n\t// NumRecentEvents returns at most NumRecentEvents most recent events.\n\t// Optional: if zero, the filter is not applied.\n\tNumRecentEvents int\n\t// After returns events with timestamp >= the given time.\n\t// Optional: if zero, the filter is not applied.\n\tAfter time.Time\n}\n\n// GetResponse represents a response from [Service.Get].\ntype GetResponse struct {\n\tSession Session\n}\n\n// ListRequest represents a request to list sessions.\ntype ListRequest struct {\n\tAppName string\n\tUserID  string\n}\n\n// ListResponse represents a response from [Service.List].\ntype ListResponse struct {\n\tSessions []Session\n}\n\n// DeleteRequest represents a request to delete a session.\ntype DeleteRequest struct {\n\tAppName   string\n\tUserID    string\n\tSessionID string\n}\n"
  },
  {
    "path": "session/session.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage session\n\nimport (\n\t\"errors\"\n\t\"iter\"\n\t\"time\"\n\n\t\"github.com/google/uuid\"\n\n\t\"google.golang.org/adk/model\"\n\t\"google.golang.org/adk/tool/toolconfirmation\"\n)\n\n// Session represents a series of interactions between a user and agents.\n//\n// When a user starts interacting with your agent, session holds everything\n// related to that one specific chat thread.\ntype Session interface {\n\t// ID returns the unique identifier of the session.\n\tID() string\n\t// AppName returns name of the app.\n\tAppName() string\n\t// UserID returns the id of the user.\n\tUserID() string\n\n\t// State returns the state of the session.\n\tState() State\n\t// Events return the events of the session, e.g. user input, model response, function call/response, etc.\n\tEvents() Events\n\t// LastUpdateTime returns the time of the last update.\n\tLastUpdateTime() time.Time\n}\n\n// State defines a standard interface for a key-value store.\n// It provides basic methods for accessing, modifying, and iterating over\n// key-value pairs.\ntype State interface {\n\t// Get retrieves the value associated with a given key.\n\t// It returns a ErrStateKeyNotExist error if the key does not exist.\n\tGet(string) (any, error)\n\t// Set assigns the given value to the given key, overwriting any\n\t// existing value. It returns an error if the underlying storage\n\t// operation fails.\n\tSet(string, any) error\n\t// All returns an iterator (iter.Seq2) that yields all key-value pairs\n\t// currently in the state. The order of iteration is not guaranteed.\n\tAll() iter.Seq2[string, any]\n}\n\n// ReadonlyState defines a standard interface for a key-value store.\n// It provides basic methods for accessing, and iterating over\n// key-value pairs.\ntype ReadonlyState interface {\n\t// Get retrieves the value associated with a given key.\n\t// It returns a ErrStateKeyNotExist error if the key does not exist.\n\tGet(string) (any, error)\n\t// All returns an iterator (iter.Seq2) that yields all key-value pairs\n\t// currently in the state. The order of iteration is not guaranteed.\n\tAll() iter.Seq2[string, any]\n}\n\n// Events define a standard interface for an [Event] list.\n// It provides methods for iterating over the sequence and accessing\n// individual events by their index.\ntype Events interface {\n\t// All returns an iterator (iter.Seq) that yields all events\n\t// in the sequence, preserving their order.\n\tAll() iter.Seq[*Event]\n\t// Len returns the total number of events in the sequence.\n\tLen() int\n\t// At returns the event at the specified index i.\n\tAt(i int) *Event\n}\n\n// Event represents an interaction in a conversation between agents and users.\n// It is used to store the content of the conversation, as well as\n// the actions taken by the agents like function calls, etc.\ntype Event struct {\n\tmodel.LLMResponse\n\n\t// Set by storage\n\tID        string\n\tTimestamp time.Time\n\n\t// Set by agent.Context implementation.\n\tInvocationID string\n\t// The branch of the event.\n\t//\n\t// The format is like agent_1.agent_2.agent_3, where agent_1 is\n\t// the parent of agent_2, and agent_2 is the parent of agent_3.\n\t//\n\t// Branch is used when multiple sub-agent shouldn't see their peer agents'\n\t// conversation history.\n\tBranch string\n\t// Author is the name of the event's author\n\tAuthor string\n\n\t// The actions taken by the agent.\n\tActions EventActions\n\t// Set of IDs of the long running function calls.\n\t// Agent client will know from this field about which function call is long running.\n\t// Only valid for function call event.\n\tLongRunningToolIDs []string\n}\n\n// IsFinalResponse returns whether the event is the final response of an agent.\n//\n// Note: when multiple agents participate in one invocation, there could be\n// multiple events with IsFinalResponse() as True, for each participating agent.\nfunc (e *Event) IsFinalResponse() bool {\n\tif (e.Actions.SkipSummarization) || len(e.LongRunningToolIDs) > 0 {\n\t\treturn true\n\t}\n\n\treturn !hasFunctionCalls(&e.LLMResponse) && !hasFunctionResponses(&e.LLMResponse) && !e.LLMResponse.Partial && !hasTrailingCodeExecutionResult(&e.LLMResponse)\n}\n\n// NewEvent creates a new event defining now as the timestamp.\nfunc NewEvent(invocationID string) *Event {\n\treturn &Event{\n\t\tID:           uuid.NewString(),\n\t\tInvocationID: invocationID,\n\t\tTimestamp:    time.Now(),\n\t\tActions:      EventActions{StateDelta: make(map[string]any), ArtifactDelta: make(map[string]int64)},\n\t}\n}\n\n// EventActions represent the actions attached to an event.\ntype EventActions struct {\n\t// Set by agent.Context implementation.\n\tStateDelta map[string]any\n\n\t// Indicates that the event is updating an artifact. key is the filename,\n\t// value is the version.\n\tArtifactDelta map[string]int64\n\n\tRequestedToolConfirmations map[string]toolconfirmation.ToolConfirmation\n\n\t// If true, it won't call model to summarize function response.\n\t// Only valid for function response event.\n\tSkipSummarization bool\n\t// If set, the event transfers to the specified agent.\n\tTransferToAgent string\n\t// The agent is escalating to a higher level agent.\n\tEscalate bool\n}\n\n// Prefixes for defining session's state scopes\nconst (\n\t// KeyPrefixApp is the prefix for app-level state keys.\n\t// They are shared across all users and sessions for that application.\n\tKeyPrefixApp string = \"app:\"\n\t// KeyPrefixTemp is the prefix for temporary state keys.\n\t// Such entries are specific to the current invocation (the entire process\n\t// from an agent receiving user input to generating the final output for\n\t// that input. Discarded after the invocation completes.\n\tKeyPrefixTemp string = \"temp:\"\n\t// KeyPrefixUser is the prefix for user-level state keys.\n\t// They are tied to the user_id, shared across all sessions for that user\n\t// (within the same app_name).\n\tKeyPrefixUser string = \"user:\"\n)\n\n// ErrStateKeyNotExist is the error thrown when key does not exist.\nvar ErrStateKeyNotExist = errors.New(\"state key does not exist\")\n\nfunc hasFunctionCalls(resp *model.LLMResponse) bool {\n\tif resp == nil || resp.Content == nil {\n\t\treturn false\n\t}\n\tfor _, part := range resp.Content.Parts {\n\t\tif part.FunctionCall != nil {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\nfunc hasFunctionResponses(resp *model.LLMResponse) bool {\n\tif resp == nil || resp.Content == nil {\n\t\treturn false\n\t}\n\tfor _, part := range resp.Content.Parts {\n\t\tif part.FunctionResponse != nil {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\n// Returns whether the event has a trailing code execution result.\nfunc hasTrailingCodeExecutionResult(resp *model.LLMResponse) bool {\n\tif resp == nil || resp.Content == nil || len(resp.Content.Parts) == 0 {\n\t\treturn false\n\t}\n\tlastPart := resp.Content.Parts[len(resp.Content.Parts)-1]\n\treturn lastPart.CodeExecutionResult != nil\n}\n"
  },
  {
    "path": "session/vertexai/service_test.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage vertexai\n\nimport (\n\t\"context\"\n\t\"maps\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strconv\"\n\t\"strings\"\n\t\"testing\"\n\t\"time\"\n\n\t\"cloud.google.com/go/rpcreplay\"\n\t\"github.com/google/go-cmp/cmp\"\n\t\"github.com/google/go-cmp/cmp/cmpopts\"\n\t\"github.com/google/uuid\"\n\t\"google.golang.org/api/option\"\n\t\"google.golang.org/genai\"\n\t\"google.golang.org/grpc\"\n\n\t\"google.golang.org/adk/model\"\n\t\"google.golang.org/adk/session\"\n)\n\nconst (\n\tProjectID = \"adk-go-test\"\n\tLocation  = \"us-central1\"\n\tEngineId  = \"5576569044451983360\"\n\tEngineId2 = \"8602987994044956672\"\n\tUserID    = \"test-user\"\n)\n\nfunc Test_vertexaiService_Create(t *testing.T) {\n\ttests := []struct {\n\t\tname       string\n\t\tsetup      func(t *testing.T, name string) (session.Service, map[string]string)\n\t\treq        *session.CreateRequest\n\t\twant       session.Session\n\t\twantErr    bool\n\t\terrMessage string\n\t}{\n\t\t{\n\t\t\tname:  \"full key\",\n\t\t\tsetup: emptyService,\n\t\t\treq: &session.CreateRequest{\n\t\t\t\tAppName:   EngineId,\n\t\t\t\tUserID:    \"testUserID\",\n\t\t\t\tSessionID: \"testSessionID\",\n\t\t\t\tState: map[string]any{\n\t\t\t\t\t\"k\": 5,\n\t\t\t\t},\n\t\t\t},\n\t\t\twantErr:    true,\n\t\t\terrMessage: \"user-provided Session id is not supported for VertexAISessionService: \\\"testSessionID\\\"\",\n\t\t},\n\t\t{\n\t\t\tname:  \"generated session id\",\n\t\t\tsetup: emptyService,\n\t\t\treq: &session.CreateRequest{\n\t\t\t\tAppName: EngineId,\n\t\t\t\tUserID:  \"testUserID\",\n\t\t\t\tState: map[string]any{\n\t\t\t\t\t// TODO had to parse to float64, sending int was modified by vertex or by vertex client, int should work\n\t\t\t\t\t\"k\": float64(5),\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname:  \"when already exists, it fails\",\n\t\t\tsetup: serviceDbWithData,\n\t\t\treq: &session.CreateRequest{\n\t\t\t\tAppName:   EngineId,\n\t\t\t\tUserID:    \"user1\",\n\t\t\t\tSessionID: \"session1\",\n\t\t\t\tState: map[string]any{\n\t\t\t\t\t\"k\": 10,\n\t\t\t\t},\n\t\t\t},\n\t\t\twantErr:    true,\n\t\t\terrMessage: \"user-provided Session id is not supported for VertexAISessionService: \\\"session1\\\"\",\n\t\t},\n\t}\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\ts, _ := tt.setup(t, tt.name)\n\n\t\t\tgot, err := s.Create(t.Context(), tt.req)\n\t\t\tif err != nil {\n\t\t\t\tif tt.wantErr && err.Error() == tt.errMessage {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tt.Fatalf(\"vertexAiService.Create() error = %v, wantErr %v\", err, tt.errMessage)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif got.Session.AppName() != tt.req.AppName {\n\t\t\t\tt.Errorf(\"AppName got: %v, want: %v\", got.Session.AppName(), tt.wantErr)\n\t\t\t}\n\n\t\t\tif got.Session.UserID() != tt.req.UserID {\n\t\t\t\tt.Errorf(\"UserID got: %v, want: %v\", got.Session.UserID(), tt.wantErr)\n\t\t\t}\n\n\t\t\tif tt.req.SessionID != \"\" {\n\t\t\t\tif got.Session.ID() != tt.req.SessionID {\n\t\t\t\t\tt.Errorf(\"SessionID got: %v, want: %v\", got.Session.ID(), tt.wantErr)\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif got.Session.ID() == \"\" {\n\t\t\t\t\tt.Errorf(\"SessionID was not generated on empty user input.\")\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tgotState := maps.Collect(got.Session.State().All())\n\t\t\twantState := tt.req.State\n\n\t\t\tif diff := cmp.Diff(wantState, gotState); diff != \"\" {\n\t\t\t\tt.Errorf(\"Create State mismatch: (-want +got):\\n%s\", diff)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc Test_vertexaiService_Get(t *testing.T) {\n\t// This setup function is required for a test case.\n\t// It creates the specific scenario from 'test_get_session_respects_user_id'.\n\tsetupGetRespectsUserID := func(t *testing.T, name string) (session.Service, map[string]string) {\n\t\tt.Helper()\n\t\ts, l := serviceDbWithData(t, name) // Starts with the standard data\n\n\t\t// u1 creates s1 and adds an event.\n\t\t// 'serviceDbWithData' already created\n\t\t// (app1, user1, session1)\n\t\t// (app1, user2, session1)\n\t\t// We just need to add an event to it.\n\t\tsession1, err := s.Get(t.Context(), &session.GetRequest{\n\t\t\tAppName:   EngineId,\n\t\t\tUserID:    \"user1\",\n\t\t\tSessionID: l[EngineId+\"user1session1\"],\n\t\t})\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"setupGetRespectsUserID failed to get session1: %v\", err)\n\t\t}\n\n\t\t// Update 'updatedAt' to pass stale validation on append\n\t\tsession1.Session.(*localSession).updatedAt = time.Now()\n\n\t\terr = s.AppendEvent(t.Context(), session1.Session.(*localSession), &session.Event{\n\t\t\tID:           \"event_for_user1\",\n\t\t\tInvocationID: \"test\",\n\t\t\tAuthor:       \"user\",\n\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\tPartial: false,\n\t\t\t},\n\t\t})\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"setupGetRespectsUserID failed to append event: %v\", err)\n\t\t}\n\t\treturn s, l\n\t}\n\n\tsetupGetWithConfig := func(t *testing.T, name string) (session.Service, map[string]string) {\n\t\tt.Helper()\n\t\ts, l := emptyService(t, name)\n\t\tctx := t.Context()\n\t\tnumTestEvents := 5\n\t\tcreated, err := s.Create(ctx, &session.CreateRequest{\n\t\t\tAppName: EngineId2,\n\t\t\tUserID:  \"user\",\n\t\t})\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"setupGetWithConfig failed to create session: %v\", err)\n\t\t}\n\n\t\tl[created.Session.AppName()+created.Session.UserID()+\"s1\"] = created.Session.ID()\n\n\t\tfor i := 1; i <= numTestEvents; i++ {\n\t\t\tcreated.Session.(*localSession).updatedAt = time.Now()\n\t\t\tevent := &session.Event{\n\t\t\t\tID:           strconv.Itoa(i),\n\t\t\t\tInvocationID: \"test\",\n\t\t\t\tAuthor:       \"user\",\n\t\t\t\tTimestamp:    time.Time{}.Add(time.Duration(i) * time.Second),\n\t\t\t\tLLMResponse:  model.LLMResponse{},\n\t\t\t}\n\t\t\tif err := s.AppendEvent(ctx, created.Session.(*localSession), event); err != nil {\n\t\t\t\tt.Fatalf(\"setupGetWithConfig failed to append event %d: %v\", i, err)\n\t\t\t}\n\t\t}\n\t\treturn s, l\n\t}\n\n\ttests := []struct {\n\t\tname         string\n\t\treq          *session.GetRequest\n\t\tsetup        func(t *testing.T, name string) (session.Service, map[string]string)\n\t\twantResponse *session.GetResponse\n\t\twantEvents   []*session.Event\n\t\twantErr      bool\n\t}{\n\t\t{\n\t\t\tname:  \"ok\",\n\t\t\tsetup: serviceDbWithData,\n\t\t\treq: &session.GetRequest{\n\t\t\t\tAppName:   EngineId,\n\t\t\t\tUserID:    \"user1\",\n\t\t\t\tSessionID: \"session1\",\n\t\t\t},\n\t\t\twantResponse: &session.GetResponse{\n\t\t\t\tSession: &localSession{\n\t\t\t\t\tappName:   EngineId,\n\t\t\t\t\tuserID:    \"user1\",\n\t\t\t\t\tsessionID: \"session1\",\n\t\t\t\t\tstate: map[string]any{\n\t\t\t\t\t\t\"k1\": \"v1\",\n\t\t\t\t\t},\n\t\t\t\t\tevents: []*session.Event{},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname:  \"error when not found\",\n\t\t\tsetup: serviceDbWithData,\n\t\t\treq: &session.GetRequest{\n\t\t\t\tAppName:   EngineId,\n\t\t\t\tUserID:    \"user1\",\n\t\t\t\tSessionID: \"session4\",\n\t\t\t},\n\t\t\twantErr: true,\n\t\t},\n\t\t{\n\t\t\tname:  \"get session respects user id\",\n\t\t\tsetup: setupGetRespectsUserID,\n\t\t\treq: &session.GetRequest{\n\t\t\t\tAppName:   EngineId,\n\t\t\t\tUserID:    \"user2\",\n\t\t\t\tSessionID: \"session1\",\n\t\t\t},\n\t\t\twantResponse: &session.GetResponse{\n\t\t\t\tSession: &localSession{\n\t\t\t\t\tappName:   EngineId,\n\t\t\t\t\tuserID:    \"user2\",\n\t\t\t\t\tsessionID: \"session1\",\n\t\t\t\t\t// This is user2's session, which should have its own state\n\t\t\t\t\tstate: map[string]any{\n\t\t\t\t\t\t\"k1\": \"v2\",\n\t\t\t\t\t},\n\t\t\t\t\t// Critically, it should NOT have the event from user1's session\n\t\t\t\t\tevents: []*session.Event{},\n\t\t\t\t},\n\t\t\t},\n\t\t\twantErr: false,\n\t\t},\n\t\t{\n\t\t\tname:  \"with config_no config returns all events\",\n\t\t\tsetup: setupGetWithConfig,\n\t\t\treq: &session.GetRequest{\n\t\t\t\tAppName: EngineId2, UserID: \"user\", SessionID: \"s1\",\n\t\t\t},\n\t\t\twantEvents: []*session.Event{\n\t\t\t\t{\n\t\t\t\t\tID: \"1\", Author: \"user\", InvocationID: \"test\", Timestamp: time.Time{}.Add(1 * time.Second),\n\t\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\t\tContent: &genai.Content{},\n\t\t\t\t\t},\n\t\t\t\t\tActions: session.EventActions{\n\t\t\t\t\t\tStateDelta: map[string]any{},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tID: \"2\", Author: \"user\", InvocationID: \"test\", Timestamp: time.Time{}.Add(2 * time.Second),\n\t\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\t\tContent: &genai.Content{},\n\t\t\t\t\t},\n\t\t\t\t\tActions: session.EventActions{\n\t\t\t\t\t\tStateDelta: map[string]any{},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tID: \"3\", Author: \"user\", InvocationID: \"test\", Timestamp: time.Time{}.Add(3 * time.Second),\n\t\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\t\tContent: &genai.Content{},\n\t\t\t\t\t},\n\t\t\t\t\tActions: session.EventActions{\n\t\t\t\t\t\tStateDelta: map[string]any{},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tID: \"4\", Author: \"user\", InvocationID: \"test\", Timestamp: time.Time{}.Add(4 * time.Second),\n\t\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\t\tContent: &genai.Content{},\n\t\t\t\t\t},\n\t\t\t\t\tActions: session.EventActions{\n\t\t\t\t\t\tStateDelta: map[string]any{},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tID: \"5\", Author: \"user\", InvocationID: \"test\", Timestamp: time.Time{}.Add(5 * time.Second),\n\t\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\t\tContent: &genai.Content{},\n\t\t\t\t\t},\n\t\t\t\t\tActions: session.EventActions{\n\t\t\t\t\t\tStateDelta: map[string]any{},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname:  \"with config_num recent events\",\n\t\t\tsetup: setupGetWithConfig,\n\t\t\treq: &session.GetRequest{\n\t\t\t\tAppName: EngineId2, UserID: \"user\", SessionID: \"s1\",\n\t\t\t\tNumRecentEvents: 3,\n\t\t\t},\n\t\t\twantEvents: []*session.Event{\n\t\t\t\t{\n\t\t\t\t\tID: \"3\", Author: \"user\", InvocationID: \"test\", Timestamp: time.Time{}.Add(3 * time.Second),\n\t\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\t\tContent: &genai.Content{},\n\t\t\t\t\t},\n\t\t\t\t\tActions: session.EventActions{\n\t\t\t\t\t\tStateDelta: map[string]any{},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tID: \"4\", Author: \"user\", InvocationID: \"test\", Timestamp: time.Time{}.Add(4 * time.Second),\n\t\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\t\tContent: &genai.Content{},\n\t\t\t\t\t},\n\t\t\t\t\tActions: session.EventActions{\n\t\t\t\t\t\tStateDelta: map[string]any{},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tID: \"5\", Author: \"user\", InvocationID: \"test\", Timestamp: time.Time{}.Add(5 * time.Second),\n\t\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\t\tContent: &genai.Content{},\n\t\t\t\t\t},\n\t\t\t\t\tActions: session.EventActions{\n\t\t\t\t\t\tStateDelta: map[string]any{},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname:  \"with config_after timestamp\",\n\t\t\tsetup: setupGetWithConfig,\n\t\t\treq: &session.GetRequest{\n\t\t\t\tAppName: EngineId2, UserID: \"user\", SessionID: \"s1\",\n\t\t\t\tAfter: time.Time{}.Add(4 * time.Second),\n\t\t\t},\n\t\t\twantErr: false,\n\t\t\twantEvents: []*session.Event{\n\t\t\t\t{\n\t\t\t\t\tID: \"4\", Author: \"user\", InvocationID: \"test\", Timestamp: time.Time{}.Add(4 * time.Second),\n\t\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\t\tContent: &genai.Content{},\n\t\t\t\t\t},\n\t\t\t\t\tActions: session.EventActions{\n\t\t\t\t\t\tStateDelta: map[string]any{},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tID: \"5\", Author: \"user\", InvocationID: \"test\", Timestamp: time.Time{}.Add(5 * time.Second),\n\t\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\t\tContent: &genai.Content{},\n\t\t\t\t\t},\n\t\t\t\t\tActions: session.EventActions{\n\t\t\t\t\t\tStateDelta: map[string]any{},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname:  \"with config_combined filters\",\n\t\t\tsetup: setupGetWithConfig,\n\t\t\treq: &session.GetRequest{\n\t\t\t\tAppName: EngineId2, UserID: \"user\", SessionID: \"s1\",\n\t\t\t\tNumRecentEvents: 3,\n\t\t\t\tAfter:           time.Time{}.Add(4 * time.Second),\n\t\t\t},\n\t\t\twantErr: false,\n\t\t\twantEvents: []*session.Event{\n\t\t\t\t{\n\t\t\t\t\tID: \"4\", Author: \"user\", InvocationID: \"test\", Timestamp: time.Time{}.Add(4 * time.Second),\n\t\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\t\tContent: &genai.Content{},\n\t\t\t\t\t},\n\t\t\t\t\tActions: session.EventActions{\n\t\t\t\t\t\tStateDelta: map[string]any{},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tID: \"5\", Author: \"user\", InvocationID: \"test\", Timestamp: time.Time{}.Add(5 * time.Second),\n\t\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\t\tContent: &genai.Content{},\n\t\t\t\t\t},\n\t\t\t\t\tActions: session.EventActions{\n\t\t\t\t\t\tStateDelta: map[string]any{},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\ts, l := tt.setup(t, tt.name)\n\t\t\ttt.req.SessionID = l[tt.req.AppName+tt.req.UserID+tt.req.SessionID]\n\t\t\tgot, err := s.Get(t.Context(), tt.req)\n\t\t\tif (err != nil) != tt.wantErr {\n\t\t\t\tt.Fatalf(\"vertexAiService.Get() error = %v, wantErr %v\", err, tt.wantErr)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif err != nil {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif tt.wantResponse != nil {\n\t\t\t\tif diff := cmp.Diff(tt.wantResponse, got,\n\t\t\t\t\tcmp.AllowUnexported(localSession{}),\n\t\t\t\t\tcmpopts.IgnoreFields(localSession{}, \"mu\", \"updatedAt\", \"sessionID\")); diff != \"\" {\n\t\t\t\t\tt.Errorf(\"Get session mismatch: (-want +got):\\n%s\", diff)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif tt.wantEvents != nil {\n\t\t\t\topts := []cmp.Option{\n\t\t\t\t\tcmpopts.SortSlices(func(a, b *session.Event) bool { return a.Timestamp.Before(b.Timestamp) }),\n\t\t\t\t\tcmpopts.IgnoreFields(session.Event{}, \"ID\"),\n\t\t\t\t}\n\t\t\t\tif diff := cmp.Diff(events(tt.wantEvents), got.Session.Events(), opts...); diff != \"\" {\n\t\t\t\t\tt.Errorf(\"Get session events mismatch: (-want +got):\\n%s\", diff)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc Test_vertexaiService_List(t *testing.T) {\n\ttests := []struct {\n\t\tname         string\n\t\treq          *session.ListRequest\n\t\tsetup        func(t *testing.T, name string) (session.Service, map[string]string)\n\t\twantResponse *session.ListResponse\n\t\twantErr      bool\n\t}{\n\t\t{\n\t\t\tname:  \"list for user1\",\n\t\t\tsetup: serviceDbWithData,\n\t\t\treq: &session.ListRequest{\n\t\t\t\tAppName: EngineId,\n\t\t\t\tUserID:  \"user1\",\n\t\t\t},\n\t\t\twantResponse: &session.ListResponse{\n\t\t\t\tSessions: []session.Session{\n\t\t\t\t\t&localSession{\n\t\t\t\t\t\tappName:   EngineId,\n\t\t\t\t\t\tuserID:    \"user1\",\n\t\t\t\t\t\tsessionID: \"session1\",\n\t\t\t\t\t\tstate: map[string]any{\n\t\t\t\t\t\t\t\"k1\": \"v1\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t&localSession{\n\t\t\t\t\t\tappName:   EngineId,\n\t\t\t\t\t\tuserID:    \"user1\",\n\t\t\t\t\t\tsessionID: \"session2\",\n\t\t\t\t\t\tstate: map[string]any{\n\t\t\t\t\t\t\t\"k1\": \"v2\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname:  \"empty list for non-existent user\",\n\t\t\tsetup: serviceDbWithData,\n\t\t\treq: &session.ListRequest{\n\t\t\t\tAppName: EngineId,\n\t\t\t\tUserID:  \"custom_user\",\n\t\t\t},\n\t\t\twantResponse: &session.ListResponse{\n\t\t\t\tSessions: []session.Session{},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname:  \"list for user2\",\n\t\t\tsetup: serviceDbWithData,\n\t\t\treq: &session.ListRequest{\n\t\t\t\tAppName: EngineId,\n\t\t\t\tUserID:  \"user2\",\n\t\t\t},\n\t\t\twantResponse: &session.ListResponse{\n\t\t\t\tSessions: []session.Session{\n\t\t\t\t\t&localSession{\n\t\t\t\t\t\tappName:   EngineId,\n\t\t\t\t\t\tuserID:    \"user2\",\n\t\t\t\t\t\tsessionID: \"session1\",\n\t\t\t\t\t\tstate: map[string]any{\n\t\t\t\t\t\t\t\"k1\": \"v2\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname:  \"list all users for app\",\n\t\t\tsetup: serviceDbWithData,\n\t\t\treq:   &session.ListRequest{AppName: EngineId, UserID: \"\"},\n\t\t\twantResponse: &session.ListResponse{\n\t\t\t\tSessions: []session.Session{\n\t\t\t\t\t&localSession{appName: EngineId, userID: \"user1\", sessionID: \"session1\", state: map[string]any{\"k1\": \"v1\"}},\n\t\t\t\t\t&localSession{appName: EngineId, userID: \"user1\", sessionID: \"session2\", state: map[string]any{\"k1\": \"v2\"}},\n\t\t\t\t\t&localSession{appName: EngineId, userID: \"user2\", sessionID: \"session1\", state: map[string]any{\"k1\": \"v2\"}},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\ts, l := tt.setup(t, tt.name)\n\t\t\tgot, err := s.List(t.Context(), tt.req)\n\t\t\tif (err != nil) != tt.wantErr {\n\t\t\t\tt.Errorf(\"vertexAiService.List() error = %v, wantErr %v\", err, tt.wantErr)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tfor _, s1 := range tt.wantResponse.Sessions {\n\t\t\t\tls := s1.(*localSession)\n\t\t\t\tls.sessionID = l[ls.appName+ls.userID+ls.sessionID]\n\t\t\t}\n\n\t\t\tif err == nil {\n\t\t\t\t// Sort slices for stable comparison\n\t\t\t\topts := []cmp.Option{\n\t\t\t\t\tcmp.AllowUnexported(localSession{}),\n\t\t\t\t\tcmpopts.IgnoreFields(localSession{}, \"mu\", \"updatedAt\"),\n\t\t\t\t\tcmpopts.SortSlices(func(a, b session.Session) bool {\n\t\t\t\t\t\treturn a.ID() < b.ID()\n\t\t\t\t\t}),\n\t\t\t\t}\n\t\t\t\tif diff := cmp.Diff(tt.wantResponse, got, opts...); diff != \"\" {\n\t\t\t\t\tt.Errorf(\"vertexAiService.List() = %v (-want +got):\\n%s\", got, diff)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc Test_vertexaiService_AppendEvent(t *testing.T) {\n\ttests := []struct {\n\t\tname              string\n\t\tsetup             func(t *testing.T, name string) (session.Service, map[string]string)\n\t\tsession           *localSession\n\t\tevent             *session.Event\n\t\twantStoredSession *localSession // State of the session after Get\n\t\twantEventCount    int           // Expected event count in storage\n\t\twantErr           bool\n\t}{\n\t\t{\n\t\t\tname:  \"append event to the session and overwrite in storage\",\n\t\t\tsetup: serviceDbWithData,\n\t\t\tsession: &localSession{\n\t\t\t\tappName:   EngineId,\n\t\t\t\tuserID:    \"user1\",\n\t\t\t\tsessionID: \"session1\",\n\t\t\t},\n\t\t\tevent: &session.Event{\n\t\t\t\tID:           \"new_event1\",\n\t\t\t\tAuthor:       \"test\",\n\t\t\t\tInvocationID: \"test\",\n\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\tPartial: false,\n\t\t\t\t},\n\t\t\t},\n\t\t\twantStoredSession: &localSession{\n\t\t\t\tappName:   EngineId,\n\t\t\t\tuserID:    \"user1\",\n\t\t\t\tsessionID: \"session1\",\n\t\t\t\tevents: []*session.Event{\n\t\t\t\t\t{\n\t\t\t\t\t\tID:           \"new_event1\",\n\t\t\t\t\t\tAuthor:       \"test\",\n\t\t\t\t\t\tInvocationID: \"test\",\n\t\t\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\t\t\tContent: &genai.Content{},\n\t\t\t\t\t\t\tPartial: false,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tActions: session.EventActions{\n\t\t\t\t\t\t\tStateDelta: map[string]any{},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tstate: map[string]any{\n\t\t\t\t\t\"k1\": \"v1\",\n\t\t\t\t},\n\t\t\t},\n\t\t\twantEventCount: 1,\n\t\t},\n\t\t{\n\t\t\tname:    \"missing session id\",\n\t\t\tsetup:   emptyService,\n\t\t\tsession: &localSession{appName: EngineId, userID: UserID},\n\t\t\tevent:   &session.Event{},\n\t\t\twantErr: true,\n\t\t},\n\t\t{\n\t\t\tname:  \"nil event\",\n\t\t\tsetup: emptyService,\n\t\t\tsession: &localSession{\n\t\t\t\tappName:   EngineId2,\n\t\t\t\tuserID:    \"user2\",\n\t\t\t\tsessionID: \"session2\",\n\t\t\t},\n\t\t\tevent:   nil,\n\t\t\twantErr: true,\n\t\t},\n\t\t{\n\t\t\tname:  \"missing author\",\n\t\t\tsetup: emptyService,\n\t\t\tsession: &localSession{\n\t\t\t\tappName:   EngineId2,\n\t\t\t\tuserID:    \"user2\",\n\t\t\t\tsessionID: \"session2\",\n\t\t\t},\n\t\t\tevent: &session.Event{\n\t\t\t\tTimestamp:    time.Now(),\n\t\t\t\tInvocationID: uuid.NewString(),\n\t\t\t},\n\t\t\twantErr: true,\n\t\t},\n\t\t{\n\t\t\tname:  \"missing invocation id\",\n\t\t\tsetup: emptyService,\n\t\t\tsession: &localSession{\n\t\t\t\tappName:   EngineId2,\n\t\t\t\tuserID:    \"user2\",\n\t\t\t\tsessionID: \"session2\",\n\t\t\t},\n\t\t\tevent: &session.Event{\n\t\t\t\tTimestamp: time.Now(),\n\t\t\t\tAuthor:    UserID,\n\t\t\t},\n\t\t\twantErr: true,\n\t\t},\n\t\t{\n\t\t\tname:  \"append event to the session with events and overwrite in storage\",\n\t\t\tsetup: serviceDbWithData,\n\t\t\tsession: &localSession{\n\t\t\t\tappName:   EngineId2,\n\t\t\t\tuserID:    \"user2\",\n\t\t\t\tsessionID: \"session2\",\n\t\t\t},\n\t\t\tevent: &session.Event{\n\t\t\t\tID:           \"new_event1\",\n\t\t\t\tAuthor:       \"test\",\n\t\t\t\tInvocationID: \"test\",\n\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\tPartial: false,\n\t\t\t\t},\n\t\t\t},\n\t\t\twantStoredSession: &localSession{\n\t\t\t\tappName:   EngineId2,\n\t\t\t\tuserID:    \"user2\",\n\t\t\t\tsessionID: \"session2\",\n\t\t\t\tevents: []*session.Event{\n\t\t\t\t\t{\n\t\t\t\t\t\tID:           \"existing_event1\",\n\t\t\t\t\t\tAuthor:       \"test\",\n\t\t\t\t\t\tInvocationID: \"test\",\n\t\t\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\t\t\tContent: &genai.Content{},\n\t\t\t\t\t\t\tPartial: false,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tActions: session.EventActions{\n\t\t\t\t\t\t\tStateDelta: map[string]any{},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tID:           \"new_event1\",\n\t\t\t\t\t\tAuthor:       \"test\",\n\t\t\t\t\t\tInvocationID: \"test\",\n\t\t\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\t\t\tContent: &genai.Content{},\n\t\t\t\t\t\t\tPartial: false,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tActions: session.EventActions{\n\t\t\t\t\t\t\tStateDelta: map[string]any{},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tstate: map[string]any{\n\t\t\t\t\t\"k2\": \"v2\",\n\t\t\t\t},\n\t\t\t},\n\t\t\twantEventCount: 2,\n\t\t},\n\t\t{\n\t\t\tname:  \"append event when session not found should fail\",\n\t\t\tsetup: serviceDbWithData,\n\t\t\tsession: &localSession{\n\t\t\t\tappName:   EngineId,\n\t\t\t\tuserID:    \"user1\",\n\t\t\t\tsessionID: \"custom_session\",\n\t\t\t},\n\t\t\tevent: &session.Event{\n\t\t\t\tID:           \"new_event2\",\n\t\t\t\tAuthor:       \"test\",\n\t\t\t\tInvocationID: \"test\",\n\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\tPartial: false,\n\t\t\t\t},\n\t\t\t},\n\t\t\twantErr: true,\n\t\t},\n\t\t{\n\t\t\tname:  \"append event with bytes content\",\n\t\t\tsetup: serviceDbWithData,\n\t\t\tsession: &localSession{\n\t\t\t\tappName:   EngineId,\n\t\t\t\tuserID:    \"user1\",\n\t\t\t\tsessionID: \"session1\",\n\t\t\t},\n\t\t\tevent: &session.Event{\n\t\t\t\tID:           \"event_with_bytes\",\n\t\t\t\tAuthor:       \"user\",\n\t\t\t\tInvocationID: \"test\",\n\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\tContent: genai.NewContentFromBytes([]byte(\"test_image_data\"), \"image/png\", \"user\"),\n\t\t\t\t\tGroundingMetadata: &genai.GroundingMetadata{\n\t\t\t\t\t\tSearchEntryPoint: &genai.SearchEntryPoint{\n\t\t\t\t\t\t\tSDKBlob: []byte(\"test_sdk_blob\"),\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twantStoredSession: &localSession{\n\t\t\t\tappName:   EngineId,\n\t\t\t\tuserID:    \"user1\",\n\t\t\t\tsessionID: \"session1\",\n\t\t\t\tevents: []*session.Event{\n\t\t\t\t\t{\n\t\t\t\t\t\tID:           \"event_with_bytes\",\n\t\t\t\t\t\tAuthor:       \"user\",\n\t\t\t\t\t\tInvocationID: \"test\",\n\t\t\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\t\t\tContent: genai.NewContentFromBytes([]byte(\"test_image_data\"), \"image/png\", \"user\"),\n\t\t\t\t\t\t\tGroundingMetadata: &genai.GroundingMetadata{\n\t\t\t\t\t\t\t\tSearchEntryPoint: &genai.SearchEntryPoint{\n\t\t\t\t\t\t\t\t\tSDKBlob: []byte(\"test_sdk_blob\"),\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tActions: session.EventActions{\n\t\t\t\t\t\t\tStateDelta: map[string]any{},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tstate: map[string]any{\n\t\t\t\t\t\"k1\": \"v1\",\n\t\t\t\t},\n\t\t\t},\n\t\t\twantEventCount: 1,\n\t\t},\n\t\t{\n\t\t\tname:  \"append event with all fields\",\n\t\t\tsetup: serviceDbWithData,\n\t\t\tsession: &localSession{\n\t\t\t\tappName:   EngineId,\n\t\t\t\tuserID:    \"user1\",\n\t\t\t\tsessionID: \"session1\",\n\t\t\t},\n\t\t\tevent: &session.Event{\n\t\t\t\tID:                 \"event_complete\",\n\t\t\t\tAuthor:             \"user\",\n\t\t\t\tInvocationID:       \"test\",\n\t\t\t\tLongRunningToolIDs: []string{\"tool123\"},\n\t\t\t\tActions:            session.EventActions{StateDelta: map[string]any{\"k2\": \"v2\"}},\n\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\tContent:      genai.NewContentFromText(\"test_text\", \"user\"),\n\t\t\t\t\tTurnComplete: true,\n\t\t\t\t\tPartial:      false,\n\t\t\t\t\tErrorCode:    \"error_code\",\n\t\t\t\t\tErrorMessage: \"error_message\",\n\t\t\t\t\tInterrupted:  true,\n\t\t\t\t\tGroundingMetadata: &genai.GroundingMetadata{\n\t\t\t\t\t\tWebSearchQueries: []string{\"query1\"},\n\t\t\t\t\t},\n\t\t\t\t\tUsageMetadata: &genai.GenerateContentResponseUsageMetadata{\n\t\t\t\t\t\tPromptTokenCount:     1,\n\t\t\t\t\t\tCandidatesTokenCount: 1,\n\t\t\t\t\t\tTotalTokenCount:      2,\n\t\t\t\t\t},\n\t\t\t\t\tCitationMetadata: &genai.CitationMetadata{\n\t\t\t\t\t\tCitations: []*genai.Citation{{Title: \"test\", URI: \"google.com\"}},\n\t\t\t\t\t},\n\t\t\t\t\tCustomMetadata: map[string]any{\n\t\t\t\t\t\t\"custom_key\": \"custom_value\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twantStoredSession: &localSession{\n\t\t\t\tappName:   EngineId,\n\t\t\t\tuserID:    \"user1\",\n\t\t\t\tsessionID: \"session1\",\n\t\t\t\tevents: []*session.Event{\n\t\t\t\t\t{\n\t\t\t\t\t\tID:                 \"event_complete\",\n\t\t\t\t\t\tAuthor:             \"user\",\n\t\t\t\t\t\tInvocationID:       \"test\",\n\t\t\t\t\t\tLongRunningToolIDs: []string{\"tool123\"},\n\t\t\t\t\t\tActions:            session.EventActions{StateDelta: map[string]any{\"k2\": \"v2\"}},\n\t\t\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\t\t\tContent:      genai.NewContentFromText(\"test_text\", \"user\"),\n\t\t\t\t\t\t\tTurnComplete: true,\n\t\t\t\t\t\t\tPartial:      false,\n\t\t\t\t\t\t\tErrorCode:    \"error_code\",\n\t\t\t\t\t\t\tErrorMessage: \"error_message\",\n\t\t\t\t\t\t\tInterrupted:  true,\n\t\t\t\t\t\t\tGroundingMetadata: &genai.GroundingMetadata{\n\t\t\t\t\t\t\t\tWebSearchQueries: []string{\"query1\"},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tUsageMetadata: &genai.GenerateContentResponseUsageMetadata{\n\t\t\t\t\t\t\t\tPromptTokenCount:     1,\n\t\t\t\t\t\t\t\tCandidatesTokenCount: 1,\n\t\t\t\t\t\t\t\tTotalTokenCount:      2,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tCitationMetadata: &genai.CitationMetadata{\n\t\t\t\t\t\t\t\tCitations: []*genai.Citation{{Title: \"test\", URI: \"google.com\"}},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tCustomMetadata: map[string]any{\n\t\t\t\t\t\t\t\t\"custom_key\": \"custom_value\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tstate: map[string]any{\n\t\t\t\t\t\"k1\": \"v1\",\n\t\t\t\t\t\"k2\": \"v2\",\n\t\t\t\t},\n\t\t\t},\n\t\t\twantEventCount: 1,\n\t\t},\n\t\t{\n\t\t\tname:  \"partial events are not persisted\",\n\t\t\tsetup: serviceDbWithData,\n\t\t\tsession: &localSession{\n\t\t\t\tappName:   EngineId,\n\t\t\t\tuserID:    \"user1\",\n\t\t\t\tsessionID: \"session1\",\n\t\t\t},\n\t\t\tevent: &session.Event{\n\t\t\t\tID:           \"partial_event\",\n\t\t\t\tAuthor:       \"user\",\n\t\t\t\tInvocationID: \"test\",\n\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\tPartial: true, // This is the key field\n\t\t\t\t},\n\t\t\t},\n\t\t\twantStoredSession: &localSession{\n\t\t\t\tappName:   EngineId,\n\t\t\t\tuserID:    \"user1\",\n\t\t\t\tsessionID: \"session1\",\n\t\t\t\tevents:    []*session.Event{}, // No event should be stored\n\t\t\t\tstate: map[string]any{\n\t\t\t\t\t\"k1\": \"v1\",\n\t\t\t\t},\n\t\t\t},\n\t\t\twantEventCount: 0, // Expect 0 events\n\t\t},\n\t}\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tctx := t.Context()\n\n\t\t\ts, l := tt.setup(t, tt.name)\n\n\t\t\ttt.session.sessionID = l[tt.session.appName+tt.session.userID+tt.session.sessionID]\n\t\t\tif tt.wantStoredSession != nil {\n\t\t\t\ttt.wantStoredSession.sessionID = tt.session.sessionID\n\t\t\t}\n\t\t\ttt.session.updatedAt = time.Now() // set updatedAt value to pass stale validation\n\t\t\terr := s.AppendEvent(ctx, tt.session, tt.event)\n\t\t\tif (err != nil) != tt.wantErr {\n\t\t\t\tt.Errorf(\"vertexAiService.AppendEvent() error = %v, wantErr %v\", err, tt.wantErr)\n\t\t\t}\n\n\t\t\tif err != nil {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tresp, err := s.Get(ctx, &session.GetRequest{\n\t\t\t\tAppName:   tt.session.AppName(),\n\t\t\t\tUserID:    tt.session.UserID(),\n\t\t\t\tSessionID: tt.session.ID(),\n\t\t\t})\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"vertexAiService.Get() error = %v, wantErr %v\", err, tt.wantErr)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// Check event count first\n\t\t\tif resp.Session.Events().Len() != tt.wantEventCount {\n\t\t\t\tt.Errorf(\"AppendEvent returned %d events, want %d\", resp.Session.Events().Len(), tt.wantEventCount)\n\t\t\t}\n\n\t\t\t// Define comparison options\n\t\t\topts := []cmp.Option{\n\t\t\t\tcmp.AllowUnexported(localSession{}),\n\t\t\t\tcmpopts.IgnoreFields(localSession{}, \"mu\", \"updatedAt\"),\n\t\t\t\tcmpopts.IgnoreFields(session.Event{}, \"Timestamp\", \"ID\"),\n\t\t\t\tcmpopts.IgnoreFields(model.LLMResponse{}, \"CitationMetadata\", \"UsageMetadata\"),\n\t\t\t\t// Add sorters if event order is not guaranteed\n\t\t\t\tcmpopts.SortSlices(func(a, b *session.Event) bool {\n\t\t\t\t\treturn a.ID < b.ID\n\t\t\t\t}),\n\t\t\t}\n\n\t\t\tif diff := cmp.Diff(tt.wantStoredSession, resp.Session, opts...); diff != \"\" {\n\t\t\t\tt.Errorf(\"AppendEvent session mismatch: (-want +got):\\n%s\", diff)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc Test_vertexaiService_StateManagement(t *testing.T) {\n\tctx := t.Context()\n\tappName := EngineId\n\n\tt.Run(\"app_state_is_shared\", func(t *testing.T) {\n\t\ts, _ := emptyService(t, \"app_state_is_shared\")\n\t\ts1, err := s.Create(ctx, &session.CreateRequest{AppName: appName, UserID: \"u1\", State: map[string]any{\"app:k1\": \"v1\"}})\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"Failed to create session for user 1: %v\", err)\n\t\t}\n\t\ts1.Session.(*localSession).updatedAt = time.Now()\n\t\terr = s.AppendEvent(ctx, s1.Session.(*localSession), &session.Event{\n\t\t\tID:           \"event1\",\n\t\t\tAuthor:       \"test\",\n\t\t\tInvocationID: \"test\",\n\t\t\tActions:      session.EventActions{StateDelta: map[string]any{\"app:k2\": \"v2\"}},\n\t\t\tLLMResponse:  model.LLMResponse{},\n\t\t})\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"Failed to appendEvent: %v\", err)\n\t\t}\n\n\t\ts2, err := s.Create(ctx, &session.CreateRequest{AppName: appName, UserID: \"u2\"})\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"Failed to create session for user 2: %v\", err)\n\t\t}\n\n\t\twantState := map[string]any{\"app:k1\": \"v1\", \"app:k2\": \"v2\"}\n\t\tgotState := maps.Collect(s2.Session.State().All())\n\t\tif diff := cmp.Diff(wantState, gotState); diff != \"\" {\n\t\t\tt.Errorf(\"User 2 state mismatch (-want +got):\\n%s\", diff)\n\t\t}\n\n\t\tt.Cleanup(func() {\n\t\t\terr := s.AppendEvent(ctx, s2.Session, &session.Event{\n\t\t\t\tID:           \"clean_up_event\",\n\t\t\t\tAuthor:       \"test\",\n\t\t\t\tInvocationID: \"test\",\n\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\tPartial: false,\n\t\t\t\t},\n\t\t\t\tActions: session.EventActions{\n\t\t\t\t\tStateDelta: map[string]any{\n\t\t\t\t\t\t\"app:k1\": nil,\n\t\t\t\t\t\t\"app:k2\": nil,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t})\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"Failed to appendEvent on cleanup: %v\", err)\n\t\t\t}\n\t\t})\n\t})\n\n\tt.Run(\"user_state_is_user_specific\", func(t *testing.T) {\n\t\ts, _ := emptyService(t, \"user_state_is_user_specific\")\n\t\ts1, _ := s.Create(ctx, &session.CreateRequest{AppName: appName, UserID: \"u1\", State: map[string]any{\"user:k1\": \"v1\"}})\n\t\ts1.Session.(*localSession).updatedAt = time.Now()\n\t\terr := s.AppendEvent(ctx, s1.Session.(*localSession), &session.Event{\n\t\t\tID:           \"event1\",\n\t\t\tAuthor:       \"test\",\n\t\t\tInvocationID: \"test\",\n\t\t\tActions:      session.EventActions{StateDelta: map[string]any{\"user:k2\": \"v2\"}},\n\t\t\tLLMResponse:  model.LLMResponse{},\n\t\t})\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"Failed to appendEvent: %v\", err)\n\t\t}\n\n\t\ts1b, _ := s.Create(ctx, &session.CreateRequest{AppName: appName, UserID: \"u1\"})\n\t\twantStateU1 := map[string]any{\"user:k1\": \"v1\", \"user:k2\": \"v2\"}\n\t\tgotStateU1 := maps.Collect(s1b.Session.State().All())\n\t\tif diff := cmp.Diff(wantStateU1, gotStateU1); diff != \"\" {\n\t\t\tt.Errorf(\"User 1 second session state mismatch (-want +got):\\n%s\", diff)\n\t\t}\n\n\t\ts2, _ := s.Create(ctx, &session.CreateRequest{AppName: appName, UserID: \"u2\"})\n\t\tgotStateU2 := maps.Collect(s2.Session.State().All())\n\t\tif len(gotStateU2) != 0 {\n\t\t\tt.Errorf(\"User 2 should have empty state, but got: %v\", gotStateU2)\n\t\t}\n\n\t\tt.Cleanup(func() {\n\t\t\terr := s.AppendEvent(ctx, s1b.Session, &session.Event{\n\t\t\t\tID:           \"clean_up_event\",\n\t\t\t\tAuthor:       \"test\",\n\t\t\t\tInvocationID: \"test\",\n\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\tPartial: false,\n\t\t\t\t},\n\t\t\t\tActions: session.EventActions{\n\t\t\t\t\tStateDelta: map[string]any{\n\t\t\t\t\t\t\"user:k1\": nil,\n\t\t\t\t\t\t\"user:k2\": nil,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t})\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"Failed to appendEvent on cleanup: %v\", err)\n\t\t\t}\n\t\t})\n\t})\n\n\tt.Run(\"session_state_is_not_shared\", func(t *testing.T) {\n\t\ts, _ := emptyService(t, \"session_state_is_not_shared\")\n\t\ts1, _ := s.Create(ctx, &session.CreateRequest{AppName: appName, UserID: \"u1\", State: map[string]any{\"sk1\": \"v1\"}})\n\t\ts1.Session.(*localSession).updatedAt = time.Now()\n\t\terr := s.AppendEvent(ctx, s1.Session.(*localSession), &session.Event{\n\t\t\tID:           \"event1\",\n\t\t\tAuthor:       \"test\",\n\t\t\tInvocationID: \"test\",\n\t\t\tActions:      session.EventActions{StateDelta: map[string]any{\"sk2\": \"v2\"}},\n\t\t\tLLMResponse:  model.LLMResponse{},\n\t\t})\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"Failed to appendEvent: %v\", err)\n\t\t}\n\n\t\ts1_got, _ := s.Get(ctx, &session.GetRequest{AppName: appName, UserID: \"u1\", SessionID: s1.Session.ID()})\n\t\twantState := map[string]any{\"sk1\": \"v1\", \"sk2\": \"v2\"}\n\t\tgotState := maps.Collect(s1_got.Session.State().All())\n\t\tif diff := cmp.Diff(wantState, gotState); diff != \"\" {\n\t\t\tt.Errorf(\"Refetched s1 state mismatch (-want +got):\\n%s\", diff)\n\t\t}\n\n\t\ts1b, _ := s.Create(ctx, &session.CreateRequest{AppName: appName, UserID: \"u1\"})\n\t\tgotStateS1b := maps.Collect(s1b.Session.State().All())\n\t\tif len(gotStateS1b) != 0 {\n\t\t\tt.Errorf(\"Session s1b should have empty state, but got: %v\", gotStateS1b)\n\t\t}\n\t})\n\n\tt.Run(\"temp_state_is_not_persisted\", func(t *testing.T) {\n\t\ts, _ := emptyService(t, \"temp_state_is_not_persisted\")\n\t\ts1, _ := s.Create(ctx, &session.CreateRequest{AppName: appName, UserID: \"u1\"})\n\t\ts1.Session.(*localSession).updatedAt = time.Now()\n\t\tevent := &session.Event{\n\t\t\tID:           \"event1\",\n\t\t\tAuthor:       \"test\",\n\t\t\tInvocationID: \"test\",\n\t\t\tActions:      session.EventActions{StateDelta: map[string]any{\"temp:k1\": \"v1\", \"sk\": \"v2\"}},\n\t\t\tLLMResponse:  model.LLMResponse{},\n\t\t}\n\t\terr := s.AppendEvent(ctx, s1.Session.(*localSession), event)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"Failed to appendEvent: %v\", err)\n\t\t}\n\t\tinvocationSession := s1.Session.(*localSession)\n\t\twantInvocationState := map[string]any{\"sk\": \"v2\", \"temp:k1\": \"v1\"}\n\t\tgotInvocationState := maps.Collect(invocationSession.State().All())\n\t\tif diff := cmp.Diff(wantInvocationState, gotInvocationState); diff != \"\" {\n\t\t\tt.Errorf(\"Invocation session state mismatch (-want +got):\\n%s\", diff)\n\t\t}\n\n\t\ts1_got, _ := s.Get(ctx, &session.GetRequest{AppName: appName, UserID: s1.Session.UserID(), SessionID: s1.Session.ID()})\n\t\twantState := map[string]any{\"sk\": \"v2\"}\n\t\tgotState := maps.Collect(s1_got.Session.State().All())\n\t\tif diff := cmp.Diff(wantState, gotState); diff != \"\" {\n\t\t\tt.Errorf(\"Persisted state mismatch (-want +got):\\n%s\", diff)\n\t\t}\n\n\t\tstoredEvents := s1_got.Session.Events()\n\t\tif storedEvents.Len() != 1 {\n\t\t\tt.Fatalf(\"Expected 1 stored event, got %d\", storedEvents.Len())\n\t\t}\n\t\tstoredDelta := storedEvents.At(0).Actions.StateDelta\n\t\tif storedDelta[\"sk\"] != \"v2\" {\n\t\t\tt.Errorf(\"Expected 'sk' key in stored event, but was missing or wrong value\")\n\t\t}\n\t})\n}\n\nfunc emptyService(t *testing.T, name string) (session.Service, map[string]string) {\n\tt.Helper()\n\treplayFile := sanitizeFilename(name)\n\topts, teardown, err := setupReplay(t, replayFile)\n\tif err != nil {\n\t\tt.Fatalf(\"Failed to setup replay: %v\", err)\n\t}\n\n\tv, err := NewSessionService(t.Context(), VertexAIServiceConfig{\n\t\tLocation:  Location,\n\t\tProjectID: ProjectID,\n\t}, opts...)\n\tif err != nil {\n\t\tt.Fatalf(\"%s\", err)\n\t}\n\n\tt.Cleanup(func() {\n\t\tt.Log(\"CLEANUP\")\n\t\tdeleteAll(t, v)\n\t\tdefer teardown()\n\t})\n\n\treturn v, make(map[string]string, 0)\n}\n\nfunc deleteAll(t *testing.T, v session.Service) {\n\tdeleteAllFromApp(t, v, EngineId)\n\tdeleteAllFromApp(t, v, EngineId2)\n}\n\nfunc deleteAllFromApp(t *testing.T, v session.Service, app string) {\n\tcleanupCtx := context.Background()\n\tsessionsResp, err := v.List(cleanupCtx, &session.ListRequest{\n\t\tAppName: app,\n\t})\n\tif err != nil {\n\t\tt.Errorf(\"error listing session for delete all: %s\", err)\n\t}\n\n\tfor _, s := range sessionsResp.Sessions {\n\t\terr := v.Delete(cleanupCtx, &session.DeleteRequest{\n\t\t\tAppName:   s.AppName(),\n\t\t\tUserID:    s.UserID(),\n\t\t\tSessionID: s.ID(),\n\t\t})\n\t\tif err != nil {\n\t\t\tt.Errorf(\"error deleting session for delete all: %s\", err)\n\t\t}\n\t}\n}\n\nfunc serviceDbWithData(t *testing.T, name string) (session.Service, map[string]string) {\n\tt.Helper()\n\n\tservice, _ := emptyService(t, name)\n\tids := make(map[string]string, 4)\n\n\tfor _, storedSession := range []*localSession{\n\t\t{\n\t\t\tappName:   EngineId,\n\t\t\tuserID:    \"user1\",\n\t\t\tsessionID: \"session1\",\n\t\t\tstate: map[string]any{\n\t\t\t\t\"k1\": \"v1\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tappName:   EngineId,\n\t\t\tuserID:    \"user2\",\n\t\t\tsessionID: \"session1\",\n\t\t\tstate: map[string]any{\n\t\t\t\t\"k1\": \"v2\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tappName:   EngineId,\n\t\t\tuserID:    \"user1\",\n\t\t\tsessionID: \"session2\",\n\t\t\tstate: map[string]any{\n\t\t\t\t\"k1\": \"v2\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tappName:   EngineId2,\n\t\t\tuserID:    \"user2\",\n\t\t\tsessionID: \"session2\",\n\t\t\tstate: map[string]any{\n\t\t\t\t\"k2\": \"v2\",\n\t\t\t},\n\t\t\tevents: []*session.Event{\n\t\t\t\t{\n\t\t\t\t\tAuthor:       \"test\",\n\t\t\t\t\tInvocationID: \"test\",\n\t\t\t\t\tID:           \"existing_event1\",\n\t\t\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\t\t\tPartial: false,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t} {\n\t\tresp, err := service.Create(t.Context(), &session.CreateRequest{\n\t\t\tAppName: storedSession.appName,\n\t\t\tUserID:  storedSession.userID,\n\t\t\tState:   storedSession.state,\n\t\t})\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"Failed to create sample sessions on db initialization: %v\", err)\n\t\t}\n\n\t\tids[resp.Session.AppName()+resp.Session.UserID()+storedSession.sessionID] = resp.Session.ID()\n\n\t\tfor _, ev := range storedSession.events {\n\t\t\terr = service.AppendEvent(t.Context(), resp.Session, ev)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"Failed to append event to session on db initialization: %v\", err)\n\t\t\t}\n\t\t}\n\t}\n\n\treturn service, ids\n}\n\n// setupReplay determines if we are recording real traffic or replaying from a file.\n// returns: client options, a teardown function, and an error.\nfunc setupReplay(t *testing.T, filename string) ([]option.ClientOption, func(), error) {\n\tfilePath := filepath.Join(\"testdata\", filename)\n\n\tvar grpcOpts []grpc.DialOption\n\tvar teardown func() error\n\n\t// 1. Determine mode (Record vs Replay)\n\tif os.Getenv(\"UPDATE_REPLAYS\") == \"true\" {\n\t\tt.Logf(\"Recording payload to %s\", filePath)\n\t\t_ = os.MkdirAll(\"testdata\", 0o755)\n\n\t\trec, err := rpcreplay.NewRecorder(filePath, nil)\n\t\tif err != nil {\n\t\t\treturn nil, nil, err\n\t\t}\n\t\tgrpcOpts = rec.DialOptions()\n\t\tteardown = rec.Close\n\t} else {\n\t\tt.Logf(\"Replaying from %s\", filePath)\n\t\trep, err := rpcreplay.NewReplayer(filePath)\n\t\tif err != nil {\n\t\t\treturn nil, nil, err\n\t\t}\n\t\tgrpcOpts = rep.DialOptions()\n\t\tteardown = rep.Close\n\t}\n\n\t// 2. CONVERSION STEP: Convert []grpc.DialOption -> []option.ClientOption\n\tvar clientOpts []option.ClientOption\n\tfor _, opt := range grpcOpts {\n\t\tclientOpts = append(clientOpts, option.WithGRPCDialOption(opt))\n\t\tif os.Getenv(\"UPDATE_REPLAYS\") != \"true\" {\n\t\t\tclientOpts = append(clientOpts, option.WithoutAuthentication())\n\t\t}\n\t}\n\n\t// 3. Return the SAFE client options\n\treturn clientOpts, func() {\n\t\tif err := teardown(); err != nil {\n\t\t\tt.Errorf(\"Failed to close replayer/recorder: %v\", err)\n\t\t}\n\t}, nil\n}\n\nfunc sanitizeFilename(name string) string {\n\t// Replace spaces and special chars with underscores\n\tsafe := strings.ReplaceAll(name, \" \", \"_\")\n\tsafe = strings.ReplaceAll(safe, \",\", \"_\")\n\tsafe = strings.ReplaceAll(safe, \"/\", \"-\")\n\treturn safe + \".replay\"\n}\n"
  },
  {
    "path": "session/vertexai/session.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage vertexai\n\nimport (\n\t\"fmt\"\n\t\"iter\"\n\t\"maps\"\n\t\"strings\"\n\t\"sync\"\n\t\"time\"\n\n\t\"google.golang.org/adk/session\"\n)\n\n// TODO localSession is identical to session.session. Move to sessioninternal\ntype localSession struct {\n\tappName   string\n\tuserID    string\n\tsessionID string\n\n\t// guards all mutable fields\n\tmu        sync.RWMutex\n\tevents    []*session.Event\n\tstate     map[string]any\n\tupdatedAt time.Time\n}\n\nfunc (s *localSession) ID() string {\n\treturn s.sessionID\n}\n\nfunc (s *localSession) AppName() string {\n\treturn s.appName\n}\n\nfunc (s *localSession) UserID() string {\n\treturn s.userID\n}\n\nfunc (s *localSession) State() session.State {\n\treturn &state{\n\t\tmu:    &s.mu,\n\t\tstate: s.state,\n\t}\n}\n\nfunc (s *localSession) Events() session.Events {\n\treturn events(s.events)\n}\n\nfunc (s *localSession) LastUpdateTime() time.Time {\n\ts.mu.RLock()\n\tdefer s.mu.RUnlock()\n\n\treturn s.updatedAt\n}\n\nfunc (s *localSession) appendEvent(event *session.Event) error {\n\tif event.Partial {\n\t\treturn nil\n\t}\n\n\ts.mu.Lock()\n\tdefer s.mu.Unlock()\n\n\tif err := updateSessionState(s, event); err != nil {\n\t\treturn fmt.Errorf(\"failed to update localSession state: %w\", err)\n\t}\n\tprocessedEvent := trimTempDeltaState(event)\n\ts.events = append(s.events, processedEvent)\n\ts.updatedAt = processedEvent.Timestamp\n\treturn nil\n}\n\ntype events []*session.Event\n\nfunc (e events) All() iter.Seq[*session.Event] {\n\treturn func(yield func(*session.Event) bool) {\n\t\tfor _, event := range e {\n\t\t\tif !yield(event) {\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc (e events) Len() int {\n\treturn len(e)\n}\n\nfunc (e events) At(i int) *session.Event {\n\tif i >= 0 && i < len(e) {\n\t\treturn e[i]\n\t}\n\treturn nil\n}\n\ntype state struct {\n\tmu    *sync.RWMutex\n\tstate map[string]any\n}\n\nfunc (s *state) Get(key string) (any, error) {\n\ts.mu.RLock()\n\tdefer s.mu.RUnlock()\n\n\tval, ok := s.state[key]\n\tif !ok {\n\t\treturn nil, session.ErrStateKeyNotExist\n\t}\n\n\treturn val, nil\n}\n\nfunc (s *state) All() iter.Seq2[string, any] {\n\ts.mu.RLock()\n\t// Create a copy of the state to iterate over it without holding the lock.\n\tstateCopy := maps.Clone(s.state)\n\ts.mu.RUnlock()\n\n\treturn func(yield func(key string, val any) bool) {\n\t\tfor k, v := range stateCopy {\n\t\t\tif !yield(k, v) {\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc (s *state) Set(key string, value any) error {\n\ts.mu.Lock()\n\tdefer s.mu.Unlock()\n\n\ts.state[key] = value\n\treturn nil\n}\n\n// TrimTempDeltaState removes temporary state delta keys from the event.\nfunc trimTempDeltaState(event *session.Event) *session.Event {\n\tif len(event.Actions.StateDelta) == 0 {\n\t\treturn event\n\t}\n\n\t// Iterate over the map and build a new one with the keys we want to keep.\n\tfilteredStateDelta := make(map[string]any)\n\tfor key, value := range event.Actions.StateDelta {\n\t\tif !strings.HasPrefix(key, session.KeyPrefixTemp) {\n\t\t\tfilteredStateDelta[key] = value\n\t\t}\n\t}\n\n\t// Replace the old map with the newly filtered one.\n\tevent.Actions.StateDelta = filteredStateDelta\n\n\treturn event\n}\n\n// updateSessionState updates the session state based on the event state delta.\nfunc updateSessionState(sess *localSession, event *session.Event) error {\n\tif event.Actions.StateDelta == nil {\n\t\treturn nil // Nothing to do\n\t}\n\n\t// Ensure the session state map is initialized\n\tif sess.state == nil {\n\t\tsess.state = make(map[string]any)\n\t}\n\n\tmaps.Copy(sess.state, event.Actions.StateDelta)\n\n\treturn nil\n}\n\nvar (\n\t_ session.Session = (*localSession)(nil)\n\t_ session.Events  = (*events)(nil)\n\t_ session.State   = (*state)(nil)\n)\n"
  },
  {
    "path": "session/vertexai/vertexai.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage vertexai\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\t\"golang.org/x/sync/errgroup\"\n\t\"google.golang.org/api/option\"\n\n\t\"google.golang.org/adk/session\"\n)\n\n// VertexAiSessionService\ntype vertexAiService struct {\n\tclient *vertexAiClient\n}\n\ntype VertexAIServiceConfig struct {\n\t// ProjectID with VertexAI API enabled.\n\tProjectID string\n\t// Location where the reasoningEngine is running.\n\tLocation string\n\t// ReasoningEngine is the runtime in the agent engine which will store the\n\t// sessions.\n\t// Optimal way is to create reasoningEngine per app.\n\t// For example, a reasoningEngine can be created via the Vertex AI REST\n\t// API's 'projects.locations.reasoningEngines.create' method.\n\tReasoningEngine string\n}\n\n// NewSessionService returns VertextAiSessionService implementation.\nfunc NewSessionService(ctx context.Context, cfg VertexAIServiceConfig, opts ...option.ClientOption) (session.Service, error) {\n\tclient, err := newVertexAiClient(ctx, cfg.Location, cfg.ProjectID, cfg.ReasoningEngine, opts...)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to create Vertex AI client: %w\", err)\n\t}\n\n\treturn &vertexAiService{client: client}, nil\n}\n\nfunc (s *vertexAiService) Create(ctx context.Context, req *session.CreateRequest) (*session.CreateResponse, error) {\n\tif req.AppName == \"\" || req.UserID == \"\" {\n\t\treturn nil, fmt.Errorf(\"app_name and user_id are required, got app_name: %q, user_id: %q\", req.AppName, req.UserID)\n\t}\n\tif req.SessionID != \"\" {\n\t\treturn nil, fmt.Errorf(\"user-provided Session id is not supported for VertexAISessionService: %q\", req.SessionID)\n\t}\n\tsess, err := s.client.createSession(ctx, req)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to create session: %w\", err)\n\t}\n\treturn &session.CreateResponse{Session: sess}, nil\n}\n\nfunc (s *vertexAiService) Get(ctx context.Context, req *session.GetRequest) (*session.GetResponse, error) {\n\tif req.AppName == \"\" || req.UserID == \"\" || req.SessionID == \"\" {\n\t\treturn nil, fmt.Errorf(\"app_name, user_id and session_id are required, got app_name: %q, user_id: %q, session_id: %q\", req.AppName, req.UserID, req.SessionID)\n\t}\n\n\t// gCtx will be canceled if either function returns an error\n\tg, gCtx := errgroup.WithContext(ctx)\n\n\tvar (\n\t\tsess   *localSession\n\t\tevents []*session.Event\n\t)\n\n\tg.Go(func() error {\n\t\tvar err error\n\t\tsess, err = s.client.getSession(gCtx, req)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"failed to get session: %w\", err)\n\t\t}\n\t\treturn nil\n\t})\n\n\tg.Go(func() error {\n\t\tvar err error\n\t\tevents, err = s.client.listSessionEvents(gCtx, req.AppName, req.SessionID, req.After, req.NumRecentEvents)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"failed to list session events: %w\", err)\n\t\t}\n\t\treturn nil\n\t})\n\n\tif err := g.Wait(); err != nil {\n\t\treturn nil, err\n\t}\n\tsess.events = events\n\treturn &session.GetResponse{Session: sess}, nil\n}\n\nfunc (s *vertexAiService) List(ctx context.Context, req *session.ListRequest) (*session.ListResponse, error) {\n\tif req.AppName == \"\" {\n\t\treturn nil, fmt.Errorf(\"app_name is required, got app_name: %q\", req.AppName)\n\t}\n\tsessions, err := s.client.listSessions(ctx, req)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to request sessions list: %w\", err)\n\t}\n\treturn &session.ListResponse{Sessions: sessions}, nil\n}\n\nfunc (s *vertexAiService) Delete(ctx context.Context, req *session.DeleteRequest) error {\n\tif req.AppName == \"\" || req.UserID == \"\" || req.SessionID == \"\" {\n\t\treturn fmt.Errorf(\"app_name, user_id and session_id are required, got app_name: %q, user_id: %q, session_id: %q\", req.AppName, req.UserID, req.SessionID)\n\t}\n\terr := s.client.deleteSession(ctx, req)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to delete session: %w\", err)\n\t}\n\treturn nil\n}\n\nfunc (s *vertexAiService) AppendEvent(ctx context.Context, sess session.Session, event *session.Event) error {\n\tif sess.ID() == \"\" || event == nil {\n\t\treturn fmt.Errorf(\"session_id and event are required, got session_id: %q, event_id: %t\", sess.ID(), event == nil)\n\t}\n\terr := s.client.appendEvent(ctx, sess.AppName(), sess.ID(), event)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to append event: %w\", err)\n\t}\n\tsessInt, ok := sess.(*localSession)\n\tif !ok {\n\t\treturn fmt.Errorf(\"AppendEvent for Vertex AI service only supports sessions created by it, got %T\", sess)\n\t}\n\terr = sessInt.appendEvent(event)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to append event: %w\", err)\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "session/vertexai/vertexai_client.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage vertexai\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"regexp\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n\n\t\"google.golang.org/api/iterator\"\n\t\"google.golang.org/api/option\"\n\t\"google.golang.org/genai\"\n\t\"google.golang.org/grpc/codes\"\n\t\"google.golang.org/grpc/status\"\n\t\"google.golang.org/protobuf/types/known/structpb\"\n\t\"google.golang.org/protobuf/types/known/timestamppb\"\n\n\t\"google.golang.org/adk/model\"\n\t\"google.golang.org/adk/session\"\n\n\taiplatform \"cloud.google.com/go/aiplatform/apiv1beta1\"\n\taiplatformpb \"cloud.google.com/go/aiplatform/apiv1beta1/aiplatformpb\"\n)\n\nconst (\n\tengineResourceTemplate  = \"projects/%s/locations/%s/reasoningEngines/%s\"\n\tsessionResourceTemplate = engineResourceTemplate + \"/sessions/%s\"\n)\n\ntype vertexAiClient struct {\n\tlocation        string\n\tprojectID       string\n\treasoningEngine string\n\trpcClient       *aiplatform.SessionClient\n}\n\nfunc newVertexAiClient(ctx context.Context, location, projectID, reasoningEngine string, opts ...option.ClientOption) (*vertexAiClient, error) {\n\trpcClient, err := aiplatform.NewSessionClient(ctx, opts...)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"could not establish connection to the aiplatform server: %w\", err)\n\t}\n\treturn &vertexAiClient{location, projectID, reasoningEngine, rpcClient}, nil\n}\n\n// Ensure you close it when your application shuts down\nfunc (c *vertexAiClient) Close() error {\n\treturn c.rpcClient.Close()\n}\n\nfunc (c *vertexAiClient) createSession(ctx context.Context, req *session.CreateRequest) (*localSession, error) {\n\tpbSession := &aiplatformpb.Session{\n\t\tUserId: req.UserID,\n\t}\n\t// Convert and set the initial state if provided\n\tif len(req.State) > 0 {\n\t\tstateStruct, err := structpb.NewStruct(req.State)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"failed to convert state to structpb: %w\", err)\n\t\t}\n\t\tpbSession.SessionState = stateStruct\n\t}\n\n\treasoningEngine, err := c.getReasoningEngineID(req.AppName)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\trpcReq := &aiplatformpb.CreateSessionRequest{\n\t\tParent:  fmt.Sprintf(engineResourceTemplate, c.projectID, c.location, reasoningEngine),\n\t\tSession: pbSession,\n\t}\n\tlro, err := c.rpcClient.CreateSession(ctx, rpcReq)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"error creating session: %w\", err)\n\t}\n\n\tsessionID, err := sessionIDByOperationName(lro.Name())\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"error creating session: %w\", err)\n\t}\n\tcreatedSession, err := c.waitForOperation(ctx, req.AppName, req.UserID, sessionID)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"LRO for CreateSession failed: %w\", err)\n\t}\n\treturn createdSession, nil\n}\n\nfunc isNotFoundError(err error) bool {\n\t// status.Code returns codes.Unknown if it's not a gRPC error,\n\t// otherwise it returns the specific gRPC code.\n\treturn status.Code(err) == codes.NotFound\n}\n\n// TODO replace with LRO wait when it's fixed\n// waitForOperation polls the LRO until it is done.\nfunc (c *vertexAiClient) waitForOperation(ctx context.Context, appName, userId, sessionID string) (*localSession, error) {\n\tconst (\n\t\tmaxRetries = 10\n\t\tbaseDelay  = time.Second\n\t\tmaxDelay   = 5 * time.Second\n\t)\n\n\tfor i := range maxRetries {\n\t\t// Get the latest status of the operation.\n\t\tls, err := c.getSession(ctx, &session.GetRequest{AppName: appName, UserID: userId, SessionID: sessionID})\n\t\tif err != nil {\n\t\t\t// Basic retry on \"not found\" which might be due to propagation\n\t\t\tif i < maxRetries-1 && isNotFoundError(err) {\n\t\t\t\tdelay := min(time.Duration(i*i)*baseDelay, maxDelay)\n\t\t\t\ttime.Sleep(delay)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"error getting operation '%s': %w\", sessionID, err)\n\t\t} else {\n\t\t\treturn ls, nil\n\t\t}\n\t}\n\treturn nil, fmt.Errorf(\"LRO '%s' timed out after %d retries\", sessionID, maxRetries)\n}\n\nfunc (c *vertexAiClient) getSession(ctx context.Context, req *session.GetRequest) (*localSession, error) {\n\treasoningEngine, err := c.getReasoningEngineID(req.AppName)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tsessRpcReq := &aiplatformpb.GetSessionRequest{\n\t\tName: sessionNameByID(req.SessionID, c, reasoningEngine),\n\t}\n\tsessRpcResp, err := c.rpcClient.GetSession(ctx, sessRpcReq)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"error fetching session: %w\", err)\n\t}\n\n\tif sessRpcResp == nil {\n\t\treturn nil, fmt.Errorf(\"session %+v not found\", req.SessionID)\n\t}\n\tif sessRpcResp.UserId != req.UserID {\n\t\treturn nil, fmt.Errorf(\"session %s does not belong to user %s\", req.SessionID, req.UserID)\n\t}\n\n\treturn &localSession{\n\t\tappName:   req.AppName,\n\t\tuserID:    req.UserID,\n\t\tsessionID: req.SessionID,\n\t\tupdatedAt: sessRpcResp.UpdateTime.AsTime(),\n\t\tstate:     filterNilValues(sessRpcResp.SessionState.AsMap()),\n\t}, nil\n}\n\nfunc (c *vertexAiClient) listSessions(ctx context.Context, req *session.ListRequest) ([]session.Session, error) {\n\tsessions := make([]session.Session, 0)\n\n\treasoningEngine, err := c.getReasoningEngineID(req.AppName)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\trpcReq := &aiplatformpb.ListSessionsRequest{\n\t\tParent: fmt.Sprintf(engineResourceTemplate, c.projectID, c.location, reasoningEngine),\n\t}\n\tif req.UserID != \"\" {\n\t\trpcReq.Filter = fmt.Sprintf(\"userId=\\\"%s\\\"\", req.UserID)\n\t}\n\tit := c.rpcClient.ListSessions(ctx, rpcReq)\n\tfor {\n\t\trpcResp, err := it.Next()\n\t\tif err == iterator.Done {\n\t\t\tbreak\n\t\t}\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"error creating session list: %w\", err)\n\t\t}\n\t\tid, err := sessionIdBySessionName(rpcResp.Name)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"error creating session list: %w\", err)\n\t\t}\n\t\tsession := &localSession{\n\t\t\tappName:   req.AppName,\n\t\t\tuserID:    rpcResp.UserId,\n\t\t\tsessionID: id,\n\t\t\tstate:     filterNilValues(rpcResp.SessionState.AsMap()),\n\t\t\tupdatedAt: rpcResp.UpdateTime.AsTime(),\n\t\t}\n\t\tsessions = append(sessions, session)\n\t}\n\treturn sessions, nil\n}\n\nfunc filterNilValues(originalMap map[string]any) map[string]any {\n\tif originalMap == nil {\n\t\treturn nil\n\t}\n\n\tfilteredMap := make(map[string]any)\n\tfor key, value := range originalMap {\n\t\tif value != nil {\n\t\t\tfilteredMap[key] = value\n\t\t}\n\t}\n\treturn filteredMap\n}\n\nfunc (c *vertexAiClient) deleteSession(ctx context.Context, req *session.DeleteRequest) error {\n\treasoningEngine, err := c.getReasoningEngineID(req.AppName)\n\tif err != nil {\n\t\treturn err\n\t}\n\tlro, err := c.rpcClient.DeleteSession(ctx, &aiplatformpb.DeleteSessionRequest{\n\t\tName: sessionNameByID(req.SessionID, c, reasoningEngine),\n\t})\n\tif err != nil {\n\t\treturn fmt.Errorf(\"error deleting session: %w\", err)\n\t}\n\treturn lro.Wait(ctx)\n}\n\nfunc (c *vertexAiClient) appendEvent(ctx context.Context, appName, sessionID string, event *session.Event) error {\n\t// ignore partial events\n\tif event.Partial {\n\t\treturn nil\n\t}\n\n\treasoningEngine, err := c.getReasoningEngineID(appName)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tvar eventState *aiplatformpb.EventActions\n\t// Convert and set the initial state if provided\n\tif len(event.Actions.StateDelta) > 0 {\n\t\tsessionState, err := structpb.NewStruct(event.Actions.StateDelta)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"failed to convert state to structpb: %w\", err)\n\t\t}\n\t\teventState = &aiplatformpb.EventActions{StateDelta: sessionState}\n\t}\n\n\tcontent, err := createAiplatformpbContent(event)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"error creating content: %w\", err)\n\t}\n\n\tmetadata, err := createAiplatformpbMetadata(event)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"error creating metadata: %w\", err)\n\t}\n\n\t_, err = c.rpcClient.AppendEvent(ctx, &aiplatformpb.AppendEventRequest{\n\t\tName: sessionNameByID(sessionID, c, reasoningEngine),\n\t\tEvent: &aiplatformpb.SessionEvent{\n\t\t\tTimestamp: &timestamppb.Timestamp{\n\t\t\t\tSeconds: event.Timestamp.Unix(),\n\t\t\t\tNanos:   int32(event.Timestamp.Nanosecond()),\n\t\t\t},\n\t\t\tAuthor:        event.Author,\n\t\t\tInvocationId:  event.InvocationID,\n\t\t\tContent:       content,\n\t\t\tActions:       eventState,\n\t\t\tEventMetadata: metadata,\n\t\t\tErrorCode:     event.ErrorCode,\n\t\t\tErrorMessage:  event.ErrorMessage,\n\t\t},\n\t})\n\tif err != nil {\n\t\treturn fmt.Errorf(\"error appending event: %w\", err)\n\t}\n\n\treturn nil\n}\n\nfunc (c *vertexAiClient) listSessionEvents(ctx context.Context, appName, sessionID string, after time.Time, numRecentEvents int) ([]*session.Event, error) {\n\treasoningEngine, err := c.getReasoningEngineID(appName)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tevents := make([]*session.Event, 0)\n\teventsRpcReq := &aiplatformpb.ListEventsRequest{\n\t\tParent: sessionNameByID(sessionID, c, reasoningEngine),\n\t}\n\tif !after.IsZero() {\n\t\teventsRpcReq.Filter = fmt.Sprintf(\"timestamp>=%q\", after.Format(\"2006-01-02T15:04:05-07:00\"))\n\t}\n\tit := c.rpcClient.ListEvents(ctx, eventsRpcReq)\n\tfor {\n\t\trpcResp, err := it.Next()\n\t\tif err == iterator.Done {\n\t\t\tbreak\n\t\t}\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"error fetching session events: %w\", err)\n\t\t}\n\n\t\tcontent := aiplatformToGenaiContent(rpcResp)\n\t\tid, err := sessionIdBySessionName(rpcResp.Name)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"error fetching session events: %w\", err)\n\t\t}\n\n\t\tevent := &session.Event{\n\t\t\tID:           id,\n\t\t\tTimestamp:    rpcResp.Timestamp.AsTime(),\n\t\t\tInvocationID: rpcResp.InvocationId,\n\t\t\tAuthor:       rpcResp.Author,\n\t\t\tActions: session.EventActions{\n\t\t\t\tStateDelta: filterNilValues(rpcResp.Actions.StateDelta.AsMap()),\n\t\t\t},\n\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\tContent:      content,\n\t\t\t\tErrorCode:    rpcResp.ErrorCode,\n\t\t\t\tErrorMessage: rpcResp.ErrorMessage,\n\t\t\t},\n\t\t}\n\t\tif rpcResp.EventMetadata != nil {\n\t\t\tevent.Branch = rpcResp.EventMetadata.Branch\n\t\t\tevent.TurnComplete = rpcResp.EventMetadata.TurnComplete\n\t\t\tevent.Partial = rpcResp.EventMetadata.Partial\n\t\t\tevent.Interrupted = rpcResp.EventMetadata.Interrupted\n\t\t\tevent.LongRunningToolIDs = rpcResp.EventMetadata.LongRunningToolIds\n\t\t\tevent.GroundingMetadata = createGroundingMetadata(rpcResp.EventMetadata.GroundingMetadata)\n\t\t\tif rpcResp.EventMetadata.CustomMetadata != nil {\n\t\t\t\tevent.CustomMetadata = rpcResp.EventMetadata.CustomMetadata.AsMap()\n\t\t\t}\n\t\t}\n\t\tevents = append(events, event)\n\t}\n\tif numRecentEvents > 0 {\n\t\tif numRecentEvents > len(events) {\n\t\t\treturn events, nil\n\t\t}\n\t\treturn events[len(events)-numRecentEvents:], nil\n\t}\n\treturn events, nil\n}\n\nfunc sessionIdBySessionName(sn string) (string, error) {\n\tidx := strings.LastIndex(sn, \"/\")\n\tif idx == -1 {\n\t\treturn \"\", fmt.Errorf(\"invalid session name format %q: missing separator '/'\", sn)\n\t}\n\n\tid := sn[idx+1:]\n\tif id == \"\" {\n\t\treturn \"\", fmt.Errorf(\"invalid session name %q: empty session ID\", sn)\n\t}\n\n\treturn id, nil\n}\n\nfunc sessionIDByOperationName(on string) (string, error) {\n\tconst sessionPrefix = \"/sessions/\"\n\tconst opsSuffix = \"/operations/\"\n\n\tidxSession := strings.LastIndex(on, sessionPrefix)\n\tif idxSession == -1 {\n\t\treturn \"\", fmt.Errorf(\"invalid operation name %q: missing %q\", on, sessionPrefix)\n\t}\n\n\t// Calculate where the ID actually begins\n\tidStart := idxSession + len(sessionPrefix)\n\n\tidxOps := strings.LastIndex(on, opsSuffix)\n\tif idxOps == -1 {\n\t\treturn \"\", fmt.Errorf(\"invalid operation name %q: missing %q\", on, opsSuffix)\n\t}\n\n\t// ensure the start comes before the end\n\t// If idStart > idxOps, it means \"/operations/\" appeared before \"/sessions/\"\n\t// or they overlap in a weird way, which would cause a panic on slicing.\n\tif idStart > idxOps {\n\t\treturn \"\", fmt.Errorf(\"invalid operation name %q: structure malformed or segments out of order\", on)\n\t}\n\n\tid := on[idStart:idxOps]\n\tif id == \"\" {\n\t\treturn \"\", fmt.Errorf(\"invalid operation name %q: empty session ID\", on)\n\t}\n\n\treturn id, nil\n}\n\nfunc sessionNameByID(id string, c *vertexAiClient, reasoningEngine string) string {\n\treturn fmt.Sprintf(sessionResourceTemplate, c.projectID, c.location, reasoningEngine, id)\n}\n\n// (?:...) tells Go \"match this, but don't save it in the results array\".\n// We keep the (\\d+) at the end as a capturing group.\nvar reasoningEnginePattern = regexp.MustCompile(`^projects/(?:[a-zA-Z0-9-_]+)/locations/(?:[a-zA-Z0-9-_]+)/reasoningEngines/(\\d+)$`)\n\nfunc (c *vertexAiClient) getReasoningEngineID(appName string) (string, error) {\n\tif c.reasoningEngine != \"\" {\n\t\treturn c.reasoningEngine, nil\n\t}\n\n\t// Check if appName consists only of digits\n\tif _, err := strconv.Atoi(appName); err == nil {\n\t\treturn appName, nil\n\t}\n\n\t// Execute the Regex\n\tmatches := reasoningEnginePattern.FindStringSubmatch(appName)\n\n\t// With non-capturing groups, 'matches' will strictly have 2 elements if successful:\n\t// matches[0]: The full string (e.g., \"projects/my-p/locations/...\")\n\t// matches[1]: The first capturing group (the ID)\n\tif len(matches) < 2 {\n\t\treturn \"\", fmt.Errorf(\"app name %q is not valid. It should be the full ReasoningEngine resource name or the reasoning engine numeric ID\", appName)\n\t}\n\n\treturn matches[1], nil\n}\n\nfunc aiplatformToGenaiContent(rpcResp *aiplatformpb.SessionEvent) *genai.Content {\n\t// TODO add logic for other types of parts\n\tvar content *genai.Content\n\tif rpcResp.Content != nil {\n\t\tvar parts []*genai.Part\n\t\trole := rpcResp.Content.Role\n\t\tfor _, respPart := range rpcResp.Content.Parts {\n\t\t\tpart := &genai.Part{}\n\t\t\tpart.Thought = respPart.Thought\n\t\t\tpart.ThoughtSignature = respPart.ThoughtSignature\n\t\t\tswitch v := respPart.Data.(type) {\n\t\t\tcase *aiplatformpb.Part_Text:\n\t\t\t\tpart.Text = v.Text\n\t\t\tcase *aiplatformpb.Part_InlineData:\n\t\t\t\tpart.InlineData = &genai.Blob{\n\t\t\t\t\tMIMEType: v.InlineData.MimeType,\n\t\t\t\t\tData:     v.InlineData.Data,\n\t\t\t\t}\n\t\t\tcase *aiplatformpb.Part_FunctionCall:\n\t\t\t\targsMap := v.FunctionCall.Args.AsMap() // Converts *structpb.Struct -> map[string]any\n\t\t\t\tpart.FunctionCall = &genai.FunctionCall{\n\t\t\t\t\tName: v.FunctionCall.Name,\n\t\t\t\t\tArgs: argsMap,\n\t\t\t\t}\n\t\t\tcase *aiplatformpb.Part_FunctionResponse:\n\t\t\t\tresponseMap := v.FunctionResponse.Response.AsMap() // Converts *structpb.Struct -> map[string]any\n\t\t\t\tpart.FunctionResponse = &genai.FunctionResponse{\n\t\t\t\t\tName:     v.FunctionResponse.Name,\n\t\t\t\t\tResponse: responseMap,\n\t\t\t\t}\n\t\t\t}\n\t\t\tparts = append(parts, part)\n\t\t}\n\t\tcontent = &genai.Content{\n\t\t\tParts: parts,\n\t\t\tRole:  role,\n\t\t}\n\t}\n\treturn content\n}\n\nfunc createAiplatformpbContent(event *session.Event) (*aiplatformpb.Content, error) {\n\t// TODO add logic for other types of parts\n\tvar content *aiplatformpb.Content\n\tif event.Content != nil {\n\t\tparts := make([]*aiplatformpb.Part, 0)\n\t\tfor _, part := range event.Content.Parts {\n\t\t\taiplatformPart := &aiplatformpb.Part{}\n\t\t\taiplatformPart.Thought = part.Thought\n\t\t\taiplatformPart.ThoughtSignature = part.ThoughtSignature\n\t\t\tif part.Text != \"\" {\n\t\t\t\taiplatformPart.Data = &aiplatformpb.Part_Text{Text: part.Text}\n\t\t\t}\n\t\t\tif part.InlineData != nil {\n\t\t\t\taiplatformPart.Data = &aiplatformpb.Part_InlineData{\n\t\t\t\t\tInlineData: &aiplatformpb.Blob{\n\t\t\t\t\t\tData:     part.InlineData.Data,\n\t\t\t\t\t\tMimeType: part.InlineData.MIMEType,\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t}\n\t\t\tif part.FunctionCall != nil {\n\t\t\t\targs, err := structpb.NewStruct(part.FunctionCall.Args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, fmt.Errorf(\"failed to convert function call to structpb: %w\", err)\n\t\t\t\t}\n\t\t\t\taiplatformPart.Data = &aiplatformpb.Part_FunctionCall{\n\t\t\t\t\tFunctionCall: &aiplatformpb.FunctionCall{\n\t\t\t\t\t\tId:   part.FunctionCall.ID,\n\t\t\t\t\t\tName: part.FunctionCall.Name,\n\t\t\t\t\t\tArgs: args,\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t}\n\t\t\tif part.FunctionResponse != nil {\n\t\t\t\tresponse, err := structpb.NewStruct(part.FunctionResponse.Response)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, fmt.Errorf(\"failed to convert function response to structpb: %w\", err)\n\t\t\t\t}\n\t\t\t\taiplatformPart.Data = &aiplatformpb.Part_FunctionResponse{\n\t\t\t\t\tFunctionResponse: &aiplatformpb.FunctionResponse{\n\t\t\t\t\t\tId:       part.FunctionResponse.ID,\n\t\t\t\t\t\tName:     part.FunctionResponse.Name,\n\t\t\t\t\t\tResponse: response,\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t}\n\t\t\tparts = append(parts, aiplatformPart)\n\t\t}\n\t\tcontent = &aiplatformpb.Content{\n\t\t\tParts: parts,\n\t\t\tRole:  event.Content.Role,\n\t\t}\n\t}\n\treturn content, nil\n}\n\nfunc createAiplatformpbMetadata(event *session.Event) (*aiplatformpb.EventMetadata, error) {\n\tif event == nil {\n\t\treturn nil, nil\n\t}\n\tmetadata := &aiplatformpb.EventMetadata{\n\t\tPartial:            event.Partial,\n\t\tTurnComplete:       event.TurnComplete,\n\t\tInterrupted:        event.Interrupted,\n\t\tLongRunningToolIds: event.LongRunningToolIDs,\n\t\tBranch:             event.Branch,\n\t}\n\tif event.CustomMetadata != nil {\n\t\tcustomMetadata, err := structpb.NewStruct(event.CustomMetadata)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"failed to convert event customMetadata to structpb: %w\", err)\n\t\t}\n\t\tmetadata.CustomMetadata = customMetadata\n\t}\n\tif event.GroundingMetadata != nil {\n\t\tmetadata.GroundingMetadata = &aiplatformpb.GroundingMetadata{\n\t\t\tWebSearchQueries:             event.GroundingMetadata.WebSearchQueries,\n\t\t\tRetrievalQueries:             event.GroundingMetadata.RetrievalQueries,\n\t\t\tGoogleMapsWidgetContextToken: &event.GroundingMetadata.GoogleMapsWidgetContextToken,\n\t\t}\n\t\tif event.GroundingMetadata.SearchEntryPoint != nil {\n\t\t\tmetadata.GroundingMetadata.SearchEntryPoint = &aiplatformpb.SearchEntryPoint{\n\t\t\t\tRenderedContent: event.GroundingMetadata.SearchEntryPoint.RenderedContent,\n\t\t\t\tSdkBlob:         event.GroundingMetadata.SearchEntryPoint.SDKBlob,\n\t\t\t}\n\t\t}\n\t\tif event.GroundingMetadata.RetrievalMetadata != nil {\n\t\t\tmetadata.GroundingMetadata.RetrievalMetadata = &aiplatformpb.RetrievalMetadata{\n\t\t\t\tGoogleSearchDynamicRetrievalScore: event.GroundingMetadata.RetrievalMetadata.GoogleSearchDynamicRetrievalScore,\n\t\t\t}\n\t\t}\n\t\tvar groundingChunks []*aiplatformpb.GroundingChunk\n\t\tfor _, gc := range event.GroundingMetadata.GroundingChunks {\n\t\t\tif gc.Maps != nil {\n\t\t\t\tmaps := &aiplatformpb.GroundingChunk_Maps{\n\t\t\t\t\tUri:     &gc.Maps.URI,\n\t\t\t\t\tTitle:   &gc.Maps.Title,\n\t\t\t\t\tText:    &gc.Maps.Text,\n\t\t\t\t\tPlaceId: &gc.Maps.PlaceID,\n\t\t\t\t}\n\t\t\t\tif gc.Maps.PlaceAnswerSources != nil {\n\t\t\t\t\tvar reviewSnippets []*aiplatformpb.GroundingChunk_Maps_PlaceAnswerSources_ReviewSnippet\n\t\t\t\t\tfor _, source := range gc.Maps.PlaceAnswerSources.ReviewSnippets {\n\t\t\t\t\t\tsnippet := &aiplatformpb.GroundingChunk_Maps_PlaceAnswerSources_ReviewSnippet{\n\t\t\t\t\t\t\tReviewId:      source.Review,\n\t\t\t\t\t\t\tGoogleMapsUri: source.GoogleMapsURI,\n\t\t\t\t\t\t\tTitle:         source.Title,\n\t\t\t\t\t\t}\n\t\t\t\t\t\treviewSnippets = append(reviewSnippets, snippet)\n\t\t\t\t\t}\n\t\t\t\t\tmaps.PlaceAnswerSources = &aiplatformpb.GroundingChunk_Maps_PlaceAnswerSources{\n\t\t\t\t\t\tReviewSnippets: reviewSnippets,\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\taiplGc := &aiplatformpb.GroundingChunk{\n\t\t\t\t\tChunkType: &aiplatformpb.GroundingChunk_Maps_{\n\t\t\t\t\t\tMaps: maps,\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t\tgroundingChunks = append(groundingChunks, aiplGc)\n\t\t\t}\n\t\t\tif gc.RetrievedContext != nil {\n\t\t\t\tretrievedContext := &aiplatformpb.GroundingChunk_RetrievedContext{\n\t\t\t\t\tUri:          &gc.RetrievedContext.URI,\n\t\t\t\t\tTitle:        &gc.RetrievedContext.Title,\n\t\t\t\t\tText:         &gc.RetrievedContext.Text,\n\t\t\t\t\tDocumentName: &gc.RetrievedContext.DocumentName,\n\t\t\t\t}\n\t\t\t\tif gc.RetrievedContext.RAGChunk != nil && gc.RetrievedContext.RAGChunk.PageSpan != nil {\n\t\t\t\t\tretrievedContext.ContextDetails = &aiplatformpb.GroundingChunk_RetrievedContext_RagChunk{\n\t\t\t\t\t\tRagChunk: &aiplatformpb.RagChunk{\n\t\t\t\t\t\t\tText: gc.RetrievedContext.RAGChunk.Text,\n\t\t\t\t\t\t\tPageSpan: &aiplatformpb.RagChunk_PageSpan{\n\t\t\t\t\t\t\t\tFirstPage: gc.RetrievedContext.RAGChunk.PageSpan.FirstPage,\n\t\t\t\t\t\t\t\tLastPage:  gc.RetrievedContext.RAGChunk.PageSpan.LastPage,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\taiplGc := &aiplatformpb.GroundingChunk{\n\t\t\t\t\tChunkType: &aiplatformpb.GroundingChunk_RetrievedContext_{\n\t\t\t\t\t\tRetrievedContext: retrievedContext,\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t\tgroundingChunks = append(groundingChunks, aiplGc)\n\t\t\t}\n\t\t\tif gc.Web != nil {\n\t\t\t\tweb := &aiplatformpb.GroundingChunk_Web{\n\t\t\t\t\tUri:   &gc.Web.URI,\n\t\t\t\t\tTitle: &gc.Web.Title,\n\t\t\t\t}\n\t\t\t\taiplGc := &aiplatformpb.GroundingChunk{\n\t\t\t\t\tChunkType: &aiplatformpb.GroundingChunk_Web_{\n\t\t\t\t\t\tWeb: web,\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t\tgroundingChunks = append(groundingChunks, aiplGc)\n\t\t\t}\n\t\t}\n\t\tmetadata.GroundingMetadata.GroundingChunks = groundingChunks\n\n\t\tvar groundingSupports []*aiplatformpb.GroundingSupport\n\t\tfor _, gs := range event.GroundingMetadata.GroundingSupports {\n\t\t\taiplGs := &aiplatformpb.GroundingSupport{\n\t\t\t\tGroundingChunkIndices: gs.GroundingChunkIndices,\n\t\t\t\tConfidenceScores:      gs.ConfidenceScores,\n\t\t\t}\n\t\t\tif gs.Segment != nil {\n\t\t\t\taiplGs.Segment = &aiplatformpb.Segment{\n\t\t\t\t\tPartIndex:  gs.Segment.PartIndex,\n\t\t\t\t\tStartIndex: gs.Segment.StartIndex,\n\t\t\t\t\tEndIndex:   gs.Segment.EndIndex,\n\t\t\t\t\tText:       gs.Segment.Text,\n\t\t\t\t}\n\t\t\t}\n\t\t\tgroundingSupports = append(groundingSupports, aiplGs)\n\t\t}\n\t\tmetadata.GroundingMetadata.GroundingSupports = groundingSupports\n\t}\n\treturn metadata, nil\n}\n\nfunc createGroundingMetadata(metadata *aiplatformpb.GroundingMetadata) *genai.GroundingMetadata {\n\tif metadata == nil {\n\t\treturn nil\n\t}\n\n\tout := &genai.GroundingMetadata{\n\t\tWebSearchQueries: metadata.WebSearchQueries,\n\t\tRetrievalQueries: metadata.RetrievalQueries,\n\t}\n\n\t// Handle string pointer for Context Token\n\tout.GoogleMapsWidgetContextToken = derefString(metadata.GoogleMapsWidgetContextToken)\n\n\t// Search Entry Point\n\tif metadata.SearchEntryPoint != nil {\n\t\tout.SearchEntryPoint = &genai.SearchEntryPoint{\n\t\t\tRenderedContent: metadata.SearchEntryPoint.RenderedContent,\n\t\t\tSDKBlob:         metadata.SearchEntryPoint.SdkBlob,\n\t\t}\n\t}\n\n\t// Retrieval Metadata\n\tif metadata.RetrievalMetadata != nil {\n\t\tout.RetrievalMetadata = &genai.RetrievalMetadata{\n\t\t\tGoogleSearchDynamicRetrievalScore: metadata.RetrievalMetadata.GoogleSearchDynamicRetrievalScore,\n\t\t}\n\t}\n\n\t// Grounding Chunks\n\tif len(metadata.GroundingChunks) > 0 {\n\t\tvar chunks []*genai.GroundingChunk\n\t\tfor _, chunk := range metadata.GroundingChunks {\n\t\t\tnewChunk := &genai.GroundingChunk{}\n\n\t\t\t// Handle 'Maps' Chunk\n\t\t\tif maps := chunk.GetMaps(); maps != nil {\n\t\t\t\tnewMaps := &genai.GroundingChunkMaps{\n\t\t\t\t\tURI:     derefString(maps.Uri),\n\t\t\t\t\tTitle:   derefString(maps.Title),\n\t\t\t\t\tText:    derefString(maps.Text),\n\t\t\t\t\tPlaceID: derefString(maps.PlaceId),\n\t\t\t\t}\n\n\t\t\t\tif maps.PlaceAnswerSources != nil {\n\t\t\t\t\tnewMaps.PlaceAnswerSources = &genai.GroundingChunkMapsPlaceAnswerSources{}\n\t\t\t\t\tfor _, snippet := range maps.PlaceAnswerSources.ReviewSnippets {\n\t\t\t\t\t\tnewSnippet := &genai.GroundingChunkMapsPlaceAnswerSourcesReviewSnippet{\n\t\t\t\t\t\t\tReview:        snippet.ReviewId,\n\t\t\t\t\t\t\tGoogleMapsURI: snippet.GoogleMapsUri,\n\t\t\t\t\t\t}\n\t\t\t\t\t\tnewMaps.PlaceAnswerSources.ReviewSnippets = append(newMaps.PlaceAnswerSources.ReviewSnippets, newSnippet)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tnewChunk.Maps = newMaps\n\t\t\t}\n\n\t\t\t// Handle 'RetrievedContext' Chunk\n\t\t\tif rc := chunk.GetRetrievedContext(); rc != nil {\n\t\t\t\tnewRC := &genai.GroundingChunkRetrievedContext{\n\t\t\t\t\tURI:          derefString(rc.Uri),\n\t\t\t\t\tTitle:        derefString(rc.Title),\n\t\t\t\t\tText:         derefString(rc.Text),\n\t\t\t\t\tDocumentName: derefString(rc.DocumentName),\n\t\t\t\t}\n\n\t\t\t\t// Handle RAG Chunk (oneof in pb, usually a nested struct in genai)\n\t\t\t\tif rag := rc.GetRagChunk(); rag != nil {\n\t\t\t\t\tnewRC.RAGChunk = &genai.RAGChunk{\n\t\t\t\t\t\tText: rag.Text,\n\t\t\t\t\t}\n\t\t\t\t\tif rag.PageSpan != nil {\n\t\t\t\t\t\tnewRC.RAGChunk.PageSpan = &genai.RAGChunkPageSpan{\n\t\t\t\t\t\t\tFirstPage: rag.PageSpan.FirstPage,\n\t\t\t\t\t\t\tLastPage:  rag.PageSpan.LastPage,\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tnewChunk.RetrievedContext = newRC\n\t\t\t}\n\n\t\t\t// Handle 'Web' Chunk\n\t\t\tif web := chunk.GetWeb(); web != nil {\n\t\t\t\tnewChunk.Web = &genai.GroundingChunkWeb{\n\t\t\t\t\tURI:   derefString(web.Uri),\n\t\t\t\t\tTitle: derefString(web.Title),\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tchunks = append(chunks, newChunk)\n\t\t}\n\t\tout.GroundingChunks = chunks\n\t}\n\n\t// Grounding Supports\n\tif len(metadata.GroundingSupports) > 0 {\n\t\tvar supports []*genai.GroundingSupport\n\t\tfor _, gs := range metadata.GroundingSupports {\n\t\t\tnewSupport := &genai.GroundingSupport{\n\t\t\t\tGroundingChunkIndices: gs.GroundingChunkIndices,\n\t\t\t\tConfidenceScores:      gs.ConfidenceScores,\n\t\t\t}\n\n\t\t\tif gs.Segment != nil {\n\t\t\t\tnewSupport.Segment = &genai.Segment{\n\t\t\t\t\tPartIndex:  gs.Segment.PartIndex,\n\t\t\t\t\tStartIndex: gs.Segment.StartIndex,\n\t\t\t\t\tEndIndex:   gs.Segment.EndIndex,\n\t\t\t\t\tText:       gs.Segment.Text,\n\t\t\t\t}\n\t\t\t}\n\t\t\tsupports = append(supports, newSupport)\n\t\t}\n\t\tout.GroundingSupports = supports\n\t}\n\n\treturn out\n}\n\n// derefString is a helper to safely dereference string pointers\n// Returns empty string if pointer is nil\nfunc derefString(s *string) string {\n\tif s == nil {\n\t\treturn \"\"\n\t}\n\treturn *s\n}\n"
  },
  {
    "path": "session/vertexai/vertexai_test.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage vertexai\n\nimport (\n\t\"testing\"\n)\n\nfunc TestGetReasoningEngineID(t *testing.T) {\n\ttests := []struct {\n\t\tname             string\n\t\texistingEngineID string // Field: c.reasoningEngine\n\t\tinputAppName     string // Argument: appName\n\t\texpectedID       string\n\t\texpectError      bool\n\t}{\n\t\t{\n\t\t\tname:             \"Client already has engine ID configured\",\n\t\t\texistingEngineID: \"999\",\n\t\t\tinputAppName:     \"irrelevant-input\",\n\t\t\texpectedID:       \"999\",\n\t\t\texpectError:      false,\n\t\t},\n\t\t{\n\t\t\tname:             \"Input is a direct numeric ID\",\n\t\t\texistingEngineID: \"\",\n\t\t\tinputAppName:     \"123456\",\n\t\t\texpectedID:       \"123456\",\n\t\t\texpectError:      false,\n\t\t},\n\t\t{\n\t\t\tname:             \"Input is a valid full resource path\",\n\t\t\texistingEngineID: \"\",\n\t\t\tinputAppName:     \"projects/my-project/locations/us-central1/reasoningEngines/555123\",\n\t\t\texpectedID:       \"555123\",\n\t\t\texpectError:      false,\n\t\t},\n\t\t{\n\t\t\tname:             \"Input is valid path with dashes and underscores in project/location\",\n\t\t\texistingEngineID: \"\",\n\t\t\tinputAppName:     \"projects/my_project-1/locations/us_central-1/reasoningEngines/888\",\n\t\t\texpectedID:       \"888\",\n\t\t\texpectError:      false,\n\t\t},\n\t\t{\n\t\t\tname:             \"Input is malformed (ID is not numeric)\",\n\t\t\texistingEngineID: \"\",\n\t\t\tinputAppName:     \"projects/proj/locations/loc/reasoningEngines/abc\",\n\t\t\texpectedID:       \"\",\n\t\t\texpectError:      true,\n\t\t},\n\t\t{\n\t\t\tname:             \"Input is malformed (missing path components)\",\n\t\t\texistingEngineID: \"\",\n\t\t\tinputAppName:     \"locations/us-central1/reasoningEngines/123\",\n\t\t\texpectedID:       \"\",\n\t\t\texpectError:      true,\n\t\t},\n\t\t{\n\t\t\tname:             \"Input is random text\",\n\t\t\texistingEngineID: \"\",\n\t\t\tinputAppName:     \"some-random-app-name\",\n\t\t\texpectedID:       \"\",\n\t\t\texpectError:      true,\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\t// Setup the client with the test case state\n\t\t\tc := &vertexAiClient{\n\t\t\t\treasoningEngine: tt.existingEngineID,\n\t\t\t}\n\n\t\t\t// Execute\n\t\t\tgot, err := c.getReasoningEngineID(tt.inputAppName)\n\n\t\t\t// Check Error Expectation\n\t\t\tif (err != nil) != tt.expectError {\n\t\t\t\tt.Errorf(\"getReasoningEngineID() error = %v, expectError %v\", err, tt.expectError)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// Check Returned Value\n\t\t\tif got != tt.expectedID {\n\t\t\t\tt.Errorf(\"getReasoningEngineID() got = %v, want %v\", got, tt.expectedID)\n\t\t\t}\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "telemetry/config.go",
    "content": "// Copyright 2026 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Package telemetry implements the open telemetry in ADK.\npackage telemetry\n\nimport (\n\tsdklog \"go.opentelemetry.io/otel/sdk/log\"\n\t\"go.opentelemetry.io/otel/sdk/resource\"\n\tsdktrace \"go.opentelemetry.io/otel/sdk/trace\"\n\t\"golang.org/x/oauth2/google\"\n)\n\ntype config struct {\n\t// Enables/disables telemetry export to GCP.\n\toTelToCloud bool\n\n\t// genAICaptureMessageContent enables/disables logging of message content. The default value is taken from OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT env variable.\n\t// If set to true, the message content will be logged in message body. Otherwise it will be elided.\n\tgenAICaptureMessageContent bool\n\n\t// gcpResourceProject is used as the gcp.project.id resource attribute.\n\t// If it's empty, the project will be read from ADC or GOOGLE_CLOUD_PROJECT env variable.\n\tgcpResourceProject string\n\n\t// gcpQuotaProject is used as the quota project for the telemetry export.\n\t// If it's empty, the project will be read from ADC or GOOGLE_CLOUD_PROJECT env variable.\n\tgcpQuotaProject string\n\n\t// googleCredentials override the application default credentials.\n\tgoogleCredentials *google.Credentials\n\n\t// resource customizes the OTel resource. It will be merged with default detectors.\n\tresource *resource.Resource\n\n\t// spanProcessors registers additional span processors, e.g. for custom span exporters.\n\tspanProcessors []sdktrace.SpanProcessor\n\n\t// logProcessors registers additional log processors, e.g. for custom log exporters.\n\tlogProcessors []sdklog.Processor\n\n\t// tracerProvider overrides the default TracerProvider.\n\ttracerProvider *sdktrace.TracerProvider\n\n\t// loggerProvider overrides the default LoggerProvider.\n\tloggerProvider *sdklog.LoggerProvider\n}\n\n// Option configures adk telemetry.\ntype Option interface {\n\tapply(*config) error\n}\n\ntype optionFunc func(*config) error\n\nfunc (fn optionFunc) apply(cfg *config) error {\n\treturn fn(cfg)\n}\n\n// WithOtelToCloud enables/disables exporting telemetry to GCP.\nfunc WithOtelToCloud(value bool) Option {\n\treturn optionFunc(func(cfg *config) error {\n\t\tcfg.oTelToCloud = value\n\t\treturn nil\n\t})\n}\n\n// WithGcpResourceProject sets the gcp.project.id resource attribute.\nfunc WithGcpResourceProject(project string) Option {\n\treturn optionFunc(func(cfg *config) error {\n\t\tcfg.gcpResourceProject = project\n\t\treturn nil\n\t})\n}\n\n// WithGcpQuotaProject sets the quota project for the telemetry export.\nfunc WithGcpQuotaProject(projectID string) Option {\n\treturn optionFunc(func(cfg *config) error {\n\t\tcfg.gcpQuotaProject = projectID\n\t\treturn nil\n\t})\n}\n\n// WithResource configures the OTel resource.\nfunc WithResource(r *resource.Resource) Option {\n\treturn optionFunc(func(cfg *config) error {\n\t\tcfg.resource = r\n\t\treturn nil\n\t})\n}\n\n// WithGoogleCredentials overrides the application default credentials.\nfunc WithGoogleCredentials(c *google.Credentials) Option {\n\treturn optionFunc(func(cfg *config) error {\n\t\tcfg.googleCredentials = c\n\t\treturn nil\n\t})\n}\n\n// WithSpanProcessors registers additional span processors.\nfunc WithSpanProcessors(p ...sdktrace.SpanProcessor) Option {\n\treturn optionFunc(func(cfg *config) error {\n\t\tcfg.spanProcessors = append(cfg.spanProcessors, p...)\n\t\treturn nil\n\t})\n}\n\n// WithLogRecordProcessors registers additional log processors.\nfunc WithLogRecordProcessors(p ...sdklog.Processor) Option {\n\treturn optionFunc(func(cfg *config) error {\n\t\tcfg.logProcessors = append(cfg.logProcessors, p...)\n\t\treturn nil\n\t})\n}\n\n// WithTracerProvider overrides the default TracerProvider with preconfigured instance.\nfunc WithTracerProvider(tp *sdktrace.TracerProvider) Option {\n\treturn optionFunc(func(cfg *config) error {\n\t\tcfg.tracerProvider = tp\n\t\treturn nil\n\t})\n}\n\n// WithLoggerProvider overrides the default LoggerProvider with preconfigured instance.\nfunc WithLoggerProvider(lp *sdklog.LoggerProvider) Option {\n\treturn optionFunc(func(cfg *config) error {\n\t\tcfg.loggerProvider = lp\n\t\treturn nil\n\t})\n}\n\n// WithGenAICaptureMessageContent overrides the default [config.genAICaptureMessageContent].\nfunc WithGenAICaptureMessageContent(capture bool) Option {\n\treturn optionFunc(func(cfg *config) error {\n\t\tcfg.genAICaptureMessageContent = capture\n\t\treturn nil\n\t})\n}\n"
  },
  {
    "path": "telemetry/setup_otel.go",
    "content": "// Copyright 2026 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage telemetry\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"os\"\n\t\"strings\"\n\n\t\"go.opentelemetry.io/contrib/detectors/gcp\"\n\t\"go.opentelemetry.io/otel/attribute\"\n\t\"go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp\"\n\t\"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp\"\n\tsdklog \"go.opentelemetry.io/otel/sdk/log\"\n\t\"go.opentelemetry.io/otel/sdk/resource\"\n\tsdktrace \"go.opentelemetry.io/otel/sdk/trace\"\n\t\"golang.org/x/oauth2\"\n\t\"golang.org/x/oauth2/google\"\n)\n\nfunc configure(ctx context.Context, opts ...Option) (*config, error) {\n\tcfg, err := configFromOpts(opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tif cfg.oTelToCloud {\n\t\t// Load ADC if no credentials are provided in the config.\n\t\tif cfg.googleCredentials == nil {\n\t\t\tcfg.googleCredentials, err = google.FindDefaultCredentials(ctx, \"https://www.googleapis.com/auth/cloud-platform\")\n\t\t\tif err != nil {\n\t\t\t\treturn nil, fmt.Errorf(\"failed to find default credentials: %w\", err)\n\t\t\t}\n\t\t}\n\t\tquotaProject, err := resolveGcpQuotaProject(cfg)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"failed to resolve GCP quota project: %w\", err)\n\t\t}\n\t\tcfg.gcpQuotaProject = quotaProject\n\t\tresourceProject, err := resolveGcpResourceProject(cfg)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"failed to resolve GCP resource project: %w\", err)\n\t\t}\n\t\tcfg.gcpResourceProject = resourceProject\n\t}\n\n\tcfg.resource, err = resolveResource(ctx, cfg)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to resolve resource: %w\", err)\n\t}\n\n\tspanProcessors, logProcessors, err := configureExporters(ctx, cfg)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to configure exporters: %w\", err)\n\t}\n\tcfg.spanProcessors = append(cfg.spanProcessors, spanProcessors...)\n\tcfg.logProcessors = append(cfg.logProcessors, logProcessors...)\n\treturn cfg, nil\n}\n\nfunc configFromOpts(opts ...Option) (*config, error) {\n\tcfg := &config{\n\t\tgenAICaptureMessageContent: strings.TrimSpace(os.Getenv(\"OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT\")) == \"true\",\n\t}\n\n\tfor _, opt := range opts {\n\t\tif err := opt.apply(cfg); err != nil {\n\t\t\treturn nil, fmt.Errorf(\"failed to apply option: %w\", err)\n\t\t}\n\t}\n\treturn cfg, nil\n}\n\nfunc newInternal(cfg *config) (*Providers, error) {\n\ttp := initTracerProvider(cfg)\n\tlp := initLoggerProvider(cfg)\n\n\t// TODO(#479) init meter provider\n\n\treturn &Providers{\n\t\tTracerProvider:             tp,\n\t\tgenAICaptureMessageContent: cfg.genAICaptureMessageContent,\n\t\tLoggerProvider:             lp,\n\t}, nil\n}\n\n// resolveGcpQuotaProject determines the quota project for telemetry export in the following order:\n// 1. config.gcpQuotaProject, if present.\n// 2. Project ID from credentials, if present.\n// 3. GOOGLE_CLOUD_PROJECT environment variable.\n// Returns the quota project or error if the quota project cannot be determined.\nfunc resolveGcpQuotaProject(cfg *config) (string, error) {\n\treturn resolveProject(cfg.gcpQuotaProject, cfg.googleCredentials, cfg.oTelToCloud, \"quota\")\n}\n\n// resolveGcpResourceProject determines the resource project for telemetry export in the following order:\n// 1. config.gcpResourceProject, if present.\n// 2. Project ID from credentials, if present.\n// 3. GOOGLE_CLOUD_PROJECT environment variable.\n// Returns the resource project or error if the resource project cannot be determined.\nfunc resolveGcpResourceProject(cfg *config) (string, error) {\n\treturn resolveProject(cfg.gcpResourceProject, cfg.googleCredentials, cfg.oTelToCloud, \"resource\")\n}\n\nfunc resolveProject(configuredProject string, creds *google.Credentials, requireProject bool, projectType string) (string, error) {\n\tconfiguredProject = strings.TrimSpace(configuredProject)\n\tif configuredProject != \"\" {\n\t\treturn configuredProject, nil\n\t}\n\tif creds != nil && creds.ProjectID != \"\" {\n\t\treturn creds.ProjectID, nil\n\t}\n\t// The project was always empty during testing, even though it was set in ADC JSON file.\n\t// Using fallback to env variable to resolve the project as a workaround.\n\tproject := strings.TrimSpace(os.Getenv(\"GOOGLE_CLOUD_PROJECT\"))\n\tif requireProject && project == \"\" {\n\t\treturn \"\", fmt.Errorf(\"telemetry.googleapis.com requires setting the %s project. Refer to telemetry.config for the available options to set the %s project\", projectType, projectType)\n\t}\n\treturn project, nil\n}\n\n// resolveResource creates a new resource with attributes specified in the following order (later attributes override earlier ones):\n//  1. [resource.Default()] populates the resource labels from environment variables like OTEL_SERVICE_NAME and OTEL_RESOURCE_ATTRIBUTES.\n//  2. GCP related attributes when otelToCloud is enabled or gcpResourceProject is set - `gcp.project_id` attribute needed by Cloud Trace and other attributes provided by [gcp.NewDetector()].\n//  3. GCP detector adds runtime attributes if ADK runs on one of supported platforms (e.g. GCE, GKE, CloudRun).\n//  4. Resource from config, if present.\nfunc resolveResource(ctx context.Context, cfg *config) (*resource.Resource, error) {\n\tr := resource.Default()\n\n\topts := []resource.Option{\n\t\tresource.WithAttributes(\n\t\t\tattribute.Key(\"gcp.project_id\").String(cfg.gcpResourceProject),\n\t\t),\n\t}\n\tif cfg.oTelToCloud {\n\t\t// Add GCP specific detectors.\n\t\topts = append(opts, resource.WithDetectors(gcp.NewDetector()))\n\t}\n\tvar err error\n\tgcpResource, err := resource.New(ctx, opts...)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to create GCP resource: %w\", err)\n\t}\n\t// Merge with the default resource.\n\tr, err = resource.Merge(r, gcpResource)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to merge default and GCP resources: %w\", err)\n\t}\n\t// Lastly, merge with the resource from config.\n\tif cfg.resource != nil {\n\t\tr, err = resource.Merge(r, cfg.resource)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"failed to merge with config resource: %w\", err)\n\t\t}\n\t}\n\treturn r, nil\n}\n\n// configureExporters initializes OTel exporters from environment variables and otelToCloud.\nfunc configureExporters(ctx context.Context, cfg *config) ([]sdktrace.SpanProcessor, []sdklog.Processor, error) {\n\tvar spanProcessors []sdktrace.SpanProcessor\n\tvar logProcessors []sdklog.Processor\n\n\totelEndpointEnv := strings.TrimSpace(os.Getenv(\"OTEL_EXPORTER_OTLP_ENDPOINT\"))\n\t// Tracing section.\n\totelTracesEndpointEnv := strings.TrimSpace(os.Getenv(\"OTEL_EXPORTER_OTLP_TRACES_ENDPOINT\"))\n\tif otelEndpointEnv != \"\" || otelTracesEndpointEnv != \"\" {\n\t\texporter, err := otlptracehttp.New(ctx)\n\t\tif err != nil {\n\t\t\treturn nil, nil, fmt.Errorf(\"failed to create OTLP HTTP exporter: %w\", err)\n\t\t}\n\t\tspanProcessors = append(spanProcessors, sdktrace.NewBatchSpanProcessor(\n\t\t\texporter,\n\t\t))\n\t}\n\tif cfg.oTelToCloud {\n\t\tspanExporter, err := newGcpSpanExporter(ctx, cfg)\n\t\tif err != nil {\n\t\t\treturn nil, nil, fmt.Errorf(\"failed to create GCP span exporter: %w\", err)\n\t\t}\n\t\tspanProcessors = append(spanProcessors, sdktrace.NewBatchSpanProcessor(spanExporter))\n\t}\n\t// Logs section.\n\totelLogsEndpointEnv := strings.TrimSpace(os.Getenv(\"OTEL_EXPORTER_OTLP_LOGS_ENDPOINT\"))\n\tif otelEndpointEnv != \"\" || otelLogsEndpointEnv != \"\" {\n\t\texporter, err := otlploghttp.New(ctx)\n\t\tif err != nil {\n\t\t\treturn nil, nil, fmt.Errorf(\"failed to create OTLP HTTP log exporter: %w\", err)\n\t\t}\n\t\tlogProcessors = append(logProcessors, sdklog.NewBatchProcessor(\n\t\t\texporter,\n\t\t))\n\t}\n\t// Golang OTel exporter to CloudLogging is not yet available.\n\treturn spanProcessors, logProcessors, nil\n}\n\nfunc initTracerProvider(cfg *config) *sdktrace.TracerProvider {\n\tif cfg.tracerProvider != nil {\n\t\treturn cfg.tracerProvider\n\t}\n\tif len(cfg.spanProcessors) == 0 {\n\t\treturn nil\n\t}\n\topts := []sdktrace.TracerProviderOption{\n\t\tsdktrace.WithResource(cfg.resource),\n\t}\n\tfor _, p := range cfg.spanProcessors {\n\t\topts = append(opts, sdktrace.WithSpanProcessor(p))\n\t}\n\ttp := sdktrace.NewTracerProvider(opts...)\n\n\treturn tp\n}\n\nfunc initLoggerProvider(cfg *config) *sdklog.LoggerProvider {\n\tif cfg.loggerProvider != nil {\n\t\treturn cfg.loggerProvider\n\t}\n\tif len(cfg.logProcessors) == 0 {\n\t\treturn nil\n\t}\n\topts := []sdklog.LoggerProviderOption{\n\t\tsdklog.WithResource(cfg.resource),\n\t}\n\tfor _, p := range cfg.logProcessors {\n\t\topts = append(opts, sdklog.WithProcessor(p))\n\t}\n\tlp := sdklog.NewLoggerProvider(opts...)\n\n\treturn lp\n}\n\nfunc newGcpSpanExporter(ctx context.Context, cfg *config) (sdktrace.SpanExporter, error) {\n\tclient := oauth2.NewClient(ctx, cfg.googleCredentials.TokenSource)\n\treturn otlptracehttp.New(ctx,\n\t\totlptracehttp.WithHTTPClient(client),\n\t\totlptracehttp.WithEndpointURL(\"https://telemetry.googleapis.com/v1/traces\"),\n\t\t// Pass the quota project id in headers to fix auth errors.\n\t\t// https://cloud.google.com/docs/authentication/adc-troubleshooting/user-creds\n\t\totlptracehttp.WithHeaders(map[string]string{\n\t\t\t\"x-goog-user-project\": cfg.gcpQuotaProject,\n\t\t}))\n}\n"
  },
  {
    "path": "telemetry/telemetry.go",
    "content": "// Copyright 2026 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Package telemetry contains OpenTelemetry related functionality for ADK.\npackage telemetry\n\nimport (\n\t\"context\"\n\t\"errors\"\n\n\tinternal \"google.golang.org/adk/internal/telemetry\"\n\n\t\"go.opentelemetry.io/otel\"\n\tlogglobal \"go.opentelemetry.io/otel/log/global\"\n\tsdklog \"go.opentelemetry.io/otel/sdk/log\"\n\tsdktrace \"go.opentelemetry.io/otel/sdk/trace\"\n)\n\n// Providers wraps all telemetry providers and provides [Shutdown] function.\ntype Providers struct {\n\tgenAICaptureMessageContent bool\n\t// TracerProvider is the configured TracerProvider or nil.\n\tTracerProvider *sdktrace.TracerProvider\n\t// LoggerProvider is the configured LoggerProvider or nil.\n\tLoggerProvider *sdklog.LoggerProvider\n}\n\n// Shutdown shuts down underlying OTel providers.\nfunc (t *Providers) Shutdown(ctx context.Context) error {\n\tvar err error\n\tif t.TracerProvider != nil {\n\t\tif tpErr := t.TracerProvider.Shutdown(ctx); tpErr != nil {\n\t\t\terr = errors.Join(err, tpErr)\n\t\t}\n\t}\n\tif t.LoggerProvider != nil {\n\t\tif lpErr := t.LoggerProvider.Shutdown(ctx); lpErr != nil {\n\t\t\terr = errors.Join(err, lpErr)\n\t\t}\n\t}\n\treturn err\n}\n\n// SetGlobalOtelProviders registers the configured providers as the global OTel providers.\nfunc (t *Providers) SetGlobalOtelProviders() {\n\tinternal.SetGenAICaptureMessageContent(t.genAICaptureMessageContent)\n\tif t.TracerProvider != nil {\n\t\totel.SetTracerProvider(t.TracerProvider)\n\t}\n\tif t.LoggerProvider != nil {\n\t\tlogglobal.SetLoggerProvider(t.LoggerProvider)\n\t}\n}\n\n// New initializes telemetry providers: TraceProvider, LogProvider, and MeterProvider.\n// Options can be used to customize the defaults, e.g. use custom credentials, add SpanProcessors, or use preconfigured TraceProvider.\n// Telemetry providers have to be registered in the global OTel providers either manually or via [Providers.SetGlobalOtelProviders].\n// If your library doesn't use the global providers, you can use the providers directly and pass them to the instrumented libraries.\n//\n// # Usage\n//\n//\t import (\n//\t\t\"context\"\n//\t\t\"log\"\n//\t\t\"time\"\n//\n//\t\t\"go.opentelemetry.io/otel/sdk/resource\"\n//\t\tsemconv \"go.opentelemetry.io/otel/semconv/v1.36.0\"\n//\t\t\"google.golang.org/adk/telemetry\"\n//\t )\n//\n//\t func main() {\n//\t\t\tctx := context.Background()\n//\t\t\tres, err := resource.New(ctx,\n//\t\t\t\tresource.WithAttributes(\n//\t\t\t\t\tsemconv.ServiceNameKey.String(\"my-service\"),\n//\t\t\t\t\tsemconv.ServiceVersionKey.String(\"1.0.0\"),\n//\t\t\t\t),\n//\t\t\t)\n//\t\t\tif err != nil {\n//\t\t\t\tlog.Fatalf(\"failed to create resource: %v\", err)\n//\t\t\t}\n//\n//\t\t\ttelemetryProviders, err := telemetry.New(ctx,\n//\t\t\t\ttelemetry.WithOtelToCloud(true),\n//\t\t\t\ttelemetry.WithResource(res),\n//\t\t\t)\n//\t\t\tif err != nil {\n//\t\t\t\tlog.Fatal(err)\n//\t\t\t}\n//\t\t\tdefer func() {\n//\t\t\t\tshutdownCtx, cancel := context.WithTimeout(context.Background(), 10*time.Second)\n//\t\t\t\tdefer cancel()\n//\t\t\t\tif err := telemetryProviders.Shutdown(shutdownCtx); err != nil {\n//\t\t\t\t\tlog.Printf(\"telemetry shutdown failed: %v\", err)\n//\t\t\t\t}\n//\t\t\t}()\n//\t\t\ttelemetryProviders.SetGlobalOtelProviders()\n//\n//\t\t\ttp := telemetryProviders.TracerProvider\n//\t\t\tinstrumentedlib.SetTracerProvider(tp) // Set TracerProvider manually if your lib doesn't use the global provider.\n//\n//\t\t\t// app code\n//\t\t}\n//\n// The caller must call [Providers.Shutdown] method to gracefully shut down the underlying telemetry and release resources.\nfunc New(ctx context.Context, opts ...Option) (*Providers, error) {\n\tcfg, err := configure(ctx, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn newInternal(cfg)\n}\n"
  },
  {
    "path": "telemetry/telemetry_test.go",
    "content": "// Copyright 2026 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage telemetry\n\nimport (\n\t\"context\"\n\t\"testing\"\n\n\t\"go.opentelemetry.io/otel\"\n\t\"go.opentelemetry.io/otel/log\"\n\tsdklog \"go.opentelemetry.io/otel/sdk/log\"\n\t\"go.opentelemetry.io/otel/sdk/resource\"\n\tsdktrace \"go.opentelemetry.io/otel/sdk/trace\"\n\t\"go.opentelemetry.io/otel/sdk/trace/tracetest\"\n\tsemconv \"go.opentelemetry.io/otel/semconv/v1.36.0\"\n\t\"go.opentelemetry.io/otel/trace\"\n\t\"golang.org/x/oauth2/google\"\n)\n\nconst (\n\tresourceProject = \"resource-project\"\n\tquotaProject    = \"quota-project\"\n)\n\nfunc TestTelemetrySmoke(t *testing.T) {\n\texporter := tracetest.NewInMemoryExporter()\n\tlogExporter := &inMemoryLogExporter{}\n\tctx := t.Context()\n\n\t// Initialize telemetry.\n\tserviceName := \"test-service\"\n\tserviceVersion := \"1.2.3\"\n\tr, err := resource.New(ctx, resource.WithAttributes(\n\t\tsemconv.ServiceNameKey.String(serviceName),\n\t\tsemconv.ServiceVersionKey.String(serviceVersion),\n\t))\n\tif err != nil {\n\t\tt.Fatalf(\"failed to create resource: %v\", err)\n\t}\n\tproviders, err := New(t.Context(),\n\t\tWithSpanProcessors(sdktrace.NewSimpleSpanProcessor(exporter)),\n\t\tWithLogRecordProcessors(sdklog.NewSimpleProcessor(logExporter)),\n\t\tWithGcpResourceProject(resourceProject),\n\t\tWithGcpQuotaProject(quotaProject),\n\t\tWithResource(r),\n\t)\n\tif err != nil {\n\t\tt.Fatalf(\"failed to create telemetry: %v\", err)\n\t}\n\tt.Cleanup(func() {\n\t\tif err := providers.Shutdown(context.WithoutCancel(ctx)); err != nil {\n\t\t\tt.Errorf(\"telemetry.Shutdown() failed: %v\", err)\n\t\t}\n\t})\n\tproviders.SetGlobalOtelProviders()\n\n\t// Create test tracer.\n\ttracer := otel.Tracer(\"test-tracer\")\n\tspanName := \"test-span\"\n\n\t_, span := tracer.Start(ctx, spanName, trace.WithSpanKind(trace.SpanKindServer))\n\tspan.End()\n\n\t// Create test logger and log.\n\tlogger := providers.LoggerProvider.Logger(\"test-logger\")\n\tlogBody := \"test-log\"\n\n\tvar record log.Record\n\trecord.SetBody(log.StringValue(logBody))\n\tlogger.Emit(ctx, record)\n\n\tif err := providers.TracerProvider.ForceFlush(context.Background()); err != nil {\n\t\tt.Fatalf(\"failed to flush spans: %v\", err)\n\t}\n\tif err := providers.LoggerProvider.ForceFlush(context.Background()); err != nil {\n\t\tt.Fatalf(\"failed to flush logs: %v\", err)\n\t}\n\n\t// Check exporter contains the span.\n\tspans := exporter.GetSpans()\n\tif len(spans) != 1 {\n\t\tt.Fatalf(\"got %d spans, want 1\", len(spans))\n\t}\n\tgotSpan := spans[0]\n\tif gotSpan.Name != spanName {\n\t\tt.Errorf(\"got span name %q, want %q\", gotSpan.Name, spanName)\n\t}\n\tgotResourceProject, gotServiceName, gotServiceVersion := extractResourceAttributes(gotSpan.Resource)\n\tif gotResourceProject != resourceProject {\n\t\tt.Errorf(\"want 'gcp.project_id' attribute %q, got %q\", resourceProject, gotResourceProject)\n\t}\n\tif gotServiceName != serviceName {\n\t\tt.Errorf(\"want 'service.name' attribute %q, got %q\", serviceName, gotServiceName)\n\t}\n\tif gotServiceVersion != serviceVersion {\n\t\tt.Errorf(\"want 'service.version' attribute %q, got %q\", serviceVersion, gotServiceVersion)\n\t}\n\n\t// Check exporter contains the log.\n\tif len(logExporter.records) != 1 {\n\t\tt.Fatalf(\"got %d log records, want 1\", len(logExporter.records))\n\t}\n\tgotLog := logExporter.records[0]\n\tif gotLog.Body().AsString() != logBody {\n\t\tt.Errorf(\"got log body %q, want %q\", gotLog.Body().AsString(), logBody)\n\t}\n\n\tif err := providers.Shutdown(context.WithoutCancel(ctx)); err != nil {\n\t\tt.Errorf(\"telemetry.Shutdown() failed: %v\", err)\n\t}\n\tif len(exporter.GetSpans()) != 0 {\n\t\tt.Errorf(\"expected no spans after shutdown, got %d\", len(exporter.GetSpans()))\n\t}\n}\n\nfunc TestTelemetryCustomProvider(t *testing.T) {\n\texporter := tracetest.NewInMemoryExporter()\n\ttp := sdktrace.NewTracerProvider(\n\t\tsdktrace.WithSpanProcessor(sdktrace.NewSimpleSpanProcessor(exporter)),\n\t)\n\tunusedExporter := tracetest.NewInMemoryExporter()\n\tctx := t.Context()\n\n\t// Initialize telemetry with custom provider.\n\tproviders, err := New(t.Context(),\n\t\tWithTracerProvider(tp),\n\t\tWithSpanProcessors(sdktrace.NewSimpleSpanProcessor(unusedExporter)),\n\t)\n\tif err != nil {\n\t\tt.Fatalf(\"failed to create telemetry: %v\", err)\n\t}\n\tt.Cleanup(func() {\n\t\tif err := providers.Shutdown(context.WithoutCancel(ctx)); err != nil {\n\t\t\tt.Errorf(\"telemetry.Shutdown() failed: %v\", err)\n\t\t}\n\t})\n\tproviders.SetGlobalOtelProviders()\n\n\t// Create test tracer and span.\n\ttracer := otel.Tracer(\"test-tracer\")\n\tspanName := \"test-span\"\n\t_, span := tracer.Start(ctx, spanName)\n\tspan.End()\n\n\tif err := providers.TracerProvider.ForceFlush(context.Background()); err != nil {\n\t\tt.Fatalf(\"failed to flush spans: %v\", err)\n\t}\n\n\t// Verify span was exported.\n\tspans := exporter.GetSpans()\n\tif len(spans) != 1 {\n\t\tt.Fatalf(\"got %d spans, want 1\", len(spans))\n\t}\n\tif spans[0].Name != spanName {\n\t\tt.Errorf(\"got span name %q, want %q\", spans[0].Name, spanName)\n\t}\n\n\t// Unused exporter should not have any spans.\n\tif len(unusedExporter.GetSpans()) != 0 {\n\t\tt.Fatalf(\"got %d spans, want 0\", len(unusedExporter.GetSpans()))\n\t}\n}\n\nfunc TestTelemetryCustomLoggerProvider(t *testing.T) {\n\tlogExporter := &inMemoryLogExporter{}\n\tlp := sdklog.NewLoggerProvider(\n\t\tsdklog.WithProcessor(sdklog.NewSimpleProcessor(logExporter)),\n\t)\n\tunusedLogExporter := &inMemoryLogExporter{}\n\tctx := t.Context()\n\n\t// Initialize telemetry with custom logger provider.\n\tproviders, err := New(t.Context(),\n\t\tWithLoggerProvider(lp),\n\t\tWithLogRecordProcessors(sdklog.NewSimpleProcessor(unusedLogExporter)),\n\t)\n\tif err != nil {\n\t\tt.Fatalf(\"failed to create telemetry: %v\", err)\n\t}\n\tt.Cleanup(func() {\n\t\tif err := providers.Shutdown(context.WithoutCancel(ctx)); err != nil {\n\t\t\tt.Errorf(\"telemetry.Shutdown() failed: %v\", err)\n\t\t}\n\t})\n\tproviders.SetGlobalOtelProviders()\n\n\t// Create test logger and emit.\n\tlogger := providers.LoggerProvider.Logger(\"test-logger\")\n\tlogBody := \"test-log\"\n\n\tvar record log.Record\n\trecord.SetBody(log.StringValue(logBody))\n\tlogger.Emit(ctx, record)\n\n\tif err := providers.LoggerProvider.ForceFlush(context.Background()); err != nil {\n\t\tt.Fatalf(\"failed to flush logs: %v\", err)\n\t}\n\n\t// Verify log was exported.\n\tif len(logExporter.records) != 1 {\n\t\tt.Fatalf(\"got %d logs, want 1\", len(logExporter.records))\n\t}\n\tif logExporter.records[0].Body().AsString() != logBody {\n\t\tt.Errorf(\"got log body %q, want %q\", logExporter.records[0].Body().AsString(), logBody)\n\t}\n\n\t// Unused exporter should not have any logs.\n\tif len(unusedLogExporter.records) != 0 {\n\t\tt.Fatalf(\"got %d logs, want 0\", len(unusedLogExporter.records))\n\t}\n}\n\nfunc extractResourceAttributes(res *resource.Resource) (projectID, serviceName, serviceVersion string) {\n\tfor _, attr := range res.Attributes() {\n\t\tswitch attr.Key {\n\t\tcase \"gcp.project_id\":\n\t\t\tprojectID = attr.Value.AsString()\n\t\tcase semconv.ServiceNameKey:\n\t\t\tserviceName = attr.Value.AsString()\n\t\tcase semconv.ServiceVersionKey:\n\t\t\tserviceVersion = attr.Value.AsString()\n\t\t}\n\t}\n\treturn projectID, serviceName, serviceVersion\n}\n\nfunc TestResolveResourceProject(t *testing.T) {\n\ttestCases := []struct {\n\t\tname        string\n\t\topts        []Option\n\t\tenvVar      string\n\t\twantProject string\n\t\twantErr     bool\n\t}{\n\t\t{\n\t\t\tname: \"project from options\",\n\t\t\topts: []Option{\n\t\t\t\tWithOtelToCloud(true),\n\t\t\t\tWithGcpResourceProject(\"option-project\"),\n\t\t\t\tWithGoogleCredentials(&google.Credentials{ProjectID: \"cred-project\"}),\n\t\t\t},\n\t\t\tenvVar:      \"env-project\",\n\t\t\twantProject: \"option-project\",\n\t\t},\n\t\t{\n\t\t\tname: \"project from credentials\",\n\t\t\topts: []Option{\n\t\t\t\tWithOtelToCloud(true),\n\t\t\t\tWithGoogleCredentials(&google.Credentials{ProjectID: \"cred-project\"}),\n\t\t\t},\n\t\t\tenvVar:      \"env-project\",\n\t\t\twantProject: \"cred-project\",\n\t\t},\n\t\t{\n\t\t\tname: \"project from env var\",\n\t\t\topts: []Option{\n\t\t\t\tWithOtelToCloud(true),\n\t\t\t},\n\t\t\tenvVar:      \"env-project\",\n\t\t\twantProject: \"env-project\",\n\t\t},\n\t\t{\n\t\t\tname: \"no project\",\n\t\t\topts: []Option{\n\t\t\t\tWithOtelToCloud(true),\n\t\t\t\tWithGoogleCredentials(&google.Credentials{}),\n\t\t\t},\n\t\t\twantErr: true,\n\t\t},\n\t\t{\n\t\t\tname: \"no project no credentials\",\n\t\t\topts: []Option{\n\t\t\t\tWithOtelToCloud(true),\n\t\t\t},\n\t\t\twantErr: true,\n\t\t},\n\t\t{\n\t\t\tname: \"env var whitespace\",\n\t\t\topts: []Option{\n\t\t\t\tWithOtelToCloud(true),\n\t\t\t\tWithGoogleCredentials(&google.Credentials{}),\n\t\t\t},\n\t\t\tenvVar:  \" \",\n\t\t\twantErr: true,\n\t\t},\n\t\t{\n\t\t\tname: \"option project whitespace\",\n\t\t\topts: []Option{\n\t\t\t\tWithOtelToCloud(true),\n\t\t\t\tWithGcpResourceProject(\" \"),\n\t\t\t},\n\t\t\twantErr: true,\n\t\t},\n\t}\n\n\tfor _, tc := range testCases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t// Always set the environment variable to avoid flakiness from ambient GOOGLE_CLOUD_PROJECT.\n\t\t\tt.Setenv(\"GOOGLE_CLOUD_PROJECT\", tc.envVar)\n\n\t\t\tcfg, err := configFromOpts(tc.opts...)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"configFromOpts() unexpected error: %v\", err)\n\t\t\t}\n\n\t\t\tgotProject, err := resolveGcpResourceProject(cfg)\n\t\t\tif (err != nil) != tc.wantErr {\n\t\t\t\tt.Fatalf(\"resolveGcpResourceProject() error = %v, wantErr %v\", err, tc.wantErr)\n\t\t\t}\n\t\t\tif err != nil {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif gotProject != tc.wantProject {\n\t\t\t\tt.Errorf(\"resolveGcpResourceProject() got = %v, want %v\", gotProject, tc.wantProject)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestResolveQuotaProject(t *testing.T) {\n\ttestCases := []struct {\n\t\tname        string\n\t\topts        []Option\n\t\tenvVar      string\n\t\twantProject string\n\t\twantErr     bool\n\t}{\n\t\t{\n\t\t\tname: \"project from options\",\n\t\t\topts: []Option{\n\t\t\t\tWithOtelToCloud(true),\n\t\t\t\tWithGcpQuotaProject(\"option-project\"),\n\t\t\t\tWithGoogleCredentials(&google.Credentials{ProjectID: \"cred-project\"}),\n\t\t\t},\n\t\t\tenvVar:      \"env-project\",\n\t\t\twantProject: \"option-project\",\n\t\t},\n\t\t{\n\t\t\tname: \"project from credentials\",\n\t\t\topts: []Option{\n\t\t\t\tWithOtelToCloud(true),\n\t\t\t\tWithGoogleCredentials(&google.Credentials{ProjectID: \"cred-project\"}),\n\t\t\t},\n\t\t\tenvVar:      \"env-project\",\n\t\t\twantProject: \"cred-project\",\n\t\t},\n\t\t{\n\t\t\tname: \"project from env var\",\n\t\t\topts: []Option{\n\t\t\t\tWithOtelToCloud(true),\n\t\t\t},\n\t\t\tenvVar:      \"env-project\",\n\t\t\twantProject: \"env-project\",\n\t\t},\n\t\t{\n\t\t\tname: \"no project\",\n\t\t\topts: []Option{\n\t\t\t\tWithOtelToCloud(true),\n\t\t\t\tWithGoogleCredentials(&google.Credentials{}),\n\t\t\t},\n\t\t\twantErr: true,\n\t\t},\n\t\t{\n\t\t\tname: \"no project no credentials\",\n\t\t\topts: []Option{\n\t\t\t\tWithOtelToCloud(true),\n\t\t\t},\n\t\t\twantErr: true,\n\t\t},\n\t\t{\n\t\t\tname: \"no project and otelToCloud disabled\",\n\t\t\topts: []Option{\n\t\t\t\tWithOtelToCloud(false),\n\t\t\t\tWithGoogleCredentials(&google.Credentials{}),\n\t\t\t},\n\t\t\twantProject: \"\",\n\t\t},\n\t\t{\n\t\t\tname: \"env var whitespace\",\n\t\t\topts: []Option{\n\t\t\t\tWithOtelToCloud(true),\n\t\t\t\tWithGoogleCredentials(&google.Credentials{}),\n\t\t\t},\n\t\t\tenvVar:  \" \",\n\t\t\twantErr: true,\n\t\t},\n\t\t{\n\t\t\tname: \"option project whitespace\",\n\t\t\topts: []Option{\n\t\t\t\tWithOtelToCloud(true),\n\t\t\t\tWithGcpQuotaProject(\" \"),\n\t\t\t},\n\t\t\twantErr: true,\n\t\t},\n\t}\n\n\tfor _, tc := range testCases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t// Always set the environment variable to avoid flakiness from ambient GOOGLE_CLOUD_PROJECT.\n\t\t\tt.Setenv(\"GOOGLE_CLOUD_PROJECT\", tc.envVar)\n\n\t\t\tcfg, err := configFromOpts(tc.opts...)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"configFromOpts() unexpected error: %v\", err)\n\t\t\t}\n\n\t\t\tgotProject, err := resolveGcpQuotaProject(cfg)\n\t\t\tif (err != nil) != tc.wantErr {\n\t\t\t\tt.Fatalf(\"resolveGcpQuotaProject() error = %v, wantErr %v\", err, tc.wantErr)\n\t\t\t}\n\t\t\tif err != nil {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif gotProject != tc.wantProject {\n\t\t\t\tt.Errorf(\"resolveGcpQuotaProject() got = %v, want %v\", gotProject, tc.wantProject)\n\t\t\t}\n\t\t})\n\t}\n}\n\ntype inMemoryLogExporter struct {\n\trecords []sdklog.Record\n}\n\nfunc (e *inMemoryLogExporter) Export(_ context.Context, records []sdklog.Record) error {\n\te.records = append(e.records, records...)\n\treturn nil\n}\n\nfunc (e *inMemoryLogExporter) Shutdown(context.Context) error   { return nil }\nfunc (e *inMemoryLogExporter) ForceFlush(context.Context) error { return nil }\n\ntype envVars struct {\n\tOTEL_EXPORTER_OTLP_ENDPOINT        string\n\tOTEL_EXPORTER_OTLP_TRACES_ENDPOINT string\n\tOTEL_EXPORTER_OTLP_LOGS_ENDPOINT   string\n}\n\nfunc TestConfigureExporters(t *testing.T) {\n\ttestCases := []struct {\n\t\tname    string\n\t\tenvVars envVars\n\t\topts    []Option\n\t\t// The client address is nested deep inside the http client of the exporter, which is nested in a processor.\n\t\t// Accessing it via reflection is too brittle. The best thing we can do is a smoke test, which checks the number of created processors.\n\t\twantSpanProcessors int\n\t\twantLogProcessors  int\n\t}{\n\t\t{\n\t\t\tname:               \"no processors\",\n\t\t\tenvVars:            envVars{},\n\t\t\twantSpanProcessors: 0,\n\t\t\twantLogProcessors:  0,\n\t\t},\n\t\t{\n\t\t\tname: \"OTEL_EXPORTER_OTLP_ENDPOINT\",\n\t\t\tenvVars: envVars{\n\t\t\t\tOTEL_EXPORTER_OTLP_ENDPOINT: \"http://localhost:4318\",\n\t\t\t},\n\t\t\twantSpanProcessors: 1,\n\t\t\twantLogProcessors:  1,\n\t\t},\n\t\t{\n\t\t\tname: \"OTEL_EXPORTER_OTLP_TRACES_ENDPOINT\",\n\t\t\tenvVars: envVars{\n\t\t\t\tOTEL_EXPORTER_OTLP_TRACES_ENDPOINT: \"http://localhost:4318/v1/traces\",\n\t\t\t},\n\t\t\twantSpanProcessors: 1,\n\t\t\twantLogProcessors:  0,\n\t\t},\n\t\t{\n\t\t\tname: \"OTEL_EXPORTER_OTLP_LOGS_ENDPOINT\",\n\t\t\tenvVars: envVars{\n\t\t\t\tOTEL_EXPORTER_OTLP_LOGS_ENDPOINT: \"http://localhost:4318/v1/logs\",\n\t\t\t},\n\t\t\twantSpanProcessors: 0,\n\t\t\twantLogProcessors:  1,\n\t\t},\n\t\t{\n\t\t\tname: \"OTEL_EXPORTER_OTLP_ENDPOINT and otel_to_cloud\",\n\t\t\tenvVars: envVars{\n\t\t\t\tOTEL_EXPORTER_OTLP_ENDPOINT: \"http://localhost:4318\",\n\t\t\t},\n\t\t\topts: []Option{\n\t\t\t\tWithOtelToCloud(true),\n\t\t\t\tWithGoogleCredentials(&google.Credentials{ProjectID: \"test-project\"}),\n\t\t\t},\n\t\t\twantSpanProcessors: 2,\n\t\t\twantLogProcessors:  1,\n\t\t},\n\t\t{\n\t\t\tname: \"OTEL_EXPORTER_OTLP_TRACES_ENDPOINT and otel_to_cloud\",\n\t\t\tenvVars: envVars{\n\t\t\t\tOTEL_EXPORTER_OTLP_TRACES_ENDPOINT: \"http://localhost:4318/v1/traces\",\n\t\t\t},\n\t\t\topts: []Option{\n\t\t\t\tWithOtelToCloud(true),\n\t\t\t\tWithGoogleCredentials(&google.Credentials{ProjectID: \"test-project\"}),\n\t\t\t},\n\t\t\twantSpanProcessors: 2,\n\t\t\twantLogProcessors:  0,\n\t\t},\n\t\t{\n\t\t\tname: \"OTEL_EXPORTER_OTLP_LOGS_ENDPOINT and otel_to_cloud\",\n\t\t\tenvVars: envVars{\n\t\t\t\tOTEL_EXPORTER_OTLP_LOGS_ENDPOINT: \"http://localhost:4318/v1/logs\",\n\t\t\t},\n\t\t\topts: []Option{\n\t\t\t\tWithOtelToCloud(true),\n\t\t\t\tWithGoogleCredentials(&google.Credentials{ProjectID: \"test-project\"}),\n\t\t\t},\n\t\t\twantSpanProcessors: 1,\n\t\t\twantLogProcessors:  1,\n\t\t},\n\t}\n\n\tfor _, tc := range testCases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\tt.Setenv(\"OTEL_EXPORTER_OTLP_ENDPOINT\", tc.envVars.OTEL_EXPORTER_OTLP_ENDPOINT)\n\t\t\tt.Setenv(\"OTEL_EXPORTER_OTLP_TRACES_ENDPOINT\", tc.envVars.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT)\n\t\t\tt.Setenv(\"OTEL_EXPORTER_OTLP_LOGS_ENDPOINT\", tc.envVars.OTEL_EXPORTER_OTLP_LOGS_ENDPOINT)\n\t\t\t// Set the quota project needed to configure GCP exporters.\n\t\t\tt.Setenv(\"GOOGLE_CLOUD_PROJECT\", \"test-project\")\n\t\t\tctx := t.Context()\n\t\t\tcfg, err := configure(ctx, tc.opts...)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"configure() unexpected error: %v\", err)\n\t\t\t}\n\t\t\tspanProcessors, logProcessors, err := configureExporters(ctx, cfg)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"configureExporters() unexpected error: %v\", err)\n\t\t\t}\n\t\t\tif len(spanProcessors) != tc.wantSpanProcessors {\n\t\t\t\tt.Errorf(\"got %d span processors, want %d\", len(spanProcessors), tc.wantSpanProcessors)\n\t\t\t}\n\t\t\tif len(logProcessors) != tc.wantLogProcessors {\n\t\t\t\tt.Errorf(\"got %d log processors, want %d\", len(logProcessors), tc.wantLogProcessors)\n\t\t\t}\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "tool/agenttool/agent_tool.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Package agenttool provides a tool that allows an agent to call another agent.\n// This enables composition of agents, which can be useful for scenarios where\n// different types of `genai` tools cannot be used together.\npackage agenttool\n\nimport (\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"strings\"\n\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/agent\"\n\t\"google.golang.org/adk/artifact\"\n\t\"google.golang.org/adk/internal/llminternal\"\n\t\"google.golang.org/adk/internal/toolinternal/toolutils\"\n\t\"google.golang.org/adk/internal/utils\"\n\t\"google.golang.org/adk/memory\"\n\t\"google.golang.org/adk/model\"\n\t\"google.golang.org/adk/runner\"\n\t\"google.golang.org/adk/session\"\n\t\"google.golang.org/adk/tool\"\n)\n\n// agentTool implements a tool that allows an agent to call another agent.\ntype agentTool struct {\n\tagent             agent.Agent\n\tskipSummarization bool\n}\n\n// Config holds the configuration for an agent tool.\ntype Config struct {\n\t// SkipSummarization, if true, will cause the agent to skip summarization\n\t// after the sub-agent finishes execution.\n\tSkipSummarization bool\n}\n\n// New creates a new agent tool.\n// If cfg is nil, skipSummarization defaults to false.\nfunc New(agent agent.Agent, cfg *Config) tool.Tool {\n\tif cfg == nil {\n\t\treturn &agentTool{\n\t\t\tagent:             agent,\n\t\t\tskipSummarization: false,\n\t\t}\n\t}\n\treturn &agentTool{\n\t\tagent:             agent,\n\t\tskipSummarization: cfg.SkipSummarization,\n\t}\n}\n\n// Name implements tool.Tool.\nfunc (t *agentTool) Name() string {\n\treturn t.agent.Name()\n}\n\n// Description implements tool.Tool.\nfunc (t *agentTool) Description() string {\n\treturn t.agent.Description()\n}\n\n// IsLongRunning implements tool.Tool.\nfunc (t *agentTool) IsLongRunning() bool {\n\treturn false\n}\n\n// Declaration returns the function declaration for the wrapped agent.\n// It generates a function declaration based on the agent's input schema.\n// If the agent does not have an input schema, a default schema with a\n// \"request\" string parameter is used.\nfunc (t *agentTool) Declaration() *genai.FunctionDeclaration {\n\tdecl := &genai.FunctionDeclaration{\n\t\tName:        t.Name(),\n\t\tDescription: t.Description(),\n\t}\n\n\tvar agentInputSchema *genai.Schema\n\tllmAgent, ok := t.agent.(llminternal.Agent)\n\tif ok && llmAgent != nil {\n\t\t// TODO - understand what build_function_declaration does in python and apply if needed.\n\t\tinternalLlmAgent, ok := t.agent.(llminternal.Agent)\n\t\tif !ok {\n\t\t\treturn nil\n\t\t}\n\t\tagentInputSchema = llminternal.Reveal(internalLlmAgent).InputSchema\n\t}\n\n\tif agentInputSchema != nil {\n\t\tdecl.Parameters = agentInputSchema\n\t} else {\n\t\tdecl.Parameters = &genai.Schema{\n\t\t\tType: \"OBJECT\",\n\t\t\tProperties: map[string]*genai.Schema{\n\t\t\t\t\"request\": {Type: \"STRING\"},\n\t\t\t},\n\t\t\tRequired: []string{\"request\"},\n\t\t}\n\t}\n\t// TODO - understand how _api_variant affects response type.\n\treturn decl\n}\n\n// Run executes the wrapped agent with the provided arguments.\n// It creates a new session for the sub-agent, runs the agent, and returns\n// the final result.\nfunc (t *agentTool) Run(toolCtx tool.Context, args any) (map[string]any, error) {\n\tmargs, ok := args.(map[string]any)\n\tif !ok {\n\t\treturn nil, fmt.Errorf(\"agentTool expects map[string]any arguments, got %T\", args)\n\t}\n\n\tif t.skipSummarization {\n\t\tif actions := toolCtx.Actions(); actions != nil {\n\t\t\tactions.SkipSummarization = true\n\t\t}\n\t}\n\n\tvar agentInputSchema *genai.Schema\n\tllmAgent, ok := t.agent.(llminternal.Agent)\n\tisLllmAgent := (ok && llmAgent != nil)\n\tif isLllmAgent {\n\t\tinternalLlmAgent, ok := t.agent.(llminternal.Agent)\n\t\tif !ok {\n\t\t\treturn nil, fmt.Errorf(\"internal error: failed to convert to llm agent\")\n\t\t}\n\t\tagentInputSchema = llminternal.Reveal(internalLlmAgent).InputSchema\n\t}\n\n\tvar content *genai.Content\n\tvar err error\n\tif agentInputSchema != nil {\n\t\tif err = utils.ValidateMapOnSchema(margs, agentInputSchema, true); err != nil {\n\t\t\treturn nil, fmt.Errorf(\"argument validation failed for agent %s: %w\", t.agent.Name(), err)\n\t\t}\n\t\tjsonData, err := json.Marshal(margs)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"error serializing tool arguments for agent %s: %w\", t.agent.Name(), err)\n\t\t}\n\t\tcontent = genai.NewContentFromText(string(jsonData), genai.RoleUser)\n\t} else {\n\t\tinput, ok := margs[\"request\"]\n\t\tif !ok {\n\t\t\treturn nil, fmt.Errorf(\"missing required argument 'request' for agent %s\", t.agent.Name())\n\t\t}\n\t\tinputText, ok := input.(string)\n\t\tif !ok {\n\t\t\t// Try to convert to string if not already one\n\t\t\tinputText = fmt.Sprint(input)\n\t\t}\n\t\tcontent = genai.NewContentFromText(inputText, genai.RoleUser)\n\t}\n\n\tsessionService := session.InMemoryService()\n\n\tr, err := runner.New(runner.Config{\n\t\tAppName:        t.agent.Name(),\n\t\tAgent:          t.agent,\n\t\tSessionService: sessionService,\n\t\t// TODO - use forwarding_artifact_service as in python.\n\t\tArtifactService: artifact.InMemoryService(),\n\t\tMemoryService:   memory.InMemoryService(),\n\t})\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to create runner\")\n\t}\n\n\tstateMap := make(map[string]any)\n\n\tfor k, v := range toolCtx.State().All() {\n\t\t// Filter out adk internal states.\n\t\tif !strings.HasPrefix(k, \"_adk\") {\n\t\t\tstateMap[k] = v\n\t\t}\n\t}\n\n\tsubSession, err := sessionService.Create(toolCtx, &session.CreateRequest{\n\t\tAppName: t.agent.Name(),\n\t\tUserID:  toolCtx.UserID(),\n\t\tState:   stateMap,\n\t})\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to create session for sub-agent %s: %w\", t.agent.Name(), err)\n\t}\n\n\t// TODO(dpasiukevich): verify agent loop termination.\n\teventCh := r.Run(toolCtx, subSession.Session.UserID(), subSession.Session.ID(), content, agent.RunConfig{\n\t\tStreamingMode: agent.StreamingModeSSE,\n\t})\n\n\tvar lastEvent *session.Event\n\tfor event, err := range eventCh {\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"error during execution of sub-agent %s: %w\", t.agent.Name(), err)\n\t\t}\n\t\tif event.ErrorCode != \"\" || event.ErrorMessage != \"\" {\n\t\t\treturn nil, fmt.Errorf(\"error from sub-agent %q (code: %q, message: %q)\", t.agent.Name(), event.ErrorCode, event.ErrorMessage)\n\t\t}\n\t\tif event.LLMResponse.Content != nil {\n\t\t\tlastEvent = event\n\t\t}\n\t}\n\n\tif lastEvent == nil {\n\t\treturn map[string]any{}, nil\n\t}\n\n\tlastContent := lastEvent.LLMResponse.Content\n\tvar textParts []string\n\tfor _, part := range lastContent.Parts {\n\t\tif part != nil && part.Text != \"\" {\n\t\t\ttextParts = append(textParts, part.Text)\n\t\t}\n\t}\n\toutputText := strings.Join(textParts, \"\\n\")\n\n\tif outputText == \"\" {\n\t\treturn map[string]any{}, nil\n\t}\n\tif isLllmAgent {\n\t\tinternalLlmAgent, ok := t.agent.(llminternal.Agent)\n\t\tif !ok {\n\t\t\treturn nil, fmt.Errorf(\"internal error: failed to convert to llm agent\")\n\t\t}\n\t\tif agentOutputSchema := llminternal.Reveal(internalLlmAgent).OutputSchema; agentOutputSchema != nil {\n\t\t\t// Assuming schemautils.ValidateOutputSchema parses the JSON string outputText\n\t\t\t// and validates it against the agentOutputSchema, returning a map[string]any.\n\t\t\tparsedOutput, err := utils.ValidateOutputSchema(outputText, agentOutputSchema)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, fmt.Errorf(\"output validation failed for sub-agent %s: %w\", t.agent.Name(), err)\n\t\t\t}\n\t\t\treturn parsedOutput, nil\n\t\t}\n\t}\n\n\treturn map[string]any{\"result\": outputText}, nil\n}\n\n// ProcessRequest adds the agent tool's function declaration to the LLM request.\nfunc (t *agentTool) ProcessRequest(ctx tool.Context, req *model.LLMRequest) error {\n\treturn toolutils.PackTool(req, t)\n}\n"
  },
  {
    "path": "tool/agenttool/agent_tool_test.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage agenttool_test\n\nimport (\n\t\"log\"\n\t\"testing\"\n\n\t\"github.com/google/go-cmp/cmp\"\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/agent\"\n\t\"google.golang.org/adk/agent/llmagent\"\n\ticontext \"google.golang.org/adk/internal/context\"\n\t\"google.golang.org/adk/internal/testutil\"\n\t\"google.golang.org/adk/internal/toolinternal\"\n\t\"google.golang.org/adk/model\"\n\t\"google.golang.org/adk/model/gemini\"\n\t\"google.golang.org/adk/session\"\n\t\"google.golang.org/adk/tool\"\n\t\"google.golang.org/adk/tool/agenttool\"\n)\n\nfunc TestAgentTool_Declaration(t *testing.T) {\n\tinputSchema := &genai.Schema{\n\t\tType: \"OBJECT\",\n\t\tProperties: map[string]*genai.Schema{\n\t\t\t\"request\": {Type: \"STRING\"},\n\t\t},\n\t\tRequired: []string{\"request\"},\n\t}\n\tagent := createAgent(t, inputSchema, nil)\n\tagentTool := agenttool.New(agent, nil)\n\ttoolImpl, ok := agentTool.(toolinternal.FunctionTool)\n\tif !ok {\n\t\tt.Fatal(\"agentTool does not implement FunctionTool\")\n\t}\n\n\tdecl := toolImpl.Declaration()\n\n\twantDecl := &genai.FunctionDeclaration{\n\t\tName:        \"math_agent\",\n\t\tDescription: \"Solves math problems.\",\n\t\tParameters: &genai.Schema{\n\t\t\tType: \"OBJECT\",\n\t\t\tProperties: map[string]*genai.Schema{\n\t\t\t\t\"request\": {Type: \"STRING\"},\n\t\t\t},\n\t\t\tRequired: []string{\"request\"},\n\t\t},\n\t}\n\tif diff := cmp.Diff(wantDecl, decl); diff != \"\" {\n\t\tt.Errorf(\"Declaration() returned diff (-want +got):\\n%s\", diff)\n\t}\n}\n\nfunc TestAgentTool_DeclarationWithoutSchema(t *testing.T) {\n\tagent := createAgent(t, nil, nil)\n\tagentTool := agenttool.New(agent, nil)\n\ttoolImpl, ok := agentTool.(toolinternal.FunctionTool)\n\tif !ok {\n\t\tt.Fatal(\"agentTool does not implement FunctionTool\")\n\t}\n\n\tdecl := toolImpl.Declaration()\n\n\twantDecl := &genai.FunctionDeclaration{\n\t\tName:        \"math_agent\",\n\t\tDescription: \"Solves math problems.\",\n\t\tParameters: &genai.Schema{\n\t\t\tType: \"OBJECT\",\n\t\t\tProperties: map[string]*genai.Schema{\n\t\t\t\t\"request\": {Type: \"STRING\"},\n\t\t\t},\n\t\t\tRequired: []string{\"request\"},\n\t\t},\n\t}\n\tif diff := cmp.Diff(wantDecl, decl); diff != \"\" {\n\t\tt.Errorf(\"Declaration() returned diff (-want +got):\\n%s\", diff)\n\t}\n}\n\nfunc TestAgentTool_Run_InputValidation(t *testing.T) {\n\tinputSchema := &genai.Schema{\n\t\tType: \"OBJECT\",\n\t\tProperties: map[string]*genai.Schema{\n\t\t\t\"is_magic\": {Type: \"BOOLEAN\"},\n\t\t\t\"name\":     {Type: \"STRING\"},\n\t\t},\n\t\tRequired: []string{\"is_magic\", \"name\"},\n\t}\n\tagent := createAgent(t, inputSchema, nil)\n\tagentTool := agenttool.New(agent, nil)\n\ttoolCtx := createToolContext(t, agent)\n\n\ttests := []struct {\n\t\tname string\n\t\targs map[string]any\n\t}{\n\t\t{\n\t\t\tname: \"extra_field\",\n\t\t\targs: map[string]any{\"is_magic\": true, \"name_invalid\": \"test_name\", \"name\": \"test\"},\n\t\t},\n\t\t{\n\t\t\tname: \"invalid_type\",\n\t\t\targs: map[string]any{\"is_magic\": \"invalid_type\", \"name\": \"test_name\"},\n\t\t},\n\t\t{\n\t\t\tname: \"missing_required\",\n\t\t\targs: map[string]any{\"is_magic\": true},\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\ttoolImpl, ok := agentTool.(toolinternal.FunctionTool)\n\t\t\tif !ok {\n\t\t\t\tt.Fatal(\"agentTool does not implement FunctionTool\")\n\t\t\t}\n\n\t\t\t_, err := toolImpl.Run(toolCtx, tt.args)\n\t\t\tif err == nil {\n\t\t\t\tt.Fatalf(\"Run(%v) succeeded unexpectedly, wanted error\", tt.args)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestAgentTool_Run_OutputValidation(t *testing.T) {\n\toutputSchema := &genai.Schema{\n\t\tType: \"OBJECT\",\n\t\tProperties: map[string]*genai.Schema{\n\t\t\t\"is_valid\": {Type: \"BOOLEAN\"},\n\t\t\t\"message\":  {Type: \"STRING\"},\n\t\t},\n\t\tRequired: []string{\"is_valid\", \"message\"},\n\t}\n\n\ttestLLM := &testutil.MockModel{\n\t\tResponses: []*genai.Content{\n\t\t\tgenai.NewContentFromText(\"{\\\"is_valid\\\": \\\"invalid type\\\", \\\"message\\\": \\\"success\\\"}\", genai.RoleModel),\n\t\t},\n\t}\n\n\tagent := createAgentWithModel(t, nil, outputSchema, testLLM)\n\tagentTool := agenttool.New(agent, nil)\n\ttoolCtx := createToolContext(t, agent)\n\ttoolImpl, ok := agentTool.(toolinternal.FunctionTool)\n\tif !ok {\n\t\tt.Fatal(\"agentTool does not implement FunctionTool\")\n\t}\n\n\t_, err := toolImpl.Run(toolCtx, map[string]any{\"request\": \"test\"})\n\tif err == nil {\n\t\tt.Fatalf(\"Run() succeeded unexpectedly, want error\")\n\t}\n}\n\nfunc TestAgentTool_Run_Successful(t *testing.T) {\n\tinputSchema := &genai.Schema{\n\t\tType: \"OBJECT\",\n\t\tProperties: map[string]*genai.Schema{\n\t\t\t\"is_magic\": {Type: \"BOOLEAN\"},\n\t\t},\n\t\tRequired: []string{\"is_magic\"},\n\t}\n\toutputSchema := &genai.Schema{\n\t\tType: \"OBJECT\",\n\t\tProperties: map[string]*genai.Schema{\n\t\t\t\"is_valid\": {Type: \"BOOLEAN\"},\n\t\t\t\"message\":  {Type: \"STRING\"},\n\t\t},\n\t\tRequired: []string{\"is_valid\", \"message\"},\n\t}\n\ttestLLM := &testutil.MockModel{\n\t\tResponses: []*genai.Content{\n\t\t\tgenai.NewContentFromText(\"{\\\"is_valid\\\": true, \\\"message\\\": \\\"success\\\"}\", genai.RoleModel),\n\t\t},\n\t}\n\tagent := createAgentWithModel(t, inputSchema, outputSchema, testLLM)\n\tagentTool := agenttool.New(agent, nil)\n\ttoolCtx := createToolContext(t, agent)\n\ttoolImpl, ok := agentTool.(toolinternal.FunctionTool)\n\tif !ok {\n\t\tt.Fatal(\"agentTool does not implement FunctionTool\")\n\t}\n\n\tresult, err := toolImpl.Run(toolCtx, map[string]any{\"is_magic\": true})\n\tif err != nil {\n\t\tt.Fatalf(\"Run() failed unexpectedly: %v\", err)\n\t}\n\twant := map[string]any{\"is_valid\": true, \"message\": \"success\"}\n\tif diff := cmp.Diff(want, result); diff != \"\" {\n\t\tt.Errorf(\"Run() result diff (-want +got):\\n%s\", diff)\n\t}\n}\n\nfunc TestAgentTool_Run_WithoutSchema(t *testing.T) {\n\ttestLLM := &testutil.MockModel{\n\t\tResponses: []*genai.Content{\n\t\t\t{\n\t\t\t\tParts: []*genai.Part{\n\t\t\t\t\t{Text: \"First text part is returned\"},\n\t\t\t\t\t{Text: \" This should not be ignored\"},\n\t\t\t\t},\n\t\t\t\tRole: genai.RoleModel,\n\t\t\t},\n\t\t},\n\t\tStreamResponsesCount: 1,\n\t}\n\n\tagent := createAgentWithModel(t, nil, nil, testLLM)\n\tagentTool := agenttool.New(agent, nil)\n\ttoolCtx := createToolContext(t, agent)\n\ttoolImpl, ok := agentTool.(toolinternal.FunctionTool)\n\tif !ok {\n\t\tt.Fatal(\"agentTool does not implement FunctionTool\")\n\t}\n\n\tresult, err := toolImpl.Run(toolCtx, map[string]any{\"request\": \"magic\"})\n\tif err != nil {\n\t\tt.Fatalf(\"Run() failed unexpectedly: %v\", err)\n\t}\n\twant := map[string]any{\"result\": \"First text part is returned This should not be ignored\"}\n\tif diff := cmp.Diff(want, result); diff != \"\" {\n\t\tt.Errorf(\"Run() result diff (-want +got):\\n%s\", diff)\n\t}\n}\n\nfunc TestAgentTool_Run_EmptyModelResponse(t *testing.T) {\n\ttestLLM := &testutil.MockModel{\n\t\tResponses: []*genai.Content{\n\t\t\t{Role: genai.RoleModel}, // Empty content\n\t\t},\n\t}\n\tagent := createAgentWithModel(t, nil, nil, testLLM)\n\tagentTool := agenttool.New(agent, nil)\n\ttoolCtx := createToolContext(t, agent)\n\ttoolImpl, ok := agentTool.(toolinternal.FunctionTool)\n\tif !ok {\n\t\tt.Fatal(\"agentTool does not implement FunctionTool\")\n\t}\n\n\tresult, err := toolImpl.Run(toolCtx, map[string]any{\"request\": \"magic\"})\n\tif err != nil {\n\t\tt.Fatalf(\"Run() failed unexpectedly: %v\", err)\n\t}\n\twant := map[string]any{}\n\tif diff := cmp.Diff(want, result); diff != \"\" {\n\t\tt.Errorf(\"Run() result diff (-want +got):\\n%s\", diff)\n\t}\n}\n\nfunc TestAgentTool_Run_SkipSummarization(t *testing.T) {\n\ttestLLM := &testutil.MockModel{\n\t\tResponses: []*genai.Content{\n\t\t\tgenai.NewContentFromText(\"test response\", genai.RoleModel),\n\t\t},\n\t}\n\tagent := createAgentWithModel(t, nil, nil, testLLM)\n\ttoolCtx := createToolContext(t, agent)\n\n\t// Test with skipSummarization = true\n\tagentToolSkip := agenttool.New(agent, &agenttool.Config{SkipSummarization: true})\n\tactions := toolCtx.Actions()\n\ttoolImpl, ok := agentToolSkip.(toolinternal.FunctionTool)\n\tif !ok {\n\t\tt.Fatal(\"agentToolSkip does not implement FunctionTool\")\n\t}\n\t_, err := toolImpl.Run(toolCtx, map[string]any{\"request\": \"magic\"})\n\tif err != nil {\n\t\tt.Fatalf(\"Run() with skipSummarization=true failed unexpectedly: %v\", err)\n\t}\n\tif !actions.SkipSummarization {\n\t\tt.Errorf(\"SkipSummarization flag not set when AgentTool was created with skipSummarization=true\")\n\t}\n\n\t// Test with skipSummarization = false\n\tagentToolNoSkip := agenttool.New(agent, &agenttool.Config{SkipSummarization: false})\n\ttoolImpl, ok = agentToolNoSkip.(toolinternal.FunctionTool)\n\tif !ok {\n\t\tt.Fatal(\"agentToolNoSkip does not implement FunctionTool\")\n\t}\n\tactions.SkipSummarization = false // Reset\n\t// Reset mock for the second call\n\ttestLLM.Responses = []*genai.Content{\n\t\tgenai.NewContentFromText(\"test response\", genai.RoleModel),\n\t}\n\ttestLLM.Requests = nil\n\t_, err = toolImpl.Run(toolCtx, map[string]any{\"request\": \"magic\"})\n\tif err != nil {\n\t\tt.Fatalf(\"Run() with skipSummarization=false failed unexpectedly: %v\", err)\n\t}\n\tif actions.SkipSummarization {\n\t\tt.Errorf(\"SkipSummarization flag was set when AgentTool was created with skipSummarization=false\")\n\t}\n}\n\nfunc createAgent(t *testing.T, inputSchema, outputSchema *genai.Schema) agent.Agent {\n\tt.Helper()\n\n\tmodel, err := gemini.NewModel(t.Context(), \"gemini-2.5-flash\", &genai.ClientConfig{\n\t\tAPIKey: \"FAKE_KEY\",\n\t})\n\tif err != nil {\n\t\tlog.Fatalf(\"Failed to create model: %v\", err)\n\t}\n\tagent, err := llmagent.New(llmagent.Config{\n\t\tName:         \"math_agent\",\n\t\tModel:        model,\n\t\tDescription:  \"Solves math problems.\",\n\t\tInstruction:  \"You solve math problems.\",\n\t\tInputSchema:  inputSchema,\n\t\tOutputSchema: outputSchema,\n\t})\n\tif err != nil {\n\t\tlog.Fatalf(\"Failed to create agent: %v\", err)\n\t}\n\treturn agent\n}\n\nfunc createAgentWithModel(t *testing.T, inputSchema, outputSchema *genai.Schema, llmModel model.LLM) agent.Agent {\n\tt.Helper()\n\tagent, err := llmagent.New(llmagent.Config{\n\t\tName:         \"math_agent\",\n\t\tModel:        llmModel,\n\t\tDescription:  \"Solves math problems.\",\n\t\tInstruction:  \"You solve math problems.\",\n\t\tInputSchema:  inputSchema,\n\t\tOutputSchema: outputSchema,\n\t})\n\tif err != nil {\n\t\tlog.Fatalf(\"Failed to create agent: %v\", err)\n\t}\n\treturn agent\n}\n\nfunc createToolContext(t *testing.T, testAgent agent.Agent) tool.Context {\n\tt.Helper()\n\n\tsessionService := session.InMemoryService()\n\tcreateResponse, err := sessionService.Create(t.Context(), &session.CreateRequest{\n\t\tAppName:   \"testApp\",\n\t\tUserID:    \"testUser\",\n\t\tSessionID: \"testSession\",\n\t})\n\tif err != nil {\n\t\tt.Fatalf(\"Failed to create session: %v\", err)\n\t}\n\n\tctx := icontext.NewInvocationContext(t.Context(), icontext.InvocationContextParams{\n\t\tSession: createResponse.Session,\n\t})\n\n\treturn toolinternal.NewToolContext(ctx, \"\", &session.EventActions{}, nil)\n}\n"
  },
  {
    "path": "tool/exampletool/tool.go",
    "content": "// Copyright 2026 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Package exampletool provides a tool that allows an agent to add (few-shot) examples to the LLM request.\npackage exampletool\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/internal/utils\"\n\t\"google.golang.org/adk/model\"\n\t\"google.golang.org/adk/tool\"\n)\n\ntype Example struct {\n\tInput  *genai.Content   `json:\"input\"`\n\tOutput []*genai.Content `json:\"output\"`\n}\n\ntype ExampleToolConfig struct {\n\tExamples []*Example\n}\n\n// exampleTool is a tool that adds (few-shot) examples to the LLM request.\ntype exampleTool struct {\n\texamples []*Example\n}\n\nfunc New(config ExampleToolConfig) (*exampleTool, error) {\n\treturn &exampleTool{examples: config.Examples}, nil\n}\n\n// Name implements tool.Tool.\nfunc (s exampleTool) Name() string {\n\treturn \"example_tool\"\n}\n\n// Description implements tool.Tool.\nfunc (s exampleTool) Description() string {\n\treturn \"example tool\"\n}\n\n// ProcessRequest adds the exampleTool examples to the LLM request.\nfunc (s exampleTool) ProcessRequest(ctx tool.Context, req *model.LLMRequest) error {\n\tparts := ctx.UserContent().Parts\n\tif len(parts) == 0 || parts[0].Text == \"\" {\n\t\treturn nil\n\t}\n\n\tinstruction := buildExamplesSystemInstruction(s.examples, req.Model)\n\tutils.AppendInstructions(req, instruction)\n\treturn nil\n}\n\n// IsLongRunning implements tool.Tool.\nfunc (t exampleTool) IsLongRunning() bool {\n\treturn false\n}\n\nconst (\n\texamplesIntro          = \"<EXAMPLES>\\nBegin few-shot\\nThe following are examples of user queries and model responses using the available tools.\\n\\n\"\n\texamplesEnd            = \"End few-shot\\n<EXAMPLES>\"\n\texampleStart           = \"EXAMPLE %d:\\nBegin example\\n\"\n\texampleEnd             = \"End example\\n\\n\"\n\tuserPrefix             = \"[user]\\n\"\n\tmodelPrefix            = \"[model]\\n\"\n\tfunctionPrefix         = \"```\\n\"\n\tfunctionCallPrefix     = \"```tool_code\\n\"\n\tfunctionCallSuffix     = \"\\n```\\n\"\n\tfunctionResponsePrefix = \"```tool_outputs\\n\"\n\tfunctionResponseSuffix = \"\\n```\\n\"\n)\n\n// Converts a list of examples to a string that can be used in a system instruction.\nfunc buildExamplesSystemInstruction(examples []*Example, model string) string {\n\tvar sb strings.Builder\n\tsb.WriteString(examplesIntro)\n\tfor exampleNum, example := range examples {\n\t\tfmt.Fprintf(&sb, exampleStart, exampleNum+1)\n\t\tsb.WriteString(userPrefix)\n\t\tif example.Input != nil && len(example.Input.Parts) > 0 {\n\t\t\tfor _, part := range example.Input.Parts {\n\t\t\t\tif part.Text != \"\" {\n\t\t\t\t\tsafeText := strings.ReplaceAll(part.Text, \"End few-shot\", \"[PROTECTED]\")\n\t\t\t\t\tsb.WriteString(safeText)\n\t\t\t\t\tsb.WriteString(\"\\n\")\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tgemini2 := strings.Contains(model, \"gemini-2\")\n\t\tpreviousRole := \"\"\n\t\tfor _, content := range example.Output {\n\t\t\tvar role string\n\t\t\tif content.Role == \"model\" {\n\t\t\t\trole = modelPrefix\n\t\t\t} else {\n\t\t\t\trole = userPrefix\n\t\t\t}\n\t\t\tif role != previousRole {\n\t\t\t\tsb.WriteString(role)\n\t\t\t}\n\t\t\tpreviousRole = role\n\t\t\tfor _, part := range content.Parts {\n\t\t\t\tif part.FunctionCall != nil {\n\t\t\t\t\targs := []string{}\n\t\t\t\t\tfor k, v := range part.FunctionCall.Args {\n\t\t\t\t\t\tif _, ok := v.(string); ok {\n\t\t\t\t\t\t\targs = append(args, fmt.Sprintf(\"%s='%s'\", k, v))\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\targs = append(args, fmt.Sprintf(\"%s=%v\", k, v))\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tprefix := functionPrefix\n\t\t\t\t\tif gemini2 {\n\t\t\t\t\t\tprefix = functionCallPrefix\n\t\t\t\t\t}\n\t\t\t\t\tfmt.Fprintf(&sb, \"%s%s(%s)%s\", prefix, part.FunctionCall.Name, strings.Join(args, \", \"), functionCallSuffix)\n\t\t\t\t} else if part.FunctionResponse != nil {\n\t\t\t\t\tprefix := functionPrefix\n\t\t\t\t\tif gemini2 {\n\t\t\t\t\t\tprefix = functionResponsePrefix\n\t\t\t\t\t}\n\t\t\t\t\tfmt.Fprintf(&sb, \"%s%v%s\", prefix, part.FunctionResponse, functionResponseSuffix)\n\t\t\t\t} else if part.Text != \"\" {\n\t\t\t\t\t// SANITIZATION: Again, protect the boundary tags\n\t\t\t\t\tsafeText := strings.ReplaceAll(part.Text, \"End few-shot\", \"[PROTECTED]\")\n\t\t\t\t\tsb.WriteString(safeText)\n\t\t\t\t\tsb.WriteString(\"\\n\")\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tsb.WriteString(exampleEnd)\n\t}\n\tsb.WriteString(examplesEnd)\n\treturn sb.String()\n}\n"
  },
  {
    "path": "tool/exampletool/tool_test.go",
    "content": "// Copyright 2026 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage exampletool\n\nimport (\n\t\"context\"\n\t\"testing\"\n\n\t\"github.com/google/go-cmp/cmp\"\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/agent\"\n\t\"google.golang.org/adk/memory\"\n\t\"google.golang.org/adk/model\"\n\t\"google.golang.org/adk/session\"\n\t\"google.golang.org/adk/tool\"\n\t\"google.golang.org/adk/tool/toolconfirmation\"\n)\n\n// --- mockToolContext ---\n\ntype mockToolContext struct {\n\tcontext.Context\n\tuserContent *genai.Content\n}\n\nfunc (m *mockToolContext) UserContent() *genai.Content {\n\treturn m.userContent\n}\n\n// Implement other interface methods with panic or nil as needed for this specific test\nfunc (m *mockToolContext) FunctionCallID() string { return \"\" }\n\nfunc (m *mockToolContext) Actions() *session.EventActions {\n\treturn &session.EventActions{}\n}\n\nfunc (m *mockToolContext) SearchMemory(ctx context.Context, query string) (*memory.SearchResponse, error) {\n\treturn nil, nil\n}\nfunc (m *mockToolContext) ToolConfirmation() *toolconfirmation.ToolConfirmation { return nil }\nfunc (m *mockToolContext) RequestConfirmation(hint string, payload any) error   { return nil }\nfunc (m *mockToolContext) AgentName() string                                    { return \"mock_agent\" }\nfunc (m *mockToolContext) ReadonlyState() session.ReadonlyState                 { return nil }\nfunc (m *mockToolContext) State() session.State                                 { return nil }\nfunc (m *mockToolContext) Artifacts() agent.Artifacts                           { return nil }\nfunc (m *mockToolContext) InvocationID() string                                 { return \"mock_invocation\" }\nfunc (m *mockToolContext) AppName() string                                      { return \"mock_app\" }\nfunc (m *mockToolContext) Branch() string                                       { return \"mock_branch\" }\nfunc (m *mockToolContext) SessionID() string                                    { return \"mock_session\" }\nfunc (m *mockToolContext) UserID() string                                       { return \"mock_user\" }\n\n// --- Tests ---\n\nfunc TestExampleTool_ProcessRequest(t *testing.T) {\n\ttests := []struct {\n\t\tname         string\n\t\texamples     []*Example\n\t\tuserContent  *genai.Content\n\t\tmodel        string\n\t\twantInstruct string\n\t}{\n\t\t{\n\t\t\tname:     \"NoUserContent\",\n\t\t\texamples: []*Example{{Input: genai.NewContentFromText(\"hi\", \"user\"), Output: []*genai.Content{genai.NewContentFromText(\"hello\", \"model\")}}},\n\t\t\tuserContent: &genai.Content{\n\t\t\t\tParts: []*genai.Part{},\n\t\t\t},\n\t\t\tmodel:        \"gemini-1.5-pro\",\n\t\t\twantInstruct: \"\",\n\t\t},\n\t\t{\n\t\t\tname:     \"EmptyUserContentString\",\n\t\t\texamples: []*Example{{Input: genai.NewContentFromText(\"hi\", \"user\"), Output: []*genai.Content{genai.NewContentFromText(\"hello\", \"model\")}}},\n\t\t\tuserContent: &genai.Content{\n\t\t\t\tParts: []*genai.Part{{Text: \"\"}},\n\t\t\t},\n\t\t\tmodel:        \"gemini-1.5-pro\",\n\t\t\twantInstruct: \"\",\n\t\t},\n\t\t{\n\t\t\tname: \"SimpleExample\",\n\t\t\texamples: []*Example{\n\t\t\t\t{\n\t\t\t\t\tInput:  genai.NewContentFromText(\"input1\", \"user\"),\n\t\t\t\t\tOutput: []*genai.Content{genai.NewContentFromText(\"output1\", \"model\")},\n\t\t\t\t},\n\t\t\t},\n\t\t\tuserContent: genai.NewContentFromText(\"user query\", \"user\"),\n\t\t\tmodel:       \"gemini-1.5-pro\",\n\t\t\twantInstruct: `<EXAMPLES>\nBegin few-shot\nThe following are examples of user queries and model responses using the available tools.\n\nEXAMPLE 1:\nBegin example\n[user]\ninput1\n[model]\noutput1\nEnd example\n\nEnd few-shot\n<EXAMPLES>`,\n\t\t},\n\t\t{\n\t\t\tname: \"MultipleExamples\",\n\t\t\texamples: []*Example{\n\t\t\t\t{\n\t\t\t\t\tInput:  genai.NewContentFromText(\"in1\", \"user\"),\n\t\t\t\t\tOutput: []*genai.Content{genai.NewContentFromText(\"out1\", \"model\")},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tInput:  genai.NewContentFromText(\"in2\", \"user\"),\n\t\t\t\t\tOutput: []*genai.Content{genai.NewContentFromText(\"out2\", \"model\")},\n\t\t\t\t},\n\t\t\t},\n\t\t\tuserContent: genai.NewContentFromText(\"query\", \"user\"),\n\t\t\tmodel:       \"gemini-1.5-pro\",\n\t\t\twantInstruct: `<EXAMPLES>\nBegin few-shot\nThe following are examples of user queries and model responses using the available tools.\n\nEXAMPLE 1:\nBegin example\n[user]\nin1\n[model]\nout1\nEnd example\n\nEXAMPLE 2:\nBegin example\n[user]\nin2\n[model]\nout2\nEnd example\n\nEnd few-shot\n<EXAMPLES>`,\n\t\t},\n\t\t{\n\t\t\tname: \"FunctionCallExample_Gemini1.5\",\n\t\t\texamples: []*Example{\n\t\t\t\t{\n\t\t\t\t\tInput: genai.NewContentFromText(\"call func\", \"user\"),\n\t\t\t\t\tOutput: []*genai.Content{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tRole: \"model\",\n\t\t\t\t\t\t\tParts: []*genai.Part{\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tFunctionCall: &genai.FunctionCall{\n\t\t\t\t\t\t\t\t\t\tName: \"my_tool\",\n\t\t\t\t\t\t\t\t\t\tArgs: map[string]any{\"arg1\": \"val1\"},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tRole: \"user\", // Function response is usually from user/tool role\n\t\t\t\t\t\t\tParts: []*genai.Part{\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tFunctionResponse: &genai.FunctionResponse{\n\t\t\t\t\t\t\t\t\t\tName:     \"my_tool\",\n\t\t\t\t\t\t\t\t\t\tResponse: map[string]any{\"result\": \"ok\"},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tuserContent: genai.NewContentFromText(\"query\", \"user\"),\n\t\t\tmodel:       \"gemini-1.5-pro\",\n\t\t\twantInstruct: `<EXAMPLES>\nBegin few-shot\nThe following are examples of user queries and model responses using the available tools.\n\nEXAMPLE 1:\nBegin example\n[user]\ncall func\n[model]\n` + \"```\" + `\nmy_tool(arg1='val1')\n` + \"```\" + `\n[user]\n` + \"```\" + `\n&{<nil>  []  my_tool map[result:ok]}\n` + \"```\" + `\nEnd example\n\nEnd few-shot\n<EXAMPLES>`,\n\t\t},\n\t\t{\n\t\t\tname: \"FunctionCallExample_Gemini2\",\n\t\t\texamples: []*Example{\n\t\t\t\t{\n\t\t\t\t\tInput: genai.NewContentFromText(\"call func\", \"user\"),\n\t\t\t\t\tOutput: []*genai.Content{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tRole: \"model\",\n\t\t\t\t\t\t\tParts: []*genai.Part{\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tFunctionCall: &genai.FunctionCall{\n\t\t\t\t\t\t\t\t\t\tName: \"my_tool\",\n\t\t\t\t\t\t\t\t\t\tArgs: map[string]any{\"arg1\": \"val1\"},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tRole: \"user\",\n\t\t\t\t\t\t\tParts: []*genai.Part{\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tFunctionResponse: &genai.FunctionResponse{\n\t\t\t\t\t\t\t\t\t\tName:     \"my_tool\",\n\t\t\t\t\t\t\t\t\t\tResponse: map[string]any{\"result\": \"ok\"},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tuserContent: genai.NewContentFromText(\"query\", \"user\"),\n\t\t\tmodel:       \"gemini-2.0-flash\",\n\t\t\twantInstruct: `<EXAMPLES>\nBegin few-shot\nThe following are examples of user queries and model responses using the available tools.\n\nEXAMPLE 1:\nBegin example\n[user]\ncall func\n[model]\n` + \"```tool_code\" + `\nmy_tool(arg1='val1')\n` + \"```\" + `\n[user]\n` + \"```tool_outputs\" + `\n&{<nil>  []  my_tool map[result:ok]}\n` + \"```\" + `\nEnd example\n\nEnd few-shot\n<EXAMPLES>`,\n\t\t},\n\t}\n\n\tfor _, tc := range tests {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\tet, err := New(ExampleToolConfig{Examples: tc.examples})\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"New() error = %v\", err)\n\t\t\t}\n\n\t\t\treq := &model.LLMRequest{\n\t\t\t\tModel: tc.model,\n\t\t\t}\n\t\t\tctx := &mockToolContext{\n\t\t\t\tContext:     context.Background(),\n\t\t\t\tuserContent: tc.userContent,\n\t\t\t}\n\n\t\t\terr = et.ProcessRequest(ctx, req)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"ProcessRequest() error = %v\", err)\n\t\t\t}\n\n\t\t\tif tc.wantInstruct == \"\" {\n\t\t\t\tif req.Config != nil && req.Config.SystemInstruction != nil {\n\t\t\t\t\tt.Errorf(\"ProcessRequest() unexpected system instruction: got %v, want nil/empty\", req.Config.SystemInstruction)\n\t\t\t\t}\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif req.Config == nil || req.Config.SystemInstruction == nil {\n\t\t\t\tt.Fatal(\"ProcessRequest() expected system instruction, got nil\")\n\t\t\t}\n\n\t\t\tgotInstruct := req.Config.SystemInstruction.Parts[0].Text\n\t\t\t// Normalize newlines for comparison if needed, though exact match is best\n\t\t\tif diff := cmp.Diff(tc.wantInstruct, gotInstruct); diff != \"\" {\n\t\t\t\tt.Errorf(\"System instruction mismatch (-want +got):\\n%s\", diff)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestExampleTool_Interface(t *testing.T) {\n\tet, _ := New(ExampleToolConfig{})\n\tvar _ tool.Tool = et\n\tif et.Name() != \"example_tool\" {\n\t\tt.Errorf(\"Name() = %q, want %q\", et.Name(), \"example_tool\")\n\t}\n\tif et.IsLongRunning() {\n\t\tt.Error(\"IsLongRunning() = true, want false\")\n\t}\n}\n"
  },
  {
    "path": "tool/exitlooptool/tool.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Package exitlooptool provides a tool that allows an agent to exit a loop.\npackage exitlooptool\n\nimport (\n\t\"fmt\"\n\n\t\"google.golang.org/adk/tool\"\n\t\"google.golang.org/adk/tool/functiontool\"\n)\n\nfunc exitLoop(ctx tool.Context, myArgs struct{}) (map[string]string, error) {\n\tctx.Actions().Escalate = true\n\tctx.Actions().SkipSummarization = true\n\treturn map[string]string{}, nil\n}\n\n// New creates an instance of an exitLoop tool.\nfunc New() (tool.Tool, error) {\n\texitLoopTool, err := functiontool.New(functiontool.Config{\n\t\tName:        \"exit_loop\",\n\t\tDescription: \"Exits the loop.\\n\\n  Call this function only when you are instructed to do so.\\n  \",\n\t}, exitLoop)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"error creating exit loop tool: %w\", err)\n\t}\n\treturn exitLoopTool, nil\n}\n"
  },
  {
    "path": "tool/exitlooptool/tool_test.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage exitlooptool_test\n\nimport (\n\t\"testing\"\n\n\t\"github.com/google/go-cmp/cmp\"\n\t\"github.com/google/go-cmp/cmp/cmpopts\"\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/agent\"\n\t\"google.golang.org/adk/agent/llmagent\"\n\t\"google.golang.org/adk/agent/workflowagents/loopagent\"\n\t\"google.golang.org/adk/internal/testutil\"\n\t\"google.golang.org/adk/tool\"\n\t\"google.golang.org/adk/tool/exitlooptool\"\n)\n\n// --- Test Suite ---\nfunc TestExitLoopToolExitsLoopAgent(t *testing.T) {\n\t// Define the structure for our test cases\n\ttestCases := []struct {\n\t\tname          string\n\t\tmockResponses []*genai.Content\n\t\tmaxIterations uint\n\t\twant          []*genai.Content\n\t}{\n\t\t{\n\t\t\tname: \"ExitLoopToolStopsMidLoop\",\n\t\t\tmockResponses: []*genai.Content{\n\t\t\t\tgenai.NewContentFromText(\"response1\", \"model\"),\n\t\t\t\tgenai.NewContentFromText(\"response2\", \"model\"),\n\t\t\t\tgenai.NewContentFromFunctionCall(\"exit_loop\", map[string]any{}, \"model\"),\n\t\t\t\tgenai.NewContentFromText(\"this should not be processed\", \"model\"),\n\t\t\t\tgenai.NewContentFromText(\"this should not be processed\", \"model\"),\n\t\t\t},\n\t\t\tmaxIterations: 5,\n\t\t\twant: []*genai.Content{\n\t\t\t\t// Results from first GenerateStream call\n\t\t\t\tgenai.NewContentFromText(\"response1\", \"model\"),\n\t\t\t\tgenai.NewContentFromText(\"response2\", \"model\"),\n\t\t\t\tgenai.NewContentFromFunctionCall(\"exit_loop\", map[string]any{}, \"model\"),\n\t\t\t\t// Result from the tool execution\n\t\t\t\tgenai.NewContentFromFunctionResponse(\"exit_loop\", map[string]any{}, \"user\"),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"MaxIterationsStopsLoop\",\n\t\t\tmockResponses: []*genai.Content{\n\t\t\t\t// First iteration\n\t\t\t\tgenai.NewContentFromText(\"iteration 1 response\", \"model\"),\n\t\t\t\t// Second iteration\n\t\t\t\tgenai.NewContentFromText(\"iteration 2 response\", \"model\"),\n\t\t\t\t// This won't be reached\n\t\t\t\tgenai.NewContentFromText(\"iteration 3 response\", \"model\"),\n\t\t\t},\n\t\t\tmaxIterations: 2,\n\t\t\twant: []*genai.Content{\n\t\t\t\tgenai.NewContentFromText(\"iteration 1 response\", \"model\"),\n\t\t\t\tgenai.NewContentFromText(\"iteration 2 response\", \"model\"),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"ExitLoopToolStopsImmediately\",\n\t\t\tmockResponses: []*genai.Content{\n\t\t\t\tgenai.NewContentFromFunctionCall(\"exit_loop\", map[string]any{}, \"model\"),\n\t\t\t\tgenai.NewContentFromText(\"this should not be processed\", \"model\"),\n\t\t\t\tgenai.NewContentFromText(\"this should not be processed\", \"model\"),\n\t\t\t},\n\t\t\tmaxIterations: 3,\n\t\t\twant: []*genai.Content{\n\t\t\t\tgenai.NewContentFromFunctionCall(\"exit_loop\", map[string]any{}, \"model\"),\n\t\t\t\tgenai.NewContentFromFunctionResponse(\"exit_loop\", map[string]any{}, \"user\"),\n\t\t\t},\n\t\t},\n\t}\n\n\t// Iterate over the test cases\n\tfor _, tc := range testCases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t// 1. Setup\n\t\t\tmockModel := &testutil.MockModel{Responses: tc.mockResponses}\n\t\t\texitLoopTool, err := exitlooptool.New()\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"failed to create exit tool: %v\", err)\n\t\t\t}\n\n\t\t\ta, err := llmagent.New(llmagent.Config{\n\t\t\t\tName:  \"simple agent\",\n\t\t\t\tModel: mockModel,\n\t\t\t\tTools: []tool.Tool{exitLoopTool},\n\t\t\t})\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"failed to create llm agent: %v\", err)\n\t\t\t}\n\n\t\t\tlooper, err := loopagent.New(loopagent.Config{\n\t\t\t\tAgentConfig: agent.Config{\n\t\t\t\t\tName:      \"looper\",\n\t\t\t\t\tSubAgents: []agent.Agent{a},\n\t\t\t\t},\n\t\t\t\tMaxIterations: tc.maxIterations,\n\t\t\t})\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"failed to create loop agent: %v\", err)\n\t\t\t}\n\t\t\trunner := testutil.NewTestAgentRunner(t, looper)\n\n\t\t\t// 2. Execution and Assertion\n\t\t\teventCount := 0\n\t\t\tev := runner.Run(t, \"id\", \"message\")\n\n\t\t\tfor got, err := range ev {\n\t\t\t\tif err != nil {\n\t\t\t\t\t// Check if an error was expected\n\t\t\t\t\tt.Fatalf(\"runner returned unexpected error: %v\", err)\n\t\t\t\t\t// If error was expected, we can stop here or check for a specific error type.\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif eventCount >= len(tc.want) {\n\t\t\t\t\tt.Fatalf(\"stream generated more values than the expected %d. Got: %+v\", len(tc.want), got.Content)\n\t\t\t\t}\n\n\t\t\t\tif diff := cmp.Diff(tc.want[eventCount], got.Content, cmpopts.IgnoreFields(genai.FunctionCall{}, \"ID\"),\n\t\t\t\t\tcmpopts.IgnoreFields(genai.FunctionResponse{}, \"ID\")); diff != \"\" {\n\t\t\t\t\tt.Errorf(\"LoopAgent Run() mismatch (-want +got):\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\teventCount++\n\t\t\t}\n\n\t\t\t// Final check on the number of events\n\t\t\tif eventCount != len(tc.want) {\n\t\t\t\tt.Errorf(\"unexpected stream length, want %d got %d\", len(tc.want), eventCount)\n\t\t\t}\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "tool/functiontool/function.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Package functiontool provides a tool that wraps a Go function.\npackage functiontool\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"reflect\"\n\t\"runtime/debug\"\n\n\t\"github.com/google/jsonschema-go/jsonschema\"\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/internal/toolinternal/toolutils\"\n\t\"google.golang.org/adk/internal/typeutil\"\n\t\"google.golang.org/adk/model\"\n\t\"google.golang.org/adk/tool\"\n)\n\n// FunctionTool: borrow implementation from MCP go.\n\n// Config is the input to the NewFunctionTool function.\ntype Config struct {\n\t// The name of this tool.\n\tName string\n\t// A human-readable description of the tool.\n\tDescription string\n\t// An optional JSON schema object defining the expected parameters for the tool.\n\t// If it is nil, FunctionTool tries to infer the schema based on the handler type.\n\tInputSchema *jsonschema.Schema\n\t// An optional JSON schema object defining the structure of the tool's output.\n\t// If it is nil, FunctionTool tries to infer the schema based on the handler type.\n\tOutputSchema *jsonschema.Schema\n\t// IsLongRunning makes a FunctionTool a long-running operation.\n\tIsLongRunning bool\n\n\t// RequireConfirmation flags whether this tool must always ask for user confirmation\n\t// before execution. If set to true, the ADK framework will automatically initiate\n\t// a Human-in-the-Loop (HITL) confirmation request when this tool is invoked.\n\tRequireConfirmation bool\n\n\t// RequireConfirmationProvider allows for dynamic determination of whether\n\t// user confirmation is needed. This field is a function called at runtime to decide if\n\t// a confirmation request should be sent. The function takes the tool's input parameters as arguments.\n\t// This provider offers more flexibility than the static RequireConfirmation flag,\n\t// enabling conditional confirmation based on the invocation details.\n\t// If set, this often takes precedence over the RequireConfirmation flag.\n\t//\n\t// Required signature for a provider function:\n\t// func(toolInput ToolArgs) (bool)\n\t// where ToolArgs is the input type of your go function\n\t// Returning true means confirmation is required.\n\tRequireConfirmationProvider any\n}\n\n// Func represents a Go function that can be wrapped in a tool.\n// It takes a tool.Context and a generic argument type, and returns a generic result type.\ntype Func[TArgs, TResults any] func(tool.Context, TArgs) (TResults, error)\n\n// ErrInvalidArgument indicates the input parameter type is invalid.\nvar ErrInvalidArgument = errors.New(\"invalid argument\")\n\n// New creates a new tool with a name, description, and the provided handler.\n// Input schema is automatically inferred from the input and output types.\nfunc New[TArgs, TResults any](cfg Config, handler Func[TArgs, TResults]) (tool.Tool, error) {\n\t// TODO: How can we improve UX for functions that does not require an argument, returns a simple type value, or returns a no result?\n\t// https://github.com/modelcontextprotocol/go-sdk/discussions/37\n\n\tvar zeroArgs TArgs\n\targsType := reflect.TypeOf(zeroArgs)\n\tfor argsType != nil && argsType.Kind() == reflect.Pointer {\n\t\targsType = argsType.Elem()\n\t}\n\tif argsType == nil || (argsType.Kind() != reflect.Struct && argsType.Kind() != reflect.Map) {\n\t\treturn nil, fmt.Errorf(\"input must be a struct or a map or a pointer to those types, but received: %v: %w\", argsType, ErrInvalidArgument)\n\t}\n\n\tischema, err := resolvedSchema[TArgs](cfg.InputSchema)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to infer input schema: %w\", err)\n\t}\n\toschema, err := resolvedSchema[TResults](cfg.OutputSchema)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to infer output schema: %w\", err)\n\t}\n\n\tvar confirmWrapper func(TArgs) bool\n\n\tif cfg.RequireConfirmationProvider != nil {\n\t\t// Attempt to cast the interface directly to the function signature\n\t\tfn, ok := cfg.RequireConfirmationProvider.(func(TArgs) bool)\n\t\tif !ok {\n\t\t\treturn nil, fmt.Errorf(\"error RequireConfirmationProvider must be a function with signature func(%T) bool\", *new(TArgs))\n\t\t}\n\t\tconfirmWrapper = fn\n\t}\n\n\treturn &functionTool[TArgs, TResults]{\n\t\tcfg:                         cfg,\n\t\tinputSchema:                 ischema,\n\t\toutputSchema:                oschema,\n\t\thandler:                     handler,\n\t\trequireConfirmation:         cfg.RequireConfirmation,\n\t\trequireConfirmationProvider: confirmWrapper,\n\t}, nil\n}\n\n// functionTool wraps a Go function.\ntype functionTool[TArgs, TResults any] struct {\n\tcfg Config\n\n\t// A JSON Schema object defining the expected parameters for the tool.\n\tinputSchema *jsonschema.Resolved\n\t// A JSON Schema object defining the result of the tool.\n\toutputSchema *jsonschema.Resolved\n\n\t// handler is the Go function.\n\thandler Func[TArgs, TResults]\n\n\trequireConfirmation bool\n\n\trequireConfirmationProvider func(TArgs) bool\n}\n\n// Description implements tool.Tool.\nfunc (f *functionTool[TArgs, TResults]) Description() string {\n\treturn f.cfg.Description\n}\n\n// Name implements tool.Tool.\nfunc (f *functionTool[TArgs, TResults]) Name() string {\n\treturn f.cfg.Name\n}\n\n// IsLongRunning implements tool.Tool.\nfunc (f *functionTool[TArgs, TResults]) IsLongRunning() bool {\n\treturn f.cfg.IsLongRunning\n}\n\n// ProcessRequest packs the function tool's declaration into the LLM request.\nfunc (f *functionTool[TArgs, TResults]) ProcessRequest(ctx tool.Context, req *model.LLMRequest) error {\n\treturn toolutils.PackTool(req, f)\n}\n\n// FunctionDeclaration implements interfaces.FunctionTool.\nfunc (f *functionTool[TArgs, TResults]) Declaration() *genai.FunctionDeclaration {\n\tdecl := &genai.FunctionDeclaration{\n\t\tName:        f.Name(),\n\t\tDescription: f.Description(),\n\t}\n\tif f.inputSchema != nil {\n\t\tdecl.ParametersJsonSchema = f.inputSchema.Schema()\n\t}\n\tif f.outputSchema != nil {\n\t\tdecl.ResponseJsonSchema = f.outputSchema.Schema()\n\t}\n\n\tif f.cfg.IsLongRunning {\n\t\tinstruction := \"NOTE: This is a long-running operation. Do not call this tool again if it has already returned some intermediate or pending status.\"\n\t\tif decl.Description != \"\" {\n\t\t\tdecl.Description += \"\\n\\n\" + instruction\n\t\t} else {\n\t\t\tdecl.Description = instruction\n\t\t}\n\t}\n\n\treturn decl\n}\n\n// Run executes the tool with the provided context and yields events.\nfunc (f *functionTool[TArgs, TResults]) Run(ctx tool.Context, args any) (result map[string]any, err error) {\n\t// TODO: Handle function call request from tc.InvocationContext.\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\terr = fmt.Errorf(\"panic in tool %q: %v\\nstack: %s\", f.Name(), r, debug.Stack())\n\t\t}\n\t}()\n\n\tm, ok := args.(map[string]any)\n\tif !ok {\n\t\treturn nil, fmt.Errorf(\"unexpected args type, got: %T\", args)\n\t}\n\tinput, err := typeutil.ConvertToWithJSONSchema[map[string]any, TArgs](m, f.inputSchema)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tif confirmation := ctx.ToolConfirmation(); confirmation != nil {\n\t\tif !confirmation.Confirmed {\n\t\t\treturn nil, fmt.Errorf(\"error tool %q %w\", f.Name(), tool.ErrConfirmationRejected)\n\t\t}\n\t} else {\n\t\trequireConfirmation := f.requireConfirmation\n\n\t\t// Only run the potentially expensive provider if the static flag didn't already trigger it\n\t\t// Provider takes precedence/overrides:\n\t\tif f.requireConfirmationProvider != nil {\n\t\t\trequireConfirmation = f.requireConfirmationProvider(input)\n\t\t}\n\n\t\tif requireConfirmation {\n\t\t\terr := ctx.RequestConfirmation(\n\t\t\t\tfmt.Sprintf(\"Please approve or reject the tool call %s() by responding with a FunctionResponse with an expected ToolConfirmation payload.\",\n\t\t\t\t\tf.Name()), nil)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\tctx.Actions().SkipSummarization = true\n\t\t\treturn nil, fmt.Errorf(\"error tool %q %w\", f.Name(), tool.ErrConfirmationRequired)\n\t\t}\n\t}\n\n\toutput, err := f.handler(ctx, input)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tresp, err := typeutil.ConvertToWithJSONSchema[TResults, map[string]any](output, f.outputSchema)\n\tif err == nil { // all good\n\t\treturn resp, nil\n\t}\n\n\t// Specs requires the result to be a map (dict in python). python impl allows basic types when building response event\n\t// functions.py __build_response_event does the following\n\t// if not isinstance(function_result, dict):\n\t// \t\tfunction_result = {'result': function_result}\n\tif f.outputSchema != nil {\n\t\tif err1 := f.outputSchema.Validate(output); err1 != nil {\n\t\t\treturn resp, err // if it fails propagate original err.\n\t\t}\n\t}\n\twrappedOutput := map[string]any{\"result\": output}\n\treturn wrappedOutput, nil\n}\n\n// ** NOTE FOR REVIEWERS **\n// Initially I started to borrow the design of the MCP ServerTool and\n// ToolHandlerFor/ToolHandler [1], but got diverged.\n//  * MCP ServerTool provides direct access to mcp.CallToolResult message\n//    but we expect Function in our case is a simple wrapper around a Go\n//    function, and does not need to worry about how the result is translated\n//    in genai.Content.\n//  * Function returns only TResults, not (TResults, error). If the user\n//    function can return an error, that needs to be included in the output\n//    json schema. And for function that never returns an error, I think it\n//    gets less uglier.\n//  * MCP ToolHandler expects mcp.ServerSession. types.ToolContext may be close\n//    to it, but we don't need to expose this to user function\n//    (similar to ADK Python FunctionTool [2])\n// References\n//  [1] MCP SDK https://pkg.go.dev/github.com/modelcontextprotocol/go-sdk@v0.0.0-20250625213837-ff0d746521c4/mcp#ToolHandler\n//  [2] ADK Python https://github.com/google/adk-python/blob/04de3e197d7a57935488eb7bfa647c7ab62cd9d9/src/google/adk/tools/function_tool.py#L110-L112\n\nfunc resolvedSchema[T any](override *jsonschema.Schema) (*jsonschema.Resolved, error) {\n\t// TODO: check if override schema is compatible with T.\n\tif override != nil {\n\t\treturn override.Resolve(nil)\n\t}\n\tschema, err := jsonschema.For[T](nil)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn schema.Resolve(nil)\n}\n"
  },
  {
    "path": "tool/functiontool/function_test.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage functiontool_test\n\nimport (\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"iter\"\n\t\"path/filepath\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/google/go-cmp/cmp\"\n\t\"github.com/google/go-cmp/cmp/cmpopts\"\n\t\"github.com/google/jsonschema-go/jsonschema\"\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/agent/llmagent\"\n\ticontext \"google.golang.org/adk/internal/context\"\n\t\"google.golang.org/adk/internal/testutil\"\n\t\"google.golang.org/adk/internal/toolinternal\"\n\t\"google.golang.org/adk/internal/typeutil\"\n\t\"google.golang.org/adk/model\"\n\t\"google.golang.org/adk/model/gemini\"\n\t\"google.golang.org/adk/session\"\n\t\"google.golang.org/adk/tool\"\n\t\"google.golang.org/adk/tool/functiontool\"\n\t\"google.golang.org/adk/tool/toolconfirmation\"\n)\n\ntype SumArgs struct {\n\tA int `json:\"a\"` // an integer to sum\n\tB int `json:\"b\"` // another integer to sum\n}\ntype SumResult struct {\n\tSum int `json:\"sum\"` // the sum of two integers\n}\n\nfunc sumFunc(ctx tool.Context, input SumArgs) (SumResult, error) {\n\treturn SumResult{Sum: input.A + input.B}, nil\n}\n\nfunc ExampleNew() {\n\tsumTool, err := functiontool.New(functiontool.Config{\n\t\tName:        \"sum\",\n\t\tDescription: \"sums two integers\",\n\t}, sumFunc)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\t_ = sumTool // use the tool\n}\n\nfunc createToolContext(t *testing.T) tool.Context {\n\tinvCtx := icontext.NewInvocationContext(t.Context(), icontext.InvocationContextParams{})\n\treturn toolinternal.NewToolContext(invCtx, \"\", &session.EventActions{}, nil)\n}\n\n//go:generate go test -v -httprecord=.*\n\nfunc TestFunctionTool_Simple(t *testing.T) {\n\tctx := t.Context()\n\t// TODO: this model creation code was copied from model/genai_test.go. Refactor so both tests can share.\n\tmodelName := \"gemini-2.5-flash\"\n\treplayTrace := filepath.Join(\"testdata\", t.Name()+\".httprr\")\n\tcfg := testutil.NewGeminiTestClientConfig(t, replayTrace)\n\tm, err := gemini.NewModel(ctx, modelName, cfg)\n\tif err != nil {\n\t\tt.Fatalf(\"model.NewGeminiModel(%q) failed: %v\", modelName, err)\n\t}\n\n\ttype Args struct {\n\t\tCity string `json:\"city\"`\n\t}\n\ttype Result struct {\n\t\tReport string `json:\"report\"`\n\t\tStatus string `json:\"status\"`\n\t}\n\tresultSet := map[string]Result{\n\t\t\"london\": {\n\t\t\tStatus: \"success\",\n\t\t\tReport: \"The current weather in London is cloudy with a temperature of18 degrees Celsius and a chance of rain.\",\n\t\t},\n\t\t\"paris\": {\n\t\t\tStatus: \"success\",\n\t\t\tReport: \"The weather in Paris is sunny with a temperature of 25 derees Celsius.\",\n\t\t},\n\t}\n\n\tweatherReport := func(ctx tool.Context, input Args) (Result, error) {\n\t\tcity := strings.ToLower(input.City)\n\t\tif ret, ok := resultSet[city]; ok {\n\t\t\treturn ret, nil\n\t\t}\n\t\treturn Result{}, fmt.Errorf(\"weather information for %q is not available\", city)\n\t}\n\n\tweatherReportTool, err := functiontool.New(\n\t\tfunctiontool.Config{\n\t\t\tName:        \"get_weather_report\",\n\t\t\tDescription: \"Retrieves the current weather report for a specified city.\",\n\t\t},\n\t\tweatherReport)\n\tif err != nil {\n\t\tt.Fatalf(\"NewFunctionTool failed: %v\", err)\n\t}\n\n\tfor _, tc := range []struct {\n\t\tname    string\n\t\tprompt  string\n\t\twant    Result\n\t\tisError bool\n\t}{\n\t\t{\n\t\t\tname:    \"london\",\n\t\t\tprompt:  \"Report the current weather of the capital city of U.K.\",\n\t\t\twant:    resultSet[\"london\"],\n\t\t\tisError: false,\n\t\t},\n\t\t{\n\t\t\tname:    \"paris\",\n\t\t\tprompt:  \"How is the weather of Paris now?\",\n\t\t\twant:    resultSet[\"paris\"],\n\t\t\tisError: false,\n\t\t},\n\t\t{\n\t\t\tname:    \"new york\",\n\t\t\tprompt:  \"Tell me about the current weather in New York\",\n\t\t\twant:    Result{},\n\t\t\tisError: true,\n\t\t},\n\t} {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t// TODO: replace with testing using LLMAgent, instead of directly calling the model.\n\t\t\tvar req model.LLMRequest\n\t\t\trequestProcessor, ok := weatherReportTool.(toolinternal.RequestProcessor)\n\t\t\tif !ok {\n\t\t\t\tt.Fatal(\"weatherReportTool does not implement itype.RequestProcessor\")\n\t\t\t}\n\t\t\tif err := requestProcessor.ProcessRequest(nil, &req); err != nil {\n\t\t\t\tt.Fatalf(\"weatherReportTool.ProcessRequest failed: %v\", err)\n\t\t\t}\n\t\t\tif req.Config == nil || len(req.Config.Tools) != 1 {\n\t\t\t\tt.Fatalf(\"weatherReportTool.ProcessRequest did not configure tool info in LLMRequest: %v\", req)\n\t\t\t}\n\t\t\treq.Contents = genai.Text(tc.prompt)\n\t\t\tresp, err := readFirstResponse[*genai.FunctionCall](\n\t\t\t\tm.GenerateContent(ctx, &req, false),\n\t\t\t)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"GenerateContent(%v) failed: %v\", req, err)\n\t\t\t}\n\t\t\tif resp.Name != \"get_weather_report\" || len(resp.Args) == 0 {\n\t\t\t\tt.Fatalf(\"unexpected function call %v\", resp)\n\t\t\t}\n\t\t\t// Call the function.\n\t\t\tfuncTool, ok := weatherReportTool.(toolinternal.FunctionTool)\n\t\t\tif !ok {\n\t\t\t\tt.Fatal(\"weatherReportTool does not implement itype.RequestProcessor\")\n\t\t\t}\n\t\t\tcallResult, err := funcTool.Run(createToolContext(t), resp.Args)\n\t\t\tif tc.isError {\n\t\t\t\tif err == nil {\n\t\t\t\t\tt.Fatalf(\"weatherReportTool.Run(%v) expected to fail but got success with result %v\", resp.Args, callResult)\n\t\t\t\t}\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"weatherReportTool.Run failed: %v\", err)\n\t\t\t}\n\t\t\tgot, err := typeutil.ConvertToWithJSONSchema[map[string]any, Result](callResult, nil)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"weatherReportTool.Run returned unexpected result of type %[1]T: %[1]v\", callResult)\n\t\t\t}\n\t\t\twant := tc.want\n\t\t\tif diff := cmp.Diff(want, got); diff != \"\" {\n\t\t\t\tt.Errorf(\"weatherReportTool.Run returned unexpected result (-want +got):\\n%s\", diff)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestFunctionTool_DifferentFunctionDeclarations_ConsolidatedInOneGenAiTool(t *testing.T) {\n\t// First tool\n\ttype IntInput struct {\n\t\tX int `json:\"x\"`\n\t}\n\ttype IntOutput struct {\n\t\tResult int `json:\"result\"`\n\t}\n\tidentityFunc := func(ctx tool.Context, input IntInput) (IntOutput, error) {\n\t\treturn IntOutput{Result: input.X}, nil\n\t}\n\tidentityTool, err := functiontool.New(functiontool.Config{\n\t\tName:        \"identity\",\n\t\tDescription: \"returns the input value\",\n\t}, identityFunc)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\t// Second tool\n\ttype StringInput struct {\n\t\tValue string `json:\"value\"`\n\t}\n\ttype StringOutput struct {\n\t\tResult string `json:\"result\"`\n\t}\n\tstringIdentityFunc := func(ctx tool.Context, input StringInput) (StringOutput, error) {\n\t\treturn StringOutput{Result: input.Value}, nil\n\t}\n\tstringIdentityTool, err := functiontool.New(\n\t\tfunctiontool.Config{\n\t\t\tName:        \"string_identity\",\n\t\t\tDescription: \"returns the input value\",\n\t\t},\n\t\tstringIdentityFunc)\n\tif err != nil {\n\t\tt.Fatalf(\"NewFunctionTool failed: %v\", err)\n\t}\n\n\tvar req model.LLMRequest\n\trequestProcessor, ok := identityTool.(toolinternal.RequestProcessor)\n\tif !ok {\n\t\tt.Fatal(\"identityTool does not implement itype.RequestProcessor\")\n\t}\n\tif err := requestProcessor.ProcessRequest(nil, &req); err != nil {\n\t\tt.Fatalf(\"identityTool.ProcessRequest failed: %v\", err)\n\t}\n\trequestProcessor, ok = stringIdentityTool.(toolinternal.RequestProcessor)\n\tif !ok {\n\t\tt.Fatal(\"stringIdentityTool does not implement itype.RequestProcessor\")\n\t}\n\tif err := requestProcessor.ProcessRequest(nil, &req); err != nil {\n\t\tt.Fatalf(\"stringIdentityTool.ProcessRequest failed: %v\", err)\n\t}\n\n\tif len(req.Config.Tools) != 1 {\n\t\tt.Errorf(\"number of tools should be one, got: %d\", len(req.Config.Tools))\n\t}\n\tif len(req.Config.Tools[0].FunctionDeclarations) != 2 {\n\t\tt.Errorf(\"number of function declarations should be two, got: %d\", len(req.Config.Tools[0].FunctionDeclarations))\n\t}\n}\n\nfunc TestFunctionTool_ReturnsBasicType(t *testing.T) {\n\ttype Args struct {\n\t\tCity string `json:\"city\"`\n\t}\n\tresultSet := map[string]string{\n\t\t\"london\": \"The current weather in London is cloudy with a temperature of18 degrees Celsius and a chance of rain.\",\n\t\t\"paris\":  \"The weather in Paris is sunny with a temperature of 25 derees Celsius.\",\n\t}\n\n\tweatherReport := func(ctx tool.Context, input Args) (string, error) {\n\t\tcity := strings.ToLower(input.City)\n\t\tif ret, ok := resultSet[city]; ok {\n\t\t\treturn ret, nil\n\t\t}\n\t\treturn fmt.Sprintf(\"Weather information for %q is not available.\", city), nil\n\t}\n\n\tweatherReportTool, err := functiontool.New(\n\t\tfunctiontool.Config{\n\t\t\tName:        \"get_weather_report\",\n\t\t\tDescription: \"Retrieves the current weather report for a specified city.\",\n\t\t},\n\t\tweatherReport)\n\tif err != nil {\n\t\tt.Fatalf(\"NewFunctionTool failed: %v\", err)\n\t}\n\n\tfor _, tc := range []struct {\n\t\targs   map[string]any\n\t\tname   string\n\t\tprompt string\n\t\twant   string\n\t}{\n\t\t{\n\t\t\targs:   map[string]any{\"city\": \"london\"},\n\t\t\tname:   \"london\",\n\t\t\tprompt: \"Report the current weather of the capital city of U.K.\",\n\t\t\twant:   resultSet[\"london\"],\n\t\t},\n\t\t{\n\t\t\targs:   map[string]any{\"city\": \"paris\"},\n\t\t\tname:   \"paris\",\n\t\t\tprompt: \"How is the weather of Paris now?\",\n\t\t\twant:   resultSet[\"paris\"],\n\t\t},\n\t\t{\n\t\t\targs:   map[string]any{\"city\": \"new york\"},\n\t\t\tname:   \"new york\",\n\t\t\tprompt: \"Tell me about the current weather in New York\",\n\t\t\twant:   `Weather information for \"new york\" is not available.`,\n\t\t},\n\t} {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t// TODO: replace with testing using LLMAgent, instead of directly calling the model.\n\t\t\tvar req model.LLMRequest\n\t\t\trequestProcessor, ok := weatherReportTool.(toolinternal.RequestProcessor)\n\t\t\tif !ok {\n\t\t\t\tt.Fatal(\"weatherReportTool does not implement itype.RequestProcessor\")\n\t\t\t}\n\t\t\tif err := requestProcessor.ProcessRequest(nil, &req); err != nil {\n\t\t\t\tt.Fatalf(\"weatherReportTool.ProcessRequest failed: %v\", err)\n\t\t\t}\n\t\t\tif req.Config == nil || len(req.Config.Tools) != 1 {\n\t\t\t\tt.Fatalf(\"weatherReportTool.ProcessRequest did not configure tool info in LLMRequest: %v\", req)\n\t\t\t}\n\t\t\t// Call the function.\n\t\t\tfuncTool, ok := weatherReportTool.(toolinternal.FunctionTool)\n\t\t\tif !ok {\n\t\t\t\tt.Fatal(\"weatherReportTool does not implement itype.RequestProcessor\")\n\t\t\t}\n\t\t\tcallResult, err := funcTool.Run(createToolContext(t), tc.args)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"weatherReportTool.Run failed: %v\", err)\n\t\t\t}\n\t\t\tgot, err := typeutil.ConvertToWithJSONSchema[map[string]any, map[string]string](callResult, nil)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"weatherReportTool.Run returned unexpected result of type %[1]T: %[1]v\", callResult)\n\t\t\t}\n\t\t\tgotVal, ok := got[\"result\"]\n\t\t\tif !ok {\n\t\t\t\tt.Fatalf(\"function response, incorrect %q value\", got[\"result\"])\n\t\t\t}\n\t\t\twant := tc.want\n\t\t\tif diff := cmp.Diff(want, gotVal); diff != \"\" {\n\t\t\t\tt.Errorf(\"weatherReportTool.Run returned unexpected result (-want +got):\\n%s\", diff)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestFunctionTool_MapInput(t *testing.T) {\n\ttype Output struct {\n\t\tSum int `json:\"sum\"`\n\t}\n\tsumTool, err := functiontool.New(\n\t\tfunctiontool.Config{\n\t\t\tName:        \"sum_map\",\n\t\t\tDescription: \"sums numbers provided in a map input\",\n\t\t},\n\t\tfunc(ctx tool.Context, input map[string]int) (Output, error) {\n\t\t\treturn Output{Sum: input[\"a\"] + input[\"b\"]}, nil\n\t\t})\n\tif err != nil {\n\t\tt.Fatalf(\"NewFunctionTool failed: %v\", err)\n\t}\n\n\tfuncTool, ok := sumTool.(toolinternal.FunctionTool)\n\tif !ok {\n\t\tt.Fatal(\"sumTool does not implement itype.RequestProcessor\")\n\t}\n\tcallResult, err := funcTool.Run(createToolContext(t), map[string]any{\"a\": 2, \"b\": 3})\n\tif err != nil {\n\t\tt.Fatalf(\"sumTool.Run failed: %v\", err)\n\t}\n\tgot, err := typeutil.ConvertToWithJSONSchema[map[string]any, Output](callResult, nil)\n\tif err != nil {\n\t\tt.Fatalf(\"sumTool.Run returned unexpected result of type %[1]T: %[1]v\", callResult)\n\t}\n\twant := Output{Sum: 5}\n\tif diff := cmp.Diff(want, got); diff != \"\" {\n\t\tt.Errorf(\"sumTool.Run returned unexpected result (-want +got):\\n%s\", diff)\n\t}\n}\n\nfunc readFirstResponse[T any](s iter.Seq2[*model.LLMResponse, error]) (T, error) {\n\tvar zero T\n\tdo := func(s iter.Seq2[*model.LLMResponse, error]) (any, error) {\n\t\tfor resp, err := range s {\n\t\t\tif err != nil {\n\t\t\t\treturn zero, err\n\t\t\t}\n\t\t\tif resp.Content == nil || len(resp.Content.Parts) == 0 {\n\t\t\t\treturn zero, fmt.Errorf(\"encountered an empty response: %v\", resp)\n\t\t\t}\n\t\t\tfor _, p := range resp.Content.Parts {\n\t\t\t\tswitch any(zero).(type) {\n\t\t\t\tcase string:\n\t\t\t\t\tif p.Text != \"\" {\n\t\t\t\t\t\treturn p.Text, nil\n\t\t\t\t\t}\n\t\t\t\tcase *genai.FunctionCall:\n\t\t\t\t\tif p.FunctionCall != nil {\n\t\t\t\t\t\treturn p.FunctionCall, nil\n\t\t\t\t\t}\n\t\t\t\tcase *genai.FunctionResponse:\n\t\t\t\t\tif p.FunctionResponse != nil {\n\t\t\t\t\t\treturn p.FunctionResponse, nil\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn zero, fmt.Errorf(\"response does not contain data for %T: %v\", zero, resp)\n\t\t}\n\t\treturn zero, fmt.Errorf(\"no response message was received\")\n\t}\n\tv, err := do(s)\n\tif err != nil {\n\t\treturn zero, err\n\t}\n\tif v, ok := v.(T); ok {\n\t\treturn v, nil\n\t}\n\tpanic(fmt.Sprintf(\"do extracted unexpected type = %[1]T(%[1]v), want %T\", v, zero))\n}\n\nfunc TestFunctionTool_CustomSchema(t *testing.T) {\n\ttype Args struct {\n\t\t// Either apple or orange, nothing else.\n\t\tFruit string `json:\"fruit\"`\n\t}\n\tischema, err := jsonschema.For[Args](nil)\n\tif err != nil {\n\t\tt.Fatalf(\"jsonschema.For[Args]() failed: %v\", err)\n\t}\n\tfruit, ok := ischema.Properties[\"fruit\"]\n\tif !ok {\n\t\tt.Fatalf(\"unexpeced jsonschema: missing 'fruit': %+v\", ischema)\n\t}\n\tfruit.Description = \"print the remaining quantity of the item.\"\n\tfruit.Enum = []any{\"mandarin\", \"kiwi\"}\n\n\tinventoryTool, err := functiontool.New(functiontool.Config{\n\t\tName:        \"print_quantity\",\n\t\tDescription: \"print the remaining quantity of the given fruit.\",\n\t\tInputSchema: ischema,\n\t}, func(ctx tool.Context, input Args) (any, error) {\n\t\tfruit := strings.ToLower(input.Fruit)\n\t\tif fruit != \"mandarin\" && fruit != \"kiwi\" {\n\t\t\tt.Errorf(\"unexpected fruit: %q\", fruit)\n\t\t}\n\t\treturn nil, nil // always return nil.\n\t})\n\tif err != nil {\n\t\tt.Fatalf(\"NewFunctionTool failed: %v\", err)\n\t}\n\n\tt.Run(\"ProcessRequest\", func(t *testing.T) {\n\t\tvar req model.LLMRequest\n\t\trequestProcessor, ok := inventoryTool.(toolinternal.RequestProcessor)\n\t\tif !ok {\n\t\t\tt.Fatal(\"inventoryTool does not implement itype.RequestProcessor\")\n\t\t}\n\t\tif err := requestProcessor.ProcessRequest(nil, &req); err != nil {\n\t\t\tt.Fatalf(\"inventoryTool.ProcessRequest failed: %v\", err)\n\t\t}\n\t\tdecl := toolDeclaration(req.Config)\n\t\tif decl == nil {\n\t\t\tt.Fatalf(\"inventoryTool.ProcessRequest did not configure function declaration: %v\", req)\n\t\t\t// to prevent SA5011: possible nil pointer dereference (staticcheck)\n\t\t\treturn\n\t\t}\n\t\tif got, want := decl.Name, inventoryTool.Name(); got != want {\n\t\t\tt.Errorf(\"inventoryTool function declaration name = %q, want %q\", got, want)\n\t\t}\n\t\tif got, want := decl.Description, inventoryTool.Description(); got != want {\n\t\t\tt.Errorf(\"inventoryTool function declaration description = %q, want %q\", got, want)\n\t\t}\n\t\tif got, want := stringify(decl.ParametersJsonSchema), stringify(ischema); got != want {\n\t\t\tt.Errorf(\"inventoryTool function declaration parameter json schema = %q, want %q\", got, want)\n\t\t}\n\t\tif got, want := stringify(decl.ResponseJsonSchema), stringify(&jsonschema.Schema{}); got != want {\n\t\t\tt.Errorf(\"inventoryTool function response json schema = %q, want %q\", got, want)\n\t\t}\n\t})\n\n\tt.Run(\"Run\", func(t *testing.T) {\n\t\ttestCases := []struct {\n\t\t\tname    string\n\t\t\tin      map[string]any\n\t\t\twantErr bool\n\t\t}{\n\t\t\t{\n\t\t\t\tname:    \"valid_item\",\n\t\t\t\tin:      map[string]any{\"fruit\": \"mandarin\"},\n\t\t\t\twantErr: false,\n\t\t\t},\n\t\t\t{\n\t\t\t\tname:    \"invalid_item\",\n\t\t\t\tin:      map[string]any{\"fruit\": \"banana\"},\n\t\t\t\twantErr: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tname:    \"unexpected_type\",\n\t\t\t\tin:      map[string]any{\"fruit\": 1},\n\t\t\t\twantErr: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tname:    \"nil\",\n\t\t\t\tin:      nil,\n\t\t\t\twantErr: true,\n\t\t\t},\n\t\t}\n\t\tfor _, tc := range testCases {\n\t\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t\tfuncTool, ok := inventoryTool.(toolinternal.FunctionTool)\n\t\t\t\tif !ok {\n\t\t\t\t\tt.Fatal(\"inventoryTool does not implement itype.RequestProcessor\")\n\t\t\t\t}\n\t\t\t\tret, err := funcTool.Run(createToolContext(t), tc.in)\n\t\t\t\t// ret is expected to be nil always.\n\t\t\t\tif tc.wantErr && err == nil {\n\t\t\t\t\tt.Errorf(\"inventoryTool.Run = (%v, %v), want error\", ret, err)\n\t\t\t\t}\n\t\t\t\tif !tc.wantErr && (err != nil || ret != nil) {\n\t\t\t\t\t// TODO: fix, for \"valid_item\" case now it returns empty map instead of nil\n\t\t\t\t\tif len(ret) != 0 {\n\t\t\t\t\t\tt.Errorf(\"inventoryTool.Run = (%v, %v), want (nil, nil)\", ret, err)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\t})\n}\n\nfunc toolDeclaration(cfg *genai.GenerateContentConfig) *genai.FunctionDeclaration {\n\tif cfg == nil || len(cfg.Tools) == 0 {\n\t\treturn nil\n\t}\n\tt := cfg.Tools[0]\n\tif len(t.FunctionDeclarations) == 0 {\n\t\treturn nil\n\t}\n\treturn t.FunctionDeclarations[0]\n}\n\nfunc stringify(v any) string {\n\tx, err := json.MarshalIndent(v, \"\", \" \")\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn string(x)\n}\n\ntype SimpleArgs struct {\n\tNum int\n}\n\nfunc okFunc(_ tool.Context, _ SimpleArgs) (string, error) {\n\treturn \"ok\", nil\n}\n\nfunc TestToolConfirmation(t *testing.T) {\n\ttestCases := []struct {\n\t\tname                    string\n\t\ttoolConfig              functiontool.Config\n\t\targs                    map[string]any\n\t\tconfirmFunctionResponse *genai.FunctionResponse // User's confirmation response\n\t\twant                    []*genai.Content\n\t}{\n\t\t{\n\t\t\tname: \"No Confirmation Required\",\n\t\t\ttoolConfig: functiontool.Config{\n\t\t\t\tName: \"test_tool\",\n\t\t\t},\n\t\t\targs: map[string]any{\"Num\": 1},\n\t\t\twant: []*genai.Content{\n\t\t\t\tgenai.NewContentFromFunctionCall(\"test_tool\", map[string]any{\"Num\": 1}, \"model\"),\n\t\t\t\tgenai.NewContentFromFunctionResponse(\"test_tool\", map[string]any{\"result\": \"ok\"}, \"user\"),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"Confirmation Required\",\n\t\t\ttoolConfig: functiontool.Config{\n\t\t\t\tName:                \"test_tool\",\n\t\t\t\tRequireConfirmation: true,\n\t\t\t},\n\t\t\targs: map[string]any{\"Num\": 1},\n\t\t\twant: []*genai.Content{\n\t\t\t\tgenai.NewContentFromFunctionCall(\"test_tool\", map[string]any{\"Num\": 1}, \"model\"),\n\t\t\t\tgenai.NewContentFromFunctionCall(toolconfirmation.FunctionCallName, map[string]any{\n\t\t\t\t\t\"originalFunctionCall\": &genai.FunctionCall{\n\t\t\t\t\t\tArgs: map[string]any{\"Num\": 1},\n\t\t\t\t\t\tName: \"test_tool\",\n\t\t\t\t\t},\n\t\t\t\t\t\"toolConfirmation\": toolconfirmation.ToolConfirmation{\n\t\t\t\t\t\tHint: \"Please approve or reject the tool call test_tool() by responding with a FunctionResponse with an expected ToolConfirmation payload.\",\n\t\t\t\t\t},\n\t\t\t\t}, \"model\"),\n\t\t\t\tgenai.NewContentFromFunctionResponse(\"test_tool\", map[string]any{\n\t\t\t\t\t\"error\": errors.New(\"error tool \\\"test_tool\\\" requires confirmation, please approve or reject\"),\n\t\t\t\t}, \"user\"),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"Confirmation Required and is confirmed\",\n\t\t\ttoolConfig: functiontool.Config{\n\t\t\t\tName:                \"test_tool\",\n\t\t\t\tRequireConfirmation: true,\n\t\t\t},\n\t\t\targs:                    map[string]any{\"Num\": 1},\n\t\t\tconfirmFunctionResponse: &genai.FunctionResponse{Name: toolconfirmation.FunctionCallName, Response: map[string]any{\"confirmed\": true}},\n\t\t\twant: []*genai.Content{\n\t\t\t\tgenai.NewContentFromFunctionCall(\"test_tool\", map[string]any{\"Num\": 1}, \"model\"),\n\t\t\t\tgenai.NewContentFromFunctionCall(toolconfirmation.FunctionCallName, map[string]any{\n\t\t\t\t\t\"originalFunctionCall\": &genai.FunctionCall{\n\t\t\t\t\t\tArgs: map[string]any{\"Num\": 1},\n\t\t\t\t\t\tName: \"test_tool\",\n\t\t\t\t\t},\n\t\t\t\t\t\"toolConfirmation\": toolconfirmation.ToolConfirmation{\n\t\t\t\t\t\tHint: \"Please approve or reject the tool call test_tool() by responding with a FunctionResponse with an expected ToolConfirmation payload.\",\n\t\t\t\t\t},\n\t\t\t\t}, \"model\"),\n\t\t\t\tgenai.NewContentFromFunctionResponse(\"test_tool\", map[string]any{\n\t\t\t\t\t\"error\": errors.New(\"error tool \\\"test_tool\\\" requires confirmation, please approve or reject\"),\n\t\t\t\t}, \"user\"),\n\t\t\t\tgenai.NewContentFromFunctionResponse(\"test_tool\", map[string]any{\"result\": \"ok\"}, \"user\"),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"Confirmation Required and is rejected\",\n\t\t\ttoolConfig: functiontool.Config{\n\t\t\t\tName:                \"test_tool\",\n\t\t\t\tRequireConfirmation: true,\n\t\t\t},\n\t\t\targs:                    map[string]any{\"Num\": 1},\n\t\t\tconfirmFunctionResponse: &genai.FunctionResponse{Name: toolconfirmation.FunctionCallName, Response: map[string]any{\"confirmed\": false}},\n\t\t\twant: []*genai.Content{\n\t\t\t\tgenai.NewContentFromFunctionCall(\"test_tool\", map[string]any{\"Num\": 1}, \"model\"),\n\t\t\t\tgenai.NewContentFromFunctionCall(toolconfirmation.FunctionCallName, map[string]any{\n\t\t\t\t\t\"originalFunctionCall\": &genai.FunctionCall{\n\t\t\t\t\t\tArgs: map[string]any{\"Num\": 1},\n\t\t\t\t\t\tName: \"test_tool\",\n\t\t\t\t\t},\n\t\t\t\t\t\"toolConfirmation\": toolconfirmation.ToolConfirmation{\n\t\t\t\t\t\tHint: \"Please approve or reject the tool call test_tool() by responding with a FunctionResponse with an expected ToolConfirmation payload.\",\n\t\t\t\t\t},\n\t\t\t\t}, \"model\"),\n\t\t\t\tgenai.NewContentFromFunctionResponse(\"test_tool\", map[string]any{\n\t\t\t\t\t\"error\": errors.New(\"error tool \\\"test_tool\\\" requires confirmation, please approve or reject\"),\n\t\t\t\t}, \"user\"),\n\t\t\t\tgenai.NewContentFromFunctionResponse(\"test_tool\", map[string]any{\n\t\t\t\t\t\"error\": errors.New(\"error tool \\\"test_tool\\\" call is rejected\"),\n\t\t\t\t}, \"user\"),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"Conditional Confirmation Not Required\",\n\t\t\ttoolConfig: functiontool.Config{\n\t\t\t\tName: \"test_tool\",\n\t\t\t\tRequireConfirmationProvider: func(args SimpleArgs) bool {\n\t\t\t\t\treturn args.Num < 5\n\t\t\t\t},\n\t\t\t},\n\t\t\targs: map[string]any{\"Num\": 7},\n\t\t\twant: []*genai.Content{\n\t\t\t\tgenai.NewContentFromFunctionCall(\"test_tool\", map[string]any{\"Num\": 7}, \"model\"),\n\t\t\t\tgenai.NewContentFromFunctionResponse(\"test_tool\", map[string]any{\"result\": \"ok\"}, \"user\"),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"Conditional Confirmation Required\",\n\t\t\ttoolConfig: functiontool.Config{\n\t\t\t\tName: \"test_tool\",\n\t\t\t\tRequireConfirmationProvider: func(args SimpleArgs) bool {\n\t\t\t\t\treturn args.Num < 5\n\t\t\t\t},\n\t\t\t},\n\t\t\targs: map[string]any{\"Num\": 4},\n\t\t\twant: []*genai.Content{\n\t\t\t\tgenai.NewContentFromFunctionCall(\"test_tool\", map[string]any{\"Num\": 4}, \"model\"),\n\t\t\t\tgenai.NewContentFromFunctionCall(toolconfirmation.FunctionCallName, map[string]any{\n\t\t\t\t\t\"originalFunctionCall\": &genai.FunctionCall{\n\t\t\t\t\t\tArgs: map[string]any{\"Num\": 4},\n\t\t\t\t\t\tName: \"test_tool\",\n\t\t\t\t\t},\n\t\t\t\t\t\"toolConfirmation\": toolconfirmation.ToolConfirmation{\n\t\t\t\t\t\tHint: \"Please approve or reject the tool call test_tool() by responding with a FunctionResponse with an expected ToolConfirmation payload.\",\n\t\t\t\t\t},\n\t\t\t\t}, \"model\"),\n\t\t\t\tgenai.NewContentFromFunctionResponse(\"test_tool\", map[string]any{\n\t\t\t\t\t\"error\": errors.New(\"error tool \\\"test_tool\\\" requires confirmation, please approve or reject\"),\n\t\t\t\t}, \"user\"),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"Conditional Confirmation Required and is confirmed\",\n\t\t\ttoolConfig: functiontool.Config{\n\t\t\t\tName: \"test_tool\",\n\t\t\t\tRequireConfirmationProvider: func(args SimpleArgs) bool {\n\t\t\t\t\treturn args.Num < 5\n\t\t\t\t},\n\t\t\t},\n\t\t\targs:                    map[string]any{\"Num\": 4},\n\t\t\tconfirmFunctionResponse: &genai.FunctionResponse{Name: toolconfirmation.FunctionCallName, Response: map[string]any{\"confirmed\": true}},\n\t\t\twant: []*genai.Content{\n\t\t\t\tgenai.NewContentFromFunctionCall(\"test_tool\", map[string]any{\"Num\": 4}, \"model\"),\n\t\t\t\tgenai.NewContentFromFunctionCall(toolconfirmation.FunctionCallName, map[string]any{\n\t\t\t\t\t\"originalFunctionCall\": &genai.FunctionCall{\n\t\t\t\t\t\tArgs: map[string]any{\"Num\": 4},\n\t\t\t\t\t\tName: \"test_tool\",\n\t\t\t\t\t},\n\t\t\t\t\t\"toolConfirmation\": toolconfirmation.ToolConfirmation{\n\t\t\t\t\t\tHint: \"Please approve or reject the tool call test_tool() by responding with a FunctionResponse with an expected ToolConfirmation payload.\",\n\t\t\t\t\t},\n\t\t\t\t}, \"model\"),\n\t\t\t\tgenai.NewContentFromFunctionResponse(\"test_tool\", map[string]any{\n\t\t\t\t\t\"error\": errors.New(\"error tool \\\"test_tool\\\" requires confirmation, please approve or reject\"),\n\t\t\t\t}, \"user\"),\n\t\t\t\tgenai.NewContentFromFunctionResponse(\"test_tool\", map[string]any{\"result\": \"ok\"}, \"user\"),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"Conditional Confirmation Required and is rejected\",\n\t\t\ttoolConfig: functiontool.Config{\n\t\t\t\tName: \"test_tool\",\n\t\t\t\tRequireConfirmationProvider: func(args SimpleArgs) bool {\n\t\t\t\t\treturn args.Num < 5\n\t\t\t\t},\n\t\t\t},\n\t\t\targs:                    map[string]any{\"Num\": 4},\n\t\t\tconfirmFunctionResponse: &genai.FunctionResponse{Name: toolconfirmation.FunctionCallName, Response: map[string]any{\"confirmed\": false}},\n\t\t\twant: []*genai.Content{\n\t\t\t\tgenai.NewContentFromFunctionCall(\"test_tool\", map[string]any{\"Num\": 4}, \"model\"),\n\t\t\t\tgenai.NewContentFromFunctionCall(toolconfirmation.FunctionCallName, map[string]any{\n\t\t\t\t\t\"originalFunctionCall\": &genai.FunctionCall{\n\t\t\t\t\t\tArgs: map[string]any{\"Num\": 4},\n\t\t\t\t\t\tName: \"test_tool\",\n\t\t\t\t\t},\n\t\t\t\t\t\"toolConfirmation\": toolconfirmation.ToolConfirmation{\n\t\t\t\t\t\tHint: \"Please approve or reject the tool call test_tool() by responding with a FunctionResponse with an expected ToolConfirmation payload.\",\n\t\t\t\t\t},\n\t\t\t\t}, \"model\"),\n\t\t\t\tgenai.NewContentFromFunctionResponse(\"test_tool\", map[string]any{\n\t\t\t\t\t\"error\": errors.New(\"error tool \\\"test_tool\\\" requires confirmation, please approve or reject\"),\n\t\t\t\t}, \"user\"),\n\t\t\t\tgenai.NewContentFromFunctionResponse(\"test_tool\", map[string]any{\n\t\t\t\t\t\"error\": errors.New(\"error tool \\\"test_tool\\\" call is rejected\"),\n\t\t\t\t}, \"user\"),\n\t\t\t},\n\t\t},\n\t}\n\tfor _, tc := range testCases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\tmockModel := &testutil.MockModel{\n\t\t\t\tResponses: []*genai.Content{\n\t\t\t\t\tgenai.NewContentFromFunctionCall(\"test_tool\", tc.args, genai.RoleModel),\n\t\t\t\t},\n\t\t\t}\n\n\t\t\t// Setup tool\n\t\t\tmyTool, err := functiontool.New(tc.toolConfig, okFunc)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"Failed to create tool: %v\", err)\n\t\t\t}\n\n\t\t\ta, err := llmagent.New(llmagent.Config{\n\t\t\t\tName:  \"simple agent\",\n\t\t\t\tModel: mockModel,\n\t\t\t\tTools: []tool.Tool{myTool},\n\t\t\t})\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"failed to create llm agent: %v\", err)\n\t\t\t}\n\n\t\t\trunner := testutil.NewTestAgentRunner(t, a)\n\t\t\teventCount := 0\n\n\t\t\tev := runner.Run(t, \"id\", \"message\")\n\n\t\t\tvar confirmFunctionCall *genai.FunctionCall\n\t\t\tfor got, err := range ev {\n\t\t\t\tif err != nil && err.Error() == \"no data\" {\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tif err != nil {\n\t\t\t\t\t// Check if an error was expected\n\t\t\t\t\tt.Fatalf(\"runner returned unexpected error: %v\", err)\n\t\t\t\t\t// If error was expected, we can stop here or check for a specific error type.\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif eventCount >= len(tc.want) {\n\t\t\t\t\tt.Fatalf(\"stream generated more values than the expected %d. Got: %+v\", len(tc.want), got.Content)\n\t\t\t\t}\n\n\t\t\t\tif diff := cmp.Diff(tc.want[eventCount], got.Content, cmpopts.IgnoreFields(genai.FunctionCall{}, \"ID\"),\n\t\t\t\t\tcmp.Transformer(\"StringifyMapErrors\", func(m map[string]any) map[string]any {\n\t\t\t\t\t\tout := make(map[string]any, len(m))\n\t\t\t\t\t\tfor k, v := range m {\n\t\t\t\t\t\t\t// Check if the value inside the map is an error\n\t\t\t\t\t\t\tif err, ok := v.(error); ok {\n\t\t\t\t\t\t\t\tout[k] = err.Error() // Convert to string\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tout[k] = v // Keep as is\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn out\n\t\t\t\t\t}), cmpopts.IgnoreFields(genai.FunctionResponse{}, \"ID\")); diff != \"\" {\n\t\t\t\t\tt.Errorf(\"LoopAgent Run() mismatch (-want +got):\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\tfor _, p := range got.Content.Parts {\n\t\t\t\t\tif p.FunctionCall != nil && p.FunctionCall.Name == toolconfirmation.FunctionCallName {\n\t\t\t\t\t\tconfirmFunctionCall = p.FunctionCall\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\teventCount++\n\t\t\t}\n\n\t\t\tif confirmFunctionCall != nil && tc.confirmFunctionResponse != nil {\n\t\t\t\ttc.confirmFunctionResponse.ID = confirmFunctionCall.ID\n\t\t\t\tev := runner.RunContent(t, \"id\", &genai.Content{\n\t\t\t\t\tParts: []*genai.Part{{FunctionResponse: tc.confirmFunctionResponse}},\n\t\t\t\t})\n\t\t\t\tfor got, err := range ev {\n\t\t\t\t\tif err != nil && err.Error() == \"no data\" {\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t// Check if an error was expected\n\t\t\t\t\t\tt.Fatalf(\"runner returned unexpected error: %v\", err)\n\t\t\t\t\t\t// If error was expected, we can stop here or check for a specific error type.\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\n\t\t\t\t\tif eventCount >= len(tc.want) {\n\t\t\t\t\t\tt.Fatalf(\"stream generated more values than the expected %d. Got: %+v\", len(tc.want), got.Content)\n\t\t\t\t\t}\n\n\t\t\t\t\tif diff := cmp.Diff(tc.want[eventCount], got.Content, cmpopts.IgnoreFields(genai.FunctionCall{}, \"ID\"),\n\t\t\t\t\t\tcmp.Transformer(\"StringifyMapErrors\", func(m map[string]any) map[string]any {\n\t\t\t\t\t\t\tout := make(map[string]any, len(m))\n\t\t\t\t\t\t\tfor k, v := range m {\n\t\t\t\t\t\t\t\t// Check if the value inside the map is an error\n\t\t\t\t\t\t\t\tif err, ok := v.(error); ok {\n\t\t\t\t\t\t\t\t\tout[k] = err.Error() // Convert to string\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tout[k] = v // Keep as is\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t}), cmpopts.IgnoreFields(genai.FunctionResponse{}, \"ID\")); diff != \"\" {\n\t\t\t\t\t\tt.Errorf(\"LoopAgent Run() mismatch (-want +got):\\n%s\", diff)\n\t\t\t\t\t}\n\t\t\t\t\tfor _, p := range got.Content.Parts {\n\t\t\t\t\t\tif p.FunctionCall != nil && p.FunctionCall.Name == toolconfirmation.FunctionCallName {\n\t\t\t\t\t\t\tconfirmFunctionCall = p.FunctionCall\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\teventCount++\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Final check on the number of events\n\t\t\tif eventCount != len(tc.want) {\n\t\t\t\tt.Errorf(\"unexpected stream length, want %d got %d\", len(tc.want), eventCount)\n\t\t\t}\n\t\t})\n\t}\n}\n\n// Mock types for TArgs and TResults\ntype TestArgs struct {\n\tName string\n}\n\ntype TestResult struct {\n\tValue int\n}\n\nfunc TestNew_RequireConfirmationProvider_Validation(t *testing.T) {\n\t// A dummy handler to satisfy the function signature\n\tdummyHandler := func(_ tool.Context, _ TestArgs) (TestResult, error) {\n\t\treturn TestResult{Value: 1}, nil\n\t}\n\n\texpectedError := fmt.Sprintf(\"error RequireConfirmationProvider must be a function with signature func(%T) bool\", TestArgs{})\n\n\ttests := []struct {\n\t\tname         string\n\t\tprovider     any  // The RequireConfirmationProvider value to test\n\t\texpectsError bool // Substring expected in the error message; empty if no error expected\n\t}{\n\t\t// --- Happy Paths ---\n\t\t{\n\t\t\tname:         \"Valid: Nil provider is allowed\",\n\t\t\tprovider:     nil,\n\t\t\texpectsError: false,\n\t\t},\n\t\t{\n\t\t\tname:         \"Valid: Correct function signature\",\n\t\t\tprovider:     func(args TestArgs) bool { return true },\n\t\t\texpectsError: false,\n\t\t},\n\n\t\t// --- Edge Cases / Validation Errors ---\n\t\t{\n\t\t\tname:         \"Invalid: Provider is not a function (it's a struct)\",\n\t\t\tprovider:     struct{}{},\n\t\t\texpectsError: true,\n\t\t},\n\t\t{\n\t\t\tname:         \"Invalid: Provider is not a function (it's a primitive)\",\n\t\t\tprovider:     123,\n\t\t\texpectsError: true,\n\t\t},\n\t\t{\n\t\t\tname:         \"Invalid: Function has 0 arguments\",\n\t\t\tprovider:     func() bool { return true },\n\t\t\texpectsError: true,\n\t\t},\n\t\t{\n\t\t\tname:         \"Invalid: Function has too many arguments (2)\",\n\t\t\tprovider:     func(a TestArgs, b int) bool { return true },\n\t\t\texpectsError: true,\n\t\t},\n\t\t{\n\t\t\tname:         \"Invalid: Argument type mismatch (int instead of TestArgs)\",\n\t\t\tprovider:     func(n int) bool { return true },\n\t\t\texpectsError: true,\n\t\t},\n\t\t{\n\t\t\tname:         \"Invalid: Argument type mismatch (pointer vs value)\",\n\t\t\tprovider:     func(a *TestArgs) bool { return true },\n\t\t\texpectsError: true,\n\t\t},\n\t\t{\n\t\t\tname:         \"Invalid: Function returns nothing\",\n\t\t\tprovider:     func(args TestArgs) {},\n\t\t\texpectsError: true,\n\t\t},\n\t\t{\n\t\t\tname:         \"Invalid: Function returns too many values\",\n\t\t\tprovider:     func(args TestArgs) (bool, error) { return true, nil },\n\t\t\texpectsError: true,\n\t\t},\n\t\t{\n\t\t\tname:         \"Invalid: Return type mismatch (returns int instead of bool)\",\n\t\t\tprovider:     func(args TestArgs) int { return 1 },\n\t\t\texpectsError: true,\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\t// Construct config with the provider under test\n\t\t\tcfg := functiontool.Config{\n\t\t\t\tRequireConfirmationProvider: tt.provider,\n\t\t\t}\n\n\t\t\ttool, err := functiontool.New(cfg, dummyHandler)\n\n\t\t\t// Check results\n\t\t\tif !tt.expectsError {\n\t\t\t\tif err != nil {\n\t\t\t\t\tt.Fatalf(\"unexpected error: %v\", err)\n\t\t\t\t}\n\t\t\t\tif tool == nil {\n\t\t\t\t\tt.Error(\"expected valid tool, got nil\")\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err == nil {\n\t\t\t\t\tt.Error(\"expected error but got nil\")\n\t\t\t\t} else if !strings.Contains(err.Error(), expectedError) {\n\t\t\t\t\tt.Errorf(\"error message mismatch.\\nExpected substring: %q\\nGot: %q\", expectedError, err.Error())\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestNew_InvalidInputType(t *testing.T) {\n\ttestCases := []struct {\n\t\tname       string\n\t\tcreateTool func() (tool.Tool, error)\n\t\twantErrMsg string\n\t}{\n\t\t{\n\t\t\tname: \"string_input\",\n\t\t\tcreateTool: func() (tool.Tool, error) {\n\t\t\t\treturn functiontool.New(functiontool.Config{\n\t\t\t\t\tName:        \"string_tool\",\n\t\t\t\t\tDescription: \"a tool with string input\",\n\t\t\t\t}, func(ctx tool.Context, input string) (string, error) {\n\t\t\t\t\treturn input, nil\n\t\t\t\t})\n\t\t\t},\n\t\t\twantErrMsg: \"input must be a struct type, got: string\",\n\t\t},\n\t\t{\n\t\t\tname: \"int_input\",\n\t\t\tcreateTool: func() (tool.Tool, error) {\n\t\t\t\treturn functiontool.New(functiontool.Config{\n\t\t\t\t\tName:        \"int_tool\",\n\t\t\t\t\tDescription: \"a tool with int input\",\n\t\t\t\t}, func(ctx tool.Context, input int) (int, error) {\n\t\t\t\t\treturn input, nil\n\t\t\t\t})\n\t\t\t},\n\t\t\twantErrMsg: \"input must be a struct type, got: int\",\n\t\t},\n\t\t{\n\t\t\tname: \"bool_input\",\n\t\t\tcreateTool: func() (tool.Tool, error) {\n\t\t\t\treturn functiontool.New(functiontool.Config{\n\t\t\t\t\tName:        \"bool_tool\",\n\t\t\t\t\tDescription: \"a tool with bool input\",\n\t\t\t\t}, func(ctx tool.Context, input bool) (bool, error) {\n\t\t\t\t\treturn input, nil\n\t\t\t\t})\n\t\t\t},\n\t\t\twantErrMsg: \"input must be a struct type, got: bool\",\n\t\t},\n\t}\n\n\tfor _, tc := range testCases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t_, err := tc.createTool()\n\t\t\tif err == nil {\n\t\t\t\tt.Fatalf(\"functiontool.New() succeeded, want error containing %q\", tc.wantErrMsg)\n\t\t\t}\n\t\t\tif !errors.Is(err, functiontool.ErrInvalidArgument) {\n\t\t\t\tt.Fatalf(\"functiontool.New() error = %v, want %v\", err, functiontool.ErrInvalidArgument)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestFunctionTool_PanicRecovery(t *testing.T) {\n\ttype Args struct {\n\t\tValue string `json:\"value\"`\n\t}\n\n\tpanicHandler := func(ctx tool.Context, input Args) (string, error) {\n\t\tpanic(\"intentional panic for testing\")\n\t}\n\n\tpanicTool, err := functiontool.New(functiontool.Config{\n\t\tName:        \"panic_tool\",\n\t\tDescription: \"a tool that always panics\",\n\t}, panicHandler)\n\tif err != nil {\n\t\tt.Fatalf(\"NewFunctionTool failed: %v\", err)\n\t}\n\n\tfuncTool, ok := panicTool.(toolinternal.FunctionTool)\n\tif !ok {\n\t\tt.Fatal(\"panicTool does not implement toolinternal.FunctionTool\")\n\t}\n\n\tresult, err := funcTool.Run(createToolContext(t), map[string]any{\"value\": \"test\"})\n\tif err == nil {\n\t\tt.Fatal(\"expected error from panic recovery, got nil\")\n\t}\n\tif result != nil {\n\t\tt.Errorf(\"expected nil result, got %v\", result)\n\t}\n\n\texpectedErrParts := []string{\n\t\t\"panic in tool\",\n\t\t\"panic_tool\",\n\t\t\"intentional panic for testing\",\n\t\t\"stack:\",\n\t}\n\tfor _, part := range expectedErrParts {\n\t\tif !strings.Contains(err.Error(), part) {\n\t\t\tt.Errorf(\"expected error to contain %q, but it did not. Error: %v\", part, err)\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "tool/functiontool/long_running_function_test.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage functiontool_test\n\nimport (\n\t\"encoding/json\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/google/go-cmp/cmp\"\n\t\"github.com/google/go-cmp/cmp/cmpopts\"\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/agent/llmagent\"\n\t\"google.golang.org/adk/internal/testutil\"\n\t\"google.golang.org/adk/internal/toolinternal\"\n\t\"google.golang.org/adk/tool\"\n\t\"google.golang.org/adk/tool/functiontool\"\n)\n\nfunc TestNewLongRunningFunctionTool(t *testing.T) {\n\ttype SumArgs struct {\n\t\tA int `json:\"a\"` // an integer to sum\n\t\tB int `json:\"b\"` // another integer to sum\n\t}\n\ttype SumResult struct {\n\t\tResult string `json:\"result\"` // the operation result\n\t}\n\n\thandler := func(ctx tool.Context, input SumArgs) (SumResult, error) {\n\t\treturn SumResult{Result: \"Processing sum\"}, nil\n\t}\n\tsumTool, err := functiontool.New(functiontool.Config{\n\t\tName:          \"sum\",\n\t\tDescription:   \"sums two integers\",\n\t\tIsLongRunning: true,\n\t}, handler)\n\tif err != nil {\n\t\tt.Fatalf(\"TestNewLongRunningFunctionTool failed: %v\", err)\n\t}\n\tif sumTool.Name() != \"sum\" {\n\t\tt.Fatalf(\"TestNewLongRunningFunctionTool failed: wrong name\")\n\t}\n\tif sumTool.Description() != \"sums two integers\" {\n\t\tt.Fatalf(\"TestNewLongRunningFunctionTool failed: wrong description\")\n\t}\n\tif sumTool.IsLongRunning() == false {\n\t\tt.Fatalf(\"TestNewLongRunningFunctionTool failed: wrong value for IsLongRunning\")\n\t}\n\tfunctionTool, ok := sumTool.(toolinternal.FunctionTool)\n\tif !ok {\n\t\tt.Fatalf(\"TestNewLongRunningFunctionTool failed: could not convert to FunctionTool\")\n\t}\n\tif !strings.Contains(functionTool.Declaration().Description, \"NOTE: This is a long-running operation\") {\n\t\tt.Fatalf(\"TestNewLongRunningFunctionTool failed: wrong description note\")\n\t}\n\n\t_ = sumTool // use the tool\n}\n\nfunc NewContentFromFunctionResponseWithID(name string, response map[string]any, id, role string) *genai.Content {\n\tcontent := genai.NewContentFromFunctionResponse(name, response, genai.Role(role))\n\tcontent.Parts[0].FunctionResponse.ID = id\n\treturn content\n}\n\ntype IncArgs struct{}\n\nfunc TestLongRunningFunctionFlow(t *testing.T) {\n\tfunctionCalled := 0\n\tincreaseByOne := func(ctx tool.Context, x IncArgs) (map[string]string, error) {\n\t\tfunctionCalled++\n\t\treturn map[string]string{\"status\": \"pending\"}, nil\n\t}\n\ttestLongRunningFunctionFlow(t, increaseByOne, \"status\", &functionCalled)\n}\n\nfunc TestLongRunningStringFunctionFlow(t *testing.T) {\n\tfunctionCalled := 0\n\tincreaseByOne := func(ctx tool.Context, x IncArgs) (string, error) {\n\t\tfunctionCalled++\n\t\treturn \"pending\", nil\n\t}\n\ttestLongRunningFunctionFlow(t, increaseByOne, \"result\", &functionCalled)\n}\n\n// --- Test Suite ---\nfunc testLongRunningFunctionFlow[Out any](t *testing.T, increaseByOne func(ctx tool.Context, x IncArgs) (Out, error), resultKey string, callCount *int) {\n\t// 1. Setup\n\tresponses := []*genai.Content{\n\t\tgenai.NewContentFromFunctionCall(\"increaseByOne\", map[string]any{}, \"model\"),\n\t\tgenai.NewContentFromText(\"response1\", \"model\"),\n\t\tgenai.NewContentFromText(\"response2\", \"model\"),\n\t\tgenai.NewContentFromText(\"response3\", \"model\"),\n\t\tgenai.NewContentFromText(\"response4\", \"model\"),\n\t}\n\tmockModel := &testutil.MockModel{Responses: responses}\n\n\tlongRunningTool, err := functiontool.New(functiontool.Config{\n\t\tName:          \"increaseByOne\",\n\t\tDescription:   \"increaseByOne\",\n\t\tIsLongRunning: true,\n\t}, increaseByOne)\n\tif err != nil {\n\t\tt.Fatalf(\"failed to create longRunningTool: %v\", err)\n\t}\n\n\ta, err := llmagent.New(llmagent.Config{\n\t\tName:  \"long_running_agent\",\n\t\tModel: mockModel,\n\t\tTools: []tool.Tool{longRunningTool},\n\t})\n\tif err != nil {\n\t\tt.Fatalf(\"failed to create llm agent: %v\", err)\n\t}\n\trunner := testutil.NewTestAgentRunner(t, a)\n\n\t// 2. Initial Run\n\teventStream := runner.Run(t, \"test_session\", \"test1\")\n\teventParts, err := testutil.CollectParts(eventStream)\n\tif err != nil {\n\t\tt.Fatalf(\"failed to collect events: %v\", err)\n\t}\n\n\t// 3. Assertions for Initial Run\n\tif len(mockModel.Requests) != 2 {\n\t\t// Marshal the slice into a readable JSON string\n\t\trequestsJSON, _ := json.MarshalIndent(mockModel.Requests, \"\", \"  \")\n\t\tt.Fatalf(\"got %d requests, want 2;\\n- requests:\\n%s\", len(mockModel.Requests), requestsJSON)\n\t}\n\tif *callCount != 1 {\n\t\tt.Errorf(\"function called %d times, want 1\", *callCount)\n\t}\n\n\t// Assert first request\n\twantFirsteq := []*genai.Content{\n\t\tgenai.NewContentFromText(\"test1\", \"user\"),\n\t}\n\tif diff := cmp.Diff(wantFirsteq, mockModel.Requests[0].Contents); diff != \"\" {\n\t\tt.Errorf(\"LLMRequest.Contents mismatch (-want +got):\\n%s\", diff)\n\t}\n\n\t// Assert second request\n\twantSecondReq := []*genai.Content{\n\t\tgenai.NewContentFromText(\"test1\", \"user\"),\n\t\tgenai.NewContentFromFunctionCall(\"increaseByOne\", map[string]any{}, \"model\"),\n\t\tgenai.NewContentFromFunctionResponse(\"increaseByOne\", map[string]any{resultKey: \"pending\"}, \"user\"),\n\t}\n\tif diff := cmp.Diff(wantSecondReq, mockModel.Requests[1].Contents); diff != \"\" {\n\t\tt.Errorf(\"LLMRequest.Contents mismatch (-want +got):\\n%s\", diff)\n\t}\n\n\twantEventParts := []*genai.Part{\n\t\tgenai.NewPartFromFunctionCall(\"increaseByOne\", map[string]any{}),\n\t\tgenai.NewPartFromFunctionResponse(\"increaseByOne\", map[string]any{resultKey: \"pending\"}),\n\t\tgenai.NewPartFromText(\"response1\"),\n\t}\n\tif diff := cmp.Diff(wantEventParts, eventParts, cmpopts.IgnoreFields(genai.FunctionCall{}, \"ID\"),\n\t\tcmpopts.IgnoreFields(genai.FunctionResponse{}, \"ID\")); diff != \"\" {\n\t\tt.Errorf(\"Event parts mismatch (-want +got):\\n%s\", diff)\n\t}\n\n\tfunctionCallEventPart := eventParts[0]\n\tidFromTheFunctionCallEvent := functionCallEventPart.FunctionCall.ID\n\n\ttestCases := []struct {\n\t\tname           string         // Name for the Run subtest\n\t\tinputContent   *genai.Content // The content to send\n\t\twantReqCount   int            // Expected len(mockModel.Requests)\n\t\twantEventCount int            // Expected len(eventParts)\n\t\twantEventText  string         // Expected eventParts[0].Text\n\t\twantContent    *genai.Content // Expected output content\n\t}{\n\t\t{\n\t\t\tname: \"function response still waiting\",\n\t\t\tinputContent: NewContentFromFunctionResponseWithID(\n\t\t\t\t\"increaseByOne\", map[string]any{\"status\": \"still waiting\"}, idFromTheFunctionCallEvent, \"user\",\n\t\t\t),\n\t\t\twantReqCount:   3,\n\t\t\twantEventCount: 1,\n\t\t\twantEventText:  \"response2\",\n\t\t\twantContent:    genai.NewContentFromFunctionResponse(\"increaseByOne\", map[string]any{\"status\": \"still waiting\"}, \"user\"),\n\t\t},\n\t\t{\n\t\t\tname: \"function response result 2\",\n\t\t\tinputContent: NewContentFromFunctionResponseWithID(\n\t\t\t\t\"increaseByOne\", map[string]any{\"result\": 2}, idFromTheFunctionCallEvent, \"user\",\n\t\t\t),\n\t\t\twantReqCount:   4,\n\t\t\twantEventCount: 1,\n\t\t\twantEventText:  \"response3\",\n\t\t\twantContent:    genai.NewContentFromFunctionResponse(\"increaseByOne\", map[string]any{\"result\": 2}, \"user\"),\n\t\t},\n\t\t{\n\t\t\tname: \"function response result 3\",\n\t\t\tinputContent: NewContentFromFunctionResponseWithID(\n\t\t\t\t\"increaseByOne\", map[string]any{\"result\": 3}, idFromTheFunctionCallEvent, \"user\",\n\t\t\t),\n\t\t\twantReqCount:   5,\n\t\t\twantEventCount: 1,\n\t\t\twantEventText:  \"response4\",\n\t\t\twantContent:    genai.NewContentFromFunctionResponse(\"increaseByOne\", map[string]any{\"result\": 3}, \"user\"),\n\t\t},\n\t}\n\n\tfor _, tc := range testCases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\teventStream := runner.RunContent(t, \"test_session\", tc.inputContent)\n\t\t\teventParts, err := testutil.CollectParts(eventStream)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"failed to collect events: %v\", err)\n\t\t\t}\n\n\t\t\t// Assert against the values from the test case struct\n\t\t\tif len(mockModel.Requests) != tc.wantReqCount {\n\t\t\t\tt.Fatalf(\"got %d requests, want %d\", len(mockModel.Requests), tc.wantReqCount)\n\t\t\t}\n\t\t\tlatestRequestContents := mockModel.Requests[len(mockModel.Requests)-1].Contents\n\t\t\t// content should still be 3 since the function responses are merged into one in contents_processor\n\t\t\tif len(latestRequestContents) != 3 {\n\t\t\t\tt.Fatalf(\"got %d latest request contents size, want %d\", len(latestRequestContents), 3)\n\t\t\t}\n\n\t\t\tif diff := cmp.Diff(tc.wantContent, latestRequestContents[len(latestRequestContents)-1]); diff != \"\" {\n\t\t\t\tt.Errorf(\"LLMRequest.Content mismatch (-want +got):\\n%s\", diff)\n\t\t\t}\n\n\t\t\tif len(eventParts) != tc.wantEventCount {\n\t\t\t\t// Marshal the slice into a readable JSON string\n\t\t\t\tpartsJSON, _ := json.MarshalIndent(eventParts, \"\", \"  \")\n\t\t\t\tt.Fatalf(\"got %d events parts, want %d;\\n- parts:\\n%s\", len(eventParts), tc.wantEventCount, partsJSON)\n\t\t\t}\n\t\t\t// This check is now safe because the Fatalf above would have stopped the test\n\t\t\tif len(eventParts) > 0 && eventParts[0].Text != tc.wantEventText {\n\t\t\t\tt.Errorf(\"got event part text %q, want %q\", eventParts[0].Text, tc.wantEventText)\n\t\t\t}\n\t\t})\n\t}\n\n\t// Should still be one\n\tif *callCount != 1 {\n\t\tt.Errorf(\"function called %d times, want 1\", *callCount)\n\t}\n}\n\nfunc TestLongRunningToolIDsAreSet(t *testing.T) {\n\t// 1. Setup\n\tresponses := []*genai.Content{\n\t\tgenai.NewContentFromFunctionCall(\"increaseByOne\", map[string]any{}, \"model\"),\n\t\tgenai.NewContentFromText(\"response1\", \"model\"),\n\t}\n\tmockModel := &testutil.MockModel{Responses: responses}\n\tfunctionCalled := 0\n\n\ttype IncArgs struct{}\n\n\tincreaseByOne := func(ctx tool.Context, x IncArgs) (map[string]string, error) {\n\t\tfunctionCalled++\n\t\treturn map[string]string{\"status\": \"pending\"}, nil\n\t}\n\n\tlongRunningTool, err := functiontool.New(functiontool.Config{\n\t\tName:          \"increaseByOne\",\n\t\tDescription:   \"increaseByOne\",\n\t\tIsLongRunning: true,\n\t}, increaseByOne)\n\tif err != nil {\n\t\tt.Fatalf(\"failed to create longRunningTool: %v\", err)\n\t}\n\n\ta, err := llmagent.New(llmagent.Config{\n\t\tName:  \"hello_world_agent\",\n\t\tModel: mockModel,\n\t\tTools: []tool.Tool{longRunningTool},\n\t})\n\tif err != nil {\n\t\tt.Fatalf(\"failed to create llm agent: %v\", err)\n\t}\n\trunner := testutil.NewTestAgentRunner(t, a)\n\n\t// 2. Initial Run\n\teventStream := runner.Run(t, \"test_session\", \"test1\")\n\tevents, err := testutil.CollectEvents(eventStream)\n\tif err != nil {\n\t\tt.Fatalf(\"failed to collect events: %v\", err)\n\t}\n\n\tif len(events) != 3 { // first event is function call, seconds is function response, third is llm message back\n\t\t// Marshal the slice into a readable JSON string\n\t\teventsJSON, _ := json.MarshalIndent(events, \"\", \"  \")\n\t\tt.Fatalf(\"got %d for events length, want 3;\\n- events:\\n%s\", len(events), eventsJSON)\n\t}\n\n\t// Assert responses\n\tfunctionCallEvent := events[0]\n\tfunctionResponseEvent := events[1]\n\tllmResponseEvent := events[2]\n\t// First event should have LongRunningToolIDs field\n\tif functionCallEvent.LongRunningToolIDs == nil || len(functionCallEvent.LongRunningToolIDs) != 1 {\n\t\tt.Fatalf(\"Invalid LongRunningToolIDs for functionCallEvent\")\n\t}\n\tif functionResponseEvent.LongRunningToolIDs != nil {\n\t\tt.Errorf(\"Invalid LongRunningToolIDs for functionResponseEvent\")\n\t}\n\tif len(llmResponseEvent.LongRunningToolIDs) != 0 {\n\t\tt.Errorf(\"Invalid LongRunningToolIDs for llmResponseEvent\")\n\t}\n\tif functionCallEvent.LongRunningToolIDs[0] != functionCallEvent.LLMResponse.Content.Parts[0].FunctionCall.ID {\n\t\tt.Fatalf(\"Invalid LongRunningToolIDs for functionCallEvent got %q expected %q\",\n\t\t\tfunctionCallEvent.LongRunningToolIDs[0],\n\t\t\tfunctionCallEvent.LLMResponse.Content.Parts[0].FunctionCall.ID)\n\t}\n}\n"
  },
  {
    "path": "tool/functiontool/testdata/TestFunctionTool_Simple.httprr",
    "content": "httprr trace v1\n800 1845\nPOST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent HTTP/1.1\r\nHost: generativelanguage.googleapis.com\r\nUser-Agent: Go-http-client/1.1\r\nContent-Length: 568\r\nContent-Type: application/json\r\n\r\n{\"contents\":[{\"parts\":[{\"text\":\"Report the current weather of the capital city of U.K.\"}],\"role\":\"user\"}],\"generationConfig\":{},\"tools\":[{\"functionDeclarations\":[{\"description\":\"Retrieves the current weather report for a specified city.\",\"name\":\"get_weather_report\",\"parametersJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"city\":{\"type\":\"string\"}},\"required\":[\"city\"],\"type\":\"object\"},\"responseJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"report\":{\"type\":\"string\"},\"status\":{\"type\":\"string\"}},\"required\":[\"report\",\"status\"],\"type\":\"object\"}}]}]}HTTP/2.0 200 OK\r\nAlt-Svc: h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000\r\nContent-Type: application/json; charset=UTF-8\r\nDate: Fri, 20 Feb 2026 12:55:06 GMT\r\nServer: scaffolding on HTTPServer2\r\nServer-Timing: gfet4t7; dur=1723\r\nVary: Origin\r\nVary: X-Origin\r\nVary: Referer\r\nX-Content-Type-Options: nosniff\r\nX-Frame-Options: SAMEORIGIN\r\nX-Xss-Protection: 0\r\n\r\n{\n  \"candidates\": [\n    {\n      \"content\": {\n        \"parts\": [\n          {\n            \"functionCall\": {\n              \"name\": \"get_weather_report\",\n              \"args\": {\n                \"city\": \"London\"\n              }\n            },\n            \"thoughtSignature\": \"CpAEAb4+9vsutluzr9rWOQfH9dS0XV653cFDpSb/TRzRVzLknyGU1eF725i0tt9tq4t6LkEatm9ZtMbBhY0pm/IAYSwCmqDf5AnI2wsTqpgpFXuU/3EEFWGp+4wWaBqcjEZeRmPW7I4lNZEQ9Y80p8/7OIeJ7FVr14WQnqmb8wJK8H8WPo2idly7T9+J5Ybqh+fdJDAm4iIFSPvhGYnkUjmYyVzzNFLTTMgEVY+PuFQvAog1xvl/+YWl89bwJbYbaP637rbraYQSiEDhlJ/+Ki0uKyOeKt56PaIA+89bDteD1D4AK9exmtW7wjg06lPkw3g5dT5JtIl+lstayFemzZxTd3+0rW2F0FGDH4vQ1Fe6M/qNAUpdtU9rM9VR//ROw1dLT8yVDHQVKF6eDLKJBzPTmS6yYpUUurV8Vjz7wf8OY1UsNxRCeKTYUJKq9mEGkvUoOxqT+WA5EWtUiVvGv6dVVU2xtxs43p/paEMx2vWK8jAG3ol8Z++4eml7QmAFvSkv5S/kD/RWali/Spu+UfZsMJLUP/0sQP8JCxzmjBuD4GUG1v0yiXNb5I2bVOp0NOOcpNd2Y1TMfAdf7o3HjNdn1GyVffiWJ7xdct0gE0Y7XtWwU9vsevdvlsvTTshG9zOW6R9uvp51Q24HeRhrrTq/bQCO7wjC3PkUtXQNKM+OYsWjOSMjfKH3S9Ddhb9Cdppz\"\n          }\n        ],\n        \"role\": \"model\"\n      },\n      \"finishReason\": \"STOP\",\n      \"index\": 0,\n      \"finishMessage\": \"Model generated function call(s).\"\n    }\n  ],\n  \"usageMetadata\": {\n    \"promptTokenCount\": 113,\n    \"candidatesTokenCount\": 17,\n    \"totalTokenCount\": 265,\n    \"promptTokensDetails\": [\n      {\n        \"modality\": \"TEXT\",\n        \"tokenCount\": 113\n      }\n    ],\n    \"thoughtsTokenCount\": 135\n  },\n  \"modelVersion\": \"gemini-2.5-flash\",\n  \"responseId\": \"qFmYaY79GbLZ2roPsKvdOQ\"\n}\n778 1708\nPOST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent HTTP/1.1\r\nHost: generativelanguage.googleapis.com\r\nUser-Agent: Go-http-client/1.1\r\nContent-Length: 546\r\nContent-Type: application/json\r\n\r\n{\"contents\":[{\"parts\":[{\"text\":\"How is the weather of Paris now?\"}],\"role\":\"user\"}],\"generationConfig\":{},\"tools\":[{\"functionDeclarations\":[{\"description\":\"Retrieves the current weather report for a specified city.\",\"name\":\"get_weather_report\",\"parametersJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"city\":{\"type\":\"string\"}},\"required\":[\"city\"],\"type\":\"object\"},\"responseJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"report\":{\"type\":\"string\"},\"status\":{\"type\":\"string\"}},\"required\":[\"report\",\"status\"],\"type\":\"object\"}}]}]}HTTP/2.0 200 OK\r\nAlt-Svc: h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000\r\nContent-Type: application/json; charset=UTF-8\r\nDate: Fri, 20 Feb 2026 12:55:07 GMT\r\nServer: scaffolding on HTTPServer2\r\nServer-Timing: gfet4t7; dur=1339\r\nVary: Origin\r\nVary: X-Origin\r\nVary: Referer\r\nX-Content-Type-Options: nosniff\r\nX-Frame-Options: SAMEORIGIN\r\nX-Xss-Protection: 0\r\n\r\n{\n  \"candidates\": [\n    {\n      \"content\": {\n        \"parts\": [\n          {\n            \"functionCall\": {\n              \"name\": \"get_weather_report\",\n              \"args\": {\n                \"city\": \"Paris\"\n              }\n            },\n            \"thoughtSignature\": \"CqoDAb4+9vuYMHffdQJYJ6ErebPblkYklb38rf+UMkmKXgFs3mcKDEdvtupR5PEFt5aUhNftTB0sDsBCLCNPB+V+bReLxEuCk7wEUbya/mosSi9cj92Ql1Lpg2PNYDqyElSg/YYGa0SX7b+y4IF6s/H/PhNxS2Z7CfS/iaaau9MJkRcMH+RQeMdu+GGRJ9hT9wgPMUMuJlMPYNL7vVrW8RzCdoHUb73QxHk/NnxpbScpRg7Bi7blNPjOXh07xHzJvcUWfIRXWVvGNdUSHbQGzhGtZYBcWXWIm6HnkHlgpdyi13rDBrd36j5TIcrNe7zKC3I/uuTF0y8M0TwC6API4sTYJThXKqBXNeHra20W6gi2lzyW8fAtA9353e97hdtPJheV9X97zF3BsWKpj8uSKmc8o8EzXfu/TiJWIhw5yJBwpfv6FDscBn16CbeO8q0lPdSf+aQ2DBo9908PUHDCEheuRFClL6KyKmp53O43fyfWKotgqB0CD2t65zkdxWtiL8p9R1mmjNAGMNdtVxm89RvOrNU00QD8rdhRL2FeYFiHFVb2svTAdleNI+Ko\"\n          }\n        ],\n        \"role\": \"model\"\n      },\n      \"finishReason\": \"STOP\",\n      \"index\": 0,\n      \"finishMessage\": \"Model generated function call(s).\"\n    }\n  ],\n  \"usageMetadata\": {\n    \"promptTokenCount\": 108,\n    \"candidatesTokenCount\": 17,\n    \"totalTokenCount\": 218,\n    \"promptTokensDetails\": [\n      {\n        \"modality\": \"TEXT\",\n        \"tokenCount\": 108\n      }\n    ],\n    \"thoughtsTokenCount\": 93\n  },\n  \"modelVersion\": \"gemini-2.5-flash\",\n  \"responseId\": \"qlmYaZ3RDoa20-kPlJHKuQo\"\n}\n791 1587\nPOST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent HTTP/1.1\r\nHost: generativelanguage.googleapis.com\r\nUser-Agent: Go-http-client/1.1\r\nContent-Length: 559\r\nContent-Type: application/json\r\n\r\n{\"contents\":[{\"parts\":[{\"text\":\"Tell me about the current weather in New York\"}],\"role\":\"user\"}],\"generationConfig\":{},\"tools\":[{\"functionDeclarations\":[{\"description\":\"Retrieves the current weather report for a specified city.\",\"name\":\"get_weather_report\",\"parametersJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"city\":{\"type\":\"string\"}},\"required\":[\"city\"],\"type\":\"object\"},\"responseJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"report\":{\"type\":\"string\"},\"status\":{\"type\":\"string\"}},\"required\":[\"report\",\"status\"],\"type\":\"object\"}}]}]}HTTP/2.0 200 OK\r\nAlt-Svc: h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000\r\nContent-Type: application/json; charset=UTF-8\r\nDate: Fri, 20 Feb 2026 12:55:08 GMT\r\nServer: scaffolding on HTTPServer2\r\nServer-Timing: gfet4t7; dur=1413\r\nVary: Origin\r\nVary: X-Origin\r\nVary: Referer\r\nX-Content-Type-Options: nosniff\r\nX-Frame-Options: SAMEORIGIN\r\nX-Xss-Protection: 0\r\n\r\n{\n  \"candidates\": [\n    {\n      \"content\": {\n        \"parts\": [\n          {\n            \"functionCall\": {\n              \"name\": \"get_weather_report\",\n              \"args\": {\n                \"city\": \"New York\"\n              }\n            },\n            \"thoughtSignature\": \"CswCAb4+9vuQNOI+nK2hM31s/rM7fYTq5LKORz+pMG1NjQDg0FamFaOnnLxXjT/Ut0fA/JjHyaBHd6xKy+swUeH6YZ7Ez0timODCf2vUHV/5jCEEtkAsbKFVfrtO1Jw43dmOgy+nJ1DnDVzWfPe4Wy7HYfyDCXqIjrtbWTo5yG6nmT15xx0YChT0SpForS5liyLbjMbIVP1WhVknZLoRBeQoXWBFeb8Trb6vYi5TYLU5G4rzWKn2Ogu0GDcg62000nWPC8Ifk6A8fjqbCjr49esecCny+gkfET1bagIQG21kpoQijUM869r0rx5BDokkXeXfYfG+dMpAmO2YnyW2s7ldzF6bppzg+Ka7hGhdfL+7xJ24y4JrKwnCmnDnq+SUjPUiG8/toObyN0l+VVpHRK7R1H81ZXox69ifcn3YEDo5Zzp7+JfsjX+8MsJBktk=\"\n          }\n        ],\n        \"role\": \"model\"\n      },\n      \"finishReason\": \"STOP\",\n      \"index\": 0,\n      \"finishMessage\": \"Model generated function call(s).\"\n    }\n  ],\n  \"usageMetadata\": {\n    \"promptTokenCount\": 109,\n    \"candidatesTokenCount\": 18,\n    \"totalTokenCount\": 202,\n    \"promptTokensDetails\": [\n      {\n        \"modality\": \"TEXT\",\n        \"tokenCount\": 109\n      }\n    ],\n    \"thoughtsTokenCount\": 75\n  },\n  \"modelVersion\": \"gemini-2.5-flash\",\n  \"responseId\": \"q1mYadDQI96M2roPsP3UyAs\"\n}\n"
  },
  {
    "path": "tool/geminitool/google_search.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage geminitool\n\nimport (\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/model\"\n\t\"google.golang.org/adk/tool\"\n)\n\n// GoogleSearch is a built-in tool that is automatically invoked by Gemini 2\n// models to retrieve search results from Google Search.\n// The tool operates internally within the model and does not require or\n// perform local code execution.\ntype GoogleSearch struct{}\n\n// Name implements tool.Tool.\nfunc (s GoogleSearch) Name() string {\n\treturn \"google_search\"\n}\n\n// Description implements tool.Tool.\nfunc (s GoogleSearch) Description() string {\n\treturn \"Performs a Google search to retrieve information from the web.\"\n}\n\n// ProcessRequest adds the GoogleSearch tool to the LLM request.\nfunc (s GoogleSearch) ProcessRequest(ctx tool.Context, req *model.LLMRequest) error {\n\treturn setTool(req, &genai.Tool{\n\t\tGoogleSearch: &genai.GoogleSearch{},\n\t})\n}\n\n// IsLongRunning implements tool.Tool.\nfunc (s GoogleSearch) IsLongRunning() bool {\n\treturn false\n}\n"
  },
  {
    "path": "tool/geminitool/tool.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Package geminitool provides access to Gemini native tools. You can use any\n// tool from genai with geminitool.New().\n//\n// For example, to create a Gemini retrieval tool:\n//\n//\tgeminitool.New(\"data_retrieval\", &genai.Tool{\n//\t\tRetrieval: &genai.Retrieval{\n//\t\t\tExternalAPI: &genai.ExternalAPI{\n//\t\t\t\tEndpoint: ,\n//\t\t\t\tAuthConfig:\n//\t\t\t},\n//\t\t},\n//\t})\n//\n// Package also provides default tools like GoogleSearch.\npackage geminitool\n\nimport (\n\t\"fmt\"\n\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/model\"\n\t\"google.golang.org/adk/tool\"\n)\n\n// New creates  gemini API tool.\nfunc New(name, description string, t *genai.Tool) tool.Tool {\n\treturn &geminiTool{\n\t\tname:        name,\n\t\tdescription: description,\n\t\tvalue:       t,\n\t}\n}\n\n// geminiTool is a wrapper around a genai.Tool.\ntype geminiTool struct {\n\tname        string\n\tdescription string\n\tvalue       *genai.Tool\n}\n\n// ProcessRequest adds the Gemini tool to the LLM request.\nfunc (t *geminiTool) ProcessRequest(ctx tool.Context, req *model.LLMRequest) error {\n\treturn setTool(req, t.value)\n}\n\n// Name implements tool.Tool.\nfunc (t *geminiTool) Name() string {\n\treturn t.name\n}\n\n// Description implements tool.Tool.\nfunc (t *geminiTool) Description() string {\n\treturn t.description\n}\n\n// IsLongRunning implements tool.Tool.\nfunc (t *geminiTool) IsLongRunning() bool {\n\treturn false\n}\n\nfunc setTool(req *model.LLMRequest, t *genai.Tool) error {\n\tif req == nil {\n\t\treturn fmt.Errorf(\"llm request is nil\")\n\t}\n\n\tif req.Config == nil {\n\t\treq.Config = &genai.GenerateContentConfig{}\n\t}\n\n\treq.Config.Tools = append(req.Config.Tools, t)\n\treturn nil\n}\n"
  },
  {
    "path": "tool/geminitool/tool_test.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage geminitool_test\n\nimport (\n\t\"testing\"\n\n\t\"github.com/google/go-cmp/cmp\"\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/internal/toolinternal\"\n\t\"google.golang.org/adk/model\"\n\t\"google.golang.org/adk/tool/geminitool\"\n)\n\nfunc TestGeminiTool_ProcessRequest(t *testing.T) {\n\ttestCases := []struct {\n\t\tname      string\n\t\tinputTool *genai.Tool\n\t\treq       *model.LLMRequest\n\t\twantTools []*genai.Tool\n\t\twantErr   bool\n\t}{\n\t\t{\n\t\t\tname: \"add to empty request\",\n\t\t\tinputTool: &genai.Tool{\n\t\t\t\tGoogleSearch: &genai.GoogleSearch{},\n\t\t\t},\n\t\t\treq: &model.LLMRequest{},\n\t\t\twantTools: []*genai.Tool{\n\t\t\t\t{GoogleSearch: &genai.GoogleSearch{}},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"add to existing tools\",\n\t\t\tinputTool: &genai.Tool{\n\t\t\t\tGoogleSearch: &genai.GoogleSearch{},\n\t\t\t},\n\t\t\treq: &model.LLMRequest{\n\t\t\t\tConfig: &genai.GenerateContentConfig{\n\t\t\t\t\tTools: []*genai.Tool{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tGoogleMaps: &genai.GoogleMaps{},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twantTools: []*genai.Tool{\n\t\t\t\t{GoogleMaps: &genai.GoogleMaps{}},\n\t\t\t\t{GoogleSearch: &genai.GoogleSearch{}},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname:    \"error on nil request\",\n\t\t\twantErr: true,\n\t\t},\n\t}\n\n\tfor _, tt := range testCases {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tgeminiTool := geminitool.New(\"test_tool\", \"test_description\", tt.inputTool)\n\n\t\t\trequestProcessor, ok := geminiTool.(toolinternal.RequestProcessor)\n\t\t\tif !ok {\n\t\t\t\tt.Fatal(\"geminiTool does not implement RequestProcessor\")\n\t\t\t}\n\n\t\t\terr := requestProcessor.ProcessRequest(nil, tt.req)\n\t\t\tif (err != nil) != tt.wantErr {\n\t\t\t\tt.Fatalf(\"ProcessRequest() error = %v, wantErr %v\", err, tt.wantErr)\n\t\t\t}\n\t\t\tif tt.wantErr {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif diff := cmp.Diff(tt.wantTools, tt.req.Config.Tools); diff != \"\" {\n\t\t\t\tt.Errorf(\"ProcessRequest returned unexpected tools (-want +got):\\n%s\", diff)\n\t\t\t}\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "tool/loadartifactstool/load_artifacts_tool.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Package loadartifactstool defines a tool for loading artifacts.\n// This tool informs the model about available artifacts and provides their content when\n// requested by the model through a function call.\npackage loadartifactstool\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"fmt\"\n\n\t\"golang.org/x/sync/errgroup\"\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/agent\"\n\t\"google.golang.org/adk/internal/toolinternal/toolutils\"\n\t\"google.golang.org/adk/internal/utils\"\n\t\"google.golang.org/adk/model\"\n\t\"google.golang.org/adk/tool\"\n)\n\n// artifactsTool is a tool that loads artifacts and adds them to the session.\ntype artifactsTool struct {\n\tname        string\n\tdescription string\n}\n\n// New creates a new loadArtifactsTool.\nfunc New() tool.Tool {\n\treturn &artifactsTool{\n\t\tname:        \"load_artifacts\",\n\t\tdescription: \"Loads the artifacts and adds them to the session.\",\n\t}\n}\n\n// Name implements tool.Tool.\nfunc (t *artifactsTool) Name() string {\n\treturn t.name\n}\n\n// Description implements tool.Tool.\nfunc (t *artifactsTool) Description() string {\n\treturn t.description\n}\n\n// IsLongRunning implements tool.Tool.\nfunc (t *artifactsTool) IsLongRunning() bool {\n\treturn false\n}\n\n// Declaration returns the GenAI FunctionDeclaration for the load_artifacts tool.\n//\n// This declaration allows the LLM to understand and call the tool\n// by specifying the function name, a detailed description of its\n// purpose, and the required input parameters (schema).\nfunc (t *artifactsTool) Declaration() *genai.FunctionDeclaration {\n\treturn &genai.FunctionDeclaration{\n\t\tName:        t.name,\n\t\tDescription: t.description,\n\t\tParameters: &genai.Schema{\n\t\t\tType: \"OBJECT\",\n\t\t\tProperties: map[string]*genai.Schema{\n\t\t\t\t\"artifact_names\": {\n\t\t\t\t\tType: \"ARRAY\",\n\t\t\t\t\tItems: &genai.Schema{\n\t\t\t\t\t\tType: \"STRING\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n}\n\n// Run implements tool.Tool.\nfunc (t *artifactsTool) Run(ctx tool.Context, args any) (map[string]any, error) {\n\tm, ok := args.(map[string]any)\n\tif !ok {\n\t\treturn nil, fmt.Errorf(\"unexpected args type, got: %T\", args)\n\t}\n\tvar artifactNames []string\n\tartifactNamesRaw, exists := m[\"artifact_names\"]\n\tif !exists {\n\t\tartifactNames = []string{}\n\t} else {\n\t\t// In order to cast properly from []any to []string we're gonna marshal and then\n\t\t// unmarshal the artifact_names value.\n\t\tartifactNamesJson, err := json.Marshal(artifactNamesRaw)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"failed to marshal artifact_names to JSON: %w\", err)\n\t\t}\n\t\tif err := json.Unmarshal(artifactNamesJson, &artifactNames); err != nil {\n\t\t\treturn nil, fmt.Errorf(\"failed to unmarshal artifact_names from JSON to []string: %w\", err)\n\t\t}\n\t\t// Ensure the slice is not nil if it's empty\n\t\tif artifactNames == nil {\n\t\t\tartifactNames = []string{}\n\t\t}\n\t}\n\tresult := map[string]any{\n\t\t\"artifact_names\": artifactNames,\n\t}\n\treturn result, nil\n}\n\n// ProcessRequest processes the LLM request. It packs the tool, appends initial\n// instructions, and processes any load artifacts function calls.\nfunc (t *artifactsTool) ProcessRequest(ctx tool.Context, req *model.LLMRequest) error {\n\tif err := toolutils.PackTool(req, t); err != nil {\n\t\treturn err\n\t}\n\tif err := t.appendInitialInstructions(ctx, req); err != nil {\n\t\treturn err\n\t}\n\treturn t.processLoadArtifactsFunctionCall(ctx, req)\n}\n\nfunc (t *artifactsTool) appendInitialInstructions(ctx tool.Context, req *model.LLMRequest) error {\n\tresp, err := ctx.Artifacts().List(ctx)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to list artifacts: %w\", err)\n\t}\n\tif len(resp.FileNames) == 0 {\n\t\treturn nil\n\t}\n\tartifactNamesJSON, err := json.Marshal(resp.FileNames)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to marshal artifact names: %w\", err)\n\t}\n\tinstructions := fmt.Sprintf(\n\t\t\"You have a list of artifacts:\\n  %s\\n\\nWhen the user asks questions about\"+\n\t\t\t\" any of the artifacts, you should call the `load_artifacts` function\"+\n\t\t\t\" to load the artifact. Do not generate any text other than the\"+\n\t\t\t\" function call. Whenever you are asked about artifacts, you\"+\n\t\t\t\" should first load it. You must always load an artifact to access its\"+\n\t\t\t\" content, even if it has been loaded before.\", string(artifactNamesJSON))\n\n\tutils.AppendInstructions(req, instructions)\n\treturn nil\n}\n\nfunc (t *artifactsTool) processLoadArtifactsFunctionCall(ctx tool.Context, req *model.LLMRequest) error {\n\tif len(req.Contents) == 0 {\n\t\treturn nil\n\t}\n\tlastContent := req.Contents[len(req.Contents)-1]\n\tif lastContent == nil || len(lastContent.Parts) == 0 {\n\t\treturn nil\n\t}\n\tfirstPart := lastContent.Parts[0]\n\tif firstPart.FunctionResponse == nil {\n\t\treturn nil\n\t}\n\n\tfunctionResponse := firstPart.FunctionResponse\n\n\tif functionResponse.Name != \"load_artifacts\" {\n\t\treturn nil\n\t}\n\tartifactNamesRaw, ok := functionResponse.Response[\"artifact_names\"]\n\tif !ok {\n\t\treturn nil\n\t}\n\tartifactNames, ok := artifactNamesRaw.([]string)\n\tif !ok {\n\t\treturn fmt.Errorf(\"invalid artifact names type: %T, expected []string\", artifactNamesRaw)\n\t}\n\tif len(artifactNames) == 0 {\n\t\treturn nil\n\t}\n\n\tresults := make([]*genai.Content, len(artifactNames))\n\tgroup, childCtx := errgroup.WithContext(ctx)\n\tartifactsService := ctx.Artifacts()\n\n\tfor i, artifactName := range artifactNames {\n\t\tgroup.Go(func() error {\n\t\t\t// Although not used, we need to pass childCtx for early return in case of an error.\n\t\t\tcontent, err := t.loadIndividualArtifact(childCtx, artifactsService, artifactName)\n\t\t\tif err != nil {\n\t\t\t\treturn fmt.Errorf(\"failed to load artifact %s: %w\", artifactName, err)\n\t\t\t}\n\t\t\tresults[i] = content\n\t\t\treturn nil\n\t\t})\n\t}\n\n\tif err := group.Wait(); err != nil {\n\t\treturn err\n\t}\n\n\treq.Contents = append(req.Contents, results...)\n\treturn nil\n}\n\nfunc (t *artifactsTool) loadIndividualArtifact(ctx context.Context, artifactsService agent.Artifacts, artifactName string) (*genai.Content, error) {\n\tresp, err := artifactsService.Load(ctx, artifactName)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to load artifact %s: %w\", artifactName, err)\n\t}\n\treturn &genai.Content{\n\t\tParts: []*genai.Part{\n\t\t\tgenai.NewPartFromText(\"Artifact \" + artifactName + \" is:\"),\n\t\t\tresp.Part,\n\t\t},\n\t\tRole: genai.RoleUser,\n\t}, nil\n}\n"
  },
  {
    "path": "tool/loadartifactstool/load_artifacts_tool_test.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage loadartifactstool_test\n\nimport (\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/google/go-cmp/cmp\"\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/artifact\"\n\tartifactinternal \"google.golang.org/adk/internal/artifact\"\n\ticontext \"google.golang.org/adk/internal/context\"\n\t\"google.golang.org/adk/internal/toolinternal\"\n\t\"google.golang.org/adk/model\"\n\t\"google.golang.org/adk/tool\"\n\t\"google.golang.org/adk/tool/loadartifactstool\"\n)\n\nfunc TestLoadArtifactsTool_Run(t *testing.T) {\n\tloadArtifactsTool := loadartifactstool.New()\n\ttc := createToolContext(t)\n\n\ttoolImpl, ok := loadArtifactsTool.(toolinternal.FunctionTool)\n\tif !ok {\n\t\tt.Fatal(\"loadArtifactsTool does not implement FunctionTool\")\n\t}\n\n\ttests := []struct {\n\t\tname    string\n\t\targs    map[string]any\n\t\twant    map[string]any\n\t\twantErr bool\n\t}{\n\t\t{\n\t\t\tname: \"basic string slice\",\n\t\t\targs: map[string]any{\n\t\t\t\t\"artifact_names\": []string{\"file1\", \"file2\"},\n\t\t\t},\n\t\t\twant: map[string]any{\n\t\t\t\t\"artifact_names\": []string{\"file1\", \"file2\"},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"empty args\",\n\t\t\targs: map[string]any{},\n\t\t\twant: map[string]any{\n\t\t\t\t\"artifact_names\": []string{},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"any slice with strings\",\n\t\t\targs: map[string]any{\n\t\t\t\t\"artifact_names\": []any{\"fileA\", \"fileB\"},\n\t\t\t},\n\t\t\twant: map[string]any{\n\t\t\t\t\"artifact_names\": []string{\"fileA\", \"fileB\"},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"empty string slice\",\n\t\t\targs: map[string]any{\n\t\t\t\t\"artifact_names\": []string{},\n\t\t\t},\n\t\t\twant: map[string]any{\n\t\t\t\t\"artifact_names\": []string{},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"empty any slice\",\n\t\t\targs: map[string]any{\n\t\t\t\t\"artifact_names\": []any{},\n\t\t\t},\n\t\t\twant: map[string]any{\n\t\t\t\t\"artifact_names\": []string{},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"nil value\",\n\t\t\targs: map[string]any{\n\t\t\t\t\"artifact_names\": nil,\n\t\t\t},\n\t\t\twant: map[string]any{\n\t\t\t\t\"artifact_names\": []string{},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"incorrect type (not a slice)\",\n\t\t\targs: map[string]any{\n\t\t\t\t\"artifact_names\": \"not a slice\",\n\t\t\t},\n\t\t\twantErr: true,\n\t\t},\n\t\t{\n\t\t\tname: \"any slice with non-string\",\n\t\t\targs: map[string]any{\n\t\t\t\t\"artifact_names\": []any{\"fileA\", 123},\n\t\t\t},\n\t\t\twantErr: true,\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tresult, err := toolImpl.Run(tc, tt.args)\n\t\t\tif (err != nil) != tt.wantErr {\n\t\t\t\tt.Fatalf(\"Run() error = %v, wantErr %v\", err, tt.wantErr)\n\t\t\t}\n\t\t\tif tt.wantErr {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif diff := cmp.Diff(tt.want, result); diff != \"\" {\n\t\t\t\tt.Errorf(\"Run() result diff (-want +got):\\n%s\", diff)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestLoadArtifactsTool_ProcessRequest(t *testing.T) {\n\tloadArtifactsTool := loadartifactstool.New()\n\n\ttc := createToolContext(t)\n\tartifacts := map[string]*genai.Part{\n\t\t\"file1.txt\": {Text: \"content1\"},\n\t\t\"file2.pdf\": {Text: \"content2\"},\n\t}\n\tfor name, part := range artifacts {\n\t\t_, err := tc.Artifacts().Save(t.Context(), name, part)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"Failed to save artifact %s: %v\", name, err)\n\t\t}\n\t}\n\n\tllmRequest := &model.LLMRequest{}\n\n\trequestProcessor, ok := loadArtifactsTool.(toolinternal.RequestProcessor)\n\tif !ok {\n\t\tt.Fatal(\"loadArtifactsTool does not implement RequestProcessor\")\n\t}\n\n\terr := requestProcessor.ProcessRequest(tc, llmRequest)\n\tif err != nil {\n\t\tt.Fatalf(\"ProcessRequest failed: %v\", err)\n\t}\n\n\tinstruction := llmRequest.Config.SystemInstruction.Parts[0].Text\n\tif !strings.Contains(instruction, \"You have a list of artifacts\") {\n\t\tt.Errorf(\"Instruction should contain 'You have a list of artifacts', but got: %v\", instruction)\n\t}\n\tif !strings.Contains(instruction, `\"file1.txt\"`) || !strings.Contains(instruction, `\"file2.pdf\"`) {\n\t\tt.Errorf(\"Instruction should contain artifact names, but got: %v\", instruction)\n\t}\n\tif len(llmRequest.Contents) > 0 {\n\t\tt.Errorf(\"Expected no contents, but got: %v\", llmRequest.Contents)\n\t}\n}\n\nfunc TestLoadArtifactsTool_ProcessRequest_Artifacts_LoadArtifactsFunctionCall(t *testing.T) {\n\tloadArtifactsTool := loadartifactstool.New()\n\n\ttc := createToolContext(t)\n\tartifacts := map[string]*genai.Part{\n\t\t\"doc1.txt\": {Text: \"This is the content of doc1.txt\"},\n\t}\n\tfor name, part := range artifacts {\n\t\t_, err := tc.Artifacts().Save(t.Context(), name, part)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"Failed to save artifact %s: %v\", name, err)\n\t\t}\n\t}\n\n\tfunctionResponse := &genai.FunctionResponse{\n\t\tName: \"load_artifacts\",\n\t\tResponse: map[string]any{\n\t\t\t\"artifact_names\": []string{\"doc1.txt\"},\n\t\t},\n\t}\n\tllmRequest := &model.LLMRequest{\n\t\tContents: []*genai.Content{\n\t\t\t{\n\t\t\t\tRole: \"model\",\n\t\t\t\tParts: []*genai.Part{\n\t\t\t\t\tgenai.NewPartFromFunctionResponse(functionResponse.Name, functionResponse.Response),\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n\n\trequestProcessor, ok := loadArtifactsTool.(toolinternal.RequestProcessor)\n\tif !ok {\n\t\tt.Fatal(\"loadArtifactsTool does not implement RequestProcessor\")\n\t}\n\n\terr := requestProcessor.ProcessRequest(tc, llmRequest)\n\tif err != nil {\n\t\tt.Fatalf(\"ProcessRequest failed: %v\", err)\n\t}\n\n\tif len(llmRequest.Contents) != 2 {\n\t\tt.Fatalf(\"Expected 2 content, but got: %v\", llmRequest.Contents)\n\t}\n\n\tappendedContent := llmRequest.Contents[1]\n\tif appendedContent.Role != \"user\" {\n\t\tt.Errorf(\"Appended Content Role: got %v, want 'user'\", appendedContent.Role)\n\t}\n\tif len(appendedContent.Parts) != 2 {\n\t\tt.Fatalf(\"Expected 2 parts in appended content, but got: %v\", appendedContent.Parts)\n\t}\n\tif appendedContent.Parts[0].Text != \"Artifact doc1.txt is:\" {\n\t\tt.Errorf(\"First part of appended content: got %v, want 'Artifact doc1.txt is:'\", appendedContent.Parts[0].Text)\n\t}\n\tif appendedContent.Parts[1].Text != \"This is the content of doc1.txt\" {\n\t\tt.Errorf(\"Second part of appended content: got %v, want 'This is the content of doc1.txt'\", appendedContent.Parts[1].Text)\n\t}\n}\n\nfunc TestLoadArtifactsTool_ProcessRequest_Artifacts_OtherFunctionCall(t *testing.T) {\n\tloadArtifactsTool := loadartifactstool.New()\n\n\ttc := createToolContext(t)\n\tartifacts := map[string]*genai.Part{\n\t\t\"doc1.txt\": {Text: \"content1\"},\n\t}\n\tfor name, part := range artifacts {\n\t\t_, err := tc.Artifacts().Save(t.Context(), name, part)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"Failed to save artifact %s: %v\", name, err)\n\t\t}\n\t}\n\n\tfunctionResponse := &genai.FunctionResponse{\n\t\tName: \"other_function\",\n\t\tResponse: map[string]any{\n\t\t\t\"some_key\": \"some_value\",\n\t\t},\n\t}\n\tllmRequest := &model.LLMRequest{\n\t\tContents: []*genai.Content{\n\t\t\t{\n\t\t\t\tRole: \"model\",\n\t\t\t\tParts: []*genai.Part{\n\t\t\t\t\tgenai.NewPartFromFunctionResponse(functionResponse.Name, functionResponse.Response),\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n\n\trequestProcessor, ok := loadArtifactsTool.(toolinternal.RequestProcessor)\n\tif !ok {\n\t\tt.Fatal(\"loadArtifactsTool does not implement RequestProcessor\")\n\t}\n\n\terr := requestProcessor.ProcessRequest(tc, llmRequest)\n\tif err != nil {\n\t\tt.Fatalf(\"ProcessRequest failed: %v\", err)\n\t}\n\tif len(llmRequest.Contents) != 1 {\n\t\tt.Fatalf(\"Expected 1 content, but got: %v\", llmRequest.Contents)\n\t}\n\tif llmRequest.Contents[0].Role != \"model\" {\n\t\tt.Errorf(\"Content Role: got %v, want 'model'\", llmRequest.Contents[0].Role)\n\t}\n}\n\nfunc createToolContext(t *testing.T) tool.Context {\n\tt.Helper()\n\n\tartifacts := &artifactinternal.Artifacts{\n\t\tService:   artifact.InMemoryService(),\n\t\tAppName:   \"app\",\n\t\tUserID:    \"user\",\n\t\tSessionID: \"session\",\n\t}\n\n\tctx := icontext.NewInvocationContext(t.Context(), icontext.InvocationContextParams{\n\t\tArtifacts: artifacts,\n\t})\n\n\treturn toolinternal.NewToolContext(ctx, \"\", nil, nil)\n}\n"
  },
  {
    "path": "tool/loadmemorytool/tool.go",
    "content": "// Copyright 2026 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Package loadmemorytool provides a tool that loads memory for the current user.\n// This tool allows the model to search and retrieve relevant memory entries\n// based on a query.\npackage loadmemorytool\n\nimport (\n\t\"fmt\"\n\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/internal/toolinternal\"\n\t\"google.golang.org/adk/internal/toolinternal/toolutils\"\n\t\"google.golang.org/adk/internal/utils\"\n\t\"google.golang.org/adk/memory\"\n\t\"google.golang.org/adk/model\"\n\t\"google.golang.org/adk/tool\"\n)\n\nconst memoryInstructions = `You have memory. You can use it to answer questions. If any questions need\nyou to look up the memory, you should call load_memory function with a query.`\n\ntype loadMemoryTool struct {\n\tname        string\n\tdescription string\n}\n\n// New creates a new loadMemoryTool.\nfunc New() toolinternal.FunctionTool {\n\treturn &loadMemoryTool{\n\t\tname:        \"load_memory\",\n\t\tdescription: \"Loads the memory for the current user.\",\n\t}\n}\n\n// Name implements tool.Tool.\nfunc (t *loadMemoryTool) Name() string {\n\treturn t.name\n}\n\n// Description implements tool.Tool.\nfunc (t *loadMemoryTool) Description() string {\n\treturn t.description\n}\n\n// IsLongRunning implements tool.Tool.\nfunc (t *loadMemoryTool) IsLongRunning() bool {\n\treturn false\n}\n\n// Declaration returns the GenAI FunctionDeclaration for the load_memory tool.\nfunc (t *loadMemoryTool) Declaration() *genai.FunctionDeclaration {\n\treturn &genai.FunctionDeclaration{\n\t\tName:        t.name,\n\t\tDescription: t.description,\n\t\tParameters: &genai.Schema{\n\t\t\tType: \"OBJECT\",\n\t\t\tProperties: map[string]*genai.Schema{\n\t\t\t\t\"query\": {\n\t\t\t\t\tType:        \"STRING\",\n\t\t\t\t\tDescription: \"The query to search memory for.\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tRequired: []string{\"query\"},\n\t\t},\n\t}\n}\n\n// Run executes the tool with the provided context and arguments.\nfunc (t *loadMemoryTool) Run(toolCtx tool.Context, args any) (map[string]any, error) {\n\tm, ok := args.(map[string]any)\n\tif !ok {\n\t\treturn nil, fmt.Errorf(\"unexpected args type, got: %T\", args)\n\t}\n\n\tqueryRaw, exists := m[\"query\"]\n\tif !exists {\n\t\treturn nil, fmt.Errorf(\"missing required parameter: query\")\n\t}\n\n\tquery, ok := queryRaw.(string)\n\tif !ok {\n\t\treturn nil, fmt.Errorf(\"query must be a string, got: %T\", queryRaw)\n\t}\n\n\tsearchResponse, err := toolCtx.SearchMemory(toolCtx, query)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to search memory: %w\", err)\n\t}\n\n\tif searchResponse == nil || searchResponse.Memories == nil {\n\t\treturn map[string]any{\"memories\": []memory.Entry{}}, nil\n\t}\n\treturn map[string]any{\"memories\": searchResponse.Memories}, nil\n}\n\n// ProcessRequest processes the LLM request by packing the tool and appending\n// memory-related instructions.\nfunc (t *loadMemoryTool) ProcessRequest(ctx tool.Context, req *model.LLMRequest) error {\n\tif err := toolutils.PackTool(req, t); err != nil {\n\t\treturn err\n\t}\n\tutils.AppendInstructions(req, memoryInstructions)\n\treturn nil\n}\n"
  },
  {
    "path": "tool/loadmemorytool/tool_test.go",
    "content": "// Copyright 2026 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage loadmemorytool_test\n\nimport (\n\t\"context\"\n\t\"strings\"\n\t\"testing\"\n\t\"time\"\n\n\t\"google.golang.org/genai\"\n\n\ticontext \"google.golang.org/adk/internal/context\"\n\t\"google.golang.org/adk/internal/toolinternal\"\n\t\"google.golang.org/adk/memory\"\n\t\"google.golang.org/adk/model\"\n\t\"google.golang.org/adk/session\"\n\t\"google.golang.org/adk/tool\"\n\t\"google.golang.org/adk/tool/loadmemorytool\"\n)\n\ntype mockMemory struct {\n\tmemories []memory.Entry\n\terr      error\n}\n\nfunc (m *mockMemory) AddSessionToMemory(ctx context.Context, s session.Session) error {\n\treturn nil\n}\n\nfunc (m *mockMemory) SearchMemory(ctx context.Context, query string) (*memory.SearchResponse, error) {\n\tif m.err != nil {\n\t\treturn nil, m.err\n\t}\n\treturn &memory.SearchResponse{Memories: m.memories}, nil\n}\n\nfunc TestLoadMemoryTool_BasicProperties(t *testing.T) {\n\ttool := loadmemorytool.New()\n\n\tif got := tool.Name(); got != \"load_memory\" {\n\t\tt.Errorf(\"Name() = %v, want load_memory\", got)\n\t}\n\tif got := tool.Description(); got != \"Loads the memory for the current user.\" {\n\t\tt.Errorf(\"Description() = %v, want 'Loads the memory for the current user.'\", got)\n\t}\n\tif got := tool.IsLongRunning(); got != false {\n\t\tt.Errorf(\"IsLongRunning() = %v, want false\", got)\n\t}\n}\n\nfunc TestLoadMemoryTool_Run(t *testing.T) {\n\ttool := loadmemorytool.New()\n\n\ttests := []struct {\n\t\tname     string\n\t\targs     map[string]any\n\t\tmemories []memory.Entry\n\t\twantLen  int\n\t\twantErr  bool\n\t}{\n\t\t{\n\t\t\tname:     \"empty memories\",\n\t\t\targs:     map[string]any{\"query\": \"test query\"},\n\t\t\tmemories: []memory.Entry{},\n\t\t\twantLen:  0,\n\t\t},\n\t\t{\n\t\t\tname: \"single memory entry\",\n\t\t\targs: map[string]any{\"query\": \"test query\"},\n\t\t\tmemories: []memory.Entry{\n\t\t\t\t{\n\t\t\t\t\tAuthor:    \"user\",\n\t\t\t\t\tTimestamp: time.Date(2025, 1, 1, 12, 0, 0, 0, time.UTC),\n\t\t\t\t\tContent:   genai.NewContentFromText(\"Hello world\", genai.RoleUser),\n\t\t\t\t},\n\t\t\t},\n\t\t\twantLen: 1,\n\t\t},\n\t\t{\n\t\t\tname: \"multiple memory entries\",\n\t\t\targs: map[string]any{\"query\": \"search term\"},\n\t\t\tmemories: []memory.Entry{\n\t\t\t\t{\n\t\t\t\t\tAuthor:    \"user\",\n\t\t\t\t\tTimestamp: time.Date(2025, 1, 1, 12, 0, 0, 0, time.UTC),\n\t\t\t\t\tContent:   genai.NewContentFromText(\"First memory\", genai.RoleUser),\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tAuthor:    \"assistant\",\n\t\t\t\t\tTimestamp: time.Date(2025, 1, 2, 12, 0, 0, 0, time.UTC),\n\t\t\t\t\tContent:   genai.NewContentFromText(\"Second memory\", genai.RoleModel),\n\t\t\t\t},\n\t\t\t},\n\t\t\twantLen: 2,\n\t\t},\n\t\t{\n\t\t\tname:    \"missing query parameter\",\n\t\t\targs:    map[string]any{},\n\t\t\twantErr: true,\n\t\t},\n\t\t{\n\t\t\tname:    \"invalid query type\",\n\t\t\targs:    map[string]any{\"query\": 123},\n\t\t\twantErr: true,\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\ttc := createToolContext(t, &mockMemory{memories: tt.memories})\n\n\t\t\tresult, err := tool.Run(tc, tt.args)\n\t\t\tif (err != nil) != tt.wantErr {\n\t\t\t\tt.Fatalf(\"Run() error = %v, wantErr %v\", err, tt.wantErr)\n\t\t\t}\n\t\t\tif tt.wantErr {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tmemories, ok := result[\"memories\"].([]memory.Entry)\n\t\t\tif !ok {\n\t\t\t\tt.Fatalf(\"result['memories'] is not []memory.Entry, got %T\", result[\"memories\"])\n\t\t\t}\n\t\t\tif len(memories) != tt.wantLen {\n\t\t\t\tt.Errorf(\"Run() returned %d memories, want %d\", len(memories), tt.wantLen)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestLoadMemoryTool_ProcessRequest(t *testing.T) {\n\ttool := loadmemorytool.New()\n\n\ttc := createToolContext(t, &mockMemory{})\n\tllmRequest := &model.LLMRequest{}\n\n\trequestProcessor, ok := tool.(toolinternal.RequestProcessor)\n\tif !ok {\n\t\tt.Fatal(\"loadMemoryTool does not implement RequestProcessor\")\n\t}\n\n\terr := requestProcessor.ProcessRequest(tc, llmRequest)\n\tif err != nil {\n\t\tt.Fatalf(\"ProcessRequest failed: %v\", err)\n\t}\n\n\tif llmRequest.Config == nil || llmRequest.Config.SystemInstruction == nil {\n\t\tt.Fatal(\"ProcessRequest did not set SystemInstruction\")\n\t}\n\n\tinstruction := llmRequest.Config.SystemInstruction.Parts[0].Text\n\tif !strings.Contains(instruction, \"You have memory\") {\n\t\tt.Errorf(\"Instruction should contain 'You have memory', got: %v\", instruction)\n\t}\n\tif !strings.Contains(instruction, \"load_memory\") {\n\t\tt.Errorf(\"Instruction should contain 'load_memory', got: %v\", instruction)\n\t}\n}\n\nfunc createToolContext(t *testing.T, mem *mockMemory) tool.Context {\n\tt.Helper()\n\n\tctx := icontext.NewInvocationContext(t.Context(), icontext.InvocationContextParams{\n\t\tMemory: mem,\n\t})\n\n\treturn toolinternal.NewToolContext(ctx, \"\", nil, nil)\n}\n"
  },
  {
    "path": "tool/mcptoolset/client.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mcptoolset\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"log\"\n\t\"sync\"\n\n\t\"github.com/modelcontextprotocol/go-sdk/mcp\"\n\n\t\"google.golang.org/adk/internal/version\"\n)\n\n// MCPClient abstracts MCP session operations for easier connection management.\ntype MCPClient interface {\n\tCallTool(context.Context, *mcp.CallToolParams) (*mcp.CallToolResult, error)\n\tListTools(context.Context) ([]*mcp.Tool, error)\n}\n\n// connectionRefresher wraps an MCP client/transport and handles automatic reconnection.\n// It implements MCPClient and transparently retries operations after reconnecting\n// when the underlying session fails.\ntype connectionRefresher struct {\n\tclient    *mcp.Client\n\ttransport mcp.Transport\n\n\tmu      sync.Mutex\n\tsession *mcp.ClientSession\n}\n\n// refreshableErrors is a list of errors that should trigger a connection refresh.\nvar refreshableErrors = []error{\n\tmcp.ErrConnectionClosed,\n\tmcp.ErrSessionMissing,\n\tio.ErrClosedPipe,\n\tio.EOF,\n}\n\n// newConnectionRefresher creates a new connectionRefresher with the given client and transport.\n// If client is nil, a default MCP client will be created.\nfunc newConnectionRefresher(client *mcp.Client, transport mcp.Transport) *connectionRefresher {\n\tif client == nil {\n\t\tclient = mcp.NewClient(&mcp.Implementation{Name: \"adk-mcp-client\", Version: version.Version}, nil)\n\t}\n\treturn &connectionRefresher{\n\t\tclient:    client,\n\t\ttransport: transport,\n\t}\n}\n\n// CallTool calls a tool on the MCP server, automatically reconnecting if needed.\nfunc (c *connectionRefresher) CallTool(ctx context.Context, params *mcp.CallToolParams) (*mcp.CallToolResult, error) {\n\tresult, _, err := withRetry(ctx, c, func(session *mcp.ClientSession) (*mcp.CallToolResult, error) {\n\t\treturn session.CallTool(ctx, params)\n\t})\n\treturn result, err\n}\n\n// ListTools lists all available tools from the MCP server, handling pagination\n// and automatically reconnecting if needed. Per MCP spec, cursors do not persist\n// across sessions, so pagination restarts from scratch after reconnection.\nfunc (c *connectionRefresher) ListTools(ctx context.Context) ([]*mcp.Tool, error) {\n\tvar tools []*mcp.Tool\n\tcursor := \"\"\n\thasReconnected := false\n\n\tfor {\n\t\tresp, reconnected, err := withRetry(ctx, c, func(session *mcp.ClientSession) (*mcp.ListToolsResult, error) {\n\t\t\treturn session.ListTools(ctx, &mcp.ListToolsParams{Cursor: cursor})\n\t\t})\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"failed to list MCP tools: %w\", err)\n\t\t}\n\t\tif reconnected {\n\t\t\tif hasReconnected {\n\t\t\t\treturn nil, fmt.Errorf(\"failed to list MCP tools: connection lost again after reconnection\")\n\t\t\t}\n\t\t\t// On reconnection, restart pagination from scratch per MCP spec.\n\t\t\thasReconnected = true\n\t\t\tcursor = \"\"\n\t\t\ttools = nil\n\t\t\tcontinue\n\t\t}\n\n\t\ttools = append(tools, resp.Tools...)\n\n\t\tif resp.NextCursor == \"\" {\n\t\t\tbreak\n\t\t}\n\t\tcursor = resp.NextCursor\n\t}\n\n\treturn tools, nil\n}\n\n// withRetry executes fn with the current session, and if it fails, attempts to refresh\n// the connection and retry once. Returns the result, whether a reconnection occurred, and any error.\nfunc withRetry[T any](ctx context.Context, c *connectionRefresher, fn func(*mcp.ClientSession) (T, error)) (T, bool, error) {\n\tvar zero T\n\n\tsession, err := c.getSession(ctx)\n\tif err != nil {\n\t\treturn zero, false, err\n\t}\n\n\tresult, err := fn(session)\n\tif err != nil {\n\t\tif !shouldRefreshConnection(err) {\n\t\t\treturn zero, false, err\n\t\t}\n\t\tsession, refreshErr := c.refreshConnection(ctx)\n\t\tif refreshErr != nil {\n\t\t\treturn zero, false, fmt.Errorf(\"%w (reconnection also failed: %v)\", err, refreshErr)\n\t\t}\n\t\tresult, err = fn(session)\n\t\treturn result, true, err\n\t}\n\treturn result, false, err\n}\n\n// shouldRefreshConnection returns true if the error indicates we should\n// attempt to refresh the MCP connection.\nfunc shouldRefreshConnection(err error) bool {\n\tfor _, target := range refreshableErrors {\n\t\tif errors.Is(err, target) {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\nfunc (c *connectionRefresher) getSession(ctx context.Context) (*mcp.ClientSession, error) {\n\tc.mu.Lock()\n\tdefer c.mu.Unlock()\n\n\tif c.session != nil {\n\t\treturn c.session, nil\n\t}\n\n\tsession, err := c.client.Connect(ctx, c.transport, nil)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to init MCP session: %w\", err)\n\t}\n\n\tc.session = session\n\treturn c.session, nil\n}\n\nfunc (c *connectionRefresher) refreshConnection(ctx context.Context) (*mcp.ClientSession, error) {\n\tc.mu.Lock()\n\tdefer c.mu.Unlock()\n\n\t// Ping to verify the connection is actually dead before reconnecting.\n\t// This handles the case where another goroutine already reconnected.\n\tif c.session != nil {\n\t\tif err := c.session.Ping(ctx, &mcp.PingParams{}); err == nil {\n\t\t\treturn c.session, nil\n\t\t}\n\t\tif err := c.session.Close(); err != nil {\n\t\t\tlog.Printf(\"failed to close MCP session: %v\", err)\n\t\t}\n\t\tc.session = nil\n\t}\n\n\tsession, err := c.client.Connect(ctx, c.transport, nil)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to refresh MCP session: %w\", err)\n\t}\n\n\tc.session = session\n\treturn c.session, nil\n}\n\nvar _ MCPClient = (*connectionRefresher)(nil)\n"
  },
  {
    "path": "tool/mcptoolset/set.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Package mcptoolset provides an MCP tool set.\npackage mcptoolset\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/modelcontextprotocol/go-sdk/mcp\"\n\n\t\"google.golang.org/adk/agent\"\n\t\"google.golang.org/adk/tool\"\n)\n\n// New returns MCP ToolSet.\n// MCP ToolSet connects to a MCP Server, retrieves MCP Tools into ADK Tools and\n// passes them to the LLM.\n// It uses https://github.com/modelcontextprotocol/go-sdk for MCP communication.\n// MCP session is created lazily on the first request to LLM.\n//\n// Usage: create MCP ToolSet with mcptoolset.New() and provide it to the\n// LLMAgent in the llmagent.Config.\n//\n// Example:\n//\n//\tllmagent.New(llmagent.Config{\n//\t\tName:        \"agent_name\",\n//\t\tModel:       model,\n//\t\tDescription: \"...\",\n//\t\tInstruction: \"...\",\n//\t\tToolsets: []tool.Set{\n//\t\t\tmcptoolset.New(mcptoolset.Config{\n//\t\t\t\tTransport: &mcp.CommandTransport{Command: exec.Command(\"myserver\")}\n//\t\t\t}),\n//\t\t},\n//\t})\nfunc New(cfg Config) (tool.Toolset, error) {\n\treturn &set{\n\t\tmcpClient:                   newConnectionRefresher(cfg.Client, cfg.Transport),\n\t\ttoolFilter:                  cfg.ToolFilter,\n\t\trequireConfirmation:         cfg.RequireConfirmation,\n\t\trequireConfirmationProvider: cfg.RequireConfirmationProvider,\n\t}, nil\n}\n\n// Config provides initial configuration for the MCP ToolSet.\ntype Config struct {\n\t// Client is an optional custom MCP client to use. If nil, a default client will be created.\n\tClient *mcp.Client\n\t// Transport that will be used to connect to MCP server.\n\tTransport mcp.Transport\n\t// Deprecated: use tool.FilterToolset instead.\n\t// ToolFilter selects tools for which tool.Predicate returns true.\n\t// If ToolFilter is nil, then all tools are returned.\n\t// tool.StringPredicate can be convenient if there's a known fixed list of tool names.\n\tToolFilter tool.Predicate\n\n\t// RequireConfirmation flags whether the tools from this toolset must always ask for user confirmation\n\t// before execution. If set to true, the ADK framework will automatically initiate\n\t// a Human-in-the-Loop (HITL) confirmation request when a tool is invoked.\n\tRequireConfirmation bool\n\n\t// RequireConfirmationProvider allows for dynamic determination of whether\n\t// user confirmation is needed. This field is a function called at runtime to decide if\n\t// a confirmation request should be sent. The function takes the toolName and tool's input parameters as arguments.\n\t// This provider offers more flexibility than the static RequireConfirmation flag,\n\t// enabling conditional confirmation based on the invocation details.\n\t// If set, this takes precedence over the RequireConfirmation flag.\n\t//\n\t// Required signature for a provider function:\n\t// func(name string, toolInput any) bool\n\t// Returning true means confirmation is required.\n\tRequireConfirmationProvider tool.ConfirmationProvider\n}\n\ntype set struct {\n\tmcpClient                   MCPClient\n\ttoolFilter                  tool.Predicate\n\trequireConfirmation         bool\n\trequireConfirmationProvider tool.ConfirmationProvider\n}\n\nfunc (*set) Name() string {\n\treturn \"mcp_tool_set\"\n}\n\nfunc (*set) Description() string {\n\treturn \"Connects to a MCP Server, retrieves MCP Tools into ADK Tools.\"\n}\n\nfunc (*set) IsLongRunning() bool {\n\treturn false\n}\n\n// Tools fetch MCP tools from the server, convert to adk tool.Tool and filter by name.\nfunc (s *set) Tools(ctx agent.ReadonlyContext) ([]tool.Tool, error) {\n\tmcpTools, err := s.mcpClient.ListTools(ctx)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tvar adkTools []tool.Tool\n\tfor _, mcpTool := range mcpTools {\n\t\tt, err := convertTool(mcpTool, s.mcpClient, s.requireConfirmation, s.requireConfirmationProvider)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"failed to convert MCP tool %q to adk tool: %w\", mcpTool.Name, err)\n\t\t}\n\n\t\tif s.toolFilter != nil && !s.toolFilter(ctx, t) {\n\t\t\tcontinue\n\t\t}\n\n\t\tadkTools = append(adkTools, t)\n\t}\n\n\treturn adkTools, nil\n}\n"
  },
  {
    "path": "tool/mcptoolset/set_test.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mcptoolset_test\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"log\"\n\t\"net/http\"\n\t\"path/filepath\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/google/go-cmp/cmp\"\n\t\"github.com/google/go-cmp/cmp/cmpopts\"\n\t\"github.com/modelcontextprotocol/go-sdk/mcp\"\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/agent/llmagent\"\n\ticontext \"google.golang.org/adk/internal/context\"\n\t\"google.golang.org/adk/internal/httprr\"\n\t\"google.golang.org/adk/internal/testutil\"\n\t\"google.golang.org/adk/internal/toolinternal\"\n\t\"google.golang.org/adk/model\"\n\t\"google.golang.org/adk/model/gemini\"\n\t\"google.golang.org/adk/session\"\n\t\"google.golang.org/adk/tool\"\n\t\"google.golang.org/adk/tool/mcptoolset\"\n\t\"google.golang.org/adk/tool/toolconfirmation\"\n)\n\ntype Input struct {\n\tCity string `json:\"city\" jsonschema:\"city name\"`\n}\n\ntype Output struct {\n\tWeatherSummary string `json:\"weather_summary\" jsonschema:\"weather summary in the given city\"`\n}\n\nfunc weatherFunc(ctx context.Context, req *mcp.CallToolRequest, input Input) (*mcp.CallToolResult, Output, error) {\n\treturn nil, Output{\n\t\tWeatherSummary: fmt.Sprintf(\"Today in %q is sunny\", input.City),\n\t}, nil\n}\n\nconst modelName = \"gemini-2.5-flash\"\n\n//go:generate go test -v -httprecord=.*\n\nfunc TestMCPToolSet(t *testing.T) {\n\tconst (\n\t\ttoolName        = \"get_weather\"\n\t\ttoolDescription = \"returns weather in the given city\"\n\t)\n\n\tclientTransport, serverTransport := mcp.NewInMemoryTransports()\n\n\t// Run in-memory MCP server.\n\tserver := mcp.NewServer(&mcp.Implementation{Name: \"weather_server\", Version: \"v1.0.0\"}, nil)\n\tmcp.AddTool(server, &mcp.Tool{Name: toolName, Description: toolDescription}, weatherFunc)\n\t_, err := server.Connect(t.Context(), serverTransport, nil)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\tts, err := mcptoolset.New(mcptoolset.Config{\n\t\tTransport: clientTransport,\n\t})\n\tif err != nil {\n\t\tt.Fatalf(\"Failed to create MCP tool set: %v\", err)\n\t}\n\n\tagent, err := llmagent.New(llmagent.Config{\n\t\tName:        \"weather_time_agent\",\n\t\tModel:       newGeminiModel(t, modelName),\n\t\tDescription: \"Agent to answer questions about the time and weather in a city.\",\n\t\tInstruction: \"I can answer your questions about the time and weather in a city.\",\n\t\tToolsets: []tool.Toolset{\n\t\t\tts,\n\t\t},\n\t})\n\tif err != nil {\n\t\tlog.Fatalf(\"Failed to create agent: %v\", err)\n\t}\n\n\tprompt := \"what is the weather in london?\"\n\trunner := testutil.NewTestAgentRunner(t, agent)\n\n\tvar gotEvents []*session.Event\n\tfor event, err := range runner.Run(t, \"session1\", prompt) {\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\tgotEvents = append(gotEvents, event)\n\t}\n\n\twantEvents := []*session.Event{\n\t\t{\n\t\t\tAuthor: \"weather_time_agent\",\n\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\tContent: &genai.Content{\n\t\t\t\t\tParts: []*genai.Part{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tFunctionCall: &genai.FunctionCall{\n\t\t\t\t\t\t\t\tName: toolName,\n\t\t\t\t\t\t\t\tArgs: map[string]any{\"city\": \"london\"},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tRole: genai.RoleModel,\n\t\t\t\t},\n\t\t\t\tModelVersion: \"gemini-2.5-flash\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tAuthor: \"weather_time_agent\",\n\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\tContent: &genai.Content{\n\t\t\t\t\tParts: []*genai.Part{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tFunctionResponse: &genai.FunctionResponse{\n\t\t\t\t\t\t\t\tName: toolName,\n\t\t\t\t\t\t\t\tResponse: map[string]any{\n\t\t\t\t\t\t\t\t\t\"output\": map[string]any{\"weather_summary\": string(`Today in \"london\" is sunny`)},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tRole: genai.RoleUser,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tAuthor: \"weather_time_agent\",\n\t\t\tLLMResponse: model.LLMResponse{\n\t\t\t\tContent: &genai.Content{\n\t\t\t\t\tParts: []*genai.Part{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tText: `The weather in London is sunny.`,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tRole: genai.RoleModel,\n\t\t\t\t},\n\t\t\t\tModelVersion: \"gemini-2.5-flash\",\n\t\t\t},\n\t\t},\n\t}\n\n\tif diff := cmp.Diff(wantEvents, gotEvents,\n\t\tcmpopts.IgnoreFields(session.Event{}, \"ID\", \"Timestamp\", \"InvocationID\"),\n\t\tcmpopts.IgnoreFields(session.EventActions{}, \"StateDelta\", \"ArtifactDelta\"),\n\t\tcmpopts.IgnoreFields(model.LLMResponse{}, \"UsageMetadata\", \"AvgLogprobs\", \"FinishReason\"),\n\t\tcmpopts.IgnoreFields(genai.FunctionCall{}, \"ID\"),\n\t\tcmpopts.IgnoreFields(genai.FunctionResponse{}, \"ID\"),\n\t\tcmpopts.IgnoreFields(genai.Part{}, \"ThoughtSignature\")); diff != \"\" {\n\t\tt.Errorf(\"event[i] mismatch (-want +got):\\n%s\", diff)\n\t}\n}\n\nfunc newGeminiTestClientConfig(t *testing.T, rrfile string) (http.RoundTripper, bool) {\n\tt.Helper()\n\trr, err := testutil.NewGeminiTransport(rrfile)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\t// Ensure the transport is closed to flush data and release locks\n\tif c, ok := rr.(io.Closer); ok {\n\t\tt.Cleanup(func() {\n\t\t\tif err := c.Close(); err != nil {\n\t\t\t\tt.Errorf(\"failed to close transport: %v\", err)\n\t\t\t}\n\t\t})\n\t}\n\n\trecording, _ := httprr.Recording(rrfile)\n\treturn rr, recording\n}\n\nfunc newGeminiModel(t *testing.T, modelName string) model.LLM {\n\tapiKey := \"fakeKey\"\n\ttrace := filepath.Join(\"testdata\", strings.ReplaceAll(t.Name()+\".httprr\", \"/\", \"_\"))\n\trecording := false\n\ttransport, recording := newGeminiTestClientConfig(t, trace)\n\tif recording { // if we are recording httprr trace, don't use the fakeKey.\n\t\tapiKey = \"\"\n\t}\n\n\tmodel, err := gemini.NewModel(t.Context(), modelName, &genai.ClientConfig{\n\t\tHTTPClient: &http.Client{Transport: transport},\n\t\tAPIKey:     apiKey,\n\t})\n\tif err != nil {\n\t\tt.Fatalf(\"failed to create model: %v\", err)\n\t}\n\treturn model\n}\n\nfunc TestToolFilter(t *testing.T) {\n\tconst toolDescription = \"returns weather in the given city\"\n\n\tclientTransport, serverTransport := mcp.NewInMemoryTransports()\n\n\tserver := mcp.NewServer(&mcp.Implementation{Name: \"weather_server\", Version: \"v1.0.0\"}, nil)\n\tmcp.AddTool(server, &mcp.Tool{Name: \"get_weather\", Description: toolDescription}, weatherFunc)\n\tmcp.AddTool(server, &mcp.Tool{Name: \"get_weather1\", Description: toolDescription}, weatherFunc)\n\t_, err := server.Connect(t.Context(), serverTransport, nil)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\tts, err := mcptoolset.New(mcptoolset.Config{\n\t\tTransport:  clientTransport,\n\t\tToolFilter: tool.StringPredicate([]string{\"get_weather\"}),\n\t})\n\tif err != nil {\n\t\tt.Fatalf(\"Failed to create MCP tool set: %v\", err)\n\t}\n\n\ttools, err := ts.Tools(icontext.NewReadonlyContext(\n\t\ticontext.NewInvocationContext(\n\t\t\tt.Context(),\n\t\t\ticontext.InvocationContextParams{},\n\t\t),\n\t))\n\tif err != nil {\n\t\tt.Fatalf(\"Failed to get tools: %v\", err)\n\t}\n\n\tgotToolNames := make([]string, len(tools))\n\tfor i, tool := range tools {\n\t\tgotToolNames[i] = tool.Name()\n\t}\n\twantToolNames := []string{\"get_weather\"}\n\n\tif diff := cmp.Diff(wantToolNames, gotToolNames); diff != \"\" {\n\t\tt.Errorf(\"tools mismatch (-want +got):\\n%s\", diff)\n\t}\n}\n\nfunc TestListToolsReconnection(t *testing.T) {\n\tserver := mcp.NewServer(&mcp.Implementation{Name: \"test_server\", Version: \"v1.0.0\"}, nil)\n\tmcp.AddTool(server, &mcp.Tool{Name: \"get_weather\", Description: \"returns weather in the given city\"}, weatherFunc)\n\n\trt := &reconnectableTransport{server: server}\n\tspyTransport := &spyTransport{Transport: rt}\n\n\tts, err := mcptoolset.New(mcptoolset.Config{\n\t\tTransport: spyTransport,\n\t})\n\tif err != nil {\n\t\tt.Fatalf(\"Failed to create MCP tool set: %v\", err)\n\t}\n\n\tctx := icontext.NewReadonlyContext(icontext.NewInvocationContext(t.Context(), icontext.InvocationContextParams{}))\n\n\t// First call to Tools should create a session.\n\t_, err = ts.Tools(ctx)\n\tif err != nil {\n\t\tt.Fatalf(\"First Tools call failed: %v\", err)\n\t}\n\n\t// Kill the transport by closing the connection.\n\tif err := spyTransport.lastConn.Close(); err != nil {\n\t\tt.Fatalf(\"Failed to close connection: %v\", err)\n\t}\n\n\t// Second call should detect the closed connection and reconnect.\n\t_, err = ts.Tools(ctx)\n\tif err != nil {\n\t\tt.Fatalf(\"Second Tools call failed: %v\", err)\n\t}\n\n\t// Verify that we reconnected (should have 2 connections).\n\tif spyTransport.connectCount != 2 {\n\t\tt.Errorf(\"Expected 2 Connect calls (reconnect after close), got %d\", spyTransport.connectCount)\n\t}\n}\n\nfunc TestCallToolReconnection(t *testing.T) {\n\tserver := mcp.NewServer(&mcp.Implementation{Name: \"test_server\", Version: \"v1.0.0\"}, nil)\n\tmcp.AddTool(server, &mcp.Tool{Name: \"get_weather\", Description: \"returns weather in the given city\"}, weatherFunc)\n\n\trt := &reconnectableTransport{server: server}\n\tspyTransport := &spyTransport{Transport: rt}\n\n\tts, err := mcptoolset.New(mcptoolset.Config{\n\t\tTransport: spyTransport,\n\t})\n\tif err != nil {\n\t\tt.Fatalf(\"Failed to create MCP tool set: %v\", err)\n\t}\n\n\tinvCtx := icontext.NewInvocationContext(t.Context(), icontext.InvocationContextParams{})\n\tctx := icontext.NewReadonlyContext(invCtx)\n\ttoolCtx := toolinternal.NewToolContext(invCtx, \"\", nil, nil)\n\n\t// Get tools first to establish a session.\n\ttools, err := ts.Tools(ctx)\n\tif err != nil {\n\t\tt.Fatalf(\"Tools call failed: %v\", err)\n\t}\n\n\t// Kill the transport by closing the connection.\n\tif err := spyTransport.lastConn.Close(); err != nil {\n\t\tt.Fatalf(\"Failed to close connection: %v\", err)\n\t}\n\n\t// Call the tool - should reconnect and succeed.\n\tfnTool := tools[0].(toolinternal.FunctionTool)\n\tresult, err := fnTool.Run(toolCtx, map[string]any{\"city\": \"Paris\"})\n\tif err != nil {\n\t\tt.Fatalf(\"Tool call after reconnect failed: %v\", err)\n\t}\n\tif result == nil {\n\t\tt.Fatal(\"Expected non-nil result after reconnect\")\n\t}\n\n\t// Verify that we reconnected (should have 2 connections).\n\tif spyTransport.connectCount != 2 {\n\t\tt.Errorf(\"Expected 2 Connect calls (reconnect after close), got %d\", spyTransport.connectCount)\n\t}\n}\n\ntype spyTransport struct {\n\tmcp.Transport\n\tconnectCount int\n\tlastConn     mcp.Connection\n}\n\nfunc (t *spyTransport) Connect(ctx context.Context) (mcp.Connection, error) {\n\tt.connectCount++\n\tconn, err := t.Transport.Connect(ctx)\n\tt.lastConn = conn\n\treturn conn, err\n}\n\ntype reconnectableTransport struct {\n\tserver *mcp.Server\n}\n\nfunc (rt *reconnectableTransport) Connect(ctx context.Context) (mcp.Connection, error) {\n\tct, st := mcp.NewInMemoryTransports()\n\t_, err := rt.server.Connect(ctx, st, nil)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn ct.Connect(ctx)\n}\n\nfunc TestMCPToolSetConfirmation(t *testing.T) {\n\tconst (\n\t\ttoolName        = \"get_weather\"\n\t\ttoolDescription = \"returns weather in the given city\"\n\t)\n\n\trequireConfirmationProvider := func(name string, args any) bool {\n\t\tif name != toolName {\n\t\t\treturn false\n\t\t}\n\n\t\tif input, ok := args.(Input); ok {\n\t\t\treturn input.City == \"Lisbon\"\n\t\t}\n\n\t\tif m, ok := args.(map[string]any); ok {\n\t\t\tif cityVal, found := m[\"city\"]; found {\n\t\t\t\tif cityStr, isStr := cityVal.(string); isStr {\n\t\t\t\t\treturn cityStr == \"Lisbon\"\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn true\n\t}\n\n\ttestCases := []struct {\n\t\tname                    string\n\t\ttoolSetConfig           mcptoolset.Config\n\t\tcity                    string\n\t\tconfirmFunctionResponse *genai.FunctionResponse // User's confirmation response\n\t\twant                    []*genai.Content\n\t}{\n\t\t{\n\t\t\tname:          \"No Confirmation Required\",\n\t\t\ttoolSetConfig: mcptoolset.Config{},\n\t\t\tcity:          \"Lisbon\",\n\t\t\twant: []*genai.Content{\n\t\t\t\tgenai.NewContentFromFunctionCall(toolName, map[string]any{\"city\": \"Lisbon\"}, \"model\"),\n\t\t\t\tgenai.NewContentFromFunctionResponse(toolName, map[string]any{\n\t\t\t\t\t\"output\": map[string]any{\"weather_summary\": string(`Today in \"Lisbon\" is sunny`)},\n\t\t\t\t}, \"user\"),\n\t\t\t\tgenai.NewContentFromText(`Today in \"Lisbon\" is sunny`, \"model\"),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"Confirmation Required\",\n\t\t\ttoolSetConfig: mcptoolset.Config{\n\t\t\t\tRequireConfirmation: true,\n\t\t\t},\n\t\t\tcity: \"Lisbon\",\n\t\t\twant: []*genai.Content{\n\t\t\t\tgenai.NewContentFromFunctionCall(toolName, map[string]any{\"city\": \"Lisbon\"}, \"model\"),\n\t\t\t\tgenai.NewContentFromFunctionCall(toolconfirmation.FunctionCallName, map[string]any{\n\t\t\t\t\t\"originalFunctionCall\": &genai.FunctionCall{\n\t\t\t\t\t\tArgs: map[string]any{\"city\": \"Lisbon\"},\n\t\t\t\t\t\tName: toolName,\n\t\t\t\t\t},\n\t\t\t\t\t\"toolConfirmation\": toolconfirmation.ToolConfirmation{\n\t\t\t\t\t\tHint: \"Please approve or reject the tool call get_weather() by responding with a FunctionResponse with an expected ToolConfirmation payload.\",\n\t\t\t\t\t},\n\t\t\t\t}, \"model\"),\n\t\t\t\tgenai.NewContentFromFunctionResponse(toolName, map[string]any{\n\t\t\t\t\t\"error\": errors.New(\"error tool \\\"get_weather\\\" requires confirmation, please approve or reject\"),\n\t\t\t\t}, \"user\"),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"Confirmation Required and is confirmed\",\n\t\t\ttoolSetConfig: mcptoolset.Config{\n\t\t\t\tRequireConfirmation: true,\n\t\t\t},\n\t\t\tcity:                    \"Lisbon\",\n\t\t\tconfirmFunctionResponse: &genai.FunctionResponse{Name: toolconfirmation.FunctionCallName, Response: map[string]any{\"confirmed\": true}},\n\t\t\twant: []*genai.Content{\n\t\t\t\tgenai.NewContentFromFunctionCall(toolName, map[string]any{\"city\": \"Lisbon\"}, \"model\"),\n\t\t\t\tgenai.NewContentFromFunctionCall(toolconfirmation.FunctionCallName, map[string]any{\n\t\t\t\t\t\"originalFunctionCall\": &genai.FunctionCall{\n\t\t\t\t\t\tArgs: map[string]any{\"city\": \"Lisbon\"},\n\t\t\t\t\t\tName: toolName,\n\t\t\t\t\t},\n\t\t\t\t\t\"toolConfirmation\": toolconfirmation.ToolConfirmation{\n\t\t\t\t\t\tHint: \"Please approve or reject the tool call get_weather() by responding with a FunctionResponse with an expected ToolConfirmation payload.\",\n\t\t\t\t\t},\n\t\t\t\t}, \"model\"),\n\t\t\t\tgenai.NewContentFromFunctionResponse(toolName, map[string]any{\n\t\t\t\t\t\"error\": errors.New(\"error tool \\\"get_weather\\\" requires confirmation, please approve or reject\"),\n\t\t\t\t}, \"user\"),\n\t\t\t\tgenai.NewContentFromFunctionResponse(toolName, map[string]any{\n\t\t\t\t\t\"output\": map[string]any{\"weather_summary\": string(`Today in \"Lisbon\" is sunny`)},\n\t\t\t\t}, \"user\"),\n\t\t\t\tgenai.NewContentFromText(`Today in \"Lisbon\" is sunny`, \"model\"),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"Confirmation Required and is rejected\",\n\t\t\ttoolSetConfig: mcptoolset.Config{\n\t\t\t\tRequireConfirmation: true,\n\t\t\t},\n\t\t\tcity:                    \"Lisbon\",\n\t\t\tconfirmFunctionResponse: &genai.FunctionResponse{Name: toolconfirmation.FunctionCallName, Response: map[string]any{\"confirmed\": false}},\n\t\t\twant: []*genai.Content{\n\t\t\t\tgenai.NewContentFromFunctionCall(toolName, map[string]any{\"city\": \"Lisbon\"}, \"model\"),\n\t\t\t\tgenai.NewContentFromFunctionCall(toolconfirmation.FunctionCallName, map[string]any{\n\t\t\t\t\t\"originalFunctionCall\": &genai.FunctionCall{\n\t\t\t\t\t\tArgs: map[string]any{\"city\": \"Lisbon\"},\n\t\t\t\t\t\tName: toolName,\n\t\t\t\t\t},\n\t\t\t\t\t\"toolConfirmation\": toolconfirmation.ToolConfirmation{\n\t\t\t\t\t\tHint: \"Please approve or reject the tool call get_weather() by responding with a FunctionResponse with an expected ToolConfirmation payload.\",\n\t\t\t\t\t},\n\t\t\t\t}, \"model\"),\n\t\t\t\tgenai.NewContentFromFunctionResponse(toolName, map[string]any{\n\t\t\t\t\t\"error\": errors.New(\"error tool \\\"get_weather\\\" requires confirmation, please approve or reject\"),\n\t\t\t\t}, \"user\"),\n\t\t\t\tgenai.NewContentFromFunctionResponse(toolName, map[string]any{\n\t\t\t\t\t\"error\": errors.New(\"error tool \\\"get_weather\\\" call is rejected\"),\n\t\t\t\t}, \"user\"),\n\t\t\t\tgenai.NewContentFromText(\"I am sorry, I cannot get the weather in Lisbon.\", \"model\"),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"Conditional Confirmation Not Required\",\n\t\t\ttoolSetConfig: mcptoolset.Config{\n\t\t\t\tRequireConfirmationProvider: requireConfirmationProvider,\n\t\t\t},\n\t\t\tcity: \"Porto\",\n\t\t\twant: []*genai.Content{\n\t\t\t\tgenai.NewContentFromFunctionCall(toolName, map[string]any{\"city\": \"Porto\"}, \"model\"),\n\t\t\t\tgenai.NewContentFromFunctionResponse(toolName, map[string]any{\n\t\t\t\t\t\"output\": map[string]any{\"weather_summary\": string(`Today in \"Porto\" is sunny`)},\n\t\t\t\t}, \"user\"),\n\t\t\t\tgenai.NewContentFromText(`Today in \"Porto\" is sunny`, \"model\"),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"Conditional Confirmation Not Required For This Tool\",\n\t\t\ttoolSetConfig: mcptoolset.Config{\n\t\t\t\tRequireConfirmationProvider: func(name string, args any) bool {\n\t\t\t\t\treturn name != toolName\n\t\t\t\t},\n\t\t\t},\n\t\t\tcity: \"Lisbon\",\n\t\t\twant: []*genai.Content{\n\t\t\t\tgenai.NewContentFromFunctionCall(toolName, map[string]any{\"city\": \"Lisbon\"}, \"model\"),\n\t\t\t\tgenai.NewContentFromFunctionResponse(toolName, map[string]any{\n\t\t\t\t\t\"output\": map[string]any{\"weather_summary\": string(`Today in \"Lisbon\" is sunny`)},\n\t\t\t\t}, \"user\"),\n\t\t\t\tgenai.NewContentFromText(`Today in \"Lisbon\" is sunny`, \"model\"),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"Conditional Confirmation Required For This Tool\",\n\t\t\ttoolSetConfig: mcptoolset.Config{\n\t\t\t\tRequireConfirmationProvider: func(name string, args any) bool {\n\t\t\t\t\treturn name == toolName\n\t\t\t\t},\n\t\t\t},\n\t\t\tcity: \"Lisbon\",\n\t\t\twant: []*genai.Content{\n\t\t\t\tgenai.NewContentFromFunctionCall(toolName, map[string]any{\"city\": \"Lisbon\"}, \"model\"),\n\t\t\t\tgenai.NewContentFromFunctionCall(toolconfirmation.FunctionCallName, map[string]any{\n\t\t\t\t\t\"originalFunctionCall\": &genai.FunctionCall{\n\t\t\t\t\t\tArgs: map[string]any{\"city\": \"Lisbon\"},\n\t\t\t\t\t\tName: toolName,\n\t\t\t\t\t},\n\t\t\t\t\t\"toolConfirmation\": toolconfirmation.ToolConfirmation{\n\t\t\t\t\t\tHint: \"Please approve or reject the tool call get_weather() by responding with a FunctionResponse with an expected ToolConfirmation payload.\",\n\t\t\t\t\t},\n\t\t\t\t}, \"model\"),\n\t\t\t\tgenai.NewContentFromFunctionResponse(toolName, map[string]any{\n\t\t\t\t\t\"error\": errors.New(\"error tool \\\"get_weather\\\" requires confirmation, please approve or reject\"),\n\t\t\t\t}, \"user\"),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"Conditional Confirmation Required\",\n\t\t\ttoolSetConfig: mcptoolset.Config{\n\t\t\t\tRequireConfirmationProvider: requireConfirmationProvider,\n\t\t\t},\n\t\t\tcity: \"Lisbon\",\n\t\t\twant: []*genai.Content{\n\t\t\t\tgenai.NewContentFromFunctionCall(toolName, map[string]any{\"city\": \"Lisbon\"}, \"model\"),\n\t\t\t\tgenai.NewContentFromFunctionCall(toolconfirmation.FunctionCallName, map[string]any{\n\t\t\t\t\t\"originalFunctionCall\": &genai.FunctionCall{\n\t\t\t\t\t\tArgs: map[string]any{\"city\": \"Lisbon\"},\n\t\t\t\t\t\tName: toolName,\n\t\t\t\t\t},\n\t\t\t\t\t\"toolConfirmation\": toolconfirmation.ToolConfirmation{\n\t\t\t\t\t\tHint: \"Please approve or reject the tool call get_weather() by responding with a FunctionResponse with an expected ToolConfirmation payload.\",\n\t\t\t\t\t},\n\t\t\t\t}, \"model\"),\n\t\t\t\tgenai.NewContentFromFunctionResponse(toolName, map[string]any{\n\t\t\t\t\t\"error\": errors.New(\"error tool \\\"get_weather\\\" requires confirmation, please approve or reject\"),\n\t\t\t\t}, \"user\"),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"Conditional Confirmation Required and is confirmed\",\n\t\t\ttoolSetConfig: mcptoolset.Config{\n\t\t\t\tRequireConfirmationProvider: requireConfirmationProvider,\n\t\t\t},\n\t\t\tcity:                    \"Lisbon\",\n\t\t\tconfirmFunctionResponse: &genai.FunctionResponse{Name: toolconfirmation.FunctionCallName, Response: map[string]any{\"confirmed\": true}},\n\t\t\twant: []*genai.Content{\n\t\t\t\tgenai.NewContentFromFunctionCall(toolName, map[string]any{\"city\": \"Lisbon\"}, \"model\"),\n\t\t\t\tgenai.NewContentFromFunctionCall(toolconfirmation.FunctionCallName, map[string]any{\n\t\t\t\t\t\"originalFunctionCall\": &genai.FunctionCall{\n\t\t\t\t\t\tArgs: map[string]any{\"city\": \"Lisbon\"},\n\t\t\t\t\t\tName: toolName,\n\t\t\t\t\t},\n\t\t\t\t\t\"toolConfirmation\": toolconfirmation.ToolConfirmation{\n\t\t\t\t\t\tHint: \"Please approve or reject the tool call get_weather() by responding with a FunctionResponse with an expected ToolConfirmation payload.\",\n\t\t\t\t\t},\n\t\t\t\t}, \"model\"),\n\t\t\t\tgenai.NewContentFromFunctionResponse(toolName, map[string]any{\n\t\t\t\t\t\"error\": errors.New(\"error tool \\\"get_weather\\\" requires confirmation, please approve or reject\"),\n\t\t\t\t}, \"user\"),\n\t\t\t\tgenai.NewContentFromFunctionResponse(toolName, map[string]any{\n\t\t\t\t\t\"output\": map[string]any{\"weather_summary\": string(`Today in \"Lisbon\" is sunny`)},\n\t\t\t\t}, \"user\"),\n\t\t\t\tgenai.NewContentFromText(`Today in \"Lisbon\" is sunny`, \"model\"),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"Conditional Confirmation Required and is rejected\",\n\t\t\ttoolSetConfig: mcptoolset.Config{\n\t\t\t\tRequireConfirmationProvider: requireConfirmationProvider,\n\t\t\t},\n\t\t\tcity:                    \"Lisbon\",\n\t\t\tconfirmFunctionResponse: &genai.FunctionResponse{Name: toolconfirmation.FunctionCallName, Response: map[string]any{\"confirmed\": false}},\n\t\t\twant: []*genai.Content{\n\t\t\t\tgenai.NewContentFromFunctionCall(toolName, map[string]any{\"city\": \"Lisbon\"}, \"model\"),\n\t\t\t\tgenai.NewContentFromFunctionCall(toolconfirmation.FunctionCallName, map[string]any{\n\t\t\t\t\t\"originalFunctionCall\": &genai.FunctionCall{\n\t\t\t\t\t\tArgs: map[string]any{\"city\": \"Lisbon\"},\n\t\t\t\t\t\tName: toolName,\n\t\t\t\t\t},\n\t\t\t\t\t\"toolConfirmation\": toolconfirmation.ToolConfirmation{\n\t\t\t\t\t\tHint: \"Please approve or reject the tool call get_weather() by responding with a FunctionResponse with an expected ToolConfirmation payload.\",\n\t\t\t\t\t},\n\t\t\t\t}, \"model\"),\n\t\t\t\tgenai.NewContentFromFunctionResponse(toolName, map[string]any{\n\t\t\t\t\t\"error\": errors.New(\"error tool \\\"get_weather\\\" requires confirmation, please approve or reject\"),\n\t\t\t\t}, \"user\"),\n\t\t\t\tgenai.NewContentFromFunctionResponse(toolName, map[string]any{\n\t\t\t\t\t\"error\": errors.New(\"error tool \\\"get_weather\\\" call is rejected\"),\n\t\t\t\t}, \"user\"),\n\t\t\t\tgenai.NewContentFromText(\"I am sorry, I cannot get the weather in Lisbon.\", \"model\"),\n\t\t\t},\n\t\t},\n\t}\n\n\tfor _, tc := range testCases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\tclientTransport, serverTransport := mcp.NewInMemoryTransports()\n\n\t\t\t// Run in-memory MCP server.\n\t\t\tserver := mcp.NewServer(&mcp.Implementation{Name: \"weather_server\", Version: \"v1.0.0\"}, nil)\n\t\t\tmcp.AddTool(server, &mcp.Tool{Name: toolName, Description: toolDescription}, weatherFunc)\n\t\t\t_, err := server.Connect(t.Context(), serverTransport, nil)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\n\t\t\ttc.toolSetConfig.Transport = clientTransport\n\t\t\tts, err := mcptoolset.New(tc.toolSetConfig)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"Failed to create MCP tool set: %v\", err)\n\t\t\t}\n\n\t\t\tagent, err := llmagent.New(llmagent.Config{\n\t\t\t\tName:        \"weather_time_agent\",\n\t\t\t\tModel:       newGeminiModel(t, modelName),\n\t\t\t\tDescription: \"Agent to answer questions about the time and weather in a city.\",\n\t\t\t\tInstruction: \"I can answer your questions about the time and weather in a city.\",\n\t\t\t\tToolsets: []tool.Toolset{\n\t\t\t\t\tts,\n\t\t\t\t},\n\t\t\t})\n\t\t\tif err != nil {\n\t\t\t\tlog.Fatalf(\"Failed to create agent: %v\", err)\n\t\t\t}\n\n\t\t\tprompt := fmt.Sprintf(\"what is the weather in %s?\", tc.city)\n\t\t\trunner := testutil.NewTestAgentRunner(t, agent)\n\n\t\t\tev := runner.Run(t, \"session1\", prompt)\n\n\t\t\tcomptsList := []cmp.Option{\n\t\t\t\tcmpopts.IgnoreFields(session.Event{}, \"ID\", \"Timestamp\", \"InvocationID\"),\n\t\t\t\tcmpopts.IgnoreFields(session.EventActions{}, \"StateDelta\"),\n\t\t\t\tcmpopts.IgnoreFields(model.LLMResponse{}, \"UsageMetadata\", \"AvgLogprobs\", \"FinishReason\"),\n\t\t\t\tcmpopts.IgnoreFields(genai.FunctionCall{}, \"ID\"),\n\t\t\t\tcmpopts.IgnoreFields(genai.FunctionResponse{}, \"ID\"),\n\t\t\t\tcmpopts.IgnoreFields(genai.Part{}, \"ThoughtSignature\"),\n\t\t\t\tcmp.Transformer(\"StringifyMapErrors\", func(m map[string]any) map[string]any {\n\t\t\t\t\tout := make(map[string]any, len(m))\n\t\t\t\t\tfor k, v := range m {\n\t\t\t\t\t\t// Check if the value inside the map is an error\n\t\t\t\t\t\tif err, ok := v.(error); ok {\n\t\t\t\t\t\t\tout[k] = err.Error() // Convert to string\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tout[k] = v // Keep as is\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn out\n\t\t\t\t}),\n\t\t\t}\n\n\t\t\teventCount := 0\n\t\t\tvar confirmFunctionCall *genai.FunctionCall\n\t\t\tfor got, err := range ev {\n\t\t\t\tif err != nil && err.Error() == \"no data\" {\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tif err != nil {\n\t\t\t\t\t// Check if an error was expected\n\t\t\t\t\tt.Fatalf(\"runner returned unexpected error: %v\", err)\n\t\t\t\t\t// If error was expected, we can stop here or check for a specific error type.\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif eventCount >= len(tc.want) {\n\t\t\t\t\tt.Fatalf(\"stream generated more values than the expected %d. Got: %+v\", len(tc.want), got.Content)\n\t\t\t\t}\n\n\t\t\t\tif diff := cmp.Diff(tc.want[eventCount], got.Content, comptsList...); diff != \"\" {\n\t\t\t\t\tt.Errorf(\"LoopAgent Run() mismatch (-want +got):\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\tfor _, p := range got.Content.Parts {\n\t\t\t\t\tif p.FunctionCall != nil && p.FunctionCall.Name == toolconfirmation.FunctionCallName {\n\t\t\t\t\t\tconfirmFunctionCall = p.FunctionCall\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\teventCount++\n\t\t\t}\n\n\t\t\tif confirmFunctionCall != nil && tc.confirmFunctionResponse != nil {\n\t\t\t\ttc.confirmFunctionResponse.ID = confirmFunctionCall.ID\n\t\t\t\tev := runner.RunContent(t, \"session1\", &genai.Content{\n\t\t\t\t\tParts: []*genai.Part{{FunctionResponse: tc.confirmFunctionResponse}},\n\t\t\t\t})\n\t\t\t\tfor got, err := range ev {\n\t\t\t\t\tif err != nil && err.Error() == \"no data\" {\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t// Check if an error was expected\n\t\t\t\t\t\tt.Fatalf(\"runner returned unexpected error: %v\", err)\n\t\t\t\t\t\t// If error was expected, we can stop here or check for a specific error type.\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\n\t\t\t\t\tif eventCount >= len(tc.want) {\n\t\t\t\t\t\tt.Fatalf(\"stream generated more values than the expected %d. Got: %+v\", len(tc.want), got.Content)\n\t\t\t\t\t}\n\n\t\t\t\t\tif diff := cmp.Diff(tc.want[eventCount], got.Content, comptsList...); diff != \"\" {\n\t\t\t\t\t\tt.Errorf(\"LoopAgent Run() mismatch (-want +got):\\n%s\", diff)\n\t\t\t\t\t}\n\t\t\t\t\tfor _, p := range got.Content.Parts {\n\t\t\t\t\t\tif p.FunctionCall != nil && p.FunctionCall.Name == toolconfirmation.FunctionCallName {\n\t\t\t\t\t\t\tconfirmFunctionCall = p.FunctionCall\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\teventCount++\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Final check on the number of events\n\t\t\tif eventCount != len(tc.want) {\n\t\t\t\tt.Errorf(\"unexpected stream length, want %d got %d\", len(tc.want), eventCount)\n\t\t\t}\n\t\t})\n\t}\n}\n\n// Mock types for TArgs and TResults\ntype TestArgs struct {\n\tName string\n}\n\ntype TestResult struct {\n\tValue int\n}\n\nfunc TestNewToolSet_RequireConfirmationProvider_Validation(t *testing.T) {\n\ttests := []struct {\n\t\tname     string\n\t\tprovider tool.ConfirmationProvider // The provider to test\n\t}{\n\t\t// --- Happy Paths ---\n\t\t{\n\t\t\tname:     \"Valid: Nil provider is allowed\",\n\t\t\tprovider: nil,\n\t\t},\n\t\t{\n\t\t\tname:     \"Valid: Correct function signature\",\n\t\t\tprovider: func(name string, args any) bool { return true },\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\t// Construct config with the provider under test\n\t\t\tclientTransport, serverTransport := mcp.NewInMemoryTransports()\n\n\t\t\t// Run in-memory MCP server.\n\t\t\tserver := mcp.NewServer(&mcp.Implementation{Name: \"test\", Version: \"v1.0.0\"}, nil)\n\t\t\tmcp.AddTool(server, &mcp.Tool{Name: \"test\", Description: \"test\"}, weatherFunc)\n\t\t\t_, err := server.Connect(t.Context(), serverTransport, nil)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\n\t\t\ttoolSetConfig := mcptoolset.Config{\n\t\t\t\tTransport:                   clientTransport,\n\t\t\t\tRequireConfirmationProvider: tt.provider,\n\t\t\t}\n\t\t\ttoolset, err := mcptoolset.New(toolSetConfig)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"unexpected error: %v\", err)\n\t\t\t}\n\t\t\tif toolset == nil {\n\t\t\t\tt.Error(\"expected valid toolset, got nil\")\n\t\t\t}\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "tool/mcptoolset/testdata/TestMCPToolSet.httprr",
    "content": "httprr trace v1\n1090 1396\nPOST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent HTTP/1.1\r\nHost: generativelanguage.googleapis.com\r\nUser-Agent: Go-http-client/1.1\r\nContent-Length: 858\r\nContent-Type: application/json\r\n\r\n{\"contents\":[{\"parts\":[{\"text\":\"what is the weather in london?\"}],\"role\":\"user\"}],\"generationConfig\":{},\"systemInstruction\":{\"parts\":[{\"text\":\"I can answer your questions about the time and weather in a city.\\n\\nYou are an agent. Your internal name is \\\"weather_time_agent\\\". The description about you is \\\"Agent to answer questions about the time and weather in a city.\\\".\"}],\"role\":\"user\"},\"tools\":[{\"functionDeclarations\":[{\"description\":\"returns weather in the given city\",\"name\":\"get_weather\",\"parametersJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"city\":{\"description\":\"city name\",\"type\":\"string\"}},\"required\":[\"city\"],\"type\":\"object\"},\"responseJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"weather_summary\":{\"description\":\"weather summary in the given city\",\"type\":\"string\"}},\"required\":[\"weather_summary\"],\"type\":\"object\"}}]}]}HTTP/2.0 200 OK\r\nContent-Type: application/json; charset=UTF-8\r\nDate: Tue, 10 Mar 2026 14:09:23 GMT\r\nServer: scaffolding on HTTPServer2\r\nServer-Timing: gfet4t7; dur=715\r\nVary: Origin\r\nVary: X-Origin\r\nVary: Referer\r\nX-Content-Type-Options: nosniff\r\nX-Frame-Options: SAMEORIGIN\r\nX-Xss-Protection: 0\r\n\r\n{\n  \"candidates\": [\n    {\n      \"content\": {\n        \"parts\": [\n          {\n            \"functionCall\": {\n              \"name\": \"get_weather\",\n              \"args\": {\n                \"city\": \"london\"\n              }\n            },\n            \"thoughtSignature\": \"CvABAb4+9vt2kwGSfJuUdi6kZ6iW6ZEosxtgyl9Q8w0+TXXm3xp+qWMxg5aOSf6sT97uxxM+zVP5g7TKv0B3+GqUW+JqYo7gRlVtmy6+cuJk90u3+zmlaw4ACnCJPc5jZk3oKHFUr+IXK9dH4R9fIhz0W1d4YLV4fsyvHd0Yf1o5EqhFngoXrXcJDE8SKlTSm4vrKdMJ8D8jKjSNPwqq+psPyGkoK1Qywdf+HD23fhLH9a+Ag3yD1xYzh3g38LC/siL0FM/3r65scTej6bW5eEdV1ulaZDADKD/mDAhhSRtU0SdlyXjCWpB53AaxYwarhypU\"\n          }\n        ],\n        \"role\": \"model\"\n      },\n      \"finishReason\": \"STOP\",\n      \"index\": 0,\n      \"finishMessage\": \"Model generated function call(s).\"\n    }\n  ],\n  \"usageMetadata\": {\n    \"promptTokenCount\": 149,\n    \"candidatesTokenCount\": 15,\n    \"totalTokenCount\": 211,\n    \"promptTokensDetails\": [\n      {\n        \"modality\": \"TEXT\",\n        \"tokenCount\": 149\n      }\n    ],\n    \"thoughtsTokenCount\": 47\n  },\n  \"modelVersion\": \"gemini-2.5-flash\",\n  \"responseId\": \"EiawaayZGojv7M8P_KX6gAo\"\n}\n1672 845\nPOST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent HTTP/1.1\r\nHost: generativelanguage.googleapis.com\r\nUser-Agent: Go-http-client/1.1\r\nContent-Length: 1439\r\nContent-Type: application/json\r\n\r\n{\"contents\":[{\"parts\":[{\"text\":\"what is the weather in london?\"}],\"role\":\"user\"},{\"parts\":[{\"functionCall\":{\"args\":{\"city\":\"london\"},\"name\":\"get_weather\"},\"thoughtSignature\":\"CvABAb4+9vt2kwGSfJuUdi6kZ6iW6ZEosxtgyl9Q8w0+TXXm3xp+qWMxg5aOSf6sT97uxxM+zVP5g7TKv0B3+GqUW+JqYo7gRlVtmy6+cuJk90u3+zmlaw4ACnCJPc5jZk3oKHFUr+IXK9dH4R9fIhz0W1d4YLV4fsyvHd0Yf1o5EqhFngoXrXcJDE8SKlTSm4vrKdMJ8D8jKjSNPwqq+psPyGkoK1Qywdf+HD23fhLH9a+Ag3yD1xYzh3g38LC/siL0FM/3r65scTej6bW5eEdV1ulaZDADKD/mDAhhSRtU0SdlyXjCWpB53AaxYwarhypU\"}],\"role\":\"model\"},{\"parts\":[{\"functionResponse\":{\"name\":\"get_weather\",\"response\":{\"output\":{\"weather_summary\":\"Today in \\\"london\\\" is sunny\"}}}}],\"role\":\"user\"}],\"generationConfig\":{},\"systemInstruction\":{\"parts\":[{\"text\":\"I can answer your questions about the time and weather in a city.\\n\\nYou are an agent. Your internal name is \\\"weather_time_agent\\\". The description about you is \\\"Agent to answer questions about the time and weather in a city.\\\".\"}],\"role\":\"user\"},\"tools\":[{\"functionDeclarations\":[{\"description\":\"returns weather in the given city\",\"name\":\"get_weather\",\"parametersJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"city\":{\"description\":\"city name\",\"type\":\"string\"}},\"required\":[\"city\"],\"type\":\"object\"},\"responseJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"weather_summary\":{\"description\":\"weather summary in the given city\",\"type\":\"string\"}},\"required\":[\"weather_summary\"],\"type\":\"object\"}}]}]}HTTP/2.0 200 OK\r\nContent-Type: application/json; charset=UTF-8\r\nDate: Tue, 10 Mar 2026 14:09:23 GMT\r\nServer: scaffolding on HTTPServer2\r\nServer-Timing: gfet4t7; dur=342\r\nVary: Origin\r\nVary: X-Origin\r\nVary: Referer\r\nX-Content-Type-Options: nosniff\r\nX-Frame-Options: SAMEORIGIN\r\nX-Xss-Protection: 0\r\n\r\n{\n  \"candidates\": [\n    {\n      \"content\": {\n        \"parts\": [\n          {\n            \"text\": \"The weather in London is sunny.\"\n          }\n        ],\n        \"role\": \"model\"\n      },\n      \"finishReason\": \"STOP\",\n      \"index\": 0\n    }\n  ],\n  \"usageMetadata\": {\n    \"promptTokenCount\": 191,\n    \"candidatesTokenCount\": 7,\n    \"totalTokenCount\": 198,\n    \"promptTokensDetails\": [\n      {\n        \"modality\": \"TEXT\",\n        \"tokenCount\": 191\n      }\n    ]\n  },\n  \"modelVersion\": \"gemini-2.5-flash\",\n  \"responseId\": \"Eyawadu4Bprf7M8P8_738Ag\"\n}\n"
  },
  {
    "path": "tool/mcptoolset/testdata/TestMCPToolSetConfirmation_Conditional_Confirmation_Not_Required.httprr",
    "content": "httprr trace v1\n1089 1499\nPOST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent HTTP/1.1\r\nHost: generativelanguage.googleapis.com\r\nUser-Agent: Go-http-client/1.1\r\nContent-Length: 857\r\nContent-Type: application/json\r\n\r\n{\"contents\":[{\"parts\":[{\"text\":\"what is the weather in Porto?\"}],\"role\":\"user\"}],\"generationConfig\":{},\"systemInstruction\":{\"parts\":[{\"text\":\"I can answer your questions about the time and weather in a city.\\n\\nYou are an agent. Your internal name is \\\"weather_time_agent\\\". The description about you is \\\"Agent to answer questions about the time and weather in a city.\\\".\"}],\"role\":\"user\"},\"tools\":[{\"functionDeclarations\":[{\"description\":\"returns weather in the given city\",\"name\":\"get_weather\",\"parametersJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"city\":{\"description\":\"city name\",\"type\":\"string\"}},\"required\":[\"city\"],\"type\":\"object\"},\"responseJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"weather_summary\":{\"description\":\"weather summary in the given city\",\"type\":\"string\"}},\"required\":[\"weather_summary\"],\"type\":\"object\"}}]}]}HTTP/2.0 200 OK\r\nContent-Type: application/json; charset=UTF-8\r\nDate: Tue, 10 Mar 2026 14:08:44 GMT\r\nServer: scaffolding on HTTPServer2\r\nServer-Timing: gfet4t7; dur=733\r\nVary: Origin\r\nVary: X-Origin\r\nVary: Referer\r\nX-Content-Type-Options: nosniff\r\nX-Frame-Options: SAMEORIGIN\r\nX-Xss-Protection: 0\r\n\r\n{\n  \"candidates\": [\n    {\n      \"content\": {\n        \"parts\": [\n          {\n            \"functionCall\": {\n              \"name\": \"get_weather\",\n              \"args\": {\n                \"city\": \"Porto\"\n              }\n            },\n            \"thoughtSignature\": \"CrwCAb4+9vsuvs2W3gqNDffylURPr+r1NjkdtDGegBWRhMfeZBBxJ8oIuQAl3LwxUxMOjCJcj6t3/vFY1wFIFPgDhkYmXV0cJjyinX7wSgQG0SR4qJwGMcc5Db9MO9+5IVJipYnjTgh2CQUkNWU2AwYJ5JJxTmR3sXelhh8LHnfvnzMQeKbkuhqWWw9AuOjWqflEfd4kyoxr9nuC7WzE1y2k8m/ZLMqOttgXwJ8cLCWCyDLLu8leyCtjDg4jusnqo4HnIY1UruEMEiFuDFaAyuHXamRexWRoypQzyht4UuFPL9fgFOLKEMnaedZ9Jy9yYEr8k88x0MaLx8wX9Kki8SbDWshduBqvPn5B2bafyYxd8gQGdJa9ujn7CC6wloibeZUlPS+1yi9jhOn52X0w0KES62KZHBaH9GOpj85cTg==\"\n          }\n        ],\n        \"role\": \"model\"\n      },\n      \"finishReason\": \"STOP\",\n      \"index\": 0,\n      \"finishMessage\": \"Model generated function call(s).\"\n    }\n  ],\n  \"usageMetadata\": {\n    \"promptTokenCount\": 149,\n    \"candidatesTokenCount\": 16,\n    \"totalTokenCount\": 238,\n    \"promptTokensDetails\": [\n      {\n        \"modality\": \"TEXT\",\n        \"tokenCount\": 149\n      }\n    ],\n    \"thoughtsTokenCount\": 73\n  },\n  \"modelVersion\": \"gemini-2.5-flash\",\n  \"responseId\": \"6yWwacjDOIzGnsEP3Ja76Ag\"\n}\n1773 841\nPOST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent HTTP/1.1\r\nHost: generativelanguage.googleapis.com\r\nUser-Agent: Go-http-client/1.1\r\nContent-Length: 1540\r\nContent-Type: application/json\r\n\r\n{\"contents\":[{\"parts\":[{\"text\":\"what is the weather in Porto?\"}],\"role\":\"user\"},{\"parts\":[{\"functionCall\":{\"args\":{\"city\":\"Porto\"},\"name\":\"get_weather\"},\"thoughtSignature\":\"CrwCAb4+9vsuvs2W3gqNDffylURPr+r1NjkdtDGegBWRhMfeZBBxJ8oIuQAl3LwxUxMOjCJcj6t3/vFY1wFIFPgDhkYmXV0cJjyinX7wSgQG0SR4qJwGMcc5Db9MO9+5IVJipYnjTgh2CQUkNWU2AwYJ5JJxTmR3sXelhh8LHnfvnzMQeKbkuhqWWw9AuOjWqflEfd4kyoxr9nuC7WzE1y2k8m/ZLMqOttgXwJ8cLCWCyDLLu8leyCtjDg4jusnqo4HnIY1UruEMEiFuDFaAyuHXamRexWRoypQzyht4UuFPL9fgFOLKEMnaedZ9Jy9yYEr8k88x0MaLx8wX9Kki8SbDWshduBqvPn5B2bafyYxd8gQGdJa9ujn7CC6wloibeZUlPS+1yi9jhOn52X0w0KES62KZHBaH9GOpj85cTg==\"}],\"role\":\"model\"},{\"parts\":[{\"functionResponse\":{\"name\":\"get_weather\",\"response\":{\"output\":{\"weather_summary\":\"Today in \\\"Porto\\\" is sunny\"}}}}],\"role\":\"user\"}],\"generationConfig\":{},\"systemInstruction\":{\"parts\":[{\"text\":\"I can answer your questions about the time and weather in a city.\\n\\nYou are an agent. Your internal name is \\\"weather_time_agent\\\". The description about you is \\\"Agent to answer questions about the time and weather in a city.\\\".\"}],\"role\":\"user\"},\"tools\":[{\"functionDeclarations\":[{\"description\":\"returns weather in the given city\",\"name\":\"get_weather\",\"parametersJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"city\":{\"description\":\"city name\",\"type\":\"string\"}},\"required\":[\"city\"],\"type\":\"object\"},\"responseJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"weather_summary\":{\"description\":\"weather summary in the given city\",\"type\":\"string\"}},\"required\":[\"weather_summary\"],\"type\":\"object\"}}]}]}HTTP/2.0 200 OK\r\nContent-Type: application/json; charset=UTF-8\r\nDate: Tue, 10 Mar 2026 14:08:45 GMT\r\nServer: scaffolding on HTTPServer2\r\nServer-Timing: gfet4t7; dur=906\r\nVary: Origin\r\nVary: X-Origin\r\nVary: Referer\r\nX-Content-Type-Options: nosniff\r\nX-Frame-Options: SAMEORIGIN\r\nX-Xss-Protection: 0\r\n\r\n{\n  \"candidates\": [\n    {\n      \"content\": {\n        \"parts\": [\n          {\n            \"text\": \"Today in \\\"Porto\\\" is sunny\"\n          }\n        ],\n        \"role\": \"model\"\n      },\n      \"finishReason\": \"STOP\",\n      \"index\": 0\n    }\n  ],\n  \"usageMetadata\": {\n    \"promptTokenCount\": 193,\n    \"candidatesTokenCount\": 8,\n    \"totalTokenCount\": 201,\n    \"promptTokensDetails\": [\n      {\n        \"modality\": \"TEXT\",\n        \"tokenCount\": 193\n      }\n    ]\n  },\n  \"modelVersion\": \"gemini-2.5-flash\",\n  \"responseId\": \"7CWwaeWaKLyvnsEP3tfsiQk\"\n}\n"
  },
  {
    "path": "tool/mcptoolset/testdata/TestMCPToolSetConfirmation_Conditional_Confirmation_Not_Required_For_This_Tool.httprr",
    "content": "httprr trace v1\n1090 1437\nPOST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent HTTP/1.1\r\nHost: generativelanguage.googleapis.com\r\nUser-Agent: Go-http-client/1.1\r\nContent-Length: 858\r\nContent-Type: application/json\r\n\r\n{\"contents\":[{\"parts\":[{\"text\":\"what is the weather in Lisbon?\"}],\"role\":\"user\"}],\"generationConfig\":{},\"systemInstruction\":{\"parts\":[{\"text\":\"I can answer your questions about the time and weather in a city.\\n\\nYou are an agent. Your internal name is \\\"weather_time_agent\\\". The description about you is \\\"Agent to answer questions about the time and weather in a city.\\\".\"}],\"role\":\"user\"},\"tools\":[{\"functionDeclarations\":[{\"description\":\"returns weather in the given city\",\"name\":\"get_weather\",\"parametersJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"city\":{\"description\":\"city name\",\"type\":\"string\"}},\"required\":[\"city\"],\"type\":\"object\"},\"responseJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"weather_summary\":{\"description\":\"weather summary in the given city\",\"type\":\"string\"}},\"required\":[\"weather_summary\"],\"type\":\"object\"}}]}]}HTTP/2.0 200 OK\r\nContent-Type: application/json; charset=UTF-8\r\nDate: Tue, 10 Mar 2026 14:21:14 GMT\r\nServer: scaffolding on HTTPServer2\r\nServer-Timing: gfet4t7; dur=1229\r\nVary: Origin\r\nVary: X-Origin\r\nVary: Referer\r\nX-Content-Type-Options: nosniff\r\nX-Frame-Options: SAMEORIGIN\r\nX-Xss-Protection: 0\r\n\r\n{\n  \"candidates\": [\n    {\n      \"content\": {\n        \"parts\": [\n          {\n            \"functionCall\": {\n              \"name\": \"get_weather\",\n              \"args\": {\n                \"city\": \"Lisbon\"\n              }\n            },\n            \"thoughtSignature\": \"Co4CAb4+9vvBrIepyCDIV6Vd6zGtdvHmdC0sq4IW7P/OliVvLoElltfi130x27agIkHSe69dkjs4/BqZNKScmSypU6XXprdMOINiGwcPfoInPdQT06hWWGL9qDB65YbyWsw21ylto7SUtS6yNDG8QZwbjN+7Pri45Xov8iCQVveDXslEVrmJ0yAL2xz/nwWR6iAJWRYwleHVIyJNHLgIx5mSxOdfcoltUt0EMvR/8MlB7aNhtK2juGREd3Ga9e1sxkZdT8eBcfd2H8ghUpzp8fswMNd+tfkIKXAzijaBQ3aO51whIPPFkw7k+lF2F5Bo67pg5R2FOLVT5CYWk6hjJpQiWSSe2o09DTnH7FOa+YKp\"\n          }\n        ],\n        \"role\": \"model\"\n      },\n      \"finishReason\": \"STOP\",\n      \"index\": 0,\n      \"finishMessage\": \"Model generated function call(s).\"\n    }\n  ],\n  \"usageMetadata\": {\n    \"promptTokenCount\": 149,\n    \"candidatesTokenCount\": 16,\n    \"totalTokenCount\": 227,\n    \"promptTokensDetails\": [\n      {\n        \"modality\": \"TEXT\",\n        \"tokenCount\": 149\n      }\n    ],\n    \"thoughtsTokenCount\": 62\n  },\n  \"modelVersion\": \"gemini-2.5-flash\",\n  \"responseId\": \"2SiwacipCfH3nsEP2v-88AQ\"\n}\n1712 842\nPOST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent HTTP/1.1\r\nHost: generativelanguage.googleapis.com\r\nUser-Agent: Go-http-client/1.1\r\nContent-Length: 1479\r\nContent-Type: application/json\r\n\r\n{\"contents\":[{\"parts\":[{\"text\":\"what is the weather in Lisbon?\"}],\"role\":\"user\"},{\"parts\":[{\"functionCall\":{\"args\":{\"city\":\"Lisbon\"},\"name\":\"get_weather\"},\"thoughtSignature\":\"Co4CAb4+9vvBrIepyCDIV6Vd6zGtdvHmdC0sq4IW7P/OliVvLoElltfi130x27agIkHSe69dkjs4/BqZNKScmSypU6XXprdMOINiGwcPfoInPdQT06hWWGL9qDB65YbyWsw21ylto7SUtS6yNDG8QZwbjN+7Pri45Xov8iCQVveDXslEVrmJ0yAL2xz/nwWR6iAJWRYwleHVIyJNHLgIx5mSxOdfcoltUt0EMvR/8MlB7aNhtK2juGREd3Ga9e1sxkZdT8eBcfd2H8ghUpzp8fswMNd+tfkIKXAzijaBQ3aO51whIPPFkw7k+lF2F5Bo67pg5R2FOLVT5CYWk6hjJpQiWSSe2o09DTnH7FOa+YKp\"}],\"role\":\"model\"},{\"parts\":[{\"functionResponse\":{\"name\":\"get_weather\",\"response\":{\"output\":{\"weather_summary\":\"Today in \\\"Lisbon\\\" is sunny\"}}}}],\"role\":\"user\"}],\"generationConfig\":{},\"systemInstruction\":{\"parts\":[{\"text\":\"I can answer your questions about the time and weather in a city.\\n\\nYou are an agent. Your internal name is \\\"weather_time_agent\\\". The description about you is \\\"Agent to answer questions about the time and weather in a city.\\\".\"}],\"role\":\"user\"},\"tools\":[{\"functionDeclarations\":[{\"description\":\"returns weather in the given city\",\"name\":\"get_weather\",\"parametersJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"city\":{\"description\":\"city name\",\"type\":\"string\"}},\"required\":[\"city\"],\"type\":\"object\"},\"responseJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"weather_summary\":{\"description\":\"weather summary in the given city\",\"type\":\"string\"}},\"required\":[\"weather_summary\"],\"type\":\"object\"}}]}]}HTTP/2.0 200 OK\r\nContent-Type: application/json; charset=UTF-8\r\nDate: Tue, 10 Mar 2026 14:21:14 GMT\r\nServer: scaffolding on HTTPServer2\r\nServer-Timing: gfet4t7; dur=407\r\nVary: Origin\r\nVary: X-Origin\r\nVary: Referer\r\nX-Content-Type-Options: nosniff\r\nX-Frame-Options: SAMEORIGIN\r\nX-Xss-Protection: 0\r\n\r\n{\n  \"candidates\": [\n    {\n      \"content\": {\n        \"parts\": [\n          {\n            \"text\": \"Today in \\\"Lisbon\\\" is sunny\"\n          }\n        ],\n        \"role\": \"model\"\n      },\n      \"finishReason\": \"STOP\",\n      \"index\": 0\n    }\n  ],\n  \"usageMetadata\": {\n    \"promptTokenCount\": 193,\n    \"candidatesTokenCount\": 8,\n    \"totalTokenCount\": 201,\n    \"promptTokensDetails\": [\n      {\n        \"modality\": \"TEXT\",\n        \"tokenCount\": 193\n      }\n    ]\n  },\n  \"modelVersion\": \"gemini-2.5-flash\",\n  \"responseId\": \"2iiwadyXFYenkdUP2u2b8Ak\"\n}\n"
  },
  {
    "path": "tool/mcptoolset/testdata/TestMCPToolSetConfirmation_Conditional_Confirmation_Required.httprr",
    "content": "httprr trace v1\n1090 1508\nPOST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent HTTP/1.1\r\nHost: generativelanguage.googleapis.com\r\nUser-Agent: Go-http-client/1.1\r\nContent-Length: 858\r\nContent-Type: application/json\r\n\r\n{\"contents\":[{\"parts\":[{\"text\":\"what is the weather in Lisbon?\"}],\"role\":\"user\"}],\"generationConfig\":{},\"systemInstruction\":{\"parts\":[{\"text\":\"I can answer your questions about the time and weather in a city.\\n\\nYou are an agent. Your internal name is \\\"weather_time_agent\\\". The description about you is \\\"Agent to answer questions about the time and weather in a city.\\\".\"}],\"role\":\"user\"},\"tools\":[{\"functionDeclarations\":[{\"description\":\"returns weather in the given city\",\"name\":\"get_weather\",\"parametersJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"city\":{\"description\":\"city name\",\"type\":\"string\"}},\"required\":[\"city\"],\"type\":\"object\"},\"responseJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"weather_summary\":{\"description\":\"weather summary in the given city\",\"type\":\"string\"}},\"required\":[\"weather_summary\"],\"type\":\"object\"}}]}]}HTTP/2.0 200 OK\r\nContent-Type: application/json; charset=UTF-8\r\nDate: Tue, 10 Mar 2026 14:08:48 GMT\r\nServer: scaffolding on HTTPServer2\r\nServer-Timing: gfet4t7; dur=736\r\nVary: Origin\r\nVary: X-Origin\r\nVary: Referer\r\nX-Content-Type-Options: nosniff\r\nX-Frame-Options: SAMEORIGIN\r\nX-Xss-Protection: 0\r\n\r\n{\n  \"candidates\": [\n    {\n      \"content\": {\n        \"parts\": [\n          {\n            \"functionCall\": {\n              \"name\": \"get_weather\",\n              \"args\": {\n                \"city\": \"Lisbon\"\n              }\n            },\n            \"thoughtSignature\": \"CsMCAb4+9vvVsnVfseCsSqZxjM76GncXWUsuzW95bX3Q7wCJMZVLWqAJyveqJXd0wX/Ov2UjzJZdj1gh9ugUuBiIYAqH+5l5YXXdK1VLTox2GRBrpP+MRbXalDLo+xlpUBHIqQC8JLCnVSaZXx7BJ0nbAfiuGDxKCXnkofKozyq0hQwo2KNz8IKRYVI4S68+KAUIoi4iKQk7Gm8aw2P0frR7TcBxqk6lRobncCzHgK66bh+Y5lDFXoWC1q6Lkw1WBYAQZcU1Kq0vgssg+nGc7zqg+tjq9+S1hJt/OerhxuYfW3z95wv7T7oDiX+UBRidpaCLAHR39hxwYlV9B7Ov2nHstsTTWukNOlDMZBFV3AkroHWVZNaUpOPL37cfAns8xZKbY3T+iXU2nUFHpXscRWsLY1XRhdOunaDtaamEsnmr/M946lY=\"\n          }\n        ],\n        \"role\": \"model\"\n      },\n      \"finishReason\": \"STOP\",\n      \"index\": 0,\n      \"finishMessage\": \"Model generated function call(s).\"\n    }\n  ],\n  \"usageMetadata\": {\n    \"promptTokenCount\": 149,\n    \"candidatesTokenCount\": 16,\n    \"totalTokenCount\": 240,\n    \"promptTokensDetails\": [\n      {\n        \"modality\": \"TEXT\",\n        \"tokenCount\": 149\n      }\n    ],\n    \"thoughtsTokenCount\": 75\n  },\n  \"modelVersion\": \"gemini-2.5-flash\",\n  \"responseId\": \"7yWwaY-mKLLn7M8P-dK7yQU\"\n}\n"
  },
  {
    "path": "tool/mcptoolset/testdata/TestMCPToolSetConfirmation_Conditional_Confirmation_Required_For_This_Tool.httprr",
    "content": "httprr trace v1\n1090 1456\nPOST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent HTTP/1.1\r\nHost: generativelanguage.googleapis.com\r\nUser-Agent: Go-http-client/1.1\r\nContent-Length: 858\r\nContent-Type: application/json\r\n\r\n{\"contents\":[{\"parts\":[{\"text\":\"what is the weather in Lisbon?\"}],\"role\":\"user\"}],\"generationConfig\":{},\"systemInstruction\":{\"parts\":[{\"text\":\"I can answer your questions about the time and weather in a city.\\n\\nYou are an agent. Your internal name is \\\"weather_time_agent\\\". The description about you is \\\"Agent to answer questions about the time and weather in a city.\\\".\"}],\"role\":\"user\"},\"tools\":[{\"functionDeclarations\":[{\"description\":\"returns weather in the given city\",\"name\":\"get_weather\",\"parametersJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"city\":{\"description\":\"city name\",\"type\":\"string\"}},\"required\":[\"city\"],\"type\":\"object\"},\"responseJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"weather_summary\":{\"description\":\"weather summary in the given city\",\"type\":\"string\"}},\"required\":[\"weather_summary\"],\"type\":\"object\"}}]}]}HTTP/2.0 200 OK\r\nContent-Type: application/json; charset=UTF-8\r\nDate: Tue, 10 Mar 2026 14:08:47 GMT\r\nServer: scaffolding on HTTPServer2\r\nServer-Timing: gfet4t7; dur=847\r\nVary: Origin\r\nVary: X-Origin\r\nVary: Referer\r\nX-Content-Type-Options: nosniff\r\nX-Frame-Options: SAMEORIGIN\r\nX-Xss-Protection: 0\r\n\r\n{\n  \"candidates\": [\n    {\n      \"content\": {\n        \"parts\": [\n          {\n            \"functionCall\": {\n              \"name\": \"get_weather\",\n              \"args\": {\n                \"city\": \"Lisbon\"\n              }\n            },\n            \"thoughtSignature\": \"CpsCAb4+9vuzvowP9R8IinEiJ1J68njC3Sqpy4x5TrMbf7JiTqqBjuw49XSDrt8UMaLD1SyIb919mEy/8KycFbQTXQxf5gHkKjLQ8AAQ4EEL0J3wlOI5KVbG6qG+sKT48Oj1aE8vwR92p2gmVnbGIvKFPIqSrSMcscaYkL7F3DX+J9ObZTfs9YG21o51A3bZm2QLIRORAbJ/nL4LhgvoniVyZAOXMxS2M/pB6L0VVLo9jLlNh66Egpp9e+3RsugWcZ+clTLw3fCOV0nz3h7WEu0vEzydELnK9vHxKjB9ikGRp476FGC7wj6qdhoEZCabAbpNyAMwhBqF0D/DZ0nLc60YcJvIYItfx2U5BjiHBCJRHMvUgGzDgV+epSDBJg==\"\n          }\n        ],\n        \"role\": \"model\"\n      },\n      \"finishReason\": \"STOP\",\n      \"index\": 0,\n      \"finishMessage\": \"Model generated function call(s).\"\n    }\n  ],\n  \"usageMetadata\": {\n    \"promptTokenCount\": 149,\n    \"candidatesTokenCount\": 16,\n    \"totalTokenCount\": 228,\n    \"promptTokensDetails\": [\n      {\n        \"modality\": \"TEXT\",\n        \"tokenCount\": 149\n      }\n    ],\n    \"thoughtsTokenCount\": 63\n  },\n  \"modelVersion\": \"gemini-2.5-flash\",\n  \"responseId\": \"7iWwaaOJMrOensEPmuPpsQo\"\n}\n"
  },
  {
    "path": "tool/mcptoolset/testdata/TestMCPToolSetConfirmation_Conditional_Confirmation_Required_and_is_confirmed.httprr",
    "content": "httprr trace v1\n1090 1452\nPOST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent HTTP/1.1\r\nHost: generativelanguage.googleapis.com\r\nUser-Agent: Go-http-client/1.1\r\nContent-Length: 858\r\nContent-Type: application/json\r\n\r\n{\"contents\":[{\"parts\":[{\"text\":\"what is the weather in Lisbon?\"}],\"role\":\"user\"}],\"generationConfig\":{},\"systemInstruction\":{\"parts\":[{\"text\":\"I can answer your questions about the time and weather in a city.\\n\\nYou are an agent. Your internal name is \\\"weather_time_agent\\\". The description about you is \\\"Agent to answer questions about the time and weather in a city.\\\".\"}],\"role\":\"user\"},\"tools\":[{\"functionDeclarations\":[{\"description\":\"returns weather in the given city\",\"name\":\"get_weather\",\"parametersJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"city\":{\"description\":\"city name\",\"type\":\"string\"}},\"required\":[\"city\"],\"type\":\"object\"},\"responseJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"weather_summary\":{\"description\":\"weather summary in the given city\",\"type\":\"string\"}},\"required\":[\"weather_summary\"],\"type\":\"object\"}}]}]}HTTP/2.0 200 OK\r\nContent-Type: application/json; charset=UTF-8\r\nDate: Tue, 10 Mar 2026 14:08:49 GMT\r\nServer: scaffolding on HTTPServer2\r\nServer-Timing: gfet4t7; dur=776\r\nVary: Origin\r\nVary: X-Origin\r\nVary: Referer\r\nX-Content-Type-Options: nosniff\r\nX-Frame-Options: SAMEORIGIN\r\nX-Xss-Protection: 0\r\n\r\n{\n  \"candidates\": [\n    {\n      \"content\": {\n        \"parts\": [\n          {\n            \"functionCall\": {\n              \"name\": \"get_weather\",\n              \"args\": {\n                \"city\": \"Lisbon\"\n              }\n            },\n            \"thoughtSignature\": \"CpoCAb4+9vtJhl05lkfOP1l9jngLAI1bvPPno4epalODaZKgBBts4I7dZRUMugaSuVn36ahSDuRZC0UP5UkdQEUhpiNUT6TUKmRQ5CCAfjrXuOJ33ARA+oR64Aiys5vPfTh3F/tRVyskBWYRxKCP9vpB+C2tT16l3WzPR6bjeA0ECsa2H9QTHiHKxU/li/P2Gvotia1mu9qmWyJZj2oZ/R6fgDDcmkhxfpR5TwQ7Un/P8P3lqLavZn57SWDRI3S6EIaDqnH1RKJLu1QinGtuxUqfpWIcS/Bi6ys2YVy+8vQsEJSwz/t9PZ7FBgk6Q98aycW3EadmyOnnUR2FHHgi9RyOc96Vqhg4nCcxV2MZu+IgfZ2bZyzPGMnlXISR\"\n          }\n        ],\n        \"role\": \"model\"\n      },\n      \"finishReason\": \"STOP\",\n      \"index\": 0,\n      \"finishMessage\": \"Model generated function call(s).\"\n    }\n  ],\n  \"usageMetadata\": {\n    \"promptTokenCount\": 149,\n    \"candidatesTokenCount\": 16,\n    \"totalTokenCount\": 229,\n    \"promptTokensDetails\": [\n      {\n        \"modality\": \"TEXT\",\n        \"tokenCount\": 149\n      }\n    ],\n    \"thoughtsTokenCount\": 64\n  },\n  \"modelVersion\": \"gemini-2.5-flash\",\n  \"responseId\": \"8CWwadijGaGF7M8Pn7bJqAE\"\n}\n1728 842\nPOST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent HTTP/1.1\r\nHost: generativelanguage.googleapis.com\r\nUser-Agent: Go-http-client/1.1\r\nContent-Length: 1495\r\nContent-Type: application/json\r\n\r\n{\"contents\":[{\"parts\":[{\"text\":\"what is the weather in Lisbon?\"}],\"role\":\"user\"},{\"parts\":[{\"functionCall\":{\"args\":{\"city\":\"Lisbon\"},\"name\":\"get_weather\"},\"thoughtSignature\":\"CpoCAb4+9vtJhl05lkfOP1l9jngLAI1bvPPno4epalODaZKgBBts4I7dZRUMugaSuVn36ahSDuRZC0UP5UkdQEUhpiNUT6TUKmRQ5CCAfjrXuOJ33ARA+oR64Aiys5vPfTh3F/tRVyskBWYRxKCP9vpB+C2tT16l3WzPR6bjeA0ECsa2H9QTHiHKxU/li/P2Gvotia1mu9qmWyJZj2oZ/R6fgDDcmkhxfpR5TwQ7Un/P8P3lqLavZn57SWDRI3S6EIaDqnH1RKJLu1QinGtuxUqfpWIcS/Bi6ys2YVy+8vQsEJSwz/t9PZ7FBgk6Q98aycW3EadmyOnnUR2FHHgi9RyOc96Vqhg4nCcxV2MZu+IgfZ2bZyzPGMnlXISR\"}],\"role\":\"model\"},{\"parts\":[{\"functionResponse\":{\"name\":\"get_weather\",\"response\":{\"output\":{\"weather_summary\":\"Today in \\\"Lisbon\\\" is sunny\"}}}}],\"role\":\"user\"}],\"generationConfig\":{},\"systemInstruction\":{\"parts\":[{\"text\":\"I can answer your questions about the time and weather in a city.\\n\\nYou are an agent. Your internal name is \\\"weather_time_agent\\\". The description about you is \\\"Agent to answer questions about the time and weather in a city.\\\".\"}],\"role\":\"user\"},\"tools\":[{\"functionDeclarations\":[{\"description\":\"returns weather in the given city\",\"name\":\"get_weather\",\"parametersJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"city\":{\"description\":\"city name\",\"type\":\"string\"}},\"required\":[\"city\"],\"type\":\"object\"},\"responseJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"weather_summary\":{\"description\":\"weather summary in the given city\",\"type\":\"string\"}},\"required\":[\"weather_summary\"],\"type\":\"object\"}}]}]}HTTP/2.0 200 OK\r\nContent-Type: application/json; charset=UTF-8\r\nDate: Tue, 10 Mar 2026 14:08:49 GMT\r\nServer: scaffolding on HTTPServer2\r\nServer-Timing: gfet4t7; dur=392\r\nVary: Origin\r\nVary: X-Origin\r\nVary: Referer\r\nX-Content-Type-Options: nosniff\r\nX-Frame-Options: SAMEORIGIN\r\nX-Xss-Protection: 0\r\n\r\n{\n  \"candidates\": [\n    {\n      \"content\": {\n        \"parts\": [\n          {\n            \"text\": \"Today in \\\"Lisbon\\\" is sunny\"\n          }\n        ],\n        \"role\": \"model\"\n      },\n      \"finishReason\": \"STOP\",\n      \"index\": 0\n    }\n  ],\n  \"usageMetadata\": {\n    \"promptTokenCount\": 193,\n    \"candidatesTokenCount\": 8,\n    \"totalTokenCount\": 201,\n    \"promptTokensDetails\": [\n      {\n        \"modality\": \"TEXT\",\n        \"tokenCount\": 193\n      }\n    ]\n  },\n  \"modelVersion\": \"gemini-2.5-flash\",\n  \"responseId\": \"8SWwab_4C-LW7M8P57HViAE\"\n}\n"
  },
  {
    "path": "tool/mcptoolset/testdata/TestMCPToolSetConfirmation_Conditional_Confirmation_Required_and_is_rejected.httprr",
    "content": "httprr trace v1\n1090 1517\nPOST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent HTTP/1.1\r\nHost: generativelanguage.googleapis.com\r\nUser-Agent: Go-http-client/1.1\r\nContent-Length: 858\r\nContent-Type: application/json\r\n\r\n{\"contents\":[{\"parts\":[{\"text\":\"what is the weather in Lisbon?\"}],\"role\":\"user\"}],\"generationConfig\":{},\"systemInstruction\":{\"parts\":[{\"text\":\"I can answer your questions about the time and weather in a city.\\n\\nYou are an agent. Your internal name is \\\"weather_time_agent\\\". The description about you is \\\"Agent to answer questions about the time and weather in a city.\\\".\"}],\"role\":\"user\"},\"tools\":[{\"functionDeclarations\":[{\"description\":\"returns weather in the given city\",\"name\":\"get_weather\",\"parametersJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"city\":{\"description\":\"city name\",\"type\":\"string\"}},\"required\":[\"city\"],\"type\":\"object\"},\"responseJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"weather_summary\":{\"description\":\"weather summary in the given city\",\"type\":\"string\"}},\"required\":[\"weather_summary\"],\"type\":\"object\"}}]}]}HTTP/2.0 200 OK\r\nContent-Type: application/json; charset=UTF-8\r\nDate: Tue, 10 Mar 2026 14:08:50 GMT\r\nServer: scaffolding on HTTPServer2\r\nServer-Timing: gfet4t7; dur=1307\r\nVary: Origin\r\nVary: X-Origin\r\nVary: Referer\r\nX-Content-Type-Options: nosniff\r\nX-Frame-Options: SAMEORIGIN\r\nX-Xss-Protection: 0\r\n\r\n{\n  \"candidates\": [\n    {\n      \"content\": {\n        \"parts\": [\n          {\n            \"functionCall\": {\n              \"name\": \"get_weather\",\n              \"args\": {\n                \"city\": \"Lisbon\"\n              }\n            },\n            \"thoughtSignature\": \"CskCAb4+9vu7Zz79+vWht/1PHkM+DYL3dHUxRJXWqgp6ej19WF5oCJPP9JRTUy0lsBZq6rX/kIAcLKN1METnz6NyR5R5yGfLAI53fckY29mE0JQqXnAULrd31w1yrMlsYfYQVn8fY2nj15e6QrbmWuF7sxgrFA91GXq66Et4Py0ob3eOnWZ4l9D5JIPMfl5GPcDcFV7gEepOLlNI8Blz7SsaENg05AaO1qH/evmuCAvFrhA8oNjFKcubvLhx8gh14rACgQ2VS9ebzHJfoHSmJIVpJ+MLwAi25c8dh9ReQ16Vbgo4TF2fKP5331w064v3Vpevb4w5kTyf+GxxnlJJIsZhO9uKn34qbkJBsjm/F9dnfgXqrNSbtN3/OkWALzFdXGGA4bbJwtxcyIdO9qhTzJHLhcqqZK5zAXNT7/ozM394Wm/+gkdVUCXzz/4=\"\n          }\n        ],\n        \"role\": \"model\"\n      },\n      \"finishReason\": \"STOP\",\n      \"index\": 0,\n      \"finishMessage\": \"Model generated function call(s).\"\n    }\n  ],\n  \"usageMetadata\": {\n    \"promptTokenCount\": 149,\n    \"candidatesTokenCount\": 16,\n    \"totalTokenCount\": 242,\n    \"promptTokensDetails\": [\n      {\n        \"modality\": \"TEXT\",\n        \"tokenCount\": 149\n      }\n    ],\n    \"thoughtsTokenCount\": 77\n  },\n  \"modelVersion\": \"gemini-2.5-flash\",\n  \"responseId\": \"8SWwaZnvI4jp7M8P4ajSyAc\"\n}\n1786 1373\nPOST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent HTTP/1.1\r\nHost: generativelanguage.googleapis.com\r\nUser-Agent: Go-http-client/1.1\r\nContent-Length: 1553\r\nContent-Type: application/json\r\n\r\n{\"contents\":[{\"parts\":[{\"text\":\"what is the weather in Lisbon?\"}],\"role\":\"user\"},{\"parts\":[{\"functionCall\":{\"args\":{\"city\":\"Lisbon\"},\"name\":\"get_weather\"},\"thoughtSignature\":\"CskCAb4+9vu7Zz79+vWht/1PHkM+DYL3dHUxRJXWqgp6ej19WF5oCJPP9JRTUy0lsBZq6rX/kIAcLKN1METnz6NyR5R5yGfLAI53fckY29mE0JQqXnAULrd31w1yrMlsYfYQVn8fY2nj15e6QrbmWuF7sxgrFA91GXq66Et4Py0ob3eOnWZ4l9D5JIPMfl5GPcDcFV7gEepOLlNI8Blz7SsaENg05AaO1qH/evmuCAvFrhA8oNjFKcubvLhx8gh14rACgQ2VS9ebzHJfoHSmJIVpJ+MLwAi25c8dh9ReQ16Vbgo4TF2fKP5331w064v3Vpevb4w5kTyf+GxxnlJJIsZhO9uKn34qbkJBsjm/F9dnfgXqrNSbtN3/OkWALzFdXGGA4bbJwtxcyIdO9qhTzJHLhcqqZK5zAXNT7/ozM394Wm/+gkdVUCXzz/4=\"}],\"role\":\"model\"},{\"parts\":[{\"functionResponse\":{\"name\":\"get_weather\",\"response\":{\"error\":\"error tool \\\"get_weather\\\" call is rejected\"}}}],\"role\":\"user\"}],\"generationConfig\":{},\"systemInstruction\":{\"parts\":[{\"text\":\"I can answer your questions about the time and weather in a city.\\n\\nYou are an agent. Your internal name is \\\"weather_time_agent\\\". The description about you is \\\"Agent to answer questions about the time and weather in a city.\\\".\"}],\"role\":\"user\"},\"tools\":[{\"functionDeclarations\":[{\"description\":\"returns weather in the given city\",\"name\":\"get_weather\",\"parametersJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"city\":{\"description\":\"city name\",\"type\":\"string\"}},\"required\":[\"city\"],\"type\":\"object\"},\"responseJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"weather_summary\":{\"description\":\"weather summary in the given city\",\"type\":\"string\"}},\"required\":[\"weather_summary\"],\"type\":\"object\"}}]}]}HTTP/2.0 200 OK\r\nContent-Type: application/json; charset=UTF-8\r\nDate: Tue, 10 Mar 2026 14:08:51 GMT\r\nServer: scaffolding on HTTPServer2\r\nServer-Timing: gfet4t7; dur=1122\r\nVary: Origin\r\nVary: X-Origin\r\nVary: Referer\r\nX-Content-Type-Options: nosniff\r\nX-Frame-Options: SAMEORIGIN\r\nX-Xss-Protection: 0\r\n\r\n{\n  \"candidates\": [\n    {\n      \"content\": {\n        \"parts\": [\n          {\n            \"text\": \"I am sorry, I cannot get the weather in Lisbon.\",\n            \"thoughtSignature\": \"CsgCAb4+9vuqzbE+NavXuzJpmRjhPijB11oEpwUVOvsIE8Qt8foUrderfoFT3U9DSjnUYJ8Fat/fgtfDTFzn3uhiJs9onmQy2lPPiIHbfAkV9WLoVWEx5AleAsPwqHWomLfcaUfxvfTOlx8tdiIUfMJmLAZvAGgT6IlwxmEpvVIqyKMRwJJ2LQZ6srn20FvJ8vMgyx71r+0+7+YOzcRkl6q/Zu8nOKvALVpaYuA+5pgGGkURV4EJGSuWvPzxWoAvSE1tjr652c0yv4EfowgiWuFcbJRUiY6cP07T0mnkzeSqnZOM57EKw5TYvYD0OGH2LqkZEcrkL/ah7nCAF8KZuIhkyHMjD95xAYlB7IqvypOaZwC14wnIK2UE/zu1c6+2mcsYZoeuxlhTc0emrYSWhCmlzVsLoGDuEkTbSJhQNI+tSoSlAROwUELiKQ==\"\n          }\n        ],\n        \"role\": \"model\"\n      },\n      \"finishReason\": \"STOP\",\n      \"index\": 0\n    }\n  ],\n  \"usageMetadata\": {\n    \"promptTokenCount\": 189,\n    \"candidatesTokenCount\": 12,\n    \"totalTokenCount\": 266,\n    \"promptTokensDetails\": [\n      {\n        \"modality\": \"TEXT\",\n        \"tokenCount\": 189\n      }\n    ],\n    \"thoughtsTokenCount\": 65\n  },\n  \"modelVersion\": \"gemini-2.5-flash\",\n  \"responseId\": \"8iWwabSiN-SkkdUPj4n08Qw\"\n}\n"
  },
  {
    "path": "tool/mcptoolset/testdata/TestMCPToolSetConfirmation_Confirmation_Required.httprr",
    "content": "httprr trace v1\n1090 1384\nPOST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent HTTP/1.1\r\nHost: generativelanguage.googleapis.com\r\nUser-Agent: Go-http-client/1.1\r\nContent-Length: 858\r\nContent-Type: application/json\r\n\r\n{\"contents\":[{\"parts\":[{\"text\":\"what is the weather in Lisbon?\"}],\"role\":\"user\"}],\"generationConfig\":{},\"systemInstruction\":{\"parts\":[{\"text\":\"I can answer your questions about the time and weather in a city.\\n\\nYou are an agent. Your internal name is \\\"weather_time_agent\\\". The description about you is \\\"Agent to answer questions about the time and weather in a city.\\\".\"}],\"role\":\"user\"},\"tools\":[{\"functionDeclarations\":[{\"description\":\"returns weather in the given city\",\"name\":\"get_weather\",\"parametersJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"city\":{\"description\":\"city name\",\"type\":\"string\"}},\"required\":[\"city\"],\"type\":\"object\"},\"responseJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"weather_summary\":{\"description\":\"weather summary in the given city\",\"type\":\"string\"}},\"required\":[\"weather_summary\"],\"type\":\"object\"}}]}]}HTTP/2.0 200 OK\r\nContent-Type: application/json; charset=UTF-8\r\nDate: Tue, 10 Mar 2026 14:08:40 GMT\r\nServer: scaffolding on HTTPServer2\r\nServer-Timing: gfet4t7; dur=669\r\nVary: Origin\r\nVary: X-Origin\r\nVary: Referer\r\nX-Content-Type-Options: nosniff\r\nX-Frame-Options: SAMEORIGIN\r\nX-Xss-Protection: 0\r\n\r\n{\n  \"candidates\": [\n    {\n      \"content\": {\n        \"parts\": [\n          {\n            \"functionCall\": {\n              \"name\": \"get_weather\",\n              \"args\": {\n                \"city\": \"Lisbon\"\n              }\n            },\n            \"thoughtSignature\": \"CuUBAb4+9vttS2eKqg6oxdrmGp4qnJEpsRkZXa4wp7zqIJI+UWEALW183sDZUc0YH5FcPayov3uWmB1iKgbNGkNnFtLJtCaszZVHrzyk+NBCN4gGveKQPvlnpwmfdJzc6xfWfje2E8rt9f9R38uDRAkZt6emcSule+CNaebgxpnm2iMvfgNl8Q7ndfDpkEFXrgRi1l43nh/Q9igFG6M827p2YkrP9W2tgmSYjafN00FNHhYosmNgFTJnhQwxoR2xznocNUXo0+Ze4bHLxTuhWspOD2jzaxIuCQpiKBl3/FmkZzAZ5euJvw==\"\n          }\n        ],\n        \"role\": \"model\"\n      },\n      \"finishReason\": \"STOP\",\n      \"index\": 0,\n      \"finishMessage\": \"Model generated function call(s).\"\n    }\n  ],\n  \"usageMetadata\": {\n    \"promptTokenCount\": 149,\n    \"candidatesTokenCount\": 16,\n    \"totalTokenCount\": 213,\n    \"promptTokensDetails\": [\n      {\n        \"modality\": \"TEXT\",\n        \"tokenCount\": 149\n      }\n    ],\n    \"thoughtsTokenCount\": 48\n  },\n  \"modelVersion\": \"gemini-2.5-flash\",\n  \"responseId\": \"5yWwaauWMu30kdUP35_1gQw\"\n}\n"
  },
  {
    "path": "tool/mcptoolset/testdata/TestMCPToolSetConfirmation_Confirmation_Required_and_is_confirmed.httprr",
    "content": "httprr trace v1\n1090 1437\nPOST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent HTTP/1.1\r\nHost: generativelanguage.googleapis.com\r\nUser-Agent: Go-http-client/1.1\r\nContent-Length: 858\r\nContent-Type: application/json\r\n\r\n{\"contents\":[{\"parts\":[{\"text\":\"what is the weather in Lisbon?\"}],\"role\":\"user\"}],\"generationConfig\":{},\"systemInstruction\":{\"parts\":[{\"text\":\"I can answer your questions about the time and weather in a city.\\n\\nYou are an agent. Your internal name is \\\"weather_time_agent\\\". The description about you is \\\"Agent to answer questions about the time and weather in a city.\\\".\"}],\"role\":\"user\"},\"tools\":[{\"functionDeclarations\":[{\"description\":\"returns weather in the given city\",\"name\":\"get_weather\",\"parametersJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"city\":{\"description\":\"city name\",\"type\":\"string\"}},\"required\":[\"city\"],\"type\":\"object\"},\"responseJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"weather_summary\":{\"description\":\"weather summary in the given city\",\"type\":\"string\"}},\"required\":[\"weather_summary\"],\"type\":\"object\"}}]}]}HTTP/2.0 200 OK\r\nContent-Type: application/json; charset=UTF-8\r\nDate: Tue, 10 Mar 2026 14:08:41 GMT\r\nServer: scaffolding on HTTPServer2\r\nServer-Timing: gfet4t7; dur=1364\r\nVary: Origin\r\nVary: X-Origin\r\nVary: Referer\r\nX-Content-Type-Options: nosniff\r\nX-Frame-Options: SAMEORIGIN\r\nX-Xss-Protection: 0\r\n\r\n{\n  \"candidates\": [\n    {\n      \"content\": {\n        \"parts\": [\n          {\n            \"functionCall\": {\n              \"name\": \"get_weather\",\n              \"args\": {\n                \"city\": \"Lisbon\"\n              }\n            },\n            \"thoughtSignature\": \"Co4CAb4+9vtkO/l5IvHFtfeYWk20ZZsa+gYCHtKCQj7Kk9JABsFWzjPg0MalNQ57eM46fPSaZQ8AAwmRpvrGu3o7mCA8LEl1ctQGJSGZwiq7mXzp/Rr0WPxcQsufB8hz7/o2KWUBPR5pcMxDCDPluvnVDPts3W60r1Q4jCVB8gI4ILaVDG3MzPVo4znVqp16Yn+6dnO8gxrhBtK/q9GID5XUasIC3STRMan92H18aQiSe2+oTZfk5hWH7JIQ6VgoPXg0zRTbrmg7NPs1plLd0e6JwaZ/e6mV8tsrKQGWR6u/BhVo9qf5sdktkGaUU3lnOlfx+CJGfBSiTB3xNSDBPw474I4H1NmpiipSDKDbB41y\"\n          }\n        ],\n        \"role\": \"model\"\n      },\n      \"finishReason\": \"STOP\",\n      \"index\": 0,\n      \"finishMessage\": \"Model generated function call(s).\"\n    }\n  ],\n  \"usageMetadata\": {\n    \"promptTokenCount\": 149,\n    \"candidatesTokenCount\": 16,\n    \"totalTokenCount\": 227,\n    \"promptTokensDetails\": [\n      {\n        \"modality\": \"TEXT\",\n        \"tokenCount\": 149\n      }\n    ],\n    \"thoughtsTokenCount\": 62\n  },\n  \"modelVersion\": \"gemini-2.5-flash\",\n  \"responseId\": \"6CWwadaIH5axkdUP3MTwoAk\"\n}\n1712 842\nPOST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent HTTP/1.1\r\nHost: generativelanguage.googleapis.com\r\nUser-Agent: Go-http-client/1.1\r\nContent-Length: 1479\r\nContent-Type: application/json\r\n\r\n{\"contents\":[{\"parts\":[{\"text\":\"what is the weather in Lisbon?\"}],\"role\":\"user\"},{\"parts\":[{\"functionCall\":{\"args\":{\"city\":\"Lisbon\"},\"name\":\"get_weather\"},\"thoughtSignature\":\"Co4CAb4+9vtkO/l5IvHFtfeYWk20ZZsa+gYCHtKCQj7Kk9JABsFWzjPg0MalNQ57eM46fPSaZQ8AAwmRpvrGu3o7mCA8LEl1ctQGJSGZwiq7mXzp/Rr0WPxcQsufB8hz7/o2KWUBPR5pcMxDCDPluvnVDPts3W60r1Q4jCVB8gI4ILaVDG3MzPVo4znVqp16Yn+6dnO8gxrhBtK/q9GID5XUasIC3STRMan92H18aQiSe2+oTZfk5hWH7JIQ6VgoPXg0zRTbrmg7NPs1plLd0e6JwaZ/e6mV8tsrKQGWR6u/BhVo9qf5sdktkGaUU3lnOlfx+CJGfBSiTB3xNSDBPw474I4H1NmpiipSDKDbB41y\"}],\"role\":\"model\"},{\"parts\":[{\"functionResponse\":{\"name\":\"get_weather\",\"response\":{\"output\":{\"weather_summary\":\"Today in \\\"Lisbon\\\" is sunny\"}}}}],\"role\":\"user\"}],\"generationConfig\":{},\"systemInstruction\":{\"parts\":[{\"text\":\"I can answer your questions about the time and weather in a city.\\n\\nYou are an agent. Your internal name is \\\"weather_time_agent\\\". The description about you is \\\"Agent to answer questions about the time and weather in a city.\\\".\"}],\"role\":\"user\"},\"tools\":[{\"functionDeclarations\":[{\"description\":\"returns weather in the given city\",\"name\":\"get_weather\",\"parametersJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"city\":{\"description\":\"city name\",\"type\":\"string\"}},\"required\":[\"city\"],\"type\":\"object\"},\"responseJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"weather_summary\":{\"description\":\"weather summary in the given city\",\"type\":\"string\"}},\"required\":[\"weather_summary\"],\"type\":\"object\"}}]}]}HTTP/2.0 200 OK\r\nContent-Type: application/json; charset=UTF-8\r\nDate: Tue, 10 Mar 2026 14:08:42 GMT\r\nServer: scaffolding on HTTPServer2\r\nServer-Timing: gfet4t7; dur=564\r\nVary: Origin\r\nVary: X-Origin\r\nVary: Referer\r\nX-Content-Type-Options: nosniff\r\nX-Frame-Options: SAMEORIGIN\r\nX-Xss-Protection: 0\r\n\r\n{\n  \"candidates\": [\n    {\n      \"content\": {\n        \"parts\": [\n          {\n            \"text\": \"Today in \\\"Lisbon\\\" is sunny\"\n          }\n        ],\n        \"role\": \"model\"\n      },\n      \"finishReason\": \"STOP\",\n      \"index\": 0\n    }\n  ],\n  \"usageMetadata\": {\n    \"promptTokenCount\": 193,\n    \"candidatesTokenCount\": 8,\n    \"totalTokenCount\": 201,\n    \"promptTokensDetails\": [\n      {\n        \"modality\": \"TEXT\",\n        \"tokenCount\": 193\n      }\n    ]\n  },\n  \"modelVersion\": \"gemini-2.5-flash\",\n  \"responseId\": \"6SWwadLjNM2E7M8P1teV2QE\"\n}\n"
  },
  {
    "path": "tool/mcptoolset/testdata/TestMCPToolSetConfirmation_Confirmation_Required_and_is_rejected.httprr",
    "content": "httprr trace v1\n1090 1488\nPOST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent HTTP/1.1\r\nHost: generativelanguage.googleapis.com\r\nUser-Agent: Go-http-client/1.1\r\nContent-Length: 858\r\nContent-Type: application/json\r\n\r\n{\"contents\":[{\"parts\":[{\"text\":\"what is the weather in Lisbon?\"}],\"role\":\"user\"}],\"generationConfig\":{},\"systemInstruction\":{\"parts\":[{\"text\":\"I can answer your questions about the time and weather in a city.\\n\\nYou are an agent. Your internal name is \\\"weather_time_agent\\\". The description about you is \\\"Agent to answer questions about the time and weather in a city.\\\".\"}],\"role\":\"user\"},\"tools\":[{\"functionDeclarations\":[{\"description\":\"returns weather in the given city\",\"name\":\"get_weather\",\"parametersJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"city\":{\"description\":\"city name\",\"type\":\"string\"}},\"required\":[\"city\"],\"type\":\"object\"},\"responseJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"weather_summary\":{\"description\":\"weather summary in the given city\",\"type\":\"string\"}},\"required\":[\"weather_summary\"],\"type\":\"object\"}}]}]}HTTP/2.0 200 OK\r\nContent-Type: application/json; charset=UTF-8\r\nDate: Tue, 10 Mar 2026 14:08:43 GMT\r\nServer: scaffolding on HTTPServer2\r\nServer-Timing: gfet4t7; dur=910\r\nVary: Origin\r\nVary: X-Origin\r\nVary: Referer\r\nX-Content-Type-Options: nosniff\r\nX-Frame-Options: SAMEORIGIN\r\nX-Xss-Protection: 0\r\n\r\n{\n  \"candidates\": [\n    {\n      \"content\": {\n        \"parts\": [\n          {\n            \"functionCall\": {\n              \"name\": \"get_weather\",\n              \"args\": {\n                \"city\": \"Lisbon\"\n              }\n            },\n            \"thoughtSignature\": \"CrUCAb4+9vsxoW2f5UlClM3vCjVL4Y7+qUAQwsrQxXTlq/JZ8/9kOHDEk5V+3QPYB+30JDTLlPKJ+5Hk+7d2NMLLStOv7K3iFGIvoZtEoyYFPcJvAcBBpThT7OLsSPA1CbWAWv3NWOkwSpbcK9lawpnlcoPBtOBvyxqkCTIR6FCT70mbudMfH6ZP/ALPGymOHsLqNLjtUW5CUDCxiW4f0B/YvCLurtcxVrLelO8ca+tdew9i3a7/W+ZSPqdB8MELFVahbZ2OMsncq+kjv8O0ZKGM3zW3R70swYTqcI7qQ9xI5Du3hlHccy4rmV/R4MKCT2IgrS1Bw/HSRpGZ2I2rNCtT0bbaLfc/PXLz1zTEhnrMNXekacCH3Od+RnWrpDc6AcSmq4xovPwC0i79cK6TqXpanaftKN/e\"\n          }\n        ],\n        \"role\": \"model\"\n      },\n      \"finishReason\": \"STOP\",\n      \"index\": 0,\n      \"finishMessage\": \"Model generated function call(s).\"\n    }\n  ],\n  \"usageMetadata\": {\n    \"promptTokenCount\": 149,\n    \"candidatesTokenCount\": 16,\n    \"totalTokenCount\": 234,\n    \"promptTokensDetails\": [\n      {\n        \"modality\": \"TEXT\",\n        \"tokenCount\": 149\n      }\n    ],\n    \"thoughtsTokenCount\": 69\n  },\n  \"modelVersion\": \"gemini-2.5-flash\",\n  \"responseId\": \"6iWwabLUGsTikdUPnqTR6QU\"\n}\n1758 1140\nPOST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent HTTP/1.1\r\nHost: generativelanguage.googleapis.com\r\nUser-Agent: Go-http-client/1.1\r\nContent-Length: 1525\r\nContent-Type: application/json\r\n\r\n{\"contents\":[{\"parts\":[{\"text\":\"what is the weather in Lisbon?\"}],\"role\":\"user\"},{\"parts\":[{\"functionCall\":{\"args\":{\"city\":\"Lisbon\"},\"name\":\"get_weather\"},\"thoughtSignature\":\"CrUCAb4+9vsxoW2f5UlClM3vCjVL4Y7+qUAQwsrQxXTlq/JZ8/9kOHDEk5V+3QPYB+30JDTLlPKJ+5Hk+7d2NMLLStOv7K3iFGIvoZtEoyYFPcJvAcBBpThT7OLsSPA1CbWAWv3NWOkwSpbcK9lawpnlcoPBtOBvyxqkCTIR6FCT70mbudMfH6ZP/ALPGymOHsLqNLjtUW5CUDCxiW4f0B/YvCLurtcxVrLelO8ca+tdew9i3a7/W+ZSPqdB8MELFVahbZ2OMsncq+kjv8O0ZKGM3zW3R70swYTqcI7qQ9xI5Du3hlHccy4rmV/R4MKCT2IgrS1Bw/HSRpGZ2I2rNCtT0bbaLfc/PXLz1zTEhnrMNXekacCH3Od+RnWrpDc6AcSmq4xovPwC0i79cK6TqXpanaftKN/e\"}],\"role\":\"model\"},{\"parts\":[{\"functionResponse\":{\"name\":\"get_weather\",\"response\":{\"error\":\"error tool \\\"get_weather\\\" call is rejected\"}}}],\"role\":\"user\"}],\"generationConfig\":{},\"systemInstruction\":{\"parts\":[{\"text\":\"I can answer your questions about the time and weather in a city.\\n\\nYou are an agent. Your internal name is \\\"weather_time_agent\\\". The description about you is \\\"Agent to answer questions about the time and weather in a city.\\\".\"}],\"role\":\"user\"},\"tools\":[{\"functionDeclarations\":[{\"description\":\"returns weather in the given city\",\"name\":\"get_weather\",\"parametersJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"city\":{\"description\":\"city name\",\"type\":\"string\"}},\"required\":[\"city\"],\"type\":\"object\"},\"responseJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"weather_summary\":{\"description\":\"weather summary in the given city\",\"type\":\"string\"}},\"required\":[\"weather_summary\"],\"type\":\"object\"}}]}]}HTTP/2.0 200 OK\r\nContent-Type: application/json; charset=UTF-8\r\nDate: Tue, 10 Mar 2026 14:08:43 GMT\r\nServer: scaffolding on HTTPServer2\r\nServer-Timing: gfet4t7; dur=562\r\nVary: Origin\r\nVary: X-Origin\r\nVary: Referer\r\nX-Content-Type-Options: nosniff\r\nX-Frame-Options: SAMEORIGIN\r\nX-Xss-Protection: 0\r\n\r\n{\n  \"candidates\": [\n    {\n      \"content\": {\n        \"parts\": [\n          {\n            \"text\": \"I am sorry, I cannot get the weather in Lisbon.\",\n            \"thoughtSignature\": \"CpwBAb4+9vtTRlCMA1xbzVUmI1IZIWScaBtIiwQa51+OMDPDKvX9EXgXKp5DgVjWjOAlc2S3iPEDSaLh8NLU+FAPRA9oR9a7/THG1/0TAV+GUD5VJMwZnPWftRIPEL3YY2d0ZCwCwOzdMnGu8WkjH2rc5u/vXGcuoQicTlc7aqZ7wWARdm2JUJ77B7pX4w5L1PXLWaiO5jIidNiz3d2Y\"\n          }\n        ],\n        \"role\": \"model\"\n      },\n      \"finishReason\": \"STOP\",\n      \"index\": 0\n    }\n  ],\n  \"usageMetadata\": {\n    \"promptTokenCount\": 189,\n    \"candidatesTokenCount\": 12,\n    \"totalTokenCount\": 230,\n    \"promptTokensDetails\": [\n      {\n        \"modality\": \"TEXT\",\n        \"tokenCount\": 189\n      }\n    ],\n    \"thoughtsTokenCount\": 29\n  },\n  \"modelVersion\": \"gemini-2.5-flash\",\n  \"responseId\": \"6yWwacmqFfbu7M8P44yeiQ0\"\n}\n"
  },
  {
    "path": "tool/mcptoolset/testdata/TestMCPToolSetConfirmation_No_Confirmation_Required.httprr",
    "content": "httprr trace v1\n1090 1452\nPOST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent HTTP/1.1\r\nHost: generativelanguage.googleapis.com\r\nUser-Agent: Go-http-client/1.1\r\nContent-Length: 858\r\nContent-Type: application/json\r\n\r\n{\"contents\":[{\"parts\":[{\"text\":\"what is the weather in Lisbon?\"}],\"role\":\"user\"}],\"generationConfig\":{},\"systemInstruction\":{\"parts\":[{\"text\":\"I can answer your questions about the time and weather in a city.\\n\\nYou are an agent. Your internal name is \\\"weather_time_agent\\\". The description about you is \\\"Agent to answer questions about the time and weather in a city.\\\".\"}],\"role\":\"user\"},\"tools\":[{\"functionDeclarations\":[{\"description\":\"returns weather in the given city\",\"name\":\"get_weather\",\"parametersJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"city\":{\"description\":\"city name\",\"type\":\"string\"}},\"required\":[\"city\"],\"type\":\"object\"},\"responseJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"weather_summary\":{\"description\":\"weather summary in the given city\",\"type\":\"string\"}},\"required\":[\"weather_summary\"],\"type\":\"object\"}}]}]}HTTP/2.0 200 OK\r\nContent-Type: application/json; charset=UTF-8\r\nDate: Tue, 10 Mar 2026 14:08:38 GMT\r\nServer: scaffolding on HTTPServer2\r\nServer-Timing: gfet4t7; dur=830\r\nVary: Origin\r\nVary: X-Origin\r\nVary: Referer\r\nX-Content-Type-Options: nosniff\r\nX-Frame-Options: SAMEORIGIN\r\nX-Xss-Protection: 0\r\n\r\n{\n  \"candidates\": [\n    {\n      \"content\": {\n        \"parts\": [\n          {\n            \"functionCall\": {\n              \"name\": \"get_weather\",\n              \"args\": {\n                \"city\": \"Lisbon\"\n              }\n            },\n            \"thoughtSignature\": \"CpgCAb4+9vsWTCqejCWS+XQeOqqJQ5hKLDNlJ5T1DGEaINL1JxaO+FjyxZwwlhEsdKUH6Q+WLRvMqxMoCmpfhY/iG1qDENGWPArS8wvp6sGP7dXb/bpYPmMCgOoZyHNxNjLOrW0yCnKdYilfxVeAvSukKKFbPhczBC5wmLHLX50GljVv90ZAwjvSF2SWRZ/RNDZ3IyDWhIZqReu/cSWMjQXkfUHNYNHiyszTS3hZukQLzCo4WhJAa+AmSZNag38pgSrK9bylaXwxK2JaFg1YlnrPsOoUKFKNCOSvi7HtLW6fJuLiYtx1KuYk0Q2RCQS7vD/SFo7Pj75WnlfMuS8T2hMAuAeo96qE/p2Tt+rwXbUFx5cP7WTHPXxBqQ==\"\n          }\n        ],\n        \"role\": \"model\"\n      },\n      \"finishReason\": \"STOP\",\n      \"index\": 0,\n      \"finishMessage\": \"Model generated function call(s).\"\n    }\n  ],\n  \"usageMetadata\": {\n    \"promptTokenCount\": 149,\n    \"candidatesTokenCount\": 16,\n    \"totalTokenCount\": 229,\n    \"promptTokensDetails\": [\n      {\n        \"modality\": \"TEXT\",\n        \"tokenCount\": 149\n      }\n    ],\n    \"thoughtsTokenCount\": 64\n  },\n  \"modelVersion\": \"gemini-2.5-flash\",\n  \"responseId\": \"5SWwaajIH4aSkdUP-9_n2AY\"\n}\n1728 843\nPOST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent HTTP/1.1\r\nHost: generativelanguage.googleapis.com\r\nUser-Agent: Go-http-client/1.1\r\nContent-Length: 1495\r\nContent-Type: application/json\r\n\r\n{\"contents\":[{\"parts\":[{\"text\":\"what is the weather in Lisbon?\"}],\"role\":\"user\"},{\"parts\":[{\"functionCall\":{\"args\":{\"city\":\"Lisbon\"},\"name\":\"get_weather\"},\"thoughtSignature\":\"CpgCAb4+9vsWTCqejCWS+XQeOqqJQ5hKLDNlJ5T1DGEaINL1JxaO+FjyxZwwlhEsdKUH6Q+WLRvMqxMoCmpfhY/iG1qDENGWPArS8wvp6sGP7dXb/bpYPmMCgOoZyHNxNjLOrW0yCnKdYilfxVeAvSukKKFbPhczBC5wmLHLX50GljVv90ZAwjvSF2SWRZ/RNDZ3IyDWhIZqReu/cSWMjQXkfUHNYNHiyszTS3hZukQLzCo4WhJAa+AmSZNag38pgSrK9bylaXwxK2JaFg1YlnrPsOoUKFKNCOSvi7HtLW6fJuLiYtx1KuYk0Q2RCQS7vD/SFo7Pj75WnlfMuS8T2hMAuAeo96qE/p2Tt+rwXbUFx5cP7WTHPXxBqQ==\"}],\"role\":\"model\"},{\"parts\":[{\"functionResponse\":{\"name\":\"get_weather\",\"response\":{\"output\":{\"weather_summary\":\"Today in \\\"Lisbon\\\" is sunny\"}}}}],\"role\":\"user\"}],\"generationConfig\":{},\"systemInstruction\":{\"parts\":[{\"text\":\"I can answer your questions about the time and weather in a city.\\n\\nYou are an agent. Your internal name is \\\"weather_time_agent\\\". The description about you is \\\"Agent to answer questions about the time and weather in a city.\\\".\"}],\"role\":\"user\"},\"tools\":[{\"functionDeclarations\":[{\"description\":\"returns weather in the given city\",\"name\":\"get_weather\",\"parametersJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"city\":{\"description\":\"city name\",\"type\":\"string\"}},\"required\":[\"city\"],\"type\":\"object\"},\"responseJsonSchema\":{\"additionalProperties\":false,\"properties\":{\"weather_summary\":{\"description\":\"weather summary in the given city\",\"type\":\"string\"}},\"required\":[\"weather_summary\"],\"type\":\"object\"}}]}]}HTTP/2.0 200 OK\r\nContent-Type: application/json; charset=UTF-8\r\nDate: Tue, 10 Mar 2026 14:08:39 GMT\r\nServer: scaffolding on HTTPServer2\r\nServer-Timing: gfet4t7; dur=1458\r\nVary: Origin\r\nVary: X-Origin\r\nVary: Referer\r\nX-Content-Type-Options: nosniff\r\nX-Frame-Options: SAMEORIGIN\r\nX-Xss-Protection: 0\r\n\r\n{\n  \"candidates\": [\n    {\n      \"content\": {\n        \"parts\": [\n          {\n            \"text\": \"Today in \\\"Lisbon\\\" is sunny\"\n          }\n        ],\n        \"role\": \"model\"\n      },\n      \"finishReason\": \"STOP\",\n      \"index\": 0\n    }\n  ],\n  \"usageMetadata\": {\n    \"promptTokenCount\": 193,\n    \"candidatesTokenCount\": 8,\n    \"totalTokenCount\": 201,\n    \"promptTokensDetails\": [\n      {\n        \"modality\": \"TEXT\",\n        \"tokenCount\": 193\n      }\n    ]\n  },\n  \"modelVersion\": \"gemini-2.5-flash\",\n  \"responseId\": \"5iWwab7VFYjp7M8P3JPTmAo\"\n}\n"
  },
  {
    "path": "tool/mcptoolset/tool.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage mcptoolset\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"strings\"\n\n\t\"github.com/modelcontextprotocol/go-sdk/mcp\"\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/internal/toolinternal\"\n\t\"google.golang.org/adk/internal/toolinternal/toolutils\"\n\t\"google.golang.org/adk/model\"\n\t\"google.golang.org/adk/tool\"\n)\n\nfunc convertTool(t *mcp.Tool, client MCPClient, requireConfirmation bool, requireConfirmationProvider tool.ConfirmationProvider) (tool.Tool, error) {\n\tmcp := &mcpTool{\n\t\tname:        t.Name,\n\t\tdescription: t.Description,\n\t\tfuncDeclaration: &genai.FunctionDeclaration{\n\t\t\tName:        t.Name,\n\t\t\tDescription: t.Description,\n\t\t},\n\t\tmcpClient:                   client,\n\t\trequireConfirmation:         requireConfirmation,\n\t\trequireConfirmationProvider: requireConfirmationProvider,\n\t}\n\n\t// Since t.InputSchema and t.OutputSchema are pointers (*jsonschema.Schema) and the destination ResponseJsonSchema\n\t// is an interface (any), we have encountered the type nil problem.\n\t// This will make the omitempty not work since ResponseJsonSchema becomes an interface wrapper\n\t// to a nil pointer and genai converter includes \"responseJsonSchema\": null in the json sent to the llm which causes it to crash.\n\t// we need the following \"if\" check to keep ResponseJsonSchema (nil,nil) instead of (*jsonschema.Schema, nil)\n\tif t.InputSchema != nil {\n\t\tmcp.funcDeclaration.ParametersJsonSchema = t.InputSchema\n\t}\n\tif t.OutputSchema != nil {\n\t\tmcp.funcDeclaration.ResponseJsonSchema = t.OutputSchema\n\t}\n\treturn mcp, nil\n}\n\ntype mcpTool struct {\n\tname            string\n\tdescription     string\n\tfuncDeclaration *genai.FunctionDeclaration\n\n\tmcpClient MCPClient\n\n\trequireConfirmation bool\n\n\trequireConfirmationProvider tool.ConfirmationProvider\n}\n\n// Name implements the tool.Tool.\nfunc (t *mcpTool) Name() string {\n\treturn t.name\n}\n\n// Description implements the tool.Tool.\nfunc (t *mcpTool) Description() string {\n\treturn t.description\n}\n\n// IsLongRunning implements the tool.Tool.\nfunc (t *mcpTool) IsLongRunning() bool {\n\treturn false\n}\n\nfunc (t *mcpTool) ProcessRequest(ctx tool.Context, req *model.LLMRequest) error {\n\treturn toolutils.PackTool(req, t)\n}\n\nfunc (t *mcpTool) Declaration() *genai.FunctionDeclaration {\n\treturn t.funcDeclaration\n}\n\nfunc (t *mcpTool) Run(ctx tool.Context, args any) (map[string]any, error) {\n\tif confirmation := ctx.ToolConfirmation(); confirmation != nil {\n\t\tif !confirmation.Confirmed {\n\t\t\treturn nil, fmt.Errorf(\"error tool %q %w\", t.Name(), tool.ErrConfirmationRejected)\n\t\t}\n\t} else {\n\t\trequireConfirmation := t.requireConfirmation\n\n\t\t// Only run the potentially expensive provider if the static flag didn't already trigger it\n\t\t// Provider takes precedence/overrides:\n\t\tif t.requireConfirmationProvider != nil {\n\t\t\trequireConfirmation = t.requireConfirmationProvider(t.Name(), args)\n\t\t}\n\n\t\tif requireConfirmation {\n\t\t\terr := ctx.RequestConfirmation(\n\t\t\t\tfmt.Sprintf(\"Please approve or reject the tool call %s() by responding with a FunctionResponse with an expected ToolConfirmation payload.\",\n\t\t\t\t\tt.Name()), nil)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\tctx.Actions().SkipSummarization = true\n\t\t\treturn nil, fmt.Errorf(\"error tool %q %w\", t.Name(), tool.ErrConfirmationRequired)\n\t\t}\n\t}\n\n\t// TODO: add auth\n\tres, err := t.mcpClient.CallTool(ctx, &mcp.CallToolParams{\n\t\tName:      t.name,\n\t\tArguments: args,\n\t})\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to call MCP tool %q with err: %w\", t.name, err)\n\t}\n\n\tif res.IsError {\n\t\tdetails := strings.Builder{}\n\t\tfor _, c := range res.Content {\n\t\t\ttextContent, ok := c.(*mcp.TextContent)\n\t\t\tif !ok {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif _, err := details.WriteString(textContent.Text); err != nil {\n\t\t\t\treturn nil, fmt.Errorf(\"failed to write error details: %w\", err)\n\t\t\t}\n\t\t}\n\n\t\terrMsg := \"Tool execution failed.\"\n\t\tif details.Len() > 0 {\n\t\t\terrMsg += \" Details: \" + details.String()\n\t\t}\n\n\t\treturn nil, errors.New(errMsg)\n\t}\n\n\tif res.StructuredContent != nil {\n\t\treturn map[string]any{\n\t\t\t\"output\": res.StructuredContent,\n\t\t}, nil\n\t}\n\n\ttextResponse := strings.Builder{}\n\n\tfor _, c := range res.Content {\n\t\ttextContent, ok := c.(*mcp.TextContent)\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\n\t\tif _, err := textResponse.WriteString(textContent.Text); err != nil {\n\t\t\treturn nil, fmt.Errorf(\"failed to write text response: %w\", err)\n\t\t}\n\t}\n\n\tif textResponse.Len() == 0 {\n\t\treturn nil, errors.New(\"no text content in tool response\")\n\t}\n\n\treturn map[string]any{\n\t\t\"output\": textResponse.String(),\n\t}, nil\n}\n\nvar (\n\t_ toolinternal.FunctionTool     = (*mcpTool)(nil)\n\t_ toolinternal.RequestProcessor = (*mcpTool)(nil)\n)\n"
  },
  {
    "path": "tool/preloadmemorytool/tool.go",
    "content": "// Copyright 2026 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Package preloadmemorytool provides a tool that automatically preloads memory\n// for the current user at the start of each LLM request.\n//\n// Unlike loadmemorytool which is called explicitly by the model, this tool\n// runs automatically for each LLM request and injects relevant memory context\n// into the system instructions.\n\npackage preloadmemorytool\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n\t\"time\"\n\n\t\"google.golang.org/adk/internal/utils\"\n\t\"google.golang.org/adk/memory\"\n\t\"google.golang.org/adk/model\"\n\t\"google.golang.org/adk/tool\"\n)\n\nconst preloadInstructions = `The following content is from your previous conversations with the user.\nThey may be useful for answering the user's current query.\n<PAST_CONVERSATIONS>\n%s\n</PAST_CONVERSATIONS>`\n\n// preloadMemoryTool is a tool that preloads the memory for the current user.\n// It is automatically executed for each LLM request and will not be called\n// directly by the model.\ntype preloadMemoryTool struct {\n\tname        string\n\tdescription string\n}\n\n// New creates a new preloadMemoryTool.\nfunc New() *preloadMemoryTool {\n\treturn &preloadMemoryTool{\n\t\tname:        \"preload_memory\",\n\t\tdescription: \"Preloads relevant memory for the current user.\",\n\t}\n}\n\n// Name implements tool.Tool.\nfunc (t *preloadMemoryTool) Name() string {\n\treturn t.name\n}\n\n// Description implements tool.Tool.\nfunc (t *preloadMemoryTool) Description() string {\n\treturn t.description\n}\n\n// IsLongRunning implements tool.Tool.\nfunc (t *preloadMemoryTool) IsLongRunning() bool {\n\treturn false\n}\n\n// ProcessRequest processes the LLM request by searching memory using the user's\n// current query and injecting relevant past conversations into system instructions.\nfunc (t *preloadMemoryTool) ProcessRequest(ctx tool.Context, req *model.LLMRequest) error {\n\tuserContent := ctx.UserContent()\n\tif userContent == nil || len(userContent.Parts) == 0 ||\n\t\tuserContent.Parts[0] == nil || userContent.Parts[0].Text == \"\" {\n\t\treturn nil\n\t}\n\tuserQuery := userContent.Parts[0].Text\n\n\tsearchResponse, err := ctx.SearchMemory(ctx, userQuery)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"preload memory search failed: %v\", err)\n\t}\n\n\tif searchResponse == nil || len(searchResponse.Memories) == 0 {\n\t\treturn nil\n\t}\n\n\tmemoryText := formatMemories(searchResponse.Memories)\n\tif memoryText == \"\" {\n\t\treturn nil\n\t}\n\n\tutils.AppendInstructions(req, fmt.Sprintf(preloadInstructions, memoryText))\n\treturn nil\n}\n\nfunc formatMemories(memories []memory.Entry) string {\n\tvar lines []string\n\tfor _, mem := range memories {\n\t\tmemText := extractText(mem)\n\t\tif memText == \"\" {\n\t\t\tcontinue\n\t\t}\n\n\t\tif !mem.Timestamp.IsZero() {\n\t\t\tlines = append(lines, fmt.Sprintf(\"Time: %s\", mem.Timestamp.Format(time.RFC3339)))\n\t\t}\n\t\tif mem.Author != \"\" {\n\t\t\tmemText = fmt.Sprintf(\"%s: %s\", mem.Author, memText)\n\t\t}\n\t\tlines = append(lines, memText)\n\t}\n\treturn strings.Join(lines, \"\\n\")\n}\n\nfunc extractText(mem memory.Entry) string {\n\tif mem.Content == nil || len(mem.Content.Parts) == 0 {\n\t\treturn \"\"\n\t}\n\n\tvar b strings.Builder\n\tfor _, part := range mem.Content.Parts {\n\t\tif part.Text == \"\" {\n\t\t\tcontinue\n\t\t}\n\t\tif b.Len() > 0 {\n\t\t\tb.WriteByte(' ')\n\t\t}\n\t\tb.WriteString(part.Text)\n\t}\n\treturn b.String()\n}\n"
  },
  {
    "path": "tool/preloadmemorytool/tool_test.go",
    "content": "// Copyright 2026 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage preloadmemorytool_test\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"strings\"\n\t\"testing\"\n\t\"time\"\n\n\t\"google.golang.org/genai\"\n\n\ticontext \"google.golang.org/adk/internal/context\"\n\t\"google.golang.org/adk/internal/toolinternal\"\n\t\"google.golang.org/adk/memory\"\n\t\"google.golang.org/adk/model\"\n\t\"google.golang.org/adk/session\"\n\t\"google.golang.org/adk/tool\"\n\t\"google.golang.org/adk/tool/preloadmemorytool\"\n)\n\ntype mockMemory struct {\n\tmemories []memory.Entry\n\terr      error\n}\n\nfunc (m *mockMemory) AddSessionToMemory(ctx context.Context, s session.Session) error {\n\treturn nil\n}\n\nfunc (m *mockMemory) SearchMemory(ctx context.Context, query string) (*memory.SearchResponse, error) {\n\tif m.err != nil {\n\t\treturn nil, m.err\n\t}\n\treturn &memory.SearchResponse{Memories: m.memories}, nil\n}\n\nfunc TestPreloadMemoryTool_BasicProperties(t *testing.T) {\n\ttool := preloadmemorytool.New()\n\n\tif got := tool.Name(); got != \"preload_memory\" {\n\t\tt.Errorf(\"Name() = %v, want preload_memory\", got)\n\t}\n\tif got := tool.Description(); got != \"Preloads relevant memory for the current user.\" {\n\t\tt.Errorf(\"Description() = %v, want 'Preloads relevant memory for the current user.'\", got)\n\t}\n\tif got := tool.IsLongRunning(); got != false {\n\t\tt.Errorf(\"IsLongRunning() = %v, want false\", got)\n\t}\n}\n\nfunc TestPreloadMemoryTool_ProcessRequest(t *testing.T) {\n\ttests := []struct {\n\t\tname             string\n\t\tuserContent      *genai.Content\n\t\tmemories         []memory.Entry\n\t\tsearchErr        error\n\t\twantErr          bool\n\t\twantInstruction  bool\n\t\twantTextContains []string\n\t}{\n\t\t{\n\t\t\tname:            \"nil user content\",\n\t\t\tuserContent:     nil,\n\t\t\twantInstruction: false,\n\t\t},\n\t\t{\n\t\t\tname:            \"empty user content parts\",\n\t\t\tuserContent:     &genai.Content{Parts: []*genai.Part{}},\n\t\t\twantInstruction: false,\n\t\t},\n\t\t{\n\t\t\tname:            \"user content with no text\",\n\t\t\tuserContent:     &genai.Content{Parts: []*genai.Part{{InlineData: &genai.Blob{}}}},\n\t\t\twantInstruction: false,\n\t\t},\n\t\t{\n\t\t\tname:            \"text in later part is ignored\",\n\t\t\tuserContent:     &genai.Content{Parts: []*genai.Part{{InlineData: &genai.Blob{}}, genai.NewPartFromText(\"later text\")}},\n\t\t\twantInstruction: false,\n\t\t},\n\t\t{\n\t\t\tname:            \"no memories found\",\n\t\t\tuserContent:     genai.NewContentFromText(\"test query\", genai.RoleUser),\n\t\t\tmemories:        []memory.Entry{},\n\t\t\twantInstruction: false,\n\t\t},\n\t\t{\n\t\t\tname:            \"memory search error\",\n\t\t\tuserContent:     genai.NewContentFromText(\"test query\", genai.RoleUser),\n\t\t\tsearchErr:       errors.New(\"search failed\"),\n\t\t\twantErr:         true,\n\t\t\twantInstruction: false,\n\t\t},\n\t\t{\n\t\t\tname:        \"single memory entry\",\n\t\t\tuserContent: genai.NewContentFromText(\"test query\", genai.RoleUser),\n\t\t\tmemories: []memory.Entry{\n\t\t\t\t{\n\t\t\t\t\tAuthor:    \"user\",\n\t\t\t\t\tTimestamp: time.Date(2025, 1, 1, 12, 0, 0, 0, time.UTC),\n\t\t\t\t\tContent:   genai.NewContentFromText(\"Hello world\", genai.RoleUser),\n\t\t\t\t},\n\t\t\t},\n\t\t\twantInstruction:  true,\n\t\t\twantTextContains: []string{\"PAST_CONVERSATIONS\", \"user: Hello world\", \"Time: \" + time.Date(2025, 1, 1, 12, 0, 0, 0, time.UTC).Format(time.RFC3339)},\n\t\t},\n\t\t{\n\t\t\tname:        \"multiple memory entries\",\n\t\t\tuserContent: genai.NewContentFromText(\"search term\", genai.RoleUser),\n\t\t\tmemories: []memory.Entry{\n\t\t\t\t{\n\t\t\t\t\tAuthor:    \"user\",\n\t\t\t\t\tTimestamp: time.Date(2025, 1, 1, 12, 0, 0, 0, time.UTC),\n\t\t\t\t\tContent:   genai.NewContentFromText(\"First memory\", genai.RoleUser),\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tAuthor:    \"assistant\",\n\t\t\t\t\tTimestamp: time.Date(2025, 1, 2, 12, 0, 0, 0, time.UTC),\n\t\t\t\t\tContent:   genai.NewContentFromText(\"Second memory\", genai.RoleModel),\n\t\t\t\t},\n\t\t\t},\n\t\t\twantInstruction:  true,\n\t\t\twantTextContains: []string{\"First memory\", \"Second memory\", \"user:\", \"assistant:\"},\n\t\t},\n\t\t{\n\t\t\tname:        \"memory entry without author\",\n\t\t\tuserContent: genai.NewContentFromText(\"test\", genai.RoleUser),\n\t\t\tmemories: []memory.Entry{\n\t\t\t\t{\n\t\t\t\t\tTimestamp: time.Date(2025, 1, 1, 12, 0, 0, 0, time.UTC),\n\t\t\t\t\tContent:   genai.NewContentFromText(\"Anonymous message\", genai.RoleUser),\n\t\t\t\t},\n\t\t\t},\n\t\t\twantInstruction:  true,\n\t\t\twantTextContains: []string{\"Anonymous message\"},\n\t\t},\n\t\t{\n\t\t\tname:        \"memory entry without timestamp\",\n\t\t\tuserContent: genai.NewContentFromText(\"test\", genai.RoleUser),\n\t\t\tmemories: []memory.Entry{\n\t\t\t\t{\n\t\t\t\t\tAuthor:  \"user\",\n\t\t\t\t\tContent: genai.NewContentFromText(\"No timestamp\", genai.RoleUser),\n\t\t\t\t},\n\t\t\t},\n\t\t\twantInstruction:  true,\n\t\t\twantTextContains: []string{\"user: No timestamp\"},\n\t\t},\n\t\t{\n\t\t\tname:        \"memory entry with empty content\",\n\t\t\tuserContent: genai.NewContentFromText(\"test\", genai.RoleUser),\n\t\t\tmemories: []memory.Entry{\n\t\t\t\t{\n\t\t\t\t\tAuthor:    \"user\",\n\t\t\t\t\tTimestamp: time.Date(2025, 1, 1, 12, 0, 0, 0, time.UTC),\n\t\t\t\t\tContent:   nil,\n\t\t\t\t},\n\t\t\t},\n\t\t\twantInstruction: false,\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\ttc := createToolContext(t, &mockMemory{memories: tt.memories, err: tt.searchErr}, tt.userContent)\n\t\t\tllmRequest := &model.LLMRequest{}\n\n\t\t\tpmt := preloadmemorytool.New()\n\n\t\t\terr := pmt.ProcessRequest(tc, llmRequest)\n\t\t\tif tt.wantErr {\n\t\t\t\tif err == nil {\n\t\t\t\t\tt.Fatalf(\"ProcessRequest expected error, got nil\")\n\t\t\t\t}\n\t\t\t} else if err != nil {\n\t\t\t\tt.Fatalf(\"ProcessRequest failed: %v\", err)\n\t\t\t}\n\n\t\t\thasInstruction := llmRequest.Config != nil && llmRequest.Config.SystemInstruction != nil\n\t\t\tif hasInstruction != tt.wantInstruction {\n\t\t\t\tt.Errorf(\"hasInstruction = %v, want %v\", hasInstruction, tt.wantInstruction)\n\t\t\t}\n\n\t\t\tif tt.wantInstruction && hasInstruction {\n\t\t\t\tinstruction := llmRequest.Config.SystemInstruction.Parts[0].Text\n\t\t\t\tfor _, want := range tt.wantTextContains {\n\t\t\t\t\tif !strings.Contains(instruction, want) {\n\t\t\t\t\t\tt.Errorf(\"Instruction should contain %q, got: %v\", want, instruction)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc createToolContext(t *testing.T, mem *mockMemory, userContent *genai.Content) tool.Context {\n\tt.Helper()\n\n\tctx := icontext.NewInvocationContext(t.Context(), icontext.InvocationContextParams{\n\t\tMemory:      mem,\n\t\tUserContent: userContent,\n\t})\n\n\treturn toolinternal.NewToolContext(ctx, \"\", nil, nil)\n}\n"
  },
  {
    "path": "tool/tool.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Package tool defines the interfaces for tools that can be called by an agent.\n// A tool is a piece of code that performs a specific task. You can either define\n// your own custom tools or use built-in ones, for example, GoogleSearch.\npackage tool\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/agent\"\n\t\"google.golang.org/adk/internal/toolinternal/toolutils\"\n\t\"google.golang.org/adk/memory\"\n\t\"google.golang.org/adk/model\"\n\t\"google.golang.org/adk/session\"\n\t\"google.golang.org/adk/tool/toolconfirmation\"\n)\n\n// ErrConfirmationRequired indicates that the tool requires confirmation.\nvar ErrConfirmationRequired = errors.New(\"requires confirmation, please approve or reject\")\n\n// ErrConfirmationRejected indicated that the tool call confirmation rejected.\nvar ErrConfirmationRejected = errors.New(\"call is rejected\")\n\n// Tool defines the interface for a callable tool.\ntype Tool interface {\n\t// Name returns the name of the tool.\n\tName() string\n\t// Description returns a description of the tool.\n\tDescription() string\n\t// IsLongRunning indicates whether the tool is a long-running operation,\n\t// which typically returns a resource id first and finishes the operation later.\n\tIsLongRunning() bool\n}\n\n// Context defines the interface for the context passed to a tool when it's\n// called. It provides access to invocation-specific information and allows\n// the tool to interact with the agent's state and memory.\ntype Context interface {\n\tagent.CallbackContext\n\t// FunctionCallID returns the unique identifier of the function call\n\t// that triggered this tool execution.\n\tFunctionCallID() string\n\n\t// Actions returns the EventActions for the current event. This can be\n\t// used by the tool to modify the agent's state, transfer to another\n\t// agent, or perform other actions.\n\tActions() *session.EventActions\n\t// SearchMemory performs a semantic search on the agent's memory.\n\tSearchMemory(context.Context, string) (*memory.SearchResponse, error)\n\n\t// ToolConfirmation returns a handler for checking the Human-in-the-Loop\n\t// confirmation status for the current tool context. This should be used within a tool's logic\n\t// *before* performing any sensitive operations that require user approval.\n\t//\n\t// Example Usage:\n\t// if confirmation := ctx.ToolConfirmation(); confirmation == nil {\n\t//     // Confirmation required, create confirmation or handle appropriately\n\t//     ctx.RequestConfirmation(\"hint\", payload)\n\t// }\n\t//\n\t// The returned *toolconfirmation.ToolConfirmation object provides methods to check the actual\n\t// confirmation state.\n\tToolConfirmation() *toolconfirmation.ToolConfirmation\n\n\t// RequestConfirmation initiates the Human-in-the-Loop (HITL) process to ask the user for approval\n\t// before the tool proceeds with a specific action. Call this method when a tool needs\n\t// explicit user consent.\n\t//\n\t// This will typically result in the ADK emitting a special event\n\t// (e.g., a FunctionCall like \"adk_request_confirmation\") to the client application/UI,\n\t// prompting the user for a decision.\n\t//\n\t// Args:\n\t//   - hint: A human-readable string explaining why confirmation is needed. This is usually\n\t//     displayed to the user in the confirmation prompt.\n\t//   - payload: Any additional data or context about the action requiring confirmation.\n\t//\n\t// Returns:\n\t//   - nil: If the confirmation request was successfully enqueued or initiated within the ADK.\n\t//     This indicates that the process of asking the user has begun. It does NOT mean the action\n\t//     is approved. The tool's execution will likely pause or be suspended until the user responds.\n\t//   - error: If there was a failure in initiating the confirmation process itself (e.g., invalid\n\t//     arguments, issue with the event system). The request to ask the user has not been sent.\n\tRequestConfirmation(hint string, payload any) error\n}\n\n// Toolset is an interface for a collection of tools. It allows grouping\n// related tools together and providing them to an agent.\ntype Toolset interface {\n\t// Name returns the name of the toolset.\n\tName() string\n\t// Tools returns a list of tools in the toolset. The provided\n\t// ReadonlyContext can be used to dynamically determine which tools\n\t// to return based on the current invocation state.\n\tTools(ctx agent.ReadonlyContext) ([]Tool, error)\n}\n\n// Predicate is a function which decides whether a tool should be exposed to LLM.\ntype Predicate func(ctx agent.ReadonlyContext, tool Tool) bool\n\n// StringPredicate is a helper that creates a Predicate from a string slice.\n// Deprecated: use AllowedToolsPredicate instead.\nfunc StringPredicate(allowedTools []string) Predicate {\n\treturn AllowedToolsPredicate(allowedTools)\n}\n\n// AllowedToolsPredicate returns a Predicate that allows only the tools with the given names.\nfunc AllowedToolsPredicate(allowedTools []string) Predicate {\n\tm := make(map[string]bool)\n\tfor _, t := range allowedTools {\n\t\tm[t] = true\n\t}\n\n\treturn func(ctx agent.ReadonlyContext, tool Tool) bool {\n\t\treturn m[tool.Name()]\n\t}\n}\n\n// FilterToolset returns a Toolset that filters the tools in the given Toolset\n// using the given predicate.\nfunc FilterToolset(toolset Toolset, predicate Predicate) Toolset {\n\tif toolset == nil {\n\t\tpanic(\"toolset must not be nil\")\n\t}\n\tif predicate == nil {\n\t\tpanic(\"predicate must not be nil\")\n\t}\n\n\treturn &filteredToolset{\n\t\ttoolset:   toolset,\n\t\tpredicate: predicate,\n\t}\n}\n\ntype filteredToolset struct {\n\ttoolset   Toolset\n\tpredicate Predicate\n}\n\nfunc (f *filteredToolset) Name() string {\n\treturn f.toolset.Name()\n}\n\nfunc (f *filteredToolset) Tools(ctx agent.ReadonlyContext) ([]Tool, error) {\n\ttools, err := f.toolset.Tools(ctx)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tvar filtered []Tool\n\tfor _, tool := range tools {\n\t\tif f.predicate(ctx, tool) {\n\t\t\tfiltered = append(filtered, tool)\n\t\t}\n\t}\n\treturn filtered, nil\n}\n\n// ConfirmationProvider defines a function that dynamically determines whether\n// a specific tool execution requires user confirmation.\n//\n// It accepts the tool name and the input parameters as arguments.\n// Returning true signals that the system must wait for Human-in-the-Loop (HITL)\n// approval before proceeding with the execution.\n//\n// EXPERIMENTAL: ConfirmationProvider is experimental and not currently in scope for the v1.0 API.\ntype ConfirmationProvider func(toolName string, toolInput any) bool\n\n// WithConfirmation wraps a toolset to inject confirmation logic in each tool.\n// Only tools within the provided Toolset that implement the `runnableTool` interface\n// (i.e., provide a FunctionDeclaration and a Run method) will be wrapped with\n// confirmation logic. Other tools will be included in the returned Toolset without\n// modification.\n//\n// EXPERIMENTAL: WithConfirmation is experimental and not currently in scope for the v1.0 API.\nfunc WithConfirmation(ts Toolset, requireConfirmation bool, requireConfirmationProvider ConfirmationProvider) Toolset {\n\treturn &confirmationToolset{\n\t\ttoolset:                     ts,\n\t\trequireConfirmation:         requireConfirmation,\n\t\trequireConfirmationProvider: requireConfirmationProvider,\n\t}\n}\n\ntype confirmationToolset struct {\n\ttoolset                     Toolset\n\trequireConfirmation         bool\n\trequireConfirmationProvider ConfirmationProvider\n}\n\nfunc (c *confirmationToolset) Name() string { return c.toolset.Name() }\n\nfunc (c *confirmationToolset) Tools(ctx agent.ReadonlyContext) ([]Tool, error) {\n\ttools, err := c.toolset.Tools(ctx)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\twrappedTools := make([]Tool, 0, len(tools))\n\tfor _, t := range tools {\n\t\tif _, ok := t.(runnableTool); ok {\n\t\t\twrappedTools = append(wrappedTools, &confirmationTool{\n\t\t\t\trunnableTool:        t.(runnableTool),\n\t\t\t\trequireConfirmation: c.requireConfirmation,\n\t\t\t\tprovider:            c.requireConfirmationProvider,\n\t\t\t})\n\t\t} else {\n\t\t\t// Tools that are not runnableTool are not wrapped.\n\t\t\twrappedTools = append(wrappedTools, t)\n\t\t}\n\t}\n\n\treturn wrappedTools, nil\n}\n\n// confirmationTool is a wrapper around a tool that adds confirmation logic.\n// It implements tool.Tool and adk/internal/toolinternal.FunctionTool and adk/internal/toolinternal.RequestProcessor.\ntype confirmationTool struct {\n\trunnableTool\n\trequireConfirmation bool\n\tprovider            ConfirmationProvider\n}\n\ntype runnableTool interface {\n\tTool\n\tDeclaration() *genai.FunctionDeclaration\n\tRun(ctx Context, args any) (result map[string]any, err error)\n}\n\nfunc (t *confirmationTool) Declaration() *genai.FunctionDeclaration {\n\treturn t.runnableTool.Declaration()\n}\n\nfunc (t *confirmationTool) ProcessRequest(ctx Context, req *model.LLMRequest) error {\n\treturn toolutils.PackTool(req, t)\n}\n\nfunc (t *confirmationTool) Run(ctx Context, args any) (map[string]any, error) {\n\tft := t.runnableTool\n\n\t// Check for Human-in-the-Loop confirmation.\n\tif confirmation := ctx.ToolConfirmation(); confirmation != nil {\n\t\tif !confirmation.Confirmed {\n\t\t\treturn nil, fmt.Errorf(\"error tool %q %w\", t.runnableTool.Name(), ErrConfirmationRejected)\n\t\t}\n\t} else {\n\t\trequireConfirmation := t.requireConfirmation\n\t\tif t.provider != nil {\n\t\t\trequireConfirmation = t.provider(t.Name(), args)\n\t\t}\n\n\t\tif requireConfirmation {\n\t\t\terr := ctx.RequestConfirmation(\n\t\t\t\tfmt.Sprintf(\"Please approve or reject the tool call %s() by responding with a FunctionResponse with an expected ToolConfirmation payload.\",\n\t\t\t\t\tt.Name()), nil)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\tctx.Actions().SkipSummarization = true\n\t\t\treturn nil, fmt.Errorf(\"error tool %q %w\", t.Name(), ErrConfirmationRequired)\n\t\t}\n\t}\n\n\treturn ft.Run(ctx, args)\n}\n"
  },
  {
    "path": "tool/tool_test.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage tool_test\n\nimport (\n\t\"context\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/agent\"\n\t\"google.golang.org/adk/internal/toolinternal\"\n\t\"google.golang.org/adk/memory\"\n\t\"google.golang.org/adk/session\"\n\t\"google.golang.org/adk/tool\"\n\t\"google.golang.org/adk/tool/agenttool\"\n\t\"google.golang.org/adk/tool/functiontool\"\n\t\"google.golang.org/adk/tool/geminitool\"\n\t\"google.golang.org/adk/tool/loadartifactstool\"\n\t\"google.golang.org/adk/tool/toolconfirmation\"\n)\n\nfunc TestTypes(t *testing.T) {\n\tconst (\n\t\tfunctionTool = \"FunctionTool\"\n\t\trequestProc  = \"RequestProcessor\"\n\t)\n\n\ttype intInput struct {\n\t\tValue int `json:\"value\"`\n\t}\n\ttype intOutput struct {\n\t\tValue int `json:\"value\"`\n\t}\n\n\ttests := []struct {\n\t\tname          string\n\t\tconstructor   func() (tool.Tool, error)\n\t\texpectedTypes []string\n\t}{\n\t\t{\n\t\t\tname: \"FunctionTool\",\n\t\t\tconstructor: func() (tool.Tool, error) {\n\t\t\t\treturn functiontool.New(functiontool.Config{}, func(_ tool.Context, input intInput) (intOutput, error) {\n\t\t\t\t\treturn intOutput(input), nil\n\t\t\t\t})\n\t\t\t},\n\t\t\texpectedTypes: []string{requestProc, functionTool},\n\t\t},\n\t\t{\n\t\t\tname:          \"geminitool\",\n\t\t\tconstructor:   func() (tool.Tool, error) { return geminitool.New(\"\", \"\", nil), nil },\n\t\t\texpectedTypes: []string{requestProc},\n\t\t},\n\t\t{\n\t\t\tname:          \"geminitool.GoogleSearch{}\",\n\t\t\tconstructor:   func() (tool.Tool, error) { return geminitool.GoogleSearch{}, nil },\n\t\t\texpectedTypes: []string{requestProc},\n\t\t},\n\t\t{\n\t\t\tname:          \"LoadArtifactsTool\",\n\t\t\tconstructor:   func() (tool.Tool, error) { return loadartifactstool.New(), nil },\n\t\t\texpectedTypes: []string{requestProc, functionTool},\n\t\t},\n\t\t{\n\t\t\tname:          \"AgentTool\",\n\t\t\tconstructor:   func() (tool.Tool, error) { return agenttool.New(nil, nil), nil },\n\t\t\texpectedTypes: []string{requestProc, functionTool},\n\t\t},\n\t\t{\n\t\t\tname:          \"LoadArtifactsTool\",\n\t\t\tconstructor:   func() (tool.Tool, error) { return loadartifactstool.New(), nil },\n\t\t\texpectedTypes: []string{requestProc, functionTool},\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\ttool, err := tt.constructor()\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"Failed to create tool %s: %v\", tt.name, err)\n\t\t\t}\n\n\t\t\tfor _, s := range tt.expectedTypes {\n\t\t\t\tswitch s {\n\t\t\t\tcase functionTool:\n\t\t\t\t\tif _, ok := tool.(toolinternal.FunctionTool); !ok {\n\t\t\t\t\t\tt.Errorf(\"Expected %s to implement toolinternal.FunctionTool\", tt.name)\n\t\t\t\t\t}\n\t\t\t\tcase requestProc:\n\t\t\t\t\tif _, ok := tool.(toolinternal.RequestProcessor); !ok {\n\t\t\t\t\t\tt.Errorf(\"Expected %s to implement toolinternal.RequestProcessor\", tt.name)\n\t\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\t\tt.Fatalf(\"Unknown expected type: %s\", s)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n}\n\ntype testContext struct {\n\tcontext.Context\n\ttoolConfirmationResult    *toolconfirmation.ToolConfirmation\n\trequestConfirmationCalled bool\n\teventActions              *session.EventActions\n}\n\nfunc (c *testContext) ToolConfirmation() *toolconfirmation.ToolConfirmation {\n\treturn c.toolConfirmationResult\n}\n\nfunc (c *testContext) RequestConfirmation(string, any) error {\n\tc.requestConfirmationCalled = true\n\treturn nil\n}\n\nfunc (c *testContext) Actions() *session.EventActions {\n\tif c.eventActions == nil {\n\t\tc.eventActions = &session.EventActions{}\n\t}\n\treturn c.eventActions\n}\nfunc (c *testContext) FunctionCallID() string { return \"test-function-call-id\" }\nfunc (c *testContext) SearchMemory(context.Context, string) (*memory.SearchResponse, error) {\n\treturn nil, nil\n}\nfunc (c *testContext) AgentName() string                    { return \"test-agent\" }\nfunc (c *testContext) ReadonlyState() session.ReadonlyState { return nil }\nfunc (c *testContext) State() session.State                 { return nil }\nfunc (c *testContext) Artifacts() agent.Artifacts           { return nil }\nfunc (c *testContext) InvocationID() string                 { return \"test-invocation-id\" }\nfunc (c *testContext) UserContent() *genai.Content          { return nil }\nfunc (c *testContext) AppName() string                      { return \"test-app\" }\nfunc (c *testContext) Branch() string                       { return \"test-branch\" }\nfunc (c *testContext) SessionID() string                    { return \"test-session-id\" }\nfunc (c *testContext) UserID() string                       { return \"test-user-id\" }\n\ntype testToolset struct {\n\ttools []tool.Tool\n}\n\nfunc (tts *testToolset) Name() string { return \"testToolset\" }\nfunc (tts *testToolset) Tools(agent.ReadonlyContext) ([]tool.Tool, error) {\n\treturn tts.tools, nil\n}\n\nfunc TestWithConfirmation(t *testing.T) {\n\ttoolRan := false\n\tnoOpTool, err := functiontool.New(functiontool.Config{Name: \"noOpTool\"}, func(ctx tool.Context, input struct{}) (struct{}, error) {\n\t\ttoolRan = true\n\t\treturn struct{}{}, nil\n\t})\n\tif err != nil {\n\t\tt.Fatalf(\"functiontool.New() failed: %v\", err)\n\t}\n\tts := &testToolset{tools: []tool.Tool{noOpTool}}\n\n\ttests := []struct {\n\t\tname                      string\n\t\trequireConfirmation       bool\n\t\tprovider                  tool.ConfirmationProvider\n\t\ttoolConfirmation          *toolconfirmation.ToolConfirmation\n\t\twantConfirmationRequested bool\n\t\twantSkipSummarization     bool\n\t\twantErr                   bool\n\t\twantErrMsg                string\n\t\twantToolRan               bool\n\t}{\n\t\t{\n\t\t\tname:                      \"confirmation required, no confirmation in context\",\n\t\t\trequireConfirmation:       true,\n\t\t\twantConfirmationRequested: true,\n\t\t\twantSkipSummarization:     true,\n\t\t\twantErr:                   true,\n\t\t\twantErrMsg:                \"requires confirmation\",\n\t\t\twantToolRan:               false,\n\t\t},\n\t\t{\n\t\t\tname:                \"confirmation required, confirmed in context\",\n\t\t\trequireConfirmation: true,\n\t\t\ttoolConfirmation:    &toolconfirmation.ToolConfirmation{Confirmed: true},\n\t\t\twantToolRan:         true,\n\t\t},\n\t\t{\n\t\t\tname:                \"confirmation required, rejected in context\",\n\t\t\trequireConfirmation: true,\n\t\t\ttoolConfirmation:    &toolconfirmation.ToolConfirmation{Confirmed: false},\n\t\t\twantErr:             true,\n\t\t\twantErrMsg:          \"call is rejected\",\n\t\t\twantToolRan:         false,\n\t\t},\n\t\t{\n\t\t\tname:                      \"confirmation not required\",\n\t\t\trequireConfirmation:       false,\n\t\t\twantConfirmationRequested: false,\n\t\t\twantToolRan:               true,\n\t\t},\n\t\t{\n\t\t\tname: \"confirmation provider requires confirmation\",\n\t\t\tprovider: func(toolName string, toolInput any) bool {\n\t\t\t\treturn true\n\t\t\t},\n\t\t\twantConfirmationRequested: true,\n\t\t\twantSkipSummarization:     true,\n\t\t\twantErr:                   true,\n\t\t\twantErrMsg:                \"requires confirmation\",\n\t\t\twantToolRan:               false,\n\t\t},\n\t\t{\n\t\t\tname: \"confirmation provider does not require confirmation\",\n\t\t\tprovider: func(toolName string, toolInput any) bool {\n\t\t\t\treturn false\n\t\t\t},\n\t\t\twantConfirmationRequested: false,\n\t\t\twantToolRan:               true,\n\t\t},\n\t\t{\n\t\t\tname:                \"requireConfirmation=true but provider returns false\",\n\t\t\trequireConfirmation: true,\n\t\t\tprovider: func(toolName string, toolInput any) bool {\n\t\t\t\treturn false\n\t\t\t},\n\t\t\twantConfirmationRequested: false,\n\t\t\twantToolRan:               true,\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\ttoolRan = false\n\t\t\tctx := &testContext{Context: context.Background(), toolConfirmationResult: tt.toolConfirmation}\n\n\t\t\tcts := tool.WithConfirmation(ts, tt.requireConfirmation, tt.provider)\n\t\t\ttools, err := cts.Tools(nil)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"cts.Tools() failed: %v\", err)\n\t\t\t}\n\t\t\tif len(tools) != 1 {\n\t\t\t\tt.Fatalf(\"cts.Tools() returned %d tools, want 1\", len(tools))\n\t\t\t}\n\t\t\tconfirmedTool, ok := tools[0].(toolinternal.FunctionTool)\n\t\t\tif !ok {\n\t\t\t\tt.Fatalf(\"tools[0] is not a FunctionTool\")\n\t\t\t}\n\n\t\t\t_, err = confirmedTool.Run(ctx, map[string]any{})\n\t\t\tif (err != nil) != tt.wantErr {\n\t\t\t\tt.Errorf(\"Run() error = %v, wantErr %v\", err, tt.wantErr)\n\t\t\t}\n\t\t\tif err != nil && tt.wantErrMsg != \"\" && !strings.Contains(err.Error(), tt.wantErrMsg) {\n\t\t\t\tt.Errorf(\"Run() error msg = %q, want it to contain %q\", err.Error(), tt.wantErrMsg)\n\t\t\t}\n\n\t\t\tif ctx.Actions().SkipSummarization != tt.wantSkipSummarization {\n\t\t\t\tt.Errorf(\"Run() skipSummarization = %v, want %v\", ctx.Actions().SkipSummarization, tt.wantSkipSummarization)\n\t\t\t}\n\t\t\tif ctx.requestConfirmationCalled != tt.wantConfirmationRequested {\n\t\t\t\tt.Errorf(\"Run() requestConfirmationCalled = %v, want %v\", ctx.requestConfirmationCalled, tt.wantConfirmationRequested)\n\t\t\t}\n\t\t\tif toolRan != tt.wantToolRan {\n\t\t\t\tt.Errorf(\"toolRan = %v, want %v\", toolRan, tt.wantToolRan)\n\t\t\t}\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "tool/toolconfirmation/tool_confirmation.go",
    "content": "// Copyright 2026 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Package toolconfirmation provides structures and utilities for handling\n// Human-in-the-Loop tool execution confirmations within the ADK.\npackage toolconfirmation\n\nimport (\n\t\"fmt\"\n\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/internal/converters\"\n)\n\n// FunctionCallName defines the specific name for the FunctionCall event\n// emitted by ADK when a Human-in-the-Loop confirmation is required.\n//\n// The 'args' of this FunctionCall include:\n//   - \"toolConfirmation\": A toolConfirmation with the hint.\n//   - \"originalFunctionCall\": The original FunctionCall (including its name and arguments) that the agent intended to execute.\n//\n// Client applications or frontends interacting with the ADK-powered agent must:\n// 1. Listen for events containing a FunctionCall with this name.\n// 2. Extract the details of the 'originalFunctionCall' from the arguments.\n// 3. Present a clear confirmation prompt to the human user, explaining the action and potential consequences.\n// 4. Capture the user's decision (e.g., true for yes/approve, false for no/deny).\n// 5. Send a FunctionResponse message back to the ADK. This FunctionResponse MUST:\n//   - Have the same 'id' as the received \"adk_request_confirmation\" FunctionCall.\n//   - Have the name set to \"adk_request_confirmation\".\n//   - Include a response payload, typically a map like {\"confirmed\": bool}.\n//\n// Based on the boolean value in \"confirmed\", the ADK will either proceed to execute\n// the 'originalFunctionCall' or block it and return an error.\nconst FunctionCallName = \"adk_request_confirmation\"\n\n// ToolConfirmation represents the state and details of a user confirmation request\n// for a tool execution.\ntype ToolConfirmation struct {\n\t// Hint is the message provided to the user to explain why the confirmation\n\t// is needed and what action is being confirmed.\n\tHint string `json:\"hint\"`\n\n\t// Confirmed indicates the user's decision.\n\t// true if the user approved the action, false if they denied it.\n\t// The state before the user has responded is typically handled outside\n\t// this struct (e.g., by the absence of a result or a pending status).\n\tConfirmed bool `json:\"confirmed\"`\n\n\t// Payload contains any additional data or context related to the confirmation request.\n\t// The structure of the Payload is application-specific.\n\tPayload any `json:\"payload\"`\n}\n\n// OriginalCallFrom retrieves the underlying, original function call from a tool confirmation wrapper.\n//\n// In the ADK Tool Confirmation workflow, the model will wrap a desired tool execution inside a\n// \"RequestConfirmation\" call. This helper extracts that inner intent so it can be mapped back\n// to pending requests or queued for execution.\n//\n// It handles the \"originalFunctionCall\" argument in two formats:\n//  1. *genai.FunctionCall: Returns the object directly if already typed.\n//  2. map[string]any: Deserializes the raw JSON map received from the model.\n//\n// Usage:\n// This is typically used when processing a \"RequestConfirmation\" event to identify which\n// tool the model actually wants to run.\n//\n// Parameters:\n//   - functionCall: The wrapper function call (e.g., RequestConfirmation) containing the arguments.\n//\n// Returns:\n//   - *genai.FunctionCall: The extracted original tool call.\n//   - error: If the \"originalFunctionCall\" argument is missing or malformed.\nfunc OriginalCallFrom(functionCall *genai.FunctionCall) (*genai.FunctionCall, error) {\n\tif functionCall == nil || functionCall.Args == nil {\n\t\treturn nil, fmt.Errorf(\"functionCall or its arguments cannot be nil\")\n\t}\n\tconst key = \"originalFunctionCall\"\n\n\tval, exists := functionCall.Args[key]\n\tif !exists {\n\t\treturn nil, fmt.Errorf(\"required argument %q is missing from call with ID %s\", key, functionCall.ID)\n\t}\n\n\toriginalCall, ok := val.(*genai.FunctionCall)\n\tif ok {\n\t\treturn originalCall, nil\n\t}\n\n\toriginalCallRaw, ok := val.(map[string]any)\n\tif !ok {\n\t\treturn nil, fmt.Errorf(\"argument %q has invalid type: expected JSON object (map[string]any) or *genai.FunctionCall, got %T\", key, val)\n\t}\n\n\toriginalFunctionCall, err := converters.FromMapStructure[genai.FunctionCall](originalCallRaw)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to decode %q structure for call ID %s: %w\", key, functionCall.ID, err)\n\t}\n\n\treturn originalFunctionCall, nil\n}\n"
  },
  {
    "path": "tool/toolconfirmation/tool_confirmation_test.go",
    "content": "// Copyright 2026 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage toolconfirmation_test\n\nimport (\n\t\"strings\"\n\t\"testing\"\n\n\t\"google.golang.org/genai\"\n\n\t\"google.golang.org/adk/tool/toolconfirmation\"\n)\n\n// --- The Test Suite ---\n\nfunc TestOriginalCallFrom(t *testing.T) {\n\ttests := []struct {\n\t\tname          string\n\t\tinput         *genai.FunctionCall\n\t\twantErr       bool\n\t\twantErrSubstr string // Substring we expect to see in the error message\n\t}{\n\t\t{\n\t\t\tname: \"Success - Valid Structure\",\n\t\t\tinput: &genai.FunctionCall{\n\t\t\t\tID: \"call_123\",\n\t\t\t\tArgs: map[string]any{\n\t\t\t\t\t\"originalFunctionCall\": map[string]any{\n\t\t\t\t\t\t\"ID\":   \"call_999\",\n\t\t\t\t\t\t\"Name\": \"weather_lookup\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twantErr: false,\n\t\t},\n\t\t{\n\t\t\tname:          \"Failure - Nil Input\",\n\t\t\tinput:         nil,\n\t\t\twantErr:       true,\n\t\t\twantErrSubstr: \"cannot be nil\",\n\t\t},\n\t\t{\n\t\t\tname: \"Failure - Missing Key\",\n\t\t\tinput: &genai.FunctionCall{\n\t\t\t\tID: \"call_456\",\n\t\t\t\tArgs: map[string]any{\n\t\t\t\t\t\"someOtherKey\": \"foo\",\n\t\t\t\t},\n\t\t\t},\n\t\t\twantErr:       true,\n\t\t\twantErrSubstr: \"required argument \\\"originalFunctionCall\\\" is missing\",\n\t\t},\n\t\t{\n\t\t\tname: \"Failure - Invalid Type (String instead of Map)\",\n\t\t\tinput: &genai.FunctionCall{\n\t\t\t\tID: \"call_789\",\n\t\t\t\tArgs: map[string]any{\n\t\t\t\t\t// LLM hallucination: sending a string instead of an object\n\t\t\t\t\t\"originalFunctionCall\": \"{\\\"Name\\\": \\\"bad_json\\\"}\",\n\t\t\t\t},\n\t\t\t},\n\t\t\twantErr:       true,\n\t\t\twantErrSubstr: \"got string\", // Verifies our %T check works\n\t\t},\n\t\t{\n\t\t\tname: \"Failure - Invalid Type (Nil value)\",\n\t\t\tinput: &genai.FunctionCall{\n\t\t\t\tID: \"call_nil\",\n\t\t\t\tArgs: map[string]any{\n\t\t\t\t\t\"originalFunctionCall\": nil,\n\t\t\t\t},\n\t\t\t},\n\t\t\twantErr:       true,\n\t\t\twantErrSubstr: \"got <nil>\", // Verifies %T handles nil gracefully\n\t\t},\n\t\t{\n\t\t\tname: \"Failure - Converter Error (Bad Internal Structure id with wrong type)\",\n\t\t\tinput: &genai.FunctionCall{\n\t\t\t\tID: \"call_bad_struct\",\n\t\t\t\tArgs: map[string]any{\n\t\t\t\t\t\"originalFunctionCall\": map[string]any{\n\t\t\t\t\t\t\"ID\": 11,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twantErr:       true,\n\t\t\twantErrSubstr: \"failed to decode\",\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tgot, err := toolconfirmation.OriginalCallFrom(tt.input)\n\t\t\tif (err != nil) != tt.wantErr {\n\t\t\t\tt.Errorf(\"OriginalCallFrom() error = %v, wantErr %v\", err, tt.wantErr)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif tt.wantErr && !strings.Contains(err.Error(), tt.wantErrSubstr) {\n\t\t\t\tt.Errorf(\"OriginalCallFrom() error = %q, expected substring %q\", err.Error(), tt.wantErrSubstr)\n\t\t\t}\n\n\t\t\tif !tt.wantErr {\n\t\t\t\tif got == nil {\n\t\t\t\t\tt.Error(\"Expected result, got nil\")\n\t\t\t\t} else {\n\t\t\t\t\t// Verify we actually extracted data from the inner map\n\t\t\t\t\t// This relies on the specific \"Success\" test case data\n\t\t\t\t\tif got.Name != \"weather_lookup\" {\n\t\t\t\t\t\tt.Errorf(\"Expected extracted name 'weather_lookup', got %q\", got.Name)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "util/instructionutil/instruction.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Package instructionutil provides utilities to work with agent instructions.\npackage instructionutil\n\nimport (\n\t\"fmt\"\n\n\t\"google.golang.org/adk/agent\"\n\ticontext \"google.golang.org/adk/internal/context\"\n\t\"google.golang.org/adk/internal/llminternal\"\n)\n\n// InjectSessionState populates values in the instruction template, e.g. state,\n// artifact, etc.\n//   - There can be placeholders like {key_name} that will be resolved by ADK\n//     at runtime using session state and context.\n//   - key_name must match \"^[a-zA-Z_][a-zA-Z0-9_]*$\", otherwise it will be\n//     treated as a literal.\n//   - {artifact.key_name} can be used to insert the text content of the\n//     artifact named key_name.\n//\n// If the state variable or artifact does not exist, the agent will raise an\n// error. If you want to ignore the error, you can append a ? to the\n// variable name as in {var?}.\n//\n// This method is intended to be used in InstructionProvider based Instruction\n// and GlobalInstruction which are called with ReadonlyContext.\nfunc InjectSessionState(ctx agent.ReadonlyContext, template string) (string, error) {\n\tictx, ok := ctx.(*icontext.ReadonlyContext)\n\tif !ok {\n\t\treturn \"\", fmt.Errorf(\"unexpected context type: %T\", ctx)\n\t}\n\treturn llminternal.InjectSessionState(ictx.InvocationContext, template)\n}\n"
  }
]